--- /srv/reproducible-results/rbuild-debian/r-b-build.zF4uyMk9/b1/dune-istl_2.9.0-6_amd64.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.zF4uyMk9/b2/dune-istl_2.9.0-6_amd64.changes ├── Files │ @@ -1,3 +1,3 @@ │ │ 3679113243653f4443de6e44ed82aca4 210780 libdevel optional libdune-istl-dev_2.9.0-6_amd64.deb │ - c1015dba79cad4bc2cb305164587beb0 3833776 doc optional libdune-istl-doc_2.9.0-6_all.deb │ + b6fed2b5c2178b42dd2f37f3f197f729 3830412 doc optional libdune-istl-doc_2.9.0-6_all.deb ├── libdune-istl-doc_2.9.0-6_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2024-10-10 13:14:09.000000 debian-binary │ │ --rw-r--r-- 0 0 0 26912 2024-10-10 13:14:09.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 3806672 2024-10-10 13:14:09.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 26892 2024-10-10 13:14:09.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 3803328 2024-10-10 13:14:09.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -5,162 +5,162 @@ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1240 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/changelog.Debian.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3688 2022-10-20 18:22:18.000000 ./usr/share/doc/libdune-istl-doc/changelog.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3254 2023-01-12 15:07:31.000000 ./usr/share/doc/libdune-istl-doc/copyright │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3041 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00002.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3039 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00005.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10514 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 147916 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7150 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 58273 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9225 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 74488 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33564 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 145690 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17812 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 125151 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6811 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 74451 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4555 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 55816 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15320 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 151385 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7796 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 34254 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4385 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18371 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4706 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23732 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13397 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 185807 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7150 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 58273 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44339 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 253737 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9765 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42295 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17812 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 125151 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4544 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 53931 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9273 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 122293 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9765 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 132844 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7084 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14008 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 12157 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00038.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 21373 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00038_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9765 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42295 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9866 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 160718 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7691 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 220462 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6499 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44115 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4922 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14276 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6799 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11407 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13203 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 131101 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3364 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 58162 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12508 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 121274 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8891 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 412251 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17510 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 315503 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7084 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14008 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4785 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14866 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8771 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 68876 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5870 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20990 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8901 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 47367 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7254 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 75348 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6665 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 52582 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5437 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14295 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10970 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 187347 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18719 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 208523 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5186 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22059 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15753 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 410562 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13573 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 345513 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9429 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 133063 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6562 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 69285 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5397 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29692 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8180 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 122236 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5679 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 30672 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7520 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 98130 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6348 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17314 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7901 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 66465 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6403 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 65781 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9508 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 87692 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9428 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 238457 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4679 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24711 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9273 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 122293 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4706 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23732 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19506 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 312867 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8602 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 40910 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5570 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 36127 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10170 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12125 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7778 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17437 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10065 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 107941 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8727 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 34366 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44339 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 253737 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16830 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48381 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5597 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44694 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12195 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 79104 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7679 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 61431 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8610 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 79459 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6568 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 34046 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8585 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 75169 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4544 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 53931 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6351 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 134026 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6044 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 114981 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13276 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 300759 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9765 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 132844 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7564 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 142750 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4950 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9481 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5930 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 162672 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5446 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 165179 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13397 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 185807 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7679 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 61431 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6799 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11407 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5597 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44694 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4385 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18371 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5679 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 30672 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6562 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 69285 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5437 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14295 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7901 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 66465 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8771 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 68876 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5397 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29692 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10970 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 187347 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6403 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 65781 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18719 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 208523 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15753 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 410562 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6348 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17314 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7254 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 75348 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13573 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 345513 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7520 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 98130 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8901 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 47367 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8180 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 122236 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9508 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 87692 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5870 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20990 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9429 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 133063 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6665 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 52582 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9428 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 238457 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5186 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22059 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33564 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 145690 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4950 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9481 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6351 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 134026 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4922 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14276 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7564 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 142750 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7778 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17437 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10170 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12125 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6811 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 74451 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16830 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48381 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7796 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 34254 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5446 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 165179 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5930 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 162672 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4785 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14866 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8610 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 79459 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10514 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 147916 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8891 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 412251 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9866 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 160718 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4679 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24711 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17510 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 315503 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9225 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 74488 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7691 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 220462 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19506 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 312867 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5570 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 36127 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3364 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 58162 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8727 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 34366 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8585 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 75169 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13276 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 300759 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4555 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 55816 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6499 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44115 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12508 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 121274 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6568 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 34046 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15320 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 151385 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12195 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 79104 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13203 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 131101 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8602 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 40910 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10065 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 107941 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6044 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 114981 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5517 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00230.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3416 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00231.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3725 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00232.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 321302 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00233.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 23094 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00233.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 32149 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00234.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 19073 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00234.png │ │ │ │ @@ -1090,15 +1090,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 8035 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e12c67a8fe12cf8b78c94f3b4cb9926_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4247 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e69be5995c9f5d42bf491ae6f29600e.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1620 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e69be5995c9f5d42bf491ae6f29600e_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 14065 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1878 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3665 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45631 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 177298 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 177282 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7704 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 28998 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 549 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_0.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 572 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_0_dark.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 531 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_1.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 860 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_10.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 909 2024-10-10 13:14:09.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_10_dark.png │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00008.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: superlu.hh File Reference │ │ │ │ +dune-istl: superlufunctions.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,82 +70,43 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
│ │ │ │ +Macros
│ │ │ │ +
superlufunctions.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Classes for using SuperLU with ISTL matrices. │ │ │ │ -More...

│ │ │ │ -
#include "superlufunctions.hh"
│ │ │ │ -#include "solvers.hh"
│ │ │ │ -#include "supermatrix.hh"
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <functional>
│ │ │ │ -#include "bcrsmatrix.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ -#include <dune/istl/solverfactory.hh>
│ │ │ │ +
#include "supermatrix.h"
│ │ │ │ +#include "slu_util.h"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::SuperLUSolveChooser< T >
 
struct  Dune::SuperLUDenseMatChooser< T >
 
struct  Dune::SuperLUQueryChooser< T >
 
struct  Dune::QuerySpaceChooser< T >
 
class  Dune::SuperLU< M >
 SuperLu Solver. More...
 
struct  Dune::IsDirectSolver< SuperLU< BCRSMatrix< T, A > > >
 
struct  Dune::StoresColumnCompressed< SuperLU< BCRSMatrix< T, A > > >
 
struct  Dune::SuperLUCreator
 
struct  Dune::SuperLUCreator::isValidBlock< class >
 
struct  Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< double, k > >
 
struct  Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< std::complex< double >, k > >
 
struct  Dune::SuperLUCreator::isValidBlock< double >
 
struct  Dune::SuperLUCreator::isValidBlock< std::complex< double > >
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

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

│ │ │ │ -Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("superlu", SuperLUCreator())
 

│ │ │ │ +Macros

#define int_t   SUPERLU_INT_TYPE
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Classes for using SuperLU with ISTL matrices.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ int_t

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define int_t   SUPERLU_INT_TYPE
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,65 +1,19 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -superlu.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ -Classes for using SuperLU with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ -#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ -#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ -#include "_s_u_p_e_r_m_a_t_r_i_x_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ +_M_a_c_r_o_s │ │ │ │ │ +superlufunctions.hh File Reference │ │ │ │ │ +#include "supermatrix.h" │ │ │ │ │ +#include "slu_util.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_:_:_S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _i_n_t___t   SUPERLU_INT_TYPE │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_Q_u_e_r_y_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_Q_u_e_r_y_S_p_a_c_e_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_u_p_e_r_L_U_<_ _M_ _> │ │ │ │ │ -  SuperLu Solver. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _S_u_p_e_r_L_U_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _S_u_p_e_r_L_U_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _c_l_a_s_s_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_ _d_o_u_b_l_e_,_ _k_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_< │ │ │ │ │ - _d_o_u_b_l_e_ _>_,_ _k_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _d_o_u_b_l_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("superlu", _S_u_p_e_r_L_U_C_r_e_a_t_o_r()) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Classes for using SuperLU with ISTL matrices. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? iinntt__tt ********** │ │ │ │ │ +#define int_t   SUPERLU_INT_TYPE │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: superlu.hh Source File │ │ │ │ +dune-istl: superlufunctions.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,833 +74,135 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
superlu.hh
│ │ │ │ +
superlufunctions.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SUPERLU_HH
│ │ │ │ -
6#define DUNE_ISTL_SUPERLU_HH
│ │ │ │ -
7
│ │ │ │ -
8#if HAVE_SUPERLU
│ │ │ │ +
5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH
│ │ │ │ +
6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH
│ │ │ │ +
7#if HAVE_SUPERLU
│ │ │ │ +
8
│ │ │ │
9
│ │ │ │ -
10#include "superlufunctions.hh"
│ │ │ │ -
11#include "solvers.hh"
│ │ │ │ -
12#include "supermatrix.hh"
│ │ │ │ -
13#include <algorithm>
│ │ │ │ -
14#include <functional>
│ │ │ │ -
15#include "bcrsmatrix.hh"
│ │ │ │ -
16#include "bvector.hh"
│ │ │ │ -
17#include "istlexception.hh"
│ │ │ │ -
18#include <dune/common/fmatrix.hh>
│ │ │ │ -
19#include <dune/common/fvector.hh>
│ │ │ │ -
20#include <dune/common/stdstreams.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ +
10#define int_t SUPERLU_INT_TYPE
│ │ │ │ +
11#include "supermatrix.h"
│ │ │ │ +
12#include "slu_util.h"
│ │ │ │ +
13#undef int_t
│ │ │ │ +
14
│ │ │ │ +
15#if __has_include("slu_sdefs.h")
│ │ │ │ +
16extern "C" {
│ │ │ │ +
17 extern void
│ │ │ │ +
18 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ +
19 char *, float *, float *, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
20 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
21 float *, float *, float *, float *,
│ │ │ │ +
22 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │
23
│ │ │ │ -
24namespace Dune
│ │ │ │ -
25{
│ │ │ │ -
26
│ │ │ │ -
37 template<class M, class T, class TM, class TD, class TA>
│ │ │ │ -
38 class SeqOverlappingSchwarz;
│ │ │ │ -
39
│ │ │ │ -
40 template<class T, bool tag>
│ │ │ │ -
41 struct SeqOverlappingSchwarzAssemblerHelper;
│ │ │ │ -
42
│ │ │ │ -
43 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
45 {};
│ │ │ │ -
│ │ │ │ -
46
│ │ │ │ -
47 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
49 {};
│ │ │ │ -
│ │ │ │ -
50
│ │ │ │ -
51 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
53 {};
│ │ │ │ -
│ │ │ │ +
24 extern void
│ │ │ │ +
25 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int,
│ │ │ │ +
26 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
27 extern void
│ │ │ │ +
28 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *,
│ │ │ │ +
29 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
30 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ +
31
│ │ │ │ +
32 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ +
33}
│ │ │ │ +
34#endif
│ │ │ │ +
35
│ │ │ │ +
36#if __has_include("slu_ddefs.h")
│ │ │ │ +
37extern "C" {
│ │ │ │ +
38 extern void
│ │ │ │ +
39 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ +
40 char *, double *, double *, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
41 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
42 double *, double *, double *, double *,
│ │ │ │ +
43 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │ +
44
│ │ │ │ +
45 extern void
│ │ │ │ +
46 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *,
│ │ │ │ +
47 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
48
│ │ │ │ +
49 extern void
│ │ │ │ +
50 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int,
│ │ │ │ +
51 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
52
│ │ │ │ +
53 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │
54
│ │ │ │ -
55 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
57 {};
│ │ │ │ -
│ │ │ │ +
55 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ +
56}
│ │ │ │ +
57#endif
│ │ │ │
58
│ │ │ │ -
59#if __has_include("slu_sdefs.h")
│ │ │ │ -
60 template<>
│ │ │ │ -
61 struct SuperLUDenseMatChooser<float>
│ │ │ │ -
62 {
│ │ │ │ -
63 static void create(SuperMatrix *mat, int n, int m, float *dat, int n1,
│ │ │ │ -
64 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
65 {
│ │ │ │ -
66 sCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
│ │ │ │ -
67
│ │ │ │ -
68 }
│ │ │ │ -
69
│ │ │ │ -
70 static void destroy(SuperMatrix*)
│ │ │ │ -
71 {}
│ │ │ │ -
72
│ │ │ │ -
73 };
│ │ │ │ -
74 template<>
│ │ │ │ -
75 struct SuperLUSolveChooser<float>
│ │ │ │ -
76 {
│ │ │ │ -
77 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ -
78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ -
79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ -
80 float *rpg, float *rcond, float *ferr, float *berr,
│ │ │ │ -
81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ -
82 {
│ │ │ │ -
83 GlobalLU_t gLU;
│ │ │ │ -
84 sgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ -
85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ -
86 &gLU, memusage, stat, info);
│ │ │ │ -
87 }
│ │ │ │ -
88 };
│ │ │ │ -
89
│ │ │ │ -
90 template<>
│ │ │ │ -
91 struct QuerySpaceChooser<float>
│ │ │ │ -
92 {
│ │ │ │ -
93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ -
94 {
│ │ │ │ -
95 sQuerySpace(L,U,memusage);
│ │ │ │ -
96 }
│ │ │ │ -
97 };
│ │ │ │ -
98
│ │ │ │ -
99#endif
│ │ │ │ +
59#if __has_include("slu_cdefs.h")
│ │ │ │ +
60#ifndef SUPERLU_TYPEDEF_COMPLEX
│ │ │ │ +
61// For now let's keep backwards compatible and let
│ │ │ │ +
62// complex be a typedef of doublecomplex
│ │ │ │ +
63#define SUPERLU_TYPEDEF_COMPLEX
│ │ │ │ +
64#endif
│ │ │ │ +
65#include "slu_scomplex.h"
│ │ │ │ +
66
│ │ │ │ +
67extern "C" {
│ │ │ │ +
68 extern void
│ │ │ │ +
69 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ +
70 char *, float *, float *, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
71 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
72 float *, float *, float *, float *,
│ │ │ │ +
73 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │ +
74
│ │ │ │ +
75
│ │ │ │ +
76 extern void
│ │ │ │ +
77 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int,
│ │ │ │ +
78 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
79
│ │ │ │ +
80
│ │ │ │ +
81 extern void
│ │ │ │ +
82 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *,
│ │ │ │ +
83 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
84
│ │ │ │ +
85 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ +
86
│ │ │ │ +
87 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ +
88}
│ │ │ │ +
89#endif
│ │ │ │ +
90
│ │ │ │ +
91#if __has_include("slu_zdefs.h")
│ │ │ │ +
92#include "slu_dcomplex.h"
│ │ │ │ +
93extern "C" {
│ │ │ │ +
94 extern void
│ │ │ │ +
95 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ +
96 char *, double *, double *, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
97 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ +
98 double *, double *, double *, double *,
│ │ │ │ +
99 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │
100
│ │ │ │ -
101#if __has_include("slu_ddefs.h")
│ │ │ │ -
102
│ │ │ │ -
103 template<>
│ │ │ │ -
104 struct SuperLUDenseMatChooser<double>
│ │ │ │ -
105 {
│ │ │ │ -
106 static void create(SuperMatrix *mat, int n, int m, double *dat, int n1,
│ │ │ │ -
107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
108 {
│ │ │ │ -
109 dCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
│ │ │ │ -
110
│ │ │ │ -
111 }
│ │ │ │ -
112
│ │ │ │ -
113 static void destroy(SuperMatrix * /* mat */)
│ │ │ │ -
114 {}
│ │ │ │ -
115 };
│ │ │ │ -
116 template<>
│ │ │ │ -
117 struct SuperLUSolveChooser<double>
│ │ │ │ -
118 {
│ │ │ │ -
119 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ -
120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ -
121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ -
122 double *rpg, double *rcond, double *ferr, double *berr,
│ │ │ │ -
123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ -
124 {
│ │ │ │ -
125 GlobalLU_t gLU;
│ │ │ │ -
126 dgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ -
127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ -
128 &gLU, memusage, stat, info);
│ │ │ │ -
129 }
│ │ │ │ -
130 };
│ │ │ │ -
131
│ │ │ │ -
132 template<>
│ │ │ │ -
133 struct QuerySpaceChooser<double>
│ │ │ │ -
134 {
│ │ │ │ -
135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ -
136 {
│ │ │ │ -
137 dQuerySpace(L,U,memusage);
│ │ │ │ -
138 }
│ │ │ │ -
139 };
│ │ │ │ -
140#endif
│ │ │ │ -
141
│ │ │ │ -
142#if __has_include("slu_zdefs.h")
│ │ │ │ -
143 template<>
│ │ │ │ -
144 struct SuperLUDenseMatChooser<std::complex<double> >
│ │ │ │ -
145 {
│ │ │ │ -
146 static void create(SuperMatrix *mat, int n, int m, std::complex<double> *dat, int n1,
│ │ │ │ -
147 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
148 {
│ │ │ │ -
149 zCreate_Dense_Matrix(mat, n, m, reinterpret_cast<doublecomplex*>(dat), n1, stype, dtype, mtype);
│ │ │ │ -
150
│ │ │ │ -
151 }
│ │ │ │ -
152
│ │ │ │ -
153 static void destroy(SuperMatrix*)
│ │ │ │ -
154 {}
│ │ │ │ -
155 };
│ │ │ │ -
156
│ │ │ │ -
157 template<>
│ │ │ │ -
158 struct SuperLUSolveChooser<std::complex<double> >
│ │ │ │ -
159 {
│ │ │ │ -
160 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ -
161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ -
162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ -
163 double *rpg, double *rcond, double *ferr, double *berr,
│ │ │ │ -
164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ -
165 {
│ │ │ │ -
166 GlobalLU_t gLU;
│ │ │ │ -
167 zgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ -
168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ -
169 &gLU, memusage, stat, info);
│ │ │ │ -
170 }
│ │ │ │ -
171 };
│ │ │ │ -
172
│ │ │ │ -
173 template<>
│ │ │ │ -
174 struct QuerySpaceChooser<std::complex<double> >
│ │ │ │ -
175 {
│ │ │ │ -
176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ -
177 {
│ │ │ │ -
178 zQuerySpace(L,U,memusage);
│ │ │ │ -
179 }
│ │ │ │ -
180 };
│ │ │ │ -
181#endif
│ │ │ │ -
182
│ │ │ │ -
183#if __has_include("slu_cdefs.h")
│ │ │ │ -
184 template<>
│ │ │ │ -
185 struct SuperLUDenseMatChooser<std::complex<float> >
│ │ │ │ -
186 {
│ │ │ │ -
187 static void create(SuperMatrix *mat, int n, int m, std::complex<float> *dat, int n1,
│ │ │ │ -
188 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
189 {
│ │ │ │ -
190 cCreate_Dense_Matrix(mat, n, m, reinterpret_cast< ::complex*>(dat), n1, stype, dtype, mtype);
│ │ │ │ -
191
│ │ │ │ -
192 }
│ │ │ │ -
193
│ │ │ │ -
194 static void destroy(SuperMatrix* /* mat */)
│ │ │ │ -
195 {}
│ │ │ │ -
196 };
│ │ │ │ -
197
│ │ │ │ -
198 template<>
│ │ │ │ -
199 struct SuperLUSolveChooser<std::complex<float> >
│ │ │ │ -
200 {
│ │ │ │ -
201 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ -
202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ -
203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ -
204 float *rpg, float *rcond, float *ferr, float *berr,
│ │ │ │ -
205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ -
206 {
│ │ │ │ -
207 GlobalLU_t gLU;
│ │ │ │ -
208 cgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ -
209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ -
210 &gLU, memusage, stat, info);
│ │ │ │ -
211 }
│ │ │ │ -
212 };
│ │ │ │ -
213
│ │ │ │ -
214 template<>
│ │ │ │ -
215 struct QuerySpaceChooser<std::complex<float> >
│ │ │ │ -
216 {
│ │ │ │ -
217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ -
218 {
│ │ │ │ -
219 cQuerySpace(L,U,memusage);
│ │ │ │ -
220 }
│ │ │ │ -
221 };
│ │ │ │ -
222#endif
│ │ │ │ -
223
│ │ │ │ -
224 namespace Impl
│ │ │ │ -
225 {
│ │ │ │ -
226 template<class M>
│ │ │ │ -
227 struct SuperLUVectorChooser
│ │ │ │ -
228 {};
│ │ │ │ -
229
│ │ │ │ -
230 template<typename T, typename A, int n, int m>
│ │ │ │ -
231 struct SuperLUVectorChooser<BCRSMatrix<FieldMatrix<T,n,m>,A > >
│ │ │ │ -
232 {
│ │ │ │ -
234 using domain_type = BlockVector<
│ │ │ │ -
235 FieldVector<T,m>,
│ │ │ │ -
236 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >;
│ │ │ │ -
238 using range_type = BlockVector<
│ │ │ │ -
239 FieldVector<T,n>,
│ │ │ │ -
240 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > >;
│ │ │ │ -
241 };
│ │ │ │ -
242
│ │ │ │ -
243 template<typename T, typename A>
│ │ │ │ -
244 struct SuperLUVectorChooser<BCRSMatrix<T,A> >
│ │ │ │ -
245 {
│ │ │ │ -
247 using domain_type = BlockVector<T, A>;
│ │ │ │ -
249 using range_type = BlockVector<T, A>;
│ │ │ │ -
250 };
│ │ │ │ -
251 }
│ │ │ │ -
252
│ │ │ │ -
266 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
268 : public InverseOperator<
│ │ │ │ -
269 typename Impl::SuperLUVectorChooser<M>::domain_type,
│ │ │ │ -
270 typename Impl::SuperLUVectorChooser<M>::range_type >
│ │ │ │ -
271 {
│ │ │ │ -
272 using T = typename M::field_type;
│ │ │ │ -
273 public:
│ │ │ │ -
275 using Matrix = M;
│ │ │ │ -
276 using matrix_type = M;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
282 using domain_type = typename Impl::SuperLUVectorChooser<M>::domain_type;
│ │ │ │ -
284 using range_type = typename Impl::SuperLUVectorChooser<M>::range_type;
│ │ │ │ -
285
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
288 {
│ │ │ │ - │ │ │ │ -
290 }
│ │ │ │ -
│ │ │ │ -
291
│ │ │ │ -
306 explicit SuperLU(const Matrix& mat, bool verbose=false,
│ │ │ │ -
307 bool reusevector=true);
│ │ │ │ -
308
│ │ │ │ -
309
│ │ │ │ -
│ │ │ │ -
320 SuperLU(const Matrix& mat, const ParameterTree& config)
│ │ │ │ -
321 : SuperLU(mat, config.get<bool>("verbose", false), config.get<bool>("reuseVector", true))
│ │ │ │ -
322 {}
│ │ │ │ -
│ │ │ │ -
323
│ │ │ │ -
330 SuperLU();
│ │ │ │ -
331
│ │ │ │ -
332 ~SuperLU();
│ │ │ │ -
333
│ │ │ │ - │ │ │ │ -
338
│ │ │ │ -
│ │ │ │ -
342 void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ -
343 {
│ │ │ │ -
344 apply(x,b,res);
│ │ │ │ -
345 }
│ │ │ │ -
│ │ │ │ -
346
│ │ │ │ -
350 void apply(T* x, T* b);
│ │ │ │ -
351
│ │ │ │ -
353 void setMatrix(const Matrix& mat);
│ │ │ │ -
354
│ │ │ │ -
│ │ │ │ -
355 typename SuperLUMatrix::size_type nnz() const
│ │ │ │ -
356 {
│ │ │ │ -
357 return mat.nonzeroes();
│ │ │ │ -
358 }
│ │ │ │ -
│ │ │ │ -
359
│ │ │ │ -
360 template<class S>
│ │ │ │ -
361 void setSubMatrix(const Matrix& mat, const S& rowIndexSet);
│ │ │ │ -
362
│ │ │ │ -
363 void setVerbosity(bool v);
│ │ │ │ -
364
│ │ │ │ -
369 void free();
│ │ │ │ -
370
│ │ │ │ -
371 const char* name() { return "SuperLU"; }
│ │ │ │ -
372 private:
│ │ │ │ -
373 template<class Mat,class X, class TM, class TD, class T1>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
376
│ │ │ │ -
377 SuperLUMatrix& getInternalMatrix() { return mat; }
│ │ │ │ -
378
│ │ │ │ -
380 void decompose();
│ │ │ │ -
381
│ │ │ │ - │ │ │ │ -
383 SuperMatrix L, U, B, X;
│ │ │ │ -
384 int *perm_c, *perm_r, *etree;
│ │ │ │ -
385 typename GetSuperLUType<T>::float_type *R, *C;
│ │ │ │ -
386 T *bstore;
│ │ │ │ -
387 superlu_options_t options;
│ │ │ │ -
388 char equed;
│ │ │ │ -
389 void *work;
│ │ │ │ -
390 int lwork;
│ │ │ │ -
391 bool first, verbose, reusevector;
│ │ │ │ -
392 };
│ │ │ │ -
│ │ │ │ -
393
│ │ │ │ -
394 template<typename M>
│ │ │ │ -
395 SuperLU<M>
│ │ │ │ -
│ │ │ │ -
396 ::~SuperLU()
│ │ │ │ -
397 {
│ │ │ │ -
398 if(mat.N()+mat.M()>0)
│ │ │ │ -
399 free();
│ │ │ │ -
400 }
│ │ │ │ -
│ │ │ │ -
401
│ │ │ │ -
402 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
404 {
│ │ │ │ -
405 delete[] perm_c;
│ │ │ │ -
406 delete[] perm_r;
│ │ │ │ -
407 delete[] etree;
│ │ │ │ -
408 delete[] R;
│ │ │ │ -
409 delete[] C;
│ │ │ │ -
410 if(lwork>=0) {
│ │ │ │ -
411 Destroy_SuperNode_Matrix(&L);
│ │ │ │ -
412 Destroy_CompCol_Matrix(&U);
│ │ │ │ -
413 }
│ │ │ │ -
414 lwork=0;
│ │ │ │ -
415 if(!first && reusevector) {
│ │ │ │ -
416 SUPERLU_FREE(B.Store);
│ │ │ │ -
417 SUPERLU_FREE(X.Store);
│ │ │ │ -
418 }
│ │ │ │ -
419 mat.free();
│ │ │ │ -
420 }
│ │ │ │ -
│ │ │ │ -
421
│ │ │ │ -
422 template<typename M>
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
424 ::SuperLU(const Matrix& mat_, bool verbose_, bool reusevector_)
│ │ │ │ -
425 : work(0), lwork(0), first(true), verbose(verbose_),
│ │ │ │ -
426 reusevector(reusevector_)
│ │ │ │ -
427 {
│ │ │ │ -
428 setMatrix(mat_);
│ │ │ │ -
429
│ │ │ │ -
430 }
│ │ │ │ -
│ │ │ │ -
431 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
433 : work(0), lwork(0),verbose(false),
│ │ │ │ -
434 reusevector(false)
│ │ │ │ -
435 {}
│ │ │ │ -
│ │ │ │ -
436 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
438 {
│ │ │ │ -
439 verbose=v;
│ │ │ │ -
440 }
│ │ │ │ -
│ │ │ │ -
441
│ │ │ │ -
442 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
444 {
│ │ │ │ -
445 if(mat.N()+mat.M()>0) {
│ │ │ │ -
446 free();
│ │ │ │ -
447 }
│ │ │ │ -
448 lwork=0;
│ │ │ │ -
449 work=0;
│ │ │ │ -
450 //a=&mat_;
│ │ │ │ -
451 mat=mat_;
│ │ │ │ -
452 decompose();
│ │ │ │ -
453 }
│ │ │ │ -
│ │ │ │ -
454
│ │ │ │ -
455 template<typename M>
│ │ │ │ -
456 template<class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
458 const S& mrs)
│ │ │ │ -
459 {
│ │ │ │ -
460 if(mat.N()+mat.M()>0) {
│ │ │ │ -
461 free();
│ │ │ │ -
462 }
│ │ │ │ -
463 lwork=0;
│ │ │ │ -
464 work=0;
│ │ │ │ -
465 //a=&mat_;
│ │ │ │ -
466 mat.setMatrix(mat_,mrs);
│ │ │ │ -
467 decompose();
│ │ │ │ -
468 }
│ │ │ │ -
│ │ │ │ -
469
│ │ │ │ -
470 template<typename M>
│ │ │ │ - │ │ │ │ -
472 {
│ │ │ │ -
473
│ │ │ │ -
474 first = true;
│ │ │ │ -
475 perm_c = new int[mat.M()];
│ │ │ │ -
476 perm_r = new int[mat.N()];
│ │ │ │ -
477 etree = new int[mat.M()];
│ │ │ │ -
478 R = new typename GetSuperLUType<T>::float_type[mat.N()];
│ │ │ │ -
479 C = new typename GetSuperLUType<T>::float_type[mat.M()];
│ │ │ │ -
480
│ │ │ │ -
481 set_default_options(&options);
│ │ │ │ -
482 // Do the factorization
│ │ │ │ -
483 B.ncol=0;
│ │ │ │ -
484 B.Stype=SLU_DN;
│ │ │ │ - │ │ │ │ -
486 B.Mtype= SLU_GE;
│ │ │ │ -
487 DNformat fakeFormat;
│ │ │ │ -
488 fakeFormat.lda=mat.N();
│ │ │ │ -
489 B.Store=&fakeFormat;
│ │ │ │ -
490 X.Stype=SLU_DN;
│ │ │ │ - │ │ │ │ -
492 X.Mtype= SLU_GE;
│ │ │ │ -
493 X.ncol=0;
│ │ │ │ -
494 X.Store=&fakeFormat;
│ │ │ │ -
495
│ │ │ │ -
496 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr=1e10;
│ │ │ │ -
497 int info;
│ │ │ │ -
498 mem_usage_t memusage;
│ │ │ │ -
499 SuperLUStat_t stat;
│ │ │ │ -
500
│ │ │ │ -
501 StatInit(&stat);
│ │ │ │ -
502 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
│ │ │ │ -
503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,
│ │ │ │ -
504 &berr, &memusage, &stat, &info);
│ │ │ │ -
505
│ │ │ │ -
506 if(verbose) {
│ │ │ │ -
507 dinfo<<"LU factorization: dgssvx() returns info "<< info<<std::endl;
│ │ │ │ -
508
│ │ │ │ -
509 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
│ │ │ │ -
510
│ │ │ │ -
511 if ( info == 0 || info == nSuperLUCol+1 ) {
│ │ │ │ -
512
│ │ │ │ -
513 if ( options.PivotGrowth )
│ │ │ │ -
514 dinfo<<"Recip. pivot growth = "<<rpg<<std::endl;
│ │ │ │ -
515 if ( options.ConditionNumber )
│ │ │ │ -
516 dinfo<<"Recip. condition number = %e\n"<< rcond<<std::endl;
│ │ │ │ -
517 SCformat* Lstore = (SCformat *) L.Store;
│ │ │ │ -
518 NCformat* Ustore = (NCformat *) U.Store;
│ │ │ │ -
519 dinfo<<"No of nonzeros in factor L = "<< Lstore->nnz<<std::endl;
│ │ │ │ -
520 dinfo<<"No of nonzeros in factor U = "<< Ustore->nnz<<std::endl;
│ │ │ │ -
521 dinfo<<"No of nonzeros in L+U = "<< Lstore->nnz + Ustore->nnz - nSuperLUCol<<std::endl;
│ │ │ │ -
522 QuerySpaceChooser<T>::querySpace(&L, &U, &memusage);
│ │ │ │ -
523 dinfo<<"L\\U MB "<<memusage.for_lu/1e6<<" \ttotal MB needed "<<memusage.total_needed/1e6
│ │ │ │ -
524 <<" \texpansions ";
│ │ │ │ -
525 std::cout<<stat.expansions<<std::endl;
│ │ │ │ -
526
│ │ │ │ -
527 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
│ │ │ │ -
528 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<std::endl;
│ │ │ │ -
529 }
│ │ │ │ -
530 if ( options.PrintStat ) StatPrint(&stat);
│ │ │ │ -
531 }
│ │ │ │ -
532 StatFree(&stat);
│ │ │ │ -
533 /*
│ │ │ │ -
534 NCformat* Ustore = (NCformat *) U.Store;
│ │ │ │ -
535 int k=0;
│ │ │ │ -
536 dPrint_CompCol_Matrix("U", &U);
│ │ │ │ -
537 for(int i=0; i < U.ncol; ++i, ++k){
│ │ │ │ -
538 std::cout<<i<<": ";
│ │ │ │ -
539 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
│ │ │ │ -
540 //if(Ustore->rowind[c]==i)
│ │ │ │ -
541 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
│ │ │ │ -
542 if(k==0){
│ │ │ │ -
543 //
│ │ │ │ -
544 k=-1;
│ │ │ │ -
545 }std::cout<<std::endl;
│ │ │ │ -
546 }
│ │ │ │ -
547 dPrint_SuperNode_Matrix("L", &L);
│ │ │ │ -
548 for(int i=0; i < U.ncol; ++i, ++k){
│ │ │ │ -
549 std::cout<<i<<": ";
│ │ │ │ -
550 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
│ │ │ │ -
551 //if(Ustore->rowind[c]==i)
│ │ │ │ -
552 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
│ │ │ │ -
553 if(k==0){
│ │ │ │ -
554 //
│ │ │ │ -
555 k=-1;
│ │ │ │ -
556 }std::cout<<std::endl;
│ │ │ │ -
557 } */
│ │ │ │ -
558 options.Fact = FACTORED;
│ │ │ │ -
559 }
│ │ │ │ -
560
│ │ │ │ -
561 template<typename M>
│ │ │ │ -
562 void SuperLU<M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
564 {
│ │ │ │ -
565 if (mat.N() != b.dim())
│ │ │ │ -
566 DUNE_THROW(ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
│ │ │ │ -
567 if (mat.M() != x.dim())
│ │ │ │ -
568 DUNE_THROW(ISTLError, "Size of solution vector x does not match the number of matrix columns!");
│ │ │ │ -
569 if (mat.M()+mat.N()==0)
│ │ │ │ -
570 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
│ │ │ │ -
571
│ │ │ │ -
572 SuperMatrix* mB = &B;
│ │ │ │ -
573 SuperMatrix* mX = &X;
│ │ │ │ -
574 SuperMatrix rB, rX;
│ │ │ │ -
575 if (reusevector) {
│ │ │ │ -
576 if(first) {
│ │ │ │ -
577 SuperLUDenseMatChooser<T>::create(&B, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
578 SuperLUDenseMatChooser<T>::create(&X, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
579 first=false;
│ │ │ │ -
580 }else{
│ │ │ │ -
581 ((DNformat*)B.Store)->nzval=&b[0];
│ │ │ │ -
582 ((DNformat*)X.Store)->nzval=&x[0];
│ │ │ │ -
583 }
│ │ │ │ -
584 } else {
│ │ │ │ -
585 SuperLUDenseMatChooser<T>::create(&rB, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
586 SuperLUDenseMatChooser<T>::create(&rX, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
587 mB = &rB;
│ │ │ │ -
588 mX = &rX;
│ │ │ │ -
589 }
│ │ │ │ -
590 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
│ │ │ │ -
591 int info;
│ │ │ │ -
592 mem_usage_t memusage;
│ │ │ │ -
593 SuperLUStat_t stat;
│ │ │ │ -
594 /* Initialize the statistics variables. */
│ │ │ │ -
595 StatInit(&stat);
│ │ │ │ -
596 /*
│ │ │ │ -
597 range_type d=b;
│ │ │ │ -
598 a->usmv(-1, x, d);
│ │ │ │ -
599
│ │ │ │ -
600 double def0=d.two_norm();
│ │ │ │ -
601 */
│ │ │ │ -
602 options.IterRefine=SLU_DOUBLE;
│ │ │ │ -
603
│ │ │ │ -
604 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
│ │ │ │ -
605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
│ │ │ │ -
606 &memusage, &stat, &info);
│ │ │ │ -
607
│ │ │ │ -
608 res.iterations=1;
│ │ │ │ -
609
│ │ │ │ -
610 /*
│ │ │ │ -
611 if(options.Equil==YES)
│ │ │ │ -
612 // undo scaling of right hand side
│ │ │ │ -
613 std::transform(reinterpret_cast<T*>(&b[0]),reinterpret_cast<T*>(&b[0])+mat.M(),
│ │ │ │ -
614 C, reinterpret_cast<T*>(&d[0]), std::divides<T>());
│ │ │ │ -
615 else
│ │ │ │ -
616 d=b;
│ │ │ │ -
617 a->usmv(-1, x, d);
│ │ │ │ -
618 res.reduction=d.two_norm()/def0;
│ │ │ │ -
619 res.conv_rate = res.reduction;
│ │ │ │ -
620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);
│ │ │ │ -
621 */
│ │ │ │ -
622 res.converged=true;
│ │ │ │ -
623
│ │ │ │ -
624 if(verbose) {
│ │ │ │ -
625
│ │ │ │ -
626 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
│ │ │ │ -
627
│ │ │ │ -
628 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
│ │ │ │ -
629
│ │ │ │ -
630 if ( info == 0 || info == nSuperLUCol+1 ) {
│ │ │ │ -
631
│ │ │ │ -
632 if ( options.IterRefine ) {
│ │ │ │ -
633 std::cout<<"Iterative Refinement: steps="
│ │ │ │ -
634 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ -
635 }else
│ │ │ │ -
636 std::cout<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ -
637 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
│ │ │ │ -
638 std::cout<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
│ │ │ │ -
639 }
│ │ │ │ -
640
│ │ │ │ -
641 if ( options.PrintStat ) StatPrint(&stat);
│ │ │ │ -
642 }
│ │ │ │ -
643 StatFree(&stat);
│ │ │ │ -
644 if (!reusevector) {
│ │ │ │ -
645 SUPERLU_FREE(rB.Store);
│ │ │ │ -
646 SUPERLU_FREE(rX.Store);
│ │ │ │ -
647 }
│ │ │ │ -
648 }
│ │ │ │ -
│ │ │ │ -
649
│ │ │ │ -
650 template<typename M>
│ │ │ │ -
651 void SuperLU<M>
│ │ │ │ -
│ │ │ │ -
652 ::apply(T* x, T* b)
│ │ │ │ -
653 {
│ │ │ │ -
654 if(mat.N()+mat.M()==0)
│ │ │ │ -
655 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
│ │ │ │ -
656
│ │ │ │ -
657 SuperMatrix* mB = &B;
│ │ │ │ -
658 SuperMatrix* mX = &X;
│ │ │ │ -
659 SuperMatrix rB, rX;
│ │ │ │ -
660 if (reusevector) {
│ │ │ │ -
661 if(first) {
│ │ │ │ -
662 SuperLUDenseMatChooser<T>::create(&B, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
663 SuperLUDenseMatChooser<T>::create(&X, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
664 first=false;
│ │ │ │ -
665 }else{
│ │ │ │ -
666 ((DNformat*) B.Store)->nzval=b;
│ │ │ │ -
667 ((DNformat*)X.Store)->nzval=x;
│ │ │ │ -
668 }
│ │ │ │ -
669 } else {
│ │ │ │ -
670 SuperLUDenseMatChooser<T>::create(&rB, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
671 SuperLUDenseMatChooser<T>::create(&rX, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ -
672 mB = &rB;
│ │ │ │ -
673 mX = &rX;
│ │ │ │ -
674 }
│ │ │ │ -
675
│ │ │ │ -
676 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
│ │ │ │ -
677 int info;
│ │ │ │ -
678 mem_usage_t memusage;
│ │ │ │ -
679 SuperLUStat_t stat;
│ │ │ │ -
680 /* Initialize the statistics variables. */
│ │ │ │ -
681 StatInit(&stat);
│ │ │ │ -
682
│ │ │ │ -
683 options.IterRefine=SLU_DOUBLE;
│ │ │ │ -
684
│ │ │ │ -
685 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
│ │ │ │ -
686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
│ │ │ │ -
687 &memusage, &stat, &info);
│ │ │ │ -
688
│ │ │ │ -
689 if(verbose) {
│ │ │ │ -
690 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
│ │ │ │ -
691
│ │ │ │ -
692 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
│ │ │ │ -
693
│ │ │ │ -
694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded
│ │ │ │ -
695
│ │ │ │ -
696 if ( options.IterRefine ) {
│ │ │ │ -
697 dinfo<<"Iterative Refinement: steps="
│ │ │ │ -
698 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ -
699 }else
│ │ │ │ -
700 dinfo<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ -
701 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
│ │ │ │ -
702 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
│ │ │ │ -
703 }
│ │ │ │ -
704 if ( options.PrintStat ) StatPrint(&stat);
│ │ │ │ -
705 }
│ │ │ │ -
706
│ │ │ │ -
707 StatFree(&stat);
│ │ │ │ -
708 if (!reusevector) {
│ │ │ │ -
709 SUPERLU_FREE(rB.Store);
│ │ │ │ -
710 SUPERLU_FREE(rX.Store);
│ │ │ │ -
711 }
│ │ │ │ -
712 }
│ │ │ │ -
│ │ │ │ -
715 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
717 {
│ │ │ │ -
718 enum { value=true};
│ │ │ │ -
719 };
│ │ │ │ -
│ │ │ │ -
720
│ │ │ │ -
721 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
723 {
│ │ │ │ -
724 enum { value = true };
│ │ │ │ -
725 };
│ │ │ │ -
│ │ │ │ -
726
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
728 template<class> struct isValidBlock : std::false_type{};
│ │ │ │ -
729 template<int k> struct isValidBlock<Dune::FieldVector<double,k>> : std::true_type{};
│ │ │ │ -
730 template<int k> struct isValidBlock<Dune::FieldVector<std::complex<double>,k>> : std::true_type{};
│ │ │ │ -
731 template<typename TL, typename M>
│ │ │ │ -
732 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
733 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
│ │ │ │ -
734 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
│ │ │ │ -
735 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ -
736 {
│ │ │ │ -
737 int verbose = config.get("verbose", 0);
│ │ │ │ -
738 return std::make_shared<Dune::SuperLU<M>>(mat,verbose);
│ │ │ │ -
739 }
│ │ │ │ -
│ │ │ │ -
740
│ │ │ │ -
741 // second version with SFINAE to validate the template parameters of SuperLU
│ │ │ │ -
742 template<typename TL, typename M>
│ │ │ │ -
743 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
744 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
│ │ │ │ -
745 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ -
746 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ -
747 {
│ │ │ │ -
748 DUNE_THROW(UnsupportedType,
│ │ │ │ -
749 "Unsupported Type in SuperLU (only double and std::complex<double> supported)");
│ │ │ │ -
750 }
│ │ │ │ -
│ │ │ │ -
751 };
│ │ │ │ -
│ │ │ │ -
752 template<> struct SuperLUCreator::isValidBlock<double> : std::true_type{};
│ │ │ │ -
753 template<> struct SuperLUCreator::isValidBlock<std::complex<double>> : std::true_type{};
│ │ │ │ -
754
│ │ │ │ - │ │ │ │ -
756} // end namespace DUNE
│ │ │ │ -
757
│ │ │ │ -
758// undefine macros from SuperLU's slu_util.h
│ │ │ │ -
759#undef FIRSTCOL_OF_SNODE
│ │ │ │ -
760#undef NO_MARKER
│ │ │ │ -
761#undef NUM_TEMPV
│ │ │ │ -
762#undef USER_ABORT
│ │ │ │ -
763#undef USER_MALLOC
│ │ │ │ -
764#undef SUPERLU_MALLOC
│ │ │ │ -
765#undef USER_FREE
│ │ │ │ -
766#undef SUPERLU_FREE
│ │ │ │ -
767#undef CHECK_MALLOC
│ │ │ │ -
768#undef SUPERLU_MAX
│ │ │ │ -
769#undef SUPERLU_MIN
│ │ │ │ -
770#undef L_SUB_START
│ │ │ │ -
771#undef L_SUB
│ │ │ │ -
772#undef L_NZ_START
│ │ │ │ -
773#undef L_FST_SUPC
│ │ │ │ -
774#undef U_NZ_START
│ │ │ │ -
775#undef U_SUB
│ │ │ │ -
776#undef TRUE
│ │ │ │ -
777#undef FALSE
│ │ │ │ -
778#undef EMPTY
│ │ │ │ -
779#undef NODROP
│ │ │ │ -
780#undef DROP_BASIC
│ │ │ │ -
781#undef DROP_PROWS
│ │ │ │ -
782#undef DROP_COLUMN
│ │ │ │ -
783#undef DROP_AREA
│ │ │ │ -
784#undef DROP_SECONDARY
│ │ │ │ -
785#undef DROP_DYNAMIC
│ │ │ │ -
786#undef DROP_INTERP
│ │ │ │ -
787#undef MILU_ALPHA
│ │ │ │ -
788
│ │ │ │ -
789#endif // HAVE_SUPERLU
│ │ │ │ -
790#endif // DUNE_SUPERLU_HH
│ │ │ │ - │ │ │ │ -
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
│ │ │ │ - │ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
void setSubMatrix(const Matrix &mat, const S &rowIndexSet)
Definition superlu.hh:457
│ │ │ │ -
void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition superlu.hh:563
│ │ │ │ -
void setVerbosity(bool v)
Definition superlu.hh:437
│ │ │ │ -
void free()
free allocated space.
Definition superlu.hh:403
│ │ │ │ -
~SuperLU()
Definition superlu.hh:396
│ │ │ │ -
SuperLU()
Empty default constructor.
Definition superlu.hh:432
│ │ │ │ -
void setMatrix(const Matrix &mat)
Initialize data from given matrix.
Definition superlu.hh:443
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
STL namespace.
│ │ │ │ -
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ -
Definition overlappingschwarz.hh:694
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ -
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
int iterations
Number of iterations.
Definition solver.hh:67
│ │ │ │ -
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ -
Definition solverregistry.hh:77
│ │ │ │ -
Definition solvertype.hh:16
│ │ │ │ -
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
│ │ │ │ -
Definition solvertype.hh:30
│ │ │ │ -
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
│ │ │ │ -
Definition superlu.hh:45
│ │ │ │ -
Definition superlu.hh:49
│ │ │ │ -
Definition superlu.hh:53
│ │ │ │ -
Definition superlu.hh:57
│ │ │ │ -
SuperLu Solver.
Definition superlu.hh:271
│ │ │ │ -
SuperLUMatrix::size_type nnz() const
Definition superlu.hh:355
│ │ │ │ -
void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
apply inverse operator, with given convergence criteria.
Definition superlu.hh:342
│ │ │ │ -
typename Impl::SuperLUVectorChooser< M >::range_type range_type
The type of the range of the solver.
Definition superlu.hh:284
│ │ │ │ -
M matrix_type
Definition superlu.hh:276
│ │ │ │ -
SuperMatrixInitializer< Matrix > MatrixInitializer
Type of an associated initializer class.
Definition superlu.hh:280
│ │ │ │ -
M Matrix
The matrix type.
Definition superlu.hh:275
│ │ │ │ -
typename Impl::SuperLUVectorChooser< M >::domain_type domain_type
The type of the domain of the solver.
Definition superlu.hh:282
│ │ │ │ -
const char * name()
Definition superlu.hh:371
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition superlu.hh:287
│ │ │ │ -
Dune::SuperLUMatrix< Matrix > SuperLUMatrix
The corresponding SuperLU Matrix type.
Definition superlu.hh:278
│ │ │ │ -
SuperLU(const Matrix &mat, const ParameterTree &config)
Constructs the SuperLU solver.
Definition superlu.hh:320
│ │ │ │ -
Definition superlu.hh:727
│ │ │ │ -
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
Definition superlu.hh:734
│ │ │ │ -
Definition superlu.hh:728
│ │ │ │ -
Definition supermatrix.hh:132
│ │ │ │ -
Utility class for converting an ISTL Matrix into a SuperLU Matrix.
Definition supermatrix.hh:175
│ │ │ │ -
Definition supermatrix.hh:179
│ │ │ │ +
101
│ │ │ │ +
102 extern void
│ │ │ │ +
103 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *,
│ │ │ │ +
104 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
105
│ │ │ │ +
106 extern void
│ │ │ │ +
107 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int,
│ │ │ │ +
108 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
109
│ │ │ │ +
110 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ +
111
│ │ │ │ +
112 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ +
113}
│ │ │ │ +
114#endif
│ │ │ │ +
115
│ │ │ │ +
116
│ │ │ │ +
117#endif
│ │ │ │ +
118#endif
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,947 +1,129 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -superlu.hh │ │ │ │ │ +superlufunctions.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SUPERLU_HH │ │ │ │ │ -6#define DUNE_ISTL_SUPERLU_HH │ │ │ │ │ -7 │ │ │ │ │ -8#if HAVE_SUPERLU │ │ │ │ │ +5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH │ │ │ │ │ +6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH │ │ │ │ │ +7#if HAVE_SUPERLU │ │ │ │ │ +8 │ │ │ │ │ 9 │ │ │ │ │ -10#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ -11#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ -12#include "_s_u_p_e_r_m_a_t_r_i_x_._h_h" │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -16#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ +_1_0#define int_t SUPERLU_INT_TYPE │ │ │ │ │ +11#include "supermatrix.h" │ │ │ │ │ +12#include "slu_util.h" │ │ │ │ │ +13#undef int_t │ │ │ │ │ +14 │ │ │ │ │ +15#if __has_include("slu_sdefs.h") │ │ │ │ │ +16extern "C" { │ │ │ │ │ +17 extern void │ │ │ │ │ +18 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ +19 char *, float *, float *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +20 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +21 float *, float *, float *, float *, │ │ │ │ │ +22 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ 23 │ │ │ │ │ -24namespace _D_u_n_e │ │ │ │ │ -25{ │ │ │ │ │ -26 │ │ │ │ │ -37 template │ │ │ │ │ -38 class SeqOverlappingSchwarz; │ │ │ │ │ -39 │ │ │ │ │ -40 template │ │ │ │ │ -41 struct SeqOverlappingSchwarzAssemblerHelper; │ │ │ │ │ -42 │ │ │ │ │ -43 template │ │ │ │ │ -_4_4 struct _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r │ │ │ │ │ -45 {}; │ │ │ │ │ -46 │ │ │ │ │ -47 template │ │ │ │ │ -_4_8 struct _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r │ │ │ │ │ -49 {}; │ │ │ │ │ -50 │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 struct _S_u_p_e_r_L_U_Q_u_e_r_y_C_h_o_o_s_e_r │ │ │ │ │ -53 {}; │ │ │ │ │ +24 extern void │ │ │ │ │ +25 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int, │ │ │ │ │ +26 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +27 extern void │ │ │ │ │ +28 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *, │ │ │ │ │ +29 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +30 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ +31 │ │ │ │ │ +32 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ +33} │ │ │ │ │ +34#endif │ │ │ │ │ +35 │ │ │ │ │ +36#if __has_include("slu_ddefs.h") │ │ │ │ │ +37extern "C" { │ │ │ │ │ +38 extern void │ │ │ │ │ +39 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ +40 char *, double *, double *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +41 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +42 double *, double *, double *, double *, │ │ │ │ │ +43 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ +44 │ │ │ │ │ +45 extern void │ │ │ │ │ +46 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *, │ │ │ │ │ +47 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +48 │ │ │ │ │ +49 extern void │ │ │ │ │ +50 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int, │ │ │ │ │ +51 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +52 │ │ │ │ │ +53 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ 54 │ │ │ │ │ -55 template │ │ │ │ │ -_5_6 struct _Q_u_e_r_y_S_p_a_c_e_C_h_o_o_s_e_r │ │ │ │ │ -57 {}; │ │ │ │ │ +55 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ +56} │ │ │ │ │ +57#endif │ │ │ │ │ 58 │ │ │ │ │ -59#if __has_include("slu_sdefs.h") │ │ │ │ │ -60 template<> │ │ │ │ │ -61 struct _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r │ │ │ │ │ -62 { │ │ │ │ │ -63 static void create(SuperMatrix *_m_a_t, int n, int m, float *dat, int n1, │ │ │ │ │ -64 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -65 { │ │ │ │ │ -66 sCreate_Dense_Matrix(_m_a_t, n, m, dat, n1, stype, dtype, mtype); │ │ │ │ │ -67 │ │ │ │ │ -68 } │ │ │ │ │ -69 │ │ │ │ │ -70 static void destroy(SuperMatrix*) │ │ │ │ │ -71 {} │ │ │ │ │ -72 │ │ │ │ │ -73 }; │ │ │ │ │ -74 template<> │ │ │ │ │ -75 struct SuperLUSolveChooser │ │ │ │ │ -76 { │ │ │ │ │ -77 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int *perm_c, │ │ │ │ │ -int *perm_r, int *etree, │ │ │ │ │ -78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ -79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ -80 float *rpg, float *rcond, float *ferr, float *berr, │ │ │ │ │ -81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ -82 { │ │ │ │ │ -83 GlobalLU_t gLU; │ │ │ │ │ -84 sgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ -85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ -86 &gLU, memusage, stat, info); │ │ │ │ │ -87 } │ │ │ │ │ -88 }; │ │ │ │ │ -89 │ │ │ │ │ -90 template<> │ │ │ │ │ -91 struct QuerySpaceChooser │ │ │ │ │ -92 { │ │ │ │ │ -93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ -memusage) │ │ │ │ │ -94 { │ │ │ │ │ -95 sQuerySpace(L,U,memusage); │ │ │ │ │ -96 } │ │ │ │ │ -97 }; │ │ │ │ │ -98 │ │ │ │ │ -99#endif │ │ │ │ │ +59#if __has_include("slu_cdefs.h") │ │ │ │ │ +60#ifndef SUPERLU_TYPEDEF_COMPLEX │ │ │ │ │ +61// For now let's keep backwards compatible and let │ │ │ │ │ +62// complex be a typedef of doublecomplex │ │ │ │ │ +63#define SUPERLU_TYPEDEF_COMPLEX │ │ │ │ │ +64#endif │ │ │ │ │ +65#include "slu_scomplex.h" │ │ │ │ │ +66 │ │ │ │ │ +67extern "C" { │ │ │ │ │ +68 extern void │ │ │ │ │ +69 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ +70 char *, float *, float *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +71 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +72 float *, float *, float *, float *, │ │ │ │ │ +73 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ +74 │ │ │ │ │ +75 │ │ │ │ │ +76 extern void │ │ │ │ │ +77 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int, │ │ │ │ │ +78 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +79 │ │ │ │ │ +80 │ │ │ │ │ +81 extern void │ │ │ │ │ +82 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *, │ │ │ │ │ +83 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +84 │ │ │ │ │ +85 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ +86 │ │ │ │ │ +87 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ +88} │ │ │ │ │ +89#endif │ │ │ │ │ +90 │ │ │ │ │ +91#if __has_include("slu_zdefs.h") │ │ │ │ │ +92#include "slu_dcomplex.h" │ │ │ │ │ +93extern "C" { │ │ │ │ │ +94 extern void │ │ │ │ │ +95 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ +96 char *, double *, double *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +97 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ +98 double *, double *, double *, double *, │ │ │ │ │ +99 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ 100 │ │ │ │ │ -101#if __has_include("slu_ddefs.h") │ │ │ │ │ -102 │ │ │ │ │ -103 template<> │ │ │ │ │ -104 struct SuperLUDenseMatChooser │ │ │ │ │ -105 { │ │ │ │ │ -106 static void create(SuperMatrix *_m_a_t, int n, int m, double *dat, int n1, │ │ │ │ │ -107 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -108 { │ │ │ │ │ -109 dCreate_Dense_Matrix(_m_a_t, n, m, dat, n1, stype, dtype, mtype); │ │ │ │ │ -110 │ │ │ │ │ -111 } │ │ │ │ │ -112 │ │ │ │ │ -113 static void destroy(SuperMatrix * /* mat */) │ │ │ │ │ -114 {} │ │ │ │ │ -115 }; │ │ │ │ │ -116 template<> │ │ │ │ │ -117 struct SuperLUSolveChooser │ │ │ │ │ -118 { │ │ │ │ │ -119 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int │ │ │ │ │ -*perm_c, int *perm_r, int *etree, │ │ │ │ │ -120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ -121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ -122 double *rpg, double *rcond, double *ferr, double *berr, │ │ │ │ │ -123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ -124 { │ │ │ │ │ -125 GlobalLU_t gLU; │ │ │ │ │ -126 dgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ -127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ -128 &gLU, memusage, stat, info); │ │ │ │ │ -129 } │ │ │ │ │ -130 }; │ │ │ │ │ -131 │ │ │ │ │ -132 template<> │ │ │ │ │ -133 struct QuerySpaceChooser │ │ │ │ │ -134 { │ │ │ │ │ -135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ -memusage) │ │ │ │ │ -136 { │ │ │ │ │ -137 dQuerySpace(L,U,memusage); │ │ │ │ │ -138 } │ │ │ │ │ -139 }; │ │ │ │ │ -140#endif │ │ │ │ │ -141 │ │ │ │ │ -142#if __has_include("slu_zdefs.h") │ │ │ │ │ -143 template<> │ │ │ │ │ -144 struct SuperLUDenseMatChooser<_s_t_d::complex > │ │ │ │ │ -145 { │ │ │ │ │ -146 static void create(SuperMatrix *_m_a_t, int n, int m, std::complex │ │ │ │ │ -*dat, int n1, │ │ │ │ │ -147 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -148 { │ │ │ │ │ -149 zCreate_Dense_Matrix(_m_a_t, n, m, reinterpret_cast(dat), n1, │ │ │ │ │ -stype, dtype, mtype); │ │ │ │ │ -150 │ │ │ │ │ -151 } │ │ │ │ │ -152 │ │ │ │ │ -153 static void destroy(SuperMatrix*) │ │ │ │ │ -154 {} │ │ │ │ │ -155 }; │ │ │ │ │ -156 │ │ │ │ │ -157 template<> │ │ │ │ │ -158 struct SuperLUSolveChooser<_s_t_d::complex > │ │ │ │ │ -159 { │ │ │ │ │ -160 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int │ │ │ │ │ -*perm_c, int *perm_r, int *etree, │ │ │ │ │ -161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ -162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ -163 double *rpg, double *rcond, double *ferr, double *berr, │ │ │ │ │ -164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ -165 { │ │ │ │ │ -166 GlobalLU_t gLU; │ │ │ │ │ -167 zgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ -168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ -169 &gLU, memusage, stat, info); │ │ │ │ │ -170 } │ │ │ │ │ -171 }; │ │ │ │ │ -172 │ │ │ │ │ -173 template<> │ │ │ │ │ -174 struct QuerySpaceChooser<_s_t_d::complex > │ │ │ │ │ -175 { │ │ │ │ │ -176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ -memusage) │ │ │ │ │ -177 { │ │ │ │ │ -178 zQuerySpace(L,U,memusage); │ │ │ │ │ -179 } │ │ │ │ │ -180 }; │ │ │ │ │ -181#endif │ │ │ │ │ -182 │ │ │ │ │ -183#if __has_include("slu_cdefs.h") │ │ │ │ │ -184 template<> │ │ │ │ │ -185 struct SuperLUDenseMatChooser<_s_t_d::complex > │ │ │ │ │ -186 { │ │ │ │ │ -187 static void create(SuperMatrix *_m_a_t, int n, int m, std::complex │ │ │ │ │ -*dat, int n1, │ │ │ │ │ -188 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -189 { │ │ │ │ │ -190 cCreate_Dense_Matrix(_m_a_t, n, m, reinterpret_cast< ::complex*>(dat), n1, │ │ │ │ │ -stype, dtype, mtype); │ │ │ │ │ -191 │ │ │ │ │ -192 } │ │ │ │ │ -193 │ │ │ │ │ -194 static void destroy(SuperMatrix* /* mat */) │ │ │ │ │ -195 {} │ │ │ │ │ -196 }; │ │ │ │ │ -197 │ │ │ │ │ -198 template<> │ │ │ │ │ -199 struct SuperLUSolveChooser<_s_t_d::complex > │ │ │ │ │ -200 { │ │ │ │ │ -201 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int │ │ │ │ │ -*perm_c, int *perm_r, int *etree, │ │ │ │ │ -202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ -203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ -204 float *rpg, float *rcond, float *ferr, float *berr, │ │ │ │ │ -205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ -206 { │ │ │ │ │ -207 GlobalLU_t gLU; │ │ │ │ │ -208 cgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ -209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ -210 &gLU, memusage, stat, info); │ │ │ │ │ -211 } │ │ │ │ │ -212 }; │ │ │ │ │ -213 │ │ │ │ │ -214 template<> │ │ │ │ │ -215 struct QuerySpaceChooser<_s_t_d::complex > │ │ │ │ │ -216 { │ │ │ │ │ -217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ -memusage) │ │ │ │ │ -218 { │ │ │ │ │ -219 cQuerySpace(L,U,memusage); │ │ │ │ │ -220 } │ │ │ │ │ -221 }; │ │ │ │ │ -222#endif │ │ │ │ │ -223 │ │ │ │ │ -224 namespace Impl │ │ │ │ │ -225 { │ │ │ │ │ -226 template │ │ │ │ │ -227 struct SuperLUVectorChooser │ │ │ │ │ -228 {}; │ │ │ │ │ -229 │ │ │ │ │ -230 template │ │ │ │ │ -231 struct SuperLUVectorChooser,A > > │ │ │ │ │ -232 { │ │ │ │ │ -234 using domain_type = BlockVector< │ │ │ │ │ -235 FieldVector, │ │ │ │ │ -236 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ ->; │ │ │ │ │ -238 using range_type = BlockVector< │ │ │ │ │ -239 FieldVector, │ │ │ │ │ -240 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ ->; │ │ │ │ │ -241 }; │ │ │ │ │ -242 │ │ │ │ │ -243 template │ │ │ │ │ -244 struct SuperLUVectorChooser > │ │ │ │ │ -245 { │ │ │ │ │ -247 using domain_type = BlockVector; │ │ │ │ │ -249 using range_type = BlockVector; │ │ │ │ │ -250 }; │ │ │ │ │ -251 } │ │ │ │ │ -252 │ │ │ │ │ -266 template │ │ │ │ │ -_2_6_7 class _S_u_p_e_r_L_U │ │ │ │ │ -268 : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< │ │ │ │ │ -269 typename Impl::SuperLUVectorChooser::domain_type, │ │ │ │ │ -270 typename Impl::SuperLUVectorChooser::range_type > │ │ │ │ │ -271 { │ │ │ │ │ -272 using T = typename M::field_type; │ │ │ │ │ -273 public: │ │ │ │ │ -_2_7_5 using _M_a_t_r_i_x = M; │ │ │ │ │ -_2_7_6 using _m_a_t_r_i_x___t_y_p_e = M; │ │ │ │ │ -_2_7_8 typedef _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_M_a_t_r_i_x_> _S_u_p_e_r_L_U_M_a_t_r_i_x; │ │ │ │ │ -_2_8_0 typedef _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_M_a_t_r_i_x_> _M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -_2_8_2 using _d_o_m_a_i_n___t_y_p_e = typename Impl::SuperLUVectorChooser::domain_type; │ │ │ │ │ -_2_8_4 using _r_a_n_g_e___t_y_p_e = typename Impl::SuperLUVectorChooser::range_type; │ │ │ │ │ -285 │ │ │ │ │ -_2_8_7 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -288 { │ │ │ │ │ -289 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -306 explicit _S_u_p_e_r_L_U(const _M_a_t_r_i_x& mat, bool verbose=false, │ │ │ │ │ -307 bool reusevector=true); │ │ │ │ │ -308 │ │ │ │ │ -309 │ │ │ │ │ -_3_2_0 _S_u_p_e_r_L_U(const _M_a_t_r_i_x& mat, const ParameterTree& config) │ │ │ │ │ -321 : _S_u_p_e_r_L_U(_m_a_t, config._g_e_t("verbose", false), config._g_e_t │ │ │ │ │ -("reuseVector", true)) │ │ │ │ │ -322 {} │ │ │ │ │ -323 │ │ │ │ │ -330 _S_u_p_e_r_L_U(); │ │ │ │ │ -331 │ │ │ │ │ -332 _~_S_u_p_e_r_L_U(); │ │ │ │ │ -333 │ │ │ │ │ -337 void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res); │ │ │ │ │ -338 │ │ │ │ │ -_3_4_2 void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, [[maybe_unused]] double │ │ │ │ │ -reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -343 { │ │ │ │ │ -344 _a_p_p_l_y(x,b,res); │ │ │ │ │ -345 } │ │ │ │ │ -346 │ │ │ │ │ -350 void _a_p_p_l_y(T* x, T* b); │ │ │ │ │ -351 │ │ │ │ │ -353 void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& mat); │ │ │ │ │ -354 │ │ │ │ │ -_3_5_5 typename SuperLUMatrix::size_type _n_n_z() const │ │ │ │ │ -356 { │ │ │ │ │ -357 return mat.nonzeroes(); │ │ │ │ │ -358 } │ │ │ │ │ -359 │ │ │ │ │ -360 template │ │ │ │ │ -361 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& mat, const S& rowIndexSet); │ │ │ │ │ -362 │ │ │ │ │ -363 void _s_e_t_V_e_r_b_o_s_i_t_y(bool v); │ │ │ │ │ -364 │ │ │ │ │ -369 void _f_r_e_e(); │ │ │ │ │ -370 │ │ │ │ │ -_3_7_1 const char* _n_a_m_e() { return "SuperLU"; } │ │ │ │ │ -372 private: │ │ │ │ │ -373 template │ │ │ │ │ -_3_7_4 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ -375 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_S_u_p_e_r_L_U<_M_a_t_r_i_x>,true>; │ │ │ │ │ -376 │ │ │ │ │ -377 _S_u_p_e_r_L_U_M_a_t_r_i_x& getInternalMatrix() { return _m_a_t; } │ │ │ │ │ -378 │ │ │ │ │ -380 void decompose(); │ │ │ │ │ -381 │ │ │ │ │ -382 _S_u_p_e_r_L_U_M_a_t_r_i_x _m_a_t; │ │ │ │ │ -383 SuperMatrix L, U, B, X; │ │ │ │ │ -384 int *perm_c, *perm_r, *etree; │ │ │ │ │ -385 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e *R, *C; │ │ │ │ │ -386 T *bstore; │ │ │ │ │ -387 superlu_options_t options; │ │ │ │ │ -388 char equed; │ │ │ │ │ -389 void *work; │ │ │ │ │ -390 int lwork; │ │ │ │ │ -391 bool first, verbose, reusevector; │ │ │ │ │ -392 }; │ │ │ │ │ -393 │ │ │ │ │ -394 template │ │ │ │ │ -395 SuperLU │ │ │ │ │ -_3_9_6 ::~SuperLU() │ │ │ │ │ -397 { │ │ │ │ │ -398 if(_m_a_t._N()+_m_a_t._M()>0) │ │ │ │ │ -399 free(); │ │ │ │ │ -400 } │ │ │ │ │ -401 │ │ │ │ │ -402 template │ │ │ │ │ -_4_0_3 void _S_u_p_e_r_L_U_<_M_>_:_:_f_r_e_e() │ │ │ │ │ -404 { │ │ │ │ │ -405 delete[] perm_c; │ │ │ │ │ -406 delete[] perm_r; │ │ │ │ │ -407 delete[] etree; │ │ │ │ │ -408 delete[] R; │ │ │ │ │ -409 delete[] C; │ │ │ │ │ -410 if(lwork>=0) { │ │ │ │ │ -411 Destroy_SuperNode_Matrix(&L); │ │ │ │ │ -412 Destroy_CompCol_Matrix(&U); │ │ │ │ │ -413 } │ │ │ │ │ -414 lwork=0; │ │ │ │ │ -415 if(!first && reusevector) { │ │ │ │ │ -416 SUPERLU_FREE(B.Store); │ │ │ │ │ -417 SUPERLU_FREE(X.Store); │ │ │ │ │ -418 } │ │ │ │ │ -419 _m_a_t.free(); │ │ │ │ │ -420 } │ │ │ │ │ -421 │ │ │ │ │ -422 template │ │ │ │ │ -423 _S_u_p_e_r_L_U_<_M_> │ │ │ │ │ -_4_2_4_ _:_:_S_u_p_e_r_L_U(const _M_a_t_r_i_x& mat_, bool verbose_, bool reusevector_) │ │ │ │ │ -425 : work(0), lwork(0), first(true), verbose(verbose_), │ │ │ │ │ -426 reusevector(reusevector_) │ │ │ │ │ -427 { │ │ │ │ │ -428 _s_e_t_M_a_t_r_i_x(mat_); │ │ │ │ │ -429 │ │ │ │ │ -430 } │ │ │ │ │ -431 template │ │ │ │ │ -_4_3_2 _S_u_p_e_r_L_U_<_M_>_:_:_S_u_p_e_r_L_U() │ │ │ │ │ -433 : work(0), lwork(0),verbose(false), │ │ │ │ │ -434 reusevector(false) │ │ │ │ │ -435 {} │ │ │ │ │ -436 template │ │ │ │ │ -_4_3_7 void _S_u_p_e_r_L_U_<_M_>_:_:_s_e_t_V_e_r_b_o_s_i_t_y(bool v) │ │ │ │ │ -438 { │ │ │ │ │ -439 verbose=v; │ │ │ │ │ -440 } │ │ │ │ │ -441 │ │ │ │ │ -442 template │ │ │ │ │ -_4_4_3 void _S_u_p_e_r_L_U_<_M_>_:_:_s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& mat_) │ │ │ │ │ -444 { │ │ │ │ │ -445 if(_m_a_t._N()+_m_a_t._M()>0) { │ │ │ │ │ -446 free(); │ │ │ │ │ -447 } │ │ │ │ │ -448 lwork=0; │ │ │ │ │ -449 work=0; │ │ │ │ │ -450 //a=&mat_; │ │ │ │ │ -451 _m_a_t=mat_; │ │ │ │ │ -452 decompose(); │ │ │ │ │ -453 } │ │ │ │ │ -454 │ │ │ │ │ -455 template │ │ │ │ │ -456 template │ │ │ │ │ -_4_5_7 void _S_u_p_e_r_L_U_<_M_>_:_:_s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& mat_, │ │ │ │ │ -458 const S& mrs) │ │ │ │ │ -459 { │ │ │ │ │ -460 if(_m_a_t._N()+_m_a_t._M()>0) { │ │ │ │ │ -461 free(); │ │ │ │ │ -462 } │ │ │ │ │ -463 lwork=0; │ │ │ │ │ -464 work=0; │ │ │ │ │ -465 //a=&mat_; │ │ │ │ │ -466 _m_a_t.setMatrix(mat_,mrs); │ │ │ │ │ -467 decompose(); │ │ │ │ │ -468 } │ │ │ │ │ -469 │ │ │ │ │ -470 template │ │ │ │ │ -471 void _S_u_p_e_r_L_U_<_M_>_:_:_d_e_c_o_m_p_o_s_e() │ │ │ │ │ -472 { │ │ │ │ │ -473 │ │ │ │ │ -474 first = true; │ │ │ │ │ -475 perm_c = new int[_m_a_t._M()]; │ │ │ │ │ -476 perm_r = new int[_m_a_t._N()]; │ │ │ │ │ -477 etree = new int[_m_a_t._M()]; │ │ │ │ │ -478 R = new typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e[_m_a_t._N()]; │ │ │ │ │ -479 C = new typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e[_m_a_t._M()]; │ │ │ │ │ -480 │ │ │ │ │ -481 set_default_options(&options); │ │ │ │ │ -482 // Do the factorization │ │ │ │ │ -483 B.ncol=0; │ │ │ │ │ -484 B.Stype=SLU_DN; │ │ │ │ │ -485 B.Dtype=_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e; │ │ │ │ │ -486 B.Mtype= SLU_GE; │ │ │ │ │ -487 DNformat fakeFormat; │ │ │ │ │ -488 fakeFormat.lda=_m_a_t._N(); │ │ │ │ │ -489 B.Store=&fakeFormat; │ │ │ │ │ -490 X.Stype=SLU_DN; │ │ │ │ │ -491 X.Dtype=_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e; │ │ │ │ │ -492 X.Mtype= SLU_GE; │ │ │ │ │ -493 X.ncol=0; │ │ │ │ │ -494 X.Store=&fakeFormat; │ │ │ │ │ -495 │ │ │ │ │ -496 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e rpg, rcond, ferr=1e10, berr=1e10; │ │ │ │ │ -497 int info; │ │ │ │ │ -498 mem_usage_t memusage; │ │ │ │ │ -499 SuperLUStat_t stat; │ │ │ │ │ -500 │ │ │ │ │ -501 StatInit(&stat); │ │ │ │ │ -502 _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_T_>_:_:_s_o_l_v_e(&options, &static_cast(_m_a_t), │ │ │ │ │ -perm_c, perm_r, etree, &equed, R, C, │ │ │ │ │ -503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr, │ │ │ │ │ -504 &berr, &memusage, &stat, &info); │ │ │ │ │ -505 │ │ │ │ │ -506 if(verbose) { │ │ │ │ │ -507 dinfo<<"LU factorization: dgssvx() returns info "<< info<(_m_a_t).ncol; │ │ │ │ │ -510 │ │ │ │ │ -511 if ( info == 0 || info == nSuperLUCol+1 ) { │ │ │ │ │ -512 │ │ │ │ │ -513 if ( options.PivotGrowth ) │ │ │ │ │ -514 dinfo<<"Recip. pivot growth = "< 0 && lwork == -1 ) { // Memory allocation failed │ │ │ │ │ -528 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<colptr[i]; c < Ustore->colptr[i+1]; ++c) │ │ │ │ │ -540 //if(Ustore->rowind[c]==i) │ │ │ │ │ -541 std::cout<rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" "; │ │ │ │ │ -542 if(k==0){ │ │ │ │ │ -543 // │ │ │ │ │ -544 k=-1; │ │ │ │ │ -545 }std::cout<colptr[i]; c < Ustore->colptr[i+1]; ++c) │ │ │ │ │ -551 //if(Ustore->rowind[c]==i) │ │ │ │ │ -552 std::cout<rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" "; │ │ │ │ │ -553 if(k==0){ │ │ │ │ │ -554 // │ │ │ │ │ -555 k=-1; │ │ │ │ │ -556 }std::cout< │ │ │ │ │ -562 void SuperLU │ │ │ │ │ -_5_6_3 ::apply(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -564 { │ │ │ │ │ -565 if (_m_a_t._N() != b.dim()) │ │ │ │ │ -566 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Size of right-hand-side vector b does not match the │ │ │ │ │ -number of matrix rows!"); │ │ │ │ │ -567 if (_m_a_t._M() != x.dim()) │ │ │ │ │ -568 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Size of solution vector x does not match the number │ │ │ │ │ -of matrix columns!"); │ │ │ │ │ -569 if (_m_a_t._M()+_m_a_t._N()==0) │ │ │ │ │ -570 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Matrix of SuperLU is null!"); │ │ │ │ │ -571 │ │ │ │ │ -572 SuperMatrix* mB = &B; │ │ │ │ │ -573 SuperMatrix* mX = &X; │ │ │ │ │ -574 SuperMatrix rB, rX; │ │ │ │ │ -575 if (reusevector) { │ │ │ │ │ -576 if(first) { │ │ │ │ │ -577 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&B, (int)_m_a_t._N(), 1, reinterpret_cast │ │ │ │ │ -(&b[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ -578 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&X, (int)_m_a_t._N(), 1, reinterpret_cast │ │ │ │ │ -(&x[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ -579 first=false; │ │ │ │ │ -580 }else{ │ │ │ │ │ -581 ((DNformat*)B.Store)->nzval=&b[0]; │ │ │ │ │ -582 ((DNformat*)X.Store)->nzval=&x[0]; │ │ │ │ │ -583 } │ │ │ │ │ -584 } else { │ │ │ │ │ -585 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rB, (int)_m_a_t._N(), 1, │ │ │ │ │ -reinterpret_cast(&b[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, │ │ │ │ │ -SLU_GE); │ │ │ │ │ -586 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rX, (int)_m_a_t._N(), 1, │ │ │ │ │ -reinterpret_cast(&x[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, │ │ │ │ │ -SLU_GE); │ │ │ │ │ -587 mB = &rB; │ │ │ │ │ -588 mX = &rX; │ │ │ │ │ -589 } │ │ │ │ │ -590 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e rpg, rcond, ferr=1e10, berr; │ │ │ │ │ -591 int info; │ │ │ │ │ -592 mem_usage_t memusage; │ │ │ │ │ -593 SuperLUStat_t stat; │ │ │ │ │ -594 /* Initialize the statistics variables. */ │ │ │ │ │ -595 StatInit(&stat); │ │ │ │ │ -596 /* │ │ │ │ │ -597 range_type d=b; │ │ │ │ │ -598 a->usmv(-1, x, d); │ │ │ │ │ -599 │ │ │ │ │ -600 double def0=d.two_norm(); │ │ │ │ │ -601 */ │ │ │ │ │ -602 options.IterRefine=SLU_DOUBLE; │ │ │ │ │ -603 │ │ │ │ │ -604 _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_T_>_:_:_s_o_l_v_e(&options, &static_cast(_m_a_t), │ │ │ │ │ -perm_c, perm_r, etree, &equed, R, C, │ │ │ │ │ -605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr, │ │ │ │ │ -606 &memusage, &stat, &info); │ │ │ │ │ -607 │ │ │ │ │ -608 res._i_t_e_r_a_t_i_o_n_s=1; │ │ │ │ │ -609 │ │ │ │ │ -610 /* │ │ │ │ │ -611 if(options.Equil==YES) │ │ │ │ │ -612 // undo scaling of right hand side │ │ │ │ │ -613 std::transform(reinterpret_cast(&b[0]),reinterpret_cast(&b │ │ │ │ │ -[0])+mat.M(), │ │ │ │ │ -614 C, reinterpret_cast(&d[0]), std::divides()); │ │ │ │ │ -615 else │ │ │ │ │ -616 d=b; │ │ │ │ │ -617 a->usmv(-1, x, d); │ │ │ │ │ -618 res.reduction=d.two_norm()/def0; │ │ │ │ │ -619 res.conv_rate = res.reduction; │ │ │ │ │ -620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18); │ │ │ │ │ -621 */ │ │ │ │ │ -622 res._c_o_n_v_e_r_g_e_d=true; │ │ │ │ │ -623 │ │ │ │ │ -624 if(verbose) { │ │ │ │ │ -625 │ │ │ │ │ -626 dinfo<<"Triangular solve: dgssvx() returns info "<< info<(_m_a_t).ncol; │ │ │ │ │ -629 │ │ │ │ │ -630 if ( info == 0 || info == nSuperLUCol+1 ) { │ │ │ │ │ -631 │ │ │ │ │ -632 if ( options.IterRefine ) { │ │ │ │ │ -633 std::cout<<"Iterative Refinement: steps=" │ │ │ │ │ -634 < │ │ │ │ │ -651 void _S_u_p_e_r_L_U_<_M_> │ │ │ │ │ -_6_5_2_ _:_:_a_p_p_l_y(T* x, T* b) │ │ │ │ │ -653 { │ │ │ │ │ -654 if(_m_a_t._N()+_m_a_t._M()==0) │ │ │ │ │ -655 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Matrix of SuperLU is null!"); │ │ │ │ │ -656 │ │ │ │ │ -657 SuperMatrix* mB = &B; │ │ │ │ │ -658 SuperMatrix* mX = &X; │ │ │ │ │ -659 SuperMatrix rB, rX; │ │ │ │ │ -660 if (reusevector) { │ │ │ │ │ -661 if(first) { │ │ │ │ │ -662 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&B, _m_a_t._N(), 1, b, _m_a_t._N(), SLU_DN, │ │ │ │ │ -_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ -663 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&X, _m_a_t._N(), 1, x, _m_a_t._N(), SLU_DN, │ │ │ │ │ -_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ -664 first=false; │ │ │ │ │ -665 }else{ │ │ │ │ │ -666 ((DNformat*) B.Store)->nzval=b; │ │ │ │ │ -667 ((DNformat*)X.Store)->nzval=x; │ │ │ │ │ -668 } │ │ │ │ │ -669 } else { │ │ │ │ │ -670 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rB, _m_a_t._N(), 1, b, _m_a_t._N(), SLU_DN, │ │ │ │ │ -_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ -671 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rX, _m_a_t._N(), 1, x, _m_a_t._N(), SLU_DN, │ │ │ │ │ -_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ -672 mB = &rB; │ │ │ │ │ -673 mX = &rX; │ │ │ │ │ -674 } │ │ │ │ │ -675 │ │ │ │ │ -676 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e rpg, rcond, ferr=1e10, berr; │ │ │ │ │ -677 int info; │ │ │ │ │ -678 mem_usage_t memusage; │ │ │ │ │ -679 SuperLUStat_t stat; │ │ │ │ │ -680 /* Initialize the statistics variables. */ │ │ │ │ │ -681 StatInit(&stat); │ │ │ │ │ -682 │ │ │ │ │ -683 options.IterRefine=SLU_DOUBLE; │ │ │ │ │ -684 │ │ │ │ │ -685 _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_T_>_:_:_s_o_l_v_e(&options, &static_cast(_m_a_t), │ │ │ │ │ -perm_c, perm_r, etree, &equed, R, C, │ │ │ │ │ -686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr, │ │ │ │ │ -687 &memusage, &stat, &info); │ │ │ │ │ -688 │ │ │ │ │ -689 if(verbose) { │ │ │ │ │ -690 dinfo<<"Triangular solve: dgssvx() returns info "<< info<(_m_a_t).ncol; │ │ │ │ │ -693 │ │ │ │ │ -694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded │ │ │ │ │ -695 │ │ │ │ │ -696 if ( options.IterRefine ) { │ │ │ │ │ -697 dinfo<<"Iterative Refinement: steps=" │ │ │ │ │ -698 < │ │ │ │ │ -_7_1_6 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r<_S_u_p_e_r_L_U<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ -717 { │ │ │ │ │ -_7_1_8 enum { _v_a_l_u_e=true}; │ │ │ │ │ -719 }; │ │ │ │ │ -720 │ │ │ │ │ -721 template │ │ │ │ │ -_7_2_2 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d<_S_u_p_e_r_L_U<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ -723 { │ │ │ │ │ -_7_2_4 enum { _v_a_l_u_e = true }; │ │ │ │ │ -725 }; │ │ │ │ │ -726 │ │ │ │ │ -_7_2_7 struct _S_u_p_e_r_L_U_C_r_e_a_t_o_r { │ │ │ │ │ -_7_2_8 template struct _i_s_V_a_l_i_d_B_l_o_c_k : std::false_type{}; │ │ │ │ │ -_7_2_9 template struct _i_s_V_a_l_i_d_B_l_o_c_k<_D_u_n_e::FieldVector> : std:: │ │ │ │ │ -true_type{}; │ │ │ │ │ -_7_3_0 template struct _i_s_V_a_l_i_d_B_l_o_c_k<_D_u_n_e::FieldVector,k>> : std::true_type{}; │ │ │ │ │ -731 template │ │ │ │ │ -732 std::shared_ptr::type, │ │ │ │ │ -733 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_7_3_4 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& config, │ │ │ │ │ -735 std::enable_if_t<_i_s_V_a_l_i_d_B_l_o_c_k::type:: │ │ │ │ │ -block_type>::value,int> = 0) const │ │ │ │ │ -736 { │ │ │ │ │ -737 int verbose = config.get("verbose", 0); │ │ │ │ │ -738 return std::make_shared>(_m_a_t,verbose); │ │ │ │ │ -739 } │ │ │ │ │ -740 │ │ │ │ │ -741 // second version with SFINAE to validate the template parameters of │ │ │ │ │ -SuperLU │ │ │ │ │ -742 template │ │ │ │ │ -743 std::shared_ptr::type, │ │ │ │ │ -744 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_7_4_5 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ -*config*/, │ │ │ │ │ -746 std::enable_if_t:: │ │ │ │ │ -type::block_type>::value,int> = 0) const │ │ │ │ │ -747 { │ │ │ │ │ -748 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, │ │ │ │ │ -749 "Unsupported Type in SuperLU (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -750 } │ │ │ │ │ -751 }; │ │ │ │ │ -_7_5_2 template<> struct _S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k : std::true_type{}; │ │ │ │ │ -_7_5_3 template<> struct _S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k<_s_t_d::complex> : │ │ │ │ │ -std::true_type{}; │ │ │ │ │ -754 │ │ │ │ │ -_7_5_5 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("superlu", _S_u_p_e_r_L_U_C_r_e_a_t_o_r()); │ │ │ │ │ -756} // end namespace DUNE │ │ │ │ │ -757 │ │ │ │ │ -758// undefine macros from SuperLU's slu_util.h │ │ │ │ │ -759#undef FIRSTCOL_OF_SNODE │ │ │ │ │ -760#undef NO_MARKER │ │ │ │ │ -761#undef NUM_TEMPV │ │ │ │ │ -762#undef USER_ABORT │ │ │ │ │ -763#undef USER_MALLOC │ │ │ │ │ -764#undef SUPERLU_MALLOC │ │ │ │ │ -765#undef USER_FREE │ │ │ │ │ -766#undef SUPERLU_FREE │ │ │ │ │ -767#undef CHECK_MALLOC │ │ │ │ │ -768#undef SUPERLU_MAX │ │ │ │ │ -769#undef SUPERLU_MIN │ │ │ │ │ -770#undef L_SUB_START │ │ │ │ │ -771#undef L_SUB │ │ │ │ │ -772#undef L_NZ_START │ │ │ │ │ -773#undef L_FST_SUPC │ │ │ │ │ -774#undef U_NZ_START │ │ │ │ │ -775#undef U_SUB │ │ │ │ │ -776#undef TRUE │ │ │ │ │ -777#undef FALSE │ │ │ │ │ -778#undef EMPTY │ │ │ │ │ -779#undef NODROP │ │ │ │ │ -780#undef DROP_BASIC │ │ │ │ │ -781#undef DROP_PROWS │ │ │ │ │ -782#undef DROP_COLUMN │ │ │ │ │ -783#undef DROP_AREA │ │ │ │ │ -784#undef DROP_SECONDARY │ │ │ │ │ -785#undef DROP_DYNAMIC │ │ │ │ │ -786#undef DROP_INTERP │ │ │ │ │ -787#undef MILU_ALPHA │ │ │ │ │ -788 │ │ │ │ │ -789#endif // HAVE_SUPERLU │ │ │ │ │ -790#endif // DUNE_SUPERLU_HH │ │ │ │ │ -_s_u_p_e_r_m_a_t_r_i_x_._h_h │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ -#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h │ │ │ │ │ -_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const Matrix &mat, const S &rowIndexSet) │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:457 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_a_p_p_l_y │ │ │ │ │ -void apply(domain_type &x, range_type &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator,. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:563 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_s_e_t_V_e_r_b_o_s_i_t_y │ │ │ │ │ -void setVerbosity(bool v) │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:437 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_f_r_e_e │ │ │ │ │ -void free() │ │ │ │ │ -free allocated space. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:403 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_~_S_u_p_e_r_L_U │ │ │ │ │ -~SuperLU() │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:396 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_S_u_p_e_r_L_U │ │ │ │ │ -SuperLU() │ │ │ │ │ -Empty default constructor. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:432 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -void setMatrix(const Matrix &mat) │ │ │ │ │ -Initialize data from given matrix. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:443 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -Sequential overlapping Schwarz preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -Return the number of columns. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -Return the number of rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -int iterations │ │ │ │ │ -Number of iterations. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -Whether this is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -whether the solver internally uses column compressed storage │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_Q_u_e_r_y_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_e_r_y_S_p_a_c_e_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U │ │ │ │ │ -SuperLu Solver. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_n_n_z │ │ │ │ │ -SuperLUMatrix::size_type nnz() const │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_a_p_p_l_y │ │ │ │ │ -void apply(domain_type &x, range_type &b, double reduction, │ │ │ │ │ -InverseOperatorResult &res) │ │ │ │ │ -apply inverse operator, with given convergence criteria. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:342 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -typename Impl::SuperLUVectorChooser< M >::range_type range_type │ │ │ │ │ -The type of the range of the solver. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -SuperMatrixInitializer< Matrix > MatrixInitializer │ │ │ │ │ -Type of an associated initializer class. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:280 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_M_a_t_r_i_x │ │ │ │ │ -M Matrix │ │ │ │ │ -The matrix type. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -typename Impl::SuperLUVectorChooser< M >::domain_type domain_type │ │ │ │ │ -The type of the domain of the solver. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_n_a_m_e │ │ │ │ │ -const char * name() │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the solver (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:287 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -Dune::SuperLUMatrix< Matrix > SuperLUMatrix │ │ │ │ │ -The corresponding SuperLU Matrix type. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_S_u_p_e_r_L_U │ │ │ │ │ -SuperLU(const Matrix &mat, const ParameterTree &config) │ │ │ │ │ -Constructs the SuperLU solver. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:320 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:727 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL │ │ │ │ │ ->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const │ │ │ │ │ -M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< │ │ │ │ │ -typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:734 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:728 │ │ │ │ │ -_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -Utility class for converting an ISTL Matrix into a SuperLU Matrix. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:179 │ │ │ │ │ +101 │ │ │ │ │ +102 extern void │ │ │ │ │ +103 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *, │ │ │ │ │ +104 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +105 │ │ │ │ │ +106 extern void │ │ │ │ │ +107 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int, │ │ │ │ │ +108 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +109 │ │ │ │ │ +110 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ +111 │ │ │ │ │ +112 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ +113} │ │ │ │ │ +114#endif │ │ │ │ │ +115 │ │ │ │ │ +116 │ │ │ │ │ +117#endif │ │ │ │ │ +118#endif │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00011.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: schwarz.hh File Reference │ │ │ │ +dune-istl: matrixredistribute.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,57 +71,86 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
schwarz.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
matrixredistribute.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <fstream>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <sstream>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ -#include "io.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include "vbvector.hh"
│ │ │ │ -#include "bcrsmatrix.hh"
│ │ │ │ -#include "gsetc.hh"
│ │ │ │ -#include "ilu.hh"
│ │ │ │ -#include "operators.hh"
│ │ │ │ -#include "solvers.hh"
│ │ │ │ -#include "preconditioners.hh"
│ │ │ │ -#include "scalarproducts.hh"
│ │ │ │ -#include "owneroverlapcopy.hh"
│ │ │ │ + │ │ │ │ +

Functionality for redistributing a sparse matrix. │ │ │ │ +More...

│ │ │ │ +
#include <memory>
│ │ │ │ +#include "repartition.hh"
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/parallel/indexset.hh>
│ │ │ │ +#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ +#include <dune/istl/paamg/pinfo.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::OverlappingSchwarzOperator< M, X, Y, C >
 An overlapping Schwarz operator. More...
struct  Dune::RedistributeInformation< T >
 
class  Dune::RedistributeInformation< OwnerOverlapCopyCommunication< T, T1 > >
 
struct  Dune::CommMatrixRowSize< M, RI >
 Utility class to communicate and set the row sizes of a redistributed matrix. More...
 
struct  Dune::CommMatrixSparsityPattern< M, I >
 Utility class to communicate and build the sparsity pattern of a redistributed matrix. More...
 
struct  Dune::CommPolicy< CommMatrixSparsityPattern< M, I > >
 
struct  Dune::CommMatrixRow< M, I >
 Utility class for comunicating the matrix entries. More...
 
class  Dune::ParSSOR< M, X, Y, C >
 A parallel SSOR preconditioner. More...
struct  Dune::CommPolicy< CommMatrixRow< M, I > >
 
class  Dune::BlockPreconditioner< X, Y, C, P >
 Block parallel preconditioner. More...
struct  Dune::MatrixRowSizeGatherScatter< M, I, RI >
 
struct  Dune::MatrixCopyRowSizeGatherScatter< M, I, RI >
 
struct  Dune::MatrixSparsityPatternGatherScatter< M, I >
 
struct  Dune::MatrixRowGatherScatter< M, I >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<typename M , typename C >
void Dune::redistributeSparsityPattern (M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
 
template<typename M , typename C >
void Dune::redistributeMatrixEntries (M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
 
template<typename M , typename C >
void Dune::redistributeMatrix (M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
 Redistribute a matrix according to given domain decompositions.
 
template<typename M >
void Dune::redistributeMatrixEntries (M &origMatrix, M &newMatrix, Dune::Amg::SequentialInformation &origComm, Dune::Amg::SequentialInformation &newComm, RedistributeInformation< Dune::Amg::SequentialInformation > &ri)
 
template<typename M >
void Dune::redistributeMatrix (M &origMatrix, M &newMatrix, Dune::Amg::SequentialInformation &origComm, Dune::Amg::SequentialInformation &newComm, RedistributeInformation< Dune::Amg::SequentialInformation > &ri)
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Functionality for redistributing a sparse matrix.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,80 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -schwarz.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_o_._h_h" │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -#include "_i_l_u_._h_h" │ │ │ │ │ -#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ -#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ -#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ -#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ -#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._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 │ │ │ │ │ +matrixredistribute.hh File Reference │ │ │ │ │ +Functionality for redistributing a sparse matrix. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include "_r_e_p_a_r_t_i_t_i_o_n_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._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_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _> │ │ │ │ │ -  An overlapping Schwarz operator. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_P_a_r_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _C_ _> │ │ │ │ │ -  A parallel SSOR preconditioner. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _> │ │ │ │ │ + _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _P_ _> │ │ │ │ │ -  Block parallel preconditioner. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_ _M_,_ _R_I_ _> │ │ │ │ │ +  Utility class to communicate and set the row sizes of a redistributed │ │ │ │ │ + matrix. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _> │ │ │ │ │ +  Utility class to communicate and build the sparsity pattern of a │ │ │ │ │ + redistributed matrix. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _> │ │ │ │ │ +  Utility class for comunicating the matrix entries. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_,_ _R_I_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_,_ _R_I_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n (M &origMatrix, M &newMatrix, C │ │ │ │ │ + &origComm, C &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s (M &origMatrix, M &newMatrix, C │ │ │ │ │ + &origComm, C &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ + &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri) │ │ │ │ │ +  Redistribute a matrix according to given domain decompositions. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s (M &origMatrix, M &newMatrix, _D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ + _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n &origComm, _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ + &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > │ │ │ │ │ + &ri) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (M &origMatrix, M &newMatrix, _D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ + _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n &origComm, _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ + &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > │ │ │ │ │ + &ri) │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Functionality for redistributing a sparse matrix. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: schwarz.hh Source File │ │ │ │ +dune-istl: matrixredistribute.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,302 +74,996 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
schwarz.hh
│ │ │ │ +
matrixredistribute.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SCHWARZ_HH
│ │ │ │ -
6#define DUNE_ISTL_SCHWARZ_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <iostream> // for input/output to shell
│ │ │ │ -
9#include <fstream> // for input/output to files
│ │ │ │ -
10#include <vector> // STL vector class
│ │ │ │ -
11#include <sstream>
│ │ │ │ -
12
│ │ │ │ -
13#include <cmath> // Yes, we do some math here
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/timer.hh>
│ │ │ │ -
16
│ │ │ │ -
17#include "io.hh"
│ │ │ │ -
18#include "bvector.hh"
│ │ │ │ -
19#include "vbvector.hh"
│ │ │ │ -
20#include "bcrsmatrix.hh"
│ │ │ │ -
21#include "io.hh"
│ │ │ │ -
22#include "gsetc.hh"
│ │ │ │ -
23#include "ilu.hh"
│ │ │ │ -
24#include "operators.hh"
│ │ │ │ -
25#include "solvers.hh"
│ │ │ │ -
26#include "preconditioners.hh"
│ │ │ │ -
27#include "scalarproducts.hh"
│ │ │ │ -
28#include "owneroverlapcopy.hh"
│ │ │ │ -
29
│ │ │ │ -
30namespace Dune {
│ │ │ │ -
31
│ │ │ │ -
73 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
75 {
│ │ │ │ -
76 public:
│ │ │ │ -
81 typedef M matrix_type;
│ │ │ │ -
86 typedef X domain_type;
│ │ │ │ -
91 typedef Y range_type;
│ │ │ │ -
93 typedef typename X::field_type field_type;
│ │ │ │ - │ │ │ │ -
99
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
108 : _A_(stackobject_to_shared_ptr(A)), communication(com)
│ │ │ │ -
109 {}
│ │ │ │ -
│ │ │ │ -
110
│ │ │ │ -
│ │ │ │ -
111 OverlappingSchwarzOperator (const std::shared_ptr<matrix_type> A, const communication_type& com)
│ │ │ │ -
112 : _A_(A), communication(com)
│ │ │ │ -
113 {}
│ │ │ │ -
│ │ │ │ -
114
│ │ │ │ -
│ │ │ │ -
116 virtual void apply (const X& x, Y& y) const
│ │ │ │ -
117 {
│ │ │ │ -
118 y = 0;
│ │ │ │ -
119 _A_->umv(x,y); // result is consistent on interior+border
│ │ │ │ -
120 communication.project(y); // we want this here to avoid it before the preconditioner
│ │ │ │ -
121 // since there d is const!
│ │ │ │ -
122 }
│ │ │ │ -
│ │ │ │ -
123
│ │ │ │ -
│ │ │ │ -
125 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
│ │ │ │ -
126 {
│ │ │ │ -
127 _A_->usmv(alpha,x,y); // result is consistent on interior+border
│ │ │ │ -
128 communication.project(y); // we want this here to avoid it before the preconditioner
│ │ │ │ -
129 // since there d is const!
│ │ │ │ -
130 }
│ │ │ │ -
│ │ │ │ -
131
│ │ │ │ -
│ │ │ │ -
133 virtual const matrix_type& getmat () const
│ │ │ │ -
134 {
│ │ │ │ -
135 return *_A_;
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
140 {
│ │ │ │ - │ │ │ │ -
142 }
│ │ │ │ -
│ │ │ │ -
143
│ │ │ │ -
144
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
147 {
│ │ │ │ -
148 return communication;
│ │ │ │ -
149 }
│ │ │ │ -
│ │ │ │ -
150 private:
│ │ │ │ -
151 const std::shared_ptr<const matrix_type>_A_;
│ │ │ │ -
152 const communication_type& communication;
│ │ │ │ -
153 };
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
157 /*
│ │ │ │ -
158 * @addtogroup ISTL_Prec
│ │ │ │ -
159 * @{
│ │ │ │ -
160 */
│ │ │ │ -
174 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ -
175 class ParSSOR : public Preconditioner<X,Y> {
│ │ │ │ -
176 public:
│ │ │ │ -
178 typedef M matrix_type;
│ │ │ │ -
180 typedef X domain_type;
│ │ │ │ -
182 typedef Y range_type;
│ │ │ │ -
184 typedef typename X::field_type field_type;
│ │ │ │ - │ │ │ │ +
5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH
│ │ │ │ +
6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH
│ │ │ │ +
7#include <memory>
│ │ │ │ +
8#include "repartition.hh"
│ │ │ │ +
9#include <dune/common/exceptions.hh>
│ │ │ │ +
10#include <dune/common/parallel/indexset.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
18namespace Dune
│ │ │ │ +
19{
│ │ │ │ +
20 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
22 {
│ │ │ │ +
│ │ │ │ +
23 bool isSetup() const
│ │ │ │ +
24 {
│ │ │ │ +
25 return false;
│ │ │ │ +
26 }
│ │ │ │ +
│ │ │ │ +
27 template<class D>
│ │ │ │ +
│ │ │ │ +
28 void redistribute([[maybe_unused]] const D& from, [[maybe_unused]] D& to) const
│ │ │ │ +
29 {}
│ │ │ │ +
│ │ │ │ +
30
│ │ │ │ +
31 template<class D>
│ │ │ │ +
│ │ │ │ +
32 void redistributeBackward([[maybe_unused]] D& from, [[maybe_unused]]const D& to) const
│ │ │ │ +
33 {}
│ │ │ │ +
│ │ │ │ +
34
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
36 {}
│ │ │ │ +
│ │ │ │ +
37
│ │ │ │ +
│ │ │ │ +
38 void setNoRows([[maybe_unused]] std::size_t size)
│ │ │ │ +
39 {}
│ │ │ │ +
│ │ │ │ +
40
│ │ │ │ +
│ │ │ │ +
41 void setNoCopyRows([[maybe_unused]] std::size_t size)
│ │ │ │ +
42 {}
│ │ │ │ +
│ │ │ │ +
43
│ │ │ │ +
│ │ │ │ +
44 void setNoBackwardsCopyRows([[maybe_unused]] std::size_t size)
│ │ │ │ +
45 {}
│ │ │ │ +
│ │ │ │ +
46
│ │ │ │ +
│ │ │ │ +
47 std::size_t getRowSize([[maybe_unused]] std::size_t index) const
│ │ │ │ +
48 {
│ │ │ │ +
49 return -1;
│ │ │ │ +
50 }
│ │ │ │ +
│ │ │ │ +
51
│ │ │ │ +
│ │ │ │ +
52 std::size_t getCopyRowSize([[maybe_unused]] std::size_t index) const
│ │ │ │ +
53 {
│ │ │ │ +
54 return -1;
│ │ │ │ +
55 }
│ │ │ │ +
│ │ │ │ +
56
│ │ │ │ +
│ │ │ │ +
57 std::size_t getBackwardsCopyRowSize([[maybe_unused]] std::size_t index) const
│ │ │ │ +
58 {
│ │ │ │ +
59 return -1;
│ │ │ │ +
60 }
│ │ │ │ +
│ │ │ │ +
61
│ │ │ │ +
62 };
│ │ │ │ +
│ │ │ │ +
63
│ │ │ │ +
64#if HAVE_MPI
│ │ │ │ +
65 template<typename T, typename T1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
67 {
│ │ │ │ +
68 public:
│ │ │ │ + │ │ │ │ +
70
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
72 : interface(), setup_(false)
│ │ │ │ +
73 {}
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
76 {
│ │ │ │ +
77 return interface;
│ │ │ │ +
78 }
│ │ │ │ +
│ │ │ │ +
79 template<typename IS>
│ │ │ │ +
│ │ │ │ +
80 void checkInterface(const IS& source,
│ │ │ │ +
81 const IS& target, MPI_Comm comm)
│ │ │ │ +
82 {
│ │ │ │ +
83 auto ri = std::make_unique<RemoteIndices<IS> >(source, target, comm);
│ │ │ │ +
84 ri->template rebuild<true>();
│ │ │ │ +
85 Interface inf;
│ │ │ │ + │ │ │ │ +
87 int rank;
│ │ │ │ +
88 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ +
89 inf.free();
│ │ │ │ +
90 inf.build(*ri, flags, flags);
│ │ │ │ +
91
│ │ │ │ +
92
│ │ │ │ +
93#ifdef DEBUG_REPART
│ │ │ │ +
94 if(inf!=interface) {
│ │ │ │ +
95
│ │ │ │ +
96 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ +
97 if(rank==0)
│ │ │ │ +
98 std::cout<<"Interfaces do not match!"<<std::endl;
│ │ │ │ +
99 std::cout<<rank<<": redist interface new :"<<inf<<std::endl;
│ │ │ │ +
100 std::cout<<rank<<": redist interface :"<<interface<<std::endl;
│ │ │ │ +
101
│ │ │ │ +
102 throw "autsch!";
│ │ │ │ +
103 }
│ │ │ │ +
104#endif
│ │ │ │ +
105 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
106 void setSetup()
│ │ │ │ +
107 {
│ │ │ │ +
108 setup_=true;
│ │ │ │ +
109 interface.strip();
│ │ │ │ +
110 }
│ │ │ │ +
│ │ │ │ +
111
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
113 {
│ │ │ │ +
114 setup_=false;
│ │ │ │ +
115 }
│ │ │ │ +
│ │ │ │ +
116
│ │ │ │ +
117 template<class GatherScatter, class D>
│ │ │ │ +
│ │ │ │ +
118 void redistribute(const D& from, D& to) const
│ │ │ │ +
119 {
│ │ │ │ +
120 BufferedCommunicator communicator;
│ │ │ │ +
121 communicator.template build<D>(from,to, interface);
│ │ │ │ +
122 communicator.template forward<GatherScatter>(from, to);
│ │ │ │ +
123 communicator.free();
│ │ │ │ +
124 }
│ │ │ │ +
│ │ │ │ +
125 template<class GatherScatter, class D>
│ │ │ │ +
│ │ │ │ +
126 void redistributeBackward(D& from, const D& to) const
│ │ │ │ +
127 {
│ │ │ │ +
128
│ │ │ │ +
129 BufferedCommunicator communicator;
│ │ │ │ +
130 communicator.template build<D>(from,to, interface);
│ │ │ │ +
131 communicator.template backward<GatherScatter>(from, to);
│ │ │ │ +
132 communicator.free();
│ │ │ │ +
133 }
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
135 template<class D>
│ │ │ │ +
│ │ │ │ +
136 void redistribute(const D& from, D& to) const
│ │ │ │ +
137 {
│ │ │ │ +
138 redistribute<CopyGatherScatter<D> >(from,to);
│ │ │ │ +
139 }
│ │ │ │ +
│ │ │ │ +
140 template<class D>
│ │ │ │ +
│ │ │ │ +
141 void redistributeBackward(D& from, const D& to) const
│ │ │ │ +
142 {
│ │ │ │ +
143 redistributeBackward<CopyGatherScatter<D> >(from,to);
│ │ │ │ +
144 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
145 bool isSetup() const
│ │ │ │ +
146 {
│ │ │ │ +
147 return setup_;
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
│ │ │ │ +
150 void reserve(std::size_t size)
│ │ │ │ +
151 {}
│ │ │ │ +
│ │ │ │ +
152
│ │ │ │ +
│ │ │ │ +
153 std::size_t& getRowSize(std::size_t index)
│ │ │ │ +
154 {
│ │ │ │ +
155 return rowSize[index];
│ │ │ │ +
156 }
│ │ │ │ +
│ │ │ │ +
157
│ │ │ │ +
│ │ │ │ +
158 std::size_t getRowSize(std::size_t index) const
│ │ │ │ +
159 {
│ │ │ │ +
160 return rowSize[index];
│ │ │ │ +
161 }
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
│ │ │ │ +
163 std::size_t& getCopyRowSize(std::size_t index)
│ │ │ │ +
164 {
│ │ │ │ +
165 return copyrowSize[index];
│ │ │ │ +
166 }
│ │ │ │ +
│ │ │ │ +
167
│ │ │ │ +
│ │ │ │ +
168 std::size_t getCopyRowSize(std::size_t index) const
│ │ │ │ +
169 {
│ │ │ │ +
170 return copyrowSize[index];
│ │ │ │ +
171 }
│ │ │ │ +
│ │ │ │ +
172
│ │ │ │ +
│ │ │ │ +
173 std::size_t& getBackwardsCopyRowSize(std::size_t index)
│ │ │ │ +
174 {
│ │ │ │ +
175 return backwardscopyrowSize[index];
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177
│ │ │ │ +
│ │ │ │ +
178 std::size_t getBackwardsCopyRowSize(std::size_t index) const
│ │ │ │ +
179 {
│ │ │ │ +
180 return backwardscopyrowSize[index];
│ │ │ │ +
181 }
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
│ │ │ │ +
183 void setNoRows(std::size_t rows)
│ │ │ │ +
184 {
│ │ │ │ +
185 rowSize.resize(rows, 0);
│ │ │ │ +
186 }
│ │ │ │ +
│ │ │ │
187
│ │ │ │ -
│ │ │ │ -
197 ParSSOR (const matrix_type& A, int n, field_type w, const communication_type& c)
│ │ │ │ -
198 : _A_(A), _n(n), _w(w), communication(c)
│ │ │ │ -
199 { }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ -
206 virtual void pre (X& x, [[maybe_unused]] Y& b)
│ │ │ │ -
207 {
│ │ │ │ -
208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent
│ │ │ │ -
209 }
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
│ │ │ │ -
216 virtual void apply (X& v, const Y& d)
│ │ │ │ -
217 {
│ │ │ │ -
218 for (int i=0; i<_n; i++) {
│ │ │ │ -
219 bsorf(_A_,v,d,_w);
│ │ │ │ -
220 bsorb(_A_,v,d,_w);
│ │ │ │ -
221 }
│ │ │ │ -
222 communication.copyOwnerToAll(v,v);
│ │ │ │ -
223 }
│ │ │ │ +
│ │ │ │ +
188 void setNoCopyRows(std::size_t rows)
│ │ │ │ +
189 {
│ │ │ │ +
190 copyrowSize.resize(rows, 0);
│ │ │ │ +
191 }
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
│ │ │ │ +
193 void setNoBackwardsCopyRows(std::size_t rows)
│ │ │ │ +
194 {
│ │ │ │ +
195 backwardscopyrowSize.resize(rows, 0);
│ │ │ │ +
196 }
│ │ │ │ +
│ │ │ │ +
197
│ │ │ │ +
198 private:
│ │ │ │ +
199 std::vector<std::size_t> rowSize;
│ │ │ │ +
200 std::vector<std::size_t> copyrowSize;
│ │ │ │ +
201 std::vector<std::size_t> backwardscopyrowSize;
│ │ │ │ +
202 RedistributeInterface interface;
│ │ │ │ +
203 bool setup_;
│ │ │ │ +
204 };
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
214 template<class M, class RI>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
216 {
│ │ │ │ +
217 // Make the default communication policy work.
│ │ │ │ +
218 typedef typename M::size_type value_type;
│ │ │ │ +
219 typedef typename M::size_type size_type;
│ │ │ │ +
220
│ │ │ │ +
│ │ │ │ +
226 CommMatrixRowSize(const M& m_, RI& rowsize_)
│ │ │ │ +
227 : matrix(m_), rowsize(rowsize_)
│ │ │ │ +
228 {}
│ │ │ │
│ │ │ │ -
224
│ │ │ │ -
230 virtual void post ([[maybe_unused]] X& x) {}
│ │ │ │ +
229 const M& matrix;
│ │ │ │ + │ │ │ │
231
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
234 {
│ │ │ │ - │ │ │ │ -
236 }
│ │ │ │ -
│ │ │ │ -
237
│ │ │ │ -
238 private:
│ │ │ │ -
240 const matrix_type& _A_;
│ │ │ │ -
242 int _n;
│ │ │ │ -
244 field_type _w;
│ │ │ │ -
246 const communication_type& communication;
│ │ │ │ -
247 };
│ │ │ │ -
│ │ │ │ -
248
│ │ │ │ -
249 namespace Amg
│ │ │ │ -
250 {
│ │ │ │ -
251 template<class T> struct ConstructionTraits;
│ │ │ │ -
252 }
│ │ │ │ -
253
│ │ │ │ -
277 template<class X, class Y, class C, class P=Preconditioner<X,Y> >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
279 friend struct Amg::ConstructionTraits<BlockPreconditioner<X,Y,C,P> >;
│ │ │ │ -
280 public:
│ │ │ │ -
285 typedef X domain_type;
│ │ │ │ -
290 typedef Y range_type;
│ │ │ │ -
292 typedef typename X::field_type field_type;
│ │ │ │ - │ │ │ │ +
232 };
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
234
│ │ │ │ +
243 template<class M, class I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
245 {
│ │ │ │ +
246 typedef typename M::size_type size_type;
│ │ │ │ +
247
│ │ │ │ +
│ │ │ │ +
254 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
│ │ │ │ +
255 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
│ │ │ │ +
256 {}
│ │ │ │ +
│ │ │ │ +
257
│ │ │ │ +
│ │ │ │ +
265 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
│ │ │ │ +
266 const std::vector<typename M::size_type>& rowsize_)
│ │ │ │ +
267 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), sparsity(aggidxset_.size()), rowsize(&rowsize_)
│ │ │ │ +
268 {}
│ │ │ │ +
│ │ │ │ +
269
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
277 {
│ │ │ │ +
278 // insert diagonal to overlap rows
│ │ │ │ +
279 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator IIter;
│ │ │ │ + │ │ │ │ +
281 std::size_t nnz=0;
│ │ │ │ +
282#ifdef DEBUG_REPART
│ │ │ │ +
283 int rank;
│ │ │ │ +
284
│ │ │ │ +
285 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ +
286#endif
│ │ │ │ +
287 for(IIter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i) {
│ │ │ │ +
288 if(!OwnerSet::contains(i->local().attribute())) {
│ │ │ │ +
289#ifdef DEBUG_REPART
│ │ │ │ +
290 std::cout<<rank<<" Inserting diagonal for"<<i->local()<<std::endl;
│ │ │ │ +
291#endif
│ │ │ │ +
292 sparsity[i->local()].insert(i->local());
│ │ │ │ +
293 }
│ │ │ │ +
294
│ │ │ │ +
295 nnz+=sparsity[i->local()].size();
│ │ │ │ +
296 }
│ │ │ │ +
297 assert( aggidxset.size()==sparsity.size());
│ │ │ │
298
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
│ │ │ │ -
308 { }
│ │ │ │ -
│ │ │ │ -
309
│ │ │ │ -
│ │ │ │ -
317 BlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
│ │ │ │ -
318 : _preconditioner(p), _communication(c)
│ │ │ │ -
319 { }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
│ │ │ │ -
326 virtual void pre (X& x, Y& b)
│ │ │ │ -
327 {
│ │ │ │ -
328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent
│ │ │ │ -
329 _preconditioner->pre(x,b);
│ │ │ │ -
330 }
│ │ │ │ -
│ │ │ │ -
331
│ │ │ │ -
│ │ │ │ -
337 virtual void apply (X& v, const Y& d)
│ │ │ │ -
338 {
│ │ │ │ -
339 _preconditioner->apply(v,d);
│ │ │ │ -
340 _communication.copyOwnerToAll(v,v);
│ │ │ │ -
341 }
│ │ │ │ -
│ │ │ │ -
342
│ │ │ │ -
343 template<bool forward>
│ │ │ │ -
│ │ │ │ -
344 void apply (X& v, const Y& d)
│ │ │ │ -
345 {
│ │ │ │ -
346 _preconditioner->template apply<forward>(v,d);
│ │ │ │ -
347 _communication.copyOwnerToAll(v,v);
│ │ │ │ -
348 }
│ │ │ │ -
│ │ │ │ -
349
│ │ │ │ -
│ │ │ │ -
355 virtual void post (X& x)
│ │ │ │ -
356 {
│ │ │ │ -
357 _preconditioner->post(x);
│ │ │ │ -
358 }
│ │ │ │ -
│ │ │ │ -
359
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
362 {
│ │ │ │ - │ │ │ │ -
364 }
│ │ │ │ -
│ │ │ │ -
365
│ │ │ │ -
366 private:
│ │ │ │ -
368 std::shared_ptr<P> _preconditioner;
│ │ │ │ -
369
│ │ │ │ -
371 const communication_type& _communication;
│ │ │ │ -
372 };
│ │ │ │ -
│ │ │ │ -
373
│ │ │ │ -
376} // end namespace
│ │ │ │ -
377
│ │ │ │ -
378#endif
│ │ │ │ -
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ -
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
Define base class for scalar product and norm.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ -
The incomplete LU factorization kernels.
│ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ - │ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:646
│ │ │ │ -
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:634
│ │ │ │ +
299 if(nnz>0) {
│ │ │ │ +
300 m.setSize(aggidxset.size(), aggidxset.size(), nnz);
│ │ │ │ +
301 m.setBuildMode(M::row_wise);
│ │ │ │ +
302 typename M::CreateIterator citer=m.createbegin();
│ │ │ │ +
303#ifdef DEBUG_REPART
│ │ │ │ +
304 std::size_t idx=0;
│ │ │ │ +
305 bool correct=true;
│ │ │ │ +
306 Dune::GlobalLookupIndexSet<I> global(aggidxset);
│ │ │ │ +
307#endif
│ │ │ │ +
308 typedef typename std::vector<std::set<size_type> >::const_iterator Iter;
│ │ │ │ +
309 for(Iter i=sparsity.begin(), end=sparsity.end(); i!=end; ++i, ++citer)
│ │ │ │ +
310 {
│ │ │ │ +
311 typedef typename std::set<size_type>::const_iterator SIter;
│ │ │ │ +
312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si)
│ │ │ │ +
313 citer.insert(*si);
│ │ │ │ +
314#ifdef DEBUG_REPART
│ │ │ │ +
315 if(i->find(idx)==i->end()) {
│ │ │ │ +
316 const typename I::IndexPair* gi=global.pair(idx);
│ │ │ │ +
317 assert(gi);
│ │ │ │ +
318 std::cout<<rank<<": row "<<idx<<" is missing a diagonal entry! global="<<gi->global()<<" attr="<<gi->local().attribute()<<" "<<
│ │ │ │ +
319 OwnerSet::contains(gi->local().attribute())<<
│ │ │ │ +
320 " row size="<<i->size()<<std::endl;
│ │ │ │ +
321 correct=false;
│ │ │ │ +
322 }
│ │ │ │ +
323 ++idx;
│ │ │ │ +
324#endif
│ │ │ │ +
325 }
│ │ │ │ +
326#ifdef DEBUG_REPART
│ │ │ │ +
327 if(!correct)
│ │ │ │ +
328 throw "bla";
│ │ │ │ +
329#endif
│ │ │ │ +
330 }
│ │ │ │ +
331 }
│ │ │ │ +
│ │ │ │ +
332
│ │ │ │ +
│ │ │ │ +
340 void completeSparsityPattern(std::vector<std::set<size_type> > add_sparsity)
│ │ │ │ +
341 {
│ │ │ │ +
342 for (unsigned int i = 0; i != sparsity.size(); ++i) {
│ │ │ │ +
343 if (add_sparsity[i].size() != 0) {
│ │ │ │ +
344 typedef std::set<size_type> Set;
│ │ │ │ +
345 Set tmp_set;
│ │ │ │ +
346 std::insert_iterator<Set> tmp_insert (tmp_set, tmp_set.begin());
│ │ │ │ +
347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(),
│ │ │ │ +
348 sparsity[i].begin(), sparsity[i].end(), tmp_insert);
│ │ │ │ +
349 sparsity[i].swap(tmp_set);
│ │ │ │ +
350 }
│ │ │ │ +
351 }
│ │ │ │ +
352 }
│ │ │ │ +
│ │ │ │ +
353
│ │ │ │ +
354 const M& matrix;
│ │ │ │ +
355 typedef Dune::GlobalLookupIndexSet<I> LookupIndexSet;
│ │ │ │ +
356 const Dune::GlobalLookupIndexSet<I>& idxset;
│ │ │ │ +
357 const I& aggidxset;
│ │ │ │ +
358 std::vector<std::set<size_type> > sparsity;
│ │ │ │ +
359 const std::vector<size_type>* rowsize;
│ │ │ │ +
360 };
│ │ │ │ +
│ │ │ │ +
361
│ │ │ │ +
362 template<class M, class I>
│ │ │ │ +
│ │ │ │ +
363 struct CommPolicy<CommMatrixSparsityPattern<M,I> >
│ │ │ │ +
364 {
│ │ │ │ + │ │ │ │ +
366
│ │ │ │ +
371 typedef typename I::GlobalIndex IndexedType;
│ │ │ │ +
372
│ │ │ │ +
374 typedef VariableSize IndexedTypeFlag;
│ │ │ │ +
375
│ │ │ │ +
│ │ │ │ +
376 static typename M::size_type getSize(const Type& t, std::size_t i)
│ │ │ │ +
377 {
│ │ │ │ +
378 if(!t.rowsize)
│ │ │ │ +
379 return t.matrix[i].size();
│ │ │ │ +
380 else
│ │ │ │ +
381 {
│ │ │ │ +
382 assert((*t.rowsize)[i]>0);
│ │ │ │ +
383 return (*t.rowsize)[i];
│ │ │ │ +
384 }
│ │ │ │ +
385 }
│ │ │ │ +
│ │ │ │ +
386 };
│ │ │ │ +
│ │ │ │ +
387
│ │ │ │ +
394 template<class M, class I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
396 {
│ │ │ │ +
│ │ │ │ +
405 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
│ │ │ │ +
406 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
│ │ │ │ +
407 {}
│ │ │ │ +
│ │ │ │ +
408
│ │ │ │ +
│ │ │ │ +
412 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
│ │ │ │ +
413 std::vector<size_t>& rowsize_)
│ │ │ │ +
414 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize(&rowsize_)
│ │ │ │ +
415 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
422 {
│ │ │ │ +
423 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator Iter;
│ │ │ │ + │ │ │ │ +
425
│ │ │ │ +
426 for(Iter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i)
│ │ │ │ +
427 if(!OwnerSet::contains(i->local().attribute())) {
│ │ │ │ +
428 // Set to Dirchlet
│ │ │ │ +
429 typedef typename M::ColIterator CIter;
│ │ │ │ +
430 for(CIter c=matrix[i->local()].begin(), cend= matrix[i->local()].end();
│ │ │ │ +
431 c!= cend; ++c)
│ │ │ │ +
432 {
│ │ │ │ +
433 *c=0;
│ │ │ │ +
434 if(c.index()==i->local()) {
│ │ │ │ +
435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) {
│ │ │ │ +
436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix);
│ │ │ │ +
437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt)
│ │ │ │ +
438 (*rowIt)[rowIt.index()] = value;
│ │ │ │ +
439 };
│ │ │ │ +
440 setDiagonal(*c, 1);
│ │ │ │ +
441 }
│ │ │ │ +
442 }
│ │ │ │ +
443 }
│ │ │ │ +
444 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
448 const Dune::GlobalLookupIndexSet<I>& idxset;
│ │ │ │ +
450 const I& aggidxset;
│ │ │ │ +
452 std::vector<size_t>* rowsize; // row sizes differ from sender side in overlap!
│ │ │ │ +
453 };
│ │ │ │ +
│ │ │ │ +
454
│ │ │ │ +
455 template<class M, class I>
│ │ │ │ +
│ │ │ │ +
456 struct CommPolicy<CommMatrixRow<M,I> >
│ │ │ │ +
457 {
│ │ │ │ + │ │ │ │ +
459
│ │ │ │ +
464 typedef std::pair<typename I::GlobalIndex,typename M::block_type> IndexedType;
│ │ │ │ +
465
│ │ │ │ +
467 typedef VariableSize IndexedTypeFlag;
│ │ │ │ +
468
│ │ │ │ +
│ │ │ │ +
469 static std::size_t getSize(const Type& t, std::size_t i)
│ │ │ │ +
470 {
│ │ │ │ +
471 if(!t.rowsize)
│ │ │ │ +
472 return t.matrix[i].size();
│ │ │ │ +
473 else
│ │ │ │ +
474 {
│ │ │ │ +
475 assert((*t.rowsize)[i]>0);
│ │ │ │ +
476 return (*t.rowsize)[i];
│ │ │ │ +
477 }
│ │ │ │ +
478 }
│ │ │ │ +
│ │ │ │ +
479 };
│ │ │ │ +
│ │ │ │ +
480
│ │ │ │ +
481 template<class M, class I, class RI>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
483 {
│ │ │ │ + │ │ │ │ +
485
│ │ │ │ +
│ │ │ │ +
486 static const typename M::size_type gather(const Container& cont, std::size_t i)
│ │ │ │ +
487 {
│ │ │ │ +
488 return cont.matrix[i].size();
│ │ │ │ +
489 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
490 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
│ │ │ │ +
491 {
│ │ │ │ +
492 assert(rowsize);
│ │ │ │ +
493 cont.rowsize.getRowSize(i)=rowsize;
│ │ │ │ +
494 }
│ │ │ │ +
│ │ │ │ +
495
│ │ │ │ +
496 };
│ │ │ │ +
│ │ │ │ +
497
│ │ │ │ +
498 template<class M, class I, class RI>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
500 {
│ │ │ │ + │ │ │ │ +
502
│ │ │ │ +
│ │ │ │ +
503 static const typename M::size_type gather(const Container& cont, std::size_t i)
│ │ │ │ +
504 {
│ │ │ │ +
505 return cont.matrix[i].size();
│ │ │ │ +
506 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
507 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
│ │ │ │ +
508 {
│ │ │ │ +
509 assert(rowsize);
│ │ │ │ +
510 if (rowsize > cont.rowsize.getCopyRowSize(i))
│ │ │ │ +
511 cont.rowsize.getCopyRowSize(i)=rowsize;
│ │ │ │ +
512 }
│ │ │ │ +
│ │ │ │ +
513
│ │ │ │ +
514 };
│ │ │ │ +
│ │ │ │ +
515
│ │ │ │ +
516 template<class M, class I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
518 {
│ │ │ │ +
519 typedef typename I::GlobalIndex GlobalIndex;
│ │ │ │ + │ │ │ │ +
521 typedef typename M::ConstColIterator ColIter;
│ │ │ │ +
522
│ │ │ │ +
523 static ColIter col;
│ │ │ │ + │ │ │ │ +
525
│ │ │ │ +
│ │ │ │ +
526 static const GlobalIndex& gather(const Container& cont, std::size_t i, std::size_t j)
│ │ │ │ +
527 {
│ │ │ │ +
528 if(j==0)
│ │ │ │ +
529 col=cont.matrix[i].begin();
│ │ │ │ +
530 else if (col!=cont.matrix[i].end())
│ │ │ │ +
531 ++col;
│ │ │ │ +
532
│ │ │ │ +
533 //copy communication: different row sizes for copy rows with the same global index
│ │ │ │ +
534 //are possible. If all values of current matrix row are sent, send
│ │ │ │ +
535 //std::numeric_limits<GlobalIndex>::max()
│ │ │ │ +
536 //and receiver will ignore it.
│ │ │ │ +
537 if (col==cont.matrix[i].end()) {
│ │ │ │ +
538 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ +
539 return numlimits;
│ │ │ │ +
540 }
│ │ │ │ +
541 else {
│ │ │ │ +
542 const typename I::IndexPair* index=cont.idxset.pair(col.index());
│ │ │ │ +
543 assert(index);
│ │ │ │ +
544 // Only send index if col is no ghost
│ │ │ │ +
545 if ( index->local().attribute() != 2)
│ │ │ │ +
546 return index->global();
│ │ │ │ +
547 else {
│ │ │ │ +
548 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ +
549 return numlimits;
│ │ │ │ +
550 }
│ │ │ │ +
551 }
│ │ │ │ +
552 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
553 static void scatter(Container& cont, const GlobalIndex& gi, std::size_t i, [[maybe_unused]] std::size_t j)
│ │ │ │ +
554 {
│ │ │ │ +
555 try{
│ │ │ │ +
556 if (gi != std::numeric_limits<GlobalIndex>::max()) {
│ │ │ │ +
557 const typename I::IndexPair& ip=cont.aggidxset.at(gi);
│ │ │ │ +
558 assert(ip.global()==gi);
│ │ │ │ +
559 std::size_t column = ip.local();
│ │ │ │ +
560 cont.sparsity[i].insert(column);
│ │ │ │ +
561
│ │ │ │ + │ │ │ │ +
563 if(!OwnerSet::contains(ip.local().attribute()))
│ │ │ │ +
564 // preserve symmetry for overlap
│ │ │ │ +
565 cont.sparsity[column].insert(i);
│ │ │ │ +
566 }
│ │ │ │ +
567 }
│ │ │ │ +
568 catch(const Dune::RangeError&) {
│ │ │ │ +
569 // Entry not present in the new index set. Ignore!
│ │ │ │ +
570#ifdef DEBUG_REPART
│ │ │ │ +
571 typedef typename Container::LookupIndexSet GlobalLookup;
│ │ │ │ +
572 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ + │ │ │ │ +
574
│ │ │ │ +
575 GlobalLookup lookup(cont.aggidxset);
│ │ │ │ +
576 const IndexPair* pi=lookup.pair(i);
│ │ │ │ +
577 assert(pi);
│ │ │ │ +
578 if(OwnerSet::contains(pi->local().attribute())) {
│ │ │ │ +
579 int rank;
│ │ │ │ +
580 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
│ │ │ │ +
581 std::cout<<rank<<cont.aggidxset<<std::endl;
│ │ │ │ +
582 std::cout<<rank<<": row "<<i<<" (global="<<gi <<") not in index set for owner index "<<pi->global()<<std::endl;
│ │ │ │ +
583 throw;
│ │ │ │ +
584 }
│ │ │ │ +
585#endif
│ │ │ │ +
586 }
│ │ │ │ +
587 }
│ │ │ │ +
│ │ │ │ +
588
│ │ │ │ +
589 };
│ │ │ │ +
│ │ │ │ +
590 template<class M, class I>
│ │ │ │ + │ │ │ │ +
592
│ │ │ │ +
593 template<class M, class I>
│ │ │ │ + │ │ │ │ +
595
│ │ │ │ +
596
│ │ │ │ +
597 template<class M, class I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
599 {
│ │ │ │ +
600 typedef typename I::GlobalIndex GlobalIndex;
│ │ │ │ + │ │ │ │ +
602 typedef typename M::ConstColIterator ColIter;
│ │ │ │ +
603 typedef typename std::pair<GlobalIndex,typename M::block_type> Data;
│ │ │ │ +
604 static ColIter col;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
607
│ │ │ │ +
│ │ │ │ +
608 static const Data& gather(const Container& cont, std::size_t i, std::size_t j)
│ │ │ │ +
609 {
│ │ │ │ +
610 if(j==0)
│ │ │ │ +
611 col=cont.matrix[i].begin();
│ │ │ │ +
612 else if (col!=cont.matrix[i].end())
│ │ │ │ +
613 ++col;
│ │ │ │ +
614 // copy communication: different row sizes for copy rows with the same global index
│ │ │ │ +
615 // are possible. If all values of current matrix row are sent, send
│ │ │ │ +
616 // std::numeric_limits<GlobalIndex>::max()
│ │ │ │ +
617 // and receiver will ignore it.
│ │ │ │ +
618 if (col==cont.matrix[i].end()) {
│ │ │ │ +
619 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ + │ │ │ │ +
621 return datastore;
│ │ │ │ +
622 }
│ │ │ │ +
623 else {
│ │ │ │ +
624 // convert local column index to global index
│ │ │ │ +
625 const typename I::IndexPair* index=cont.idxset.pair(col.index());
│ │ │ │ +
626 assert(index);
│ │ │ │ +
627 // Store the data to prevent reference to temporary
│ │ │ │ +
628 // Only send index if col is no ghost
│ │ │ │ +
629 if ( index->local().attribute() != 2)
│ │ │ │ +
630 datastore = Data(index->global(),*col);
│ │ │ │ +
631 else {
│ │ │ │ +
632 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ + │ │ │ │ +
634 }
│ │ │ │ +
635 return datastore;
│ │ │ │ +
636 }
│ │ │ │ +
637 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
638 static void scatter(Container& cont, const Data& data, std::size_t i, [[maybe_unused]] std::size_t j)
│ │ │ │ +
639 {
│ │ │ │ +
640 try{
│ │ │ │ +
641 if (data.first != std::numeric_limits<GlobalIndex>::max()) {
│ │ │ │ +
642 typename M::size_type column=cont.aggidxset.at(data.first).local();
│ │ │ │ +
643 cont.matrix[i][column]=data.second;
│ │ │ │ +
644 }
│ │ │ │ +
645 }
│ │ │ │ +
646 catch(const Dune::RangeError&) {
│ │ │ │ +
647 // This an overlap row and might therefore lack some entries!
│ │ │ │ +
648 }
│ │ │ │ +
649
│ │ │ │ +
650 }
│ │ │ │ +
│ │ │ │ +
651 };
│ │ │ │ +
│ │ │ │ +
652
│ │ │ │ +
653 template<class M, class I>
│ │ │ │ + │ │ │ │ +
655
│ │ │ │ +
656 template<class M, class I>
│ │ │ │ + │ │ │ │ +
658
│ │ │ │ +
659 template<class M, class I>
│ │ │ │ + │ │ │ │ +
661
│ │ │ │ +
662 template<typename M, typename C>
│ │ │ │ +
│ │ │ │ +
663 void redistributeSparsityPattern(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
│ │ │ │ + │ │ │ │ +
665 {
│ │ │ │ +
666 typename C::CopySet copyflags;
│ │ │ │ +
667 typename C::OwnerSet ownerflags;
│ │ │ │ +
668 typedef typename C::ParallelIndexSet IndexSet;
│ │ │ │ + │ │ │ │ +
670 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
│ │ │ │ +
671 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
│ │ │ │ +
672 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
│ │ │ │ +
673
│ │ │ │ +
674 // get owner rowsizes
│ │ │ │ +
675 CommMatrixRowSize<M,RI> commRowSize(origMatrix, ri);
│ │ │ │ +
676 ri.template redistribute<MatrixRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize,commRowSize);
│ │ │ │ +
677
│ │ │ │ +
678 origComm.buildGlobalLookup();
│ │ │ │ +
679
│ │ │ │ +
680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
│ │ │ │ +
681 rowsize[i] = ri.getRowSize(i);
│ │ │ │ +
682 }
│ │ │ │ +
683 // get sparsity pattern from owner rows
│ │ │ │ + │ │ │ │ +
685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet());
│ │ │ │ + │ │ │ │ +
687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize);
│ │ │ │ +
688
│ │ │ │ +
689 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp,newsp);
│ │ │ │ +
690
│ │ │ │ +
691 // build copy to owner interface to get missing matrix values for novlp case
│ │ │ │ + │ │ │ │ +
693 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
│ │ │ │ +
694 newComm.indexSet(),
│ │ │ │ +
695 origComm.communicator());
│ │ │ │ +
696 ris->template rebuild<true>();
│ │ │ │ +
697
│ │ │ │ +
698 ri.getInterface().free();
│ │ │ │ +
699 ri.getInterface().build(*ris,copyflags,ownerflags);
│ │ │ │ +
700
│ │ │ │ +
701 // get copy rowsizes
│ │ │ │ +
702 CommMatrixRowSize<M,RI> commRowSize_copy(origMatrix, ri);
│ │ │ │ +
703 ri.template redistribute<MatrixCopyRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize_copy,
│ │ │ │ +
704 commRowSize_copy);
│ │ │ │ +
705
│ │ │ │ +
706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
│ │ │ │ +
707 copyrowsize[i] = ri.getCopyRowSize(i);
│ │ │ │ +
708 }
│ │ │ │ +
709 //get copy rowsizes for sender
│ │ │ │ +
710 ri.redistributeBackward(backwardscopyrowsize,copyrowsize);
│ │ │ │ +
711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) {
│ │ │ │ +
712 ri.getBackwardsCopyRowSize(i) = backwardscopyrowsize[i];
│ │ │ │ +
713 }
│ │ │ │ +
714
│ │ │ │ +
715 // get sparsity pattern from copy rows
│ │ │ │ +
716 CommMatrixSparsityPattern<M,IndexSet> origsp_copy(origMatrix,
│ │ │ │ +
717 origComm.globalLookup(),
│ │ │ │ +
718 newComm.indexSet(),
│ │ │ │ +
719 backwardscopyrowsize);
│ │ │ │ +
720 CommMatrixSparsityPattern<M,IndexSet> newsp_copy(origMatrix, origComm.globalLookup(),
│ │ │ │ +
721 newComm.indexSet(), copyrowsize);
│ │ │ │ +
722 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp_copy,
│ │ │ │ +
723 newsp_copy);
│ │ │ │ +
724
│ │ │ │ +
725 newsp.completeSparsityPattern(newsp_copy.sparsity);
│ │ │ │ +
726 newsp.storeSparsityPattern(newMatrix);
│ │ │ │ +
727 }
│ │ │ │ +
728 else
│ │ │ │ +
729 newsp.storeSparsityPattern(newMatrix);
│ │ │ │ +
730
│ │ │ │ +
731#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
732 // Check for symmetry
│ │ │ │ +
733 int ret=0;
│ │ │ │ +
734 typedef typename M::ConstRowIterator RIter;
│ │ │ │ +
735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row) {
│ │ │ │ +
736 typedef typename M::ConstColIterator CIter;
│ │ │ │ +
737 for(CIter col=row->begin(), cend=row->end(); col!=cend; ++col)
│ │ │ │ +
738 {
│ │ │ │ +
739 try{
│ │ │ │ +
740 newMatrix[col.index()][row.index()];
│ │ │ │ +
741 }catch(const Dune::ISTLError&) {
│ │ │ │ +
742 std::cerr<<newComm.communicator().rank()<<": entry ("
│ │ │ │ +
743 <<col.index()<<","<<row.index()<<") missing! for symmetry!"<<std::endl;
│ │ │ │ +
744 ret=1;
│ │ │ │ +
745
│ │ │ │ +
746 }
│ │ │ │ +
747
│ │ │ │ +
748 }
│ │ │ │ +
749 }
│ │ │ │ +
750
│ │ │ │ +
751 if(ret)
│ │ │ │ +
752 DUNE_THROW(ISTLError, "Matrix not symmetric!");
│ │ │ │ +
753#endif
│ │ │ │ +
754 }
│ │ │ │ +
│ │ │ │ +
755
│ │ │ │ +
756 template<typename M, typename C>
│ │ │ │ +
│ │ │ │ +
757 void redistributeMatrixEntries(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
│ │ │ │ + │ │ │ │ +
759 {
│ │ │ │ +
760 typedef typename C::ParallelIndexSet IndexSet;
│ │ │ │ +
761 typename C::OwnerSet ownerflags;
│ │ │ │ +
762 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
│ │ │ │ +
763 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
│ │ │ │ +
764 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
│ │ │ │ +
765
│ │ │ │ +
766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
│ │ │ │ +
767 rowsize[i] = ri.getRowSize(i);
│ │ │ │ + │ │ │ │ +
769 copyrowsize[i] = ri.getCopyRowSize(i);
│ │ │ │ +
770 }
│ │ │ │ +
771 }
│ │ │ │ +
772
│ │ │ │ +
773 for (std::size_t i=0; i < origComm.indexSet().size(); i++)
│ │ │ │ + │ │ │ │ +
775 backwardscopyrowsize[i] = ri.getBackwardsCopyRowSize(i);
│ │ │ │ +
776
│ │ │ │ +
777
│ │ │ │ + │ │ │ │ +
779 // fill sparsity pattern from copy rows
│ │ │ │ +
780 CommMatrixRow<M,IndexSet> origrow_copy(origMatrix, origComm.globalLookup(),
│ │ │ │ +
781 newComm.indexSet(), backwardscopyrowsize);
│ │ │ │ +
782 CommMatrixRow<M,IndexSet> newrow_copy(newMatrix, origComm.globalLookup(),
│ │ │ │ +
783 newComm.indexSet(),copyrowsize);
│ │ │ │ +
784 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow_copy,
│ │ │ │ +
785 newrow_copy);
│ │ │ │ +
786 ri.getInterface().free();
│ │ │ │ +
787 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
│ │ │ │ +
788 newComm.indexSet(),
│ │ │ │ +
789 origComm.communicator());
│ │ │ │ +
790 ris->template rebuild<true>();
│ │ │ │ +
791 ri.getInterface().build(*ris,ownerflags,ownerflags);
│ │ │ │ +
792 }
│ │ │ │ +
793
│ │ │ │ + │ │ │ │ +
795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet());
│ │ │ │ + │ │ │ │ +
797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize);
│ │ │ │ +
798 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow,newrow);
│ │ │ │ +
799 if (SolverCategory::category(origComm) != static_cast<int>(SolverCategory::nonoverlapping))
│ │ │ │ + │ │ │ │ +
801 }
│ │ │ │ +
│ │ │ │ +
802
│ │ │ │ +
819 template<typename M, typename C>
│ │ │ │ +
│ │ │ │ +
820 void redistributeMatrix(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
│ │ │ │ + │ │ │ │ +
822 {
│ │ │ │ +
823 ri.setNoRows(newComm.indexSet().size());
│ │ │ │ +
824 ri.setNoCopyRows(newComm.indexSet().size());
│ │ │ │ +
825 ri.setNoBackwardsCopyRows(origComm.indexSet().size());
│ │ │ │ +
826 redistributeSparsityPattern(origMatrix, newMatrix, origComm, newComm, ri);
│ │ │ │ +
827 redistributeMatrixEntries(origMatrix, newMatrix, origComm, newComm, ri);
│ │ │ │ +
828 }
│ │ │ │ +
│ │ │ │ +
829#endif
│ │ │ │ +
830
│ │ │ │ +
831template<typename M>
│ │ │ │ +
│ │ │ │ +
832 void redistributeMatrixEntries(M& origMatrix, M& newMatrix,
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
836 {
│ │ │ │ +
837 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
│ │ │ │ +
838 }
│ │ │ │ +
│ │ │ │ +
839 template<typename M>
│ │ │ │ +
│ │ │ │ +
840 void redistributeMatrix(M& origMatrix, M& newMatrix,
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
844 {
│ │ │ │ +
845 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
│ │ │ │ +
846 }
│ │ │ │ +
│ │ │ │ +
847}
│ │ │ │ +
848#endif
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ + │ │ │ │ +
Functionality for redistributing a parallel index set using graph partitioning.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ -
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ -
const communication_type & getCommunication() const
Get the object responsible for communication.
Definition schwarz.hh:146
│ │ │ │ -
virtual const matrix_type & getmat() const
get the sequential assembled linear operator.
Definition schwarz.hh:133
│ │ │ │ -
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
apply operator to x, scale and add:
Definition schwarz.hh:125
│ │ │ │ -
virtual void apply(const X &x, Y &y) const
apply operator to x:
Definition schwarz.hh:116
│ │ │ │ -
C communication_type
The type of the communication object.
Definition schwarz.hh:98
│ │ │ │ -
X domain_type
The type of the domain.
Definition schwarz.hh:86
│ │ │ │ -
M matrix_type
The type of the matrix we operate on.
Definition schwarz.hh:81
│ │ │ │ -
Y range_type
The type of the range.
Definition schwarz.hh:91
│ │ │ │ -
X::field_type field_type
The field type of the range.
Definition schwarz.hh:93
│ │ │ │ -
OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
constructor: just store a reference to a matrix.
Definition schwarz.hh:107
│ │ │ │ -
OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const communication_type &com)
Definition schwarz.hh:111
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the linear operator (see SolverCategory::Category)
Definition schwarz.hh:139
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
A parallel SSOR preconditioner.
Definition schwarz.hh:175
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition schwarz.hh:184
│ │ │ │ -
C communication_type
The type of the communication object.
Definition schwarz.hh:186
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition schwarz.hh:233
│ │ │ │ -
ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c)
Constructor.
Definition schwarz.hh:197
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition schwarz.hh:230
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition schwarz.hh:180
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition schwarz.hh:182
│ │ │ │ -
M matrix_type
The matrix type the preconditioner is for.
Definition schwarz.hh:178
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the precondtioner.
Definition schwarz.hh:216
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition schwarz.hh:206
│ │ │ │ -
Block parallel preconditioner.
Definition schwarz.hh:278
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition schwarz.hh:326
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition schwarz.hh:285
│ │ │ │ -
BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
Constructor.
Definition schwarz.hh:317
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition schwarz.hh:337
│ │ │ │ -
BlockPreconditioner(P &p, const communication_type &c)
Constructor.
Definition schwarz.hh:306
│ │ │ │ -
void apply(X &v, const Y &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition schwarz.hh:344
│ │ │ │ -
C communication_type
The type of the communication object..
Definition schwarz.hh:297
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition schwarz.hh:292
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition schwarz.hh:355
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition schwarz.hh:290
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition schwarz.hh:361
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29
│ │ │ │ +
void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition matrixredistribute.hh:757
│ │ │ │ +
void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition matrixredistribute.hh:663
│ │ │ │ +
void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Redistribute a matrix according to given domain decompositions.
Definition matrixredistribute.hh:820
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
Definition matrixredistribute.hh:22
│ │ │ │ +
void setNoBackwardsCopyRows(std::size_t size)
Definition matrixredistribute.hh:44
│ │ │ │ +
void redistribute(const D &from, D &to) const
Definition matrixredistribute.hh:28
│ │ │ │ +
void resetSetup()
Definition matrixredistribute.hh:35
│ │ │ │ +
void setNoCopyRows(std::size_t size)
Definition matrixredistribute.hh:41
│ │ │ │ +
bool isSetup() const
Definition matrixredistribute.hh:23
│ │ │ │ +
void setNoRows(std::size_t size)
Definition matrixredistribute.hh:38
│ │ │ │ +
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:32
│ │ │ │ +
std::size_t getBackwardsCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:57
│ │ │ │ +
std::size_t getRowSize(std::size_t index) const
Definition matrixredistribute.hh:47
│ │ │ │ +
std::size_t getCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:52
│ │ │ │ +
std::size_t getRowSize(std::size_t index) const
Definition matrixredistribute.hh:158
│ │ │ │ +
std::size_t & getBackwardsCopyRowSize(std::size_t index)
Definition matrixredistribute.hh:173
│ │ │ │ +
RedistributeInterface & getInterface()
Definition matrixredistribute.hh:75
│ │ │ │ +
void redistribute(const D &from, D &to) const
Definition matrixredistribute.hh:136
│ │ │ │ +
void setNoBackwardsCopyRows(std::size_t rows)
Definition matrixredistribute.hh:193
│ │ │ │ +
std::size_t & getCopyRowSize(std::size_t index)
Definition matrixredistribute.hh:163
│ │ │ │ + │ │ │ │ +
std::size_t getCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:168
│ │ │ │ +
void setNoRows(std::size_t rows)
Definition matrixredistribute.hh:183
│ │ │ │ +
void reserve(std::size_t size)
Definition matrixredistribute.hh:150
│ │ │ │ +
OwnerOverlapCopyCommunication< T, T1 > Comm
Definition matrixredistribute.hh:69
│ │ │ │ +
void setNoCopyRows(std::size_t rows)
Definition matrixredistribute.hh:188
│ │ │ │ +
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:141
│ │ │ │ + │ │ │ │ +
std::size_t getBackwardsCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:178
│ │ │ │ +
void redistribute(const D &from, D &to) const
Definition matrixredistribute.hh:118
│ │ │ │ + │ │ │ │ +
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:126
│ │ │ │ +
void checkInterface(const IS &source, const IS &target, MPI_Comm comm)
Definition matrixredistribute.hh:80
│ │ │ │ +
bool isSetup() const
Definition matrixredistribute.hh:145
│ │ │ │ +
std::size_t & getRowSize(std::size_t index)
Definition matrixredistribute.hh:153
│ │ │ │ +
Utility class to communicate and set the row sizes of a redistributed matrix.
Definition matrixredistribute.hh:216
│ │ │ │ +
M::size_type size_type
Definition matrixredistribute.hh:219
│ │ │ │ +
M::size_type value_type
Definition matrixredistribute.hh:218
│ │ │ │ +
RI & rowsize
Definition matrixredistribute.hh:230
│ │ │ │ +
const M & matrix
Definition matrixredistribute.hh:229
│ │ │ │ +
CommMatrixRowSize(const M &m_, RI &rowsize_)
Constructor.
Definition matrixredistribute.hh:226
│ │ │ │ +
Utility class to communicate and build the sparsity pattern of a redistributed matrix.
Definition matrixredistribute.hh:245
│ │ │ │ +
M::size_type size_type
Definition matrixredistribute.hh:246
│ │ │ │ +
const Dune::GlobalLookupIndexSet< I > & idxset
Definition matrixredistribute.hh:356
│ │ │ │ +
void storeSparsityPattern(M &m)
Creates and stores the sparsity pattern of the redistributed matrix.
Definition matrixredistribute.hh:276
│ │ │ │ +
const I & aggidxset
Definition matrixredistribute.hh:357
│ │ │ │ +
const std::vector< size_type > * rowsize
Definition matrixredistribute.hh:359
│ │ │ │ +
void completeSparsityPattern(std::vector< std::set< size_type > > add_sparsity)
Completes the sparsity pattern of the redistributed matrix with data from copy rows for the novlp cas...
Definition matrixredistribute.hh:340
│ │ │ │ +
CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
Constructor for the original side.
Definition matrixredistribute.hh:254
│ │ │ │ +
const M & matrix
Definition matrixredistribute.hh:354
│ │ │ │ +
CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, const std::vector< typename M::size_type > &rowsize_)
Constructor for the redistruted side.
Definition matrixredistribute.hh:265
│ │ │ │ +
std::vector< std::set< size_type > > sparsity
Definition matrixredistribute.hh:358
│ │ │ │ +
Dune::GlobalLookupIndexSet< I > LookupIndexSet
Definition matrixredistribute.hh:355
│ │ │ │ +
static M::size_type getSize(const Type &t, std::size_t i)
Definition matrixredistribute.hh:376
│ │ │ │ +
CommMatrixSparsityPattern< M, I > Type
Definition matrixredistribute.hh:365
│ │ │ │ +
I::GlobalIndex IndexedType
The indexed type we send. This is the global index indentitfying the column.
Definition matrixredistribute.hh:371
│ │ │ │ +
VariableSize IndexedTypeFlag
Each row varies in size.
Definition matrixredistribute.hh:374
│ │ │ │ +
Utility class for comunicating the matrix entries.
Definition matrixredistribute.hh:396
│ │ │ │ +
std::vector< size_t > * rowsize
row size information for the receiving side.
Definition matrixredistribute.hh:452
│ │ │ │ +
M & matrix
The matrix to communicate the values of.
Definition matrixredistribute.hh:446
│ │ │ │ +
CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, std::vector< size_t > &rowsize_)
Constructor.
Definition matrixredistribute.hh:412
│ │ │ │ +
const Dune::GlobalLookupIndexSet< I > & idxset
Index set for the original matrix.
Definition matrixredistribute.hh:448
│ │ │ │ +
void setOverlapRowsToDirichlet()
Sets the non-owner rows correctly as Dirichlet boundaries.
Definition matrixredistribute.hh:421
│ │ │ │ +
const I & aggidxset
Index set for the redistributed matrix.
Definition matrixredistribute.hh:450
│ │ │ │ +
CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
Constructor.
Definition matrixredistribute.hh:405
│ │ │ │ +
std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType
The indexed type we send. This is the pair of global index indentitfying the column and the value its...
Definition matrixredistribute.hh:464
│ │ │ │ +
CommMatrixRow< M, I > Type
Definition matrixredistribute.hh:458
│ │ │ │ +
static std::size_t getSize(const Type &t, std::size_t i)
Definition matrixredistribute.hh:469
│ │ │ │ +
VariableSize IndexedTypeFlag
Each row varies in size.
Definition matrixredistribute.hh:467
│ │ │ │ +
Definition matrixredistribute.hh:483
│ │ │ │ +
static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
Definition matrixredistribute.hh:490
│ │ │ │ +
static const M::size_type gather(const Container &cont, std::size_t i)
Definition matrixredistribute.hh:486
│ │ │ │ +
CommMatrixRowSize< M, RI > Container
Definition matrixredistribute.hh:484
│ │ │ │ +
Definition matrixredistribute.hh:500
│ │ │ │ +
static const M::size_type gather(const Container &cont, std::size_t i)
Definition matrixredistribute.hh:503
│ │ │ │ +
static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
Definition matrixredistribute.hh:507
│ │ │ │ +
CommMatrixRowSize< M, RI > Container
Definition matrixredistribute.hh:501
│ │ │ │ +
Definition matrixredistribute.hh:518
│ │ │ │ +
M::ConstColIterator ColIter
Definition matrixredistribute.hh:521
│ │ │ │ +
static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:553
│ │ │ │ +
CommMatrixSparsityPattern< M, I > Container
Definition matrixredistribute.hh:520
│ │ │ │ +
static GlobalIndex numlimits
Definition matrixredistribute.hh:524
│ │ │ │ +
static ColIter col
Definition matrixredistribute.hh:523
│ │ │ │ +
I::GlobalIndex GlobalIndex
Definition matrixredistribute.hh:519
│ │ │ │ +
static const GlobalIndex & gather(const Container &cont, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:526
│ │ │ │ +
Definition matrixredistribute.hh:599
│ │ │ │ +
I::GlobalIndex GlobalIndex
Definition matrixredistribute.hh:600
│ │ │ │ +
static Data datastore
Definition matrixredistribute.hh:605
│ │ │ │ +
static GlobalIndex numlimits
Definition matrixredistribute.hh:606
│ │ │ │ +
M::ConstColIterator ColIter
Definition matrixredistribute.hh:602
│ │ │ │ +
static const Data & gather(const Container &cont, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:608
│ │ │ │ +
std::pair< GlobalIndex, typename M::block_type > Data
Definition matrixredistribute.hh:603
│ │ │ │ +
static void scatter(Container &cont, const Data &data, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:638
│ │ │ │ +
static ColIter col
Definition matrixredistribute.hh:604
│ │ │ │ +
CommMatrixRow< M, I > Container
Definition matrixredistribute.hh:601
│ │ │ │ +
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ +
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
Definition owneroverlapcopy.hh:194
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
Definition repartition.hh:260
│ │ │ │ +
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,395 +1,1173 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -schwarz.hh │ │ │ │ │ +matrixredistribute.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SCHWARZ_HH │ │ │ │ │ -6#define DUNE_ISTL_SCHWARZ_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include // for input/output to shell │ │ │ │ │ -9#include // for input/output to files │ │ │ │ │ -10#include // STL vector class │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include // Yes, we do some math here │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include "_i_o_._h_h" │ │ │ │ │ -18#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -19#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -20#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -21#include "_i_o_._h_h" │ │ │ │ │ -22#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -23#include "_i_l_u_._h_h" │ │ │ │ │ -24#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ -25#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ -26#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ -27#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ -28#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ -29 │ │ │ │ │ -30namespace _D_u_n_e { │ │ │ │ │ -31 │ │ │ │ │ -73 template │ │ │ │ │ -_7_4 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r : public _A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -75 { │ │ │ │ │ -76 public: │ │ │ │ │ -_8_1 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_8_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_9_1 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_9_3 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_9_8 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ -99 │ │ │ │ │ -_1_0_7 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (const _m_a_t_r_i_x___t_y_p_e& A, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& │ │ │ │ │ -com) │ │ │ │ │ -108 : _A_(stackobject_to_shared_ptr(A)), communication(com) │ │ │ │ │ -109 {} │ │ │ │ │ -110 │ │ │ │ │ -_1_1_1 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (const std::shared_ptr A, const │ │ │ │ │ -_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com) │ │ │ │ │ -112 : _A_(A), communication(com) │ │ │ │ │ -113 {} │ │ │ │ │ -114 │ │ │ │ │ -_1_1_6 virtual void _a_p_p_l_y (const X& x, Y& y) const │ │ │ │ │ -117 { │ │ │ │ │ -118 y = 0; │ │ │ │ │ -119 _A_->umv(x,y); // result is consistent on interior+border │ │ │ │ │ -120 communication.project(y); // we want this here to avoid it before the │ │ │ │ │ -preconditioner │ │ │ │ │ -121 // since there d is const! │ │ │ │ │ -122 } │ │ │ │ │ -123 │ │ │ │ │ -_1_2_5 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (_f_i_e_l_d___t_y_p_e alpha, const X& x, Y& y) const │ │ │ │ │ -126 { │ │ │ │ │ -127 _A_->usmv(alpha,x,y); // result is consistent on interior+border │ │ │ │ │ -128 communication.project(y); // we want this here to avoid it before the │ │ │ │ │ -preconditioner │ │ │ │ │ -129 // since there d is const! │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -_1_3_3 virtual const _m_a_t_r_i_x___t_y_p_e& _g_e_t_m_a_t () const │ │ │ │ │ -134 { │ │ │ │ │ -135 return *_A_; │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -_1_3_9 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -140 { │ │ │ │ │ -141 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ -142 } │ │ │ │ │ -143 │ │ │ │ │ -144 │ │ │ │ │ -_1_4_6 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n() const │ │ │ │ │ -147 { │ │ │ │ │ -148 return communication; │ │ │ │ │ -149 } │ │ │ │ │ -150 private: │ │ │ │ │ -151 const std::shared_ptr_A_; │ │ │ │ │ -152 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& communication; │ │ │ │ │ -153 }; │ │ │ │ │ -154 │ │ │ │ │ -157 /* │ │ │ │ │ -158 * @addtogroup ISTL_Prec │ │ │ │ │ -159 * @{ │ │ │ │ │ -160 */ │ │ │ │ │ -174 template │ │ │ │ │ -_1_7_5 class _P_a_r_S_S_O_R : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -176 public: │ │ │ │ │ -_1_7_8 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_1_8_0 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_1_8_2 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_1_8_4 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_8_6 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ +5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH │ │ │ │ │ +6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH │ │ │ │ │ +7#include │ │ │ │ │ +8#include "_r_e_p_a_r_t_i_t_i_o_n_._h_h" │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ +18namespace _D_u_n_e │ │ │ │ │ +19{ │ │ │ │ │ +20 template │ │ │ │ │ +_2_1 struct _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +22 { │ │ │ │ │ +_2_3 bool _i_s_S_e_t_u_p() const │ │ │ │ │ +24 { │ │ │ │ │ +25 return false; │ │ │ │ │ +26 } │ │ │ │ │ +27 template │ │ │ │ │ +_2_8 void _r_e_d_i_s_t_r_i_b_u_t_e([[maybe_unused]] const D& from, [[maybe_unused]] D& to) │ │ │ │ │ +const │ │ │ │ │ +29 {} │ │ │ │ │ +30 │ │ │ │ │ +31 template │ │ │ │ │ +_3_2 void _r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d([[maybe_unused]] D& from, [[maybe_unused]]const D& │ │ │ │ │ +to) const │ │ │ │ │ +33 {} │ │ │ │ │ +34 │ │ │ │ │ +_3_5 void _r_e_s_e_t_S_e_t_u_p() │ │ │ │ │ +36 {} │ │ │ │ │ +37 │ │ │ │ │ +_3_8 void _s_e_t_N_o_R_o_w_s([[maybe_unused]] std::size_t size) │ │ │ │ │ +39 {} │ │ │ │ │ +40 │ │ │ │ │ +_4_1 void _s_e_t_N_o_C_o_p_y_R_o_w_s([[maybe_unused]] std::size_t size) │ │ │ │ │ +42 {} │ │ │ │ │ +43 │ │ │ │ │ +_4_4 void _s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s([[maybe_unused]] std::size_t size) │ │ │ │ │ +45 {} │ │ │ │ │ +46 │ │ │ │ │ +_4_7 std::size_t _g_e_t_R_o_w_S_i_z_e([[maybe_unused]] std::size_t index) const │ │ │ │ │ +48 { │ │ │ │ │ +49 return -1; │ │ │ │ │ +50 } │ │ │ │ │ +51 │ │ │ │ │ +_5_2 std::size_t _g_e_t_C_o_p_y_R_o_w_S_i_z_e([[maybe_unused]] std::size_t index) const │ │ │ │ │ +53 { │ │ │ │ │ +54 return -1; │ │ │ │ │ +55 } │ │ │ │ │ +56 │ │ │ │ │ +_5_7 std::size_t _g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e([[maybe_unused]] std::size_t index) │ │ │ │ │ +const │ │ │ │ │ +58 { │ │ │ │ │ +59 return -1; │ │ │ │ │ +60 } │ │ │ │ │ +61 │ │ │ │ │ +62 }; │ │ │ │ │ +63 │ │ │ │ │ +64#if HAVE_MPI │ │ │ │ │ +65 template │ │ │ │ │ +_6_6 class _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n > │ │ │ │ │ +67 { │ │ │ │ │ +68 public: │ │ │ │ │ +_6_9 typedef _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_,_T_1_> _C_o_m_m; │ │ │ │ │ +70 │ │ │ │ │ +_7_1 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n() │ │ │ │ │ +72 : interface(), setup_(false) │ │ │ │ │ +73 {} │ │ │ │ │ +74 │ │ │ │ │ +_7_5 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& _g_e_t_I_n_t_e_r_f_a_c_e() │ │ │ │ │ +76 { │ │ │ │ │ +77 return interface; │ │ │ │ │ +78 } │ │ │ │ │ +79 template │ │ │ │ │ +_8_0 void _c_h_e_c_k_I_n_t_e_r_f_a_c_e(const IS& source, │ │ │ │ │ +81 const IS& target, MPI_Comm comm) │ │ │ │ │ +82 { │ │ │ │ │ +83 auto ri = std::make_unique >(source, target, comm); │ │ │ │ │ +84 ri->template rebuild(); │ │ │ │ │ +85 Interface inf; │ │ │ │ │ +86 typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t flags; │ │ │ │ │ +87 int rank; │ │ │ │ │ +88 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ +89 inf.free(); │ │ │ │ │ +90 inf.build(*ri, flags, flags); │ │ │ │ │ +91 │ │ │ │ │ +92 │ │ │ │ │ +93#ifdef DEBUG_REPART │ │ │ │ │ +94 if(inf!=interface) { │ │ │ │ │ +95 │ │ │ │ │ +96 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ +97 if(rank==0) │ │ │ │ │ +98 std::cout<<"Interfaces do not match!"< │ │ │ │ │ +_1_1_8 void _r_e_d_i_s_t_r_i_b_u_t_e(const D& from, D& to) const │ │ │ │ │ +119 { │ │ │ │ │ +120 BufferedCommunicator communicator; │ │ │ │ │ +121 communicator.template build(from,to, interface); │ │ │ │ │ +122 communicator.template forward(from, to); │ │ │ │ │ +123 communicator.free(); │ │ │ │ │ +124 } │ │ │ │ │ +125 template │ │ │ │ │ +_1_2_6 void _r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(D& from, const D& to) const │ │ │ │ │ +127 { │ │ │ │ │ +128 │ │ │ │ │ +129 BufferedCommunicator communicator; │ │ │ │ │ +130 communicator.template build(from,to, interface); │ │ │ │ │ +131 communicator.template backward(from, to); │ │ │ │ │ +132 communicator.free(); │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +135 template │ │ │ │ │ +_1_3_6 void _r_e_d_i_s_t_r_i_b_u_t_e(const D& from, D& to) const │ │ │ │ │ +137 { │ │ │ │ │ +138 redistribute >(from,to); │ │ │ │ │ +139 } │ │ │ │ │ +140 template │ │ │ │ │ +_1_4_1 void _r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(D& from, const D& to) const │ │ │ │ │ +142 { │ │ │ │ │ +143 redistributeBackward >(from,to); │ │ │ │ │ +144 } │ │ │ │ │ +_1_4_5 bool _i_s_S_e_t_u_p() const │ │ │ │ │ +146 { │ │ │ │ │ +147 return setup_; │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +_1_5_0 void _r_e_s_e_r_v_e(std::size_t size) │ │ │ │ │ +151 {} │ │ │ │ │ +152 │ │ │ │ │ +_1_5_3 std::size_t& _g_e_t_R_o_w_S_i_z_e(std::size_t index) │ │ │ │ │ +154 { │ │ │ │ │ +155 return rowSize[index]; │ │ │ │ │ +156 } │ │ │ │ │ +157 │ │ │ │ │ +_1_5_8 std::size_t _g_e_t_R_o_w_S_i_z_e(std::size_t index) const │ │ │ │ │ +159 { │ │ │ │ │ +160 return rowSize[index]; │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +_1_6_3 std::size_t& _g_e_t_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) │ │ │ │ │ +164 { │ │ │ │ │ +165 return copyrowSize[index]; │ │ │ │ │ +166 } │ │ │ │ │ +167 │ │ │ │ │ +_1_6_8 std::size_t _g_e_t_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) const │ │ │ │ │ +169 { │ │ │ │ │ +170 return copyrowSize[index]; │ │ │ │ │ +171 } │ │ │ │ │ +172 │ │ │ │ │ +_1_7_3 std::size_t& _g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) │ │ │ │ │ +174 { │ │ │ │ │ +175 return backwardscopyrowSize[index]; │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +_1_7_8 std::size_t _g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) const │ │ │ │ │ +179 { │ │ │ │ │ +180 return backwardscopyrowSize[index]; │ │ │ │ │ +181 } │ │ │ │ │ +182 │ │ │ │ │ +_1_8_3 void _s_e_t_N_o_R_o_w_s(std::size_t rows) │ │ │ │ │ +184 { │ │ │ │ │ +185 rowSize.resize(rows, 0); │ │ │ │ │ +186 } │ │ │ │ │ 187 │ │ │ │ │ -_1_9_7 _P_a_r_S_S_O_R (const _m_a_t_r_i_x___t_y_p_e& A, int n, _f_i_e_l_d___t_y_p_e w, const │ │ │ │ │ -_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ -198 : _A_(A), _n(n), _w(w), communication(c) │ │ │ │ │ -199 { } │ │ │ │ │ -200 │ │ │ │ │ -_2_0_6 virtual void _p_r_e (X& x, [[maybe_unused]] Y& b) │ │ │ │ │ -207 { │ │ │ │ │ -208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent │ │ │ │ │ -209 } │ │ │ │ │ -210 │ │ │ │ │ -_2_1_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -217 { │ │ │ │ │ -218 for (int i=0; i<_n; i++) { │ │ │ │ │ -219 _b_s_o_r_f(_A_,v,d,_w); │ │ │ │ │ -220 _b_s_o_r_b(_A_,v,d,_w); │ │ │ │ │ -221 } │ │ │ │ │ -222 communication.copyOwnerToAll(v,v); │ │ │ │ │ -223 } │ │ │ │ │ -224 │ │ │ │ │ -_2_3_0 virtual void _p_o_s_t ([[maybe_unused]] X& x) {} │ │ │ │ │ +_1_8_8 void _s_e_t_N_o_C_o_p_y_R_o_w_s(std::size_t rows) │ │ │ │ │ +189 { │ │ │ │ │ +190 copyrowSize.resize(rows, 0); │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +_1_9_3 void _s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s(std::size_t rows) │ │ │ │ │ +194 { │ │ │ │ │ +195 backwardscopyrowSize.resize(rows, 0); │ │ │ │ │ +196 } │ │ │ │ │ +197 │ │ │ │ │ +198 private: │ │ │ │ │ +199 std::vector rowSize; │ │ │ │ │ +200 std::vector copyrowSize; │ │ │ │ │ +201 std::vector backwardscopyrowSize; │ │ │ │ │ +202 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e interface; │ │ │ │ │ +203 bool setup_; │ │ │ │ │ +204 }; │ │ │ │ │ +205 │ │ │ │ │ +214 template │ │ │ │ │ +_2_1_5 struct _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e │ │ │ │ │ +216 { │ │ │ │ │ +217 // Make the default communication policy work. │ │ │ │ │ +_2_1_8 typedef typename M::size_type _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +_2_1_9 typedef typename M::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +220 │ │ │ │ │ +_2_2_6 _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e(const M& m_, RI& rowsize_) │ │ │ │ │ +227 : _m_a_t_r_i_x(m_), _r_o_w_s_i_z_e(rowsize_) │ │ │ │ │ +228 {} │ │ │ │ │ +_2_2_9 const M& _m_a_t_r_i_x; │ │ │ │ │ +_2_3_0 RI& _r_o_w_s_i_z_e; │ │ │ │ │ 231 │ │ │ │ │ -_2_3_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -234 { │ │ │ │ │ -235 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ -236 } │ │ │ │ │ -237 │ │ │ │ │ -238 private: │ │ │ │ │ -240 const _m_a_t_r_i_x___t_y_p_e& _A_; │ │ │ │ │ -242 int _n; │ │ │ │ │ -244 _f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ -_2_4_6 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& communication; │ │ │ │ │ -247 }; │ │ │ │ │ -248 │ │ │ │ │ -249 namespace Amg │ │ │ │ │ -250 { │ │ │ │ │ -251 template struct ConstructionTraits; │ │ │ │ │ -252 } │ │ │ │ │ -253 │ │ │ │ │ -277 template > │ │ │ │ │ -_2_7_8 class _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -279 friend struct Amg::ConstructionTraits<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r >; │ │ │ │ │ -280 public: │ │ │ │ │ -_2_8_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_2_9_0 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_2_9_2 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_9_7 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ +232 }; │ │ │ │ │ +233 │ │ │ │ │ +234 │ │ │ │ │ +243 template │ │ │ │ │ +_2_4_4 struct _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +245 { │ │ │ │ │ +_2_4_6 typedef typename M::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +247 │ │ │ │ │ +_2_5_4 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(const M& m_, const Dune::GlobalLookupIndexSet& │ │ │ │ │ +idxset_, const I& aggidxset_) │ │ │ │ │ +255 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _r_o_w_s_i_z_e() │ │ │ │ │ +256 {} │ │ │ │ │ +257 │ │ │ │ │ +_2_6_5 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(const M& m_, const Dune::GlobalLookupIndexSet& │ │ │ │ │ +idxset_, const I& aggidxset_, │ │ │ │ │ +266 const std::vector& rowsize_) │ │ │ │ │ +267 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _s_p_a_r_s_i_t_y │ │ │ │ │ +(aggidxset_.size()), _r_o_w_s_i_z_e(&rowsize_) │ │ │ │ │ +268 {} │ │ │ │ │ +269 │ │ │ │ │ +_2_7_6 void _s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(M& m) │ │ │ │ │ +277 { │ │ │ │ │ +278 // insert diagonal to overlap rows │ │ │ │ │ +279 typedef typename Dune::GlobalLookupIndexSet::const_iterator IIter; │ │ │ │ │ +280 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +OwnerSet; │ │ │ │ │ +281 std::size_t nnz=0; │ │ │ │ │ +282#ifdef DEBUG_REPART │ │ │ │ │ +283 int rank; │ │ │ │ │ +284 │ │ │ │ │ +285 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ +286#endif │ │ │ │ │ +287 for(IIter i= _a_g_g_i_d_x_s_e_t.begin(), end=_a_g_g_i_d_x_s_e_t.end(); i!=end; ++i) { │ │ │ │ │ +288 if(!OwnerSet::contains(i->local().attribute())) { │ │ │ │ │ +289#ifdef DEBUG_REPART │ │ │ │ │ +290 std::cout<local()<local()].insert(i->local()); │ │ │ │ │ +293 } │ │ │ │ │ +294 │ │ │ │ │ +295 nnz+=_s_p_a_r_s_i_t_y[i->local()].size(); │ │ │ │ │ +296 } │ │ │ │ │ +297 assert( _a_g_g_i_d_x_s_e_t.size()==_s_p_a_r_s_i_t_y.size()); │ │ │ │ │ 298 │ │ │ │ │ -_3_0_6 _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (P& p, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ -307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c) │ │ │ │ │ -308 { } │ │ │ │ │ -309 │ │ │ │ │ -_3_1_7 _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (const std::shared_ptr

& p, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& │ │ │ │ │ -c) │ │ │ │ │ -318 : _preconditioner(p), _communication(c) │ │ │ │ │ -319 { } │ │ │ │ │ -320 │ │ │ │ │ -_3_2_6 virtual void _p_r_e (X& x, Y& b) │ │ │ │ │ -327 { │ │ │ │ │ -328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent │ │ │ │ │ -329 _preconditioner->pre(x,b); │ │ │ │ │ +299 if(nnz>0) { │ │ │ │ │ +300 m.setSize(_a_g_g_i_d_x_s_e_t.size(), _a_g_g_i_d_x_s_e_t.size(), nnz); │ │ │ │ │ +301 m.setBuildMode(M::row_wise); │ │ │ │ │ +302 typename M::CreateIterator citer=m.createbegin(); │ │ │ │ │ +303#ifdef DEBUG_REPART │ │ │ │ │ +304 std::size_t idx=0; │ │ │ │ │ +305 bool correct=true; │ │ │ │ │ +306 Dune::GlobalLookupIndexSet global(_a_g_g_i_d_x_s_e_t); │ │ │ │ │ +307#endif │ │ │ │ │ +308 typedef typename std::vector >::const_iterator Iter; │ │ │ │ │ +309 for(Iter i=_s_p_a_r_s_i_t_y.begin(), end=_s_p_a_r_s_i_t_y.end(); i!=end; ++i, ++citer) │ │ │ │ │ +310 { │ │ │ │ │ +311 typedef typename std::set::const_iterator SIter; │ │ │ │ │ +312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si) │ │ │ │ │ +313 citer.insert(*si); │ │ │ │ │ +314#ifdef DEBUG_REPART │ │ │ │ │ +315 if(i->find(idx)==i->end()) { │ │ │ │ │ +316 const typename I::IndexPair* gi=global.pair(idx); │ │ │ │ │ +317 assert(gi); │ │ │ │ │ +318 std::cout<local().attribute())<< │ │ │ │ │ +320 " row size="<size()<apply(v,d); │ │ │ │ │ -340 _communication.copyOwnerToAll(v,v); │ │ │ │ │ -341 } │ │ │ │ │ -342 │ │ │ │ │ -343 template │ │ │ │ │ -_3_4_4 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -345 { │ │ │ │ │ -346 _preconditioner->template apply(v,d); │ │ │ │ │ -347 _communication.copyOwnerToAll(v,v); │ │ │ │ │ -348 } │ │ │ │ │ -349 │ │ │ │ │ -_3_5_5 virtual void _p_o_s_t (X& x) │ │ │ │ │ -356 { │ │ │ │ │ -357 _preconditioner->post(x); │ │ │ │ │ -358 } │ │ │ │ │ -359 │ │ │ │ │ -_3_6_1 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -362 { │ │ │ │ │ -363 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ -364 } │ │ │ │ │ -365 │ │ │ │ │ -366 private: │ │ │ │ │ -368 std::shared_ptr

_preconditioner; │ │ │ │ │ -369 │ │ │ │ │ -371 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _communication; │ │ │ │ │ -372 }; │ │ │ │ │ -373 │ │ │ │ │ -376} // end namespace │ │ │ │ │ -377 │ │ │ │ │ -378#endif │ │ │ │ │ -_g_s_e_t_c_._h_h │ │ │ │ │ -Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ -generic way. │ │ │ │ │ -_i_o_._h_h │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_i_l_u_._h_h │ │ │ │ │ -The incomplete LU factorization kernels. │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ -_v_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -??? │ │ │ │ │ +331 } │ │ │ │ │ +332 │ │ │ │ │ +_3_4_0 void _c_o_m_p_l_e_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(std::vector > │ │ │ │ │ +add_sparsity) │ │ │ │ │ +341 { │ │ │ │ │ +342 for (unsigned int i = 0; i != _s_p_a_r_s_i_t_y.size(); ++i) { │ │ │ │ │ +343 if (add_sparsity[i].size() != 0) { │ │ │ │ │ +344 typedef std::set Set; │ │ │ │ │ +345 Set tmp_set; │ │ │ │ │ +346 std::insert_iterator tmp_insert (tmp_set, tmp_set.begin()); │ │ │ │ │ +347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(), │ │ │ │ │ +348 _s_p_a_r_s_i_t_y[i].begin(), _s_p_a_r_s_i_t_y[i].end(), tmp_insert); │ │ │ │ │ +349 _s_p_a_r_s_i_t_y[i].swap(tmp_set); │ │ │ │ │ +350 } │ │ │ │ │ +351 } │ │ │ │ │ +352 } │ │ │ │ │ +353 │ │ │ │ │ +_3_5_4 const M& _m_a_t_r_i_x; │ │ │ │ │ +_3_5_5 typedef Dune::GlobalLookupIndexSet _L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ +_3_5_6 const Dune::GlobalLookupIndexSet& _i_d_x_s_e_t; │ │ │ │ │ +_3_5_7 const I& _a_g_g_i_d_x_s_e_t; │ │ │ │ │ +_3_5_8 std::vector > _s_p_a_r_s_i_t_y; │ │ │ │ │ +_3_5_9 const std::vector* _r_o_w_s_i_z_e; │ │ │ │ │ +360 }; │ │ │ │ │ +361 │ │ │ │ │ +362 template │ │ │ │ │ +_3_6_3 struct CommPolicy<_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n > │ │ │ │ │ +364 { │ │ │ │ │ +_3_6_5 typedef _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_> _T_y_p_e; │ │ │ │ │ +366 │ │ │ │ │ +_3_7_1 typedef typename I::GlobalIndex _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +372 │ │ │ │ │ +_3_7_4 typedef VariableSize _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ +375 │ │ │ │ │ +_3_7_6 static typename M::size_type _g_e_t_S_i_z_e(const _T_y_p_e& t, std::size_t i) │ │ │ │ │ +377 { │ │ │ │ │ +378 if(!t._r_o_w_s_i_z_e) │ │ │ │ │ +379 return t._m_a_t_r_i_x[i].size(); │ │ │ │ │ +380 else │ │ │ │ │ +381 { │ │ │ │ │ +382 assert((*t._r_o_w_s_i_z_e)[i]>0); │ │ │ │ │ +383 return (*t._r_o_w_s_i_z_e)[i]; │ │ │ │ │ +384 } │ │ │ │ │ +385 } │ │ │ │ │ +386 }; │ │ │ │ │ +387 │ │ │ │ │ +394 template │ │ │ │ │ +_3_9_5 struct _C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ +396 { │ │ │ │ │ +_4_0_5 _C_o_m_m_M_a_t_r_i_x_R_o_w(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I& │ │ │ │ │ +aggidxset_) │ │ │ │ │ +406 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _r_o_w_s_i_z_e() │ │ │ │ │ +407 {} │ │ │ │ │ +408 │ │ │ │ │ +_4_1_2 _C_o_m_m_M_a_t_r_i_x_R_o_w(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I& │ │ │ │ │ +aggidxset_, │ │ │ │ │ +413 std::vector& rowsize_) │ │ │ │ │ +414 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _r_o_w_s_i_z_e(&rowsize_) │ │ │ │ │ +415 {} │ │ │ │ │ +_4_2_1 void _s_e_t_O_v_e_r_l_a_p_R_o_w_s_T_o_D_i_r_i_c_h_l_e_t() │ │ │ │ │ +422 { │ │ │ │ │ +423 typedef typename Dune::GlobalLookupIndexSet::const_iterator Iter; │ │ │ │ │ +424 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +OwnerSet; │ │ │ │ │ +425 │ │ │ │ │ +426 for(Iter i= _a_g_g_i_d_x_s_e_t.begin(), end=_a_g_g_i_d_x_s_e_t.end(); i!=end; ++i) │ │ │ │ │ +427 if(!OwnerSet::contains(i->local().attribute())) { │ │ │ │ │ +428 // Set to Dirchlet │ │ │ │ │ +429 typedef typename M::ColIterator CIter; │ │ │ │ │ +430 for(CIter c=_m_a_t_r_i_x[i->local()].begin(), cend= _m_a_t_r_i_x[i->local()].end(); │ │ │ │ │ +431 c!= cend; ++c) │ │ │ │ │ +432 { │ │ │ │ │ +433 *c=0; │ │ │ │ │ +434 if(c.index()==i->local()) { │ │ │ │ │ +435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) { │ │ │ │ │ +436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix); │ │ │ │ │ +437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt) │ │ │ │ │ +438 (*rowIt)[rowIt.index()] = value; │ │ │ │ │ +439 }; │ │ │ │ │ +440 setDiagonal(*c, 1); │ │ │ │ │ +441 } │ │ │ │ │ +442 } │ │ │ │ │ +443 } │ │ │ │ │ +444 } │ │ │ │ │ +_4_4_6 M& _m_a_t_r_i_x; │ │ │ │ │ +_4_4_8 const Dune::GlobalLookupIndexSet& _i_d_x_s_e_t; │ │ │ │ │ +_4_5_0 const I& _a_g_g_i_d_x_s_e_t; │ │ │ │ │ +_4_5_2 std::vector* _r_o_w_s_i_z_e; // row sizes differ from sender side in │ │ │ │ │ +overlap! │ │ │ │ │ +453 }; │ │ │ │ │ +454 │ │ │ │ │ +455 template │ │ │ │ │ +_4_5_6 struct CommPolicy<_C_o_m_m_M_a_t_r_i_x_R_o_w > │ │ │ │ │ +457 { │ │ │ │ │ +_4_5_8 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_> _T_y_p_e; │ │ │ │ │ +459 │ │ │ │ │ +_4_6_4 typedef std::pair │ │ │ │ │ +_I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +465 │ │ │ │ │ +_4_6_7 typedef VariableSize _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ +468 │ │ │ │ │ +_4_6_9 static std::size_t _g_e_t_S_i_z_e(const _T_y_p_e& t, std::size_t i) │ │ │ │ │ +470 { │ │ │ │ │ +471 if(!t._r_o_w_s_i_z_e) │ │ │ │ │ +472 return t._m_a_t_r_i_x[i].size(); │ │ │ │ │ +473 else │ │ │ │ │ +474 { │ │ │ │ │ +475 assert((*t._r_o_w_s_i_z_e)[i]>0); │ │ │ │ │ +476 return (*t._r_o_w_s_i_z_e)[i]; │ │ │ │ │ +477 } │ │ │ │ │ +478 } │ │ │ │ │ +479 }; │ │ │ │ │ +480 │ │ │ │ │ +481 template │ │ │ │ │ +_4_8_2 struct _M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +483 { │ │ │ │ │ +_4_8_4 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ +485 │ │ │ │ │ +_4_8_6 static const typename M::size_type _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std:: │ │ │ │ │ +size_t i) │ │ │ │ │ +487 { │ │ │ │ │ +488 return cont._m_a_t_r_i_x[i].size(); │ │ │ │ │ +489 } │ │ │ │ │ +_4_9_0 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const typename M::size_type& rowsize, │ │ │ │ │ +std::size_t i) │ │ │ │ │ +491 { │ │ │ │ │ +492 assert(rowsize); │ │ │ │ │ +493 cont._r_o_w_s_i_z_e.getRowSize(i)=rowsize; │ │ │ │ │ +494 } │ │ │ │ │ +495 │ │ │ │ │ +496 }; │ │ │ │ │ +497 │ │ │ │ │ +498 template │ │ │ │ │ +_4_9_9 struct _M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +500 { │ │ │ │ │ +_5_0_1 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ +502 │ │ │ │ │ +_5_0_3 static const typename M::size_type _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std:: │ │ │ │ │ +size_t i) │ │ │ │ │ +504 { │ │ │ │ │ +505 return cont._m_a_t_r_i_x[i].size(); │ │ │ │ │ +506 } │ │ │ │ │ +_5_0_7 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const typename M::size_type& rowsize, │ │ │ │ │ +std::size_t i) │ │ │ │ │ +508 { │ │ │ │ │ +509 assert(rowsize); │ │ │ │ │ +510 if (rowsize > cont._r_o_w_s_i_z_e.getCopyRowSize(i)) │ │ │ │ │ +511 cont._r_o_w_s_i_z_e.getCopyRowSize(i)=rowsize; │ │ │ │ │ +512 } │ │ │ │ │ +513 │ │ │ │ │ +514 }; │ │ │ │ │ +515 │ │ │ │ │ +516 template │ │ │ │ │ +_5_1_7 struct _M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +518 { │ │ │ │ │ +_5_1_9 typedef typename I::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +_5_2_0 typedef _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ +_5_2_1 typedef typename M::ConstColIterator _C_o_l_I_t_e_r; │ │ │ │ │ +522 │ │ │ │ │ +_5_2_3 static _C_o_l_I_t_e_r _c_o_l; │ │ │ │ │ +_5_2_4 static _G_l_o_b_a_l_I_n_d_e_x _n_u_m_l_i_m_i_t_s; │ │ │ │ │ +525 │ │ │ │ │ +_5_2_6 static const _G_l_o_b_a_l_I_n_d_e_x& _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std::size_t i, │ │ │ │ │ +std::size_t j) │ │ │ │ │ +527 { │ │ │ │ │ +528 if(j==0) │ │ │ │ │ +529 _c_o_l=cont._m_a_t_r_i_x[i].begin(); │ │ │ │ │ +530 else if (_c_o_l!=cont._m_a_t_r_i_x[i].end()) │ │ │ │ │ +531 ++_c_o_l; │ │ │ │ │ +532 │ │ │ │ │ +533 //copy communication: different row sizes for copy rows with the same │ │ │ │ │ +global index │ │ │ │ │ +534 //are possible. If all values of current matrix row are sent, send │ │ │ │ │ +535 //std::numeric_limits::max() │ │ │ │ │ +536 //and receiver will ignore it. │ │ │ │ │ +537 if (_c_o_l==cont._m_a_t_r_i_x[i].end()) { │ │ │ │ │ +538 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ +539 return _n_u_m_l_i_m_i_t_s; │ │ │ │ │ +540 } │ │ │ │ │ +541 else { │ │ │ │ │ +542 const typename I::IndexPair* index=cont._i_d_x_s_e_t.pair(_c_o_l.index()); │ │ │ │ │ +543 assert(index); │ │ │ │ │ +544 // Only send index if col is no ghost │ │ │ │ │ +545 if ( index->local().attribute() != 2) │ │ │ │ │ +546 return index->global(); │ │ │ │ │ +547 else { │ │ │ │ │ +548 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ +549 return _n_u_m_l_i_m_i_t_s; │ │ │ │ │ +550 } │ │ │ │ │ +551 } │ │ │ │ │ +552 } │ │ │ │ │ +_5_5_3 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const _G_l_o_b_a_l_I_n_d_e_x& gi, std::size_t i, │ │ │ │ │ +[[maybe_unused]] std::size_t j) │ │ │ │ │ +554 { │ │ │ │ │ +555 try{ │ │ │ │ │ +556 if (gi != std::numeric_limits::max()) { │ │ │ │ │ +557 const typename I::IndexPair& ip=cont._a_g_g_i_d_x_s_e_t.at(gi); │ │ │ │ │ +558 assert(ip.global()==gi); │ │ │ │ │ +559 std::size_t column = ip.local(); │ │ │ │ │ +560 cont._s_p_a_r_s_i_t_y[i].insert(column); │ │ │ │ │ +561 │ │ │ │ │ +562 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +OwnerSet; │ │ │ │ │ +563 if(!OwnerSet::contains(ip.local().attribute())) │ │ │ │ │ +564 // preserve symmetry for overlap │ │ │ │ │ +565 cont._s_p_a_r_s_i_t_y[column].insert(i); │ │ │ │ │ +566 } │ │ │ │ │ +567 } │ │ │ │ │ +568 catch(const Dune::RangeError&) { │ │ │ │ │ +569 // Entry not present in the new index set. Ignore! │ │ │ │ │ +570#ifdef DEBUG_REPART │ │ │ │ │ +571 typedef typename _C_o_n_t_a_i_n_e_r_:_:_L_o_o_k_u_p_I_n_d_e_x_S_e_t GlobalLookup; │ │ │ │ │ +572 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ +573 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +OwnerSet; │ │ │ │ │ +574 │ │ │ │ │ +575 GlobalLookup lookup(cont._a_g_g_i_d_x_s_e_t); │ │ │ │ │ +576 const IndexPair* pi=lookup.pair(i); │ │ │ │ │ +577 assert(pi); │ │ │ │ │ +578 if(OwnerSet::contains(pi->local().attribute())) { │ │ │ │ │ +579 int rank; │ │ │ │ │ +580 MPI_Comm_rank(MPI_COMM_WORLD,&rank); │ │ │ │ │ +581 std::cout<global()< │ │ │ │ │ +591 typename _M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_C_o_l_I_t_e_r │ │ │ │ │ +_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_c_o_l; │ │ │ │ │ +592 │ │ │ │ │ +593 template │ │ │ │ │ +594 typename _M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_n_u_m_l_i_m_i_t_s; │ │ │ │ │ +595 │ │ │ │ │ +596 │ │ │ │ │ +597 template │ │ │ │ │ +_5_9_8 struct _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +599 { │ │ │ │ │ +_6_0_0 typedef typename I::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +_6_0_1 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ +_6_0_2 typedef typename M::ConstColIterator _C_o_l_I_t_e_r; │ │ │ │ │ +_6_0_3 typedef typename std::pair _D_a_t_a; │ │ │ │ │ +_6_0_4 static _C_o_l_I_t_e_r _c_o_l; │ │ │ │ │ +_6_0_5 static _D_a_t_a _d_a_t_a_s_t_o_r_e; │ │ │ │ │ +_6_0_6 static _G_l_o_b_a_l_I_n_d_e_x _n_u_m_l_i_m_i_t_s; │ │ │ │ │ +607 │ │ │ │ │ +_6_0_8 static const _D_a_t_a& _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std::size_t i, std::size_t │ │ │ │ │ +j) │ │ │ │ │ +609 { │ │ │ │ │ +610 if(j==0) │ │ │ │ │ +611 _c_o_l=cont._m_a_t_r_i_x[i].begin(); │ │ │ │ │ +612 else if (_c_o_l!=cont._m_a_t_r_i_x[i].end()) │ │ │ │ │ +613 ++_c_o_l; │ │ │ │ │ +614 // copy communication: different row sizes for copy rows with the same │ │ │ │ │ +global index │ │ │ │ │ +615 // are possible. If all values of current matrix row are sent, send │ │ │ │ │ +616 // std::numeric_limits::max() │ │ │ │ │ +617 // and receiver will ignore it. │ │ │ │ │ +618 if (_c_o_l==cont._m_a_t_r_i_x[i].end()) { │ │ │ │ │ +619 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ +620 _d_a_t_a_s_t_o_r_e = _D_a_t_a(_n_u_m_l_i_m_i_t_s,*_c_o_l); │ │ │ │ │ +621 return _d_a_t_a_s_t_o_r_e; │ │ │ │ │ +622 } │ │ │ │ │ +623 else { │ │ │ │ │ +624 // convert local column index to global index │ │ │ │ │ +625 const typename I::IndexPair* index=cont._i_d_x_s_e_t.pair(_c_o_l.index()); │ │ │ │ │ +626 assert(index); │ │ │ │ │ +627 // Store the data to prevent reference to temporary │ │ │ │ │ +628 // Only send index if col is no ghost │ │ │ │ │ +629 if ( index->local().attribute() != 2) │ │ │ │ │ +630 _d_a_t_a_s_t_o_r_e = _D_a_t_a(index->global(),*_c_o_l); │ │ │ │ │ +631 else { │ │ │ │ │ +632 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ +633 _d_a_t_a_s_t_o_r_e = _D_a_t_a(_n_u_m_l_i_m_i_t_s,*_c_o_l); │ │ │ │ │ +634 } │ │ │ │ │ +635 return _d_a_t_a_s_t_o_r_e; │ │ │ │ │ +636 } │ │ │ │ │ +637 } │ │ │ │ │ +_6_3_8 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const _D_a_t_a& data, std::size_t i, [ │ │ │ │ │ +[maybe_unused]] std::size_t j) │ │ │ │ │ +639 { │ │ │ │ │ +640 try{ │ │ │ │ │ +641 if (data.first != std::numeric_limits::max()) { │ │ │ │ │ +642 typename M::size_type column=cont._a_g_g_i_d_x_s_e_t.at(data.first).local(); │ │ │ │ │ +643 cont._m_a_t_r_i_x[i][column]=data.second; │ │ │ │ │ +644 } │ │ │ │ │ +645 } │ │ │ │ │ +646 catch(const Dune::RangeError&) { │ │ │ │ │ +647 // This an overlap row and might therefore lack some entries! │ │ │ │ │ +648 } │ │ │ │ │ +649 │ │ │ │ │ +650 } │ │ │ │ │ +651 }; │ │ │ │ │ +652 │ │ │ │ │ +653 template │ │ │ │ │ +654 typename _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_C_o_l_I_t_e_r _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_: │ │ │ │ │ +_c_o_l; │ │ │ │ │ +655 │ │ │ │ │ +656 template │ │ │ │ │ +657 typename _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_D_a_t_a _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_: │ │ │ │ │ +_d_a_t_a_s_t_o_r_e; │ │ │ │ │ +658 │ │ │ │ │ +659 template │ │ │ │ │ +660 typename _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_n_u_m_l_i_m_i_t_s; │ │ │ │ │ +661 │ │ │ │ │ +662 template │ │ │ │ │ +_6_6_3 void _r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(M& origMatrix, M& newMatrix, C& origComm, │ │ │ │ │ +C& newComm, │ │ │ │ │ +664 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri) │ │ │ │ │ +665 { │ │ │ │ │ +666 typename C::CopySet copyflags; │ │ │ │ │ +667 typename C::OwnerSet ownerflags; │ │ │ │ │ +668 typedef typename C::ParallelIndexSet IndexSet; │ │ │ │ │ +669 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_> RI; │ │ │ │ │ +670 std::vector rowsize(newComm.indexSet().size(), 0); │ │ │ │ │ +671 std::vector copyrowsize(newComm.indexSet().size(), │ │ │ │ │ +0); │ │ │ │ │ +672 std::vector backwardscopyrowsize(origComm.indexSet │ │ │ │ │ +().size(), 0); │ │ │ │ │ +673 │ │ │ │ │ +674 // get owner rowsizes │ │ │ │ │ +675 _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> commRowSize(origMatrix, ri); │ │ │ │ │ +676 ri.template redistribute > │ │ │ │ │ +(commRowSize,commRowSize); │ │ │ │ │ +677 │ │ │ │ │ +678 origComm.buildGlobalLookup(); │ │ │ │ │ +679 │ │ │ │ │ +680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) { │ │ │ │ │ +681 rowsize[i] = ri._g_e_t_R_o_w_S_i_z_e(i); │ │ │ │ │ +682 } │ │ │ │ │ +683 // get sparsity pattern from owner rows │ │ │ │ │ +684 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ +685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet()); │ │ │ │ │ +686 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ +687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize); │ │ │ │ │ +688 │ │ │ │ │ +689 ri.template redistribute > │ │ │ │ │ +(origsp,newsp); │ │ │ │ │ +690 │ │ │ │ │ +691 // build copy to owner interface to get missing matrix values for novlp │ │ │ │ │ +case │ │ │ │ │ +692 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) { │ │ │ │ │ +693 RemoteIndices *ris = new RemoteIndices │ │ │ │ │ +(origComm.indexSet(), │ │ │ │ │ +694 newComm.indexSet(), │ │ │ │ │ +695 origComm.communicator()); │ │ │ │ │ +696 ris->template rebuild(); │ │ │ │ │ +697 │ │ │ │ │ +698 ri.getInterface().free(); │ │ │ │ │ +699 ri.getInterface().build(*ris,copyflags,ownerflags); │ │ │ │ │ +700 │ │ │ │ │ +701 // get copy rowsizes │ │ │ │ │ +702 _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> commRowSize_copy(origMatrix, ri); │ │ │ │ │ +703 ri.template redistribute > │ │ │ │ │ +(commRowSize_copy, │ │ │ │ │ +704 commRowSize_copy); │ │ │ │ │ +705 │ │ │ │ │ +706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) { │ │ │ │ │ +707 copyrowsize[i] = ri._g_e_t_C_o_p_y_R_o_w_S_i_z_e(i); │ │ │ │ │ +708 } │ │ │ │ │ +709 //get copy rowsizes for sender │ │ │ │ │ +710 ri._r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(backwardscopyrowsize,copyrowsize); │ │ │ │ │ +711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) { │ │ │ │ │ +712 ri._g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(i) = backwardscopyrowsize[i]; │ │ │ │ │ +713 } │ │ │ │ │ +714 │ │ │ │ │ +715 // get sparsity pattern from copy rows │ │ │ │ │ +716 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> origsp_copy(origMatrix, │ │ │ │ │ +717 origComm.globalLookup(), │ │ │ │ │ +718 newComm.indexSet(), │ │ │ │ │ +719 backwardscopyrowsize); │ │ │ │ │ +720 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> newsp_copy(origMatrix, │ │ │ │ │ +origComm.globalLookup(), │ │ │ │ │ +721 newComm.indexSet(), copyrowsize); │ │ │ │ │ +722 ri.template redistribute > │ │ │ │ │ +(origsp_copy, │ │ │ │ │ +723 newsp_copy); │ │ │ │ │ +724 │ │ │ │ │ +725 newsp._c_o_m_p_l_e_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(newsp_copy._s_p_a_r_s_i_t_y); │ │ │ │ │ +726 newsp._s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(newMatrix); │ │ │ │ │ +727 } │ │ │ │ │ +728 else │ │ │ │ │ +729 newsp._s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(newMatrix); │ │ │ │ │ +730 │ │ │ │ │ +731#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +732 // Check for symmetry │ │ │ │ │ +733 int ret=0; │ │ │ │ │ +734 typedef typename M::ConstRowIterator RIter; │ │ │ │ │ +735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row) │ │ │ │ │ +{ │ │ │ │ │ +736 typedef typename M::ConstColIterator CIter; │ │ │ │ │ +737 for(CIter _c_o_l=row->begin(), cend=row->end(); _c_o_l!=cend; ++_c_o_l) │ │ │ │ │ +738 { │ │ │ │ │ +739 try{ │ │ │ │ │ +740 newMatrix[_c_o_l.index()][row.index()]; │ │ │ │ │ +741 }catch(const _D_u_n_e_:_:_I_S_T_L_E_r_r_o_r&) { │ │ │ │ │ +742 std::cerr< │ │ │ │ │ +_7_5_7 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(M& origMatrix, M& newMatrix, C& origComm, C& │ │ │ │ │ +newComm, │ │ │ │ │ +758 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri) │ │ │ │ │ +759 { │ │ │ │ │ +760 typedef typename C::ParallelIndexSet IndexSet; │ │ │ │ │ +761 typename C::OwnerSet ownerflags; │ │ │ │ │ +762 std::vector rowsize(newComm.indexSet().size(), 0); │ │ │ │ │ +763 std::vector copyrowsize(newComm.indexSet().size(), │ │ │ │ │ +0); │ │ │ │ │ +764 std::vector backwardscopyrowsize(origComm.indexSet │ │ │ │ │ +().size(), 0); │ │ │ │ │ +765 │ │ │ │ │ +766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) { │ │ │ │ │ +767 rowsize[i] = ri._g_e_t_R_o_w_S_i_z_e(i); │ │ │ │ │ +768 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) { │ │ │ │ │ +769 copyrowsize[i] = ri._g_e_t_C_o_p_y_R_o_w_S_i_z_e(i); │ │ │ │ │ +770 } │ │ │ │ │ +771 } │ │ │ │ │ +772 │ │ │ │ │ +773 for (std::size_t i=0; i < origComm.indexSet().size(); i++) │ │ │ │ │ +774 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) │ │ │ │ │ +775 backwardscopyrowsize[i] = ri._g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(i); │ │ │ │ │ +776 │ │ │ │ │ +777 │ │ │ │ │ +778 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) { │ │ │ │ │ +779 // fill sparsity pattern from copy rows │ │ │ │ │ +780 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> origrow_copy(origMatrix, origComm.globalLookup(), │ │ │ │ │ +781 newComm.indexSet(), backwardscopyrowsize); │ │ │ │ │ +782 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> newrow_copy(newMatrix, origComm.globalLookup(), │ │ │ │ │ +783 newComm.indexSet(),copyrowsize); │ │ │ │ │ +784 ri.template redistribute >(origrow_copy, │ │ │ │ │ +785 newrow_copy); │ │ │ │ │ +786 ri.getInterface().free(); │ │ │ │ │ +787 RemoteIndices *ris = new RemoteIndices │ │ │ │ │ +(origComm.indexSet(), │ │ │ │ │ +788 newComm.indexSet(), │ │ │ │ │ +789 origComm.communicator()); │ │ │ │ │ +790 ris->template rebuild(); │ │ │ │ │ +791 ri.getInterface().build(*ris,ownerflags,ownerflags); │ │ │ │ │ +792 } │ │ │ │ │ +793 │ │ │ │ │ +794 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ +795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet()); │ │ │ │ │ +796 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ +797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize); │ │ │ │ │ +798 ri.template redistribute > │ │ │ │ │ +(origrow,newrow); │ │ │ │ │ +799 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) != static_cast(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ +_n_o_n_o_v_e_r_l_a_p_p_i_n_g)) │ │ │ │ │ +800 newrow._s_e_t_O_v_e_r_l_a_p_R_o_w_s_T_o_D_i_r_i_c_h_l_e_t(); │ │ │ │ │ +801 } │ │ │ │ │ +802 │ │ │ │ │ +819 template │ │ │ │ │ +_8_2_0 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(M& origMatrix, M& newMatrix, C& origComm, C& │ │ │ │ │ +newComm, │ │ │ │ │ +821 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri) │ │ │ │ │ +822 { │ │ │ │ │ +823 ri._s_e_t_N_o_R_o_w_s(newComm.indexSet().size()); │ │ │ │ │ +824 ri._s_e_t_N_o_C_o_p_y_R_o_w_s(newComm.indexSet().size()); │ │ │ │ │ +825 ri._s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s(origComm.indexSet().size()); │ │ │ │ │ +826 _r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(origMatrix, newMatrix, origComm, newComm, ri); │ │ │ │ │ +827 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(origMatrix, newMatrix, origComm, newComm, ri); │ │ │ │ │ +828 } │ │ │ │ │ +829#endif │ │ │ │ │ +830 │ │ │ │ │ +831template │ │ │ │ │ +_8_3_2 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(M& origMatrix, M& newMatrix, │ │ │ │ │ +833 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& origComm, │ │ │ │ │ +834 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& newComm, │ │ │ │ │ +835 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>& ri) │ │ │ │ │ +836 { │ │ │ │ │ +837 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential │ │ │ │ │ +program!"); │ │ │ │ │ +838 } │ │ │ │ │ +839 template │ │ │ │ │ +_8_4_0 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(M& origMatrix, M& newMatrix, │ │ │ │ │ +841 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& origComm, │ │ │ │ │ +842 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& newComm, │ │ │ │ │ +843 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>& ri) │ │ │ │ │ +844 { │ │ │ │ │ +845 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential │ │ │ │ │ +program!"); │ │ │ │ │ +846 } │ │ │ │ │ +847} │ │ │ │ │ +848#endif │ │ │ │ │ _o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_D_u_n_e_:_:_b_s_o_r_b │ │ │ │ │ -void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -SSOR step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:646 │ │ │ │ │ -_D_u_n_e_:_:_b_s_o_r_f │ │ │ │ │ -void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -SOR step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:634 │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_r_e_p_a_r_t_i_t_i_o_n_._h_h │ │ │ │ │ +Functionality for redistributing a parallel index set using graph partitioning. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -A linear operator exporting itself in matrix form. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -An overlapping Schwarz operator. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -const communication_type & getCommunication() const │ │ │ │ │ -Get the object responsible for communication. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_m_a_t │ │ │ │ │ -virtual const matrix_type & getmat() const │ │ │ │ │ -get the sequential assembled linear operator. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ -virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const │ │ │ │ │ -apply operator to x, scale and add: │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(const X &x, Y &y) const │ │ │ │ │ -apply operator to x: │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ -C communication_type │ │ │ │ │ -The type of the communication object. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The type of the domain. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The type of the matrix we operate on. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The type of the range. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the range. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com) │ │ │ │ │ -constructor: just store a reference to a matrix. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:107 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const │ │ │ │ │ -communication_type &com) │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:139 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R │ │ │ │ │ -A parallel SSOR preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ -C communication_type │ │ │ │ │ -The type of the communication object. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_P_a_r_S_S_O_R │ │ │ │ │ -ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c) │ │ │ │ │ +_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s │ │ │ │ │ +void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ +&newComm, RedistributeInformation< C > &ri) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:757 │ │ │ │ │ +_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ +&newComm, RedistributeInformation< C > &ri) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:663 │ │ │ │ │ +_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x │ │ │ │ │ +void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, │ │ │ │ │ +RedistributeInformation< C > &ri) │ │ │ │ │ +Redistribute a matrix according to given domain decompositions. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:820 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s │ │ │ │ │ +void setNoBackwardsCopyRows(std::size_t size) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_d_i_s_t_r_i_b_u_t_e │ │ │ │ │ +void redistribute(const D &from, D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_s_e_t_S_e_t_u_p │ │ │ │ │ +void resetSetup() │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_e_t_N_o_C_o_p_y_R_o_w_s │ │ │ │ │ +void setNoCopyRows(std::size_t size) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_i_s_S_e_t_u_p │ │ │ │ │ +bool isSetup() const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_e_t_N_o_R_o_w_s │ │ │ │ │ +void setNoRows(std::size_t size) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ +void redistributeBackward(D &from, const D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t getBackwardsCopyRowSize(std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_g_e_t_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t getRowSize(std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_g_e_t_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t getCopyRowSize(std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t getRowSize(std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t & getBackwardsCopyRowSize(std::size_t index) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_I_n_t_e_r_f_a_c_e │ │ │ │ │ +RedistributeInterface & getInterface() │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_r_e_d_i_s_t_r_i_b_u_t_e │ │ │ │ │ +void redistribute(const D &from, D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:136 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s │ │ │ │ │ +void setNoBackwardsCopyRows(std::size_t rows) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t & getCopyRowSize(std::size_t index) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +RedistributeInformation() │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t getCopyRowSize(std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_s_e_t_N_o_R_o_w_s │ │ │ │ │ +void setNoRows(std::size_t rows) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_r_e_s_e_r_v_e │ │ │ │ │ +void reserve(std::size_t size) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_:_C_o_m_m │ │ │ │ │ +OwnerOverlapCopyCommunication< T, T1 > Comm │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_s_e_t_N_o_C_o_p_y_R_o_w_s │ │ │ │ │ +void setNoCopyRows(std::size_t rows) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ +void redistributeBackward(D &from, const D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_s_e_t_S_e_t_u_p │ │ │ │ │ +void setSetup() │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t getBackwardsCopyRowSize(std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_r_e_d_i_s_t_r_i_b_u_t_e │ │ │ │ │ +void redistribute(const D &from, D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_r_e_s_e_t_S_e_t_u_p │ │ │ │ │ +void resetSetup() │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ +void redistributeBackward(D &from, const D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_c_h_e_c_k_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void checkInterface(const IS &source, const IS &target, MPI_Comm comm) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_i_s_S_e_t_u_p │ │ │ │ │ +bool isSetup() const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ +_g_e_t_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t & getRowSize(std::size_t index) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e │ │ │ │ │ +Utility class to communicate and set the row sizes of a redistributed matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +M::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +M::size_type value_type │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_r_o_w_s_i_z_e │ │ │ │ │ +RI & rowsize │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_m_a_t_r_i_x │ │ │ │ │ +const M & matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e │ │ │ │ │ +CommMatrixRowSize(const M &m_, RI &rowsize_) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:197 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the precondtioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Block parallel preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:285 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +Utility class to communicate and build the sparsity pattern of a redistributed │ │ │ │ │ +matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +M::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:246 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_i_d_x_s_e_t │ │ │ │ │ +const Dune::GlobalLookupIndexSet< I > & idxset │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:356 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +void storeSparsityPattern(M &m) │ │ │ │ │ +Creates and stores the sparsity pattern of the redistributed matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_a_g_g_i_d_x_s_e_t │ │ │ │ │ +const I & aggidxset │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:357 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_r_o_w_s_i_z_e │ │ │ │ │ +const std::vector< size_type > * rowsize │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_c_o_m_p_l_e_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +void completeSparsityPattern(std::vector< std::set< size_type > > add_sparsity) │ │ │ │ │ +Completes the sparsity pattern of the redistributed matrix with data from copy │ │ │ │ │ +rows for the novlp cas... │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:340 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > │ │ │ │ │ +&idxset_, const I &aggidxset_) │ │ │ │ │ +Constructor for the original side. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_m_a_t_r_i_x │ │ │ │ │ +const M & matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:354 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ +CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > │ │ │ │ │ +&idxset_, const I &aggidxset_, const std::vector< typename M::size_type > │ │ │ │ │ +&rowsize_) │ │ │ │ │ +Constructor for the redistruted side. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:265 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_s_p_a_r_s_i_t_y │ │ │ │ │ +std::vector< std::set< size_type > > sparsity │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:358 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::GlobalLookupIndexSet< I > LookupIndexSet │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_g_e_t_S_i_z_e │ │ │ │ │ +static M::size_type getSize(const Type &t, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:376 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ +CommMatrixSparsityPattern< M, I > Type │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +I::GlobalIndex IndexedType │ │ │ │ │ +The indexed type we send. This is the global index indentitfying the column. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ +VariableSize IndexedTypeFlag │ │ │ │ │ +Each row varies in size. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:374 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ +Utility class for comunicating the matrix entries. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:396 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_r_o_w_s_i_z_e │ │ │ │ │ +std::vector< size_t > * rowsize │ │ │ │ │ +row size information for the receiving side. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:452 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_m_a_t_r_i_x │ │ │ │ │ +M & matrix │ │ │ │ │ +The matrix to communicate the values of. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:446 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ +CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I │ │ │ │ │ +&aggidxset_, std::vector< size_t > &rowsize_) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:317 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:337 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -BlockPreconditioner(P &p, const communication_type &c) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:412 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_i_d_x_s_e_t │ │ │ │ │ +const Dune::GlobalLookupIndexSet< I > & idxset │ │ │ │ │ +Index set for the original matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:448 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_s_e_t_O_v_e_r_l_a_p_R_o_w_s_T_o_D_i_r_i_c_h_l_e_t │ │ │ │ │ +void setOverlapRowsToDirichlet() │ │ │ │ │ +Sets the non-owner rows correctly as Dirichlet boundaries. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:421 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_a_g_g_i_d_x_s_e_t │ │ │ │ │ +const I & aggidxset │ │ │ │ │ +Index set for the redistributed matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:450 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ +CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I │ │ │ │ │ +&aggidxset_) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const Y &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:344 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ -C communication_type │ │ │ │ │ -The type of the communication object.. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:292 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:361 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ overlapping │ │ │ │ │ -Category for overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:29 │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:405 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType │ │ │ │ │ +The indexed type we send. This is the pair of global index indentitfying the │ │ │ │ │ +column and the value its... │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:464 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ +CommMatrixRow< M, I > Type │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:458 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_g_e_t_S_i_z_e │ │ │ │ │ +static std::size_t getSize(const Type &t, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:469 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ +VariableSize IndexedTypeFlag │ │ │ │ │ +Each row varies in size. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:467 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:483 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(Container &cont, const typename M::size_type &rowsize, │ │ │ │ │ +std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:490 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static const M::size_type gather(const Container &cont, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:486 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ +CommMatrixRowSize< M, RI > Container │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:484 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static const M::size_type gather(const Container &cont, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:503 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(Container &cont, const typename M::size_type &rowsize, │ │ │ │ │ +std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:507 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ +CommMatrixRowSize< M, RI > Container │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:501 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:518 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_l_I_t_e_r │ │ │ │ │ +M::ConstColIterator ColIter │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:521 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i, │ │ │ │ │ +std::size_t j) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:553 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ +CommMatrixSparsityPattern< M, I > Container │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_n_u_m_l_i_m_i_t_s │ │ │ │ │ +static GlobalIndex numlimits │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:524 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_c_o_l │ │ │ │ │ +static ColIter col │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:523 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +I::GlobalIndex GlobalIndex │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:519 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static const GlobalIndex & gather(const Container &cont, std::size_t i, std:: │ │ │ │ │ +size_t j) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:599 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +I::GlobalIndex GlobalIndex │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:600 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_d_a_t_a_s_t_o_r_e │ │ │ │ │ +static Data datastore │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:605 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_n_u_m_l_i_m_i_t_s │ │ │ │ │ +static GlobalIndex numlimits │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:606 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_l_I_t_e_r │ │ │ │ │ +M::ConstColIterator ColIter │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:602 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static const Data & gather(const Container &cont, std::size_t i, std::size_t j) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:608 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_D_a_t_a │ │ │ │ │ +std::pair< GlobalIndex, typename M::block_type > Data │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:603 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(Container &cont, const Data &data, std::size_t i, std:: │ │ │ │ │ +size_t j) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:638 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_c_o_l │ │ │ │ │ +static ColIter col │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:604 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ +CommMatrixRow< M, I > Container │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:601 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ +@ nonoverlapping │ │ │ │ │ +Category for non-overlapping solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ +Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ +newly introduced virtu... │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00014.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: supermatrix.hh File Reference │ │ │ │ +dune-istl: schwarz.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,61 +72,55 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
supermatrix.hh File Reference
│ │ │ │ +
schwarz.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include "bcrsmatrix.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ -#include "superlufunctions.hh"
│ │ │ │ +
#include <iostream>
│ │ │ │ +#include <fstream>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <sstream>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include "io.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include "vbvector.hh"
│ │ │ │ +#include "bcrsmatrix.hh"
│ │ │ │ +#include "gsetc.hh"
│ │ │ │ +#include "ilu.hh"
│ │ │ │ +#include "operators.hh"
│ │ │ │ +#include "solvers.hh"
│ │ │ │ +#include "preconditioners.hh"
│ │ │ │ +#include "scalarproducts.hh"
│ │ │ │ +#include "owneroverlapcopy.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::SuperMatrixCreateSparseChooser< T >
class  Dune::OverlappingSchwarzOperator< M, X, Y, C >
 An overlapping Schwarz operator. More...
 
struct  Dune::SuperMatrixPrinter< T >
class  Dune::ParSSOR< M, X, Y, C >
 A parallel SSOR preconditioner. More...
 
struct  Dune::BaseGetSuperLUType< T >
 
struct  Dune::GetSuperLUType< T >
 
struct  Dune::GetSuperLUType< double >
 
struct  Dune::GetSuperLUType< float >
 
struct  Dune::GetSuperLUType< std::complex< double > >
 
struct  Dune::GetSuperLUType< std::complex< float > >
 
struct  Dune::SuperLUMatrix< M >
 Utility class for converting an ISTL Matrix into a SuperLU Matrix. More...
 
struct  Dune::SuperMatrixInitializer< M >
 
class  Dune::SuperLUMatrix< BCRSMatrix< B, TA > >
 Converter for BCRSMatrix to SuperLU Matrix. More...
 
class  Dune::SuperMatrixInitializer< BCRSMatrix< B, A > >
class  Dune::BlockPreconditioner< X, Y, C, P >
 Block parallel preconditioner. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,50 +1,43 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -supermatrix.hh File Reference │ │ │ │ │ -#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +schwarz.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_i_o_._h_h" │ │ │ │ │ #include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ +#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +#include "_i_l_u_._h_h" │ │ │ │ │ +#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ +#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ +#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ +#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ +#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_P_r_i_n_t_e_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _d_o_u_b_l_e_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _> │ │ │ │ │ +  An overlapping Schwarz operator. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _f_l_o_a_t_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_P_a_r_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _C_ _> │ │ │ │ │ +  A parallel SSOR preconditioner. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _M_ _> │ │ │ │ │ -  Utility class for converting an _I_S_T_L _M_a_t_r_i_x into a _S_u_p_e_r_L_U _M_a_t_r_i_x. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _M_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _> │ │ │ │ │ -  Converter for _B_C_R_S_M_a_t_r_i_x to _S_u_p_e_r_L_U _M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _P_ _> │ │ │ │ │ +  Block parallel preconditioner. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: supermatrix.hh Source File │ │ │ │ +dune-istl: schwarz.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,427 +74,302 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
supermatrix.hh
│ │ │ │ +
schwarz.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SUPERMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_SUPERMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_SCHWARZ_HH
│ │ │ │ +
6#define DUNE_ISTL_SCHWARZ_HH
│ │ │ │
7
│ │ │ │ -
8#if HAVE_SUPERLU
│ │ │ │ -
9
│ │ │ │ -
10#include "bcrsmatrix.hh"
│ │ │ │ -
11#include "bvector.hh"
│ │ │ │ -
12#include <dune/common/fmatrix.hh>
│ │ │ │ -
13#include <dune/common/fvector.hh>
│ │ │ │ -
14#include <dune/common/typetraits.hh>
│ │ │ │ -
15#include <limits>
│ │ │ │ +
8#include <iostream> // for input/output to shell
│ │ │ │ +
9#include <fstream> // for input/output to files
│ │ │ │ +
10#include <vector> // STL vector class
│ │ │ │ +
11#include <sstream>
│ │ │ │ +
12
│ │ │ │ +
13#include <cmath> // Yes, we do some math here
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/timer.hh>
│ │ │ │
16
│ │ │ │ - │ │ │ │ -
18
│ │ │ │ -
19#include "superlufunctions.hh"
│ │ │ │ -
20
│ │ │ │ -
21namespace Dune
│ │ │ │ -
22{
│ │ │ │ -
23
│ │ │ │ -
24 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
26 {};
│ │ │ │ -
│ │ │ │ -
27
│ │ │ │ -
28 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
30 {};
│ │ │ │ -
│ │ │ │ +
17#include "io.hh"
│ │ │ │ +
18#include "bvector.hh"
│ │ │ │ +
19#include "vbvector.hh"
│ │ │ │ +
20#include "bcrsmatrix.hh"
│ │ │ │ +
21#include "io.hh"
│ │ │ │ +
22#include "gsetc.hh"
│ │ │ │ +
23#include "ilu.hh"
│ │ │ │ +
24#include "operators.hh"
│ │ │ │ +
25#include "solvers.hh"
│ │ │ │ +
26#include "preconditioners.hh"
│ │ │ │ +
27#include "scalarproducts.hh"
│ │ │ │ +
28#include "owneroverlapcopy.hh"
│ │ │ │ +
29
│ │ │ │ +
30namespace Dune {
│ │ │ │
31
│ │ │ │ -
32#if __has_include("slu_sdefs.h")
│ │ │ │ -
33 template<>
│ │ │ │ - │ │ │ │ -
35 {
│ │ │ │ -
36 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ -
37 float *values, int *rowindex, int* colindex,
│ │ │ │ -
38 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
39 {
│ │ │ │ -
40 sCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
│ │ │ │ -
41 stype, dtype, mtype);
│ │ │ │ -
42 }
│ │ │ │ -
43 };
│ │ │ │ -
44
│ │ │ │ -
45 template<>
│ │ │ │ -
46 struct SuperMatrixPrinter<float>
│ │ │ │ -
47 {
│ │ │ │ -
48 static void print(char* name, SuperMatrix* mat)
│ │ │ │ -
49 {
│ │ │ │ -
50 sPrint_CompCol_Matrix(name, mat);
│ │ │ │ -
51 }
│ │ │ │ -
52 };
│ │ │ │ -
53#endif
│ │ │ │ -
54
│ │ │ │ -
55#if __has_include("slu_ddefs.h")
│ │ │ │ -
56 template<>
│ │ │ │ -
57 struct SuperMatrixCreateSparseChooser<double>
│ │ │ │ -
58 {
│ │ │ │ -
59 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ -
60 double *values, int *rowindex, int* colindex,
│ │ │ │ -
61 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
62 {
│ │ │ │ -
63 dCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
│ │ │ │ -
64 stype, dtype, mtype);
│ │ │ │ -
65 }
│ │ │ │ -
66 };
│ │ │ │ -
67
│ │ │ │ -
68 template<>
│ │ │ │ -
69 struct SuperMatrixPrinter<double>
│ │ │ │ -
70 {
│ │ │ │ -
71 static void print(char* name, SuperMatrix* mat)
│ │ │ │ -
72 {
│ │ │ │ -
73 dPrint_CompCol_Matrix(name, mat);
│ │ │ │ -
74 }
│ │ │ │ -
75 };
│ │ │ │ -
76#endif
│ │ │ │ -
77
│ │ │ │ -
78#if __has_include("slu_cdefs.h")
│ │ │ │ -
79 template<>
│ │ │ │ -
80 struct SuperMatrixCreateSparseChooser<std::complex<float> >
│ │ │ │ -
81 {
│ │ │ │ -
82 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ -
83 std::complex<float> *values, int *rowindex, int* colindex,
│ │ │ │ -
84 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
85 {
│ │ │ │ -
86 cCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast< ::complex*>(values),
│ │ │ │ -
87 rowindex, colindex, stype, dtype, mtype);
│ │ │ │ -
88 }
│ │ │ │ -
89 };
│ │ │ │ -
90
│ │ │ │ -
91 template<>
│ │ │ │ -
92 struct SuperMatrixPrinter<std::complex<float> >
│ │ │ │ -
93 {
│ │ │ │ -
94 static void print(char* name, SuperMatrix* mat)
│ │ │ │ -
95 {
│ │ │ │ -
96 cPrint_CompCol_Matrix(name, mat);
│ │ │ │ -
97 }
│ │ │ │ -
98 };
│ │ │ │ -
99#endif
│ │ │ │ -
100
│ │ │ │ -
101#if __has_include("slu_zdefs.h")
│ │ │ │ -
102 template<>
│ │ │ │ -
103 struct SuperMatrixCreateSparseChooser<std::complex<double> >
│ │ │ │ -
104 {
│ │ │ │ -
105 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ -
106 std::complex<double> *values, int *rowindex, int* colindex,
│ │ │ │ -
107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ -
108 {
│ │ │ │ -
109 zCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast<doublecomplex*>(values),
│ │ │ │ -
110 rowindex, colindex, stype, dtype, mtype);
│ │ │ │ -
111 }
│ │ │ │ -
112 };
│ │ │ │ -
113
│ │ │ │ -
114 template<>
│ │ │ │ -
115 struct SuperMatrixPrinter<std::complex<double> >
│ │ │ │ -
116 {
│ │ │ │ -
117 static void print(char* name, SuperMatrix* mat)
│ │ │ │ -
118 {
│ │ │ │ -
119 zPrint_CompCol_Matrix(name, mat);
│ │ │ │ -
120 }
│ │ │ │ -
121 };
│ │ │ │ -
122#endif
│ │ │ │ +
73 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
75 {
│ │ │ │ +
76 public:
│ │ │ │ +
81 typedef M matrix_type;
│ │ │ │ +
86 typedef X domain_type;
│ │ │ │ +
91 typedef Y range_type;
│ │ │ │ +
93 typedef typename X::field_type field_type;
│ │ │ │ + │ │ │ │ +
99
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
108 : _A_(stackobject_to_shared_ptr(A)), communication(com)
│ │ │ │ +
109 {}
│ │ │ │ +
│ │ │ │ +
110
│ │ │ │ +
│ │ │ │ +
111 OverlappingSchwarzOperator (const std::shared_ptr<matrix_type> A, const communication_type& com)
│ │ │ │ +
112 : _A_(A), communication(com)
│ │ │ │ +
113 {}
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │ +
│ │ │ │ +
116 virtual void apply (const X& x, Y& y) const
│ │ │ │ +
117 {
│ │ │ │ +
118 y = 0;
│ │ │ │ +
119 _A_->umv(x,y); // result is consistent on interior+border
│ │ │ │ +
120 communication.project(y); // we want this here to avoid it before the preconditioner
│ │ │ │ +
121 // since there d is const!
│ │ │ │ +
122 }
│ │ │ │ +
│ │ │ │
123
│ │ │ │ -
124 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
126 {
│ │ │ │ -
127 static const Dtype_t type;
│ │ │ │ -
128 };
│ │ │ │ -
│ │ │ │ -
129
│ │ │ │ -
130 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
132 {};
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
134 template<class T>
│ │ │ │ -
135 const Dtype_t BaseGetSuperLUType<T>::type =
│ │ │ │ -
136 std::is_same<T,float>::value ? SLU_S :
│ │ │ │ -
137 ( std::is_same<T,std::complex<double> >::value ? SLU_Z :
│ │ │ │ -
138 ( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ));
│ │ │ │ -
139
│ │ │ │ -
140 template<>
│ │ │ │ -
│ │ │ │ -
141 struct GetSuperLUType<double>
│ │ │ │ -
142 : public BaseGetSuperLUType<double>
│ │ │ │ -
143 {
│ │ │ │ -
144 typedef double float_type;
│ │ │ │ -
145 };
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
147 template<>
│ │ │ │ -
│ │ │ │ -
148 struct GetSuperLUType<float>
│ │ │ │ -
149 : public BaseGetSuperLUType<float>
│ │ │ │ -
150 {
│ │ │ │ -
151 typedef float float_type;
│ │ │ │ -
152 };
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
154 template<>
│ │ │ │ -
│ │ │ │ -
155 struct GetSuperLUType<std::complex<double> >
│ │ │ │ -
156 : public BaseGetSuperLUType<std::complex<double> >
│ │ │ │ -
157 {
│ │ │ │ -
158 typedef double float_type;
│ │ │ │ -
159 };
│ │ │ │ -
│ │ │ │ -
160
│ │ │ │ -
161 template<>
│ │ │ │ -
│ │ │ │ -
162 struct GetSuperLUType<std::complex<float> >
│ │ │ │ -
163 : public BaseGetSuperLUType<std::complex<float> >
│ │ │ │ -
164 {
│ │ │ │ -
165 typedef float float_type;
│ │ │ │ -
166
│ │ │ │ -
167 };
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
173 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
175 {};
│ │ │ │ -
│ │ │ │ -
176
│ │ │ │ -
177 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
179 {};
│ │ │ │ -
│ │ │ │ -
180
│ │ │ │ -
181 template<class T>
│ │ │ │ -
182 class SuperLU;
│ │ │ │ -
183
│ │ │ │ -
184 template<class M, class X, class TM, class TD, class T1>
│ │ │ │ - │ │ │ │ -
186
│ │ │ │ -
187 template<class T, bool flag>
│ │ │ │ - │ │ │ │ -
189
│ │ │ │ -
193 template<class B, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
195 : public ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>
│ │ │ │ -
196 {
│ │ │ │ -
197 template<class M, class X, class TM, class TD, class T1>
│ │ │ │ - │ │ │ │ -
199 friend struct SuperMatrixInitializer<BCRSMatrix<B,TA> >;
│ │ │ │ -
200 public:
│ │ │ │ - │ │ │ │ -
203
│ │ │ │ - │ │ │ │ -
205
│ │ │ │ -
206 typedef typename Matrix::size_type size_type;
│ │ │ │ -
207
│ │ │ │ -
│ │ │ │ -
212 explicit SuperLUMatrix(const Matrix& mat) : ISTL::Impl::BCCSMatrix<BCRSMatrix<B,TA>, int>(mat)
│ │ │ │ -
213 {}
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
│ │ │ │ -
215 SuperLUMatrix() : ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>()
│ │ │ │ -
216 {}
│ │ │ │ -
│ │ │ │ -
217
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
220 {
│ │ │ │ -
221 if (this->N_+this->M_*this->Nnz_ != 0)
│ │ │ │ -
222 free();
│ │ │ │ +
│ │ │ │ +
125 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
│ │ │ │ +
126 {
│ │ │ │ +
127 _A_->usmv(alpha,x,y); // result is consistent on interior+border
│ │ │ │ +
128 communication.project(y); // we want this here to avoid it before the preconditioner
│ │ │ │ +
129 // since there d is const!
│ │ │ │ +
130 }
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
│ │ │ │ +
133 virtual const matrix_type& getmat () const
│ │ │ │ +
134 {
│ │ │ │ +
135 return *_A_;
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
140 {
│ │ │ │ + │ │ │ │ +
142 }
│ │ │ │ +
│ │ │ │ +
143
│ │ │ │ +
144
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
147 {
│ │ │ │ +
148 return communication;
│ │ │ │ +
149 }
│ │ │ │ +
│ │ │ │ +
150 private:
│ │ │ │ +
151 const std::shared_ptr<const matrix_type>_A_;
│ │ │ │ +
152 const communication_type& communication;
│ │ │ │ +
153 };
│ │ │ │ +
│ │ │ │ +
154
│ │ │ │ +
157 /*
│ │ │ │ +
158 * @addtogroup ISTL_Prec
│ │ │ │ +
159 * @{
│ │ │ │ +
160 */
│ │ │ │ +
174 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ +
175 class ParSSOR : public Preconditioner<X,Y> {
│ │ │ │ +
176 public:
│ │ │ │ +
178 typedef M matrix_type;
│ │ │ │ +
180 typedef X domain_type;
│ │ │ │ +
182 typedef Y range_type;
│ │ │ │ +
184 typedef typename X::field_type field_type;
│ │ │ │ + │ │ │ │ +
187
│ │ │ │ +
│ │ │ │ +
197 ParSSOR (const matrix_type& A, int n, field_type w, const communication_type& c)
│ │ │ │ +
198 : _A_(A), _n(n), _w(w), communication(c)
│ │ │ │ +
199 { }
│ │ │ │ +
│ │ │ │ +
200
│ │ │ │ +
│ │ │ │ +
206 virtual void pre (X& x, [[maybe_unused]] Y& b)
│ │ │ │ +
207 {
│ │ │ │ +
208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent
│ │ │ │ +
209 }
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
│ │ │ │ +
216 virtual void apply (X& v, const Y& d)
│ │ │ │ +
217 {
│ │ │ │ +
218 for (int i=0; i<_n; i++) {
│ │ │ │ +
219 bsorf(_A_,v,d,_w);
│ │ │ │ +
220 bsorb(_A_,v,d,_w);
│ │ │ │ +
221 }
│ │ │ │ +
222 communication.copyOwnerToAll(v,v);
│ │ │ │
223 }
│ │ │ │
│ │ │ │
224
│ │ │ │ -
│ │ │ │ -
226 operator SuperMatrix&()
│ │ │ │ -
227 {
│ │ │ │ -
228 return A;
│ │ │ │ -
229 }
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
│ │ │ │ -
232 operator const SuperMatrix&() const
│ │ │ │ -
233 {
│ │ │ │ -
234 return A;
│ │ │ │ -
235 }
│ │ │ │ -
│ │ │ │ -
236
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
238 {
│ │ │ │ -
239 if (this->N_ + this->M_ + this->Nnz_!=0)
│ │ │ │ -
240 free();
│ │ │ │ -
241
│ │ │ │ -
242 using Matrix = BCRSMatrix<B,TA>;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
245 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
│ │ │ │ -
246
│ │ │ │ -
247 copyToBCCSMatrix(initializer, mat);
│ │ │ │ +
230 virtual void post ([[maybe_unused]] X& x) {}
│ │ │ │ +
231
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
234 {
│ │ │ │ + │ │ │ │ +
236 }
│ │ │ │ +
│ │ │ │ +
237
│ │ │ │ +
238 private:
│ │ │ │ +
240 const matrix_type& _A_;
│ │ │ │ +
242 int _n;
│ │ │ │ +
244 field_type _w;
│ │ │ │ +
246 const communication_type& communication;
│ │ │ │ +
247 };
│ │ │ │ +
│ │ │ │
248
│ │ │ │ - │ │ │ │ -
250 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
│ │ │ │ -
251 this->values,this->rowindex, this->colstart, SLU_NC,
│ │ │ │ -
252 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
│ │ │ │ -
253 return *this;
│ │ │ │ -
254 }
│ │ │ │ -
│ │ │ │ -
255
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
257 {
│ │ │ │ -
258 if (this->N_ + this->M_ + this->Nnz_!=0)
│ │ │ │ -
259 free();
│ │ │ │ -
260
│ │ │ │ -
261 using Matrix = BCRSMatrix<B,TA>;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
264 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
│ │ │ │ -
265
│ │ │ │ -
266 copyToBCCSMatrix(initializer, mat);
│ │ │ │ -
267
│ │ │ │ - │ │ │ │ -
269 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
│ │ │ │ -
270 this->values,this->rowindex, this->colstart, SLU_NC,
│ │ │ │ -
271 static_cast<Dtype_t>(GetSuperLUType<B>::type), SLU_GE);
│ │ │ │ -
272 return *this;
│ │ │ │ -
273 }
│ │ │ │ -
│ │ │ │ -
274
│ │ │ │ -
│ │ │ │ -
281 virtual void setMatrix(const Matrix& mat, const std::set<std::size_t>& mrs)
│ │ │ │ -
282 {
│ │ │ │ -
283 if(this->N_+this->M_+this->Nnz_!=0)
│ │ │ │ -
284 free();
│ │ │ │ -
285 this->N_=mrs.size()*MatrixDimension<typename Matrix::block_type>::rowdim(*(mat[0].begin()));
│ │ │ │ -
286 this->M_=mrs.size()*MatrixDimension<typename Matrix::block_type>::coldim(*(mat[0].begin()));
│ │ │ │ -
287 SuperMatrixInitializer<Matrix> initializer(*this);
│ │ │ │ -
288
│ │ │ │ -
289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(mat,mrs));
│ │ │ │ -
290 }
│ │ │ │ -
│ │ │ │ -
291
│ │ │ │ -
│ │ │ │ -
293 virtual void setMatrix(const Matrix& mat)
│ │ │ │ -
294 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
297 SuperMatrixInitializer<Matrix> initializer(*this);
│ │ │ │ +
249 namespace Amg
│ │ │ │ +
250 {
│ │ │ │ +
251 template<class T> struct ConstructionTraits;
│ │ │ │ +
252 }
│ │ │ │ +
253
│ │ │ │ +
277 template<class X, class Y, class C, class P=Preconditioner<X,Y> >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
279 friend struct Amg::ConstructionTraits<BlockPreconditioner<X,Y,C,P> >;
│ │ │ │ +
280 public:
│ │ │ │ +
285 typedef X domain_type;
│ │ │ │ +
290 typedef Y range_type;
│ │ │ │ +
292 typedef typename X::field_type field_type;
│ │ │ │ + │ │ │ │
298
│ │ │ │ -
299 copyToBCCSMatrix(initializer, mat);
│ │ │ │ -
300 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
│ │ │ │ +
308 { }
│ │ │ │ +
│ │ │ │ +
309
│ │ │ │ +
│ │ │ │ +
317 BlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
│ │ │ │ +
318 : _preconditioner(p), _communication(c)
│ │ │ │ +
319 { }
│ │ │ │
│ │ │ │ -
301
│ │ │ │ -
│ │ │ │ -
303 virtual void free()
│ │ │ │ -
304 {
│ │ │ │ -
305 ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>::free();
│ │ │ │ -
306 SUPERLU_FREE(A.Store);
│ │ │ │ -
307 }
│ │ │ │ -
│ │ │ │ -
308 private:
│ │ │ │ -
309 SuperMatrix A;
│ │ │ │ -
310 };
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
312 template<class B, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
314 : public ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>
│ │ │ │ -
315 {
│ │ │ │ -
316 template<class I, class S, class D>
│ │ │ │ - │ │ │ │ -
318 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
321
│ │ │ │ -
│ │ │ │ -
322 SuperMatrixInitializer(SuperLUMatrix& lum) : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>(lum)
│ │ │ │ -
323 ,slumat(&lum)
│ │ │ │ -
324 {}
│ │ │ │ -
│ │ │ │ -
325
│ │ │ │ +
320
│ │ │ │
│ │ │ │ -
326 SuperMatrixInitializer() : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>()
│ │ │ │ -
327 {}
│ │ │ │ -
│ │ │ │ -
328
│ │ │ │ -
│ │ │ │ -
329 virtual void createMatrix() const
│ │ │ │ -
330 {
│ │ │ │ -
331 ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>::createMatrix();
│ │ │ │ - │ │ │ │ -
333 ::create(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],
│ │ │ │ -
334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,
│ │ │ │ -
335 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
│ │ │ │ -
336 }
│ │ │ │ -
│ │ │ │ -
337 private:
│ │ │ │ -
338 SuperLUMatrix* slumat;
│ │ │ │ -
339 };
│ │ │ │ -
│ │ │ │ -
340}
│ │ │ │ -
341#endif // HAVE_SUPERLU
│ │ │ │ -
342#endif
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
STL namespace.
│ │ │ │ +
326 virtual void pre (X& x, Y& b)
│ │ │ │ +
327 {
│ │ │ │ +
328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent
│ │ │ │ +
329 _preconditioner->pre(x,b);
│ │ │ │ +
330 }
│ │ │ │ +
│ │ │ │ +
331
│ │ │ │ +
│ │ │ │ +
337 virtual void apply (X& v, const Y& d)
│ │ │ │ +
338 {
│ │ │ │ +
339 _preconditioner->apply(v,d);
│ │ │ │ +
340 _communication.copyOwnerToAll(v,v);
│ │ │ │ +
341 }
│ │ │ │ +
│ │ │ │ +
342
│ │ │ │ +
343 template<bool forward>
│ │ │ │ +
│ │ │ │ +
344 void apply (X& v, const Y& d)
│ │ │ │ +
345 {
│ │ │ │ +
346 _preconditioner->template apply<forward>(v,d);
│ │ │ │ +
347 _communication.copyOwnerToAll(v,v);
│ │ │ │ +
348 }
│ │ │ │ +
│ │ │ │ +
349
│ │ │ │ +
│ │ │ │ +
355 virtual void post (X& x)
│ │ │ │ +
356 {
│ │ │ │ +
357 _preconditioner->post(x);
│ │ │ │ +
358 }
│ │ │ │ +
│ │ │ │ +
359
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
362 {
│ │ │ │ + │ │ │ │ +
364 }
│ │ │ │ +
│ │ │ │ +
365
│ │ │ │ +
366 private:
│ │ │ │ +
368 std::shared_ptr<P> _preconditioner;
│ │ │ │ +
369
│ │ │ │ +
371 const communication_type& _communication;
│ │ │ │ +
372 };
│ │ │ │ +
│ │ │ │ +
373
│ │ │ │ +
376} // end namespace
│ │ │ │ +
377
│ │ │ │ +
378#endif
│ │ │ │ +
Define base class for scalar product and norm.
│ │ │ │ +
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ +
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
Define general preconditioner interface.
│ │ │ │ +
The incomplete LU factorization kernels.
│ │ │ │ +
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:646
│ │ │ │ +
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:634
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Initializer for SuperLU Matrices representing the subdomains.
Definition overlappingschwarz.hh:47
│ │ │ │ -
static auto coldim(const M &A)
Definition matrixutils.hh:219
│ │ │ │ -
static auto rowdim(const M &A)
Definition matrixutils.hh:214
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ -
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ -
Definition overlappingschwarz.hh:694
│ │ │ │ -
SuperLu Solver.
Definition superlu.hh:271
│ │ │ │ -
Definition supermatrix.hh:26
│ │ │ │ -
Definition supermatrix.hh:30
│ │ │ │ -
Definition supermatrix.hh:126
│ │ │ │ -
static const Dtype_t type
Definition supermatrix.hh:127
│ │ │ │ -
Definition supermatrix.hh:132
│ │ │ │ -
double float_type
Definition supermatrix.hh:144
│ │ │ │ -
float float_type
Definition supermatrix.hh:151
│ │ │ │ -
double float_type
Definition supermatrix.hh:158
│ │ │ │ -
float float_type
Definition supermatrix.hh:165
│ │ │ │ -
Utility class for converting an ISTL Matrix into a SuperLU Matrix.
Definition supermatrix.hh:175
│ │ │ │ -
Definition supermatrix.hh:179
│ │ │ │ -
virtual void free()
free allocated space.
Definition supermatrix.hh:303
│ │ │ │ -
SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix< BCRSMatrix< B, TA > > &mat)
Definition supermatrix.hh:256
│ │ │ │ -
SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA > &mat)
Definition supermatrix.hh:237
│ │ │ │ -
SuperLUMatrix(const Matrix &mat)
Constructor that initializes the data.
Definition supermatrix.hh:212
│ │ │ │ -
virtual void setMatrix(const Matrix &mat)
Initialize data from given matrix.
Definition supermatrix.hh:293
│ │ │ │ -
SuperLUMatrix()
Definition supermatrix.hh:215
│ │ │ │ -
Matrix::size_type size_type
Definition supermatrix.hh:206
│ │ │ │ -
BCRSMatrix< B, TA > Matrix
The type of the matrix to convert.
Definition supermatrix.hh:202
│ │ │ │ -
virtual void setMatrix(const Matrix &mat, const std::set< std::size_t > &mrs)
Initialize data from a given set of matrix rows and columns.
Definition supermatrix.hh:281
│ │ │ │ -
virtual ~SuperLUMatrix()
Destructor.
Definition supermatrix.hh:219
│ │ │ │ -
Dune::SuperLUMatrix< Matrix > SuperLUMatrix
Definition supermatrix.hh:320
│ │ │ │ -
BCRSMatrix< B, A > Matrix
Definition supermatrix.hh:319
│ │ │ │ -
SuperMatrixInitializer()
Definition supermatrix.hh:326
│ │ │ │ -
virtual void createMatrix() const
Definition supermatrix.hh:329
│ │ │ │ -
SuperMatrixInitializer(SuperLUMatrix &lum)
Definition supermatrix.hh:322
│ │ │ │ +
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ +
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ +
const communication_type & getCommunication() const
Get the object responsible for communication.
Definition schwarz.hh:146
│ │ │ │ +
virtual const matrix_type & getmat() const
get the sequential assembled linear operator.
Definition schwarz.hh:133
│ │ │ │ +
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
apply operator to x, scale and add:
Definition schwarz.hh:125
│ │ │ │ +
virtual void apply(const X &x, Y &y) const
apply operator to x:
Definition schwarz.hh:116
│ │ │ │ +
C communication_type
The type of the communication object.
Definition schwarz.hh:98
│ │ │ │ +
X domain_type
The type of the domain.
Definition schwarz.hh:86
│ │ │ │ +
M matrix_type
The type of the matrix we operate on.
Definition schwarz.hh:81
│ │ │ │ +
Y range_type
The type of the range.
Definition schwarz.hh:91
│ │ │ │ +
X::field_type field_type
The field type of the range.
Definition schwarz.hh:93
│ │ │ │ +
OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
constructor: just store a reference to a matrix.
Definition schwarz.hh:107
│ │ │ │ +
OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const communication_type &com)
Definition schwarz.hh:111
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the linear operator (see SolverCategory::Category)
Definition schwarz.hh:139
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
A parallel SSOR preconditioner.
Definition schwarz.hh:175
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition schwarz.hh:184
│ │ │ │ +
C communication_type
The type of the communication object.
Definition schwarz.hh:186
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition schwarz.hh:233
│ │ │ │ +
ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c)
Constructor.
Definition schwarz.hh:197
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition schwarz.hh:230
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition schwarz.hh:180
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition schwarz.hh:182
│ │ │ │ +
M matrix_type
The matrix type the preconditioner is for.
Definition schwarz.hh:178
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the precondtioner.
Definition schwarz.hh:216
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition schwarz.hh:206
│ │ │ │ +
Block parallel preconditioner.
Definition schwarz.hh:278
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition schwarz.hh:326
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition schwarz.hh:285
│ │ │ │ +
BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
Constructor.
Definition schwarz.hh:317
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition schwarz.hh:337
│ │ │ │ +
BlockPreconditioner(P &p, const communication_type &c)
Constructor.
Definition schwarz.hh:306
│ │ │ │ +
void apply(X &v, const Y &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition schwarz.hh:344
│ │ │ │ +
C communication_type
The type of the communication object..
Definition schwarz.hh:297
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition schwarz.hh:292
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition schwarz.hh:355
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition schwarz.hh:290
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition schwarz.hh:361
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,461 +1,395 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -supermatrix.hh │ │ │ │ │ +schwarz.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SUPERMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_SUPERMATRIX_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_SCHWARZ_HH │ │ │ │ │ +6#define DUNE_ISTL_SCHWARZ_HH │ │ │ │ │ 7 │ │ │ │ │ -8#if HAVE_SUPERLU │ │ │ │ │ -9 │ │ │ │ │ -10#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -11#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ +8#include // for input/output to shell │ │ │ │ │ +9#include // for input/output to files │ │ │ │ │ +10#include // STL vector class │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include // Yes, we do some math here │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ -17#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e │ │ │ │ │ -22{ │ │ │ │ │ -23 │ │ │ │ │ -24 template │ │ │ │ │ -_2_5 struct _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r │ │ │ │ │ -26 {}; │ │ │ │ │ -27 │ │ │ │ │ -28 template │ │ │ │ │ -_2_9 struct _S_u_p_e_r_M_a_t_r_i_x_P_r_i_n_t_e_r │ │ │ │ │ -30 {}; │ │ │ │ │ +17#include "_i_o_._h_h" │ │ │ │ │ +18#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +19#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +20#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +21#include "_i_o_._h_h" │ │ │ │ │ +22#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +23#include "_i_l_u_._h_h" │ │ │ │ │ +24#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ +25#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ +26#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ +27#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ +28#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ +29 │ │ │ │ │ +30namespace _D_u_n_e { │ │ │ │ │ 31 │ │ │ │ │ -32#if __has_include("slu_sdefs.h") │ │ │ │ │ -33 template<> │ │ │ │ │ -34 struct _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r │ │ │ │ │ -35 { │ │ │ │ │ -36 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ -37 float *values, int *rowindex, int* colindex, │ │ │ │ │ -38 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -39 { │ │ │ │ │ -40 sCreate_CompCol_Matrix(_m_a_t, n, m, offset, values, rowindex, colindex, │ │ │ │ │ -41 stype, dtype, mtype); │ │ │ │ │ -42 } │ │ │ │ │ -43 }; │ │ │ │ │ -44 │ │ │ │ │ -45 template<> │ │ │ │ │ -46 struct SuperMatrixPrinter │ │ │ │ │ -47 { │ │ │ │ │ -48 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ -49 { │ │ │ │ │ -50 sPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ -51 } │ │ │ │ │ -52 }; │ │ │ │ │ -53#endif │ │ │ │ │ -54 │ │ │ │ │ -55#if __has_include("slu_ddefs.h") │ │ │ │ │ -56 template<> │ │ │ │ │ -57 struct SuperMatrixCreateSparseChooser │ │ │ │ │ -58 { │ │ │ │ │ -59 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ -60 double *values, int *rowindex, int* colindex, │ │ │ │ │ -61 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -62 { │ │ │ │ │ -63 dCreate_CompCol_Matrix(_m_a_t, n, m, offset, values, rowindex, colindex, │ │ │ │ │ -64 stype, dtype, mtype); │ │ │ │ │ -65 } │ │ │ │ │ -66 }; │ │ │ │ │ -67 │ │ │ │ │ -68 template<> │ │ │ │ │ -69 struct SuperMatrixPrinter │ │ │ │ │ -70 { │ │ │ │ │ -71 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ -72 { │ │ │ │ │ -73 dPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ -74 } │ │ │ │ │ -75 }; │ │ │ │ │ -76#endif │ │ │ │ │ -77 │ │ │ │ │ -78#if __has_include("slu_cdefs.h") │ │ │ │ │ -79 template<> │ │ │ │ │ -80 struct SuperMatrixCreateSparseChooser<_s_t_d::complex > │ │ │ │ │ -81 { │ │ │ │ │ -82 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ -83 std::complex *values, int *rowindex, int* colindex, │ │ │ │ │ -84 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -85 { │ │ │ │ │ -86 cCreate_CompCol_Matrix(_m_a_t, n, m, offset, reinterpret_cast< ::complex*> │ │ │ │ │ -(values), │ │ │ │ │ -87 rowindex, colindex, stype, dtype, mtype); │ │ │ │ │ -88 } │ │ │ │ │ -89 }; │ │ │ │ │ -90 │ │ │ │ │ -91 template<> │ │ │ │ │ -92 struct SuperMatrixPrinter<_s_t_d::complex > │ │ │ │ │ -93 { │ │ │ │ │ -94 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ -95 { │ │ │ │ │ -96 cPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ -97 } │ │ │ │ │ -98 }; │ │ │ │ │ -99#endif │ │ │ │ │ -100 │ │ │ │ │ -101#if __has_include("slu_zdefs.h") │ │ │ │ │ -102 template<> │ │ │ │ │ -103 struct SuperMatrixCreateSparseChooser<_s_t_d::complex > │ │ │ │ │ -104 { │ │ │ │ │ -105 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ -106 std::complex *values, int *rowindex, int* colindex, │ │ │ │ │ -107 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ -108 { │ │ │ │ │ -109 zCreate_CompCol_Matrix(_m_a_t, n, m, offset, reinterpret_cast │ │ │ │ │ -(values), │ │ │ │ │ -110 rowindex, colindex, stype, dtype, mtype); │ │ │ │ │ -111 } │ │ │ │ │ -112 }; │ │ │ │ │ -113 │ │ │ │ │ -114 template<> │ │ │ │ │ -115 struct SuperMatrixPrinter<_s_t_d::complex > │ │ │ │ │ -116 { │ │ │ │ │ -117 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ -118 { │ │ │ │ │ -119 zPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ -120 } │ │ │ │ │ -121 }; │ │ │ │ │ -122#endif │ │ │ │ │ +73 template │ │ │ │ │ +_7_4 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r : public _A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +75 { │ │ │ │ │ +76 public: │ │ │ │ │ +_8_1 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_8_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_9_1 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_9_3 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_9_8 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ +99 │ │ │ │ │ +_1_0_7 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (const _m_a_t_r_i_x___t_y_p_e& A, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& │ │ │ │ │ +com) │ │ │ │ │ +108 : _A_(stackobject_to_shared_ptr(A)), communication(com) │ │ │ │ │ +109 {} │ │ │ │ │ +110 │ │ │ │ │ +_1_1_1 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (const std::shared_ptr A, const │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com) │ │ │ │ │ +112 : _A_(A), communication(com) │ │ │ │ │ +113 {} │ │ │ │ │ +114 │ │ │ │ │ +_1_1_6 virtual void _a_p_p_l_y (const X& x, Y& y) const │ │ │ │ │ +117 { │ │ │ │ │ +118 y = 0; │ │ │ │ │ +119 _A_->umv(x,y); // result is consistent on interior+border │ │ │ │ │ +120 communication.project(y); // we want this here to avoid it before the │ │ │ │ │ +preconditioner │ │ │ │ │ +121 // since there d is const! │ │ │ │ │ +122 } │ │ │ │ │ 123 │ │ │ │ │ -124 template │ │ │ │ │ -_1_2_5 struct _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +_1_2_5 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (_f_i_e_l_d___t_y_p_e alpha, const X& x, Y& y) const │ │ │ │ │ 126 { │ │ │ │ │ -_1_2_7 static const Dtype_t _t_y_p_e; │ │ │ │ │ -128 }; │ │ │ │ │ -129 │ │ │ │ │ -130 template │ │ │ │ │ -_1_3_1 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -132 {}; │ │ │ │ │ -133 │ │ │ │ │ -134 template │ │ │ │ │ -135 const Dtype_t _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e = │ │ │ │ │ -136 std::is_same::value ? SLU_S : │ │ │ │ │ -137 ( std::is_same >::value ? SLU_Z : │ │ │ │ │ -138 ( std::is_same >::value ? SLU_C : SLU_D )); │ │ │ │ │ -139 │ │ │ │ │ -140 template<> │ │ │ │ │ -_1_4_1 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -142 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -143 { │ │ │ │ │ -_1_4_4 typedef double _f_l_o_a_t___t_y_p_e; │ │ │ │ │ -145 }; │ │ │ │ │ -146 │ │ │ │ │ -147 template<> │ │ │ │ │ -_1_4_8 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -149 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -150 { │ │ │ │ │ -_1_5_1 typedef float _f_l_o_a_t___t_y_p_e; │ │ │ │ │ -152 }; │ │ │ │ │ -153 │ │ │ │ │ -154 template<> │ │ │ │ │ -_1_5_5 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e<_s_t_d::complex > │ │ │ │ │ -156 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e > │ │ │ │ │ -157 { │ │ │ │ │ -_1_5_8 typedef double _f_l_o_a_t___t_y_p_e; │ │ │ │ │ -159 }; │ │ │ │ │ -160 │ │ │ │ │ -161 template<> │ │ │ │ │ -_1_6_2 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e<_s_t_d::complex > │ │ │ │ │ -163 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e > │ │ │ │ │ -164 { │ │ │ │ │ -_1_6_5 typedef float _f_l_o_a_t___t_y_p_e; │ │ │ │ │ -166 │ │ │ │ │ -167 }; │ │ │ │ │ -168 │ │ │ │ │ -173 template │ │ │ │ │ -_1_7_4 struct _S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -175 {}; │ │ │ │ │ -176 │ │ │ │ │ -177 template │ │ │ │ │ -_1_7_8 struct _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -179 {}; │ │ │ │ │ -180 │ │ │ │ │ -181 template │ │ │ │ │ -182 class _S_u_p_e_r_L_U; │ │ │ │ │ -183 │ │ │ │ │ -184 template │ │ │ │ │ -185 class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ -186 │ │ │ │ │ -187 template │ │ │ │ │ -188 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r; │ │ │ │ │ -189 │ │ │ │ │ -193 template │ │ │ │ │ -_1_9_4 class _S_u_p_e_r_L_U_M_a_t_r_i_x<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -195 : public ISTL::Impl::BCCSMatrix::field_type, int> │ │ │ │ │ -196 { │ │ │ │ │ -197 template │ │ │ │ │ -_1_9_8 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ -199 friend struct _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r<_B_C_R_S_M_a_t_r_i_x >; │ │ │ │ │ -200 public: │ │ │ │ │ -_2_0_2 typedef _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> _M_a_t_r_i_x; │ │ │ │ │ -203 │ │ │ │ │ -204 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_S_u_p_e_r_L_U<_M_a_t_r_i_x>, true>; │ │ │ │ │ -205 │ │ │ │ │ -_2_0_6 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -207 │ │ │ │ │ -_2_1_2 explicit _S_u_p_e_r_L_U_M_a_t_r_i_x(const _M_a_t_r_i_x& _m_a_t) : ISTL::Impl:: │ │ │ │ │ -BCCSMatrix<_B_C_R_S_M_a_t_r_i_x, int>(_m_a_t) │ │ │ │ │ -213 {} │ │ │ │ │ -214 │ │ │ │ │ -_2_1_5 _S_u_p_e_r_L_U_M_a_t_r_i_x() : ISTL::Impl::BCCSMatrix:: │ │ │ │ │ -field_type, int>() │ │ │ │ │ -216 {} │ │ │ │ │ -217 │ │ │ │ │ -_2_1_9 virtual _~_S_u_p_e_r_L_U_M_a_t_r_i_x() │ │ │ │ │ -220 { │ │ │ │ │ -221 if (this->N_+this->M_*this->Nnz_ != 0) │ │ │ │ │ -222 free(); │ │ │ │ │ +127 _A_->usmv(alpha,x,y); // result is consistent on interior+border │ │ │ │ │ +128 communication.project(y); // we want this here to avoid it before the │ │ │ │ │ +preconditioner │ │ │ │ │ +129 // since there d is const! │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +_1_3_3 virtual const _m_a_t_r_i_x___t_y_p_e& _g_e_t_m_a_t () const │ │ │ │ │ +134 { │ │ │ │ │ +135 return *_A_; │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +_1_3_9 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +140 { │ │ │ │ │ +141 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ +142 } │ │ │ │ │ +143 │ │ │ │ │ +144 │ │ │ │ │ +_1_4_6 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n() const │ │ │ │ │ +147 { │ │ │ │ │ +148 return communication; │ │ │ │ │ +149 } │ │ │ │ │ +150 private: │ │ │ │ │ +151 const std::shared_ptr_A_; │ │ │ │ │ +152 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& communication; │ │ │ │ │ +153 }; │ │ │ │ │ +154 │ │ │ │ │ +157 /* │ │ │ │ │ +158 * @addtogroup ISTL_Prec │ │ │ │ │ +159 * @{ │ │ │ │ │ +160 */ │ │ │ │ │ +174 template │ │ │ │ │ +_1_7_5 class _P_a_r_S_S_O_R : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +176 public: │ │ │ │ │ +_1_7_8 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_1_8_0 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_8_2 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_1_8_4 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_8_6 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ +187 │ │ │ │ │ +_1_9_7 _P_a_r_S_S_O_R (const _m_a_t_r_i_x___t_y_p_e& A, int n, _f_i_e_l_d___t_y_p_e w, const │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ +198 : _A_(A), _n(n), _w(w), communication(c) │ │ │ │ │ +199 { } │ │ │ │ │ +200 │ │ │ │ │ +_2_0_6 virtual void _p_r_e (X& x, [[maybe_unused]] Y& b) │ │ │ │ │ +207 { │ │ │ │ │ +208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent │ │ │ │ │ +209 } │ │ │ │ │ +210 │ │ │ │ │ +_2_1_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +217 { │ │ │ │ │ +218 for (int i=0; i<_n; i++) { │ │ │ │ │ +219 _b_s_o_r_f(_A_,v,d,_w); │ │ │ │ │ +220 _b_s_o_r_b(_A_,v,d,_w); │ │ │ │ │ +221 } │ │ │ │ │ +222 communication.copyOwnerToAll(v,v); │ │ │ │ │ 223 } │ │ │ │ │ 224 │ │ │ │ │ -_2_2_6 operator SuperMatrix&() │ │ │ │ │ -227 { │ │ │ │ │ -228 return A; │ │ │ │ │ -229 } │ │ │ │ │ -230 │ │ │ │ │ -_2_3_2 operator const SuperMatrix&() const │ │ │ │ │ -233 { │ │ │ │ │ -234 return A; │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -_2_3_7 _S_u_p_e_r_L_U_M_a_t_r_i_x_<_B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> >& _o_p_e_r_a_t_o_r_=(const _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_>& _m_a_t) │ │ │ │ │ -238 { │ │ │ │ │ -239 if (this->N_ + this->M_ + this->Nnz_!=0) │ │ │ │ │ -240 free(); │ │ │ │ │ -241 │ │ │ │ │ -242 using _M_a_t_r_i_x = _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_>; │ │ │ │ │ -243 this->N_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t); │ │ │ │ │ -244 this->M_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t); │ │ │ │ │ -245 ISTL::Impl::BCCSMatrixInitializer initializer(*this); │ │ │ │ │ -246 │ │ │ │ │ -247 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ +_2_3_0 virtual void _p_o_s_t ([[maybe_unused]] X& x) {} │ │ │ │ │ +231 │ │ │ │ │ +_2_3_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +234 { │ │ │ │ │ +235 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ +236 } │ │ │ │ │ +237 │ │ │ │ │ +238 private: │ │ │ │ │ +240 const _m_a_t_r_i_x___t_y_p_e& _A_; │ │ │ │ │ +242 int _n; │ │ │ │ │ +244 _f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ +_2_4_6 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& communication; │ │ │ │ │ +247 }; │ │ │ │ │ 248 │ │ │ │ │ -249 _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ -250_ _:_:_c_r_e_a_t_e(&A, this->N_, this->M_, this->colstart[this->N_], │ │ │ │ │ -251 this->values,this->rowindex, this->colstart, SLU_NC, │ │ │ │ │ -252 static_cast(_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_>_:_:_t_y_p_e), │ │ │ │ │ -SLU_GE); │ │ │ │ │ -253 return *this; │ │ │ │ │ -254 } │ │ │ │ │ -255 │ │ │ │ │ -_2_5_6 _S_u_p_e_r_L_U_M_a_t_r_i_x_<_B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> >& _o_p_e_r_a_t_o_r_=(const _S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -<_B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> >& _m_a_t) │ │ │ │ │ -257 { │ │ │ │ │ -258 if (this->N_ + this->M_ + this->Nnz_!=0) │ │ │ │ │ -259 free(); │ │ │ │ │ -260 │ │ │ │ │ -261 using _M_a_t_r_i_x = _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_>; │ │ │ │ │ -262 this->N_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t); │ │ │ │ │ -263 this->M_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t); │ │ │ │ │ -264 ISTL::Impl::BCCSMatrixInitializer initializer(*this); │ │ │ │ │ -265 │ │ │ │ │ -266 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ -267 │ │ │ │ │ -268 _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_B_> │ │ │ │ │ -269_ _:_:_c_r_e_a_t_e(&A, this->N_, this->M_, this->colstart[this->N_], │ │ │ │ │ -270 this->values,this->rowindex, this->colstart, SLU_NC, │ │ │ │ │ -271 static_cast(_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_B_>_:_:_t_y_p_e), SLU_GE); │ │ │ │ │ -272 return *this; │ │ │ │ │ -273 } │ │ │ │ │ -274 │ │ │ │ │ -_2_8_1 virtual void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& _m_a_t, const std::set& mrs) │ │ │ │ │ -282 { │ │ │ │ │ -283 if(this->N_+this->M_+this->Nnz_!=0) │ │ │ │ │ -284 free(); │ │ │ │ │ -285 this->N_=mrs.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e_>_:_:_r_o_w_d_i_m(* │ │ │ │ │ -(_m_a_t[0].begin())); │ │ │ │ │ -286 this->M_=mrs.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e_>_:_:_c_o_l_d_i_m(* │ │ │ │ │ -(_m_a_t[0].begin())); │ │ │ │ │ -287 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_M_a_t_r_i_x_> initializer(*this); │ │ │ │ │ -288 │ │ │ │ │ -289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_M_a_t_r_i_x,std:: │ │ │ │ │ -set >(_m_a_t,mrs)); │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -_2_9_3 virtual void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& _m_a_t) │ │ │ │ │ -294 { │ │ │ │ │ -295 this->N_=_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t); │ │ │ │ │ -296 this->M_=_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t); │ │ │ │ │ -297 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_M_a_t_r_i_x_> initializer(*this); │ │ │ │ │ +249 namespace Amg │ │ │ │ │ +250 { │ │ │ │ │ +251 template struct ConstructionTraits; │ │ │ │ │ +252 } │ │ │ │ │ +253 │ │ │ │ │ +277 template > │ │ │ │ │ +_2_7_8 class _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +279 friend struct Amg::ConstructionTraits<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r >; │ │ │ │ │ +280 public: │ │ │ │ │ +_2_8_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_2_9_0 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_2_9_2 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_9_7 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ 298 │ │ │ │ │ -299 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ -300 } │ │ │ │ │ -301 │ │ │ │ │ -_3_0_3 virtual void _f_r_e_e() │ │ │ │ │ -304 { │ │ │ │ │ -305 ISTL::Impl::BCCSMatrix::field_type, int>::free(); │ │ │ │ │ -306 SUPERLU_FREE(A.Store); │ │ │ │ │ -307 } │ │ │ │ │ -308 private: │ │ │ │ │ -309 SuperMatrix A; │ │ │ │ │ -310 }; │ │ │ │ │ -311 │ │ │ │ │ -312 template │ │ │ │ │ -_3_1_3 class _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -314 : public ISTL::Impl::BCCSMatrixInitializer, int> │ │ │ │ │ -315 { │ │ │ │ │ -316 template │ │ │ │ │ -_3_1_7 friend class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -318 public: │ │ │ │ │ -_3_1_9 typedef _B_C_R_S_M_a_t_r_i_x_<_B_,_A_> _M_a_t_r_i_x; │ │ │ │ │ -_3_2_0 typedef _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_M_a_t_r_i_x_> _S_u_p_e_r_L_U_M_a_t_r_i_x; │ │ │ │ │ -321 │ │ │ │ │ -_3_2_2 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r(_S_u_p_e_r_L_U_M_a_t_r_i_x& lum) : ISTL::Impl:: │ │ │ │ │ -BCCSMatrixInitializer<_B_C_R_S_M_a_t_r_i_x, int>(lum) │ │ │ │ │ -323 ,slumat(&lum) │ │ │ │ │ -324 {} │ │ │ │ │ -325 │ │ │ │ │ -_3_2_6 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r() : ISTL::Impl:: │ │ │ │ │ -BCCSMatrixInitializer<_B_C_R_S_M_a_t_r_i_x, int>() │ │ │ │ │ -327 {} │ │ │ │ │ -328 │ │ │ │ │ -_3_2_9 virtual void _c_r_e_a_t_e_M_a_t_r_i_x() const │ │ │ │ │ -330 { │ │ │ │ │ -331 ISTL::Impl::BCCSMatrixInitializer, int>::createMatrix(); │ │ │ │ │ -332 _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ -333_ _:_:_c_r_e_a_t_e(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols], │ │ │ │ │ -334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC, │ │ │ │ │ -335 static_cast(_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_>_:_:_t_y_p_e), │ │ │ │ │ -SLU_GE); │ │ │ │ │ -336 } │ │ │ │ │ -337 private: │ │ │ │ │ -338 _S_u_p_e_r_L_U_M_a_t_r_i_x* slumat; │ │ │ │ │ -339 }; │ │ │ │ │ -340} │ │ │ │ │ -341#endif // HAVE_SUPERLU │ │ │ │ │ -342#endif │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h │ │ │ │ │ -_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ +_3_0_6 _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (P& p, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ +307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c) │ │ │ │ │ +308 { } │ │ │ │ │ +309 │ │ │ │ │ +_3_1_7 _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (const std::shared_ptr

& p, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& │ │ │ │ │ +c) │ │ │ │ │ +318 : _preconditioner(p), _communication(c) │ │ │ │ │ +319 { } │ │ │ │ │ +320 │ │ │ │ │ +_3_2_6 virtual void _p_r_e (X& x, Y& b) │ │ │ │ │ +327 { │ │ │ │ │ +328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent │ │ │ │ │ +329 _preconditioner->pre(x,b); │ │ │ │ │ +330 } │ │ │ │ │ +331 │ │ │ │ │ +_3_3_7 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +338 { │ │ │ │ │ +339 _preconditioner->apply(v,d); │ │ │ │ │ +340 _communication.copyOwnerToAll(v,v); │ │ │ │ │ +341 } │ │ │ │ │ +342 │ │ │ │ │ +343 template │ │ │ │ │ +_3_4_4 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +345 { │ │ │ │ │ +346 _preconditioner->template apply(v,d); │ │ │ │ │ +347 _communication.copyOwnerToAll(v,v); │ │ │ │ │ +348 } │ │ │ │ │ +349 │ │ │ │ │ +_3_5_5 virtual void _p_o_s_t (X& x) │ │ │ │ │ +356 { │ │ │ │ │ +357 _preconditioner->post(x); │ │ │ │ │ +358 } │ │ │ │ │ +359 │ │ │ │ │ +_3_6_1 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +362 { │ │ │ │ │ +363 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ +364 } │ │ │ │ │ +365 │ │ │ │ │ +366 private: │ │ │ │ │ +368 std::shared_ptr

_preconditioner; │ │ │ │ │ +369 │ │ │ │ │ +371 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _communication; │ │ │ │ │ +372 }; │ │ │ │ │ +373 │ │ │ │ │ +376} // end namespace │ │ │ │ │ +377 │ │ │ │ │ +378#endif │ │ │ │ │ +_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +_i_o_._h_h │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ +_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_g_s_e_t_c_._h_h │ │ │ │ │ +Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ +generic way. │ │ │ │ │ +_v_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +??? │ │ │ │ │ _b_v_e_c_t_o_r_._h_h │ │ │ │ │ This file implements a vector space as a tensor product of a given vector │ │ │ │ │ space. The number of compon... │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ +_i_l_u_._h_h │ │ │ │ │ +The incomplete LU factorization kernels. │ │ │ │ │ +_D_u_n_e_:_:_b_s_o_r_b │ │ │ │ │ +void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +SSOR step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:646 │ │ │ │ │ +_D_u_n_e_:_:_b_s_o_r_f │ │ │ │ │ +void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +SOR step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:634 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_c_o_l_d_i_m │ │ │ │ │ -static auto coldim(const M &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_r_o_w_d_i_m │ │ │ │ │ -static auto rowdim(const M &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access and the size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -Sequential overlapping Schwarz preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U │ │ │ │ │ -SuperLu Solver. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:26 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_P_r_i_n_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e_:_:_t_y_p_e │ │ │ │ │ -static const Dtype_t type │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _d_o_u_b_l_e_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ -double float_type │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _f_l_o_a_t_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ -float float_type │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ -double float_type │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ -float float_type │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -Utility class for converting an ISTL Matrix into a SuperLU Matrix. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_f_r_e_e │ │ │ │ │ -virtual void free() │ │ │ │ │ -free allocated space. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix< │ │ │ │ │ -BCRSMatrix< B, TA > > &mat) │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:256 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA > │ │ │ │ │ -&mat) │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:237 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -SuperLUMatrix(const Matrix &mat) │ │ │ │ │ -Constructor that initializes the data. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -virtual void setMatrix(const Matrix &mat) │ │ │ │ │ -Initialize data from given matrix. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -SuperLUMatrix() │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< B, TA > Matrix │ │ │ │ │ -The type of the matrix to convert. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -virtual void setMatrix(const Matrix &mat, const std::set< std::size_t > &mrs) │ │ │ │ │ -Initialize data from a given set of matrix rows and columns. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_~_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -virtual ~SuperLUMatrix() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ -Dune::SuperLUMatrix< Matrix > SuperLUMatrix │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:320 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< B, A > Matrix │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -SuperMatrixInitializer() │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_c_r_e_a_t_e_M_a_t_r_i_x │ │ │ │ │ -virtual void createMatrix() const │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -SuperMatrixInitializer(SuperLUMatrix &lum) │ │ │ │ │ -DDeeffiinniittiioonn supermatrix.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator exporting itself in matrix form. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +An overlapping Schwarz operator. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +const communication_type & getCommunication() const │ │ │ │ │ +Get the object responsible for communication. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_m_a_t │ │ │ │ │ +virtual const matrix_type & getmat() const │ │ │ │ │ +get the sequential assembled linear operator. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ +virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const │ │ │ │ │ +apply operator to x, scale and add: │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(const X &x, Y &y) const │ │ │ │ │ +apply operator to x: │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ +C communication_type │ │ │ │ │ +The type of the communication object. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:98 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The type of the domain. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The type of the matrix we operate on. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The type of the range. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the range. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com) │ │ │ │ │ +constructor: just store a reference to a matrix. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const │ │ │ │ │ +communication_type &com) │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:139 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R │ │ │ │ │ +A parallel SSOR preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ +C communication_type │ │ │ │ │ +The type of the communication object. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:233 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_P_a_r_S_S_O_R │ │ │ │ │ +ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:197 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the precondtioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_S_S_O_R_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Block parallel preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:278 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:326 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:285 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:317 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:337 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +BlockPreconditioner(P &p, const communication_type &c) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const Y &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:344 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ +C communication_type │ │ │ │ │ +The type of the communication object.. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:292 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:361 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ +@ overlapping │ │ │ │ │ +Category for overlapping solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:29 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00017.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: gsetc.hh File Reference │ │ │ │ +dune-istl: matrixmarket.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,194 +73,263 @@ │ │ │ │

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Enumerations | │ │ │ │ -Functions
│ │ │ │ -
gsetc.hh File Reference
│ │ │ │ +Functions | │ │ │ │ +Variables
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way. │ │ │ │ +

Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ +
#include <algorithm>
│ │ │ │ #include <complex>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <fstream>
│ │ │ │ +#include <ios>
│ │ │ │ #include <iostream>
│ │ │ │ -#include <iomanip>
│ │ │ │ +#include <istream>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <ostream>
│ │ │ │ +#include <set>
│ │ │ │ +#include <sstream>
│ │ │ │ #include <string>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ #include <dune/common/hybridutilities.hh>
│ │ │ │ -#include "multitypeblockvector.hh"
│ │ │ │ -#include "multitypeblockmatrix.hh"
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ +#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/bvector.hh>
│ │ │ │ +#include <dune/istl/matrixutils.hh>
│ │ │ │ +#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::BL< l >
 compile-time parameter for block recursion depth More...
struct  Dune::MatrixMarketImpl::mm_numeric_type< T >
 Helper metaprogram to get the matrix market string representation of the numeric type. More...
 
struct  Dune::algmeta_btsolve< I, diag, relax >
struct  Dune::MatrixMarketImpl::mm_numeric_type< int >
 
struct  Dune::algmeta_btsolve< 0, withdiag, withrelax >
struct  Dune::MatrixMarketImpl::mm_numeric_type< double >
 
struct  Dune::algmeta_btsolve< 0, withdiag, norelax >
struct  Dune::MatrixMarketImpl::mm_numeric_type< float >
 
struct  Dune::algmeta_btsolve< 0, nodiag, withrelax >
struct  Dune::MatrixMarketImpl::mm_numeric_type< std::complex< double > >
 
struct  Dune::algmeta_btsolve< 0, nodiag, norelax >
struct  Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > >
 
struct  Dune::algmeta_bdsolve< I, relax >
struct  Dune::MatrixMarketImpl::mm_header_printer< BCRSMatrix< T, A > >
 
struct  Dune::algmeta_bdsolve< 0, withrelax >
struct  Dune::MatrixMarketImpl::mm_header_printer< BlockVector< B, A > >
 
struct  Dune::algmeta_bdsolve< 0, norelax >
struct  Dune::MatrixMarketImpl::mm_header_printer< FieldVector< T, j > >
 
struct  Dune::algmeta_itsteps< I, M >
struct  Dune::MatrixMarketImpl::mm_header_printer< FieldMatrix< T, i, j > >
 
struct  Dune::algmeta_itsteps< 0, M >
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< T, A > >
 
struct  Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > >
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< FieldVector< T, i >, A > >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< T, A > >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< FieldMatrix< T, i, j >, A > >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< FieldMatrix< T, i, j > >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< FieldVector< T, i > >
 
struct  Dune::MatrixMarketImpl::MMHeader
 
struct  Dune::MatrixMarketImpl::IndexData< T >
 
struct  Dune::MatrixMarketImpl::NumericWrapper< T >
 a wrapper class of numeric values. More...
 
struct  Dune::MatrixMarketImpl::PatternDummy
 Utility class for marking the pattern type of the MatrixMarket matrices. More...
 
struct  Dune::MatrixMarketImpl::NumericWrapper< PatternDummy >
 
struct  Dune::MatrixMarketImpl::MatrixValuesSetter< D, brows, bcols >
 Functor to the data values of the matrix. More...
 
struct  Dune::MatrixMarketImpl::MatrixValuesSetter< PatternDummy, brows, bcols >
 
struct  Dune::MatrixMarketImpl::is_complex< T >
 
struct  Dune::MatrixMarketImpl::is_complex< std::complex< T > >
 
struct  Dune::MatrixMarketImpl::mm_multipliers< M >
 
struct  Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< B, A > >
 
struct  Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< FieldMatrix< B, i, j >, A > >
 
class  Dune::MatrixMarketFormatError
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::MatrixMarketImpl
 
│ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Enumerations

enum  Dune::WithDiagType { Dune::withdiag =1 │ │ │ │ -, Dune::nodiag =0 │ │ │ │ +
enum  Dune::MatrixMarketImpl::LineType { Dune::MatrixMarketImpl::MM_HEADER │ │ │ │ +, Dune::MatrixMarketImpl::MM_ISTLSTRUCT │ │ │ │ +, Dune::MatrixMarketImpl::DATA │ │ │ │ + }
 
enum  { Dune::MatrixMarketImpl::MM_MAX_LINE_LENGTH =1025 │ │ │ │ + }
 
enum  Dune::MatrixMarketImpl::MM_TYPE { Dune::MatrixMarketImpl::coordinate_type │ │ │ │ +, Dune::MatrixMarketImpl::array_type │ │ │ │ +, Dune::MatrixMarketImpl::unknown_type │ │ │ │ }
 
enum  Dune::WithRelaxType { Dune::withrelax =1 │ │ │ │ -, Dune::norelax =0 │ │ │ │ +
 
enum  Dune::MatrixMarketImpl::MM_CTYPE {
│ │ │ │ +  Dune::MatrixMarketImpl::integer_type │ │ │ │ +, Dune::MatrixMarketImpl::double_type │ │ │ │ +, Dune::MatrixMarketImpl::complex_type │ │ │ │ +, Dune::MatrixMarketImpl::pattern │ │ │ │ +,
│ │ │ │ +  Dune::MatrixMarketImpl::unknown_ctype │ │ │ │ +
│ │ │ │ }
 
 
enum  Dune::MatrixMarketImpl::MM_STRUCTURE {
│ │ │ │ +  Dune::MatrixMarketImpl::general │ │ │ │ +, Dune::MatrixMarketImpl::symmetric │ │ │ │ +, Dune::MatrixMarketImpl::skew_symmetric │ │ │ │ +, Dune::MatrixMarketImpl::hermitian │ │ │ │ +,
│ │ │ │ +  Dune::MatrixMarketImpl::unknown_structure │ │ │ │ +
│ │ │ │ + }
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Functions

template<class M , class X , class Y >
void Dune::bltsolve (const M &A, X &v, const Y &d)
 block lower triangular solve
 
template<class M , class X , class Y , class K >
void Dune::bltsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed block lower triangular solve
 
template<class M , class X , class Y >
void Dune::ubltsolve (const M &A, X &v, const Y &d)
 unit block lower triangular solve
 
template<class M , class X , class Y , class K >
void Dune::ubltsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed unit block lower triangular solve
 
template<class M , class X , class Y >
void Dune::butsolve (const M &A, X &v, const Y &d)
 block upper triangular solve
 
template<class M , class X , class Y , class K >
void Dune::butsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed block upper triangular solve
 
template<class M , class X , class Y >
void Dune::ubutsolve (const M &A, X &v, const Y &d)
 unit block upper triangular solve
 
template<class M , class X , class Y , class K >
void Dune::ubutsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed unit block upper triangular solve
 
template<class M , class X , class Y , int l>
void Dune::bltsolve (const M &A, X &v, const Y &d, BL< l >)
 block lower triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::bltsolve (const M &A, X &v, const Y &d, const K &w, BL< l >)
 relaxed block lower triangular solve
 
template<class M , class X , class Y , int l>
void Dune::ubltsolve (const M &A, X &v, const Y &d, BL< l >)
 unit block lower triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::ubltsolve (const M &A, X &v, const Y &d, const K &w, BL< l >)
 relaxed unit block lower triangular solve
 
template<class M , class X , class Y , int l>
void Dune::butsolve (const M &A, X &v, const Y &d, BL< l > bl)
 block upper triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::butsolve (const M &A, X &v, const Y &d, const K &w, BL< l > bl)
 relaxed block upper triangular solve
 
template<class M , class X , class Y , int l>
void Dune::ubutsolve (const M &A, X &v, const Y &d, BL< l > bl)
 unit block upper triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::ubutsolve (const M &A, X &v, const Y &d, const K &w, BL< l > bl)
 relaxed unit block upper triangular solve
 
template<class M , class X , class Y >
void Dune::bdsolve (const M &A, X &v, const Y &d)
 block diagonal solve, no relaxation
 
template<class M , class X , class Y , class K >
void Dune::bdsolve (const M &A, X &v, const Y &d, const K &w)
 block diagonal solve, with relaxation
 
template<class M , class X , class Y , int l>
void Dune::bdsolve (const M &A, X &v, const Y &d, BL< l >)
 block diagonal solve, no relaxation
 
template<class M , class X , class Y , class K , int l>
void Dune::bdsolve (const M &A, X &v, const Y &d, const K &w, BL< l >)
 block diagonal solve, with relaxation
 
template<class M , class X , class Y , class K >
void Dune::dbgs (const M &A, X &x, const Y &b, const K &w)
 GS step.
 
template<class M , class X , class Y , class K , int l>
void Dune::dbgs (const M &A, X &x, const Y &b, const K &w, BL< l >)
 GS step.
 
template<class M , class X , class Y , class K >
void Dune::bsorf (const M &A, X &x, const Y &b, const K &w)
 SOR step.
 
template<class M , class X , class Y , class K , int l>
void Dune::bsorf (const M &A, X &x, const Y &b, const K &w, BL< l >)
 SOR step.
 
template<class M , class X , class Y , class K >
void Dune::bsorb (const M &A, X &x, const Y &b, const K &w)
 SSOR step.
 
template<class M , class X , class Y , class K , int l>
void Dune::bsorb (const M &A, X &x, const Y &b, const K &w, BL< l >)
 Backward SOR step.
 
template<class M , class X , class Y , class K >
void Dune::dbjac (const M &A, X &x, const Y &b, const K &w)
 Jacobi step.
 
template<class M , class X , class Y , class K , int l>
void Dune::dbjac (const M &A, X &x, const Y &b, const K &w, BL< l >)
 Jacobi step.
 
bool Dune::MatrixMarketImpl::lineFeed (std::istream &file)
 
void Dune::MatrixMarketImpl::skipComments (std::istream &file)
 
bool Dune::MatrixMarketImpl::readMatrixMarketBanner (std::istream &file, MMHeader &mmHeader)
 
template<std::size_t brows, std::size_t bcols>
std::tuple< std::size_t, std::size_t, std::size_t > Dune::MatrixMarketImpl::calculateNNZ (std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader &header)
 
template<typename T >
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, NumericWrapper< T > &num)
 
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, NumericWrapper< PatternDummy > &num)
 
template<typename T >
bool Dune::MatrixMarketImpl::operator< (const IndexData< T > &i1, const IndexData< T > &i2)
 LessThan operator.
 
template<typename T >
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, IndexData< T > &data)
 Read IndexData from a stream.
 
template<typename T >
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, IndexData< NumericWrapper< std::complex< T > > > &data)
 Read IndexData from a stream. Specialization for std::complex.
 
template<class T >
std::enable_if_t<!is_complex< T >::value, T > Dune::MatrixMarketImpl::conj (const T &r)
 
template<class T >
std::enable_if_t< is_complex< T >::value, T > Dune::MatrixMarketImpl::conj (const T &r)
 
template<typename T , typename A , typename D >
void Dune::MatrixMarketImpl::readSparseEntries (Dune::BCRSMatrix< T, A > &matrix, std::istream &file, std::size_t entries, const MMHeader &mmHeader, const D &)
 
std::tuple< std::string, std::string > Dune::MatrixMarketImpl::splitFilename (const std::string &filename)
 
void Dune::mm_read_header (std::size_t &rows, std::size_t &cols, MatrixMarketImpl::MMHeader &header, std::istream &istr, bool isVector)
 
template<typename T , typename A >
void Dune::mm_read_vector_entries (Dune::BlockVector< T, A > &vector, std::size_t size, std::istream &istr, size_t lane)
 
template<typename T , typename A , int entries>
void Dune::mm_read_vector_entries (Dune::BlockVector< Dune::FieldVector< T, entries >, A > &vector, std::size_t size, std::istream &istr, size_t lane)
 
template<typename T , typename A >
void Dune::readMatrixMarket (Dune::BlockVector< T, A > &vector, std::istream &istr)
 Reads a BlockVector from a matrix market file.
 
template<typename T , typename A >
void Dune::readMatrixMarket (Dune::BCRSMatrix< T, A > &matrix, std::istream &istr)
 Reads a sparse matrix from a matrix market file.
 
template<typename B >
void Dune::mm_print_entry (const B &entry, std::size_t rowidx, std::size_t colidx, std::ostream &ostr)
 
template<typename V >
void Dune::mm_print_vector_entry (const V &entry, std::ostream &ostr, const std::integral_constant< int, 1 > &, size_t lane)
 
template<typename V >
void Dune::mm_print_vector_entry (const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &, size_t lane)
 
template<typename T , typename A >
std::size_t Dune::countEntries (const BlockVector< T, A > &vector)
 
template<typename T , typename A , int i>
std::size_t Dune::countEntries (const BlockVector< FieldVector< T, i >, A > &vector)
 
template<typename V >
void Dune::writeMatrixMarket (const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &)
 
template<typename M >
void Dune::writeMatrixMarket (const M &matrix, std::ostream &ostr, const std::integral_constant< int, 1 > &)
 
template<typename M >
void Dune::writeMatrixMarket (const M &matrix, std::ostream &ostr)
 writes a ISTL matrix or vector to a stream in matrix market format.
 
template<typename M >
void Dune::storeMatrixMarket (const M &matrix, std::string filename, int prec=default_precision)
 Stores a parallel matrix/vector in matrix market format in a file.
 
template<typename M , typename G , typename L >
void Dune::storeMatrixMarket (const M &matrix, std::string filename, const OwnerOverlapCopyCommunication< G, L > &comm, bool storeIndices=true, int prec=default_precision)
 Stores a parallel matrix/vector in matrix market format in a file.
 
template<typename M , typename G , typename L >
void Dune::loadMatrixMarket (M &matrix, const std::string &filename, OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true)
 Load a parallel matrix/vector stored in matrix market format.
 
template<typename M >
void Dune::loadMatrixMarket (M &matrix, const std::string &filename)
 Load a matrix/vector stored in matrix market format.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

static const int Dune::default_precision = -1
 
│ │ │ │

Detailed Description

│ │ │ │ -

Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.

│ │ │ │ +

Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,173 +1,316 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -gsetc.hh File Reference │ │ │ │ │ -Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ -generic way. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ +matrixmarket.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s » │ │ │ │ │ +_I_O_ _f_o_r_ _m_a_t_r_i_c_e_s_ _a_n_d_ _v_e_c_t_o_r_s_. │ │ │ │ │ +Provides classes for reading and writing MatrixMarket Files with an extension │ │ │ │ │ +for parallel matrices. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_m_a_t_r_i_x_._h_h" │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_B_L_<_ _l_ _> │ │ │ │ │ -  compile-time parameter for block recursion depth _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _T_ _> │ │ │ │ │ +  Helper metaprogram to get the matrix market string representation of │ │ │ │ │ + the numeric type. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _I_,_ _d_i_a_g_,_ _r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _i_n_t_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _d_o_u_b_l_e_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _n_o_r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _f_l_o_a_t_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _n_o_r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _I_,_ _r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _w_i_t_h_r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _n_o_r_e_l_a_x_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _j_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _> │ │ │ │ │ + _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_, │ │ │ │ │ - _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_< │ │ │ │ │ + _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _>_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _> │ │ │ │ │ + _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_< │ │ │ │ │ + _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_, │ │ │ │ │ + _j_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _> │ │ │ │ │ + _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_I_n_d_e_x_D_a_t_a_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_ _T_ _> │ │ │ │ │ +  a wrapper class of numeric values. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_P_a_t_t_e_r_n_D_u_m_m_y │ │ │ │ │ +  Utility class for marking the pattern type of the MatrixMarket │ │ │ │ │ + matrices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_ _P_a_t_t_e_r_n_D_u_m_m_y_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_ _D_,_ _b_r_o_w_s_,_ _b_c_o_l_s_ _> │ │ │ │ │ +  Functor to the data values of the matrix. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_ _P_a_t_t_e_r_n_D_u_m_m_y_,_ _b_r_o_w_s_,_ _b_c_o_l_s │ │ │ │ │ + _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_s___c_o_m_p_l_e_x_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_s___c_o_m_p_l_e_x_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_ _M_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _i_, │ │ │ │ │ + _j_ _>_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l │ │ │ │ │ +  │ │ │ │ │ EEnnuummeerraattiioonnss │ │ │ │ │ -enum   _D_u_n_e_:_:_W_i_t_h_D_i_a_g_T_y_p_e { _D_u_n_e_:_:_w_i_t_h_d_i_a_g =1 , _D_u_n_e_:_:_n_o_d_i_a_g =0 } │ │ │ │ │ +enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_L_i_n_e_T_y_p_e { _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___H_E_A_D_E_R , │ │ │ │ │ + _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___I_S_T_L_S_T_R_U_C_T , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_D_A_T_A } │ │ │ │ │ +  │ │ │ │ │ +enum   { _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___M_A_X___L_I_N_E___L_E_N_G_T_H =1025 } │ │ │ │ │   │ │ │ │ │ -enum   _D_u_n_e_:_:_W_i_t_h_R_e_l_a_x_T_y_p_e { _D_u_n_e_:_:_w_i_t_h_r_e_l_a_x =1 , _D_u_n_e_:_:_n_o_r_e_l_a_x =0 } │ │ │ │ │ +enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___T_Y_P_E { _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ + _c_o_o_r_d_i_n_a_t_e___t_y_p_e , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_a_r_r_a_y___t_y_p_e , _D_u_n_e_:_: │ │ │ │ │ + _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___t_y_p_e } │ │ │ │ │ +  │ │ │ │ │ +enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___C_T_Y_P_E { │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_n_t_e_g_e_r___t_y_p_e , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ + _d_o_u_b_l_e___t_y_p_e , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_m_p_l_e_x___t_y_p_e , _D_u_n_e_:_: │ │ │ │ │ + _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_p_a_t_t_e_r_n , │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___c_t_y_p_e │ │ │ │ │ + } │ │ │ │ │ +  │ │ │ │ │ +enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___S_T_R_U_C_T_U_R_E { │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_g_e_n_e_r_a_l , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_y_m_m_e_t_r_i_c , │ │ │ │ │ + _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_e_w___s_y_m_m_e_t_r_i_c , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ + _h_e_r_m_i_t_i_a_n , │ │ │ │ │ +   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___s_t_r_u_c_t_u_r_e │ │ │ │ │ + } │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ -  block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -  relaxed block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ -  unit block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -  relaxed unit block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ -  block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -  relaxed block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ -  unit block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -  relaxed unit block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l >) │ │ │ │ │ -  block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l >) │ │ │ │ │ -  relaxed block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l >) │ │ │ │ │ -  unit block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l >) │ │ │ │ │ -  relaxed unit block lower triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l > bl) │ │ │ │ │ -  block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l > bl) │ │ │ │ │ -  relaxed block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l > bl) │ │ │ │ │ -  unit block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l > bl) │ │ │ │ │ -  relaxed unit block upper triangular solve │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ -  block diagonal solve, no relaxation │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -  block diagonal solve, with relaxation │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l >) │ │ │ │ │ -  block diagonal solve, no relaxation │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l >) │ │ │ │ │ -  block diagonal solve, with relaxation │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_d_b_g_s (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -  GS step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_d_b_g_s (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ -  GS step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_s_o_r_f (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -  SOR step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_s_o_r_f (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ -  SOR step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_s_o_r_b (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -  SSOR step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_b_s_o_r_b (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ -  Backward SOR step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_d_b_j_a_c (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -  Jacobi step. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_d_b_j_a_c (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ -  Jacobi step. │ │ │ │ │ + bool  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_l_i_n_e_F_e_e_d (std:: │ │ │ │ │ + istream &file) │ │ │ │ │ +  │ │ │ │ │ + void  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_i_p_C_o_m_m_e_n_t_s │ │ │ │ │ + (std::istream &file) │ │ │ │ │ +  │ │ │ │ │ + bool  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ + _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t_B_a_n_n_e_r (std::istream │ │ │ │ │ + &file, _M_M_H_e_a_d_e_r &mmHeader) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::tuple< std::size_t, std::size_t, _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_a_l_c_u_l_a_t_e_N_N_Z │ │ │ │ │ + std::size_t >  (std::size_t rows, std::size_t cols, │ │ │ │ │ + std::size_t entries, const _M_M_H_e_a_d_e_r │ │ │ │ │ + &header) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ + (std::istream &is, _N_u_m_e_r_i_c_W_r_a_p_p_e_r< T > │ │ │ │ │ + &num) │ │ │ │ │ +  │ │ │ │ │ + std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ + (std::istream &is, _N_u_m_e_r_i_c_W_r_a_p_p_e_r< │ │ │ │ │ + _P_a_t_t_e_r_n_D_u_m_m_y > &num) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ + (const _I_n_d_e_x_D_a_t_a< T > &i1, const │ │ │ │ │ + _I_n_d_e_x_D_a_t_a< T > &i2) │ │ │ │ │ +  LessThan operator. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ + (std::istream &is, _I_n_d_e_x_D_a_t_a< T > │ │ │ │ │ + &data) │ │ │ │ │ +  Read _I_n_d_e_x_D_a_t_a from a stream. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ + (std::istream &is, _I_n_d_e_x_D_a_t_a< │ │ │ │ │ + _N_u_m_e_r_i_c_W_r_a_p_p_e_r< std::complex< T > > > │ │ │ │ │ + &data) │ │ │ │ │ +  Read _I_n_d_e_x_D_a_t_a from a stream. │ │ │ │ │ + Specialization for std::complex. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::enable_if_t:: _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_n_j (const T │ │ │ │ │ + value, T >  &r) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::enable_if_t< _i_s___c_o_m_p_l_e_x< T >:: _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_n_j (const T │ │ │ │ │ + value, T >  &r) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ + _r_e_a_d_S_p_a_r_s_e_E_n_t_r_i_e_s (_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x< T, │ │ │ │ │ + A > &matrix, std::istream &file, std:: │ │ │ │ │ + size_t entries, const _M_M_H_e_a_d_e_r │ │ │ │ │ + &mmHeader, const D &) │ │ │ │ │ +  │ │ │ │ │ +std::tuple< std::string, std::string >  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ + (const std::string &filename) │ │ │ │ │ +  │ │ │ │ │ + void  _D_u_n_e_:_:_m_m___r_e_a_d___h_e_a_d_e_r (std::size_t │ │ │ │ │ + &rows, std::size_t &cols, │ │ │ │ │ + _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r &header, │ │ │ │ │ + std::istream &istr, bool isVector) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s (_D_u_n_e_:_: │ │ │ │ │ + _B_l_o_c_k_V_e_c_t_o_r< T, A > &vector, std:: │ │ │ │ │ + size_t size, std::istream &istr, size_t │ │ │ │ │ + lane) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s (_D_u_n_e_:_: │ │ │ │ │ + _B_l_o_c_k_V_e_c_t_o_r< Dune::FieldVector< T, │ │ │ │ │ + entries >, A > &vector, std::size_t │ │ │ │ │ + size, std::istream &istr, size_t lane) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t (_D_u_n_e_:_: │ │ │ │ │ + _B_l_o_c_k_V_e_c_t_o_r< T, A > &vector, std:: │ │ │ │ │ + istream &istr) │ │ │ │ │ +  Reads a _B_l_o_c_k_V_e_c_t_o_r from a matrix │ │ │ │ │ + market file. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t (_D_u_n_e_:_: │ │ │ │ │ + _B_C_R_S_M_a_t_r_i_x< T, A > &matrix, std:: │ │ │ │ │ + istream &istr) │ │ │ │ │ +  Reads a sparse matrix from a matrix │ │ │ │ │ + market file. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_m_m___p_r_i_n_t___e_n_t_r_y (const B &entry, │ │ │ │ │ + std::size_t rowidx, std::size_t colidx, │ │ │ │ │ + std::ostream &ostr) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y (const V │ │ │ │ │ + &entry, std::ostream &ostr, const std:: │ │ │ │ │ + integral_constant< int, 1 > &, size_t │ │ │ │ │ + lane) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y (const V │ │ │ │ │ + &vector, std::ostream &ostr, const │ │ │ │ │ + std::integral_constant< int, 0 > &, │ │ │ │ │ + size_t lane) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::size_t  _D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s (const _B_l_o_c_k_V_e_c_t_o_r< │ │ │ │ │ + T, A > &vector) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::size_t  _D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s (const _B_l_o_c_k_V_e_c_t_o_r< │ │ │ │ │ + FieldVector< T, i >, A > &vector) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t (const V │ │ │ │ │ + &vector, std::ostream &ostr, const │ │ │ │ │ + std::integral_constant< int, 0 > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ + &matrix, std::ostream &ostr, const │ │ │ │ │ + std::integral_constant< int, 1 > &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ + &matrix, std::ostream &ostr) │ │ │ │ │ +  writes a _I_S_T_L matrix or vector to a │ │ │ │ │ + stream in matrix market format. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ + &matrix, std::string filename, int │ │ │ │ │ + prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ +  Stores a parallel matrix/vector in │ │ │ │ │ + matrix market format in a file. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ + &matrix, std::string filename, const │ │ │ │ │ + _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< G, L > │ │ │ │ │ + &comm, bool storeIndices=true, int │ │ │ │ │ + prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ +  Stores a parallel matrix/vector in │ │ │ │ │ + matrix market format in a file. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t (M &matrix, │ │ │ │ │ + const std::string &filename, │ │ │ │ │ + _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< G, L > │ │ │ │ │ + &comm, bool readIndices=true) │ │ │ │ │ +  Load a parallel matrix/vector stored in │ │ │ │ │ + matrix market format. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t (M &matrix, │ │ │ │ │ + const std::string &filename) │ │ │ │ │ +  Load a matrix/vector stored in matrix │ │ │ │ │ + market format. │ │ │ │ │ +  │ │ │ │ │ +VVaarriiaabblleess │ │ │ │ │ +static const int  _D_u_n_e_:_:_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n = -1 │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ -generic way. │ │ │ │ │ +Provides classes for reading and writing MatrixMarket Files with an extension │ │ │ │ │ +for parallel matrices. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: gsetc.hh Source File │ │ │ │ +dune-istl: matrixmarket.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,835 +74,1499 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
gsetc.hh
│ │ │ │ +
matrixmarket.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_GSETC_HH
│ │ │ │ -
6#define DUNE_ISTL_GSETC_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_MATRIXMARKET_HH
│ │ │ │ +
6#define DUNE_ISTL_MATRIXMARKET_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ +
8#include <algorithm>
│ │ │ │
9#include <complex>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <iomanip>
│ │ │ │ -
12#include <string>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/hybridutilities.hh>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ - │ │ │ │ -
18
│ │ │ │ -
19#include "istlexception.hh"
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28
│ │ │ │ -
39 //============================================================
│ │ │ │ -
40 // parameter types
│ │ │ │ -
41 //============================================================
│ │ │ │ -
42
│ │ │ │ -
44 template<int l>
│ │ │ │ -
│ │ │ │ -
45 struct BL {
│ │ │ │ -
46 enum {recursion_level = l};
│ │ │ │ -
47 };
│ │ │ │ -
│ │ │ │ -
48
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
51 nodiag=0
│ │ │ │ -
52 };
│ │ │ │ -
│ │ │ │ -
53
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
56 norelax=0
│ │ │ │ -
57 };
│ │ │ │ -
│ │ │ │ -
58
│ │ │ │ -
59 //============================================================
│ │ │ │ -
60 // generic triangular solves
│ │ │ │ -
61 // consider block decomposition A = L + D + U
│ │ │ │ -
62 // we can invert L, L+D, U, U+D
│ │ │ │ -
63 // we can apply relaxation or not
│ │ │ │ -
64 // we can recurse over a fixed number of levels
│ │ │ │ -
65 //============================================================
│ │ │ │ -
66
│ │ │ │ -
67 // template meta program for triangular solves
│ │ │ │ -
68 template<int I, WithDiagType diag, WithRelaxType relax>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
70 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
71 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
72 {
│ │ │ │ -
73 // iterator types
│ │ │ │ -
74 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
75 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
76 typedef typename Y::block_type bblock;
│ │ │ │ -
77
│ │ │ │ -
78 // local solve at each block and immediate update
│ │ │ │ -
79 rowiterator endi=A.end();
│ │ │ │ -
80 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
81 {
│ │ │ │ -
82 bblock rhs(d[i.index()]);
│ │ │ │ -
83 coliterator j;
│ │ │ │ -
84 for (j=(*i).begin(); j.index()<i.index(); ++j)
│ │ │ │ -
85 (*j).mmv(v[j.index()],rhs);
│ │ │ │ -
86 algmeta_btsolve<I-1,diag,relax>::bltsolve(*j,v[i.index()],rhs,w);
│ │ │ │ -
87 }
│ │ │ │ -
88 }
│ │ │ │ -
│ │ │ │ -
89 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
90 static void butsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
91 {
│ │ │ │ -
92 // iterator types
│ │ │ │ -
93 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
94 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
95 typedef typename Y::block_type bblock;
│ │ │ │ -
96
│ │ │ │ -
97 // local solve at each block and immediate update
│ │ │ │ -
98 rowiterator rendi=A.beforeBegin();
│ │ │ │ -
99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
│ │ │ │ -
100 {
│ │ │ │ -
101 bblock rhs(d[i.index()]);
│ │ │ │ -
102 coliterator j;
│ │ │ │ -
103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
│ │ │ │ -
104 (*j).mmv(v[j.index()],rhs);
│ │ │ │ -
105 algmeta_btsolve<I-1,diag,relax>::butsolve(*j,v[i.index()],rhs,w);
│ │ │ │ -
106 }
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108 };
│ │ │ │ -
│ │ │ │ -
109
│ │ │ │ -
110 // recursion end ...
│ │ │ │ -
111 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
113 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
114 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
115 {
│ │ │ │ -
116 A.solve(v,d);
│ │ │ │ -
117 v *= w;
│ │ │ │ -
118 }
│ │ │ │ -
│ │ │ │ -
119 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
120 static void butsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
121 {
│ │ │ │ -
122 A.solve(v,d);
│ │ │ │ -
123 v *= w;
│ │ │ │ -
124 }
│ │ │ │ -
│ │ │ │ -
125 };
│ │ │ │ -
│ │ │ │ -
126 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
128 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
129 static void bltsolve (const M& A, X& v, const Y& d, const K& /*w*/)
│ │ │ │ -
130 {
│ │ │ │ -
131 A.solve(v,d);
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
134 static void butsolve (const M& A, X& v, const Y& d, const K& /*w*/)
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <fstream>
│ │ │ │ +
12#include <ios>
│ │ │ │ +
13#include <iostream>
│ │ │ │ +
14#include <istream>
│ │ │ │ +
15#include <limits>
│ │ │ │ +
16#include <ostream>
│ │ │ │ +
17#include <set>
│ │ │ │ +
18#include <sstream>
│ │ │ │ +
19#include <string>
│ │ │ │ +
20#include <tuple>
│ │ │ │ +
21#include <type_traits>
│ │ │ │ +
22#include <vector>
│ │ │ │ +
23
│ │ │ │ +
24#include <dune/common/exceptions.hh>
│ │ │ │ +
25#include <dune/common/fmatrix.hh>
│ │ │ │ +
26#include <dune/common/fvector.hh>
│ │ │ │ +
27#include <dune/common/hybridutilities.hh>
│ │ │ │ +
28#include <dune/common/stdstreams.hh>
│ │ │ │ +
29#include <dune/common/simd/simd.hh>
│ │ │ │ +
30
│ │ │ │ + │ │ │ │ +
32#include <dune/istl/bvector.hh>
│ │ │ │ +
33#include <dune/istl/matrixutils.hh> // countNonZeros()
│ │ │ │ + │ │ │ │ +
35
│ │ │ │ +
36namespace Dune
│ │ │ │ +
37{
│ │ │ │ +
38
│ │ │ │ +
│ │ │ │ +
64 namespace MatrixMarketImpl
│ │ │ │ +
65 {
│ │ │ │ +
75 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
77 enum {
│ │ │ │ +
81 is_numeric=false
│ │ │ │ +
82 };
│ │ │ │ +
83 };
│ │ │ │ +
│ │ │ │ +
84
│ │ │ │ +
85 template<>
│ │ │ │ +
│ │ │ │ +
86 struct mm_numeric_type<int>
│ │ │ │ +
87 {
│ │ │ │ +
88 enum {
│ │ │ │ +
92 is_numeric=true
│ │ │ │ +
93 };
│ │ │ │ +
94
│ │ │ │ +
│ │ │ │ +
95 static std::string str()
│ │ │ │ +
96 {
│ │ │ │ +
97 return "integer";
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99 };
│ │ │ │ +
│ │ │ │ +
100
│ │ │ │ +
101 template<>
│ │ │ │ +
│ │ │ │ +
102 struct mm_numeric_type<double>
│ │ │ │ +
103 {
│ │ │ │ +
104 enum {
│ │ │ │ +
108 is_numeric=true
│ │ │ │ +
109 };
│ │ │ │ +
110
│ │ │ │ +
│ │ │ │ +
111 static std::string str()
│ │ │ │ +
112 {
│ │ │ │ +
113 return "real";
│ │ │ │ +
114 }
│ │ │ │ +
│ │ │ │ +
115 };
│ │ │ │ +
│ │ │ │ +
116
│ │ │ │ +
117 template<>
│ │ │ │ +
│ │ │ │ +
118 struct mm_numeric_type<float>
│ │ │ │ +
119 {
│ │ │ │ +
120 enum {
│ │ │ │ +
124 is_numeric=true
│ │ │ │ +
125 };
│ │ │ │ +
126
│ │ │ │ +
│ │ │ │ +
127 static std::string str()
│ │ │ │ +
128 {
│ │ │ │ +
129 return "real";
│ │ │ │ +
130 }
│ │ │ │ +
│ │ │ │ +
131 };
│ │ │ │ +
│ │ │ │ +
132
│ │ │ │ +
133 template<>
│ │ │ │ +
│ │ │ │ +
134 struct mm_numeric_type<std::complex<double> >
│ │ │ │
135 {
│ │ │ │ -
136 A.solve(v,d);
│ │ │ │ -
137 }
│ │ │ │ -
│ │ │ │ -
138 };
│ │ │ │ -
│ │ │ │ -
139 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
142 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& w)
│ │ │ │ -
143 {
│ │ │ │ -
144 v = d;
│ │ │ │ -
145 v *= w;
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
148 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& w)
│ │ │ │ -
149 {
│ │ │ │ -
150 v = d;
│ │ │ │ -
151 v *= w;
│ │ │ │ -
152 }
│ │ │ │ -
│ │ │ │ -
153 };
│ │ │ │ -
│ │ │ │ -
154 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
157 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
│ │ │ │ -
158 {
│ │ │ │ -
159 v = d;
│ │ │ │ -
160 }
│ │ │ │ -
│ │ │ │ -
161 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
162 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
│ │ │ │ -
163 {
│ │ │ │ -
164 v = d;
│ │ │ │ -
165 }
│ │ │ │ -
│ │ │ │ -
166 };
│ │ │ │ -
│ │ │ │ -
167
│ │ │ │ -
168
│ │ │ │ -
169 // user calls
│ │ │ │ -
170
│ │ │ │ -
171 // default block recursion level = 1
│ │ │ │ -
172
│ │ │ │ -
174 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
175 void bltsolve (const M& A, X& v, const Y& d)
│ │ │ │ -
176 {
│ │ │ │ -
177 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
181 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
182 void bltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
183 {
│ │ │ │ - │ │ │ │ -
185 }
│ │ │ │ -
│ │ │ │ -
187 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
188 void ubltsolve (const M& A, X& v, const Y& d)
│ │ │ │ -
189 {
│ │ │ │ -
190 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
192 }
│ │ │ │ -
│ │ │ │ -
194 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
195 void ubltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
196 {
│ │ │ │ - │ │ │ │ -
198 }
│ │ │ │ -
│ │ │ │ -
199
│ │ │ │ -
201 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
202 void butsolve (const M& A, X& v, const Y& d)
│ │ │ │ -
203 {
│ │ │ │ -
204 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
206 }
│ │ │ │ -
│ │ │ │ -
208 template<class M, class X, class Y, class K>
│ │ │ │ +
136 enum {
│ │ │ │ +
140 is_numeric=true
│ │ │ │ +
141 };
│ │ │ │ +
142
│ │ │ │ +
│ │ │ │ +
143 static std::string str()
│ │ │ │ +
144 {
│ │ │ │ +
145 return "complex";
│ │ │ │ +
146 }
│ │ │ │ +
│ │ │ │ +
147 };
│ │ │ │ +
│ │ │ │ +
148
│ │ │ │ +
149 template<>
│ │ │ │ +
│ │ │ │ +
150 struct mm_numeric_type<std::complex<float> >
│ │ │ │ +
151 {
│ │ │ │ +
152 enum {
│ │ │ │ +
156 is_numeric=true
│ │ │ │ +
157 };
│ │ │ │ +
158
│ │ │ │ +
│ │ │ │ +
159 static std::string str()
│ │ │ │ +
160 {
│ │ │ │ +
161 return "complex";
│ │ │ │ +
162 }
│ │ │ │ +
│ │ │ │ +
163 };
│ │ │ │ +
│ │ │ │ +
164
│ │ │ │ +
173 template<class M>
│ │ │ │ + │ │ │ │ +
175
│ │ │ │ +
176 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
178 {
│ │ │ │ +
│ │ │ │ +
179 static void print(std::ostream& os)
│ │ │ │ +
180 {
│ │ │ │ +
181 os<<"%%MatrixMarket matrix coordinate ";
│ │ │ │ +
182 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<T>::field_type>>::str()<<" general"<<std::endl;
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184 };
│ │ │ │ +
│ │ │ │ +
185
│ │ │ │ +
186 template<typename B, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
188 {
│ │ │ │ +
│ │ │ │ +
189 static void print(std::ostream& os)
│ │ │ │ +
190 {
│ │ │ │ +
191 os<<"%%MatrixMarket matrix array ";
│ │ │ │ +
192 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<B>::field_type>>::str()<<" general"<<std::endl;
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194 };
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
196 template<typename T, int j>
│ │ │ │ +
│ │ │ │ +
197 struct mm_header_printer<FieldVector<T,j> >
│ │ │ │ +
198 {
│ │ │ │ +
│ │ │ │ +
199 static void print(std::ostream& os)
│ │ │ │ +
200 {
│ │ │ │ +
201 os<<"%%MatrixMarket matrix array ";
│ │ │ │ +
202 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
│ │ │ │ +
203 }
│ │ │ │ +
│ │ │ │ +
204 };
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
206 template<typename T, int i, int j>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
208 {
│ │ │ │
│ │ │ │ -
209 void butsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
210 {
│ │ │ │ - │ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
214 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
215 void ubutsolve (const M& A, X& v, const Y& d)
│ │ │ │ -
216 {
│ │ │ │ -
217 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
219 }
│ │ │ │ -
│ │ │ │ -
221 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
222 void ubutsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
223 {
│ │ │ │ - │ │ │ │ -
225 }
│ │ │ │ -
│ │ │ │ +
209 static void print(std::ostream& os)
│ │ │ │ +
210 {
│ │ │ │ +
211 os<<"%%MatrixMarket matrix array ";
│ │ │ │ +
212 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214 };
│ │ │ │ +
│ │ │ │ +
215
│ │ │ │ +
224 template<class M>
│ │ │ │ + │ │ │ │
226
│ │ │ │ -
227 // general block recursion level >= 0
│ │ │ │ -
228
│ │ │ │ -
230 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
231 void bltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
│ │ │ │ -
232 {
│ │ │ │ -
233 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
235 }
│ │ │ │ -
│ │ │ │ -
237 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
238 void bltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
│ │ │ │ -
239 {
│ │ │ │ - │ │ │ │ -
241 }
│ │ │ │ -
│ │ │ │ -
243 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
244 void ubltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
│ │ │ │ -
245 {
│ │ │ │ -
246 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
248 }
│ │ │ │ -
│ │ │ │ -
250 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
251 void ubltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
│ │ │ │ -
252 {
│ │ │ │ - │ │ │ │ -
254 }
│ │ │ │ -
│ │ │ │ -
255
│ │ │ │ -
257 template<class M, class X, class Y, int l>
│ │ │ │ +
227 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ + │ │ │ │ +
231 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
│ │ │ │ +
232
│ │ │ │ +
│ │ │ │ +
233 static void print(std::ostream& os, const M&)
│ │ │ │ +
234 {
│ │ │ │ +
235 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ +
236 os<<"1 1"<<std::endl;
│ │ │ │ +
237 }
│ │ │ │ +
│ │ │ │ +
238 };
│ │ │ │ +
│ │ │ │ +
239
│ │ │ │ +
240 template<typename T, typename A, int i>
│ │ │ │ +
│ │ │ │ +
241 struct mm_block_structure_header<BlockVector<FieldVector<T,i>,A> >
│ │ │ │ +
242 {
│ │ │ │ + │ │ │ │ +
244
│ │ │ │ +
│ │ │ │ +
245 static void print(std::ostream& os, const M&)
│ │ │ │ +
246 {
│ │ │ │ +
247 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ +
248 os<<i<<" "<<1<<std::endl;
│ │ │ │ +
249 }
│ │ │ │ +
│ │ │ │ +
250 };
│ │ │ │ +
│ │ │ │ +
251
│ │ │ │ +
252 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
254 {
│ │ │ │ + │ │ │ │ +
256 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
│ │ │ │ +
257
│ │ │ │
│ │ │ │ -
258 void butsolve (const M& A, X& v, const Y& d, BL<l> bl)
│ │ │ │ -
259 {
│ │ │ │ -
260 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
262 }
│ │ │ │ -
│ │ │ │ -
264 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
265 void butsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
│ │ │ │ -
266 {
│ │ │ │ - │ │ │ │ -
268 }
│ │ │ │ -
│ │ │ │ -
270 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
271 void ubutsolve (const M& A, X& v, const Y& d, BL<l> bl)
│ │ │ │ -
272 {
│ │ │ │ -
273 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
275 }
│ │ │ │ -
│ │ │ │ -
277 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
278 void ubutsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
│ │ │ │ -
279 {
│ │ │ │ - │ │ │ │ -
281 }
│ │ │ │ -
│ │ │ │ +
258 static void print(std::ostream& os, const M&)
│ │ │ │ +
259 {
│ │ │ │ +
260 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ +
261 os<<"1 1"<<std::endl;
│ │ │ │ +
262 }
│ │ │ │ +
│ │ │ │ +
263 };
│ │ │ │ +
│ │ │ │ +
264
│ │ │ │ +
265 template<typename T, typename A, int i, int j>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
267 {
│ │ │ │ + │ │ │ │ +
269
│ │ │ │ +
│ │ │ │ +
270 static void print(std::ostream& os, const M&)
│ │ │ │ +
271 {
│ │ │ │ +
272 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ +
273 os<<i<<" "<<j<<std::endl;
│ │ │ │ +
274 }
│ │ │ │ +
│ │ │ │ +
275 };
│ │ │ │ +
│ │ │ │ +
276
│ │ │ │ +
277
│ │ │ │ +
278 template<typename T, int i, int j>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
280 {
│ │ │ │ + │ │ │ │
282
│ │ │ │ -
283
│ │ │ │ -
284
│ │ │ │ -
285 //============================================================
│ │ │ │ -
286 // generic block diagonal solves
│ │ │ │ -
287 // consider block decomposition A = L + D + U
│ │ │ │ -
288 // we can apply relaxation or not
│ │ │ │ -
289 // we can recurse over a fixed number of levels
│ │ │ │ -
290 //============================================================
│ │ │ │ +
│ │ │ │ +
283 static void print(std::ostream& os, const M& m)
│ │ │ │ +
284 {}
│ │ │ │ +
│ │ │ │ +
285 };
│ │ │ │ +
│ │ │ │ +
286
│ │ │ │ +
287 template<typename T, int i>
│ │ │ │ +
│ │ │ │ +
288 struct mm_block_structure_header<FieldVector<T,i> >
│ │ │ │ +
289 {
│ │ │ │ +
290 typedef FieldVector<T,i> M;
│ │ │ │
291
│ │ │ │ -
292 // template meta program for diagonal solves
│ │ │ │ -
293 template<int I, WithRelaxType relax>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
295 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
296 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
297 {
│ │ │ │ -
298 // iterator types
│ │ │ │ -
299 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
300 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
301
│ │ │ │ -
302 // local solve at each block and immediate update
│ │ │ │ -
303 rowiterator rendi=A.beforeBegin();
│ │ │ │ -
304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
│ │ │ │ -
305 {
│ │ │ │ -
306 coliterator ii=(*i).find(i.index());
│ │ │ │ -
307 algmeta_bdsolve<I-1,relax>::bdsolve(*ii,v[i.index()],d[i.index()],w);
│ │ │ │ -
308 }
│ │ │ │ -
309 }
│ │ │ │ -
│ │ │ │ -
310 };
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
312 // recursion end ...
│ │ │ │ -
313 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
315 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
316 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
317 {
│ │ │ │ -
318 A.solve(v,d);
│ │ │ │ -
319 v *= w;
│ │ │ │ -
320 }
│ │ │ │ -
│ │ │ │ -
321 };
│ │ │ │ -
│ │ │ │ -
322 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
324 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
325 static void bdsolve (const M& A, X& v, const Y& d, const K& /*w*/)
│ │ │ │ -
326 {
│ │ │ │ -
327 A.solve(v,d);
│ │ │ │ -
328 }
│ │ │ │ -
│ │ │ │ -
329 };
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
292 static void print(std::ostream& os, const M& m)
│ │ │ │ +
293 {}
│ │ │ │ +
│ │ │ │ +
294 };
│ │ │ │ +
│ │ │ │ +
295
│ │ │ │ + │ │ │ │ +
297 enum { MM_MAX_LINE_LENGTH=1025 };
│ │ │ │ +
298
│ │ │ │ + │ │ │ │ +
300
│ │ │ │ + │ │ │ │ +
302
│ │ │ │ + │ │ │ │ +
304
│ │ │ │ +
│ │ │ │ +
305 struct MMHeader
│ │ │ │ +
306 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
309 {}
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
313 };
│ │ │ │ +
│ │ │ │ +
314
│ │ │ │ +
│ │ │ │ +
315 inline bool lineFeed(std::istream& file)
│ │ │ │ +
316 {
│ │ │ │ +
317 char c;
│ │ │ │ +
318 if(!file.eof())
│ │ │ │ +
319 c=file.peek();
│ │ │ │ +
320 else
│ │ │ │ +
321 return false;
│ │ │ │ +
322 // ignore whitespace
│ │ │ │ +
323 while(c==' ')
│ │ │ │ +
324 {
│ │ │ │ +
325 file.get();
│ │ │ │ +
326 if(file.eof())
│ │ │ │ +
327 return false;
│ │ │ │ +
328 c=file.peek();
│ │ │ │ +
329 }
│ │ │ │
330
│ │ │ │ -
331 // user calls
│ │ │ │ -
332
│ │ │ │ -
333 // default block recursion level = 1
│ │ │ │ -
334
│ │ │ │ -
336 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
337 void bdsolve (const M& A, X& v, const Y& d)
│ │ │ │ -
338 {
│ │ │ │ -
339 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
341 }
│ │ │ │ -
│ │ │ │ -
343 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
344 void bdsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ -
345 {
│ │ │ │ - │ │ │ │ -
347 }
│ │ │ │ -
│ │ │ │ -
348
│ │ │ │ -
349 // general block recursion level >= 0
│ │ │ │ -
350
│ │ │ │ -
352 template<class M, class X, class Y, int l>
│ │ │ │ +
331 if(c=='\n') {
│ │ │ │ +
332 /* eat the line feed */
│ │ │ │ +
333 file.get();
│ │ │ │ +
334 return true;
│ │ │ │ +
335 }
│ │ │ │ +
336 return false;
│ │ │ │ +
337 }
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
│ │ │ │ +
339 inline void skipComments(std::istream& file)
│ │ │ │ +
340 {
│ │ │ │ +
341 lineFeed(file);
│ │ │ │ +
342 char c=file.peek();
│ │ │ │ +
343 // ignore comment lines
│ │ │ │ +
344 while(c=='%')
│ │ │ │ +
345 {
│ │ │ │ +
346 /* discard the rest of the line */
│ │ │ │ +
347 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
348 c=file.peek();
│ │ │ │ +
349 }
│ │ │ │ +
350 }
│ │ │ │ +
│ │ │ │ +
351
│ │ │ │ +
352
│ │ │ │
│ │ │ │ -
353 void bdsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
│ │ │ │ -
354 {
│ │ │ │ -
355 typename X::field_type w=1;
│ │ │ │ - │ │ │ │ -
357 }
│ │ │ │ -
│ │ │ │ -
359 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
360 void bdsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
│ │ │ │ -
361 {
│ │ │ │ - │ │ │ │ -
363 }
│ │ │ │ -
│ │ │ │ -
364
│ │ │ │ -
365
│ │ │ │ -
366 //============================================================
│ │ │ │ -
367 // generic steps of iteration methods
│ │ │ │ -
368 // Jacobi, Gauss-Seidel, SOR, SSOR
│ │ │ │ -
369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i)
│ │ │ │ -
370 // we can recurse over a fixed number of levels
│ │ │ │ -
371 //============================================================
│ │ │ │ -
372
│ │ │ │ -
373 // template meta program for iterative solver steps
│ │ │ │ -
374 template<int I, typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ +
353 inline bool readMatrixMarketBanner(std::istream& file, MMHeader& mmHeader)
│ │ │ │ +
354 {
│ │ │ │ +
355 std::string buffer;
│ │ │ │ +
356 char c;
│ │ │ │ +
357 file >> buffer;
│ │ │ │ +
358 c=buffer[0];
│ │ │ │ +
359 mmHeader=MMHeader();
│ │ │ │ +
360 if(c!='%')
│ │ │ │ +
361 return false;
│ │ │ │ +
362 dverb<<buffer<<std::endl;
│ │ │ │ +
363 /* read the banner */
│ │ │ │ +
364 if(buffer!="%%MatrixMarket") {
│ │ │ │ +
365 /* discard the rest of the line */
│ │ │ │ +
366 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
367 return false;
│ │ │ │ +
368 }
│ │ │ │ +
369
│ │ │ │ +
370 if(lineFeed(file))
│ │ │ │ +
371 /* premature end of line */
│ │ │ │ +
372 return false;
│ │ │ │ +
373
│ │ │ │ +
374 /* read the matrix_type */
│ │ │ │ +
375 file >> buffer;
│ │ │ │
376
│ │ │ │ -
377 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
378 static void dbgs (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
379 {
│ │ │ │ -
380 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
381 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
382 typedef typename Y::block_type bblock;
│ │ │ │ -
383 bblock rhs;
│ │ │ │ -
384
│ │ │ │ -
385 X xold(x); // remember old x
│ │ │ │ -
386
│ │ │ │ -
387 rowiterator endi=A.end();
│ │ │ │ -
388 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
389 {
│ │ │ │ -
390 rhs = b[i.index()]; // rhs = b_i
│ │ │ │ -
391 coliterator endj=(*i).end();
│ │ │ │ -
392 coliterator j=(*i).begin();
│ │ │ │ -
393 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ -
394 {
│ │ │ │ -
395 for (; j.index()<i.index(); ++j)
│ │ │ │ -
396 rhs -= (*j) * x[j.index()];
│ │ │ │ -
397 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
│ │ │ │ -
398 for (; j != endj; ++j)
│ │ │ │ -
399 rhs -= (*j) * x[j.index()];
│ │ │ │ -
400 x[i.index()] = rhs / (*diag);
│ │ │ │ -
401 }
│ │ │ │ -
402 else
│ │ │ │ -
403 {
│ │ │ │ -
404 for (; j.index()<i.index(); ++j) // iterate over a_ij with j < i
│ │ │ │ -
405 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ -
406 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
│ │ │ │ -
407 for (; j != endj; ++j) // iterate over a_ij with j > i
│ │ │ │ -
408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j
│ │ │ │ -
409 algmeta_itsteps<I-1,typename M::block_type>::dbgs(*diag,x[i.index()],rhs,w); // if I==1: xnew_i = rhs/a_ii
│ │ │ │ -
410 }
│ │ │ │ -
411 }
│ │ │ │ -
412 // next two lines: xnew_i = w / a_ii * (b_i - sum_{j<i} a_ij * xnew_j - sum_{j>=i} a_ij * xold_j) + (1-w)*xold;
│ │ │ │ -
413 x *= w;
│ │ │ │ -
414 x.axpy(K(1)-w,xold);
│ │ │ │ -
415 }
│ │ │ │ -
│ │ │ │ -
416
│ │ │ │ -
417 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
418 static void bsorf (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
419 {
│ │ │ │ -
420 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
421 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
422 typedef typename Y::block_type bblock;
│ │ │ │ -
423 typedef typename X::block_type xblock;
│ │ │ │ -
424 bblock rhs;
│ │ │ │ -
425 xblock v;
│ │ │ │ -
426
│ │ │ │ -
427 // Initialize nested data structure if there are entries
│ │ │ │ -
428 if(A.begin()!=A.end())
│ │ │ │ -
429 v=x[0];
│ │ │ │ -
430
│ │ │ │ -
431 rowiterator endi=A.end();
│ │ │ │ -
432 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
433 {
│ │ │ │ -
434 rhs = b[i.index()]; // rhs = b_i
│ │ │ │ -
435 coliterator endj=(*i).end(); // iterate over a_ij with j < i
│ │ │ │ -
436 coliterator j=(*i).begin();
│ │ │ │ -
437 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ -
438 {
│ │ │ │ -
439 for (; j.index()<i.index(); ++j)
│ │ │ │ -
440 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ -
441 coliterator diag=j; // *diag = a_ii
│ │ │ │ -
442 for (; j!=endj; ++j)
│ │ │ │ -
443 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ -
444 v = rhs / (*diag);
│ │ │ │ -
445 x[i.index()] += w*v; // x_i = w / a_ii * (b_i - sum_{j<i} a_ij * xnew_j - sum_{j>=i} a_ij * xold_j)
│ │ │ │ -
446 }
│ │ │ │ -
447 else
│ │ │ │ +
377 if(buffer != "matrix")
│ │ │ │ +
378 {
│ │ │ │ +
379 /* discard the rest of the line */
│ │ │ │ +
380 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
381 return false;
│ │ │ │ +
382 }
│ │ │ │ +
383
│ │ │ │ +
384 if(lineFeed(file))
│ │ │ │ +
385 /* premature end of line */
│ │ │ │ +
386 return false;
│ │ │ │ +
387
│ │ │ │ +
388 /* The type of the matrix */
│ │ │ │ +
389 file >> buffer;
│ │ │ │ +
390
│ │ │ │ +
391 if(buffer.empty())
│ │ │ │ +
392 return false;
│ │ │ │ +
393
│ │ │ │ +
394 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
│ │ │ │ +
395 ::tolower);
│ │ │ │ +
396
│ │ │ │ +
397 switch(buffer[0])
│ │ │ │ +
398 {
│ │ │ │ +
399 case 'a' :
│ │ │ │ +
400 /* sanity check */
│ │ │ │ +
401 if(buffer != "array")
│ │ │ │ +
402 {
│ │ │ │ +
403 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
404 return false;
│ │ │ │ +
405 }
│ │ │ │ +
406 mmHeader.type=array_type;
│ │ │ │ +
407 break;
│ │ │ │ +
408 case 'c' :
│ │ │ │ +
409 /* sanity check */
│ │ │ │ +
410 if(buffer != "coordinate")
│ │ │ │ +
411 {
│ │ │ │ +
412 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
413 return false;
│ │ │ │ +
414 }
│ │ │ │ +
415 mmHeader.type=coordinate_type;
│ │ │ │ +
416 break;
│ │ │ │ +
417 default :
│ │ │ │ +
418 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
419 return false;
│ │ │ │ +
420 }
│ │ │ │ +
421
│ │ │ │ +
422 if(lineFeed(file))
│ │ │ │ +
423 /* premature end of line */
│ │ │ │ +
424 return false;
│ │ │ │ +
425
│ │ │ │ +
426 /* The numeric type used. */
│ │ │ │ +
427 file >> buffer;
│ │ │ │ +
428
│ │ │ │ +
429 if(buffer.empty())
│ │ │ │ +
430 return false;
│ │ │ │ +
431
│ │ │ │ +
432 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
│ │ │ │ +
433 ::tolower);
│ │ │ │ +
434 switch(buffer[0])
│ │ │ │ +
435 {
│ │ │ │ +
436 case 'i' :
│ │ │ │ +
437 /* sanity check */
│ │ │ │ +
438 if(buffer != "integer")
│ │ │ │ +
439 {
│ │ │ │ +
440 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
441 return false;
│ │ │ │ +
442 }
│ │ │ │ +
443 mmHeader.ctype=integer_type;
│ │ │ │ +
444 break;
│ │ │ │ +
445 case 'r' :
│ │ │ │ +
446 /* sanity check */
│ │ │ │ +
447 if(buffer != "real")
│ │ │ │
448 {
│ │ │ │ -
449 for (; j.index()<i.index(); ++j)
│ │ │ │ -
450 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ -
451 coliterator diag=j; // *diag = a_ii
│ │ │ │ -
452 for (; j!=endj; ++j)
│ │ │ │ -
453 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ -
454 algmeta_itsteps<I-1,typename M::block_type>::bsorf(*diag,v,rhs,w); // if blocksize I==1: v = rhs/a_ii
│ │ │ │ -
455 x[i.index()].axpy(w,v); // x_i = w / a_ii * (b_i - sum_{j<i} a_ij * xnew_j - sum_{j>=i} a_ij * xold_j)
│ │ │ │ -
456 }
│ │ │ │ -
457 }
│ │ │ │ -
458 }
│ │ │ │ -
│ │ │ │ -
459
│ │ │ │ -
460 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
461 static void bsorb (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
462 {
│ │ │ │ -
463 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
464 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
465 typedef typename Y::block_type bblock;
│ │ │ │ -
466 typedef typename X::block_type xblock;
│ │ │ │ -
467 bblock rhs;
│ │ │ │ -
468 xblock v;
│ │ │ │ -
469
│ │ │ │ -
470 // Initialize nested data structure if there are entries
│ │ │ │ -
471 if(A.begin()!=A.end())
│ │ │ │ -
472 v=x[0];
│ │ │ │ -
473
│ │ │ │ -
474 rowiterator endi=A.beforeBegin();
│ │ │ │ -
475 for (rowiterator i=A.beforeEnd(); i!=endi; --i)
│ │ │ │ -
476 {
│ │ │ │ -
477 rhs = b[i.index()];
│ │ │ │ -
478 coliterator endj=(*i).end();
│ │ │ │ -
479 coliterator j=(*i).begin();
│ │ │ │ -
480 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ -
481 {
│ │ │ │ -
482 for (; j.index()<i.index(); ++j)
│ │ │ │ -
483 rhs -= (*j) * x[j.index()];
│ │ │ │ -
484 coliterator diag=j;
│ │ │ │ -
485 for (; j!=endj; ++j)
│ │ │ │ -
486 rhs -= (*j) * x[j.index()];
│ │ │ │ -
487 v = rhs / (*diag);
│ │ │ │ -
488 x[i.index()] += w*v;
│ │ │ │ -
489 }
│ │ │ │ -
490 else
│ │ │ │ -
491 {
│ │ │ │ -
492 for (; j.index()<i.index(); ++j)
│ │ │ │ -
493 j->mmv(x[j.index()],rhs);
│ │ │ │ -
494 coliterator diag=j;
│ │ │ │ -
495 for (; j!=endj; ++j)
│ │ │ │ -
496 j->mmv(x[j.index()],rhs);
│ │ │ │ - │ │ │ │ -
498 x[i.index()].axpy(w,v);
│ │ │ │ -
499 }
│ │ │ │ -
500 }
│ │ │ │ -
501 }
│ │ │ │ -
│ │ │ │ -
502
│ │ │ │ -
503 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
504 static void dbjac (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
505 {
│ │ │ │ -
506 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
507 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
508 typedef typename Y::block_type bblock;
│ │ │ │ -
509 bblock rhs;
│ │ │ │ -
510
│ │ │ │ -
511 X v(x); // allocate with same size
│ │ │ │ -
512
│ │ │ │ -
513 rowiterator endi=A.end();
│ │ │ │ -
514 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
515 {
│ │ │ │ -
516 rhs = b[i.index()];
│ │ │ │ -
517 coliterator endj=(*i).end();
│ │ │ │ -
518 coliterator j=(*i).begin();
│ │ │ │ -
519 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ -
520 {
│ │ │ │ -
521 for (; j.index()<i.index(); ++j)
│ │ │ │ -
522 rhs -= (*j) * x[j.index()];
│ │ │ │ -
523 coliterator diag=j;
│ │ │ │ -
524 for (; j!=endj; ++j)
│ │ │ │ -
525 rhs -= (*j) * x[j.index()];
│ │ │ │ -
526 v[i.index()] = rhs / (*diag);
│ │ │ │ -
527 }
│ │ │ │ -
528 else
│ │ │ │ -
529 {
│ │ │ │ -
530 for (; j.index()<i.index(); ++j)
│ │ │ │ -
531 j->mmv(x[j.index()],rhs);
│ │ │ │ -
532 coliterator diag=j;
│ │ │ │ -
533 for (; j!=endj; ++j)
│ │ │ │ -
534 j->mmv(x[j.index()],rhs);
│ │ │ │ - │ │ │ │ -
536 }
│ │ │ │ -
537 }
│ │ │ │ -
538 x.axpy(w,v);
│ │ │ │ -
539 }
│ │ │ │ -
│ │ │ │ -
540 };
│ │ │ │ -
│ │ │ │ -
541 // end of recursion
│ │ │ │ -
542 template<typename M>
│ │ │ │ -
│ │ │ │ -
543 struct algmeta_itsteps<0,M> {
│ │ │ │ -
544 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
545 static void dbgs (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ -
546 {
│ │ │ │ -
547 A.solve(x,b);
│ │ │ │ -
548 }
│ │ │ │ -
│ │ │ │ -
549 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
550 static void bsorf (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ -
551 {
│ │ │ │ -
552 A.solve(x,b);
│ │ │ │ -
553 }
│ │ │ │ -
│ │ │ │ -
554 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
555 static void bsorb (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ -
556 {
│ │ │ │ -
557 A.solve(x,b);
│ │ │ │ -
558 }
│ │ │ │ -
│ │ │ │ -
559 template<class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
560 static void dbjac (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ -
561 {
│ │ │ │ -
562 A.solve(x,b);
│ │ │ │ -
563 }
│ │ │ │ -
│ │ │ │ -
564 };
│ │ │ │ -
│ │ │ │ -
565
│ │ │ │ -
566 template<int I, typename T1, typename... MultiTypeMatrixArgs>
│ │ │ │ -
│ │ │ │ -
567 struct algmeta_itsteps<I,MultiTypeBlockMatrix<T1, MultiTypeMatrixArgs...>> {
│ │ │ │ -
568 template<
│ │ │ │ -
569 typename... MultiTypeVectorArgs,
│ │ │ │ -
570 class K>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
574 const K& w)
│ │ │ │ -
575 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
578 }
│ │ │ │ -
│ │ │ │ -
579
│ │ │ │ -
580 template<
│ │ │ │ -
581 typename... MultiTypeVectorArgs,
│ │ │ │ -
582 class K>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
586 const K& w)
│ │ │ │ -
587 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
590 }
│ │ │ │ -
│ │ │ │ -
591
│ │ │ │ -
592 template<
│ │ │ │ -
593 typename... MultiTypeVectorArgs,
│ │ │ │ -
594 class K>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
598 const K& w)
│ │ │ │ -
599 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
602 }
│ │ │ │ -
│ │ │ │ -
603
│ │ │ │ -
604 template<
│ │ │ │ -
605 typename... MultiTypeVectorArgs,
│ │ │ │ -
606 class K
│ │ │ │ -
607 >
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
611 const K& w)
│ │ │ │ -
612 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
615 }
│ │ │ │ -
│ │ │ │ -
616 };
│ │ │ │ -
│ │ │ │ -
617
│ │ │ │ -
618 // user calls
│ │ │ │ -
619
│ │ │ │ -
621 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
622 void dbgs (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
623 {
│ │ │ │ - │ │ │ │ -
625 }
│ │ │ │ -
│ │ │ │ -
627 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
628 void dbgs (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ -
629 {
│ │ │ │ - │ │ │ │ -
631 }
│ │ │ │ -
│ │ │ │ -
633 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
634 void bsorf (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
635 {
│ │ │ │ - │ │ │ │ -
637 }
│ │ │ │ -
│ │ │ │ -
639 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
640 void bsorf (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ -
641 {
│ │ │ │ - │ │ │ │ -
643 }
│ │ │ │ -
│ │ │ │ -
645 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
646 void bsorb (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
647 {
│ │ │ │ - │ │ │ │ -
649 }
│ │ │ │ -
│ │ │ │ -
651 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
652 void bsorb (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ -
653 {
│ │ │ │ - │ │ │ │ -
655 }
│ │ │ │ -
│ │ │ │ -
657 template<class M, class X, class Y, class K>
│ │ │ │ -
│ │ │ │ -
658 void dbjac (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ -
659 {
│ │ │ │ - │ │ │ │ -
661 }
│ │ │ │ -
│ │ │ │ -
663 template<class M, class X, class Y, class K, int l>
│ │ │ │ -
│ │ │ │ -
664 void dbjac (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ -
665 {
│ │ │ │ - │ │ │ │ -
667 }
│ │ │ │ +
449 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
450 return false;
│ │ │ │ +
451 }
│ │ │ │ +
452 mmHeader.ctype=double_type;
│ │ │ │ +
453 break;
│ │ │ │ +
454 case 'c' :
│ │ │ │ +
455 /* sanity check */
│ │ │ │ +
456 if(buffer != "complex")
│ │ │ │ +
457 {
│ │ │ │ +
458 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
459 return false;
│ │ │ │ +
460 }
│ │ │ │ +
461 mmHeader.ctype=complex_type;
│ │ │ │ +
462 break;
│ │ │ │ +
463 case 'p' :
│ │ │ │ +
464 /* sanity check */
│ │ │ │ +
465 if(buffer != "pattern")
│ │ │ │ +
466 {
│ │ │ │ +
467 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
468 return false;
│ │ │ │ +
469 }
│ │ │ │ +
470 mmHeader.ctype=pattern;
│ │ │ │ +
471 break;
│ │ │ │ +
472 default :
│ │ │ │ +
473 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
474 return false;
│ │ │ │ +
475 }
│ │ │ │ +
476
│ │ │ │ +
477 if(lineFeed(file))
│ │ │ │ +
478 return false;
│ │ │ │ +
479
│ │ │ │ +
480 file >> buffer;
│ │ │ │ +
481
│ │ │ │ +
482 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
│ │ │ │ +
483 ::tolower);
│ │ │ │ +
484 switch(buffer[0])
│ │ │ │ +
485 {
│ │ │ │ +
486 case 'g' :
│ │ │ │ +
487 /* sanity check */
│ │ │ │ +
488 if(buffer != "general")
│ │ │ │ +
489 {
│ │ │ │ +
490 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
491 return false;
│ │ │ │ +
492 }
│ │ │ │ +
493 mmHeader.structure=general;
│ │ │ │ +
494 break;
│ │ │ │ +
495 case 'h' :
│ │ │ │ +
496 /* sanity check */
│ │ │ │ +
497 if(buffer != "hermitian")
│ │ │ │ +
498 {
│ │ │ │ +
499 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
500 return false;
│ │ │ │ +
501 }
│ │ │ │ +
502 mmHeader.structure=hermitian;
│ │ │ │ +
503 break;
│ │ │ │ +
504 case 's' :
│ │ │ │ +
505 if(buffer.size()==1) {
│ │ │ │ +
506 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
507 return false;
│ │ │ │ +
508 }
│ │ │ │ +
509
│ │ │ │ +
510 switch(buffer[1])
│ │ │ │ +
511 {
│ │ │ │ +
512 case 'y' :
│ │ │ │ +
513 /* sanity check */
│ │ │ │ +
514 if(buffer != "symmetric")
│ │ │ │ +
515 {
│ │ │ │ +
516 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
517 return false;
│ │ │ │ +
518 }
│ │ │ │ +
519 mmHeader.structure=symmetric;
│ │ │ │ +
520 break;
│ │ │ │ +
521 case 'k' :
│ │ │ │ +
522 /* sanity check */
│ │ │ │ +
523 if(buffer != "skew-symmetric")
│ │ │ │ +
524 {
│ │ │ │ +
525 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
526 return false;
│ │ │ │ +
527 }
│ │ │ │ +
528 mmHeader.structure=skew_symmetric;
│ │ │ │ +
529 break;
│ │ │ │ +
530 default :
│ │ │ │ +
531 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
532 return false;
│ │ │ │ +
533 }
│ │ │ │ +
534 break;
│ │ │ │ +
535 default :
│ │ │ │ +
536 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
537 return false;
│ │ │ │ +
538 }
│ │ │ │ +
539 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
540 c=file.peek();
│ │ │ │ +
541 return true;
│ │ │ │ +
542
│ │ │ │ +
543 }
│ │ │ │ +
│ │ │ │ +
544
│ │ │ │ +
545 template<std::size_t brows, std::size_t bcols>
│ │ │ │ +
546 std::tuple<std::size_t, std::size_t, std::size_t>
│ │ │ │ +
│ │ │ │ +
547 calculateNNZ(std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader& header)
│ │ │ │ +
548 {
│ │ │ │ +
549 std::size_t blockrows=rows/brows;
│ │ │ │ +
550 std::size_t blockcols=cols/bcols;
│ │ │ │ +
551 std::size_t blocksize=brows*bcols;
│ │ │ │ +
552 std::size_t blockentries=0;
│ │ │ │ +
553
│ │ │ │ +
554 switch(header.structure)
│ │ │ │ +
555 {
│ │ │ │ +
556 case general :
│ │ │ │ +
557 blockentries = entries/blocksize; break;
│ │ │ │ +
558 case skew_symmetric :
│ │ │ │ +
559 blockentries = 2*entries/blocksize; break;
│ │ │ │ +
560 case symmetric :
│ │ │ │ +
561 blockentries = (2*entries-rows)/blocksize; break;
│ │ │ │ +
562 case hermitian :
│ │ │ │ +
563 blockentries = (2*entries-rows)/blocksize; break;
│ │ │ │ +
564 default :
│ │ │ │ +
565 throw Dune::NotImplemented();
│ │ │ │ +
566 }
│ │ │ │ +
567 return std::make_tuple(blockrows, blockcols, blockentries);
│ │ │ │ +
568 }
│ │ │ │ +
│ │ │ │ +
569
│ │ │ │ +
570 /*
│ │ │ │ +
571 * @brief Storage class for the column index and the numeric value.
│ │ │ │ +
572 *
│ │ │ │ +
573 * \tparam T Either a NumericWrapper of the numeric type or PatternDummy
│ │ │ │ +
574 * for MatrixMarket pattern case.
│ │ │ │ +
575 */
│ │ │ │ +
576 template<typename T>
│ │ │ │ +
│ │ │ │ +
577 struct IndexData : public T
│ │ │ │ +
578 {
│ │ │ │ +
579 std::size_t index = {};
│ │ │ │ +
580 };
│ │ │ │ +
│ │ │ │ +
581
│ │ │ │ +
582
│ │ │ │ +
593 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
595 {
│ │ │ │ +
596 T number = {};
│ │ │ │ +
│ │ │ │ +
597 operator T&()
│ │ │ │ +
598 {
│ │ │ │ +
599 return number;
│ │ │ │ +
600 }
│ │ │ │ +
│ │ │ │ +
601 };
│ │ │ │ +
│ │ │ │ +
602
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
607 {};
│ │ │ │ +
│ │ │ │ +
608
│ │ │ │ +
609 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
611 {};
│ │ │ │ +
│ │ │ │ +
612
│ │ │ │ +
613 template<typename T>
│ │ │ │ +
│ │ │ │ +
614 std::istream& operator>>(std::istream& is, NumericWrapper<T>& num)
│ │ │ │ +
615 {
│ │ │ │ +
616 return is>>num.number;
│ │ │ │ +
617 }
│ │ │ │ +
│ │ │ │ +
618
│ │ │ │ +
│ │ │ │ +
619 inline std::istream& operator>>(std::istream& is, [[maybe_unused]] NumericWrapper<PatternDummy>& num)
│ │ │ │ +
620 {
│ │ │ │ +
621 return is;
│ │ │ │ +
622 }
│ │ │ │ +
│ │ │ │ +
623
│ │ │ │ +
629 template<typename T>
│ │ │ │ +
│ │ │ │ +
630 bool operator<(const IndexData<T>& i1, const IndexData<T>& i2)
│ │ │ │ +
631 {
│ │ │ │ +
632 return i1.index<i2.index;
│ │ │ │ +
633 }
│ │ │ │ +
│ │ │ │ +
634
│ │ │ │ +
640 template<typename T>
│ │ │ │ +
│ │ │ │ +
641 std::istream& operator>>(std::istream& is, IndexData<T>& data)
│ │ │ │ +
642 {
│ │ │ │ +
643 is>>data.index;
│ │ │ │ +
644 /* MatrixMarket indices are one based. Decrement for C++ */
│ │ │ │ +
645 --data.index;
│ │ │ │ +
646 return is>>data.number;
│ │ │ │ +
647 }
│ │ │ │ +
│ │ │ │ +
648
│ │ │ │ +
654 template<typename T>
│ │ │ │ +
│ │ │ │ +
655 std::istream& operator>>(std::istream& is, IndexData<NumericWrapper<std::complex<T>>>& data)
│ │ │ │ +
656 {
│ │ │ │ +
657 is>>data.index;
│ │ │ │ +
658 /* MatrixMarket indices are one based. Decrement for C++ */
│ │ │ │ +
659 --data.index;
│ │ │ │ +
660 // real and imaginary part needs to be read separately as
│ │ │ │ +
661 // complex numbers are not provided in pair form. (x,y)
│ │ │ │ +
662 NumericWrapper<T> real, imag;
│ │ │ │ +
663 is>>real;
│ │ │ │ +
664 is>>imag;
│ │ │ │ +
665 data.number = {real.number, imag.number};
│ │ │ │ +
666 return is;
│ │ │ │ +
667 }
│ │ │ │
│ │ │ │
668
│ │ │ │ -
669
│ │ │ │ -
672} // end namespace
│ │ │ │ -
673
│ │ │ │ -
674#endif
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:568
│ │ │ │ -
static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:484
│ │ │ │ -
static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:540
│ │ │ │ -
static constexpr size_type N()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:64
│ │ │ │ -
static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:513
│ │ │ │ -
void bltsolve(const M &A, X &v, const Y &d)
block lower triangular solve
Definition gsetc.hh:175
│ │ │ │ -
WithDiagType
Definition gsetc.hh:49
│ │ │ │ -
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:646
│ │ │ │ -
void ubltsolve(const M &A, X &v, const Y &d)
unit block lower triangular solve
Definition gsetc.hh:188
│ │ │ │ -
void dbjac(const M &A, X &x, const Y &b, const K &w)
Jacobi step.
Definition gsetc.hh:658
│ │ │ │ -
void dbgs(const M &A, X &x, const Y &b, const K &w)
GS step.
Definition gsetc.hh:622
│ │ │ │ -
WithRelaxType
Definition gsetc.hh:54
│ │ │ │ -
void bdsolve(const M &A, X &v, const Y &d)
block diagonal solve, no relaxation
Definition gsetc.hh:337
│ │ │ │ -
void butsolve(const M &A, X &v, const Y &d)
block upper triangular solve
Definition gsetc.hh:202
│ │ │ │ -
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:634
│ │ │ │ -
void ubutsolve(const M &A, X &v, const Y &d)
unit block upper triangular solve
Definition gsetc.hh:215
│ │ │ │ -
@ nodiag
Definition gsetc.hh:51
│ │ │ │ -
@ withdiag
Definition gsetc.hh:50
│ │ │ │ -
@ norelax
Definition gsetc.hh:56
│ │ │ │ -
@ withrelax
Definition gsetc.hh:55
│ │ │ │ +
675 template<typename D, int brows, int bcols>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
677 {
│ │ │ │ +
683 template<typename T>
│ │ │ │ +
│ │ │ │ +
684 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
│ │ │ │ +
685 BCRSMatrix<T>& matrix)
│ │ │ │ +
686 {
│ │ │ │ +
687 static_assert(IsNumber<T>::value && brows==1 && bcols==1, "Only scalar entries are expected here!");
│ │ │ │ +
688 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
│ │ │ │ +
689 {
│ │ │ │ +
690 auto brow=iter.index();
│ │ │ │ +
691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter)
│ │ │ │ +
692 (*iter)[siter->index] = siter->number;
│ │ │ │ +
693 }
│ │ │ │ +
694 }
│ │ │ │ +
│ │ │ │ +
695
│ │ │ │ +
701 template<typename T>
│ │ │ │ +
│ │ │ │ +
702 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
│ │ │ │ + │ │ │ │ +
704 {
│ │ │ │ +
705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
│ │ │ │ +
706 {
│ │ │ │ +
707 for (auto brow=iter.index()*brows,
│ │ │ │ +
708 browend=iter.index()*brows+brows;
│ │ │ │ +
709 brow<browend; ++brow)
│ │ │ │ +
710 {
│ │ │ │ +
711 for (auto siter=rows[brow].begin(), send=rows[brow].end();
│ │ │ │ +
712 siter != send; ++siter)
│ │ │ │ +
713 (*iter)[siter->index/bcols][brow%brows][siter->index%bcols]=siter->number;
│ │ │ │ +
714 }
│ │ │ │ +
715 }
│ │ │ │ +
716 }
│ │ │ │ +
│ │ │ │ +
717 };
│ │ │ │ +
│ │ │ │ +
718
│ │ │ │ +
719 template<int brows, int bcols>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
721 {
│ │ │ │ +
722 template<typename M>
│ │ │ │ +
│ │ │ │ +
723 void operator()(const std::vector<std::set<IndexData<PatternDummy> > >& rows,
│ │ │ │ +
724 M& matrix)
│ │ │ │ +
725 {}
│ │ │ │ +
│ │ │ │ +
726 };
│ │ │ │ +
│ │ │ │ +
727
│ │ │ │ +
728 template<class T> struct is_complex : std::false_type {};
│ │ │ │ +
729 template<class T> struct is_complex<std::complex<T>> : std::true_type {};
│ │ │ │ +
730
│ │ │ │ +
731 // wrapper for std::conj. Returns T if T is not complex.
│ │ │ │ +
732 template<class T>
│ │ │ │ +
│ │ │ │ +
733 std::enable_if_t<!is_complex<T>::value, T> conj(const T& r){
│ │ │ │ +
734 return r;
│ │ │ │ +
735 }
│ │ │ │ +
│ │ │ │ +
736
│ │ │ │ +
737 template<class T>
│ │ │ │ +
│ │ │ │ +
738 std::enable_if_t<is_complex<T>::value, T> conj(const T& r){
│ │ │ │ +
739 return std::conj(r);
│ │ │ │ +
740 }
│ │ │ │ +
│ │ │ │ +
741
│ │ │ │ +
742 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
744 {};
│ │ │ │ +
│ │ │ │ +
745
│ │ │ │ +
746 template<typename B, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
748 {
│ │ │ │ +
749 enum {
│ │ │ │ +
750 rows = 1,
│ │ │ │ +
751 cols = 1
│ │ │ │ +
752 };
│ │ │ │ +
753 };
│ │ │ │ +
│ │ │ │ +
754
│ │ │ │ +
755 template<typename B, int i, int j, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
757 {
│ │ │ │ +
758 enum {
│ │ │ │ +
759 rows = i,
│ │ │ │ +
760 cols = j
│ │ │ │ +
761 };
│ │ │ │ +
762 };
│ │ │ │ +
│ │ │ │ +
763
│ │ │ │ +
764 template<typename T, typename A, typename D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
766 std::istream& file, std::size_t entries,
│ │ │ │ +
767 const MMHeader& mmHeader, const D&)
│ │ │ │ +
768 {
│ │ │ │ + │ │ │ │ +
770
│ │ │ │ +
771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
│ │ │ │ +
772 constexpr int brows = mm_multipliers<Matrix>::rows;
│ │ │ │ +
773 constexpr int bcols = mm_multipliers<Matrix>::cols;
│ │ │ │ +
774
│ │ │ │ +
775 // First path
│ │ │ │ +
776 // store entries together with column index in a separate
│ │ │ │ +
777 // data structure
│ │ │ │ +
778 std::vector<std::set<IndexData<D> > > rows(matrix.N()*brows);
│ │ │ │ +
779
│ │ │ │ +
780 auto readloop = [&] (auto symmetryFixup) {
│ │ │ │ +
781 for(std::size_t i = 0; i < entries; ++i) {
│ │ │ │ +
782 std::size_t row;
│ │ │ │ +
783 IndexData<D> data;
│ │ │ │ +
784 skipComments(file);
│ │ │ │ +
785 file>>row;
│ │ │ │ +
786 --row; // Index was 1 based.
│ │ │ │ +
787 assert(row/bcols<matrix.N());
│ │ │ │ +
788 file>>data;
│ │ │ │ +
789 assert(data.index/bcols<matrix.M());
│ │ │ │ +
790 rows[row].insert(data);
│ │ │ │ +
791 if(row!=data.index)
│ │ │ │ +
792 symmetryFixup(row, data);
│ │ │ │ +
793 }
│ │ │ │ +
794 };
│ │ │ │ +
795
│ │ │ │ +
796 switch(mmHeader.structure)
│ │ │ │ +
797 {
│ │ │ │ +
798 case general:
│ │ │ │ +
799 readloop([](auto...){});
│ │ │ │ +
800 break;
│ │ │ │ +
801 case symmetric :
│ │ │ │ +
802 readloop([&](auto row, auto data) {
│ │ │ │ +
803 IndexData<D> data_sym(data);
│ │ │ │ +
804 data_sym.index = row;
│ │ │ │ +
805 rows[data.index].insert(data_sym);
│ │ │ │ +
806 });
│ │ │ │ +
807 break;
│ │ │ │ +
808 case skew_symmetric :
│ │ │ │ +
809 readloop([&](auto row, auto data) {
│ │ │ │ +
810 IndexData<D> data_sym;
│ │ │ │ +
811 data_sym.number = -data.number;
│ │ │ │ +
812 data_sym.index = row;
│ │ │ │ +
813 rows[data.index].insert(data_sym);
│ │ │ │ +
814 });
│ │ │ │ +
815 break;
│ │ │ │ +
816 case hermitian :
│ │ │ │ +
817 readloop([&](auto row, auto data) {
│ │ │ │ +
818 IndexData<D> data_sym;
│ │ │ │ +
819 data_sym.number = conj(data.number);
│ │ │ │ +
820 data_sym.index = row;
│ │ │ │ +
821 rows[data.index].insert(data_sym);
│ │ │ │ +
822 });
│ │ │ │ +
823 break;
│ │ │ │ +
824 default:
│ │ │ │ +
825 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ +
826 "Only general, symmetric, skew-symmetric and hermitian is supported right now!");
│ │ │ │ +
827 }
│ │ │ │ +
828
│ │ │ │ +
829 // Setup the matrix sparsity pattern
│ │ │ │ +
830 int nnz=0;
│ │ │ │ +
831 for(typename Matrix::CreateIterator iter=matrix.createbegin();
│ │ │ │ +
832 iter!= matrix.createend(); ++iter)
│ │ │ │ +
833 {
│ │ │ │ +
834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows;
│ │ │ │ +
835 brow<browend; ++brow)
│ │ │ │ +
836 {
│ │ │ │ +
837 typedef typename std::set<IndexData<D> >::const_iterator Siter;
│ │ │ │ +
838 for(Siter siter=rows[brow].begin(), send=rows[brow].end();
│ │ │ │ +
839 siter != send; ++siter, ++nnz)
│ │ │ │ +
840 iter.insert(siter->index/bcols);
│ │ │ │ +
841 }
│ │ │ │ +
842 }
│ │ │ │ +
843
│ │ │ │ +
844 //Set the matrix values
│ │ │ │ +
845 matrix=0;
│ │ │ │ +
846
│ │ │ │ + │ │ │ │ +
848
│ │ │ │ +
849 Setter(rows, matrix);
│ │ │ │ +
850 }
│ │ │ │ +
│ │ │ │ +
851
│ │ │ │ +
│ │ │ │ +
852 inline std::tuple<std::string, std::string> splitFilename(const std::string& filename) {
│ │ │ │ +
853 std::size_t lastdot = filename.find_last_of(".");
│ │ │ │ +
854 if(lastdot == std::string::npos)
│ │ │ │ +
855 return std::make_tuple(filename, "");
│ │ │ │ +
856 else {
│ │ │ │ +
857 std::string potentialFileExtension = filename.substr(lastdot);
│ │ │ │ +
858 if (potentialFileExtension == ".mm" || potentialFileExtension == ".mtx")
│ │ │ │ +
859 return std::make_tuple(filename.substr(0, lastdot), potentialFileExtension);
│ │ │ │ +
860 else
│ │ │ │ +
861 return std::make_tuple(filename, "");
│ │ │ │ +
862 }
│ │ │ │ +
863 }
│ │ │ │ +
│ │ │ │ +
864
│ │ │ │ +
865 } // end namespace MatrixMarketImpl
│ │ │ │ +
│ │ │ │ +
866
│ │ │ │ +
│ │ │ │ +
867 class MatrixMarketFormatError : public Dune::Exception
│ │ │ │ +
868 {};
│ │ │ │ +
│ │ │ │ +
869
│ │ │ │ +
870
│ │ │ │ +
│ │ │ │ +
871 inline void mm_read_header(std::size_t& rows, std::size_t& cols,
│ │ │ │ +
872 MatrixMarketImpl::MMHeader& header, std::istream& istr,
│ │ │ │ +
873 bool isVector)
│ │ │ │ +
874 {
│ │ │ │ +
875 using namespace MatrixMarketImpl;
│ │ │ │ +
876
│ │ │ │ +
877 if(!readMatrixMarketBanner(istr, header)) {
│ │ │ │ +
878 std::cerr << "First line was not a correct Matrix Market banner. Using default:\n"
│ │ │ │ +
879 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
│ │ │ │ +
880 // Go to the beginning of the file
│ │ │ │ +
881 istr.clear() ;
│ │ │ │ +
882 istr.seekg(0, std::ios::beg);
│ │ │ │ +
883 if(isVector)
│ │ │ │ +
884 header.type=array_type;
│ │ │ │ +
885 }
│ │ │ │ +
886
│ │ │ │ +
887 skipComments(istr);
│ │ │ │ +
888
│ │ │ │ +
889 if(lineFeed(istr))
│ │ │ │ + │ │ │ │ +
891
│ │ │ │ +
892 istr >> rows;
│ │ │ │ +
893
│ │ │ │ +
894 if(lineFeed(istr))
│ │ │ │ + │ │ │ │ +
896 istr >> cols;
│ │ │ │ +
897 }
│ │ │ │ +
│ │ │ │ +
898
│ │ │ │ +
899 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
901 std::size_t size,
│ │ │ │ +
902 std::istream& istr,
│ │ │ │ +
903 size_t lane)
│ │ │ │ +
904 {
│ │ │ │ +
905 for (int i=0; size>0; ++i, --size)
│ │ │ │ +
906 istr>>Simd::lane(lane,vector[i]);
│ │ │ │ +
907 }
│ │ │ │ +
│ │ │ │ +
908
│ │ │ │ +
909 template<typename T, typename A, int entries>
│ │ │ │ +
│ │ │ │ +
910 void mm_read_vector_entries(Dune::BlockVector<Dune::FieldVector<T,entries>,A>& vector,
│ │ │ │ +
911 std::size_t size,
│ │ │ │ +
912 std::istream& istr,
│ │ │ │ +
913 size_t lane)
│ │ │ │ +
914 {
│ │ │ │ +
915 for(int i=0; size>0; ++i, --size) {
│ │ │ │ +
916 Simd::Scalar<T> val;
│ │ │ │ +
917 istr>>val;
│ │ │ │ +
918 Simd::lane(lane, vector[i/entries][i%entries])=val;
│ │ │ │ +
919 }
│ │ │ │ +
920 }
│ │ │ │ +
│ │ │ │ +
921
│ │ │ │ +
922
│ │ │ │ +
929 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
931 std::istream& istr)
│ │ │ │ +
932 {
│ │ │ │ +
933 typedef typename Dune::BlockVector<T,A>::field_type field_type;
│ │ │ │ +
934 using namespace MatrixMarketImpl;
│ │ │ │ +
935
│ │ │ │ +
936 MMHeader header;
│ │ │ │ +
937 std::size_t rows, cols;
│ │ │ │ +
938 mm_read_header(rows,cols,header,istr, true);
│ │ │ │ +
939 if(cols!=Simd::lanes<field_type>()) {
│ │ │ │ +
940 if(Simd::lanes<field_type>() == 1)
│ │ │ │ +
941 DUNE_THROW(MatrixMarketFormatError, "cols!=1, therefore this is no vector!");
│ │ │ │ +
942 else
│ │ │ │ +
943 DUNE_THROW(MatrixMarketFormatError, "cols does not match the number of lanes in the field_type!");
│ │ │ │ +
944 }
│ │ │ │ +
945
│ │ │ │ +
946 if(header.type!=array_type)
│ │ │ │ +
947 DUNE_THROW(MatrixMarketFormatError, "Vectors have to be stored in array format!");
│ │ │ │ +
948
│ │ │ │ +
949
│ │ │ │ +
950 if constexpr (Dune::IsNumber<T>())
│ │ │ │ +
951 vector.resize(rows);
│ │ │ │ +
952 else
│ │ │ │ +
953 {
│ │ │ │ +
954 T dummy;
│ │ │ │ +
955 auto blocksize = dummy.size();
│ │ │ │ +
956 std::size_t size=rows/blocksize;
│ │ │ │ +
957 if(size*blocksize!=rows)
│ │ │ │ +
958 DUNE_THROW(MatrixMarketFormatError, "Block size of vector is not correct!");
│ │ │ │ +
959
│ │ │ │ +
960 vector.resize(size);
│ │ │ │ +
961 }
│ │ │ │ +
962
│ │ │ │ +
963 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
964 for(size_t l=0;l<Simd::lanes<field_type>();++l){
│ │ │ │ +
965 mm_read_vector_entries(vector, rows, istr, l);
│ │ │ │ +
966 }
│ │ │ │ +
967 }
│ │ │ │ +
│ │ │ │ +
968
│ │ │ │ +
975 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
977 std::istream& istr)
│ │ │ │ +
978 {
│ │ │ │ +
979 using namespace MatrixMarketImpl;
│ │ │ │ + │ │ │ │ +
981
│ │ │ │ +
982 MMHeader header;
│ │ │ │ +
983 if(!readMatrixMarketBanner(istr, header)) {
│ │ │ │ +
984 std::cerr << "First line was not a correct Matrix Market banner. Using default:\n"
│ │ │ │ +
985 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
│ │ │ │ +
986 // Go to the beginning of the file
│ │ │ │ +
987 istr.clear() ;
│ │ │ │ +
988 istr.seekg(0, std::ios::beg);
│ │ │ │ +
989 }
│ │ │ │ +
990 skipComments(istr);
│ │ │ │ +
991
│ │ │ │ +
992 std::size_t rows, cols, entries;
│ │ │ │ +
993
│ │ │ │ +
994 if(lineFeed(istr))
│ │ │ │ + │ │ │ │ +
996
│ │ │ │ +
997 istr >> rows;
│ │ │ │ +
998
│ │ │ │ +
999 if(lineFeed(istr))
│ │ │ │ + │ │ │ │ +
1001 istr >> cols;
│ │ │ │ +
1002
│ │ │ │ +
1003 if(lineFeed(istr))
│ │ │ │ + │ │ │ │ +
1005
│ │ │ │ +
1006 istr >>entries;
│ │ │ │ +
1007
│ │ │ │ +
1008 std::size_t nnz, blockrows, blockcols;
│ │ │ │ +
1009
│ │ │ │ +
1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
│ │ │ │ +
1011 constexpr int brows = mm_multipliers<Matrix>::rows;
│ │ │ │ +
1012 constexpr int bcols = mm_multipliers<Matrix>::cols;
│ │ │ │ +
1013
│ │ │ │ +
1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ<brows, bcols>(rows, cols, entries, header);
│ │ │ │ +
1015
│ │ │ │ +
1016 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ +
1017
│ │ │ │ +
1018
│ │ │ │ +
1019 matrix.setSize(blockrows, blockcols, nnz);
│ │ │ │ + │ │ │ │ +
1021
│ │ │ │ +
1022 if(header.type==array_type)
│ │ │ │ +
1023 DUNE_THROW(Dune::NotImplemented, "Array format currently not supported for matrices!");
│ │ │ │ +
1024
│ │ │ │ +
1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper<typename Matrix::field_type>());
│ │ │ │ +
1026 }
│ │ │ │ +
│ │ │ │ +
1027
│ │ │ │ +
1028 // Print a scalar entry
│ │ │ │ +
1029 template<typename B>
│ │ │ │ +
│ │ │ │ +
1030 void mm_print_entry(const B& entry,
│ │ │ │ +
1031 std::size_t rowidx,
│ │ │ │ +
1032 std::size_t colidx,
│ │ │ │ +
1033 std::ostream& ostr)
│ │ │ │ +
1034 {
│ │ │ │ +
1035 if constexpr (IsNumber<B>())
│ │ │ │ +
1036 ostr << rowidx << " " << colidx << " " << entry << std::endl;
│ │ │ │ +
1037 else
│ │ │ │ +
1038 {
│ │ │ │ +
1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) {
│ │ │ │ +
1040 int coli=colidx;
│ │ │ │ +
1041 for (auto col = row->begin(); col != row->end(); ++col, ++coli)
│ │ │ │ +
1042 ostr<< rowidx<<" "<<coli<<" "<<*col<<std::endl;
│ │ │ │ +
1043 }
│ │ │ │ +
1044 }
│ │ │ │ +
1045 }
│ │ │ │ +
│ │ │ │ +
1046
│ │ │ │ +
1047 // Write a vector entry
│ │ │ │ +
1048 template<typename V>
│ │ │ │ +
│ │ │ │ +
1049 void mm_print_vector_entry(const V& entry, std::ostream& ostr,
│ │ │ │ +
1050 const std::integral_constant<int,1>&,
│ │ │ │ +
1051 size_t lane)
│ │ │ │ +
1052 {
│ │ │ │ +
1053 ostr<<Simd::lane(lane,entry)<<std::endl;
│ │ │ │ +
1054 }
│ │ │ │ +
│ │ │ │ +
1055
│ │ │ │ +
1056 // Write a vector
│ │ │ │ +
1057 template<typename V>
│ │ │ │ +
│ │ │ │ +
1058 void mm_print_vector_entry(const V& vector, std::ostream& ostr,
│ │ │ │ +
1059 const std::integral_constant<int,0>&,
│ │ │ │ +
1060 size_t lane)
│ │ │ │ +
1061 {
│ │ │ │ +
1062 using namespace MatrixMarketImpl;
│ │ │ │ +
1063
│ │ │ │ +
1064 // Is the entry a supported numeric type?
│ │ │ │ +
1065 const int isnumeric = mm_numeric_type<Simd::Scalar<typename V::block_type>>::is_numeric;
│ │ │ │ +
1066 typedef typename V::const_iterator VIter;
│ │ │ │ +
1067
│ │ │ │ +
1068 for(VIter i=vector.begin(); i != vector.end(); ++i)
│ │ │ │ +
1069
│ │ │ │ +
1070 mm_print_vector_entry(*i, ostr,
│ │ │ │ +
1071 std::integral_constant<int,isnumeric>(),
│ │ │ │ +
1072 lane);
│ │ │ │ +
1073 }
│ │ │ │ +
│ │ │ │ +
1074
│ │ │ │ +
1075 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1076 std::size_t countEntries(const BlockVector<T,A>& vector)
│ │ │ │ +
1077 {
│ │ │ │ +
1078 return vector.size();
│ │ │ │ +
1079 }
│ │ │ │ +
│ │ │ │ +
1080
│ │ │ │ +
1081 template<typename T, typename A, int i>
│ │ │ │ +
│ │ │ │ +
1082 std::size_t countEntries(const BlockVector<FieldVector<T,i>,A>& vector)
│ │ │ │ +
1083 {
│ │ │ │ +
1084 return vector.size()*i;
│ │ │ │ +
1085 }
│ │ │ │ +
│ │ │ │ +
1086
│ │ │ │ +
1087 // Version for writing vectors.
│ │ │ │ +
1088 template<typename V>
│ │ │ │ +
│ │ │ │ +
1089 void writeMatrixMarket(const V& vector, std::ostream& ostr,
│ │ │ │ +
1090 const std::integral_constant<int,0>&)
│ │ │ │ +
1091 {
│ │ │ │ +
1092 using namespace MatrixMarketImpl;
│ │ │ │ +
1093 typedef typename V::field_type field_type;
│ │ │ │ +
1094
│ │ │ │ +
1095 ostr<<countEntries(vector)<<" "<<Simd::lanes<field_type>()<<std::endl;
│ │ │ │ +
1096 const int isnumeric = mm_numeric_type<Simd::Scalar<V>>::is_numeric;
│ │ │ │ +
1097 for(size_t l=0;l<Simd::lanes<field_type>(); ++l){
│ │ │ │ +
1098 mm_print_vector_entry(vector,ostr, std::integral_constant<int,isnumeric>(), l);
│ │ │ │ +
1099 }
│ │ │ │ +
1100 }
│ │ │ │ +
│ │ │ │ +
1101
│ │ │ │ +
1102 // Versions for writing matrices
│ │ │ │ +
1103 template<typename M>
│ │ │ │ +
│ │ │ │ +
1104 void writeMatrixMarket(const M& matrix,
│ │ │ │ +
1105 std::ostream& ostr,
│ │ │ │ +
1106 const std::integral_constant<int,1>&)
│ │ │ │ +
1107 {
│ │ │ │ +
1108 ostr<<matrix.N()*MatrixMarketImpl::mm_multipliers<M>::rows<<" "
│ │ │ │ + │ │ │ │ +
1110 <<countNonZeros(matrix)<<std::endl;
│ │ │ │ +
1111
│ │ │ │ +
1112 typedef typename M::const_iterator riterator;
│ │ │ │ +
1113 typedef typename M::ConstColIterator citerator;
│ │ │ │ +
1114 for(riterator row=matrix.begin(); row != matrix.end(); ++row)
│ │ │ │ +
1115 for(citerator col = row->begin(); col != row->end(); ++col)
│ │ │ │ +
1116 // Matrix Market indexing start with 1!
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1119 }
│ │ │ │ +
│ │ │ │ +
1120
│ │ │ │ +
1121
│ │ │ │ +
1125 template<typename M>
│ │ │ │ +
│ │ │ │ +
1126 void writeMatrixMarket(const M& matrix,
│ │ │ │ +
1127 std::ostream& ostr)
│ │ │ │ +
1128 {
│ │ │ │ +
1129 using namespace MatrixMarketImpl;
│ │ │ │ +
1130
│ │ │ │ +
1131 // Write header information
│ │ │ │ +
1132 mm_header_printer<M>::print(ostr);
│ │ │ │ +
1133 mm_block_structure_header<M>::print(ostr,matrix);
│ │ │ │ +
1134 // Choose the correct function for matrix and vector
│ │ │ │ +
1135 writeMatrixMarket(matrix,ostr,std::integral_constant<int,IsMatrix<M>::value>());
│ │ │ │ +
1136 }
│ │ │ │ +
│ │ │ │ +
1137
│ │ │ │ +
1138 static const int default_precision = -1;
│ │ │ │ +
1150 template<typename M>
│ │ │ │ +
│ │ │ │ +
1151 void storeMatrixMarket(const M& matrix,
│ │ │ │ +
1152 std::string filename,
│ │ │ │ +
1153 int prec=default_precision)
│ │ │ │ +
1154 {
│ │ │ │ +
1155 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ +
1156 std::string rfilename;
│ │ │ │ +
1157 std::ofstream file;
│ │ │ │ +
1158 if (extension != "") {
│ │ │ │ +
1159 rfilename = pureFilename + extension;
│ │ │ │ +
1160 file.open(rfilename.c_str());
│ │ │ │ +
1161 if(!file)
│ │ │ │ +
1162 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ +
1163 }
│ │ │ │ +
1164 else {
│ │ │ │ +
1165 // only try .mm so we do not ignore potential errors
│ │ │ │ +
1166 rfilename = pureFilename + ".mm";
│ │ │ │ +
1167 file.open(rfilename.c_str());
│ │ │ │ +
1168 if(!file)
│ │ │ │ +
1169 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ +
1170 }
│ │ │ │ +
1171
│ │ │ │ +
1172 file.setf(std::ios::scientific,std::ios::floatfield);
│ │ │ │ +
1173 if(prec>0)
│ │ │ │ +
1174 file.precision(prec);
│ │ │ │ +
1175 writeMatrixMarket(matrix, file);
│ │ │ │ +
1176 file.close();
│ │ │ │ +
1177 }
│ │ │ │ +
│ │ │ │ +
1178
│ │ │ │ +
1179#if HAVE_MPI
│ │ │ │ +
1194 template<typename M, typename G, typename L>
│ │ │ │ +
│ │ │ │ +
1195 void storeMatrixMarket(const M& matrix,
│ │ │ │ +
1196 std::string filename,
│ │ │ │ + │ │ │ │ +
1198 bool storeIndices=true,
│ │ │ │ +
1199 int prec=default_precision)
│ │ │ │ +
1200 {
│ │ │ │ +
1201 // Get our rank
│ │ │ │ +
1202 int rank = comm.communicator().rank();
│ │ │ │ +
1203 // Write the local matrix
│ │ │ │ +
1204 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ +
1205 std::string rfilename;
│ │ │ │ +
1206 std::ofstream file;
│ │ │ │ +
1207 if (extension != "") {
│ │ │ │ +
1208 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
│ │ │ │ +
1209 file.open(rfilename.c_str());
│ │ │ │ +
1210 dverb<< rfilename <<std::endl;
│ │ │ │ +
1211 if(!file)
│ │ │ │ +
1212 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ +
1213 }
│ │ │ │ +
1214 else {
│ │ │ │ +
1215 // only try .mm so we do not ignore potential errors
│ │ │ │ +
1216 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
│ │ │ │ +
1217 file.open(rfilename.c_str());
│ │ │ │ +
1218 dverb<< rfilename <<std::endl;
│ │ │ │ +
1219 if(!file)
│ │ │ │ +
1220 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ +
1221 }
│ │ │ │ +
1222 file.setf(std::ios::scientific,std::ios::floatfield);
│ │ │ │ +
1223 if(prec>0)
│ │ │ │ +
1224 file.precision(prec);
│ │ │ │ +
1225 writeMatrixMarket(matrix, file);
│ │ │ │ +
1226 file.close();
│ │ │ │ +
1227
│ │ │ │ +
1228 if(!storeIndices)
│ │ │ │ +
1229 return;
│ │ │ │ +
1230
│ │ │ │ +
1231 // Write the global to local index mapping
│ │ │ │ +
1232 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
│ │ │ │ +
1233 file.open(rfilename.c_str());
│ │ │ │ +
1234 if(!file)
│ │ │ │ +
1235 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ +
1236 file.setf(std::ios::scientific,std::ios::floatfield);
│ │ │ │ + │ │ │ │ +
1238 typedef typename IndexSet::const_iterator Iterator;
│ │ │ │ +
1239 for(Iterator iter = comm.indexSet().begin();
│ │ │ │ +
1240 iter != comm.indexSet().end(); ++iter) {
│ │ │ │ +
1241 file << iter->global()<<" "<<(std::size_t)iter->local()<<" "
│ │ │ │ +
1242 <<(int)iter->local().attribute()<<" "<<(int)iter->local().isPublic()<<std::endl;
│ │ │ │ +
1243 }
│ │ │ │ +
1244 // Store neighbour information for efficient remote indices setup.
│ │ │ │ +
1245 file<<"neighbours:";
│ │ │ │ +
1246 const std::set<int>& neighbours=comm.remoteIndices().getNeighbours();
│ │ │ │ +
1247 typedef std::set<int>::const_iterator SIter;
│ │ │ │ +
1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end(); ++neighbour) {
│ │ │ │ +
1249 file<<" "<< *neighbour;
│ │ │ │ +
1250 }
│ │ │ │ +
1251 file.close();
│ │ │ │ +
1252 }
│ │ │ │ +
│ │ │ │ +
1253
│ │ │ │ +
1268 template<typename M, typename G, typename L>
│ │ │ │ +
│ │ │ │ +
1269 void loadMatrixMarket(M& matrix,
│ │ │ │ +
1270 const std::string& filename,
│ │ │ │ + │ │ │ │ +
1272 bool readIndices=true)
│ │ │ │ +
1273 {
│ │ │ │ +
1274 using namespace MatrixMarketImpl;
│ │ │ │ +
1275
│ │ │ │ + │ │ │ │ +
1277 typedef typename LocalIndexT::Attribute Attribute;
│ │ │ │ +
1278 // Get our rank
│ │ │ │ +
1279 int rank = comm.communicator().rank();
│ │ │ │ +
1280 // load local matrix
│ │ │ │ +
1281 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ +
1282 std::string rfilename;
│ │ │ │ +
1283 std::ifstream file;
│ │ │ │ +
1284 if (extension != "") {
│ │ │ │ +
1285 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
│ │ │ │ +
1286 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ +
1287 dverb<< rfilename <<std::endl;
│ │ │ │ +
1288 if(!file)
│ │ │ │ +
1289 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ +
1290 }
│ │ │ │ +
1291 else {
│ │ │ │ +
1292 // try both .mm and .mtx
│ │ │ │ +
1293 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
│ │ │ │ +
1294 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ +
1295 if(!file) {
│ │ │ │ +
1296 rfilename = pureFilename + "_" + std::to_string(rank) + ".mtx";
│ │ │ │ +
1297 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ +
1298 dverb<< rfilename <<std::endl;
│ │ │ │ +
1299 if(!file)
│ │ │ │ +
1300 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ +
1301 }
│ │ │ │ +
1302 }
│ │ │ │ +
1303 readMatrixMarket(matrix,file);
│ │ │ │ +
1304 file.close();
│ │ │ │ +
1305
│ │ │ │ +
1306 if(!readIndices)
│ │ │ │ +
1307 return;
│ │ │ │ +
1308
│ │ │ │ +
1309 // read indices
│ │ │ │ + │ │ │ │ +
1311 IndexSet& pis=comm.pis;
│ │ │ │ +
1312 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
│ │ │ │ +
1313 file.open(rfilename.c_str());
│ │ │ │ +
1314 if(!file)
│ │ │ │ +
1315 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ +
1316 if(pis.size()!=0)
│ │ │ │ +
1317 DUNE_THROW(InvalidIndexSetState, "Index set is not empty!");
│ │ │ │ +
1318
│ │ │ │ +
1319 pis.beginResize();
│ │ │ │ +
1320 while(!file.eof() && file.peek()!='n') {
│ │ │ │ +
1321 G g;
│ │ │ │ +
1322 file >>g;
│ │ │ │ +
1323 std::size_t l;
│ │ │ │ +
1324 file >>l;
│ │ │ │ +
1325 int c;
│ │ │ │ +
1326 file >>c;
│ │ │ │ +
1327 bool b;
│ │ │ │ +
1328 file >> b;
│ │ │ │ +
1329 pis.add(g,LocalIndexT(l,Attribute(c),b));
│ │ │ │ +
1330 lineFeed(file);
│ │ │ │ +
1331 }
│ │ │ │ +
1332 pis.endResize();
│ │ │ │ +
1333 if(!file.eof()) {
│ │ │ │ +
1334 // read neighbours
│ │ │ │ +
1335 std::string s;
│ │ │ │ +
1336 file>>s;
│ │ │ │ +
1337 if(s!="neighbours:")
│ │ │ │ +
1338 DUNE_THROW(MatrixMarketFormatError, "was expecting the string: \"neighbours:\"");
│ │ │ │ +
1339 std::set<int> nb;
│ │ │ │ +
1340 while(!file.eof()) {
│ │ │ │ +
1341 int i;
│ │ │ │ +
1342 file >> i;
│ │ │ │ +
1343 nb.insert(i);
│ │ │ │ +
1344 }
│ │ │ │ +
1345 file.close();
│ │ │ │ +
1346 comm.ri.setNeighbours(nb);
│ │ │ │ +
1347 }
│ │ │ │ +
1348 comm.ri.template rebuild<false>();
│ │ │ │ +
1349 }
│ │ │ │ +
│ │ │ │ +
1350
│ │ │ │ +
1351 #endif
│ │ │ │ +
1352
│ │ │ │ +
1363 template<typename M>
│ │ │ │ +
│ │ │ │ +
1364 void loadMatrixMarket(M& matrix,
│ │ │ │ +
1365 const std::string& filename)
│ │ │ │ +
1366 {
│ │ │ │ +
1367 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ +
1368 std::string rfilename;
│ │ │ │ +
1369 std::ifstream file;
│ │ │ │ +
1370 if (extension != "") {
│ │ │ │ +
1371 rfilename = pureFilename + extension;
│ │ │ │ +
1372 file.open(rfilename.c_str());
│ │ │ │ +
1373 if(!file)
│ │ │ │ +
1374 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ +
1375 }
│ │ │ │ +
1376 else {
│ │ │ │ +
1377 // try both .mm and .mtx
│ │ │ │ +
1378 rfilename = pureFilename + ".mm";
│ │ │ │ +
1379 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ +
1380 if(!file) {
│ │ │ │ +
1381 rfilename = pureFilename + ".mtx";
│ │ │ │ +
1382 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ +
1383 if(!file)
│ │ │ │ +
1384 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ +
1385 }
│ │ │ │ +
1386 }
│ │ │ │ +
1387 readMatrixMarket(matrix,file);
│ │ │ │ +
1388 file.close();
│ │ │ │ +
1389 }
│ │ │ │ +
│ │ │ │ +
1390
│ │ │ │ +
1392}
│ │ │ │ +
1393#endif
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Some handy generic functions for ISTL matrices.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
Get the number of nonzero fields in the matrix.
Definition matrixutils.hh:119
│ │ │ │ +
void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr)
Reads a BlockVector from a matrix market file.
Definition matrixmarket.hh:930
│ │ │ │ +
void storeMatrixMarket(const M &matrix, std::string filename, int prec=default_precision)
Stores a parallel matrix/vector in matrix market format in a file.
Definition matrixmarket.hh:1151
│ │ │ │ +
void loadMatrixMarket(M &matrix, const std::string &filename, OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true)
Load a parallel matrix/vector stored in matrix market format.
Definition matrixmarket.hh:1269
│ │ │ │ +
std::size_t countEntries(const BlockVector< T, A > &vector)
Definition matrixmarket.hh:1076
│ │ │ │ +
void writeMatrixMarket(const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &)
Definition matrixmarket.hh:1089
│ │ │ │ +
void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std::integral_constant< int, 1 > &, size_t lane)
Definition matrixmarket.hh:1049
│ │ │ │ +
static const int default_precision
Definition matrixmarket.hh:1138
│ │ │ │ +
void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t size, std::istream &istr, size_t lane)
Definition matrixmarket.hh:900
│ │ │ │ +
void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl::MMHeader &header, std::istream &istr, bool isVector)
Definition matrixmarket.hh:871
│ │ │ │ +
void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx, std::ostream &ostr)
Definition matrixmarket.hh:1030
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A Vector class to support different block types.
Definition multitypeblockvector.hh:59
│ │ │ │ -
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
│ │ │ │ -
compile-time parameter for block recursion depth
Definition gsetc.hh:45
│ │ │ │ -
@ recursion_level
Definition gsetc.hh:46
│ │ │ │ -
Definition gsetc.hh:69
│ │ │ │ -
static void butsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:90
│ │ │ │ -
static void bltsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:71
│ │ │ │ -
static void bltsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:114
│ │ │ │ -
static void butsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:120
│ │ │ │ -
static void bltsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:129
│ │ │ │ -
static void butsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:134
│ │ │ │ -
static void bltsolve(const M &, X &v, const Y &d, const K &w)
Definition gsetc.hh:142
│ │ │ │ -
static void butsolve(const M &, X &v, const Y &d, const K &w)
Definition gsetc.hh:148
│ │ │ │ -
static void bltsolve(const M &, X &v, const Y &d, const K &)
Definition gsetc.hh:157
│ │ │ │ -
static void butsolve(const M &, X &v, const Y &d, const K &)
Definition gsetc.hh:162
│ │ │ │ -
Definition gsetc.hh:294
│ │ │ │ -
static void bdsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:296
│ │ │ │ -
static void bdsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:316
│ │ │ │ -
static void bdsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:325
│ │ │ │ -
Definition gsetc.hh:375
│ │ │ │ -
static void bsorb(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:461
│ │ │ │ -
static void bsorf(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:418
│ │ │ │ -
static void dbjac(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:504
│ │ │ │ -
static void dbgs(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:378
│ │ │ │ -
static void dbgs(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:545
│ │ │ │ -
static void dbjac(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:560
│ │ │ │ -
static void bsorf(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:550
│ │ │ │ -
static void bsorb(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:555
│ │ │ │ -
static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:571
│ │ │ │ -
static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:608
│ │ │ │ -
static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:583
│ │ │ │ -
static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:595
│ │ │ │ +
std::tuple< std::size_t, std::size_t, std::size_t > calculateNNZ(std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader &header)
Definition matrixmarket.hh:547
│ │ │ │ +
bool operator<(const IndexData< T > &i1, const IndexData< T > &i2)
LessThan operator.
Definition matrixmarket.hh:630
│ │ │ │ +
LineType
Definition matrixmarket.hh:296
│ │ │ │ +
@ DATA
Definition matrixmarket.hh:296
│ │ │ │ +
@ MM_HEADER
Definition matrixmarket.hh:296
│ │ │ │ +
@ MM_ISTLSTRUCT
Definition matrixmarket.hh:296
│ │ │ │ +
bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader)
Definition matrixmarket.hh:353
│ │ │ │ +
void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file, std::size_t entries, const MMHeader &mmHeader, const D &)
Definition matrixmarket.hh:765
│ │ │ │ +
MM_TYPE
Definition matrixmarket.hh:299
│ │ │ │ +
@ array_type
Definition matrixmarket.hh:299
│ │ │ │ +
@ coordinate_type
Definition matrixmarket.hh:299
│ │ │ │ +
@ unknown_type
Definition matrixmarket.hh:299
│ │ │ │ +
std::istream & operator>>(std::istream &is, NumericWrapper< T > &num)
Definition matrixmarket.hh:614
│ │ │ │ +
void skipComments(std::istream &file)
Definition matrixmarket.hh:339
│ │ │ │ +
bool lineFeed(std::istream &file)
Definition matrixmarket.hh:315
│ │ │ │ +
@ MM_MAX_LINE_LENGTH
Definition matrixmarket.hh:297
│ │ │ │ +
MM_STRUCTURE
Definition matrixmarket.hh:303
│ │ │ │ +
@ skew_symmetric
Definition matrixmarket.hh:303
│ │ │ │ +
@ general
Definition matrixmarket.hh:303
│ │ │ │ +
@ hermitian
Definition matrixmarket.hh:303
│ │ │ │ +
@ unknown_structure
Definition matrixmarket.hh:303
│ │ │ │ +
@ symmetric
Definition matrixmarket.hh:303
│ │ │ │ +
MM_CTYPE
Definition matrixmarket.hh:301
│ │ │ │ +
@ unknown_ctype
Definition matrixmarket.hh:301
│ │ │ │ +
@ pattern
Definition matrixmarket.hh:301
│ │ │ │ +
@ complex_type
Definition matrixmarket.hh:301
│ │ │ │ +
@ double_type
Definition matrixmarket.hh:301
│ │ │ │ +
@ integer_type
Definition matrixmarket.hh:301
│ │ │ │ +
std::enable_if_t<!is_complex< T >::value, T > conj(const T &r)
Definition matrixmarket.hh:733
│ │ │ │ +
std::tuple< std::string, std::string > splitFilename(const std::string &filename)
Definition matrixmarket.hh:852
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
Iterator begin()
Get iterator to first row.
Definition bcrsmatrix.hh:675
│ │ │ │ +
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ +
CreateIterator createend()
get create iterator pointing to one after the last block
Definition bcrsmatrix.hh:1103
│ │ │ │ +
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │ +
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ +
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
void setBuildMode(BuildMode bm)
Sets the build mode of the matrix.
Definition bcrsmatrix.hh:833
│ │ │ │ +
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
void resize(size_type size)
Resize the vector.
Definition bvector.hh:503
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
Helper metaprogram to get the matrix market string representation of the numeric type.
Definition matrixmarket.hh:76
│ │ │ │ +
@ is_numeric
Whether T is a supported numeric type.
Definition matrixmarket.hh:81
│ │ │ │ +
static std::string str()
Definition matrixmarket.hh:95
│ │ │ │ +
static std::string str()
Definition matrixmarket.hh:111
│ │ │ │ +
static std::string str()
Definition matrixmarket.hh:127
│ │ │ │ +
static std::string str()
Definition matrixmarket.hh:143
│ │ │ │ +
static std::string str()
Definition matrixmarket.hh:159
│ │ │ │ +
Meta program to write the correct Matrix Market header.
Definition matrixmarket.hh:174
│ │ │ │ +
static void print(std::ostream &os)
Definition matrixmarket.hh:179
│ │ │ │ +
static void print(std::ostream &os)
Definition matrixmarket.hh:189
│ │ │ │ +
static void print(std::ostream &os)
Definition matrixmarket.hh:199
│ │ │ │ +
static void print(std::ostream &os)
Definition matrixmarket.hh:209
│ │ │ │ +
Metaprogram for writing the ISTL block structure header.
Definition matrixmarket.hh:225
│ │ │ │ +
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:233
│ │ │ │ +
BlockVector< T, A > M
Definition matrixmarket.hh:230
│ │ │ │ +
BlockVector< FieldVector< T, i >, A > M
Definition matrixmarket.hh:243
│ │ │ │ +
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:245
│ │ │ │ +
BCRSMatrix< T, A > M
Definition matrixmarket.hh:255
│ │ │ │ +
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:258
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, i, j >, A > M
Definition matrixmarket.hh:268
│ │ │ │ +
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:270
│ │ │ │ +
static void print(std::ostream &os, const M &m)
Definition matrixmarket.hh:283
│ │ │ │ +
FieldMatrix< T, i, j > M
Definition matrixmarket.hh:281
│ │ │ │ +
static void print(std::ostream &os, const M &m)
Definition matrixmarket.hh:292
│ │ │ │ +
FieldVector< T, i > M
Definition matrixmarket.hh:290
│ │ │ │ +
Definition matrixmarket.hh:306
│ │ │ │ +
MM_STRUCTURE structure
Definition matrixmarket.hh:312
│ │ │ │ +
MM_TYPE type
Definition matrixmarket.hh:310
│ │ │ │ +
MMHeader()
Definition matrixmarket.hh:307
│ │ │ │ +
MM_CTYPE ctype
Definition matrixmarket.hh:311
│ │ │ │ +
Definition matrixmarket.hh:578
│ │ │ │ +
std::size_t index
Definition matrixmarket.hh:579
│ │ │ │ +
a wrapper class of numeric values.
Definition matrixmarket.hh:595
│ │ │ │ +
T number
Definition matrixmarket.hh:596
│ │ │ │ +
Utility class for marking the pattern type of the MatrixMarket matrices.
Definition matrixmarket.hh:607
│ │ │ │ +
Functor to the data values of the matrix.
Definition matrixmarket.hh:677
│ │ │ │ +
void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< T > &matrix)
Sets the matrix values.
Definition matrixmarket.hh:684
│ │ │ │ +
void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix)
Sets the matrix values.
Definition matrixmarket.hh:702
│ │ │ │ +
void operator()(const std::vector< std::set< IndexData< PatternDummy > > > &rows, M &matrix)
Definition matrixmarket.hh:723
│ │ │ │ +
Definition matrixmarket.hh:728
│ │ │ │ +
Definition matrixmarket.hh:744
│ │ │ │ +
Definition matrixmarket.hh:868
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │ +
Test whether a type is an ISTL Matrix.
Definition matrixutils.hh:504
│ │ │ │ +
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ +
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:462
│ │ │ │ +
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ +
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ +
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,832 +1,1632 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -gsetc.hh │ │ │ │ │ +matrixmarket.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_GSETC_HH │ │ │ │ │ -6#define DUNE_ISTL_GSETC_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_MATRIXMARKET_HH │ │ │ │ │ +6#define DUNE_ISTL_MATRIXMARKET_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#include │ │ │ │ │ 9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_v_e_c_t_o_r_._h_h" │ │ │ │ │ -17#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_m_a_t_r_i_x_._h_h" │ │ │ │ │ -18 │ │ │ │ │ -19#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -20 │ │ │ │ │ -21 │ │ │ │ │ -27namespace _D_u_n_e { │ │ │ │ │ -28 │ │ │ │ │ -39 //============================================================ │ │ │ │ │ -40 // parameter types │ │ │ │ │ -41 //============================================================ │ │ │ │ │ -42 │ │ │ │ │ -44 template │ │ │ │ │ -_4_5 struct _B_L { │ │ │ │ │ -_4_6 enum {_r_e_c_u_r_s_i_o_n___l_e_v_e_l = l}; │ │ │ │ │ -47 }; │ │ │ │ │ -48 │ │ │ │ │ -_4_9 enum _W_i_t_h_D_i_a_g_T_y_p_e { │ │ │ │ │ -_5_0 _w_i_t_h_d_i_a_g=1, │ │ │ │ │ -51 _n_o_d_i_a_g=0 │ │ │ │ │ -_5_2 }; │ │ │ │ │ -53 │ │ │ │ │ -_5_4 enum _W_i_t_h_R_e_l_a_x_T_y_p_e { │ │ │ │ │ -_5_5 _w_i_t_h_r_e_l_a_x=1, │ │ │ │ │ -56 _n_o_r_e_l_a_x=0 │ │ │ │ │ -_5_7 }; │ │ │ │ │ -58 │ │ │ │ │ -59 //============================================================ │ │ │ │ │ -60 // generic triangular solves │ │ │ │ │ -61 // consider block decomposition A = L + D + U │ │ │ │ │ -62 // we can invert L, L+D, U, U+D │ │ │ │ │ -63 // we can apply relaxation or not │ │ │ │ │ -64 // we can recurse over a fixed number of levels │ │ │ │ │ -65 //============================================================ │ │ │ │ │ -66 │ │ │ │ │ -67 // template meta program for triangular solves │ │ │ │ │ -68 template │ │ │ │ │ -_6_9 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e { │ │ │ │ │ -70 template │ │ │ │ │ -_7_1 static void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -72 { │ │ │ │ │ -73 // iterator types │ │ │ │ │ -74 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -75 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -76 typedef typename Y::block_type bblock; │ │ │ │ │ -77 │ │ │ │ │ -78 // local solve at each block and immediate update │ │ │ │ │ -79 rowiterator endi=A.end(); │ │ │ │ │ -80 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -81 { │ │ │ │ │ -82 bblock rhs(d[i.index()]); │ │ │ │ │ -83 coliterator j; │ │ │ │ │ -84 for (j=(*i).begin(); j.index()_:_:_b_l_t_s_o_l_v_e(*j,v[i.index()],rhs,w); │ │ │ │ │ -87 } │ │ │ │ │ -88 } │ │ │ │ │ -89 template │ │ │ │ │ -_9_0 static void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -91 { │ │ │ │ │ -92 // iterator types │ │ │ │ │ -93 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -94 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -95 typedef typename Y::block_type bblock; │ │ │ │ │ -96 │ │ │ │ │ -97 // local solve at each block and immediate update │ │ │ │ │ -98 rowiterator rendi=A.beforeBegin(); │ │ │ │ │ -99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i) │ │ │ │ │ -100 { │ │ │ │ │ -101 bblock rhs(d[i.index()]); │ │ │ │ │ -102 coliterator j; │ │ │ │ │ -103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j) │ │ │ │ │ -104 (*j).mmv(v[j.index()],rhs); │ │ │ │ │ -105 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_I_-_1_,_d_i_a_g_,_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(*j,v[i.index()],rhs,w); │ │ │ │ │ -106 } │ │ │ │ │ -107 } │ │ │ │ │ -108 }; │ │ │ │ │ -109 │ │ │ │ │ -110 // recursion end ... │ │ │ │ │ -111 template<> │ │ │ │ │ -_1_1_2 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_w_i_t_h_d_i_a_g,_w_i_t_h_r_e_l_a_x> { │ │ │ │ │ -113 template │ │ │ │ │ -_1_1_4 static void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -115 { │ │ │ │ │ -116 A.solve(v,d); │ │ │ │ │ -117 v *= w; │ │ │ │ │ -118 } │ │ │ │ │ -119 template │ │ │ │ │ -_1_2_0 static void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -121 { │ │ │ │ │ -122 A.solve(v,d); │ │ │ │ │ -123 v *= w; │ │ │ │ │ -124 } │ │ │ │ │ -125 }; │ │ │ │ │ -126 template<> │ │ │ │ │ -_1_2_7 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_w_i_t_h_d_i_a_g,_n_o_r_e_l_a_x> { │ │ │ │ │ -128 template │ │ │ │ │ -_1_2_9 static void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ -130 { │ │ │ │ │ -131 A.solve(v,d); │ │ │ │ │ -132 } │ │ │ │ │ -133 template │ │ │ │ │ -_1_3_4 static void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23 │ │ │ │ │ +24#include │ │ │ │ │ +25#include │ │ │ │ │ +26#include │ │ │ │ │ +27#include │ │ │ │ │ +28#include │ │ │ │ │ +29#include │ │ │ │ │ +30 │ │ │ │ │ +31#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +32#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +33#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> // countNonZeros() │ │ │ │ │ +34#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +35 │ │ │ │ │ +36namespace _D_u_n_e │ │ │ │ │ +37{ │ │ │ │ │ +38 │ │ │ │ │ +_6_4 namespace MatrixMarketImpl │ │ │ │ │ +65 { │ │ │ │ │ +75 template │ │ │ │ │ +_7_6 struct _m_m___n_u_m_e_r_i_c___t_y_p_e { │ │ │ │ │ +77 enum { │ │ │ │ │ +81 _i_s___n_u_m_e_r_i_c=false │ │ │ │ │ +_8_2 }; │ │ │ │ │ +83 }; │ │ │ │ │ +84 │ │ │ │ │ +85 template<> │ │ │ │ │ +_8_6 struct _m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ +87 { │ │ │ │ │ +88 enum { │ │ │ │ │ +92 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ +_9_3 }; │ │ │ │ │ +94 │ │ │ │ │ +_9_5 static std::string _s_t_r() │ │ │ │ │ +96 { │ │ │ │ │ +97 return "integer"; │ │ │ │ │ +98 } │ │ │ │ │ +99 }; │ │ │ │ │ +100 │ │ │ │ │ +101 template<> │ │ │ │ │ +_1_0_2 struct _m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ +103 { │ │ │ │ │ +104 enum { │ │ │ │ │ +108 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ +_1_0_9 }; │ │ │ │ │ +110 │ │ │ │ │ +_1_1_1 static std::string _s_t_r() │ │ │ │ │ +112 { │ │ │ │ │ +113 return "real"; │ │ │ │ │ +114 } │ │ │ │ │ +115 }; │ │ │ │ │ +116 │ │ │ │ │ +117 template<> │ │ │ │ │ +_1_1_8 struct _m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ +119 { │ │ │ │ │ +120 enum { │ │ │ │ │ +124 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ +_1_2_5 }; │ │ │ │ │ +126 │ │ │ │ │ +_1_2_7 static std::string _s_t_r() │ │ │ │ │ +128 { │ │ │ │ │ +129 return "real"; │ │ │ │ │ +130 } │ │ │ │ │ +131 }; │ │ │ │ │ +132 │ │ │ │ │ +133 template<> │ │ │ │ │ +_1_3_4 struct _m_m___n_u_m_e_r_i_c___t_y_p_e<_s_t_d::complex > │ │ │ │ │ 135 { │ │ │ │ │ -136 A.solve(v,d); │ │ │ │ │ -137 } │ │ │ │ │ -138 }; │ │ │ │ │ -139 template<> │ │ │ │ │ -_1_4_0 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_n_o_d_i_a_g,_w_i_t_h_r_e_l_a_x> { │ │ │ │ │ -141 template │ │ │ │ │ -_1_4_2 static void _b_l_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& w) │ │ │ │ │ -143 { │ │ │ │ │ -144 v = d; │ │ │ │ │ -145 v *= w; │ │ │ │ │ +136 enum { │ │ │ │ │ +140 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ +_1_4_1 }; │ │ │ │ │ +142 │ │ │ │ │ +_1_4_3 static std::string _s_t_r() │ │ │ │ │ +144 { │ │ │ │ │ +145 return "complex"; │ │ │ │ │ 146 } │ │ │ │ │ -147 template │ │ │ │ │ -_1_4_8 static void _b_u_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& w) │ │ │ │ │ -149 { │ │ │ │ │ -150 v = d; │ │ │ │ │ -151 v *= w; │ │ │ │ │ -152 } │ │ │ │ │ -153 }; │ │ │ │ │ -154 template<> │ │ │ │ │ -_1_5_5 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_n_o_d_i_a_g,_n_o_r_e_l_a_x> { │ │ │ │ │ -156 template │ │ │ │ │ -_1_5_7 static void _b_l_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ -158 { │ │ │ │ │ -159 v = d; │ │ │ │ │ -160 } │ │ │ │ │ -161 template │ │ │ │ │ -_1_6_2 static void _b_u_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ -163 { │ │ │ │ │ -164 v = d; │ │ │ │ │ -165 } │ │ │ │ │ -166 }; │ │ │ │ │ -167 │ │ │ │ │ -168 │ │ │ │ │ -169 // user calls │ │ │ │ │ -170 │ │ │ │ │ -171 // default block recursion level = 1 │ │ │ │ │ -172 │ │ │ │ │ -174 template │ │ │ │ │ -_1_7_5 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ -176 { │ │ │ │ │ -177 typename X::field_type w=1; │ │ │ │ │ -178 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -179 } │ │ │ │ │ -181 template │ │ │ │ │ -_1_8_2 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -183 { │ │ │ │ │ -184 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -185 } │ │ │ │ │ -187 template │ │ │ │ │ -_1_8_8 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ -189 { │ │ │ │ │ -190 typename X::field_type w=1; │ │ │ │ │ -191 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -192 } │ │ │ │ │ -194 template │ │ │ │ │ -_1_9_5 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -196 { │ │ │ │ │ -197 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -198 } │ │ │ │ │ -199 │ │ │ │ │ -201 template │ │ │ │ │ -_2_0_2 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ -203 { │ │ │ │ │ -204 typename X::field_type w=1; │ │ │ │ │ -205 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -206 } │ │ │ │ │ -208 template │ │ │ │ │ -_2_0_9 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +147 }; │ │ │ │ │ +148 │ │ │ │ │ +149 template<> │ │ │ │ │ +_1_5_0 struct _m_m___n_u_m_e_r_i_c___t_y_p_e<_s_t_d::complex > │ │ │ │ │ +151 { │ │ │ │ │ +152 enum { │ │ │ │ │ +156 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ +_1_5_7 }; │ │ │ │ │ +158 │ │ │ │ │ +_1_5_9 static std::string _s_t_r() │ │ │ │ │ +160 { │ │ │ │ │ +161 return "complex"; │ │ │ │ │ +162 } │ │ │ │ │ +163 }; │ │ │ │ │ +164 │ │ │ │ │ +173 template │ │ │ │ │ +_1_7_4 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r; │ │ │ │ │ +175 │ │ │ │ │ +176 template │ │ │ │ │ +_1_7_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +178 { │ │ │ │ │ +_1_7_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ +180 { │ │ │ │ │ +181 os<<"%%MatrixMarket matrix coordinate "; │ │ │ │ │ +182 os<:: │ │ │ │ │ +field_type>>::str()<<" general"< │ │ │ │ │ +_1_8_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r<_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ +188 { │ │ │ │ │ +_1_8_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ +190 { │ │ │ │ │ +191 os<<"%%MatrixMarket matrix array "; │ │ │ │ │ +192 os<:: │ │ │ │ │ +field_type>>::str()<<" general"< │ │ │ │ │ +_1_9_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r > │ │ │ │ │ +198 { │ │ │ │ │ +_1_9_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ +200 { │ │ │ │ │ +201 os<<"%%MatrixMarket matrix array "; │ │ │ │ │ +202 os<::str()<<" general"< │ │ │ │ │ +_2_0_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r<_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ +208 { │ │ │ │ │ +_2_0_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ 210 { │ │ │ │ │ -211 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -212 } │ │ │ │ │ -214 template │ │ │ │ │ -_2_1_5 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ -216 { │ │ │ │ │ -217 typename X::field_type w=1; │ │ │ │ │ -218 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -219 } │ │ │ │ │ -221 template │ │ │ │ │ -_2_2_2 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -223 { │ │ │ │ │ -224 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -225 } │ │ │ │ │ +211 os<<"%%MatrixMarket matrix array "; │ │ │ │ │ +212 os<::str()<<" general"< │ │ │ │ │ +_2_2_5 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r; │ │ │ │ │ 226 │ │ │ │ │ -227 // general block recursion level >= 0 │ │ │ │ │ -228 │ │ │ │ │ -230 template │ │ │ │ │ -_2_3_1 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> /*bl*/) │ │ │ │ │ -232 { │ │ │ │ │ -233 typename X::field_type w=1; │ │ │ │ │ -234 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -235 } │ │ │ │ │ -237 template │ │ │ │ │ -_2_3_8 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -239 { │ │ │ │ │ -240 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -241 } │ │ │ │ │ -243 template │ │ │ │ │ -_2_4_4 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> /*bl*/) │ │ │ │ │ -245 { │ │ │ │ │ -246 typename X::field_type w=1; │ │ │ │ │ -247 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -248 } │ │ │ │ │ -250 template │ │ │ │ │ -_2_5_1 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -252 { │ │ │ │ │ -253 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -254 } │ │ │ │ │ -255 │ │ │ │ │ -257 template │ │ │ │ │ -_2_5_8 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> bl) │ │ │ │ │ +227 template │ │ │ │ │ +_2_2_8 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ +229 { │ │ │ │ │ +_2_3_0 typedef _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> _M; │ │ │ │ │ +231 static_assert(IsNumber::value, "Only scalar entries are expected │ │ │ │ │ +here!"); │ │ │ │ │ +232 │ │ │ │ │ +_2_3_3 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ +234 { │ │ │ │ │ +235 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ +236 os<<"1 1"< │ │ │ │ │ +_2_4_1 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_l_o_c_k_V_e_c_t_o_r,A> > │ │ │ │ │ +242 { │ │ │ │ │ +_2_4_3 typedef _B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_T_,_i_>,A> _M; │ │ │ │ │ +244 │ │ │ │ │ +_2_4_5 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ +246 { │ │ │ │ │ +247 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ +248 os< │ │ │ │ │ +_2_5_3 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +254 { │ │ │ │ │ +_2_5_5 typedef _B_C_R_S_M_a_t_r_i_x_<_T_,_A_> _M; │ │ │ │ │ +256 static_assert(IsNumber::value, "Only scalar entries are expected │ │ │ │ │ +here!"); │ │ │ │ │ +257 │ │ │ │ │ +_2_5_8 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ 259 { │ │ │ │ │ -260 typename X::field_type w=1; │ │ │ │ │ -261 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +260 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ +261 os<<"1 1"< │ │ │ │ │ -_2_6_5 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> bl) │ │ │ │ │ -266 { │ │ │ │ │ -267 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -268 } │ │ │ │ │ -270 template │ │ │ │ │ -_2_7_1 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> bl) │ │ │ │ │ -272 { │ │ │ │ │ -273 typename X::field_type w=1; │ │ │ │ │ -274 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -275 } │ │ │ │ │ -277 template │ │ │ │ │ -_2_7_8 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> bl) │ │ │ │ │ -279 { │ │ │ │ │ -280 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -281 } │ │ │ │ │ +263 }; │ │ │ │ │ +264 │ │ │ │ │ +265 template │ │ │ │ │ +_2_6_6 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > │ │ │ │ │ +267 { │ │ │ │ │ +_2_6_8 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_i_,_j_>,A> _M; │ │ │ │ │ +269 │ │ │ │ │ +_2_7_0 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ +271 { │ │ │ │ │ +272 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ +273 os< │ │ │ │ │ +_2_7_9 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ +280 { │ │ │ │ │ +_2_8_1 typedef _F_i_e_l_d_M_a_t_r_i_x_<_T_,_i_,_j_> _M; │ │ │ │ │ 282 │ │ │ │ │ -283 │ │ │ │ │ -284 │ │ │ │ │ -285 //============================================================ │ │ │ │ │ -286 // generic block diagonal solves │ │ │ │ │ -287 // consider block decomposition A = L + D + U │ │ │ │ │ -288 // we can apply relaxation or not │ │ │ │ │ -289 // we can recurse over a fixed number of levels │ │ │ │ │ -290 //============================================================ │ │ │ │ │ +_2_8_3 static void _p_r_i_n_t(std::ostream& os, const _M& m) │ │ │ │ │ +284 {} │ │ │ │ │ +285 }; │ │ │ │ │ +286 │ │ │ │ │ +287 template │ │ │ │ │ +_2_8_8 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r > │ │ │ │ │ +289 { │ │ │ │ │ +_2_9_0 typedef FieldVector _M; │ │ │ │ │ 291 │ │ │ │ │ -292 // template meta program for diagonal solves │ │ │ │ │ -293 template │ │ │ │ │ -_2_9_4 struct _a_l_g_m_e_t_a___b_d_s_o_l_v_e { │ │ │ │ │ -295 template │ │ │ │ │ -_2_9_6 static void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -297 { │ │ │ │ │ -298 // iterator types │ │ │ │ │ -299 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -300 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -301 │ │ │ │ │ -302 // local solve at each block and immediate update │ │ │ │ │ -303 rowiterator rendi=A.beforeBegin(); │ │ │ │ │ -304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i) │ │ │ │ │ -305 { │ │ │ │ │ -306 coliterator ii=(*i).find(i.index()); │ │ │ │ │ -307 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_I_-_1_,_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(*ii,v[i.index()],d[i.index()],w); │ │ │ │ │ -308 } │ │ │ │ │ -309 } │ │ │ │ │ -310 }; │ │ │ │ │ -311 │ │ │ │ │ -312 // recursion end ... │ │ │ │ │ -313 template<> │ │ │ │ │ -_3_1_4 struct _a_l_g_m_e_t_a___b_d_s_o_l_v_e<0,_w_i_t_h_r_e_l_a_x> { │ │ │ │ │ -315 template │ │ │ │ │ -_3_1_6 static void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ -317 { │ │ │ │ │ -318 A.solve(v,d); │ │ │ │ │ -319 v *= w; │ │ │ │ │ -320 } │ │ │ │ │ -321 }; │ │ │ │ │ -322 template<> │ │ │ │ │ -_3_2_3 struct _a_l_g_m_e_t_a___b_d_s_o_l_v_e<0,_n_o_r_e_l_a_x> { │ │ │ │ │ -324 template │ │ │ │ │ -_3_2_5 static void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ -326 { │ │ │ │ │ -327 A.solve(v,d); │ │ │ │ │ -328 } │ │ │ │ │ -329 }; │ │ │ │ │ +_2_9_2 static void _p_r_i_n_t(std::ostream& os, const _M& m) │ │ │ │ │ +293 {} │ │ │ │ │ +294 }; │ │ │ │ │ +295 │ │ │ │ │ +_2_9_6 enum _L_i_n_e_T_y_p_e { _M_M___H_E_A_D_E_R, _M_M___I_S_T_L_S_T_R_U_C_T, _D_A_T_A }; │ │ │ │ │ +_2_9_7 enum { _M_M___M_A_X___L_I_N_E___L_E_N_G_T_H=1025 }; │ │ │ │ │ +298 │ │ │ │ │ +_2_9_9 enum _M_M___T_Y_P_E { _c_o_o_r_d_i_n_a_t_e___t_y_p_e, _a_r_r_a_y___t_y_p_e, _u_n_k_n_o_w_n___t_y_p_e }; │ │ │ │ │ +300 │ │ │ │ │ +_3_0_1 enum _M_M___C_T_Y_P_E { _i_n_t_e_g_e_r___t_y_p_e, _d_o_u_b_l_e___t_y_p_e, _c_o_m_p_l_e_x___t_y_p_e, _p_a_t_t_e_r_n, │ │ │ │ │ +_u_n_k_n_o_w_n___c_t_y_p_e }; │ │ │ │ │ +302 │ │ │ │ │ +_3_0_3 enum _M_M___S_T_R_U_C_T_U_R_E { _g_e_n_e_r_a_l, _s_y_m_m_e_t_r_i_c, _s_k_e_w___s_y_m_m_e_t_r_i_c, _h_e_r_m_i_t_i_a_n, │ │ │ │ │ +_u_n_k_n_o_w_n___s_t_r_u_c_t_u_r_e }; │ │ │ │ │ +304 │ │ │ │ │ +_3_0_5 struct _M_M_H_e_a_d_e_r │ │ │ │ │ +306 { │ │ │ │ │ +_3_0_7 _M_M_H_e_a_d_e_r() │ │ │ │ │ +308 : _t_y_p_e(_c_o_o_r_d_i_n_a_t_e___t_y_p_e), _c_t_y_p_e(_d_o_u_b_l_e___t_y_p_e), _s_t_r_u_c_t_u_r_e(_g_e_n_e_r_a_l) │ │ │ │ │ +309 {} │ │ │ │ │ +_3_1_0 _M_M___T_Y_P_E _t_y_p_e; │ │ │ │ │ +_3_1_1 _M_M___C_T_Y_P_E _c_t_y_p_e; │ │ │ │ │ +_3_1_2 _M_M___S_T_R_U_C_T_U_R_E _s_t_r_u_c_t_u_r_e; │ │ │ │ │ +313 }; │ │ │ │ │ +314 │ │ │ │ │ +_3_1_5 inline bool _l_i_n_e_F_e_e_d(std::istream& file) │ │ │ │ │ +316 { │ │ │ │ │ +317 char c; │ │ │ │ │ +318 if(!file.eof()) │ │ │ │ │ +319 c=file.peek(); │ │ │ │ │ +320 else │ │ │ │ │ +321 return false; │ │ │ │ │ +322 // ignore whitespace │ │ │ │ │ +323 while(c==' ') │ │ │ │ │ +324 { │ │ │ │ │ +325 file.get(); │ │ │ │ │ +326 if(file.eof()) │ │ │ │ │ +327 return false; │ │ │ │ │ +328 c=file.peek(); │ │ │ │ │ +329 } │ │ │ │ │ 330 │ │ │ │ │ -331 // user calls │ │ │ │ │ -332 │ │ │ │ │ -333 // default block recursion level = 1 │ │ │ │ │ -334 │ │ │ │ │ -336 template │ │ │ │ │ -_3_3_7 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ -338 { │ │ │ │ │ -339 typename X::field_type w=1; │ │ │ │ │ -340 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_1_,_n_o_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -341 } │ │ │ │ │ -343 template │ │ │ │ │ -_3_4_4 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +331 if(c=='\n') { │ │ │ │ │ +332 /* eat the line feed */ │ │ │ │ │ +333 file.get(); │ │ │ │ │ +334 return true; │ │ │ │ │ +335 } │ │ │ │ │ +336 return false; │ │ │ │ │ +337 } │ │ │ │ │ +338 │ │ │ │ │ +_3_3_9 inline void _s_k_i_p_C_o_m_m_e_n_t_s(std::istream& file) │ │ │ │ │ +340 { │ │ │ │ │ +341 _l_i_n_e_F_e_e_d(file); │ │ │ │ │ +342 char c=file.peek(); │ │ │ │ │ +343 // ignore comment lines │ │ │ │ │ +344 while(c=='%') │ │ │ │ │ 345 { │ │ │ │ │ -346 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_1_,_w_i_t_h_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -347 } │ │ │ │ │ -348 │ │ │ │ │ -349 // general block recursion level >= 0 │ │ │ │ │ -350 │ │ │ │ │ -352 template │ │ │ │ │ -_3_5_3 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> /*bl*/) │ │ │ │ │ +346 /* discard the rest of the line */ │ │ │ │ │ +347 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +348 c=file.peek(); │ │ │ │ │ +349 } │ │ │ │ │ +350 } │ │ │ │ │ +351 │ │ │ │ │ +352 │ │ │ │ │ +_3_5_3 inline bool _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t_B_a_n_n_e_r(std::istream& file, _M_M_H_e_a_d_e_r& mmHeader) │ │ │ │ │ 354 { │ │ │ │ │ -355 typename X::field_type w=1; │ │ │ │ │ -356 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_l_,_n_o_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -357 } │ │ │ │ │ -359 template │ │ │ │ │ -_3_6_0 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -361 { │ │ │ │ │ -362 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_l_,_w_i_t_h_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ -363 } │ │ │ │ │ -364 │ │ │ │ │ -365 │ │ │ │ │ -366 //============================================================ │ │ │ │ │ -367 // generic steps of iteration methods │ │ │ │ │ -368 // Jacobi, Gauss-Seidel, SOR, SSOR │ │ │ │ │ -369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i) │ │ │ │ │ -370 // we can recurse over a fixed number of levels │ │ │ │ │ -371 //============================================================ │ │ │ │ │ -372 │ │ │ │ │ -373 // template meta program for iterative solver steps │ │ │ │ │ -374 template │ │ │ │ │ -_3_7_5 struct _a_l_g_m_e_t_a___i_t_s_t_e_p_s { │ │ │ │ │ +355 std::string buffer; │ │ │ │ │ +356 char c; │ │ │ │ │ +357 file >> buffer; │ │ │ │ │ +358 c=buffer[0]; │ │ │ │ │ +359 mmHeader=_M_M_H_e_a_d_e_r(); │ │ │ │ │ +360 if(c!='%') │ │ │ │ │ +361 return false; │ │ │ │ │ +362 dverb<::max(),'\n'); │ │ │ │ │ +367 return false; │ │ │ │ │ +368 } │ │ │ │ │ +369 │ │ │ │ │ +370 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ +371 /* premature end of line */ │ │ │ │ │ +372 return false; │ │ │ │ │ +373 │ │ │ │ │ +374 /* read the matrix_type */ │ │ │ │ │ +375 file >> buffer; │ │ │ │ │ 376 │ │ │ │ │ -377 template │ │ │ │ │ -_3_7_8 static void _d_b_g_s (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -379 { │ │ │ │ │ -380 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -381 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -382 typedef typename Y::block_type bblock; │ │ │ │ │ -383 bblock rhs; │ │ │ │ │ -384 │ │ │ │ │ -385 X xold(x); // remember old x │ │ │ │ │ -386 │ │ │ │ │ -387 rowiterator endi=A.end(); │ │ │ │ │ -388 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -389 { │ │ │ │ │ -390 rhs = b[i.index()]; // rhs = b_i │ │ │ │ │ -391 coliterator endj=(*i).end(); │ │ │ │ │ -392 coliterator j=(*i).begin(); │ │ │ │ │ -393 if constexpr (IsNumber()) │ │ │ │ │ -394 { │ │ │ │ │ -395 for (; j.index() i │ │ │ │ │ -408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j │ │ │ │ │ -409 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_t_y_p_e_n_a_m_e_ _M_:_:_b_l_o_c_k___t_y_p_e_>_:_:_d_b_g_s(*diag,x[i.index │ │ │ │ │ -()],rhs,w); // if I==1: xnew_i = rhs/a_ii │ │ │ │ │ -410 } │ │ │ │ │ -411 } │ │ │ │ │ -412 // next two lines: xnew_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j) + (1-w)*xold; │ │ │ │ │ -413 x *= w; │ │ │ │ │ -414 x.axpy(K(1)-w,xold); │ │ │ │ │ -415 } │ │ │ │ │ -416 │ │ │ │ │ -417 template │ │ │ │ │ -_4_1_8 static void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -419 { │ │ │ │ │ -420 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -421 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -422 typedef typename Y::block_type bblock; │ │ │ │ │ -423 typedef typename X::block_type xblock; │ │ │ │ │ -424 bblock rhs; │ │ │ │ │ -425 xblock v; │ │ │ │ │ -426 │ │ │ │ │ -427 // Initialize nested data structure if there are entries │ │ │ │ │ -428 if(A.begin()!=A.end()) │ │ │ │ │ -429 v=x[0]; │ │ │ │ │ -430 │ │ │ │ │ -431 rowiterator endi=A.end(); │ │ │ │ │ -432 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -433 { │ │ │ │ │ -434 rhs = b[i.index()]; // rhs = b_i │ │ │ │ │ -435 coliterator endj=(*i).end(); // iterate over a_ij with j < i │ │ │ │ │ -436 coliterator j=(*i).begin(); │ │ │ │ │ -437 if constexpr (IsNumber()) │ │ │ │ │ -438 { │ │ │ │ │ -439 for (; j.index()=i} a_ij * xold_j) │ │ │ │ │ -446 } │ │ │ │ │ -447 else │ │ │ │ │ +377 if(buffer != "matrix") │ │ │ │ │ +378 { │ │ │ │ │ +379 /* discard the rest of the line */ │ │ │ │ │ +380 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +381 return false; │ │ │ │ │ +382 } │ │ │ │ │ +383 │ │ │ │ │ +384 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ +385 /* premature end of line */ │ │ │ │ │ +386 return false; │ │ │ │ │ +387 │ │ │ │ │ +388 /* The type of the matrix */ │ │ │ │ │ +389 file >> buffer; │ │ │ │ │ +390 │ │ │ │ │ +391 if(buffer.empty()) │ │ │ │ │ +392 return false; │ │ │ │ │ +393 │ │ │ │ │ +394 std::transform(buffer.begin(), buffer.end(), buffer.begin(), │ │ │ │ │ +395 ::tolower); │ │ │ │ │ +396 │ │ │ │ │ +397 switch(buffer[0]) │ │ │ │ │ +398 { │ │ │ │ │ +399 case 'a' : │ │ │ │ │ +400 /* sanity check */ │ │ │ │ │ +401 if(buffer != "array") │ │ │ │ │ +402 { │ │ │ │ │ +403 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +404 return false; │ │ │ │ │ +405 } │ │ │ │ │ +406 mmHeader._t_y_p_e=_a_r_r_a_y___t_y_p_e; │ │ │ │ │ +407 break; │ │ │ │ │ +408 case 'c' : │ │ │ │ │ +409 /* sanity check */ │ │ │ │ │ +410 if(buffer != "coordinate") │ │ │ │ │ +411 { │ │ │ │ │ +412 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +413 return false; │ │ │ │ │ +414 } │ │ │ │ │ +415 mmHeader._t_y_p_e=_c_o_o_r_d_i_n_a_t_e___t_y_p_e; │ │ │ │ │ +416 break; │ │ │ │ │ +417 default : │ │ │ │ │ +418 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +419 return false; │ │ │ │ │ +420 } │ │ │ │ │ +421 │ │ │ │ │ +422 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ +423 /* premature end of line */ │ │ │ │ │ +424 return false; │ │ │ │ │ +425 │ │ │ │ │ +426 /* The numeric type used. */ │ │ │ │ │ +427 file >> buffer; │ │ │ │ │ +428 │ │ │ │ │ +429 if(buffer.empty()) │ │ │ │ │ +430 return false; │ │ │ │ │ +431 │ │ │ │ │ +432 std::transform(buffer.begin(), buffer.end(), buffer.begin(), │ │ │ │ │ +433 ::tolower); │ │ │ │ │ +434 switch(buffer[0]) │ │ │ │ │ +435 { │ │ │ │ │ +436 case 'i' : │ │ │ │ │ +437 /* sanity check */ │ │ │ │ │ +438 if(buffer != "integer") │ │ │ │ │ +439 { │ │ │ │ │ +440 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +441 return false; │ │ │ │ │ +442 } │ │ │ │ │ +443 mmHeader._c_t_y_p_e=_i_n_t_e_g_e_r___t_y_p_e; │ │ │ │ │ +444 break; │ │ │ │ │ +445 case 'r' : │ │ │ │ │ +446 /* sanity check */ │ │ │ │ │ +447 if(buffer != "real") │ │ │ │ │ 448 { │ │ │ │ │ -449 for (; j.index()_:_:_b_s_o_r_f(*diag,v,rhs,w); // if │ │ │ │ │ -blocksize I==1: v = rhs/a_ii │ │ │ │ │ -455 x[i.index()].axpy(w,v); // x_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j) │ │ │ │ │ -456 } │ │ │ │ │ -457 } │ │ │ │ │ -458 } │ │ │ │ │ -459 │ │ │ │ │ -460 template │ │ │ │ │ -_4_6_1 static void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -462 { │ │ │ │ │ -463 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -464 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -465 typedef typename Y::block_type bblock; │ │ │ │ │ -466 typedef typename X::block_type xblock; │ │ │ │ │ -467 bblock rhs; │ │ │ │ │ -468 xblock v; │ │ │ │ │ -469 │ │ │ │ │ -470 // Initialize nested data structure if there are entries │ │ │ │ │ -471 if(A.begin()!=A.end()) │ │ │ │ │ -472 v=x[0]; │ │ │ │ │ -473 │ │ │ │ │ -474 rowiterator endi=A.beforeBegin(); │ │ │ │ │ -475 for (rowiterator i=A.beforeEnd(); i!=endi; --i) │ │ │ │ │ -476 { │ │ │ │ │ -477 rhs = b[i.index()]; │ │ │ │ │ -478 coliterator endj=(*i).end(); │ │ │ │ │ -479 coliterator j=(*i).begin(); │ │ │ │ │ -480 if constexpr (IsNumber()) │ │ │ │ │ -481 { │ │ │ │ │ -482 for (; j.index()mmv(x[j.index()],rhs); │ │ │ │ │ -494 coliterator diag=j; │ │ │ │ │ -495 for (; j!=endj; ++j) │ │ │ │ │ -496 j->mmv(x[j.index()],rhs); │ │ │ │ │ -497 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_t_y_p_e_n_a_m_e_ _M_:_:_b_l_o_c_k___t_y_p_e_>_:_:_b_s_o_r_b(*diag,v,rhs,w); │ │ │ │ │ -498 x[i.index()].axpy(w,v); │ │ │ │ │ -499 } │ │ │ │ │ -500 } │ │ │ │ │ +449 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +450 return false; │ │ │ │ │ +451 } │ │ │ │ │ +452 mmHeader._c_t_y_p_e=_d_o_u_b_l_e___t_y_p_e; │ │ │ │ │ +453 break; │ │ │ │ │ +454 case 'c' : │ │ │ │ │ +455 /* sanity check */ │ │ │ │ │ +456 if(buffer != "complex") │ │ │ │ │ +457 { │ │ │ │ │ +458 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +459 return false; │ │ │ │ │ +460 } │ │ │ │ │ +461 mmHeader._c_t_y_p_e=_c_o_m_p_l_e_x___t_y_p_e; │ │ │ │ │ +462 break; │ │ │ │ │ +463 case 'p' : │ │ │ │ │ +464 /* sanity check */ │ │ │ │ │ +465 if(buffer != "pattern") │ │ │ │ │ +466 { │ │ │ │ │ +467 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +468 return false; │ │ │ │ │ +469 } │ │ │ │ │ +470 mmHeader._c_t_y_p_e=_p_a_t_t_e_r_n; │ │ │ │ │ +471 break; │ │ │ │ │ +472 default : │ │ │ │ │ +473 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +474 return false; │ │ │ │ │ +475 } │ │ │ │ │ +476 │ │ │ │ │ +477 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ +478 return false; │ │ │ │ │ +479 │ │ │ │ │ +480 file >> buffer; │ │ │ │ │ +481 │ │ │ │ │ +482 std::transform(buffer.begin(), buffer.end(), buffer.begin(), │ │ │ │ │ +483 ::tolower); │ │ │ │ │ +484 switch(buffer[0]) │ │ │ │ │ +485 { │ │ │ │ │ +486 case 'g' : │ │ │ │ │ +487 /* sanity check */ │ │ │ │ │ +488 if(buffer != "general") │ │ │ │ │ +489 { │ │ │ │ │ +490 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +491 return false; │ │ │ │ │ +492 } │ │ │ │ │ +493 mmHeader._s_t_r_u_c_t_u_r_e=_g_e_n_e_r_a_l; │ │ │ │ │ +494 break; │ │ │ │ │ +495 case 'h' : │ │ │ │ │ +496 /* sanity check */ │ │ │ │ │ +497 if(buffer != "hermitian") │ │ │ │ │ +498 { │ │ │ │ │ +499 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +500 return false; │ │ │ │ │ 501 } │ │ │ │ │ -502 │ │ │ │ │ -503 template │ │ │ │ │ -_5_0_4 static void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -505 { │ │ │ │ │ -506 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -507 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -508 typedef typename Y::block_type bblock; │ │ │ │ │ -509 bblock rhs; │ │ │ │ │ -510 │ │ │ │ │ -511 X v(x); // allocate with same size │ │ │ │ │ -512 │ │ │ │ │ -513 rowiterator endi=A.end(); │ │ │ │ │ -514 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +502 mmHeader._s_t_r_u_c_t_u_r_e=_h_e_r_m_i_t_i_a_n; │ │ │ │ │ +503 break; │ │ │ │ │ +504 case 's' : │ │ │ │ │ +505 if(buffer.size()==1) { │ │ │ │ │ +506 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +507 return false; │ │ │ │ │ +508 } │ │ │ │ │ +509 │ │ │ │ │ +510 switch(buffer[1]) │ │ │ │ │ +511 { │ │ │ │ │ +512 case 'y' : │ │ │ │ │ +513 /* sanity check */ │ │ │ │ │ +514 if(buffer != "symmetric") │ │ │ │ │ 515 { │ │ │ │ │ -516 rhs = b[i.index()]; │ │ │ │ │ -517 coliterator endj=(*i).end(); │ │ │ │ │ -518 coliterator j=(*i).begin(); │ │ │ │ │ -519 if constexpr (IsNumber()) │ │ │ │ │ -520 { │ │ │ │ │ -521 for (; j.index()::max(),'\n'); │ │ │ │ │ +517 return false; │ │ │ │ │ +518 } │ │ │ │ │ +519 mmHeader._s_t_r_u_c_t_u_r_e=_s_y_m_m_e_t_r_i_c; │ │ │ │ │ +520 break; │ │ │ │ │ +521 case 'k' : │ │ │ │ │ +522 /* sanity check */ │ │ │ │ │ +523 if(buffer != "skew-symmetric") │ │ │ │ │ +524 { │ │ │ │ │ +525 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +526 return false; │ │ │ │ │ 527 } │ │ │ │ │ -528 else │ │ │ │ │ -529 { │ │ │ │ │ -530 for (; j.index()mmv(x[j.index()],rhs); │ │ │ │ │ -532 coliterator diag=j; │ │ │ │ │ -533 for (; j!=endj; ++j) │ │ │ │ │ -534 j->mmv(x[j.index()],rhs); │ │ │ │ │ -535 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_t_y_p_e_n_a_m_e_ _M_:_:_b_l_o_c_k___t_y_p_e_>_:_:_d_b_j_a_c(*diag,v[i.index │ │ │ │ │ -()],rhs,w); │ │ │ │ │ -536 } │ │ │ │ │ -537 } │ │ │ │ │ -538 x.axpy(w,v); │ │ │ │ │ -539 } │ │ │ │ │ -540 }; │ │ │ │ │ -541 // end of recursion │ │ │ │ │ -542 template │ │ │ │ │ -_5_4_3 struct _a_l_g_m_e_t_a___i_t_s_t_e_p_s<0,M> { │ │ │ │ │ -544 template │ │ │ │ │ -_5_4_5 static void _d_b_g_s (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ -546 { │ │ │ │ │ -547 A.solve(x,b); │ │ │ │ │ -548 } │ │ │ │ │ -549 template │ │ │ │ │ -_5_5_0 static void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ -551 { │ │ │ │ │ -552 A.solve(x,b); │ │ │ │ │ -553 } │ │ │ │ │ -554 template │ │ │ │ │ -_5_5_5 static void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ -556 { │ │ │ │ │ -557 A.solve(x,b); │ │ │ │ │ -558 } │ │ │ │ │ -559 template │ │ │ │ │ -_5_6_0 static void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ -561 { │ │ │ │ │ -562 A.solve(x,b); │ │ │ │ │ -563 } │ │ │ │ │ -564 }; │ │ │ │ │ -565 │ │ │ │ │ -566 template │ │ │ │ │ -_5_6_7 struct _a_l_g_m_e_t_a___i_t_s_t_e_p_s> │ │ │ │ │ -{ │ │ │ │ │ -568 template< │ │ │ │ │ -569 typename... MultiTypeVectorArgs, │ │ │ │ │ -570 class K> │ │ │ │ │ -_5_7_1 static void _d_b_g_s (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ -A, │ │ │ │ │ -572 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ -573 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ -574 const K& w) │ │ │ │ │ -575 { │ │ │ │ │ -576 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ -577 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_0_,_N_>_:_:_d_b_g_s(A, x, b, w); │ │ │ │ │ -578 } │ │ │ │ │ -579 │ │ │ │ │ -580 template< │ │ │ │ │ -581 typename... MultiTypeVectorArgs, │ │ │ │ │ -582 class K> │ │ │ │ │ -_5_8_3 static void _b_s_o_r_f (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ -A, │ │ │ │ │ -584 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ -585 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ -586 const K& w) │ │ │ │ │ -587 { │ │ │ │ │ -588 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ -589 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_0_,_N_>_:_:_b_s_o_r_f(A, x, b, w); │ │ │ │ │ -590 } │ │ │ │ │ -591 │ │ │ │ │ -592 template< │ │ │ │ │ -593 typename... MultiTypeVectorArgs, │ │ │ │ │ -594 class K> │ │ │ │ │ -_5_9_5 static void _b_s_o_r_b (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ -A, │ │ │ │ │ -596 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ -597 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ -598 const K& w) │ │ │ │ │ -599 { │ │ │ │ │ -600 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ -601 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_N_-_1_,_N_>_:_:_b_s_o_r_b(A, x, b, w); │ │ │ │ │ -602 } │ │ │ │ │ -603 │ │ │ │ │ -604 template< │ │ │ │ │ -605 typename... MultiTypeVectorArgs, │ │ │ │ │ -606 class K │ │ │ │ │ -607 > │ │ │ │ │ -_6_0_8 static void _d_b_j_a_c (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ -A, │ │ │ │ │ -609 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ -610 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ -611 const K& w) │ │ │ │ │ -612 { │ │ │ │ │ -613 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ -614 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_0_,_N_>_:_:_d_b_j_a_c(A, x, b, w); │ │ │ │ │ -615 } │ │ │ │ │ -616 }; │ │ │ │ │ -617 │ │ │ │ │ -618 // user calls │ │ │ │ │ -619 │ │ │ │ │ -621 template │ │ │ │ │ -_6_2_2 void _d_b_g_s (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -623 { │ │ │ │ │ -624 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_d_b_g_s(A,x,b,w); │ │ │ │ │ -625 } │ │ │ │ │ -627 template │ │ │ │ │ -_6_2_8 void _d_b_g_s (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -629 { │ │ │ │ │ -630 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_M_>_:_:_d_b_g_s(A,x,b,w); │ │ │ │ │ -631 } │ │ │ │ │ -633 template │ │ │ │ │ -_6_3_4 void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -635 { │ │ │ │ │ -636 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_b_s_o_r_f(A,x,b,w); │ │ │ │ │ -637 } │ │ │ │ │ -639 template │ │ │ │ │ -_6_4_0 void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -641 { │ │ │ │ │ -642 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_M_>_:_:_b_s_o_r_f(A,x,b,w); │ │ │ │ │ -643 } │ │ │ │ │ -645 template │ │ │ │ │ -_6_4_6 void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -647 { │ │ │ │ │ -648 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_b_s_o_r_b(A,x,b,w); │ │ │ │ │ -649 } │ │ │ │ │ -651 template │ │ │ │ │ -_6_5_2 void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -653 { │ │ │ │ │ -654 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_t_y_p_e_n_a_m_e_ _s_t_d_:_:_r_e_m_o_v_e___c_v_<_M_>_:_:_t_y_p_e>_:_:_b_s_o_r_b(A,x,b,w); │ │ │ │ │ -655 } │ │ │ │ │ -657 template │ │ │ │ │ -_6_5_8 void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ -659 { │ │ │ │ │ -660 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_d_b_j_a_c(A,x,b,w); │ │ │ │ │ -661 } │ │ │ │ │ -663 template │ │ │ │ │ -_6_6_4 void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ -665 { │ │ │ │ │ -666 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_M_>_:_:_d_b_j_a_c(A,x,b,w); │ │ │ │ │ +528 mmHeader._s_t_r_u_c_t_u_r_e=_s_k_e_w___s_y_m_m_e_t_r_i_c; │ │ │ │ │ +529 break; │ │ │ │ │ +530 default : │ │ │ │ │ +531 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +532 return false; │ │ │ │ │ +533 } │ │ │ │ │ +534 break; │ │ │ │ │ +535 default : │ │ │ │ │ +536 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +537 return false; │ │ │ │ │ +538 } │ │ │ │ │ +539 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +540 c=file.peek(); │ │ │ │ │ +541 return true; │ │ │ │ │ +542 │ │ │ │ │ +543 } │ │ │ │ │ +544 │ │ │ │ │ +545 template │ │ │ │ │ +546 std::tuple │ │ │ │ │ +_5_4_7 _c_a_l_c_u_l_a_t_e_N_N_Z(std::size_t rows, std::size_t cols, std::size_t entries, const │ │ │ │ │ +_M_M_H_e_a_d_e_r& header) │ │ │ │ │ +548 { │ │ │ │ │ +549 std::size_t blockrows=rows/brows; │ │ │ │ │ +550 std::size_t blockcols=cols/bcols; │ │ │ │ │ +551 std::size_t blocksize=brows*bcols; │ │ │ │ │ +552 std::size_t blockentries=0; │ │ │ │ │ +553 │ │ │ │ │ +554 switch(header._s_t_r_u_c_t_u_r_e) │ │ │ │ │ +555 { │ │ │ │ │ +556 case _g_e_n_e_r_a_l : │ │ │ │ │ +557 blockentries = entries/blocksize; break; │ │ │ │ │ +558 case _s_k_e_w___s_y_m_m_e_t_r_i_c : │ │ │ │ │ +559 blockentries = 2*entries/blocksize; break; │ │ │ │ │ +560 case _s_y_m_m_e_t_r_i_c : │ │ │ │ │ +561 blockentries = (2*entries-rows)/blocksize; break; │ │ │ │ │ +562 case _h_e_r_m_i_t_i_a_n : │ │ │ │ │ +563 blockentries = (2*entries-rows)/blocksize; break; │ │ │ │ │ +564 default : │ │ │ │ │ +565 throw Dune::NotImplemented(); │ │ │ │ │ +566 } │ │ │ │ │ +567 return std::make_tuple(blockrows, blockcols, blockentries); │ │ │ │ │ +568 } │ │ │ │ │ +569 │ │ │ │ │ +570 /* │ │ │ │ │ +571 * @brief Storage class for the column index and the numeric value. │ │ │ │ │ +572 * │ │ │ │ │ +573 * \tparam T Either a NumericWrapper of the numeric type or PatternDummy │ │ │ │ │ +574 * for MatrixMarket pattern case. │ │ │ │ │ +575 */ │ │ │ │ │ +576 template │ │ │ │ │ +_5_7_7 struct _I_n_d_e_x_D_a_t_a : public T │ │ │ │ │ +578 { │ │ │ │ │ +_5_7_9 std::size_t _i_n_d_e_x = {}; │ │ │ │ │ +580 }; │ │ │ │ │ +581 │ │ │ │ │ +582 │ │ │ │ │ +593 template │ │ │ │ │ +_5_9_4 struct _N_u_m_e_r_i_c_W_r_a_p_p_e_r │ │ │ │ │ +595 { │ │ │ │ │ +_5_9_6 T _n_u_m_b_e_r = {}; │ │ │ │ │ +_5_9_7 operator T&() │ │ │ │ │ +598 { │ │ │ │ │ +599 return _n_u_m_b_e_r; │ │ │ │ │ +600 } │ │ │ │ │ +601 }; │ │ │ │ │ +602 │ │ │ │ │ +_6_0_6 struct _P_a_t_t_e_r_n_D_u_m_m_y │ │ │ │ │ +607 {}; │ │ │ │ │ +608 │ │ │ │ │ +609 template<> │ │ │ │ │ +_6_1_0 struct _N_u_m_e_r_i_c_W_r_a_p_p_e_r<_P_a_t_t_e_r_n_D_u_m_m_y> │ │ │ │ │ +611 {}; │ │ │ │ │ +612 │ │ │ │ │ +613 template │ │ │ │ │ +_6_1_4 std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, _N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_T_>& num) │ │ │ │ │ +615 { │ │ │ │ │ +616 return is>>num._n_u_m_b_e_r; │ │ │ │ │ +617 } │ │ │ │ │ +618 │ │ │ │ │ +_6_1_9 inline std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, [[maybe_unused]] │ │ │ │ │ +_N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_P_a_t_t_e_r_n_D_u_m_m_y_>& num) │ │ │ │ │ +620 { │ │ │ │ │ +621 return is; │ │ │ │ │ +622 } │ │ │ │ │ +623 │ │ │ │ │ +629 template │ │ │ │ │ +_6_3_0 bool _o_p_e_r_a_t_o_r_<(const _I_n_d_e_x_D_a_t_a_<_T_>& i1, const _I_n_d_e_x_D_a_t_a_<_T_>& i2) │ │ │ │ │ +631 { │ │ │ │ │ +632 return i1._i_n_d_e_x │ │ │ │ │ +_6_4_1 std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, _I_n_d_e_x_D_a_t_a_<_T_>& data) │ │ │ │ │ +642 { │ │ │ │ │ +643 is>>data._i_n_d_e_x; │ │ │ │ │ +644 /* MatrixMarket indices are one based. Decrement for C++ */ │ │ │ │ │ +645 --data._i_n_d_e_x; │ │ │ │ │ +646 return is>>data.number; │ │ │ │ │ +647 } │ │ │ │ │ +648 │ │ │ │ │ +654 template │ │ │ │ │ +_6_5_5 std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, _I_n_d_e_x_D_a_t_a<_N_u_m_e_r_i_c_W_r_a_p_p_e_r>>& data) │ │ │ │ │ +656 { │ │ │ │ │ +657 is>>data._i_n_d_e_x; │ │ │ │ │ +658 /* MatrixMarket indices are one based. Decrement for C++ */ │ │ │ │ │ +659 --data.index; │ │ │ │ │ +660 // real and imaginary part needs to be read separately as │ │ │ │ │ +661 // complex numbers are not provided in pair form. (x,y) │ │ │ │ │ +662 _N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_T_> real, imag; │ │ │ │ │ +663 is>>real; │ │ │ │ │ +664 is>>imag; │ │ │ │ │ +665 data._n_u_m_b_e_r = {real._n_u_m_b_e_r, imag._n_u_m_b_e_r}; │ │ │ │ │ +666 return is; │ │ │ │ │ 667 } │ │ │ │ │ 668 │ │ │ │ │ -669 │ │ │ │ │ -672} // end namespace │ │ │ │ │ -673 │ │ │ │ │ -674#endif │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_m_u_l_t_i_t_y_p_e_b_l_o_c_k_m_a_t_r_i_x_._h_h │ │ │ │ │ -_m_u_l_t_i_t_y_p_e_b_l_o_c_k_v_e_c_t_o_r_._h_h │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:484 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:540 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_N │ │ │ │ │ -static constexpr size_type N() │ │ │ │ │ -Return the number of matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:513 │ │ │ │ │ -_D_u_n_e_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ -void bltsolve(const M &A, X &v, const Y &d) │ │ │ │ │ -block lower triangular solve │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_W_i_t_h_D_i_a_g_T_y_p_e │ │ │ │ │ -WithDiagType │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_b_s_o_r_b │ │ │ │ │ -void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -SSOR step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:646 │ │ │ │ │ -_D_u_n_e_:_:_u_b_l_t_s_o_l_v_e │ │ │ │ │ -void ubltsolve(const M &A, X &v, const Y &d) │ │ │ │ │ -unit block lower triangular solve │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_d_b_j_a_c │ │ │ │ │ -void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -Jacobi step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:658 │ │ │ │ │ -_D_u_n_e_:_:_d_b_g_s │ │ │ │ │ -void dbgs(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -GS step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:622 │ │ │ │ │ -_D_u_n_e_:_:_W_i_t_h_R_e_l_a_x_T_y_p_e │ │ │ │ │ -WithRelaxType │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_b_d_s_o_l_v_e │ │ │ │ │ -void bdsolve(const M &A, X &v, const Y &d) │ │ │ │ │ -block diagonal solve, no relaxation │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:337 │ │ │ │ │ -_D_u_n_e_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ -void butsolve(const M &A, X &v, const Y &d) │ │ │ │ │ -block upper triangular solve │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_b_s_o_r_f │ │ │ │ │ -void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -SOR step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:634 │ │ │ │ │ -_D_u_n_e_:_:_u_b_u_t_s_o_l_v_e │ │ │ │ │ -void ubutsolve(const M &A, X &v, const Y &d) │ │ │ │ │ -unit block upper triangular solve │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_n_o_d_i_a_g │ │ │ │ │ -@ nodiag │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_w_i_t_h_d_i_a_g │ │ │ │ │ -@ withdiag │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_n_o_r_e_l_a_x │ │ │ │ │ -@ norelax │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_w_i_t_h_r_e_l_a_x │ │ │ │ │ -@ withrelax │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:55 │ │ │ │ │ +675 template │ │ │ │ │ +_6_7_6 struct _M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r │ │ │ │ │ +677 { │ │ │ │ │ +683 template │ │ │ │ │ +_6_8_4 void _o_p_e_r_a_t_o_r_(_)(const std::vector > >& rows, │ │ │ │ │ +685 _B_C_R_S_M_a_t_r_i_x_<_T_>& matrix) │ │ │ │ │ +686 { │ │ │ │ │ +687 static_assert(IsNumber::value && brows==1 && bcols==1, "Only scalar │ │ │ │ │ +entries are expected here!"); │ │ │ │ │ +688 for (auto iter=matrix._b_e_g_i_n(); iter!= matrix._e_n_d(); ++iter) │ │ │ │ │ +689 { │ │ │ │ │ +690 auto brow=iter.index(); │ │ │ │ │ +691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter) │ │ │ │ │ +692 (*iter)[siter->index] = siter->number; │ │ │ │ │ +693 } │ │ │ │ │ +694 } │ │ │ │ │ +695 │ │ │ │ │ +701 template │ │ │ │ │ +_7_0_2 void _o_p_e_r_a_t_o_r_(_)(const std::vector > >& rows, │ │ │ │ │ +703 _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_b_r_o_w_s_,_b_c_o_l_s_> >& matrix) │ │ │ │ │ +704 { │ │ │ │ │ +705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter) │ │ │ │ │ +706 { │ │ │ │ │ +707 for (auto brow=iter.index()*brows, │ │ │ │ │ +708 browend=iter.index()*brows+brows; │ │ │ │ │ +709 browindex/bcols][brow%brows][siter->index%bcols]=siter->number; │ │ │ │ │ +714 } │ │ │ │ │ +715 } │ │ │ │ │ +716 } │ │ │ │ │ +717 }; │ │ │ │ │ +718 │ │ │ │ │ +719 template │ │ │ │ │ +_7_2_0 struct _M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r<_P_a_t_t_e_r_n_D_u_m_m_y,brows,bcols> │ │ │ │ │ +721 { │ │ │ │ │ +722 template │ │ │ │ │ +_7_2_3 void _o_p_e_r_a_t_o_r_(_)(const std::vector > >& │ │ │ │ │ +rows, │ │ │ │ │ +724 M& matrix) │ │ │ │ │ +725 {} │ │ │ │ │ +726 }; │ │ │ │ │ +727 │ │ │ │ │ +_7_2_8 template struct _i_s___c_o_m_p_l_e_x : std::false_type {}; │ │ │ │ │ +_7_2_9 template struct _i_s___c_o_m_p_l_e_x<_s_t_d::complex> : std::true_type {}; │ │ │ │ │ +730 │ │ │ │ │ +731 // wrapper for std::conj. Returns T if T is not complex. │ │ │ │ │ +732 template │ │ │ │ │ +_7_3_3 std::enable_if_t::value, T> _c_o_n_j(const T& r){ │ │ │ │ │ +734 return r; │ │ │ │ │ +735 } │ │ │ │ │ +736 │ │ │ │ │ +737 template │ │ │ │ │ +_7_3_8 std::enable_if_t::value, T> _c_o_n_j(const T& r){ │ │ │ │ │ +739 return std::conj(r); │ │ │ │ │ +740 } │ │ │ │ │ +741 │ │ │ │ │ +742 template │ │ │ │ │ +_7_4_3 struct _m_m___m_u_l_t_i_p_l_i_e_r_s │ │ │ │ │ +744 {}; │ │ │ │ │ +745 │ │ │ │ │ +746 template │ │ │ │ │ +_7_4_7 struct _m_m___m_u_l_t_i_p_l_i_e_r_s<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +748 { │ │ │ │ │ +749 enum { │ │ │ │ │ +_7_5_0 rows = 1, │ │ │ │ │ +751 cols = 1 │ │ │ │ │ +_7_5_2 }; │ │ │ │ │ +753 }; │ │ │ │ │ +754 │ │ │ │ │ +755 template │ │ │ │ │ +_7_5_6 struct _m_m___m_u_l_t_i_p_l_i_e_r_s<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > │ │ │ │ │ +757 { │ │ │ │ │ +758 enum { │ │ │ │ │ +_7_5_9 rows = i, │ │ │ │ │ +760 cols = j │ │ │ │ │ +_7_6_1 }; │ │ │ │ │ +762 }; │ │ │ │ │ +763 │ │ │ │ │ +764 template │ │ │ │ │ +_7_6_5 void _r_e_a_d_S_p_a_r_s_e_E_n_t_r_i_e_s(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>& matrix, │ │ │ │ │ +766 std::istream& file, std::size_t entries, │ │ │ │ │ +767 const _M_M_H_e_a_d_e_r& mmHeader, const D&) │ │ │ │ │ +768 { │ │ │ │ │ +769 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_> _M_a_t_r_i_x; │ │ │ │ │ +770 │ │ │ │ │ +771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise) │ │ │ │ │ +772 constexpr int brows = _m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_a_t_r_i_x_>_:_:_r_o_w_s; │ │ │ │ │ +773 constexpr int bcols = _m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_a_t_r_i_x_>_:_:_c_o_l_s; │ │ │ │ │ +774 │ │ │ │ │ +775 // First path │ │ │ │ │ +776 // store entries together with column index in a separate │ │ │ │ │ +777 // data structure │ │ │ │ │ +778 std::vector > > rows(matrix._N()*brows); │ │ │ │ │ +779 │ │ │ │ │ +780 auto readloop = [&] (auto symmetryFixup) { │ │ │ │ │ +781 for(std::size_t i = 0; i < entries; ++i) { │ │ │ │ │ +782 std::size_t row; │ │ │ │ │ +783 _I_n_d_e_x_D_a_t_a_<_D_> data; │ │ │ │ │ +784 _s_k_i_p_C_o_m_m_e_n_t_s(file); │ │ │ │ │ +785 file>>row; │ │ │ │ │ +786 --row; // Index was 1 based. │ │ │ │ │ +787 assert(row/bcols>data; │ │ │ │ │ +789 assert(data._i_n_d_e_x/bcols data_sym(data); │ │ │ │ │ +804 data_sym._i_n_d_e_x = row; │ │ │ │ │ +805 rows[data.index].insert(data_sym); │ │ │ │ │ +806 }); │ │ │ │ │ +807 break; │ │ │ │ │ +808 case _s_k_e_w___s_y_m_m_e_t_r_i_c : │ │ │ │ │ +809 readloop([&](auto row, auto data) { │ │ │ │ │ +810 _I_n_d_e_x_D_a_t_a_<_D_> data_sym; │ │ │ │ │ +811 data_sym.number = -data.number; │ │ │ │ │ +812 data_sym._i_n_d_e_x = row; │ │ │ │ │ +813 rows[data.index].insert(data_sym); │ │ │ │ │ +814 }); │ │ │ │ │ +815 break; │ │ │ │ │ +816 case _h_e_r_m_i_t_i_a_n : │ │ │ │ │ +817 readloop([&](auto row, auto data) { │ │ │ │ │ +818 _I_n_d_e_x_D_a_t_a_<_D_> data_sym; │ │ │ │ │ +819 data_sym.number = _c_o_n_j(data.number); │ │ │ │ │ +820 data_sym._i_n_d_e_x = row; │ │ │ │ │ +821 rows[data.index].insert(data_sym); │ │ │ │ │ +822 }); │ │ │ │ │ +823 break; │ │ │ │ │ +824 default: │ │ │ │ │ +825 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ +826 "Only general, symmetric, skew-symmetric and hermitian is supported right │ │ │ │ │ +now!"); │ │ │ │ │ +827 } │ │ │ │ │ +828 │ │ │ │ │ +829 // Setup the matrix sparsity pattern │ │ │ │ │ +830 int nnz=0; │ │ │ │ │ +831 for(typename Matrix::CreateIterator iter=matrix._c_r_e_a_t_e_b_e_g_i_n(); │ │ │ │ │ +832 iter!= matrix._c_r_e_a_t_e_e_n_d(); ++iter) │ │ │ │ │ +833 { │ │ │ │ │ +834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows; │ │ │ │ │ +835 brow >::const_iterator Siter; │ │ │ │ │ +838 for(Siter siter=rows[brow].begin(), send=rows[brow].end(); │ │ │ │ │ +839 siter != send; ++siter, ++nnz) │ │ │ │ │ +840 iter.insert(siter->index/bcols); │ │ │ │ │ +841 } │ │ │ │ │ +842 } │ │ │ │ │ +843 │ │ │ │ │ +844 //Set the matrix values │ │ │ │ │ +845 matrix=0; │ │ │ │ │ +846 │ │ │ │ │ +847 _M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_D_,_b_r_o_w_s_,_b_c_o_l_s_> Setter; │ │ │ │ │ +848 │ │ │ │ │ +849 Setter(rows, matrix); │ │ │ │ │ +850 } │ │ │ │ │ +851 │ │ │ │ │ +_8_5_2 inline std::tuple _s_p_l_i_t_F_i_l_e_n_a_m_e(const std:: │ │ │ │ │ +string& filename) { │ │ │ │ │ +853 std::size_t lastdot = filename.find_last_of("."); │ │ │ │ │ +854 if(lastdot == std::string::npos) │ │ │ │ │ +855 return std::make_tuple(filename, ""); │ │ │ │ │ +856 else { │ │ │ │ │ +857 std::string potentialFileExtension = filename.substr(lastdot); │ │ │ │ │ +858 if (potentialFileExtension == ".mm" || potentialFileExtension == ".mtx") │ │ │ │ │ +859 return std::make_tuple(filename.substr(0, lastdot), │ │ │ │ │ +potentialFileExtension); │ │ │ │ │ +860 else │ │ │ │ │ +861 return std::make_tuple(filename, ""); │ │ │ │ │ +862 } │ │ │ │ │ +863 } │ │ │ │ │ +864 │ │ │ │ │ +865 } // end namespace MatrixMarketImpl │ │ │ │ │ +866 │ │ │ │ │ +_8_6_7 class _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r : public Dune::Exception │ │ │ │ │ +868 {}; │ │ │ │ │ +869 │ │ │ │ │ +870 │ │ │ │ │ +_8_7_1 inline void _m_m___r_e_a_d___h_e_a_d_e_r(std::size_t& rows, std::size_t& cols, │ │ │ │ │ +872 _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r& header, std::istream& istr, │ │ │ │ │ +873 bool isVector) │ │ │ │ │ +874 { │ │ │ │ │ +875 using namespace MatrixMarketImpl; │ │ │ │ │ +876 │ │ │ │ │ +877 if(!readMatrixMarketBanner(istr, header)) { │ │ │ │ │ +878 std::cerr << "First line was not a correct Matrix Market banner. Using │ │ │ │ │ +default:\n" │ │ │ │ │ +879 << "%%MatrixMarket matrix coordinate real general"<> rows; │ │ │ │ │ +893 │ │ │ │ │ +894 if(lineFeed(istr)) │ │ │ │ │ +895 throw _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r(); │ │ │ │ │ +896 istr >> cols; │ │ │ │ │ +897 } │ │ │ │ │ +898 │ │ │ │ │ +899 template │ │ │ │ │ +_9_0_0 void _m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s(_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& vector, │ │ │ │ │ +901 std::size_t size, │ │ │ │ │ +902 std::istream& istr, │ │ │ │ │ +903 size_t lane) │ │ │ │ │ +904 { │ │ │ │ │ +905 for (int i=0; size>0; ++i, --size) │ │ │ │ │ +906 istr>>Simd::lane(lane,vector[i]); │ │ │ │ │ +907 } │ │ │ │ │ +908 │ │ │ │ │ +909 template │ │ │ │ │ +_9_1_0 void _m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s(_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r,A>& vector, │ │ │ │ │ +911 std::size_t size, │ │ │ │ │ +912 std::istream& istr, │ │ │ │ │ +913 size_t lane) │ │ │ │ │ +914 { │ │ │ │ │ +915 for(int i=0; size>0; ++i, --size) { │ │ │ │ │ +916 Simd::Scalar val; │ │ │ │ │ +917 istr>>val; │ │ │ │ │ +918 Simd::lane(lane, vector[i/entries][i%entries])=val; │ │ │ │ │ +919 } │ │ │ │ │ +920 } │ │ │ │ │ +921 │ │ │ │ │ +922 │ │ │ │ │ +929 template │ │ │ │ │ +_9_3_0 void _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t(_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& vector, │ │ │ │ │ +931 std::istream& istr) │ │ │ │ │ +932 { │ │ │ │ │ +933 typedef typename _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>_:_:_f_i_e_l_d___t_y_p_e field_type; │ │ │ │ │ +934 using namespace MatrixMarketImpl; │ │ │ │ │ +935 │ │ │ │ │ +936 MMHeader header; │ │ │ │ │ +937 std::size_t rows, cols; │ │ │ │ │ +938 _m_m___r_e_a_d___h_e_a_d_e_r(rows,cols,header,istr, true); │ │ │ │ │ +939 if(cols!=Simd::lanes()) { │ │ │ │ │ +940 if(Simd::lanes() == 1) │ │ │ │ │ +941 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "cols!=1, therefore this is no │ │ │ │ │ +vector!"); │ │ │ │ │ +942 else │ │ │ │ │ +943 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "cols does not match the number of │ │ │ │ │ +lanes in the field_type!"); │ │ │ │ │ +944 } │ │ │ │ │ +945 │ │ │ │ │ +946 if(header.type!=array_type) │ │ │ │ │ +947 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "Vectors have to be stored in array │ │ │ │ │ +format!"); │ │ │ │ │ +948 │ │ │ │ │ +949 │ │ │ │ │ +950 if constexpr (Dune::IsNumber()) │ │ │ │ │ +951 vector._r_e_s_i_z_e(rows); │ │ │ │ │ +952 else │ │ │ │ │ +953 { │ │ │ │ │ +954 T dummy; │ │ │ │ │ +955 auto blocksize = dummy.size(); │ │ │ │ │ +956 std::size_t size=rows/blocksize; │ │ │ │ │ +957 if(size*blocksize!=rows) │ │ │ │ │ +958 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "Block size of vector is not │ │ │ │ │ +correct!"); │ │ │ │ │ +959 │ │ │ │ │ +960 vector._r_e_s_i_z_e(size); │ │ │ │ │ +961 } │ │ │ │ │ +962 │ │ │ │ │ +963 istr.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +964 for(size_t l=0;l();++l){ │ │ │ │ │ +965 _m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s(vector, rows, istr, l); │ │ │ │ │ +966 } │ │ │ │ │ +967 } │ │ │ │ │ +968 │ │ │ │ │ +975 template │ │ │ │ │ +_9_7_6 void _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>& matrix, │ │ │ │ │ +977 std::istream& istr) │ │ │ │ │ +978 { │ │ │ │ │ +979 using namespace MatrixMarketImpl; │ │ │ │ │ +980 using _M_a_t_r_i_x = _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>; │ │ │ │ │ +981 │ │ │ │ │ +982 MMHeader header; │ │ │ │ │ +983 if(!readMatrixMarketBanner(istr, header)) { │ │ │ │ │ +984 std::cerr << "First line was not a correct Matrix Market banner. Using │ │ │ │ │ +default:\n" │ │ │ │ │ +985 << "%%MatrixMarket matrix coordinate real general"<> rows; │ │ │ │ │ +998 │ │ │ │ │ +999 if(lineFeed(istr)) │ │ │ │ │ +1000 throw _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r(); │ │ │ │ │ +1001 istr >> cols; │ │ │ │ │ +1002 │ │ │ │ │ +1003 if(lineFeed(istr)) │ │ │ │ │ +1004 throw _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r(); │ │ │ │ │ +1005 │ │ │ │ │ +1006 istr >>entries; │ │ │ │ │ +1007 │ │ │ │ │ +1008 std::size_t nnz, blockrows, blockcols; │ │ │ │ │ +1009 │ │ │ │ │ +1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise) │ │ │ │ │ +1011 constexpr int brows = mm_multipliers::rows; │ │ │ │ │ +1012 constexpr int bcols = mm_multipliers::cols; │ │ │ │ │ +1013 │ │ │ │ │ +1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ(rows, │ │ │ │ │ +cols, entries, header); │ │ │ │ │ +1015 │ │ │ │ │ +1016 istr.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ +1017 │ │ │ │ │ +1018 │ │ │ │ │ +1019 matrix._s_e_t_S_i_z_e(blockrows, blockcols, nnz); │ │ │ │ │ +1020 matrix._s_e_t_B_u_i_l_d_M_o_d_e(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>_:_:_r_o_w___w_i_s_e); │ │ │ │ │ +1021 │ │ │ │ │ +1022 if(header.type==array_type) │ │ │ │ │ +1023 DUNE_THROW(Dune::NotImplemented, "Array format currently not supported for │ │ │ │ │ +matrices!"); │ │ │ │ │ +1024 │ │ │ │ │ +1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper()); │ │ │ │ │ +1026 } │ │ │ │ │ +1027 │ │ │ │ │ +1028 // Print a scalar entry │ │ │ │ │ +1029 template │ │ │ │ │ +_1_0_3_0 void _m_m___p_r_i_n_t___e_n_t_r_y(const B& entry, │ │ │ │ │ +1031 std::size_t rowidx, │ │ │ │ │ +1032 std::size_t colidx, │ │ │ │ │ +1033 std::ostream& ostr) │ │ │ │ │ +1034 { │ │ │ │ │ +1035 if constexpr (IsNumber()) │ │ │ │ │ +1036 ostr << rowidx << " " << colidx << " " << entry << std::endl; │ │ │ │ │ +1037 else │ │ │ │ │ +1038 { │ │ │ │ │ +1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) { │ │ │ │ │ +1040 int coli=colidx; │ │ │ │ │ +1041 for (auto _c_o_l = row->begin(); _c_o_l != row->end(); ++_c_o_l, ++coli) │ │ │ │ │ +1042 ostr<< rowidx<<" "< │ │ │ │ │ +_1_0_4_9 void _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(const V& entry, std::ostream& ostr, │ │ │ │ │ +1050 const std::integral_constant&, │ │ │ │ │ +1051 size_t lane) │ │ │ │ │ +1052 { │ │ │ │ │ +1053 ostr< │ │ │ │ │ +_1_0_5_8 void _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(const V& vector, std::ostream& ostr, │ │ │ │ │ +1059 const std::integral_constant&, │ │ │ │ │ +1060 size_t lane) │ │ │ │ │ +1061 { │ │ │ │ │ +1062 using namespace MatrixMarketImpl; │ │ │ │ │ +1063 │ │ │ │ │ +1064 // Is the entry a supported numeric type? │ │ │ │ │ +1065 const int isnumeric = mm_numeric_type>::is_numeric; │ │ │ │ │ +1066 typedef typename V::const_iterator VIter; │ │ │ │ │ +1067 │ │ │ │ │ +1068 for(VIter i=vector.begin(); i != vector.end(); ++i) │ │ │ │ │ +1069 │ │ │ │ │ +1070 _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(*i, ostr, │ │ │ │ │ +1071 std::integral_constant(), │ │ │ │ │ +1072 lane); │ │ │ │ │ +1073 } │ │ │ │ │ +1074 │ │ │ │ │ +1075 template │ │ │ │ │ +_1_0_7_6 std::size_t _c_o_u_n_t_E_n_t_r_i_e_s(const _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& vector) │ │ │ │ │ +1077 { │ │ │ │ │ +1078 return vector.size(); │ │ │ │ │ +1079 } │ │ │ │ │ +1080 │ │ │ │ │ +1081 template │ │ │ │ │ +_1_0_8_2 std::size_t _c_o_u_n_t_E_n_t_r_i_e_s(const _B_l_o_c_k_V_e_c_t_o_r,A>& vector) │ │ │ │ │ +1083 { │ │ │ │ │ +1084 return vector.size()*i; │ │ │ │ │ +1085 } │ │ │ │ │ +1086 │ │ │ │ │ +1087 // Version for writing vectors. │ │ │ │ │ +1088 template │ │ │ │ │ +_1_0_8_9 void _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(const V& vector, std::ostream& ostr, │ │ │ │ │ +1090 const std::integral_constant&) │ │ │ │ │ +1091 { │ │ │ │ │ +1092 using namespace MatrixMarketImpl; │ │ │ │ │ +1093 typedef typename V::field_type field_type; │ │ │ │ │ +1094 │ │ │ │ │ +1095 ostr<<_c_o_u_n_t_E_n_t_r_i_e_s(vector)<<" "<()<>::is_numeric; │ │ │ │ │ +1097 for(size_t l=0;l(); ++l){ │ │ │ │ │ +1098 _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(vector,ostr, std::integral_constant │ │ │ │ │ +(), l); │ │ │ │ │ +1099 } │ │ │ │ │ +1100 } │ │ │ │ │ +1101 │ │ │ │ │ +1102 // Versions for writing matrices │ │ │ │ │ +1103 template │ │ │ │ │ +_1_1_0_4 void _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ +1105 std::ostream& ostr, │ │ │ │ │ +1106 const std::integral_constant&) │ │ │ │ │ +1107 { │ │ │ │ │ +1108 ostr<_:_:_r_o_w_s<<" " │ │ │ │ │ +1109 <_:_:_c_o_l_s<<" " │ │ │ │ │ +1110 <<_c_o_u_n_t_N_o_n_Z_e_r_o_s(matrix)<begin(); _c_o_l != row->end(); ++_c_o_l) │ │ │ │ │ +1116 // Matrix Market indexing start with 1! │ │ │ │ │ +1117 _m_m___p_r_i_n_t___e_n_t_r_y(*_c_o_l, row.index()*_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_>_:_: │ │ │ │ │ +_r_o_w_s+1, │ │ │ │ │ +1118 _c_o_l.index()*_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_>_:_:_c_o_l_s+1, ostr); │ │ │ │ │ +1119 } │ │ │ │ │ +1120 │ │ │ │ │ +1121 │ │ │ │ │ +1125 template │ │ │ │ │ +_1_1_2_6 void _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ +1127 std::ostream& ostr) │ │ │ │ │ +1128 { │ │ │ │ │ +1129 using namespace MatrixMarketImpl; │ │ │ │ │ +1130 │ │ │ │ │ +1131 // Write header information │ │ │ │ │ +1132 mm_header_printer::print(ostr); │ │ │ │ │ +1133 mm_block_structure_header::print(ostr,matrix); │ │ │ │ │ +1134 // Choose the correct function for matrix and vector │ │ │ │ │ +1135 _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(matrix,ostr,std::integral_constant_:_: │ │ │ │ │ +_v_a_l_u_e>()); │ │ │ │ │ +1136 } │ │ │ │ │ +1137 │ │ │ │ │ +_1_1_3_8 static const int _d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n = -1; │ │ │ │ │ +1150 template │ │ │ │ │ +_1_1_5_1 void _s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ +1152 std::string filename, │ │ │ │ │ +1153 int prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ +1154 { │ │ │ │ │ +1155 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ +(filename); │ │ │ │ │ +1156 std::string rfilename; │ │ │ │ │ +1157 std::ofstream file; │ │ │ │ │ +1158 if (extension != "") { │ │ │ │ │ +1159 rfilename = pureFilename + extension; │ │ │ │ │ +1160 file.open(rfilename.c_str()); │ │ │ │ │ +1161 if(!file) │ │ │ │ │ +1162 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str │ │ │ │ │ +()); │ │ │ │ │ +1163 } │ │ │ │ │ +1164 else { │ │ │ │ │ +1165 // only try .mm so we do not ignore potential errors │ │ │ │ │ +1166 rfilename = pureFilename + ".mm"; │ │ │ │ │ +1167 file.open(rfilename.c_str()); │ │ │ │ │ +1168 if(!file) │ │ │ │ │ +1169 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str │ │ │ │ │ +()); │ │ │ │ │ +1170 } │ │ │ │ │ +1171 │ │ │ │ │ +1172 file.setf(std::ios::scientific,std::ios::floatfield); │ │ │ │ │ +1173 if(prec>0) │ │ │ │ │ +1174 file.precision(prec); │ │ │ │ │ +1175 _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(matrix, file); │ │ │ │ │ +1176 file.close(); │ │ │ │ │ +1177 } │ │ │ │ │ +1178 │ │ │ │ │ +1179#if HAVE_MPI │ │ │ │ │ +1194 template │ │ │ │ │ +_1_1_9_5 void _s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ +1196 std::string filename, │ │ │ │ │ +1197 const _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>& comm, │ │ │ │ │ +1198 bool storeIndices=true, │ │ │ │ │ +1199 int prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ +1200 { │ │ │ │ │ +1201 // Get our rank │ │ │ │ │ +1202 int rank = comm._c_o_m_m_u_n_i_c_a_t_o_r().rank(); │ │ │ │ │ +1203 // Write the local matrix │ │ │ │ │ +1204 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ +(filename); │ │ │ │ │ +1205 std::string rfilename; │ │ │ │ │ +1206 std::ofstream file; │ │ │ │ │ +1207 if (extension != "") { │ │ │ │ │ +1208 rfilename = pureFilename + "_" + std::to_string(rank) + extension; │ │ │ │ │ +1209 file.open(rfilename.c_str()); │ │ │ │ │ +1210 dverb<< rfilename <0) │ │ │ │ │ +1224 file.precision(prec); │ │ │ │ │ +1225 _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(matrix, file); │ │ │ │ │ +1226 file.close(); │ │ │ │ │ +1227 │ │ │ │ │ +1228 if(!storeIndices) │ │ │ │ │ +1229 return; │ │ │ │ │ +1230 │ │ │ │ │ +1231 // Write the global to local index mapping │ │ │ │ │ +1232 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx"; │ │ │ │ │ +1233 file.open(rfilename.c_str()); │ │ │ │ │ +1234 if(!file) │ │ │ │ │ +1235 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str │ │ │ │ │ +()); │ │ │ │ │ +1236 file.setf(std::ios::scientific,std::ios::floatfield); │ │ │ │ │ +1237 typedef typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +IndexSet; │ │ │ │ │ +1238 typedef typename IndexSet::const_iterator Iterator; │ │ │ │ │ +1239 for(Iterator iter = comm._i_n_d_e_x_S_e_t().begin(); │ │ │ │ │ +1240 iter != comm._i_n_d_e_x_S_e_t().end(); ++iter) { │ │ │ │ │ +1241 file << iter->global()<<" "<<(std::size_t)iter->local()<<" " │ │ │ │ │ +1242 <<(int)iter->local().attribute()<<" "<<(int)iter->local().isPublic │ │ │ │ │ +()<& neighbours=comm._r_e_m_o_t_e_I_n_d_i_c_e_s().getNeighbours(); │ │ │ │ │ +1247 typedef std::set::const_iterator SIter; │ │ │ │ │ +1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end(); │ │ │ │ │ +++neighbour) { │ │ │ │ │ +1249 file<<" "<< *neighbour; │ │ │ │ │ +1250 } │ │ │ │ │ +1251 file.close(); │ │ │ │ │ +1252 } │ │ │ │ │ +1253 │ │ │ │ │ +1268 template │ │ │ │ │ +_1_2_6_9 void _l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t(M& matrix, │ │ │ │ │ +1270 const std::string& filename, │ │ │ │ │ +1271 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>& comm, │ │ │ │ │ +1272 bool readIndices=true) │ │ │ │ │ +1273 { │ │ │ │ │ +1274 using namespace MatrixMarketImpl; │ │ │ │ │ +1275 │ │ │ │ │ +1276 using LocalIndexT = typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>_:_: │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +1277 typedef typename LocalIndexT::Attribute Attribute; │ │ │ │ │ +1278 // Get our rank │ │ │ │ │ +1279 int rank = comm._c_o_m_m_u_n_i_c_a_t_o_r().rank(); │ │ │ │ │ +1280 // load local matrix │ │ │ │ │ +1281 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ +(filename); │ │ │ │ │ +1282 std::string rfilename; │ │ │ │ │ +1283 std::ifstream file; │ │ │ │ │ +1284 if (extension != "") { │ │ │ │ │ +1285 rfilename = pureFilename + "_" + std::to_string(rank) + extension; │ │ │ │ │ +1286 file.open(rfilename.c_str(), std::ios::in); │ │ │ │ │ +1287 dverb<< rfilename <_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +IndexSet; │ │ │ │ │ +1311 IndexSet& pis=comm.pis; │ │ │ │ │ +1312 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx"; │ │ │ │ │ +1313 file.open(rfilename.c_str()); │ │ │ │ │ +1314 if(!file) │ │ │ │ │ +1315 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str()); │ │ │ │ │ +1316 if(pis.size()!=0) │ │ │ │ │ +1317 DUNE_THROW(InvalidIndexSetState, "Index set is not empty!"); │ │ │ │ │ +1318 │ │ │ │ │ +1319 pis.beginResize(); │ │ │ │ │ +1320 while(!file.eof() && file.peek()!='n') { │ │ │ │ │ +1321 G g; │ │ │ │ │ +1322 file >>g; │ │ │ │ │ +1323 std::size_t l; │ │ │ │ │ +1324 file >>l; │ │ │ │ │ +1325 int c; │ │ │ │ │ +1326 file >>c; │ │ │ │ │ +1327 bool b; │ │ │ │ │ +1328 file >> b; │ │ │ │ │ +1329 pis.add(g,LocalIndexT(l,Attribute(c),b)); │ │ │ │ │ +1330 lineFeed(file); │ │ │ │ │ +1331 } │ │ │ │ │ +1332 pis.endResize(); │ │ │ │ │ +1333 if(!file.eof()) { │ │ │ │ │ +1334 // read neighbours │ │ │ │ │ +1335 std::string s; │ │ │ │ │ +1336 file>>s; │ │ │ │ │ +1337 if(s!="neighbours:") │ │ │ │ │ +1338 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "was expecting the string: │ │ │ │ │ +\"neighbours:\""); │ │ │ │ │ +1339 std::set nb; │ │ │ │ │ +1340 while(!file.eof()) { │ │ │ │ │ +1341 int i; │ │ │ │ │ +1342 file >> i; │ │ │ │ │ +1343 nb.insert(i); │ │ │ │ │ +1344 } │ │ │ │ │ +1345 file.close(); │ │ │ │ │ +1346 comm.ri.setNeighbours(nb); │ │ │ │ │ +1347 } │ │ │ │ │ +1348 comm.ri.template rebuild(); │ │ │ │ │ +1349 } │ │ │ │ │ +1350 │ │ │ │ │ +1351 #endif │ │ │ │ │ +1352 │ │ │ │ │ +1363 template │ │ │ │ │ +_1_3_6_4 void _l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t(M& matrix, │ │ │ │ │ +1365 const std::string& filename) │ │ │ │ │ +1366 { │ │ │ │ │ +1367 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ +(filename); │ │ │ │ │ +1368 std::string rfilename; │ │ │ │ │ +1369 std::ifstream file; │ │ │ │ │ +1370 if (extension != "") { │ │ │ │ │ +1371 rfilename = pureFilename + extension; │ │ │ │ │ +1372 file.open(rfilename.c_str()); │ │ │ │ │ +1373 if(!file) │ │ │ │ │ +1374 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str()); │ │ │ │ │ +1375 } │ │ │ │ │ +1376 else { │ │ │ │ │ +1377 // try both .mm and .mtx │ │ │ │ │ +1378 rfilename = pureFilename + ".mm"; │ │ │ │ │ +1379 file.open(rfilename.c_str(), std::ios::in); │ │ │ │ │ +1380 if(!file) { │ │ │ │ │ +1381 rfilename = pureFilename + ".mtx"; │ │ │ │ │ +1382 file.open(rfilename.c_str(), std::ios::in); │ │ │ │ │ +1383 if(!file) │ │ │ │ │ +1384 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str()); │ │ │ │ │ +1385 } │ │ │ │ │ +1386 } │ │ │ │ │ +1387 _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t(matrix,file); │ │ │ │ │ +1388 file.close(); │ │ │ │ │ +1389 } │ │ │ │ │ +1390 │ │ │ │ │ +1392} │ │ │ │ │ +1393#endif │ │ │ │ │ +_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ +Some handy generic functions for ISTL matrices. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s │ │ │ │ │ +auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ +value > *sfinae=nullptr) │ │ │ │ │ +Get the number of nonzero fields in the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:119 │ │ │ │ │ +_D_u_n_e_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ +void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr) │ │ │ │ │ +Reads a BlockVector from a matrix market file. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:930 │ │ │ │ │ +_D_u_n_e_:_:_s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ +void storeMatrixMarket(const M &matrix, std::string filename, int │ │ │ │ │ +prec=default_precision) │ │ │ │ │ +Stores a parallel matrix/vector in matrix market format in a file. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1151 │ │ │ │ │ +_D_u_n_e_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ +void loadMatrixMarket(M &matrix, const std::string &filename, │ │ │ │ │ +OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true) │ │ │ │ │ +Load a parallel matrix/vector stored in matrix market format. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1269 │ │ │ │ │ +_D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s │ │ │ │ │ +std::size_t countEntries(const BlockVector< T, A > &vector) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1076 │ │ │ │ │ +_D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ +void writeMatrixMarket(const V &vector, std::ostream &ostr, const std:: │ │ │ │ │ +integral_constant< int, 0 > &) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1089 │ │ │ │ │ +_D_u_n_e_:_:_m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y │ │ │ │ │ +void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std:: │ │ │ │ │ +integral_constant< int, 1 > &, size_t lane) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1049 │ │ │ │ │ +_D_u_n_e_:_:_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n │ │ │ │ │ +static const int default_precision │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1138 │ │ │ │ │ +_D_u_n_e_:_:_m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s │ │ │ │ │ +void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t │ │ │ │ │ +size, std::istream &istr, size_t lane) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:900 │ │ │ │ │ +_D_u_n_e_:_:_m_m___r_e_a_d___h_e_a_d_e_r │ │ │ │ │ +void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl:: │ │ │ │ │ +MMHeader &header, std::istream &istr, bool isVector) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:871 │ │ │ │ │ +_D_u_n_e_:_:_m_m___p_r_i_n_t___e_n_t_r_y │ │ │ │ │ +void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx, │ │ │ │ │ +std::ostream &ostr) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1030 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A Vector class to support different block types. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ -A Matrix class to support different block types. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_B_L │ │ │ │ │ -compile-time parameter for block recursion depth │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_B_L_:_:_r_e_c_u_r_s_i_o_n___l_e_v_e_l │ │ │ │ │ -@ recursion_level │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ -static void butsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ -static void bltsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ -static void bltsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ -static void butsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ -static void bltsolve(const M &A, X &v, const Y &d, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ -static void butsolve(const M &A, X &v, const Y &d, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ -static void bltsolve(const M &, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ -static void butsolve(const M &, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ -static void bltsolve(const M &, X &v, const Y &d, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ -static void butsolve(const M &, X &v, const Y &d, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:294 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_:_:_b_d_s_o_l_v_e │ │ │ │ │ -static void bdsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_d_s_o_l_v_e │ │ │ │ │ -static void bdsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:316 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _n_o_r_e_l_a_x_ _>_:_:_b_d_s_o_l_v_e │ │ │ │ │ -static void bdsolve(const M &A, X &v, const Y &d, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:325 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:375 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:418 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:378 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:545 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:550 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:555 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ -_>_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ -MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ -MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:571 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ -_>_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ -MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ -MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:608 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ -_>_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ -MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ -MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:583 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ -_>_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ -MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ -MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:595 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_a_l_c_u_l_a_t_e_N_N_Z │ │ │ │ │ +std::tuple< std::size_t, std::size_t, std::size_t > calculateNNZ(std::size_t │ │ │ │ │ +rows, std::size_t cols, std::size_t entries, const MMHeader &header) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:547 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ +bool operator<(const IndexData< T > &i1, const IndexData< T > &i2) │ │ │ │ │ +LessThan operator. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:630 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_L_i_n_e_T_y_p_e │ │ │ │ │ +LineType │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_D_A_T_A │ │ │ │ │ +@ DATA │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___H_E_A_D_E_R │ │ │ │ │ +@ MM_HEADER │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___I_S_T_L_S_T_R_U_C_T │ │ │ │ │ +@ MM_ISTLSTRUCT │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t_B_a_n_n_e_r │ │ │ │ │ +bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_r_e_a_d_S_p_a_r_s_e_E_n_t_r_i_e_s │ │ │ │ │ +void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file, │ │ │ │ │ +std::size_t entries, const MMHeader &mmHeader, const D &) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:765 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___T_Y_P_E │ │ │ │ │ +MM_TYPE │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_a_r_r_a_y___t_y_p_e │ │ │ │ │ +@ array_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_o_r_d_i_n_a_t_e___t_y_p_e │ │ │ │ │ +@ coordinate_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___t_y_p_e │ │ │ │ │ +@ unknown_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ +std::istream & operator>>(std::istream &is, NumericWrapper< T > &num) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_i_p_C_o_m_m_e_n_t_s │ │ │ │ │ +void skipComments(std::istream &file) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:339 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_l_i_n_e_F_e_e_d │ │ │ │ │ +bool lineFeed(std::istream &file) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:315 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___M_A_X___L_I_N_E___L_E_N_G_T_H │ │ │ │ │ +@ MM_MAX_LINE_LENGTH │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___S_T_R_U_C_T_U_R_E │ │ │ │ │ +MM_STRUCTURE │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_e_w___s_y_m_m_e_t_r_i_c │ │ │ │ │ +@ skew_symmetric │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_g_e_n_e_r_a_l │ │ │ │ │ +@ general │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_h_e_r_m_i_t_i_a_n │ │ │ │ │ +@ hermitian │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___s_t_r_u_c_t_u_r_e │ │ │ │ │ +@ unknown_structure │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_y_m_m_e_t_r_i_c │ │ │ │ │ +@ symmetric │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___C_T_Y_P_E │ │ │ │ │ +MM_CTYPE │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___c_t_y_p_e │ │ │ │ │ +@ unknown_ctype │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_p_a_t_t_e_r_n │ │ │ │ │ +@ pattern │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_m_p_l_e_x___t_y_p_e │ │ │ │ │ +@ complex_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_d_o_u_b_l_e___t_y_p_e │ │ │ │ │ +@ double_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_n_t_e_g_e_r___t_y_p_e │ │ │ │ │ +@ integer_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_n_j │ │ │ │ │ +std::enable_if_t::value, T > conj(const T &r) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:733 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ +std::tuple< std::string, std::string > splitFilename(const std::string │ │ │ │ │ +&filename) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:852 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +Iterator begin() │ │ │ │ │ +Get iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:675 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +Iterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ +CreateIterator createend() │ │ │ │ │ +get create iterator pointing to one after the last block │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1103 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +number of columns (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ +CreateIterator createbegin() │ │ │ │ │ +get initial create iterator │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of rows (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_B_u_i_l_d_M_o_d_e │ │ │ │ │ +void setBuildMode(BuildMode bm) │ │ │ │ │ +Sets the build mode of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:833 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ +Set the size of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type size) │ │ │ │ │ +Resize the vector. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:503 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ +Helper metaprogram to get the matrix market string representation of the │ │ │ │ │ +numeric type. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_:_:_i_s___n_u_m_e_r_i_c │ │ │ │ │ +@ is_numeric │ │ │ │ │ +Whether T is a supported numeric type. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _i_n_t_ _>_:_:_s_t_r │ │ │ │ │ +static std::string str() │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _d_o_u_b_l_e_ _>_:_:_s_t_r │ │ │ │ │ +static std::string str() │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _f_l_o_a_t_ _>_:_:_s_t_r │ │ │ │ │ +static std::string str() │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _>_:_:_s_t_r │ │ │ │ │ +static std::string str() │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _>_:_:_s_t_r │ │ │ │ │ +static std::string str() │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r │ │ │ │ │ +Meta program to write the correct Matrix Market header. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _j_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:199 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r │ │ │ │ │ +Metaprogram for writing the ISTL block structure header. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os, const M &) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:233 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ +BlockVector< T, A > M │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_, │ │ │ │ │ +_i_ _>_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ +BlockVector< FieldVector< T, i >, A > M │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:243 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_, │ │ │ │ │ +_i_ _>_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os, const M &) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ +BCRSMatrix< T, A > M │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os, const M &) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_, │ │ │ │ │ +_i_,_ _j_ _>_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, i, j >, A > M │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_, │ │ │ │ │ +_i_,_ _j_ _>_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os, const M &) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _>_:_: │ │ │ │ │ +_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os, const M &m) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _>_:_:_M │ │ │ │ │ +FieldMatrix< T, i, j > M │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ +static void print(std::ostream &os, const M &m) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:292 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _>_ _>_:_:_M │ │ │ │ │ +FieldVector< T, i > M │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_s_t_r_u_c_t_u_r_e │ │ │ │ │ +MM_STRUCTURE structure │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:312 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_t_y_p_e │ │ │ │ │ +MM_TYPE type │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:310 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_M_M_H_e_a_d_e_r │ │ │ │ │ +MMHeader() │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_c_t_y_p_e │ │ │ │ │ +MM_CTYPE ctype │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_I_n_d_e_x_D_a_t_a │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:578 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_I_n_d_e_x_D_a_t_a_:_:_i_n_d_e_x │ │ │ │ │ +std::size_t index │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:579 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r │ │ │ │ │ +a wrapper class of numeric values. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:595 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r_:_:_n_u_m_b_e_r │ │ │ │ │ +T number │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:596 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_P_a_t_t_e_r_n_D_u_m_m_y │ │ │ │ │ +Utility class for marking the pattern type of the MatrixMarket matrices. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:607 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r │ │ │ │ │ +Functor to the data values of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:677 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const std::vector< std::set< IndexData< D > > > &rows, │ │ │ │ │ +BCRSMatrix< T > &matrix) │ │ │ │ │ +Sets the matrix values. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:684 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const std::vector< std::set< IndexData< D > > > &rows, │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix) │ │ │ │ │ +Sets the matrix values. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:702 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_ _P_a_t_t_e_r_n_D_u_m_m_y_,_ _b_r_o_w_s_,_ _b_c_o_l_s_ _>_:_: │ │ │ │ │ +_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const std::vector< std::set< IndexData< PatternDummy > > > │ │ │ │ │ +&rows, M &matrix) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:723 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_s___c_o_m_p_l_e_x │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:728 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:744 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:868 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_I_s_M_a_t_r_i_x │ │ │ │ │ +Test whether a type is an ISTL Matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ +const ParallelIndexSet & indexSet() const │ │ │ │ │ +Get the underlying parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:462 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +const Communication< MPI_Comm > & communicator() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +const RemoteIndices & remoteIndices() const │ │ │ │ │ +Get the underlying remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ +The type of the parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00020.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: io.hh File Reference │ │ │ │ +dune-istl: scalarproducts.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,104 +73,69 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Some generic functions for pretty printing vectors and matrices. │ │ │ │ +

Define base class for scalar product and norm. │ │ │ │ More...

│ │ │ │
#include <cmath>
│ │ │ │ #include <complex>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <ios>
│ │ │ │ +#include <iostream>
│ │ │ │ #include <iomanip>
│ │ │ │ -#include <fstream>
│ │ │ │ #include <string>
│ │ │ │ -#include "matrixutils.hh"
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/shared_ptr.hh>
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include "solvercategory.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::DefaultSVGMatrixOptions
 Default options class to write SVG matrices. More...
class  Dune::ScalarProduct< X >
 Base class for scalar product and norm computation. More...
 
class  Dune::ParallelScalarProduct< X, C >
 Scalar product for overlapping Schwarz methods. More...
 
class  Dune::SeqScalarProduct< X >
 Default implementation for the scalar case. More...
 
class  Dune::NonoverlappingSchwarzScalarProduct< X, C >
 Nonoverlapping Scalar Product with communication object. More...
 
class  Dune::OverlappingSchwarzScalarProduct< X, C >
 Scalar product for overlapping Schwarz methods. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class V >
void Dune::recursive_printvector (std::ostream &s, const V &v, std::string rowtext, int &counter, int columns, int width)
 Recursively print a vector.
 
template<class V >
void Dune::printvector (std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
 Print an ISTL vector.
 
void Dune::fill_row (std::ostream &s, int m, int width, int precision)
 Print a row of zeros for a non-existing block.
 
template<class K >
void Dune::print_row (std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1 >::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
 Print one row of a matrix, specialization for number types.
 
template<class M >
void Dune::print_row (std::ostream &s, const M &A, typename M::size_type I, typename M::size_type J, typename M::size_type therow, int width, int precision, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
 Print one row of a matrix.
 
template<class M >
void Dune::printmatrix (std::ostream &s, const M &A, std::string title, std::string rowtext, int width=10, int precision=2)
 Print a generic block matrix.
 
template<class B , int n, int m, class A >
void Dune::printSparseMatrix (std::ostream &s, const BCRSMatrix< FieldMatrix< B, n, m >, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
 Prints a BCRSMatrix with fixed sized blocks.
 
template<class FieldType >
void Dune::writeMatrixToMatlabHelper (const FieldType &value, int rowOffset, int colOffset, std::ostream &s, typename std::enable_if_t< Dune::IsNumber< FieldType >::value > *sfinae=nullptr)
 Helper method for the writeMatrixToMatlab routine.
 
template<class MatrixType >
void Dune::writeMatrixToMatlabHelper (const MatrixType &matrix, int externalRowOffset, int externalColOffset, std::ostream &s, typename std::enable_if_t<!Dune::IsNumber< MatrixType >::value > *sfinae=nullptr)
 Helper method for the writeMatrixToMatlab routine.
 
template<class MatrixType >
void Dune::writeMatrixToMatlab (const MatrixType &matrix, const std::string &filename, int outputPrecision=18)
 Writes sparse matrix in a Matlab-readable format.
 
template<class V >
void Dune::writeVectorToMatlabHelper (const V &v, std::ostream &stream)
 
template<class VectorType >
void Dune::writeVectorToMatlab (const VectorType &vector, const std::string &filename, int outputPrecision=18)
 Writes vectors in a Matlab-readable format.
 
template<class Mat , class SVGOptions = DefaultSVGMatrixOptions>
void Dune::writeSVGMatrix (const Mat &mat, std::ostream &out, SVGOptions opts={})
 Writes the visualization of matrix in the SVG format.
 
template<class X , class Comm >
std::shared_ptr< ScalarProduct< X > > Dune::makeScalarProduct (std::shared_ptr< const Comm > comm, SolverCategory::Category category)
 Choose the approriate scalar product for a solver category.
 
template<class X , class Comm >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const Comm &comm, SolverCategory::Category category)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Some generic functions for pretty printing vectors and matrices.

│ │ │ │ +

Define base class for scalar product and norm.

│ │ │ │ +

These classes have to be implemented differently for different data partitioning strategies. Default implementations for the sequential case are provided.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,108 +1,60 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _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 │ │ │ │ │ -io.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s » │ │ │ │ │ -_I_O_ _f_o_r_ _m_a_t_r_i_c_e_s_ _a_n_d_ _v_e_c_t_o_r_s_. │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. _M_o_r_e_._._. │ │ │ │ │ +scalarproducts.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _S_c_a_l_a_r_ _p_r_o_d_u_c_t_s │ │ │ │ │ +Define base class for scalar product and norm. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s │ │ │ │ │ -  Default options class to write SVG matrices. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_ _> │ │ │ │ │ +  Base class for scalar product and norm computation. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_,_ _C_ _> │ │ │ │ │ +  Scalar product for overlapping Schwarz methods. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_ _> │ │ │ │ │ +  Default implementation for the scalar case. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_,_ _C_ _> │ │ │ │ │ +  Nonoverlapping Scalar Product with communication object. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_,_ _C_ _> │ │ │ │ │ +  Scalar product for overlapping Schwarz methods. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r (std::ostream &s, const V &v, std::string │ │ │ │ │ - rowtext, int &counter, int columns, int width) │ │ │ │ │ -  Recursively print a vector. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r (std::ostream &s, const V &v, std::string title, std:: │ │ │ │ │ - string rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ -  Print an _I_S_T_L vector. │ │ │ │ │ -  │ │ │ │ │ -void  _D_u_n_e_:_:_f_i_l_l___r_o_w (std::ostream &s, int m, int width, int precision) │ │ │ │ │ -  Print a row of zeros for a non-existing block. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t___r_o_w (std::ostream &s, const K &value, typename _F_i_e_l_d_M_a_t_r_i_x< │ │ │ │ │ - K, 1, 1 >::size_type I, typename _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 >::size_type J, │ │ │ │ │ - typename _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 >::size_type therow, int width, int │ │ │ │ │ - precision, typename std::enable_if_t< Dune::IsNumber< K >::value > │ │ │ │ │ - *sfinae=nullptr) │ │ │ │ │ -  Print one row of a matrix, specialization for number types. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t___r_o_w (std::ostream &s, const M &A, typename M::size_type I, │ │ │ │ │ - typename M::size_type J, typename M::size_type therow, int width, int │ │ │ │ │ - precision, typename std::enable_if_t::value > │ │ │ │ │ - *sfinae=nullptr) │ │ │ │ │ -  Print one row of a matrix. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t_m_a_t_r_i_x (std::ostream &s, const M &A, std::string title, std:: │ │ │ │ │ - string rowtext, int width=10, int precision=2) │ │ │ │ │ -  Print a generic block matrix. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t_S_p_a_r_s_e_M_a_t_r_i_x (std::ostream &s, const _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< │ │ │ │ │ - B, n, m >, A > &_m_a_t, std::string title, std::string rowtext, int width=3, │ │ │ │ │ - int precision=2) │ │ │ │ │ -  Prints a _B_C_R_S_M_a_t_r_i_x with fixed sized blocks. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const FieldType &value, int rowOffset, │ │ │ │ │ - int colOffset, std::ostream &s, typename std::enable_if_t< Dune:: │ │ │ │ │ - IsNumber< FieldType >::value > *sfinae=nullptr) │ │ │ │ │ -  Helper method for the writeMatrixToMatlab routine. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const MatrixType &matrix, int │ │ │ │ │ - externalRowOffset, int externalColOffset, std::ostream &s, typename std:: │ │ │ │ │ - enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ -  Helper method for the writeMatrixToMatlab routine. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b (const MatrixType &matrix, const std::string │ │ │ │ │ - &filename, int outputPrecision=18) │ │ │ │ │ -  Writes sparse matrix in a Matlab-readable format. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const V &v, std::ostream &stream) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b (const VectorType &vector, const std::string │ │ │ │ │ - &filename, int outputPrecision=18) │ │ │ │ │ -  Writes vectors in a Matlab-readable format. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_w_r_i_t_e_S_V_G_M_a_t_r_i_x (const Mat &_m_a_t, std::ostream &out, SVGOptions opts= │ │ │ │ │ - {}) │ │ │ │ │ -  Writes the visualization of matrix in the SVG format. │ │ │ │ │ +template │ │ │ │ │ +std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_m_a_k_e_S_c_a_l_a_r_P_r_o_d_u_c_t (std:: │ │ │ │ │ + shared_ptr< const Comm > comm, │ │ │ │ │ + _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category) │ │ │ │ │ +  Choose the approriate scalar product for │ │ │ │ │ + a solver category. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const Comm │ │ │ │ │ + &comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ + category) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +These classes have to be implemented differently for different data │ │ │ │ │ +partitioning strategies. Default implementations for the sequential case are │ │ │ │ │ +provided. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: io.hh Source File │ │ │ │ +dune-istl: scalarproducts.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,710 +74,224 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
io.hh
│ │ │ │ +
scalarproducts.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_IO_HH
│ │ │ │ -
6#define DUNE_ISTL_IO_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH
│ │ │ │ +
6#define DUNE_ISTL_SCALARPRODUCTS_HH
│ │ │ │
7
│ │ │ │
8#include <cmath>
│ │ │ │
9#include <complex>
│ │ │ │ -
10#include <limits>
│ │ │ │ -
11#include <ios>
│ │ │ │ -
12#include <iomanip>
│ │ │ │ -
13#include <fstream>
│ │ │ │ -
14#include <string>
│ │ │ │ -
15
│ │ │ │ -
16#include "matrixutils.hh"
│ │ │ │ -
17#include "istlexception.hh"
│ │ │ │ -
18#include <dune/common/fvector.hh>
│ │ │ │ -
19#include <dune/common/fmatrix.hh>
│ │ │ │ -
20#include <dune/common/hybridutilities.hh>
│ │ │ │ -
21#include <dune/common/reservedvector.hh>
│ │ │ │ -
22
│ │ │ │ - │ │ │ │ - │ │ │ │ -
25
│ │ │ │ -
26namespace Dune {
│ │ │ │ -
27
│ │ │ │ -
40 //
│ │ │ │ -
41 // pretty printing of vectors
│ │ │ │ -
42 //
│ │ │ │ -
43
│ │ │ │ -
51 template<class V>
│ │ │ │ -
│ │ │ │ -
52 void recursive_printvector (std::ostream& s, const V& v, std::string rowtext,
│ │ │ │ -
53 int& counter, int columns, int width)
│ │ │ │ -
54 {
│ │ │ │ -
55 if constexpr (IsNumber<V>())
│ │ │ │ -
56 {
│ │ │ │ -
57 // Print one number
│ │ │ │ -
58 if (counter%columns==0)
│ │ │ │ -
59 {
│ │ │ │ -
60 s << rowtext; // start a new row
│ │ │ │ -
61 s << " "; // space in front of each entry
│ │ │ │ -
62 s.width(4); // set width for counter
│ │ │ │ -
63 s << counter; // number of first entry in a line
│ │ │ │ -
64 }
│ │ │ │ -
65 s << " "; // space in front of each entry
│ │ │ │ -
66 s.width(width); // set width for each entry anew
│ │ │ │ -
67 s << v; // yeah, the number !
│ │ │ │ -
68 counter++; // increment the counter
│ │ │ │ -
69 if (counter%columns==0)
│ │ │ │ -
70 s << std::endl; // start a new line
│ │ │ │ -
71 }
│ │ │ │ -
72 else
│ │ │ │ -
73 {
│ │ │ │ -
74 // Recursively print a vector
│ │ │ │ -
75 for (const auto& entry : v)
│ │ │ │ -
76 recursive_printvector(s,entry,rowtext,counter,columns,width);
│ │ │ │ -
77 }
│ │ │ │ -
78 }
│ │ │ │ -
│ │ │ │ -
79
│ │ │ │ -
80
│ │ │ │ -
88 template<class V>
│ │ │ │ -
│ │ │ │ -
89 void printvector (std::ostream& s, const V& v, std::string title,
│ │ │ │ -
90 std::string rowtext, int columns=1, int width=10,
│ │ │ │ -
91 int precision=2)
│ │ │ │ -
92 {
│ │ │ │ -
93 // count the numbers printed to make columns
│ │ │ │ -
94 int counter=0;
│ │ │ │ -
95
│ │ │ │ -
96 // remember old flags
│ │ │ │ -
97 std::ios_base::fmtflags oldflags = s.flags();
│ │ │ │ -
98
│ │ │ │ -
99 // set the output format
│ │ │ │ -
100 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
│ │ │ │ -
101 int oldprec = s.precision();
│ │ │ │ -
102 s.precision(precision);
│ │ │ │ -
103
│ │ │ │ -
104 // print title
│ │ │ │ -
105 s << title << " [blocks=" << v.N() << ",dimension=" << v.dim() << "]"
│ │ │ │ -
106 << std::endl;
│ │ │ │ -
107
│ │ │ │ -
108 // print data from all blocks
│ │ │ │ -
109 recursive_printvector(s,v,rowtext,counter,columns,width);
│ │ │ │ -
110
│ │ │ │ -
111 // check if new line is required
│ │ │ │ -
112 if (counter%columns!=0)
│ │ │ │ -
113 s << std::endl;
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <iomanip>
│ │ │ │ +
12#include <string>
│ │ │ │ +
13#include <memory>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/exceptions.hh>
│ │ │ │ +
16#include <dune/common/shared_ptr.hh>
│ │ │ │ +
17
│ │ │ │ +
18#include "bvector.hh"
│ │ │ │ +
19#include "solvercategory.hh"
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
51 template<class X>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
53 public:
│ │ │ │ +
55 typedef X domain_type;
│ │ │ │ +
56 typedef typename X::field_type field_type;
│ │ │ │ +
57 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ +
58
│ │ │ │ +
│ │ │ │ +
63 virtual field_type dot (const X& x, const X& y) const
│ │ │ │ +
64 {
│ │ │ │ +
65 return x.dot(y);
│ │ │ │ +
66 }
│ │ │ │ +
│ │ │ │ +
67
│ │ │ │ +
│ │ │ │ +
71 virtual real_type norm (const X& x) const
│ │ │ │ +
72 {
│ │ │ │ +
73 return x.two_norm();
│ │ │ │ +
74 }
│ │ │ │ +
│ │ │ │ +
75
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
78 {
│ │ │ │ + │ │ │ │ +
80 }
│ │ │ │ +
│ │ │ │ +
81
│ │ │ │ +
83 virtual ~ScalarProduct () {}
│ │ │ │ +
84 };
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
97 template<class X, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
99 {
│ │ │ │ +
100 public:
│ │ │ │ +
105 typedef X domain_type;
│ │ │ │ +
107 typedef typename X::field_type field_type;
│ │ │ │ +
108 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ + │ │ │ │
114
│ │ │ │ -
115 // reset the output format
│ │ │ │ -
116 s.flags(oldflags);
│ │ │ │ -
117 s.precision(oldprec);
│ │ │ │ -
118 }
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
120
│ │ │ │ -
122 //
│ │ │ │ -
123 // pretty printing of matrices
│ │ │ │ -
124 //
│ │ │ │ -
125
│ │ │ │ -
│ │ │ │ -
133 inline void fill_row (std::ostream& s, int m, int width, [[maybe_unused]] int precision)
│ │ │ │ -
134 {
│ │ │ │ -
135 for (int j=0; j<m; j++)
│ │ │ │ -
136 {
│ │ │ │ -
137 s << " "; // space in front of each entry
│ │ │ │ -
138 s.width(width); // set width for each entry anew
│ │ │ │ -
139 s << "."; // yeah, the number !
│ │ │ │ -
140 }
│ │ │ │ -
141 }
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
150 template<class K>
│ │ │ │ -
│ │ │ │ -
151 void print_row (std::ostream& s, const K& value,
│ │ │ │ -
152 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type I,
│ │ │ │ -
153 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type J,
│ │ │ │ -
154 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type therow,
│ │ │ │ -
155 int width,
│ │ │ │ -
156 [[maybe_unused]] int precision,
│ │ │ │ -
157 typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr)
│ │ │ │ -
158 {
│ │ │ │ -
159 s << " "; // space in front of each entry
│ │ │ │ -
160 s.width(width); // set width for each entry anew
│ │ │ │ -
161 s << value;
│ │ │ │ -
162 }
│ │ │ │ -
│ │ │ │ -
163
│ │ │ │ -
171 template<class M>
│ │ │ │ -
│ │ │ │ -
172 void print_row (std::ostream& s, const M& A, typename M::size_type I,
│ │ │ │ -
173 typename M::size_type J, typename M::size_type therow,
│ │ │ │ -
174 int width, int precision,
│ │ │ │ -
175 typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ -
176 {
│ │ │ │ -
177 typename M::size_type i0=I;
│ │ │ │ -
178 for (typename M::size_type i=0; i<A.N(); i++)
│ │ │ │ -
179 {
│ │ │ │ -
180 if (therow>=i0 && therow<i0+MatrixDimension<M>::rowdim(A,i))
│ │ │ │ -
181 {
│ │ │ │ -
182 // the row is in this block row !
│ │ │ │ -
183 typename M::size_type j0=J;
│ │ │ │ -
184 for (typename M::size_type j=0; j<A.M(); j++)
│ │ │ │ -
185 {
│ │ │ │ -
186 // find this block
│ │ │ │ -
187 typename M::ConstColIterator it = A[i].find(j);
│ │ │ │ -
188
│ │ │ │ -
189 // print row or filler
│ │ │ │ -
190 if (it!=A[i].end())
│ │ │ │ -
191 print_row(s,*it,i0,j0,therow,width,precision);
│ │ │ │ -
192 else
│ │ │ │ -
193 fill_row(s,MatrixDimension<M>::coldim(A,j),width,precision);
│ │ │ │ -
194
│ │ │ │ -
195 // advance columns
│ │ │ │ - │ │ │ │ -
197 }
│ │ │ │ -
198 }
│ │ │ │ -
199 // advance rows
│ │ │ │ - │ │ │ │ -
201 }
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
212 template<class M>
│ │ │ │ -
│ │ │ │ -
213 void printmatrix (std::ostream& s, const M& A, std::string title,
│ │ │ │ -
214 std::string rowtext, int width=10, int precision=2)
│ │ │ │ -
215 {
│ │ │ │ -
216
│ │ │ │ -
217 // remember old flags
│ │ │ │ -
218 std::ios_base::fmtflags oldflags = s.flags();
│ │ │ │ -
219
│ │ │ │ -
220 // set the output format
│ │ │ │ -
221 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
│ │ │ │ -
222 int oldprec = s.precision();
│ │ │ │ -
223 s.precision(precision);
│ │ │ │ -
224
│ │ │ │ -
225 // print title
│ │ │ │ -
226 s << title
│ │ │ │ -
227 << " [n=" << A.N()
│ │ │ │ -
228 << ",m=" << A.M()
│ │ │ │ -
229 << ",rowdim=" << MatrixDimension<M>::rowdim(A)
│ │ │ │ -
230 << ",coldim=" << MatrixDimension<M>::coldim(A)
│ │ │ │ -
231 << "]" << std::endl;
│ │ │ │ -
232
│ │ │ │ -
233 // print all rows
│ │ │ │ -
234 for (typename M::size_type i=0; i<MatrixDimension<M>::rowdim(A); i++)
│ │ │ │ -
235 {
│ │ │ │ -
236 s << rowtext; // start a new row
│ │ │ │ -
237 s << " "; // space in front of each entry
│ │ │ │ -
238 s.width(4); // set width for counter
│ │ │ │ -
239 s << i; // number of first entry in a line
│ │ │ │ -
240 print_row(s,A,0,0,i,width,precision); // generic print
│ │ │ │ -
241 s << std::endl; // start a new line
│ │ │ │ -
242 }
│ │ │ │ -
243
│ │ │ │ -
244 // reset the output format
│ │ │ │ -
245 s.flags(oldflags);
│ │ │ │ -
246 s.precision(oldprec);
│ │ │ │ -
247 }
│ │ │ │ -
│ │ │ │ -
248
│ │ │ │ -
270 template<class B, int n, int m, class A>
│ │ │ │ -
│ │ │ │ -
271 void printSparseMatrix(std::ostream& s,
│ │ │ │ - │ │ │ │ -
273 std::string title, std::string rowtext,
│ │ │ │ -
274 int width=3, int precision=2)
│ │ │ │ -
275 {
│ │ │ │ - │ │ │ │ -
277 // remember old flags
│ │ │ │ -
278 std::ios_base::fmtflags oldflags = s.flags();
│ │ │ │ -
279 // set the output format
│ │ │ │ -
280 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
│ │ │ │ -
281 int oldprec = s.precision();
│ │ │ │ -
282 s.precision(precision);
│ │ │ │ -
283 // print title
│ │ │ │ -
284 s << title
│ │ │ │ -
285 << " [n=" << mat.N()
│ │ │ │ -
286 << ",m=" << mat.M()
│ │ │ │ -
287 << ",rowdim=" << MatrixDimension<Matrix>::rowdim(mat)
│ │ │ │ -
288 << ",coldim=" << MatrixDimension<Matrix>::coldim(mat)
│ │ │ │ -
289 << "]" << std::endl;
│ │ │ │ -
290
│ │ │ │ -
291 typedef typename Matrix::ConstRowIterator Row;
│ │ │ │ -
292
│ │ │ │ -
293 for(Row row=mat.begin(); row != mat.end(); ++row) {
│ │ │ │ -
294 int skipcols=0;
│ │ │ │ -
295 bool reachedEnd=false;
│ │ │ │ -
296
│ │ │ │ -
297 while(!reachedEnd) {
│ │ │ │ -
298 for(int innerrow=0; innerrow<n; ++innerrow) {
│ │ │ │ -
299 int count=0;
│ │ │ │ -
300 typedef typename Matrix::ConstColIterator Col;
│ │ │ │ -
301 Col col=row->begin();
│ │ │ │ -
302 for(; col != row->end(); ++col,++count) {
│ │ │ │ -
303 if(count<skipcols)
│ │ │ │ -
304 continue;
│ │ │ │ -
305 if(count>=skipcols+width)
│ │ │ │ -
306 break;
│ │ │ │ -
307 if(innerrow==0) {
│ │ │ │ -
308 if(count==skipcols) {
│ │ │ │ -
309 s << rowtext; // start a new row
│ │ │ │ -
310 s << " "; // space in front of each entry
│ │ │ │ -
311 s.width(4); // set width for counter
│ │ │ │ -
312 s << row.index()<<": "; // number of first entry in a line
│ │ │ │ -
313 }
│ │ │ │ -
314 s.width(4);
│ │ │ │ -
315 s<<col.index()<<": |";
│ │ │ │ -
316 } else {
│ │ │ │ -
317 if(count==skipcols) {
│ │ │ │ -
318 for(typename std::string::size_type i=0; i < rowtext.length(); i++)
│ │ │ │ -
319 s<<" ";
│ │ │ │ -
320 s<<" ";
│ │ │ │ -
321 }
│ │ │ │ -
322 s<<" |";
│ │ │ │ -
323 }
│ │ │ │ -
324 for(int innercol=0; innercol < m; ++innercol) {
│ │ │ │ -
325 s.width(9);
│ │ │ │ -
326 s<<(*col)[innerrow][innercol]<<" ";
│ │ │ │ -
327 }
│ │ │ │ -
328
│ │ │ │ -
329 s<<"|";
│ │ │ │ -
330 }
│ │ │ │ -
331 if(innerrow==n-1 && col==row->end())
│ │ │ │ -
332 reachedEnd = true;
│ │ │ │ -
333 else
│ │ │ │ -
334 s << std::endl;
│ │ │ │ -
335 }
│ │ │ │ -
336 skipcols += width;
│ │ │ │ -
337 s << std::endl;
│ │ │ │ -
338 }
│ │ │ │ -
339 s << std::endl;
│ │ │ │ -
340 }
│ │ │ │ -
341
│ │ │ │ -
342 // reset the output format
│ │ │ │ -
343 s.flags(oldflags);
│ │ │ │ -
344 s.precision(oldprec);
│ │ │ │ -
345 }
│ │ │ │ -
│ │ │ │ -
346
│ │ │ │ -
347 namespace
│ │ │ │ -
348 {
│ │ │ │ -
349 template<typename T>
│ │ │ │ -
350 struct MatlabPODWriter
│ │ │ │ -
351 {
│ │ │ │ -
352 static std::ostream& write(const T& t, std::ostream& s)
│ │ │ │ -
353 {
│ │ │ │ -
354 s << t;
│ │ │ │ -
355 return s;
│ │ │ │ -
356 }
│ │ │ │ -
357 };
│ │ │ │ -
358 template<typename T>
│ │ │ │ -
359 struct MatlabPODWriter<std::complex<T> >
│ │ │ │ -
360 {
│ │ │ │ -
361 static std::ostream& write(const std::complex<T>& t, std::ostream& s)
│ │ │ │ -
362 {
│ │ │ │ -
363 s << t.real() << " " << t.imag();
│ │ │ │ -
364 return s;
│ │ │ │ -
365 }
│ │ │ │ -
366 };
│ │ │ │ -
367 } // anonymous namespace
│ │ │ │ -
368
│ │ │ │ -
378 template <class FieldType>
│ │ │ │ -
│ │ │ │ -
379 void writeMatrixToMatlabHelper(const FieldType& value,
│ │ │ │ -
380 int rowOffset, int colOffset,
│ │ │ │ -
381 std::ostream& s,
│ │ │ │ -
382 typename std::enable_if_t<Dune::IsNumber<FieldType>::value>* sfinae = nullptr)
│ │ │ │ -
383 {
│ │ │ │ -
384 //+1 for Matlab numbering
│ │ │ │ -
385 s << rowOffset + 1 << " " << colOffset + 1 << " ";
│ │ │ │ -
386 MatlabPODWriter<FieldType>::write(value, s)<< std::endl;
│ │ │ │ -
387 }
│ │ │ │ -
│ │ │ │ -
388
│ │ │ │ -
396 template <class MatrixType>
│ │ │ │ -
│ │ │ │ -
397 void writeMatrixToMatlabHelper(const MatrixType& matrix,
│ │ │ │ -
398 int externalRowOffset, int externalColOffset,
│ │ │ │ -
399 std::ostream& s,
│ │ │ │ -
400 typename std::enable_if_t<!Dune::IsNumber<MatrixType>::value>* sfinae = nullptr)
│ │ │ │ -
401 {
│ │ │ │ -
402 // Precompute the accumulated sizes of the columns
│ │ │ │ -
403 std::vector<typename MatrixType::size_type> colOffset(matrix.M());
│ │ │ │ -
404 if (colOffset.size() > 0)
│ │ │ │ -
405 colOffset[0] = 0;
│ │ │ │ -
406
│ │ │ │ -
407 for (typename MatrixType::size_type i=0; i<matrix.M()-1; i++)
│ │ │ │ -
408 colOffset[i+1] = colOffset[i] +
│ │ │ │ - │ │ │ │ -
410
│ │ │ │ -
411 typename MatrixType::size_type rowOffset = 0;
│ │ │ │ -
412
│ │ │ │ -
413 // Loop over all matrix rows
│ │ │ │ -
414 for (typename MatrixType::size_type rowIdx=0; rowIdx<matrix.N(); rowIdx++)
│ │ │ │ -
415 {
│ │ │ │ -
416 auto cIt = matrix[rowIdx].begin();
│ │ │ │ -
417 auto cEndIt = matrix[rowIdx].end();
│ │ │ │ -
418
│ │ │ │ -
419 // Loop over all columns in this row
│ │ │ │ -
420 for (; cIt!=cEndIt; ++cIt)
│ │ │ │ - │ │ │ │ -
422 externalRowOffset+rowOffset,
│ │ │ │ -
423 externalColOffset + colOffset[cIt.index()],
│ │ │ │ -
424 s);
│ │ │ │ -
425
│ │ │ │ -
426 rowOffset += MatrixDimension<MatrixType>::rowdim(matrix, rowIdx);
│ │ │ │ -
427 }
│ │ │ │ -
428
│ │ │ │ -
429 }
│ │ │ │ -
│ │ │ │ -
430
│ │ │ │ -
450 template <class MatrixType>
│ │ │ │ -
│ │ │ │ -
451 void writeMatrixToMatlab(const MatrixType& matrix,
│ │ │ │ -
452 const std::string& filename, int outputPrecision = 18)
│ │ │ │ -
453 {
│ │ │ │ -
454 std::ofstream outStream(filename.c_str());
│ │ │ │ -
455 int oldPrecision = outStream.precision();
│ │ │ │ -
456 outStream.precision(outputPrecision);
│ │ │ │ -
457
│ │ │ │ -
458 writeMatrixToMatlabHelper(matrix, 0, 0, outStream);
│ │ │ │ -
459 outStream.precision(oldPrecision);
│ │ │ │ -
460 }
│ │ │ │ -
│ │ │ │ -
461
│ │ │ │ -
462 // Recursively write vector entries to a stream
│ │ │ │ -
463 template<class V>
│ │ │ │ -
│ │ │ │ -
464 void writeVectorToMatlabHelper (const V& v, std::ostream& stream)
│ │ │ │ -
465 {
│ │ │ │ -
466 if constexpr (IsNumber<V>()) {
│ │ │ │ -
467 stream << v << std::endl;
│ │ │ │ -
468 } else {
│ │ │ │ -
469 for (const auto& entry : v)
│ │ │ │ -
470 writeVectorToMatlabHelper(entry, stream);
│ │ │ │ -
471 }
│ │ │ │ -
472 }
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
491 template <class VectorType>
│ │ │ │ -
│ │ │ │ -
492 void writeVectorToMatlab(const VectorType& vector,
│ │ │ │ -
493 const std::string& filename, int outputPrecision = 18)
│ │ │ │ -
494 {
│ │ │ │ -
495 std::ofstream outStream(filename.c_str());
│ │ │ │ -
496 int oldPrecision = outStream.precision();
│ │ │ │ -
497 outStream.precision(outputPrecision);
│ │ │ │ -
498
│ │ │ │ -
499 writeVectorToMatlabHelper(vector, outStream);
│ │ │ │ -
500 outStream.precision(oldPrecision);
│ │ │ │ -
501 }
│ │ │ │ -
│ │ │ │ -
502
│ │ │ │ -
503 namespace Impl {
│ │ │ │ -
504
│ │ │ │ -
506 struct NullStream {
│ │ │ │ -
507 template <class Any>
│ │ │ │ -
508 friend NullStream &operator<<(NullStream &dev0, Any &&) {
│ │ │ │ -
509 return dev0;
│ │ │ │ -
510 }
│ │ │ │ -
511 };
│ │ │ │ -
512
│ │ │ │ -
514 // svg shall be closed with a group and an svg. i.e. "</g></svg>"
│ │ │ │ -
515 template <class Stream, class SVGMatrixOptions>
│ │ │ │ -
516 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts,
│ │ │ │ -
517 std::pair<std::size_t, size_t> offsets) {
│ │ │ │ -
518 auto [col_offset, row_offset] = offsets;
│ │ │ │ -
519 double width = opts.width;
│ │ │ │ -
520 double height = opts.height;
│ │ │ │ -
521 // if empty, we try to figure out a sensible value of width and height
│ │ │ │ -
522 if (opts.width == 0 and opts.height == 0)
│ │ │ │ -
523 width = height = 500;
│ │ │ │ -
524 if (opts.width == 0)
│ │ │ │ -
525 width = opts.height * (double(col_offset) / row_offset);
│ │ │ │ -
526 if (opts.height == 0)
│ │ │ │ -
527 height = opts.width * (double(row_offset) / col_offset);
│ │ │ │ -
528
│ │ │ │ -
529 // scale group w.r.t final offsets
│ │ │ │ -
530 double scale_width = width / col_offset;
│ │ │ │ -
531 double scale_height = height / row_offset;
│ │ │ │ -
532
│ │ │ │ -
533 // write the header text
│ │ │ │ -
534 out << "<svg xmlns='http://www.w3.org/2000/svg' width='" << std::ceil(width)
│ │ │ │ -
535 << "' height='" << std::ceil(height) << "' version='1.1'>\n"
│ │ │ │ -
536 << "<style>\n"
│ │ │ │ -
537 << opts.style << "</style>\n"
│ │ │ │ -
538 << "<g transform='scale(" << scale_width << " " << scale_height
│ │ │ │ -
539 << ")'>\n";
│ │ │ │ -
540 }
│ │ │ │ -
541
│ │ │ │ -
543 template <class Mat, class Stream, class SVGMatrixOptions,
│ │ │ │ -
544 class RowPrefix, class ColPrefix>
│ │ │ │ -
545 std::pair<std::size_t, size_t>
│ │ │ │ -
546 writeSVGMatrix(const Mat &mat, Stream &out, SVGMatrixOptions opts,
│ │ │ │ -
547 RowPrefix row_prefix, ColPrefix col_prefix) {
│ │ │ │ -
548 // get values to fill the offests
│ │ │ │ -
549 const auto& block_size = opts.block_size;
│ │ │ │ -
550 const auto& interspace = opts.interspace;
│ │ │ │ -
551
│ │ │ │ -
552 const std::size_t rows = mat.N();
│ │ │ │ -
553 const std::size_t cols = mat.M();
│ │ │ │ -
554
│ │ │ │ -
555 // disable header write for recursive calls
│ │ │ │ -
556 const bool write_header = opts.write_header;
│ │ │ │ -
557 opts.write_header = false;
│ │ │ │ -
558
│ │ │ │ -
559 // counter of offsets for every block
│ │ │ │ -
560 std::size_t row_offset = interspace;
│ │ │ │ -
561 std::size_t col_offset = interspace;
│ │ │ │ -
562
│ │ │ │ -
563 // lambda helper: for-each value
│ │ │ │ -
564 auto for_each_entry = [&mat](const auto &call_back) {
│ │ │ │ -
565 for (auto row_it = mat.begin(); row_it != mat.end(); ++row_it) {
│ │ │ │ -
566 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) {
│ │ │ │ -
567 call_back(row_it.index(), col_it.index(), *col_it);
│ │ │ │ -
568 }
│ │ │ │ -
569 }
│ │ │ │ -
570 };
│ │ │ │ -
571
│ │ │ │ -
572 // accumulate content in another stream so that we write in correct order
│ │ │ │ -
573 std::stringstream ss;
│ │ │ │ -
574
│ │ │ │ -
575 // we need to append current row and col values to the prefixes
│ │ │ │ -
576 row_prefix.push_back(0);
│ │ │ │ -
577 col_prefix.push_back(0);
│ │ │ │ -
578
│ │ │ │ -
579 // do we need to write nested matrix blocks?
│ │ │ │ -
580 if constexpr (Dune::blockLevel<typename Mat::block_type>() == 0) {
│ │ │ │ -
581 // simple case: write svg block content to stream for each value
│ │ │ │ -
582 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
│ │ │ │ -
583 std::size_t x_off = interspace + col * (interspace + block_size);
│ │ │ │ -
584 std::size_t y_off = interspace + row * (interspace + block_size);
│ │ │ │ -
585 row_prefix.back() = row;
│ │ │ │ -
586 col_prefix.back() = col;
│ │ │ │ -
587 opts.writeSVGBlock(ss, row_prefix, col_prefix, val,
│ │ │ │ -
588 {x_off, y_off, block_size, block_size});
│ │ │ │ -
589 });
│ │ │ │ -
590 col_offset += cols * (block_size + interspace);
│ │ │ │ -
591 row_offset += rows * (block_size + interspace);
│ │ │ │ -
592 } else {
│ │ │ │ -
593 // before we write anything, we need to calculate the
│ │ │ │ -
594 // offset for every {row,col} index
│ │ │ │ -
595 const auto null_offset = std::numeric_limits<std::size_t>::max();
│ │ │ │ -
596 std::vector<std::size_t> col_offsets(cols + 1, null_offset);
│ │ │ │ -
597 std::vector<std::size_t> row_offsets(rows + 1, null_offset);
│ │ │ │ -
598 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
│ │ │ │ -
599 NullStream dev0;
│ │ │ │ -
600 // get size of sub-block
│ │ │ │ -
601 auto sub_size =
│ │ │ │ -
602 writeSVGMatrix(val, dev0, opts, row_prefix, col_prefix);
│ │ │ │ -
603
│ │ │ │ -
604 // if we didn't see col size before
│ │ │ │ -
605 if (col_offsets[col + 1] == null_offset) // write it in the offset vector
│ │ │ │ -
606 col_offsets[col + 1] = sub_size.first;
│ │ │ │ -
607
│ │ │ │ -
608 // repeat proces for row sizes
│ │ │ │ -
609 if (row_offsets[row + 1] == null_offset)
│ │ │ │ -
610 row_offsets[row + 1] = sub_size.second;
│ │ │ │ -
611 });
│ │ │ │ -
612
│ │ │ │ -
613 // if some rows/cols were not visited, make an educated guess with the minimum offset
│ │ │ │ -
614 auto min_row_offset = *std::min_element(begin(row_offsets), end(row_offsets));
│ │ │ │ -
615 std::replace(begin(row_offsets), end(row_offsets), null_offset, min_row_offset);
│ │ │ │ -
616 auto min_col_offset = *std::min_element(begin(col_offsets), end(col_offsets));
│ │ │ │ -
617 std::replace(begin(col_offsets), end(col_offsets), null_offset, min_col_offset);
│ │ │ │ -
618
│ │ │ │ -
619 // we have sizes for every block: to get offsets we make a partial sum
│ │ │ │ -
620 col_offsets[0] = interspace;
│ │ │ │ -
621 row_offsets[0] = interspace;
│ │ │ │ -
622 for (std::size_t i = 1; i < col_offsets.size(); i++)
│ │ │ │ -
623 col_offsets[i] += col_offsets[i - 1] + interspace;
│ │ │ │ -
624 for (std::size_t i = 1; i < row_offsets.size(); i++)
│ │ │ │ -
625 row_offsets[i] += row_offsets[i - 1] + interspace;
│ │ │ │ -
626
│ │ │ │ -
627 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
│ │ │ │ -
628 // calculate svg view from offsets
│ │ │ │ -
629 std::size_t width =
│ │ │ │ -
630 col_offsets[col + 1] - col_offsets[col] - interspace;
│ │ │ │ -
631 std::size_t height =
│ │ │ │ -
632 row_offsets[row + 1] - row_offsets[row] - interspace;
│ │ │ │ -
633 row_prefix.back() = row;
│ │ │ │ -
634 col_prefix.back() = col;
│ │ │ │ -
635 // content of the sub-block has origin at {0,0}: shift it to the correct place
│ │ │ │ -
636 ss << "<svg x='" << col_offsets[col] << "' y='" << row_offsets[row]
│ │ │ │ -
637 << "' width='" << width << "' height='" << height << "'>\n";
│ │ │ │ -
638 // write a nested svg with the contents of the sub-block
│ │ │ │ -
639 writeSVGMatrix(val, ss, opts, row_prefix, col_prefix);
│ │ │ │ -
640 ss << "</svg>\n";
│ │ │ │ -
641 });
│ │ │ │ -
642 col_offset = col_offsets.back();
│ │ │ │ -
643 row_offset = row_offsets.back();
│ │ │ │ -
644 }
│ │ │ │ -
645
│ │ │ │ -
646 // write content in order!
│ │ │ │ -
647 // (i) if required, first header
│ │ │ │ -
648 if (write_header)
│ │ │ │ -
649 writeSVGMatrixHeader(out, opts, {col_offset, row_offset});
│ │ │ │ -
650
│ │ │ │ -
651 col_prefix.pop_back();
│ │ │ │ -
652 row_prefix.pop_back();
│ │ │ │ -
653 // (ii) an svg block for this level
│ │ │ │ -
654 opts.writeSVGBlock(out, row_prefix, col_prefix, mat,
│ │ │ │ -
655 {0, 0, col_offset, row_offset});
│ │ │ │ -
656 // (iii) the content of the matrix
│ │ │ │ -
657 out << ss.str();
│ │ │ │ -
658 // (iv) if required, close the header
│ │ │ │ -
659 if (write_header)
│ │ │ │ -
660 out << "</g>\n</svg>\n";
│ │ │ │ -
661
│ │ │ │ -
662 // return the total required for this block
│ │ │ │ -
663 return {col_offset, row_offset};
│ │ │ │ -
664 }
│ │ │ │ -
665 } // namespace Impl
│ │ │ │ -
666
│ │ │ │ -
667
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
676 std::size_t block_size = 10;
│ │ │ │ -
678 std::size_t interspace = 5;
│ │ │ │ -
680 std::size_t width = 500;
│ │ │ │ -
682 std::size_t height = 0;
│ │ │ │ -
684 bool write_header = true;
│ │ │ │ -
686 std::string style = " .matrix-block {\n"
│ │ │ │ -
687 " fill: cornflowerblue;\n"
│ │ │ │ -
688 " fill-opacity: 0.4;\n"
│ │ │ │ -
689 " stroke-width: 2;\n"
│ │ │ │ -
690 " stroke: black;\n"
│ │ │ │ -
691 " stroke-opacity: 0.5;\n"
│ │ │ │ -
692 " }\n"
│ │ │ │ -
693 " .matrix-block:hover {\n"
│ │ │ │ -
694 " fill: lightcoral;\n"
│ │ │ │ -
695 " fill-opacity: 0.4;\n"
│ │ │ │ -
696 " stroke-opacity: 1;\n"
│ │ │ │ -
697 " }\n";
│ │ │ │ -
698
│ │ │ │ -
710 std::function<std::string(const double&)> color_fill;
│ │ │ │ -
711
│ │ │ │ -
717 template <class RowPrefix, class ColPrefix>
│ │ │ │ -
│ │ │ │ -
718 std::string blockStyleClass(const RowPrefix &row_prefix,
│ │ │ │ -
719 const ColPrefix &col_prefix) const {
│ │ │ │ -
720 // here, you can potentially give a different style to each block
│ │ │ │ -
721 return "matrix-block";
│ │ │ │ -
722 }
│ │ │ │ -
│ │ │ │ -
723
│ │ │ │ -
725 bool write_block_title = true;
│ │ │ │ -
726
│ │ │ │ -
732 template <class Stream, class RowPrefix, class ColPrefix, class Block>
│ │ │ │ -
│ │ │ │ -
733 void writeBlockTitle(Stream& out, const RowPrefix &row_prefix,
│ │ │ │ -
734 const ColPrefix &col_prefix,
│ │ │ │ -
735 const Block &block) const {
│ │ │ │ -
736 if (this->write_block_title) {
│ │ │ │ -
737 out << "<title>";
│ │ │ │ -
738 assert(row_prefix.size() == col_prefix.size());
│ │ │ │ -
739 for (std::size_t i = 0; i < row_prefix.size(); ++i)
│ │ │ │ -
740 out << "[" << row_prefix[i] << ", "<< col_prefix[i] << "]";
│ │ │ │ -
741 if constexpr (Dune::blockLevel<Block>() == 0)
│ │ │ │ -
742 out << ": " << block;
│ │ │ │ -
743 out << "</title>\n";
│ │ │ │ -
744 }
│ │ │ │ -
745 }
│ │ │ │ -
│ │ │ │ -
746
│ │ │ │ -
768 template <class Stream, class RowPrefix, class ColPrefix, class Block>
│ │ │ │ -
│ │ │ │ -
769 void writeSVGBlock(Stream &out,
│ │ │ │ -
770 const RowPrefix &row_prefix,
│ │ │ │ -
771 const ColPrefix &col_prefix, const Block block,
│ │ │ │ -
772 const std::array<std::size_t, 4> &svg_box) const {
│ │ │ │ -
773 // get bounding box values
│ │ │ │ -
774 auto &[x_off, y_off, width, height] = svg_box;
│ │ │ │ -
775 // get style class
│ │ │ │ -
776 std::string block_class = this->blockStyleClass(row_prefix, col_prefix);
│ │ │ │ -
777 // write a rectangle on the bounding box
│ │ │ │ -
778 out << "<rect class='" << block_class << "' x='" << x_off << "' y='"
│ │ │ │ -
779 << y_off << "' width='" << width << "' height='" << height << "'";
│ │ │ │ -
780 if constexpr (Dune::blockLevel<Block>() == 0 and std::is_convertible<Block,double>{})
│ │ │ │ -
781 if (color_fill)
│ │ │ │ -
782 out << " style='fill-opacity: 1;fill:" << color_fill(double(block)) << "'";
│ │ │ │ -
783
│ │ │ │ -
784 out << ">\n";
│ │ │ │ -
785 // give the rectangle a title (in html this shows info about the block)
│ │ │ │ -
786 this->writeBlockTitle(out,row_prefix, col_prefix, block);
│ │ │ │ -
787 // close rectangle
│ │ │ │ -
788 out << "</rect>\n";
│ │ │ │ -
789 }
│ │ │ │ -
│ │ │ │ -
790 };
│ │ │ │ -
│ │ │ │ -
791
│ │ │ │ -
806 template <class Mat, class SVGOptions = DefaultSVGMatrixOptions>
│ │ │ │ -
│ │ │ │ -
807 void writeSVGMatrix(const Mat &mat, std::ostream &out,
│ │ │ │ -
808 SVGOptions opts = {}) {
│ │ │ │ -
809 // We need a vector that can fit all the multi-indices for rows and colums
│ │ │ │ -
810 using IndexPrefix = Dune::ReservedVector<std::size_t, blockLevel<Mat>()>;
│ │ │ │ -
811 // Call overload for Mat type
│ │ │ │ -
812 Impl::writeSVGMatrix(mat, out, opts, IndexPrefix{}, IndexPrefix{});
│ │ │ │ -
813 }
│ │ │ │ -
│ │ │ │ -
814
│ │ │ │ -
817} // namespace Dune
│ │ │ │ -
818
│ │ │ │ -
819#endif
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ -
Some handy generic functions for ISTL matrices.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
void writeSVGMatrix(const Mat &mat, std::ostream &out, SVGOptions opts={})
Writes the visualization of matrix in the SVG format.
Definition io.hh:807
│ │ │ │ -
void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename, int outputPrecision=18)
Writes sparse matrix in a Matlab-readable format.
Definition io.hh:451
│ │ │ │ -
void print_row(std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1 >::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
Print one row of a matrix, specialization for number types.
Definition io.hh:151
│ │ │ │ -
void printmatrix(std::ostream &s, const M &A, std::string title, std::string rowtext, int width=10, int precision=2)
Print a generic block matrix.
Definition io.hh:213
│ │ │ │ -
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition io.hh:89
│ │ │ │ -
void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int colOffset, std::ostream &s, typename std::enable_if_t< Dune::IsNumber< FieldType >::value > *sfinae=nullptr)
Helper method for the writeMatrixToMatlab routine.
Definition io.hh:379
│ │ │ │ -
void writeVectorToMatlabHelper(const V &v, std::ostream &stream)
Definition io.hh:464
│ │ │ │ -
void writeVectorToMatlab(const VectorType &vector, const std::string &filename, int outputPrecision=18)
Writes vectors in a Matlab-readable format.
Definition io.hh:492
│ │ │ │ -
void recursive_printvector(std::ostream &s, const V &v, std::string rowtext, int &counter, int columns, int width)
Recursively print a vector.
Definition io.hh:52
│ │ │ │ -
void printSparseMatrix(std::ostream &s, const BCRSMatrix< FieldMatrix< B, n, m >, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
Prints a BCRSMatrix with fixed sized blocks.
Definition io.hh:271
│ │ │ │ -
void fill_row(std::ostream &s, int m, int width, int precision)
Print a row of zeros for a non-existing block.
Definition io.hh:133
│ │ │ │ -
STL namespace.
│ │ │ │ +
│ │ │ │ +
120 ParallelScalarProduct (std::shared_ptr<const communication_type> com, SolverCategory::Category cat)
│ │ │ │ +
121 : _communication(com), _category(cat)
│ │ │ │ +
122 {}
│ │ │ │ +
│ │ │ │ +
123
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
131 : ParallelScalarProduct(stackobject_to_shared_ptr(com), cat)
│ │ │ │ +
132 {}
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
134
│ │ │ │ +
│ │ │ │ +
139 virtual field_type dot (const X& x, const X& y) const override
│ │ │ │ +
140 {
│ │ │ │ +
141 field_type result(0);
│ │ │ │ +
142 _communication->dot(x,y,result); // explicitly loop and apply masking
│ │ │ │ +
143 return result;
│ │ │ │ +
144 }
│ │ │ │ +
│ │ │ │ +
145
│ │ │ │ +
│ │ │ │ +
149 virtual real_type norm (const X& x) const override
│ │ │ │ +
150 {
│ │ │ │ +
151 return _communication->norm(x);
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
│ │ │ │ +
155 virtual SolverCategory::Category category() const override
│ │ │ │ +
156 {
│ │ │ │ +
157 return _category;
│ │ │ │ +
158 }
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │ +
160 private:
│ │ │ │ +
161 std::shared_ptr<const communication_type> _communication;
│ │ │ │ +
162 SolverCategory::Category _category;
│ │ │ │ +
163 };
│ │ │ │ +
│ │ │ │ +
164
│ │ │ │ +
166 template<class X>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
168 {
│ │ │ │ +
169 using ScalarProduct<X>::ScalarProduct;
│ │ │ │ +
170 };
│ │ │ │ +
│ │ │ │ +
171
│ │ │ │ +
177 template<class X, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
179 {
│ │ │ │ +
180 public:
│ │ │ │ +
│ │ │ │ +
181 NonoverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
│ │ │ │ +
182 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
│ │ │ │ +
│ │ │ │ +
183
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
185 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
│ │ │ │ +
│ │ │ │ +
186 };
│ │ │ │ +
│ │ │ │ +
187
│ │ │ │ +
199 template<class X, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
201 {
│ │ │ │ +
202 public:
│ │ │ │ +
│ │ │ │ +
203 OverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
│ │ │ │ +
204 ParallelScalarProduct<X,C>(comm, SolverCategory::overlapping) {}
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
207 ParallelScalarProduct<X,C>(comm,SolverCategory::overlapping) {}
│ │ │ │ +
│ │ │ │ +
208 };
│ │ │ │ +
│ │ │ │ +
209
│ │ │ │ +
223 template<class X, class Comm>
│ │ │ │ +
│ │ │ │ +
224 std::shared_ptr<ScalarProduct<X>> makeScalarProduct(std::shared_ptr<const Comm> comm, SolverCategory::Category category)
│ │ │ │ +
225 {
│ │ │ │ +
226 switch(category)
│ │ │ │ +
227 {
│ │ │ │ + │ │ │ │ +
229 return
│ │ │ │ +
230 std::make_shared<ScalarProduct<X>>();
│ │ │ │ +
231 default:
│ │ │ │ +
232 return
│ │ │ │ +
233 std::make_shared<ParallelScalarProduct<X,Comm>>(comm,category);
│ │ │ │ +
234 }
│ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ +
241 template<class X, class Comm>
│ │ │ │ +
│ │ │ │ +
242 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const Comm& comm, SolverCategory::Category category)
│ │ │ │ +
243 { return makeScalarProduct<X>(stackobject_to_shared_ptr(comm), category); }
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ +
245} // end namespace Dune
│ │ │ │ +
246
│ │ │ │ +
247#endif
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Definition matrixutils.hh:211
│ │ │ │ -
static auto coldim(const M &A)
Definition matrixutils.hh:219
│ │ │ │ -
static auto rowdim(const M &A)
Definition matrixutils.hh:214
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
Default options class to write SVG matrices.
Definition io.hh:674
│ │ │ │ -
std::string style
CSS style block to write in header.
Definition io.hh:686
│ │ │ │ -
std::size_t width
Final width size (pixels) of the SVG header. If 0, size is automatic.
Definition io.hh:680
│ │ │ │ -
std::function< std::string(const double &)> color_fill
Color fill for default options.
Definition io.hh:710
│ │ │ │ -
std::size_t block_size
size (pixels) of the deepst block/value of the matrix
Definition io.hh:676
│ │ │ │ -
void writeSVGBlock(Stream &out, const RowPrefix &row_prefix, const ColPrefix &col_prefix, const Block block, const std::array< std::size_t, 4 > &svg_box) const
Write an SVG object for a given block/value in the matrix.
Definition io.hh:769
│ │ │ │ -
void writeBlockTitle(Stream &out, const RowPrefix &row_prefix, const ColPrefix &col_prefix, const Block &block) const
Helper function writes a title for a given block and prefix.
Definition io.hh:733
│ │ │ │ -
std::size_t interspace
size (pixels) of the interspace between blocks
Definition io.hh:678
│ │ │ │ -
bool write_block_title
(Helper) Whether to write a title on the rectangle value
Definition io.hh:725
│ │ │ │ -
std::size_t height
Final height size (pixels) of the SVG header. If 0, size is automatic.
Definition io.hh:682
│ │ │ │ -
bool write_header
Whether to write the SVG header.
Definition io.hh:684
│ │ │ │ -
std::string blockStyleClass(const RowPrefix &row_prefix, const ColPrefix &col_prefix) const
Helper function that returns an style class for a given prefix.
Definition io.hh:718
│ │ │ │ -
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ -
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ -
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ -
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ -
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ +
std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
Definition scalarproducts.hh:242
│ │ │ │ +
std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const Comm > comm, SolverCategory::Category category)
Choose the approriate scalar product for a solver category.
Definition scalarproducts.hh:224
│ │ │ │ +
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ +
virtual field_type dot(const X &x, const X &y) const
Dot product of two vectors. It is assumed that the vectors are consistent on the interior+border part...
Definition scalarproducts.hh:63
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the scalar product (see SolverCategory::Category)
Definition scalarproducts.hh:77
│ │ │ │ +
X::field_type field_type
Definition scalarproducts.hh:56
│ │ │ │ +
X domain_type
export types, they come from the derived class
Definition scalarproducts.hh:55
│ │ │ │ +
virtual ~ScalarProduct()
every abstract base class has a virtual destructor
Definition scalarproducts.hh:83
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
Definition scalarproducts.hh:57
│ │ │ │ +
virtual real_type norm(const X &x) const
Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.
Definition scalarproducts.hh:71
│ │ │ │ +
Scalar product for overlapping Schwarz methods.
Definition scalarproducts.hh:99
│ │ │ │ +
virtual field_type dot(const X &x, const X &y) const override
Dot product of two vectors. It is assumed that the vectors are consistent on the interior+border part...
Definition scalarproducts.hh:139
│ │ │ │ +
virtual SolverCategory::Category category() const override
Category of the scalar product (see SolverCategory::Category)
Definition scalarproducts.hh:155
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
Definition scalarproducts.hh:108
│ │ │ │ +
C communication_type
The type of the communication object.
Definition scalarproducts.hh:113
│ │ │ │ +
ParallelScalarProduct(const communication_type &com, SolverCategory::Category cat)
Definition scalarproducts.hh:130
│ │ │ │ +
X domain_type
The type of the vector to compute the scalar product on.
Definition scalarproducts.hh:105
│ │ │ │ +
ParallelScalarProduct(std::shared_ptr< const communication_type > com, SolverCategory::Category cat)
Definition scalarproducts.hh:120
│ │ │ │ +
X::field_type field_type
The field type used by the vector type domain_type.
Definition scalarproducts.hh:107
│ │ │ │ +
virtual real_type norm(const X &x) const override
Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.
Definition scalarproducts.hh:149
│ │ │ │ +
Default implementation for the scalar case.
Definition scalarproducts.hh:168
│ │ │ │ +
Nonoverlapping Scalar Product with communication object.
Definition scalarproducts.hh:179
│ │ │ │ +
NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
Definition scalarproducts.hh:181
│ │ │ │ +
NonoverlappingSchwarzScalarProduct(const C &comm)
Definition scalarproducts.hh:184
│ │ │ │ +
Scalar product for overlapping Schwarz methods.
Definition scalarproducts.hh:201
│ │ │ │ +
OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
Definition scalarproducts.hh:203
│ │ │ │ +
OverlappingSchwarzScalarProduct(const C &comm)
Definition scalarproducts.hh:206
│ │ │ │ +
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,801 +1,269 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -io.hh │ │ │ │ │ +scalarproducts.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_IO_HH │ │ │ │ │ -6#define DUNE_ISTL_IO_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH │ │ │ │ │ +6#define DUNE_ISTL_SCALARPRODUCTS_HH │ │ │ │ │ 7 │ │ │ │ │ 8#include │ │ │ │ │ 9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ -17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22 │ │ │ │ │ -23#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -25 │ │ │ │ │ -26namespace _D_u_n_e { │ │ │ │ │ -27 │ │ │ │ │ -40 // │ │ │ │ │ -41 // pretty printing of vectors │ │ │ │ │ -42 // │ │ │ │ │ -43 │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 void _r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r (std::ostream& s, const V& v, std::string │ │ │ │ │ -rowtext, │ │ │ │ │ -53 int& counter, int columns, int width) │ │ │ │ │ -54 { │ │ │ │ │ -55 if constexpr (IsNumber()) │ │ │ │ │ -56 { │ │ │ │ │ -57 // Print one number │ │ │ │ │ -58 if (counter%columns==0) │ │ │ │ │ -59 { │ │ │ │ │ -60 s << rowtext; // start a new row │ │ │ │ │ -61 s << " "; // space in front of each entry │ │ │ │ │ -62 s.width(4); // set width for counter │ │ │ │ │ -63 s << counter; // number of first entry in a line │ │ │ │ │ -64 } │ │ │ │ │ -65 s << " "; // space in front of each entry │ │ │ │ │ -66 s.width(width); // set width for each entry anew │ │ │ │ │ -67 s << v; // yeah, the number ! │ │ │ │ │ -68 counter++; // increment the counter │ │ │ │ │ -69 if (counter%columns==0) │ │ │ │ │ -70 s << std::endl; // start a new line │ │ │ │ │ -71 } │ │ │ │ │ -72 else │ │ │ │ │ -73 { │ │ │ │ │ -74 // Recursively print a vector │ │ │ │ │ -75 for (const auto& entry : v) │ │ │ │ │ -76 _r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r(s,entry,rowtext,counter,columns,width); │ │ │ │ │ -77 } │ │ │ │ │ -78 } │ │ │ │ │ -79 │ │ │ │ │ -80 │ │ │ │ │ -88 template │ │ │ │ │ -_8_9 void _p_r_i_n_t_v_e_c_t_o_r (std::ostream& s, const V& v, std::string title, │ │ │ │ │ -90 std::string rowtext, int columns=1, int width=10, │ │ │ │ │ -91 int precision=2) │ │ │ │ │ -92 { │ │ │ │ │ -93 // count the numbers printed to make columns │ │ │ │ │ -94 int counter=0; │ │ │ │ │ -95 │ │ │ │ │ -96 // remember old flags │ │ │ │ │ -97 std::ios_base::fmtflags oldflags = s.flags(); │ │ │ │ │ -98 │ │ │ │ │ -99 // set the output format │ │ │ │ │ -100 s.setf(std::ios_base::scientific, std::ios_base::floatfield); │ │ │ │ │ -101 int oldprec = s.precision(); │ │ │ │ │ -102 s.precision(precision); │ │ │ │ │ -103 │ │ │ │ │ -104 // print title │ │ │ │ │ -105 s << title << " [blocks=" << v.N() << ",dimension=" << v.dim() << "]" │ │ │ │ │ -106 << std::endl; │ │ │ │ │ -107 │ │ │ │ │ -108 // print data from all blocks │ │ │ │ │ -109 _r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r(s,v,rowtext,counter,columns,width); │ │ │ │ │ -110 │ │ │ │ │ -111 // check if new line is required │ │ │ │ │ -112 if (counter%columns!=0) │ │ │ │ │ -113 s << std::endl; │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +19#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +20 │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +51 template │ │ │ │ │ +_5_2 class _S_c_a_l_a_r_P_r_o_d_u_c_t { │ │ │ │ │ +53 public: │ │ │ │ │ +_5_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_5_6 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_5_7 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +58 │ │ │ │ │ +_6_3 virtual _f_i_e_l_d___t_y_p_e _d_o_t (const X& x, const X& y) const │ │ │ │ │ +64 { │ │ │ │ │ +65 return x.dot(y); │ │ │ │ │ +66 } │ │ │ │ │ +67 │ │ │ │ │ +_7_1 virtual _r_e_a_l___t_y_p_e _n_o_r_m (const X& x) const │ │ │ │ │ +72 { │ │ │ │ │ +73 return x.two_norm(); │ │ │ │ │ +74 } │ │ │ │ │ +75 │ │ │ │ │ +_7_7 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +78 { │ │ │ │ │ +79 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +80 } │ │ │ │ │ +81 │ │ │ │ │ +_8_3 virtual _~_S_c_a_l_a_r_P_r_o_d_u_c_t () {} │ │ │ │ │ +84 }; │ │ │ │ │ +85 │ │ │ │ │ +97 template │ │ │ │ │ +_9_8 class _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t : public _S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +99 { │ │ │ │ │ +100 public: │ │ │ │ │ +_1_0_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_0_7 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_0_8 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +_1_1_3 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ 114 │ │ │ │ │ -115 // reset the output format │ │ │ │ │ -116 s.flags(oldflags); │ │ │ │ │ -117 s.precision(oldprec); │ │ │ │ │ -118 } │ │ │ │ │ -119 │ │ │ │ │ -120 │ │ │ │ │ -122 // │ │ │ │ │ -123 // pretty printing of matrices │ │ │ │ │ -124 // │ │ │ │ │ -125 │ │ │ │ │ -_1_3_3 inline void _f_i_l_l___r_o_w (std::ostream& s, int m, int width, [[maybe_unused]] │ │ │ │ │ -int precision) │ │ │ │ │ -134 { │ │ │ │ │ -135 for (int j=0; j │ │ │ │ │ -_1_5_1 void _p_r_i_n_t___r_o_w (std::ostream& s, const K& value, │ │ │ │ │ -152 [[maybe_unused]] typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_>_:_:_s_i_z_e___t_y_p_e I, │ │ │ │ │ -153 [[maybe_unused]] typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_>_:_:_s_i_z_e___t_y_p_e J, │ │ │ │ │ -154 [[maybe_unused]] typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_>_:_:_s_i_z_e___t_y_p_e therow, │ │ │ │ │ -155 int width, │ │ │ │ │ -156 [[maybe_unused]] int precision, │ │ │ │ │ -157 typename std::enable_if_t::value>* sfinae = nullptr) │ │ │ │ │ -158 { │ │ │ │ │ -159 s << " "; // space in front of each entry │ │ │ │ │ -160 s.width(width); // set width for each entry anew │ │ │ │ │ -161 s << value; │ │ │ │ │ -162 } │ │ │ │ │ -163 │ │ │ │ │ -171 template │ │ │ │ │ -_1_7_2 void _p_r_i_n_t___r_o_w (std::ostream& s, const M& A, typename M::size_type I, │ │ │ │ │ -173 typename M::size_type J, typename M::size_type therow, │ │ │ │ │ -174 int width, int precision, │ │ │ │ │ -175 typename std::enable_if_t::value>* sfinae = nullptr) │ │ │ │ │ -176 { │ │ │ │ │ -177 typename M::size_type i0=I; │ │ │ │ │ -178 for (typename M::size_type i=0; i com, │ │ │ │ │ +_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat) │ │ │ │ │ +121 : _communication(com), _category(cat) │ │ │ │ │ +122 {} │ │ │ │ │ +123 │ │ │ │ │ +_1_3_0 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t (const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ +_C_a_t_e_g_o_r_y cat) │ │ │ │ │ +131 : _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(stackobject_to_shared_ptr(com), cat) │ │ │ │ │ +132 {} │ │ │ │ │ +133 │ │ │ │ │ +134 │ │ │ │ │ +_1_3_9 virtual _f_i_e_l_d___t_y_p_e _d_o_t (const X& x, const X& y) const override │ │ │ │ │ +140 { │ │ │ │ │ +141 _f_i_e_l_d___t_y_p_e result(0); │ │ │ │ │ +142 _communication->dot(x,y,result); // explicitly loop and apply masking │ │ │ │ │ +143 return result; │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ +_1_4_9 virtual _r_e_a_l___t_y_p_e _n_o_r_m (const X& x) const override │ │ │ │ │ +150 { │ │ │ │ │ +151 return _communication->norm(x); │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +_1_5_5 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const override │ │ │ │ │ +156 { │ │ │ │ │ +157 return _category; │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +160 private: │ │ │ │ │ +161 std::shared_ptr _communication; │ │ │ │ │ +162 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _category; │ │ │ │ │ +163 }; │ │ │ │ │ +164 │ │ │ │ │ +166 template │ │ │ │ │ +_1_6_7 class _S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t : public _S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +168 { │ │ │ │ │ +169 using _S_c_a_l_a_r_P_r_o_d_u_c_t::ScalarProduct; │ │ │ │ │ +170 }; │ │ │ │ │ +171 │ │ │ │ │ +177 template │ │ │ │ │ +_1_7_8 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t : public │ │ │ │ │ +_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ 179 { │ │ │ │ │ -180 if (therow>=i0 && therow_:_:_r_o_w_d_i_m(A,i)) │ │ │ │ │ -181 { │ │ │ │ │ -182 // the row is in this block row ! │ │ │ │ │ -183 typename M::size_type j0=J; │ │ │ │ │ -184 for (typename M::size_type j=0; j_:_:_c_o_l_d_i_m(A,j),width,precision); │ │ │ │ │ -194 │ │ │ │ │ -195 // advance columns │ │ │ │ │ -196 j0 += _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_c_o_l_d_i_m(A,j); │ │ │ │ │ -197 } │ │ │ │ │ -198 } │ │ │ │ │ -199 // advance rows │ │ │ │ │ -200 i0 += _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_r_o_w_d_i_m(A,i); │ │ │ │ │ -201 } │ │ │ │ │ -202 } │ │ │ │ │ -203 │ │ │ │ │ -212 template │ │ │ │ │ -_2_1_3 void _p_r_i_n_t_m_a_t_r_i_x (std::ostream& s, const M& A, std::string title, │ │ │ │ │ -214 std::string rowtext, int width=10, int precision=2) │ │ │ │ │ -215 { │ │ │ │ │ -216 │ │ │ │ │ -217 // remember old flags │ │ │ │ │ -218 std::ios_base::fmtflags oldflags = s.flags(); │ │ │ │ │ -219 │ │ │ │ │ -220 // set the output format │ │ │ │ │ -221 s.setf(std::ios_base::scientific, std::ios_base::floatfield); │ │ │ │ │ -222 int oldprec = s.precision(); │ │ │ │ │ -223 s.precision(precision); │ │ │ │ │ -224 │ │ │ │ │ -225 // print title │ │ │ │ │ -226 s << title │ │ │ │ │ -227 << " [n=" << A._N() │ │ │ │ │ -228 << ",m=" << A._M() │ │ │ │ │ -229 << ",rowdim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_r_o_w_d_i_m(A) │ │ │ │ │ -230 << ",coldim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_c_o_l_d_i_m(A) │ │ │ │ │ -231 << "]" << std::endl; │ │ │ │ │ -232 │ │ │ │ │ -233 // print all rows │ │ │ │ │ -234 for (typename M::size_type i=0; i::rowdim(A); i++) │ │ │ │ │ -235 { │ │ │ │ │ -236 s << rowtext; // start a new row │ │ │ │ │ -237 s << " "; // space in front of each entry │ │ │ │ │ -238 s.width(4); // set width for counter │ │ │ │ │ -239 s << i; // number of first entry in a line │ │ │ │ │ -240 _p_r_i_n_t___r_o_w(s,A,0,0,i,width,precision); // generic print │ │ │ │ │ -241 s << std::endl; // start a new line │ │ │ │ │ -242 } │ │ │ │ │ -243 │ │ │ │ │ -244 // reset the output format │ │ │ │ │ -245 s.flags(oldflags); │ │ │ │ │ -246 s.precision(oldprec); │ │ │ │ │ -247 } │ │ │ │ │ -248 │ │ │ │ │ -270 template │ │ │ │ │ -_2_7_1 void _p_r_i_n_t_S_p_a_r_s_e_M_a_t_r_i_x(std::ostream& s, │ │ │ │ │ -272 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_B_,_n_,_m_>,A>& _m_a_t, │ │ │ │ │ -273 std::string title, std::string rowtext, │ │ │ │ │ -274 int width=3, int precision=2) │ │ │ │ │ -275 { │ │ │ │ │ -276 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_B_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ -277 // remember old flags │ │ │ │ │ -278 std::ios_base::fmtflags oldflags = s.flags(); │ │ │ │ │ -279 // set the output format │ │ │ │ │ -280 s.setf(std::ios_base::scientific, std::ios_base::floatfield); │ │ │ │ │ -281 int oldprec = s.precision(); │ │ │ │ │ -282 s.precision(precision); │ │ │ │ │ -283 // print title │ │ │ │ │ -284 s << title │ │ │ │ │ -285 << " [n=" << _m_a_t._N() │ │ │ │ │ -286 << ",m=" << _m_a_t._M() │ │ │ │ │ -287 << ",rowdim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t) │ │ │ │ │ -288 << ",coldim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t) │ │ │ │ │ -289 << "]" << std::endl; │ │ │ │ │ -290 │ │ │ │ │ -291 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r Row; │ │ │ │ │ -292 │ │ │ │ │ -293 for(Row row=_m_a_t._b_e_g_i_n(); row != _m_a_t._e_n_d(); ++row) { │ │ │ │ │ -294 int skipcols=0; │ │ │ │ │ -295 bool reachedEnd=false; │ │ │ │ │ -296 │ │ │ │ │ -297 while(!reachedEnd) { │ │ │ │ │ -298 for(int innerrow=0; innerrowbegin(); │ │ │ │ │ -302 for(; _c_o_l != row->end(); ++_c_o_l,++count) { │ │ │ │ │ -303 if(count=skipcols+width) │ │ │ │ │ -306 break; │ │ │ │ │ -307 if(innerrow==0) { │ │ │ │ │ -308 if(count==skipcols) { │ │ │ │ │ -309 s << rowtext; // start a new row │ │ │ │ │ -310 s << " "; // space in front of each entry │ │ │ │ │ -311 s.width(4); // set width for counter │ │ │ │ │ -312 s << row.index()<<": "; // number of first entry in a line │ │ │ │ │ -313 } │ │ │ │ │ -314 s.width(4); │ │ │ │ │ -315 s<<_c_o_l.index()<<": |"; │ │ │ │ │ -316 } else { │ │ │ │ │ -317 if(count==skipcols) { │ │ │ │ │ -318 for(typename std::string::size_type i=0; i < rowtext.length(); i++) │ │ │ │ │ -319 s<<" "; │ │ │ │ │ -320 s<<" "; │ │ │ │ │ -321 } │ │ │ │ │ -322 s<<" |"; │ │ │ │ │ -323 } │ │ │ │ │ -324 for(int innercol=0; innercol < m; ++innercol) { │ │ │ │ │ -325 s.width(9); │ │ │ │ │ -326 s<<(*col)[innerrow][innercol]<<" "; │ │ │ │ │ -327 } │ │ │ │ │ -328 │ │ │ │ │ -329 s<<"|"; │ │ │ │ │ -330 } │ │ │ │ │ -331 if(innerrow==n-1 && _c_o_l==row->end()) │ │ │ │ │ -332 reachedEnd = true; │ │ │ │ │ -333 else │ │ │ │ │ -334 s << std::endl; │ │ │ │ │ -335 } │ │ │ │ │ -336 skipcols += width; │ │ │ │ │ -337 s << std::endl; │ │ │ │ │ -338 } │ │ │ │ │ -339 s << std::endl; │ │ │ │ │ -340 } │ │ │ │ │ -341 │ │ │ │ │ -342 // reset the output format │ │ │ │ │ -343 s.flags(oldflags); │ │ │ │ │ -344 s.precision(oldprec); │ │ │ │ │ -345 } │ │ │ │ │ -346 │ │ │ │ │ -347 namespace │ │ │ │ │ -348 { │ │ │ │ │ -349 template │ │ │ │ │ -350 struct MatlabPODWriter │ │ │ │ │ -351 { │ │ │ │ │ -352 static std::ostream& write(const T& t, std::ostream& s) │ │ │ │ │ -353 { │ │ │ │ │ -354 s << t; │ │ │ │ │ -355 return s; │ │ │ │ │ -356 } │ │ │ │ │ -357 }; │ │ │ │ │ -358 template │ │ │ │ │ -359 struct MatlabPODWriter<_s_t_d::complex > │ │ │ │ │ -360 { │ │ │ │ │ -361 static std::ostream& write(const std::complex& t, std::ostream& s) │ │ │ │ │ -362 { │ │ │ │ │ -363 s << t.real() << " " << t.imag(); │ │ │ │ │ -364 return s; │ │ │ │ │ -365 } │ │ │ │ │ -366 }; │ │ │ │ │ -367 } // anonymous namespace │ │ │ │ │ -368 │ │ │ │ │ -378 template │ │ │ │ │ -_3_7_9 void _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r(const FieldType& value, │ │ │ │ │ -380 int rowOffset, int colOffset, │ │ │ │ │ -381 std::ostream& s, │ │ │ │ │ -382 typename std::enable_if_t::value>* sfinae = │ │ │ │ │ -nullptr) │ │ │ │ │ -383 { │ │ │ │ │ -384 //+1 for Matlab numbering │ │ │ │ │ -385 s << rowOffset + 1 << " " << colOffset + 1 << " "; │ │ │ │ │ -386 MatlabPODWriter::write(value, s)<< std::endl; │ │ │ │ │ -387 } │ │ │ │ │ -388 │ │ │ │ │ -396 template │ │ │ │ │ -_3_9_7 void _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r(const MatrixType& matrix, │ │ │ │ │ -398 int externalRowOffset, int externalColOffset, │ │ │ │ │ -399 std::ostream& s, │ │ │ │ │ -400 typename std::enable_if_t::value>* sfinae = │ │ │ │ │ -nullptr) │ │ │ │ │ -401 { │ │ │ │ │ -402 // Precompute the accumulated sizes of the columns │ │ │ │ │ -403 std::vector colOffset(matrix.M()); │ │ │ │ │ -404 if (colOffset.size() > 0) │ │ │ │ │ -405 colOffset[0] = 0; │ │ │ │ │ -406 │ │ │ │ │ -407 for (typename MatrixType::size_type i=0; i_:_:_c_o_l_d_i_m(matrix,i); │ │ │ │ │ -410 │ │ │ │ │ -411 typename MatrixType::size_type rowOffset = 0; │ │ │ │ │ -412 │ │ │ │ │ -413 // Loop over all matrix rows │ │ │ │ │ -414 for (typename MatrixType::size_type rowIdx=0; rowIdx_:_:_r_o_w_d_i_m(matrix, rowIdx); │ │ │ │ │ -427 } │ │ │ │ │ -428 │ │ │ │ │ -429 } │ │ │ │ │ -430 │ │ │ │ │ -450 template │ │ │ │ │ -_4_5_1 void _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b(const MatrixType& matrix, │ │ │ │ │ -452 const std::string& filename, int outputPrecision = 18) │ │ │ │ │ -453 { │ │ │ │ │ -454 std::ofstream outStream(filename.c_str()); │ │ │ │ │ -455 int oldPrecision = outStream.precision(); │ │ │ │ │ -456 outStream.precision(outputPrecision); │ │ │ │ │ -457 │ │ │ │ │ -458 _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r(matrix, 0, 0, outStream); │ │ │ │ │ -459 outStream.precision(oldPrecision); │ │ │ │ │ -460 } │ │ │ │ │ -461 │ │ │ │ │ -462 // Recursively write vector entries to a stream │ │ │ │ │ -463 template │ │ │ │ │ -_4_6_4 void _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const V& v, std::ostream& stream) │ │ │ │ │ -465 { │ │ │ │ │ -466 if constexpr (IsNumber()) { │ │ │ │ │ -467 stream << v << std::endl; │ │ │ │ │ -468 } else { │ │ │ │ │ -469 for (const auto& entry : v) │ │ │ │ │ -470 _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r(entry, stream); │ │ │ │ │ -471 } │ │ │ │ │ -472 } │ │ │ │ │ -473 │ │ │ │ │ -491 template │ │ │ │ │ -_4_9_2 void _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b(const VectorType& vector, │ │ │ │ │ -493 const std::string& filename, int outputPrecision = 18) │ │ │ │ │ -494 { │ │ │ │ │ -495 std::ofstream outStream(filename.c_str()); │ │ │ │ │ -496 int oldPrecision = outStream.precision(); │ │ │ │ │ -497 outStream.precision(outputPrecision); │ │ │ │ │ -498 │ │ │ │ │ -499 _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r(vector, outStream); │ │ │ │ │ -500 outStream.precision(oldPrecision); │ │ │ │ │ -501 } │ │ │ │ │ -502 │ │ │ │ │ -503 namespace Impl { │ │ │ │ │ -504 │ │ │ │ │ -506 struct NullStream { │ │ │ │ │ -507 template │ │ │ │ │ -508 friend NullStream &operator<<(NullStream &dev0, Any &&) { │ │ │ │ │ -509 return dev0; │ │ │ │ │ -510 } │ │ │ │ │ -511 }; │ │ │ │ │ -512 │ │ │ │ │ -514 // svg shall be closed with a group and an svg. i.e. "" │ │ │ │ │ -515 template │ │ │ │ │ -516 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts, │ │ │ │ │ -517 std::pair offsets) { │ │ │ │ │ -518 auto [col_offset, row_offset] = offsets; │ │ │ │ │ -519 double width = opts.width; │ │ │ │ │ -520 double height = opts.height; │ │ │ │ │ -521 // if empty, we try to figure out a sensible value of width and height │ │ │ │ │ -522 if (opts.width == 0 and opts.height == 0) │ │ │ │ │ -523 width = height = 500; │ │ │ │ │ -524 if (opts.width == 0) │ │ │ │ │ -525 width = opts.height * (double(col_offset) / row_offset); │ │ │ │ │ -526 if (opts.height == 0) │ │ │ │ │ -527 height = opts.width * (double(row_offset) / col_offset); │ │ │ │ │ -528 │ │ │ │ │ -529 // scale group w.r.t final offsets │ │ │ │ │ -530 double scale_width = width / col_offset; │ │ │ │ │ -531 double scale_height = height / row_offset; │ │ │ │ │ -532 │ │ │ │ │ -533 // write the header text │ │ │ │ │ -534 out << "\n" │ │ │ │ │ -536 << "\n" │ │ │ │ │ -538 << "\n"; │ │ │ │ │ -540 } │ │ │ │ │ -541 │ │ │ │ │ -543 template │ │ │ │ │ -545 std::pair │ │ │ │ │ -546 writeSVGMatrix(const Mat &_m_a_t, Stream &out, SVGMatrixOptions opts, │ │ │ │ │ -547 RowPrefix row_prefix, ColPrefix col_prefix) { │ │ │ │ │ -548 // get values to fill the offests │ │ │ │ │ -549 const auto& block_size = opts.block_size; │ │ │ │ │ -550 const auto& interspace = opts.interspace; │ │ │ │ │ -551 │ │ │ │ │ -552 const std::size_t rows = _m_a_t.N(); │ │ │ │ │ -553 const std::size_t cols = _m_a_t.M(); │ │ │ │ │ -554 │ │ │ │ │ -555 // disable header write for recursive calls │ │ │ │ │ -556 const bool write_header = opts.write_header; │ │ │ │ │ -557 opts.write_header = false; │ │ │ │ │ -558 │ │ │ │ │ -559 // counter of offsets for every block │ │ │ │ │ -560 std::size_t row_offset = interspace; │ │ │ │ │ -561 std::size_t col_offset = interspace; │ │ │ │ │ -562 │ │ │ │ │ -563 // lambda helper: for-each value │ │ │ │ │ -564 auto for_each_entry = [&_m_a_t](const auto &call_back) { │ │ │ │ │ -565 for (auto row_it = _m_a_t.begin(); row_it != _m_a_t.end(); ++row_it) { │ │ │ │ │ -566 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) { │ │ │ │ │ -567 call_back(row_it.index(), col_it.index(), *col_it); │ │ │ │ │ -568 } │ │ │ │ │ -569 } │ │ │ │ │ -570 }; │ │ │ │ │ -571 │ │ │ │ │ -572 // accumulate content in another stream so that we write in correct order │ │ │ │ │ -573 std::stringstream ss; │ │ │ │ │ -574 │ │ │ │ │ -575 // we need to append current row and col values to the prefixes │ │ │ │ │ -576 row_prefix.push_back(0); │ │ │ │ │ -577 col_prefix.push_back(0); │ │ │ │ │ -578 │ │ │ │ │ -579 // do we need to write nested matrix blocks? │ │ │ │ │ -580 if constexpr (Dune::blockLevel() == 0) { │ │ │ │ │ -581 // simple case: write svg block content to stream for each value │ │ │ │ │ -582 for_each_entry([&](const auto &row, const auto &_c_o_l, const auto &val) { │ │ │ │ │ -583 std::size_t x_off = interspace + _c_o_l * (interspace + block_size); │ │ │ │ │ -584 std::size_t y_off = interspace + row * (interspace + block_size); │ │ │ │ │ -585 row_prefix.back() = row; │ │ │ │ │ -586 col_prefix.back() = _c_o_l; │ │ │ │ │ -587 opts.writeSVGBlock(ss, row_prefix, col_prefix, val, │ │ │ │ │ -588 {x_off, y_off, block_size, block_size}); │ │ │ │ │ -589 }); │ │ │ │ │ -590 col_offset += cols * (block_size + interspace); │ │ │ │ │ -591 row_offset += rows * (block_size + interspace); │ │ │ │ │ -592 } else { │ │ │ │ │ -593 // before we write anything, we need to calculate the │ │ │ │ │ -594 // offset for every {row,col} index │ │ │ │ │ -595 const auto null_offset = std::numeric_limits::max(); │ │ │ │ │ -596 std::vector col_offsets(cols + 1, null_offset); │ │ │ │ │ -597 std::vector row_offsets(rows + 1, null_offset); │ │ │ │ │ -598 for_each_entry([&](const auto &row, const auto &_c_o_l, const auto &val) { │ │ │ │ │ -599 NullStream dev0; │ │ │ │ │ -600 // get size of sub-block │ │ │ │ │ -601 auto sub_size = │ │ │ │ │ -602 writeSVGMatrix(val, dev0, opts, row_prefix, col_prefix); │ │ │ │ │ -603 │ │ │ │ │ -604 // if we didn't see col size before │ │ │ │ │ -605 if (col_offsets[_c_o_l + 1] == null_offset) // write it in the offset vector │ │ │ │ │ -606 col_offsets[_c_o_l + 1] = sub_size.first; │ │ │ │ │ -607 │ │ │ │ │ -608 // repeat proces for row sizes │ │ │ │ │ -609 if (row_offsets[row + 1] == null_offset) │ │ │ │ │ -610 row_offsets[row + 1] = sub_size.second; │ │ │ │ │ -611 }); │ │ │ │ │ -612 │ │ │ │ │ -613 // if some rows/cols were not visited, make an educated guess with the │ │ │ │ │ -minimum offset │ │ │ │ │ -614 auto min_row_offset = *std::min_element(begin(row_offsets), end │ │ │ │ │ -(row_offsets)); │ │ │ │ │ -615 std::replace(begin(row_offsets), end(row_offsets), null_offset, │ │ │ │ │ -min_row_offset); │ │ │ │ │ -616 auto min_col_offset = *std::min_element(begin(col_offsets), end │ │ │ │ │ -(col_offsets)); │ │ │ │ │ -617 std::replace(begin(col_offsets), end(col_offsets), null_offset, │ │ │ │ │ -min_col_offset); │ │ │ │ │ -618 │ │ │ │ │ -619 // we have sizes for every block: to get offsets we make a partial sum │ │ │ │ │ -620 col_offsets[0] = interspace; │ │ │ │ │ -621 row_offsets[0] = interspace; │ │ │ │ │ -622 for (std::size_t i = 1; i < col_offsets.size(); i++) │ │ │ │ │ -623 col_offsets[i] += col_offsets[i - 1] + interspace; │ │ │ │ │ -624 for (std::size_t i = 1; i < row_offsets.size(); i++) │ │ │ │ │ -625 row_offsets[i] += row_offsets[i - 1] + interspace; │ │ │ │ │ -626 │ │ │ │ │ -627 for_each_entry([&](const auto &row, const auto &_c_o_l, const auto &val) { │ │ │ │ │ -628 // calculate svg view from offsets │ │ │ │ │ -629 std::size_t width = │ │ │ │ │ -630 col_offsets[_c_o_l + 1] - col_offsets[_c_o_l] - interspace; │ │ │ │ │ -631 std::size_t height = │ │ │ │ │ -632 row_offsets[row + 1] - row_offsets[row] - interspace; │ │ │ │ │ -633 row_prefix.back() = row; │ │ │ │ │ -634 col_prefix.back() = _c_o_l; │ │ │ │ │ -635 // content of the sub-block has origin at {0,0}: shift it to the correct │ │ │ │ │ -place │ │ │ │ │ -636 ss << "\n"; │ │ │ │ │ -638 // write a nested svg with the contents of the sub-block │ │ │ │ │ -639 writeSVGMatrix(val, ss, opts, row_prefix, col_prefix); │ │ │ │ │ -640 ss << "\n"; │ │ │ │ │ -641 }); │ │ │ │ │ -642 col_offset = col_offsets.back(); │ │ │ │ │ -643 row_offset = row_offsets.back(); │ │ │ │ │ -644 } │ │ │ │ │ -645 │ │ │ │ │ -646 // write content in order! │ │ │ │ │ -647 // (i) if required, first header │ │ │ │ │ -648 if (write_header) │ │ │ │ │ -649 writeSVGMatrixHeader(out, opts, {col_offset, row_offset}); │ │ │ │ │ -650 │ │ │ │ │ -651 col_prefix.pop_back(); │ │ │ │ │ -652 row_prefix.pop_back(); │ │ │ │ │ -653 // (ii) an svg block for this level │ │ │ │ │ -654 opts.writeSVGBlock(out, row_prefix, col_prefix, _m_a_t, │ │ │ │ │ -655 {0, 0, col_offset, row_offset}); │ │ │ │ │ -656 // (iii) the content of the matrix │ │ │ │ │ -657 out << ss.str(); │ │ │ │ │ -658 // (iv) if required, close the header │ │ │ │ │ -659 if (write_header) │ │ │ │ │ -660 out << "\n\n"; │ │ │ │ │ -661 │ │ │ │ │ -662 // return the total required for this block │ │ │ │ │ -663 return {col_offset, row_offset}; │ │ │ │ │ -664 } │ │ │ │ │ -665 } // namespace Impl │ │ │ │ │ -666 │ │ │ │ │ -667 │ │ │ │ │ -_6_7_4 struct _D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s { │ │ │ │ │ -_6_7_6 std::size_t _b_l_o_c_k___s_i_z_e = 10; │ │ │ │ │ -_6_7_8 std::size_t _i_n_t_e_r_s_p_a_c_e = 5; │ │ │ │ │ -_6_8_0 std::size_t _w_i_d_t_h = 500; │ │ │ │ │ -_6_8_2 std::size_t _h_e_i_g_h_t = 0; │ │ │ │ │ -_6_8_4 bool _w_r_i_t_e___h_e_a_d_e_r = true; │ │ │ │ │ -_6_8_6 std::string _s_t_y_l_e = " .matrix-block {\n" │ │ │ │ │ -687 " fill: cornflowerblue;\n" │ │ │ │ │ -688 " fill-opacity: 0.4;\n" │ │ │ │ │ -689 " stroke-width: 2;\n" │ │ │ │ │ -690 " stroke: black;\n" │ │ │ │ │ -691 " stroke-opacity: 0.5;\n" │ │ │ │ │ -692 " }\n" │ │ │ │ │ -693 " .matrix-block:hover {\n" │ │ │ │ │ -694 " fill: lightcoral;\n" │ │ │ │ │ -695 " fill-opacity: 0.4;\n" │ │ │ │ │ -696 " stroke-opacity: 1;\n" │ │ │ │ │ -697 " }\n"; │ │ │ │ │ -698 │ │ │ │ │ -_7_1_0 std::function _c_o_l_o_r___f_i_l_l; │ │ │ │ │ -711 │ │ │ │ │ -717 template │ │ │ │ │ -_7_1_8 std::string _b_l_o_c_k_S_t_y_l_e_C_l_a_s_s(const RowPrefix &row_prefix, │ │ │ │ │ -719 const ColPrefix &col_prefix) const { │ │ │ │ │ -720 // here, you can potentially give a different style to each block │ │ │ │ │ -721 return "matrix-block"; │ │ │ │ │ -722 } │ │ │ │ │ -723 │ │ │ │ │ -_7_2_5 bool _w_r_i_t_e___b_l_o_c_k___t_i_t_l_e = true; │ │ │ │ │ -726 │ │ │ │ │ -732 template │ │ │ │ │ -_7_3_3 void _w_r_i_t_e_B_l_o_c_k_T_i_t_l_e(Stream& out, const RowPrefix &row_prefix, │ │ │ │ │ -734 const ColPrefix &col_prefix, │ │ │ │ │ -735 const Block &block) const { │ │ │ │ │ -736 if (this->write_block_title) { │ │ │ │ │ -737 out << ""; │ │ │ │ │ -738 assert(row_prefix.size() == col_prefix.size()); │ │ │ │ │ -739 for (std::size_t i = 0; i < row_prefix.size(); ++i) │ │ │ │ │ -740 out << "[" << row_prefix[i] << ", "<< col_prefix[i] << "]"; │ │ │ │ │ -741 if constexpr (Dune::blockLevel<Block>() == 0) │ │ │ │ │ -742 out << ": " << block; │ │ │ │ │ -743 out << "\n"; │ │ │ │ │ -744 } │ │ │ │ │ -745 } │ │ │ │ │ -746 │ │ │ │ │ -768 template │ │ │ │ │ -_7_6_9 void _w_r_i_t_e_S_V_G_B_l_o_c_k(Stream &out, │ │ │ │ │ -770 const RowPrefix &row_prefix, │ │ │ │ │ -771 const ColPrefix &col_prefix, const Block block, │ │ │ │ │ -772 const std::array &svg_box) const { │ │ │ │ │ -773 // get bounding box values │ │ │ │ │ -774 auto &[x_off, y_off, _w_i_d_t_h, _h_e_i_g_h_t] = svg_box; │ │ │ │ │ -775 // get style class │ │ │ │ │ -776 std::string block_class = this->_b_l_o_c_k_S_t_y_l_e_C_l_a_s_s(row_prefix, col_prefix); │ │ │ │ │ -777 // write a rectangle on the bounding box │ │ │ │ │ -778 out << "() == 0 and std:: │ │ │ │ │ -is_convertible{}) │ │ │ │ │ -781 if (_c_o_l_o_r___f_i_l_l) │ │ │ │ │ -782 out << " style='fill-opacity: 1;fill:" << _c_o_l_o_r___f_i_l_l(double(block)) << "'"; │ │ │ │ │ -783 │ │ │ │ │ -784 out << ">\n"; │ │ │ │ │ -785 // give the rectangle a title (in html this shows info about the block) │ │ │ │ │ -786 this->_w_r_i_t_e_B_l_o_c_k_T_i_t_l_e(out,row_prefix, col_prefix, block); │ │ │ │ │ -787 // close rectangle │ │ │ │ │ -788 out << "\n"; │ │ │ │ │ -789 } │ │ │ │ │ -790 }; │ │ │ │ │ -791 │ │ │ │ │ -806 template │ │ │ │ │ -_8_0_7 void _w_r_i_t_e_S_V_G_M_a_t_r_i_x(const Mat &_m_a_t, std::ostream &out, │ │ │ │ │ -808 SVGOptions opts = {}) { │ │ │ │ │ -809 // We need a vector that can fit all the multi-indices for rows and colums │ │ │ │ │ -810 using IndexPrefix = Dune::ReservedVector()>; │ │ │ │ │ -811 // Call overload for Mat type │ │ │ │ │ -812 Impl::writeSVGMatrix(_m_a_t, out, opts, IndexPrefix{}, IndexPrefix{}); │ │ │ │ │ -813 } │ │ │ │ │ -814 │ │ │ │ │ -817} // namespace Dune │ │ │ │ │ -818 │ │ │ │ │ -819#endif │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ -Some handy generic functions for ISTL matrices. │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_w_r_i_t_e_S_V_G_M_a_t_r_i_x │ │ │ │ │ -void writeSVGMatrix(const Mat &mat, std::ostream &out, SVGOptions opts={}) │ │ │ │ │ -Writes the visualization of matrix in the SVG format. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:807 │ │ │ │ │ -_D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b │ │ │ │ │ -void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename, │ │ │ │ │ -int outputPrecision=18) │ │ │ │ │ -Writes sparse matrix in a Matlab-readable format. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:451 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t___r_o_w │ │ │ │ │ -void print_row(std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1 │ │ │ │ │ ->::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename │ │ │ │ │ -FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision, typename │ │ │ │ │ -std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr) │ │ │ │ │ -Print one row of a matrix, specialization for number types. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_m_a_t_r_i_x │ │ │ │ │ -void printmatrix(std::ostream &s, const M &A, std::string title, std::string │ │ │ │ │ -rowtext, int width=10, int precision=2) │ │ │ │ │ -Print a generic block matrix. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:213 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ -void printvector(std::ostream &s, const V &v, std::string title, std::string │ │ │ │ │ -rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ -Print an ISTL vector. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r │ │ │ │ │ -void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int │ │ │ │ │ -colOffset, std::ostream &s, typename std::enable_if_t< Dune::IsNumber< │ │ │ │ │ -FieldType >::value > *sfinae=nullptr) │ │ │ │ │ -Helper method for the writeMatrixToMatlab routine. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r │ │ │ │ │ -void writeVectorToMatlabHelper(const V &v, std::ostream &stream) │ │ │ │ │ -DDeeffiinniittiioonn io.hh:464 │ │ │ │ │ -_D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b │ │ │ │ │ -void writeVectorToMatlab(const VectorType &vector, const std::string &filename, │ │ │ │ │ -int outputPrecision=18) │ │ │ │ │ -Writes vectors in a Matlab-readable format. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:492 │ │ │ │ │ -_D_u_n_e_:_:_r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ -void recursive_printvector(std::ostream &s, const V &v, std::string rowtext, │ │ │ │ │ -int &counter, int columns, int width) │ │ │ │ │ -Recursively print a vector. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_S_p_a_r_s_e_M_a_t_r_i_x │ │ │ │ │ -void printSparseMatrix(std::ostream &s, const BCRSMatrix< FieldMatrix< B, n, m │ │ │ │ │ ->, A > &mat, std::string title, std::string rowtext, int width=3, int │ │ │ │ │ -precision=2) │ │ │ │ │ -Prints a BCRSMatrix with fixed sized blocks. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_f_i_l_l___r_o_w │ │ │ │ │ -void fill_row(std::ostream &s, int m, int width, int precision) │ │ │ │ │ -Print a row of zeros for a non-existing block. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:133 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +180 public: │ │ │ │ │ +_1_8_1 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (std::shared_ptr comm) : │ │ │ │ │ +182 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm,_S_o_l_v_e_r_C_a_t_e_g_o_r_y::nonoverlapping) {} │ │ │ │ │ +183 │ │ │ │ │ +_1_8_4 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (const C& comm) : │ │ │ │ │ +185 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm,_S_o_l_v_e_r_C_a_t_e_g_o_r_y::nonoverlapping) {} │ │ │ │ │ +186 }; │ │ │ │ │ +187 │ │ │ │ │ +199 template │ │ │ │ │ +_2_0_0 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t : public _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +201 { │ │ │ │ │ +202 public: │ │ │ │ │ +_2_0_3 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (std::shared_ptr comm) : │ │ │ │ │ +204 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y::overlapping) {} │ │ │ │ │ +205 │ │ │ │ │ +_2_0_6 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (const C& comm) : │ │ │ │ │ +207 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm,_S_o_l_v_e_r_C_a_t_e_g_o_r_y::overlapping) {} │ │ │ │ │ +208 }; │ │ │ │ │ +209 │ │ │ │ │ +223 template │ │ │ │ │ +_2_2_4 std::shared_ptr> _m_a_k_e_S_c_a_l_a_r_P_r_o_d_u_c_t(std::shared_ptr comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category) │ │ │ │ │ +225 { │ │ │ │ │ +226 switch(category) │ │ │ │ │ +227 { │ │ │ │ │ +228 case _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l: │ │ │ │ │ +229 return │ │ │ │ │ +230 std::make_shared>(); │ │ │ │ │ +231 default: │ │ │ │ │ +232 return │ │ │ │ │ +233 std::make_shared>(comm,category); │ │ │ │ │ +234 } │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +241 template │ │ │ │ │ +_2_4_2 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const Comm& comm, │ │ │ │ │ +_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category) │ │ │ │ │ +243 { return makeScalarProduct(stackobject_to_shared_ptr(comm), category); } │ │ │ │ │ +244 │ │ │ │ │ +245} // end namespace Dune │ │ │ │ │ +246 │ │ │ │ │ +247#endif │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_c_o_l_d_i_m │ │ │ │ │ -static auto coldim(const M &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_r_o_w_d_i_m │ │ │ │ │ -static auto rowdim(const M &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s │ │ │ │ │ -Default options class to write SVG matrices. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:674 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_s_t_y_l_e │ │ │ │ │ -std::string style │ │ │ │ │ -CSS style block to write in header. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:686 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_i_d_t_h │ │ │ │ │ -std::size_t width │ │ │ │ │ -Final width size (pixels) of the SVG header. If 0, size is automatic. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:680 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_c_o_l_o_r___f_i_l_l │ │ │ │ │ -std::function< std::string(const double &)> color_fill │ │ │ │ │ -Color fill for default options. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:710 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_b_l_o_c_k___s_i_z_e │ │ │ │ │ -std::size_t block_size │ │ │ │ │ -size (pixels) of the deepst block/value of the matrix │ │ │ │ │ -DDeeffiinniittiioonn io.hh:676 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e_S_V_G_B_l_o_c_k │ │ │ │ │ -void writeSVGBlock(Stream &out, const RowPrefix &row_prefix, const ColPrefix │ │ │ │ │ -&col_prefix, const Block block, const std::array< std::size_t, 4 > &svg_box) │ │ │ │ │ -const │ │ │ │ │ -Write an SVG object for a given block/value in the matrix. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:769 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e_B_l_o_c_k_T_i_t_l_e │ │ │ │ │ -void writeBlockTitle(Stream &out, const RowPrefix &row_prefix, const ColPrefix │ │ │ │ │ -&col_prefix, const Block &block) const │ │ │ │ │ -Helper function writes a title for a given block and prefix. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:733 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_i_n_t_e_r_s_p_a_c_e │ │ │ │ │ -std::size_t interspace │ │ │ │ │ -size (pixels) of the interspace between blocks │ │ │ │ │ -DDeeffiinniittiioonn io.hh:678 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e___b_l_o_c_k___t_i_t_l_e │ │ │ │ │ -bool write_block_title │ │ │ │ │ -(Helper) Whether to write a title on the rectangle value │ │ │ │ │ -DDeeffiinniittiioonn io.hh:725 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_h_e_i_g_h_t │ │ │ │ │ -std::size_t height │ │ │ │ │ -Final height size (pixels) of the SVG header. If 0, size is automatic. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:682 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e___h_e_a_d_e_r │ │ │ │ │ -bool write_header │ │ │ │ │ -Whether to write the SVG header. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:684 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_b_l_o_c_k_S_t_y_l_e_C_l_a_s_s │ │ │ │ │ -std::string blockStyleClass(const RowPrefix &row_prefix, const ColPrefix │ │ │ │ │ -&col_prefix) const │ │ │ │ │ -Helper function that returns an style class for a given prefix. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:718 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -RowIterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -RowIterator begin() │ │ │ │ │ -Get iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::const_iterator ConstColIterator │ │ │ │ │ -Const iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -Return the number of columns. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -Return the number of rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, │ │ │ │ │ +SolverCategory::Category category) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:242 │ │ │ │ │ +_D_u_n_e_:_:_m_a_k_e_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const │ │ │ │ │ +Comm > comm, SolverCategory::Category category) │ │ │ │ │ +Choose the approriate scalar product for a solver category. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Base class for scalar product and norm computation. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_t │ │ │ │ │ +virtual field_type dot(const X &x, const X &y) const │ │ │ │ │ +Dot product of two vectors. It is assumed that the vectors are consistent on │ │ │ │ │ +the interior+border part... │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the scalar product (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +export types, they come from the derived class │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_~_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +virtual ~ScalarProduct() │ │ │ │ │ +every abstract base class has a virtual destructor │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_n_o_r_m │ │ │ │ │ +virtual real_type norm(const X &x) const │ │ │ │ │ +Norm of a right-hand side vector. The vector must be consistent on the │ │ │ │ │ +interior+border partition. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Scalar product for overlapping Schwarz methods. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_t │ │ │ │ │ +virtual field_type dot(const X &x, const X &y) const override │ │ │ │ │ +Dot product of two vectors. It is assumed that the vectors are consistent on │ │ │ │ │ +the interior+border part... │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:139 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const override │ │ │ │ │ +Category of the scalar product (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ +C communication_type │ │ │ │ │ +The type of the communication object. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +ParallelScalarProduct(const communication_type &com, SolverCategory::Category │ │ │ │ │ +cat) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The type of the vector to compute the scalar product on. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +ParallelScalarProduct(std::shared_ptr< const communication_type > com, │ │ │ │ │ +SolverCategory::Category cat) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type used by the vector type domain_type. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_n_o_r_m │ │ │ │ │ +virtual real_type norm(const X &x) const override │ │ │ │ │ +Norm of a right-hand side vector. The vector must be consistent on the │ │ │ │ │ +interior+border partition. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Default implementation for the scalar case. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Nonoverlapping Scalar Product with communication object. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +NonoverlappingSchwarzScalarProduct(const C &comm) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Scalar product for overlapping Schwarz methods. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:201 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +OverlappingSchwarzScalarProduct(const C &comm) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +Categories for the solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00023.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: novlpschwarz.hh File Reference │ │ │ │ +dune-istl: io.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,55 +71,106 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
novlpschwarz.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ -
#include <iostream>
│ │ │ │ + │ │ │ │ +

Some generic functions for pretty printing vectors and matrices. │ │ │ │ +More...

│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <ios>
│ │ │ │ +#include <iomanip>
│ │ │ │ #include <fstream>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <sstream>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ +#include <string>
│ │ │ │ +#include "matrixutils.hh"
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ #include <dune/common/hybridutilities.hh>
│ │ │ │ -#include "io.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include "vbvector.hh"
│ │ │ │ -#include "bcrsmatrix.hh"
│ │ │ │ -#include "gsetc.hh"
│ │ │ │ -#include "ilu.hh"
│ │ │ │ -#include "operators.hh"
│ │ │ │ -#include "solvers.hh"
│ │ │ │ -#include "preconditioners.hh"
│ │ │ │ -#include "scalarproducts.hh"
│ │ │ │ -#include "owneroverlapcopy.hh"
│ │ │ │ +#include <dune/common/reservedvector.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::NonoverlappingSchwarzOperator< M, X, Y, C >
 A nonoverlapping operator with communication object. More...
 
class  Dune::NonoverlappingBlockPreconditioner< C, P >
 Nonoverlapping parallel preconditioner. More...
struct  Dune::DefaultSVGMatrixOptions
 Default options class to write SVG matrices. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class V >
void Dune::recursive_printvector (std::ostream &s, const V &v, std::string rowtext, int &counter, int columns, int width)
 Recursively print a vector.
 
template<class V >
void Dune::printvector (std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
 Print an ISTL vector.
 
void Dune::fill_row (std::ostream &s, int m, int width, int precision)
 Print a row of zeros for a non-existing block.
 
template<class K >
void Dune::print_row (std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1 >::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
 Print one row of a matrix, specialization for number types.
 
template<class M >
void Dune::print_row (std::ostream &s, const M &A, typename M::size_type I, typename M::size_type J, typename M::size_type therow, int width, int precision, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
 Print one row of a matrix.
 
template<class M >
void Dune::printmatrix (std::ostream &s, const M &A, std::string title, std::string rowtext, int width=10, int precision=2)
 Print a generic block matrix.
 
template<class B , int n, int m, class A >
void Dune::printSparseMatrix (std::ostream &s, const BCRSMatrix< FieldMatrix< B, n, m >, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
 Prints a BCRSMatrix with fixed sized blocks.
 
template<class FieldType >
void Dune::writeMatrixToMatlabHelper (const FieldType &value, int rowOffset, int colOffset, std::ostream &s, typename std::enable_if_t< Dune::IsNumber< FieldType >::value > *sfinae=nullptr)
 Helper method for the writeMatrixToMatlab routine.
 
template<class MatrixType >
void Dune::writeMatrixToMatlabHelper (const MatrixType &matrix, int externalRowOffset, int externalColOffset, std::ostream &s, typename std::enable_if_t<!Dune::IsNumber< MatrixType >::value > *sfinae=nullptr)
 Helper method for the writeMatrixToMatlab routine.
 
template<class MatrixType >
void Dune::writeMatrixToMatlab (const MatrixType &matrix, const std::string &filename, int outputPrecision=18)
 Writes sparse matrix in a Matlab-readable format.
 
template<class V >
void Dune::writeVectorToMatlabHelper (const V &v, std::ostream &stream)
 
template<class VectorType >
void Dune::writeVectorToMatlab (const VectorType &vector, const std::string &filename, int outputPrecision=18)
 Writes vectors in a Matlab-readable format.
 
template<class Mat , class SVGOptions = DefaultSVGMatrixOptions>
void Dune::writeSVGMatrix (const Mat &mat, std::ostream &out, SVGOptions opts={})
 Writes the visualization of matrix in the SVG format.
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Some generic functions for pretty printing vectors and matrices.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,41 +1,108 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -novlpschwarz.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 │ │ │ │ │ +io.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s » │ │ │ │ │ +_I_O_ _f_o_r_ _m_a_t_r_i_c_e_s_ _a_n_d_ _v_e_c_t_o_r_s_. │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include "_i_o_._h_h" │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -#include "_i_l_u_._h_h" │ │ │ │ │ -#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ -#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ -#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ -#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ -#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _> │ │ │ │ │ -  A nonoverlapping operator with communication object. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_,_ _P_ _> │ │ │ │ │ -  Nonoverlapping parallel preconditioner. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s │ │ │ │ │ +  Default options class to write SVG matrices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r (std::ostream &s, const V &v, std::string │ │ │ │ │ + rowtext, int &counter, int columns, int width) │ │ │ │ │ +  Recursively print a vector. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r (std::ostream &s, const V &v, std::string title, std:: │ │ │ │ │ + string rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ +  Print an _I_S_T_L vector. │ │ │ │ │ +  │ │ │ │ │ +void  _D_u_n_e_:_:_f_i_l_l___r_o_w (std::ostream &s, int m, int width, int precision) │ │ │ │ │ +  Print a row of zeros for a non-existing block. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_p_r_i_n_t___r_o_w (std::ostream &s, const K &value, typename _F_i_e_l_d_M_a_t_r_i_x< │ │ │ │ │ + K, 1, 1 >::size_type I, typename _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 >::size_type J, │ │ │ │ │ + typename _F_i_e_l_d_M_a_t_r_i_x< K, 1, 1 >::size_type therow, int width, int │ │ │ │ │ + precision, typename std::enable_if_t< Dune::IsNumber< K >::value > │ │ │ │ │ + *sfinae=nullptr) │ │ │ │ │ +  Print one row of a matrix, specialization for number types. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_p_r_i_n_t___r_o_w (std::ostream &s, const M &A, typename M::size_type I, │ │ │ │ │ + typename M::size_type J, typename M::size_type therow, int width, int │ │ │ │ │ + precision, typename std::enable_if_t::value > │ │ │ │ │ + *sfinae=nullptr) │ │ │ │ │ +  Print one row of a matrix. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_p_r_i_n_t_m_a_t_r_i_x (std::ostream &s, const M &A, std::string title, std:: │ │ │ │ │ + string rowtext, int width=10, int precision=2) │ │ │ │ │ +  Print a generic block matrix. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_p_r_i_n_t_S_p_a_r_s_e_M_a_t_r_i_x (std::ostream &s, const _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< │ │ │ │ │ + B, n, m >, A > &_m_a_t, std::string title, std::string rowtext, int width=3, │ │ │ │ │ + int precision=2) │ │ │ │ │ +  Prints a _B_C_R_S_M_a_t_r_i_x with fixed sized blocks. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const FieldType &value, int rowOffset, │ │ │ │ │ + int colOffset, std::ostream &s, typename std::enable_if_t< Dune:: │ │ │ │ │ + IsNumber< FieldType >::value > *sfinae=nullptr) │ │ │ │ │ +  Helper method for the writeMatrixToMatlab routine. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const MatrixType &matrix, int │ │ │ │ │ + externalRowOffset, int externalColOffset, std::ostream &s, typename std:: │ │ │ │ │ + enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ +  Helper method for the writeMatrixToMatlab routine. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b (const MatrixType &matrix, const std::string │ │ │ │ │ + &filename, int outputPrecision=18) │ │ │ │ │ +  Writes sparse matrix in a Matlab-readable format. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const V &v, std::ostream &stream) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b (const VectorType &vector, const std::string │ │ │ │ │ + &filename, int outputPrecision=18) │ │ │ │ │ +  Writes vectors in a Matlab-readable format. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_w_r_i_t_e_S_V_G_M_a_t_r_i_x (const Mat &_m_a_t, std::ostream &out, SVGOptions opts= │ │ │ │ │ + {}) │ │ │ │ │ +  Writes the visualization of matrix in the SVG format. │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: novlpschwarz.hh Source File │ │ │ │ +dune-istl: io.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,381 +74,710 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
novlpschwarz.hh
│ │ │ │ +
io.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH
│ │ │ │ -
6#define DUNE_ISTL_NOVLPSCHWARZ_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_IO_HH
│ │ │ │ +
6#define DUNE_ISTL_IO_HH
│ │ │ │
7
│ │ │ │ -
8#include <iostream> // for input/output to shell
│ │ │ │ -
9#include <fstream> // for input/output to files
│ │ │ │ -
10#include <vector> // STL vector class
│ │ │ │ -
11#include <sstream>
│ │ │ │ -
12
│ │ │ │ -
13#include <cmath> // Yes, we do some math here
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/timer.hh>
│ │ │ │ -
16
│ │ │ │ -
17#include <dune/common/hybridutilities.hh>
│ │ │ │ -
18
│ │ │ │ -
19#include "io.hh"
│ │ │ │ -
20#include "bvector.hh"
│ │ │ │ -
21#include "vbvector.hh"
│ │ │ │ -
22#include "bcrsmatrix.hh"
│ │ │ │ -
23#include "io.hh"
│ │ │ │ -
24#include "gsetc.hh"
│ │ │ │ -
25#include "ilu.hh"
│ │ │ │ -
26#include "operators.hh"
│ │ │ │ -
27#include "solvers.hh"
│ │ │ │ -
28#include "preconditioners.hh"
│ │ │ │ -
29#include "scalarproducts.hh"
│ │ │ │ -
30#include "owneroverlapcopy.hh"
│ │ │ │ -
31
│ │ │ │ -
32namespace Dune {
│ │ │ │ -
33
│ │ │ │ -
59 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 {
│ │ │ │ -
62 public:
│ │ │ │ -
64 typedef M matrix_type;
│ │ │ │ -
66 typedef X domain_type;
│ │ │ │ -
68 typedef Y range_type;
│ │ │ │ -
70 typedef typename X::field_type field_type;
│ │ │ │ - │ │ │ │ -
73
│ │ │ │ -
74 typedef typename C::PIS PIS;
│ │ │ │ -
75 typedef typename C::RI RI;
│ │ │ │ -
76 typedef typename RI::RemoteIndexList RIL;
│ │ │ │ -
77 typedef typename RI::const_iterator RIIterator;
│ │ │ │ -
78 typedef typename RIL::const_iterator RILIterator;
│ │ │ │ -
79 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ -
80 typedef typename M::ConstRowIterator RowIterator;
│ │ │ │ -
81 typedef std::multimap<int,int> MM;
│ │ │ │ -
82 typedef std::multimap<int,std::pair<int,RILIterator> > RIMap;
│ │ │ │ -
83 typedef typename RIMap::iterator RIMapit;
│ │ │ │ -
84
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true)
│ │ │ │ -
94 {}
│ │ │ │ -
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <complex>
│ │ │ │ +
10#include <limits>
│ │ │ │ +
11#include <ios>
│ │ │ │ +
12#include <iomanip>
│ │ │ │ +
13#include <fstream>
│ │ │ │ +
14#include <string>
│ │ │ │ +
15
│ │ │ │ +
16#include "matrixutils.hh"
│ │ │ │ +
17#include "istlexception.hh"
│ │ │ │ +
18#include <dune/common/fvector.hh>
│ │ │ │ +
19#include <dune/common/fmatrix.hh>
│ │ │ │ +
20#include <dune/common/hybridutilities.hh>
│ │ │ │ +
21#include <dune/common/reservedvector.hh>
│ │ │ │ +
22
│ │ │ │ + │ │ │ │ + │ │ │ │ +
25
│ │ │ │ +
26namespace Dune {
│ │ │ │ +
27
│ │ │ │ +
40 //
│ │ │ │ +
41 // pretty printing of vectors
│ │ │ │ +
42 //
│ │ │ │ +
43
│ │ │ │ +
51 template<class V>
│ │ │ │ +
│ │ │ │ +
52 void recursive_printvector (std::ostream& s, const V& v, std::string rowtext,
│ │ │ │ +
53 int& counter, int columns, int width)
│ │ │ │ +
54 {
│ │ │ │ +
55 if constexpr (IsNumber<V>())
│ │ │ │ +
56 {
│ │ │ │ +
57 // Print one number
│ │ │ │ +
58 if (counter%columns==0)
│ │ │ │ +
59 {
│ │ │ │ +
60 s << rowtext; // start a new row
│ │ │ │ +
61 s << " "; // space in front of each entry
│ │ │ │ +
62 s.width(4); // set width for counter
│ │ │ │ +
63 s << counter; // number of first entry in a line
│ │ │ │ +
64 }
│ │ │ │ +
65 s << " "; // space in front of each entry
│ │ │ │ +
66 s.width(width); // set width for each entry anew
│ │ │ │ +
67 s << v; // yeah, the number !
│ │ │ │ +
68 counter++; // increment the counter
│ │ │ │ +
69 if (counter%columns==0)
│ │ │ │ +
70 s << std::endl; // start a new line
│ │ │ │ +
71 }
│ │ │ │ +
72 else
│ │ │ │ +
73 {
│ │ │ │ +
74 // Recursively print a vector
│ │ │ │ +
75 for (const auto& entry : v)
│ │ │ │ +
76 recursive_printvector(s,entry,rowtext,counter,columns,width);
│ │ │ │ +
77 }
│ │ │ │ +
78 }
│ │ │ │ +
│ │ │ │ +
79
│ │ │ │ +
80
│ │ │ │ +
88 template<class V>
│ │ │ │ +
│ │ │ │ +
89 void printvector (std::ostream& s, const V& v, std::string title,
│ │ │ │ +
90 std::string rowtext, int columns=1, int width=10,
│ │ │ │ +
91 int precision=2)
│ │ │ │ +
92 {
│ │ │ │ +
93 // count the numbers printed to make columns
│ │ │ │ +
94 int counter=0;
│ │ │ │
95
│ │ │ │ -
│ │ │ │ -
96 NonoverlappingSchwarzOperator (std::shared_ptr<const matrix_type> A, const communication_type& com)
│ │ │ │ -
97 : _A_(A), communication(com), buildcomm(true)
│ │ │ │ -
98 {}
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
101 virtual void apply (const X& x, Y& y) const
│ │ │ │ -
102 {
│ │ │ │ -
103 y = 0;
│ │ │ │ -
104 novlp_op_apply(x,y,1);
│ │ │ │ -
105 communication.addOwnerCopyToOwnerCopy(y,y);
│ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ +
96 // remember old flags
│ │ │ │ +
97 std::ios_base::fmtflags oldflags = s.flags();
│ │ │ │ +
98
│ │ │ │ +
99 // set the output format
│ │ │ │ +
100 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
│ │ │ │ +
101 int oldprec = s.precision();
│ │ │ │ +
102 s.precision(precision);
│ │ │ │ +
103
│ │ │ │ +
104 // print title
│ │ │ │ +
105 s << title << " [blocks=" << v.N() << ",dimension=" << v.dim() << "]"
│ │ │ │ +
106 << std::endl;
│ │ │ │
107
│ │ │ │ -
│ │ │ │ -
109 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
│ │ │ │ -
110 {
│ │ │ │ -
111 // only apply communication to alpha*A*x to make it consistent,
│ │ │ │ -
112 // y already has to be consistent.
│ │ │ │ -
113 Y y1(y);
│ │ │ │ -
114 y = 0;
│ │ │ │ -
115 novlp_op_apply(x,y,alpha);
│ │ │ │ -
116 communication.addOwnerCopyToOwnerCopy(y,y);
│ │ │ │ -
117 y += y1;
│ │ │ │ -
118 }
│ │ │ │ +
108 // print data from all blocks
│ │ │ │ +
109 recursive_printvector(s,v,rowtext,counter,columns,width);
│ │ │ │ +
110
│ │ │ │ +
111 // check if new line is required
│ │ │ │ +
112 if (counter%columns!=0)
│ │ │ │ +
113 s << std::endl;
│ │ │ │ +
114
│ │ │ │ +
115 // reset the output format
│ │ │ │ +
116 s.flags(oldflags);
│ │ │ │ +
117 s.precision(oldprec);
│ │ │ │ +
118 }
│ │ │ │
│ │ │ │
119
│ │ │ │ -
│ │ │ │ -
121 virtual const matrix_type& getmat () const
│ │ │ │ -
122 {
│ │ │ │ -
123 return *_A_;
│ │ │ │ -
124 }
│ │ │ │ -
│ │ │ │ +
120
│ │ │ │ +
122 //
│ │ │ │ +
123 // pretty printing of matrices
│ │ │ │ +
124 //
│ │ │ │
125
│ │ │ │ -
│ │ │ │ -
126 void novlp_op_apply (const X& x, Y& y, field_type alpha) const
│ │ │ │ -
127 {
│ │ │ │ -
128 //get index sets
│ │ │ │ -
129 const PIS& pis=communication.indexSet();
│ │ │ │ -
130 const RI& ri = communication.remoteIndices();
│ │ │ │ -
131
│ │ │ │ -
132 // at the beginning make a multimap "bordercontribution".
│ │ │ │ -
133 // process has i and j as border dofs but is not the owner
│ │ │ │ -
134 // => only contribute to Ax if i,j is in bordercontribution
│ │ │ │ -
135 if (buildcomm == true) {
│ │ │ │ -
136
│ │ │ │ -
137 // set up mask vector
│ │ │ │ -
138 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size())) {
│ │ │ │ -
139 mask.resize(x.size());
│ │ │ │ -
140 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
│ │ │ │ -
141 mask[i] = 1;
│ │ │ │ -
142 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ -
143 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ -
144 mask[i->local().local()] = 0;
│ │ │ │ -
145 else if (i->local().attribute()==OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ -
146 mask[i->local().local()] = 2;
│ │ │ │ -
147 }
│ │ │ │ -
148
│ │ │ │ -
149 for (MM::iterator iter = bordercontribution.begin();
│ │ │ │ -
150 iter != bordercontribution.end(); ++iter)
│ │ │ │ -
151 bordercontribution.erase(iter);
│ │ │ │ -
152 std::map<int,int> owner; //key: local index i, value: process, that owns i
│ │ │ │ -
153 RIMap rimap;
│ │ │ │ -
154
│ │ │ │ -
155 // for each local index make multimap rimap:
│ │ │ │ -
156 // key: local index i, data: pair of process that knows i and pointer to RI entry
│ │ │ │ -
157 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i)
│ │ │ │ -
158 if (mask[i.index()] == 0)
│ │ │ │ -
159 for (RIIterator remote = ri.begin(); remote != ri.end(); ++remote) {
│ │ │ │ -
160 RIL& ril = *(remote->second.first);
│ │ │ │ -
161 for (RILIterator rindex = ril.begin(); rindex != ril.end(); ++rindex)
│ │ │ │ -
162 if (rindex->attribute() != OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ -
163 if (rindex->localIndexPair().local().local() == i.index()) {
│ │ │ │ -
164 rimap.insert
│ │ │ │ -
165 (std::make_pair(i.index(),
│ │ │ │ -
166 std::pair<int,RILIterator>(remote->first, rindex)));
│ │ │ │ -
167 if(rindex->attribute()==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
168 owner.insert(std::make_pair(i.index(),remote->first));
│ │ │ │ -
169 }
│ │ │ │ -
170 }
│ │ │ │ -
171
│ │ │ │ -
172 int iowner = 0;
│ │ │ │ -
173 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
│ │ │ │ -
174 if (mask[i.index()] == 0) {
│ │ │ │ -
175 std::map<int,int>::iterator it = owner.find(i.index());
│ │ │ │ -
176 iowner = it->second;
│ │ │ │ -
177 std::pair<RIMapit, RIMapit> foundiit = rimap.equal_range(i.index());
│ │ │ │ -
178 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
│ │ │ │ -
179 if (mask[j.index()] == 0) {
│ │ │ │ -
180 bool flag = true;
│ │ │ │ -
181 for (RIMapit foundi = foundiit.first; foundi != foundiit.second; ++foundi) {
│ │ │ │ -
182 std::pair<RIMapit, RIMapit> foundjit = rimap.equal_range(j.index());
│ │ │ │ -
183 for (RIMapit foundj = foundjit.first; foundj != foundjit.second; ++foundj)
│ │ │ │ -
184 if (foundj->second.first == foundi->second.first)
│ │ │ │ -
185 if (foundj->second.second->attribute() == OwnerOverlapCopyAttributeSet::owner
│ │ │ │ -
186 || foundj->second.first == iowner
│ │ │ │ -
187 || foundj->second.first < communication.communicator().rank()) {
│ │ │ │ -
188 flag = false;
│ │ │ │ -
189 continue;
│ │ │ │ -
190 }
│ │ │ │ -
191 if (flag == false)
│ │ │ │ -
192 continue;
│ │ │ │ -
193 }
│ │ │ │ -
194 // don´t contribute to Ax if
│ │ │ │ -
195 // 1. the owner of j has i as interior/border dof
│ │ │ │ -
196 // 2. iowner has j as interior/border dof
│ │ │ │ -
197 // 3. there is another process with smaller rank that has i and j
│ │ │ │ -
198 // as interor/border dofs
│ │ │ │ -
199 // if the owner of j does not have i as interior/border dof,
│ │ │ │ -
200 // it will not be taken into account
│ │ │ │ -
201 if (flag==true)
│ │ │ │ -
202 bordercontribution.insert(std::pair<int,int>(i.index(),j.index()));
│ │ │ │ -
203 }
│ │ │ │ -
204 }
│ │ │ │ -
205 }
│ │ │ │ -
206 }
│ │ │ │ -
207 buildcomm = false;
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
210 //compute alpha*A*x nonoverlapping case
│ │ │ │ -
211 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
│ │ │ │ -
212 if (mask[i.index()] == 0) {
│ │ │ │ -
213 //dof doesn't belong to process but is border (not ghost)
│ │ │ │ -
214 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
│ │ │ │ -
215 if (mask[j.index()] == 1) //j is owner => then sum entries
│ │ │ │ -
216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
│ │ │ │ -
217 else if (mask[j.index()] == 0) {
│ │ │ │ -
218 std::pair<MM::iterator, MM::iterator> itp =
│ │ │ │ -
219 bordercontribution.equal_range(i.index());
│ │ │ │ -
220 for (MM::iterator it = itp.first; it != itp.second; ++it)
│ │ │ │ -
221 if ((*it).second == (int)j.index())
│ │ │ │ -
222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
│ │ │ │ -
223 }
│ │ │ │ -
224 }
│ │ │ │ -
225 }
│ │ │ │ -
226 else if (mask[i.index()] == 1) {
│ │ │ │ -
227 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j)
│ │ │ │ -
228 if (mask[j.index()] != 2)
│ │ │ │ -
229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
│ │ │ │ -
230 }
│ │ │ │ -
231 }
│ │ │ │ -
232 }
│ │ │ │ -
│ │ │ │ -
233
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
236 {
│ │ │ │ - │ │ │ │ -
238 }
│ │ │ │ -
│ │ │ │ -
239
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
242 {
│ │ │ │ -
243 return communication;
│ │ │ │ -
244 }
│ │ │ │ -
│ │ │ │ -
245 private:
│ │ │ │ -
246 std::shared_ptr<const matrix_type> _A_;
│ │ │ │ -
247 const communication_type& communication;
│ │ │ │ -
248 mutable bool buildcomm;
│ │ │ │ -
249 mutable std::vector<double> mask;
│ │ │ │ -
250 mutable std::multimap<int,int> bordercontribution;
│ │ │ │ -
251 };
│ │ │ │ -
│ │ │ │ -
252
│ │ │ │ -
│ │ │ │ -
255 namespace Amg
│ │ │ │ -
256 {
│ │ │ │ -
257 template<class T> struct ConstructionTraits;
│ │ │ │ -
258 }
│ │ │ │ -
│ │ │ │ -
259
│ │ │ │ -
274 template<class C, class P>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
276 : public Preconditioner<typename P::domain_type,typename P::range_type> {
│ │ │ │ -
277 friend struct Amg::ConstructionTraits<NonoverlappingBlockPreconditioner<C,P> >;
│ │ │ │ -
278 using X = typename P::domain_type;
│ │ │ │ -
279 using Y = typename P::range_type;
│ │ │ │ -
280 public:
│ │ │ │ -
282 typedef typename P::domain_type domain_type;
│ │ │ │ -
284 typedef typename P::range_type range_type;
│ │ │ │ - │ │ │ │ -
287
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
303 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
│ │ │ │ -
304 { }
│ │ │ │ -
│ │ │ │ -
305
│ │ │ │ -
│ │ │ │ -
313 NonoverlappingBlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
│ │ │ │ -
314 : _preconditioner(p), _communication(c)
│ │ │ │ -
315 { }
│ │ │ │ -
│ │ │ │ -
316
│ │ │ │ -
│ │ │ │ -
322 virtual void pre (domain_type& x, range_type& b)
│ │ │ │ -
323 {
│ │ │ │ -
324 _preconditioner->pre(x,b);
│ │ │ │ -
325 }
│ │ │ │ -
│ │ │ │ -
326
│ │ │ │ -
│ │ │ │ -
332 virtual void apply (domain_type& v, const range_type& d)
│ │ │ │ -
333 {
│ │ │ │ -
334 // block preconditioner equivalent to WrappedPreconditioner from
│ │ │ │ -
335 // pdelab/backend/ovlpistsolverbackend.hh,
│ │ │ │ -
336 // but not to BlockPreconditioner from schwarz.hh
│ │ │ │ -
337 _preconditioner->apply(v,d);
│ │ │ │ -
338 _communication.addOwnerCopyToOwnerCopy(v,v);
│ │ │ │ -
339 }
│ │ │ │ -
│ │ │ │ -
340
│ │ │ │ -
341 template<bool forward>
│ │ │ │ -
│ │ │ │ -
342 void apply (X& v, const Y& d)
│ │ │ │ -
343 {
│ │ │ │ -
344 _preconditioner->template apply<forward>(v,d);
│ │ │ │ -
345 _communication.addOwnerCopyToOwnerCopy(v,v);
│ │ │ │ -
346 }
│ │ │ │ -
│ │ │ │ -
347
│ │ │ │ -
│ │ │ │ -
353 virtual void post (domain_type& x)
│ │ │ │ -
354 {
│ │ │ │ -
355 _preconditioner->post(x);
│ │ │ │ -
356 }
│ │ │ │ -
│ │ │ │ -
357
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
360 {
│ │ │ │ - │ │ │ │ -
362 }
│ │ │ │ -
│ │ │ │ -
363
│ │ │ │ -
364 private:
│ │ │ │ -
366 std::shared_ptr<P> _preconditioner;
│ │ │ │ -
367
│ │ │ │ -
369 const communication_type& _communication;
│ │ │ │ -
370 };
│ │ │ │ -
│ │ │ │ -
371
│ │ │ │ -
374} // end namespace
│ │ │ │ -
375
│ │ │ │ -
376#endif
│ │ │ │ -
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ -
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
Define base class for scalar product and norm.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ -
The incomplete LU factorization kernels.
│ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ - │ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
│ │ │ │ +
133 inline void fill_row (std::ostream& s, int m, int width, [[maybe_unused]] int precision)
│ │ │ │ +
134 {
│ │ │ │ +
135 for (int j=0; j<m; j++)
│ │ │ │ +
136 {
│ │ │ │ +
137 s << " "; // space in front of each entry
│ │ │ │ +
138 s.width(width); // set width for each entry anew
│ │ │ │ +
139 s << "."; // yeah, the number !
│ │ │ │ +
140 }
│ │ │ │ +
141 }
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
150 template<class K>
│ │ │ │ +
│ │ │ │ +
151 void print_row (std::ostream& s, const K& value,
│ │ │ │ +
152 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type I,
│ │ │ │ +
153 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type J,
│ │ │ │ +
154 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type therow,
│ │ │ │ +
155 int width,
│ │ │ │ +
156 [[maybe_unused]] int precision,
│ │ │ │ +
157 typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr)
│ │ │ │ +
158 {
│ │ │ │ +
159 s << " "; // space in front of each entry
│ │ │ │ +
160 s.width(width); // set width for each entry anew
│ │ │ │ +
161 s << value;
│ │ │ │ +
162 }
│ │ │ │ +
│ │ │ │ +
163
│ │ │ │ +
171 template<class M>
│ │ │ │ +
│ │ │ │ +
172 void print_row (std::ostream& s, const M& A, typename M::size_type I,
│ │ │ │ +
173 typename M::size_type J, typename M::size_type therow,
│ │ │ │ +
174 int width, int precision,
│ │ │ │ +
175 typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ +
176 {
│ │ │ │ +
177 typename M::size_type i0=I;
│ │ │ │ +
178 for (typename M::size_type i=0; i<A.N(); i++)
│ │ │ │ +
179 {
│ │ │ │ +
180 if (therow>=i0 && therow<i0+MatrixDimension<M>::rowdim(A,i))
│ │ │ │ +
181 {
│ │ │ │ +
182 // the row is in this block row !
│ │ │ │ +
183 typename M::size_type j0=J;
│ │ │ │ +
184 for (typename M::size_type j=0; j<A.M(); j++)
│ │ │ │ +
185 {
│ │ │ │ +
186 // find this block
│ │ │ │ +
187 typename M::ConstColIterator it = A[i].find(j);
│ │ │ │ +
188
│ │ │ │ +
189 // print row or filler
│ │ │ │ +
190 if (it!=A[i].end())
│ │ │ │ +
191 print_row(s,*it,i0,j0,therow,width,precision);
│ │ │ │ +
192 else
│ │ │ │ +
193 fill_row(s,MatrixDimension<M>::coldim(A,j),width,precision);
│ │ │ │ +
194
│ │ │ │ +
195 // advance columns
│ │ │ │ + │ │ │ │ +
197 }
│ │ │ │ +
198 }
│ │ │ │ +
199 // advance rows
│ │ │ │ + │ │ │ │ +
201 }
│ │ │ │ +
202 }
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
212 template<class M>
│ │ │ │ +
│ │ │ │ +
213 void printmatrix (std::ostream& s, const M& A, std::string title,
│ │ │ │ +
214 std::string rowtext, int width=10, int precision=2)
│ │ │ │ +
215 {
│ │ │ │ +
216
│ │ │ │ +
217 // remember old flags
│ │ │ │ +
218 std::ios_base::fmtflags oldflags = s.flags();
│ │ │ │ +
219
│ │ │ │ +
220 // set the output format
│ │ │ │ +
221 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
│ │ │ │ +
222 int oldprec = s.precision();
│ │ │ │ +
223 s.precision(precision);
│ │ │ │ +
224
│ │ │ │ +
225 // print title
│ │ │ │ +
226 s << title
│ │ │ │ +
227 << " [n=" << A.N()
│ │ │ │ +
228 << ",m=" << A.M()
│ │ │ │ +
229 << ",rowdim=" << MatrixDimension<M>::rowdim(A)
│ │ │ │ +
230 << ",coldim=" << MatrixDimension<M>::coldim(A)
│ │ │ │ +
231 << "]" << std::endl;
│ │ │ │ +
232
│ │ │ │ +
233 // print all rows
│ │ │ │ +
234 for (typename M::size_type i=0; i<MatrixDimension<M>::rowdim(A); i++)
│ │ │ │ +
235 {
│ │ │ │ +
236 s << rowtext; // start a new row
│ │ │ │ +
237 s << " "; // space in front of each entry
│ │ │ │ +
238 s.width(4); // set width for counter
│ │ │ │ +
239 s << i; // number of first entry in a line
│ │ │ │ +
240 print_row(s,A,0,0,i,width,precision); // generic print
│ │ │ │ +
241 s << std::endl; // start a new line
│ │ │ │ +
242 }
│ │ │ │ +
243
│ │ │ │ +
244 // reset the output format
│ │ │ │ +
245 s.flags(oldflags);
│ │ │ │ +
246 s.precision(oldprec);
│ │ │ │ +
247 }
│ │ │ │ +
│ │ │ │ +
248
│ │ │ │ +
270 template<class B, int n, int m, class A>
│ │ │ │ +
│ │ │ │ +
271 void printSparseMatrix(std::ostream& s,
│ │ │ │ + │ │ │ │ +
273 std::string title, std::string rowtext,
│ │ │ │ +
274 int width=3, int precision=2)
│ │ │ │ +
275 {
│ │ │ │ + │ │ │ │ +
277 // remember old flags
│ │ │ │ +
278 std::ios_base::fmtflags oldflags = s.flags();
│ │ │ │ +
279 // set the output format
│ │ │ │ +
280 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
│ │ │ │ +
281 int oldprec = s.precision();
│ │ │ │ +
282 s.precision(precision);
│ │ │ │ +
283 // print title
│ │ │ │ +
284 s << title
│ │ │ │ +
285 << " [n=" << mat.N()
│ │ │ │ +
286 << ",m=" << mat.M()
│ │ │ │ +
287 << ",rowdim=" << MatrixDimension<Matrix>::rowdim(mat)
│ │ │ │ +
288 << ",coldim=" << MatrixDimension<Matrix>::coldim(mat)
│ │ │ │ +
289 << "]" << std::endl;
│ │ │ │ +
290
│ │ │ │ +
291 typedef typename Matrix::ConstRowIterator Row;
│ │ │ │ +
292
│ │ │ │ +
293 for(Row row=mat.begin(); row != mat.end(); ++row) {
│ │ │ │ +
294 int skipcols=0;
│ │ │ │ +
295 bool reachedEnd=false;
│ │ │ │ +
296
│ │ │ │ +
297 while(!reachedEnd) {
│ │ │ │ +
298 for(int innerrow=0; innerrow<n; ++innerrow) {
│ │ │ │ +
299 int count=0;
│ │ │ │ +
300 typedef typename Matrix::ConstColIterator Col;
│ │ │ │ +
301 Col col=row->begin();
│ │ │ │ +
302 for(; col != row->end(); ++col,++count) {
│ │ │ │ +
303 if(count<skipcols)
│ │ │ │ +
304 continue;
│ │ │ │ +
305 if(count>=skipcols+width)
│ │ │ │ +
306 break;
│ │ │ │ +
307 if(innerrow==0) {
│ │ │ │ +
308 if(count==skipcols) {
│ │ │ │ +
309 s << rowtext; // start a new row
│ │ │ │ +
310 s << " "; // space in front of each entry
│ │ │ │ +
311 s.width(4); // set width for counter
│ │ │ │ +
312 s << row.index()<<": "; // number of first entry in a line
│ │ │ │ +
313 }
│ │ │ │ +
314 s.width(4);
│ │ │ │ +
315 s<<col.index()<<": |";
│ │ │ │ +
316 } else {
│ │ │ │ +
317 if(count==skipcols) {
│ │ │ │ +
318 for(typename std::string::size_type i=0; i < rowtext.length(); i++)
│ │ │ │ +
319 s<<" ";
│ │ │ │ +
320 s<<" ";
│ │ │ │ +
321 }
│ │ │ │ +
322 s<<" |";
│ │ │ │ +
323 }
│ │ │ │ +
324 for(int innercol=0; innercol < m; ++innercol) {
│ │ │ │ +
325 s.width(9);
│ │ │ │ +
326 s<<(*col)[innerrow][innercol]<<" ";
│ │ │ │ +
327 }
│ │ │ │ +
328
│ │ │ │ +
329 s<<"|";
│ │ │ │ +
330 }
│ │ │ │ +
331 if(innerrow==n-1 && col==row->end())
│ │ │ │ +
332 reachedEnd = true;
│ │ │ │ +
333 else
│ │ │ │ +
334 s << std::endl;
│ │ │ │ +
335 }
│ │ │ │ +
336 skipcols += width;
│ │ │ │ +
337 s << std::endl;
│ │ │ │ +
338 }
│ │ │ │ +
339 s << std::endl;
│ │ │ │ +
340 }
│ │ │ │ +
341
│ │ │ │ +
342 // reset the output format
│ │ │ │ +
343 s.flags(oldflags);
│ │ │ │ +
344 s.precision(oldprec);
│ │ │ │ +
345 }
│ │ │ │ +
│ │ │ │ +
346
│ │ │ │ +
347 namespace
│ │ │ │ +
348 {
│ │ │ │ +
349 template<typename T>
│ │ │ │ +
350 struct MatlabPODWriter
│ │ │ │ +
351 {
│ │ │ │ +
352 static std::ostream& write(const T& t, std::ostream& s)
│ │ │ │ +
353 {
│ │ │ │ +
354 s << t;
│ │ │ │ +
355 return s;
│ │ │ │ +
356 }
│ │ │ │ +
357 };
│ │ │ │ +
358 template<typename T>
│ │ │ │ +
359 struct MatlabPODWriter<std::complex<T> >
│ │ │ │ +
360 {
│ │ │ │ +
361 static std::ostream& write(const std::complex<T>& t, std::ostream& s)
│ │ │ │ +
362 {
│ │ │ │ +
363 s << t.real() << " " << t.imag();
│ │ │ │ +
364 return s;
│ │ │ │ +
365 }
│ │ │ │ +
366 };
│ │ │ │ +
367 } // anonymous namespace
│ │ │ │ +
368
│ │ │ │ +
378 template <class FieldType>
│ │ │ │ +
│ │ │ │ +
379 void writeMatrixToMatlabHelper(const FieldType& value,
│ │ │ │ +
380 int rowOffset, int colOffset,
│ │ │ │ +
381 std::ostream& s,
│ │ │ │ +
382 typename std::enable_if_t<Dune::IsNumber<FieldType>::value>* sfinae = nullptr)
│ │ │ │ +
383 {
│ │ │ │ +
384 //+1 for Matlab numbering
│ │ │ │ +
385 s << rowOffset + 1 << " " << colOffset + 1 << " ";
│ │ │ │ +
386 MatlabPODWriter<FieldType>::write(value, s)<< std::endl;
│ │ │ │ +
387 }
│ │ │ │ +
│ │ │ │ +
388
│ │ │ │ +
396 template <class MatrixType>
│ │ │ │ +
│ │ │ │ +
397 void writeMatrixToMatlabHelper(const MatrixType& matrix,
│ │ │ │ +
398 int externalRowOffset, int externalColOffset,
│ │ │ │ +
399 std::ostream& s,
│ │ │ │ +
400 typename std::enable_if_t<!Dune::IsNumber<MatrixType>::value>* sfinae = nullptr)
│ │ │ │ +
401 {
│ │ │ │ +
402 // Precompute the accumulated sizes of the columns
│ │ │ │ +
403 std::vector<typename MatrixType::size_type> colOffset(matrix.M());
│ │ │ │ +
404 if (colOffset.size() > 0)
│ │ │ │ +
405 colOffset[0] = 0;
│ │ │ │ +
406
│ │ │ │ +
407 for (typename MatrixType::size_type i=0; i<matrix.M()-1; i++)
│ │ │ │ +
408 colOffset[i+1] = colOffset[i] +
│ │ │ │ + │ │ │ │ +
410
│ │ │ │ +
411 typename MatrixType::size_type rowOffset = 0;
│ │ │ │ +
412
│ │ │ │ +
413 // Loop over all matrix rows
│ │ │ │ +
414 for (typename MatrixType::size_type rowIdx=0; rowIdx<matrix.N(); rowIdx++)
│ │ │ │ +
415 {
│ │ │ │ +
416 auto cIt = matrix[rowIdx].begin();
│ │ │ │ +
417 auto cEndIt = matrix[rowIdx].end();
│ │ │ │ +
418
│ │ │ │ +
419 // Loop over all columns in this row
│ │ │ │ +
420 for (; cIt!=cEndIt; ++cIt)
│ │ │ │ + │ │ │ │ +
422 externalRowOffset+rowOffset,
│ │ │ │ +
423 externalColOffset + colOffset[cIt.index()],
│ │ │ │ +
424 s);
│ │ │ │ +
425
│ │ │ │ +
426 rowOffset += MatrixDimension<MatrixType>::rowdim(matrix, rowIdx);
│ │ │ │ +
427 }
│ │ │ │ +
428
│ │ │ │ +
429 }
│ │ │ │ +
│ │ │ │ +
430
│ │ │ │ +
450 template <class MatrixType>
│ │ │ │ +
│ │ │ │ +
451 void writeMatrixToMatlab(const MatrixType& matrix,
│ │ │ │ +
452 const std::string& filename, int outputPrecision = 18)
│ │ │ │ +
453 {
│ │ │ │ +
454 std::ofstream outStream(filename.c_str());
│ │ │ │ +
455 int oldPrecision = outStream.precision();
│ │ │ │ +
456 outStream.precision(outputPrecision);
│ │ │ │ +
457
│ │ │ │ +
458 writeMatrixToMatlabHelper(matrix, 0, 0, outStream);
│ │ │ │ +
459 outStream.precision(oldPrecision);
│ │ │ │ +
460 }
│ │ │ │ +
│ │ │ │ +
461
│ │ │ │ +
462 // Recursively write vector entries to a stream
│ │ │ │ +
463 template<class V>
│ │ │ │ +
│ │ │ │ +
464 void writeVectorToMatlabHelper (const V& v, std::ostream& stream)
│ │ │ │ +
465 {
│ │ │ │ +
466 if constexpr (IsNumber<V>()) {
│ │ │ │ +
467 stream << v << std::endl;
│ │ │ │ +
468 } else {
│ │ │ │ +
469 for (const auto& entry : v)
│ │ │ │ +
470 writeVectorToMatlabHelper(entry, stream);
│ │ │ │ +
471 }
│ │ │ │ +
472 }
│ │ │ │ +
│ │ │ │ +
473
│ │ │ │ +
491 template <class VectorType>
│ │ │ │ +
│ │ │ │ +
492 void writeVectorToMatlab(const VectorType& vector,
│ │ │ │ +
493 const std::string& filename, int outputPrecision = 18)
│ │ │ │ +
494 {
│ │ │ │ +
495 std::ofstream outStream(filename.c_str());
│ │ │ │ +
496 int oldPrecision = outStream.precision();
│ │ │ │ +
497 outStream.precision(outputPrecision);
│ │ │ │ +
498
│ │ │ │ +
499 writeVectorToMatlabHelper(vector, outStream);
│ │ │ │ +
500 outStream.precision(oldPrecision);
│ │ │ │ +
501 }
│ │ │ │ +
│ │ │ │ +
502
│ │ │ │ +
503 namespace Impl {
│ │ │ │ +
504
│ │ │ │ +
506 struct NullStream {
│ │ │ │ +
507 template <class Any>
│ │ │ │ +
508 friend NullStream &operator<<(NullStream &dev0, Any &&) {
│ │ │ │ +
509 return dev0;
│ │ │ │ +
510 }
│ │ │ │ +
511 };
│ │ │ │ +
512
│ │ │ │ +
514 // svg shall be closed with a group and an svg. i.e. "</g></svg>"
│ │ │ │ +
515 template <class Stream, class SVGMatrixOptions>
│ │ │ │ +
516 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts,
│ │ │ │ +
517 std::pair<std::size_t, size_t> offsets) {
│ │ │ │ +
518 auto [col_offset, row_offset] = offsets;
│ │ │ │ +
519 double width = opts.width;
│ │ │ │ +
520 double height = opts.height;
│ │ │ │ +
521 // if empty, we try to figure out a sensible value of width and height
│ │ │ │ +
522 if (opts.width == 0 and opts.height == 0)
│ │ │ │ +
523 width = height = 500;
│ │ │ │ +
524 if (opts.width == 0)
│ │ │ │ +
525 width = opts.height * (double(col_offset) / row_offset);
│ │ │ │ +
526 if (opts.height == 0)
│ │ │ │ +
527 height = opts.width * (double(row_offset) / col_offset);
│ │ │ │ +
528
│ │ │ │ +
529 // scale group w.r.t final offsets
│ │ │ │ +
530 double scale_width = width / col_offset;
│ │ │ │ +
531 double scale_height = height / row_offset;
│ │ │ │ +
532
│ │ │ │ +
533 // write the header text
│ │ │ │ +
534 out << "<svg xmlns='http://www.w3.org/2000/svg' width='" << std::ceil(width)
│ │ │ │ +
535 << "' height='" << std::ceil(height) << "' version='1.1'>\n"
│ │ │ │ +
536 << "<style>\n"
│ │ │ │ +
537 << opts.style << "</style>\n"
│ │ │ │ +
538 << "<g transform='scale(" << scale_width << " " << scale_height
│ │ │ │ +
539 << ")'>\n";
│ │ │ │ +
540 }
│ │ │ │ +
541
│ │ │ │ +
543 template <class Mat, class Stream, class SVGMatrixOptions,
│ │ │ │ +
544 class RowPrefix, class ColPrefix>
│ │ │ │ +
545 std::pair<std::size_t, size_t>
│ │ │ │ +
546 writeSVGMatrix(const Mat &mat, Stream &out, SVGMatrixOptions opts,
│ │ │ │ +
547 RowPrefix row_prefix, ColPrefix col_prefix) {
│ │ │ │ +
548 // get values to fill the offests
│ │ │ │ +
549 const auto& block_size = opts.block_size;
│ │ │ │ +
550 const auto& interspace = opts.interspace;
│ │ │ │ +
551
│ │ │ │ +
552 const std::size_t rows = mat.N();
│ │ │ │ +
553 const std::size_t cols = mat.M();
│ │ │ │ +
554
│ │ │ │ +
555 // disable header write for recursive calls
│ │ │ │ +
556 const bool write_header = opts.write_header;
│ │ │ │ +
557 opts.write_header = false;
│ │ │ │ +
558
│ │ │ │ +
559 // counter of offsets for every block
│ │ │ │ +
560 std::size_t row_offset = interspace;
│ │ │ │ +
561 std::size_t col_offset = interspace;
│ │ │ │ +
562
│ │ │ │ +
563 // lambda helper: for-each value
│ │ │ │ +
564 auto for_each_entry = [&mat](const auto &call_back) {
│ │ │ │ +
565 for (auto row_it = mat.begin(); row_it != mat.end(); ++row_it) {
│ │ │ │ +
566 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) {
│ │ │ │ +
567 call_back(row_it.index(), col_it.index(), *col_it);
│ │ │ │ +
568 }
│ │ │ │ +
569 }
│ │ │ │ +
570 };
│ │ │ │ +
571
│ │ │ │ +
572 // accumulate content in another stream so that we write in correct order
│ │ │ │ +
573 std::stringstream ss;
│ │ │ │ +
574
│ │ │ │ +
575 // we need to append current row and col values to the prefixes
│ │ │ │ +
576 row_prefix.push_back(0);
│ │ │ │ +
577 col_prefix.push_back(0);
│ │ │ │ +
578
│ │ │ │ +
579 // do we need to write nested matrix blocks?
│ │ │ │ +
580 if constexpr (Dune::blockLevel<typename Mat::block_type>() == 0) {
│ │ │ │ +
581 // simple case: write svg block content to stream for each value
│ │ │ │ +
582 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
│ │ │ │ +
583 std::size_t x_off = interspace + col * (interspace + block_size);
│ │ │ │ +
584 std::size_t y_off = interspace + row * (interspace + block_size);
│ │ │ │ +
585 row_prefix.back() = row;
│ │ │ │ +
586 col_prefix.back() = col;
│ │ │ │ +
587 opts.writeSVGBlock(ss, row_prefix, col_prefix, val,
│ │ │ │ +
588 {x_off, y_off, block_size, block_size});
│ │ │ │ +
589 });
│ │ │ │ +
590 col_offset += cols * (block_size + interspace);
│ │ │ │ +
591 row_offset += rows * (block_size + interspace);
│ │ │ │ +
592 } else {
│ │ │ │ +
593 // before we write anything, we need to calculate the
│ │ │ │ +
594 // offset for every {row,col} index
│ │ │ │ +
595 const auto null_offset = std::numeric_limits<std::size_t>::max();
│ │ │ │ +
596 std::vector<std::size_t> col_offsets(cols + 1, null_offset);
│ │ │ │ +
597 std::vector<std::size_t> row_offsets(rows + 1, null_offset);
│ │ │ │ +
598 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
│ │ │ │ +
599 NullStream dev0;
│ │ │ │ +
600 // get size of sub-block
│ │ │ │ +
601 auto sub_size =
│ │ │ │ +
602 writeSVGMatrix(val, dev0, opts, row_prefix, col_prefix);
│ │ │ │ +
603
│ │ │ │ +
604 // if we didn't see col size before
│ │ │ │ +
605 if (col_offsets[col + 1] == null_offset) // write it in the offset vector
│ │ │ │ +
606 col_offsets[col + 1] = sub_size.first;
│ │ │ │ +
607
│ │ │ │ +
608 // repeat proces for row sizes
│ │ │ │ +
609 if (row_offsets[row + 1] == null_offset)
│ │ │ │ +
610 row_offsets[row + 1] = sub_size.second;
│ │ │ │ +
611 });
│ │ │ │ +
612
│ │ │ │ +
613 // if some rows/cols were not visited, make an educated guess with the minimum offset
│ │ │ │ +
614 auto min_row_offset = *std::min_element(begin(row_offsets), end(row_offsets));
│ │ │ │ +
615 std::replace(begin(row_offsets), end(row_offsets), null_offset, min_row_offset);
│ │ │ │ +
616 auto min_col_offset = *std::min_element(begin(col_offsets), end(col_offsets));
│ │ │ │ +
617 std::replace(begin(col_offsets), end(col_offsets), null_offset, min_col_offset);
│ │ │ │ +
618
│ │ │ │ +
619 // we have sizes for every block: to get offsets we make a partial sum
│ │ │ │ +
620 col_offsets[0] = interspace;
│ │ │ │ +
621 row_offsets[0] = interspace;
│ │ │ │ +
622 for (std::size_t i = 1; i < col_offsets.size(); i++)
│ │ │ │ +
623 col_offsets[i] += col_offsets[i - 1] + interspace;
│ │ │ │ +
624 for (std::size_t i = 1; i < row_offsets.size(); i++)
│ │ │ │ +
625 row_offsets[i] += row_offsets[i - 1] + interspace;
│ │ │ │ +
626
│ │ │ │ +
627 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
│ │ │ │ +
628 // calculate svg view from offsets
│ │ │ │ +
629 std::size_t width =
│ │ │ │ +
630 col_offsets[col + 1] - col_offsets[col] - interspace;
│ │ │ │ +
631 std::size_t height =
│ │ │ │ +
632 row_offsets[row + 1] - row_offsets[row] - interspace;
│ │ │ │ +
633 row_prefix.back() = row;
│ │ │ │ +
634 col_prefix.back() = col;
│ │ │ │ +
635 // content of the sub-block has origin at {0,0}: shift it to the correct place
│ │ │ │ +
636 ss << "<svg x='" << col_offsets[col] << "' y='" << row_offsets[row]
│ │ │ │ +
637 << "' width='" << width << "' height='" << height << "'>\n";
│ │ │ │ +
638 // write a nested svg with the contents of the sub-block
│ │ │ │ +
639 writeSVGMatrix(val, ss, opts, row_prefix, col_prefix);
│ │ │ │ +
640 ss << "</svg>\n";
│ │ │ │ +
641 });
│ │ │ │ +
642 col_offset = col_offsets.back();
│ │ │ │ +
643 row_offset = row_offsets.back();
│ │ │ │ +
644 }
│ │ │ │ +
645
│ │ │ │ +
646 // write content in order!
│ │ │ │ +
647 // (i) if required, first header
│ │ │ │ +
648 if (write_header)
│ │ │ │ +
649 writeSVGMatrixHeader(out, opts, {col_offset, row_offset});
│ │ │ │ +
650
│ │ │ │ +
651 col_prefix.pop_back();
│ │ │ │ +
652 row_prefix.pop_back();
│ │ │ │ +
653 // (ii) an svg block for this level
│ │ │ │ +
654 opts.writeSVGBlock(out, row_prefix, col_prefix, mat,
│ │ │ │ +
655 {0, 0, col_offset, row_offset});
│ │ │ │ +
656 // (iii) the content of the matrix
│ │ │ │ +
657 out << ss.str();
│ │ │ │ +
658 // (iv) if required, close the header
│ │ │ │ +
659 if (write_header)
│ │ │ │ +
660 out << "</g>\n</svg>\n";
│ │ │ │ +
661
│ │ │ │ +
662 // return the total required for this block
│ │ │ │ +
663 return {col_offset, row_offset};
│ │ │ │ +
664 }
│ │ │ │ +
665 } // namespace Impl
│ │ │ │ +
666
│ │ │ │ +
667
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
676 std::size_t block_size = 10;
│ │ │ │ +
678 std::size_t interspace = 5;
│ │ │ │ +
680 std::size_t width = 500;
│ │ │ │ +
682 std::size_t height = 0;
│ │ │ │ +
684 bool write_header = true;
│ │ │ │ +
686 std::string style = " .matrix-block {\n"
│ │ │ │ +
687 " fill: cornflowerblue;\n"
│ │ │ │ +
688 " fill-opacity: 0.4;\n"
│ │ │ │ +
689 " stroke-width: 2;\n"
│ │ │ │ +
690 " stroke: black;\n"
│ │ │ │ +
691 " stroke-opacity: 0.5;\n"
│ │ │ │ +
692 " }\n"
│ │ │ │ +
693 " .matrix-block:hover {\n"
│ │ │ │ +
694 " fill: lightcoral;\n"
│ │ │ │ +
695 " fill-opacity: 0.4;\n"
│ │ │ │ +
696 " stroke-opacity: 1;\n"
│ │ │ │ +
697 " }\n";
│ │ │ │ +
698
│ │ │ │ +
710 std::function<std::string(const double&)> color_fill;
│ │ │ │ +
711
│ │ │ │ +
717 template <class RowPrefix, class ColPrefix>
│ │ │ │ +
│ │ │ │ +
718 std::string blockStyleClass(const RowPrefix &row_prefix,
│ │ │ │ +
719 const ColPrefix &col_prefix) const {
│ │ │ │ +
720 // here, you can potentially give a different style to each block
│ │ │ │ +
721 return "matrix-block";
│ │ │ │ +
722 }
│ │ │ │ +
│ │ │ │ +
723
│ │ │ │ +
725 bool write_block_title = true;
│ │ │ │ +
726
│ │ │ │ +
732 template <class Stream, class RowPrefix, class ColPrefix, class Block>
│ │ │ │ +
│ │ │ │ +
733 void writeBlockTitle(Stream& out, const RowPrefix &row_prefix,
│ │ │ │ +
734 const ColPrefix &col_prefix,
│ │ │ │ +
735 const Block &block) const {
│ │ │ │ +
736 if (this->write_block_title) {
│ │ │ │ +
737 out << "<title>";
│ │ │ │ +
738 assert(row_prefix.size() == col_prefix.size());
│ │ │ │ +
739 for (std::size_t i = 0; i < row_prefix.size(); ++i)
│ │ │ │ +
740 out << "[" << row_prefix[i] << ", "<< col_prefix[i] << "]";
│ │ │ │ +
741 if constexpr (Dune::blockLevel<Block>() == 0)
│ │ │ │ +
742 out << ": " << block;
│ │ │ │ +
743 out << "</title>\n";
│ │ │ │ +
744 }
│ │ │ │ +
745 }
│ │ │ │ +
│ │ │ │ +
746
│ │ │ │ +
768 template <class Stream, class RowPrefix, class ColPrefix, class Block>
│ │ │ │ +
│ │ │ │ +
769 void writeSVGBlock(Stream &out,
│ │ │ │ +
770 const RowPrefix &row_prefix,
│ │ │ │ +
771 const ColPrefix &col_prefix, const Block block,
│ │ │ │ +
772 const std::array<std::size_t, 4> &svg_box) const {
│ │ │ │ +
773 // get bounding box values
│ │ │ │ +
774 auto &[x_off, y_off, width, height] = svg_box;
│ │ │ │ +
775 // get style class
│ │ │ │ +
776 std::string block_class = this->blockStyleClass(row_prefix, col_prefix);
│ │ │ │ +
777 // write a rectangle on the bounding box
│ │ │ │ +
778 out << "<rect class='" << block_class << "' x='" << x_off << "' y='"
│ │ │ │ +
779 << y_off << "' width='" << width << "' height='" << height << "'";
│ │ │ │ +
780 if constexpr (Dune::blockLevel<Block>() == 0 and std::is_convertible<Block,double>{})
│ │ │ │ +
781 if (color_fill)
│ │ │ │ +
782 out << " style='fill-opacity: 1;fill:" << color_fill(double(block)) << "'";
│ │ │ │ +
783
│ │ │ │ +
784 out << ">\n";
│ │ │ │ +
785 // give the rectangle a title (in html this shows info about the block)
│ │ │ │ +
786 this->writeBlockTitle(out,row_prefix, col_prefix, block);
│ │ │ │ +
787 // close rectangle
│ │ │ │ +
788 out << "</rect>\n";
│ │ │ │ +
789 }
│ │ │ │ +
│ │ │ │ +
790 };
│ │ │ │ +
│ │ │ │ +
791
│ │ │ │ +
806 template <class Mat, class SVGOptions = DefaultSVGMatrixOptions>
│ │ │ │ +
│ │ │ │ +
807 void writeSVGMatrix(const Mat &mat, std::ostream &out,
│ │ │ │ +
808 SVGOptions opts = {}) {
│ │ │ │ +
809 // We need a vector that can fit all the multi-indices for rows and colums
│ │ │ │ +
810 using IndexPrefix = Dune::ReservedVector<std::size_t, blockLevel<Mat>()>;
│ │ │ │ +
811 // Call overload for Mat type
│ │ │ │ +
812 Impl::writeSVGMatrix(mat, out, opts, IndexPrefix{}, IndexPrefix{});
│ │ │ │ +
813 }
│ │ │ │ +
│ │ │ │ +
814
│ │ │ │ +
817} // namespace Dune
│ │ │ │ +
818
│ │ │ │ +
819#endif
│ │ │ │ + │ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Some handy generic functions for ISTL matrices.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
void writeSVGMatrix(const Mat &mat, std::ostream &out, SVGOptions opts={})
Writes the visualization of matrix in the SVG format.
Definition io.hh:807
│ │ │ │ +
void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename, int outputPrecision=18)
Writes sparse matrix in a Matlab-readable format.
Definition io.hh:451
│ │ │ │ +
void print_row(std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1 >::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
Print one row of a matrix, specialization for number types.
Definition io.hh:151
│ │ │ │ +
void printmatrix(std::ostream &s, const M &A, std::string title, std::string rowtext, int width=10, int precision=2)
Print a generic block matrix.
Definition io.hh:213
│ │ │ │ +
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition io.hh:89
│ │ │ │ +
void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int colOffset, std::ostream &s, typename std::enable_if_t< Dune::IsNumber< FieldType >::value > *sfinae=nullptr)
Helper method for the writeMatrixToMatlab routine.
Definition io.hh:379
│ │ │ │ +
void writeVectorToMatlabHelper(const V &v, std::ostream &stream)
Definition io.hh:464
│ │ │ │ +
void writeVectorToMatlab(const VectorType &vector, const std::string &filename, int outputPrecision=18)
Writes vectors in a Matlab-readable format.
Definition io.hh:492
│ │ │ │ +
void recursive_printvector(std::ostream &s, const V &v, std::string rowtext, int &counter, int columns, int width)
Recursively print a vector.
Definition io.hh:52
│ │ │ │ +
void printSparseMatrix(std::ostream &s, const BCRSMatrix< FieldMatrix< B, n, m >, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
Prints a BCRSMatrix with fixed sized blocks.
Definition io.hh:271
│ │ │ │ +
void fill_row(std::ostream &s, int m, int width, int precision)
Print a row of zeros for a non-existing block.
Definition io.hh:133
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │ -
C::PIS PIS
Definition novlpschwarz.hh:74
│ │ │ │ -
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:72
│ │ │ │ -
std::multimap< int, std::pair< int, RILIterator > > RIMap
Definition novlpschwarz.hh:82
│ │ │ │ -
C::RI RI
Definition novlpschwarz.hh:75
│ │ │ │ -
void novlp_op_apply(const X &x, Y &y, field_type alpha) const
Definition novlpschwarz.hh:126
│ │ │ │ -
NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const communication_type &com)
Definition novlpschwarz.hh:96
│ │ │ │ -
M::ConstColIterator ColIterator
Definition novlpschwarz.hh:79
│ │ │ │ -
virtual void apply(const X &x, Y &y) const
apply operator to x:
Definition novlpschwarz.hh:101
│ │ │ │ -
X domain_type
The type of the domain.
Definition novlpschwarz.hh:66
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the linear operator (see SolverCategory::Category)
Definition novlpschwarz.hh:235
│ │ │ │ -
RIMap::iterator RIMapit
Definition novlpschwarz.hh:83
│ │ │ │ -
virtual const matrix_type & getmat() const
get matrix via *
Definition novlpschwarz.hh:121
│ │ │ │ -
RIL::const_iterator RILIterator
Definition novlpschwarz.hh:78
│ │ │ │ -
std::multimap< int, int > MM
Definition novlpschwarz.hh:81
│ │ │ │ -
Y range_type
The type of the range.
Definition novlpschwarz.hh:68
│ │ │ │ -
M matrix_type
The type of the matrix we operate on.
Definition novlpschwarz.hh:64
│ │ │ │ -
M::ConstRowIterator RowIterator
Definition novlpschwarz.hh:80
│ │ │ │ -
const communication_type & getCommunication() const
Get the object responsible for communication.
Definition novlpschwarz.hh:241
│ │ │ │ -
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
apply operator to x, scale and add:
Definition novlpschwarz.hh:109
│ │ │ │ -
RI::RemoteIndexList RIL
Definition novlpschwarz.hh:76
│ │ │ │ -
X::field_type field_type
The field type of the range.
Definition novlpschwarz.hh:70
│ │ │ │ -
NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
constructor: just store a reference to a matrix.
Definition novlpschwarz.hh:92
│ │ │ │ -
RI::const_iterator RIIterator
Definition novlpschwarz.hh:77
│ │ │ │ -
Nonoverlapping parallel preconditioner.
Definition novlpschwarz.hh:276
│ │ │ │ -
NonoverlappingBlockPreconditioner(P &p, const communication_type &c)
Constructor.
Definition novlpschwarz.hh:302
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition novlpschwarz.hh:359
│ │ │ │ -
virtual void apply(domain_type &v, const range_type &d)
Apply the preconditioner.
Definition novlpschwarz.hh:332
│ │ │ │ -
P::range_type range_type
The range type of the preconditioner.
Definition novlpschwarz.hh:284
│ │ │ │ -
NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
Constructor.
Definition novlpschwarz.hh:313
│ │ │ │ -
virtual void post(domain_type &x)
Clean up.
Definition novlpschwarz.hh:353
│ │ │ │ -
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:286
│ │ │ │ -
virtual void pre(domain_type &x, range_type &b)
Prepare the preconditioner.
Definition novlpschwarz.hh:322
│ │ │ │ -
void apply(X &v, const Y &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition novlpschwarz.hh:342
│ │ │ │ -
P::domain_type domain_type
The domain type of the preconditioner.
Definition novlpschwarz.hh:282
│ │ │ │ -
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ -
@ owner
Definition owneroverlapcopy.hh:61
│ │ │ │ -
@ copy
Definition owneroverlapcopy.hh:61
│ │ │ │ -
@ overlap
Definition owneroverlapcopy.hh:61
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ +
Definition matrixutils.hh:211
│ │ │ │ +
static auto coldim(const M &A)
Definition matrixutils.hh:219
│ │ │ │ +
static auto rowdim(const M &A)
Definition matrixutils.hh:214
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
Default options class to write SVG matrices.
Definition io.hh:674
│ │ │ │ +
std::string style
CSS style block to write in header.
Definition io.hh:686
│ │ │ │ +
std::size_t width
Final width size (pixels) of the SVG header. If 0, size is automatic.
Definition io.hh:680
│ │ │ │ +
std::function< std::string(const double &)> color_fill
Color fill for default options.
Definition io.hh:710
│ │ │ │ +
std::size_t block_size
size (pixels) of the deepst block/value of the matrix
Definition io.hh:676
│ │ │ │ +
void writeSVGBlock(Stream &out, const RowPrefix &row_prefix, const ColPrefix &col_prefix, const Block block, const std::array< std::size_t, 4 > &svg_box) const
Write an SVG object for a given block/value in the matrix.
Definition io.hh:769
│ │ │ │ +
void writeBlockTitle(Stream &out, const RowPrefix &row_prefix, const ColPrefix &col_prefix, const Block &block) const
Helper function writes a title for a given block and prefix.
Definition io.hh:733
│ │ │ │ +
std::size_t interspace
size (pixels) of the interspace between blocks
Definition io.hh:678
│ │ │ │ +
bool write_block_title
(Helper) Whether to write a title on the rectangle value
Definition io.hh:725
│ │ │ │ +
std::size_t height
Final height size (pixels) of the SVG header. If 0, size is automatic.
Definition io.hh:682
│ │ │ │ +
bool write_header
Whether to write the SVG header.
Definition io.hh:684
│ │ │ │ +
std::string blockStyleClass(const RowPrefix &row_prefix, const ColPrefix &col_prefix) const
Helper function that returns an style class for a given prefix.
Definition io.hh:718
│ │ │ │ +
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ +
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ +
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ +
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ +
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,474 +1,801 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -novlpschwarz.hh │ │ │ │ │ +io.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH │ │ │ │ │ -6#define DUNE_ISTL_NOVLPSCHWARZ_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_IO_HH │ │ │ │ │ +6#define DUNE_ISTL_IO_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include // for input/output to shell │ │ │ │ │ -9#include // for input/output to files │ │ │ │ │ -10#include // STL vector class │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include // Yes, we do some math here │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include │ │ │ │ │ -18 │ │ │ │ │ -19#include "_i_o_._h_h" │ │ │ │ │ -20#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -21#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -22#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -23#include "_i_o_._h_h" │ │ │ │ │ -24#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -25#include "_i_l_u_._h_h" │ │ │ │ │ -26#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ -27#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ -28#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ -29#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ -30#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ -31 │ │ │ │ │ -32namespace _D_u_n_e { │ │ │ │ │ -33 │ │ │ │ │ -59 template │ │ │ │ │ -_6_0 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r : public _A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -61 { │ │ │ │ │ -62 public: │ │ │ │ │ -_6_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_6_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_6_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_7_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_7_2 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ -73 │ │ │ │ │ -_7_4 typedef typename C::PIS _P_I_S; │ │ │ │ │ -_7_5 typedef typename C::RI _R_I; │ │ │ │ │ -_7_6 typedef typename RI::RemoteIndexList _R_I_L; │ │ │ │ │ -_7_7 typedef typename RI::const_iterator _R_I_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_8 typedef typename RIL::const_iterator _R_I_L_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_9 typedef typename M::ConstColIterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -_8_0 typedef typename M::ConstRowIterator _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -_8_1 typedef std::multimap _M_M; │ │ │ │ │ -_8_2 typedef std::multimap > _R_I_M_a_p; │ │ │ │ │ -_8_3 typedef typename RIMap::iterator _R_I_M_a_p_i_t; │ │ │ │ │ -84 │ │ │ │ │ -_9_2 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (const _m_a_t_r_i_x___t_y_p_e& A, const │ │ │ │ │ -_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com) │ │ │ │ │ -93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true) │ │ │ │ │ -94 {} │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ +17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22 │ │ │ │ │ +23#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +25 │ │ │ │ │ +26namespace _D_u_n_e { │ │ │ │ │ +27 │ │ │ │ │ +40 // │ │ │ │ │ +41 // pretty printing of vectors │ │ │ │ │ +42 // │ │ │ │ │ +43 │ │ │ │ │ +51 template │ │ │ │ │ +_5_2 void _r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r (std::ostream& s, const V& v, std::string │ │ │ │ │ +rowtext, │ │ │ │ │ +53 int& counter, int columns, int width) │ │ │ │ │ +54 { │ │ │ │ │ +55 if constexpr (IsNumber()) │ │ │ │ │ +56 { │ │ │ │ │ +57 // Print one number │ │ │ │ │ +58 if (counter%columns==0) │ │ │ │ │ +59 { │ │ │ │ │ +60 s << rowtext; // start a new row │ │ │ │ │ +61 s << " "; // space in front of each entry │ │ │ │ │ +62 s.width(4); // set width for counter │ │ │ │ │ +63 s << counter; // number of first entry in a line │ │ │ │ │ +64 } │ │ │ │ │ +65 s << " "; // space in front of each entry │ │ │ │ │ +66 s.width(width); // set width for each entry anew │ │ │ │ │ +67 s << v; // yeah, the number ! │ │ │ │ │ +68 counter++; // increment the counter │ │ │ │ │ +69 if (counter%columns==0) │ │ │ │ │ +70 s << std::endl; // start a new line │ │ │ │ │ +71 } │ │ │ │ │ +72 else │ │ │ │ │ +73 { │ │ │ │ │ +74 // Recursively print a vector │ │ │ │ │ +75 for (const auto& entry : v) │ │ │ │ │ +76 _r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r(s,entry,rowtext,counter,columns,width); │ │ │ │ │ +77 } │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +80 │ │ │ │ │ +88 template │ │ │ │ │ +_8_9 void _p_r_i_n_t_v_e_c_t_o_r (std::ostream& s, const V& v, std::string title, │ │ │ │ │ +90 std::string rowtext, int columns=1, int width=10, │ │ │ │ │ +91 int precision=2) │ │ │ │ │ +92 { │ │ │ │ │ +93 // count the numbers printed to make columns │ │ │ │ │ +94 int counter=0; │ │ │ │ │ 95 │ │ │ │ │ -_9_6 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (std::shared_ptr A, const │ │ │ │ │ -_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com) │ │ │ │ │ -97 : _A_(A), communication(com), buildcomm(true) │ │ │ │ │ -98 {} │ │ │ │ │ -99 │ │ │ │ │ -_1_0_1 virtual void _a_p_p_l_y (const X& x, Y& y) const │ │ │ │ │ -102 { │ │ │ │ │ -103 y = 0; │ │ │ │ │ -104 _n_o_v_l_p___o_p___a_p_p_l_y(x,y,1); │ │ │ │ │ -105 communication.addOwnerCopyToOwnerCopy(y,y); │ │ │ │ │ -106 } │ │ │ │ │ +96 // remember old flags │ │ │ │ │ +97 std::ios_base::fmtflags oldflags = s.flags(); │ │ │ │ │ +98 │ │ │ │ │ +99 // set the output format │ │ │ │ │ +100 s.setf(std::ios_base::scientific, std::ios_base::floatfield); │ │ │ │ │ +101 int oldprec = s.precision(); │ │ │ │ │ +102 s.precision(precision); │ │ │ │ │ +103 │ │ │ │ │ +104 // print title │ │ │ │ │ +105 s << title << " [blocks=" << v.N() << ",dimension=" << v.dim() << "]" │ │ │ │ │ +106 << std::endl; │ │ │ │ │ 107 │ │ │ │ │ -_1_0_9 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (_f_i_e_l_d___t_y_p_e alpha, const X& x, Y& y) const │ │ │ │ │ -110 { │ │ │ │ │ -111 // only apply communication to alpha*A*x to make it consistent, │ │ │ │ │ -112 // y already has to be consistent. │ │ │ │ │ -113 Y y1(y); │ │ │ │ │ -114 y = 0; │ │ │ │ │ -115 _n_o_v_l_p___o_p___a_p_p_l_y(x,y,alpha); │ │ │ │ │ -116 communication.addOwnerCopyToOwnerCopy(y,y); │ │ │ │ │ -117 y += y1; │ │ │ │ │ +108 // print data from all blocks │ │ │ │ │ +109 _r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r(s,v,rowtext,counter,columns,width); │ │ │ │ │ +110 │ │ │ │ │ +111 // check if new line is required │ │ │ │ │ +112 if (counter%columns!=0) │ │ │ │ │ +113 s << std::endl; │ │ │ │ │ +114 │ │ │ │ │ +115 // reset the output format │ │ │ │ │ +116 s.flags(oldflags); │ │ │ │ │ +117 s.precision(oldprec); │ │ │ │ │ 118 } │ │ │ │ │ 119 │ │ │ │ │ -_1_2_1 virtual const _m_a_t_r_i_x___t_y_p_e& _g_e_t_m_a_t () const │ │ │ │ │ -122 { │ │ │ │ │ -123 return *_A_; │ │ │ │ │ -124 } │ │ │ │ │ +120 │ │ │ │ │ +122 // │ │ │ │ │ +123 // pretty printing of matrices │ │ │ │ │ +124 // │ │ │ │ │ 125 │ │ │ │ │ -_1_2_6 void _n_o_v_l_p___o_p___a_p_p_l_y (const X& x, Y& y, _f_i_e_l_d___t_y_p_e alpha) const │ │ │ │ │ -127 { │ │ │ │ │ -128 //get index sets │ │ │ │ │ -129 const _P_I_S& pis=communication.indexSet(); │ │ │ │ │ -130 const _R_I& ri = communication.remoteIndices(); │ │ │ │ │ -131 │ │ │ │ │ -132 // at the beginning make a multimap "bordercontribution". │ │ │ │ │ -133 // process has i and j as border dofs but is not the owner │ │ │ │ │ -134 // => only contribute to Ax if i,j is in bordercontribution │ │ │ │ │ -135 if (buildcomm == true) { │ │ │ │ │ -136 │ │ │ │ │ -137 // set up mask vector │ │ │ │ │ -138 if (mask.size()!=static_cast::size_type> │ │ │ │ │ -(x.size())) { │ │ │ │ │ -139 mask.resize(x.size()); │ │ │ │ │ -140 for (typename std::vector::size_type i=0; ilocal().attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ -144 mask[i->local().local()] = 0; │ │ │ │ │ -145 else if (i->local().attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ -146 mask[i->local().local()] = 2; │ │ │ │ │ -147 } │ │ │ │ │ -148 │ │ │ │ │ -149 for (MM::iterator iter = bordercontribution.begin(); │ │ │ │ │ -150 iter != bordercontribution.end(); ++iter) │ │ │ │ │ -151 bordercontribution.erase(iter); │ │ │ │ │ -152 std::map owner; //key: local index i, value: process, that owns i │ │ │ │ │ -153 _R_I_M_a_p rimap; │ │ │ │ │ -154 │ │ │ │ │ -155 // for each local index make multimap rimap: │ │ │ │ │ -156 // key: local index i, data: pair of process that knows i and pointer to RI │ │ │ │ │ -entry │ │ │ │ │ -157 for (_R_o_w_I_t_e_r_a_t_o_r i = _A_->begin(); i != _A_->end(); ++i) │ │ │ │ │ -158 if (mask[i.index()] == 0) │ │ │ │ │ -159 for (_R_I_I_t_e_r_a_t_o_r remote = ri.begin(); remote != ri.end(); ++remote) { │ │ │ │ │ -160 _R_I_L& ril = *(remote->second.first); │ │ │ │ │ -161 for (_R_I_L_I_t_e_r_a_t_o_r rindex = ril.begin(); rindex != ril.end(); ++rindex) │ │ │ │ │ -162 if (rindex->attribute() != _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ -163 if (rindex->localIndexPair().local().local() == i.index()) { │ │ │ │ │ -164 rimap.insert │ │ │ │ │ -165 (std::make_pair(i.index(), │ │ │ │ │ -166 std::pair(remote->first, rindex))); │ │ │ │ │ -167 if(rindex->attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ -168 owner.insert(std::make_pair(i.index(),remote->first)); │ │ │ │ │ -169 } │ │ │ │ │ -170 } │ │ │ │ │ -171 │ │ │ │ │ -172 int iowner = 0; │ │ │ │ │ -173 for (_R_o_w_I_t_e_r_a_t_o_r i = _A_->begin(); i != _A_->end(); ++i) { │ │ │ │ │ -174 if (mask[i.index()] == 0) { │ │ │ │ │ -175 std::map::iterator it = owner.find(i.index()); │ │ │ │ │ -176 iowner = it->second; │ │ │ │ │ -177 std::pair foundiit = rimap.equal_range(i.index()); │ │ │ │ │ -178 for (_C_o_l_I_t_e_r_a_t_o_r j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end │ │ │ │ │ -(); ++j) { │ │ │ │ │ -179 if (mask[j.index()] == 0) { │ │ │ │ │ -180 bool flag = true; │ │ │ │ │ -181 for (_R_I_M_a_p_i_t foundi = foundiit.first; foundi != foundiit.second; ++foundi) │ │ │ │ │ -{ │ │ │ │ │ -182 std::pair foundjit = rimap.equal_range(j.index()); │ │ │ │ │ -183 for (_R_I_M_a_p_i_t foundj = foundjit.first; foundj != foundjit.second; ++foundj) │ │ │ │ │ -184 if (foundj->second.first == foundi->second.first) │ │ │ │ │ -185 if (foundj->second.second->attribute() == _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ -_o_w_n_e_r │ │ │ │ │ -186 || foundj->second.first == iowner │ │ │ │ │ -187 || foundj->second.first < communication.communicator().rank()) { │ │ │ │ │ -188 flag = false; │ │ │ │ │ -189 continue; │ │ │ │ │ -190 } │ │ │ │ │ -191 if (flag == false) │ │ │ │ │ -192 continue; │ │ │ │ │ -193 } │ │ │ │ │ -194 // don´t contribute to Ax if │ │ │ │ │ -195 // 1. the owner of j has i as interior/border dof │ │ │ │ │ -196 // 2. iowner has j as interior/border dof │ │ │ │ │ -197 // 3. there is another process with smaller rank that has i and j │ │ │ │ │ -198 // as interor/border dofs │ │ │ │ │ -199 // if the owner of j does not have i as interior/border dof, │ │ │ │ │ -200 // it will not be taken into account │ │ │ │ │ -201 if (flag==true) │ │ │ │ │ -202 bordercontribution.insert(std::pair(i.index(),j.index())); │ │ │ │ │ -203 } │ │ │ │ │ -204 } │ │ │ │ │ -205 } │ │ │ │ │ -206 } │ │ │ │ │ -207 buildcomm = false; │ │ │ │ │ -208 } │ │ │ │ │ -209 │ │ │ │ │ -210 //compute alpha*A*x nonoverlapping case │ │ │ │ │ -211 for (_R_o_w_I_t_e_r_a_t_o_r i = _A_->begin(); i != _A_->end(); ++i) { │ │ │ │ │ -212 if (mask[i.index()] == 0) { │ │ │ │ │ -213 //dof doesn't belong to process but is border (not ghost) │ │ │ │ │ -214 for (_C_o_l_I_t_e_r_a_t_o_r j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end │ │ │ │ │ -(); ++j) { │ │ │ │ │ -215 if (mask[j.index()] == 1) //j is owner => then sum entries │ │ │ │ │ -216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]); │ │ │ │ │ -217 else if (mask[j.index()] == 0) { │ │ │ │ │ -218 std::pair itp = │ │ │ │ │ -219 bordercontribution.equal_range(i.index()); │ │ │ │ │ -220 for (MM::iterator it = itp.first; it != itp.second; ++it) │ │ │ │ │ -221 if ((*it).second == (int)j.index()) │ │ │ │ │ -222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]); │ │ │ │ │ -223 } │ │ │ │ │ -224 } │ │ │ │ │ -225 } │ │ │ │ │ -226 else if (mask[i.index()] == 1) { │ │ │ │ │ -227 for (_C_o_l_I_t_e_r_a_t_o_r j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end │ │ │ │ │ -(); ++j) │ │ │ │ │ -228 if (mask[j.index()] != 2) │ │ │ │ │ -229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]); │ │ │ │ │ -230 } │ │ │ │ │ -231 } │ │ │ │ │ -232 } │ │ │ │ │ -233 │ │ │ │ │ -_2_3_5 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -236 { │ │ │ │ │ -237 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ -238 } │ │ │ │ │ -239 │ │ │ │ │ -_2_4_1 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n() const │ │ │ │ │ -242 { │ │ │ │ │ -243 return communication; │ │ │ │ │ -244 } │ │ │ │ │ -245 private: │ │ │ │ │ -246 std::shared_ptr _A_; │ │ │ │ │ -247 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& communication; │ │ │ │ │ -248 mutable bool buildcomm; │ │ │ │ │ -249 mutable std::vector mask; │ │ │ │ │ -_2_5_0 mutable std::multimap bordercontribution; │ │ │ │ │ -251 }; │ │ │ │ │ -252 │ │ │ │ │ -_2_5_5 namespace Amg │ │ │ │ │ -256 { │ │ │ │ │ -257 template struct ConstructionTraits; │ │ │ │ │ -258 } │ │ │ │ │ -259 │ │ │ │ │ -274 template │ │ │ │ │ -_2_7_5 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -276 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -277 friend struct Amg:: │ │ │ │ │ -ConstructionTraits<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r >; │ │ │ │ │ -278 using X = typename P::domain_type; │ │ │ │ │ -279 using Y = typename P::range_type; │ │ │ │ │ -280 public: │ │ │ │ │ -_2_8_2 typedef typename P::domain_type _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_2_8_4 typedef typename P::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_2_8_6 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ -287 │ │ │ │ │ -_3_0_2 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (P& p, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ -303 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c) │ │ │ │ │ -304 { } │ │ │ │ │ -305 │ │ │ │ │ -_3_1_3 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (const std::shared_ptr

& p, const │ │ │ │ │ -_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ -314 : _preconditioner(p), _communication(c) │ │ │ │ │ -315 { } │ │ │ │ │ -316 │ │ │ │ │ -_3_2_2 virtual void _p_r_e (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b) │ │ │ │ │ -323 { │ │ │ │ │ -324 _preconditioner->pre(x,b); │ │ │ │ │ -325 } │ │ │ │ │ -326 │ │ │ │ │ -_3_3_2 virtual void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& d) │ │ │ │ │ -333 { │ │ │ │ │ -334 // block preconditioner equivalent to WrappedPreconditioner from │ │ │ │ │ -335 // pdelab/backend/ovlpistsolverbackend.hh, │ │ │ │ │ -336 // but not to BlockPreconditioner from schwarz.hh │ │ │ │ │ -337 _preconditioner->apply(v,d); │ │ │ │ │ -338 _communication.addOwnerCopyToOwnerCopy(v,v); │ │ │ │ │ -339 } │ │ │ │ │ -340 │ │ │ │ │ -341 template │ │ │ │ │ -_3_4_2 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -343 { │ │ │ │ │ -344 _preconditioner->template apply(v,d); │ │ │ │ │ -345 _communication.addOwnerCopyToOwnerCopy(v,v); │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -_3_5_3 virtual void _p_o_s_t (_d_o_m_a_i_n___t_y_p_e& x) │ │ │ │ │ -354 { │ │ │ │ │ -355 _preconditioner->post(x); │ │ │ │ │ +_1_3_3 inline void _f_i_l_l___r_o_w (std::ostream& s, int m, int width, [[maybe_unused]] │ │ │ │ │ +int precision) │ │ │ │ │ +134 { │ │ │ │ │ +135 for (int j=0; j │ │ │ │ │ +_1_5_1 void _p_r_i_n_t___r_o_w (std::ostream& s, const K& value, │ │ │ │ │ +152 [[maybe_unused]] typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_>_:_:_s_i_z_e___t_y_p_e I, │ │ │ │ │ +153 [[maybe_unused]] typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_>_:_:_s_i_z_e___t_y_p_e J, │ │ │ │ │ +154 [[maybe_unused]] typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_1_,_1_>_:_:_s_i_z_e___t_y_p_e therow, │ │ │ │ │ +155 int width, │ │ │ │ │ +156 [[maybe_unused]] int precision, │ │ │ │ │ +157 typename std::enable_if_t::value>* sfinae = nullptr) │ │ │ │ │ +158 { │ │ │ │ │ +159 s << " "; // space in front of each entry │ │ │ │ │ +160 s.width(width); // set width for each entry anew │ │ │ │ │ +161 s << value; │ │ │ │ │ +162 } │ │ │ │ │ +163 │ │ │ │ │ +171 template │ │ │ │ │ +_1_7_2 void _p_r_i_n_t___r_o_w (std::ostream& s, const M& A, typename M::size_type I, │ │ │ │ │ +173 typename M::size_type J, typename M::size_type therow, │ │ │ │ │ +174 int width, int precision, │ │ │ │ │ +175 typename std::enable_if_t::value>* sfinae = nullptr) │ │ │ │ │ +176 { │ │ │ │ │ +177 typename M::size_type i0=I; │ │ │ │ │ +178 for (typename M::size_type i=0; i=i0 && therow_:_:_r_o_w_d_i_m(A,i)) │ │ │ │ │ +181 { │ │ │ │ │ +182 // the row is in this block row ! │ │ │ │ │ +183 typename M::size_type j0=J; │ │ │ │ │ +184 for (typename M::size_type j=0; j_:_:_c_o_l_d_i_m(A,j),width,precision); │ │ │ │ │ +194 │ │ │ │ │ +195 // advance columns │ │ │ │ │ +196 j0 += _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_c_o_l_d_i_m(A,j); │ │ │ │ │ +197 } │ │ │ │ │ +198 } │ │ │ │ │ +199 // advance rows │ │ │ │ │ +200 i0 += _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_r_o_w_d_i_m(A,i); │ │ │ │ │ +201 } │ │ │ │ │ +202 } │ │ │ │ │ +203 │ │ │ │ │ +212 template │ │ │ │ │ +_2_1_3 void _p_r_i_n_t_m_a_t_r_i_x (std::ostream& s, const M& A, std::string title, │ │ │ │ │ +214 std::string rowtext, int width=10, int precision=2) │ │ │ │ │ +215 { │ │ │ │ │ +216 │ │ │ │ │ +217 // remember old flags │ │ │ │ │ +218 std::ios_base::fmtflags oldflags = s.flags(); │ │ │ │ │ +219 │ │ │ │ │ +220 // set the output format │ │ │ │ │ +221 s.setf(std::ios_base::scientific, std::ios_base::floatfield); │ │ │ │ │ +222 int oldprec = s.precision(); │ │ │ │ │ +223 s.precision(precision); │ │ │ │ │ +224 │ │ │ │ │ +225 // print title │ │ │ │ │ +226 s << title │ │ │ │ │ +227 << " [n=" << A._N() │ │ │ │ │ +228 << ",m=" << A._M() │ │ │ │ │ +229 << ",rowdim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_r_o_w_d_i_m(A) │ │ │ │ │ +230 << ",coldim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_>_:_:_c_o_l_d_i_m(A) │ │ │ │ │ +231 << "]" << std::endl; │ │ │ │ │ +232 │ │ │ │ │ +233 // print all rows │ │ │ │ │ +234 for (typename M::size_type i=0; i::rowdim(A); i++) │ │ │ │ │ +235 { │ │ │ │ │ +236 s << rowtext; // start a new row │ │ │ │ │ +237 s << " "; // space in front of each entry │ │ │ │ │ +238 s.width(4); // set width for counter │ │ │ │ │ +239 s << i; // number of first entry in a line │ │ │ │ │ +240 _p_r_i_n_t___r_o_w(s,A,0,0,i,width,precision); // generic print │ │ │ │ │ +241 s << std::endl; // start a new line │ │ │ │ │ +242 } │ │ │ │ │ +243 │ │ │ │ │ +244 // reset the output format │ │ │ │ │ +245 s.flags(oldflags); │ │ │ │ │ +246 s.precision(oldprec); │ │ │ │ │ +247 } │ │ │ │ │ +248 │ │ │ │ │ +270 template │ │ │ │ │ +_2_7_1 void _p_r_i_n_t_S_p_a_r_s_e_M_a_t_r_i_x(std::ostream& s, │ │ │ │ │ +272 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_B_,_n_,_m_>,A>& _m_a_t, │ │ │ │ │ +273 std::string title, std::string rowtext, │ │ │ │ │ +274 int width=3, int precision=2) │ │ │ │ │ +275 { │ │ │ │ │ +276 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_B_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ +277 // remember old flags │ │ │ │ │ +278 std::ios_base::fmtflags oldflags = s.flags(); │ │ │ │ │ +279 // set the output format │ │ │ │ │ +280 s.setf(std::ios_base::scientific, std::ios_base::floatfield); │ │ │ │ │ +281 int oldprec = s.precision(); │ │ │ │ │ +282 s.precision(precision); │ │ │ │ │ +283 // print title │ │ │ │ │ +284 s << title │ │ │ │ │ +285 << " [n=" << _m_a_t._N() │ │ │ │ │ +286 << ",m=" << _m_a_t._M() │ │ │ │ │ +287 << ",rowdim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t) │ │ │ │ │ +288 << ",coldim=" << _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t) │ │ │ │ │ +289 << "]" << std::endl; │ │ │ │ │ +290 │ │ │ │ │ +291 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r Row; │ │ │ │ │ +292 │ │ │ │ │ +293 for(Row row=_m_a_t._b_e_g_i_n(); row != _m_a_t._e_n_d(); ++row) { │ │ │ │ │ +294 int skipcols=0; │ │ │ │ │ +295 bool reachedEnd=false; │ │ │ │ │ +296 │ │ │ │ │ +297 while(!reachedEnd) { │ │ │ │ │ +298 for(int innerrow=0; innerrowbegin(); │ │ │ │ │ +302 for(; _c_o_l != row->end(); ++_c_o_l,++count) { │ │ │ │ │ +303 if(count=skipcols+width) │ │ │ │ │ +306 break; │ │ │ │ │ +307 if(innerrow==0) { │ │ │ │ │ +308 if(count==skipcols) { │ │ │ │ │ +309 s << rowtext; // start a new row │ │ │ │ │ +310 s << " "; // space in front of each entry │ │ │ │ │ +311 s.width(4); // set width for counter │ │ │ │ │ +312 s << row.index()<<": "; // number of first entry in a line │ │ │ │ │ +313 } │ │ │ │ │ +314 s.width(4); │ │ │ │ │ +315 s<<_c_o_l.index()<<": |"; │ │ │ │ │ +316 } else { │ │ │ │ │ +317 if(count==skipcols) { │ │ │ │ │ +318 for(typename std::string::size_type i=0; i < rowtext.length(); i++) │ │ │ │ │ +319 s<<" "; │ │ │ │ │ +320 s<<" "; │ │ │ │ │ +321 } │ │ │ │ │ +322 s<<" |"; │ │ │ │ │ +323 } │ │ │ │ │ +324 for(int innercol=0; innercol < m; ++innercol) { │ │ │ │ │ +325 s.width(9); │ │ │ │ │ +326 s<<(*col)[innerrow][innercol]<<" "; │ │ │ │ │ +327 } │ │ │ │ │ +328 │ │ │ │ │ +329 s<<"|"; │ │ │ │ │ +330 } │ │ │ │ │ +331 if(innerrow==n-1 && _c_o_l==row->end()) │ │ │ │ │ +332 reachedEnd = true; │ │ │ │ │ +333 else │ │ │ │ │ +334 s << std::endl; │ │ │ │ │ +335 } │ │ │ │ │ +336 skipcols += width; │ │ │ │ │ +337 s << std::endl; │ │ │ │ │ +338 } │ │ │ │ │ +339 s << std::endl; │ │ │ │ │ +340 } │ │ │ │ │ +341 │ │ │ │ │ +342 // reset the output format │ │ │ │ │ +343 s.flags(oldflags); │ │ │ │ │ +344 s.precision(oldprec); │ │ │ │ │ +345 } │ │ │ │ │ +346 │ │ │ │ │ +347 namespace │ │ │ │ │ +348 { │ │ │ │ │ +349 template │ │ │ │ │ +350 struct MatlabPODWriter │ │ │ │ │ +351 { │ │ │ │ │ +352 static std::ostream& write(const T& t, std::ostream& s) │ │ │ │ │ +353 { │ │ │ │ │ +354 s << t; │ │ │ │ │ +355 return s; │ │ │ │ │ 356 } │ │ │ │ │ -357 │ │ │ │ │ -_3_5_9 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +357 }; │ │ │ │ │ +358 template │ │ │ │ │ +359 struct MatlabPODWriter<_s_t_d::complex > │ │ │ │ │ 360 { │ │ │ │ │ -361 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ -362 } │ │ │ │ │ -363 │ │ │ │ │ -364 private: │ │ │ │ │ -366 std::shared_ptr

_preconditioner; │ │ │ │ │ -367 │ │ │ │ │ -369 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _communication; │ │ │ │ │ -370 }; │ │ │ │ │ -371 │ │ │ │ │ -374} // end namespace │ │ │ │ │ -375 │ │ │ │ │ -376#endif │ │ │ │ │ -_g_s_e_t_c_._h_h │ │ │ │ │ -Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ -generic way. │ │ │ │ │ -_i_o_._h_h │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ +361 static std::ostream& write(const std::complex& t, std::ostream& s) │ │ │ │ │ +362 { │ │ │ │ │ +363 s << t.real() << " " << t.imag(); │ │ │ │ │ +364 return s; │ │ │ │ │ +365 } │ │ │ │ │ +366 }; │ │ │ │ │ +367 } // anonymous namespace │ │ │ │ │ +368 │ │ │ │ │ +378 template │ │ │ │ │ +_3_7_9 void _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r(const FieldType& value, │ │ │ │ │ +380 int rowOffset, int colOffset, │ │ │ │ │ +381 std::ostream& s, │ │ │ │ │ +382 typename std::enable_if_t::value>* sfinae = │ │ │ │ │ +nullptr) │ │ │ │ │ +383 { │ │ │ │ │ +384 //+1 for Matlab numbering │ │ │ │ │ +385 s << rowOffset + 1 << " " << colOffset + 1 << " "; │ │ │ │ │ +386 MatlabPODWriter::write(value, s)<< std::endl; │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +396 template │ │ │ │ │ +_3_9_7 void _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r(const MatrixType& matrix, │ │ │ │ │ +398 int externalRowOffset, int externalColOffset, │ │ │ │ │ +399 std::ostream& s, │ │ │ │ │ +400 typename std::enable_if_t::value>* sfinae = │ │ │ │ │ +nullptr) │ │ │ │ │ +401 { │ │ │ │ │ +402 // Precompute the accumulated sizes of the columns │ │ │ │ │ +403 std::vector colOffset(matrix.M()); │ │ │ │ │ +404 if (colOffset.size() > 0) │ │ │ │ │ +405 colOffset[0] = 0; │ │ │ │ │ +406 │ │ │ │ │ +407 for (typename MatrixType::size_type i=0; i_:_:_c_o_l_d_i_m(matrix,i); │ │ │ │ │ +410 │ │ │ │ │ +411 typename MatrixType::size_type rowOffset = 0; │ │ │ │ │ +412 │ │ │ │ │ +413 // Loop over all matrix rows │ │ │ │ │ +414 for (typename MatrixType::size_type rowIdx=0; rowIdx_:_:_r_o_w_d_i_m(matrix, rowIdx); │ │ │ │ │ +427 } │ │ │ │ │ +428 │ │ │ │ │ +429 } │ │ │ │ │ +430 │ │ │ │ │ +450 template │ │ │ │ │ +_4_5_1 void _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b(const MatrixType& matrix, │ │ │ │ │ +452 const std::string& filename, int outputPrecision = 18) │ │ │ │ │ +453 { │ │ │ │ │ +454 std::ofstream outStream(filename.c_str()); │ │ │ │ │ +455 int oldPrecision = outStream.precision(); │ │ │ │ │ +456 outStream.precision(outputPrecision); │ │ │ │ │ +457 │ │ │ │ │ +458 _w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r(matrix, 0, 0, outStream); │ │ │ │ │ +459 outStream.precision(oldPrecision); │ │ │ │ │ +460 } │ │ │ │ │ +461 │ │ │ │ │ +462 // Recursively write vector entries to a stream │ │ │ │ │ +463 template │ │ │ │ │ +_4_6_4 void _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r (const V& v, std::ostream& stream) │ │ │ │ │ +465 { │ │ │ │ │ +466 if constexpr (IsNumber()) { │ │ │ │ │ +467 stream << v << std::endl; │ │ │ │ │ +468 } else { │ │ │ │ │ +469 for (const auto& entry : v) │ │ │ │ │ +470 _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r(entry, stream); │ │ │ │ │ +471 } │ │ │ │ │ +472 } │ │ │ │ │ +473 │ │ │ │ │ +491 template │ │ │ │ │ +_4_9_2 void _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b(const VectorType& vector, │ │ │ │ │ +493 const std::string& filename, int outputPrecision = 18) │ │ │ │ │ +494 { │ │ │ │ │ +495 std::ofstream outStream(filename.c_str()); │ │ │ │ │ +496 int oldPrecision = outStream.precision(); │ │ │ │ │ +497 outStream.precision(outputPrecision); │ │ │ │ │ +498 │ │ │ │ │ +499 _w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r(vector, outStream); │ │ │ │ │ +500 outStream.precision(oldPrecision); │ │ │ │ │ +501 } │ │ │ │ │ +502 │ │ │ │ │ +503 namespace Impl { │ │ │ │ │ +504 │ │ │ │ │ +506 struct NullStream { │ │ │ │ │ +507 template │ │ │ │ │ +508 friend NullStream &operator<<(NullStream &dev0, Any &&) { │ │ │ │ │ +509 return dev0; │ │ │ │ │ +510 } │ │ │ │ │ +511 }; │ │ │ │ │ +512 │ │ │ │ │ +514 // svg shall be closed with a group and an svg. i.e. "" │ │ │ │ │ +515 template │ │ │ │ │ +516 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts, │ │ │ │ │ +517 std::pair offsets) { │ │ │ │ │ +518 auto [col_offset, row_offset] = offsets; │ │ │ │ │ +519 double width = opts.width; │ │ │ │ │ +520 double height = opts.height; │ │ │ │ │ +521 // if empty, we try to figure out a sensible value of width and height │ │ │ │ │ +522 if (opts.width == 0 and opts.height == 0) │ │ │ │ │ +523 width = height = 500; │ │ │ │ │ +524 if (opts.width == 0) │ │ │ │ │ +525 width = opts.height * (double(col_offset) / row_offset); │ │ │ │ │ +526 if (opts.height == 0) │ │ │ │ │ +527 height = opts.width * (double(row_offset) / col_offset); │ │ │ │ │ +528 │ │ │ │ │ +529 // scale group w.r.t final offsets │ │ │ │ │ +530 double scale_width = width / col_offset; │ │ │ │ │ +531 double scale_height = height / row_offset; │ │ │ │ │ +532 │ │ │ │ │ +533 // write the header text │ │ │ │ │ +534 out << "\n" │ │ │ │ │ +536 << "\n" │ │ │ │ │ +538 << "\n"; │ │ │ │ │ +540 } │ │ │ │ │ +541 │ │ │ │ │ +543 template │ │ │ │ │ +545 std::pair │ │ │ │ │ +546 writeSVGMatrix(const Mat &_m_a_t, Stream &out, SVGMatrixOptions opts, │ │ │ │ │ +547 RowPrefix row_prefix, ColPrefix col_prefix) { │ │ │ │ │ +548 // get values to fill the offests │ │ │ │ │ +549 const auto& block_size = opts.block_size; │ │ │ │ │ +550 const auto& interspace = opts.interspace; │ │ │ │ │ +551 │ │ │ │ │ +552 const std::size_t rows = _m_a_t.N(); │ │ │ │ │ +553 const std::size_t cols = _m_a_t.M(); │ │ │ │ │ +554 │ │ │ │ │ +555 // disable header write for recursive calls │ │ │ │ │ +556 const bool write_header = opts.write_header; │ │ │ │ │ +557 opts.write_header = false; │ │ │ │ │ +558 │ │ │ │ │ +559 // counter of offsets for every block │ │ │ │ │ +560 std::size_t row_offset = interspace; │ │ │ │ │ +561 std::size_t col_offset = interspace; │ │ │ │ │ +562 │ │ │ │ │ +563 // lambda helper: for-each value │ │ │ │ │ +564 auto for_each_entry = [&_m_a_t](const auto &call_back) { │ │ │ │ │ +565 for (auto row_it = _m_a_t.begin(); row_it != _m_a_t.end(); ++row_it) { │ │ │ │ │ +566 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) { │ │ │ │ │ +567 call_back(row_it.index(), col_it.index(), *col_it); │ │ │ │ │ +568 } │ │ │ │ │ +569 } │ │ │ │ │ +570 }; │ │ │ │ │ +571 │ │ │ │ │ +572 // accumulate content in another stream so that we write in correct order │ │ │ │ │ +573 std::stringstream ss; │ │ │ │ │ +574 │ │ │ │ │ +575 // we need to append current row and col values to the prefixes │ │ │ │ │ +576 row_prefix.push_back(0); │ │ │ │ │ +577 col_prefix.push_back(0); │ │ │ │ │ +578 │ │ │ │ │ +579 // do we need to write nested matrix blocks? │ │ │ │ │ +580 if constexpr (Dune::blockLevel() == 0) { │ │ │ │ │ +581 // simple case: write svg block content to stream for each value │ │ │ │ │ +582 for_each_entry([&](const auto &row, const auto &_c_o_l, const auto &val) { │ │ │ │ │ +583 std::size_t x_off = interspace + _c_o_l * (interspace + block_size); │ │ │ │ │ +584 std::size_t y_off = interspace + row * (interspace + block_size); │ │ │ │ │ +585 row_prefix.back() = row; │ │ │ │ │ +586 col_prefix.back() = _c_o_l; │ │ │ │ │ +587 opts.writeSVGBlock(ss, row_prefix, col_prefix, val, │ │ │ │ │ +588 {x_off, y_off, block_size, block_size}); │ │ │ │ │ +589 }); │ │ │ │ │ +590 col_offset += cols * (block_size + interspace); │ │ │ │ │ +591 row_offset += rows * (block_size + interspace); │ │ │ │ │ +592 } else { │ │ │ │ │ +593 // before we write anything, we need to calculate the │ │ │ │ │ +594 // offset for every {row,col} index │ │ │ │ │ +595 const auto null_offset = std::numeric_limits::max(); │ │ │ │ │ +596 std::vector col_offsets(cols + 1, null_offset); │ │ │ │ │ +597 std::vector row_offsets(rows + 1, null_offset); │ │ │ │ │ +598 for_each_entry([&](const auto &row, const auto &_c_o_l, const auto &val) { │ │ │ │ │ +599 NullStream dev0; │ │ │ │ │ +600 // get size of sub-block │ │ │ │ │ +601 auto sub_size = │ │ │ │ │ +602 writeSVGMatrix(val, dev0, opts, row_prefix, col_prefix); │ │ │ │ │ +603 │ │ │ │ │ +604 // if we didn't see col size before │ │ │ │ │ +605 if (col_offsets[_c_o_l + 1] == null_offset) // write it in the offset vector │ │ │ │ │ +606 col_offsets[_c_o_l + 1] = sub_size.first; │ │ │ │ │ +607 │ │ │ │ │ +608 // repeat proces for row sizes │ │ │ │ │ +609 if (row_offsets[row + 1] == null_offset) │ │ │ │ │ +610 row_offsets[row + 1] = sub_size.second; │ │ │ │ │ +611 }); │ │ │ │ │ +612 │ │ │ │ │ +613 // if some rows/cols were not visited, make an educated guess with the │ │ │ │ │ +minimum offset │ │ │ │ │ +614 auto min_row_offset = *std::min_element(begin(row_offsets), end │ │ │ │ │ +(row_offsets)); │ │ │ │ │ +615 std::replace(begin(row_offsets), end(row_offsets), null_offset, │ │ │ │ │ +min_row_offset); │ │ │ │ │ +616 auto min_col_offset = *std::min_element(begin(col_offsets), end │ │ │ │ │ +(col_offsets)); │ │ │ │ │ +617 std::replace(begin(col_offsets), end(col_offsets), null_offset, │ │ │ │ │ +min_col_offset); │ │ │ │ │ +618 │ │ │ │ │ +619 // we have sizes for every block: to get offsets we make a partial sum │ │ │ │ │ +620 col_offsets[0] = interspace; │ │ │ │ │ +621 row_offsets[0] = interspace; │ │ │ │ │ +622 for (std::size_t i = 1; i < col_offsets.size(); i++) │ │ │ │ │ +623 col_offsets[i] += col_offsets[i - 1] + interspace; │ │ │ │ │ +624 for (std::size_t i = 1; i < row_offsets.size(); i++) │ │ │ │ │ +625 row_offsets[i] += row_offsets[i - 1] + interspace; │ │ │ │ │ +626 │ │ │ │ │ +627 for_each_entry([&](const auto &row, const auto &_c_o_l, const auto &val) { │ │ │ │ │ +628 // calculate svg view from offsets │ │ │ │ │ +629 std::size_t width = │ │ │ │ │ +630 col_offsets[_c_o_l + 1] - col_offsets[_c_o_l] - interspace; │ │ │ │ │ +631 std::size_t height = │ │ │ │ │ +632 row_offsets[row + 1] - row_offsets[row] - interspace; │ │ │ │ │ +633 row_prefix.back() = row; │ │ │ │ │ +634 col_prefix.back() = _c_o_l; │ │ │ │ │ +635 // content of the sub-block has origin at {0,0}: shift it to the correct │ │ │ │ │ +place │ │ │ │ │ +636 ss << "\n"; │ │ │ │ │ +638 // write a nested svg with the contents of the sub-block │ │ │ │ │ +639 writeSVGMatrix(val, ss, opts, row_prefix, col_prefix); │ │ │ │ │ +640 ss << "\n"; │ │ │ │ │ +641 }); │ │ │ │ │ +642 col_offset = col_offsets.back(); │ │ │ │ │ +643 row_offset = row_offsets.back(); │ │ │ │ │ +644 } │ │ │ │ │ +645 │ │ │ │ │ +646 // write content in order! │ │ │ │ │ +647 // (i) if required, first header │ │ │ │ │ +648 if (write_header) │ │ │ │ │ +649 writeSVGMatrixHeader(out, opts, {col_offset, row_offset}); │ │ │ │ │ +650 │ │ │ │ │ +651 col_prefix.pop_back(); │ │ │ │ │ +652 row_prefix.pop_back(); │ │ │ │ │ +653 // (ii) an svg block for this level │ │ │ │ │ +654 opts.writeSVGBlock(out, row_prefix, col_prefix, _m_a_t, │ │ │ │ │ +655 {0, 0, col_offset, row_offset}); │ │ │ │ │ +656 // (iii) the content of the matrix │ │ │ │ │ +657 out << ss.str(); │ │ │ │ │ +658 // (iv) if required, close the header │ │ │ │ │ +659 if (write_header) │ │ │ │ │ +660 out << "\n\n"; │ │ │ │ │ +661 │ │ │ │ │ +662 // return the total required for this block │ │ │ │ │ +663 return {col_offset, row_offset}; │ │ │ │ │ +664 } │ │ │ │ │ +665 } // namespace Impl │ │ │ │ │ +666 │ │ │ │ │ +667 │ │ │ │ │ +_6_7_4 struct _D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s { │ │ │ │ │ +_6_7_6 std::size_t _b_l_o_c_k___s_i_z_e = 10; │ │ │ │ │ +_6_7_8 std::size_t _i_n_t_e_r_s_p_a_c_e = 5; │ │ │ │ │ +_6_8_0 std::size_t _w_i_d_t_h = 500; │ │ │ │ │ +_6_8_2 std::size_t _h_e_i_g_h_t = 0; │ │ │ │ │ +_6_8_4 bool _w_r_i_t_e___h_e_a_d_e_r = true; │ │ │ │ │ +_6_8_6 std::string _s_t_y_l_e = " .matrix-block {\n" │ │ │ │ │ +687 " fill: cornflowerblue;\n" │ │ │ │ │ +688 " fill-opacity: 0.4;\n" │ │ │ │ │ +689 " stroke-width: 2;\n" │ │ │ │ │ +690 " stroke: black;\n" │ │ │ │ │ +691 " stroke-opacity: 0.5;\n" │ │ │ │ │ +692 " }\n" │ │ │ │ │ +693 " .matrix-block:hover {\n" │ │ │ │ │ +694 " fill: lightcoral;\n" │ │ │ │ │ +695 " fill-opacity: 0.4;\n" │ │ │ │ │ +696 " stroke-opacity: 1;\n" │ │ │ │ │ +697 " }\n"; │ │ │ │ │ +698 │ │ │ │ │ +_7_1_0 std::function _c_o_l_o_r___f_i_l_l; │ │ │ │ │ +711 │ │ │ │ │ +717 template │ │ │ │ │ +_7_1_8 std::string _b_l_o_c_k_S_t_y_l_e_C_l_a_s_s(const RowPrefix &row_prefix, │ │ │ │ │ +719 const ColPrefix &col_prefix) const { │ │ │ │ │ +720 // here, you can potentially give a different style to each block │ │ │ │ │ +721 return "matrix-block"; │ │ │ │ │ +722 } │ │ │ │ │ +723 │ │ │ │ │ +_7_2_5 bool _w_r_i_t_e___b_l_o_c_k___t_i_t_l_e = true; │ │ │ │ │ +726 │ │ │ │ │ +732 template │ │ │ │ │ +_7_3_3 void _w_r_i_t_e_B_l_o_c_k_T_i_t_l_e(Stream& out, const RowPrefix &row_prefix, │ │ │ │ │ +734 const ColPrefix &col_prefix, │ │ │ │ │ +735 const Block &block) const { │ │ │ │ │ +736 if (this->write_block_title) { │ │ │ │ │ +737 out << ""; │ │ │ │ │ +738 assert(row_prefix.size() == col_prefix.size()); │ │ │ │ │ +739 for (std::size_t i = 0; i < row_prefix.size(); ++i) │ │ │ │ │ +740 out << "[" << row_prefix[i] << ", "<< col_prefix[i] << "]"; │ │ │ │ │ +741 if constexpr (Dune::blockLevel<Block>() == 0) │ │ │ │ │ +742 out << ": " << block; │ │ │ │ │ +743 out << "\n"; │ │ │ │ │ +744 } │ │ │ │ │ +745 } │ │ │ │ │ +746 │ │ │ │ │ +768 template │ │ │ │ │ +_7_6_9 void _w_r_i_t_e_S_V_G_B_l_o_c_k(Stream &out, │ │ │ │ │ +770 const RowPrefix &row_prefix, │ │ │ │ │ +771 const ColPrefix &col_prefix, const Block block, │ │ │ │ │ +772 const std::array &svg_box) const { │ │ │ │ │ +773 // get bounding box values │ │ │ │ │ +774 auto &[x_off, y_off, _w_i_d_t_h, _h_e_i_g_h_t] = svg_box; │ │ │ │ │ +775 // get style class │ │ │ │ │ +776 std::string block_class = this->_b_l_o_c_k_S_t_y_l_e_C_l_a_s_s(row_prefix, col_prefix); │ │ │ │ │ +777 // write a rectangle on the bounding box │ │ │ │ │ +778 out << "() == 0 and std:: │ │ │ │ │ +is_convertible{}) │ │ │ │ │ +781 if (_c_o_l_o_r___f_i_l_l) │ │ │ │ │ +782 out << " style='fill-opacity: 1;fill:" << _c_o_l_o_r___f_i_l_l(double(block)) << "'"; │ │ │ │ │ +783 │ │ │ │ │ +784 out << ">\n"; │ │ │ │ │ +785 // give the rectangle a title (in html this shows info about the block) │ │ │ │ │ +786 this->_w_r_i_t_e_B_l_o_c_k_T_i_t_l_e(out,row_prefix, col_prefix, block); │ │ │ │ │ +787 // close rectangle │ │ │ │ │ +788 out << "\n"; │ │ │ │ │ +789 } │ │ │ │ │ +790 }; │ │ │ │ │ +791 │ │ │ │ │ +806 template │ │ │ │ │ +_8_0_7 void _w_r_i_t_e_S_V_G_M_a_t_r_i_x(const Mat &_m_a_t, std::ostream &out, │ │ │ │ │ +808 SVGOptions opts = {}) { │ │ │ │ │ +809 // We need a vector that can fit all the multi-indices for rows and colums │ │ │ │ │ +810 using IndexPrefix = Dune::ReservedVector()>; │ │ │ │ │ +811 // Call overload for Mat type │ │ │ │ │ +812 Impl::writeSVGMatrix(_m_a_t, out, opts, IndexPrefix{}, IndexPrefix{}); │ │ │ │ │ +813 } │ │ │ │ │ +814 │ │ │ │ │ +817} // namespace Dune │ │ │ │ │ +818 │ │ │ │ │ +819#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ _b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_i_l_u_._h_h │ │ │ │ │ -The incomplete LU factorization kernels. │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ -_v_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -??? │ │ │ │ │ -_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ +_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ +Some handy generic functions for ISTL matrices. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_w_r_i_t_e_S_V_G_M_a_t_r_i_x │ │ │ │ │ +void writeSVGMatrix(const Mat &mat, std::ostream &out, SVGOptions opts={}) │ │ │ │ │ +Writes the visualization of matrix in the SVG format. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:807 │ │ │ │ │ +_D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b │ │ │ │ │ +void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename, │ │ │ │ │ +int outputPrecision=18) │ │ │ │ │ +Writes sparse matrix in a Matlab-readable format. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:451 │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t___r_o_w │ │ │ │ │ +void print_row(std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1 │ │ │ │ │ +>::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename │ │ │ │ │ +FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision, typename │ │ │ │ │ +std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr) │ │ │ │ │ +Print one row of a matrix, specialization for number types. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_m_a_t_r_i_x │ │ │ │ │ +void printmatrix(std::ostream &s, const M &A, std::string title, std::string │ │ │ │ │ +rowtext, int width=10, int precision=2) │ │ │ │ │ +Print a generic block matrix. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:213 │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ +void printvector(std::ostream &s, const V &v, std::string title, std::string │ │ │ │ │ +rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ +Print an ISTL vector. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_T_o_M_a_t_l_a_b_H_e_l_p_e_r │ │ │ │ │ +void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int │ │ │ │ │ +colOffset, std::ostream &s, typename std::enable_if_t< Dune::IsNumber< │ │ │ │ │ +FieldType >::value > *sfinae=nullptr) │ │ │ │ │ +Helper method for the writeMatrixToMatlab routine. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b_H_e_l_p_e_r │ │ │ │ │ +void writeVectorToMatlabHelper(const V &v, std::ostream &stream) │ │ │ │ │ +DDeeffiinniittiioonn io.hh:464 │ │ │ │ │ +_D_u_n_e_:_:_w_r_i_t_e_V_e_c_t_o_r_T_o_M_a_t_l_a_b │ │ │ │ │ +void writeVectorToMatlab(const VectorType &vector, const std::string &filename, │ │ │ │ │ +int outputPrecision=18) │ │ │ │ │ +Writes vectors in a Matlab-readable format. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:492 │ │ │ │ │ +_D_u_n_e_:_:_r_e_c_u_r_s_i_v_e___p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ +void recursive_printvector(std::ostream &s, const V &v, std::string rowtext, │ │ │ │ │ +int &counter, int columns, int width) │ │ │ │ │ +Recursively print a vector. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_S_p_a_r_s_e_M_a_t_r_i_x │ │ │ │ │ +void printSparseMatrix(std::ostream &s, const BCRSMatrix< FieldMatrix< B, n, m │ │ │ │ │ +>, A > &mat, std::string title, std::string rowtext, int width=3, int │ │ │ │ │ +precision=2) │ │ │ │ │ +Prints a BCRSMatrix with fixed sized blocks. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_f_i_l_l___r_o_w │ │ │ │ │ +void fill_row(std::ostream &s, int m, int width, int precision) │ │ │ │ │ +Print a row of zeros for a non-existing block. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:133 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -A nonoverlapping operator with communication object. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_P_I_S │ │ │ │ │ -C::PIS PIS │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ -C communication_type │ │ │ │ │ -The type of the communication object. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_M_a_p │ │ │ │ │ -std::multimap< int, std::pair< int, RILIterator > > RIMap │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I │ │ │ │ │ -C::RI RI │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_n_o_v_l_p___o_p___a_p_p_l_y │ │ │ │ │ -void novlp_op_apply(const X &x, Y &y, field_type alpha) const │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const │ │ │ │ │ -communication_type &com) │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -M::ConstColIterator ColIterator │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(const X &x, Y &y) const │ │ │ │ │ -apply operator to x: │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The type of the domain. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:235 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_M_a_p_i_t │ │ │ │ │ -RIMap::iterator RIMapit │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_m_a_t │ │ │ │ │ -virtual const matrix_type & getmat() const │ │ │ │ │ -get matrix via * │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:121 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_L_I_t_e_r_a_t_o_r │ │ │ │ │ -RIL::const_iterator RILIterator │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_M_M │ │ │ │ │ -std::multimap< int, int > MM │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The type of the range. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The type of the matrix we operate on. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -M::ConstRowIterator RowIterator │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -const communication_type & getCommunication() const │ │ │ │ │ -Get the object responsible for communication. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ -virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const │ │ │ │ │ -apply operator to x, scale and add: │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_L │ │ │ │ │ -RI::RemoteIndexList RIL │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the range. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type │ │ │ │ │ -&com) │ │ │ │ │ -constructor: just store a reference to a matrix. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_I_t_e_r_a_t_o_r │ │ │ │ │ -RI::const_iterator RIIterator │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Nonoverlapping parallel preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -NonoverlappingBlockPreconditioner(P &p, const communication_type &c) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:302 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &v, const range_type &d) │ │ │ │ │ -Apply the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -P::range_type range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const │ │ │ │ │ -communication_type &c) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:313 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ -virtual void post(domain_type &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ -C communication_type │ │ │ │ │ -The type of the communication object. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ -virtual void pre(domain_type &x, range_type &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const Y &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:342 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -P::domain_type domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -A linear operator exporting itself in matrix form. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r │ │ │ │ │ -@ owner │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y │ │ │ │ │ -@ copy │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p │ │ │ │ │ -@ overlap │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ nonoverlapping │ │ │ │ │ -Category for non-overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_c_o_l_d_i_m │ │ │ │ │ +static auto coldim(const M &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_r_o_w_d_i_m │ │ │ │ │ +static auto rowdim(const M &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s │ │ │ │ │ +Default options class to write SVG matrices. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:674 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_s_t_y_l_e │ │ │ │ │ +std::string style │ │ │ │ │ +CSS style block to write in header. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:686 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_i_d_t_h │ │ │ │ │ +std::size_t width │ │ │ │ │ +Final width size (pixels) of the SVG header. If 0, size is automatic. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:680 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_c_o_l_o_r___f_i_l_l │ │ │ │ │ +std::function< std::string(const double &)> color_fill │ │ │ │ │ +Color fill for default options. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:710 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_b_l_o_c_k___s_i_z_e │ │ │ │ │ +std::size_t block_size │ │ │ │ │ +size (pixels) of the deepst block/value of the matrix │ │ │ │ │ +DDeeffiinniittiioonn io.hh:676 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e_S_V_G_B_l_o_c_k │ │ │ │ │ +void writeSVGBlock(Stream &out, const RowPrefix &row_prefix, const ColPrefix │ │ │ │ │ +&col_prefix, const Block block, const std::array< std::size_t, 4 > &svg_box) │ │ │ │ │ +const │ │ │ │ │ +Write an SVG object for a given block/value in the matrix. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:769 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e_B_l_o_c_k_T_i_t_l_e │ │ │ │ │ +void writeBlockTitle(Stream &out, const RowPrefix &row_prefix, const ColPrefix │ │ │ │ │ +&col_prefix, const Block &block) const │ │ │ │ │ +Helper function writes a title for a given block and prefix. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:733 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_i_n_t_e_r_s_p_a_c_e │ │ │ │ │ +std::size_t interspace │ │ │ │ │ +size (pixels) of the interspace between blocks │ │ │ │ │ +DDeeffiinniittiioonn io.hh:678 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e___b_l_o_c_k___t_i_t_l_e │ │ │ │ │ +bool write_block_title │ │ │ │ │ +(Helper) Whether to write a title on the rectangle value │ │ │ │ │ +DDeeffiinniittiioonn io.hh:725 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_h_e_i_g_h_t │ │ │ │ │ +std::size_t height │ │ │ │ │ +Final height size (pixels) of the SVG header. If 0, size is automatic. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:682 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_w_r_i_t_e___h_e_a_d_e_r │ │ │ │ │ +bool write_header │ │ │ │ │ +Whether to write the SVG header. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:684 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_S_V_G_M_a_t_r_i_x_O_p_t_i_o_n_s_:_:_b_l_o_c_k_S_t_y_l_e_C_l_a_s_s │ │ │ │ │ +std::string blockStyleClass(const RowPrefix &row_prefix, const ColPrefix │ │ │ │ │ +&col_prefix) const │ │ │ │ │ +Helper function that returns an style class for a given prefix. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:718 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +RowIterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +RowIterator begin() │ │ │ │ │ +Get iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::const_iterator ConstColIterator │ │ │ │ │ +Const iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +Return the number of columns. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +Return the number of rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00026.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: basearray.hh File Reference │ │ │ │ +dune-istl: bccsmatrixinitializer.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,37 +71,32 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces
│ │ │ │ -
basearray.hh File Reference
│ │ │ │ +
bccsmatrixinitializer.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Implements several basic array containers. │ │ │ │ -More...

│ │ │ │ -
#include "assert.h"
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
#include <limits>
│ │ │ │ +#include <set>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include <dune/istl/bccsmatrix.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ISTL
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Implements several basic array containers.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,24 +1,21 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -basearray.hh File Reference │ │ │ │ │ -Implements several basic array containers. _M_o_r_e_._._. │ │ │ │ │ -#include "assert.h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include │ │ │ │ │ +bccsmatrixinitializer.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_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_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implements several basic array containers. │ │ │ │ │ +namespace   _D_u_n_e_:_:_I_S_T_L │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: basearray.hh Source File │ │ │ │ +dune-istl: bccsmatrixinitializer.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,427 +74,335 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
basearray.hh
│ │ │ │ +
bccsmatrixinitializer.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_BASEARRAY_HH
│ │ │ │ -
6#define DUNE_ISTL_BASEARRAY_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
│ │ │ │ +
6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
│ │ │ │
7
│ │ │ │ -
8#include "assert.h"
│ │ │ │ -
9#include <cmath>
│ │ │ │ -
10#include <cstddef>
│ │ │ │ -
11#include <memory>
│ │ │ │ -
12#include <algorithm>
│ │ │ │ +
8#include <limits>
│ │ │ │ +
9#include <set>
│ │ │ │ +
10
│ │ │ │ +
11#include <dune/common/typetraits.hh>
│ │ │ │ +
12#include <dune/common/scalarmatrixview.hh>
│ │ │ │
13
│ │ │ │ -
14#include "istlexception.hh"
│ │ │ │ -
15#include <dune/common/iteratorfacades.hh>
│ │ │ │ -
16
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
22
│ │ │ │ -
24namespace Imp {
│ │ │ │ -
25
│ │ │ │ -
50 template<class B, class A=std::allocator<B> >
│ │ │ │ -
51 class base_array_unmanaged
│ │ │ │ -
52 {
│ │ │ │ -
53 public:
│ │ │ │ -
54
│ │ │ │ -
55 //===== type definitions and constants
│ │ │ │ -
56
│ │ │ │ -
58 typedef B member_type;
│ │ │ │ -
59
│ │ │ │ -
61 typedef A allocator_type;
│ │ │ │ -
62
│ │ │ │ -
64 typedef typename A::size_type size_type;
│ │ │ │ -
65
│ │ │ │ -
67 using reference = B&;
│ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
18 template<class I, class S, class D>
│ │ │ │ +
19 class OverlappingSchwarzInitializer;
│ │ │ │ +
20}
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune::ISTL::Impl
│ │ │ │ +
23{
│ │ │ │ +
31 template<class M, class S>
│ │ │ │ +
32 class MatrixRowSubset
│ │ │ │ +
33 {
│ │ │ │ +
34 public:
│ │ │ │ +
36 typedef M Matrix;
│ │ │ │ +
38 typedef S RowIndexSet;
│ │ │ │ +
39
│ │ │ │ +
45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s)
│ │ │ │ +
46 : m_(m), s_(s)
│ │ │ │ +
47 {}
│ │ │ │ +
48
│ │ │ │ +
49 const Matrix& matrix() const
│ │ │ │ +
50 {
│ │ │ │ +
51 return m_;
│ │ │ │ +
52 }
│ │ │ │ +
53
│ │ │ │ +
54 const RowIndexSet& rowIndexSet() const
│ │ │ │ +
55 {
│ │ │ │ +
56 return s_;
│ │ │ │ +
57 }
│ │ │ │ +
58
│ │ │ │ +
60 class const_iterator
│ │ │ │ +
61 : public ForwardIteratorFacade<const_iterator, const typename Matrix::row_type>
│ │ │ │ +
62 {
│ │ │ │ +
63 public:
│ │ │ │ +
64 const_iterator(typename Matrix::const_iterator firstRow,
│ │ │ │ +
65 typename RowIndexSet::const_iterator pos)
│ │ │ │ +
66 : firstRow_(firstRow), pos_(pos)
│ │ │ │ +
67 {}
│ │ │ │
68
│ │ │ │ -
70 using const_reference = const B&;
│ │ │ │ -
71
│ │ │ │ -
72 //===== access to components
│ │ │ │ -
73
│ │ │ │ -
75 reference operator[] (size_type i)
│ │ │ │ -
76 {
│ │ │ │ -
77#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
78 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
79#endif
│ │ │ │ -
80 return p[i];
│ │ │ │ -
81 }
│ │ │ │ -
82
│ │ │ │ -
84 const_reference operator[] (size_type i) const
│ │ │ │ -
85 {
│ │ │ │ -
86#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
87 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
88#endif
│ │ │ │ -
89 return p[i];
│ │ │ │ -
90 }
│ │ │ │ -
91
│ │ │ │ -
93 template<class T>
│ │ │ │ -
94 class RealIterator
│ │ │ │ -
95 : public RandomAccessIteratorFacade<RealIterator<T>, T>
│ │ │ │ -
96 {
│ │ │ │ -
97 public:
│ │ │ │ -
99 typedef typename std::remove_const<T>::type ValueType;
│ │ │ │ -
100
│ │ │ │ -
101 friend class RandomAccessIteratorFacade<RealIterator<const ValueType>, const ValueType>;
│ │ │ │ -
102 friend class RandomAccessIteratorFacade<RealIterator<ValueType>, ValueType>;
│ │ │ │ -
103 friend class RealIterator<const ValueType>;
│ │ │ │ -
104 friend class RealIterator<ValueType>;
│ │ │ │ -
105
│ │ │ │ -
107 RealIterator ()
│ │ │ │ -
108 : p(0), i(0)
│ │ │ │ -
109 {}
│ │ │ │ -
110
│ │ │ │ -
111 RealIterator (const B* _p, B* _i) : p(_p), i(_i)
│ │ │ │ -
112 { }
│ │ │ │ -
113
│ │ │ │ -
114 RealIterator(const RealIterator<ValueType>& it)
│ │ │ │ -
115 : p(it.p), i(it.i)
│ │ │ │ -
116 {}
│ │ │ │ -
117
│ │ │ │ -
119 size_type index () const
│ │ │ │ -
120 {
│ │ │ │ -
121 return i-p;
│ │ │ │ -
122 }
│ │ │ │ -
123
│ │ │ │ -
125 bool equals (const RealIterator<ValueType>& other) const
│ │ │ │ -
126 {
│ │ │ │ -
127 assert(other.p==p);
│ │ │ │ -
128 return i==other.i;
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
132 bool equals (const RealIterator<const ValueType>& other) const
│ │ │ │ -
133 {
│ │ │ │ -
134 assert(other.p==p);
│ │ │ │ -
135 return i==other.i;
│ │ │ │ -
136 }
│ │ │ │ -
137
│ │ │ │ -
138 std::ptrdiff_t distanceTo(const RealIterator& o) const
│ │ │ │ -
139 {
│ │ │ │ -
140 return o.i-i;
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ -
143 private:
│ │ │ │ -
145 void increment()
│ │ │ │ -
146 {
│ │ │ │ -
147 ++i;
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ -
151 void decrement()
│ │ │ │ -
152 {
│ │ │ │ -
153 --i;
│ │ │ │ -
154 }
│ │ │ │ -
155
│ │ │ │ -
156 // Needed for operator[] of the iterator
│ │ │ │ -
157 reference elementAt (std::ptrdiff_t offset) const
│ │ │ │ -
158 {
│ │ │ │ -
159 return *(i+offset);
│ │ │ │ -
160 }
│ │ │ │ -
161
│ │ │ │ -
163 reference dereference () const
│ │ │ │ -
164 {
│ │ │ │ -
165 return *i;
│ │ │ │ -
166 }
│ │ │ │ -
167
│ │ │ │ -
168 void advance(std::ptrdiff_t d)
│ │ │ │ -
169 {
│ │ │ │ -
170 i+=d;
│ │ │ │ -
171 }
│ │ │ │ -
172
│ │ │ │ -
173 const B* p;
│ │ │ │ -
174 B* i;
│ │ │ │ -
175 };
│ │ │ │ -
176
│ │ │ │ -
178 typedef RealIterator<B> iterator;
│ │ │ │ -
179
│ │ │ │ -
180
│ │ │ │ -
182 iterator begin ()
│ │ │ │ -
183 {
│ │ │ │ -
184 return iterator(p,p);
│ │ │ │ -
185 }
│ │ │ │ -
186
│ │ │ │ -
188 iterator end ()
│ │ │ │ -
189 {
│ │ │ │ -
190 return iterator(p,p+n);
│ │ │ │ -
191 }
│ │ │ │ -
192
│ │ │ │ -
195 iterator beforeEnd ()
│ │ │ │ -
196 {
│ │ │ │ -
197 return iterator(p,p+n-1);
│ │ │ │ -
198 }
│ │ │ │ -
199
│ │ │ │ -
202 iterator beforeBegin ()
│ │ │ │ -
203 {
│ │ │ │ -
204 return iterator(p,p-1);
│ │ │ │ -
205 }
│ │ │ │ -
206
│ │ │ │ -
208 iterator find (size_type i)
│ │ │ │ -
209 {
│ │ │ │ -
210 return iterator(p,p+std::min(i,n));
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
214 typedef RealIterator<const B> const_iterator;
│ │ │ │ -
215
│ │ │ │ -
217 const_iterator begin () const
│ │ │ │ -
218 {
│ │ │ │ -
219 return const_iterator(p,p+0);
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
223 const_iterator end () const
│ │ │ │ -
224 {
│ │ │ │ -
225 return const_iterator(p,p+n);
│ │ │ │ -
226 }
│ │ │ │ -
227
│ │ │ │ -
230 const_iterator beforeEnd () const
│ │ │ │ -
231 {
│ │ │ │ -
232 return const_iterator(p,p+n-1);
│ │ │ │ +
69
│ │ │ │ +
70 const typename Matrix::row_type& dereference() const
│ │ │ │ +
71 {
│ │ │ │ +
72 return *(firstRow_+ *pos_);
│ │ │ │ +
73 }
│ │ │ │ +
74 bool equals(const const_iterator& o) const
│ │ │ │ +
75 {
│ │ │ │ +
76 return pos_==o.pos_;
│ │ │ │ +
77 }
│ │ │ │ +
78 void increment()
│ │ │ │ +
79 {
│ │ │ │ +
80 ++pos_;
│ │ │ │ +
81 }
│ │ │ │ +
82 typename RowIndexSet::value_type index() const
│ │ │ │ +
83 {
│ │ │ │ +
84 return *pos_;
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ +
87 private:
│ │ │ │ +
89 typename Matrix::const_iterator firstRow_;
│ │ │ │ +
91 typename RowIndexSet::const_iterator pos_;
│ │ │ │ +
92 };
│ │ │ │ +
93
│ │ │ │ +
95 const_iterator begin() const
│ │ │ │ +
96 {
│ │ │ │ +
97 return const_iterator(m_.begin(), s_.begin());
│ │ │ │ +
98 }
│ │ │ │ +
100 const_iterator end() const
│ │ │ │ +
101 {
│ │ │ │ +
102 return const_iterator(m_.begin(), s_.end());
│ │ │ │ +
103 }
│ │ │ │ +
104
│ │ │ │ +
105 private:
│ │ │ │ +
107 const Matrix& m_;
│ │ │ │ +
109 const RowIndexSet& s_;
│ │ │ │ +
110 };
│ │ │ │ +
111
│ │ │ │ +
118 template<class M, class I = typename M::size_type>
│ │ │ │ +
119 class BCCSMatrixInitializer
│ │ │ │ +
120 {
│ │ │ │ +
121 template<class IList, class S, class D>
│ │ │ │ + │ │ │ │ +
123 public:
│ │ │ │ +
124 using Matrix = M;
│ │ │ │ +
125 using Index = I;
│ │ │ │ +
126 typedef Dune::ISTL::Impl::BCCSMatrix<typename Matrix::field_type, I> OutputMatrix;
│ │ │ │ +
127 typedef typename Matrix::size_type size_type;
│ │ │ │ +
128
│ │ │ │ +
131 BCCSMatrixInitializer(OutputMatrix& mat_)
│ │ │ │ +
132 : mat(&mat_), cols(mat_.M())
│ │ │ │ +
133 {
│ │ │ │ +
134 if constexpr (Dune::IsNumber<typename M::block_type>::value)
│ │ │ │ +
135 {
│ │ │ │ +
136 n = m = 1;
│ │ │ │ +
137 }
│ │ │ │ +
138 else
│ │ │ │ +
139 {
│ │ │ │ +
140 // WARNING: This assumes that all blocks are dense and identical
│ │ │ │ +
141 n = M::block_type::rows;
│ │ │ │ +
142 m = M::block_type::cols;
│ │ │ │ +
143 }
│ │ │ │ +
144
│ │ │ │ +
145 mat->Nnz_=0;
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ +
148 BCCSMatrixInitializer()
│ │ │ │ +
149 : mat(0), cols(0), n(0), m(0)
│ │ │ │ +
150 {}
│ │ │ │ +
151
│ │ │ │ +
152 virtual ~BCCSMatrixInitializer()
│ │ │ │ +
153 {}
│ │ │ │ +
154
│ │ │ │ +
155 template<typename Iter>
│ │ │ │ +
156 void addRowNnz(const Iter& row) const
│ │ │ │ +
157 {
│ │ │ │ +
158 mat->Nnz_+=row->getsize();
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ +
161 template<typename Iter, typename FullMatrixIndex>
│ │ │ │ +
162 void addRowNnz(const Iter& row, const std::set<FullMatrixIndex>& indices) const
│ │ │ │ +
163 {
│ │ │ │ +
164 auto siter =indices.begin();
│ │ │ │ +
165 for (auto entry=row->begin(); entry!=row->end(); ++entry)
│ │ │ │ +
166 {
│ │ │ │ +
167 for(; siter!=indices.end() && *siter<entry.index(); ++siter) ;
│ │ │ │ +
168 if(siter==indices.end())
│ │ │ │ +
169 break;
│ │ │ │ +
170 if(*siter==entry.index())
│ │ │ │ +
171 // index is in subdomain
│ │ │ │ +
172 ++mat->Nnz_;
│ │ │ │ +
173 }
│ │ │ │ +
174 }
│ │ │ │ +
175
│ │ │ │ +
176 template<typename Iter, typename SubMatrixIndex>
│ │ │ │ +
177 void addRowNnz(const Iter& row, const std::vector<SubMatrixIndex>& indices) const
│ │ │ │ +
178 {
│ │ │ │ +
179 for (auto entry=row->begin(); entry!=row->end(); ++entry)
│ │ │ │ +
180 if (indices[entry.index()]!=std::numeric_limits<SubMatrixIndex>::max())
│ │ │ │ +
181 ++mat->Nnz_;
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
184 void allocate()
│ │ │ │ +
185 {
│ │ │ │ +
186 allocateMatrixStorage();
│ │ │ │ +
187 allocateMarker();
│ │ │ │ +
188 }
│ │ │ │ +
189
│ │ │ │ +
190 template<typename Iter, typename CIter>
│ │ │ │ +
191 void countEntries([[maybe_unused]] const Iter& row, const CIter& col) const
│ │ │ │ +
192 {
│ │ │ │ +
193 countEntries(col.index());
│ │ │ │ +
194 }
│ │ │ │ +
195
│ │ │ │ +
196 void countEntries(size_type colindex) const
│ │ │ │ +
197 {
│ │ │ │ +
198 for(size_type i=0; i < m; ++i)
│ │ │ │ +
199 {
│ │ │ │ +
200 assert(colindex*m+i<cols);
│ │ │ │ +
201 marker[colindex*m+i]+=n;
│ │ │ │ +
202 }
│ │ │ │ +
203 }
│ │ │ │ +
204
│ │ │ │ +
205 void calcColstart() const
│ │ │ │ +
206 {
│ │ │ │ +
207 mat->colstart[0]=0;
│ │ │ │ +
208 for(size_type i=0; i < cols; ++i) {
│ │ │ │ +
209 assert(i<cols);
│ │ │ │ +
210 mat->colstart[i+1]=mat->colstart[i]+marker[i];
│ │ │ │ +
211 marker[i]=mat->colstart[i];
│ │ │ │ +
212 }
│ │ │ │ +
213 }
│ │ │ │ +
214
│ │ │ │ +
215 template<typename Iter, typename CIter>
│ │ │ │ +
216 void copyValue(const Iter& row, const CIter& col) const
│ │ │ │ +
217 {
│ │ │ │ +
218 copyValue(col, row.index(), col.index());
│ │ │ │ +
219 }
│ │ │ │ +
220
│ │ │ │ +
221 template<typename CIter>
│ │ │ │ +
222 void copyValue(const CIter& col, size_type rowindex, size_type colindex) const
│ │ │ │ +
223 {
│ │ │ │ +
224 for(size_type i=0; i<n; i++) {
│ │ │ │ +
225 for(size_type j=0; j<m; j++) {
│ │ │ │ +
226 assert(colindex*m+j<cols-1 || (size_type)marker[colindex*m+j]<(size_type)mat->colstart[colindex*m+j+1]);
│ │ │ │ +
227 assert((size_type)marker[colindex*m+j]<mat->Nnz_);
│ │ │ │ +
228 mat->rowindex[marker[colindex*m+j]]=rowindex*n+i;
│ │ │ │ +
229 mat->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*col)[i][j];
│ │ │ │ +
230 ++marker[colindex*m+j]; // index for next entry in column
│ │ │ │ +
231 }
│ │ │ │ +
232 }
│ │ │ │
233 }
│ │ │ │
234
│ │ │ │ -
237 const_iterator beforeBegin () const
│ │ │ │ -
238 {
│ │ │ │ -
239 return const_iterator(p,p-1);
│ │ │ │ -
240 }
│ │ │ │ +
235 virtual void createMatrix() const
│ │ │ │ +
236 {
│ │ │ │ +
237 marker.clear();
│ │ │ │ +
238 }
│ │ │ │ +
239
│ │ │ │ +
240 protected:
│ │ │ │
241
│ │ │ │ -
243 const_iterator find (size_type i) const
│ │ │ │ -
244 {
│ │ │ │ -
245 return const_iterator(p,p+std::min(i,n));
│ │ │ │ -
246 }
│ │ │ │ -
247
│ │ │ │ -
248
│ │ │ │ -
249 //===== sizes
│ │ │ │ +
242 void allocateMatrixStorage() const
│ │ │ │ +
243 {
│ │ │ │ +
244 mat->Nnz_*=n*m;
│ │ │ │ +
245 // initialize data
│ │ │ │ +
246 mat->values=new typename M::field_type[mat->Nnz_];
│ │ │ │ +
247 mat->rowindex=new I[mat->Nnz_];
│ │ │ │ +
248 mat->colstart=new I[cols+1];
│ │ │ │ +
249 }
│ │ │ │
250
│ │ │ │ -
252 size_type size () const
│ │ │ │ -
253 {
│ │ │ │ -
254 return n;
│ │ │ │ +
251 void allocateMarker()
│ │ │ │ +
252 {
│ │ │ │ +
253 marker.resize(cols);
│ │ │ │ +
254 std::fill(marker.begin(), marker.end(), 0);
│ │ │ │
255 }
│ │ │ │
256
│ │ │ │ -
258 const B* data() const
│ │ │ │ -
259 {
│ │ │ │ -
260 return p;
│ │ │ │ -
261 }
│ │ │ │ -
262
│ │ │ │ -
264 B* data()
│ │ │ │ -
265 {
│ │ │ │ -
266 return p;
│ │ │ │ -
267 }
│ │ │ │ -
268
│ │ │ │ -
269 protected:
│ │ │ │ -
271 base_array_unmanaged ()
│ │ │ │ -
272 : n(0), p(0)
│ │ │ │ -
273 {}
│ │ │ │ -
275 base_array_unmanaged (size_type n_, B* p_)
│ │ │ │ -
276 : n(n_), p(p_)
│ │ │ │ -
277 {}
│ │ │ │ -
278 size_type n; // number of elements in array
│ │ │ │ -
279 B *p; // pointer to dynamically allocated built-in array
│ │ │ │ -
280 };
│ │ │ │ -
281
│ │ │ │ +
257 OutputMatrix* mat;
│ │ │ │ +
258 size_type cols;
│ │ │ │ +
259
│ │ │ │ +
260 // Number of rows/columns of the matrix entries
│ │ │ │ +
261 // (assumed to be scalars or dense matrices)
│ │ │ │ +
262 size_type n, m;
│ │ │ │ +
263
│ │ │ │ +
264 mutable std::vector<size_type> marker;
│ │ │ │ +
265 };
│ │ │ │ +
266
│ │ │ │ +
267 template<class F, class Matrix>
│ │ │ │ +
268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix)
│ │ │ │ +
269 {
│ │ │ │ +
270 for (auto row=matrix.begin(); row!= matrix.end(); ++row)
│ │ │ │ +
271 initializer.addRowNnz(row);
│ │ │ │ +
272
│ │ │ │ +
273 initializer.allocate();
│ │ │ │ +
274
│ │ │ │ +
275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
│ │ │ │ +
276
│ │ │ │ +
277 for (auto col=row->begin(); col != row->end(); ++col)
│ │ │ │ +
278 initializer.countEntries(row, col);
│ │ │ │ +
279 }
│ │ │ │ +
280
│ │ │ │ +
281 initializer.calcColstart();
│ │ │ │
282
│ │ │ │ -
283
│ │ │ │ -
305 template<class B, class A=std::allocator<B> >
│ │ │ │ -
306 class compressed_base_array_unmanaged
│ │ │ │ -
307 {
│ │ │ │ -
308 public:
│ │ │ │ -
309
│ │ │ │ -
310 //===== type definitions and constants
│ │ │ │ -
311
│ │ │ │ -
313 typedef B member_type;
│ │ │ │ -
314
│ │ │ │ -
316 typedef A allocator_type;
│ │ │ │ +
283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
│ │ │ │ +
284 for (auto col=row->begin(); col != row->end(); ++col) {
│ │ │ │ +
285 initializer.copyValue(row, col);
│ │ │ │ +
286 }
│ │ │ │ +
287
│ │ │ │ +
288 }
│ │ │ │ +
289 initializer.createMatrix();
│ │ │ │ +
290 }
│ │ │ │ +
291
│ │ │ │ +
292 template<class F, class M,class S>
│ │ │ │ +
293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset<M,S>& mrs)
│ │ │ │ +
294 {
│ │ │ │ +
295 typedef MatrixRowSubset<M,S> MRS;
│ │ │ │ +
296 typedef typename MRS::RowIndexSet SIS;
│ │ │ │ +
297 typedef typename SIS::const_iterator SIter;
│ │ │ │ +
298 typedef typename MRS::const_iterator Iter;
│ │ │ │ +
299 typedef typename std::iterator_traits<Iter>::value_type row_type;
│ │ │ │ +
300 typedef typename row_type::const_iterator CIter;
│ │ │ │ +
301
│ │ │ │ +
302 typedef typename MRS::Matrix::size_type size_type;
│ │ │ │ +
303
│ │ │ │ +
304 // A vector containing the corresponding indices in
│ │ │ │ +
305 // the to create submatrix.
│ │ │ │ +
306 // If an entry is the maximum of size_type then this index will not appear in
│ │ │ │ +
307 // the submatrix.
│ │ │ │ +
308 std::vector<size_type> subMatrixIndex(mrs.matrix().N(),
│ │ │ │ +
309 std::numeric_limits<size_type>::max());
│ │ │ │ +
310 size_type s=0;
│ │ │ │ +
311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end(); ++index)
│ │ │ │ +
312 subMatrixIndex[*index]=s++;
│ │ │ │ +
313
│ │ │ │ +
314 // Calculate upper Bound for nonzeros
│ │ │ │ +
315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
│ │ │ │ +
316 initializer.addRowNnz(row, subMatrixIndex);
│ │ │ │
317
│ │ │ │ -
319 typedef typename A::size_type size_type;
│ │ │ │ -
320
│ │ │ │ -
322 using reference = B&;
│ │ │ │ -
323
│ │ │ │ -
325 using const_reference = const B&;
│ │ │ │ +
318 initializer.allocate();
│ │ │ │ +
319
│ │ │ │ +
320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
│ │ │ │ +
321 for(CIter col=row->begin(); col != row->end(); ++col) {
│ │ │ │ +
322 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
│ │ │ │ +
323 // This column is in our subset (use submatrix column index)
│ │ │ │ +
324 initializer.countEntries(subMatrixIndex[col.index()]);
│ │ │ │ +
325 }
│ │ │ │
326
│ │ │ │ -
327 //===== access to components
│ │ │ │ +
327 initializer.calcColstart();
│ │ │ │
328
│ │ │ │ -
330 reference operator[] (size_type i)
│ │ │ │ -
331 {
│ │ │ │ -
332 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ -
333 if (lb == j+n || *lb != i)
│ │ │ │ -
334 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
│ │ │ │ -
335 return p[lb-j];
│ │ │ │ -
336 }
│ │ │ │ +
329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
│ │ │ │ +
330 for(CIter col=row->begin(); col != row->end(); ++col) {
│ │ │ │ +
331 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
│ │ │ │ +
332 // This value is in our submatrix -> copy (use submatrix indices
│ │ │ │ +
333 initializer.copyValue(col, subMatrixIndex[row.index()], subMatrixIndex[col.index()]);
│ │ │ │ +
334 }
│ │ │ │ +
335 initializer.createMatrix();
│ │ │ │ +
336 }
│ │ │ │
337
│ │ │ │ -
339 const_reference operator[] (size_type i) const
│ │ │ │ -
340 {
│ │ │ │ -
341 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ -
342 if (lb == j+n || *lb != i)
│ │ │ │ -
343 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
│ │ │ │ -
344 return p[lb-j];
│ │ │ │ -
345 }
│ │ │ │ -
346
│ │ │ │ -
348 template<class T>
│ │ │ │ -
349 class RealIterator
│ │ │ │ -
350 : public BidirectionalIteratorFacade<RealIterator<T>, T>
│ │ │ │ -
351 {
│ │ │ │ -
352 public:
│ │ │ │ -
354 typedef typename std::remove_const<T>::type ValueType;
│ │ │ │ -
355
│ │ │ │ -
356 friend class BidirectionalIteratorFacade<RealIterator<const ValueType>, const ValueType>;
│ │ │ │ -
357 friend class BidirectionalIteratorFacade<RealIterator<ValueType>, ValueType>;
│ │ │ │ -
358 friend class RealIterator<const ValueType>;
│ │ │ │ -
359 friend class RealIterator<ValueType>;
│ │ │ │ -
360
│ │ │ │ -
362 RealIterator ()
│ │ │ │ -
363 : p(0), j(0), i(0)
│ │ │ │ -
364 {}
│ │ │ │ -
365
│ │ │ │ -
367 RealIterator (B* _p, size_type* _j, size_type _i)
│ │ │ │ -
368 : p(_p), j(_j), i(_i)
│ │ │ │ -
369 { }
│ │ │ │ -
370
│ │ │ │ -
374 RealIterator(const RealIterator<ValueType>& it)
│ │ │ │ -
375 : p(it.p), j(it.j), i(it.i)
│ │ │ │ -
376 {}
│ │ │ │ -
377
│ │ │ │ -
378
│ │ │ │ -
380 bool equals (const RealIterator<ValueType>& it) const
│ │ │ │ -
381 {
│ │ │ │ -
382 assert(p==it.p);
│ │ │ │ -
383 return (i)==(it.i);
│ │ │ │ -
384 }
│ │ │ │ -
385
│ │ │ │ -
387 bool equals (const RealIterator<const ValueType>& it) const
│ │ │ │ -
388 {
│ │ │ │ -
389 assert(p==it.p);
│ │ │ │ -
390 return (i)==(it.i);
│ │ │ │ -
391 }
│ │ │ │ -
392
│ │ │ │ -
393
│ │ │ │ -
395 size_type index () const
│ │ │ │ -
396 {
│ │ │ │ -
397 return j[i];
│ │ │ │ -
398 }
│ │ │ │ -
399
│ │ │ │ -
401 void setindex (size_type k)
│ │ │ │ -
402 {
│ │ │ │ -
403 return j[i] = k;
│ │ │ │ -
404 }
│ │ │ │ -
405
│ │ │ │ -
413 size_type offset () const
│ │ │ │ -
414 {
│ │ │ │ -
415 return i;
│ │ │ │ -
416 }
│ │ │ │ -
417
│ │ │ │ -
418 private:
│ │ │ │ -
420 void increment()
│ │ │ │ -
421 {
│ │ │ │ -
422 ++i;
│ │ │ │ -
423 }
│ │ │ │ -
424
│ │ │ │ -
426 void decrement()
│ │ │ │ -
427 {
│ │ │ │ -
428 --i;
│ │ │ │ -
429 }
│ │ │ │ -
430
│ │ │ │ -
432 reference dereference () const
│ │ │ │ -
433 {
│ │ │ │ -
434 return p[i];
│ │ │ │ -
435 }
│ │ │ │ -
436
│ │ │ │ -
437 B* p;
│ │ │ │ -
438 size_type* j;
│ │ │ │ -
439 size_type i;
│ │ │ │ -
440 };
│ │ │ │ -
441
│ │ │ │ -
443 typedef RealIterator<B> iterator;
│ │ │ │ -
444
│ │ │ │ -
446 iterator begin ()
│ │ │ │ -
447 {
│ │ │ │ -
448 return iterator(p,j,0);
│ │ │ │ -
449 }
│ │ │ │ -
450
│ │ │ │ -
452 iterator end ()
│ │ │ │ -
453 {
│ │ │ │ -
454 return iterator(p,j,n);
│ │ │ │ -
455 }
│ │ │ │ -
456
│ │ │ │ -
459 iterator beforeEnd ()
│ │ │ │ -
460 {
│ │ │ │ -
461 return iterator(p,j,n-1);
│ │ │ │ -
462 }
│ │ │ │ -
463
│ │ │ │ -
466 iterator beforeBegin ()
│ │ │ │ -
467 {
│ │ │ │ -
468 return iterator(p,j,-1);
│ │ │ │ -
469 }
│ │ │ │ -
470
│ │ │ │ -
472 iterator find (size_type i)
│ │ │ │ -
473 {
│ │ │ │ -
474 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ -
475 return (lb != j+n && *lb == i)
│ │ │ │ -
476 ? iterator(p,j,lb-j)
│ │ │ │ -
477 : end();
│ │ │ │ -
478 }
│ │ │ │ -
479
│ │ │ │ -
481 typedef RealIterator<const B> const_iterator;
│ │ │ │ -
482
│ │ │ │ -
484 const_iterator begin () const
│ │ │ │ -
485 {
│ │ │ │ -
486 return const_iterator(p,j,0);
│ │ │ │ -
487 }
│ │ │ │ -
488
│ │ │ │ -
490 const_iterator end () const
│ │ │ │ -
491 {
│ │ │ │ -
492 return const_iterator(p,j,n);
│ │ │ │ -
493 }
│ │ │ │ -
494
│ │ │ │ -
497 const_iterator beforeEnd () const
│ │ │ │ -
498 {
│ │ │ │ -
499 return const_iterator(p,j,n-1);
│ │ │ │ -
500 }
│ │ │ │ -
501
│ │ │ │ -
504 const_iterator beforeBegin () const
│ │ │ │ -
505 {
│ │ │ │ -
506 return const_iterator(p,j,-1);
│ │ │ │ -
507 }
│ │ │ │ -
508
│ │ │ │ -
510 const_iterator find (size_type i) const
│ │ │ │ -
511 {
│ │ │ │ -
512 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ -
513 return (lb != j+n && *lb == i)
│ │ │ │ -
514 ? const_iterator(p,j,lb-j)
│ │ │ │ -
515 : end();
│ │ │ │ -
516 }
│ │ │ │ -
517
│ │ │ │ -
518 //===== sizes
│ │ │ │ -
519
│ │ │ │ -
521 size_type size () const
│ │ │ │ -
522 {
│ │ │ │ -
523 return n;
│ │ │ │ -
524 }
│ │ │ │ -
525
│ │ │ │ -
526 protected:
│ │ │ │ -
528 compressed_base_array_unmanaged ()
│ │ │ │ -
529 : n(0), p(0), j(0)
│ │ │ │ -
530 {}
│ │ │ │ -
531
│ │ │ │ -
532 size_type n; // number of elements in array
│ │ │ │ -
533 B *p; // pointer to dynamically allocated built-in array
│ │ │ │ -
534 size_type* j; // the index set
│ │ │ │ -
535 };
│ │ │ │ -
536
│ │ │ │ -
537} // end namespace Imp
│ │ │ │ -
538
│ │ │ │ -
539} // end namespace
│ │ │ │ -
540
│ │ │ │ -
541#endif
│ │ │ │ - │ │ │ │ +
338}
│ │ │ │ +
339#endif
│ │ │ │ + │ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
std::size_t countEntries(const BlockVector< T, A > &vector)
Definition matrixmarket.hh:1076
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
Initializer for SuperLU Matrices representing the subdomains.
Definition overlappingschwarz.hh:47
│ │ │ │ +
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,426 +1,353 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -basearray.hh │ │ │ │ │ +bccsmatrixinitializer.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_BASEARRAY_HH │ │ │ │ │ -6#define DUNE_ISTL_BASEARRAY_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH │ │ │ │ │ +6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include "assert.h" │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22 │ │ │ │ │ -24namespace Imp { │ │ │ │ │ -25 │ │ │ │ │ -50 template > │ │ │ │ │ -51 class base_array_unmanaged │ │ │ │ │ -52 { │ │ │ │ │ -53 public: │ │ │ │ │ -54 │ │ │ │ │ -55 //===== type definitions and constants │ │ │ │ │ -56 │ │ │ │ │ -58 typedef B member_type; │ │ │ │ │ -59 │ │ │ │ │ -61 typedef A allocator_type; │ │ │ │ │ -62 │ │ │ │ │ -64 typedef typename A::size_type size_type; │ │ │ │ │ -65 │ │ │ │ │ -67 using reference = B&; │ │ │ │ │ +14#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e │ │ │ │ │ +17{ │ │ │ │ │ +18 template │ │ │ │ │ +19 class OverlappingSchwarzInitializer; │ │ │ │ │ +20} │ │ │ │ │ +21 │ │ │ │ │ +22namespace Dune::ISTL::Impl │ │ │ │ │ +23{ │ │ │ │ │ +31 template │ │ │ │ │ +32 class MatrixRowSubset │ │ │ │ │ +33 { │ │ │ │ │ +34 public: │ │ │ │ │ +36 typedef M Matrix; │ │ │ │ │ +38 typedef S RowIndexSet; │ │ │ │ │ +39 │ │ │ │ │ +45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s) │ │ │ │ │ +46 : m_(m), s_(s) │ │ │ │ │ +47 {} │ │ │ │ │ +48 │ │ │ │ │ +49 const Matrix& matrix() const │ │ │ │ │ +50 { │ │ │ │ │ +51 return m_; │ │ │ │ │ +52 } │ │ │ │ │ +53 │ │ │ │ │ +54 const RowIndexSet& rowIndexSet() const │ │ │ │ │ +55 { │ │ │ │ │ +56 return s_; │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +60 class const_iterator │ │ │ │ │ +61 : public ForwardIteratorFacade │ │ │ │ │ +62 { │ │ │ │ │ +63 public: │ │ │ │ │ +64 const_iterator(typename Matrix::const_iterator firstRow, │ │ │ │ │ +65 typename RowIndexSet::const_iterator pos) │ │ │ │ │ +66 : firstRow_(firstRow), pos_(pos) │ │ │ │ │ +67 {} │ │ │ │ │ 68 │ │ │ │ │ -70 using const_reference = const B&; │ │ │ │ │ -71 │ │ │ │ │ -72 //===== access to components │ │ │ │ │ -73 │ │ │ │ │ -75 reference operator[] (size_type i) │ │ │ │ │ -76 { │ │ │ │ │ -77#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -78 if (i>=n) DUNE_THROW(ISTLError,"index out of range"); │ │ │ │ │ -79#endif │ │ │ │ │ -80 return p[i]; │ │ │ │ │ +69 │ │ │ │ │ +70 const typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e& dereference() const │ │ │ │ │ +71 { │ │ │ │ │ +72 return *(firstRow_+ *pos_); │ │ │ │ │ +73 } │ │ │ │ │ +74 bool equals(const const_iterator& o) const │ │ │ │ │ +75 { │ │ │ │ │ +76 return pos_==o.pos_; │ │ │ │ │ +77 } │ │ │ │ │ +78 void increment() │ │ │ │ │ +79 { │ │ │ │ │ +80 ++pos_; │ │ │ │ │ 81 } │ │ │ │ │ -82 │ │ │ │ │ -84 const_reference operator[] (size_type i) const │ │ │ │ │ -85 { │ │ │ │ │ -86#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -87 if (i>=n) DUNE_THROW(ISTLError,"index out of range"); │ │ │ │ │ -88#endif │ │ │ │ │ -89 return p[i]; │ │ │ │ │ -90 } │ │ │ │ │ -91 │ │ │ │ │ -93 template │ │ │ │ │ -94 class RealIterator │ │ │ │ │ -95 : public RandomAccessIteratorFacade, T> │ │ │ │ │ +82 typename RowIndexSet::value_type index() const │ │ │ │ │ +83 { │ │ │ │ │ +84 return *pos_; │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +87 private: │ │ │ │ │ +89 typename Matrix::const_iterator firstRow_; │ │ │ │ │ +91 typename RowIndexSet::const_iterator pos_; │ │ │ │ │ +92 }; │ │ │ │ │ +93 │ │ │ │ │ +95 const_iterator begin() const │ │ │ │ │ 96 { │ │ │ │ │ -97 public: │ │ │ │ │ -99 typedef typename std::remove_const::type ValueType; │ │ │ │ │ -100 │ │ │ │ │ -101 friend class RandomAccessIteratorFacade, │ │ │ │ │ -const ValueType>; │ │ │ │ │ -102 friend class RandomAccessIteratorFacade, │ │ │ │ │ -ValueType>; │ │ │ │ │ -103 friend class RealIterator; │ │ │ │ │ -104 friend class RealIterator; │ │ │ │ │ -105 │ │ │ │ │ -107 RealIterator () │ │ │ │ │ -108 : p(0), i(0) │ │ │ │ │ -109 {} │ │ │ │ │ -110 │ │ │ │ │ -111 RealIterator (const B* _p, B* _i) : p(_p), i(_i) │ │ │ │ │ -112 { } │ │ │ │ │ -113 │ │ │ │ │ -114 RealIterator(const RealIterator& it) │ │ │ │ │ -115 : p(it.p), i(it.i) │ │ │ │ │ -116 {} │ │ │ │ │ -117 │ │ │ │ │ -119 size_type index () const │ │ │ │ │ +97 return const_iterator(m_.begin(), s_.begin()); │ │ │ │ │ +98 } │ │ │ │ │ +100 const_iterator end() const │ │ │ │ │ +101 { │ │ │ │ │ +102 return const_iterator(m_.begin(), s_.end()); │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +105 private: │ │ │ │ │ +107 const Matrix& m_; │ │ │ │ │ +109 const RowIndexSet& s_; │ │ │ │ │ +110 }; │ │ │ │ │ +111 │ │ │ │ │ +118 template │ │ │ │ │ +119 class BCCSMatrixInitializer │ │ │ │ │ 120 { │ │ │ │ │ -121 return i-p; │ │ │ │ │ -122 } │ │ │ │ │ -123 │ │ │ │ │ -125 bool equals (const RealIterator& other) const │ │ │ │ │ -126 { │ │ │ │ │ -127 assert(other.p==p); │ │ │ │ │ -128 return i==other.i; │ │ │ │ │ -129 } │ │ │ │ │ -130 │ │ │ │ │ -132 bool equals (const RealIterator& other) const │ │ │ │ │ +121 template │ │ │ │ │ +122 friend class _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ +123 public: │ │ │ │ │ +124 using Matrix = M; │ │ │ │ │ +125 using Index = I; │ │ │ │ │ +126 typedef Dune::ISTL::Impl::BCCSMatrix │ │ │ │ │ +OutputMatrix; │ │ │ │ │ +127 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e size_type; │ │ │ │ │ +128 │ │ │ │ │ +131 BCCSMatrixInitializer(OutputMatrix& mat_) │ │ │ │ │ +132 : _m_a_t(&mat_), cols(mat_.M()) │ │ │ │ │ 133 { │ │ │ │ │ -134 assert(other.p==p); │ │ │ │ │ -135 return i==other.i; │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -138 std::ptrdiff_t distanceTo(const RealIterator& o) const │ │ │ │ │ +134 if constexpr (Dune::IsNumber::value) │ │ │ │ │ +135 { │ │ │ │ │ +136 n = m = 1; │ │ │ │ │ +137 } │ │ │ │ │ +138 else │ │ │ │ │ 139 { │ │ │ │ │ -140 return o.i-i; │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -143 private: │ │ │ │ │ -145 void increment() │ │ │ │ │ -146 { │ │ │ │ │ -147 ++i; │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -151 void decrement() │ │ │ │ │ -152 { │ │ │ │ │ -153 --i; │ │ │ │ │ -154 } │ │ │ │ │ -155 │ │ │ │ │ -156 // Needed for operator[] of the iterator │ │ │ │ │ -157 reference elementAt (std::ptrdiff_t offset) const │ │ │ │ │ -158 { │ │ │ │ │ -159 return *(i+offset); │ │ │ │ │ -160 } │ │ │ │ │ -161 │ │ │ │ │ -163 reference dereference () const │ │ │ │ │ -164 { │ │ │ │ │ -165 return *i; │ │ │ │ │ -166 } │ │ │ │ │ -167 │ │ │ │ │ -168 void advance(std::ptrdiff_t d) │ │ │ │ │ -169 { │ │ │ │ │ -170 i+=d; │ │ │ │ │ -171 } │ │ │ │ │ -172 │ │ │ │ │ -173 const B* p; │ │ │ │ │ -174 B* i; │ │ │ │ │ -175 }; │ │ │ │ │ -176 │ │ │ │ │ -178 typedef RealIterator iterator; │ │ │ │ │ -179 │ │ │ │ │ -180 │ │ │ │ │ -182 iterator begin () │ │ │ │ │ -183 { │ │ │ │ │ -184 return iterator(p,p); │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -188 iterator end () │ │ │ │ │ -189 { │ │ │ │ │ -190 return iterator(p,p+n); │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -195 iterator beforeEnd () │ │ │ │ │ -196 { │ │ │ │ │ -197 return iterator(p,p+n-1); │ │ │ │ │ -198 } │ │ │ │ │ -199 │ │ │ │ │ -202 iterator beforeBegin () │ │ │ │ │ -203 { │ │ │ │ │ -204 return iterator(p,p-1); │ │ │ │ │ -205 } │ │ │ │ │ -206 │ │ │ │ │ -208 iterator find (size_type i) │ │ │ │ │ -209 { │ │ │ │ │ -210 return iterator(p,p+std::min(i,n)); │ │ │ │ │ -211 } │ │ │ │ │ -212 │ │ │ │ │ -214 typedef RealIterator const_iterator; │ │ │ │ │ -215 │ │ │ │ │ -217 const_iterator begin () const │ │ │ │ │ -218 { │ │ │ │ │ -219 return const_iterator(p,p+0); │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -223 const_iterator end () const │ │ │ │ │ -224 { │ │ │ │ │ -225 return const_iterator(p,p+n); │ │ │ │ │ -226 } │ │ │ │ │ -227 │ │ │ │ │ -230 const_iterator beforeEnd () const │ │ │ │ │ -231 { │ │ │ │ │ -232 return const_iterator(p,p+n-1); │ │ │ │ │ +140 // WARNING: This assumes that all blocks are dense and identical │ │ │ │ │ +141 n = M::block_type::rows; │ │ │ │ │ +142 m = M::block_type::cols; │ │ │ │ │ +143 } │ │ │ │ │ +144 │ │ │ │ │ +145 _m_a_t->Nnz_=0; │ │ │ │ │ +146 } │ │ │ │ │ +147 │ │ │ │ │ +148 BCCSMatrixInitializer() │ │ │ │ │ +149 : _m_a_t(0), cols(0), n(0), m(0) │ │ │ │ │ +150 {} │ │ │ │ │ +151 │ │ │ │ │ +152 virtual ~BCCSMatrixInitializer() │ │ │ │ │ +153 {} │ │ │ │ │ +154 │ │ │ │ │ +155 template │ │ │ │ │ +156 void addRowNnz(const Iter& row) const │ │ │ │ │ +157 { │ │ │ │ │ +158 _m_a_t->Nnz_+=row->getsize(); │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +161 template │ │ │ │ │ +162 void addRowNnz(const Iter& row, const std::set& indices) │ │ │ │ │ +const │ │ │ │ │ +163 { │ │ │ │ │ +164 auto siter =indices.begin(); │ │ │ │ │ +165 for (auto entry=row->begin(); entry!=row->end(); ++entry) │ │ │ │ │ +166 { │ │ │ │ │ +167 for(; siter!=indices.end() && *siterNnz_; │ │ │ │ │ +173 } │ │ │ │ │ +174 } │ │ │ │ │ +175 │ │ │ │ │ +176 template │ │ │ │ │ +177 void addRowNnz(const Iter& row, const std::vector& indices) │ │ │ │ │ +const │ │ │ │ │ +178 { │ │ │ │ │ +179 for (auto entry=row->begin(); entry!=row->end(); ++entry) │ │ │ │ │ +180 if (indices[entry.index()]!=std::numeric_limits::max()) │ │ │ │ │ +181 ++_m_a_t->Nnz_; │ │ │ │ │ +182 } │ │ │ │ │ +183 │ │ │ │ │ +184 void allocate() │ │ │ │ │ +185 { │ │ │ │ │ +186 allocateMatrixStorage(); │ │ │ │ │ +187 allocateMarker(); │ │ │ │ │ +188 } │ │ │ │ │ +189 │ │ │ │ │ +190 template │ │ │ │ │ +191 void _c_o_u_n_t_E_n_t_r_i_e_s([[maybe_unused]] const Iter& row, const CIter& _c_o_l) const │ │ │ │ │ +192 { │ │ │ │ │ +193 _c_o_u_n_t_E_n_t_r_i_e_s(_c_o_l.index()); │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +196 void _c_o_u_n_t_E_n_t_r_i_e_s(size_type colindex) const │ │ │ │ │ +197 { │ │ │ │ │ +198 for(size_type i=0; i < m; ++i) │ │ │ │ │ +199 { │ │ │ │ │ +200 assert(colindex*m+icolstart[0]=0; │ │ │ │ │ +208 for(size_type i=0; i < cols; ++i) { │ │ │ │ │ +209 assert(icolstart[i+1]=_m_a_t->colstart[i]+marker[i]; │ │ │ │ │ +211 marker[i]=_m_a_t->colstart[i]; │ │ │ │ │ +212 } │ │ │ │ │ +213 } │ │ │ │ │ +214 │ │ │ │ │ +215 template │ │ │ │ │ +216 void copyValue(const Iter& row, const CIter& _c_o_l) const │ │ │ │ │ +217 { │ │ │ │ │ +218 copyValue(_c_o_l, row.index(), _c_o_l.index()); │ │ │ │ │ +219 } │ │ │ │ │ +220 │ │ │ │ │ +221 template │ │ │ │ │ +222 void copyValue(const CIter& _c_o_l, size_type rowindex, size_type colindex) │ │ │ │ │ +const │ │ │ │ │ +223 { │ │ │ │ │ +224 for(size_type i=0; icolstart[colindex*m+j+1]); │ │ │ │ │ +227 assert((size_type)marker[colindex*m+j]<_m_a_t->Nnz_); │ │ │ │ │ +228 _m_a_t->rowindex[marker[colindex*m+j]]=rowindex*n+i; │ │ │ │ │ +229 _m_a_t->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*_c_o_l)[i][j]; │ │ │ │ │ +230 ++marker[colindex*m+j]; // index for next entry in column │ │ │ │ │ +231 } │ │ │ │ │ +232 } │ │ │ │ │ 233 } │ │ │ │ │ 234 │ │ │ │ │ -237 const_iterator beforeBegin () const │ │ │ │ │ -238 { │ │ │ │ │ -239 return const_iterator(p,p-1); │ │ │ │ │ -240 } │ │ │ │ │ +235 virtual void createMatrix() const │ │ │ │ │ +236 { │ │ │ │ │ +237 marker.clear(); │ │ │ │ │ +238 } │ │ │ │ │ +239 │ │ │ │ │ +240 protected: │ │ │ │ │ 241 │ │ │ │ │ -243 const_iterator find (size_type i) const │ │ │ │ │ -244 { │ │ │ │ │ -245 return const_iterator(p,p+std::min(i,n)); │ │ │ │ │ -246 } │ │ │ │ │ -247 │ │ │ │ │ -248 │ │ │ │ │ -249 //===== sizes │ │ │ │ │ +242 void allocateMatrixStorage() const │ │ │ │ │ +243 { │ │ │ │ │ +244 _m_a_t->Nnz_*=n*m; │ │ │ │ │ +245 // initialize data │ │ │ │ │ +246 _m_a_t->values=new typename M::field_type[_m_a_t->Nnz_]; │ │ │ │ │ +247 _m_a_t->rowindex=new I[_m_a_t->Nnz_]; │ │ │ │ │ +248 _m_a_t->colstart=new I[cols+1]; │ │ │ │ │ +249 } │ │ │ │ │ 250 │ │ │ │ │ -252 size_type size () const │ │ │ │ │ -253 { │ │ │ │ │ -254 return n; │ │ │ │ │ +251 void allocateMarker() │ │ │ │ │ +252 { │ │ │ │ │ +253 marker.resize(cols); │ │ │ │ │ +254 std::fill(marker.begin(), marker.end(), 0); │ │ │ │ │ 255 } │ │ │ │ │ 256 │ │ │ │ │ -258 const B* data() const │ │ │ │ │ -259 { │ │ │ │ │ -260 return p; │ │ │ │ │ -261 } │ │ │ │ │ -262 │ │ │ │ │ -264 B* data() │ │ │ │ │ -265 { │ │ │ │ │ -266 return p; │ │ │ │ │ -267 } │ │ │ │ │ -268 │ │ │ │ │ -269 protected: │ │ │ │ │ -271 base_array_unmanaged () │ │ │ │ │ -272 : n(0), p(0) │ │ │ │ │ -273 {} │ │ │ │ │ -275 base_array_unmanaged (size_type n_, B* p_) │ │ │ │ │ -276 : n(n_), p(p_) │ │ │ │ │ -277 {} │ │ │ │ │ -278 size_type n; // number of elements in array │ │ │ │ │ -279 B *p; // pointer to dynamically allocated built-in array │ │ │ │ │ -280 }; │ │ │ │ │ -281 │ │ │ │ │ +257 OutputMatrix* _m_a_t; │ │ │ │ │ +258 size_type cols; │ │ │ │ │ +259 │ │ │ │ │ +260 // Number of rows/columns of the matrix entries │ │ │ │ │ +261 // (assumed to be scalars or dense matrices) │ │ │ │ │ +262 size_type n, m; │ │ │ │ │ +263 │ │ │ │ │ +264 mutable std::vector marker; │ │ │ │ │ +265 }; │ │ │ │ │ +266 │ │ │ │ │ +267 template │ │ │ │ │ +268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix) │ │ │ │ │ +269 { │ │ │ │ │ +270 for (auto row=matrix.begin(); row!= matrix.end(); ++row) │ │ │ │ │ +271 initializer.addRowNnz(row); │ │ │ │ │ +272 │ │ │ │ │ +273 initializer.allocate(); │ │ │ │ │ +274 │ │ │ │ │ +275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) { │ │ │ │ │ +276 │ │ │ │ │ +277 for (auto _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) │ │ │ │ │ +278 initializer.countEntries(row, _c_o_l); │ │ │ │ │ +279 } │ │ │ │ │ +280 │ │ │ │ │ +281 initializer.calcColstart(); │ │ │ │ │ 282 │ │ │ │ │ -283 │ │ │ │ │ -305 template > │ │ │ │ │ -306 class compressed_base_array_unmanaged │ │ │ │ │ -307 { │ │ │ │ │ -308 public: │ │ │ │ │ -309 │ │ │ │ │ -310 //===== type definitions and constants │ │ │ │ │ -311 │ │ │ │ │ -313 typedef B member_type; │ │ │ │ │ -314 │ │ │ │ │ -316 typedef A allocator_type; │ │ │ │ │ +283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) { │ │ │ │ │ +284 for (auto _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) { │ │ │ │ │ +285 initializer.copyValue(row, _c_o_l); │ │ │ │ │ +286 } │ │ │ │ │ +287 │ │ │ │ │ +288 } │ │ │ │ │ +289 initializer.createMatrix(); │ │ │ │ │ +290 } │ │ │ │ │ +291 │ │ │ │ │ +292 template │ │ │ │ │ +293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset& mrs) │ │ │ │ │ +294 { │ │ │ │ │ +295 typedef MatrixRowSubset MRS; │ │ │ │ │ +296 typedef typename MRS::RowIndexSet SIS; │ │ │ │ │ +297 typedef typename SIS::const_iterator SIter; │ │ │ │ │ +298 typedef typename MRS::const_iterator Iter; │ │ │ │ │ +299 typedef typename std::iterator_traits::value_type row_type; │ │ │ │ │ +300 typedef typename row_type::const_iterator CIter; │ │ │ │ │ +301 │ │ │ │ │ +302 typedef typename MRS::Matrix::size_type size_type; │ │ │ │ │ +303 │ │ │ │ │ +304 // A vector containing the corresponding indices in │ │ │ │ │ +305 // the to create submatrix. │ │ │ │ │ +306 // If an entry is the maximum of size_type then this index will not appear │ │ │ │ │ +in │ │ │ │ │ +307 // the submatrix. │ │ │ │ │ +308 std::vector subMatrixIndex(mrs.matrix().N(), │ │ │ │ │ +309 std::numeric_limits::max()); │ │ │ │ │ +310 size_type s=0; │ │ │ │ │ +311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end │ │ │ │ │ +(); ++index) │ │ │ │ │ +312 subMatrixIndex[*index]=s++; │ │ │ │ │ +313 │ │ │ │ │ +314 // Calculate upper Bound for nonzeros │ │ │ │ │ +315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row) │ │ │ │ │ +316 initializer.addRowNnz(row, subMatrixIndex); │ │ │ │ │ 317 │ │ │ │ │ -319 typedef typename A::size_type size_type; │ │ │ │ │ -320 │ │ │ │ │ -322 using reference = B&; │ │ │ │ │ -323 │ │ │ │ │ -325 using const_reference = const B&; │ │ │ │ │ +318 initializer.allocate(); │ │ │ │ │ +319 │ │ │ │ │ +320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row) │ │ │ │ │ +321 for(CIter _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) { │ │ │ │ │ +322 if(subMatrixIndex[_c_o_l.index()]!=std::numeric_limits::max()) │ │ │ │ │ +323 // This column is in our subset (use submatrix column index) │ │ │ │ │ +324 initializer.countEntries(subMatrixIndex[_c_o_l.index()]); │ │ │ │ │ +325 } │ │ │ │ │ 326 │ │ │ │ │ -327 //===== access to components │ │ │ │ │ +327 initializer.calcColstart(); │ │ │ │ │ 328 │ │ │ │ │ -330 reference operator[] (size_type i) │ │ │ │ │ -331 { │ │ │ │ │ -332 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ -333 if (lb == j+n || *lb != i) │ │ │ │ │ -334 DUNE_THROW(ISTLError,"index "<begin(); _c_o_l != row->end(); ++_c_o_l) { │ │ │ │ │ +331 if(subMatrixIndex[_c_o_l.index()]!=std::numeric_limits::max()) │ │ │ │ │ +332 // This value is in our submatrix -> copy (use submatrix indices │ │ │ │ │ +333 initializer.copyValue(_c_o_l, subMatrixIndex[row.index()], subMatrixIndex │ │ │ │ │ +[_c_o_l.index()]); │ │ │ │ │ +334 } │ │ │ │ │ +335 initializer.createMatrix(); │ │ │ │ │ 336 } │ │ │ │ │ 337 │ │ │ │ │ -339 const_reference operator[] (size_type i) const │ │ │ │ │ -340 { │ │ │ │ │ -341 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ -342 if (lb == j+n || *lb != i) │ │ │ │ │ -343 DUNE_THROW(ISTLError,"index "< │ │ │ │ │ -349 class RealIterator │ │ │ │ │ -350 : public BidirectionalIteratorFacade, T> │ │ │ │ │ -351 { │ │ │ │ │ -352 public: │ │ │ │ │ -354 typedef typename std::remove_const::type ValueType; │ │ │ │ │ -355 │ │ │ │ │ -356 friend class BidirectionalIteratorFacade, │ │ │ │ │ -const ValueType>; │ │ │ │ │ -357 friend class BidirectionalIteratorFacade, │ │ │ │ │ -ValueType>; │ │ │ │ │ -358 friend class RealIterator; │ │ │ │ │ -359 friend class RealIterator; │ │ │ │ │ -360 │ │ │ │ │ -362 RealIterator () │ │ │ │ │ -363 : p(0), j(0), i(0) │ │ │ │ │ -364 {} │ │ │ │ │ -365 │ │ │ │ │ -367 RealIterator (B* _p, size_type* _j, size_type _i) │ │ │ │ │ -368 : p(_p), j(_j), i(_i) │ │ │ │ │ -369 { } │ │ │ │ │ -370 │ │ │ │ │ -374 RealIterator(const RealIterator& it) │ │ │ │ │ -375 : p(it.p), j(it.j), i(it.i) │ │ │ │ │ -376 {} │ │ │ │ │ -377 │ │ │ │ │ -378 │ │ │ │ │ -380 bool equals (const RealIterator& it) const │ │ │ │ │ -381 { │ │ │ │ │ -382 assert(p==it.p); │ │ │ │ │ -383 return (i)==(it.i); │ │ │ │ │ -384 } │ │ │ │ │ -385 │ │ │ │ │ -387 bool equals (const RealIterator& it) const │ │ │ │ │ -388 { │ │ │ │ │ -389 assert(p==it.p); │ │ │ │ │ -390 return (i)==(it.i); │ │ │ │ │ -391 } │ │ │ │ │ -392 │ │ │ │ │ -393 │ │ │ │ │ -395 size_type index () const │ │ │ │ │ -396 { │ │ │ │ │ -397 return j[i]; │ │ │ │ │ -398 } │ │ │ │ │ -399 │ │ │ │ │ -401 void setindex (size_type k) │ │ │ │ │ -402 { │ │ │ │ │ -403 return j[i] = k; │ │ │ │ │ -404 } │ │ │ │ │ -405 │ │ │ │ │ -413 size_type offset () const │ │ │ │ │ -414 { │ │ │ │ │ -415 return i; │ │ │ │ │ -416 } │ │ │ │ │ -417 │ │ │ │ │ -418 private: │ │ │ │ │ -420 void increment() │ │ │ │ │ -421 { │ │ │ │ │ -422 ++i; │ │ │ │ │ -423 } │ │ │ │ │ -424 │ │ │ │ │ -426 void decrement() │ │ │ │ │ -427 { │ │ │ │ │ -428 --i; │ │ │ │ │ -429 } │ │ │ │ │ -430 │ │ │ │ │ -432 reference dereference () const │ │ │ │ │ -433 { │ │ │ │ │ -434 return p[i]; │ │ │ │ │ -435 } │ │ │ │ │ -436 │ │ │ │ │ -437 B* p; │ │ │ │ │ -438 size_type* j; │ │ │ │ │ -439 size_type i; │ │ │ │ │ -440 }; │ │ │ │ │ -441 │ │ │ │ │ -443 typedef RealIterator iterator; │ │ │ │ │ -444 │ │ │ │ │ -446 iterator begin () │ │ │ │ │ -447 { │ │ │ │ │ -448 return iterator(p,j,0); │ │ │ │ │ -449 } │ │ │ │ │ -450 │ │ │ │ │ -452 iterator end () │ │ │ │ │ -453 { │ │ │ │ │ -454 return iterator(p,j,n); │ │ │ │ │ -455 } │ │ │ │ │ -456 │ │ │ │ │ -459 iterator beforeEnd () │ │ │ │ │ -460 { │ │ │ │ │ -461 return iterator(p,j,n-1); │ │ │ │ │ -462 } │ │ │ │ │ -463 │ │ │ │ │ -466 iterator beforeBegin () │ │ │ │ │ -467 { │ │ │ │ │ -468 return iterator(p,j,-1); │ │ │ │ │ -469 } │ │ │ │ │ -470 │ │ │ │ │ -472 iterator find (size_type i) │ │ │ │ │ -473 { │ │ │ │ │ -474 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ -475 return (lb != j+n && *lb == i) │ │ │ │ │ -476 ? iterator(p,j,lb-j) │ │ │ │ │ -477 : end(); │ │ │ │ │ -478 } │ │ │ │ │ -479 │ │ │ │ │ -481 typedef RealIterator const_iterator; │ │ │ │ │ -482 │ │ │ │ │ -484 const_iterator begin () const │ │ │ │ │ -485 { │ │ │ │ │ -486 return const_iterator(p,j,0); │ │ │ │ │ -487 } │ │ │ │ │ -488 │ │ │ │ │ -490 const_iterator end () const │ │ │ │ │ -491 { │ │ │ │ │ -492 return const_iterator(p,j,n); │ │ │ │ │ -493 } │ │ │ │ │ -494 │ │ │ │ │ -497 const_iterator beforeEnd () const │ │ │ │ │ -498 { │ │ │ │ │ -499 return const_iterator(p,j,n-1); │ │ │ │ │ -500 } │ │ │ │ │ -501 │ │ │ │ │ -504 const_iterator beforeBegin () const │ │ │ │ │ -505 { │ │ │ │ │ -506 return const_iterator(p,j,-1); │ │ │ │ │ -507 } │ │ │ │ │ -508 │ │ │ │ │ -510 const_iterator find (size_type i) const │ │ │ │ │ -511 { │ │ │ │ │ -512 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ -513 return (lb != j+n && *lb == i) │ │ │ │ │ -514 ? const_iterator(p,j,lb-j) │ │ │ │ │ -515 : end(); │ │ │ │ │ -516 } │ │ │ │ │ -517 │ │ │ │ │ -518 //===== sizes │ │ │ │ │ -519 │ │ │ │ │ -521 size_type size () const │ │ │ │ │ -522 { │ │ │ │ │ -523 return n; │ │ │ │ │ -524 } │ │ │ │ │ -525 │ │ │ │ │ -526 protected: │ │ │ │ │ -528 compressed_base_array_unmanaged () │ │ │ │ │ -529 : n(0), p(0), j(0) │ │ │ │ │ -530 {} │ │ │ │ │ -531 │ │ │ │ │ -532 size_type n; // number of elements in array │ │ │ │ │ -533 B *p; // pointer to dynamically allocated built-in array │ │ │ │ │ -534 size_type* j; // the index set │ │ │ │ │ -535 }; │ │ │ │ │ -536 │ │ │ │ │ -537} // end namespace Imp │ │ │ │ │ -538 │ │ │ │ │ -539} // end namespace │ │ │ │ │ -540 │ │ │ │ │ -541#endif │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +338} │ │ │ │ │ +339#endif │ │ │ │ │ +_b_c_c_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s │ │ │ │ │ +std::size_t countEntries(const BlockVector< T, A > &vector) │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1076 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +Type for indices and sizes. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ +The type implementing a matrix row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00029.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: preconditioners.hh File Reference │ │ │ │ +dune-istl: multitypeblockmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,98 +72,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ +
multitypeblockmatrix.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Define general preconditioner interface. │ │ │ │ -More...

│ │ │ │
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ #include <iostream>
│ │ │ │ -#include <iomanip>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <string>
│ │ │ │ -#include <dune/common/simd/simd.hh>
│ │ │ │ -#include <dune/common/parametertree.hh>
│ │ │ │ -#include <dune/istl/solverregistry.hh>
│ │ │ │ -#include "preconditioner.hh"
│ │ │ │ -#include "solver.hh"
│ │ │ │ -#include "solvercategory.hh"
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include "matrixutils.hh"
│ │ │ │ -#include "gsetc.hh"
│ │ │ │ -#include "ildl.hh"
│ │ │ │ -#include "ilu.hh"
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include "gsetc.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::InverseOperator2Preconditioner< O, c >
 Turns an InverseOperator into a Preconditioner. More...
 
class  Dune::SeqSSOR< M, X, Y, l >
 Sequential SSOR preconditioner. More...
class  Dune::MultiTypeBlockMatrix< FirstRow, Args >
 A Matrix class to support different block types. More...
 
class  Dune::SeqSOR< M, X, Y, l >
 Sequential SOR preconditioner. More...
class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col >
 part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
 
class  Dune::SeqJac< M, X, Y, l >
 The sequential jacobian preconditioner. More...
class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 >
 
class  Dune::SeqILU< M, X, Y, l >
 Sequential ILU preconditioner. More...
class  Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row >
 solver for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
 
class  Dune::Richardson< X, Y >
 Richardson preconditioner. More...
class  Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 >
 
class  Dune::SeqILDL< M, X, Y >
 sequential ILDL preconditioner More...
struct  std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >
 Make std::tuple_element work for MultiTypeBlockMatrix. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class M , class X , class Y , int l = 1>
using Dune::SeqGS = SeqSOR< M, X, Y, l >
 Sequential Gauss Seidel preconditioner.
 
namespace  std
 STL namespace.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

 Dune::DUNE_REGISTER_PRECONDITIONER ("ssor", defaultPreconditionerBlockLevelCreator< Dune::SeqSSOR >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("sor", defaultPreconditionerBlockLevelCreator< Dune::SeqSOR >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("gs", defaultPreconditionerBlockLevelCreator< Dune::SeqGS >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("jac", defaultPreconditionerBlockLevelCreator< Dune::SeqJac >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("ilu", defaultPreconditionerBlockLevelCreator< Dune::SeqILU >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("richardson", [](auto tl, const auto &, const ParameterTree &config){ using D=typename Dune::TypeListElement< 1, decltype(tl)>::type;using R=typename Dune::TypeListElement< 2, decltype(tl)>::type;return std::make_shared< Richardson< D, R > >(config);})
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("ildl", defaultPreconditionerCreator< Dune::SeqILDL >())
 
template<typename T1 , typename... Args>
std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockMatrix< T1, Args... > &m)
 << operator for a MultiTypeBlockMatrix
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Define general preconditioner interface.

│ │ │ │ -

Wrap the methods implemented by ISTL in this interface. However, the interface is extensible such that new preconditioners can be implemented and used with the solvers.

│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,89 +1,47 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -preconditioners.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -Define general preconditioner interface. _M_o_r_e_._._. │ │ │ │ │ +_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 │ │ │ │ │ +multitypeblockmatrix.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ -#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ -#include "_s_o_l_v_e_r_._h_h" │ │ │ │ │ -#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ #include "_g_s_e_t_c_._h_h" │ │ │ │ │ -#include "_i_l_d_l_._h_h" │ │ │ │ │ -#include "_i_l_u_._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_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _O_,_ _c_ _> │ │ │ │ │ -  Turns an _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r into a _P_r_e_c_o_n_d_i_t_i_o_n_e_r. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _F_i_r_s_t_R_o_w_,_ _A_r_g_s_ _> │ │ │ │ │ +  A _M_a_t_r_i_x class to support different block types. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_S_e_q_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ -  Sequential SSOR preconditioner. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_ _I_,_ _c_r_o_w_,_ _c_c_o_l_,_ _r_e_m_a_i_n___c_o_l_ _> │ │ │ │ │ +  part of solvers for _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r & _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x types │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ -  Sequential SOR preconditioner. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_ _I_,_ _c_r_o_w_,_ _c_c_o_l_,_ _0_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_S_e_q_J_a_c_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ -  The sequential jacobian preconditioner. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _r_e_m_a_i_n___r_o_w_ _> │ │ │ │ │ +  solver for _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r & _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x types _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_S_e_q_I_L_U_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ -  Sequential _I_L_U preconditioner. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _> │ │ │ │ │ -  _R_i_c_h_a_r_d_s_o_n preconditioner. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_S_e_q_I_L_D_L_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  sequential ILDL preconditioner _M_o_r_e_._._. │ │ │ │ │ +struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ +  Make std::tuple_element work for MultiTypeBlockMatrix. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_S_e_q_G_S = _S_e_q_S_O_R< M, X, Y, l > │ │ │ │ │ -  Sequential Gauss Seidel preconditioner. │ │ │ │ │ +namespace   _s_t_d │ │ │ │ │ +  STL namespace. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("ssor", │ │ │ │ │ - _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_S_S_O_R >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("sor", │ │ │ │ │ - _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_S_O_R >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("gs", │ │ │ │ │ - _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_G_S >()) │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x< │ │ │ │ │ + T1, Args... > &m) │ │ │ │ │ +  << operator for a _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │   │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("jac", │ │ │ │ │ - _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_J_a_c >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("ilu", │ │ │ │ │ - _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_I_L_U >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("richardson", [](auto tl, const auto &, │ │ │ │ │ - const ParameterTree &config){ using D=typename Dune::TypeListElement< 1, │ │ │ │ │ - decltype(tl)>::type;using R=typename Dune::TypeListElement< 2, decltype │ │ │ │ │ - (tl)>::type;return std::make_shared< _R_i_c_h_a_r_d_s_o_n< D, R > >(config);}) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("ildl", _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_C_r_e_a_t_o_r< │ │ │ │ │ - _D_u_n_e_:_:_S_e_q_I_L_D_L >()) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -Wrap the methods implemented by ISTL in this interface. However, the interface │ │ │ │ │ -is extensible such that new preconditioners can be implemented and used with │ │ │ │ │ -the solvers. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00029_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: preconditioners.hh Source File │ │ │ │ +dune-istl: multitypeblockmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,738 +74,666 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
preconditioners.hh
│ │ │ │ +
multitypeblockmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_PRECONDITIONERS_HH
│ │ │ │ -
6#define DUNE_ISTL_PRECONDITIONERS_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
│ │ │ │
7
│ │ │ │
8#include <cmath>
│ │ │ │ -
9#include <complex>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <iomanip>
│ │ │ │ -
12#include <memory>
│ │ │ │ -
13#include <string>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/simd/simd.hh>
│ │ │ │ -
16#include <dune/common/parametertree.hh>
│ │ │ │ -
17
│ │ │ │ - │ │ │ │ -
19#include "preconditioner.hh"
│ │ │ │ -
20#include "solver.hh"
│ │ │ │ -
21#include "solvercategory.hh"
│ │ │ │ -
22#include "istlexception.hh"
│ │ │ │ -
23#include "matrixutils.hh"
│ │ │ │ -
24#include "gsetc.hh"
│ │ │ │ -
25#include "ildl.hh"
│ │ │ │ -
26#include "ilu.hh"
│ │ │ │ +
9#include <iostream>
│ │ │ │ +
10#include <tuple>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/hybridutilities.hh>
│ │ │ │ +
13
│ │ │ │ +
14#include "istlexception.hh"
│ │ │ │ +
15
│ │ │ │ +
16// forward declaration
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
19 template<typename FirstRow, typename... Args>
│ │ │ │ +
20 class MultiTypeBlockMatrix;
│ │ │ │ +
21
│ │ │ │ +
22 template<int I, int crow, int remain_row>
│ │ │ │ +
23 class MultiTypeBlockMatrix_Solver;
│ │ │ │ +
24}
│ │ │ │ +
25
│ │ │ │ +
26#include "gsetc.hh"
│ │ │ │
27
│ │ │ │ -
28
│ │ │ │ -
29namespace Dune {
│ │ │ │ -
72 template<class O, int c = -1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
74 public Preconditioner<typename O::domain_type, typename O::range_type>
│ │ │ │ -
75 {
│ │ │ │ -
76 public:
│ │ │ │ -
78 typedef typename O::domain_type domain_type;
│ │ │ │ -
80 typedef typename O::range_type range_type;
│ │ │ │ -
82 typedef typename range_type::field_type field_type;
│ │ │ │ -
84 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
86 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
88 typedef O InverseOperator;
│ │ │ │ -
89
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
95 : inverse_operator_(inverse_operator)
│ │ │ │ -
96 {
│ │ │ │ -
97 if(c != -1 && SolverCategory::category(inverse_operator_) != c)
│ │ │ │ -
98 DUNE_THROW(InvalidStateException, "User-supplied solver category does not match that of the given inverse operator");
│ │ │ │ -
99 }
│ │ │ │ -
│ │ │ │ -
100
│ │ │ │ -
│ │ │ │ -
101 virtual void pre(domain_type&,range_type&)
│ │ │ │ -
102 {}
│ │ │ │ -
│ │ │ │ -
103
│ │ │ │ +
28namespace Dune {
│ │ │ │ +
29
│ │ │ │ +
43 template<typename FirstRow, typename... Args>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
45 : public std::tuple<FirstRow, Args...>
│ │ │ │ +
46 {
│ │ │ │ +
47 using ParentType = std::tuple<FirstRow, Args...>;
│ │ │ │ +
48 public:
│ │ │ │ +
49
│ │ │ │ +
51 using ParentType::ParentType;
│ │ │ │ +
52
│ │ │ │ +
56 typedef MultiTypeBlockMatrix<FirstRow, Args...> type;
│ │ │ │ +
57
│ │ │ │ +
59 using size_type = std::size_t;
│ │ │ │ +
60
│ │ │ │ +
61 typedef typename FirstRow::field_type field_type;
│ │ │ │ +
62
│ │ │ │ +
│ │ │ │ +
64 static constexpr size_type N()
│ │ │ │ +
65 {
│ │ │ │ +
66 return 1+sizeof...(Args);
│ │ │ │ +
67 }
│ │ │ │ +
│ │ │ │ +
68
│ │ │ │ +
74 [[deprecated("Use method 'N' instead")]]
│ │ │ │ +
│ │ │ │ +
75 static constexpr size_type size()
│ │ │ │ +
76 {
│ │ │ │ +
77 return 1+sizeof...(Args);
│ │ │ │ +
78 }
│ │ │ │ +
│ │ │ │ +
79
│ │ │ │ +
│ │ │ │ +
81 static constexpr size_type M()
│ │ │ │ +
82 {
│ │ │ │ +
83 return FirstRow::size();
│ │ │ │ +
84 }
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
102 template< size_type index >
│ │ │ │ +
103 auto
│ │ │ │
│ │ │ │ -
104 virtual void apply(domain_type& v, const range_type& d)
│ │ │ │ -
105 {
│ │ │ │ - │ │ │ │ -
107 range_type copy(d);
│ │ │ │ -
108 inverse_operator_.apply(v, copy, res);
│ │ │ │ -
109 }
│ │ │ │ -
│ │ │ │ -
110
│ │ │ │ -
│ │ │ │ -
111 virtual void post(domain_type&)
│ │ │ │ -
112 {}
│ │ │ │ -
│ │ │ │ -
113
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
116 {
│ │ │ │ -
117 return SolverCategory::category(inverse_operator_);
│ │ │ │ -
118 }
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
120 private:
│ │ │ │ -
121 InverseOperator& inverse_operator_;
│ │ │ │ -
122 };
│ │ │ │ -
│ │ │ │ -
123
│ │ │ │ -
124 //=====================================================================
│ │ │ │ -
125 // Implementation of this interface for sequential ISTL-preconditioners
│ │ │ │ -
126 //=====================================================================
│ │ │ │ -
127
│ │ │ │ -
128
│ │ │ │ -
140 template<class M, class X, class Y, int l=1>
│ │ │ │ -
│ │ │ │ -
141 class SeqSSOR : public Preconditioner<X,Y> {
│ │ │ │ -
142 public:
│ │ │ │ -
144 typedef M matrix_type;
│ │ │ │ -
146 typedef X domain_type;
│ │ │ │ -
148 typedef Y range_type;
│ │ │ │ -
150 typedef typename X::field_type field_type;
│ │ │ │ -
152 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
154 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
155
│ │ │ │ -
│ │ │ │ -
163 SeqSSOR (const M& A, int n, real_field_type w)
│ │ │ │ -
164 : _A_(A), _n(n), _w(w)
│ │ │ │ -
165 {
│ │ │ │ - │ │ │ │ -
167 }
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
│ │ │ │ -
182 SeqSSOR (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ -
183 : SeqSSOR(A->getmat(), configuration)
│ │ │ │ -
184 {}
│ │ │ │ -
│ │ │ │ -
185
│ │ │ │ -
│ │ │ │ -
199 SeqSSOR (const M& A, const ParameterTree& configuration)
│ │ │ │ -
200 : SeqSSOR(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
│ │ │ │ -
201 {}
│ │ │ │ +
104 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
│ │ │ │ +
105 -> decltype(std::get<index>(*this))
│ │ │ │ +
106 {
│ │ │ │ +
107 return std::get<index>(*this);
│ │ │ │ +
108 }
│ │ │ │ +
│ │ │ │ +
109
│ │ │ │ +
115 template< size_type index >
│ │ │ │ +
116 auto
│ │ │ │ +
│ │ │ │ +
117 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
│ │ │ │ +
118 -> decltype(std::get<index>(*this))
│ │ │ │ +
119 {
│ │ │ │ +
120 return std::get<index>(*this);
│ │ │ │ +
121 }
│ │ │ │ +
│ │ │ │ +
122
│ │ │ │ +
126 template<typename T>
│ │ │ │ +
│ │ │ │ +
127 void operator= (const T& newval) {
│ │ │ │ +
128 using namespace Dune::Hybrid;
│ │ │ │ +
129 auto size = index_constant<1+sizeof...(Args)>();
│ │ │ │ +
130 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented,
│ │ │ │ +
131 // we cannot use a plain forEach(*this, ...). This could be achieved,
│ │ │ │ +
132 // e.g., by implementing a static size() method.
│ │ │ │ +
133 forEach(integralRange(size), [&](auto&& i) {
│ │ │ │ +
134 (*this)[i] = newval;
│ │ │ │ +
135 });
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
138 //===== vector space arithmetic
│ │ │ │ +
139
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
142 {
│ │ │ │ +
143 auto size = index_constant<N()>();
│ │ │ │ +
144 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ +
145 (*this)[i] *= k;
│ │ │ │ +
146 });
│ │ │ │ +
147
│ │ │ │ +
148 return *this;
│ │ │ │ +
149 }
│ │ │ │ +
│ │ │ │ +
150
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
153 {
│ │ │ │ +
154 auto size = index_constant<N()>();
│ │ │ │ +
155 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ +
156 (*this)[i] /= k;
│ │ │ │ +
157 });
│ │ │ │ +
158
│ │ │ │ +
159 return *this;
│ │ │ │ +
160 }
│ │ │ │ +
│ │ │ │ +
161
│ │ │ │ +
162
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
169 {
│ │ │ │ +
170 auto size = index_constant<N()>();
│ │ │ │ +
171 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ +
172 (*this)[i] += b[i];
│ │ │ │ +
173 });
│ │ │ │ +
174
│ │ │ │ +
175 return *this;
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
184 {
│ │ │ │ +
185 auto size = index_constant<N()>();
│ │ │ │ +
186 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ +
187 (*this)[i] -= b[i];
│ │ │ │ +
188 });
│ │ │ │ +
189
│ │ │ │ +
190 return *this;
│ │ │ │ +
191 }
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
195 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
196 void mv (const X& x, Y& y) const {
│ │ │ │ +
197 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ +
198 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ +
199 y = 0; //reset y (for mv uses umv)
│ │ │ │ +
200 umv(x,y);
│ │ │ │ +
201 }
│ │ │ │
│ │ │ │
202
│ │ │ │ -
│ │ │ │ -
208 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ -
209 {}
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
│ │ │ │ -
216 virtual void apply (X& v, const Y& d)
│ │ │ │ -
217 {
│ │ │ │ -
218 for (int i=0; i<_n; i++) {
│ │ │ │ -
219 bsorf(_A_,v,d,_w,BL<l>());
│ │ │ │ -
220 bsorb(_A_,v,d,_w,BL<l>());
│ │ │ │ -
221 }
│ │ │ │ -
222 }
│ │ │ │ -
│ │ │ │ -
223
│ │ │ │ -
│ │ │ │ -
229 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ -
230 {}
│ │ │ │ -
│ │ │ │ -
231
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
234 {
│ │ │ │ - │ │ │ │ -
236 }
│ │ │ │ -
│ │ │ │ -
237
│ │ │ │ -
238 private:
│ │ │ │ -
240 const M& _A_;
│ │ │ │ -
242 int _n;
│ │ │ │ - │ │ │ │ -
245 };
│ │ │ │ +
205 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
206 void umv (const X& x, Y& y) const {
│ │ │ │ +
207 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ +
208 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ +
209 using namespace Dune::Hybrid;
│ │ │ │ +
210 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
211 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
212 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
213 (*this)[i][j].umv(x[j], y[i]);
│ │ │ │ +
214 });
│ │ │ │ +
215 });
│ │ │ │ +
216 }
│ │ │ │ +
│ │ │ │ +
217
│ │ │ │ +
220 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
221 void mmv (const X& x, Y& y) const {
│ │ │ │ +
222 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ +
223 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ +
224 using namespace Dune::Hybrid;
│ │ │ │ +
225 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
226 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
227 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
228 (*this)[i][j].mmv(x[j], y[i]);
│ │ │ │ +
229 });
│ │ │ │ +
230 });
│ │ │ │ +
231 }
│ │ │ │ +
│ │ │ │ +
232
│ │ │ │ +
235 template<typename AlphaType, typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
236 void usmv (const AlphaType& alpha, const X& x, Y& y) const {
│ │ │ │ +
237 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ +
238 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ +
239 using namespace Dune::Hybrid;
│ │ │ │ +
240 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
241 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
242 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
243 (*this)[i][j].usmv(alpha, x[j], y[i]);
│ │ │ │ +
244 });
│ │ │ │ +
245 });
│ │ │ │ +
246 }
│ │ │ │
│ │ │ │ -
246 DUNE_REGISTER_PRECONDITIONER("ssor", defaultPreconditionerBlockLevelCreator<Dune::SeqSSOR>());
│ │ │ │
247
│ │ │ │ -
248
│ │ │ │ -
260 template<class M, class X, class Y, int l=1>
│ │ │ │ -
│ │ │ │ -
261 class SeqSOR : public Preconditioner<X,Y> {
│ │ │ │ -
262 public:
│ │ │ │ -
264 typedef M matrix_type;
│ │ │ │ -
266 typedef X domain_type;
│ │ │ │ -
268 typedef Y range_type;
│ │ │ │ -
270 typedef typename X::field_type field_type;
│ │ │ │ -
272 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
274 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
275
│ │ │ │ -
│ │ │ │ -
283 SeqSOR (const M& A, int n, real_field_type w)
│ │ │ │ -
284 : _A_(A), _n(n), _w(w)
│ │ │ │ -
285 {
│ │ │ │ - │ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
│ │ │ │ -
302 SeqSOR (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ -
303 : SeqSOR(A->getmat(), configuration)
│ │ │ │ -
304 {}
│ │ │ │ -
│ │ │ │ -
305
│ │ │ │ -
│ │ │ │ -
319 SeqSOR (const M& A, const ParameterTree& configuration)
│ │ │ │ -
320 : SeqSOR(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
│ │ │ │ -
321 {}
│ │ │ │ -
│ │ │ │ -
322
│ │ │ │ -
│ │ │ │ -
328 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ -
329 {}
│ │ │ │ +
250 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
251 void mtv (const X& x, Y& y) const {
│ │ │ │ +
252 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
253 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
254 y = 0;
│ │ │ │ +
255 umtv(x,y);
│ │ │ │ +
256 }
│ │ │ │ +
│ │ │ │ +
257
│ │ │ │ +
260 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
261 void umtv (const X& x, Y& y) const {
│ │ │ │ +
262 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
263 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
264 using namespace Dune::Hybrid;
│ │ │ │ +
265 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
266 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
267 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
268 (*this)[j][i].umtv(x[j], y[i]);
│ │ │ │ +
269 });
│ │ │ │ +
270 });
│ │ │ │ +
271 }
│ │ │ │ +
│ │ │ │ +
272
│ │ │ │ +
275 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
276 void mmtv (const X& x, Y& y) const {
│ │ │ │ +
277 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
278 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
279 using namespace Dune::Hybrid;
│ │ │ │ +
280 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
281 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
282 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
283 (*this)[j][i].mmtv(x[j], y[i]);
│ │ │ │ +
284 });
│ │ │ │ +
285 });
│ │ │ │ +
286 }
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
290 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
291 void usmtv (const field_type& alpha, const X& x, Y& y) const {
│ │ │ │ +
292 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
293 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
294 using namespace Dune::Hybrid;
│ │ │ │ +
295 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
296 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
297 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
298 (*this)[j][i].usmtv(alpha, x[j], y[i]);
│ │ │ │ +
299 });
│ │ │ │ +
300 });
│ │ │ │ +
301 }
│ │ │ │ +
│ │ │ │ +
302
│ │ │ │ +
305 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
306 void umhv (const X& x, Y& y) const {
│ │ │ │ +
307 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
308 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
309 using namespace Dune::Hybrid;
│ │ │ │ +
310 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
311 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
312 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
313 (*this)[j][i].umhv(x[j], y[i]);
│ │ │ │ +
314 });
│ │ │ │ +
315 });
│ │ │ │ +
316 }
│ │ │ │ +
│ │ │ │ +
317
│ │ │ │ +
320 template<typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
321 void mmhv (const X& x, Y& y) const {
│ │ │ │ +
322 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
323 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
324 using namespace Dune::Hybrid;
│ │ │ │ +
325 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
326 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
327 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
328 (*this)[j][i].mmhv(x[j], y[i]);
│ │ │ │ +
329 });
│ │ │ │ +
330 });
│ │ │ │ +
331 }
│ │ │ │
│ │ │ │ -
330
│ │ │ │ +
332
│ │ │ │ +
335 template<typename X, typename Y>
│ │ │ │
│ │ │ │ -
336 virtual void apply (X& v, const Y& d)
│ │ │ │ -
337 {
│ │ │ │ -
338 this->template apply<true>(v,d);
│ │ │ │ -
339 }
│ │ │ │ -
│ │ │ │ -
340
│ │ │ │ -
349 template<bool forward>
│ │ │ │ -
│ │ │ │ -
350 void apply(X& v, const Y& d)
│ │ │ │ -
351 {
│ │ │ │ -
352 if(forward)
│ │ │ │ -
353 for (int i=0; i<_n; i++) {
│ │ │ │ -
354 bsorf(_A_,v,d,_w,BL<l>());
│ │ │ │ -
355 }
│ │ │ │ -
356 else
│ │ │ │ -
357 for (int i=0; i<_n; i++) {
│ │ │ │ -
358 bsorb(_A_,v,d,_w,BL<l>());
│ │ │ │ -
359 }
│ │ │ │ -
360 }
│ │ │ │ -
│ │ │ │ -
361
│ │ │ │ -
│ │ │ │ -
367 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ -
368 {}
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
372 {
│ │ │ │ - │ │ │ │ -
374 }
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
376 private:
│ │ │ │ -
378 const M& _A_;
│ │ │ │ -
380 int _n;
│ │ │ │ - │ │ │ │ -
383 };
│ │ │ │ -
│ │ │ │ -
384 DUNE_REGISTER_PRECONDITIONER("sor", defaultPreconditionerBlockLevelCreator<Dune::SeqSOR>());
│ │ │ │ -
385
│ │ │ │ -
386
│ │ │ │ -
397 template<class M, class X, class Y, int l=1>
│ │ │ │ - │ │ │ │ -
399 DUNE_REGISTER_PRECONDITIONER("gs", defaultPreconditionerBlockLevelCreator<Dune::SeqGS>());
│ │ │ │ -
400
│ │ │ │ -
411 template<class M, class X, class Y, int l=1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
413 public:
│ │ │ │ -
415 typedef M matrix_type;
│ │ │ │ -
417 typedef X domain_type;
│ │ │ │ -
419 typedef Y range_type;
│ │ │ │ -
421 typedef typename X::field_type field_type;
│ │ │ │ -
423 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
425 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
426
│ │ │ │ -
│ │ │ │ -
434 SeqJac (const M& A, int n, real_field_type w)
│ │ │ │ -
435 : _A_(A), _n(n), _w(w)
│ │ │ │ -
436 {
│ │ │ │ - │ │ │ │ -
438 }
│ │ │ │ -
│ │ │ │ -
439
│ │ │ │ -
│ │ │ │ -
453 SeqJac (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ -
454 : SeqJac(A->getmat(), configuration)
│ │ │ │ -
455 {}
│ │ │ │ -
│ │ │ │ -
456
│ │ │ │ -
│ │ │ │ -
470 SeqJac (const M& A, const ParameterTree& configuration)
│ │ │ │ -
471 : SeqJac(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
│ │ │ │ -
472 {}
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
│ │ │ │ -
479 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ -
480 {}
│ │ │ │ -
│ │ │ │ -
481
│ │ │ │ -
│ │ │ │ -
487 virtual void apply (X& v, const Y& d)
│ │ │ │ -
488 {
│ │ │ │ -
489 for (int i=0; i<_n; i++) {
│ │ │ │ -
490 dbjac(_A_,v,d,_w,BL<l>());
│ │ │ │ -
491 }
│ │ │ │ -
492 }
│ │ │ │ -
│ │ │ │ -
493
│ │ │ │ -
│ │ │ │ -
499 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ -
500 {}
│ │ │ │ -
│ │ │ │ -
501
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
504 {
│ │ │ │ - │ │ │ │ -
506 }
│ │ │ │ +
336 void usmhv (const field_type& alpha, const X& x, Y& y) const {
│ │ │ │ +
337 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ +
338 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ +
339 using namespace Dune::Hybrid;
│ │ │ │ +
340 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ +
341 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
342 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ +
343 (*this)[j][i].usmhv(alpha, x[j], y[i]);
│ │ │ │ +
344 });
│ │ │ │ +
345 });
│ │ │ │ +
346 }
│ │ │ │ +
│ │ │ │ +
347
│ │ │ │ +
348
│ │ │ │ +
349 //===== norms
│ │ │ │ +
350
│ │ │ │ +
│ │ │ │ +
352 auto frobenius_norm2 () const
│ │ │ │ +
353 {
│ │ │ │ +
354 using field_type_00 = typename std::decay_t<decltype((*this)[Indices::_0][Indices::_0])>::field_type;
│ │ │ │ +
355 typename FieldTraits<field_type_00>::real_type sum=0;
│ │ │ │ +
356
│ │ │ │ +
357 auto rows = index_constant<N()>();
│ │ │ │ +
358 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
│ │ │ │ +
359 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
│ │ │ │ +
360 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
│ │ │ │ +
361 sum += (*this)[i][j].frobenius_norm2();
│ │ │ │ +
362 });
│ │ │ │ +
363 });
│ │ │ │ +
364
│ │ │ │ +
365 return sum;
│ │ │ │ +
366 }
│ │ │ │ +
│ │ │ │ +
367
│ │ │ │ +
│ │ │ │ +
369 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ +
370 {
│ │ │ │ +
371 return sqrt(frobenius_norm2());
│ │ │ │ +
372 }
│ │ │ │ +
│ │ │ │ +
373
│ │ │ │ +
│ │ │ │ +
375 auto infinity_norm () const
│ │ │ │ +
376 {
│ │ │ │ +
377 using field_type_00 = typename std::decay_t<decltype((*this)[Indices::_0][Indices::_0])>::field_type;
│ │ │ │ +
378 using std::max;
│ │ │ │ +
379 typename FieldTraits<field_type_00>::real_type norm=0;
│ │ │ │ +
380
│ │ │ │ +
381 auto rows = index_constant<N()>();
│ │ │ │ +
382 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
│ │ │ │ +
383
│ │ │ │ +
384 typename FieldTraits<field_type_00>::real_type sum=0;
│ │ │ │ +
385 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
│ │ │ │ +
386 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
│ │ │ │ +
387 sum += (*this)[i][j].infinity_norm();
│ │ │ │ +
388 });
│ │ │ │ +
389 norm = max(sum, norm);
│ │ │ │ +
390 });
│ │ │ │ +
391
│ │ │ │ +
392 return norm;
│ │ │ │ +
393 }
│ │ │ │ +
│ │ │ │ +
394
│ │ │ │ +
│ │ │ │ +
396 auto infinity_norm_real () const
│ │ │ │ +
397 {
│ │ │ │ +
398 using field_type_00 = typename std::decay_t<decltype((*this)[Indices::_0][Indices::_0])>::field_type;
│ │ │ │ +
399 using std::max;
│ │ │ │ +
400 typename FieldTraits<field_type_00>::real_type norm=0;
│ │ │ │ +
401
│ │ │ │ +
402 auto rows = index_constant<N()>();
│ │ │ │ +
403 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
│ │ │ │ +
404
│ │ │ │ +
405 typename FieldTraits<field_type_00>::real_type sum=0;
│ │ │ │ +
406 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
│ │ │ │ +
407 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
│ │ │ │ +
408 sum += (*this)[i][j].infinity_norm_real();
│ │ │ │ +
409 });
│ │ │ │ +
410 norm = max(sum, norm);
│ │ │ │ +
411 });
│ │ │ │ +
412
│ │ │ │ +
413 return norm;
│ │ │ │ +
414 }
│ │ │ │ +
│ │ │ │ +
415
│ │ │ │ +
416 };
│ │ │ │ +
│ │ │ │ +
417
│ │ │ │ +
423 template<typename T1, typename... Args>
│ │ │ │ +
│ │ │ │ +
424 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockMatrix<T1,Args...>& m) {
│ │ │ │ +
425 auto N = index_constant<MultiTypeBlockMatrix<T1,Args...>::N()>();
│ │ │ │ +
426 auto M = index_constant<MultiTypeBlockMatrix<T1,Args...>::M()>();
│ │ │ │ +
427 using namespace Dune::Hybrid;
│ │ │ │ +
428 forEach(integralRange(N), [&](auto&& i) {
│ │ │ │ +
429 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
430 forEach(integralRange(M), [&](auto&& j) {
│ │ │ │ +
431 s << "\t(" << i << ", " << j << "): \n" << m[i][j];
│ │ │ │ +
432 });
│ │ │ │ +
433 });
│ │ │ │ +
434 s << std::endl;
│ │ │ │ +
435 return s;
│ │ │ │ +
436 }
│ │ │ │ +
│ │ │ │ +
437
│ │ │ │ +
438 //make algmeta_itsteps known
│ │ │ │ +
439 template<int I, typename M>
│ │ │ │ +
440 struct algmeta_itsteps;
│ │ │ │ +
441
│ │ │ │ +
448 template<int I, int crow, int ccol, int remain_col> //MultiTypeBlockMatrix_Solver_Col: iterating over one row
│ │ │ │ +
│ │ │ │ +
449 class MultiTypeBlockMatrix_Solver_Col { //calculating b- A[i][j]*x[j]
│ │ │ │ +
450 public:
│ │ │ │ +
454 template <typename Trhs, typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
455 static void calc_rhs(const TMatrix& A, TVector& x, TVector& v, Trhs& b, const K& w) {
│ │ │ │ +
456 std::get<ccol>( std::get<crow>(A) ).mmv( std::get<ccol>(x), b );
│ │ │ │ + │ │ │ │ +
458 }
│ │ │ │ +
│ │ │ │ +
459
│ │ │ │ +
460 };
│ │ │ │ +
│ │ │ │ +
461 template<int I, int crow, int ccol> //MultiTypeBlockMatrix_Solver_Col recursion end
│ │ │ │ +
│ │ │ │ +
462 class MultiTypeBlockMatrix_Solver_Col<I,crow,ccol,0> {
│ │ │ │ +
463 public:
│ │ │ │ +
464 template <typename Trhs, typename TVector, typename TMatrix, typename K>
│ │ │ │ +
465 static void calc_rhs(const TMatrix&, TVector&, TVector&, Trhs&, const K&) {}
│ │ │ │ +
466 };
│ │ │ │ +
│ │ │ │ +
467
│ │ │ │ +
468
│ │ │ │ +
469
│ │ │ │ +
476 template<int I, int crow, int remain_row>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
478 public:
│ │ │ │ +
479
│ │ │ │ +
483 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
484 static void dbgs(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ +
485 TVector xold(x);
│ │ │ │ +
486 xold=x; //store old x values
│ │ │ │ + │ │ │ │ +
488 x *= w;
│ │ │ │ +
489 x.axpy(1-w,xold); //improve x
│ │ │ │ +
490 }
│ │ │ │ +
│ │ │ │ +
491 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
492 static void dbgs(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ +
493 auto rhs = std::get<crow> (b);
│ │ │ │ +
494
│ │ │ │ +
495 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ +
496 //solve on blocklevel I-1
│ │ │ │ +
497 using M =
│ │ │ │ +
498 typename std::remove_cv<
│ │ │ │ +
499 typename std::remove_reference<
│ │ │ │ +
500 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ +
501 >::type
│ │ │ │ +
502 >::type;
│ │ │ │ +
503 algmeta_itsteps<I-1,M>::dbgs(std::get<crow>( std::get<crow>(A)), std::get<crow>(x),rhs,w);
│ │ │ │ + │ │ │ │ +
505 }
│ │ │ │
│ │ │ │ +
506
│ │ │ │
507
│ │ │ │ -
508 private:
│ │ │ │ -
510 const M& _A_;
│ │ │ │ -
512 int _n;
│ │ │ │ -
514 real_field_type _w;
│ │ │ │ -
515 };
│ │ │ │ -
│ │ │ │ -
516 DUNE_REGISTER_PRECONDITIONER("jac", defaultPreconditionerBlockLevelCreator<Dune::SeqJac>());
│ │ │ │ +
508
│ │ │ │ +
512 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
513 static void bsorf(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ +
514 TVector v;
│ │ │ │ +
515 v=x; //use latest x values in right side calculation
│ │ │ │ + │ │ │ │
517
│ │ │ │ -
518
│ │ │ │ -
519
│ │ │ │ -
531 template<class M, class X, class Y, int l=1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
533 public:
│ │ │ │ -
535 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ -
537 typedef typename matrix_type :: block_type block_type;
│ │ │ │ -
539 typedef X domain_type;
│ │ │ │ -
541 typedef Y range_type;
│ │ │ │ -
542
│ │ │ │ -
544 typedef typename X::field_type field_type;
│ │ │ │ -
545
│ │ │ │ -
547 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
549 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
550
│ │ │ │ - │ │ │ │ -
553
│ │ │ │ -
│ │ │ │ -
561 SeqILU (const M& A, real_field_type w, const bool resort = false )
│ │ │ │ -
562 : SeqILU( A, 0, w, resort ) // construct ILU(0)
│ │ │ │ -
563 {
│ │ │ │ -
564 }
│ │ │ │ -
│ │ │ │ -
565
│ │ │ │ -
│ │ │ │ -
580 SeqILU (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ -
581 : SeqILU(A->getmat(), configuration)
│ │ │ │ -
582 {}
│ │ │ │ +
518 }
│ │ │ │
│ │ │ │ -
583
│ │ │ │ +
519 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
│ │ │ │ +
│ │ │ │ +
520 static void bsorf(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ +
521 auto rhs = std::get<crow> (b);
│ │ │ │ +
522
│ │ │ │ +
523 MultiTypeBlockMatrix_Solver_Col<I,crow,0,TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ +
524 //solve on blocklevel I-1
│ │ │ │ +
525 using M =
│ │ │ │ +
526 typename std::remove_cv<
│ │ │ │ +
527 typename std::remove_reference<
│ │ │ │ +
528 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ +
529 >::type
│ │ │ │ +
530 >::type;
│ │ │ │ +
531 algmeta_itsteps<I-1,M>::bsorf(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
│ │ │ │ +
532 std::get<crow>(x).axpy(w,std::get<crow>(v));
│ │ │ │ + │ │ │ │ +
534 }
│ │ │ │ +
│ │ │ │ +
535
│ │ │ │ +
539 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
540 static void bsorb(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ +
541 TVector v;
│ │ │ │ +
542 v=x; //use latest x values in right side calculation
│ │ │ │ + │ │ │ │ +
544
│ │ │ │ +
545 }
│ │ │ │ +
│ │ │ │ +
546 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
│ │ │ │ +
│ │ │ │ +
547 static void bsorb(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ +
548 auto rhs = std::get<crow> (b);
│ │ │ │ +
549
│ │ │ │ +
550 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ +
551 //solve on blocklevel I-1
│ │ │ │ +
552 using M =
│ │ │ │ +
553 typename std::remove_cv<
│ │ │ │ +
554 typename std::remove_reference<
│ │ │ │ +
555 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ +
556 >::type
│ │ │ │ +
557 >::type;
│ │ │ │ +
558 algmeta_itsteps<I-1,M>::bsorb(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
│ │ │ │ +
559 std::get<crow>(x).axpy(w,std::get<crow>(v));
│ │ │ │ + │ │ │ │ +
561 }
│ │ │ │ +
│ │ │ │ +
562
│ │ │ │ +
563
│ │ │ │ +
567 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
568 static void dbjac(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ +
569 TVector v(x);
│ │ │ │ +
570 v=0; //calc new x in v
│ │ │ │ + │ │ │ │ +
572 x.axpy(w,v); //improve x
│ │ │ │ +
573 }
│ │ │ │ +
│ │ │ │ +
574 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
575 static void dbjac(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ +
576 auto rhs = std::get<crow> (b);
│ │ │ │ +
577
│ │ │ │ +
578 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ +
579 //solve on blocklevel I-1
│ │ │ │ +
580 using M =
│ │ │ │ +
581 typename std::remove_cv<
│ │ │ │ +
582 typename std::remove_reference<
│ │ │ │ +
583 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ +
584 >::type
│ │ │ │ +
585 >::type;
│ │ │ │ +
586 algmeta_itsteps<I-1,M>::dbjac(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
│ │ │ │ + │ │ │ │ +
588 }
│ │ │ │ +
│ │ │ │ +
589
│ │ │ │ +
590
│ │ │ │ +
591
│ │ │ │ +
592
│ │ │ │ +
593 };
│ │ │ │ +
│ │ │ │ +
594 template<int I, int crow> //recursion end for remain_row = 0
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
596 public:
│ │ │ │ +
597 template <typename TVector, typename TMatrix, typename K>
│ │ │ │
│ │ │ │ -
598 SeqILU(const M& A, const ParameterTree& config)
│ │ │ │ -
599 : SeqILU(A, config.get("n", 0),
│ │ │ │ -
600 config.get<real_field_type>("relaxation", 1.0),
│ │ │ │ -
601 config.get("resort", false))
│ │ │ │ -
602 {}
│ │ │ │ -
│ │ │ │ -
603
│ │ │ │ -
│ │ │ │ -
612 SeqILU (const M& A, int n, real_field_type w, const bool resort = false )
│ │ │ │ -
613 : ILU_(),
│ │ │ │ -
614 lower_(),
│ │ │ │ -
615 upper_(),
│ │ │ │ -
616 inv_(),
│ │ │ │ -
617 w_(w),
│ │ │ │ -
618 wNotIdentity_([w]{using std::abs; return abs(w - real_field_type(1)) > 1e-15;}() )
│ │ │ │ -
619 {
│ │ │ │ -
620 if( n == 0 )
│ │ │ │ -
621 {
│ │ │ │ -
622 // copy A
│ │ │ │ -
623 ILU_.reset( new matrix_type( A ) );
│ │ │ │ -
624 // create ILU(0) decomposition
│ │ │ │ - │ │ │ │ -
626 }
│ │ │ │ -
627 else
│ │ │ │ -
628 {
│ │ │ │ -
629 // create matrix in build mode
│ │ │ │ -
630 ILU_.reset( new matrix_type( A.N(), A.M(), matrix_type::row_wise) );
│ │ │ │ -
631 // create ILU(n) decomposition
│ │ │ │ -
632 ILU::blockILUDecomposition( A, n, *ILU_ );
│ │ │ │ -
633 }
│ │ │ │ -
634
│ │ │ │ -
635 if( resort )
│ │ │ │ -
636 {
│ │ │ │ -
637 // store ILU in simple CRS format
│ │ │ │ -
638 ILU::convertToCRS( *ILU_, lower_, upper_, inv_ );
│ │ │ │ -
639 ILU_.reset();
│ │ │ │ -
640 }
│ │ │ │ -
641 }
│ │ │ │ -
│ │ │ │ -
642
│ │ │ │ -
│ │ │ │ -
648 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ -
649 {}
│ │ │ │ -
│ │ │ │ -
650
│ │ │ │ -
│ │ │ │ -
656 virtual void apply (X& v, const Y& d)
│ │ │ │ -
657 {
│ │ │ │ -
658 if( ILU_ )
│ │ │ │ -
659 {
│ │ │ │ -
660 ILU::blockILUBacksolve( *ILU_, v, d);
│ │ │ │ -
661 }
│ │ │ │ -
662 else
│ │ │ │ -
663 {
│ │ │ │ -
664 ILU::blockILUBacksolve(lower_, upper_, inv_, v, d);
│ │ │ │ -
665 }
│ │ │ │ -
666
│ │ │ │ -
667 if( wNotIdentity_ )
│ │ │ │ -
668 {
│ │ │ │ -
669 v *= w_;
│ │ │ │ -
670 }
│ │ │ │ -
671 }
│ │ │ │ -
│ │ │ │ -
672
│ │ │ │ -
│ │ │ │ -
678 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ -
679 {}
│ │ │ │ -
│ │ │ │ -
680
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
683 {
│ │ │ │ - │ │ │ │ -
685 }
│ │ │ │ -
│ │ │ │ -
686
│ │ │ │ -
687 protected:
│ │ │ │ -
689 std::unique_ptr< matrix_type > ILU_;
│ │ │ │ -
690
│ │ │ │ - │ │ │ │ - │ │ │ │ -
694 std::vector< block_type, typename matrix_type::allocator_type > inv_;
│ │ │ │ -
695
│ │ │ │ - │ │ │ │ -
699 const bool wNotIdentity_;
│ │ │ │ -
700 };
│ │ │ │ -
│ │ │ │ -
701 DUNE_REGISTER_PRECONDITIONER("ilu", defaultPreconditionerBlockLevelCreator<Dune::SeqILU>());
│ │ │ │ -
702
│ │ │ │ -
703
│ │ │ │ -
712 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
713 class Richardson : public Preconditioner<X,Y> {
│ │ │ │ -
714 public:
│ │ │ │ -
716 typedef X domain_type;
│ │ │ │ -
718 typedef Y range_type;
│ │ │ │ -
720 typedef typename X::field_type field_type;
│ │ │ │ -
722 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
724 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
725
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
732 _w(w)
│ │ │ │ -
733 {}
│ │ │ │ -
│ │ │ │ -
734
│ │ │ │ -
│ │ │ │ -
746 Richardson (const ParameterTree& configuration)
│ │ │ │ -
747 : Richardson(configuration.get<real_field_type>("relaxation", 1.0))
│ │ │ │ -
748 {}
│ │ │ │ -
│ │ │ │ -
749
│ │ │ │ -
│ │ │ │ -
755 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ -
756 {}
│ │ │ │ -
│ │ │ │ -
757
│ │ │ │ -
│ │ │ │ -
763 virtual void apply (X& v, const Y& d)
│ │ │ │ -
764 {
│ │ │ │ -
765 v = d;
│ │ │ │ -
766 v *= _w;
│ │ │ │ -
767 }
│ │ │ │ -
│ │ │ │ -
768
│ │ │ │ -
│ │ │ │ -
774 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ -
775 {}
│ │ │ │ -
│ │ │ │ -
776
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
779 {
│ │ │ │ - │ │ │ │ -
781 }
│ │ │ │ -
│ │ │ │ -
782
│ │ │ │ -
783 private:
│ │ │ │ - │ │ │ │ -
786 };
│ │ │ │ -
│ │ │ │ -
787 DUNE_REGISTER_PRECONDITIONER("richardson", [](auto tl, const auto& /* mat */, const ParameterTree& config){
│ │ │ │ -
788 using D = typename Dune::TypeListElement<1, decltype(tl)>::type;
│ │ │ │ -
789 using R = typename Dune::TypeListElement<2, decltype(tl)>::type;
│ │ │ │ -
790 return std::make_shared<Richardson<D,R>>(config);
│ │ │ │ -
791 });
│ │ │ │ -
792
│ │ │ │ -
793
│ │ │ │ -
804 template< class M, class X, class Y >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
806 : public Preconditioner< X, Y >
│ │ │ │ -
807 {
│ │ │ │ -
808 typedef SeqILDL< M, X, Y > This;
│ │ │ │ - │ │ │ │ -
810
│ │ │ │ -
811 public:
│ │ │ │ -
813 typedef std::remove_const_t< M > matrix_type;
│ │ │ │ -
815 typedef X domain_type;
│ │ │ │ -
817 typedef Y range_type;
│ │ │ │ -
819 typedef typename X::field_type field_type;
│ │ │ │ -
821 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ -
823 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ -
824
│ │ │ │ -
│ │ │ │ -
837 SeqILDL (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ -
838 : SeqILDL(A->getmat(), configuration)
│ │ │ │ -
839 {}
│ │ │ │ -
│ │ │ │ -
840
│ │ │ │ -
│ │ │ │ -
853 SeqILDL(const matrix_type& A, const ParameterTree& config)
│ │ │ │ -
854 : SeqILDL(A, config.get<real_field_type>("relaxation", 1.0))
│ │ │ │ -
855 {}
│ │ │ │ -
│ │ │ │ -
856
│ │ │ │ -
│ │ │ │ -
865 explicit SeqILDL ( const matrix_type &A, real_field_type relax = real_field_type( 1 ) )
│ │ │ │ -
866 : decomposition_( A.N(), A.M(), matrix_type::random ),
│ │ │ │ -
867 relax_( relax )
│ │ │ │ -
868 {
│ │ │ │ -
869 // setup row sizes for lower triangular matrix
│ │ │ │ -
870 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ -
871 {
│ │ │ │ -
872 const auto &A_i = *i;
│ │ │ │ -
873 const auto ij = A_i.find( i.index() );
│ │ │ │ -
874 if( ij != A_i.end() )
│ │ │ │ -
875 decomposition_.setrowsize( i.index(), ij.offset()+1 );
│ │ │ │ -
876 else
│ │ │ │ -
877 DUNE_THROW( ISTLError, "diagonal entry missing" );
│ │ │ │ -
878 }
│ │ │ │ -
879 decomposition_.endrowsizes();
│ │ │ │ -
880
│ │ │ │ -
881 // setup row indices for lower triangular matrix
│ │ │ │ -
882 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ -
883 {
│ │ │ │ -
884 const auto &A_i = *i;
│ │ │ │ -
885 for( auto ij = A_i.begin(); ij.index() < i.index() ; ++ij )
│ │ │ │ -
886 decomposition_.addindex( i.index(), ij.index() );
│ │ │ │ -
887 decomposition_.addindex( i.index(), i.index() );
│ │ │ │ -
888 }
│ │ │ │ -
889 decomposition_.endindices();
│ │ │ │ -
890
│ │ │ │ -
891 // copy values of lower triangular matrix
│ │ │ │ -
892 auto i = A.begin();
│ │ │ │ -
893 for( auto row = decomposition_.begin(), rowend = decomposition_.end(); row != rowend; ++row, ++i )
│ │ │ │ -
894 {
│ │ │ │ -
895 auto ij = i->begin();
│ │ │ │ -
896 for( auto col = row->begin(), colend = row->end(); col != colend; ++col, ++ij )
│ │ │ │ -
897 *col = *ij;
│ │ │ │ -
898 }
│ │ │ │ -
899
│ │ │ │ -
900 // perform ILDL decomposition
│ │ │ │ -
901 bildl_decompose( decomposition_ );
│ │ │ │ -
902 }
│ │ │ │ -
│ │ │ │ -
903
│ │ │ │ -
│ │ │ │ -
905 void pre ([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override
│ │ │ │ -
906 {}
│ │ │ │ -
│ │ │ │ -
907
│ │ │ │ -
│ │ │ │ -
909 void apply ( X &v, const Y &d ) override
│ │ │ │ -
910 {
│ │ │ │ -
911 bildl_backsolve( decomposition_, v, d, true );
│ │ │ │ -
912 v *= relax_;
│ │ │ │ -
913 }
│ │ │ │ -
│ │ │ │ -
914
│ │ │ │ -
│ │ │ │ -
916 void post ([[maybe_unused]] X &x) override
│ │ │ │ -
917 {}
│ │ │ │ -
│ │ │ │ -
918
│ │ │ │ - │ │ │ │ -
921
│ │ │ │ -
922 private:
│ │ │ │ -
923 matrix_type decomposition_;
│ │ │ │ -
924 real_field_type relax_;
│ │ │ │ -
925 };
│ │ │ │ -
│ │ │ │ -
926 DUNE_REGISTER_PRECONDITIONER("ildl", defaultPreconditionerCreator<Dune::SeqILDL>());
│ │ │ │ -
927
│ │ │ │ -
930} // end namespace
│ │ │ │ -
931
│ │ │ │ -
932
│ │ │ │ -
933#endif
│ │ │ │ -
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ - │ │ │ │ -
#define DUNE_REGISTER_PRECONDITIONER(name,...)
Definition solverregistry.hh:16
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Some handy generic functions for ISTL matrices.
│ │ │ │ - │ │ │ │ -
Incomplete LDL decomposition.
│ │ │ │ -
Define general, extensible interface for inverse operators.
│ │ │ │ -
The incomplete LU factorization kernels.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:646
│ │ │ │ -
void dbjac(const M &A, X &x, const Y &b, const K &w)
Jacobi step.
Definition gsetc.hh:658
│ │ │ │ -
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:634
│ │ │ │ +
598 static void dbgs(const TMatrix&, TVector&, TVector&,
│ │ │ │ +
599 const TVector&, const K&) {}
│ │ │ │ +
│ │ │ │ +
600
│ │ │ │ +
601 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
602 static void bsorf(const TMatrix&, TVector&, TVector&,
│ │ │ │ +
603 const TVector&, const K&) {}
│ │ │ │ +
│ │ │ │ +
604
│ │ │ │ +
605 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
606 static void bsorb(const TMatrix&, TVector&, TVector&,
│ │ │ │ +
607 const TVector&, const K&) {}
│ │ │ │ +
│ │ │ │ +
608
│ │ │ │ +
609 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ +
│ │ │ │ +
610 static void dbjac(const TMatrix&, TVector&, TVector&,
│ │ │ │ +
611 const TVector&, const K&) {}
│ │ │ │ +
│ │ │ │ +
612 };
│ │ │ │ +
│ │ │ │ +
613
│ │ │ │ +
614} // end namespace Dune
│ │ │ │ +
615
│ │ │ │ +
616namespace std
│ │ │ │ +
617{
│ │ │ │ +
622 template <size_t i, typename... Args>
│ │ │ │ +
│ │ │ │ +
623 struct tuple_element<i,Dune::MultiTypeBlockMatrix<Args...> >
│ │ │ │ +
624 {
│ │ │ │ +
625 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
│ │ │ │ +
626 };
│ │ │ │ +
│ │ │ │ +
627}
│ │ │ │ +
628#endif
│ │ │ │ + │ │ │ │ +
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ +
MultiTypeBlockMatrix< FirstRow, Args... > type
Definition multitypeblockmatrix.hh:56
│ │ │ │ +
static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:568
│ │ │ │ +
MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b)
Add the entries of another matrix to this one.
Definition multitypeblockmatrix.hh:168
│ │ │ │ +
void mv(const X &x, Y &y) const
y = A x
Definition multitypeblockmatrix.hh:196
│ │ │ │ +
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition multitypeblockmatrix.hh:276
│ │ │ │ +
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition multitypeblockmatrix.hh:321
│ │ │ │ +
static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:598
│ │ │ │ +
static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:484
│ │ │ │ +
static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:540
│ │ │ │ +
void usmhv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition multitypeblockmatrix.hh:336
│ │ │ │ +
FirstRow::field_type field_type
Definition multitypeblockmatrix.hh:61
│ │ │ │ +
void usmv(const AlphaType &alpha, const X &x, Y &y) const
y += alpha A x
Definition multitypeblockmatrix.hh:236
│ │ │ │ +
MultiTypeBlockMatrix & operator/=(const field_type &k)
vector space division by scalar
Definition multitypeblockmatrix.hh:152
│ │ │ │ +
typename std::tuple_element< i, std::tuple< Args... > >::type type
Definition multitypeblockmatrix.hh:625
│ │ │ │ +
static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:492
│ │ │ │ +
static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:520
│ │ │ │ +
void umhv(const X &x, Y &y) const
y += A^H x
Definition multitypeblockmatrix.hh:306
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition multitypeblockmatrix.hh:369
│ │ │ │ +
static constexpr size_type N()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:64
│ │ │ │ +
void usmtv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition multitypeblockmatrix.hh:291
│ │ │ │ +
void operator=(const T &newval)
Definition multitypeblockmatrix.hh:127
│ │ │ │ +
static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &)
Definition multitypeblockmatrix.hh:465
│ │ │ │ +
void umv(const X &x, Y &y) const
y += A x
Definition multitypeblockmatrix.hh:206
│ │ │ │ +
static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K &w)
Definition multitypeblockmatrix.hh:455
│ │ │ │ +
static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:513
│ │ │ │ +
static constexpr size_type size()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:75
│ │ │ │ +
static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:610
│ │ │ │ +
auto infinity_norm_real() const
Bastardized version of the infinity-norm / row-sum norm.
Definition multitypeblockmatrix.hh:396
│ │ │ │ +
auto frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition multitypeblockmatrix.hh:352
│ │ │ │ +
std::size_t size_type
Type used for sizes.
Definition multitypeblockmatrix.hh:59
│ │ │ │ +
auto infinity_norm() const
Bastardized version of the infinity-norm / row-sum norm.
Definition multitypeblockmatrix.hh:375
│ │ │ │ +
static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:606
│ │ │ │ +
MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b)
Subtract the entries of another matrix from this one.
Definition multitypeblockmatrix.hh:183
│ │ │ │ +
auto operator[](const std::integral_constant< size_type, index > indexVariable) -> decltype(std::get< index >(*this))
Random-access operator.
Definition multitypeblockmatrix.hh:104
│ │ │ │ +
static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:575
│ │ │ │ +
static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:602
│ │ │ │ +
void mtv(const X &x, Y &y) const
y = A^T x
Definition multitypeblockmatrix.hh:251
│ │ │ │ +
static constexpr size_type M()
Return the number of matrix columns.
Definition multitypeblockmatrix.hh:81
│ │ │ │ +
void mmv(const X &x, Y &y) const
y -= A x
Definition multitypeblockmatrix.hh:221
│ │ │ │ +
void umtv(const X &x, Y &y) const
y += A^T x
Definition multitypeblockmatrix.hh:261
│ │ │ │ +
static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:547
│ │ │ │ +
MultiTypeBlockMatrix & operator*=(const field_type &k)
vector space multiplication with scalar
Definition multitypeblockmatrix.hh:141
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
void bildl_decompose(Matrix &A)
compute ILDL decomposition of a symmetric matrix A
Definition ildl.hh:88
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
Definition ildl.hh:149
│ │ │ │ -
void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv)
convert ILU decomposition into CRS format for lower and upper triangular and inverse.
Definition ilu.hh:307
│ │ │ │ -
void blockILUBacksolve(const M &A, X &v, const Y &d)
LU backsolve with stored inverse.
Definition ilu.hh:94
│ │ │ │ -
void blockILU0Decomposition(M &A)
compute ILU decomposition of A. A is overwritten by its decomposition
Definition ilu.hh:33
│ │ │ │ -
void blockILUDecomposition(const M &A, int n, M &ILU)
Definition ilu.hh:167
│ │ │ │ -
compile-time parameter for block recursion depth
Definition gsetc.hh:45
│ │ │ │ -
a simple compressed row storage matrix class
Definition ilu.hh:259
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ -
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ -
static void check(const Matrix &mat)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:53
│ │ │ │ -
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Turns an InverseOperator into a Preconditioner.
Definition preconditioners.hh:75
│ │ │ │ -
O::range_type range_type
The range type of the preconditioner.
Definition preconditioners.hh:80
│ │ │ │ -
O::domain_type domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:78
│ │ │ │ -
virtual void post(domain_type &)
Clean up.
Definition preconditioners.hh:111
│ │ │ │ -
range_type::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:82
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:86
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:84
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:115
│ │ │ │ -
virtual void pre(domain_type &, range_type &)
Prepare the preconditioner.
Definition preconditioners.hh:101
│ │ │ │ -
InverseOperator2Preconditioner(InverseOperator &inverse_operator)
Construct the preconditioner from the solver.
Definition preconditioners.hh:94
│ │ │ │ -
O InverseOperator
type of the wrapped inverse operator
Definition preconditioners.hh:88
│ │ │ │ -
virtual void apply(domain_type &v, const range_type &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition preconditioners.hh:104
│ │ │ │ -
Sequential SSOR preconditioner.
Definition preconditioners.hh:141
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:229
│ │ │ │ -
SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:182
│ │ │ │ -
SeqSSOR(const M &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:199
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:233
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:150
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:152
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:146
│ │ │ │ -
M matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:144
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:216
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:208
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:148
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:154
│ │ │ │ -
SeqSSOR(const M &A, int n, real_field_type w)
Constructor.
Definition preconditioners.hh:163
│ │ │ │ -
Sequential SOR preconditioner.
Definition preconditioners.hh:261
│ │ │ │ -
SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:302
│ │ │ │ -
M matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:264
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:274
│ │ │ │ -
void apply(X &v, const Y &d)
Apply the preconditioner in a special direction.
Definition preconditioners.hh:350
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:266
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:367
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:328
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:272
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:371
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:336
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:268
│ │ │ │ -
SeqSOR(const M &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:319
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:270
│ │ │ │ -
SeqSOR(const M &A, int n, real_field_type w)
Constructor.
Definition preconditioners.hh:283
│ │ │ │ -
The sequential jacobian preconditioner.
Definition preconditioners.hh:412
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:499
│ │ │ │ -
SeqJac(const M &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:470
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:487
│ │ │ │ -
M matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:415
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:423
│ │ │ │ -
SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:453
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:421
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:479
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:417
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:425
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:503
│ │ │ │ -
SeqJac(const M &A, int n, real_field_type w)
Constructor.
Definition preconditioners.hh:434
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:419
│ │ │ │ -
Sequential ILU preconditioner.
Definition preconditioners.hh:532
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:678
│ │ │ │ -
SeqILU(const M &A, int n, real_field_type w, const bool resort=false)
Constructor.
Definition preconditioners.hh:612
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:648
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:656
│ │ │ │ -
ILU::CRS< block_type, typename M::allocator_type > CRS
type of ILU storage
Definition preconditioners.hh:552
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:541
│ │ │ │ -
CRS lower_
The ILU(n) decomposition of the matrix. As storage a CRS structure is used.
Definition preconditioners.hh:692
│ │ │ │ -
const bool wNotIdentity_
true if w != 1.0
Definition preconditioners.hh:699
│ │ │ │ -
SeqILU(const M &A, const ParameterTree &config)
Constructor.
Definition preconditioners.hh:598
│ │ │ │ -
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:535
│ │ │ │ -
matrix_type::block_type block_type
block type of matrix
Definition preconditioners.hh:537
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:549
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:544
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:682
│ │ │ │ -
SeqILU(const M &A, real_field_type w, const bool resort=false)
Constructor.
Definition preconditioners.hh:561
│ │ │ │ -
const real_field_type w_
The relaxation factor to use.
Definition preconditioners.hh:697
│ │ │ │ -
SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:580
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:539
│ │ │ │ -
std::vector< block_type, typename matrix_type::allocator_type > inv_
Definition preconditioners.hh:694
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:547
│ │ │ │ -
std::unique_ptr< matrix_type > ILU_
The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used.
Definition preconditioners.hh:689
│ │ │ │ -
CRS upper_
Definition preconditioners.hh:693
│ │ │ │ -
Richardson preconditioner.
Definition preconditioners.hh:713
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:720
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:778
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:718
│ │ │ │ -
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:755
│ │ │ │ -
Richardson(real_field_type w=1.0)
Constructor.
Definition preconditioners.hh:731
│ │ │ │ -
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:774
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:724
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:722
│ │ │ │ -
Richardson(const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:746
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:716
│ │ │ │ -
virtual void apply(X &v, const Y &d)
Apply the precondioner.
Definition preconditioners.hh:763
│ │ │ │ -
sequential ILDL preconditioner
Definition preconditioners.hh:807
│ │ │ │ -
SeqILDL(const matrix_type &A, const ParameterTree &config)
Constructor.
Definition preconditioners.hh:853
│ │ │ │ -
SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1))
constructor
Definition preconditioners.hh:865
│ │ │ │ -
X domain_type
domain type of the preconditioner
Definition preconditioners.hh:815
│ │ │ │ -
void post(X &x) override
Clean up.
Definition preconditioners.hh:916
│ │ │ │ -
Y range_type
range type of the preconditioner
Definition preconditioners.hh:817
│ │ │ │ -
std::remove_const_t< M > matrix_type
type of matrix the preconditioner is for
Definition preconditioners.hh:813
│ │ │ │ -
void apply(X &v, const Y &d) override
Apply one step of the preconditioner to the system A(v)=d.
Definition preconditioners.hh:909
│ │ │ │ -
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:823
│ │ │ │ -
SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:837
│ │ │ │ -
void pre(X &x, Y &b) override
Prepare the preconditioner.
Definition preconditioners.hh:905
│ │ │ │ -
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:821
│ │ │ │ -
X::field_type field_type
field type of the preconditioner
Definition preconditioners.hh:819
│ │ │ │ -
SolverCategory::Category category() const override
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:920
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
Send BlockVector to an output stream.
Definition bvector.hh:590
│ │ │ │ +
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
│ │ │ │ +
static void bsorb(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:461
│ │ │ │ +
static void bsorf(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:418
│ │ │ │ +
static void dbjac(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:504
│ │ │ │ +
static void dbgs(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:378
│ │ │ │ +
solver for MultiTypeBlockVector & MultiTypeBlockMatrix types
Definition multitypeblockmatrix.hh:477
│ │ │ │ +
part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types
Definition multitypeblockmatrix.hh:449
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1027 +1,756 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -preconditioners.hh │ │ │ │ │ +multitypeblockmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_PRECONDITIONERS_HH │ │ │ │ │ -6#define DUNE_ISTL_PRECONDITIONERS_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ 8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ -19#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ -20#include "_s_o_l_v_e_r_._h_h" │ │ │ │ │ -21#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ -22#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -23#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ -24#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -25#include "_i_l_d_l_._h_h" │ │ │ │ │ -26#include "_i_l_u_._h_h" │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +15 │ │ │ │ │ +16// forward declaration │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +19 template │ │ │ │ │ +20 class MultiTypeBlockMatrix; │ │ │ │ │ +21 │ │ │ │ │ +22 template │ │ │ │ │ +23 class MultiTypeBlockMatrix_Solver; │ │ │ │ │ +24} │ │ │ │ │ +25 │ │ │ │ │ +26#include "_g_s_e_t_c_._h_h" │ │ │ │ │ 27 │ │ │ │ │ -28 │ │ │ │ │ -29namespace _D_u_n_e { │ │ │ │ │ -72 template │ │ │ │ │ -_7_3 class _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r : │ │ │ │ │ -74 public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -75 { │ │ │ │ │ -76 public: │ │ │ │ │ -_7_8 typedef typename O::domain_type _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_8_0 typedef typename O::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_8_2 typedef typename range_type::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_8_4 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_8_6 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_8_8 typedef O _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r; │ │ │ │ │ -89 │ │ │ │ │ -_9_4 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r(_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r& inverse_operator) │ │ │ │ │ -95 : inverse_operator_(inverse_operator) │ │ │ │ │ -96 { │ │ │ │ │ -97 if(c != -1 && _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(inverse_operator_) != c) │ │ │ │ │ -98 DUNE_THROW(InvalidStateException, "User-supplied solver category does not │ │ │ │ │ -match that of the given inverse operator"); │ │ │ │ │ -99 } │ │ │ │ │ -100 │ │ │ │ │ -_1_0_1 virtual void _p_r_e(_d_o_m_a_i_n___t_y_p_e&,_r_a_n_g_e___t_y_p_e&) │ │ │ │ │ -102 {} │ │ │ │ │ -103 │ │ │ │ │ -_1_0_4 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& d) │ │ │ │ │ -105 { │ │ │ │ │ -106 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ -107 _r_a_n_g_e___t_y_p_e copy(d); │ │ │ │ │ -108 inverse_operator_.apply(v, copy, res); │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -_1_1_1 virtual void _p_o_s_t(_d_o_m_a_i_n___t_y_p_e&) │ │ │ │ │ -112 {} │ │ │ │ │ -113 │ │ │ │ │ -_1_1_5 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -116 { │ │ │ │ │ -117 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(inverse_operator_); │ │ │ │ │ -118 } │ │ │ │ │ -119 │ │ │ │ │ -120 private: │ │ │ │ │ -121 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r& inverse_operator_; │ │ │ │ │ -122 }; │ │ │ │ │ -123 │ │ │ │ │ -124 //===================================================================== │ │ │ │ │ -125 // Implementation of this interface for sequential ISTL-preconditioners │ │ │ │ │ -126 //===================================================================== │ │ │ │ │ -127 │ │ │ │ │ -128 │ │ │ │ │ -140 template │ │ │ │ │ -_1_4_1 class _S_e_q_S_S_O_R : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -142 public: │ │ │ │ │ -_1_4_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_1_4_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_1_4_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_1_5_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_5_2 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_5_4 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -155 │ │ │ │ │ -_1_6_3 _S_e_q_S_S_O_R (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w) │ │ │ │ │ -164 : _A_(A), _n(n), _w(w) │ │ │ │ │ -165 { │ │ │ │ │ -166 _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_M_,_l_>_:_:_c_h_e_c_k(_A_); │ │ │ │ │ -167 } │ │ │ │ │ -168 │ │ │ │ │ -_1_8_2 _S_e_q_S_S_O_R (const std::shared_ptr>& A, │ │ │ │ │ -const ParameterTree& configuration) │ │ │ │ │ -183 : _S_e_q_S_S_O_R(A->getmat(), configuration) │ │ │ │ │ -184 {} │ │ │ │ │ -185 │ │ │ │ │ -_1_9_9 _S_e_q_S_S_O_R (const M& A, const ParameterTree& configuration) │ │ │ │ │ -200 : _S_e_q_S_S_O_R(A, configuration._g_e_t("iterations",1), │ │ │ │ │ -configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation",1.0)) │ │ │ │ │ -201 {} │ │ │ │ │ +28namespace _D_u_n_e { │ │ │ │ │ +29 │ │ │ │ │ +43 template │ │ │ │ │ +_4_4 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ +45 : public std::tuple │ │ │ │ │ +46 { │ │ │ │ │ +47 using ParentType = std::tuple; │ │ │ │ │ +48 public: │ │ │ │ │ +49 │ │ │ │ │ +51 using ParentType::ParentType; │ │ │ │ │ +52 │ │ │ │ │ +_5_6 typedef _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x _t_y_p_e; │ │ │ │ │ +57 │ │ │ │ │ +_5_9 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +60 │ │ │ │ │ +_6_1 typedef typename FirstRow::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +62 │ │ │ │ │ +_6_4 static constexpr _s_i_z_e___t_y_p_e _N() │ │ │ │ │ +65 { │ │ │ │ │ +66 return 1+sizeof...(Args); │ │ │ │ │ +67 } │ │ │ │ │ +68 │ │ │ │ │ +74 [[deprecated("Use method 'N' instead")]] │ │ │ │ │ +_7_5 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e() │ │ │ │ │ +76 { │ │ │ │ │ +77 return 1+sizeof...(Args); │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +_8_1 static constexpr _s_i_z_e___t_y_p_e _M() │ │ │ │ │ +82 { │ │ │ │ │ +83 return FirstRow::size(); │ │ │ │ │ +84 } │ │ │ │ │ +85 │ │ │ │ │ +102 template< size_type index > │ │ │ │ │ +103 auto │ │ │ │ │ +_1_0_4 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ +> indexVariable) │ │ │ │ │ +105 -> decltype(std::get(*this)) │ │ │ │ │ +106 { │ │ │ │ │ +107 return std::get(*this); │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +115 template< size_type index > │ │ │ │ │ +116 auto │ │ │ │ │ +_1_1_7 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ +> indexVariable) const │ │ │ │ │ +118 -> decltype(std::get(*this)) │ │ │ │ │ +119 { │ │ │ │ │ +120 return std::get(*this); │ │ │ │ │ +121 } │ │ │ │ │ +122 │ │ │ │ │ +126 template │ │ │ │ │ +_1_2_7 void _o_p_e_r_a_t_o_r_=_ (const T& newval) { │ │ │ │ │ +128 using namespace Dune::Hybrid; │ │ │ │ │ +129 auto _s_i_z_e = index_constant<1+sizeof...(Args)>(); │ │ │ │ │ +130 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented, │ │ │ │ │ +131 // we cannot use a plain forEach(*this, ...). This could be achieved, │ │ │ │ │ +132 // e.g., by implementing a static size() method. │ │ │ │ │ +133 forEach(integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ +134 (*this)[i] = newval; │ │ │ │ │ +135 }); │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +138 //===== vector space arithmetic │ │ │ │ │ +139 │ │ │ │ │ +_1_4_1 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_*_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +142 { │ │ │ │ │ +143 auto _s_i_z_e = index_constant(); │ │ │ │ │ +144 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ +145 (*this)[i] *= k; │ │ │ │ │ +146 }); │ │ │ │ │ +147 │ │ │ │ │ +148 return *this; │ │ │ │ │ +149 } │ │ │ │ │ +150 │ │ │ │ │ +_1_5_2 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_/_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +153 { │ │ │ │ │ +154 auto _s_i_z_e = index_constant(); │ │ │ │ │ +155 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ +156 (*this)[i] /= k; │ │ │ │ │ +157 }); │ │ │ │ │ +158 │ │ │ │ │ +159 return *this; │ │ │ │ │ +160 } │ │ │ │ │ +161 │ │ │ │ │ +162 │ │ │ │ │ +_1_6_8 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& b) │ │ │ │ │ +169 { │ │ │ │ │ +170 auto _s_i_z_e = index_constant(); │ │ │ │ │ +171 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ +172 (*this)[i] += b[i]; │ │ │ │ │ +173 }); │ │ │ │ │ +174 │ │ │ │ │ +175 return *this; │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +_1_8_3 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& b) │ │ │ │ │ +184 { │ │ │ │ │ +185 auto _s_i_z_e = index_constant(); │ │ │ │ │ +186 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ +187 (*this)[i] -= b[i]; │ │ │ │ │ +188 }); │ │ │ │ │ +189 │ │ │ │ │ +190 return *this; │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +195 template │ │ │ │ │ +_1_9_6 void _m_v (const X& x, Y& y) const { │ │ │ │ │ +197 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ +198 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ +199 y = 0; //reset y (for mv uses umv) │ │ │ │ │ +200 _u_m_v(x,y); │ │ │ │ │ +201 } │ │ │ │ │ 202 │ │ │ │ │ -_2_0_8 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ -209 {} │ │ │ │ │ -210 │ │ │ │ │ -_2_1_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -217 { │ │ │ │ │ -218 for (int i=0; i<_n; i++) { │ │ │ │ │ -219 _b_s_o_r_f(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ -220 _b_s_o_r_b(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ -221 } │ │ │ │ │ -222 } │ │ │ │ │ -223 │ │ │ │ │ -_2_2_9 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ -230 {} │ │ │ │ │ -231 │ │ │ │ │ -_2_3_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -234 { │ │ │ │ │ -235 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -236 } │ │ │ │ │ -237 │ │ │ │ │ -238 private: │ │ │ │ │ -240 const M& _A_; │ │ │ │ │ -242 int _n; │ │ │ │ │ -244 _r_e_a_l___f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ -245 }; │ │ │ │ │ -_2_4_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("ssor", │ │ │ │ │ -defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +205 template │ │ │ │ │ +_2_0_6 void _u_m_v (const X& x, Y& y) const { │ │ │ │ │ +207 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ +208 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ +209 using namespace Dune::Hybrid; │ │ │ │ │ +210 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +211 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +212 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +213 (*this)[i][j].umv(x[j], y[i]); │ │ │ │ │ +214 }); │ │ │ │ │ +215 }); │ │ │ │ │ +216 } │ │ │ │ │ +217 │ │ │ │ │ +220 template │ │ │ │ │ +_2_2_1 void _m_m_v (const X& x, Y& y) const { │ │ │ │ │ +222 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ +223 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ +224 using namespace Dune::Hybrid; │ │ │ │ │ +225 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +226 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +227 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +228 (*this)[i][j].mmv(x[j], y[i]); │ │ │ │ │ +229 }); │ │ │ │ │ +230 }); │ │ │ │ │ +231 } │ │ │ │ │ +232 │ │ │ │ │ +235 template │ │ │ │ │ +_2_3_6 void _u_s_m_v (const AlphaType& alpha, const X& x, Y& y) const { │ │ │ │ │ +237 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ +238 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ +239 using namespace Dune::Hybrid; │ │ │ │ │ +240 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +241 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +242 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +243 (*this)[i][j].usmv(alpha, x[j], y[i]); │ │ │ │ │ +244 }); │ │ │ │ │ +245 }); │ │ │ │ │ +246 } │ │ │ │ │ 247 │ │ │ │ │ -248 │ │ │ │ │ -260 template │ │ │ │ │ -_2_6_1 class _S_e_q_S_O_R : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -262 public: │ │ │ │ │ -_2_6_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_2_6_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_2_6_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_2_7_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_7_2 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_7_4 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -275 │ │ │ │ │ -_2_8_3 _S_e_q_S_O_R (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w) │ │ │ │ │ -284 : _A_(A), _n(n), _w(w) │ │ │ │ │ -285 { │ │ │ │ │ -286 _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_M_,_l_>_:_:_c_h_e_c_k(_A_); │ │ │ │ │ -287 } │ │ │ │ │ -288 │ │ │ │ │ -_3_0_2 _S_e_q_S_O_R (const std::shared_ptr>& A, │ │ │ │ │ -const ParameterTree& configuration) │ │ │ │ │ -303 : _S_e_q_S_O_R(A->getmat(), configuration) │ │ │ │ │ -304 {} │ │ │ │ │ -305 │ │ │ │ │ -_3_1_9 _S_e_q_S_O_R (const M& A, const ParameterTree& configuration) │ │ │ │ │ -320 : _S_e_q_S_O_R(A, configuration._g_e_t("iterations",1), │ │ │ │ │ -configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation",1.0)) │ │ │ │ │ -321 {} │ │ │ │ │ -322 │ │ │ │ │ -_3_2_8 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ -329 {} │ │ │ │ │ -330 │ │ │ │ │ -_3_3_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -337 { │ │ │ │ │ -338 this->template apply(v,d); │ │ │ │ │ -339 } │ │ │ │ │ -340 │ │ │ │ │ -349 template │ │ │ │ │ -_3_5_0 void _a_p_p_l_y(X& v, const Y& d) │ │ │ │ │ -351 { │ │ │ │ │ -352 if(forward) │ │ │ │ │ -353 for (int i=0; i<_n; i++) { │ │ │ │ │ -354 _b_s_o_r_f(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ -355 } │ │ │ │ │ -356 else │ │ │ │ │ -357 for (int i=0; i<_n; i++) { │ │ │ │ │ -358 _b_s_o_r_b(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ -359 } │ │ │ │ │ -360 } │ │ │ │ │ -361 │ │ │ │ │ -_3_6_7 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ -368 {} │ │ │ │ │ -369 │ │ │ │ │ -_3_7_1 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -372 { │ │ │ │ │ -373 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -374 } │ │ │ │ │ -375 │ │ │ │ │ -376 private: │ │ │ │ │ -378 const M& _A_; │ │ │ │ │ -380 int _n; │ │ │ │ │ -382 _r_e_a_l___f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ -383 }; │ │ │ │ │ -_3_8_4 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("sor", │ │ │ │ │ -defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ -385 │ │ │ │ │ -386 │ │ │ │ │ -397 template │ │ │ │ │ -_3_9_8 using _S_e_q_G_S = _S_e_q_S_O_R_<_M_,_X_,_Y_,_l_>; │ │ │ │ │ -_3_9_9 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("gs", │ │ │ │ │ -defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ -400 │ │ │ │ │ -411 template │ │ │ │ │ -_4_1_2 class _S_e_q_J_a_c : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_> { │ │ │ │ │ -413 public: │ │ │ │ │ -_4_1_5 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_4_1_7 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_4_1_9 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_4_2_1 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_4_2_3 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_4_2_5 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -426 │ │ │ │ │ -_4_3_4 _S_e_q_J_a_c (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w) │ │ │ │ │ -435 : _A_(A), _n(n), _w(w) │ │ │ │ │ -436 { │ │ │ │ │ -437 _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_M_,_l_>_:_:_c_h_e_c_k(_A_); │ │ │ │ │ -438 } │ │ │ │ │ -439 │ │ │ │ │ -_4_5_3 _S_e_q_J_a_c (const std::shared_ptr>& A, │ │ │ │ │ -const ParameterTree& configuration) │ │ │ │ │ -454 : _S_e_q_J_a_c(A->getmat(), configuration) │ │ │ │ │ -455 {} │ │ │ │ │ -456 │ │ │ │ │ -_4_7_0 _S_e_q_J_a_c (const M& A, const ParameterTree& configuration) │ │ │ │ │ -471 : _S_e_q_J_a_c(A, configuration._g_e_t("iterations",1), │ │ │ │ │ -configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation",1.0)) │ │ │ │ │ -472 {} │ │ │ │ │ -473 │ │ │ │ │ -_4_7_9 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ -480 {} │ │ │ │ │ -481 │ │ │ │ │ -_4_8_7 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -488 { │ │ │ │ │ -489 for (int i=0; i<_n; i++) { │ │ │ │ │ -490 _d_b_j_a_c(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ -491 } │ │ │ │ │ -492 } │ │ │ │ │ -493 │ │ │ │ │ -_4_9_9 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ -500 {} │ │ │ │ │ -501 │ │ │ │ │ -_5_0_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -504 { │ │ │ │ │ -505 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -506 } │ │ │ │ │ +250 template │ │ │ │ │ +_2_5_1 void _m_t_v (const X& x, Y& y) const { │ │ │ │ │ +252 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +253 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +254 y = 0; │ │ │ │ │ +255 _u_m_t_v(x,y); │ │ │ │ │ +256 } │ │ │ │ │ +257 │ │ │ │ │ +260 template │ │ │ │ │ +_2_6_1 void _u_m_t_v (const X& x, Y& y) const { │ │ │ │ │ +262 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +263 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +264 using namespace Dune::Hybrid; │ │ │ │ │ +265 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +266 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +267 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +268 (*this)[j][i].umtv(x[j], y[i]); │ │ │ │ │ +269 }); │ │ │ │ │ +270 }); │ │ │ │ │ +271 } │ │ │ │ │ +272 │ │ │ │ │ +275 template │ │ │ │ │ +_2_7_6 void _m_m_t_v (const X& x, Y& y) const { │ │ │ │ │ +277 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +278 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +279 using namespace Dune::Hybrid; │ │ │ │ │ +280 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +281 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +282 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +283 (*this)[j][i].mmtv(x[j], y[i]); │ │ │ │ │ +284 }); │ │ │ │ │ +285 }); │ │ │ │ │ +286 } │ │ │ │ │ +287 │ │ │ │ │ +290 template │ │ │ │ │ +_2_9_1 void _u_s_m_t_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const { │ │ │ │ │ +292 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +293 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +294 using namespace Dune::Hybrid; │ │ │ │ │ +295 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +296 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +297 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +298 (*this)[j][i].usmtv(alpha, x[j], y[i]); │ │ │ │ │ +299 }); │ │ │ │ │ +300 }); │ │ │ │ │ +301 } │ │ │ │ │ +302 │ │ │ │ │ +305 template │ │ │ │ │ +_3_0_6 void _u_m_h_v (const X& x, Y& y) const { │ │ │ │ │ +307 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +308 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +309 using namespace Dune::Hybrid; │ │ │ │ │ +310 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +311 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +312 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +313 (*this)[j][i].umhv(x[j], y[i]); │ │ │ │ │ +314 }); │ │ │ │ │ +315 }); │ │ │ │ │ +316 } │ │ │ │ │ +317 │ │ │ │ │ +320 template │ │ │ │ │ +_3_2_1 void _m_m_h_v (const X& x, Y& y) const { │ │ │ │ │ +322 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +323 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +324 using namespace Dune::Hybrid; │ │ │ │ │ +325 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +326 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +327 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +328 (*this)[j][i].mmhv(x[j], y[i]); │ │ │ │ │ +329 }); │ │ │ │ │ +330 }); │ │ │ │ │ +331 } │ │ │ │ │ +332 │ │ │ │ │ +335 template │ │ │ │ │ +_3_3_6 void _u_s_m_h_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const { │ │ │ │ │ +337 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ +rows"); │ │ │ │ │ +338 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ +columns"); │ │ │ │ │ +339 using namespace Dune::Hybrid; │ │ │ │ │ +340 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ +341 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +342 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ +343 (*this)[j][i].usmhv(alpha, x[j], y[i]); │ │ │ │ │ +344 }); │ │ │ │ │ +345 }); │ │ │ │ │ +346 } │ │ │ │ │ +347 │ │ │ │ │ +348 │ │ │ │ │ +349 //===== norms │ │ │ │ │ +350 │ │ │ │ │ +_3_5_2 auto _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ +353 { │ │ │ │ │ +354 using field_type_00 = typename std::decay_t_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +355 typename FieldTraits::real_type sum=0; │ │ │ │ │ +356 │ │ │ │ │ +357 auto rows = index_constant(); │ │ │ │ │ +358 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) { │ │ │ │ │ +359 auto cols = index_constant::M()>(); │ │ │ │ │ +360 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) { │ │ │ │ │ +361 sum += (*this)[i][j].frobenius_norm2(); │ │ │ │ │ +362 }); │ │ │ │ │ +363 }); │ │ │ │ │ +364 │ │ │ │ │ +365 return sum; │ │ │ │ │ +366 } │ │ │ │ │ +367 │ │ │ │ │ +_3_6_9 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ +370 { │ │ │ │ │ +371 return sqrt(_f_r_o_b_e_n_i_u_s___n_o_r_m_2()); │ │ │ │ │ +372 } │ │ │ │ │ +373 │ │ │ │ │ +_3_7_5 auto _i_n_f_i_n_i_t_y___n_o_r_m () const │ │ │ │ │ +376 { │ │ │ │ │ +377 using field_type_00 = typename std::decay_t_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +378 using std::max; │ │ │ │ │ +379 typename FieldTraits::real_type norm=0; │ │ │ │ │ +380 │ │ │ │ │ +381 auto rows = index_constant(); │ │ │ │ │ +382 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) { │ │ │ │ │ +383 │ │ │ │ │ +384 typename FieldTraits::real_type sum=0; │ │ │ │ │ +385 auto cols = index_constant::M()>(); │ │ │ │ │ +386 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) { │ │ │ │ │ +387 sum += (*this)[i][j].infinity_norm(); │ │ │ │ │ +388 }); │ │ │ │ │ +389 norm = max(sum, norm); │ │ │ │ │ +390 }); │ │ │ │ │ +391 │ │ │ │ │ +392 return norm; │ │ │ │ │ +393 } │ │ │ │ │ +394 │ │ │ │ │ +_3_9_6 auto _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l () const │ │ │ │ │ +397 { │ │ │ │ │ +398 using field_type_00 = typename std::decay_t_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +399 using std::max; │ │ │ │ │ +400 typename FieldTraits::real_type norm=0; │ │ │ │ │ +401 │ │ │ │ │ +402 auto rows = index_constant(); │ │ │ │ │ +403 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) { │ │ │ │ │ +404 │ │ │ │ │ +405 typename FieldTraits::real_type sum=0; │ │ │ │ │ +406 auto cols = index_constant::M()>(); │ │ │ │ │ +407 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) { │ │ │ │ │ +408 sum += (*this)[i][j].infinity_norm_real(); │ │ │ │ │ +409 }); │ │ │ │ │ +410 norm = max(sum, norm); │ │ │ │ │ +411 }); │ │ │ │ │ +412 │ │ │ │ │ +413 return norm; │ │ │ │ │ +414 } │ │ │ │ │ +415 │ │ │ │ │ +416 }; │ │ │ │ │ +417 │ │ │ │ │ +423 template │ │ │ │ │ +_4_2_4 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ +_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_A_r_g_s_._._._>& m) { │ │ │ │ │ +425 auto N = index_constant::N()>(); │ │ │ │ │ +426 auto M = index_constant::M()>(); │ │ │ │ │ +427 using namespace Dune::Hybrid; │ │ │ │ │ +428 forEach(integralRange(N), [&](auto&& i) { │ │ │ │ │ +429 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +430 forEach(integralRange(M), [&](auto&& j) { │ │ │ │ │ +431 s << "\t(" << i << ", " << j << "): \n" << m[i][j]; │ │ │ │ │ +432 }); │ │ │ │ │ +433 }); │ │ │ │ │ +434 s << std::endl; │ │ │ │ │ +435 return s; │ │ │ │ │ +436 } │ │ │ │ │ +437 │ │ │ │ │ +438 //make algmeta_itsteps known │ │ │ │ │ +439 template │ │ │ │ │ +440 struct algmeta_itsteps; │ │ │ │ │ +441 │ │ │ │ │ +448 template // │ │ │ │ │ +MultiTypeBlockMatrix_Solver_Col: iterating over one row │ │ │ │ │ +_4_4_9 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l { //calculating b- A[i][j]*x[j] │ │ │ │ │ +450 public: │ │ │ │ │ +454 template │ │ │ │ │ +_4_5_5 static void _c_a_l_c___r_h_s(const TMatrix& A, TVector& x, TVector& v, Trhs& b, │ │ │ │ │ +const K& w) { │ │ │ │ │ +456 std::get( std::get(A) ).mmv( std::get(x), b ); │ │ │ │ │ +457 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_I_,_ _c_r_o_w_,_ _c_c_o_l_+_1_,_ _r_e_m_a_i_n___c_o_l_-_1_>_:_:_c_a_l_c___r_h_s │ │ │ │ │ +(A,x,v,b,w); //next column element │ │ │ │ │ +458 } │ │ │ │ │ +459 │ │ │ │ │ +460 }; │ │ │ │ │ +461 template //MultiTypeBlockMatrix_Solver_Col │ │ │ │ │ +recursion end │ │ │ │ │ +_4_6_2 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l { │ │ │ │ │ +463 public: │ │ │ │ │ +464 template │ │ │ │ │ +_4_6_5 static void _c_a_l_c___r_h_s(const TMatrix&, TVector&, TVector&, Trhs&, const K&) │ │ │ │ │ +{} │ │ │ │ │ +466 }; │ │ │ │ │ +467 │ │ │ │ │ +468 │ │ │ │ │ +469 │ │ │ │ │ +476 template │ │ │ │ │ +_4_7_7 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r { │ │ │ │ │ +478 public: │ │ │ │ │ +479 │ │ │ │ │ +483 template │ │ │ │ │ +_4_8_4 static void _d_b_g_s(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ +w) { │ │ │ │ │ +485 TVector xold(x); │ │ │ │ │ +486 xold=x; //store old x values │ │ │ │ │ +487 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_d_b_g_s(A,x,x,b,w); │ │ │ │ │ +488 x *= w; │ │ │ │ │ +489 x.axpy(1-w,xold); //improve x │ │ │ │ │ +490 } │ │ │ │ │ +491 template │ │ │ │ │ +_4_9_2 static void _d_b_g_s(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ +b, const K& w) { │ │ │ │ │ +493 auto rhs = std::get (b); │ │ │ │ │ +494 │ │ │ │ │ +495 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ +(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ +496 //solve on blocklevel I-1 │ │ │ │ │ +497 using M = │ │ │ │ │ +498 typename std::remove_cv< │ │ │ │ │ +499 typename std::remove_reference< │ │ │ │ │ +500 decltype(std::get( std::get(A))) │ │ │ │ │ +501 >::type │ │ │ │ │ +502 >::type; │ │ │ │ │ +503 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_d_b_g_s(std::get( std::get(A)), std:: │ │ │ │ │ +get(x),rhs,w); │ │ │ │ │ +504 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_+_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_d_b_g_s(A,x,v,b,w); //next │ │ │ │ │ +row │ │ │ │ │ +505 } │ │ │ │ │ +506 │ │ │ │ │ 507 │ │ │ │ │ -508 private: │ │ │ │ │ -510 const M& _A_; │ │ │ │ │ -512 int _n; │ │ │ │ │ -514 real_field_type _w; │ │ │ │ │ -515 }; │ │ │ │ │ -_5_1_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("jac", │ │ │ │ │ -defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +508 │ │ │ │ │ +512 template │ │ │ │ │ +_5_1_3 static void _b_s_o_r_f(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ +w) { │ │ │ │ │ +514 TVector v; │ │ │ │ │ +515 v=x; //use latest x values in right side calculation │ │ │ │ │ +516 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_b_s_o_r_f(A,x,v,b,w); │ │ │ │ │ 517 │ │ │ │ │ -518 │ │ │ │ │ -519 │ │ │ │ │ -531 template │ │ │ │ │ -_5_3_2 class _S_e_q_I_L_U : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_> { │ │ │ │ │ -533 public: │ │ │ │ │ -_5_3_5 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_5_3_7 typedef typename matrix_type :: block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -_5_3_9 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_5_4_1 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -542 │ │ │ │ │ -_5_4_4 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -545 │ │ │ │ │ -_5_4_7 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_5_4_9 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -550 │ │ │ │ │ -_5_5_2 typedef typename _I_L_U_:_:_C_R_S_<_ _b_l_o_c_k___t_y_p_e_ _,_ _t_y_p_e_n_a_m_e_ _M_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e_> _C_R_S; │ │ │ │ │ -553 │ │ │ │ │ -_5_6_1 _S_e_q_I_L_U (const M& A, _r_e_a_l___f_i_e_l_d___t_y_p_e w, const bool resort = false ) │ │ │ │ │ -562 : _S_e_q_I_L_U( A, 0, w, resort ) // construct ILU(0) │ │ │ │ │ -563 { │ │ │ │ │ -564 } │ │ │ │ │ -565 │ │ │ │ │ -_5_8_0 _S_e_q_I_L_U (const std::shared_ptr>& A, │ │ │ │ │ -const ParameterTree& configuration) │ │ │ │ │ -581 : _S_e_q_I_L_U(A->getmat(), configuration) │ │ │ │ │ -582 {} │ │ │ │ │ -583 │ │ │ │ │ -_5_9_8 _S_e_q_I_L_U(const M& A, const ParameterTree& config) │ │ │ │ │ -599 : _S_e_q_I_L_U(A, config._g_e_t("n", 0), │ │ │ │ │ -600 config._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation", 1.0), │ │ │ │ │ -601 config._g_e_t("resort", false)) │ │ │ │ │ -602 {} │ │ │ │ │ -603 │ │ │ │ │ -_6_1_2 _S_e_q_I_L_U (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w, const bool resort = false ) │ │ │ │ │ -613 : ILU_(), │ │ │ │ │ -614 lower_(), │ │ │ │ │ -615 upper_(), │ │ │ │ │ -616 inv_(), │ │ │ │ │ -617 w_(w), │ │ │ │ │ -618 wNotIdentity_([w]{using std::abs; return abs(w - _r_e_a_l___f_i_e_l_d___t_y_p_e(1)) > 1e- │ │ │ │ │ -15;}() ) │ │ │ │ │ -619 { │ │ │ │ │ -620 if( n == 0 ) │ │ │ │ │ -621 { │ │ │ │ │ -622 // copy A │ │ │ │ │ -623 ILU_.reset( new matrix_type( A ) ); │ │ │ │ │ -624 // create ILU(0) decomposition │ │ │ │ │ -625 _I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n( *ILU_ ); │ │ │ │ │ -626 } │ │ │ │ │ -627 else │ │ │ │ │ -628 { │ │ │ │ │ -629 // create matrix in build mode │ │ │ │ │ -630 ILU_.reset( new matrix_type( A._N(), A._M(), matrix_type::row_wise) ); │ │ │ │ │ -631 // create ILU(n) decomposition │ │ │ │ │ -632 _I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n( A, n, *ILU_ ); │ │ │ │ │ -633 } │ │ │ │ │ -634 │ │ │ │ │ -635 if( resort ) │ │ │ │ │ -636 { │ │ │ │ │ -637 // store ILU in simple CRS format │ │ │ │ │ -638 _I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S( *ILU_, lower_, upper_, inv_ ); │ │ │ │ │ -639 ILU_.reset(); │ │ │ │ │ -640 } │ │ │ │ │ -641 } │ │ │ │ │ -642 │ │ │ │ │ -_6_4_8 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ -649 {} │ │ │ │ │ -650 │ │ │ │ │ -_6_5_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -657 { │ │ │ │ │ -658 if( ILU_ ) │ │ │ │ │ -659 { │ │ │ │ │ -660 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e( *ILU_, v, d); │ │ │ │ │ -661 } │ │ │ │ │ -662 else │ │ │ │ │ -663 { │ │ │ │ │ -664 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e(lower_, upper_, inv_, v, d); │ │ │ │ │ -665 } │ │ │ │ │ -666 │ │ │ │ │ -667 if( wNotIdentity_ ) │ │ │ │ │ -668 { │ │ │ │ │ -669 v *= w_; │ │ │ │ │ -670 } │ │ │ │ │ -671 } │ │ │ │ │ -672 │ │ │ │ │ -_6_7_8 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ -679 {} │ │ │ │ │ -680 │ │ │ │ │ -_6_8_2 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -683 { │ │ │ │ │ -684 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -685 } │ │ │ │ │ -686 │ │ │ │ │ -687 protected: │ │ │ │ │ -_6_8_9 std::unique_ptr< matrix_type > _I_L_U__; │ │ │ │ │ -690 │ │ │ │ │ -_6_9_2 _C_R_S _l_o_w_e_r__; │ │ │ │ │ -_6_9_3 _C_R_S _u_p_p_e_r__; │ │ │ │ │ -_6_9_4 std::vector< block_type, typename matrix_type::allocator_type > _i_n_v__; │ │ │ │ │ -695 │ │ │ │ │ -_6_9_7 const _r_e_a_l___f_i_e_l_d___t_y_p_e _w__; │ │ │ │ │ -_6_9_9 const bool _w_N_o_t_I_d_e_n_t_i_t_y__; │ │ │ │ │ -700 }; │ │ │ │ │ -_7_0_1 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("ilu", │ │ │ │ │ -defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ -702 │ │ │ │ │ -703 │ │ │ │ │ -712 template │ │ │ │ │ -_7_1_3 class _R_i_c_h_a_r_d_s_o_n : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -714 public: │ │ │ │ │ -_7_1_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_7_1_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_7_2_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_7_2_2 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_7_2_4 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -725 │ │ │ │ │ -_7_3_1 _R_i_c_h_a_r_d_s_o_n (_r_e_a_l___f_i_e_l_d___t_y_p_e w=1.0) : │ │ │ │ │ -732 _w(w) │ │ │ │ │ -733 {} │ │ │ │ │ -734 │ │ │ │ │ -_7_4_6 _R_i_c_h_a_r_d_s_o_n (const ParameterTree& configuration) │ │ │ │ │ -747 : _R_i_c_h_a_r_d_s_o_n(configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation", 1.0)) │ │ │ │ │ -748 {} │ │ │ │ │ -749 │ │ │ │ │ -_7_5_5 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ -756 {} │ │ │ │ │ -757 │ │ │ │ │ -_7_6_3 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -764 { │ │ │ │ │ -765 v = d; │ │ │ │ │ -766 v *= _w; │ │ │ │ │ -767 } │ │ │ │ │ -768 │ │ │ │ │ -_7_7_4 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ -775 {} │ │ │ │ │ -776 │ │ │ │ │ -_7_7_8 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -779 { │ │ │ │ │ -780 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -781 } │ │ │ │ │ -782 │ │ │ │ │ -783 private: │ │ │ │ │ -785 _r_e_a_l___f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ -786 }; │ │ │ │ │ -_7_8_7 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("richardson", [](auto tl, const auto& /* mat │ │ │ │ │ -*/, const ParameterTree& config){ │ │ │ │ │ -788 using D = typename Dune::TypeListElement<1, decltype(tl)>::type; │ │ │ │ │ -789 using R = typename Dune::TypeListElement<2, decltype(tl)>::type; │ │ │ │ │ -790 return std::make_shared>(config); │ │ │ │ │ -791 }); │ │ │ │ │ -792 │ │ │ │ │ -793 │ │ │ │ │ -804 template< class M, class X, class Y > │ │ │ │ │ -_8_0_5 class _S_e_q_I_L_D_L │ │ │ │ │ -806 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r< X, Y > │ │ │ │ │ -807 { │ │ │ │ │ -808 typedef _S_e_q_I_L_D_L_<_ _M_,_ _X_,_ _Y_ _> _T_h_i_s; │ │ │ │ │ -809 typedef _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_ _> _B_a_s_e; │ │ │ │ │ -810 │ │ │ │ │ -811 public: │ │ │ │ │ -_8_1_3 typedef std::remove_const_t< M > _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_8_1_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_8_1_7 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_8_1_9 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_8_2_1 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_8_2_3 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ -824 │ │ │ │ │ -_8_3_7 _S_e_q_I_L_D_L (const std::shared_ptr>& A, │ │ │ │ │ -const ParameterTree& configuration) │ │ │ │ │ -838 : _S_e_q_I_L_D_L(A->getmat(), configuration) │ │ │ │ │ -839 {} │ │ │ │ │ -840 │ │ │ │ │ -_8_5_3 _S_e_q_I_L_D_L(const _m_a_t_r_i_x___t_y_p_e& A, const ParameterTree& config) │ │ │ │ │ -854 : _S_e_q_I_L_D_L(A, config._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation", 1.0)) │ │ │ │ │ -855 {} │ │ │ │ │ -856 │ │ │ │ │ -_8_6_5 explicit _S_e_q_I_L_D_L ( const _m_a_t_r_i_x___t_y_p_e &A, _r_e_a_l___f_i_e_l_d___t_y_p_e relax = │ │ │ │ │ -_r_e_a_l___f_i_e_l_d___t_y_p_e( 1 ) ) │ │ │ │ │ -866 : decomposition_( A.N(), A.M(), _m_a_t_r_i_x___t_y_p_e::random ), │ │ │ │ │ -867 relax_( relax ) │ │ │ │ │ -868 { │ │ │ │ │ -869 // setup row sizes for lower triangular matrix │ │ │ │ │ -870 for( auto i = A.begin(), iend = A.end(); i != iend; ++i ) │ │ │ │ │ -871 { │ │ │ │ │ -872 const auto &A_i = *i; │ │ │ │ │ -873 const auto ij = A_i.find( i.index() ); │ │ │ │ │ -874 if( ij != A_i.end() ) │ │ │ │ │ -875 decomposition_.setrowsize( i.index(), ij.offset()+1 ); │ │ │ │ │ -876 else │ │ │ │ │ -877 DUNE_THROW( _I_S_T_L_E_r_r_o_r, "diagonal entry missing" ); │ │ │ │ │ -878 } │ │ │ │ │ -879 decomposition_.endrowsizes(); │ │ │ │ │ -880 │ │ │ │ │ -881 // setup row indices for lower triangular matrix │ │ │ │ │ -882 for( auto i = A.begin(), iend = A.end(); i != iend; ++i ) │ │ │ │ │ -883 { │ │ │ │ │ -884 const auto &A_i = *i; │ │ │ │ │ -885 for( auto ij = A_i.begin(); ij.index() < i.index() ; ++ij ) │ │ │ │ │ -886 decomposition_.addindex( i.index(), ij.index() ); │ │ │ │ │ -887 decomposition_.addindex( i.index(), i.index() ); │ │ │ │ │ -888 } │ │ │ │ │ -889 decomposition_.endindices(); │ │ │ │ │ -890 │ │ │ │ │ -891 // copy values of lower triangular matrix │ │ │ │ │ -892 auto i = A.begin(); │ │ │ │ │ -893 for( auto row = decomposition_.begin(), rowend = decomposition_.end(); row │ │ │ │ │ -!= rowend; ++row, ++i ) │ │ │ │ │ -894 { │ │ │ │ │ -895 auto ij = i->begin(); │ │ │ │ │ -896 for( auto _c_o_l = row->begin(), colend = row->end(); _c_o_l != colend; ++_c_o_l, │ │ │ │ │ -++ij ) │ │ │ │ │ -897 *_c_o_l = *ij; │ │ │ │ │ -898 } │ │ │ │ │ -899 │ │ │ │ │ -900 // perform ILDL decomposition │ │ │ │ │ -901 _b_i_l_d_l___d_e_c_o_m_p_o_s_e( decomposition_ ); │ │ │ │ │ -902 } │ │ │ │ │ -903 │ │ │ │ │ -_9_0_5 void _p_r_e ([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override │ │ │ │ │ -906 {} │ │ │ │ │ -907 │ │ │ │ │ -_9_0_9 void _a_p_p_l_y ( X &v, const Y &d ) override │ │ │ │ │ -910 { │ │ │ │ │ -911 _b_i_l_d_l___b_a_c_k_s_o_l_v_e( decomposition_, v, d, true ); │ │ │ │ │ -912 v *= relax_; │ │ │ │ │ -913 } │ │ │ │ │ -914 │ │ │ │ │ -_9_1_6 void _p_o_s_t ([[maybe_unused]] X &x) override │ │ │ │ │ -917 {} │ │ │ │ │ -918 │ │ │ │ │ -_9_2_0 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y () const override { return │ │ │ │ │ -_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; } │ │ │ │ │ -921 │ │ │ │ │ -922 private: │ │ │ │ │ -923 _m_a_t_r_i_x___t_y_p_e decomposition_; │ │ │ │ │ -924 _r_e_a_l___f_i_e_l_d___t_y_p_e relax_; │ │ │ │ │ -925 }; │ │ │ │ │ -_9_2_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("ildl", defaultPreconditionerCreator()); │ │ │ │ │ -927 │ │ │ │ │ -930} // end namespace │ │ │ │ │ -931 │ │ │ │ │ -932 │ │ │ │ │ -933#endif │ │ │ │ │ +518 } │ │ │ │ │ +519 template //recursion over │ │ │ │ │ +all matrix rows (A) │ │ │ │ │ +_5_2_0 static void _b_s_o_r_f(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ +b, const K& w) { │ │ │ │ │ +521 auto rhs = std::get (b); │ │ │ │ │ +522 │ │ │ │ │ +523 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ +(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ +524 //solve on blocklevel I-1 │ │ │ │ │ +525 using M = │ │ │ │ │ +526 typename std::remove_cv< │ │ │ │ │ +527 typename std::remove_reference< │ │ │ │ │ +528 decltype(std::get( std::get(A))) │ │ │ │ │ +529 >::type │ │ │ │ │ +530 >::type; │ │ │ │ │ +531 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_b_s_o_r_f(std::get( std::get(A)), std:: │ │ │ │ │ +get(v),rhs,w); │ │ │ │ │ +532 std::get(x).axpy(w,std::get(v)); │ │ │ │ │ +533 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_+_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_b_s_o_r_f(A,x,v,b,w); // │ │ │ │ │ +next row │ │ │ │ │ +534 } │ │ │ │ │ +535 │ │ │ │ │ +539 template │ │ │ │ │ +_5_4_0 static void _b_s_o_r_b(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ +w) { │ │ │ │ │ +541 TVector v; │ │ │ │ │ +542 v=x; //use latest x values in right side calculation │ │ │ │ │ +543 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_b_s_o_r_b(A,x,v,b,w); │ │ │ │ │ +544 │ │ │ │ │ +545 } │ │ │ │ │ +546 template //recursion over │ │ │ │ │ +all matrix rows (A) │ │ │ │ │ +_5_4_7 static void _b_s_o_r_b(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ +b, const K& w) { │ │ │ │ │ +548 auto rhs = std::get (b); │ │ │ │ │ +549 │ │ │ │ │ +550 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ +(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ +551 //solve on blocklevel I-1 │ │ │ │ │ +552 using M = │ │ │ │ │ +553 typename std::remove_cv< │ │ │ │ │ +554 typename std::remove_reference< │ │ │ │ │ +555 decltype(std::get( std::get(A))) │ │ │ │ │ +556 >::type │ │ │ │ │ +557 >::type; │ │ │ │ │ +558 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_b_s_o_r_b(std::get( std::get(A)), std:: │ │ │ │ │ +get(v),rhs,w); │ │ │ │ │ +559 std::get(x).axpy(w,std::get(v)); │ │ │ │ │ +560 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_-_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_b_s_o_r_b(A,x,v,b,w); // │ │ │ │ │ +next row │ │ │ │ │ +561 } │ │ │ │ │ +562 │ │ │ │ │ +563 │ │ │ │ │ +567 template │ │ │ │ │ +_5_6_8 static void _d_b_j_a_c(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ +w) { │ │ │ │ │ +569 TVector v(x); │ │ │ │ │ +570 v=0; //calc new x in v │ │ │ │ │ +571 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_d_b_j_a_c(A,x,v,b,w); │ │ │ │ │ +572 x.axpy(w,v); //improve x │ │ │ │ │ +573 } │ │ │ │ │ +574 template │ │ │ │ │ +_5_7_5 static void _d_b_j_a_c(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ +b, const K& w) { │ │ │ │ │ +576 auto rhs = std::get (b); │ │ │ │ │ +577 │ │ │ │ │ +578 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ +(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ +579 //solve on blocklevel I-1 │ │ │ │ │ +580 using M = │ │ │ │ │ +581 typename std::remove_cv< │ │ │ │ │ +582 typename std::remove_reference< │ │ │ │ │ +583 decltype(std::get( std::get(A))) │ │ │ │ │ +584 >::type │ │ │ │ │ +585 >::type; │ │ │ │ │ +586 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_d_b_j_a_c(std::get( std::get(A)), std:: │ │ │ │ │ +get(v),rhs,w); │ │ │ │ │ +587 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_+_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_d_b_j_a_c(A,x,v,b,w); // │ │ │ │ │ +next row │ │ │ │ │ +588 } │ │ │ │ │ +589 │ │ │ │ │ +590 │ │ │ │ │ +591 │ │ │ │ │ +592 │ │ │ │ │ +593 }; │ │ │ │ │ +594 template //recursion end for remain_row = 0 │ │ │ │ │ +_5_9_5 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r { │ │ │ │ │ +596 public: │ │ │ │ │ +597 template │ │ │ │ │ +_5_9_8 static void _d_b_g_s(const TMatrix&, TVector&, TVector&, │ │ │ │ │ +599 const TVector&, const K&) {} │ │ │ │ │ +600 │ │ │ │ │ +601 template │ │ │ │ │ +_6_0_2 static void _b_s_o_r_f(const TMatrix&, TVector&, TVector&, │ │ │ │ │ +603 const TVector&, const K&) {} │ │ │ │ │ +604 │ │ │ │ │ +605 template │ │ │ │ │ +_6_0_6 static void _b_s_o_r_b(const TMatrix&, TVector&, TVector&, │ │ │ │ │ +607 const TVector&, const K&) {} │ │ │ │ │ +608 │ │ │ │ │ +609 template │ │ │ │ │ +_6_1_0 static void _d_b_j_a_c(const TMatrix&, TVector&, TVector&, │ │ │ │ │ +611 const TVector&, const K&) {} │ │ │ │ │ +612 }; │ │ │ │ │ +613 │ │ │ │ │ +614} // end namespace Dune │ │ │ │ │ +615 │ │ │ │ │ +616namespace _s_t_d │ │ │ │ │ +617{ │ │ │ │ │ +622 template │ │ │ │ │ +_6_2_3 struct tuple_element > │ │ │ │ │ +624 { │ │ │ │ │ +_6_2_5 using _t_y_p_e = typename std::tuple_element >::type; │ │ │ │ │ +626 }; │ │ │ │ │ +627} │ │ │ │ │ +628#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ _g_s_e_t_c_._h_h │ │ │ │ │ Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ generic way. │ │ │ │ │ -_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R │ │ │ │ │ -#define DUNE_REGISTER_PRECONDITIONER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:16 │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ -Some handy generic functions for ISTL matrices. │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ -_i_l_d_l_._h_h │ │ │ │ │ -Incomplete LDL decomposition. │ │ │ │ │ -_s_o_l_v_e_r_._h_h │ │ │ │ │ -Define general, extensible interface for inverse operators. │ │ │ │ │ -_i_l_u_._h_h │ │ │ │ │ -The incomplete LU factorization kernels. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_D_u_n_e_:_:_b_s_o_r_b │ │ │ │ │ -void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -SSOR step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:646 │ │ │ │ │ -_D_u_n_e_:_:_d_b_j_a_c │ │ │ │ │ -void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -Jacobi step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:658 │ │ │ │ │ -_D_u_n_e_:_:_b_s_o_r_f │ │ │ │ │ -void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -SOR step. │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:634 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_t_y_p_e │ │ │ │ │ +MultiTypeBlockMatrix< FirstRow, Args... > type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ +MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b) │ │ │ │ │ +Add the entries of another matrix to this one. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ +void mv(const X &x, Y &y) const │ │ │ │ │ +y = A x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ +void mmtv(const X &x, Y &y) const │ │ │ │ │ +y -= A^T x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ +void mmhv(const X &x, Y &y) const │ │ │ │ │ +y -= A^H x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:321 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ +K &) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:598 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:484 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:540 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ +void usmhv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^H x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:336 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +FirstRow::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ +void usmv(const AlphaType &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:236 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ +MultiTypeBlockMatrix & operator/=(const field_type &k) │ │ │ │ │ +vector space division by scalar │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:152 │ │ │ │ │ +_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _A_r_g_s_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +typename std::tuple_element< i, std::tuple< Args... > >::type type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:625 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ +const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:492 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ +const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ +void umhv(const X &x, Y &y) const │ │ │ │ │ +y += A^H x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ +frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:369 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_N │ │ │ │ │ +static constexpr size_type N() │ │ │ │ │ +Return the number of matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ +void usmtv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^T x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:291 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +void operator=(const T &newval) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_ _I_,_ _c_r_o_w_,_ _c_c_o_l_,_ _0_ _>_:_:_c_a_l_c___r_h_s │ │ │ │ │ +static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:465 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ +void umv(const X &x, Y &y) const │ │ │ │ │ +y += A x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_:_:_c_a_l_c___r_h_s │ │ │ │ │ +static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K │ │ │ │ │ +&w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:455 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:513 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_s_i_z_e │ │ │ │ │ +static constexpr size_type size() │ │ │ │ │ +Return the number of matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ +K &) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:610 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ +auto infinity_norm_real() const │ │ │ │ │ +Bastardized version of the infinity-norm / row-sum norm. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:396 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ +auto frobenius_norm2() const │ │ │ │ │ +square of frobenius norm, need for block recursion │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:352 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for sizes. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ +auto infinity_norm() const │ │ │ │ │ +Bastardized version of the infinity-norm / row-sum norm. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:375 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ +K &) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:606 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ +MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b) │ │ │ │ │ +Subtract the entries of another matrix from this one. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +auto operator[](const std::integral_constant< size_type, index > indexVariable) │ │ │ │ │ +-> decltype(std::get< index >(*this)) │ │ │ │ │ +Random-access operator. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ +const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:575 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ +K &) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:602 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ +void mtv(const X &x, Y &y) const │ │ │ │ │ +y = A^T x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:251 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_M │ │ │ │ │ +static constexpr size_type M() │ │ │ │ │ +Return the number of matrix columns. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ +void mmv(const X &x, Y &y) const │ │ │ │ │ +y -= A x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ +void umtv(const X &x, Y &y) const │ │ │ │ │ +y += A^T x │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ +const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:547 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ +MultiTypeBlockMatrix & operator*=(const field_type &k) │ │ │ │ │ +vector space multiplication with scalar │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:141 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_b_i_l_d_l___d_e_c_o_m_p_o_s_e │ │ │ │ │ -void bildl_decompose(Matrix &A) │ │ │ │ │ -compute ILDL decomposition of a symmetric matrix A │ │ │ │ │ -DDeeffiinniittiioonn ildl.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_b_i_l_d_l___b_a_c_k_s_o_l_v_e │ │ │ │ │ -void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool │ │ │ │ │ -isLowerTriangular=false) │ │ │ │ │ -DDeeffiinniittiioonn ildl.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S │ │ │ │ │ -void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv) │ │ │ │ │ -convert ILU decomposition into CRS format for lower and upper triangular and │ │ │ │ │ -inverse. │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e │ │ │ │ │ -void blockILUBacksolve(const M &A, X &v, const Y &d) │ │ │ │ │ -LU backsolve with stored inverse. │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void blockILU0Decomposition(M &A) │ │ │ │ │ -compute ILU decomposition of A. A is overwritten by its decomposition │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void blockILUDecomposition(const M &A, int n, M &ILU) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_B_L │ │ │ │ │ -compile-time parameter for block recursion depth │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S │ │ │ │ │ -a simple compressed row storage matrix class │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:259 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -Return the number of columns. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -Return the number of rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_:_:_c_h_e_c_k │ │ │ │ │ -static void check(const Matrix &mat) │ │ │ │ │ -Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -A linear operator exporting itself in matrix form. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Turns an InverseOperator into a Preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -O::range_type range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -O::domain_type domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ -virtual void post(domain_type &) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -range_type::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ -virtual void pre(domain_type &, range_type &) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -InverseOperator2Preconditioner(InverseOperator &inverse_operator) │ │ │ │ │ -Construct the preconditioner from the solver. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -O InverseOperator │ │ │ │ │ -type of the wrapped inverse operator │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &v, const range_type &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R │ │ │ │ │ -Sequential SSOR preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_S_e_q_S_S_O_R │ │ │ │ │ -SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ -const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_S_e_q_S_S_O_R │ │ │ │ │ -SeqSSOR(const M &A, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:199 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_S_e_q_S_S_O_R │ │ │ │ │ -SeqSSOR(const M &A, int n, real_field_type w) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R │ │ │ │ │ -Sequential SOR preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_S_e_q_S_O_R │ │ │ │ │ -SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ -const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:302 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:264 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:274 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const Y &d) │ │ │ │ │ -Apply the preconditioner in a special direction. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:367 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:328 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:272 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:336 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_S_e_q_S_O_R │ │ │ │ │ -SeqSOR(const M &A, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:270 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_O_R_:_:_S_e_q_S_O_R │ │ │ │ │ -SeqSOR(const M &A, int n, real_field_type w) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c │ │ │ │ │ -The sequential jacobian preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:412 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_S_e_q_J_a_c │ │ │ │ │ -SeqJac(const M &A, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:470 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:415 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:423 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_S_e_q_J_a_c │ │ │ │ │ -SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ -const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:453 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:421 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:479 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:417 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:503 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_S_e_q_J_a_c │ │ │ │ │ -SeqJac(const M &A, int n, real_field_type w) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:434 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_J_a_c_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:419 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U │ │ │ │ │ -Sequential ILU preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:532 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:678 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ -SeqILU(const M &A, int n, real_field_type w, const bool resort=false) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:612 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:648 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:656 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_C_R_S │ │ │ │ │ -ILU::CRS< block_type, typename M::allocator_type > CRS │ │ │ │ │ -type of ILU storage │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:552 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_l_o_w_e_r__ │ │ │ │ │ -CRS lower_ │ │ │ │ │ -The ILU(n) decomposition of the matrix. As storage a CRS structure is used. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:692 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_w_N_o_t_I_d_e_n_t_i_t_y__ │ │ │ │ │ -const bool wNotIdentity_ │ │ │ │ │ -true if w != 1.0 │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:699 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ -SeqILU(const M &A, const ParameterTree &config) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:598 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:535 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -matrix_type::block_type block_type │ │ │ │ │ -block type of matrix │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:537 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:549 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:544 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:682 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ -SeqILU(const M &A, real_field_type w, const bool resort=false) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_w__ │ │ │ │ │ -const real_field_type w_ │ │ │ │ │ -The relaxation factor to use. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:697 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ -SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ -const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:580 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_i_n_v__ │ │ │ │ │ -std::vector< block_type, typename matrix_type::allocator_type > inv_ │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:547 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_I_L_U__ │ │ │ │ │ -std::unique_ptr< matrix_type > ILU_ │ │ │ │ │ -The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:689 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_U_:_:_u_p_p_e_r__ │ │ │ │ │ -CRS upper_ │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:693 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n │ │ │ │ │ -Richardson preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:713 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:720 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:778 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:718 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, Y &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_R_i_c_h_a_r_d_s_o_n │ │ │ │ │ -Richardson(real_field_type w=1.0) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:731 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:774 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:724 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:722 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_R_i_c_h_a_r_d_s_o_n │ │ │ │ │ -Richardson(const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:746 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:716 │ │ │ │ │ -_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d) │ │ │ │ │ -Apply the precondioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:763 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L │ │ │ │ │ -sequential ILDL preconditioner │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:807 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_S_e_q_I_L_D_L │ │ │ │ │ -SeqILDL(const matrix_type &A, const ParameterTree &config) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:853 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_S_e_q_I_L_D_L │ │ │ │ │ -SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1)) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:865 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -domain type of the preconditioner │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:815 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_p_o_s_t │ │ │ │ │ -void post(X &x) override │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:916 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -range type of the preconditioner │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:817 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -std::remove_const_t< M > matrix_type │ │ │ │ │ -type of matrix the preconditioner is for │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:813 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const Y &d) override │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:909 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ -real scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:823 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_S_e_q_I_L_D_L │ │ │ │ │ -SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ -const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:837 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_p_r_e │ │ │ │ │ -void pre(X &x, Y &b) override │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:905 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ -Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:821 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -field type of the preconditioner │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:819 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -SolverCategory::Category category() const override │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:920 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v) │ │ │ │ │ +Send BlockVector to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:590 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ +A Matrix class to support different block types. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:418 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:378 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r │ │ │ │ │ +solver for MultiTypeBlockVector & MultiTypeBlockMatrix types │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:477 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l │ │ │ │ │ +part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:449 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00032.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: blocklevel.hh File Reference │ │ │ │ +dune-istl: owneroverlapcopy.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,56 +70,96 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
blocklevel.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Helper functions for determining the vector/matrix block level. │ │ │ │ +

Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ +
#include <new>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <list>
│ │ │ │ +#include <map>
│ │ │ │ +#include <set>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include "cmath"
│ │ │ │ +#include <mpi.h>
│ │ │ │ +#include <dune/common/enumset.hh>
│ │ │ │ +#include <dune/common/parallel/indexset.hh>
│ │ │ │ +#include <dune/common/parallel/communicator.hh>
│ │ │ │ +#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ +#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ +#include "solvercategory.hh"
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include <dune/common/parallel/communication.hh>
│ │ │ │ +#include <dune/istl/matrixmarket.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::OwnerOverlapCopyAttributeSet
 Attribute set for overlapping Schwarz. More...
 
class  Dune::IndexInfoFromGrid< G, L >
 Information about the index distribution. More...
 
class  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >
 A class setting up standard communication for a two-valued attribute set with owner/overlap/copy semantics. More...
 
struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::CopyGatherScatter< T >
 gather/scatter callback for communcation More...
 
struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::AddGatherScatter< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<typename T >
constexpr std::size_t Dune::maxBlockLevel ()
 Determine the maximum block level of a possibly nested vector/matrix type.
 
template<typename T >
constexpr std::size_t Dune::minBlockLevel ()
 Determine the minimum block level of a possibly nested vector/matrix type.
 
template<typename T >
constexpr bool Dune::hasUniqueBlockLevel ()
 Determine if a vector/matrix has a uniquely determinable block level.
 
template<typename T >
constexpr std::size_t Dune::blockLevel ()
 Determine the block level of a possibly nested vector/matrix type.
 
template<int dim, template< class, class > class Comm>
void testRedistributed (int s)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Helper functions for determining the vector/matrix block level.

│ │ │ │ -
│ │ │ │ +

Classes providing communication interfaces for overlapping Schwarz methods.

│ │ │ │ +
Author
Peter Bastian
│ │ │ │ +

Function Documentation

│ │ │ │ + │ │ │ │ +

◆ testRedistributed()

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +template<int dim, template< class, class > class Comm>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
void testRedistributed (int s)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,65 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -blocklevel.hh File Reference │ │ │ │ │ -Helper functions for determining the vector/matrix block level. _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 │ │ │ │ │ +owneroverlapcopy.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _C_o_m_m_u_n_i_c_a_t_i_o_n_ _I_n_t_e_r_f_a_c_e │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "cmath" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_m_a_r_k_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 │ │ │ │ │ +struct   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +  Attribute set for overlapping Schwarz. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_ _G_,_ _L_ _> │ │ │ │ │ +  Information about the index distribution. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_l_o_b_a_l_I_d_T_y_p_e_,_ _L_o_c_a_l_I_d_T_y_p_e_ _> │ │ │ │ │ +  A class setting up standard communication for a two-valued attribute │ │ │ │ │ + set with owner/overlap/copy semantics. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_l_o_b_a_l_I_d_T_y_p_e_,_ _L_o_c_a_l_I_d_T_y_p_e_ _>_:_: │ │ │ │ │ + _C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_ _> │ │ │ │ │ +  gather/scatter callback for communcation _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_l_o_b_a_l_I_d_T_y_p_e_,_ _L_o_c_a_l_I_d_T_y_p_e_ _>_:_: │ │ │ │ │ + _A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -constexpr std::size_t  _D_u_n_e_:_:_m_a_x_B_l_o_c_k_L_e_v_e_l () │ │ │ │ │ -  Determine the maximum block level of a possibly nested │ │ │ │ │ - vector/matrix type. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr std::size_t  _D_u_n_e_:_:_m_i_n_B_l_o_c_k_L_e_v_e_l () │ │ │ │ │ -  Determine the minimum block level of a possibly nested │ │ │ │ │ - vector/matrix type. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr bool  _D_u_n_e_:_:_h_a_s_U_n_i_q_u_e_B_l_o_c_k_L_e_v_e_l () │ │ │ │ │ -  Determine if a vector/matrix has a uniquely determinable │ │ │ │ │ - block level. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr std::size_t  _D_u_n_e_:_:_b_l_o_c_k_L_e_v_e_l () │ │ │ │ │ -  Determine the block level of a possibly nested vector/ │ │ │ │ │ - matrix type. │ │ │ │ │ +template class Comm> │ │ │ │ │ +void  _t_e_s_t_R_e_d_i_s_t_r_i_b_u_t_e_d (int s) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ + Author │ │ │ │ │ + Peter Bastian │ │ │ │ │ +********** FFuunnccttiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? tteessttRReeddiissttrriibbuutteedd(()) ********** │ │ │ │ │ +template class Comm> │ │ │ │ │ +void testRedistributed ( int  ss ) │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: blocklevel.hh Source File │ │ │ │ +dune-istl: owneroverlapcopy.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,203 +74,712 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
blocklevel.hh
│ │ │ │ +
owneroverlapcopy.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_ISTL_BLOCKLEVEL_HH
│ │ │ │ -
7#define DUNE_ISTL_BLOCKLEVEL_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <algorithm>
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/indices.hh>
│ │ │ │ -
13#include <dune/common/typetraits.hh>
│ │ │ │ -
14#include <dune/common/hybridutilities.hh>
│ │ │ │ +
5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH
│ │ │ │ +
6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <new>
│ │ │ │ +
9#include <iostream>
│ │ │ │ +
10#include <vector>
│ │ │ │ +
11#include <list>
│ │ │ │ +
12#include <map>
│ │ │ │ +
13#include <set>
│ │ │ │ +
14#include <tuple>
│ │ │ │
15
│ │ │ │ -
21// forward declaration
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23template<typename... Args>
│ │ │ │ -
24class MultiTypeBlockVector;
│ │ │ │ -
25template<typename FirstRow, typename... Args>
│ │ │ │ -
26class MultiTypeBlockMatrix;
│ │ │ │ -
27} // end namespace Dune
│ │ │ │ -
28
│ │ │ │ -
29namespace Dune { namespace Impl {
│ │ │ │ -
30
│ │ │ │ -
31// forward declaration
│ │ │ │ -
32template<typename T> struct MaxBlockLevel;
│ │ │ │ -
33template<typename T> struct MinBlockLevel;
│ │ │ │ -
34
│ │ │ │ -
36template<typename M, template<typename B> typename BlockLevel, typename Op>
│ │ │ │ -
37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op)
│ │ │ │ -
38{
│ │ │ │ -
39 // inialize with zeroth diagonal block
│ │ │ │ -
40 using namespace Dune::Indices;
│ │ │ │ -
41 using Block00 = typename std::decay_t<decltype(std::declval<M>()[_0][_0])>;
│ │ │ │ -
42 std::size_t blockLevel = BlockLevel<Block00>::value() + 1;
│ │ │ │ -
43 // iterate over all blocks to determine min/max block level
│ │ │ │ -
44 using namespace Dune::Hybrid;
│ │ │ │ -
45 forEach(integralRange(index_constant<M::N()>()), [&](auto&& i) {
│ │ │ │ -
46 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
47 forEach(integralRange(index_constant<M::M()>()), [&](auto&& j) {
│ │ │ │ -
48 using Block = typename std::decay_t<decltype(std::declval<M>()[i][j])>;
│ │ │ │ -
49 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
│ │ │ │ -
50 });
│ │ │ │ -
51 });
│ │ │ │ -
52 return blockLevel;
│ │ │ │ -
53}
│ │ │ │ -
54
│ │ │ │ -
56template<typename V, template<typename B> typename BlockLevel, typename Op>
│ │ │ │ -
57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op)
│ │ │ │ -
58{
│ │ │ │ -
59 // inialize with zeroth block
│ │ │ │ -
60 using namespace Dune::Indices;
│ │ │ │ -
61 using Block0 = typename std::decay_t<decltype(std::declval<V>()[_0])>;
│ │ │ │ -
62 std::size_t blockLevel = BlockLevel<Block0>::value() + 1;
│ │ │ │ -
63 // iterate over all blocks to determine min/max block level
│ │ │ │ -
64 using namespace Dune::Hybrid;
│ │ │ │ -
65 forEach(integralRange(index_constant<V::size()>()), [&](auto&& i) {
│ │ │ │ -
66 using Block = typename std::decay_t<decltype(std::declval<V>()[i])>;
│ │ │ │ -
67 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
│ │ │ │ -
68 });
│ │ │ │ -
69 return blockLevel;
│ │ │ │ -
70}
│ │ │ │ -
71
│ │ │ │ -
72template<typename T>
│ │ │ │ -
73struct MaxBlockLevel
│ │ │ │ -
74{
│ │ │ │ -
75 static constexpr std::size_t value(){
│ │ │ │ -
76 if constexpr (IsNumber<T>::value)
│ │ │ │ -
77 return 0;
│ │ │ │ -
78 else
│ │ │ │ -
79 return MaxBlockLevel<typename T::block_type>::value() + 1;
│ │ │ │ -
80 }
│ │ │ │ -
81};
│ │ │ │ +
16#include "cmath"
│ │ │ │ +
17
│ │ │ │ +
18// MPI header
│ │ │ │ +
19#if HAVE_MPI
│ │ │ │ +
20#include <mpi.h>
│ │ │ │ +
21#endif
│ │ │ │ +
22
│ │ │ │ +
23#include <dune/common/enumset.hh>
│ │ │ │ +
24
│ │ │ │ +
25#if HAVE_MPI
│ │ │ │ +
26#include <dune/common/parallel/indexset.hh>
│ │ │ │ +
27#include <dune/common/parallel/communicator.hh>
│ │ │ │ +
28#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ +
29#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ +
30#endif
│ │ │ │ +
31
│ │ │ │ +
32#include "solvercategory.hh"
│ │ │ │ +
33#include "istlexception.hh"
│ │ │ │ +
34#include <dune/common/parallel/communication.hh>
│ │ │ │ + │ │ │ │ +
36
│ │ │ │ +
37template<int dim, template<class,class> class Comm>
│ │ │ │ + │ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
41namespace Dune {
│ │ │ │ +
42
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
59 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
62 };
│ │ │ │ +
│ │ │ │ +
63 };
│ │ │ │ +
│ │ │ │ +
64
│ │ │ │ +
76 template <class G, class L>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
78 {
│ │ │ │ +
79 public:
│ │ │ │ +
81 typedef G GlobalIdType;
│ │ │ │
82
│ │ │ │ -
83template<typename T>
│ │ │ │ -
84struct MinBlockLevel
│ │ │ │ -
85{
│ │ │ │ -
86 // the default implementation assumes minBlockLevel == maxBlockLevel
│ │ │ │ -
87 static constexpr std::size_t value()
│ │ │ │ -
88 { return MaxBlockLevel<T>::value(); }
│ │ │ │ -
89};
│ │ │ │ -
90
│ │ │ │ -
91// max block level for MultiTypeBlockMatrix
│ │ │ │ -
92template<typename FirstRow, typename... Args>
│ │ │ │ -
93struct MaxBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
│ │ │ │ -
94{
│ │ │ │ -
95 static constexpr std::size_t value()
│ │ │ │ -
96 {
│ │ │ │ -
97 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
│ │ │ │ -
98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
│ │ │ │ -
99 return blockLevelMultiTypeBlockMatrix<M, MaxBlockLevel>(max);
│ │ │ │ -
100 }
│ │ │ │ -
101};
│ │ │ │ -
102
│ │ │ │ -
103// min block level for MultiTypeBlockMatrix
│ │ │ │ -
104template<typename FirstRow, typename... Args>
│ │ │ │ -
105struct MinBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
│ │ │ │ -
106{
│ │ │ │ -
107 static constexpr std::size_t value()
│ │ │ │ -
108 {
│ │ │ │ -
109 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
│ │ │ │ -
110 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
│ │ │ │ -
111 return blockLevelMultiTypeBlockMatrix<M, MinBlockLevel>(min);
│ │ │ │ -
112 }
│ │ │ │ -
113};
│ │ │ │ +
84 typedef L LocalIdType;
│ │ │ │ +
85
│ │ │ │ +
92 typedef std::tuple<GlobalIdType,LocalIdType,int> IndexTripel;
│ │ │ │ +
99 typedef std::tuple<int,GlobalIdType,int> RemoteIndexTripel;
│ │ │ │ +
100
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
107 {
│ │ │ │ +
108 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
│ │ │ │ + │ │ │ │ + │ │ │ │ +
111 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
│ │ │ │ +
112 localindices.insert(x);
│ │ │ │ +
113 }
│ │ │ │ +
│ │ │ │
114
│ │ │ │ -
115// max block level for MultiTypeBlockVector
│ │ │ │ -
116template<typename... Args>
│ │ │ │ -
117struct MaxBlockLevel<Dune::MultiTypeBlockVector<Args...>>
│ │ │ │ -
118{
│ │ │ │ -
119 static constexpr std::size_t value()
│ │ │ │ -
120 {
│ │ │ │ -
121 using V = MultiTypeBlockVector<Args...>;
│ │ │ │ -
122 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
│ │ │ │ -
123 return blockLevelMultiTypeBlockVector<V, MaxBlockLevel>(max);
│ │ │ │ -
124 }
│ │ │ │ -
125};
│ │ │ │ -
126
│ │ │ │ -
127// min block level for MultiTypeBlockVector
│ │ │ │ -
128template<typename... Args>
│ │ │ │ -
129struct MinBlockLevel<Dune::MultiTypeBlockVector<Args...>>
│ │ │ │ -
130{
│ │ │ │ -
131 static constexpr std::size_t value()
│ │ │ │ -
132 {
│ │ │ │ -
133 using V = MultiTypeBlockVector<Args...>;
│ │ │ │ -
134 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
│ │ │ │ -
135 return blockLevelMultiTypeBlockVector<V, MinBlockLevel>(min);
│ │ │ │ -
136 }
│ │ │ │ -
137};
│ │ │ │ -
138
│ │ │ │ -
139// special case: empty MultiTypeBlockVector
│ │ │ │ -
140template<>
│ │ │ │ -
141struct MaxBlockLevel<Dune::MultiTypeBlockVector<>>
│ │ │ │ -
142{
│ │ │ │ -
143 static constexpr std::size_t value()
│ │ │ │ -
144 { return 0; };
│ │ │ │ -
145};
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
121 {
│ │ │ │ +
122 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
│ │ │ │ + │ │ │ │ + │ │ │ │ +
125 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
│ │ │ │ +
126 remoteindices.insert(x);
│ │ │ │ +
127 }
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
│ │ │ │ +
133 const std::set<IndexTripel>& localIndices () const
│ │ │ │ +
134 {
│ │ │ │ +
135 return localindices;
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
│ │ │ │ +
142 const std::set<RemoteIndexTripel>& remoteIndices () const
│ │ │ │ +
143 {
│ │ │ │ +
144 return remoteindices;
│ │ │ │ +
145 }
│ │ │ │ +
│ │ │ │
146
│ │ │ │ -
147// special case: empty MultiTypeBlockVector
│ │ │ │ -
148template<>
│ │ │ │ -
149struct MinBlockLevel<Dune::MultiTypeBlockVector<>>
│ │ │ │ -
150{
│ │ │ │ -
151 static constexpr std::size_t value()
│ │ │ │ -
152 { return 0; };
│ │ │ │ -
153};
│ │ │ │ -
154
│ │ │ │ -
155}} // end namespace Dune::Impl
│ │ │ │ -
156
│ │ │ │ -
157namespace Dune {
│ │ │ │ -
158
│ │ │ │ -
160template<typename T>
│ │ │ │ -
│ │ │ │ -
161constexpr std::size_t maxBlockLevel()
│ │ │ │ -
162{ return Impl::MaxBlockLevel<T>::value(); }
│ │ │ │ +
│ │ │ │ +
150 void clear ()
│ │ │ │ +
151 {
│ │ │ │ +
152 localindices.clear();
│ │ │ │ +
153 remoteindices.clear();
│ │ │ │ +
154 }
│ │ │ │ +
│ │ │ │ +
155
│ │ │ │ +
156 private:
│ │ │ │ +
158 std::set<IndexTripel> localindices;
│ │ │ │ +
160 std::set<RemoteIndexTripel> remoteindices;
│ │ │ │ +
161 };
│ │ │ │
│ │ │ │ +
162
│ │ │ │
163
│ │ │ │ -
165template<typename T>
│ │ │ │ -
│ │ │ │ -
166constexpr std::size_t minBlockLevel()
│ │ │ │ -
167{ return Impl::MinBlockLevel<T>::value(); }
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
170template<typename T>
│ │ │ │ -
│ │ │ │ -
171constexpr bool hasUniqueBlockLevel()
│ │ │ │ -
172{ return maxBlockLevel<T>() == minBlockLevel<T>(); }
│ │ │ │ -
│ │ │ │ -
173
│ │ │ │ -
175template<typename T>
│ │ │ │ -
│ │ │ │ -
176constexpr std::size_t blockLevel()
│ │ │ │ -
177{
│ │ │ │ -
178 static_assert(hasUniqueBlockLevel<T>(), "Block level cannot be uniquely determined!");
│ │ │ │ -
179 return Impl::MaxBlockLevel<T>::value();
│ │ │ │ -
180}
│ │ │ │ -
│ │ │ │ -
181
│ │ │ │ -
182} // end namespace Dune
│ │ │ │ -
183
│ │ │ │ -
184#endif
│ │ │ │ +
164#if HAVE_MPI
│ │ │ │ +
165
│ │ │ │ +
172 template <class GlobalIdType, class LocalIdType=int>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
174 {
│ │ │ │ +
175 template<typename M, typename G, typename L>
│ │ │ │ +
176 friend void loadMatrixMarket(M&,
│ │ │ │ +
177 const std::string&,
│ │ │ │ + │ │ │ │ +
179 bool);
│ │ │ │ +
180 // used types
│ │ │ │ + │ │ │ │ + │ │ │ │ +
183 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
│ │ │ │ +
184 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
│ │ │ │ + │ │ │ │ +
186 typedef Dune::ParallelLocalIndex<AttributeSet> LI;
│ │ │ │ +
187 public:
│ │ │ │ +
188 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> PIS;
│ │ │ │ +
189 typedef Dune::RemoteIndices<PIS> RI;
│ │ │ │ +
190 typedef Dune::RemoteIndexListModifier<PIS,typename RI::Allocator,false> RILM;
│ │ │ │ +
191 typedef typename RI::RemoteIndex RX;
│ │ │ │ +
192 typedef Dune::BufferedCommunicator BC;
│ │ │ │ +
193 typedef Dune::Interface IF;
│ │ │ │ +
194 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner> OwnerSet;
│ │ │ │ +
195 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopySet;
│ │ │ │ +
196 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> OwnerOverlapSet;
│ │ │ │ +
197 typedef Dune::AllSet<AttributeSet> AllSet;
│ │ │ │ +
198 protected:
│ │ │ │ +
199
│ │ │ │ +
200
│ │ │ │ +
202 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
204 {
│ │ │ │ +
205 typedef typename CommPolicy<T>::IndexedType V;
│ │ │ │ +
206
│ │ │ │ +
│ │ │ │ +
207 static V gather(const T& a, std::size_t i)
│ │ │ │ +
208 {
│ │ │ │ +
209 return a[i];
│ │ │ │ +
210 }
│ │ │ │ +
│ │ │ │ +
211
│ │ │ │ +
│ │ │ │ +
212 static void scatter(T& a, V v, std::size_t i)
│ │ │ │ +
213 {
│ │ │ │ +
214 a[i] = v;
│ │ │ │ +
215 }
│ │ │ │ +
│ │ │ │ +
216 };
│ │ │ │ +
│ │ │ │ +
217 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
219 {
│ │ │ │ +
220 typedef typename CommPolicy<T>::IndexedType V;
│ │ │ │ +
221
│ │ │ │ +
│ │ │ │ +
222 static V gather(const T& a, std::size_t i)
│ │ │ │ +
223 {
│ │ │ │ +
224 return a[i];
│ │ │ │ +
225 }
│ │ │ │ +
│ │ │ │ +
226
│ │ │ │ +
│ │ │ │ +
227 static void scatter(T& a, V v, std::size_t i)
│ │ │ │ +
228 {
│ │ │ │ +
229 a[i] += v;
│ │ │ │ +
230 }
│ │ │ │ +
│ │ │ │ +
231 };
│ │ │ │ +
│ │ │ │ +
232
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
234 {
│ │ │ │ +
235 if (OwnerOverlapToAllInterfaceBuilt)
│ │ │ │ +
236 OwnerOverlapToAllInterface.free();
│ │ │ │ +
237 OwnerOverlapSet sourceFlags;
│ │ │ │ +
238 Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet>
│ │ │ │ +
239 destFlags;
│ │ │ │ +
240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ +
241 OwnerOverlapToAllInterfaceBuilt = true;
│ │ │ │ +
242 }
│ │ │ │ +
│ │ │ │ +
243
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
245 {
│ │ │ │ +
246 if (OwnerToAllInterfaceBuilt)
│ │ │ │ +
247 OwnerToAllInterface.free();
│ │ │ │ +
248 OwnerSet sourceFlags;
│ │ │ │ +
249 AllSet destFlags;
│ │ │ │ +
250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ +
251 OwnerToAllInterfaceBuilt = true;
│ │ │ │ +
252 }
│ │ │ │ +
│ │ │ │ +
253
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
255 {
│ │ │ │ +
256 if (OwnerCopyToAllInterfaceBuilt)
│ │ │ │ +
257 OwnerCopyToAllInterface.free();
│ │ │ │ +
258
│ │ │ │ +
259 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
│ │ │ │ +
260 OwnerCopySet sourceFlags;
│ │ │ │ +
261 Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> destFlags;
│ │ │ │ +
262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ +
263 OwnerCopyToAllInterfaceBuilt = true;
│ │ │ │ +
264 }
│ │ │ │ +
│ │ │ │ +
265
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
267 {
│ │ │ │ +
268 if (OwnerCopyToOwnerCopyInterfaceBuilt)
│ │ │ │ +
269 OwnerCopyToOwnerCopyInterface.free();
│ │ │ │ +
270
│ │ │ │ +
271
│ │ │ │ +
272 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
│ │ │ │ +
273 OwnerCopySet sourceFlags;
│ │ │ │ +
274 OwnerCopySet destFlags;
│ │ │ │ +
275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ +
276 OwnerCopyToOwnerCopyInterfaceBuilt = true;
│ │ │ │ +
277 }
│ │ │ │ +
│ │ │ │ +
278
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
280 {
│ │ │ │ +
281 if (CopyToAllInterfaceBuilt)
│ │ │ │ +
282 CopyToAllInterface.free();
│ │ │ │ +
283 CopySet sourceFlags;
│ │ │ │ +
284 AllSet destFlags;
│ │ │ │ +
285 CopyToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ +
286 CopyToAllInterfaceBuilt = true;
│ │ │ │ +
287 }
│ │ │ │ +
│ │ │ │ +
288
│ │ │ │ +
289 public:
│ │ │ │ +
290
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
296 return category_;
│ │ │ │ +
297 }
│ │ │ │ +
│ │ │ │ +
298
│ │ │ │ +
│ │ │ │ +
299 const Communication<MPI_Comm>& communicator() const
│ │ │ │ +
300 {
│ │ │ │ +
301 return cc;
│ │ │ │ +
302 }
│ │ │ │ +
│ │ │ │ +
303
│ │ │ │ +
310 template<class T>
│ │ │ │ +
│ │ │ │ +
311 void copyOwnerToAll (const T& source, T& dest) const
│ │ │ │ +
312 {
│ │ │ │ +
313 if (!OwnerToAllInterfaceBuilt)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
316 communicator.template build<T>(OwnerToAllInterface);
│ │ │ │ +
317 communicator.template forward<CopyGatherScatter<T> >(source,dest);
│ │ │ │ +
318 communicator.free();
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
327 template<class T>
│ │ │ │ +
│ │ │ │ +
328 void copyCopyToAll (const T& source, T& dest) const
│ │ │ │ +
329 {
│ │ │ │ +
330 if (!CopyToAllInterfaceBuilt)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
333 communicator.template build<T>(CopyToAllInterface);
│ │ │ │ +
334 communicator.template forward<CopyGatherScatter<T> >(source,dest);
│ │ │ │ +
335 communicator.free();
│ │ │ │ +
336 }
│ │ │ │ +
│ │ │ │ +
337
│ │ │ │ +
344 template<class T>
│ │ │ │ +
│ │ │ │ +
345 void addOwnerOverlapToAll (const T& source, T& dest) const
│ │ │ │ +
346 {
│ │ │ │ +
347 if (!OwnerOverlapToAllInterfaceBuilt)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
350 communicator.template build<T>(OwnerOverlapToAllInterface);
│ │ │ │ +
351 communicator.template forward<AddGatherScatter<T> >(source,dest);
│ │ │ │ +
352 communicator.free();
│ │ │ │ +
353 }
│ │ │ │ +
│ │ │ │ +
354
│ │ │ │ +
361 template<class T>
│ │ │ │ +
│ │ │ │ +
362 void addOwnerCopyToAll (const T& source, T& dest) const
│ │ │ │ +
363 {
│ │ │ │ +
364 if (!OwnerCopyToAllInterfaceBuilt)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
367 communicator.template build<T>(OwnerCopyToAllInterface);
│ │ │ │ +
368 communicator.template forward<AddGatherScatter<T> >(source,dest);
│ │ │ │ +
369 communicator.free();
│ │ │ │ +
370 }
│ │ │ │ +
│ │ │ │ +
371
│ │ │ │ +
378 template<class T>
│ │ │ │ +
│ │ │ │ +
379 void addOwnerCopyToOwnerCopy (const T& source, T& dest) const
│ │ │ │ +
380 {
│ │ │ │ +
381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
384 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
│ │ │ │ +
385 communicator.template forward<AddGatherScatter<T> >(source,dest);
│ │ │ │ +
386 communicator.free();
│ │ │ │ +
387 }
│ │ │ │ +
│ │ │ │ +
388
│ │ │ │ +
389
│ │ │ │ +
397 template<class T1, class T2>
│ │ │ │ +
│ │ │ │ +
398 void dot (const T1& x, const T1& y, T2& result) const
│ │ │ │ +
399 {
│ │ │ │ +
400 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
│ │ │ │ +
401 // set up mask vector
│ │ │ │ +
402 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
│ │ │ │ +
403 {
│ │ │ │ +
404 mask.resize(x.size());
│ │ │ │ +
405 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
│ │ │ │ +
406 mask[i] = 1;
│ │ │ │ +
407 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ +
408 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ +
409 mask[i->local().local()] = 0;
│ │ │ │ +
410 }
│ │ │ │ +
411 result = T2(0.0);
│ │ │ │ +
412
│ │ │ │ +
413 for (typename T1::size_type i=0; i<x.size(); i++)
│ │ │ │ +
414 result += (x[i]*(y[i]))*static_cast<real_type>(mask[i]);
│ │ │ │ +
415 result = cc.sum(result);
│ │ │ │ +
416 }
│ │ │ │ +
│ │ │ │ +
417
│ │ │ │ +
424 template<class T1>
│ │ │ │ +
│ │ │ │ +
425 typename FieldTraits<typename T1::field_type>::real_type norm (const T1& x) const
│ │ │ │ +
426 {
│ │ │ │ +
427 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
│ │ │ │ +
428
│ │ │ │ +
429 // set up mask vector
│ │ │ │ +
430 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
│ │ │ │ +
431 {
│ │ │ │ +
432 mask.resize(x.size());
│ │ │ │ +
433 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
│ │ │ │ +
434 mask[i] = 1;
│ │ │ │ +
435 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ +
436 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ +
437 mask[i->local().local()] = 0;
│ │ │ │ +
438 }
│ │ │ │ +
439 auto result = real_type(0.0);
│ │ │ │ +
440 for (typename T1::size_type i=0; i<x.size(); i++)
│ │ │ │ +
441 result += Impl::asVector(x[i]).two_norm2()*mask[i];
│ │ │ │ +
442 using std::sqrt;
│ │ │ │ +
443 return sqrt(cc.sum(result));
│ │ │ │ +
444 }
│ │ │ │ +
│ │ │ │ +
445
│ │ │ │ +
446 typedef Dune::EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopyFlags;
│ │ │ │ +
447
│ │ │ │ +
449 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> ParallelIndexSet;
│ │ │ │ +
450
│ │ │ │ +
452 typedef Dune::RemoteIndices<PIS> RemoteIndices;
│ │ │ │ +
453
│ │ │ │ +
456 typedef Dune::GlobalLookupIndexSet<ParallelIndexSet> GlobalLookupIndexSet;
│ │ │ │ +
457
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
463 {
│ │ │ │ +
464 return pis;
│ │ │ │ +
465 }
│ │ │ │ +
│ │ │ │ +
466
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
472 {
│ │ │ │ +
473 return ri;
│ │ │ │ +
474 }
│ │ │ │ +
│ │ │ │ +
475
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
481 {
│ │ │ │ +
482 return pis;
│ │ │ │ +
483 }
│ │ │ │ +
│ │ │ │ +
484
│ │ │ │ +
485
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
491 {
│ │ │ │ +
492 return ri;
│ │ │ │ +
493 }
│ │ │ │ +
│ │ │ │ +
494
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
496 {
│ │ │ │ +
497 if(globalLookup_) {
│ │ │ │ +
498 if(pis.seqNo()==oldseqNo)
│ │ │ │ +
499 // Nothing changed!
│ │ │ │ +
500 return;
│ │ │ │ +
501 delete globalLookup_;
│ │ │ │ +
502 }
│ │ │ │ +
503
│ │ │ │ +
504 globalLookup_ = new GlobalLookupIndexSet(pis);
│ │ │ │ +
505 oldseqNo = pis.seqNo();
│ │ │ │ +
506 }
│ │ │ │ +
│ │ │ │ +
507
│ │ │ │ +
│ │ │ │ +
508 void buildGlobalLookup(std::size_t size)
│ │ │ │ +
509 {
│ │ │ │ +
510 if(globalLookup_) {
│ │ │ │ +
511 if(pis.seqNo()==oldseqNo)
│ │ │ │ +
512 // Nothing changed!
│ │ │ │ +
513 return;
│ │ │ │ +
514 delete globalLookup_;
│ │ │ │ +
515 }
│ │ │ │ +
516 globalLookup_ = new GlobalLookupIndexSet(pis, size);
│ │ │ │ +
517 oldseqNo = pis.seqNo();
│ │ │ │ +
518 }
│ │ │ │ +
│ │ │ │ +
519
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
521 {
│ │ │ │ +
522 delete globalLookup_;
│ │ │ │ +
523 globalLookup_=0;
│ │ │ │ +
524 }
│ │ │ │ +
│ │ │ │ +
525
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
527 {
│ │ │ │ +
528 assert(globalLookup_ != 0);
│ │ │ │ +
529 return *globalLookup_;
│ │ │ │ +
530 }
│ │ │ │ +
│ │ │ │ +
531
│ │ │ │ +
537 template<class T1>
│ │ │ │ +
│ │ │ │ +
538 void project (T1& x) const
│ │ │ │ +
539 {
│ │ │ │ +
540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ +
541 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ +
542 x[i->local().local()] = 0;
│ │ │ │ +
543 }
│ │ │ │ +
│ │ │ │ +
544
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
556 bool freecomm_ = false)
│ │ │ │ +
557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
│ │ │ │ +
558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
│ │ │ │ +
559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
│ │ │ │ +
560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),
│ │ │ │ +
561 freecomm(freecomm_)
│ │ │ │ +
562 {}
│ │ │ │ +
│ │ │ │ +
563
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
│ │ │ │ +
574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
│ │ │ │ +
575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
│ │ │ │ +
576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm(false)
│ │ │ │ +
577 {}
│ │ │ │ +
│ │ │ │ +
578
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
587 MPI_Comm comm_,
│ │ │ │ + │ │ │ │ +
589 bool freecomm_ = false)
│ │ │ │ +
590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
│ │ │ │ +
591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
│ │ │ │ +
592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
│ │ │ │ +
593 globalLookup_(0), category_(cat_), freecomm(freecomm_)
│ │ │ │ +
594 {
│ │ │ │ +
595 // set up an ISTL index set
│ │ │ │ +
596 pis.beginResize();
│ │ │ │ +
597 for (localindex_iterator i=indexinfo.localIndices().begin(); i!=indexinfo.localIndices().end(); ++i)
│ │ │ │ +
598 {
│ │ │ │ +
599 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ +
600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
│ │ │ │ +
601 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ +
602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
│ │ │ │ +
603 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ +
604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
│ │ │ │ +
605 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
│ │ │ │ +
606 }
│ │ │ │ +
607 pis.endResize();
│ │ │ │ +
608
│ │ │ │ +
609 // build remote indices WITHOUT communication
│ │ │ │ +
610 // std::cout << cc.rank() << ": build remote indices" << std::endl;
│ │ │ │ +
611 ri.setIndexSets(pis,pis,cc);
│ │ │ │ +
612 if (indexinfo.remoteIndices().size()>0)
│ │ │ │ +
613 {
│ │ │ │ +
614 remoteindex_iterator i=indexinfo.remoteIndices().begin();
│ │ │ │ +
615 int p = std::get<0>(*i);
│ │ │ │ +
616 RILM modifier = ri.template getModifier<false,true>(p);
│ │ │ │ +
617 typename PIS::const_iterator pi=pis.begin();
│ │ │ │ +
618 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
│ │ │ │ +
619 {
│ │ │ │ +
620 // handle processor change
│ │ │ │ +
621 if (p!=std::get<0>(*i))
│ │ │ │ +
622 {
│ │ │ │ +
623 p = std::get<0>(*i);
│ │ │ │ +
624 modifier = ri.template getModifier<false,true>(p);
│ │ │ │ +
625 pi=pis.begin();
│ │ │ │ +
626 }
│ │ │ │ +
627
│ │ │ │ +
628 // position to correct entry in parallel index set
│ │ │ │ +
629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())
│ │ │ │ +
630 ++pi;
│ │ │ │ +
631 if (pi==pis.end())
│ │ │ │ +
632 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
│ │ │ │ +
633
│ │ │ │ +
634 // insert entry
│ │ │ │ +
635 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
│ │ │ │ +
636 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ +
637 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
│ │ │ │ +
638 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ +
639 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
│ │ │ │ +
640 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ +
641 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
│ │ │ │ +
642 }
│ │ │ │ +
643 }else{
│ │ │ │ +
644 // Force remote indices to be synced!
│ │ │ │ +
645 ri.template getModifier<false,true>(0);
│ │ │ │ +
646 }
│ │ │ │ +
647 }
│ │ │ │ +
│ │ │ │ +
648
│ │ │ │ +
649 // destructor: free memory in some objects
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
651 {
│ │ │ │ +
652 ri.free();
│ │ │ │ +
653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
│ │ │ │ +
654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
│ │ │ │ +
655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
│ │ │ │ +
656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
│ │ │ │ +
657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
│ │ │ │ +
658 if (globalLookup_) delete globalLookup_;
│ │ │ │ +
659 if (freecomm==true)
│ │ │ │ +
660 if(comm!=MPI_COMM_NULL)
│ │ │ │ +
661 {
│ │ │ │ +
662#ifdef MPI_2
│ │ │ │ +
663 // If it is possible to query whether MPI_Finalize
│ │ │ │ +
664 // was called, only free the communicator before
│ │ │ │ +
665 // calling MPI_Finalize.
│ │ │ │ +
666 int wasFinalized = 0;
│ │ │ │ +
667 MPI_Finalized( &wasFinalized );
│ │ │ │ +
668 if(!wasFinalized)
│ │ │ │ +
669#endif
│ │ │ │ +
670 MPI_Comm_free(&comm);
│ │ │ │ +
671 }
│ │ │ │ +
672 }
│ │ │ │ +
│ │ │ │ +
673
│ │ │ │ +
674 private:
│ │ │ │ + │ │ │ │ +
676 {}
│ │ │ │ +
677 MPI_Comm comm;
│ │ │ │ +
678 Communication<MPI_Comm> cc;
│ │ │ │ +
679 PIS pis;
│ │ │ │ +
680 RI ri;
│ │ │ │ +
681 mutable IF OwnerToAllInterface;
│ │ │ │ +
682 mutable bool OwnerToAllInterfaceBuilt;
│ │ │ │ +
683 mutable IF OwnerOverlapToAllInterface;
│ │ │ │ +
684 mutable bool OwnerOverlapToAllInterfaceBuilt;
│ │ │ │ +
685 mutable IF OwnerCopyToAllInterface;
│ │ │ │ +
686 mutable bool OwnerCopyToAllInterfaceBuilt;
│ │ │ │ +
687 mutable IF OwnerCopyToOwnerCopyInterface;
│ │ │ │ +
688 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
│ │ │ │ +
689 mutable IF CopyToAllInterface;
│ │ │ │ +
690 mutable bool CopyToAllInterfaceBuilt;
│ │ │ │ +
691 mutable std::vector<double> mask;
│ │ │ │ +
692 int oldseqNo;
│ │ │ │ +
693 GlobalLookupIndexSet* globalLookup_;
│ │ │ │ +
694 const SolverCategory::Category category_;
│ │ │ │ +
695 bool freecomm;
│ │ │ │ +
696 };
│ │ │ │ +
│ │ │ │ +
697
│ │ │ │ +
698#endif
│ │ │ │ +
699
│ │ │ │ +
700
│ │ │ │ +
703} // end namespace
│ │ │ │ +
704
│ │ │ │ +
705#endif
│ │ │ │ +
Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
│ │ │ │ +
void testRedistributed(int s)
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition allocator.hh:11
│ │ │ │ -
constexpr bool hasUniqueBlockLevel()
Determine if a vector/matrix has a uniquely determinable block level.
Definition blocklevel.hh:171
│ │ │ │ -
constexpr std::size_t maxBlockLevel()
Determine the maximum block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:161
│ │ │ │ -
constexpr std::size_t blockLevel()
Determine the block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:176
│ │ │ │ -
constexpr std::size_t minBlockLevel()
Determine the minimum block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:166
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
Attribute set for overlapping Schwarz.
Definition owneroverlapcopy.hh:59
│ │ │ │ +
AttributeSet
Definition owneroverlapcopy.hh:60
│ │ │ │ +
@ owner
Definition owneroverlapcopy.hh:61
│ │ │ │ +
@ copy
Definition owneroverlapcopy.hh:61
│ │ │ │ +
@ overlap
Definition owneroverlapcopy.hh:61
│ │ │ │ +
Information about the index distribution.
Definition owneroverlapcopy.hh:78
│ │ │ │ +
std::tuple< GlobalIdType, LocalIdType, int > IndexTripel
A triple describing a local index.
Definition owneroverlapcopy.hh:92
│ │ │ │ +
void addRemoteIndex(const RemoteIndexTripel &x)
Add a new remote index triple to the set of remote indices.
Definition owneroverlapcopy.hh:120
│ │ │ │ +
G GlobalIdType
The type of the global index.
Definition owneroverlapcopy.hh:81
│ │ │ │ +
const std::set< IndexTripel > & localIndices() const
Get the set of indices local to the process.
Definition owneroverlapcopy.hh:133
│ │ │ │ +
const std::set< RemoteIndexTripel > & remoteIndices() const
Get the set of remote indices.
Definition owneroverlapcopy.hh:142
│ │ │ │ +
L LocalIdType
The type of the local index.
Definition owneroverlapcopy.hh:84
│ │ │ │ +
void clear()
Remove all indices from the sets.
Definition owneroverlapcopy.hh:150
│ │ │ │ +
void addLocalIndex(const IndexTripel &x)
Add a new index triple to the set of local indices.
Definition owneroverlapcopy.hh:106
│ │ │ │ +
std::tuple< int, GlobalIdType, int > RemoteIndexTripel
A triple describing a remote index.
Definition owneroverlapcopy.hh:99
│ │ │ │ +
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ +
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet
Definition owneroverlapcopy.hh:195
│ │ │ │ +
const GlobalLookupIndexSet & globalLookup() const
Definition owneroverlapcopy.hh:526
│ │ │ │ +
FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
Compute the global Euclidean norm of a vector.
Definition owneroverlapcopy.hh:425
│ │ │ │ +
void buildOwnerOverlapToAllInterface() const
Definition owneroverlapcopy.hh:233
│ │ │ │ +
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS
Definition owneroverlapcopy.hh:188
│ │ │ │ +
void buildOwnerCopyToAllInterface() const
Definition owneroverlapcopy.hh:254
│ │ │ │ +
void buildOwnerCopyToOwnerCopyInterface() const
Definition owneroverlapcopy.hh:266
│ │ │ │ +
OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Constructor.
Definition owneroverlapcopy.hh:586
│ │ │ │ +
SolverCategory::Category category() const
Get Solver Category.
Definition owneroverlapcopy.hh:295
│ │ │ │ +
void addOwnerCopyToOwnerCopy(const T &source, T &dest) const
Communicate values from owner and copy data points to owner and copy data points and add them to thos...
Definition owneroverlapcopy.hh:379
│ │ │ │ +
void buildCopyToAllInterface() const
Definition owneroverlapcopy.hh:279
│ │ │ │ +
Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags
Definition owneroverlapcopy.hh:446
│ │ │ │ +
RemoteIndices & remoteIndices()
Get the underlying remote indices.
Definition owneroverlapcopy.hh:490
│ │ │ │ +
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:462
│ │ │ │ +
Dune::RemoteIndices< PIS > RI
Definition owneroverlapcopy.hh:189
│ │ │ │ +
void buildGlobalLookup(std::size_t size)
Definition owneroverlapcopy.hh:508
│ │ │ │ +
void addOwnerOverlapToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points and add them to those values.
Definition owneroverlapcopy.hh:345
│ │ │ │ +
Dune::RemoteIndices< PIS > RemoteIndices
The type of the remote indices.
Definition owneroverlapcopy.hh:452
│ │ │ │ +
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition owneroverlapcopy.hh:538
│ │ │ │ +
Dune::AllSet< AttributeSet > AllSet
Definition owneroverlapcopy.hh:197
│ │ │ │ +
Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > OwnerOverlapSet
Definition owneroverlapcopy.hh:196
│ │ │ │ +
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition owneroverlapcopy.hh:328
│ │ │ │ +
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition owneroverlapcopy.hh:456
│ │ │ │ +
Dune::Interface IF
Definition owneroverlapcopy.hh:193
│ │ │ │ +
~OwnerOverlapCopyCommunication()
Definition owneroverlapcopy.hh:650
│ │ │ │ +
void buildGlobalLookup()
Definition owneroverlapcopy.hh:495
│ │ │ │ +
Dune::BufferedCommunicator BC
Definition owneroverlapcopy.hh:192
│ │ │ │ +
OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Construct the communication without any indices.
Definition owneroverlapcopy.hh:554
│ │ │ │ +
ParallelIndexSet & indexSet()
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:480
│ │ │ │ +
void dot(const T1 &x, const T1 &y, T2 &result) const
Compute a global dot product of two vectors.
Definition owneroverlapcopy.hh:398
│ │ │ │ +
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ +
OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
Construct the communication without any indices using MPI_COMM_WORLD.
Definition owneroverlapcopy.hh:572
│ │ │ │ +
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
Definition owneroverlapcopy.hh:194
│ │ │ │ +
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │ +
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ +
friend void loadMatrixMarket(M &, const std::string &, OwnerOverlapCopyCommunication< G, L > &, bool)
Load a parallel matrix/vector stored in matrix market format.
Definition matrixmarket.hh:1269
│ │ │ │ +
RI::RemoteIndex RX
Definition owneroverlapcopy.hh:191
│ │ │ │ +
void addOwnerCopyToAll(const T &source, T &dest) const
Communicate values from owner and copy data points to all other data points and add them to those val...
Definition owneroverlapcopy.hh:362
│ │ │ │ +
void freeGlobalLookup()
Definition owneroverlapcopy.hh:520
│ │ │ │ +
Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM
Definition owneroverlapcopy.hh:190
│ │ │ │ +
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │ +
void buildOwnerToAllInterface() const
Definition owneroverlapcopy.hh:244
│ │ │ │ +
gather/scatter callback for communcation
Definition owneroverlapcopy.hh:204
│ │ │ │ +
static V gather(const T &a, std::size_t i)
Definition owneroverlapcopy.hh:207
│ │ │ │ +
static void scatter(T &a, V v, std::size_t i)
Definition owneroverlapcopy.hh:212
│ │ │ │ +
CommPolicy< T >::IndexedType V
Definition owneroverlapcopy.hh:205
│ │ │ │ + │ │ │ │ +
CommPolicy< T >::IndexedType V
Definition owneroverlapcopy.hh:220
│ │ │ │ +
static V gather(const T &a, std::size_t i)
Definition owneroverlapcopy.hh:222
│ │ │ │ +
static void scatter(T &a, V v, std::size_t i)
Definition owneroverlapcopy.hh:227
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,207 +1,839 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -blocklevel.hh │ │ │ │ │ +owneroverlapcopy.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_ISTL_BLOCKLEVEL_HH │ │ │ │ │ -7#define DUNE_ISTL_BLOCKLEVEL_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ +5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH │ │ │ │ │ +6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ 15 │ │ │ │ │ -21// forward declaration │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23template │ │ │ │ │ -24class MultiTypeBlockVector; │ │ │ │ │ -25template │ │ │ │ │ -26class MultiTypeBlockMatrix; │ │ │ │ │ -27} // end namespace Dune │ │ │ │ │ -28 │ │ │ │ │ -29namespace _D_u_n_e { namespace Impl { │ │ │ │ │ -30 │ │ │ │ │ -31// forward declaration │ │ │ │ │ -32template struct MaxBlockLevel; │ │ │ │ │ -33template struct MinBlockLevel; │ │ │ │ │ -34 │ │ │ │ │ -36template typename BlockLevel, typename Op> │ │ │ │ │ -37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op) │ │ │ │ │ -38{ │ │ │ │ │ -39 // inialize with zeroth diagonal block │ │ │ │ │ -40 using namespace Dune::Indices; │ │ │ │ │ -41 using Block00 = typename std::decay_t()[_0][_0])>; │ │ │ │ │ -42 std::size_t _b_l_o_c_k_L_e_v_e_l = BlockLevel::value() + 1; │ │ │ │ │ -43 // iterate over all blocks to determine min/max block level │ │ │ │ │ -44 using namespace Dune::Hybrid; │ │ │ │ │ -45 forEach(integralRange(index_constant()), [&](auto&& i) { │ │ │ │ │ -46 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -47 forEach(integralRange(index_constant()), [&](auto&& j) { │ │ │ │ │ -48 using Block = typename std::decay_t()[i][j])>; │ │ │ │ │ -49 _b_l_o_c_k_L_e_v_e_l = op(_b_l_o_c_k_L_e_v_e_l, BlockLevel::value() + 1); │ │ │ │ │ -50 }); │ │ │ │ │ -51 }); │ │ │ │ │ -52 return _b_l_o_c_k_L_e_v_e_l; │ │ │ │ │ -53} │ │ │ │ │ -54 │ │ │ │ │ -56template typename BlockLevel, typename Op> │ │ │ │ │ -57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op) │ │ │ │ │ -58{ │ │ │ │ │ -59 // inialize with zeroth block │ │ │ │ │ -60 using namespace Dune::Indices; │ │ │ │ │ -61 using Block0 = typename std::decay_t()[_0])>; │ │ │ │ │ -62 std::size_t _b_l_o_c_k_L_e_v_e_l = BlockLevel::value() + 1; │ │ │ │ │ -63 // iterate over all blocks to determine min/max block level │ │ │ │ │ -64 using namespace Dune::Hybrid; │ │ │ │ │ -65 forEach(integralRange(index_constant()), [&](auto&& i) { │ │ │ │ │ -66 using Block = typename std::decay_t()[i])>; │ │ │ │ │ -67 _b_l_o_c_k_L_e_v_e_l = op(_b_l_o_c_k_L_e_v_e_l, BlockLevel::value() + 1); │ │ │ │ │ -68 }); │ │ │ │ │ -69 return _b_l_o_c_k_L_e_v_e_l; │ │ │ │ │ -70} │ │ │ │ │ -71 │ │ │ │ │ -72template │ │ │ │ │ -73struct MaxBlockLevel │ │ │ │ │ -74{ │ │ │ │ │ -75 static constexpr std::size_t value(){ │ │ │ │ │ -76 if constexpr (IsNumber::value) │ │ │ │ │ -77 return 0; │ │ │ │ │ -78 else │ │ │ │ │ -79 return MaxBlockLevel::value() + 1; │ │ │ │ │ -80 } │ │ │ │ │ -81}; │ │ │ │ │ +16#include "cmath" │ │ │ │ │ +17 │ │ │ │ │ +18// MPI header │ │ │ │ │ +19#if HAVE_MPI │ │ │ │ │ +20#include │ │ │ │ │ +21#endif │ │ │ │ │ +22 │ │ │ │ │ +23#include │ │ │ │ │ +24 │ │ │ │ │ +25#if HAVE_MPI │ │ │ │ │ +26#include │ │ │ │ │ +27#include │ │ │ │ │ +28#include │ │ │ │ │ +29#include │ │ │ │ │ +30#endif │ │ │ │ │ +31 │ │ │ │ │ +32#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +33#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +34#include │ │ │ │ │ +35#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_m_a_r_k_e_t_._h_h> │ │ │ │ │ +36 │ │ │ │ │ +37template class Comm> │ │ │ │ │ +_3_8void _t_e_s_t_R_e_d_i_s_t_r_i_b_u_t_e_d(int s); │ │ │ │ │ +39 │ │ │ │ │ +40 │ │ │ │ │ +41namespace _D_u_n_e { │ │ │ │ │ +42 │ │ │ │ │ +_5_8 struct _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +59 { │ │ │ │ │ +_6_0 enum _A_t_t_r_i_b_u_t_e_S_e_t { │ │ │ │ │ +_6_1 _o_w_n_e_r=1, _o_v_e_r_l_a_p=2, _c_o_p_y=3 │ │ │ │ │ +_6_2 }; │ │ │ │ │ +63 }; │ │ │ │ │ +64 │ │ │ │ │ +76 template │ │ │ │ │ +_7_7 class _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d │ │ │ │ │ +78 { │ │ │ │ │ +79 public: │ │ │ │ │ +_8_1 typedef G _G_l_o_b_a_l_I_d_T_y_p_e; │ │ │ │ │ 82 │ │ │ │ │ -83template │ │ │ │ │ -84struct MinBlockLevel │ │ │ │ │ -85{ │ │ │ │ │ -86 // the default implementation assumes minBlockLevel == maxBlockLevel │ │ │ │ │ -87 static constexpr std::size_t value() │ │ │ │ │ -88 { return MaxBlockLevel::value(); } │ │ │ │ │ -89}; │ │ │ │ │ -90 │ │ │ │ │ -91// max block level for MultiTypeBlockMatrix │ │ │ │ │ -92template │ │ │ │ │ -93struct MaxBlockLevel<_D_u_n_e::MultiTypeBlockMatrix> │ │ │ │ │ -94{ │ │ │ │ │ -95 static constexpr std::size_t value() │ │ │ │ │ -96 { │ │ │ │ │ -97 using M = MultiTypeBlockMatrix; │ │ │ │ │ -98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); │ │ │ │ │ -}; │ │ │ │ │ -99 return blockLevelMultiTypeBlockMatrix(max); │ │ │ │ │ -100 } │ │ │ │ │ -101}; │ │ │ │ │ -102 │ │ │ │ │ -103// min block level for MultiTypeBlockMatrix │ │ │ │ │ -104template │ │ │ │ │ -105struct MinBlockLevel<_D_u_n_e::MultiTypeBlockMatrix> │ │ │ │ │ -106{ │ │ │ │ │ -107 static constexpr std::size_t value() │ │ │ │ │ -108 { │ │ │ │ │ -109 using M = MultiTypeBlockMatrix; │ │ │ │ │ -110 constexpr auto min = [](const auto& a, const auto& b){ return std::min │ │ │ │ │ -(a,b); }; │ │ │ │ │ -111 return blockLevelMultiTypeBlockMatrix(min); │ │ │ │ │ -112 } │ │ │ │ │ -113}; │ │ │ │ │ +_8_4 typedef L _L_o_c_a_l_I_d_T_y_p_e; │ │ │ │ │ +85 │ │ │ │ │ +_9_2 typedef std::tuple _I_n_d_e_x_T_r_i_p_e_l; │ │ │ │ │ +_9_9 typedef std::tuple _R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l; │ │ │ │ │ +100 │ │ │ │ │ +_1_0_6 void _a_d_d_L_o_c_a_l_I_n_d_e_x (const _I_n_d_e_x_T_r_i_p_e_l& x) │ │ │ │ │ +107 { │ │ │ │ │ +108 if (std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r && │ │ │ │ │ +109 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p && │ │ │ │ │ +110 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ +111 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"OwnerOverlapCopyCommunication: global index not in │ │ │ │ │ +index set"); │ │ │ │ │ +112 localindices.insert(x); │ │ │ │ │ +113 } │ │ │ │ │ 114 │ │ │ │ │ -115// max block level for MultiTypeBlockVector │ │ │ │ │ -116template │ │ │ │ │ -117struct MaxBlockLevel<_D_u_n_e::MultiTypeBlockVector> │ │ │ │ │ -118{ │ │ │ │ │ -119 static constexpr std::size_t value() │ │ │ │ │ -120 { │ │ │ │ │ -121 using V = MultiTypeBlockVector; │ │ │ │ │ -122 constexpr auto max = [](const auto& a, const auto& b){ return std::max │ │ │ │ │ -(a,b); }; │ │ │ │ │ -123 return blockLevelMultiTypeBlockVector(max); │ │ │ │ │ -124 } │ │ │ │ │ -125}; │ │ │ │ │ -126 │ │ │ │ │ -127// min block level for MultiTypeBlockVector │ │ │ │ │ -128template │ │ │ │ │ -129struct MinBlockLevel<_D_u_n_e::MultiTypeBlockVector> │ │ │ │ │ -130{ │ │ │ │ │ -131 static constexpr std::size_t value() │ │ │ │ │ -132 { │ │ │ │ │ -133 using V = MultiTypeBlockVector; │ │ │ │ │ -134 constexpr auto min = [](const auto& a, const auto& b){ return std::min │ │ │ │ │ -(a,b); }; │ │ │ │ │ -135 return blockLevelMultiTypeBlockVector(min); │ │ │ │ │ +_1_2_0 void _a_d_d_R_e_m_o_t_e_I_n_d_e_x (const _R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l& x) │ │ │ │ │ +121 { │ │ │ │ │ +122 if (std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r && │ │ │ │ │ +123 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p && │ │ │ │ │ +124 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ +125 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"OwnerOverlapCopyCommunication: global index not in │ │ │ │ │ +index set"); │ │ │ │ │ +126 remoteindices.insert(x); │ │ │ │ │ +127 } │ │ │ │ │ +128 │ │ │ │ │ +_1_3_3 const std::set& _l_o_c_a_l_I_n_d_i_c_e_s () const │ │ │ │ │ +134 { │ │ │ │ │ +135 return localindices; │ │ │ │ │ 136 } │ │ │ │ │ -137}; │ │ │ │ │ -138 │ │ │ │ │ -139// special case: empty MultiTypeBlockVector │ │ │ │ │ -140template<> │ │ │ │ │ -141struct MaxBlockLevel<_D_u_n_e::MultiTypeBlockVector<>> │ │ │ │ │ -142{ │ │ │ │ │ -143 static constexpr std::size_t value() │ │ │ │ │ -144 { return 0; }; │ │ │ │ │ -145}; │ │ │ │ │ +137 │ │ │ │ │ +_1_4_2 const std::set& _r_e_m_o_t_e_I_n_d_i_c_e_s () const │ │ │ │ │ +143 { │ │ │ │ │ +144 return remoteindices; │ │ │ │ │ +145 } │ │ │ │ │ 146 │ │ │ │ │ -147// special case: empty MultiTypeBlockVector │ │ │ │ │ -148template<> │ │ │ │ │ -149struct MinBlockLevel<_D_u_n_e::MultiTypeBlockVector<>> │ │ │ │ │ -150{ │ │ │ │ │ -151 static constexpr std::size_t value() │ │ │ │ │ -152 { return 0; }; │ │ │ │ │ -153}; │ │ │ │ │ -154 │ │ │ │ │ -155}} // end namespace Dune::Impl │ │ │ │ │ -156 │ │ │ │ │ -157namespace _D_u_n_e { │ │ │ │ │ -158 │ │ │ │ │ -160template │ │ │ │ │ -_1_6_1constexpr std::size_t _m_a_x_B_l_o_c_k_L_e_v_e_l() │ │ │ │ │ -162{ return Impl::MaxBlockLevel::value(); } │ │ │ │ │ +_1_5_0 void _c_l_e_a_r () │ │ │ │ │ +151 { │ │ │ │ │ +152 localindices.clear(); │ │ │ │ │ +153 remoteindices.clear(); │ │ │ │ │ +154 } │ │ │ │ │ +155 │ │ │ │ │ +156 private: │ │ │ │ │ +158 std::set localindices; │ │ │ │ │ +160 std::set remoteindices; │ │ │ │ │ +161 }; │ │ │ │ │ +162 │ │ │ │ │ 163 │ │ │ │ │ -165template │ │ │ │ │ -_1_6_6constexpr std::size_t _m_i_n_B_l_o_c_k_L_e_v_e_l() │ │ │ │ │ -167{ return Impl::MinBlockLevel::value(); } │ │ │ │ │ -168 │ │ │ │ │ -170template │ │ │ │ │ -_1_7_1constexpr bool _h_a_s_U_n_i_q_u_e_B_l_o_c_k_L_e_v_e_l() │ │ │ │ │ -172{ return maxBlockLevel() == minBlockLevel(); } │ │ │ │ │ -173 │ │ │ │ │ -175template │ │ │ │ │ -_1_7_6constexpr std::size_t _b_l_o_c_k_L_e_v_e_l() │ │ │ │ │ -177{ │ │ │ │ │ -178 static_assert(hasUniqueBlockLevel(), "Block level cannot be uniquely │ │ │ │ │ -determined!"); │ │ │ │ │ -179 return Impl::MaxBlockLevel::value(); │ │ │ │ │ -180} │ │ │ │ │ -181 │ │ │ │ │ -182} // end namespace Dune │ │ │ │ │ -183 │ │ │ │ │ -184#endif │ │ │ │ │ +164#if HAVE_MPI │ │ │ │ │ +165 │ │ │ │ │ +172 template │ │ │ │ │ +_1_7_3 class _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +174 { │ │ │ │ │ +175 template │ │ │ │ │ +176 friend void _l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t(M&, │ │ │ │ │ +177 const std::string&, │ │ │ │ │ +178 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>&, │ │ │ │ │ +179 bool); │ │ │ │ │ +180 // used types │ │ │ │ │ +181 typedef typename _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_G_l_o_b_a_l_I_d_T_y_p_e_,_L_o_c_a_l_I_d_T_y_p_e_>_:_:_I_n_d_e_x_T_r_i_p_e_l │ │ │ │ │ +IndexTripel; │ │ │ │ │ +182 typedef typename _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_G_l_o_b_a_l_I_d_T_y_p_e_,_L_o_c_a_l_I_d_T_y_p_e_>_:_: │ │ │ │ │ +_R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l RemoteIndexTripel; │ │ │ │ │ +183 typedef typename std::set::const_iterator localindex_iterator; │ │ │ │ │ +184 typedef typename std::set::const_iterator │ │ │ │ │ +remoteindex_iterator; │ │ │ │ │ +185 typedef typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_A_t_t_r_i_b_u_t_e_S_e_t _A_t_t_r_i_b_u_t_e_S_e_t; │ │ │ │ │ +186 typedef Dune::ParallelLocalIndex LI; │ │ │ │ │ +187 public: │ │ │ │ │ +_1_8_8 typedef Dune::ParallelIndexSet _P_I_S; │ │ │ │ │ +_1_8_9 typedef Dune::RemoteIndices _R_I; │ │ │ │ │ +_1_9_0 typedef Dune::RemoteIndexListModifier │ │ │ │ │ +_R_I_L_M; │ │ │ │ │ +_1_9_1 typedef typename RI::RemoteIndex _R_X; │ │ │ │ │ +_1_9_2 typedef Dune::BufferedCommunicator _B_C; │ │ │ │ │ +_1_9_3 typedef Dune::Interface _I_F; │ │ │ │ │ +_1_9_4 typedef EnumItem │ │ │ │ │ +_O_w_n_e_r_S_e_t; │ │ │ │ │ +_1_9_5 typedef EnumItem _C_o_p_y_S_e_t; │ │ │ │ │ +_1_9_6 typedef Combine,EnumItem,_A_t_t_r_i_b_u_t_e_S_e_t> _O_w_n_e_r_O_v_e_r_l_a_p_S_e_t; │ │ │ │ │ +_1_9_7 typedef Dune::AllSet _A_l_l_S_e_t; │ │ │ │ │ +198 protected: │ │ │ │ │ +199 │ │ │ │ │ +200 │ │ │ │ │ +202 template │ │ │ │ │ +_2_0_3 struct _C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +204 { │ │ │ │ │ +_2_0_5 typedef typename CommPolicy::IndexedType _V; │ │ │ │ │ +206 │ │ │ │ │ +_2_0_7 static _V _g_a_t_h_e_r(const T& a, std::size_t i) │ │ │ │ │ +208 { │ │ │ │ │ +209 return a[i]; │ │ │ │ │ +210 } │ │ │ │ │ +211 │ │ │ │ │ +_2_1_2 static void _s_c_a_t_t_e_r(T& a, _V v, std::size_t i) │ │ │ │ │ +213 { │ │ │ │ │ +214 a[i] = v; │ │ │ │ │ +215 } │ │ │ │ │ +216 }; │ │ │ │ │ +217 template │ │ │ │ │ +_2_1_8 struct _A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +219 { │ │ │ │ │ +_2_2_0 typedef typename CommPolicy::IndexedType _V; │ │ │ │ │ +221 │ │ │ │ │ +_2_2_2 static _V _g_a_t_h_e_r(const T& a, std::size_t i) │ │ │ │ │ +223 { │ │ │ │ │ +224 return a[i]; │ │ │ │ │ +225 } │ │ │ │ │ +226 │ │ │ │ │ +_2_2_7 static void _s_c_a_t_t_e_r(T& a, _V v, std::size_t i) │ │ │ │ │ +228 { │ │ │ │ │ +229 a[i] += v; │ │ │ │ │ +230 } │ │ │ │ │ +231 }; │ │ │ │ │ +232 │ │ │ │ │ +_2_3_3 void _b_u_i_l_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ +234 { │ │ │ │ │ +235 if (OwnerOverlapToAllInterfaceBuilt) │ │ │ │ │ +236 OwnerOverlapToAllInterface.free(); │ │ │ │ │ +237 _O_w_n_e_r_O_v_e_r_l_a_p_S_e_t sourceFlags; │ │ │ │ │ +238 │ │ │ │ │ +Combine,_A_t_t_r_i_b_u_t_e_S_e_t> │ │ │ │ │ +239 destFlags; │ │ │ │ │ +240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ +241 OwnerOverlapToAllInterfaceBuilt = true; │ │ │ │ │ +242 } │ │ │ │ │ +243 │ │ │ │ │ +_2_4_4 void _b_u_i_l_d_O_w_n_e_r_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ +245 { │ │ │ │ │ +246 if (OwnerToAllInterfaceBuilt) │ │ │ │ │ +247 OwnerToAllInterface.free(); │ │ │ │ │ +248 _O_w_n_e_r_S_e_t sourceFlags; │ │ │ │ │ +249 _A_l_l_S_e_t destFlags; │ │ │ │ │ +250 OwnerToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ +251 OwnerToAllInterfaceBuilt = true; │ │ │ │ │ +252 } │ │ │ │ │ +253 │ │ │ │ │ +_2_5_4 void _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ +255 { │ │ │ │ │ +256 if (OwnerCopyToAllInterfaceBuilt) │ │ │ │ │ +257 OwnerCopyToAllInterface.free(); │ │ │ │ │ +258 │ │ │ │ │ +259 typedef Combine,EnumItem,_A_t_t_r_i_b_u_t_e_S_e_t> │ │ │ │ │ +OwnerCopySet; │ │ │ │ │ +260 OwnerCopySet sourceFlags; │ │ │ │ │ +261 Combine,_A_t_t_r_i_b_u_t_e_S_e_t> destFlags; │ │ │ │ │ +262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ +263 OwnerCopyToAllInterfaceBuilt = true; │ │ │ │ │ +264 } │ │ │ │ │ +265 │ │ │ │ │ +_2_6_6 void _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ +267 { │ │ │ │ │ +268 if (OwnerCopyToOwnerCopyInterfaceBuilt) │ │ │ │ │ +269 OwnerCopyToOwnerCopyInterface.free(); │ │ │ │ │ +270 │ │ │ │ │ +271 │ │ │ │ │ +272 typedef Combine,EnumItem,_A_t_t_r_i_b_u_t_e_S_e_t> │ │ │ │ │ +OwnerCopySet; │ │ │ │ │ +273 OwnerCopySet sourceFlags; │ │ │ │ │ +274 OwnerCopySet destFlags; │ │ │ │ │ +275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ +276 OwnerCopyToOwnerCopyInterfaceBuilt = true; │ │ │ │ │ +277 } │ │ │ │ │ +278 │ │ │ │ │ +_2_7_9 void _b_u_i_l_d_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ +280 { │ │ │ │ │ +281 if (CopyToAllInterfaceBuilt) │ │ │ │ │ +282 CopyToAllInterface.free(); │ │ │ │ │ +283 _C_o_p_y_S_e_t sourceFlags; │ │ │ │ │ +284 _A_l_l_S_e_t destFlags; │ │ │ │ │ +285 CopyToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ +286 CopyToAllInterfaceBuilt = true; │ │ │ │ │ +287 } │ │ │ │ │ +288 │ │ │ │ │ +289 public: │ │ │ │ │ +290 │ │ │ │ │ +_2_9_5 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y () const { │ │ │ │ │ +296 return category_; │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +_2_9_9 const Communication& _c_o_m_m_u_n_i_c_a_t_o_r() const │ │ │ │ │ +300 { │ │ │ │ │ +301 return cc; │ │ │ │ │ +302 } │ │ │ │ │ +303 │ │ │ │ │ +310 template │ │ │ │ │ +_3_1_1 void _c_o_p_y_O_w_n_e_r_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ +312 { │ │ │ │ │ +313 if (!OwnerToAllInterfaceBuilt) │ │ │ │ │ +314 _b_u_i_l_d_O_w_n_e_r_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ +315 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +316 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerToAllInterface); │ │ │ │ │ +317 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ +318 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +327 template │ │ │ │ │ +_3_2_8 void _c_o_p_y_C_o_p_y_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ +329 { │ │ │ │ │ +330 if (!CopyToAllInterfaceBuilt) │ │ │ │ │ +331 _b_u_i_l_d_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ +332 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +333 _c_o_m_m_u_n_i_c_a_t_o_r.template build(CopyToAllInterface); │ │ │ │ │ +334 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ +335 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ +336 } │ │ │ │ │ +337 │ │ │ │ │ +344 template │ │ │ │ │ +_3_4_5 void _a_d_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ +346 { │ │ │ │ │ +347 if (!OwnerOverlapToAllInterfaceBuilt) │ │ │ │ │ +348 _b_u_i_l_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ +349 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +350 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerOverlapToAllInterface); │ │ │ │ │ +351 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ +352 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ +353 } │ │ │ │ │ +354 │ │ │ │ │ +361 template │ │ │ │ │ +_3_6_2 void _a_d_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ +363 { │ │ │ │ │ +364 if (!OwnerCopyToAllInterfaceBuilt) │ │ │ │ │ +365 _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ +366 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +367 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerCopyToAllInterface); │ │ │ │ │ +368 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ +369 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ +370 } │ │ │ │ │ +371 │ │ │ │ │ +378 template │ │ │ │ │ +_3_7_9 void _a_d_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y (const T& source, T& dest) const │ │ │ │ │ +380 { │ │ │ │ │ +381 if (!OwnerCopyToOwnerCopyInterfaceBuilt) │ │ │ │ │ +382 _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ +383 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +384 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerCopyToOwnerCopyInterface); │ │ │ │ │ +385 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ +386 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +389 │ │ │ │ │ +397 template │ │ │ │ │ +_3_9_8 void _d_o_t (const T1& x, const T1& y, T2& result) const │ │ │ │ │ +399 { │ │ │ │ │ +400 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +401 // set up mask vector │ │ │ │ │ +402 if (mask.size()!=static_cast::size_type> │ │ │ │ │ +(x.size())) │ │ │ │ │ +403 { │ │ │ │ │ +404 mask.resize(x.size()); │ │ │ │ │ +405 for (typename std::vector::size_type i=0; ilocal().attribute()!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ +409 mask[i->local().local()] = 0; │ │ │ │ │ +410 } │ │ │ │ │ +411 result = T2(0.0); │ │ │ │ │ +412 │ │ │ │ │ +413 for (typename T1::size_type i=0; i(mask[i]); │ │ │ │ │ +415 result = cc.sum(result); │ │ │ │ │ +416 } │ │ │ │ │ +417 │ │ │ │ │ +424 template │ │ │ │ │ +_4_2_5 typename FieldTraits::real_type _n_o_r_m (const T1& x) │ │ │ │ │ +const │ │ │ │ │ +426 { │ │ │ │ │ +427 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +428 │ │ │ │ │ +429 // set up mask vector │ │ │ │ │ +430 if (mask.size()!=static_cast::size_type> │ │ │ │ │ +(x.size())) │ │ │ │ │ +431 { │ │ │ │ │ +432 mask.resize(x.size()); │ │ │ │ │ +433 for (typename std::vector::size_type i=0; ilocal().attribute()!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ +437 mask[i->local().local()] = 0; │ │ │ │ │ +438 } │ │ │ │ │ +439 auto result = real_type(0.0); │ │ │ │ │ +440 for (typename T1::size_type i=0; i │ │ │ │ │ +_C_o_p_y_F_l_a_g_s; │ │ │ │ │ +447 │ │ │ │ │ +_4_4_9 typedef Dune::ParallelIndexSet _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +450 │ │ │ │ │ +_4_5_2 typedef Dune::RemoteIndices _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ +453 │ │ │ │ │ +_4_5_6 typedef Dune::GlobalLookupIndexSet _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ +457 │ │ │ │ │ +_4_6_2 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& _i_n_d_e_x_S_e_t() const │ │ │ │ │ +463 { │ │ │ │ │ +464 return pis; │ │ │ │ │ +465 } │ │ │ │ │ +466 │ │ │ │ │ +_4_7_1 const _R_e_m_o_t_e_I_n_d_i_c_e_s& _r_e_m_o_t_e_I_n_d_i_c_e_s() const │ │ │ │ │ +472 { │ │ │ │ │ +473 return ri; │ │ │ │ │ +474 } │ │ │ │ │ +475 │ │ │ │ │ +_4_8_0 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& _i_n_d_e_x_S_e_t() │ │ │ │ │ +481 { │ │ │ │ │ +482 return pis; │ │ │ │ │ +483 } │ │ │ │ │ +484 │ │ │ │ │ +485 │ │ │ │ │ +_4_9_0 _R_e_m_o_t_e_I_n_d_i_c_e_s& _r_e_m_o_t_e_I_n_d_i_c_e_s() │ │ │ │ │ +491 { │ │ │ │ │ +492 return ri; │ │ │ │ │ +493 } │ │ │ │ │ +494 │ │ │ │ │ +_4_9_5 void _b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p() │ │ │ │ │ +496 { │ │ │ │ │ +497 if(globalLookup_) { │ │ │ │ │ +498 if(pis.seqNo()==oldseqNo) │ │ │ │ │ +499 // Nothing changed! │ │ │ │ │ +500 return; │ │ │ │ │ +501 delete globalLookup_; │ │ │ │ │ +502 } │ │ │ │ │ +503 │ │ │ │ │ +504 globalLookup_ = new _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(pis); │ │ │ │ │ +505 oldseqNo = pis.seqNo(); │ │ │ │ │ +506 } │ │ │ │ │ +507 │ │ │ │ │ +_5_0_8 void _b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(std::size_t size) │ │ │ │ │ +509 { │ │ │ │ │ +510 if(globalLookup_) { │ │ │ │ │ +511 if(pis.seqNo()==oldseqNo) │ │ │ │ │ +512 // Nothing changed! │ │ │ │ │ +513 return; │ │ │ │ │ +514 delete globalLookup_; │ │ │ │ │ +515 } │ │ │ │ │ +516 globalLookup_ = new _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(pis, size); │ │ │ │ │ +517 oldseqNo = pis.seqNo(); │ │ │ │ │ +518 } │ │ │ │ │ +519 │ │ │ │ │ +_5_2_0 void _f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p() │ │ │ │ │ +521 { │ │ │ │ │ +522 delete globalLookup_; │ │ │ │ │ +523 globalLookup_=0; │ │ │ │ │ +524 } │ │ │ │ │ +525 │ │ │ │ │ +_5_2_6 const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& _g_l_o_b_a_l_L_o_o_k_u_p() const │ │ │ │ │ +527 { │ │ │ │ │ +528 assert(globalLookup_ != 0); │ │ │ │ │ +529 return *globalLookup_; │ │ │ │ │ +530 } │ │ │ │ │ +531 │ │ │ │ │ +537 template │ │ │ │ │ +_5_3_8 void _p_r_o_j_e_c_t (T1& x) const │ │ │ │ │ +539 { │ │ │ │ │ +540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i) │ │ │ │ │ +541 if (i->local().attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ +542 x[i->local().local()] = 0; │ │ │ │ │ +543 } │ │ │ │ │ +544 │ │ │ │ │ +_5_5_4 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (MPI_Comm comm_, │ │ │ │ │ +555 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat_ = _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g, │ │ │ │ │ +556 bool freecomm_ = false) │ │ │ │ │ +557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_), │ │ │ │ │ +558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false), │ │ │ │ │ +559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt │ │ │ │ │ +(false), │ │ │ │ │ +560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), │ │ │ │ │ +561 freecomm(freecomm_) │ │ │ │ │ +562 {} │ │ │ │ │ +563 │ │ │ │ │ +_5_7_2 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat_ = │ │ │ │ │ +_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g) │ │ │ │ │ +573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri │ │ │ │ │ +(pis,pis,MPI_COMM_WORLD), │ │ │ │ │ +574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false), │ │ │ │ │ +575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt │ │ │ │ │ +(false), │ │ │ │ │ +576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm │ │ │ │ │ +(false) │ │ │ │ │ +577 {} │ │ │ │ │ +578 │ │ │ │ │ +_5_8_6 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (const _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_G_l_o_b_a_l_I_d_T_y_p_e_, │ │ │ │ │ +_L_o_c_a_l_I_d_T_y_p_e_>& indexinfo, │ │ │ │ │ +587 MPI_Comm comm_, │ │ │ │ │ +588 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat_ = _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g, │ │ │ │ │ +589 bool freecomm_ = false) │ │ │ │ │ +590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false), │ │ │ │ │ +591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt │ │ │ │ │ +(false), │ │ │ │ │ +592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false), │ │ │ │ │ +593 globalLookup_(0), category_(cat_), freecomm(freecomm_) │ │ │ │ │ +594 { │ │ │ │ │ +595 // set up an ISTL index set │ │ │ │ │ +596 pis.beginResize(); │ │ │ │ │ +597 for (localindex_iterator i=indexinfo._l_o_c_a_l_I_n_d_i_c_e_s().begin(); │ │ │ │ │ +i!=indexinfo._l_o_c_a_l_I_n_d_i_c_e_s().end(); ++i) │ │ │ │ │ +598 { │ │ │ │ │ +599 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ +600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ +_o_w_n_e_r,true)); │ │ │ │ │ +601 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ +602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ +_o_v_e_r_l_a_p,true)); │ │ │ │ │ +603 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ +604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ +_c_o_p_y,true)); │ │ │ │ │ +605 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << │ │ │ │ │ +std::get<1>(*i) << " " << std::get<2>(*i) << std::endl; │ │ │ │ │ +606 } │ │ │ │ │ +607 pis.endResize(); │ │ │ │ │ +608 │ │ │ │ │ +609 // build remote indices WITHOUT communication │ │ │ │ │ +610 // std::cout << cc.rank() << ": build remote indices" << std::endl; │ │ │ │ │ +611 ri.setIndexSets(pis,pis,cc); │ │ │ │ │ +612 if (indexinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().size()>0) │ │ │ │ │ +613 { │ │ │ │ │ +614 remoteindex_iterator i=indexinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().begin(); │ │ │ │ │ +615 int p = std::get<0>(*i); │ │ │ │ │ +616 _R_I_L_M modifier = ri.template getModifier(p); │ │ │ │ │ +617 typename PIS::const_iterator pi=pis.begin(); │ │ │ │ │ +618 for ( ; i!=indexinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().end(); ++i) │ │ │ │ │ +619 { │ │ │ │ │ +620 // handle processor change │ │ │ │ │ +621 if (p!=std::get<0>(*i)) │ │ │ │ │ +622 { │ │ │ │ │ +623 p = std::get<0>(*i); │ │ │ │ │ +624 modifier = ri.template getModifier(p); │ │ │ │ │ +625 pi=pis.begin(); │ │ │ │ │ +626 } │ │ │ │ │ +627 │ │ │ │ │ +628 // position to correct entry in parallel index set │ │ │ │ │ +629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end()) │ │ │ │ │ +630 ++pi; │ │ │ │ │ +631 if (pi==pis.end()) │ │ │ │ │ +632 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"OwnerOverlapCopyCommunication: global index not in │ │ │ │ │ +index set"); │ │ │ │ │ +633 │ │ │ │ │ +634 // insert entry │ │ │ │ │ +635 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << │ │ │ │ │ +" " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl; │ │ │ │ │ +636 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ +637 modifier.insert(_R_X(_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r,&(*pi))); │ │ │ │ │ +638 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ +639 modifier.insert(_R_X(_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p,&(*pi))); │ │ │ │ │ +640 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ +641 modifier.insert(_R_X(_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y,&(*pi))); │ │ │ │ │ +642 } │ │ │ │ │ +643 }else{ │ │ │ │ │ +644 // Force remote indices to be synced! │ │ │ │ │ +645 ri.template getModifier(0); │ │ │ │ │ +646 } │ │ │ │ │ +647 } │ │ │ │ │ +648 │ │ │ │ │ +649 // destructor: free memory in some objects │ │ │ │ │ +_6_5_0 _~_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n () │ │ │ │ │ +651 { │ │ │ │ │ +652 ri.free(); │ │ │ │ │ +653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free(); │ │ │ │ │ +654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free(); │ │ │ │ │ +655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free(); │ │ │ │ │ +656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free │ │ │ │ │ +(); │ │ │ │ │ +657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free(); │ │ │ │ │ +658 if (globalLookup_) delete globalLookup_; │ │ │ │ │ +659 if (freecomm==true) │ │ │ │ │ +660 if(comm!=MPI_COMM_NULL) │ │ │ │ │ +661 { │ │ │ │ │ +662#ifdef MPI_2 │ │ │ │ │ +663 // If it is possible to query whether MPI_Finalize │ │ │ │ │ +664 // was called, only free the communicator before │ │ │ │ │ +665 // calling MPI_Finalize. │ │ │ │ │ +666 int wasFinalized = 0; │ │ │ │ │ +667 MPI_Finalized( &wasFinalized ); │ │ │ │ │ +668 if(!wasFinalized) │ │ │ │ │ +669#endif │ │ │ │ │ +670 MPI_Comm_free(&comm); │ │ │ │ │ +671 } │ │ │ │ │ +672 } │ │ │ │ │ +673 │ │ │ │ │ +674 private: │ │ │ │ │ +675 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (const _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n&) │ │ │ │ │ +676 {} │ │ │ │ │ +677 MPI_Comm comm; │ │ │ │ │ +678 Communication cc; │ │ │ │ │ +679 _P_I_S pis; │ │ │ │ │ +680 _R_I ri; │ │ │ │ │ +681 mutable _I_F OwnerToAllInterface; │ │ │ │ │ +682 mutable bool OwnerToAllInterfaceBuilt; │ │ │ │ │ +683 mutable _I_F OwnerOverlapToAllInterface; │ │ │ │ │ +684 mutable bool OwnerOverlapToAllInterfaceBuilt; │ │ │ │ │ +685 mutable _I_F OwnerCopyToAllInterface; │ │ │ │ │ +686 mutable bool OwnerCopyToAllInterfaceBuilt; │ │ │ │ │ +687 mutable _I_F OwnerCopyToOwnerCopyInterface; │ │ │ │ │ +688 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt; │ │ │ │ │ +689 mutable _I_F CopyToAllInterface; │ │ │ │ │ +690 mutable bool CopyToAllInterfaceBuilt; │ │ │ │ │ +691 mutable std::vector mask; │ │ │ │ │ +692 int oldseqNo; │ │ │ │ │ +693 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t* globalLookup_; │ │ │ │ │ +694 const _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category_; │ │ │ │ │ +695 bool freecomm; │ │ │ │ │ +696 }; │ │ │ │ │ +697 │ │ │ │ │ +698#endif │ │ │ │ │ +699 │ │ │ │ │ +700 │ │ │ │ │ +703} // end namespace │ │ │ │ │ +704 │ │ │ │ │ +705#endif │ │ │ │ │ +_m_a_t_r_i_x_m_a_r_k_e_t_._h_h │ │ │ │ │ +Provides classes for reading and writing MatrixMarket Files with an extension │ │ │ │ │ +for parallel matrices. │ │ │ │ │ +_t_e_s_t_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ +void testRedistributed(int s) │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_h_a_s_U_n_i_q_u_e_B_l_o_c_k_L_e_v_e_l │ │ │ │ │ -constexpr bool hasUniqueBlockLevel() │ │ │ │ │ -Determine if a vector/matrix has a uniquely determinable block level. │ │ │ │ │ -DDeeffiinniittiioonn blocklevel.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_m_a_x_B_l_o_c_k_L_e_v_e_l │ │ │ │ │ -constexpr std::size_t maxBlockLevel() │ │ │ │ │ -Determine the maximum block level of a possibly nested vector/matrix type. │ │ │ │ │ -DDeeffiinniittiioonn blocklevel.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_b_l_o_c_k_L_e_v_e_l │ │ │ │ │ -constexpr std::size_t blockLevel() │ │ │ │ │ -Determine the block level of a possibly nested vector/matrix type. │ │ │ │ │ -DDeeffiinniittiioonn blocklevel.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_m_i_n_B_l_o_c_k_L_e_v_e_l │ │ │ │ │ -constexpr std::size_t minBlockLevel() │ │ │ │ │ -Determine the minimum block level of a possibly nested vector/matrix type. │ │ │ │ │ -DDeeffiinniittiioonn blocklevel.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +Attribute set for overlapping Schwarz. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ +AttributeSet │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r │ │ │ │ │ +@ owner │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y │ │ │ │ │ +@ copy │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p │ │ │ │ │ +@ overlap │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d │ │ │ │ │ +Information about the index distribution. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_I_n_d_e_x_T_r_i_p_e_l │ │ │ │ │ +std::tuple< GlobalIdType, LocalIdType, int > IndexTripel │ │ │ │ │ +A triple describing a local index. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_a_d_d_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ +void addRemoteIndex(const RemoteIndexTripel &x) │ │ │ │ │ +Add a new remote index triple to the set of remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_G_l_o_b_a_l_I_d_T_y_p_e │ │ │ │ │ +G GlobalIdType │ │ │ │ │ +The type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_l_o_c_a_l_I_n_d_i_c_e_s │ │ │ │ │ +const std::set< IndexTripel > & localIndices() const │ │ │ │ │ +Get the set of indices local to the process. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +const std::set< RemoteIndexTripel > & remoteIndices() const │ │ │ │ │ +Get the set of remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_L_o_c_a_l_I_d_T_y_p_e │ │ │ │ │ +L LocalIdType │ │ │ │ │ +The type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +Remove all indices from the sets. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_a_d_d_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +void addLocalIndex(const IndexTripel &x) │ │ │ │ │ +Add a new index triple to the set of local indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l │ │ │ │ │ +std::tuple< int, GlobalIdType, int > RemoteIndexTripel │ │ │ │ │ +A triple describing a remote index. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_S_e_t │ │ │ │ │ +EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:195 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_g_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +const GlobalLookupIndexSet & globalLookup() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_n_o_r_m │ │ │ │ │ +FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const │ │ │ │ │ +Compute the global Euclidean norm of a vector. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:425 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildOwnerOverlapToAllInterface() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:233 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_I_S │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildOwnerCopyToAllInterface() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildOwnerCopyToOwnerCopyInterface() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, │ │ │ │ │ +LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category │ │ │ │ │ +cat_=SolverCategory::overlapping, bool freecomm_=false) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:586 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +SolverCategory::Category category() const │ │ │ │ │ +Get Solver Category. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:295 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_d_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y │ │ │ │ │ +void addOwnerCopyToOwnerCopy(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner and copy data points to owner and copy data │ │ │ │ │ +points and add them to thos... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildCopyToAllInterface() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_F_l_a_g_s │ │ │ │ │ +Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:446 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +RemoteIndices & remoteIndices() │ │ │ │ │ +Get the underlying remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:490 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ +const ParallelIndexSet & indexSet() const │ │ │ │ │ +Get the underlying parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:462 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_I │ │ │ │ │ +Dune::RemoteIndices< PIS > RI │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void buildGlobalLookup(std::size_t size) │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:508 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_d_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l │ │ │ │ │ +void addOwnerOverlapToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner data points to all other data points and add them │ │ │ │ │ +to those values. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:345 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +Dune::RemoteIndices< PIS > RemoteIndices │ │ │ │ │ +The type of the remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:452 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_p_r_o_j_e_c_t │ │ │ │ │ +void project(T1 &x) const │ │ │ │ │ +Set vector to zero at copy dofs. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:538 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_l_l_S_e_t │ │ │ │ │ +Dune::AllSet< AttributeSet > AllSet │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:197 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_S_e_t │ │ │ │ │ +Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, │ │ │ │ │ +EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > │ │ │ │ │ +OwnerOverlapSet │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_C_o_p_y_T_o_A_l_l │ │ │ │ │ +void copyCopyToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from copy data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet │ │ │ │ │ +The type of the reverse lookup of indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:456 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_I_F │ │ │ │ │ +Dune::Interface IF │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_~_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +~OwnerOverlapCopyCommunication() │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:650 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void buildGlobalLookup() │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:495 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_B_C │ │ │ │ │ +Dune::BufferedCommunicator BC │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category │ │ │ │ │ +cat_=SolverCategory::overlapping, bool freecomm_=false) │ │ │ │ │ +Construct the communication without any indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:554 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ +ParallelIndexSet & indexSet() │ │ │ │ │ +Get the underlying parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:480 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_d_o_t │ │ │ │ │ +void dot(const T1 &x, const T1 &y, T2 &result) const │ │ │ │ │ +Compute a global dot product of two vectors. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:398 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +const Communication< MPI_Comm > & communicator() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory:: │ │ │ │ │ +overlapping) │ │ │ │ │ +Construct the communication without any indices using MPI_COMM_WORLD. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:572 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ +void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +const RemoteIndices & remoteIndices() const │ │ │ │ │ +Get the underlying remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ +friend void loadMatrixMarket(M &, const std::string &, │ │ │ │ │ +OwnerOverlapCopyCommunication< G, L > &, bool) │ │ │ │ │ +Load a parallel matrix/vector stored in matrix market format. │ │ │ │ │ +DDeeffiinniittiioonn matrixmarket.hh:1269 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_X │ │ │ │ │ +RI::RemoteIndex RX │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:191 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_d_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l │ │ │ │ │ +void addOwnerCopyToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner and copy data points to all other data points and │ │ │ │ │ +add them to those val... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:362 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void freeGlobalLookup() │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_I_L_M │ │ │ │ │ +Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ +The type of the parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildOwnerToAllInterface() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +gather/scatter callback for communcation │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:204 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static V gather(const T &a, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(T &a, V v, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:212 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_V │ │ │ │ │ +CommPolicy< T >::IndexedType V │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_V │ │ │ │ │ +CommPolicy< T >::IndexedType V │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:220 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static V gather(const T &a, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(T &a, V v, std::size_t i) │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ +@ overlapping │ │ │ │ │ +Category for overlapping solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:29 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00035.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bccsmatrix.hh File Reference │ │ │ │ +dune-istl: allocator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,30 +70,50 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
bccsmatrix.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Typedefs
│ │ │ │ +
allocator.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <type_traits>
│ │ │ │ #include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::exists< T >
 
struct  Dune::DefaultAllocatorTraits< T, typename >
 
struct  Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > >
 
struct  Dune::AllocatorTraits< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ISTL
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<typename T >
using Dune::AllocatorType = typename AllocatorTraits< T >::type
 
template<typename T , typename X >
using Dune::ReboundAllocatorType = typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X >
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,19 +1,35 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -bccsmatrix.hh File Reference │ │ │ │ │ -#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 │ │ │ │ │ +allocator.hh File Reference │ │ │ │ │ +#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_:_:_e_x_i_s_t_s_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _t_y_p_e_n_a_m_e_ _T_:_: │ │ │ │ │ + _a_l_l_o_c_a_t_o_r___t_y_p_e_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_I_S_T_L │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_y_p_e = typename _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s< T >::type │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e = typename std::allocator_traits< typename │ │ │ │ │ + _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s< T >::type >::template rebind_alloc< X > │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bccsmatrix.hh Source File │ │ │ │ +dune-istl: allocator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,131 +74,76 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
bccsmatrix.hh
│ │ │ │ +
allocator.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_BCCSMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_BCCSMATRIX_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/fmatrix.hh>
│ │ │ │ -
9#include <dune/common/fvector.hh>
│ │ │ │ -
10#include <dune/common/typetraits.hh>
│ │ │ │ -
11
│ │ │ │ -
│ │ │ │ -
12namespace Dune::ISTL::Impl
│ │ │ │ -
13{
│ │ │ │ -
27 template<class B, class I = typename std::allocator<B>::size_type>
│ │ │ │ -
28 class BCCSMatrix
│ │ │ │ -
29 {
│ │ │ │ -
30 public:
│ │ │ │ -
31 using Index = I;
│ │ │ │ -
32 using size_type = std::size_t;
│ │ │ │ -
33
│ │ │ │ -
36 BCCSMatrix()
│ │ │ │ -
37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0)
│ │ │ │ -
38 {}
│ │ │ │ -
39
│ │ │ │ -
41 ~BCCSMatrix()
│ │ │ │ -
42 {
│ │ │ │ -
43 if(N_+M_+Nnz_!=0)
│ │ │ │ -
44 free();
│ │ │ │ -
45 }
│ │ │ │ -
46
│ │ │ │ -
48 void setSize(size_type rows, size_type columns)
│ │ │ │ -
49 {
│ │ │ │ -
50 N_ = rows;
│ │ │ │ -
51 M_ = columns;
│ │ │ │ -
52 }
│ │ │ │ -
53
│ │ │ │ -
58 size_type N() const
│ │ │ │ -
59 {
│ │ │ │ -
60 return N_;
│ │ │ │ -
61 }
│ │ │ │ -
62
│ │ │ │ -
64 size_type nonzeroes() const
│ │ │ │ -
65 {
│ │ │ │ -
66 return Nnz_;
│ │ │ │ -
67 }
│ │ │ │ -
68
│ │ │ │ -
73 size_type M() const
│ │ │ │ -
74 {
│ │ │ │ -
75 return M_;
│ │ │ │ -
76 }
│ │ │ │ -
77
│ │ │ │ -
84 B* getValues() const
│ │ │ │ -
85 {
│ │ │ │ -
86 return values;
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
95 Index* getRowIndex() const
│ │ │ │ -
96 {
│ │ │ │ -
97 return rowindex;
│ │ │ │ -
98 }
│ │ │ │ -
99
│ │ │ │ -
106 Index* getColStart() const
│ │ │ │ -
107 {
│ │ │ │ -
108 return colstart;
│ │ │ │ -
109 }
│ │ │ │ -
110
│ │ │ │ -
112 BCCSMatrix& operator=(const BCCSMatrix& mat)
│ │ │ │ -
113 {
│ │ │ │ -
114 if(N_+M_+Nnz_!=0)
│ │ │ │ -
115 free();
│ │ │ │ -
116 N_=mat.N_;
│ │ │ │ -
117 M_=mat.M_;
│ │ │ │ -
118 Nnz_= mat.Nnz_;
│ │ │ │ -
119 if(M_>0) {
│ │ │ │ -
120 colstart=new size_type[M_+1];
│ │ │ │ -
121 for(size_type i=0; i<=M_; ++i)
│ │ │ │ -
122 colstart[i]=mat.colstart[i];
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ -
125 if(Nnz_>0) {
│ │ │ │ -
126 values = new B[Nnz_];
│ │ │ │ -
127 rowindex = new size_type[Nnz_];
│ │ │ │ -
128
│ │ │ │ -
129 for(size_type i=0; i<Nnz_; ++i)
│ │ │ │ -
130 values[i]=mat.values[i];
│ │ │ │ -
131
│ │ │ │ -
132 for(size_type i=0; i<Nnz_; ++i)
│ │ │ │ -
133 rowindex[i]=mat.rowindex[i];
│ │ │ │ -
134 }
│ │ │ │ -
135 return *this;
│ │ │ │ -
136 }
│ │ │ │ -
137
│ │ │ │ -
139 virtual void free()
│ │ │ │ -
140 {
│ │ │ │ -
141 delete[] values;
│ │ │ │ -
142 delete[] rowindex;
│ │ │ │ -
143 delete[] colstart;
│ │ │ │ -
144 N_ = 0;
│ │ │ │ -
145 M_ = 0;
│ │ │ │ -
146 Nnz_ = 0;
│ │ │ │ -
147 }
│ │ │ │ -
148
│ │ │ │ -
149 public:
│ │ │ │ -
150 size_type N_, M_, Nnz_;
│ │ │ │ -
151 B* values;
│ │ │ │ -
152 Index* rowindex;
│ │ │ │ -
153 Index* colstart;
│ │ │ │ -
154 };
│ │ │ │ -
155
│ │ │ │ -
156}
│ │ │ │ -
│ │ │ │ -
157#endif
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
3#ifndef DUNE_ISTL_ALLOCATOR_HH
│ │ │ │ +
4#define DUNE_ISTL_ALLOCATOR_HH
│ │ │ │ +
5
│ │ │ │ +
6#include <memory>
│ │ │ │ +
7#include <type_traits>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/typetraits.hh>
│ │ │ │ +
10
│ │ │ │ +
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12
│ │ │ │ +
13 template<typename T>
│ │ │ │ +
│ │ │ │ +
14 struct exists{
│ │ │ │ +
15 static const bool value = true;
│ │ │ │ +
16 };
│ │ │ │ +
│ │ │ │ +
17
│ │ │ │ +
18 template<typename T, typename = void>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
20 {
│ │ │ │ +
21 using type = std::allocator<T>;
│ │ │ │ +
22 };
│ │ │ │ +
│ │ │ │ +
23
│ │ │ │ +
24 template<typename T>
│ │ │ │ +
│ │ │ │ +
25 struct DefaultAllocatorTraits<T, std::void_t<typename T::allocator_type> >
│ │ │ │ +
26 {
│ │ │ │ +
27 using type = typename T::allocator_type;
│ │ │ │ +
28 };
│ │ │ │ +
│ │ │ │ +
29
│ │ │ │ +
30 template<typename T>
│ │ │ │ + │ │ │ │ +
32
│ │ │ │ +
33 template<typename T>
│ │ │ │ + │ │ │ │ +
35
│ │ │ │ +
36 template<typename T, typename X>
│ │ │ │ +
37 using ReboundAllocatorType = typename std::allocator_traits<typename AllocatorTraits<T>::type>::template rebind_alloc<X>;
│ │ │ │ +
38
│ │ │ │ +
39} // end namespace Dune
│ │ │ │ +
│ │ │ │ +
40
│ │ │ │ +
41#endif // DUNE_ISTL_ALLOCATOR_HH
│ │ │ │ +
STL namespace.
│ │ │ │ +
Definition allocator.hh:11
│ │ │ │ +
typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X > ReboundAllocatorType
Definition allocator.hh:37
│ │ │ │ +
typename AllocatorTraits< T >::type AllocatorType
Definition allocator.hh:34
│ │ │ │ +
Definition allocator.hh:14
│ │ │ │ +
static const bool value
Definition allocator.hh:15
│ │ │ │ +
Definition allocator.hh:20
│ │ │ │ +
std::allocator< T > type
Definition allocator.hh:21
│ │ │ │ +
typename T::allocator_type type
Definition allocator.hh:27
│ │ │ │ +
Definition allocator.hh:31
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,125 +1,80 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -bccsmatrix.hh │ │ │ │ │ +allocator.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_BCCSMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_BCCSMATRIX_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -_1_2namespace Dune::ISTL::Impl │ │ │ │ │ -13{ │ │ │ │ │ -27 template::size_type> │ │ │ │ │ -28 class BCCSMatrix │ │ │ │ │ -29 { │ │ │ │ │ -30 public: │ │ │ │ │ -31 using Index = I; │ │ │ │ │ -32 using size_type = std::size_t; │ │ │ │ │ -33 │ │ │ │ │ -36 BCCSMatrix() │ │ │ │ │ -37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0) │ │ │ │ │ -38 {} │ │ │ │ │ -39 │ │ │ │ │ -41 ~BCCSMatrix() │ │ │ │ │ -42 { │ │ │ │ │ -43 if(N_+M_+Nnz_!=0) │ │ │ │ │ -44 free(); │ │ │ │ │ -45 } │ │ │ │ │ -46 │ │ │ │ │ -48 void setSize(size_type rows, size_type columns) │ │ │ │ │ -49 { │ │ │ │ │ -50 N_ = rows; │ │ │ │ │ -51 M_ = columns; │ │ │ │ │ -52 } │ │ │ │ │ -53 │ │ │ │ │ -58 size_type N() const │ │ │ │ │ -59 { │ │ │ │ │ -60 return N_; │ │ │ │ │ -61 } │ │ │ │ │ -62 │ │ │ │ │ -64 size_type nonzeroes() const │ │ │ │ │ -65 { │ │ │ │ │ -66 return Nnz_; │ │ │ │ │ -67 } │ │ │ │ │ -68 │ │ │ │ │ -73 size_type M() const │ │ │ │ │ -74 { │ │ │ │ │ -75 return M_; │ │ │ │ │ -76 } │ │ │ │ │ -77 │ │ │ │ │ -84 B* getValues() const │ │ │ │ │ -85 { │ │ │ │ │ -86 return values; │ │ │ │ │ -87 } │ │ │ │ │ -88 │ │ │ │ │ -95 Index* getRowIndex() const │ │ │ │ │ -96 { │ │ │ │ │ -97 return rowindex; │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -106 Index* getColStart() const │ │ │ │ │ -107 { │ │ │ │ │ -108 return colstart; │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -112 BCCSMatrix& operator=(const BCCSMatrix& _m_a_t) │ │ │ │ │ -113 { │ │ │ │ │ -114 if(N_+M_+Nnz_!=0) │ │ │ │ │ -115 free(); │ │ │ │ │ -116 N_=_m_a_t.N_; │ │ │ │ │ -117 M_=_m_a_t.M_; │ │ │ │ │ -118 Nnz_= _m_a_t.Nnz_; │ │ │ │ │ -119 if(M_>0) { │ │ │ │ │ -120 colstart=new size_type[M_+1]; │ │ │ │ │ -121 for(size_type i=0; i<=M_; ++i) │ │ │ │ │ -122 colstart[i]=_m_a_t.colstart[i]; │ │ │ │ │ -123 } │ │ │ │ │ -124 │ │ │ │ │ -125 if(Nnz_>0) { │ │ │ │ │ -126 values = new B[Nnz_]; │ │ │ │ │ -127 rowindex = new size_type[Nnz_]; │ │ │ │ │ -128 │ │ │ │ │ -129 for(size_type i=0; i │ │ │ │ │ +7#include │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +_1_1namespace _D_u_n_e { │ │ │ │ │ +12 │ │ │ │ │ +13 template │ │ │ │ │ +_1_4 struct _e_x_i_s_t_s{ │ │ │ │ │ +_1_5 static const bool _v_a_l_u_e = true; │ │ │ │ │ +16 }; │ │ │ │ │ +17 │ │ │ │ │ +18 template │ │ │ │ │ +_1_9 struct _D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s │ │ │ │ │ +20 { │ │ │ │ │ +_2_1 using _t_y_p_e = std::allocator; │ │ │ │ │ +22 }; │ │ │ │ │ +23 │ │ │ │ │ +24 template │ │ │ │ │ +_2_5 struct _D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s > │ │ │ │ │ +26 { │ │ │ │ │ +_2_7 using _t_y_p_e = typename T::allocator_type; │ │ │ │ │ +28 }; │ │ │ │ │ +29 │ │ │ │ │ +30 template │ │ │ │ │ +_3_1 struct _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s : public _D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s {}; │ │ │ │ │ +32 │ │ │ │ │ +33 template │ │ │ │ │ +_3_4 using _A_l_l_o_c_a_t_o_r_T_y_p_e = typename _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_T_>_:_:_t_y_p_e; │ │ │ │ │ +35 │ │ │ │ │ +36 template │ │ │ │ │ +_3_7 using _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e = typename std::allocator_traits::type>::template rebind_alloc; │ │ │ │ │ +38 │ │ │ │ │ +39} // end namespace Dune │ │ │ │ │ +40 │ │ │ │ │ +41#endif // DUNE_ISTL_ALLOCATOR_HH │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e │ │ │ │ │ +typename std::allocator_traits< typename AllocatorTraits< T >::type >::template │ │ │ │ │ +rebind_alloc< X > ReboundAllocatorType │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_y_p_e │ │ │ │ │ +typename AllocatorTraits< T >::type AllocatorType │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_e_x_i_s_t_s │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:14 │ │ │ │ │ +_D_u_n_e_:_:_e_x_i_s_t_s_:_:_v_a_l_u_e │ │ │ │ │ +static const bool value │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:15 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:20 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ +std::allocator< T > type │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:21 │ │ │ │ │ +_D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _t_y_p_e_n_a_m_e_ _T_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e_ _>_ _>_:_: │ │ │ │ │ +_t_y_p_e │ │ │ │ │ +typename T::allocator_type type │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:31 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00038.html │ │ │ │ @@ -77,17 +77,17 @@ │ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Macros | │ │ │ │ Functions │ │ │ │
solverregistry.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/istl/common/registry.hh>
│ │ │ │ -#include <dune/istl/preconditioner.hh>
│ │ │ │ -#include <dune/istl/solver.hh>
│ │ │ │ +
#include <dune/istl/common/registry.hh>
│ │ │ │ +#include <dune/istl/preconditioner.hh>
│ │ │ │ +#include <dune/istl/solver.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -97,19 +97,19 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::UnsupportedType
 

│ │ │ │ Namespaces

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

│ │ │ │ Macros

#define DUNE_REGISTER_DIRECT_SOLVER(name, ...)    DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
#define DUNE_REGISTER_DIRECT_SOLVER(name, ...)    DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
 
#define DUNE_REGISTER_PRECONDITIONER(name, ...)    DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)
#define DUNE_REGISTER_PRECONDITIONER(name, ...)    DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)
 
#define DUNE_REGISTER_ITERATIVE_SOLVER(name, ...)    DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
#define DUNE_REGISTER_ITERATIVE_SOLVER(name, ...)    DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -138,15 +138,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Functions

template<template< class, class, class, int >class Preconditioner, int blockLevel = 1>
auto Dune::defaultPreconditionerBlockLevelCreator ()
 
 ... 
)    DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)    DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ @@ -166,15 +166,15 @@ │ │ │ │ │ │ │ │   │ │ │ │ ...  │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ) │ │ │ │ -     DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__) │ │ │ │ +     DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__) │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ @@ -194,15 +194,15 @@ │ │ │ │ │ │ │ │   │ │ │ │ ...  │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ) │ │ │ │ -     DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__) │ │ │ │ +     DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__) │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00038_source.html │ │ │ │ @@ -85,17 +85,17 @@ │ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
5
│ │ │ │
6#ifndef DUNE_ISTL_SOLVERREGISTRY_HH
│ │ │ │
7#define DUNE_ISTL_SOLVERREGISTRY_HH
│ │ │ │
8
│ │ │ │ - │ │ │ │ - │ │ │ │ -
11#include <dune/istl/solver.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
11#include <dune/istl/solver.hh>
│ │ │ │
12
│ │ │ │
│ │ │ │
13#define DUNE_REGISTER_DIRECT_SOLVER(name, ...) \
│ │ │ │
14 DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
│ │ │ │
│ │ │ │
15
│ │ │ │
│ │ │ │ @@ -167,17 +167,17 @@ │ │ │ │
76 */
│ │ │ │
77 class UnsupportedType : public NotImplemented {};
│ │ │ │
78
│ │ │ │
79 class InvalidSolverFactoryConfiguration : public InvalidStateException{};
│ │ │ │
80} // end namespace Dune
│ │ │ │
81
│ │ │ │
82#endif // DUNE_ISTL_SOLVERREGISTRY_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Define general, extensible interface for inverse operators.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Define general, extensible interface for inverse operators.
│ │ │ │
auto defaultIterativeSolverCreator()
Definition solverregistry.hh:59
│ │ │ │
auto defaultPreconditionerBlockLevelCreator()
Definition solverregistry.hh:33
│ │ │ │
auto defaultPreconditionerCreator()
Definition solverregistry.hh:46
│ │ │ │
Definition allocator.hh:11
│ │ │ │
constexpr std::size_t blockLevel()
Determine the block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:176
│ │ │ │
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │
Definition solverregistry.hh:77
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -86,16 +86,16 @@ │ │ │ │ │ 76 */ │ │ │ │ │ _7_7 class _U_n_s_u_p_p_o_r_t_e_d_T_y_p_e : public NotImplemented {}; │ │ │ │ │ 78 │ │ │ │ │ _7_9 class _I_n_v_a_l_i_d_S_o_l_v_e_r_F_a_c_t_o_r_y_C_o_n_f_i_g_u_r_a_t_i_o_n : public InvalidStateException{}; │ │ │ │ │ 80} // end namespace Dune │ │ │ │ │ 81 │ │ │ │ │ 82#endif // DUNE_ISTL_SOLVERREGISTRY_HH │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ _r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ _s_o_l_v_e_r_._h_h │ │ │ │ │ Define general, extensible interface for inverse operators. │ │ │ │ │ _D_u_n_e_:_:_d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r │ │ │ │ │ auto defaultIterativeSolverCreator() │ │ │ │ │ DDeeffiinniittiioonn solverregistry.hh:59 │ │ │ │ │ _D_u_n_e_:_:_d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r │ │ │ │ │ auto defaultPreconditionerBlockLevelCreator() │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00041.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: scalarproducts.hh File Reference │ │ │ │ +dune-istl: multitypeblockvector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,69 +73,56 @@ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ +
multitypeblockvector.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Define base class for scalar product and norm. │ │ │ │ -More...

│ │ │ │
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ #include <iostream>
│ │ │ │ -#include <iomanip>
│ │ │ │ -#include <string>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/shared_ptr.hh>
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include "solvercategory.hh"
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <dune/common/dotproduct.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include "gsetc.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ScalarProduct< X >
 Base class for scalar product and norm computation. More...
 
class  Dune::ParallelScalarProduct< X, C >
 Scalar product for overlapping Schwarz methods. More...
struct  Dune::FieldTraits< MultiTypeBlockVector< Args... > >
 
class  Dune::SeqScalarProduct< X >
 Default implementation for the scalar case. More...
class  Dune::MultiTypeBlockVector< Args >
 A Vector class to support different block types. More...
 
class  Dune::NonoverlappingSchwarzScalarProduct< X, C >
 Nonoverlapping Scalar Product with communication object. More...
 
class  Dune::OverlappingSchwarzScalarProduct< X, C >
 Scalar product for overlapping Schwarz methods. More...
struct  std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > >
 Make std::tuple_element work for MultiTypeBlockVector. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  std
 STL namespace.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class X , class Comm >
std::shared_ptr< ScalarProduct< X > > Dune::makeScalarProduct (std::shared_ptr< const Comm > comm, SolverCategory::Category category)
 Choose the approriate scalar product for a solver category.
 
template<class X , class Comm >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const Comm &comm, SolverCategory::Category category)
 
template<typename... Args>
std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockVector< Args... > &v)
 Send MultiTypeBlockVector to an outstream.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Define base class for scalar product and norm.

│ │ │ │ -

These classes have to be implemented differently for different data partitioning strategies. Default implementations for the sequential case are provided.

│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,60 +1,42 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _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 │ │ │ │ │ -scalarproducts.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _S_c_a_l_a_r_ _p_r_o_d_u_c_t_s │ │ │ │ │ -Define base class for scalar product and norm. _M_o_r_e_._._. │ │ │ │ │ +multitypeblockvector.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include "_g_s_e_t_c_._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_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_ _> │ │ │ │ │ -  Base class for scalar product and norm computation. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_,_ _C_ _> │ │ │ │ │ -  Scalar product for overlapping Schwarz methods. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_ _> │ │ │ │ │ +  A Vector class to support different block types. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_ _> │ │ │ │ │ -  Default implementation for the scalar case. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_,_ _C_ _> │ │ │ │ │ -  Nonoverlapping Scalar Product with communication object. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_<_ _X_,_ _C_ _> │ │ │ │ │ -  Scalar product for overlapping Schwarz methods. _M_o_r_e_._._. │ │ │ │ │ +struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ +  Make std::tuple_element work for MultiTypeBlockVector. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _s_t_d │ │ │ │ │ +  STL namespace. │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_m_a_k_e_S_c_a_l_a_r_P_r_o_d_u_c_t (std:: │ │ │ │ │ - shared_ptr< const Comm > comm, │ │ │ │ │ - _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category) │ │ │ │ │ -  Choose the approriate scalar product for │ │ │ │ │ - a solver category. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const Comm │ │ │ │ │ - &comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ - category) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ -These classes have to be implemented differently for different data │ │ │ │ │ -partitioning strategies. Default implementations for the sequential case are │ │ │ │ │ -provided. │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r< │ │ │ │ │ + Args... > &v) │ │ │ │ │ +  Send _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r to an outstream. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: scalarproducts.hh Source File │ │ │ │ +dune-istl: multitypeblockvector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,224 +74,354 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
scalarproducts.hh
│ │ │ │ +
multitypeblockvector.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH
│ │ │ │ -
6#define DUNE_ISTL_SCALARPRODUCTS_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
│ │ │ │ +
6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
│ │ │ │
7
│ │ │ │
8#include <cmath>
│ │ │ │ -
9#include <complex>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <iomanip>
│ │ │ │ -
12#include <string>
│ │ │ │ -
13#include <memory>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/exceptions.hh>
│ │ │ │ -
16#include <dune/common/shared_ptr.hh>
│ │ │ │ +
9#include <iostream>
│ │ │ │ +
10#include <tuple>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/dotproduct.hh>
│ │ │ │ +
13#include <dune/common/ftraits.hh>
│ │ │ │ +
14#include <dune/common/hybridutilities.hh>
│ │ │ │ +
15#include <dune/common/typetraits.hh>
│ │ │ │ +
16#include <dune/common/std/type_traits.hh>
│ │ │ │
17
│ │ │ │ -
18#include "bvector.hh"
│ │ │ │ -
19#include "solvercategory.hh"
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
51 template<class X>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
53 public:
│ │ │ │ -
55 typedef X domain_type;
│ │ │ │ -
56 typedef typename X::field_type field_type;
│ │ │ │ -
57 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ -
58
│ │ │ │ -
│ │ │ │ -
63 virtual field_type dot (const X& x, const X& y) const
│ │ │ │ -
64 {
│ │ │ │ -
65 return x.dot(y);
│ │ │ │ -
66 }
│ │ │ │ -
│ │ │ │ -
67
│ │ │ │ -
│ │ │ │ -
71 virtual real_type norm (const X& x) const
│ │ │ │ -
72 {
│ │ │ │ -
73 return x.two_norm();
│ │ │ │ -
74 }
│ │ │ │ -
│ │ │ │ -
75
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
78 {
│ │ │ │ - │ │ │ │ -
80 }
│ │ │ │ -
│ │ │ │ -
81
│ │ │ │ -
83 virtual ~ScalarProduct () {}
│ │ │ │ -
84 };
│ │ │ │ -
│ │ │ │ -
85
│ │ │ │ -
97 template<class X, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
99 {
│ │ │ │ -
100 public:
│ │ │ │ -
105 typedef X domain_type;
│ │ │ │ -
107 typedef typename X::field_type field_type;
│ │ │ │ -
108 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ - │ │ │ │ -
114
│ │ │ │ -
│ │ │ │ -
120 ParallelScalarProduct (std::shared_ptr<const communication_type> com, SolverCategory::Category cat)
│ │ │ │ -
121 : _communication(com), _category(cat)
│ │ │ │ -
122 {}
│ │ │ │ -
│ │ │ │ -
123
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
131 : ParallelScalarProduct(stackobject_to_shared_ptr(com), cat)
│ │ │ │ -
132 {}
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ -
139 virtual field_type dot (const X& x, const X& y) const override
│ │ │ │ -
140 {
│ │ │ │ -
141 field_type result(0);
│ │ │ │ -
142 _communication->dot(x,y,result); // explicitly loop and apply masking
│ │ │ │ -
143 return result;
│ │ │ │ -
144 }
│ │ │ │ +
18#include "istlexception.hh"
│ │ │ │ +
19
│ │ │ │ +
20// forward declaration
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
22 template < typename... Args >
│ │ │ │ +
23 class MultiTypeBlockVector;
│ │ │ │ +
24}
│ │ │ │ +
25
│ │ │ │ +
26#include "gsetc.hh"
│ │ │ │ +
27
│ │ │ │ +
28namespace Dune {
│ │ │ │ +
29
│ │ │ │ +
41 template <typename... Args>
│ │ │ │ +
│ │ │ │ +
42 struct FieldTraits< MultiTypeBlockVector<Args...> >
│ │ │ │ +
43 {
│ │ │ │ +
44 using field_type = typename MultiTypeBlockVector<Args...>::field_type;
│ │ │ │ +
45 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
46 };
│ │ │ │ +
│ │ │ │ +
56 template < typename... Args >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
58 : public std::tuple<Args...>
│ │ │ │ +
59 {
│ │ │ │ +
61 typedef std::tuple<Args...> TupleType;
│ │ │ │ +
62 public:
│ │ │ │ +
63
│ │ │ │ +
65 using size_type = std::size_t;
│ │ │ │ +
66
│ │ │ │ +
70 using TupleType::TupleType;
│ │ │ │ +
71
│ │ │ │ +
75 typedef MultiTypeBlockVector<Args...> type;
│ │ │ │ +
76
│ │ │ │ +
82 using field_type = Std::detected_t<std::common_type_t, typename FieldTraits< std::decay_t<Args> >::field_type...>;
│ │ │ │ +
83
│ │ │ │ +
84 // make sure that we have an std::common_type: using an assertion produces a more readable error message
│ │ │ │ +
85 // than a compiler template instantiation error
│ │ │ │ +
86 static_assert ( sizeof...(Args) == 0 or not std::is_same_v<field_type, Std::nonesuch>,
│ │ │ │ +
87 "No std::common_type implemented for the given field_types of the Args. Please provide an implementation and check that a FieldTraits class is present for your type.");
│ │ │ │ +
88
│ │ │ │ +
89
│ │ │ │ +
│ │ │ │ +
95 static constexpr size_type size()
│ │ │ │ +
96 {
│ │ │ │ +
97 return sizeof...(Args);
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
│ │ │ │ +
102 static constexpr size_type N()
│ │ │ │ +
103 {
│ │ │ │ +
104 return sizeof...(Args);
│ │ │ │ +
105 }
│ │ │ │ +
│ │ │ │ +
106
│ │ │ │ +
113 [[deprecated("Use method 'N' instead")]]
│ │ │ │ +
│ │ │ │ +
114 int count() const
│ │ │ │ +
115 {
│ │ │ │ +
116 return sizeof...(Args);
│ │ │ │ +
117 }
│ │ │ │
│ │ │ │ -
145
│ │ │ │ +
118
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
121 {
│ │ │ │ +
122 size_type result = 0;
│ │ │ │ +
123 Hybrid::forEach(std::make_index_sequence<N()>{},
│ │ │ │ +
124 [&](auto i){result += std::get<i>(*this).dim();});
│ │ │ │ +
125
│ │ │ │ +
126 return result;
│ │ │ │ +
127 }
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
147 template< size_type index >
│ │ │ │ +
148 typename std::tuple_element<index,TupleType>::type&
│ │ │ │
│ │ │ │ -
149 virtual real_type norm (const X& x) const override
│ │ │ │ -
150 {
│ │ │ │ -
151 return _communication->norm(x);
│ │ │ │ +
149 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
│ │ │ │ +
150 {
│ │ │ │ +
151 return std::get<index>(*this);
│ │ │ │
152 }
│ │ │ │
│ │ │ │
153
│ │ │ │ -
│ │ │ │ -
155 virtual SolverCategory::Category category() const override
│ │ │ │ -
156 {
│ │ │ │ -
157 return _category;
│ │ │ │ -
158 }
│ │ │ │ -
│ │ │ │ -
159
│ │ │ │ -
160 private:
│ │ │ │ -
161 std::shared_ptr<const communication_type> _communication;
│ │ │ │ -
162 SolverCategory::Category _category;
│ │ │ │ -
163 };
│ │ │ │ -
│ │ │ │ -
164
│ │ │ │ -
166 template<class X>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
168 {
│ │ │ │ -
169 using ScalarProduct<X>::ScalarProduct;
│ │ │ │ -
170 };
│ │ │ │ -
│ │ │ │ -
171
│ │ │ │ -
177 template<class X, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
179 {
│ │ │ │ -
180 public:
│ │ │ │ -
│ │ │ │ -
181 NonoverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
│ │ │ │ -
182 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
│ │ │ │ -
│ │ │ │ -
183
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
185 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
│ │ │ │ -
│ │ │ │ -
186 };
│ │ │ │ -
│ │ │ │ -
187
│ │ │ │ -
199 template<class X, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
201 {
│ │ │ │ -
202 public:
│ │ │ │ -
│ │ │ │ -
203 OverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
│ │ │ │ -
204 ParallelScalarProduct<X,C>(comm, SolverCategory::overlapping) {}
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
207 ParallelScalarProduct<X,C>(comm,SolverCategory::overlapping) {}
│ │ │ │ -
│ │ │ │ -
208 };
│ │ │ │ -
│ │ │ │ -
209
│ │ │ │ -
223 template<class X, class Comm>
│ │ │ │ -
│ │ │ │ -
224 std::shared_ptr<ScalarProduct<X>> makeScalarProduct(std::shared_ptr<const Comm> comm, SolverCategory::Category category)
│ │ │ │ -
225 {
│ │ │ │ -
226 switch(category)
│ │ │ │ -
227 {
│ │ │ │ - │ │ │ │ -
229 return
│ │ │ │ -
230 std::make_shared<ScalarProduct<X>>();
│ │ │ │ -
231 default:
│ │ │ │ -
232 return
│ │ │ │ -
233 std::make_shared<ParallelScalarProduct<X,Comm>>(comm,category);
│ │ │ │ +
159 template< size_type index >
│ │ │ │ +
160 const typename std::tuple_element<index,TupleType>::type&
│ │ │ │ +
│ │ │ │ +
161 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
│ │ │ │ +
162 {
│ │ │ │ +
163 return std::get<index>(*this);
│ │ │ │ +
164 }
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
168 template<typename T>
│ │ │ │ +
│ │ │ │ +
169 void operator= (const T& newval) {
│ │ │ │ +
170 Dune::Hybrid::forEach(*this, [&](auto&& entry) {
│ │ │ │ +
171 entry = newval;
│ │ │ │ +
172 });
│ │ │ │ +
173 }
│ │ │ │ +
│ │ │ │ +
174
│ │ │ │ +
│ │ │ │ +
178 void operator+= (const type& newv) {
│ │ │ │ +
179 using namespace Dune::Hybrid;
│ │ │ │ +
180 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
│ │ │ │ +
181 (*this)[i] += newv[i];
│ │ │ │ +
182 });
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184
│ │ │ │ +
│ │ │ │ +
188 void operator-= (const type& newv) {
│ │ │ │ +
189 using namespace Dune::Hybrid;
│ │ │ │ +
190 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
│ │ │ │ +
191 (*this)[i] -= newv[i];
│ │ │ │ +
192 });
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194
│ │ │ │ +
196 template<class T,
│ │ │ │ +
197 std::enable_if_t< IsNumber<T>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
198 void operator*= (const T& w) {
│ │ │ │ +
199 Hybrid::forEach(*this, [&](auto&& entry) {
│ │ │ │ +
200 entry *= w;
│ │ │ │ +
201 });
│ │ │ │ +
202 }
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
205 template<class T,
│ │ │ │ +
206 std::enable_if_t< IsNumber<T>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
207 void operator/= (const T& w) {
│ │ │ │ +
208 Hybrid::forEach(*this, [&](auto&& entry) {
│ │ │ │ +
209 entry /= w;
│ │ │ │ +
210 });
│ │ │ │ +
211 }
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
│ │ │ │ +
213 field_type operator* (const type& newv) const {
│ │ │ │ +
214 using namespace Dune::Hybrid;
│ │ │ │ +
215 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
│ │ │ │ +
216 return a + (*this)[i]*newv[i];
│ │ │ │ +
217 });
│ │ │ │ +
218 }
│ │ │ │ +
│ │ │ │ +
219
│ │ │ │ +
│ │ │ │ +
220 field_type dot (const type& newv) const {
│ │ │ │ +
221 using namespace Dune::Hybrid;
│ │ │ │ +
222 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
│ │ │ │ +
223 return a + (*this)[i].dot(newv[i]);
│ │ │ │ +
224 });
│ │ │ │ +
225 }
│ │ │ │ +
│ │ │ │ +
226
│ │ │ │ +
│ │ │ │ +
229 auto one_norm() const {
│ │ │ │ +
230 using namespace Dune::Hybrid;
│ │ │ │ +
231 return accumulate(*this, typename FieldTraits<field_type>::real_type(0), [&](auto&& a, auto&& entry) {
│ │ │ │ +
232 return a + entry.one_norm();
│ │ │ │ +
233 });
│ │ │ │
234 }
│ │ │ │ -
235 }
│ │ │ │
│ │ │ │ -
236
│ │ │ │ -
241 template<class X, class Comm>
│ │ │ │ -
│ │ │ │ -
242 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const Comm& comm, SolverCategory::Category category)
│ │ │ │ -
243 { return makeScalarProduct<X>(stackobject_to_shared_ptr(comm), category); }
│ │ │ │ +
235
│ │ │ │ +
│ │ │ │ +
238 auto one_norm_real() const {
│ │ │ │ +
239 using namespace Dune::Hybrid;
│ │ │ │ +
240 return accumulate(*this, typename FieldTraits<field_type>::real_type(0), [&](auto&& a, auto&& entry) {
│ │ │ │ +
241 return a + entry.one_norm_real();
│ │ │ │ +
242 });
│ │ │ │ +
243 }
│ │ │ │
│ │ │ │
244
│ │ │ │ -
245} // end namespace Dune
│ │ │ │ -
246
│ │ │ │ -
247#endif
│ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
│ │ │ │ +
247 typename FieldTraits<field_type>::real_type two_norm2() const {
│ │ │ │ +
248 using namespace Dune::Hybrid;
│ │ │ │ +
249 return accumulate(*this, typename FieldTraits<field_type>::real_type(0), [&](auto&& a, auto&& entry) {
│ │ │ │ +
250 return a + entry.two_norm2();
│ │ │ │ +
251 });
│ │ │ │ +
252 }
│ │ │ │ +
│ │ │ │ +
253
│ │ │ │ +
256 typename FieldTraits<field_type>::real_type two_norm() const {return sqrt(this->two_norm2());}
│ │ │ │ +
257
│ │ │ │ +
│ │ │ │ +
260 typename FieldTraits<field_type>::real_type infinity_norm() const
│ │ │ │ +
261 {
│ │ │ │ +
262 using namespace Dune::Hybrid;
│ │ │ │ +
263 using std::max;
│ │ │ │ +
264 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
265
│ │ │ │ +
266 real_type result = 0.0;
│ │ │ │ +
267 // Compute max norm tracking appearing nan values
│ │ │ │ +
268 // if the field type supports nan.
│ │ │ │ +
269 if constexpr (HasNaN<field_type>()) {
│ │ │ │ +
270 // This variable will preserve any nan value
│ │ │ │ +
271 real_type nanTracker = 1.0;
│ │ │ │ +
272 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
273 forEach(*this, [&](auto&& entry) {
│ │ │ │ +
274 real_type entryNorm = entry.infinity_norm();
│ │ │ │ +
275 result = max(entryNorm, result);
│ │ │ │ +
276 nanTracker += entryNorm;
│ │ │ │ +
277 });
│ │ │ │ +
278 // Incorporate possible nan value into result
│ │ │ │ +
279 result *= (nanTracker / nanTracker);
│ │ │ │ +
280 } else {
│ │ │ │ +
281 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
282 forEach(*this, [&](auto&& entry) {
│ │ │ │ +
283 result = max(entry.infinity_norm(), result);
│ │ │ │ +
284 });
│ │ │ │ +
285 }
│ │ │ │ +
286 return result;
│ │ │ │ +
287 }
│ │ │ │ +
│ │ │ │ +
288
│ │ │ │ +
│ │ │ │ +
291 typename FieldTraits<field_type>::real_type infinity_norm_real() const
│ │ │ │ +
292 {
│ │ │ │ +
293 using namespace Dune::Hybrid;
│ │ │ │ +
294 using std::max;
│ │ │ │ +
295 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
296
│ │ │ │ +
297 real_type result = 0.0;
│ │ │ │ +
298 // Compute max norm tracking appearing nan values
│ │ │ │ +
299 // if the field type supports nan.
│ │ │ │ +
300 if constexpr (HasNaN<field_type>()) {
│ │ │ │ +
301 // This variable will preserve any nan value
│ │ │ │ +
302 real_type nanTracker = 1.0;
│ │ │ │ +
303 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
304 forEach(*this, [&](auto&& entry) {
│ │ │ │ +
305 real_type entryNorm = entry.infinity_norm_real();
│ │ │ │ +
306 result = max(entryNorm, result);
│ │ │ │ +
307 nanTracker += entryNorm;
│ │ │ │ +
308 });
│ │ │ │ +
309 // Incorporate possible nan value into result
│ │ │ │ +
310 result *= (nanTracker / nanTracker);
│ │ │ │ +
311 } else {
│ │ │ │ +
312 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
313 forEach(*this, [&](auto&& entry) {
│ │ │ │ +
314 result = max(entry.infinity_norm_real(), result);
│ │ │ │ +
315 });
│ │ │ │ +
316 }
│ │ │ │ +
317 return result;
│ │ │ │ +
318 }
│ │ │ │ +
│ │ │ │ +
319
│ │ │ │ +
324 template<typename Ta>
│ │ │ │ +
│ │ │ │ +
325 void axpy (const Ta& a, const type& y) {
│ │ │ │ +
326 using namespace Dune::Hybrid;
│ │ │ │ +
327 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
│ │ │ │ +
328 (*this)[i].axpy(a, y[i]);
│ │ │ │ +
329 });
│ │ │ │ +
330 }
│ │ │ │ +
│ │ │ │ +
331
│ │ │ │ +
332 };
│ │ │ │ +
│ │ │ │ +
333
│ │ │ │ +
334
│ │ │ │ +
335
│ │ │ │ +
338 template <typename... Args>
│ │ │ │ +
│ │ │ │ +
339 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockVector<Args...>& v) {
│ │ │ │ +
340 using namespace Dune::Hybrid;
│ │ │ │ +
341 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) {
│ │ │ │ +
342 s << "\t(" << i << "):\n" << v[i] << "\n";
│ │ │ │ +
343 });
│ │ │ │ +
344 return s;
│ │ │ │ +
345 }
│ │ │ │ +
│ │ │ │ +
346
│ │ │ │ +
347} // end namespace Dune
│ │ │ │ +
348
│ │ │ │ +
349namespace std
│ │ │ │ +
350{
│ │ │ │ +
355 template <size_t i, typename... Args>
│ │ │ │ +
│ │ │ │ +
356 struct tuple_element<i,Dune::MultiTypeBlockVector<Args...> >
│ │ │ │ +
357 {
│ │ │ │ +
358 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
│ │ │ │ +
359 };
│ │ │ │ +
│ │ │ │ +
360}
│ │ │ │ +
361
│ │ │ │ +
362#endif
│ │ │ │ + │ │ │ │ +
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ +
void operator=(const T &newval)
Assignment operator.
Definition multitypeblockvector.hh:169
│ │ │ │ +
std::size_t size_type
Type used for vector sizes.
Definition multitypeblockvector.hh:65
│ │ │ │ +
typename FieldTraits< field_type >::real_type real_type
Definition multitypeblockvector.hh:45
│ │ │ │ +
int count() const
Definition multitypeblockvector.hh:114
│ │ │ │ +
static constexpr size_type N()
Number of elements.
Definition multitypeblockvector.hh:102
│ │ │ │ +
Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args > >::field_type... > field_type
The type used for scalars.
Definition multitypeblockvector.hh:82
│ │ │ │ +
static constexpr size_type size()
Return the number of non-zero vector entries.
Definition multitypeblockvector.hh:95
│ │ │ │ +
std::tuple_element< index, TupleType >::type & operator[](const std::integral_constant< size_type, index > indexVariable)
Random-access operator.
Definition multitypeblockvector.hh:149
│ │ │ │ +
FieldTraits< field_type >::real_type two_norm() const
Compute the Euclidean norm.
Definition multitypeblockvector.hh:256
│ │ │ │ +
typename MultiTypeBlockVector< Args... >::field_type field_type
Definition multitypeblockvector.hh:44
│ │ │ │ +
size_type dim() const
Number of scalar elements.
Definition multitypeblockvector.hh:120
│ │ │ │ +
field_type dot(const type &newv) const
Definition multitypeblockvector.hh:220
│ │ │ │ +
void operator*=(const T &w)
Multiplication with a scalar.
Definition multitypeblockvector.hh:198
│ │ │ │ +
void axpy(const Ta &a, const type &y)
Axpy operation on this vector (*this += a * y)
Definition multitypeblockvector.hh:325
│ │ │ │ +
void operator/=(const T &w)
Division by a scalar.
Definition multitypeblockvector.hh:207
│ │ │ │ +
MultiTypeBlockVector< Args... > type
Definition multitypeblockvector.hh:75
│ │ │ │ +
FieldTraits< field_type >::real_type infinity_norm_real() const
Compute the simplified maximum norm (uses 1-norm for complex values)
Definition multitypeblockvector.hh:291
│ │ │ │ +
auto one_norm() const
Compute the 1-norm.
Definition multitypeblockvector.hh:229
│ │ │ │ +
void operator-=(const type &newv)
Definition multitypeblockvector.hh:188
│ │ │ │ +
field_type operator*(const type &newv) const
Definition multitypeblockvector.hh:213
│ │ │ │ +
void operator+=(const type &newv)
Definition multitypeblockvector.hh:178
│ │ │ │ +
typename std::tuple_element< i, std::tuple< Args... > >::type type
Definition multitypeblockvector.hh:358
│ │ │ │ +
FieldTraits< field_type >::real_type infinity_norm() const
Compute the maximum norm.
Definition multitypeblockvector.hh:260
│ │ │ │ +
auto one_norm_real() const
Compute the simplified 1-norm (uses 1-norm also for complex values)
Definition multitypeblockvector.hh:238
│ │ │ │ +
FieldTraits< field_type >::real_type two_norm2() const
Compute the squared Euclidean norm.
Definition multitypeblockvector.hh:247
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
Definition scalarproducts.hh:242
│ │ │ │ -
std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const Comm > comm, SolverCategory::Category category)
Choose the approriate scalar product for a solver category.
Definition scalarproducts.hh:224
│ │ │ │ -
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ -
virtual field_type dot(const X &x, const X &y) const
Dot product of two vectors. It is assumed that the vectors are consistent on the interior+border part...
Definition scalarproducts.hh:63
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the scalar product (see SolverCategory::Category)
Definition scalarproducts.hh:77
│ │ │ │ -
X::field_type field_type
Definition scalarproducts.hh:56
│ │ │ │ -
X domain_type
export types, they come from the derived class
Definition scalarproducts.hh:55
│ │ │ │ -
virtual ~ScalarProduct()
every abstract base class has a virtual destructor
Definition scalarproducts.hh:83
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
Definition scalarproducts.hh:57
│ │ │ │ -
virtual real_type norm(const X &x) const
Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.
Definition scalarproducts.hh:71
│ │ │ │ -
Scalar product for overlapping Schwarz methods.
Definition scalarproducts.hh:99
│ │ │ │ -
virtual field_type dot(const X &x, const X &y) const override
Dot product of two vectors. It is assumed that the vectors are consistent on the interior+border part...
Definition scalarproducts.hh:139
│ │ │ │ -
virtual SolverCategory::Category category() const override
Category of the scalar product (see SolverCategory::Category)
Definition scalarproducts.hh:155
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
Definition scalarproducts.hh:108
│ │ │ │ -
C communication_type
The type of the communication object.
Definition scalarproducts.hh:113
│ │ │ │ -
ParallelScalarProduct(const communication_type &com, SolverCategory::Category cat)
Definition scalarproducts.hh:130
│ │ │ │ -
X domain_type
The type of the vector to compute the scalar product on.
Definition scalarproducts.hh:105
│ │ │ │ -
ParallelScalarProduct(std::shared_ptr< const communication_type > com, SolverCategory::Category cat)
Definition scalarproducts.hh:120
│ │ │ │ -
X::field_type field_type
The field type used by the vector type domain_type.
Definition scalarproducts.hh:107
│ │ │ │ -
virtual real_type norm(const X &x) const override
Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.
Definition scalarproducts.hh:149
│ │ │ │ -
Default implementation for the scalar case.
Definition scalarproducts.hh:168
│ │ │ │ -
Nonoverlapping Scalar Product with communication object.
Definition scalarproducts.hh:179
│ │ │ │ -
NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
Definition scalarproducts.hh:181
│ │ │ │ -
NonoverlappingSchwarzScalarProduct(const C &comm)
Definition scalarproducts.hh:184
│ │ │ │ -
Scalar product for overlapping Schwarz methods.
Definition scalarproducts.hh:201
│ │ │ │ -
OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
Definition scalarproducts.hh:203
│ │ │ │ -
OverlappingSchwarzScalarProduct(const C &comm)
Definition scalarproducts.hh:206
│ │ │ │ -
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
Send BlockVector to an output stream.
Definition bvector.hh:590
│ │ │ │ +
A Vector class to support different block types.
Definition multitypeblockvector.hh:59
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,269 +1,393 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -scalarproducts.hh │ │ │ │ │ +multitypeblockvector.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH │ │ │ │ │ -6#define DUNE_ISTL_SCALARPRODUCTS_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH │ │ │ │ │ +6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH │ │ │ │ │ 7 │ │ │ │ │ 8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ -18#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -19#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ -20 │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 class _S_c_a_l_a_r_P_r_o_d_u_c_t { │ │ │ │ │ -53 public: │ │ │ │ │ -_5_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_5_6 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_5_7 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -58 │ │ │ │ │ -_6_3 virtual _f_i_e_l_d___t_y_p_e _d_o_t (const X& x, const X& y) const │ │ │ │ │ -64 { │ │ │ │ │ -65 return x.dot(y); │ │ │ │ │ -66 } │ │ │ │ │ -67 │ │ │ │ │ -_7_1 virtual _r_e_a_l___t_y_p_e _n_o_r_m (const X& x) const │ │ │ │ │ -72 { │ │ │ │ │ -73 return x.two_norm(); │ │ │ │ │ -74 } │ │ │ │ │ -75 │ │ │ │ │ -_7_7 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -78 { │ │ │ │ │ -79 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -80 } │ │ │ │ │ -81 │ │ │ │ │ -_8_3 virtual _~_S_c_a_l_a_r_P_r_o_d_u_c_t () {} │ │ │ │ │ -84 }; │ │ │ │ │ -85 │ │ │ │ │ -97 template │ │ │ │ │ -_9_8 class _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t : public _S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -99 { │ │ │ │ │ -100 public: │ │ │ │ │ -_1_0_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_1_0_7 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_0_8 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -_1_1_3 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ -114 │ │ │ │ │ -_1_2_0 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t (std::shared_ptr com, │ │ │ │ │ -_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat) │ │ │ │ │ -121 : _communication(com), _category(cat) │ │ │ │ │ -122 {} │ │ │ │ │ -123 │ │ │ │ │ -_1_3_0 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t (const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ -_C_a_t_e_g_o_r_y cat) │ │ │ │ │ -131 : _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(stackobject_to_shared_ptr(com), cat) │ │ │ │ │ -132 {} │ │ │ │ │ -133 │ │ │ │ │ -134 │ │ │ │ │ -_1_3_9 virtual _f_i_e_l_d___t_y_p_e _d_o_t (const X& x, const X& y) const override │ │ │ │ │ -140 { │ │ │ │ │ -141 _f_i_e_l_d___t_y_p_e result(0); │ │ │ │ │ -142 _communication->dot(x,y,result); // explicitly loop and apply masking │ │ │ │ │ -143 return result; │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -_1_4_9 virtual _r_e_a_l___t_y_p_e _n_o_r_m (const X& x) const override │ │ │ │ │ +18#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +19 │ │ │ │ │ +20// forward declaration │ │ │ │ │ +21namespace _D_u_n_e { │ │ │ │ │ +22 template < typename... Args > │ │ │ │ │ +23 class MultiTypeBlockVector; │ │ │ │ │ +24} │ │ │ │ │ +25 │ │ │ │ │ +26#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +27 │ │ │ │ │ +28namespace _D_u_n_e { │ │ │ │ │ +29 │ │ │ │ │ +41 template │ │ │ │ │ +_4_2 struct FieldTraits< _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ +43 { │ │ │ │ │ +_4_4 using _f_i_e_l_d___t_y_p_e = typename _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r::field_type; │ │ │ │ │ +_4_5 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ +46 }; │ │ │ │ │ +56 template < typename... Args > │ │ │ │ │ +_5_7 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +58 : public std::tuple │ │ │ │ │ +59 { │ │ │ │ │ +61 typedef std::tuple TupleType; │ │ │ │ │ +62 public: │ │ │ │ │ +63 │ │ │ │ │ +_6_5 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +66 │ │ │ │ │ +70 using TupleType::TupleType; │ │ │ │ │ +71 │ │ │ │ │ +_7_5 typedef _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r _t_y_p_e; │ │ │ │ │ +76 │ │ │ │ │ +_8_2 using _f_i_e_l_d___t_y_p_e = Std::detected_t >_:_:_f_i_e_l_d___t_y_p_e...>; │ │ │ │ │ +83 │ │ │ │ │ +84 // make sure that we have an std::common_type: using an assertion produces a │ │ │ │ │ +more readable error message │ │ │ │ │ +85 // than a compiler template instantiation error │ │ │ │ │ +86 static_assert ( sizeof...(Args) == 0 or not std::is_same_v, │ │ │ │ │ +87 "No std::common_type implemented for the given field_types of the Args. │ │ │ │ │ +Please provide an implementation and check that a FieldTraits class is present │ │ │ │ │ +for your type."); │ │ │ │ │ +88 │ │ │ │ │ +89 │ │ │ │ │ +_9_5 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e() │ │ │ │ │ +96 { │ │ │ │ │ +97 return sizeof...(Args); │ │ │ │ │ +98 } │ │ │ │ │ +99 │ │ │ │ │ +_1_0_2 static constexpr _s_i_z_e___t_y_p_e _N() │ │ │ │ │ +103 { │ │ │ │ │ +104 return sizeof...(Args); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +113 [[deprecated("Use method 'N' instead")]] │ │ │ │ │ +_1_1_4 int _c_o_u_n_t() const │ │ │ │ │ +115 { │ │ │ │ │ +116 return sizeof...(Args); │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +_1_2_0 _s_i_z_e___t_y_p_e _d_i_m() const │ │ │ │ │ +121 { │ │ │ │ │ +122 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ +123 Hybrid::forEach(std::make_index_sequence<_N()>{}, │ │ │ │ │ +124 [&](auto i){result += std::get(*this).dim();}); │ │ │ │ │ +125 │ │ │ │ │ +126 return result; │ │ │ │ │ +127 } │ │ │ │ │ +128 │ │ │ │ │ +147 template< size_type index > │ │ │ │ │ +148 typename std::tuple_element::type& │ │ │ │ │ +_1_4_9 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ +> indexVariable) │ │ │ │ │ 150 { │ │ │ │ │ -151 return _communication->norm(x); │ │ │ │ │ +151 return std::get(*this); │ │ │ │ │ 152 } │ │ │ │ │ 153 │ │ │ │ │ -_1_5_5 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const override │ │ │ │ │ -156 { │ │ │ │ │ -157 return _category; │ │ │ │ │ -158 } │ │ │ │ │ -159 │ │ │ │ │ -160 private: │ │ │ │ │ -161 std::shared_ptr _communication; │ │ │ │ │ -162 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _category; │ │ │ │ │ -163 }; │ │ │ │ │ -164 │ │ │ │ │ -166 template │ │ │ │ │ -_1_6_7 class _S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t : public _S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -168 { │ │ │ │ │ -169 using _S_c_a_l_a_r_P_r_o_d_u_c_t::ScalarProduct; │ │ │ │ │ -170 }; │ │ │ │ │ -171 │ │ │ │ │ -177 template │ │ │ │ │ -_1_7_8 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t : public │ │ │ │ │ -_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -179 { │ │ │ │ │ -180 public: │ │ │ │ │ -_1_8_1 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (std::shared_ptr comm) : │ │ │ │ │ -182 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm,_S_o_l_v_e_r_C_a_t_e_g_o_r_y::nonoverlapping) {} │ │ │ │ │ -183 │ │ │ │ │ -_1_8_4 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (const C& comm) : │ │ │ │ │ -185 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm,_S_o_l_v_e_r_C_a_t_e_g_o_r_y::nonoverlapping) {} │ │ │ │ │ -186 }; │ │ │ │ │ -187 │ │ │ │ │ -199 template │ │ │ │ │ -_2_0_0 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t : public _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -201 { │ │ │ │ │ -202 public: │ │ │ │ │ -_2_0_3 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (std::shared_ptr comm) : │ │ │ │ │ -204 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y::overlapping) {} │ │ │ │ │ -205 │ │ │ │ │ -_2_0_6 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t (const C& comm) : │ │ │ │ │ -207 _P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t(comm,_S_o_l_v_e_r_C_a_t_e_g_o_r_y::overlapping) {} │ │ │ │ │ -208 }; │ │ │ │ │ -209 │ │ │ │ │ -223 template │ │ │ │ │ -_2_2_4 std::shared_ptr> _m_a_k_e_S_c_a_l_a_r_P_r_o_d_u_c_t(std::shared_ptr comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category) │ │ │ │ │ -225 { │ │ │ │ │ -226 switch(category) │ │ │ │ │ -227 { │ │ │ │ │ -228 case _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l: │ │ │ │ │ -229 return │ │ │ │ │ -230 std::make_shared>(); │ │ │ │ │ -231 default: │ │ │ │ │ -232 return │ │ │ │ │ -233 std::make_shared>(comm,category); │ │ │ │ │ +159 template< size_type index > │ │ │ │ │ +160 const typename std::tuple_element::type& │ │ │ │ │ +_1_6_1 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ +> indexVariable) const │ │ │ │ │ +162 { │ │ │ │ │ +163 return std::get(*this); │ │ │ │ │ +164 } │ │ │ │ │ +165 │ │ │ │ │ +168 template │ │ │ │ │ +_1_6_9 void _o_p_e_r_a_t_o_r_=_ (const T& newval) { │ │ │ │ │ +170 Dune::Hybrid::forEach(*this, [&](auto&& entry) { │ │ │ │ │ +171 entry = newval; │ │ │ │ │ +172 }); │ │ │ │ │ +173 } │ │ │ │ │ +174 │ │ │ │ │ +_1_7_8 void _o_p_e_r_a_t_o_r_+_=_ (const _t_y_p_e& newv) { │ │ │ │ │ +179 using namespace Dune::Hybrid; │ │ │ │ │ +180 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) { │ │ │ │ │ +181 (*this)[i] += newv[i]; │ │ │ │ │ +182 }); │ │ │ │ │ +183 } │ │ │ │ │ +184 │ │ │ │ │ +_1_8_8 void _o_p_e_r_a_t_o_r_-_=_ (const _t_y_p_e& newv) { │ │ │ │ │ +189 using namespace Dune::Hybrid; │ │ │ │ │ +190 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) { │ │ │ │ │ +191 (*this)[i] -= newv[i]; │ │ │ │ │ +192 }); │ │ │ │ │ +193 } │ │ │ │ │ +194 │ │ │ │ │ +196 template::value, int> = 0> │ │ │ │ │ +_1_9_8 void _o_p_e_r_a_t_o_r_*_=_ (const T& w) { │ │ │ │ │ +199 Hybrid::forEach(*this, [&](auto&& entry) { │ │ │ │ │ +200 entry *= w; │ │ │ │ │ +201 }); │ │ │ │ │ +202 } │ │ │ │ │ +203 │ │ │ │ │ +205 template::value, int> = 0> │ │ │ │ │ +_2_0_7 void _o_p_e_r_a_t_o_r_/_=_ (const T& w) { │ │ │ │ │ +208 Hybrid::forEach(*this, [&](auto&& entry) { │ │ │ │ │ +209 entry /= w; │ │ │ │ │ +210 }); │ │ │ │ │ +211 } │ │ │ │ │ +212 │ │ │ │ │ +_2_1_3 _f_i_e_l_d___t_y_p_e _o_p_e_r_a_t_o_r_*_ (const _t_y_p_e& newv) const { │ │ │ │ │ +214 using namespace Dune::Hybrid; │ │ │ │ │ +215 return accumulate(integralRange(Hybrid::size(*this)), _f_i_e_l_d___t_y_p_e(0), [&] │ │ │ │ │ +(auto&& a, auto&& i) { │ │ │ │ │ +216 return a + (*this)[i]*newv[i]; │ │ │ │ │ +217 }); │ │ │ │ │ +218 } │ │ │ │ │ +219 │ │ │ │ │ +_2_2_0 _f_i_e_l_d___t_y_p_e _d_o_t (const _t_y_p_e& newv) const { │ │ │ │ │ +221 using namespace Dune::Hybrid; │ │ │ │ │ +222 return accumulate(integralRange(Hybrid::size(*this)), _f_i_e_l_d___t_y_p_e(0), [&] │ │ │ │ │ +(auto&& a, auto&& i) { │ │ │ │ │ +223 return a + (*this)[i].dot(newv[i]); │ │ │ │ │ +224 }); │ │ │ │ │ +225 } │ │ │ │ │ +226 │ │ │ │ │ +_2_2_9 auto _o_n_e___n_o_r_m() const { │ │ │ │ │ +230 using namespace Dune::Hybrid; │ │ │ │ │ +231 return accumulate(*this, typename FieldTraits::real_type(0), │ │ │ │ │ +[&](auto&& a, auto&& entry) { │ │ │ │ │ +232 return a + entry.one_norm(); │ │ │ │ │ +233 }); │ │ │ │ │ 234 } │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -241 template │ │ │ │ │ -_2_4_2 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const Comm& comm, │ │ │ │ │ -_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category) │ │ │ │ │ -243 { return makeScalarProduct(stackobject_to_shared_ptr(comm), category); } │ │ │ │ │ +235 │ │ │ │ │ +_2_3_8 auto _o_n_e___n_o_r_m___r_e_a_l() const { │ │ │ │ │ +239 using namespace Dune::Hybrid; │ │ │ │ │ +240 return accumulate(*this, typename FieldTraits::real_type(0), │ │ │ │ │ +[&](auto&& a, auto&& entry) { │ │ │ │ │ +241 return a + entry.one_norm_real(); │ │ │ │ │ +242 }); │ │ │ │ │ +243 } │ │ │ │ │ 244 │ │ │ │ │ -245} // end namespace Dune │ │ │ │ │ -246 │ │ │ │ │ -247#endif │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ +_2_4_7 typename FieldTraits::real_type _t_w_o___n_o_r_m_2() const { │ │ │ │ │ +248 using namespace Dune::Hybrid; │ │ │ │ │ +249 return accumulate(*this, typename FieldTraits::real_type(0), │ │ │ │ │ +[&](auto&& a, auto&& entry) { │ │ │ │ │ +250 return a + entry.two_norm2(); │ │ │ │ │ +251 }); │ │ │ │ │ +252 } │ │ │ │ │ +253 │ │ │ │ │ +_2_5_6 typename FieldTraits::real_type _t_w_o___n_o_r_m() const {return sqrt │ │ │ │ │ +(this->_t_w_o___n_o_r_m_2());} │ │ │ │ │ +257 │ │ │ │ │ +_2_6_0 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const │ │ │ │ │ +261 { │ │ │ │ │ +262 using namespace Dune::Hybrid; │ │ │ │ │ +263 using std::max; │ │ │ │ │ +264 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +265 │ │ │ │ │ +266 real_type result = 0.0; │ │ │ │ │ +267 // Compute max norm tracking appearing nan values │ │ │ │ │ +268 // if the field type supports nan. │ │ │ │ │ +269 if constexpr (HasNaN()) { │ │ │ │ │ +270 // This variable will preserve any nan value │ │ │ │ │ +271 real_type nanTracker = 1.0; │ │ │ │ │ +272 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +273 forEach(*this, [&](auto&& entry) { │ │ │ │ │ +274 real_type entryNorm = entry.infinity_norm(); │ │ │ │ │ +275 result = max(entryNorm, result); │ │ │ │ │ +276 nanTracker += entryNorm; │ │ │ │ │ +277 }); │ │ │ │ │ +278 // Incorporate possible nan value into result │ │ │ │ │ +279 result *= (nanTracker / nanTracker); │ │ │ │ │ +280 } else { │ │ │ │ │ +281 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +282 forEach(*this, [&](auto&& entry) { │ │ │ │ │ +283 result = max(entry.infinity_norm(), result); │ │ │ │ │ +284 }); │ │ │ │ │ +285 } │ │ │ │ │ +286 return result; │ │ │ │ │ +287 } │ │ │ │ │ +288 │ │ │ │ │ +_2_9_1 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const │ │ │ │ │ +292 { │ │ │ │ │ +293 using namespace Dune::Hybrid; │ │ │ │ │ +294 using std::max; │ │ │ │ │ +295 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +296 │ │ │ │ │ +297 real_type result = 0.0; │ │ │ │ │ +298 // Compute max norm tracking appearing nan values │ │ │ │ │ +299 // if the field type supports nan. │ │ │ │ │ +300 if constexpr (HasNaN()) { │ │ │ │ │ +301 // This variable will preserve any nan value │ │ │ │ │ +302 real_type nanTracker = 1.0; │ │ │ │ │ +303 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +304 forEach(*this, [&](auto&& entry) { │ │ │ │ │ +305 real_type entryNorm = entry.infinity_norm_real(); │ │ │ │ │ +306 result = max(entryNorm, result); │ │ │ │ │ +307 nanTracker += entryNorm; │ │ │ │ │ +308 }); │ │ │ │ │ +309 // Incorporate possible nan value into result │ │ │ │ │ +310 result *= (nanTracker / nanTracker); │ │ │ │ │ +311 } else { │ │ │ │ │ +312 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +313 forEach(*this, [&](auto&& entry) { │ │ │ │ │ +314 result = max(entry.infinity_norm_real(), result); │ │ │ │ │ +315 }); │ │ │ │ │ +316 } │ │ │ │ │ +317 return result; │ │ │ │ │ +318 } │ │ │ │ │ +319 │ │ │ │ │ +324 template │ │ │ │ │ +_3_2_5 void _a_x_p_y (const Ta& a, const _t_y_p_e& y) { │ │ │ │ │ +326 using namespace Dune::Hybrid; │ │ │ │ │ +327 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) { │ │ │ │ │ +328 (*this)[i].axpy(a, y[i]); │ │ │ │ │ +329 }); │ │ │ │ │ +330 } │ │ │ │ │ +331 │ │ │ │ │ +332 }; │ │ │ │ │ +333 │ │ │ │ │ +334 │ │ │ │ │ +335 │ │ │ │ │ +338 template │ │ │ │ │ +_3_3_9 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ +_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_A_r_g_s_._._._>& v) { │ │ │ │ │ +340 using namespace Dune::Hybrid; │ │ │ │ │ +341 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) { │ │ │ │ │ +342 s << "\t(" << i << "):\n" << v[i] << "\n"; │ │ │ │ │ +343 }); │ │ │ │ │ +344 return s; │ │ │ │ │ +345 } │ │ │ │ │ +346 │ │ │ │ │ +347} // end namespace Dune │ │ │ │ │ +348 │ │ │ │ │ +349namespace _s_t_d │ │ │ │ │ +350{ │ │ │ │ │ +355 template │ │ │ │ │ +_3_5_6 struct tuple_element > │ │ │ │ │ +357 { │ │ │ │ │ +_3_5_8 using _t_y_p_e = typename std::tuple_element >::type; │ │ │ │ │ +359 }; │ │ │ │ │ +360} │ │ │ │ │ +361 │ │ │ │ │ +362#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_g_s_e_t_c_._h_h │ │ │ │ │ +Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ +generic way. │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +void operator=(const T &newval) │ │ │ │ │ +Assignment operator. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for vector sizes. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_o_u_n_t │ │ │ │ │ +int count() const │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_N │ │ │ │ │ +static constexpr size_type N() │ │ │ │ │ +Number of elements. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:102 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args > │ │ │ │ │ +>::field_type... > field_type │ │ │ │ │ +The type used for scalars. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ +static constexpr size_type size() │ │ │ │ │ +Return the number of non-zero vector entries. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +std::tuple_element< index, TupleType >::type & operator[](const std:: │ │ │ │ │ +integral_constant< size_type, index > indexVariable) │ │ │ │ │ +Random-access operator. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_t_w_o___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type two_norm() const │ │ │ │ │ +Compute the Euclidean norm. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename MultiTypeBlockVector< Args... >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_d_i_m │ │ │ │ │ +size_type dim() const │ │ │ │ │ +Number of scalar elements. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_d_o_t │ │ │ │ │ +field_type dot(const type &newv) const │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:220 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ +void operator*=(const T &w) │ │ │ │ │ +Multiplication with a scalar. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_a_x_p_y │ │ │ │ │ +void axpy(const Ta &a, const type &y) │ │ │ │ │ +Axpy operation on this vector (*this += a * y) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:325 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ +void operator/=(const T &w) │ │ │ │ │ +Division by a scalar. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_t_y_p_e │ │ │ │ │ +MultiTypeBlockVector< Args... > type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ +FieldTraits< field_type >::real_type infinity_norm_real() const │ │ │ │ │ +Compute the simplified maximum norm (uses 1-norm for complex values) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:291 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_n_e___n_o_r_m │ │ │ │ │ +auto one_norm() const │ │ │ │ │ +Compute the 1-norm. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ +void operator-=(const type &newv) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +field_type operator*(const type &newv) const │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:213 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ +void operator+=(const type &newv) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:178 │ │ │ │ │ +_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +typename std::tuple_element< i, std::tuple< Args... > >::type type │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:358 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type infinity_norm() const │ │ │ │ │ +Compute the maximum norm. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_n_e___n_o_r_m___r_e_a_l │ │ │ │ │ +auto one_norm_real() const │ │ │ │ │ +Compute the simplified 1-norm (uses 1-norm also for complex values) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:238 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_t_w_o___n_o_r_m_2 │ │ │ │ │ +FieldTraits< field_type >::real_type two_norm2() const │ │ │ │ │ +Compute the squared Euclidean norm. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:247 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, │ │ │ │ │ -SolverCategory::Category category) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:242 │ │ │ │ │ -_D_u_n_e_:_:_m_a_k_e_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const │ │ │ │ │ -Comm > comm, SolverCategory::Category category) │ │ │ │ │ -Choose the approriate scalar product for a solver category. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:224 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Base class for scalar product and norm computation. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_t │ │ │ │ │ -virtual field_type dot(const X &x, const X &y) const │ │ │ │ │ -Dot product of two vectors. It is assumed that the vectors are consistent on │ │ │ │ │ -the interior+border part... │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the scalar product (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -export types, they come from the derived class │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_~_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -virtual ~ScalarProduct() │ │ │ │ │ -every abstract base class has a virtual destructor │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_n_o_r_m │ │ │ │ │ -virtual real_type norm(const X &x) const │ │ │ │ │ -Norm of a right-hand side vector. The vector must be consistent on the │ │ │ │ │ -interior+border partition. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Scalar product for overlapping Schwarz methods. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_t │ │ │ │ │ -virtual field_type dot(const X &x, const X &y) const override │ │ │ │ │ -Dot product of two vectors. It is assumed that the vectors are consistent on │ │ │ │ │ -the interior+border part... │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:139 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const override │ │ │ │ │ -Category of the scalar product (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ -C communication_type │ │ │ │ │ -The type of the communication object. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -ParallelScalarProduct(const communication_type &com, SolverCategory::Category │ │ │ │ │ -cat) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The type of the vector to compute the scalar product on. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -ParallelScalarProduct(std::shared_ptr< const communication_type > com, │ │ │ │ │ -SolverCategory::Category cat) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type used by the vector type domain_type. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:107 │ │ │ │ │ -_D_u_n_e_:_:_P_a_r_a_l_l_e_l_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_n_o_r_m │ │ │ │ │ -virtual real_type norm(const X &x) const override │ │ │ │ │ -Norm of a right-hand side vector. The vector must be consistent on the │ │ │ │ │ -interior+border partition. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Default implementation for the scalar case. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Nonoverlapping Scalar Product with communication object. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -NonoverlappingSchwarzScalarProduct(const C &comm) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Scalar product for overlapping Schwarz methods. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:201 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -OverlappingSchwarzScalarProduct(const C &comm) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -Categories for the solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v) │ │ │ │ │ +Send BlockVector to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:590 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A Vector class to support different block types. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:59 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00044.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: umfpack.hh File Reference │ │ │ │ +dune-istl: istlexception.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,75 +71,46 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ +
istlexception.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Classes for using UMFPack with ISTL matrices. │ │ │ │ -More...

│ │ │ │ -
#include <complex>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <umfpack.h>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <dune/common/exceptions.hh>
│ │ │ │ #include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/solvers.hh>
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ -#include <dune/istl/solverfactory.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::UMFPackMethodChooser< SCalar, Integer >
 
struct  Dune::UMFPackMethodChooser< double, std::true_type >
 
struct  Dune::UMFPackMethodChooser< double, std::false_type >
 
struct  Dune::UMFPackMethodChooser< std::complex< double >, std::true_type >
class  Dune::ISTLError
 derive error class from the base class in common More...
 
struct  Dune::UMFPackMethodChooser< std::complex< double >, std::false_type >
class  Dune::BCRSMatrixError
 Error specific to BCRSMatrix. More...
 
class  Dune::UMFPack< M >
 The UMFPack direct sparse solver. More...
class  Dune::ImplicitModeCompressionBufferExhausted
 Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted. More...
 
struct  Dune::IsDirectSolver< UMFPack< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
class  Dune::SolverAbort
 Thrown when a solver aborts due to some problem. More...
 
struct  Dune::StoresColumnCompressed< UMFPack< BCRSMatrix< T, A > > >
 
struct  Dune::UMFPackCreator
 
struct  Dune::UMFPackCreator::isValidBlock< F, class >
 
struct  Dune::UMFPackCreator::isValidBlock< B, std::enable_if_t< std::is_same< typename FieldTraits< B >::real_type, double >::value > >
class  Dune::MatrixBlockError
 Error when performing an operation on a matrix block. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("umfpack", Dune::UMFPackCreator())
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Classes for using UMFPack with ISTL matrices.

│ │ │ │ -
Author
Dominic Kempf
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,60 +1,33 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -umfpack.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ -Classes for using UMFPack with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +istlexception.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _S_C_a_l_a_r_,_ _I_n_t_e_g_e_r_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +  derive error class from the base class in common _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ +  Error specific to _B_C_R_S_M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ +  Thrown when the compression buffer used by the implicit _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ + construction is exhausted. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ +  Thrown when a solver aborts due to some problem. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_U_M_F_P_a_c_k_<_ _M_ _> │ │ │ │ │ -  The UMFPack direct sparse solver. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _U_M_F_P_a_c_k_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _> │ │ │ │ │ - _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _U_M_F_P_a_c_k_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_,_ _c_l_a_s_s_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _B_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_< │ │ │ │ │ - _t_y_p_e_n_a_m_e_ _F_i_e_l_d_T_r_a_i_t_s_<_ _B_ _>_:_:_r_e_a_l___t_y_p_e_,_ _d_o_u_b_l_e_ _>_:_:_v_a_l_u_e_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ +  Error when performing an operation on a matrix block. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("umfpack", _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r()) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Classes for using UMFPack with ISTL matrices. │ │ │ │ │ - Author │ │ │ │ │ - Dominic Kempf │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: umfpack.hh Source File │ │ │ │ +dune-istl: istlexception.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,899 +74,65 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
umfpack.hh
│ │ │ │ +
istlexception.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_UMFPACK_HH
│ │ │ │ -
6#define DUNE_ISTL_UMFPACK_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH
│ │ │ │ +
6#define DUNE_ISTL_ISTLEXCEPTION_HH
│ │ │ │
7
│ │ │ │ -
8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN
│ │ │ │ -
9
│ │ │ │ -
10#include<complex>
│ │ │ │ -
11#include<type_traits>
│ │ │ │ +
8#include <dune/common/exceptions.hh>
│ │ │ │ +
9#include <dune/common/fmatrix.hh>
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │
12
│ │ │ │ -
13#include<umfpack.h>
│ │ │ │ -
14
│ │ │ │ -
15#include<dune/common/exceptions.hh>
│ │ │ │ -
16#include<dune/common/fmatrix.hh>
│ │ │ │ -
17#include<dune/common/fvector.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26namespace Dune {
│ │ │ │ -
38 // FORWARD DECLARATIONS
│ │ │ │ -
39 template<class M, class T, class TM, class TD, class TA>
│ │ │ │ -
40 class SeqOverlappingSchwarz;
│ │ │ │ -
41
│ │ │ │ -
42 template<class T, bool tag>
│ │ │ │ -
43 struct SeqOverlappingSchwarzAssemblerHelper;
│ │ │ │ -
44
│ │ │ │ -
45 // wrapper class for C-Function Calls in the backend. Choose the right function namespace
│ │ │ │ -
46 // depending on the template parameter used.
│ │ │ │ -
47template<typename SCalar, typename Integer>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
49 {
│ │ │ │ -
50 static constexpr bool valid = false ;
│ │ │ │ -
51 };
│ │ │ │ -
│ │ │ │ -
52
│ │ │ │ -
53 template<>
│ │ │ │ -
│ │ │ │ -
54 struct UMFPackMethodChooser<double, std::true_type>
│ │ │ │ -
55 {
│ │ │ │ -
56 static constexpr bool valid = true ;
│ │ │ │ -
57
│ │ │ │ -
58 template<typename... A>
│ │ │ │ -
│ │ │ │ -
59 static void defaults(A... args)
│ │ │ │ -
60 {
│ │ │ │ -
61 umfpack_dl_defaults(args...);
│ │ │ │ -
62 }
│ │ │ │ -
│ │ │ │ -
63 template<typename... A>
│ │ │ │ -
│ │ │ │ -
64 static void free_numeric(A... args)
│ │ │ │ -
65 {
│ │ │ │ -
66 umfpack_dl_free_numeric(args...);
│ │ │ │ -
67 }
│ │ │ │ -
│ │ │ │ -
68 template<typename... A>
│ │ │ │ -
│ │ │ │ -
69 static void free_symbolic(A... args)
│ │ │ │ -
70 {
│ │ │ │ -
71 umfpack_dl_free_symbolic(args...);
│ │ │ │ -
72 }
│ │ │ │ -
│ │ │ │ -
73 template<typename... A>
│ │ │ │ -
│ │ │ │ -
74 static int load_numeric(A... args)
│ │ │ │ -
75 {
│ │ │ │ -
76 return umfpack_dl_load_numeric(args...);
│ │ │ │ -
77 }
│ │ │ │ -
│ │ │ │ -
78 template<typename... A>
│ │ │ │ -
│ │ │ │ -
79 static void numeric(A... args)
│ │ │ │ -
80 {
│ │ │ │ -
81 umfpack_dl_numeric(args...);
│ │ │ │ -
82 }
│ │ │ │ -
│ │ │ │ -
83 template<typename... A>
│ │ │ │ -
│ │ │ │ -
84 static void report_info(A... args)
│ │ │ │ -
85 {
│ │ │ │ -
86 umfpack_dl_report_info(args...);
│ │ │ │ -
87 }
│ │ │ │ -
│ │ │ │ -
88 template<typename... A>
│ │ │ │ -
│ │ │ │ -
89 static void report_status(A... args)
│ │ │ │ -
90 {
│ │ │ │ -
91 umfpack_dl_report_status(args...);
│ │ │ │ -
92 }
│ │ │ │ -
│ │ │ │ -
93 template<typename... A>
│ │ │ │ -
│ │ │ │ -
94 static int save_numeric(A... args)
│ │ │ │ -
95 {
│ │ │ │ -
96 return umfpack_dl_save_numeric(args...);
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ -
98 template<typename... A>
│ │ │ │ -
│ │ │ │ -
99 static void solve(A... args)
│ │ │ │ -
100 {
│ │ │ │ -
101 umfpack_dl_solve(args...);
│ │ │ │ -
102 }
│ │ │ │ -
│ │ │ │ -
103 template<typename... A>
│ │ │ │ -
│ │ │ │ -
104 static void symbolic(A... args)
│ │ │ │ -
105 {
│ │ │ │ -
106 umfpack_dl_symbolic(args...);
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108 };
│ │ │ │ -
│ │ │ │ -
109
│ │ │ │ -
110 template<>
│ │ │ │ -
│ │ │ │ -
111 struct UMFPackMethodChooser<double, std::false_type>
│ │ │ │ -
112 {
│ │ │ │ -
113 static constexpr bool valid = true ;
│ │ │ │ -
114
│ │ │ │ -
115 template<typename... A>
│ │ │ │ -
│ │ │ │ -
116 static void defaults(A... args)
│ │ │ │ -
117 {
│ │ │ │ -
118 umfpack_di_defaults(args...);
│ │ │ │ -
119 }
│ │ │ │ -
│ │ │ │ -
120 template<typename... A>
│ │ │ │ -
│ │ │ │ -
121 static void free_numeric(A... args)
│ │ │ │ -
122 {
│ │ │ │ -
123 umfpack_di_free_numeric(args...);
│ │ │ │ -
124 }
│ │ │ │ -
│ │ │ │ -
125 template<typename... A>
│ │ │ │ -
│ │ │ │ -
126 static void free_symbolic(A... args)
│ │ │ │ -
127 {
│ │ │ │ -
128 umfpack_di_free_symbolic(args...);
│ │ │ │ -
129 }
│ │ │ │ -
│ │ │ │ -
130 template<typename... A>
│ │ │ │ -
│ │ │ │ -
131 static int load_numeric(A... args)
│ │ │ │ -
132 {
│ │ │ │ -
133 return umfpack_di_load_numeric(args...);
│ │ │ │ -
134 }
│ │ │ │ -
│ │ │ │ -
135 template<typename... A>
│ │ │ │ -
│ │ │ │ -
136 static void numeric(A... args)
│ │ │ │ -
137 {
│ │ │ │ -
138 umfpack_di_numeric(args...);
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140 template<typename... A>
│ │ │ │ -
│ │ │ │ -
141 static void report_info(A... args)
│ │ │ │ -
142 {
│ │ │ │ -
143 umfpack_di_report_info(args...);
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ -
145 template<typename... A>
│ │ │ │ -
│ │ │ │ -
146 static void report_status(A... args)
│ │ │ │ -
147 {
│ │ │ │ -
148 umfpack_di_report_status(args...);
│ │ │ │ -
149 }
│ │ │ │ -
│ │ │ │ -
150 template<typename... A>
│ │ │ │ -
│ │ │ │ -
151 static int save_numeric(A... args)
│ │ │ │ -
152 {
│ │ │ │ -
153 return umfpack_di_save_numeric(args...);
│ │ │ │ -
154 }
│ │ │ │ -
│ │ │ │ -
155 template<typename... A>
│ │ │ │ -
│ │ │ │ -
156 static void solve(A... args)
│ │ │ │ -
157 {
│ │ │ │ -
158 umfpack_di_solve(args...);
│ │ │ │ -
159 }
│ │ │ │ -
│ │ │ │ -
160 template<typename... A>
│ │ │ │ -
│ │ │ │ -
161 static void symbolic(A... args)
│ │ │ │ -
162 {
│ │ │ │ -
163 umfpack_di_symbolic(args...);
│ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ -
165 };
│ │ │ │ -
│ │ │ │ -
166
│ │ │ │ -
167 template<>
│ │ │ │ -
│ │ │ │ -
168 struct UMFPackMethodChooser<std::complex<double>, std::true_type>
│ │ │ │ -
169 {
│ │ │ │ -
170 static constexpr bool valid = true ;
│ │ │ │ -
171
│ │ │ │ -
172 using umf_int_type = int64_t;
│ │ │ │ -
173
│ │ │ │ -
174 template<typename... A>
│ │ │ │ -
│ │ │ │ -
175 static void defaults(A... args)
│ │ │ │ -
176 {
│ │ │ │ -
177 umfpack_zl_defaults(args...);
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179 template<typename... A>
│ │ │ │ -
│ │ │ │ -
180 static void free_numeric(A... args)
│ │ │ │ -
181 {
│ │ │ │ -
182 umfpack_zl_free_numeric(args...);
│ │ │ │ -
183 }
│ │ │ │ -
│ │ │ │ -
184 template<typename... A>
│ │ │ │ -
│ │ │ │ -
185 static void free_symbolic(A... args)
│ │ │ │ -
186 {
│ │ │ │ -
187 umfpack_zl_free_symbolic(args...);
│ │ │ │ -
188 }
│ │ │ │ -
│ │ │ │ -
189 template<typename... A>
│ │ │ │ -
│ │ │ │ -
190 static int load_numeric(A... args)
│ │ │ │ -
191 {
│ │ │ │ -
192 return umfpack_zl_load_numeric(args...);
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194 template<typename... A>
│ │ │ │ -
│ │ │ │ -
195 static void numeric(const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ -
196 {
│ │ │ │ -
197 umfpack_zl_numeric(cs,ri,val,NULL,args...);
│ │ │ │ -
198 }
│ │ │ │ -
│ │ │ │ -
199 template<typename... A>
│ │ │ │ -
│ │ │ │ -
200 static void report_info(A... args)
│ │ │ │ -
201 {
│ │ │ │ -
202 umfpack_zl_report_info(args...);
│ │ │ │ -
203 }
│ │ │ │ -
│ │ │ │ -
204 template<typename... A>
│ │ │ │ -
│ │ │ │ -
205 static void report_status(A... args)
│ │ │ │ -
206 {
│ │ │ │ -
207 umfpack_zl_report_status(args...);
│ │ │ │ -
208 }
│ │ │ │ -
│ │ │ │ -
209 template<typename... A>
│ │ │ │ -
│ │ │ │ -
210 static int save_numeric(A... args)
│ │ │ │ -
211 {
│ │ │ │ -
212 return umfpack_zl_save_numeric(args...);
│ │ │ │ -
213 }
│ │ │ │ -
│ │ │ │ -
214 template<typename... A>
│ │ │ │ -
│ │ │ │ -
215 static void solve(umf_int_type m, const umf_int_type* cs, const umf_int_type* ri, std::complex<double>* val, double* x, const double* b,A... args)
│ │ │ │ -
216 {
│ │ │ │ -
217 const double* cval = reinterpret_cast<const double*>(val);
│ │ │ │ -
218 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);
│ │ │ │ -
219 }
│ │ │ │ -
│ │ │ │ -
220 template<typename... A>
│ │ │ │ -
│ │ │ │ -
221 static void symbolic(umf_int_type m, umf_int_type n, const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ -
222 {
│ │ │ │ -
223 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...);
│ │ │ │ -
224 }
│ │ │ │ -
│ │ │ │ -
225 };
│ │ │ │ -
│ │ │ │ -
226
│ │ │ │ -
227
│ │ │ │ -
228 template<>
│ │ │ │ -
│ │ │ │ -
229 struct UMFPackMethodChooser<std::complex<double>, std::false_type>
│ │ │ │ -
230 {
│ │ │ │ -
231 static constexpr bool valid = true ;
│ │ │ │ -
232
│ │ │ │ -
233 using umf_int_type = int32_t;
│ │ │ │ -
234
│ │ │ │ -
235 template<typename... A>
│ │ │ │ -
│ │ │ │ -
236 static void defaults(A... args)
│ │ │ │ -
237 {
│ │ │ │ -
238 umfpack_zi_defaults(args...);
│ │ │ │ -
239 }
│ │ │ │ -
│ │ │ │ -
240 template<typename... A>
│ │ │ │ -
│ │ │ │ -
241 static void free_numeric(A... args)
│ │ │ │ -
242 {
│ │ │ │ -
243 umfpack_zi_free_numeric(args...);
│ │ │ │ -
244 }
│ │ │ │ +
19 class ISTLError : public Dune::MathError {};
│ │ │ │ +
20
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
23 : public ISTLError
│ │ │ │ +
24 {};
│ │ │ │
│ │ │ │ -
245 template<typename... A>
│ │ │ │ -
│ │ │ │ -
246 static void free_symbolic(A... args)
│ │ │ │ -
247 {
│ │ │ │ -
248 umfpack_zi_free_symbolic(args...);
│ │ │ │ -
249 }
│ │ │ │ -
│ │ │ │ -
250 template<typename... A>
│ │ │ │ -
│ │ │ │ -
251 static int load_numeric(A... args)
│ │ │ │ -
252 {
│ │ │ │ -
253 return umfpack_zi_load_numeric(args...);
│ │ │ │ -
254 }
│ │ │ │ -
│ │ │ │ -
255 template<typename... A>
│ │ │ │ -
│ │ │ │ -
256 static void numeric(const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ -
257 {
│ │ │ │ -
258 umfpack_zi_numeric(cs,ri,val,NULL,args...);
│ │ │ │ -
259 }
│ │ │ │ -
│ │ │ │ -
260 template<typename... A>
│ │ │ │ -
│ │ │ │ -
261 static void report_info(A... args)
│ │ │ │ -
262 {
│ │ │ │ -
263 umfpack_zi_report_info(args...);
│ │ │ │ -
264 }
│ │ │ │ -
│ │ │ │ -
265 template<typename... A>
│ │ │ │ -
│ │ │ │ -
266 static void report_status(A... args)
│ │ │ │ -
267 {
│ │ │ │ -
268 umfpack_zi_report_status(args...);
│ │ │ │ -
269 }
│ │ │ │ -
│ │ │ │ -
270 template<typename... A>
│ │ │ │ -
│ │ │ │ -
271 static int save_numeric(A... args)
│ │ │ │ -
272 {
│ │ │ │ -
273 return umfpack_zi_save_numeric(args...);
│ │ │ │ -
274 }
│ │ │ │ -
│ │ │ │ -
275 template<typename... A>
│ │ │ │ -
│ │ │ │ -
276 static void solve(umf_int_type m, const umf_int_type* cs, const umf_int_type* ri, std::complex<double>* val, double* x, const double* b,A... args)
│ │ │ │ -
277 {
│ │ │ │ -
278 const double* cval = reinterpret_cast<const double*>(val);
│ │ │ │ -
279 umfpack_zi_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);
│ │ │ │ -
280 }
│ │ │ │ -
│ │ │ │ -
281 template<typename... A>
│ │ │ │ -
│ │ │ │ -
282 static void symbolic(umf_int_type m, std::size_t n, const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ -
283 {
│ │ │ │ -
284 umfpack_zi_symbolic(m,n,cs,ri,val,NULL,args...);
│ │ │ │ -
285 }
│ │ │ │ -
│ │ │ │ -
286 };
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
288 namespace Impl
│ │ │ │ -
289 {
│ │ │ │ -
290 template<class M>
│ │ │ │ -
291 struct UMFPackVectorChooser
│ │ │ │ -
292 {};
│ │ │ │ -
293
│ │ │ │ -
294 template<typename T, typename A, int n, int m>
│ │ │ │ -
295 struct UMFPackVectorChooser<BCRSMatrix<FieldMatrix<T,n,m>,A > >
│ │ │ │ -
296 {
│ │ │ │ -
298 using domain_type = BlockVector<
│ │ │ │ -
299 FieldVector<T,m>,
│ │ │ │ -
300 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >;
│ │ │ │ -
302 using range_type = BlockVector<
│ │ │ │ -
303 FieldVector<T,n>,
│ │ │ │ -
304 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > >;
│ │ │ │ -
305 };
│ │ │ │ -
306
│ │ │ │ -
307 template<typename T, typename A>
│ │ │ │ -
308 struct UMFPackVectorChooser<BCRSMatrix<T,A> >
│ │ │ │ -
309 {
│ │ │ │ -
311 using domain_type = BlockVector<T, A>;
│ │ │ │ -
313 using range_type = BlockVector<T, A>;
│ │ │ │ -
314 };
│ │ │ │ -
315 }
│ │ │ │ -
316
│ │ │ │ -
330 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
332 : public InverseOperator<
│ │ │ │ -
333 typename Impl::UMFPackVectorChooser<M>::domain_type,
│ │ │ │ -
334 typename Impl::UMFPackVectorChooser<M>::range_type >
│ │ │ │ -
335 {
│ │ │ │ -
336 using T = typename M::field_type;
│ │ │ │ -
337
│ │ │ │ -
338 public:
│ │ │ │ -
340 using Matrix = M;
│ │ │ │ -
341 using matrix_type = M;
│ │ │ │ -
342 using umf_int_type = std::conditional_t<(sizeof(typename M::size_type) == 8), int64_t, int32_t>;
│ │ │ │ -
344 typedef ISTL::Impl::BCCSMatrix<typename Matrix::field_type, umf_int_type> UMFPackMatrix;
│ │ │ │ -
346 typedef ISTL::Impl::BCCSMatrixInitializer<M, umf_int_type> MatrixInitializer;
│ │ │ │ -
348 using domain_type = typename Impl::UMFPackVectorChooser<M>::domain_type;
│ │ │ │ -
350 using range_type = typename Impl::UMFPackVectorChooser<M>::range_type;
│ │ │ │ -
351
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
354 {
│ │ │ │ - │ │ │ │ -
356 }
│ │ │ │ -
│ │ │ │ -
357
│ │ │ │ -
│ │ │ │ -
366 UMFPack(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false)
│ │ │ │ -
367 {
│ │ │ │ -
368 //check whether T is a supported type
│ │ │ │ -
369 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ -
370 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ -
371 Caller::defaults(UMF_Control);
│ │ │ │ -
372 setVerbosity(verbose);
│ │ │ │ -
373 setMatrix(matrix);
│ │ │ │ -
374 }
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
│ │ │ │ -
384 UMFPack(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false)
│ │ │ │ -
385 {
│ │ │ │ -
386 //check whether T is a supported type
│ │ │ │ -
387 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ -
388 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ -
389 Caller::defaults(UMF_Control);
│ │ │ │ -
390 setVerbosity(verbose);
│ │ │ │ -
391 setMatrix(matrix);
│ │ │ │ -
392 }
│ │ │ │ -
│ │ │ │ -
393
│ │ │ │ -
│ │ │ │ -
403 UMFPack(const Matrix& mat_, const ParameterTree& config)
│ │ │ │ -
404 : UMFPack(mat_, config.get<int>("verbose", 0))
│ │ │ │ -
405 {}
│ │ │ │ -
│ │ │ │ -
406
│ │ │ │ -
│ │ │ │ -
409 UMFPack() : matrixIsLoaded_(false), verbosity_(0)
│ │ │ │ -
410 {
│ │ │ │ -
411 //check whether T is a supported type
│ │ │ │ -
412 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ -
413 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ -
414 Caller::defaults(UMF_Control);
│ │ │ │ -
415 }
│ │ │ │ -
│ │ │ │ -
416
│ │ │ │ -
│ │ │ │ -
427 UMFPack(const Matrix& mat_, const char* file, int verbose=0)
│ │ │ │ -
428 {
│ │ │ │ -
429 //check whether T is a supported type
│ │ │ │ -
430 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ -
431 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ -
432 Caller::defaults(UMF_Control);
│ │ │ │ -
433 setVerbosity(verbose);
│ │ │ │ -
434 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
│ │ │ │ -
435 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode == UMFPACK_ERROR_file_IO))
│ │ │ │ -
436 {
│ │ │ │ -
437 matrixIsLoaded_ = false;
│ │ │ │ -
438 setMatrix(mat_);
│ │ │ │ -
439 saveDecomposition(file);
│ │ │ │ -
440 }
│ │ │ │ -
441 else
│ │ │ │ -
442 {
│ │ │ │ -
443 matrixIsLoaded_ = true;
│ │ │ │ -
444 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
│ │ │ │ -
445 }
│ │ │ │ -
446 }
│ │ │ │ -
│ │ │ │ -
447
│ │ │ │ -
│ │ │ │ -
454 UMFPack(const char* file, int verbose=0)
│ │ │ │ -
455 {
│ │ │ │ -
456 //check whether T is a supported type
│ │ │ │ -
457 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ -
458 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ -
459 Caller::defaults(UMF_Control);
│ │ │ │ -
460 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
│ │ │ │ -
461 if (errcode == UMFPACK_ERROR_out_of_memory)
│ │ │ │ -
462 DUNE_THROW(Dune::Exception, "ran out of memory while loading UMFPack decomposition");
│ │ │ │ -
463 if (errcode == UMFPACK_ERROR_file_IO)
│ │ │ │ -
464 DUNE_THROW(Dune::Exception, "IO error while loading UMFPack decomposition");
│ │ │ │ -
465 matrixIsLoaded_ = true;
│ │ │ │ -
466 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
│ │ │ │ -
467 setVerbosity(verbose);
│ │ │ │ -
468 }
│ │ │ │ -
│ │ │ │ -
469
│ │ │ │ -
│ │ │ │ -
470 virtual ~UMFPack()
│ │ │ │ -
471 {
│ │ │ │ -
472 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
│ │ │ │ -
473 free();
│ │ │ │ -
474 }
│ │ │ │ -
│ │ │ │ -
475
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
480 {
│ │ │ │ -
481 if (umfpackMatrix_.N() != b.dim())
│ │ │ │ -
482 DUNE_THROW(Dune::ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
│ │ │ │ -
483 if (umfpackMatrix_.M() != x.dim())
│ │ │ │ -
484 DUNE_THROW(Dune::ISTLError, "Size of solution vector x does not match the number of matrix columns!");
│ │ │ │ -
485 if (b.size() == 0)
│ │ │ │ -
486 return;
│ │ │ │ -
487
│ │ │ │ -
488 double UMF_Apply_Info[UMFPACK_INFO];
│ │ │ │ -
489 Caller::solve(UMFPACK_A,
│ │ │ │ -
490 umfpackMatrix_.getColStart(),
│ │ │ │ -
491 umfpackMatrix_.getRowIndex(),
│ │ │ │ -
492 umfpackMatrix_.getValues(),
│ │ │ │ -
493 reinterpret_cast<double*>(&x[0]),
│ │ │ │ -
494 reinterpret_cast<double*>(&b[0]),
│ │ │ │ -
495 UMF_Numeric,
│ │ │ │ -
496 UMF_Control,
│ │ │ │ -
497 UMF_Apply_Info);
│ │ │ │ -
498
│ │ │ │ -
499 //this is a direct solver
│ │ │ │ -
500 res.iterations = 1;
│ │ │ │ -
501 res.converged = true;
│ │ │ │ -
502 res.elapsed = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME];
│ │ │ │ -
503
│ │ │ │ -
504 printOnApply(UMF_Apply_Info);
│ │ │ │ -
505 }
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
│ │ │ │ -
510 virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ -
511 {
│ │ │ │ -
512 apply(x,b,res);
│ │ │ │ -
513 }
│ │ │ │ -
│ │ │ │ -
514
│ │ │ │ -
│ │ │ │ -
520 void apply(T* x, T* b)
│ │ │ │ -
521 {
│ │ │ │ -
522 double UMF_Apply_Info[UMFPACK_INFO];
│ │ │ │ -
523 Caller::solve(UMFPACK_A,
│ │ │ │ -
524 umfpackMatrix_.getColStart(),
│ │ │ │ -
525 umfpackMatrix_.getRowIndex(),
│ │ │ │ -
526 umfpackMatrix_.getValues(),
│ │ │ │ -
527 x,
│ │ │ │ -
528 b,
│ │ │ │ -
529 UMF_Numeric,
│ │ │ │ -
530 UMF_Control,
│ │ │ │ -
531 UMF_Apply_Info);
│ │ │ │ -
532 printOnApply(UMF_Apply_Info);
│ │ │ │ -
533 }
│ │ │ │ -
│ │ │ │ -
534
│ │ │ │ -
│ │ │ │ -
546 void setOption(unsigned int option, double value)
│ │ │ │ -
547 {
│ │ │ │ -
548 if (option >= UMFPACK_CONTROL)
│ │ │ │ -
549 DUNE_THROW(RangeError, "Requested non-existing UMFPack option");
│ │ │ │ -
550
│ │ │ │ -
551 UMF_Control[option] = value;
│ │ │ │ -
552 }
│ │ │ │ -
│ │ │ │ -
553
│ │ │ │ -
│ │ │ │ -
557 void saveDecomposition(const char* file)
│ │ │ │ -
558 {
│ │ │ │ -
559 int errcode = Caller::save_numeric(UMF_Numeric, const_cast<char*>(file));
│ │ │ │ -
560 if (errcode != UMFPACK_OK)
│ │ │ │ -
561 DUNE_THROW(Dune::Exception,"IO ERROR while trying to save UMFPack decomposition");
│ │ │ │ -
562 }
│ │ │ │ -
│ │ │ │ -
563
│ │ │ │ -
│ │ │ │ -
565 void setMatrix(const Matrix& matrix)
│ │ │ │ -
566 {
│ │ │ │ -
567 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
│ │ │ │ -
568 free();
│ │ │ │ -
569 if (matrix.N() == 0 or matrix.M() == 0)
│ │ │ │ -
570 return;
│ │ │ │ -
571
│ │ │ │ -
572 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
│ │ │ │ -
573 umfpackMatrix_.free();
│ │ │ │ -
574 umfpackMatrix_.setSize(MatrixDimension<Matrix>::rowdim(matrix),
│ │ │ │ - │ │ │ │ -
576 ISTL::Impl::BCCSMatrixInitializer<Matrix, umf_int_type> initializer(umfpackMatrix_);
│ │ │ │ -
577
│ │ │ │ -
578 copyToBCCSMatrix(initializer, matrix);
│ │ │ │ -
579
│ │ │ │ -
580 decompose();
│ │ │ │ -
581 }
│ │ │ │ -
│ │ │ │ -
582
│ │ │ │ -
583 template<class S>
│ │ │ │ -
│ │ │ │ -
584 void setSubMatrix(const Matrix& _mat, const S& rowIndexSet)
│ │ │ │ -
585 {
│ │ │ │ -
586 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
│ │ │ │ -
587 free();
│ │ │ │ -
588
│ │ │ │ -
589 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
│ │ │ │ -
590 umfpackMatrix_.free();
│ │ │ │ -
591
│ │ │ │ -
592 umfpackMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(_mat) / _mat.N(),
│ │ │ │ -
593 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(_mat) / _mat.M());
│ │ │ │ -
594 ISTL::Impl::BCCSMatrixInitializer<Matrix, umf_int_type> initializer(umfpackMatrix_);
│ │ │ │ -
595
│ │ │ │ -
596 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(_mat,rowIndexSet));
│ │ │ │ -
597
│ │ │ │ -
598 decompose();
│ │ │ │ -
599 }
│ │ │ │ -
│ │ │ │ -
600
│ │ │ │ -
│ │ │ │ -
608 void setVerbosity(int v)
│ │ │ │ -
609 {
│ │ │ │ -
610 verbosity_ = v;
│ │ │ │ -
611 // set the verbosity level in UMFPack
│ │ │ │ -
612 if (verbosity_ == 0)
│ │ │ │ -
613 UMF_Control[UMFPACK_PRL] = 1;
│ │ │ │ -
614 if (verbosity_ == 1)
│ │ │ │ -
615 UMF_Control[UMFPACK_PRL] = 2;
│ │ │ │ -
616 if (verbosity_ == 2)
│ │ │ │ -
617 UMF_Control[UMFPACK_PRL] = 4;
│ │ │ │ -
618 }
│ │ │ │ -
│ │ │ │ -
619
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
625 {
│ │ │ │ -
626 return UMF_Numeric;
│ │ │ │ -
627 }
│ │ │ │ -
│ │ │ │ -
628
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
634 {
│ │ │ │ -
635 return umfpackMatrix_;
│ │ │ │ -
636 }
│ │ │ │ -
│ │ │ │ -
637
│ │ │ │ -
│ │ │ │ -
642 void free()
│ │ │ │ -
643 {
│ │ │ │ -
644 if (!matrixIsLoaded_)
│ │ │ │ -
645 {
│ │ │ │ -
646 Caller::free_symbolic(&UMF_Symbolic);
│ │ │ │ -
647 umfpackMatrix_.free();
│ │ │ │ -
648 }
│ │ │ │ -
649 Caller::free_numeric(&UMF_Numeric);
│ │ │ │ -
650 matrixIsLoaded_ = false;
│ │ │ │ -
651 }
│ │ │ │ -
│ │ │ │ -
652
│ │ │ │ -
653 const char* name() { return "UMFPACK"; }
│ │ │ │ -
654
│ │ │ │ -
655 private:
│ │ │ │ -
656 typedef typename Dune::UMFPackMethodChooser<T,std::integral_constant<bool, (sizeof(typename M::size_type) == 8)>> Caller;
│ │ │ │ -
657
│ │ │ │ -
658 template<class Mat,class X, class TM, class TD, class T1>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
661
│ │ │ │ -
663 void decompose()
│ │ │ │ -
664 {
│ │ │ │ -
665 double UMF_Decomposition_Info[UMFPACK_INFO];
│ │ │ │ -
666 Caller::symbolic(static_cast<umf_int_type>(umfpackMatrix_.N()),
│ │ │ │ -
667 static_cast<umf_int_type>(umfpackMatrix_.N()),
│ │ │ │ -
668 umfpackMatrix_.getColStart(),
│ │ │ │ -
669 umfpackMatrix_.getRowIndex(),
│ │ │ │ -
670 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
│ │ │ │ -
671 &UMF_Symbolic,
│ │ │ │ -
672 UMF_Control,
│ │ │ │ -
673 UMF_Decomposition_Info);
│ │ │ │ -
674 Caller::numeric(umfpackMatrix_.getColStart(),
│ │ │ │ -
675 umfpackMatrix_.getRowIndex(),
│ │ │ │ -
676 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
│ │ │ │ -
677 UMF_Symbolic,
│ │ │ │ -
678 &UMF_Numeric,
│ │ │ │ -
679 UMF_Control,
│ │ │ │ -
680 UMF_Decomposition_Info);
│ │ │ │ -
681 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]);
│ │ │ │ -
682 if (verbosity_ == 1)
│ │ │ │ -
683 {
│ │ │ │ -
684 std::cout << "[UMFPack Decomposition]" << std::endl;
│ │ │ │ -
685 std::cout << "Wallclock Time taken: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_WALLTIME] << " (CPU Time: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_TIME] << ")" << std::endl;
│ │ │ │ -
686 std::cout << "Flops taken: " << UMF_Decomposition_Info[UMFPACK_FLOPS] << std::endl;
│ │ │ │ -
687 std::cout << "Peak Memory Usage: " << UMF_Decomposition_Info[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << " bytes" << std::endl;
│ │ │ │ -
688 std::cout << "Condition number estimate: " << 1./UMF_Decomposition_Info[UMFPACK_RCOND] << std::endl;
│ │ │ │ -
689 std::cout << "Numbers of non-zeroes in decomposition: L: " << UMF_Decomposition_Info[UMFPACK_LNZ] << " U: " << UMF_Decomposition_Info[UMFPACK_UNZ] << std::endl;
│ │ │ │ -
690 }
│ │ │ │ -
691 if (verbosity_ == 2)
│ │ │ │ -
692 {
│ │ │ │ -
693 Caller::report_info(UMF_Control,UMF_Decomposition_Info);
│ │ │ │ -
694 }
│ │ │ │ -
695 }
│ │ │ │ -
696
│ │ │ │ -
697 void printOnApply(double* UMF_Info)
│ │ │ │ -
698 {
│ │ │ │ -
699 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]);
│ │ │ │ -
700 if (verbosity_ > 0)
│ │ │ │ -
701 {
│ │ │ │ -
702 std::cout << "[UMFPack Solve]" << std::endl;
│ │ │ │ -
703 std::cout << "Wallclock Time: " << UMF_Info[UMFPACK_SOLVE_WALLTIME] << " (CPU Time: " << UMF_Info[UMFPACK_SOLVE_TIME] << ")" << std::endl;
│ │ │ │ -
704 std::cout << "Flops Taken: " << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl;
│ │ │ │ -
705 std::cout << "Iterative Refinement steps taken: " << UMF_Info[UMFPACK_IR_TAKEN] << std::endl;
│ │ │ │ -
706 std::cout << "Error Estimate: " << UMF_Info[UMFPACK_OMEGA1] << " resp. " << UMF_Info[UMFPACK_OMEGA2] << std::endl;
│ │ │ │ -
707 }
│ │ │ │ -
708 }
│ │ │ │ -
709
│ │ │ │ -
710 UMFPackMatrix umfpackMatrix_;
│ │ │ │ -
711 bool matrixIsLoaded_;
│ │ │ │ -
712 int verbosity_;
│ │ │ │ -
713 void *UMF_Symbolic;
│ │ │ │ -
714 void *UMF_Numeric;
│ │ │ │ -
715 double UMF_Control[UMFPACK_CONTROL];
│ │ │ │ -
716 };
│ │ │ │ -
│ │ │ │ -
717
│ │ │ │ -
718 template<typename T, typename A, int n, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
720 {
│ │ │ │ -
721 enum { value=true};
│ │ │ │ -
722 };
│ │ │ │ -
│ │ │ │ -
723
│ │ │ │ -
724 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
726 {
│ │ │ │ -
727 enum { value = true };
│ │ │ │ -
728 };
│ │ │ │ -
│ │ │ │ -
729
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
731 template<class F,class=void> struct isValidBlock : std::false_type{};
│ │ │ │ -
732 template<class B> struct isValidBlock<B, std::enable_if_t<std::is_same<typename FieldTraits<B>::real_type,double>::value>> : std::true_type {};
│ │ │ │ -
733
│ │ │ │ -
734 template<typename TL, typename M>
│ │ │ │ -
735 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
736 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
│ │ │ │ -
737 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
│ │ │ │ -
738 std::enable_if_t<
│ │ │ │ -
739 isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ -
740 {
│ │ │ │ -
741 int verbose = config.get("verbose", 0);
│ │ │ │ -
742 return std::make_shared<Dune::UMFPack<M>>(mat,verbose);
│ │ │ │ -
743 }
│ │ │ │ -
│ │ │ │ -
744
│ │ │ │ -
745 // second version with SFINAE to validate the template parameters of UMFPack
│ │ │ │ -
746 template<typename TL, typename M>
│ │ │ │ -
747 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
748 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
│ │ │ │ -
749 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ -
750 std::enable_if_t<
│ │ │ │ -
751 !isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ -
752 {
│ │ │ │ -
753 DUNE_THROW(UnsupportedType,
│ │ │ │ -
754 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ -
755 }
│ │ │ │ -
│ │ │ │ -
756 };
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
758} // end namespace Dune
│ │ │ │ -
759
│ │ │ │ -
760#endif // HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
761
│ │ │ │ -
762#endif //DUNE_ISTL_UMFPACK_HH
│ │ │ │ -
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
static void numeric(const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:256
│ │ │ │ -
void free()
free allocated space.
Definition umfpack.hh:642
│ │ │ │ -
static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type *ri, std::complex< double > *val, double *x, const double *b, A... args)
Definition umfpack.hh:215
│ │ │ │ -
virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition umfpack.hh:479
│ │ │ │ -
ISTL::Impl::BCCSMatrixInitializer< M, umf_int_type > MatrixInitializer
Type of an associated initializer class.
Definition umfpack.hh:346
│ │ │ │ -
static void report_info(A... args)
Definition umfpack.hh:200
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition umfpack.hh:353
│ │ │ │ -
M matrix_type
Definition umfpack.hh:341
│ │ │ │ -
void setMatrix(const Matrix &matrix)
Initialize data from given matrix.
Definition umfpack.hh:565
│ │ │ │ -
static int save_numeric(A... args)
Definition umfpack.hh:210
│ │ │ │ -
static void numeric(A... args)
Definition umfpack.hh:79
│ │ │ │ -
UMFPack(const Matrix &mat_, const ParameterTree &config)
Construct a solver object from a matrix.
Definition umfpack.hh:403
│ │ │ │ -
static void symbolic(umf_int_type m, umf_int_type n, const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:221
│ │ │ │ -
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
Definition umfpack.hh:737
│ │ │ │ -
static void report_status(A... args)
Definition umfpack.hh:89
│ │ │ │ -
UMFPack(const Matrix &mat_, const char *file, int verbose=0)
Try loading a decomposition from file and do a decomposition if unsuccessful.
Definition umfpack.hh:427
│ │ │ │ -
static int load_numeric(A... args)
Definition umfpack.hh:131
│ │ │ │ -
static void free_numeric(A... args)
Definition umfpack.hh:64
│ │ │ │ -
static void defaults(A... args)
Definition umfpack.hh:175
│ │ │ │ -
typename Impl::UMFPackVectorChooser< M >::range_type range_type
The type of the range of the solver.
Definition umfpack.hh:350
│ │ │ │ -
static int save_numeric(A... args)
Definition umfpack.hh:271
│ │ │ │ -
static void report_info(A... args)
Definition umfpack.hh:84
│ │ │ │ -
static void solve(A... args)
Definition umfpack.hh:99
│ │ │ │ -
UMFPack()
default constructor
Definition umfpack.hh:409
│ │ │ │ - │ │ │ │ -
static int load_numeric(A... args)
Definition umfpack.hh:251
│ │ │ │ -
static void symbolic(A... args)
Definition umfpack.hh:161
│ │ │ │ -
static void numeric(A... args)
Definition umfpack.hh:136
│ │ │ │ -
static void report_info(A... args)
Definition umfpack.hh:141
│ │ │ │ -
static void report_status(A... args)
Definition umfpack.hh:205
│ │ │ │ -
static void free_symbolic(A... args)
Definition umfpack.hh:69
│ │ │ │ -
static void free_symbolic(A... args)
Definition umfpack.hh:185
│ │ │ │ -
static void numeric(const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:195
│ │ │ │ -
void setSubMatrix(const Matrix &_mat, const S &rowIndexSet)
Definition umfpack.hh:584
│ │ │ │ -
static void solve(A... args)
Definition umfpack.hh:156
│ │ │ │ -
static void free_numeric(A... args)
Definition umfpack.hh:180
│ │ │ │ -
void apply(T *x, T *b)
additional apply method with c-arrays in analogy to superlu
Definition umfpack.hh:520
│ │ │ │ - │ │ │ │ -
static constexpr bool valid
Definition umfpack.hh:50
│ │ │ │ -
void setVerbosity(int v)
sets the verbosity level for the UMFPack solver
Definition umfpack.hh:608
│ │ │ │ -
UMFPack(const char *file, int verbose=0)
try loading a decomposition from file
Definition umfpack.hh:454
│ │ │ │ -
static void defaults(A... args)
Definition umfpack.hh:236
│ │ │ │ -
static int save_numeric(A... args)
Definition umfpack.hh:151
│ │ │ │ -
static int load_numeric(A... args)
Definition umfpack.hh:74
│ │ │ │ -
static void symbolic(A... args)
Definition umfpack.hh:104
│ │ │ │ -
virtual ~UMFPack()
Definition umfpack.hh:470
│ │ │ │ -
const char * name()
Definition umfpack.hh:653
│ │ │ │ -
ISTL::Impl::BCCSMatrix< typename Matrix::field_type, umf_int_type > UMFPackMatrix
The corresponding UMFPack matrix type.
Definition umfpack.hh:344
│ │ │ │ -
static void free_symbolic(A... args)
Definition umfpack.hh:126
│ │ │ │ -
void saveDecomposition(const char *file)
saves a decomposition to a file
Definition umfpack.hh:557
│ │ │ │ -
UMFPackMatrix & getInternalMatrix()
Return the column compress matrix from UMFPack.
Definition umfpack.hh:633
│ │ │ │ -
static void free_numeric(A... args)
Definition umfpack.hh:121
│ │ │ │ -
static void free_numeric(A... args)
Definition umfpack.hh:241
│ │ │ │ -
static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type *ri, std::complex< double > *val, double *x, const double *b, A... args)
Definition umfpack.hh:276
│ │ │ │ -
static void report_status(A... args)
Definition umfpack.hh:146
│ │ │ │ -
typename Impl::UMFPackVectorChooser< M >::domain_type domain_type
The type of the domain of the solver.
Definition umfpack.hh:348
│ │ │ │ -
UMFPack(const Matrix &matrix, int verbose=0)
Construct a solver object from a matrix.
Definition umfpack.hh:366
│ │ │ │ -
static int save_numeric(A... args)
Definition umfpack.hh:94
│ │ │ │ -
static void report_info(A... args)
Definition umfpack.hh:261
│ │ │ │ -
virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
apply inverse operator, with given convergence criteria.
Definition umfpack.hh:510
│ │ │ │ -
void setOption(unsigned int option, double value)
Set UMFPack-specific options.
Definition umfpack.hh:546
│ │ │ │ -
static void defaults(A... args)
Definition umfpack.hh:59
│ │ │ │ -
M Matrix
The matrix type.
Definition umfpack.hh:340
│ │ │ │ -
static void symbolic(umf_int_type m, std::size_t n, const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:282
│ │ │ │ -
static void free_symbolic(A... args)
Definition umfpack.hh:246
│ │ │ │ -
static void defaults(A... args)
Definition umfpack.hh:116
│ │ │ │ -
std::conditional_t<(sizeof(typename M::size_type)==8), int64_t, int32_t > umf_int_type
Definition umfpack.hh:342
│ │ │ │ -
static int load_numeric(A... args)
Definition umfpack.hh:190
│ │ │ │ -
UMFPack(const Matrix &matrix, int verbose, bool)
Constructor for compatibility with SuperLU standard constructor.
Definition umfpack.hh:384
│ │ │ │ -
void * getFactorization()
Return the matrix factorization.
Definition umfpack.hh:624
│ │ │ │ -
static void report_status(A... args)
Definition umfpack.hh:266
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
STL namespace.
│ │ │ │ +
25
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
36 : public BCRSMatrixError
│ │ │ │ +
37 {};
│ │ │ │ +
│ │ │ │ +
38
│ │ │ │ +
40
│ │ │ │ +
46 class SolverAbort : public ISTLError {};
│ │ │ │ +
47
│ │ │ │ +
49
│ │ │ │ +
│ │ │ │ +
52 class MatrixBlockError : public virtual Dune::FMatrixError {
│ │ │ │ +
53 public:
│ │ │ │ +
54 int r, c; // row and column index of the entry from which the error resulted
│ │ │ │ +
55 };
│ │ │ │ +
│ │ │ │ +
56
│ │ │ │ +
59} // end namespace
│ │ │ │ +
60
│ │ │ │ +
61#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
Definition matrixutils.hh:211
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ -
Definition overlappingschwarz.hh:694
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
double elapsed
Elapsed time in seconds.
Definition solver.hh:82
│ │ │ │ -
int iterations
Number of iterations.
Definition solver.hh:67
│ │ │ │ -
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ -
Definition solverregistry.hh:77
│ │ │ │ -
Definition solvertype.hh:16
│ │ │ │ -
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
│ │ │ │ -
Definition solvertype.hh:30
│ │ │ │ -
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
│ │ │ │ -
Definition umfpack.hh:49
│ │ │ │ -
The UMFPack direct sparse solver.
Definition umfpack.hh:335
│ │ │ │ -
Definition umfpack.hh:730
│ │ │ │ -
Definition umfpack.hh:731
│ │ │ │ +
Error specific to BCRSMatrix.
Definition istlexception.hh:24
│ │ │ │ +
Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
Definition istlexception.hh:37
│ │ │ │ +
Thrown when a solver aborts due to some problem.
Definition istlexception.hh:46
│ │ │ │ +
Error when performing an operation on a matrix block.
Definition istlexception.hh:52
│ │ │ │ +
int c
Definition istlexception.hh:54
│ │ │ │ +
int r
Definition istlexception.hh:54
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1059 +1,69 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -umfpack.hh │ │ │ │ │ +istlexception.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_UMFPACK_HH │ │ │ │ │ -6#define DUNE_ISTL_UMFPACK_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH │ │ │ │ │ +6#define DUNE_ISTL_ISTLEXCEPTION_HH │ │ │ │ │ 7 │ │ │ │ │ -8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN │ │ │ │ │ -9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e { │ │ │ │ │ 12 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include<_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -19#include<_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -20#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -21#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ -23 │ │ │ │ │ -24 │ │ │ │ │ +_1_9 class _I_S_T_L_E_r_r_o_r : public Dune::MathError {}; │ │ │ │ │ +20 │ │ │ │ │ +_2_2 class _B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ +23 : public _I_S_T_L_E_r_r_o_r │ │ │ │ │ +24 {}; │ │ │ │ │ 25 │ │ │ │ │ -26namespace _D_u_n_e { │ │ │ │ │ -38 // FORWARD DECLARATIONS │ │ │ │ │ -39 template │ │ │ │ │ -40 class SeqOverlappingSchwarz; │ │ │ │ │ -41 │ │ │ │ │ -42 template │ │ │ │ │ -43 struct SeqOverlappingSchwarzAssemblerHelper; │ │ │ │ │ -44 │ │ │ │ │ -45 // wrapper class for C-Function Calls in the backend. Choose the right │ │ │ │ │ -function namespace │ │ │ │ │ -46 // depending on the template parameter used. │ │ │ │ │ -47template │ │ │ │ │ -_4_8 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ -49 { │ │ │ │ │ -_5_0 static constexpr bool _v_a_l_i_d = false ; │ │ │ │ │ -51 }; │ │ │ │ │ -52 │ │ │ │ │ -53 template<> │ │ │ │ │ -_5_4 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ -55 { │ │ │ │ │ -_5_6 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ -57 │ │ │ │ │ -58 template │ │ │ │ │ -_5_9 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ -60 { │ │ │ │ │ -61 umfpack_dl_defaults(args...); │ │ │ │ │ -62 } │ │ │ │ │ -63 template │ │ │ │ │ -_6_4 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -65 { │ │ │ │ │ -66 umfpack_dl_free_numeric(args...); │ │ │ │ │ -67 } │ │ │ │ │ -68 template │ │ │ │ │ -_6_9 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ -70 { │ │ │ │ │ -71 umfpack_dl_free_symbolic(args...); │ │ │ │ │ -72 } │ │ │ │ │ -73 template │ │ │ │ │ -_7_4 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -75 { │ │ │ │ │ -76 return umfpack_dl_load_numeric(args...); │ │ │ │ │ -77 } │ │ │ │ │ -78 template │ │ │ │ │ -_7_9 static void _n_u_m_e_r_i_c(A... args) │ │ │ │ │ -80 { │ │ │ │ │ -81 umfpack_dl_numeric(args...); │ │ │ │ │ -82 } │ │ │ │ │ -83 template │ │ │ │ │ -_8_4 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ -85 { │ │ │ │ │ -86 umfpack_dl_report_info(args...); │ │ │ │ │ -87 } │ │ │ │ │ -88 template │ │ │ │ │ -_8_9 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ -90 { │ │ │ │ │ -91 umfpack_dl_report_status(args...); │ │ │ │ │ -92 } │ │ │ │ │ -93 template │ │ │ │ │ -_9_4 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -95 { │ │ │ │ │ -96 return umfpack_dl_save_numeric(args...); │ │ │ │ │ -97 } │ │ │ │ │ -98 template │ │ │ │ │ -_9_9 static void _s_o_l_v_e(A... args) │ │ │ │ │ -100 { │ │ │ │ │ -101 umfpack_dl_solve(args...); │ │ │ │ │ -102 } │ │ │ │ │ -103 template │ │ │ │ │ -_1_0_4 static void _s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ -105 { │ │ │ │ │ -106 umfpack_dl_symbolic(args...); │ │ │ │ │ -107 } │ │ │ │ │ -108 }; │ │ │ │ │ -109 │ │ │ │ │ -110 template<> │ │ │ │ │ -_1_1_1 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ -112 { │ │ │ │ │ -_1_1_3 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ -114 │ │ │ │ │ -115 template │ │ │ │ │ -_1_1_6 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ -117 { │ │ │ │ │ -118 umfpack_di_defaults(args...); │ │ │ │ │ -119 } │ │ │ │ │ -120 template │ │ │ │ │ -_1_2_1 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -122 { │ │ │ │ │ -123 umfpack_di_free_numeric(args...); │ │ │ │ │ -124 } │ │ │ │ │ -125 template │ │ │ │ │ -_1_2_6 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ -127 { │ │ │ │ │ -128 umfpack_di_free_symbolic(args...); │ │ │ │ │ -129 } │ │ │ │ │ -130 template │ │ │ │ │ -_1_3_1 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -132 { │ │ │ │ │ -133 return umfpack_di_load_numeric(args...); │ │ │ │ │ -134 } │ │ │ │ │ -135 template │ │ │ │ │ -_1_3_6 static void _n_u_m_e_r_i_c(A... args) │ │ │ │ │ -137 { │ │ │ │ │ -138 umfpack_di_numeric(args...); │ │ │ │ │ -139 } │ │ │ │ │ -140 template │ │ │ │ │ -_1_4_1 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ -142 { │ │ │ │ │ -143 umfpack_di_report_info(args...); │ │ │ │ │ -144 } │ │ │ │ │ -145 template │ │ │ │ │ -_1_4_6 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ -147 { │ │ │ │ │ -148 umfpack_di_report_status(args...); │ │ │ │ │ -149 } │ │ │ │ │ -150 template │ │ │ │ │ -_1_5_1 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -152 { │ │ │ │ │ -153 return umfpack_di_save_numeric(args...); │ │ │ │ │ -154 } │ │ │ │ │ -155 template │ │ │ │ │ -_1_5_6 static void _s_o_l_v_e(A... args) │ │ │ │ │ -157 { │ │ │ │ │ -158 umfpack_di_solve(args...); │ │ │ │ │ -159 } │ │ │ │ │ -160 template │ │ │ │ │ -_1_6_1 static void _s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ -162 { │ │ │ │ │ -163 umfpack_di_symbolic(args...); │ │ │ │ │ -164 } │ │ │ │ │ -165 }; │ │ │ │ │ -166 │ │ │ │ │ -167 template<> │ │ │ │ │ -_1_6_8 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r<_s_t_d::complex, std::true_type> │ │ │ │ │ -169 { │ │ │ │ │ -_1_7_0 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ -171 │ │ │ │ │ -_1_7_2 using _u_m_f___i_n_t___t_y_p_e = int64_t; │ │ │ │ │ -173 │ │ │ │ │ -174 template │ │ │ │ │ -_1_7_5 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ -176 { │ │ │ │ │ -177 umfpack_zl_defaults(args...); │ │ │ │ │ -178 } │ │ │ │ │ -179 template │ │ │ │ │ -_1_8_0 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -181 { │ │ │ │ │ -182 umfpack_zl_free_numeric(args...); │ │ │ │ │ -183 } │ │ │ │ │ -184 template │ │ │ │ │ -_1_8_5 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ -186 { │ │ │ │ │ -187 umfpack_zl_free_symbolic(args...); │ │ │ │ │ -188 } │ │ │ │ │ -189 template │ │ │ │ │ -_1_9_0 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -191 { │ │ │ │ │ -192 return umfpack_zl_load_numeric(args...); │ │ │ │ │ -193 } │ │ │ │ │ -194 template │ │ │ │ │ -_1_9_5 static void _n_u_m_e_r_i_c(const _u_m_f___i_n_t___t_y_p_e* cs, const _u_m_f___i_n_t___t_y_p_e* ri, const │ │ │ │ │ -double* val, A... args) │ │ │ │ │ -196 { │ │ │ │ │ -197 umfpack_zl_numeric(cs,ri,val,NULL,args...); │ │ │ │ │ -198 } │ │ │ │ │ -199 template │ │ │ │ │ -_2_0_0 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ -201 { │ │ │ │ │ -202 umfpack_zl_report_info(args...); │ │ │ │ │ -203 } │ │ │ │ │ -204 template │ │ │ │ │ -_2_0_5 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ -206 { │ │ │ │ │ -207 umfpack_zl_report_status(args...); │ │ │ │ │ -208 } │ │ │ │ │ -209 template │ │ │ │ │ -_2_1_0 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -211 { │ │ │ │ │ -212 return umfpack_zl_save_numeric(args...); │ │ │ │ │ -213 } │ │ │ │ │ -214 template │ │ │ │ │ -_2_1_5 static void _s_o_l_v_e(_u_m_f___i_n_t___t_y_p_e m, const _u_m_f___i_n_t___t_y_p_e* cs, const │ │ │ │ │ -_u_m_f___i_n_t___t_y_p_e* ri, std::complex* val, double* x, const double* b,A... │ │ │ │ │ -args) │ │ │ │ │ -216 { │ │ │ │ │ -217 const double* cval = reinterpret_cast(val); │ │ │ │ │ -218 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...); │ │ │ │ │ -219 } │ │ │ │ │ -220 template │ │ │ │ │ -_2_2_1 static void _s_y_m_b_o_l_i_c(_u_m_f___i_n_t___t_y_p_e m, _u_m_f___i_n_t___t_y_p_e n, const _u_m_f___i_n_t___t_y_p_e* │ │ │ │ │ -cs, const _u_m_f___i_n_t___t_y_p_e* ri, const double* val, A... args) │ │ │ │ │ -222 { │ │ │ │ │ -223 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...); │ │ │ │ │ -224 } │ │ │ │ │ -225 }; │ │ │ │ │ -226 │ │ │ │ │ -227 │ │ │ │ │ -228 template<> │ │ │ │ │ -_2_2_9 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r<_s_t_d::complex, std::false_type> │ │ │ │ │ -230 { │ │ │ │ │ -_2_3_1 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ -232 │ │ │ │ │ -_2_3_3 using _u_m_f___i_n_t___t_y_p_e = int32_t; │ │ │ │ │ -234 │ │ │ │ │ -235 template │ │ │ │ │ -_2_3_6 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ -237 { │ │ │ │ │ -238 umfpack_zi_defaults(args...); │ │ │ │ │ -239 } │ │ │ │ │ -240 template │ │ │ │ │ -_2_4_1 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -242 { │ │ │ │ │ -243 umfpack_zi_free_numeric(args...); │ │ │ │ │ -244 } │ │ │ │ │ -245 template │ │ │ │ │ -_2_4_6 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ -247 { │ │ │ │ │ -248 umfpack_zi_free_symbolic(args...); │ │ │ │ │ -249 } │ │ │ │ │ -250 template │ │ │ │ │ -_2_5_1 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -252 { │ │ │ │ │ -253 return umfpack_zi_load_numeric(args...); │ │ │ │ │ -254 } │ │ │ │ │ -255 template │ │ │ │ │ -_2_5_6 static void _n_u_m_e_r_i_c(const _u_m_f___i_n_t___t_y_p_e* cs, const _u_m_f___i_n_t___t_y_p_e* ri, const │ │ │ │ │ -double* val, A... args) │ │ │ │ │ -257 { │ │ │ │ │ -258 umfpack_zi_numeric(cs,ri,val,NULL,args...); │ │ │ │ │ -259 } │ │ │ │ │ -260 template │ │ │ │ │ -_2_6_1 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ -262 { │ │ │ │ │ -263 umfpack_zi_report_info(args...); │ │ │ │ │ -264 } │ │ │ │ │ -265 template │ │ │ │ │ -_2_6_6 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ -267 { │ │ │ │ │ -268 umfpack_zi_report_status(args...); │ │ │ │ │ -269 } │ │ │ │ │ -270 template │ │ │ │ │ -_2_7_1 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ -272 { │ │ │ │ │ -273 return umfpack_zi_save_numeric(args...); │ │ │ │ │ -274 } │ │ │ │ │ -275 template │ │ │ │ │ -_2_7_6 static void _s_o_l_v_e(_u_m_f___i_n_t___t_y_p_e m, const _u_m_f___i_n_t___t_y_p_e* cs, const │ │ │ │ │ -_u_m_f___i_n_t___t_y_p_e* ri, std::complex* val, double* x, const double* b,A... │ │ │ │ │ -args) │ │ │ │ │ -277 { │ │ │ │ │ -278 const double* cval = reinterpret_cast(val); │ │ │ │ │ -279 umfpack_zi_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...); │ │ │ │ │ -280 } │ │ │ │ │ -281 template │ │ │ │ │ -_2_8_2 static void _s_y_m_b_o_l_i_c(_u_m_f___i_n_t___t_y_p_e m, std::size_t n, const _u_m_f___i_n_t___t_y_p_e* cs, │ │ │ │ │ -const _u_m_f___i_n_t___t_y_p_e* ri, const double* val, A... args) │ │ │ │ │ -283 { │ │ │ │ │ -284 umfpack_zi_symbolic(m,n,cs,ri,val,NULL,args...); │ │ │ │ │ -285 } │ │ │ │ │ -286 }; │ │ │ │ │ -287 │ │ │ │ │ -288 namespace Impl │ │ │ │ │ -289 { │ │ │ │ │ -290 template │ │ │ │ │ -291 struct UMFPackVectorChooser │ │ │ │ │ -292 {}; │ │ │ │ │ -293 │ │ │ │ │ -294 template │ │ │ │ │ -295 struct UMFPackVectorChooser,A > > │ │ │ │ │ -296 { │ │ │ │ │ -298 using domain_type = BlockVector< │ │ │ │ │ -299 FieldVector, │ │ │ │ │ -300 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ ->; │ │ │ │ │ -302 using range_type = BlockVector< │ │ │ │ │ -303 FieldVector, │ │ │ │ │ -304 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ ->; │ │ │ │ │ -305 }; │ │ │ │ │ -306 │ │ │ │ │ -307 template │ │ │ │ │ -308 struct UMFPackVectorChooser > │ │ │ │ │ -309 { │ │ │ │ │ -311 using domain_type = BlockVector; │ │ │ │ │ -313 using range_type = BlockVector; │ │ │ │ │ -314 }; │ │ │ │ │ -315 } │ │ │ │ │ -316 │ │ │ │ │ -330 template │ │ │ │ │ -_3_3_1 class _U_M_F_P_a_c_k │ │ │ │ │ -332 : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< │ │ │ │ │ -333 typename Impl::UMFPackVectorChooser::domain_type, │ │ │ │ │ -334 typename Impl::UMFPackVectorChooser::range_type > │ │ │ │ │ -335 { │ │ │ │ │ -336 using T = typename M::field_type; │ │ │ │ │ -337 │ │ │ │ │ -338 public: │ │ │ │ │ -_3_4_0 using _M_a_t_r_i_x = M; │ │ │ │ │ -_3_4_1 using _m_a_t_r_i_x___t_y_p_e = M; │ │ │ │ │ -_3_4_2 using _u_m_f___i_n_t___t_y_p_e = std::conditional_t<(sizeof(typename M::size_type) == │ │ │ │ │ -8), int64_t, int32_t>; │ │ │ │ │ -_3_4_4 typedef ISTL::Impl::BCCSMatrix │ │ │ │ │ -_U_M_F_P_a_c_k_M_a_t_r_i_x; │ │ │ │ │ -_3_4_6 typedef ISTL::Impl::BCCSMatrixInitializer │ │ │ │ │ -_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -_3_4_8 using _d_o_m_a_i_n___t_y_p_e = typename Impl::UMFPackVectorChooser::domain_type; │ │ │ │ │ -_3_5_0 using _r_a_n_g_e___t_y_p_e = typename Impl::UMFPackVectorChooser::range_type; │ │ │ │ │ -351 │ │ │ │ │ -_3_5_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -354 { │ │ │ │ │ -355 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -356 } │ │ │ │ │ -357 │ │ │ │ │ -_3_6_6 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& matrix, int verbose=0) : matrixIsLoaded_(false) │ │ │ │ │ -367 { │ │ │ │ │ -368 //check whether T is a supported type │ │ │ │ │ -369 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -370 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -371 Caller::defaults(UMF_Control); │ │ │ │ │ -372 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ -373 _s_e_t_M_a_t_r_i_x(matrix); │ │ │ │ │ -374 } │ │ │ │ │ -375 │ │ │ │ │ -_3_8_4 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& matrix, int verbose, bool) : matrixIsLoaded_(false) │ │ │ │ │ -385 { │ │ │ │ │ -386 //check whether T is a supported type │ │ │ │ │ -387 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -388 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -389 Caller::defaults(UMF_Control); │ │ │ │ │ -390 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ -391 _s_e_t_M_a_t_r_i_x(matrix); │ │ │ │ │ -392 } │ │ │ │ │ -393 │ │ │ │ │ -_4_0_3 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& mat_, const ParameterTree& config) │ │ │ │ │ -404 : _U_M_F_P_a_c_k(mat_, config._g_e_t("verbose", 0)) │ │ │ │ │ -405 {} │ │ │ │ │ -406 │ │ │ │ │ -_4_0_9 _U_M_F_P_a_c_k() : matrixIsLoaded_(false), verbosity_(0) │ │ │ │ │ -410 { │ │ │ │ │ -411 //check whether T is a supported type │ │ │ │ │ -412 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -413 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -414 Caller::defaults(UMF_Control); │ │ │ │ │ -415 } │ │ │ │ │ -416 │ │ │ │ │ -_4_2_7 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& mat_, const char* file, int verbose=0) │ │ │ │ │ -428 { │ │ │ │ │ -429 //check whether T is a supported type │ │ │ │ │ -430 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -431 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -432 Caller::defaults(UMF_Control); │ │ │ │ │ -433 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ -434 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file)); │ │ │ │ │ -435 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode == │ │ │ │ │ -UMFPACK_ERROR_file_IO)) │ │ │ │ │ -436 { │ │ │ │ │ -437 matrixIsLoaded_ = false; │ │ │ │ │ -438 _s_e_t_M_a_t_r_i_x(mat_); │ │ │ │ │ -439 _s_a_v_e_D_e_c_o_m_p_o_s_i_t_i_o_n(file); │ │ │ │ │ -440 } │ │ │ │ │ -441 else │ │ │ │ │ -442 { │ │ │ │ │ -443 matrixIsLoaded_ = true; │ │ │ │ │ -444 std::cout << "UMFPack decomposition successfully loaded from " << file << │ │ │ │ │ -std::endl; │ │ │ │ │ -445 } │ │ │ │ │ -446 } │ │ │ │ │ -447 │ │ │ │ │ -_4_5_4 _U_M_F_P_a_c_k(const char* file, int verbose=0) │ │ │ │ │ -455 { │ │ │ │ │ -456 //check whether T is a supported type │ │ │ │ │ -457 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -458 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -459 Caller::defaults(UMF_Control); │ │ │ │ │ -460 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file)); │ │ │ │ │ -461 if (errcode == UMFPACK_ERROR_out_of_memory) │ │ │ │ │ -462 DUNE_THROW(Dune::Exception, "ran out of memory while loading UMFPack │ │ │ │ │ -decomposition"); │ │ │ │ │ -463 if (errcode == UMFPACK_ERROR_file_IO) │ │ │ │ │ -464 DUNE_THROW(Dune::Exception, "IO error while loading UMFPack │ │ │ │ │ -decomposition"); │ │ │ │ │ -465 matrixIsLoaded_ = true; │ │ │ │ │ -466 std::cout << "UMFPack decomposition successfully loaded from " << file << │ │ │ │ │ -std::endl; │ │ │ │ │ -467 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ -468 } │ │ │ │ │ -469 │ │ │ │ │ -_4_7_0 virtual _~_U_M_F_P_a_c_k() │ │ │ │ │ -471 { │ │ │ │ │ -472 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -473 _f_r_e_e(); │ │ │ │ │ -474 } │ │ │ │ │ -475 │ │ │ │ │ -_4_7_9 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ -res) │ │ │ │ │ -480 { │ │ │ │ │ -481 if (umfpackMatrix_.N() != b.dim()) │ │ │ │ │ -482 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r, "Size of right-hand-side vector b does not │ │ │ │ │ -match the number of matrix rows!"); │ │ │ │ │ -483 if (umfpackMatrix_.M() != x.dim()) │ │ │ │ │ -484 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r, "Size of solution vector x does not match the │ │ │ │ │ -number of matrix columns!"); │ │ │ │ │ -485 if (b.size() == 0) │ │ │ │ │ -486 return; │ │ │ │ │ -487 │ │ │ │ │ -488 double UMF_Apply_Info[UMFPACK_INFO]; │ │ │ │ │ -489 Caller::solve(UMFPACK_A, │ │ │ │ │ -490 umfpackMatrix_.getColStart(), │ │ │ │ │ -491 umfpackMatrix_.getRowIndex(), │ │ │ │ │ -492 umfpackMatrix_.getValues(), │ │ │ │ │ -493 reinterpret_cast(&x[0]), │ │ │ │ │ -494 reinterpret_cast(&b[0]), │ │ │ │ │ -495 UMF_Numeric, │ │ │ │ │ -496 UMF_Control, │ │ │ │ │ -497 UMF_Apply_Info); │ │ │ │ │ -498 │ │ │ │ │ -499 //this is a direct solver │ │ │ │ │ -500 res._i_t_e_r_a_t_i_o_n_s = 1; │ │ │ │ │ -501 res._c_o_n_v_e_r_g_e_d = true; │ │ │ │ │ -502 res._e_l_a_p_s_e_d = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME]; │ │ │ │ │ -503 │ │ │ │ │ -504 printOnApply(UMF_Apply_Info); │ │ │ │ │ -505 } │ │ │ │ │ -506 │ │ │ │ │ -_5_1_0 virtual void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, [[maybe_unused]] double │ │ │ │ │ -reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -511 { │ │ │ │ │ -512 _a_p_p_l_y(x,b,res); │ │ │ │ │ -513 } │ │ │ │ │ -514 │ │ │ │ │ -_5_2_0 void _a_p_p_l_y(T* x, T* b) │ │ │ │ │ -521 { │ │ │ │ │ -522 double UMF_Apply_Info[UMFPACK_INFO]; │ │ │ │ │ -523 Caller::solve(UMFPACK_A, │ │ │ │ │ -524 umfpackMatrix_.getColStart(), │ │ │ │ │ -525 umfpackMatrix_.getRowIndex(), │ │ │ │ │ -526 umfpackMatrix_.getValues(), │ │ │ │ │ -527 x, │ │ │ │ │ -528 b, │ │ │ │ │ -529 UMF_Numeric, │ │ │ │ │ -530 UMF_Control, │ │ │ │ │ -531 UMF_Apply_Info); │ │ │ │ │ -532 printOnApply(UMF_Apply_Info); │ │ │ │ │ -533 } │ │ │ │ │ -534 │ │ │ │ │ -_5_4_6 void _s_e_t_O_p_t_i_o_n(unsigned int option, double value) │ │ │ │ │ -547 { │ │ │ │ │ -548 if (option >= UMFPACK_CONTROL) │ │ │ │ │ -549 DUNE_THROW(RangeError, "Requested non-existing UMFPack option"); │ │ │ │ │ -550 │ │ │ │ │ -551 UMF_Control[option] = value; │ │ │ │ │ -552 } │ │ │ │ │ -553 │ │ │ │ │ -_5_5_7 void _s_a_v_e_D_e_c_o_m_p_o_s_i_t_i_o_n(const char* file) │ │ │ │ │ -558 { │ │ │ │ │ -559 int errcode = Caller::save_numeric(UMF_Numeric, const_cast(file)); │ │ │ │ │ -560 if (errcode != UMFPACK_OK) │ │ │ │ │ -561 DUNE_THROW(Dune::Exception,"IO ERROR while trying to save UMFPack │ │ │ │ │ -decomposition"); │ │ │ │ │ -562 } │ │ │ │ │ -563 │ │ │ │ │ -_5_6_5 void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& matrix) │ │ │ │ │ -566 { │ │ │ │ │ -567 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -568 _f_r_e_e(); │ │ │ │ │ -569 if (matrix.N() == 0 or matrix.M() == 0) │ │ │ │ │ -570 return; │ │ │ │ │ -571 │ │ │ │ │ -572 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != │ │ │ │ │ -0) │ │ │ │ │ -573 umfpackMatrix_.free(); │ │ │ │ │ -574 umfpackMatrix_.setSize(_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(matrix), │ │ │ │ │ -575 _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(matrix)); │ │ │ │ │ -576 ISTL::Impl::BCCSMatrixInitializer initializer │ │ │ │ │ -(umfpackMatrix_); │ │ │ │ │ -577 │ │ │ │ │ -578 copyToBCCSMatrix(initializer, matrix); │ │ │ │ │ -579 │ │ │ │ │ -580 decompose(); │ │ │ │ │ -581 } │ │ │ │ │ -582 │ │ │ │ │ -583 template │ │ │ │ │ -_5_8_4 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& _mat, const S& rowIndexSet) │ │ │ │ │ -585 { │ │ │ │ │ -586 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -587 _f_r_e_e(); │ │ │ │ │ -588 │ │ │ │ │ -589 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != │ │ │ │ │ -0) │ │ │ │ │ -590 umfpackMatrix_.free(); │ │ │ │ │ -591 │ │ │ │ │ -592 umfpackMatrix_.setSize(rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m │ │ │ │ │ -(_mat) / _mat.N(), │ │ │ │ │ -593 rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_mat) / _mat.M()); │ │ │ │ │ -594 ISTL::Impl::BCCSMatrixInitializer initializer │ │ │ │ │ -(umfpackMatrix_); │ │ │ │ │ -595 │ │ │ │ │ -596 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_M_a_t_r_i_x,std:: │ │ │ │ │ -set >(_mat,rowIndexSet)); │ │ │ │ │ -597 │ │ │ │ │ -598 decompose(); │ │ │ │ │ -599 } │ │ │ │ │ -600 │ │ │ │ │ -_6_0_8 void _s_e_t_V_e_r_b_o_s_i_t_y(int v) │ │ │ │ │ -609 { │ │ │ │ │ -610 verbosity_ = v; │ │ │ │ │ -611 // set the verbosity level in UMFPack │ │ │ │ │ -612 if (verbosity_ == 0) │ │ │ │ │ -613 UMF_Control[UMFPACK_PRL] = 1; │ │ │ │ │ -614 if (verbosity_ == 1) │ │ │ │ │ -615 UMF_Control[UMFPACK_PRL] = 2; │ │ │ │ │ -616 if (verbosity_ == 2) │ │ │ │ │ -617 UMF_Control[UMFPACK_PRL] = 4; │ │ │ │ │ -618 } │ │ │ │ │ -619 │ │ │ │ │ -_6_2_4 void* _g_e_t_F_a_c_t_o_r_i_z_a_t_i_o_n() │ │ │ │ │ -625 { │ │ │ │ │ -626 return UMF_Numeric; │ │ │ │ │ -627 } │ │ │ │ │ -628 │ │ │ │ │ -_6_3_3 _U_M_F_P_a_c_k_M_a_t_r_i_x& _g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x() │ │ │ │ │ -634 { │ │ │ │ │ -635 return umfpackMatrix_; │ │ │ │ │ -636 } │ │ │ │ │ -637 │ │ │ │ │ -_6_4_2 void _f_r_e_e() │ │ │ │ │ -643 { │ │ │ │ │ -644 if (!matrixIsLoaded_) │ │ │ │ │ -645 { │ │ │ │ │ -646 Caller::free_symbolic(&UMF_Symbolic); │ │ │ │ │ -647 umfpackMatrix_.free(); │ │ │ │ │ -648 } │ │ │ │ │ -649 Caller::free_numeric(&UMF_Numeric); │ │ │ │ │ -650 matrixIsLoaded_ = false; │ │ │ │ │ -651 } │ │ │ │ │ -652 │ │ │ │ │ -_6_5_3 const char* _n_a_m_e() { return "UMFPACK"; } │ │ │ │ │ -654 │ │ │ │ │ -655 private: │ │ │ │ │ -656 typedef typename _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r> Caller; │ │ │ │ │ -657 │ │ │ │ │ -658 template │ │ │ │ │ -_6_5_9 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ -660 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_U_M_F_P_a_c_k<_M_a_t_r_i_x>,true>; │ │ │ │ │ -661 │ │ │ │ │ -663 void decompose() │ │ │ │ │ -664 { │ │ │ │ │ -665 double UMF_Decomposition_Info[UMFPACK_INFO]; │ │ │ │ │ -666 Caller::symbolic(static_cast<_u_m_f___i_n_t___t_y_p_e>(umfpackMatrix_.N()), │ │ │ │ │ -667 static_cast<_u_m_f___i_n_t___t_y_p_e>(umfpackMatrix_.N()), │ │ │ │ │ -668 umfpackMatrix_.getColStart(), │ │ │ │ │ -669 umfpackMatrix_.getRowIndex(), │ │ │ │ │ -670 reinterpret_cast(umfpackMatrix_.getValues()), │ │ │ │ │ -671 &UMF_Symbolic, │ │ │ │ │ -672 UMF_Control, │ │ │ │ │ -673 UMF_Decomposition_Info); │ │ │ │ │ -674 Caller::numeric(umfpackMatrix_.getColStart(), │ │ │ │ │ -675 umfpackMatrix_.getRowIndex(), │ │ │ │ │ -676 reinterpret_cast(umfpackMatrix_.getValues()), │ │ │ │ │ -677 UMF_Symbolic, │ │ │ │ │ -678 &UMF_Numeric, │ │ │ │ │ -679 UMF_Control, │ │ │ │ │ -680 UMF_Decomposition_Info); │ │ │ │ │ -681 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]); │ │ │ │ │ -682 if (verbosity_ == 1) │ │ │ │ │ -683 { │ │ │ │ │ -684 std::cout << "[UMFPack Decomposition]" << std::endl; │ │ │ │ │ -685 std::cout << "Wallclock Time taken: " << UMF_Decomposition_Info │ │ │ │ │ -[UMFPACK_NUMERIC_WALLTIME] << " (CPU Time: " << UMF_Decomposition_Info │ │ │ │ │ -[UMFPACK_NUMERIC_TIME] << ")" << std::endl; │ │ │ │ │ -686 std::cout << "Flops taken: " << UMF_Decomposition_Info[UMFPACK_FLOPS] << │ │ │ │ │ -std::endl; │ │ │ │ │ -687 std::cout << "Peak Memory Usage: " << UMF_Decomposition_Info │ │ │ │ │ -[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << " bytes" │ │ │ │ │ -<< std::endl; │ │ │ │ │ -688 std::cout << "Condition number estimate: " << 1./UMF_Decomposition_Info │ │ │ │ │ -[UMFPACK_RCOND] << std::endl; │ │ │ │ │ -689 std::cout << "Numbers of non-zeroes in decomposition: L: " << │ │ │ │ │ -UMF_Decomposition_Info[UMFPACK_LNZ] << " U: " << UMF_Decomposition_Info │ │ │ │ │ -[UMFPACK_UNZ] << std::endl; │ │ │ │ │ -690 } │ │ │ │ │ -691 if (verbosity_ == 2) │ │ │ │ │ -692 { │ │ │ │ │ -693 Caller::report_info(UMF_Control,UMF_Decomposition_Info); │ │ │ │ │ -694 } │ │ │ │ │ -695 } │ │ │ │ │ -696 │ │ │ │ │ -697 void printOnApply(double* UMF_Info) │ │ │ │ │ -698 { │ │ │ │ │ -699 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]); │ │ │ │ │ -700 if (verbosity_ > 0) │ │ │ │ │ -701 { │ │ │ │ │ -702 std::cout << "[UMFPack Solve]" << std::endl; │ │ │ │ │ -703 std::cout << "Wallclock Time: " << UMF_Info[UMFPACK_SOLVE_WALLTIME] << " │ │ │ │ │ -(CPU Time: " << UMF_Info[UMFPACK_SOLVE_TIME] << ")" << std::endl; │ │ │ │ │ -704 std::cout << "Flops Taken: " << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl; │ │ │ │ │ -705 std::cout << "Iterative Refinement steps taken: " << UMF_Info │ │ │ │ │ -[UMFPACK_IR_TAKEN] << std::endl; │ │ │ │ │ -706 std::cout << "Error Estimate: " << UMF_Info[UMFPACK_OMEGA1] << " resp. " << │ │ │ │ │ -UMF_Info[UMFPACK_OMEGA2] << std::endl; │ │ │ │ │ -707 } │ │ │ │ │ -708 } │ │ │ │ │ -709 │ │ │ │ │ -710 _U_M_F_P_a_c_k_M_a_t_r_i_x umfpackMatrix_; │ │ │ │ │ -711 bool matrixIsLoaded_; │ │ │ │ │ -712 int verbosity_; │ │ │ │ │ -713 void *UMF_Symbolic; │ │ │ │ │ -714 void *UMF_Numeric; │ │ │ │ │ -715 double UMF_Control[UMFPACK_CONTROL]; │ │ │ │ │ -716 }; │ │ │ │ │ -717 │ │ │ │ │ -718 template │ │ │ │ │ -_7_1_9 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r<_U_M_F_P_a_c_k<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > > │ │ │ │ │ -720 { │ │ │ │ │ -_7_2_1 enum { _v_a_l_u_e=true}; │ │ │ │ │ -722 }; │ │ │ │ │ -723 │ │ │ │ │ -724 template │ │ │ │ │ -_7_2_5 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d<_U_M_F_P_a_c_k<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ -726 { │ │ │ │ │ -_7_2_7 enum { _v_a_l_u_e = true }; │ │ │ │ │ -728 }; │ │ │ │ │ -729 │ │ │ │ │ -_7_3_0 struct _U_M_F_P_a_c_k_C_r_e_a_t_o_r { │ │ │ │ │ -_7_3_1 template struct _i_s_V_a_l_i_d_B_l_o_c_k : std::false_type{}; │ │ │ │ │ -_7_3_2 template struct _i_s_V_a_l_i_d_B_l_o_c_k::real_type,double>::value>> : std::true_type │ │ │ │ │ -{}; │ │ │ │ │ -733 │ │ │ │ │ -734 template │ │ │ │ │ -735 std::shared_ptr::type, │ │ │ │ │ -736 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_7_3_7 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& config, │ │ │ │ │ -738 std::enable_if_t< │ │ │ │ │ -739 _i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ -value,int> = 0) const │ │ │ │ │ -740 { │ │ │ │ │ -741 int verbose = config.get("verbose", 0); │ │ │ │ │ -742 return std::make_shared>(_m_a_t,verbose); │ │ │ │ │ -743 } │ │ │ │ │ -744 │ │ │ │ │ -745 // second version with SFINAE to validate the template parameters of │ │ │ │ │ -UMFPack │ │ │ │ │ -746 template │ │ │ │ │ -747 std::shared_ptr::type, │ │ │ │ │ -748 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_7_4_9 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ -*config*/, │ │ │ │ │ -750 std::enable_if_t< │ │ │ │ │ -751 !_i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ -value,int> = 0) const │ │ │ │ │ -752 { │ │ │ │ │ -753 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, │ │ │ │ │ -754 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -755 } │ │ │ │ │ -756 }; │ │ │ │ │ -_7_5_7 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("umfpack",_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r()); │ │ │ │ │ -758} // end namespace Dune │ │ │ │ │ -759 │ │ │ │ │ -760#endif // HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -761 │ │ │ │ │ -762#endif //DUNE_ISTL_UMFPACK_HH │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ -#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ -_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ -static void numeric(const umf_int_type *cs, const umf_int_type *ri, const │ │ │ │ │ -double *val, A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:256 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_f_r_e_e │ │ │ │ │ -void free() │ │ │ │ │ -free allocated space. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:642 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ -static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type │ │ │ │ │ -*ri, std::complex< double > *val, double *x, const double *b, A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator,. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:479 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -ISTL::Impl::BCCSMatrixInitializer< M, umf_int_type > MatrixInitializer │ │ │ │ │ -Type of an associated initializer class. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:346 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ -static void report_info(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:200 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the solver (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:341 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -void setMatrix(const Matrix &matrix) │ │ │ │ │ -Initialize data from given matrix. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:565 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ -static int save_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ -static void numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ -UMFPack(const Matrix &mat_, const ParameterTree &config) │ │ │ │ │ -Construct a solver object from a matrix. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:403 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ -static void symbolic(umf_int_type m, umf_int_type n, const umf_int_type *cs, │ │ │ │ │ -const umf_int_type *ri, const double *val, A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:221 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL │ │ │ │ │ ->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const │ │ │ │ │ -M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< │ │ │ │ │ -typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:737 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ -static void report_status(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ -UMFPack(const Matrix &mat_, const char *file, int verbose=0) │ │ │ │ │ -Try loading a decomposition from file and do a decomposition if unsuccessful. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:427 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ -static int load_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ -static void free_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ -static void defaults(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -typename Impl::UMFPackVectorChooser< M >::range_type range_type │ │ │ │ │ -The type of the range of the solver. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ -static int save_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ -static void report_info(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ -static void solve(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ -UMFPack() │ │ │ │ │ -default constructor │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:409 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_u_m_f___i_n_t___t_y_p_e │ │ │ │ │ -int64_t umf_int_type │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ -static int load_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:251 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ -static void symbolic(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ -static void numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ -static void report_info(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ -static void report_status(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ -static void free_symbolic(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ -static void free_symbolic(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ -static void numeric(const umf_int_type *cs, const umf_int_type *ri, const │ │ │ │ │ -double *val, A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:195 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const Matrix &_mat, const S &rowIndexSet) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:584 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ -static void solve(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ -static void free_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_a_p_p_l_y │ │ │ │ │ -void apply(T *x, T *b) │ │ │ │ │ -additional apply method with c-arrays in analogy to superlu │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_u_m_f___i_n_t___t_y_p_e │ │ │ │ │ -int32_t umf_int_type │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_:_:_v_a_l_i_d │ │ │ │ │ -static constexpr bool valid │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_V_e_r_b_o_s_i_t_y │ │ │ │ │ -void setVerbosity(int v) │ │ │ │ │ -sets the verbosity level for the UMFPack solver │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:608 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ -UMFPack(const char *file, int verbose=0) │ │ │ │ │ -try loading a decomposition from file │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:454 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ -static void defaults(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ -static int save_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ -static int load_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ -static void symbolic(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_~_U_M_F_P_a_c_k │ │ │ │ │ -virtual ~UMFPack() │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:470 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_n_a_m_e │ │ │ │ │ -const char * name() │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:653 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k_M_a_t_r_i_x │ │ │ │ │ -ISTL::Impl::BCCSMatrix< typename Matrix::field_type, umf_int_type > │ │ │ │ │ -UMFPackMatrix │ │ │ │ │ -The corresponding UMFPack matrix type. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:344 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ -static void free_symbolic(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_a_v_e_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void saveDecomposition(const char *file) │ │ │ │ │ -saves a decomposition to a file │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:557 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x │ │ │ │ │ -UMFPackMatrix & getInternalMatrix() │ │ │ │ │ -Return the column compress matrix from UMFPack. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:633 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ -static void free_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:121 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ -static void free_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ -static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type │ │ │ │ │ -*ri, std::complex< double > *val, double *x, const double *b, A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ -static void report_status(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -typename Impl::UMFPackVectorChooser< M >::domain_type domain_type │ │ │ │ │ -The type of the domain of the solver. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:348 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ -UMFPack(const Matrix &matrix, int verbose=0) │ │ │ │ │ -Construct a solver object from a matrix. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ -static int save_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ -static void report_info(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &x, range_type &b, double reduction, │ │ │ │ │ -InverseOperatorResult &res) │ │ │ │ │ -apply inverse operator, with given convergence criteria. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:510 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_O_p_t_i_o_n │ │ │ │ │ -void setOption(unsigned int option, double value) │ │ │ │ │ -Set UMFPack-specific options. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:546 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ -static void defaults(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_M_a_t_r_i_x │ │ │ │ │ -M Matrix │ │ │ │ │ -The matrix type. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ -static void symbolic(umf_int_type m, std::size_t n, const umf_int_type *cs, │ │ │ │ │ -const umf_int_type *ri, const double *val, A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ -static void free_symbolic(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ -static void defaults(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_u_m_f___i_n_t___t_y_p_e │ │ │ │ │ -std::conditional_t<(sizeof(typename M::size_type)==8), int64_t, int32_t > │ │ │ │ │ -umf_int_type │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:342 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ -static int load_numeric(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ -UMFPack(const Matrix &matrix, int verbose, bool) │ │ │ │ │ -Constructor for compatibility with SuperLU standard constructor. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_g_e_t_F_a_c_t_o_r_i_z_a_t_i_o_n │ │ │ │ │ -void * getFactorization() │ │ │ │ │ -Return the matrix factorization. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:624 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ -_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ -static void report_status(A... args) │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:266 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_3_5 class _I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ +36 : public _B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ +37 {}; │ │ │ │ │ +38 │ │ │ │ │ +40 │ │ │ │ │ +_4_6 class _S_o_l_v_e_r_A_b_o_r_t : public _I_S_T_L_E_r_r_o_r {}; │ │ │ │ │ +47 │ │ │ │ │ +49 │ │ │ │ │ +_5_2 class _M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r : public virtual Dune::FMatrixError { │ │ │ │ │ +53 public: │ │ │ │ │ +_5_4 int _r, _c; // row and column index of the entry from which the error resulted │ │ │ │ │ +55 }; │ │ │ │ │ +56 │ │ │ │ │ +59} // end namespace │ │ │ │ │ +60 │ │ │ │ │ +61#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ _D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ derive error class from the base class in common │ │ │ │ │ DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -Sequential overlapping Schwarz preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_e_l_a_p_s_e_d │ │ │ │ │ -double elapsed │ │ │ │ │ -Elapsed time in seconds. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -int iterations │ │ │ │ │ -Number of iterations. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -Whether this is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -whether the solver internally uses column compressed storage │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k │ │ │ │ │ -The UMFPack direct sparse solver. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:335 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:730 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:731 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ +Error specific to BCRSMatrix. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ +Thrown when the compression buffer used by the implicit BCRSMatrix construction │ │ │ │ │ +is exhausted. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ +Thrown when a solver aborts due to some problem. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ +Error when performing an operation on a matrix block. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r_:_:_c │ │ │ │ │ +int c │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r_:_:_r │ │ │ │ │ +int r │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:54 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00047.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrix.hh File Reference │ │ │ │ +dune-istl: btdmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,58 +72,44 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
matrix.hh File Reference
│ │ │ │ +
btdmatrix.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

A dynamic dense block matrix class. │ │ │ │ +

Implementation of the BTDMatrix class. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +
#include <dune/common/fmatrix.hh>
│ │ │ │ #include <dune/common/scalarvectorview.hh>
│ │ │ │ #include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <dune/istl/bvector.hh>
│ │ │ │ -#include <dune/istl/istlexception.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::MatrixImp::DenseMatrixBase< B, A >
 A Vector of blocks with different blocksizes. More...
class  Dune::BTDMatrix< B, A >
 A block-tridiagonal matrix. More...
 
class  Dune::MatrixImp::DenseMatrixBase< B, A >::Iterator
 Iterator class for sequential access. More...
 
class  Dune::MatrixImp::DenseMatrixBase< B, A >::ConstIterator
 ConstIterator class for sequential access. More...
 
class  Dune::Matrix< T, A >
 A generic dynamic dense matrix. More...
 
struct  Dune::FieldTraits< Matrix< T, A > >
struct  Dune::FieldTraits< BTDMatrix< B, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::MatrixImp
 
│ │ │ │

Detailed Description

│ │ │ │ -

A dynamic dense block matrix class.

│ │ │ │ +

Implementation of the BTDMatrix class.

│ │ │ │ +
Author
Oliver Sander
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,30 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -matrix.hh File Reference │ │ │ │ │ -A dynamic dense block matrix class. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +btdmatrix.hh File Reference │ │ │ │ │ +Implementation of the BTDMatrix class. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_ _B_,_ _A_ _> │ │ │ │ │ -  A Vector of blocks with different blocksizes. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _> │ │ │ │ │ +  A block-tridiagonal matrix. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_ _B_,_ _A_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -  _I_t_e_r_a_t_o_r class for sequential access. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_ _B_,_ _A_ _>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -  _C_o_n_s_t_I_t_e_r_a_t_o_r class for sequential access. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_a_t_r_i_x_<_ _T_,_ _A_ _> │ │ │ │ │ -  A generic dynamic dense matrix. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -A dynamic dense block matrix class. │ │ │ │ │ +Implementation of the BTDMatrix class. │ │ │ │ │ + Author │ │ │ │ │ + Oliver Sander │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrix.hh Source File │ │ │ │ +dune-istl: btdmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1258 +74,240 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
matrix.hh
│ │ │ │ +
btdmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_MATRIX_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_BTDMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_BTDMATRIX_HH
│ │ │ │
7
│ │ │ │ -
12#include <cmath>
│ │ │ │ -
13#include <memory>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/ftraits.hh>
│ │ │ │ -
16#include <dune/common/typetraits.hh>
│ │ │ │ -
17#include <dune/common/scalarvectorview.hh>
│ │ │ │ -
18#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -
19
│ │ │ │ -
20#include <dune/istl/bvector.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25
│ │ │ │ -
│ │ │ │ -
26namespace MatrixImp
│ │ │ │ -
27{
│ │ │ │ -
39 template<class B, class A=std::allocator<B> >
│ │ │ │ -
│ │ │ │ -
40 class DenseMatrixBase : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ -
41 // this derivation gives us all the blas level 1 and norms
│ │ │ │ -
42 // on the large array. However, access operators have to be
│ │ │ │ -
43 // overwritten.
│ │ │ │ -
44 {
│ │ │ │ -
45 public:
│ │ │ │ -
46
│ │ │ │ -
47 //===== type definitions and constants
│ │ │ │ -
48
│ │ │ │ -
50 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
51
│ │ │ │ -
53 typedef A allocator_type;
│ │ │ │ +
8#include <dune/common/fmatrix.hh>
│ │ │ │ +
9#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
10#include <dune/common/scalarmatrixview.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
29 template <class B, class A=std::allocator<B> >
│ │ │ │ +
│ │ │ │ +
30 class BTDMatrix : public BCRSMatrix<B,A>
│ │ │ │ +
31 {
│ │ │ │ +
32 public:
│ │ │ │ +
33
│ │ │ │ +
34 //===== type definitions and constants
│ │ │ │ +
35
│ │ │ │ +
37 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
38
│ │ │ │ +
40 typedef B block_type;
│ │ │ │ +
41
│ │ │ │ +
43 typedef A allocator_type;
│ │ │ │ +
44
│ │ │ │ +
46 //typedef BCRSMatrix<B,A>::row_type row_type;
│ │ │ │ +
47
│ │ │ │ +
49 typedef typename A::size_type size_type;
│ │ │ │ +
50
│ │ │ │ +
52 [[deprecated("Use free blockLevel function. Will be removed after 2.8.")]]
│ │ │ │ +
53 static constexpr auto blocklevel = blockLevel<B>()+1;
│ │ │ │
54
│ │ │ │ -
56 typedef typename A::size_type size_type;
│ │ │ │ +
56 BTDMatrix() : BCRSMatrix<B,A>() {}
│ │ │ │
57
│ │ │ │ - │ │ │ │ -
64
│ │ │ │ - │ │ │ │ -
68
│ │ │ │ -
69 // just a shorthand
│ │ │ │ -
70 typedef Imp::BlockVectorWindow<B,A> window_type;
│ │ │ │ -
71
│ │ │ │ - │ │ │ │ -
73
│ │ │ │ - │ │ │ │ -
75
│ │ │ │ +
│ │ │ │ +
58 explicit BTDMatrix(size_type size)
│ │ │ │ +
59 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random)
│ │ │ │ +
60 {
│ │ │ │ +
61 // Set number of entries for each row
│ │ │ │ +
62 // All rows get three entries, except for the first and the last one
│ │ │ │ +
63 for (size_t i=0; i<size; i++)
│ │ │ │ +
64 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
│ │ │ │ +
65
│ │ │ │ + │ │ │ │ +
67
│ │ │ │ +
68 // The actual entries for each row
│ │ │ │ +
69 for (size_t i=0; i<size; i++) {
│ │ │ │ +
70 if (i>0)
│ │ │ │ +
71 this->BCRSMatrix<B,A>::addindex(i, i-1);
│ │ │ │ +
72 this->BCRSMatrix<B,A>::addindex(i, i );
│ │ │ │ +
73 if (i<size-1)
│ │ │ │ +
74 this->BCRSMatrix<B,A>::addindex(i, i+1);
│ │ │ │ +
75 }
│ │ │ │
76
│ │ │ │ -
77 //===== constructors and such
│ │ │ │ -
78
│ │ │ │ -
│ │ │ │ -
82 DenseMatrixBase () : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ -
83 {
│ │ │ │ -
84 // nothing is known ...
│ │ │ │ -
85 rows_ = 0;
│ │ │ │ -
86 columns_ = 0;
│ │ │ │ -
87 }
│ │ │ │ + │ │ │ │ +
78 }
│ │ │ │
│ │ │ │ -
88
│ │ │ │ -
│ │ │ │ -
95 DenseMatrixBase (size_type rows, size_type columns) : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ -
96 {
│ │ │ │ -
97 // and we can allocate the big array in the base class
│ │ │ │ -
98 this->n = rows*columns;
│ │ │ │ -
99 columns_ = columns;
│ │ │ │ -
100 if (this->n>0)
│ │ │ │ -
101 {
│ │ │ │ -
102 this->p = allocator_.allocate(this->n);
│ │ │ │ -
103 new (this->p)B[this->n];
│ │ │ │ -
104 }
│ │ │ │ -
105 else
│ │ │ │ -
106 {
│ │ │ │ -
107 this->n = 0;
│ │ │ │ -
108 this->p = 0;
│ │ │ │ -
109 }
│ │ │ │ -
110
│ │ │ │ -
111 // we can allocate the windows now
│ │ │ │ -
112 rows_ = rows;
│ │ │ │ -
113 }
│ │ │ │ -
│ │ │ │ -
114
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 {
│ │ │ │ -
118 // allocate the big array in the base class
│ │ │ │ -
119 this->n = a.n;
│ │ │ │ -
120 columns_ = a.columns_;
│ │ │ │ -
121 if (this->n>0)
│ │ │ │ -
122 {
│ │ │ │ -
123 // allocate and construct objects
│ │ │ │ -
124 this->p = allocator_.allocate(this->n);
│ │ │ │ -
125 new (this->p)B[this->n];
│ │ │ │ +
79
│ │ │ │ +
│ │ │ │ +
81 void setSize(size_type size)
│ │ │ │ +
82 {
│ │ │ │ +
83 auto nonZeros = (size==0) ? 0 : size + 2*(size-1);
│ │ │ │ +
84 this->BCRSMatrix<B,A>::setSize(size, // rows
│ │ │ │ +
85 size, // columns
│ │ │ │ +
86 nonZeros);
│ │ │ │ +
87
│ │ │ │ +
88 // Set number of entries for each row
│ │ │ │ +
89 // All rows get three entries, except for the first and the last one
│ │ │ │ +
90 for (size_t i=0; i<size; i++)
│ │ │ │ +
91 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
│ │ │ │ +
92
│ │ │ │ + │ │ │ │ +
94
│ │ │ │ +
95 // The actual entries for each row
│ │ │ │ +
96 for (size_t i=0; i<size; i++) {
│ │ │ │ +
97 if (i>0)
│ │ │ │ +
98 this->BCRSMatrix<B,A>::addindex(i, i-1);
│ │ │ │ +
99 this->BCRSMatrix<B,A>::addindex(i, i );
│ │ │ │ +
100 if (i<size-1)
│ │ │ │ +
101 this->BCRSMatrix<B,A>::addindex(i, i+1);
│ │ │ │ +
102 }
│ │ │ │ +
103
│ │ │ │ + │ │ │ │ +
105 }
│ │ │ │ +
│ │ │ │ +
106
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
109 this->BCRSMatrix<B,A>::operator=(other);
│ │ │ │ +
110 return *this;
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
116 return *this;
│ │ │ │ +
117 }
│ │ │ │ +
│ │ │ │ +
118
│ │ │ │ +
124 template <class V>
│ │ │ │ +
│ │ │ │ +
125 void solve (V& x, const V& rhs) const {
│ │ │ │
126
│ │ │ │ -
127 // copy data
│ │ │ │ -
128 for (size_type i=0; i<this->n; i++)
│ │ │ │ -
129 this->p[i]=a.p[i];
│ │ │ │ -
130 }
│ │ │ │ -
131 else
│ │ │ │ -
132 {
│ │ │ │ -
133 this->n = 0;
│ │ │ │ -
134 this->p = nullptr;
│ │ │ │ -
135 }
│ │ │ │ -
136
│ │ │ │ -
137 // we can allocate the windows now
│ │ │ │ -
138 rows_ = a.rows_;
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ +
127 // special handling for 1x1 matrices. The generic algorithm doesn't work for them
│ │ │ │ +
128 if (this->N()==1) {
│ │ │ │ +
129 auto&& x0 = Impl::asVector(x[0]);
│ │ │ │ +
130 auto&& rhs0 = Impl::asVector(rhs[0]);
│ │ │ │ +
131 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0);
│ │ │ │ +
132 return;
│ │ │ │ +
133 }
│ │ │ │ +
134
│ │ │ │ +
135 // Make copies of the rhs and the right matrix band
│ │ │ │ +
136 V d = rhs;
│ │ │ │ +
137 std::vector<block_type> c(this->N()-1);
│ │ │ │ +
138 for (size_t i=0; i<this->N()-1; i++)
│ │ │ │ +
139 c[i] = (*this)[i][i+1];
│ │ │ │
140
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
143 {
│ │ │ │ -
144 if (this->n>0) {
│ │ │ │ -
145 size_type i=this->n;
│ │ │ │ -
146 while (i)
│ │ │ │ -
147 this->p[--i].~B();
│ │ │ │ -
148 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
149 }
│ │ │ │ -
150 }
│ │ │ │ -
│ │ │ │ -
151
│ │ │ │ -
│ │ │ │ -
153 void resize (size_type rows, size_type columns)
│ │ │ │ -
154 {
│ │ │ │ -
155 // deconstruct objects and deallocate memory if necessary
│ │ │ │ -
156 if (this->n>0) {
│ │ │ │ -
157 size_type i=this->n;
│ │ │ │ -
158 while (i)
│ │ │ │ -
159 this->p[--i].~B();
│ │ │ │ -
160 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
161 }
│ │ │ │ -
162
│ │ │ │ -
163 // and we can allocate the big array in the base class
│ │ │ │ -
164 this->n = rows*columns;
│ │ │ │ -
165 if (this->n>0)
│ │ │ │ -
166 {
│ │ │ │ -
167 this->p = allocator_.allocate(this->n);
│ │ │ │ -
168 new (this->p)B[this->n];
│ │ │ │ -
169 }
│ │ │ │ -
170 else
│ │ │ │ -
171 {
│ │ │ │ -
172 this->n = 0;
│ │ │ │ -
173 this->p = nullptr;
│ │ │ │ -
174 }
│ │ │ │ -
175
│ │ │ │ -
176 // we can allocate the windows now
│ │ │ │ -
177 rows_ = rows;
│ │ │ │ -
178 columns_ = columns;
│ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
183 {
│ │ │ │ -
184 if (&a!=this) // check if this and a are different objects
│ │ │ │ -
185 {
│ │ │ │ -
186 columns_ = a.columns_;
│ │ │ │ -
187 // reallocate arrays if necessary
│ │ │ │ -
188 // Note: still the block sizes may vary !
│ │ │ │ -
189 if (this->n!=a.n || rows_!=a.rows_)
│ │ │ │ -
190 {
│ │ │ │ -
191 // deconstruct objects and deallocate memory if necessary
│ │ │ │ -
192 if (this->n>0) {
│ │ │ │ -
193 size_type i=this->n;
│ │ │ │ -
194 while (i)
│ │ │ │ -
195 this->p[--i].~B();
│ │ │ │ -
196 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
197 }
│ │ │ │ -
198
│ │ │ │ -
199 // allocate the big array in the base class
│ │ │ │ -
200 this->n = a.n;
│ │ │ │ -
201 if (this->n>0)
│ │ │ │ -
202 {
│ │ │ │ -
203 // allocate and construct objects
│ │ │ │ -
204 this->p = allocator_.allocate(this->n);
│ │ │ │ -
205 new (this->p)B[this->n];
│ │ │ │ -
206 }
│ │ │ │ -
207 else
│ │ │ │ -
208 {
│ │ │ │ -
209 this->n = 0;
│ │ │ │ -
210 this->p = nullptr;
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
213 // Copy number of rows
│ │ │ │ -
214 rows_ = a.rows_;
│ │ │ │ -
215 }
│ │ │ │ -
216
│ │ │ │ -
217 // and copy the data
│ │ │ │ -
218 for (size_type i=0; i<this->n; i++)
│ │ │ │ -
219 this->p[i]=a.p[i];
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
222 return *this;
│ │ │ │ -
223 }
│ │ │ │ -
│ │ │ │ -
224
│ │ │ │ -
225
│ │ │ │ -
226 //===== assignment from scalar
│ │ │ │ -
227
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
230 {
│ │ │ │ -
231 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ -
232 return *this;
│ │ │ │ -
233 }
│ │ │ │ -
│ │ │ │ -
234
│ │ │ │ -
235
│ │ │ │ -
236 //===== access to components
│ │ │ │ -
237 // has to be overwritten from base class because it must
│ │ │ │ -
238 // return access to the windows
│ │ │ │ -
239
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
242 {
│ │ │ │ -
243#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
244 if (i>=rows_) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
245#endif
│ │ │ │ -
246 return window_type(this->p + i*columns_, columns_);
│ │ │ │ -
247 }
│ │ │ │ -
│ │ │ │ -
248
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
251 {
│ │ │ │ -
252#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
253 if (i<0 || i>=rows_) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
254#endif
│ │ │ │ -
255 return window_type(this->p + i*columns_, columns_);
│ │ │ │ -
256 }
│ │ │ │ -
│ │ │ │ -
257
│ │ │ │ -
258 // forward declaration
│ │ │ │ -
259 class ConstIterator;
│ │ │ │ -
260
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
263 {
│ │ │ │ -
264 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
267 : window_(nullptr,0)
│ │ │ │ -
268 {
│ │ │ │ -
269 i = 0;
│ │ │ │ -
270 }
│ │ │ │ -
│ │ │ │ -
271
│ │ │ │ -
272 Iterator (Iterator& other) = default;
│ │ │ │ -
273 Iterator (Iterator&& other) = default;
│ │ │ │ -
274
│ │ │ │ -
│ │ │ │ -
276 Iterator (B* data, size_type columns, size_type _i)
│ │ │ │ -
277 : i(_i),
│ │ │ │ -
278 window_(data + _i*columns, columns)
│ │ │ │ -
279 {}
│ │ │ │ -
│ │ │ │ -
280
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
283 {
│ │ │ │ -
284 i = other.i;
│ │ │ │ -
285 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ -
286 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ -
287 return *this;
│ │ │ │ -
288 }
│ │ │ │ -
│ │ │ │ -
289
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
292 {
│ │ │ │ -
293 i = other.i;
│ │ │ │ -
294 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ -
295 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ -
296 return *this;
│ │ │ │ -
297 }
│ │ │ │ -
│ │ │ │ -
298
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
301 {
│ │ │ │ -
302 ++i;
│ │ │ │ -
303 window_.setptr(window_.getptr()+window_.getsize());
│ │ │ │ -
304 return *this;
│ │ │ │ -
305 }
│ │ │ │ -
│ │ │ │ -
306
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
309 {
│ │ │ │ -
310 --i;
│ │ │ │ -
311 window_.setptr(window_.getptr()-window_.getsize());
│ │ │ │ -
312 return *this;
│ │ │ │ -
313 }
│ │ │ │ -
│ │ │ │ -
314
│ │ │ │ -
│ │ │ │ -
316 bool operator== (const Iterator& it) const
│ │ │ │ -
317 {
│ │ │ │ -
318 return window_.getptr() == it.window_.getptr();
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
│ │ │ │ -
322 bool operator!= (const Iterator& it) const
│ │ │ │ -
323 {
│ │ │ │ -
324 return window_.getptr() != it.window_.getptr();
│ │ │ │ -
325 }
│ │ │ │ -
│ │ │ │ -
326
│ │ │ │ -
│ │ │ │ -
328 bool operator== (const ConstIterator& it) const
│ │ │ │ -
329 {
│ │ │ │ -
330 return window_.getptr() == it.window_.getptr();
│ │ │ │ -
331 }
│ │ │ │ -
│ │ │ │ -
332
│ │ │ │ -
│ │ │ │ -
334 bool operator!= (const ConstIterator& it) const
│ │ │ │ -
335 {
│ │ │ │ -
336 return window_.getptr() != it.window_.getptr();
│ │ │ │ -
337 }
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
341 {
│ │ │ │ -
342 return window_;
│ │ │ │ -
343 }
│ │ │ │ -
│ │ │ │ -
344
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
347 {
│ │ │ │ -
348 return &window_;
│ │ │ │ -
349 }
│ │ │ │ -
│ │ │ │ -
350
│ │ │ │ -
351 // return index corresponding to pointer
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
353 {
│ │ │ │ -
354 return i;
│ │ │ │ -
355 }
│ │ │ │ -
│ │ │ │ -
356
│ │ │ │ -
357 friend class ConstIterator;
│ │ │ │ -
358
│ │ │ │ -
359 private:
│ │ │ │ -
360 size_type i;
│ │ │ │ -
361 mutable window_type window_;
│ │ │ │ -
362 };
│ │ │ │ -
│ │ │ │ -
363
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
366 {
│ │ │ │ -
367 return Iterator(this->p, columns_, 0);
│ │ │ │ -
368 }
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
372 {
│ │ │ │ -
373 return Iterator(this->p, columns_, rows_);
│ │ │ │ -
374 }
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
379 {
│ │ │ │ -
380 return Iterator(this->p, columns_, rows_-1);
│ │ │ │ -
381 }
│ │ │ │ -
│ │ │ │ -
382
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
386 {
│ │ │ │ -
387 return Iterator(this->p, columns_, -1);
│ │ │ │ -
388 }
│ │ │ │ -
│ │ │ │ -
389
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
392 {
│ │ │ │ -
393 return Iterator(this->p, columns_, std::min(i,rows_));
│ │ │ │ -
394 }
│ │ │ │ -
│ │ │ │ -
395
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
398 {
│ │ │ │ -
399 return ConstIterator(this->p, columns_, std::min(i,rows_));
│ │ │ │ -
400 }
│ │ │ │ -
│ │ │ │ -
401
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
404 {
│ │ │ │ -
405 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
408 : window_(nullptr,0)
│ │ │ │ -
409 {
│ │ │ │ -
410 i = 0;
│ │ │ │ -
411 }
│ │ │ │ -
│ │ │ │ -
412
│ │ │ │ -
│ │ │ │ -
414 ConstIterator (const B* data, size_type columns, size_type _i)
│ │ │ │ -
415 : i(_i),
│ │ │ │ -
416 window_(const_cast<B*>(data + _i * columns), columns)
│ │ │ │ -
417 {}
│ │ │ │ -
│ │ │ │ -
418
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize())
│ │ │ │ -
422 {}
│ │ │ │ -
│ │ │ │ -
423
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
425 {
│ │ │ │ -
426 i = other.i;
│ │ │ │ -
427 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ -
428 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ -
429 return *this;
│ │ │ │ -
430 }
│ │ │ │ -
│ │ │ │ -
431
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
433 {
│ │ │ │ -
434 i = other.i;
│ │ │ │ -
435 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ -
436 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ -
437 return *this;
│ │ │ │ -
438 }
│ │ │ │ -
│ │ │ │ -
439
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
442 {
│ │ │ │ -
443 ++i;
│ │ │ │ -
444 window_.setptr(window_.getptr()+window_.getsize());
│ │ │ │ -
445 return *this;
│ │ │ │ -
446 }
│ │ │ │ -
│ │ │ │ -
447
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
450 {
│ │ │ │ -
451 --i;
│ │ │ │ -
452 window_.setptr(window_.getptr()-window_.getsize());
│ │ │ │ -
453 return *this;
│ │ │ │ -
454 }
│ │ │ │ -
│ │ │ │ -
455
│ │ │ │ -
│ │ │ │ -
457 bool operator== (const ConstIterator& it) const
│ │ │ │ -
458 {
│ │ │ │ -
459 return window_.getptr() == it.window_.getptr();
│ │ │ │ -
460 }
│ │ │ │ -
│ │ │ │ -
461
│ │ │ │ -
│ │ │ │ -
463 bool operator!= (const ConstIterator& it) const
│ │ │ │ -
464 {
│ │ │ │ -
465 return window_.getptr() != it.window_.getptr();
│ │ │ │ -
466 }
│ │ │ │ -
│ │ │ │ -
467
│ │ │ │ -
│ │ │ │ -
469 bool operator== (const Iterator& it) const
│ │ │ │ -
470 {
│ │ │ │ -
471 return window_.getptr() == it.window_.getptr();
│ │ │ │ -
472 }
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
│ │ │ │ -
475 bool operator!= (const Iterator& it) const
│ │ │ │ -
476 {
│ │ │ │ -
477 return window_.getptr() != it.window_.getptr();
│ │ │ │ -
478 }
│ │ │ │ -
│ │ │ │ -
479
│ │ │ │ -
│ │ │ │ -
481 const window_type& operator* () const
│ │ │ │ -
482 {
│ │ │ │ -
483 return window_;
│ │ │ │ -
484 }
│ │ │ │ -
│ │ │ │ -
485
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
488 {
│ │ │ │ -
489 return &window_;
│ │ │ │ -
490 }
│ │ │ │ -
│ │ │ │ -
491
│ │ │ │ -
492 // return index corresponding to pointer
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
494 {
│ │ │ │ -
495 return i;
│ │ │ │ -
496 }
│ │ │ │ -
│ │ │ │ -
497
│ │ │ │ -
498 friend class Iterator;
│ │ │ │ -
499
│ │ │ │ -
500 private:
│ │ │ │ -
501 size_type i;
│ │ │ │ -
502 mutable window_type window_;
│ │ │ │ -
503 };
│ │ │ │ -
│ │ │ │ -
504
│ │ │ │ - │ │ │ │ -
507
│ │ │ │ - │ │ │ │ -
510
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
513 {
│ │ │ │ -
514 return ConstIterator(this->p, columns_, 0);
│ │ │ │ -
515 }
│ │ │ │ -
│ │ │ │ -
516
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
519 {
│ │ │ │ -
520 return ConstIterator(this->p, columns_, rows_);
│ │ │ │ -
521 }
│ │ │ │ -
│ │ │ │ -
522
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
526 {
│ │ │ │ -
527 return ConstIterator(this->p, columns_, rows_-1);
│ │ │ │ -
528 }
│ │ │ │ -
│ │ │ │ -
529
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
532 {
│ │ │ │ -
533 return ConstIterator(this->p, columns_, -1);
│ │ │ │ -
534 }
│ │ │ │ -
│ │ │ │ -
535
│ │ │ │ -
536 //===== sizes
│ │ │ │ -
537
│ │ │ │ -
│ │ │ │ -
539 size_type N () const
│ │ │ │ -
540 {
│ │ │ │ -
541 return rows_;
│ │ │ │ -
542 }
│ │ │ │ -
│ │ │ │ -
543
│ │ │ │ -
544
│ │ │ │ -
545 private:
│ │ │ │ -
546 size_type rows_; // number of matrix rows
│ │ │ │ -
547 size_type columns_; // number of matrix columns
│ │ │ │ -
548
│ │ │ │ -
549 A allocator_;
│ │ │ │ -
550 };
│ │ │ │ -
│ │ │ │ -
551
│ │ │ │ -
552} // namespace MatrixImp
│ │ │ │ -
│ │ │ │ -
553
│ │ │ │ -
559 template<class T, class A=std::allocator<T> >
│ │ │ │ -
│ │ │ │ -
560 class Matrix
│ │ │ │ -
561 {
│ │ │ │ -
562 public:
│ │ │ │ -
563
│ │ │ │ -
565 using field_type = typename Imp::BlockTraits<T>::field_type;
│ │ │ │ -
566
│ │ │ │ -
568 typedef T block_type;
│ │ │ │ -
569
│ │ │ │ -
571 typedef A allocator_type;
│ │ │ │ -
572
│ │ │ │ - │ │ │ │ -
575
│ │ │ │ -
577 typedef typename A::size_type size_type;
│ │ │ │ -
578
│ │ │ │ - │ │ │ │ -
581
│ │ │ │ -
583 typedef typename row_type::iterator ColIterator;
│ │ │ │ -
584
│ │ │ │ - │ │ │ │ -
587
│ │ │ │ -
589 typedef typename row_type::const_iterator ConstColIterator;
│ │ │ │ -
590
│ │ │ │ -
592 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
593 static constexpr auto blocklevel = blockLevel<T>()+1;
│ │ │ │ -
594
│ │ │ │ -
│ │ │ │ -
596 Matrix() : data_(0,0), cols_(0)
│ │ │ │ -
597 {}
│ │ │ │ -
│ │ │ │ -
598
│ │ │ │ -
│ │ │ │ -
601 Matrix(size_type rows, size_type cols) : data_(rows,cols), cols_(cols)
│ │ │ │ -
602 {}
│ │ │ │ -
│ │ │ │ -
603
│ │ │ │ -
│ │ │ │ -
608 void setSize(size_type rows, size_type cols) {
│ │ │ │ -
609 data_.resize(rows,cols);
│ │ │ │ -
610 cols_ = cols;
│ │ │ │ -
611 }
│ │ │ │ -
│ │ │ │ -
612
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
615 {
│ │ │ │ -
616 return data_.begin();
│ │ │ │ -
617 }
│ │ │ │ -
│ │ │ │ -
618
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
621 {
│ │ │ │ -
622 return data_.end();
│ │ │ │ -
623 }
│ │ │ │ -
│ │ │ │ -
624
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
628 {
│ │ │ │ -
629 return data_.beforeEnd();
│ │ │ │ -
630 }
│ │ │ │ -
│ │ │ │ -
631
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
635 {
│ │ │ │ -
636 return data_.beforeBegin();
│ │ │ │ -
637 }
│ │ │ │ -
│ │ │ │ -
638
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
641 {
│ │ │ │ -
642 return data_.begin();
│ │ │ │ -
643 }
│ │ │ │ -
│ │ │ │ -
644
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
647 {
│ │ │ │ -
648 return data_.end();
│ │ │ │ -
649 }
│ │ │ │ -
│ │ │ │ -
650
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
654 {
│ │ │ │ -
655 return data_.beforeEnd();
│ │ │ │ -
656 }
│ │ │ │ -
│ │ │ │ -
657
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
661 {
│ │ │ │ -
662 return data_.beforeBegin();
│ │ │ │ -
663 }
│ │ │ │ -
│ │ │ │ -
664
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
667 {
│ │ │ │ -
668 data_ = t;
│ │ │ │ -
669 return *this;
│ │ │ │ -
670 }
│ │ │ │ -
│ │ │ │ -
671
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
674#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
675 if (row<0)
│ │ │ │ -
676 DUNE_THROW(ISTLError, "Can't access negative rows!");
│ │ │ │ -
677 if (row>=N())
│ │ │ │ -
678 DUNE_THROW(ISTLError, "Row index out of range!");
│ │ │ │ -
679#endif
│ │ │ │ -
680 return data_[row];
│ │ │ │ -
681 }
│ │ │ │ -
│ │ │ │ -
682
│ │ │ │ -
│ │ │ │ -
684 const row_type operator[](size_type row) const {
│ │ │ │ -
685#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
686 if (row<0)
│ │ │ │ -
687 DUNE_THROW(ISTLError, "Can't access negative rows!");
│ │ │ │ -
688 if (row>=N())
│ │ │ │ -
689 DUNE_THROW(ISTLError, "Row index out of range!");
│ │ │ │ -
690#endif
│ │ │ │ -
691 return data_[row];
│ │ │ │ -
692 }
│ │ │ │ -
│ │ │ │ -
693
│ │ │ │ -
│ │ │ │ -
695 size_type N() const {
│ │ │ │ -
696 return data_.N();
│ │ │ │ -
697 }
│ │ │ │ -
│ │ │ │ -
698
│ │ │ │ -
│ │ │ │ -
700 size_type M() const {
│ │ │ │ -
701 return cols_;
│ │ │ │ -
702 }
│ │ │ │ -
│ │ │ │ -
703
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
706 data_ *= scalar;
│ │ │ │ -
707 return (*this);
│ │ │ │ -
708 }
│ │ │ │ -
│ │ │ │ -
709
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
712 data_ /= scalar;
│ │ │ │ -
713 return (*this);
│ │ │ │ -
714 }
│ │ │ │ -
│ │ │ │ -
715
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
722#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
723 if(N()!=b.N() || M() != b.M())
│ │ │ │ -
724 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ -
725#endif
│ │ │ │ -
726 data_ += b.data_;
│ │ │ │ -
727 return (*this);
│ │ │ │ -
728 }
│ │ │ │ -
│ │ │ │ -
729
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
736#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
737 if(N()!=b.N() || M() != b.M())
│ │ │ │ -
738 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ -
739#endif
│ │ │ │ -
740 data_ -= b.data_;
│ │ │ │ -
741 return (*this);
│ │ │ │ -
742 }
│ │ │ │ -
│ │ │ │ -
743
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
746 Matrix out(M(), N());
│ │ │ │ -
747 for (size_type i=0; i<N(); i++)
│ │ │ │ -
748 for (size_type j=0; j<M(); j++)
│ │ │ │ -
749 out[j][i] = (*this)[i][j];
│ │ │ │ -
750
│ │ │ │ -
751 return out;
│ │ │ │ -
752 }
│ │ │ │ -
│ │ │ │ -
753
│ │ │ │ -
│ │ │ │ -
755 friend Matrix<T> operator*(const Matrix<T>& m1, const Matrix<T>& m2) {
│ │ │ │ -
756 Matrix<T> out(m1.N(), m2.M());
│ │ │ │ -
757 out = 0;
│ │ │ │ -
758
│ │ │ │ -
759 for (size_type i=0; i<out.N(); i++ ) {
│ │ │ │ -
760 for ( size_type j=0; j<out.M(); j++ )
│ │ │ │ -
761 for (size_type k=0; k<m1.M(); k++)
│ │ │ │ -
762 out[i][j] += m1[i][k]*m2[k][j];
│ │ │ │ -
763 }
│ │ │ │ -
764
│ │ │ │ -
765 return out;
│ │ │ │ -
766 }
│ │ │ │ -
│ │ │ │ -
767
│ │ │ │ -
769 template <class X, class Y>
│ │ │ │ -
│ │ │ │ -
770 friend Y operator*(const Matrix<T>& m, const X& vec) {
│ │ │ │ -
771#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
772 if (m.M()!=vec.size())
│ │ │ │ -
773 DUNE_THROW(ISTLError, "Vector size doesn't match the number of matrix columns!");
│ │ │ │ -
774#endif
│ │ │ │ -
775 Y out(m.N());
│ │ │ │ -
776 out = 0;
│ │ │ │ -
777
│ │ │ │ -
778 for (size_type i=0; i<out.size(); i++ ) {
│ │ │ │ -
779 for ( size_type j=0; j<vec.size(); j++ )
│ │ │ │ -
780 out[i] += m[i][j]*vec[j];
│ │ │ │ -
781 }
│ │ │ │ -
782
│ │ │ │ -
783 return out;
│ │ │ │ -
784 }
│ │ │ │ -
│ │ │ │ -
785
│ │ │ │ -
787 template <class X, class Y>
│ │ │ │ -
│ │ │ │ -
788 void mv(const X& x, Y& y) const
│ │ │ │ -
789 {
│ │ │ │ -
790#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
791 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
792 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
793#endif
│ │ │ │ -
794 for (size_type i=0; i<data_.N(); i++) {
│ │ │ │ -
795 y[i]=0;
│ │ │ │ -
796 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
797 {
│ │ │ │ -
798 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ -
799 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ -
800 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
│ │ │ │ -
801 }
│ │ │ │ -
802 }
│ │ │ │ -
803 }
│ │ │ │ -
│ │ │ │ -
804
│ │ │ │ -
806 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
807 void mtv (const X& x, Y& y) const
│ │ │ │ -
808 {
│ │ │ │ -
809#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
810 if (x.N()!=N()) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
811 if (y.N()!=M()) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
812#endif
│ │ │ │ -
813 for(size_type i=0; i<y.N(); ++i)
│ │ │ │ -
814 y[i]=0;
│ │ │ │ -
815 umtv(x,y);
│ │ │ │ -
816 }
│ │ │ │ -
│ │ │ │ -
817
│ │ │ │ -
819 template <class X, class Y>
│ │ │ │ -
│ │ │ │ -
820 void umv(const X& x, Y& y) const
│ │ │ │ -
821 {
│ │ │ │ -
822#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
823 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
824 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
825#endif
│ │ │ │ -
826 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
827 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
828 {
│ │ │ │ -
829 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ -
830 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ -
831 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
│ │ │ │ -
832 }
│ │ │ │ -
833 }
│ │ │ │ -
│ │ │ │ -
834
│ │ │ │ -
836 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
837 void mmv (const X& x, Y& y) const
│ │ │ │ -
838 {
│ │ │ │ -
839#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
840 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
841 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
842#endif
│ │ │ │ -
843 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
844 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
845 {
│ │ │ │ -
846 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ -
847 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ -
848 Impl::asMatrix((*this)[i][j]).mmv(xj, yi);
│ │ │ │ -
849 }
│ │ │ │ -
850 }
│ │ │ │ -
│ │ │ │ -
851
│ │ │ │ -
853 template <class X, class Y>
│ │ │ │ -
│ │ │ │ -
854 void usmv(const field_type& alpha, const X& x, Y& y) const
│ │ │ │ -
855 {
│ │ │ │ -
856#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
857 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
858 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
859#endif
│ │ │ │ -
860 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
861 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
862 {
│ │ │ │ -
863 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ -
864 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ -
865 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi);
│ │ │ │ -
866 }
│ │ │ │ -
867 }
│ │ │ │ -
│ │ │ │ -
868
│ │ │ │ -
870 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
871 void umtv (const X& x, Y& y) const
│ │ │ │ -
872 {
│ │ │ │ -
873#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
874 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
875 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
876#endif
│ │ │ │ -
877 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
878 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
879 {
│ │ │ │ -
880 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ -
881 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ -
882 Impl::asMatrix((*this)[i][j]).umtv(xi, yj);
│ │ │ │ -
883 }
│ │ │ │ -
884 }
│ │ │ │ -
│ │ │ │ -
885
│ │ │ │ -
887 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
888 void mmtv (const X& x, Y& y) const
│ │ │ │ -
889 {
│ │ │ │ -
890#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
891 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
892 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
893#endif
│ │ │ │ -
894 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
895 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
896 {
│ │ │ │ -
897 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ -
898 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ -
899 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj);
│ │ │ │ -
900 }
│ │ │ │ -
901 }
│ │ │ │ -
│ │ │ │ -
902
│ │ │ │ -
904 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
905 void usmtv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ -
906 {
│ │ │ │ -
907#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
908 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
909 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
910#endif
│ │ │ │ -
911 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
912 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
913 {
│ │ │ │ -
914 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ -
915 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ -
916 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj);
│ │ │ │ -
917 }
│ │ │ │ -
918 }
│ │ │ │ -
│ │ │ │ -
919
│ │ │ │ -
921 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
922 void umhv (const X& x, Y& y) const
│ │ │ │ -
923 {
│ │ │ │ -
924#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
925 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
926 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
927#endif
│ │ │ │ -
928 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
929 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
930 {
│ │ │ │ -
931 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ -
932 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ -
933 Impl::asMatrix((*this)[i][j]).umhv(xi,yj);
│ │ │ │ -
934 }
│ │ │ │ -
935 }
│ │ │ │ -
│ │ │ │ -
936
│ │ │ │ -
938 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
939 void mmhv (const X& x, Y& y) const
│ │ │ │ -
940 {
│ │ │ │ -
941#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
942 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
943 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
944#endif
│ │ │ │ -
945 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
946 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
947 {
│ │ │ │ -
948 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ -
949 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ -
950 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj);
│ │ │ │ -
951 }
│ │ │ │ -
952 }
│ │ │ │ -
│ │ │ │ -
953
│ │ │ │ -
955 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
956 void usmhv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ -
957 {
│ │ │ │ -
958#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
959 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
960 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ -
961#endif
│ │ │ │ -
962 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ -
963 for (size_type j=0; j<cols_; j++)
│ │ │ │ -
964 {
│ │ │ │ -
965 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ -
966 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ -
967 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj);
│ │ │ │ -
968 }
│ │ │ │ -
969 }
│ │ │ │ -
│ │ │ │ -
970
│ │ │ │ -
971 //===== norms
│ │ │ │ -
972
│ │ │ │ -
│ │ │ │ -
974 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ -
975 {
│ │ │ │ -
976 return std::sqrt(frobenius_norm2());
│ │ │ │ -
977 }
│ │ │ │ -
│ │ │ │ -
978
│ │ │ │ -
│ │ │ │ -
980 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
│ │ │ │ -
981 {
│ │ │ │ -
982 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
983 for (size_type i=0; i<this->N(); i++)
│ │ │ │ -
984 for (size_type j=0; j<this->M(); j++)
│ │ │ │ -
985 sum += Impl::asMatrix(data_[i][j]).frobenius_norm2();
│ │ │ │ -
986 return sum;
│ │ │ │ -
987 }
│ │ │ │ -
│ │ │ │ -
988
│ │ │ │ -
990 template <typename ft = field_type,
│ │ │ │ -
991 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
992 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
993 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
994 using std::max;
│ │ │ │ -
995
│ │ │ │ -
996 real_type norm = 0;
│ │ │ │ -
997 for (auto const &x : *this) {
│ │ │ │ -
998 real_type sum = 0;
│ │ │ │ -
999 for (auto const &y : x)
│ │ │ │ -
1000 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ -
1001 norm = max(sum, norm);
│ │ │ │ -
1002 isNaN += sum;
│ │ │ │ -
1003 }
│ │ │ │ -
1004
│ │ │ │ -
1005 return norm;
│ │ │ │ -
1006 }
│ │ │ │ -
│ │ │ │ -
1007
│ │ │ │ -
1009 template <typename ft = field_type,
│ │ │ │ -
1010 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1011 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
1012 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1013 using std::max;
│ │ │ │ -
1014
│ │ │ │ -
1015 real_type norm = 0;
│ │ │ │ -
1016 for (auto const &x : *this) {
│ │ │ │ -
1017 real_type sum = 0;
│ │ │ │ -
1018 for (auto const &y : x)
│ │ │ │ -
1019 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ -
1020 norm = max(sum, norm);
│ │ │ │ -
1021 }
│ │ │ │ -
1022 return norm;
│ │ │ │ -
1023 }
│ │ │ │ -
│ │ │ │ -
1024
│ │ │ │ -
1026 template <typename ft = field_type,
│ │ │ │ -
1027 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1028 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
1029 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1030 using std::max;
│ │ │ │ -
1031
│ │ │ │ -
1032 real_type norm = 0;
│ │ │ │ -
1033 real_type isNaN = 1;
│ │ │ │ -
1034 for (auto const &x : *this) {
│ │ │ │ -
1035 real_type sum = 0;
│ │ │ │ -
1036 for (auto const &y : x)
│ │ │ │ -
1037 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ -
1038 norm = max(sum, norm);
│ │ │ │ -
1039 isNaN += sum;
│ │ │ │ -
1040 }
│ │ │ │ -
1041
│ │ │ │ -
1042 return norm * (isNaN / isNaN);
│ │ │ │ -
1043 }
│ │ │ │ -
│ │ │ │ -
1044
│ │ │ │ -
1046 template <typename ft = field_type,
│ │ │ │ -
1047 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1048 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
1049 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1050 using std::max;
│ │ │ │ -
1051
│ │ │ │ -
1052 real_type norm = 0;
│ │ │ │ -
1053 real_type isNaN = 1;
│ │ │ │ -
1054 for (auto const &x : *this) {
│ │ │ │ -
1055 real_type sum = 0;
│ │ │ │ -
1056 for (auto const &y : x)
│ │ │ │ -
1057 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ -
1058 norm = max(sum, norm);
│ │ │ │ -
1059 isNaN += sum;
│ │ │ │ -
1060 }
│ │ │ │ -
1061
│ │ │ │ -
1062 return norm * (isNaN / isNaN);
│ │ │ │ -
1063 }
│ │ │ │ -
│ │ │ │ -
1064
│ │ │ │ -
1065 //===== query
│ │ │ │ -
1066
│ │ │ │ -
│ │ │ │ -
1068 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
│ │ │ │ -
1069 {
│ │ │ │ -
1070#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1071 if (i<0 || i>=N()) DUNE_THROW(ISTLError,"row index out of range");
│ │ │ │ -
1072 if (j<0 || i>=M()) DUNE_THROW(ISTLError,"column index out of range");
│ │ │ │ -
1073#endif
│ │ │ │ -
1074 return true;
│ │ │ │ -
1075 }
│ │ │ │ -
│ │ │ │ -
1076
│ │ │ │ -
1077 protected:
│ │ │ │ -
1078
│ │ │ │ - │ │ │ │ -
1082
│ │ │ │ - │ │ │ │ -
1089 };
│ │ │ │ -
│ │ │ │ -
1090
│ │ │ │ -
1091 template<class T, class A>
│ │ │ │ -
│ │ │ │ -
1092 struct FieldTraits< Matrix<T, A> >
│ │ │ │ -
1093 {
│ │ │ │ - │ │ │ │ -
1095 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
1096 };
│ │ │ │ -
│ │ │ │ -
1097
│ │ │ │ -
1099} // end namespace Dune
│ │ │ │ -
1100
│ │ │ │ -
1101#endif
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
141 /* Modify the coefficients. */
│ │ │ │ +
142 block_type a_00_inv = (*this)[0][0];
│ │ │ │ +
143 Impl::asMatrix(a_00_inv).invert();
│ │ │ │ +
144
│ │ │ │ +
145 //c[0] /= (*this)[0][0]; /* Division by zero risk. */
│ │ │ │ +
146 block_type tmp = a_00_inv;
│ │ │ │ +
147 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0]));
│ │ │ │ +
148 c[0] = tmp;
│ │ │ │ +
149
│ │ │ │ +
150 // d = a^{-1} d /* Division by zero would imply a singular matrix. */
│ │ │ │ +
151 auto d_0_tmp = d[0];
│ │ │ │ +
152 auto&& d_0 = Impl::asVector(d[0]);
│ │ │ │ +
153 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0);
│ │ │ │ +
154
│ │ │ │ +
155 for (unsigned int i = 1; i < this->N(); i++) {
│ │ │ │ +
156
│ │ │ │ +
157 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1}
│ │ │ │ +
158 block_type tmp;
│ │ │ │ +
159 tmp = (*this)[i][i-1];
│ │ │ │ +
160 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1]));
│ │ │ │ +
161
│ │ │ │ +
162 block_type id = (*this)[i][i];
│ │ │ │ +
163 id -= tmp;
│ │ │ │ +
164 Impl::asMatrix(id).invert(); /* Division by zero risk. */
│ │ │ │ +
165
│ │ │ │ +
166 if (i<c.size()) {
│ │ │ │ +
167 Impl::asMatrix(c[i]).leftmultiply(Impl::asMatrix(id)); /* Last value calculated is redundant. */
│ │ │ │ +
168 }
│ │ │ │ +
169
│ │ │ │ +
170 // d[i] = (d[i] - d[i-1] * (*this)[i][i-1]) * id;
│ │ │ │ +
171 auto&& d_i = Impl::asVector(d[i]);
│ │ │ │ +
172 Impl::asMatrix((*this)[i][i-1]).mmv(Impl::asVector(d[i-1]), d_i);
│ │ │ │ +
173 auto tmpVec = d[i];
│ │ │ │ +
174 Impl::asMatrix(id).mv(Impl::asVector(tmpVec), d_i);
│ │ │ │ +
175 }
│ │ │ │ +
176
│ │ │ │ +
177 /* Now back substitute. */
│ │ │ │ +
178 x[this->N() - 1] = d[this->N() - 1];
│ │ │ │ +
179 for (int i = this->N() - 2; i >= 0; i--) {
│ │ │ │ +
180 //x[i] = d[i] - c[i] * x[i + 1];
│ │ │ │ +
181 x[i] = d[i];
│ │ │ │ +
182 auto&& x_i = Impl::asVector(x[i]);
│ │ │ │ +
183 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i);
│ │ │ │ +
184 }
│ │ │ │ +
185
│ │ │ │ +
186 }
│ │ │ │ +
│ │ │ │ +
187
│ │ │ │ +
188 private:
│ │ │ │ +
189
│ │ │ │ +
190 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ +
191 // The following methods from the base class should now actually be called
│ │ │ │ +
192 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ +
193
│ │ │ │ +
194 // createbegin and createend should be in there, too, but I can't get it to compile
│ │ │ │ +
195 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
│ │ │ │ +
196 // BCRSMatrix<B,A>::CreateIterator createend () {}
│ │ │ │ +
197 void setrowsize (size_type i, size_type s) {}
│ │ │ │ +
198 void incrementrowsize (size_type i) {}
│ │ │ │ +
199 void endrowsizes () {}
│ │ │ │ +
200 void addindex (size_type row, size_type col) {}
│ │ │ │ +
201 void endindices () {}
│ │ │ │ +
202 };
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
204 template<typename B, typename A>
│ │ │ │ +
│ │ │ │ +
205 struct FieldTraits< BTDMatrix<B, A> >
│ │ │ │ +
206 {
│ │ │ │ + │ │ │ │ +
208 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
209 };
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
213} // end namespace Dune
│ │ │ │ +
214
│ │ │ │ +
215#endif
│ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
A Vector of blocks with different blocksizes.
Definition matrix.hh:44
│ │ │ │ -
Imp::BlockVectorWindow< B, A > window_type
Definition matrix.hh:70
│ │ │ │ -
BlockVector< B, A > block_type
Same as value_type, here for historical reasons.
Definition matrix.hh:67
│ │ │ │ -
DenseMatrixBase & operator=(const DenseMatrixBase &a)
assignment
Definition matrix.hh:182
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition matrix.hh:50
│ │ │ │ -
Iterator beforeBegin() const
Definition matrix.hh:385
│ │ │ │ -
void resize(size_type rows, size_type columns)
same effect as constructor with same argument
Definition matrix.hh:153
│ │ │ │ -
const window_type const_reference
Definition matrix.hh:74
│ │ │ │ -
DenseMatrixBase(size_type rows, size_type columns)
Definition matrix.hh:95
│ │ │ │ -
Iterator end()
end Iterator
Definition matrix.hh:371
│ │ │ │ -
reference operator[](size_type i)
random access to blocks
Definition matrix.hh:241
│ │ │ │ -
BlockVector< B, A > value_type
Type of the elements of the outer vector, i.e., dynamic vectors of B.
Definition matrix.hh:63
│ │ │ │ -
Iterator find(size_type i)
random access returning iterator (end if not contained)
Definition matrix.hh:391
│ │ │ │ -
size_type N() const
number of blocks in the vector (are of variable size here)
Definition matrix.hh:539
│ │ │ │ -
ConstIterator beforeEnd() const
Definition matrix.hh:525
│ │ │ │ -
ConstIterator end() const
end ConstIterator
Definition matrix.hh:518
│ │ │ │ -
window_type reference
Definition matrix.hh:72
│ │ │ │ -
ConstIterator rend() const
end ConstIterator
Definition matrix.hh:531
│ │ │ │ -
Iterator beforeEnd()
Definition matrix.hh:378
│ │ │ │ -
ConstIterator begin() const
begin ConstIterator
Definition matrix.hh:512
│ │ │ │ -
A allocator_type
export the allocator type
Definition matrix.hh:53
│ │ │ │ -
DenseMatrixBase()
Definition matrix.hh:82
│ │ │ │ -
ConstIterator find(size_type i) const
random access returning iterator (end if not contained)
Definition matrix.hh:397
│ │ │ │ -
A::size_type size_type
The size type for the index access.
Definition matrix.hh:56
│ │ │ │ -
~DenseMatrixBase()
free dynamic memory
Definition matrix.hh:142
│ │ │ │ -
Iterator begin()
begin Iterator
Definition matrix.hh:365
│ │ │ │ -
DenseMatrixBase(const DenseMatrixBase &a)
copy constructor, has copy semantics
Definition matrix.hh:116
│ │ │ │ -
Iterator class for sequential access.
Definition matrix.hh:263
│ │ │ │ -
Iterator & operator--()
prefix decrement
Definition matrix.hh:308
│ │ │ │ -
size_type index() const
Definition matrix.hh:352
│ │ │ │ - │ │ │ │ - │ │ │ │ -
bool operator!=(const Iterator &it) const
inequality
Definition matrix.hh:322
│ │ │ │ -
Iterator & operator=(Iterator &&other)
Move assignment.
Definition matrix.hh:282
│ │ │ │ -
Iterator & operator++()
prefix increment
Definition matrix.hh:300
│ │ │ │ -
Iterator()
constructor, no arguments
Definition matrix.hh:266
│ │ │ │ -
window_type & operator*() const
dereferencing
Definition matrix.hh:340
│ │ │ │ -
bool operator==(const Iterator &it) const
equality
Definition matrix.hh:316
│ │ │ │ -
Iterator & operator=(Iterator &other)
Copy assignment.
Definition matrix.hh:291
│ │ │ │ -
Iterator(B *data, size_type columns, size_type _i)
constructor
Definition matrix.hh:276
│ │ │ │ -
window_type * operator->() const
arrow
Definition matrix.hh:346
│ │ │ │ -
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ -
const window_type * operator->() const
arrow
Definition matrix.hh:487
│ │ │ │ -
const window_type & operator*() const
dereferencing
Definition matrix.hh:481
│ │ │ │ -
ConstIterator & operator++()
prefix increment
Definition matrix.hh:441
│ │ │ │ -
ConstIterator(const B *data, size_type columns, size_type _i)
constructor from pointer
Definition matrix.hh:414
│ │ │ │ -
ConstIterator & operator--()
prefix decrement
Definition matrix.hh:449
│ │ │ │ -
ConstIterator(const Iterator &it)
constructor from non_const iterator
Definition matrix.hh:420
│ │ │ │ -
bool operator!=(const ConstIterator &it) const
inequality
Definition matrix.hh:463
│ │ │ │ -
ConstIterator()
constructor
Definition matrix.hh:407
│ │ │ │ -
bool operator==(const ConstIterator &it) const
equality
Definition matrix.hh:457
│ │ │ │ -
size_type index() const
Definition matrix.hh:493
│ │ │ │ -
ConstIterator & operator=(Iterator &&other)
Definition matrix.hh:424
│ │ │ │ -
ConstIterator & operator=(Iterator &other)
Definition matrix.hh:432
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
size_type cols_
Number of columns of the matrix.
Definition matrix.hh:1088
│ │ │ │ -
FieldTraits< ft >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition matrix.hh:992
│ │ │ │ -
A allocator_type
Export the allocator.
Definition matrix.hh:571
│ │ │ │ -
FieldTraits< ft >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition matrix.hh:1011
│ │ │ │ -
void usmhv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition matrix.hh:956
│ │ │ │ -
void usmv(const field_type &alpha, const X &x, Y &y) const
Definition matrix.hh:854
│ │ │ │ -
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A > data_
Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.
Definition matrix.hh:1081
│ │ │ │ -
Matrix transpose() const
Return the transpose of the matrix.
Definition matrix.hh:745
│ │ │ │ -
void mtv(const X &x, Y &y) const
y = A^T x
Definition matrix.hh:807
│ │ │ │ -
void umv(const X &x, Y &y) const
y += A x
Definition matrix.hh:820
│ │ │ │ -
void mv(const X &x, Y &y) const
y = A x
Definition matrix.hh:788
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator
Const iterator over the matrix rows.
Definition matrix.hh:586
│ │ │ │ -
void setSize(size_type rows, size_type cols)
Change the matrix size.
Definition matrix.hh:608
│ │ │ │ -
RowIterator beforeBegin()
Definition matrix.hh:634
│ │ │ │ -
RowIterator beforeEnd()
Definition matrix.hh:627
│ │ │ │ -
Matrix()
Create empty matrix.
Definition matrix.hh:596
│ │ │ │ -
Matrix & operator-=(const Matrix &b)
Subtract the entries of another matrix from this one.
Definition matrix.hh:735
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition matrix.hh:980
│ │ │ │ -
row_type::iterator ColIterator
Iterator for the entries of each row.
Definition matrix.hh:583
│ │ │ │ -
ConstRowIterator beforeEnd() const
Definition matrix.hh:653
│ │ │ │ -
Matrix & operator=(const field_type &t)
Assignment from scalar.
Definition matrix.hh:666
│ │ │ │ -
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ -
const row_type operator[](size_type row) const
The const index operator.
Definition matrix.hh:684
│ │ │ │ -
ConstRowIterator end() const
Get const iterator to one beyond last row.
Definition matrix.hh:646
│ │ │ │ -
friend Y operator*(const Matrix< T > &m, const X &vec)
Generic matrix-vector multiplication.
Definition matrix.hh:770
│ │ │ │ -
Matrix< T > & operator*=(const field_type &scalar)
Multiplication with a scalar.
Definition matrix.hh:705
│ │ │ │ -
row_type operator[](size_type row)
The index operator.
Definition matrix.hh:673
│ │ │ │ -
void mmv(const X &x, Y &y) const
y -= A x
Definition matrix.hh:837
│ │ │ │ -
Matrix & operator+=(const Matrix &b)
Add the entries of another matrix to this one.
Definition matrix.hh:721
│ │ │ │ -
ConstRowIterator begin() const
Get const iterator to first row.
Definition matrix.hh:640
│ │ │ │ -
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition matrix.hh:939
│ │ │ │ -
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ -
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ -
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ -
static constexpr auto blocklevel
The number of nesting levels the matrix contains.
Definition matrix.hh:593
│ │ │ │ -
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ -
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ -
bool exists(size_type i, size_type j) const
return true if (i,j) is in pattern
Definition matrix.hh:1068
│ │ │ │ -
Matrix< T > & operator/=(const field_type &scalar)
Division by a scalar.
Definition matrix.hh:711
│ │ │ │ -
friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2)
Generic matrix multiplication.
Definition matrix.hh:755
│ │ │ │ -
void umtv(const X &x, Y &y) const
y += A^T x
Definition matrix.hh:871
│ │ │ │ -
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition matrix.hh:888
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition matrix.hh:974
│ │ │ │ -
void usmtv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition matrix.hh:905
│ │ │ │ -
void umhv(const X &x, Y &y) const
y += A^H x
Definition matrix.hh:922
│ │ │ │ -
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ -
ConstRowIterator beforeBegin() const
Definition matrix.hh:660
│ │ │ │ -
Matrix(size_type rows, size_type cols)
Create uninitialized matrix of size rows x cols.
Definition matrix.hh:601
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator
Iterator over the matrix rows.
Definition matrix.hh:580
│ │ │ │ -
typename Matrix< T, A >::field_type field_type
Definition matrix.hh:1094
│ │ │ │ -
typename FieldTraits< field_type >::real_type real_type
Definition matrix.hh:1095
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
void endrowsizes()
indicate that size of all rows is defined
Definition bcrsmatrix.hh:1149
│ │ │ │ +
@ random
Build entries randomly.
Definition bcrsmatrix.hh:530
│ │ │ │ +
void addindex(size_type row, size_type col)
add index (row,col) to the matrix
Definition bcrsmatrix.hh:1191
│ │ │ │ +
void endindices()
indicate that all indices are defined, check consistency
Definition bcrsmatrix.hh:1248
│ │ │ │ +
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ +
BCRSMatrix & operator=(const BCRSMatrix &Mat)
assignment
Definition bcrsmatrix.hh:911
│ │ │ │ +
A block-tridiagonal matrix.
Definition btdmatrix.hh:31
│ │ │ │ +
static constexpr auto blocklevel
increment block level counter
Definition btdmatrix.hh:53
│ │ │ │ +
BTDMatrix(size_type size)
Definition btdmatrix.hh:58
│ │ │ │ +
void solve(V &x, const V &rhs) const
Use the Thomas algorithm to solve the system Ax=b in O(n) time.
Definition btdmatrix.hh:125
│ │ │ │ +
A::size_type size_type
implement row_type with compressed vector
Definition btdmatrix.hh:49
│ │ │ │ +
A allocator_type
export the allocator type
Definition btdmatrix.hh:43
│ │ │ │ +
B block_type
export the type representing the components
Definition btdmatrix.hh:40
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition btdmatrix.hh:37
│ │ │ │ +
BTDMatrix & operator=(const BTDMatrix &other)
assignment
Definition btdmatrix.hh:108
│ │ │ │ +
BTDMatrix()
Default constructor.
Definition btdmatrix.hh:56
│ │ │ │ +
void setSize(size_type size)
Resize the matrix. Invalidates the content!
Definition btdmatrix.hh:81
│ │ │ │ +
typename FieldTraits< field_type >::real_type real_type
Definition btdmatrix.hh:208
│ │ │ │ +
typename BTDMatrix< B, A >::field_type field_type
Definition btdmatrix.hh:207
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1378 +1,288 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -matrix.hh │ │ │ │ │ +btdmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_MATRIX_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_BTDMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_BTDMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25 │ │ │ │ │ -_2_6namespace MatrixImp │ │ │ │ │ -27{ │ │ │ │ │ -39 template > │ │ │ │ │ -_4_0 class _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e : public Imp::block_vector_unmanaged │ │ │ │ │ -41 // this derivation gives us all the blas level 1 and norms │ │ │ │ │ -42 // on the large array. However, access operators have to be │ │ │ │ │ -43 // overwritten. │ │ │ │ │ -44 { │ │ │ │ │ -45 public: │ │ │ │ │ -46 │ │ │ │ │ -47 //===== type definitions and constants │ │ │ │ │ -48 │ │ │ │ │ -_5_0 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ -51 │ │ │ │ │ -_5_3 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +13 │ │ │ │ │ +19namespace _D_u_n_e { │ │ │ │ │ +29 template > │ │ │ │ │ +_3_0 class _B_T_D_M_a_t_r_i_x : public _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +31 { │ │ │ │ │ +32 public: │ │ │ │ │ +33 │ │ │ │ │ +34 //===== type definitions and constants │ │ │ │ │ +35 │ │ │ │ │ +_3_7 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +38 │ │ │ │ │ +_4_0 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +41 │ │ │ │ │ +_4_3 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +44 │ │ │ │ │ +46 //typedef BCRSMatrix::row_type row_type; │ │ │ │ │ +47 │ │ │ │ │ +_4_9 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +50 │ │ │ │ │ +52 [[deprecated("Use free blockLevel function. Will be removed after 2.8.")]] │ │ │ │ │ +_5_3 static constexpr auto _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ 54 │ │ │ │ │ -_5_6 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +_5_6 _B_T_D_M_a_t_r_i_x() : _B_C_R_S_M_a_t_r_i_x() {} │ │ │ │ │ 57 │ │ │ │ │ -_6_3 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -64 │ │ │ │ │ -_6_7 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -68 │ │ │ │ │ -69 // just a shorthand │ │ │ │ │ -_7_0 typedef Imp::BlockVectorWindow _w_i_n_d_o_w___t_y_p_e; │ │ │ │ │ -71 │ │ │ │ │ -_7_2 typedef _w_i_n_d_o_w___t_y_p_e _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -73 │ │ │ │ │ -_7_4 typedef const _w_i_n_d_o_w___t_y_p_e _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -75 │ │ │ │ │ +_5_8 explicit _B_T_D_M_a_t_r_i_x(_s_i_z_e___t_y_p_e size) │ │ │ │ │ +59 : _B_C_R_S_M_a_t_r_i_x(size, size, _B_C_R_S_M_a_t_r_i_x::_r_a_n_d_o_m) │ │ │ │ │ +60 { │ │ │ │ │ +61 // Set number of entries for each row │ │ │ │ │ +62 // All rows get three entries, except for the first and the last one │ │ │ │ │ +63 for (size_t i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 3 - (i==0) - (i==(size-1))); │ │ │ │ │ +65 │ │ │ │ │ +66 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ +67 │ │ │ │ │ +68 // The actual entries for each row │ │ │ │ │ +69 for (size_t i=0; i0) │ │ │ │ │ +71 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i-1); │ │ │ │ │ +72 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i ); │ │ │ │ │ +73 if (i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i+1); │ │ │ │ │ +75 } │ │ │ │ │ 76 │ │ │ │ │ -77 //===== constructors and such │ │ │ │ │ -78 │ │ │ │ │ -_8_2 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e () : Imp::block_vector_unmanaged() │ │ │ │ │ -83 { │ │ │ │ │ -84 // nothing is known ... │ │ │ │ │ -85 rows_ = 0; │ │ │ │ │ -86 columns_ = 0; │ │ │ │ │ -87 } │ │ │ │ │ -88 │ │ │ │ │ -_9_5 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e (_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns) : Imp:: │ │ │ │ │ -block_vector_unmanaged() │ │ │ │ │ -96 { │ │ │ │ │ -97 // and we can allocate the big array in the base class │ │ │ │ │ -98 this->n = rows*columns; │ │ │ │ │ -99 columns_ = columns; │ │ │ │ │ -100 if (this->n>0) │ │ │ │ │ -101 { │ │ │ │ │ -102 this->p = allocator_.allocate(this->n); │ │ │ │ │ -103 new (this->p)B[this->n]; │ │ │ │ │ -104 } │ │ │ │ │ -105 else │ │ │ │ │ -106 { │ │ │ │ │ -107 this->n = 0; │ │ │ │ │ -108 this->p = 0; │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -111 // we can allocate the windows now │ │ │ │ │ -112 rows_ = rows; │ │ │ │ │ -113 } │ │ │ │ │ -114 │ │ │ │ │ -_1_1_6 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e (const _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& a) │ │ │ │ │ -117 { │ │ │ │ │ -118 // allocate the big array in the base class │ │ │ │ │ -119 this->n = a.n; │ │ │ │ │ -120 columns_ = a.columns_; │ │ │ │ │ -121 if (this->n>0) │ │ │ │ │ -122 { │ │ │ │ │ -123 // allocate and construct objects │ │ │ │ │ -124 this->p = allocator_.allocate(this->n); │ │ │ │ │ -125 new (this->p)B[this->n]; │ │ │ │ │ +77 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +_8_1 void _s_e_t_S_i_z_e(size_type size) │ │ │ │ │ +82 { │ │ │ │ │ +83 auto nonZeros = (size==0) ? 0 : size + 2*(size-1); │ │ │ │ │ +84 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_S_i_z_e(size, // rows │ │ │ │ │ +85 size, // columns │ │ │ │ │ +86 nonZeros); │ │ │ │ │ +87 │ │ │ │ │ +88 // Set number of entries for each row │ │ │ │ │ +89 // All rows get three entries, except for the first and the last one │ │ │ │ │ +90 for (size_t i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 3 - (i==0) - (i==(size-1))); │ │ │ │ │ +92 │ │ │ │ │ +93 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ +94 │ │ │ │ │ +95 // The actual entries for each row │ │ │ │ │ +96 for (size_t i=0; i0) │ │ │ │ │ +98 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i-1); │ │ │ │ │ +99 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i ); │ │ │ │ │ +100 if (i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i+1); │ │ │ │ │ +102 } │ │ │ │ │ +103 │ │ │ │ │ +104 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +_1_0_8 _B_T_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _B_T_D_M_a_t_r_i_x& other) { │ │ │ │ │ +109 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(other); │ │ │ │ │ +110 return *this; │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +_1_1_4 _B_T_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) { │ │ │ │ │ +115 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(k); │ │ │ │ │ +116 return *this; │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +124 template │ │ │ │ │ +_1_2_5 void _s_o_l_v_e (V& x, const V& rhs) const { │ │ │ │ │ 126 │ │ │ │ │ -127 // copy data │ │ │ │ │ -128 for (_s_i_z_e___t_y_p_e i=0; in; i++) │ │ │ │ │ -129 this->p[i]=a.p[i]; │ │ │ │ │ -130 } │ │ │ │ │ -131 else │ │ │ │ │ -132 { │ │ │ │ │ -133 this->n = 0; │ │ │ │ │ -134 this->p = nullptr; │ │ │ │ │ -135 } │ │ │ │ │ -136 │ │ │ │ │ -137 // we can allocate the windows now │ │ │ │ │ -138 rows_ = a.rows_; │ │ │ │ │ -139 } │ │ │ │ │ +127 // special handling for 1x1 matrices. The generic algorithm doesn't work │ │ │ │ │ +for them │ │ │ │ │ +128 if (this->_N()==1) { │ │ │ │ │ +129 auto&& x0 = Impl::asVector(x[0]); │ │ │ │ │ +130 auto&& rhs0 = Impl::asVector(rhs[0]); │ │ │ │ │ +131 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0); │ │ │ │ │ +132 return; │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +135 // Make copies of the rhs and the right matrix band │ │ │ │ │ +136 V d = rhs; │ │ │ │ │ +137 std::vector c(this->_N()-1); │ │ │ │ │ +138 for (size_t i=0; i_N()-1; i++) │ │ │ │ │ +139 c[i] = (*this)[i][i+1]; │ │ │ │ │ 140 │ │ │ │ │ -_1_4_2 _~_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e () │ │ │ │ │ -143 { │ │ │ │ │ -144 if (this->n>0) { │ │ │ │ │ -145 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -146 while (i) │ │ │ │ │ -147 this->p[--i].~B(); │ │ │ │ │ -148 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -149 } │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -_1_5_3 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns) │ │ │ │ │ -154 { │ │ │ │ │ -155 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ -156 if (this->n>0) { │ │ │ │ │ -157 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -158 while (i) │ │ │ │ │ -159 this->p[--i].~B(); │ │ │ │ │ -160 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -161 } │ │ │ │ │ -162 │ │ │ │ │ -163 // and we can allocate the big array in the base class │ │ │ │ │ -164 this->n = rows*columns; │ │ │ │ │ -165 if (this->n>0) │ │ │ │ │ -166 { │ │ │ │ │ -167 this->p = allocator_.allocate(this->n); │ │ │ │ │ -168 new (this->p)B[this->n]; │ │ │ │ │ -169 } │ │ │ │ │ -170 else │ │ │ │ │ -171 { │ │ │ │ │ -172 this->n = 0; │ │ │ │ │ -173 this->p = nullptr; │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -176 // we can allocate the windows now │ │ │ │ │ -177 rows_ = rows; │ │ │ │ │ -178 columns_ = columns; │ │ │ │ │ -179 } │ │ │ │ │ -180 │ │ │ │ │ -_1_8_2 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& _o_p_e_r_a_t_o_r_=_ (const _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& a) │ │ │ │ │ -183 { │ │ │ │ │ -184 if (&a!=this) // check if this and a are different objects │ │ │ │ │ -185 { │ │ │ │ │ -186 columns_ = a.columns_; │ │ │ │ │ -187 // reallocate arrays if necessary │ │ │ │ │ -188 // Note: still the block sizes may vary ! │ │ │ │ │ -189 if (this->n!=a.n || rows_!=a.rows_) │ │ │ │ │ -190 { │ │ │ │ │ -191 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ -192 if (this->n>0) { │ │ │ │ │ -193 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -194 while (i) │ │ │ │ │ -195 this->p[--i].~B(); │ │ │ │ │ -196 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -197 } │ │ │ │ │ -198 │ │ │ │ │ -199 // allocate the big array in the base class │ │ │ │ │ -200 this->n = a.n; │ │ │ │ │ -201 if (this->n>0) │ │ │ │ │ -202 { │ │ │ │ │ -203 // allocate and construct objects │ │ │ │ │ -204 this->p = allocator_.allocate(this->n); │ │ │ │ │ -205 new (this->p)B[this->n]; │ │ │ │ │ -206 } │ │ │ │ │ -207 else │ │ │ │ │ -208 { │ │ │ │ │ -209 this->n = 0; │ │ │ │ │ -210 this->p = nullptr; │ │ │ │ │ -211 } │ │ │ │ │ -212 │ │ │ │ │ -213 // Copy number of rows │ │ │ │ │ -214 rows_ = a.rows_; │ │ │ │ │ -215 } │ │ │ │ │ -216 │ │ │ │ │ -217 // and copy the data │ │ │ │ │ -218 for (_s_i_z_e___t_y_p_e i=0; in; i++) │ │ │ │ │ -219 this->p[i]=a.p[i]; │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -222 return *this; │ │ │ │ │ -223 } │ │ │ │ │ -224 │ │ │ │ │ -225 │ │ │ │ │ -226 //===== assignment from scalar │ │ │ │ │ -227 │ │ │ │ │ -_2_2_9 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -230 { │ │ │ │ │ -231 (static_cast&>(*this)) = k; │ │ │ │ │ -232 return *this; │ │ │ │ │ -233 } │ │ │ │ │ -234 │ │ │ │ │ -235 │ │ │ │ │ -236 //===== access to components │ │ │ │ │ -237 // has to be overwritten from base class because it must │ │ │ │ │ -238 // return access to the windows │ │ │ │ │ -239 │ │ │ │ │ -_2_4_1 _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) │ │ │ │ │ -242 { │ │ │ │ │ -243#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -244 if (i>=rows_) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ -245#endif │ │ │ │ │ -246 return _w_i_n_d_o_w___t_y_p_e(this->p + i*columns_, columns_); │ │ │ │ │ -247 } │ │ │ │ │ -248 │ │ │ │ │ -_2_5_0 _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 │ │ │ │ │ -251 { │ │ │ │ │ -252#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -253 if (i<0 || i>=rows_) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ -254#endif │ │ │ │ │ -255 return _w_i_n_d_o_w___t_y_p_e(this->p + i*columns_, columns_); │ │ │ │ │ -256 } │ │ │ │ │ -257 │ │ │ │ │ -258 // forward declaration │ │ │ │ │ -259 class ConstIterator; │ │ │ │ │ -260 │ │ │ │ │ -_2_6_2 class _I_t_e_r_a_t_o_r │ │ │ │ │ -263 { │ │ │ │ │ -264 public: │ │ │ │ │ -_2_6_6 _I_t_e_r_a_t_o_r () │ │ │ │ │ -267 : window_(nullptr,0) │ │ │ │ │ -268 { │ │ │ │ │ -269 i = 0; │ │ │ │ │ -270 } │ │ │ │ │ -271 │ │ │ │ │ -_2_7_2 _I_t_e_r_a_t_o_r (_I_t_e_r_a_t_o_r& other) = default; │ │ │ │ │ -_2_7_3 _I_t_e_r_a_t_o_r (_I_t_e_r_a_t_o_r&& other) = default; │ │ │ │ │ -274 │ │ │ │ │ -_2_7_6 _I_t_e_r_a_t_o_r (B* data, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ -277 : i(_i), │ │ │ │ │ -278 window_(data + _i*columns, columns) │ │ │ │ │ -279 {} │ │ │ │ │ -280 │ │ │ │ │ -_2_8_2 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r&& other) │ │ │ │ │ -283 { │ │ │ │ │ -284 i = other.i; │ │ │ │ │ -285 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ -not just the window! │ │ │ │ │ -286 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ -287 return *this; │ │ │ │ │ -288 } │ │ │ │ │ -289 │ │ │ │ │ -_2_9_1 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r& other) │ │ │ │ │ -292 { │ │ │ │ │ -293 i = other.i; │ │ │ │ │ -294 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ -not just the window! │ │ │ │ │ -295 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ -296 return *this; │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -_3_0_0 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -301 { │ │ │ │ │ -302 ++i; │ │ │ │ │ -303 window_.setptr(window_.getptr()+window_.getsize()); │ │ │ │ │ -304 return *this; │ │ │ │ │ -305 } │ │ │ │ │ -306 │ │ │ │ │ -_3_0_8 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ -309 { │ │ │ │ │ -310 --i; │ │ │ │ │ -311 window_.setptr(window_.getptr()-window_.getsize()); │ │ │ │ │ -312 return *this; │ │ │ │ │ -313 } │ │ │ │ │ -314 │ │ │ │ │ -_3_1_6 bool _o_p_e_r_a_t_o_r_=_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -317 { │ │ │ │ │ -318 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -_3_2_2 bool _o_p_e_r_a_t_o_r_!_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -323 { │ │ │ │ │ -324 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ -325 } │ │ │ │ │ -326 │ │ │ │ │ -_3_2_8 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -329 { │ │ │ │ │ -330 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ -331 } │ │ │ │ │ -332 │ │ │ │ │ -_3_3_4 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -335 { │ │ │ │ │ -336 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ -337 } │ │ │ │ │ -338 │ │ │ │ │ -_3_4_0 _w_i_n_d_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_*_ () const │ │ │ │ │ -341 { │ │ │ │ │ -342 return window_; │ │ │ │ │ -343 } │ │ │ │ │ -344 │ │ │ │ │ -_3_4_6 _w_i_n_d_o_w___t_y_p_e* _o_p_e_r_a_t_o_r_-_>_ () const │ │ │ │ │ -347 { │ │ │ │ │ -348 return &window_; │ │ │ │ │ -349 } │ │ │ │ │ -350 │ │ │ │ │ -351 // return index corresponding to pointer │ │ │ │ │ -_3_5_2 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ -353 { │ │ │ │ │ -354 return i; │ │ │ │ │ -355 } │ │ │ │ │ -356 │ │ │ │ │ -_3_5_7 friend class _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -358 │ │ │ │ │ -359 private: │ │ │ │ │ -360 _s_i_z_e___t_y_p_e i; │ │ │ │ │ -361 mutable _w_i_n_d_o_w___t_y_p_e window_; │ │ │ │ │ -362 }; │ │ │ │ │ -363 │ │ │ │ │ -_3_6_5 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ -366 { │ │ │ │ │ -367 return _I_t_e_r_a_t_o_r(this->p, columns_, 0); │ │ │ │ │ -368 } │ │ │ │ │ -369 │ │ │ │ │ -_3_7_1 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ -372 { │ │ │ │ │ -373 return _I_t_e_r_a_t_o_r(this->p, columns_, rows_); │ │ │ │ │ -374 } │ │ │ │ │ -375 │ │ │ │ │ -_3_7_8 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ -379 { │ │ │ │ │ -380 return _I_t_e_r_a_t_o_r(this->p, columns_, rows_-1); │ │ │ │ │ -381 } │ │ │ │ │ -382 │ │ │ │ │ -_3_8_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ -386 { │ │ │ │ │ -387 return _I_t_e_r_a_t_o_r(this->p, columns_, -1); │ │ │ │ │ -388 } │ │ │ │ │ -389 │ │ │ │ │ -_3_9_1 _I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) │ │ │ │ │ -392 { │ │ │ │ │ -393 return _I_t_e_r_a_t_o_r(this->p, columns_, std::min(i,rows_)); │ │ │ │ │ -394 } │ │ │ │ │ -395 │ │ │ │ │ -_3_9_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -398 { │ │ │ │ │ -399 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, std::min(i,rows_)); │ │ │ │ │ -400 } │ │ │ │ │ -401 │ │ │ │ │ -_4_0_3 class _C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -404 { │ │ │ │ │ -405 public: │ │ │ │ │ -_4_0_7 _C_o_n_s_t_I_t_e_r_a_t_o_r () │ │ │ │ │ -408 : window_(nullptr,0) │ │ │ │ │ -409 { │ │ │ │ │ -410 i = 0; │ │ │ │ │ -411 } │ │ │ │ │ -412 │ │ │ │ │ -_4_1_4 _C_o_n_s_t_I_t_e_r_a_t_o_r (const B* data, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ -415 : i(_i), │ │ │ │ │ -416 window_(const_cast(data + _i * columns), columns) │ │ │ │ │ -417 {} │ │ │ │ │ -418 │ │ │ │ │ -_4_2_0 _C_o_n_s_t_I_t_e_r_a_t_o_r (const _I_t_e_r_a_t_o_r& it) │ │ │ │ │ -421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize()) │ │ │ │ │ -422 {} │ │ │ │ │ -423 │ │ │ │ │ -_4_2_4 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r&& other) │ │ │ │ │ -425 { │ │ │ │ │ -426 i = other.i; │ │ │ │ │ -427 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ -not just the window! │ │ │ │ │ -428 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ -429 return *this; │ │ │ │ │ -430 } │ │ │ │ │ -431 │ │ │ │ │ -_4_3_2 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r& other) │ │ │ │ │ -433 { │ │ │ │ │ -434 i = other.i; │ │ │ │ │ -435 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ -not just the window! │ │ │ │ │ -436 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ -437 return *this; │ │ │ │ │ -438 } │ │ │ │ │ -439 │ │ │ │ │ -_4_4_1 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -442 { │ │ │ │ │ -443 ++i; │ │ │ │ │ -444 window_.setptr(window_.getptr()+window_.getsize()); │ │ │ │ │ -445 return *this; │ │ │ │ │ -446 } │ │ │ │ │ -447 │ │ │ │ │ -_4_4_9 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ -450 { │ │ │ │ │ -451 --i; │ │ │ │ │ -452 window_.setptr(window_.getptr()-window_.getsize()); │ │ │ │ │ -453 return *this; │ │ │ │ │ -454 } │ │ │ │ │ -455 │ │ │ │ │ -_4_5_7 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -458 { │ │ │ │ │ -459 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ -460 } │ │ │ │ │ -461 │ │ │ │ │ -_4_6_3 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -464 { │ │ │ │ │ -465 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ -466 } │ │ │ │ │ -467 │ │ │ │ │ -_4_6_9 bool _o_p_e_r_a_t_o_r_=_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -470 { │ │ │ │ │ -471 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ -472 } │ │ │ │ │ -473 │ │ │ │ │ -_4_7_5 bool _o_p_e_r_a_t_o_r_!_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -476 { │ │ │ │ │ -477 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ -478 } │ │ │ │ │ -479 │ │ │ │ │ -_4_8_1 const _w_i_n_d_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_*_ () const │ │ │ │ │ -482 { │ │ │ │ │ -483 return window_; │ │ │ │ │ -484 } │ │ │ │ │ -485 │ │ │ │ │ -_4_8_7 const _w_i_n_d_o_w___t_y_p_e* _o_p_e_r_a_t_o_r_-_>_ () const │ │ │ │ │ -488 { │ │ │ │ │ -489 return &window_; │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -492 // return index corresponding to pointer │ │ │ │ │ -_4_9_3 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ -494 { │ │ │ │ │ -495 return i; │ │ │ │ │ -496 } │ │ │ │ │ -497 │ │ │ │ │ -_4_9_8 friend class _I_t_e_r_a_t_o_r; │ │ │ │ │ -499 │ │ │ │ │ -500 private: │ │ │ │ │ -501 _s_i_z_e___t_y_p_e i; │ │ │ │ │ -502 mutable _w_i_n_d_o_w___t_y_p_e window_; │ │ │ │ │ -503 }; │ │ │ │ │ -504 │ │ │ │ │ -_5_0_6 using _i_t_e_r_a_t_o_r = _I_t_e_r_a_t_o_r; │ │ │ │ │ -507 │ │ │ │ │ -_5_0_9 using _c_o_n_s_t___i_t_e_r_a_t_o_r = _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -510 │ │ │ │ │ -_5_1_2 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ -513 { │ │ │ │ │ -514 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, 0); │ │ │ │ │ -515 } │ │ │ │ │ -516 │ │ │ │ │ -_5_1_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ -519 { │ │ │ │ │ -520 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, rows_); │ │ │ │ │ -521 } │ │ │ │ │ -522 │ │ │ │ │ -_5_2_5 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ -526 { │ │ │ │ │ -527 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, rows_-1); │ │ │ │ │ -528 } │ │ │ │ │ -529 │ │ │ │ │ -_5_3_1 _C_o_n_s_t_I_t_e_r_a_t_o_r _r_e_n_d () const │ │ │ │ │ -532 { │ │ │ │ │ -533 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, -1); │ │ │ │ │ -534 } │ │ │ │ │ -535 │ │ │ │ │ -536 //===== sizes │ │ │ │ │ -537 │ │ │ │ │ -_5_3_9 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ -540 { │ │ │ │ │ -541 return rows_; │ │ │ │ │ -542 } │ │ │ │ │ -543 │ │ │ │ │ -544 │ │ │ │ │ -545 private: │ │ │ │ │ -546 _s_i_z_e___t_y_p_e rows_; // number of matrix rows │ │ │ │ │ -547 _s_i_z_e___t_y_p_e columns_; // number of matrix columns │ │ │ │ │ -548 │ │ │ │ │ -549 A allocator_; │ │ │ │ │ -550 }; │ │ │ │ │ -551 │ │ │ │ │ -552} // namespace MatrixImp │ │ │ │ │ -553 │ │ │ │ │ -559 template > │ │ │ │ │ -_5_6_0 class _M_a_t_r_i_x │ │ │ │ │ -561 { │ │ │ │ │ -562 public: │ │ │ │ │ -563 │ │ │ │ │ -_5_6_5 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ -566 │ │ │ │ │ -_5_6_8 typedef T _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -569 │ │ │ │ │ -_5_7_1 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -572 │ │ │ │ │ -_5_7_4 typedef typename _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_>_:_:_w_i_n_d_o_w___t_y_p_e _r_o_w___t_y_p_e; │ │ │ │ │ -575 │ │ │ │ │ -_5_7_7 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -578 │ │ │ │ │ -_5_8_0 typedef typename _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_>_:_:_I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -581 │ │ │ │ │ -_5_8_3 typedef typename row_type::iterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -584 │ │ │ │ │ -_5_8_6 typedef typename _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -587 │ │ │ │ │ -_5_8_9 typedef typename row_type::const_iterator _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -590 │ │ │ │ │ -592 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ -2.8.")]] │ │ │ │ │ -_5_9_3 static constexpr auto _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ -594 │ │ │ │ │ -_5_9_6 _M_a_t_r_i_x() : _d_a_t_a__(0,0), _c_o_l_s__(0) │ │ │ │ │ -597 {} │ │ │ │ │ -598 │ │ │ │ │ -_6_0_1 _M_a_t_r_i_x(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e cols) : _d_a_t_a__(rows,cols), _c_o_l_s__(cols) │ │ │ │ │ -602 {} │ │ │ │ │ -603 │ │ │ │ │ -_6_0_8 void _s_e_t_S_i_z_e(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e cols) { │ │ │ │ │ -609 _d_a_t_a__.resize(rows,cols); │ │ │ │ │ -610 _c_o_l_s__ = cols; │ │ │ │ │ -611 } │ │ │ │ │ -612 │ │ │ │ │ -_6_1_4 _R_o_w_I_t_e_r_a_t_o_r _b_e_g_i_n() │ │ │ │ │ -615 { │ │ │ │ │ -616 return _d_a_t_a__.begin(); │ │ │ │ │ -617 } │ │ │ │ │ -618 │ │ │ │ │ -_6_2_0 _R_o_w_I_t_e_r_a_t_o_r _e_n_d() │ │ │ │ │ -621 { │ │ │ │ │ -622 return _d_a_t_a__.end(); │ │ │ │ │ -623 } │ │ │ │ │ -624 │ │ │ │ │ -_6_2_7 _R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ -628 { │ │ │ │ │ -629 return _d_a_t_a__.beforeEnd(); │ │ │ │ │ -630 } │ │ │ │ │ -631 │ │ │ │ │ -_6_3_4 _R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ -635 { │ │ │ │ │ -636 return _d_a_t_a__.beforeBegin(); │ │ │ │ │ -637 } │ │ │ │ │ -638 │ │ │ │ │ -_6_4_0 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ -641 { │ │ │ │ │ -642 return _d_a_t_a__.begin(); │ │ │ │ │ -643 } │ │ │ │ │ -644 │ │ │ │ │ -_6_4_6 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ -647 { │ │ │ │ │ -648 return _d_a_t_a__.end(); │ │ │ │ │ -649 } │ │ │ │ │ -650 │ │ │ │ │ -_6_5_3 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ -654 { │ │ │ │ │ -655 return _d_a_t_a__.beforeEnd(); │ │ │ │ │ -656 } │ │ │ │ │ -657 │ │ │ │ │ -_6_6_0 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ -661 { │ │ │ │ │ -662 return _d_a_t_a__.beforeBegin(); │ │ │ │ │ -663 } │ │ │ │ │ -664 │ │ │ │ │ -_6_6_6 _M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& t) │ │ │ │ │ -667 { │ │ │ │ │ -668 _d_a_t_a__ = t; │ │ │ │ │ -669 return *this; │ │ │ │ │ -670 } │ │ │ │ │ -671 │ │ │ │ │ -_6_7_3 _r_o_w___t_y_p_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e row) { │ │ │ │ │ -674#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -675 if (row<0) │ │ │ │ │ -676 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Can't access negative rows!"); │ │ │ │ │ -677 if (row>=_N()) │ │ │ │ │ -678 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Row index out of range!"); │ │ │ │ │ -679#endif │ │ │ │ │ -680 return _d_a_t_a__[row]; │ │ │ │ │ -681 } │ │ │ │ │ -682 │ │ │ │ │ -_6_8_4 const _r_o_w___t_y_p_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e row) const { │ │ │ │ │ -685#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -686 if (row<0) │ │ │ │ │ -687 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Can't access negative rows!"); │ │ │ │ │ -688 if (row>=_N()) │ │ │ │ │ -689 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Row index out of range!"); │ │ │ │ │ -690#endif │ │ │ │ │ -691 return _d_a_t_a__[row]; │ │ │ │ │ -692 } │ │ │ │ │ -693 │ │ │ │ │ -_6_9_5 _s_i_z_e___t_y_p_e _N() const { │ │ │ │ │ -696 return _d_a_t_a__.N(); │ │ │ │ │ -697 } │ │ │ │ │ -698 │ │ │ │ │ -_7_0_0 _s_i_z_e___t_y_p_e _M() const { │ │ │ │ │ -701 return _c_o_l_s__; │ │ │ │ │ -702 } │ │ │ │ │ -703 │ │ │ │ │ -_7_0_5 _M_a_t_r_i_x_<_T_>& _o_p_e_r_a_t_o_r_*_=(const _f_i_e_l_d___t_y_p_e& scalar) { │ │ │ │ │ -706 _d_a_t_a__ *= scalar; │ │ │ │ │ -707 return (*this); │ │ │ │ │ -708 } │ │ │ │ │ -709 │ │ │ │ │ -_7_1_1 _M_a_t_r_i_x_<_T_>& _o_p_e_r_a_t_o_r_/_=(const _f_i_e_l_d___t_y_p_e& scalar) { │ │ │ │ │ -712 _d_a_t_a__ /= scalar; │ │ │ │ │ -713 return (*this); │ │ │ │ │ -714 } │ │ │ │ │ -715 │ │ │ │ │ -_7_2_1 _M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _M_a_t_r_i_x& b) { │ │ │ │ │ -722#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -723 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ -724 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ -725#endif │ │ │ │ │ -726 _d_a_t_a__ += b._d_a_t_a__; │ │ │ │ │ -727 return (*this); │ │ │ │ │ -728 } │ │ │ │ │ -729 │ │ │ │ │ -_7_3_5 _M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _M_a_t_r_i_x& b) { │ │ │ │ │ -736#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -737 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ -738 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ -739#endif │ │ │ │ │ -740 _d_a_t_a__ -= b._d_a_t_a__; │ │ │ │ │ -741 return (*this); │ │ │ │ │ -742 } │ │ │ │ │ -743 │ │ │ │ │ -_7_4_5 _M_a_t_r_i_x _t_r_a_n_s_p_o_s_e() const { │ │ │ │ │ -746 _M_a_t_r_i_x out(_M(), _N()); │ │ │ │ │ -747 for (_s_i_z_e___t_y_p_e i=0; i<_N(); i++) │ │ │ │ │ -748 for (_s_i_z_e___t_y_p_e j=0; j<_M(); j++) │ │ │ │ │ -749 out[j][i] = (*this)[i][j]; │ │ │ │ │ -750 │ │ │ │ │ -751 return out; │ │ │ │ │ -752 } │ │ │ │ │ -753 │ │ │ │ │ -_7_5_5 friend _M_a_t_r_i_x_<_T_> _o_p_e_r_a_t_o_r_*(const _M_a_t_r_i_x_<_T_>& m1, const _M_a_t_r_i_x_<_T_>& m2) { │ │ │ │ │ -756 _M_a_t_r_i_x_<_T_> out(m1._N(), m2._M()); │ │ │ │ │ -757 out = 0; │ │ │ │ │ -758 │ │ │ │ │ -759 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_7_7_0 friend Y _o_p_e_r_a_t_o_r_*(const _M_a_t_r_i_x_<_T_>& m, const X& vec) { │ │ │ │ │ -771#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -772 if (m._M()!=vec.size()) │ │ │ │ │ -773 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Vector size doesn't match the number of matrix │ │ │ │ │ -columns!"); │ │ │ │ │ -774#endif │ │ │ │ │ -775 Y out(m._N()); │ │ │ │ │ -776 out = 0; │ │ │ │ │ -777 │ │ │ │ │ -778 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_7_8_8 void _m_v(const X& x, Y& y) const │ │ │ │ │ -789 { │ │ │ │ │ -790#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -791 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -792 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -793#endif │ │ │ │ │ -794 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) { │ │ │ │ │ -795 y[i]=0; │ │ │ │ │ -796 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -797 { │ │ │ │ │ -798 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ -799 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ -800 Impl::asMatrix((*this)[i][j]).umv(xj, yi); │ │ │ │ │ -801 } │ │ │ │ │ -802 } │ │ │ │ │ -803 } │ │ │ │ │ -804 │ │ │ │ │ -806 template │ │ │ │ │ -_8_0_7 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ -808 { │ │ │ │ │ -809#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -810 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ -811 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ -812#endif │ │ │ │ │ -813 for(_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_8_2_0 void _u_m_v(const X& x, Y& y) const │ │ │ │ │ -821 { │ │ │ │ │ -822#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -823 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -824 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -825#endif │ │ │ │ │ -826 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -827 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -828 { │ │ │ │ │ -829 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ -830 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ -831 Impl::asMatrix((*this)[i][j]).umv(xj, yi); │ │ │ │ │ -832 } │ │ │ │ │ -833 } │ │ │ │ │ -834 │ │ │ │ │ -836 template │ │ │ │ │ -_8_3_7 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ -838 { │ │ │ │ │ -839#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -840 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -841 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -842#endif │ │ │ │ │ -843 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -844 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -845 { │ │ │ │ │ -846 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ -847 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ -848 Impl::asMatrix((*this)[i][j]).mmv(xj, yi); │ │ │ │ │ -849 } │ │ │ │ │ -850 } │ │ │ │ │ -851 │ │ │ │ │ -853 template │ │ │ │ │ -_8_5_4 void _u_s_m_v(const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ -855 { │ │ │ │ │ -856#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -857 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -858 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -859#endif │ │ │ │ │ -860 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -861 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -862 { │ │ │ │ │ -863 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ -864 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ -865 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi); │ │ │ │ │ -866 } │ │ │ │ │ -867 } │ │ │ │ │ -868 │ │ │ │ │ -870 template │ │ │ │ │ -_8_7_1 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ -872 { │ │ │ │ │ -873#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -874 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -875 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -876#endif │ │ │ │ │ -877 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -878 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -879 { │ │ │ │ │ -880 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ -881 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ -882 Impl::asMatrix((*this)[i][j]).umtv(xi, yj); │ │ │ │ │ -883 } │ │ │ │ │ -884 } │ │ │ │ │ -885 │ │ │ │ │ -887 template │ │ │ │ │ -_8_8_8 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ -889 { │ │ │ │ │ -890#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -891 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -892 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -893#endif │ │ │ │ │ -894 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -895 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -896 { │ │ │ │ │ -897 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ -898 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ -899 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj); │ │ │ │ │ -900 } │ │ │ │ │ -901 } │ │ │ │ │ -902 │ │ │ │ │ -904 template │ │ │ │ │ -_9_0_5 void _u_s_m_t_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ -906 { │ │ │ │ │ -907#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -908 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -909 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -910#endif │ │ │ │ │ -911 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -912 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -913 { │ │ │ │ │ -914 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ -915 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ -916 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj); │ │ │ │ │ -917 } │ │ │ │ │ -918 } │ │ │ │ │ -919 │ │ │ │ │ -921 template │ │ │ │ │ -_9_2_2 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ -923 { │ │ │ │ │ -924#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -925 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -926 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -927#endif │ │ │ │ │ -928 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -929 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -930 { │ │ │ │ │ -931 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ -932 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ -933 Impl::asMatrix((*this)[i][j]).umhv(xi,yj); │ │ │ │ │ -934 } │ │ │ │ │ -935 } │ │ │ │ │ -936 │ │ │ │ │ -938 template │ │ │ │ │ -_9_3_9 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ -940 { │ │ │ │ │ -941#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -942 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -943 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -944#endif │ │ │ │ │ -945 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -946 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -947 { │ │ │ │ │ -948 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ -949 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ -950 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj); │ │ │ │ │ -951 } │ │ │ │ │ -952 } │ │ │ │ │ -953 │ │ │ │ │ -955 template │ │ │ │ │ -_9_5_6 void _u_s_m_h_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ -957 { │ │ │ │ │ -958#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -959 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -960 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ -961#endif │ │ │ │ │ -962 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ -963 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ -964 { │ │ │ │ │ -965 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ -966 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ -967 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj); │ │ │ │ │ -968 } │ │ │ │ │ -969 } │ │ │ │ │ -970 │ │ │ │ │ -971 //===== norms │ │ │ │ │ -972 │ │ │ │ │ -_9_7_4 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ -975 { │ │ │ │ │ -976 return std::sqrt(_f_r_o_b_e_n_i_u_s___n_o_r_m_2()); │ │ │ │ │ -977 } │ │ │ │ │ -978 │ │ │ │ │ -_9_8_0 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ -981 { │ │ │ │ │ -982 typename FieldTraits::real_type sum=0; │ │ │ │ │ -983 for (_s_i_z_e___t_y_p_e i=0; i_N(); i++) │ │ │ │ │ -984 for (_s_i_z_e___t_y_p_e j=0; j_M(); j++) │ │ │ │ │ -985 sum += Impl::asMatrix(_d_a_t_a__[i][j]).frobenius_norm2(); │ │ │ │ │ -986 return sum; │ │ │ │ │ -987 } │ │ │ │ │ -988 │ │ │ │ │ -990 template ::value, int>::type = 0> │ │ │ │ │ -_9_9_2 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ -993 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -994 using std::max; │ │ │ │ │ -995 │ │ │ │ │ -996 real_type norm = 0; │ │ │ │ │ -997 for (auto const &x : *this) { │ │ │ │ │ -998 real_type sum = 0; │ │ │ │ │ -999 for (auto const &y : x) │ │ │ │ │ -1000 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ -1001 norm = max(sum, norm); │ │ │ │ │ -1002 isNaN += sum; │ │ │ │ │ -1003 } │ │ │ │ │ -1004 │ │ │ │ │ -1005 return norm; │ │ │ │ │ -1006 } │ │ │ │ │ -1007 │ │ │ │ │ -1009 template ::value, int>::type = 0> │ │ │ │ │ -_1_0_1_1 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ -1012 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1013 using std::max; │ │ │ │ │ -1014 │ │ │ │ │ -1015 real_type norm = 0; │ │ │ │ │ -1016 for (auto const &x : *this) { │ │ │ │ │ -1017 real_type sum = 0; │ │ │ │ │ -1018 for (auto const &y : x) │ │ │ │ │ -1019 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ -1020 norm = max(sum, norm); │ │ │ │ │ -1021 } │ │ │ │ │ -1022 return norm; │ │ │ │ │ -1023 } │ │ │ │ │ -1024 │ │ │ │ │ -1026 template ::value, int>::type = 0> │ │ │ │ │ -_1_0_2_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ -1029 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1030 using std::max; │ │ │ │ │ -1031 │ │ │ │ │ -1032 real_type norm = 0; │ │ │ │ │ -1033 real_type isNaN = 1; │ │ │ │ │ -1034 for (auto const &x : *this) { │ │ │ │ │ -1035 real_type sum = 0; │ │ │ │ │ -1036 for (auto const &y : x) │ │ │ │ │ -1037 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ -1038 norm = max(sum, norm); │ │ │ │ │ -1039 isNaN += sum; │ │ │ │ │ -1040 } │ │ │ │ │ -1041 │ │ │ │ │ -1042 return norm * (isNaN / isNaN); │ │ │ │ │ -1043 } │ │ │ │ │ -1044 │ │ │ │ │ -1046 template ::value, int>::type = 0> │ │ │ │ │ -_1_0_4_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ -1049 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1050 using std::max; │ │ │ │ │ -1051 │ │ │ │ │ -1052 real_type norm = 0; │ │ │ │ │ -1053 real_type isNaN = 1; │ │ │ │ │ -1054 for (auto const &x : *this) { │ │ │ │ │ -1055 real_type sum = 0; │ │ │ │ │ -1056 for (auto const &y : x) │ │ │ │ │ -1057 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ -1058 norm = max(sum, norm); │ │ │ │ │ -1059 isNaN += sum; │ │ │ │ │ -1060 } │ │ │ │ │ -1061 │ │ │ │ │ -1062 return norm * (isNaN / isNaN); │ │ │ │ │ -1063 } │ │ │ │ │ -1064 │ │ │ │ │ -1065 //===== query │ │ │ │ │ -1066 │ │ │ │ │ -_1_0_6_8 bool _e_x_i_s_t_s ([[maybe_unused]] _s_i_z_e___t_y_p_e i, [[maybe_unused]] _s_i_z_e___t_y_p_e j) │ │ │ │ │ -const │ │ │ │ │ -1069 { │ │ │ │ │ -1070#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1071 if (i<0 || i>=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"row index out of range"); │ │ │ │ │ -1072 if (j<0 || i>=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"column index out of range"); │ │ │ │ │ -1073#endif │ │ │ │ │ -1074 return true; │ │ │ │ │ -1075 } │ │ │ │ │ -1076 │ │ │ │ │ -1077 protected: │ │ │ │ │ -1078 │ │ │ │ │ -_1_0_8_1 _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_> _d_a_t_a__; │ │ │ │ │ -1082 │ │ │ │ │ -_1_0_8_8 _s_i_z_e___t_y_p_e _c_o_l_s__; │ │ │ │ │ -1089 }; │ │ │ │ │ -1090 │ │ │ │ │ -1091 template │ │ │ │ │ -_1_0_9_2 struct FieldTraits< _M_a_t_r_i_x > │ │ │ │ │ -1093 { │ │ │ │ │ -_1_0_9_4 using _f_i_e_l_d___t_y_p_e = typename _M_a_t_r_i_x_<_T_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_0_9_5 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ -1096 }; │ │ │ │ │ -1097 │ │ │ │ │ -1099} // end namespace Dune │ │ │ │ │ -1100 │ │ │ │ │ -1101#endif │ │ │ │ │ +141 /* Modify the coefficients. */ │ │ │ │ │ +142 _b_l_o_c_k___t_y_p_e a_00_inv = (*this)[0][0]; │ │ │ │ │ +143 Impl::asMatrix(a_00_inv).invert(); │ │ │ │ │ +144 │ │ │ │ │ +145 //c[0] /= (*this)[0][0]; /* Division by zero risk. */ │ │ │ │ │ +146 _b_l_o_c_k___t_y_p_e tmp = a_00_inv; │ │ │ │ │ +147 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0])); │ │ │ │ │ +148 c[0] = tmp; │ │ │ │ │ +149 │ │ │ │ │ +150 // d = a^{-1} d /* Division by zero would imply a singular matrix. */ │ │ │ │ │ +151 auto d_0_tmp = d[0]; │ │ │ │ │ +152 auto&& d_0 = Impl::asVector(d[0]); │ │ │ │ │ +153 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0); │ │ │ │ │ +154 │ │ │ │ │ +155 for (unsigned int i = 1; i < this->_N(); i++) { │ │ │ │ │ +156 │ │ │ │ │ +157 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1} │ │ │ │ │ +158 _b_l_o_c_k___t_y_p_e tmp; │ │ │ │ │ +159 tmp = (*this)[i][i-1]; │ │ │ │ │ +160 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1])); │ │ │ │ │ +161 │ │ │ │ │ +162 _b_l_o_c_k___t_y_p_e id = (*this)[i][i]; │ │ │ │ │ +163 id -= tmp; │ │ │ │ │ +164 Impl::asMatrix(id).invert(); /* Division by zero risk. */ │ │ │ │ │ +165 │ │ │ │ │ +166 if (i_N() - 1] = d[this->_N() - 1]; │ │ │ │ │ +179 for (int i = this->_N() - 2; i >= 0; i--) { │ │ │ │ │ +180 //x[i] = d[i] - c[i] * x[i + 1]; │ │ │ │ │ +181 x[i] = d[i]; │ │ │ │ │ +182 auto&& x_i = Impl::asVector(x[i]); │ │ │ │ │ +183 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i); │ │ │ │ │ +184 } │ │ │ │ │ +185 │ │ │ │ │ +186 } │ │ │ │ │ +187 │ │ │ │ │ +188 private: │ │ │ │ │ +189 │ │ │ │ │ +190 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ +//// │ │ │ │ │ +191 // The following methods from the base class should now actually be called │ │ │ │ │ +192 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ +//// │ │ │ │ │ +193 │ │ │ │ │ +194 // createbegin and createend should be in there, too, but I can't get it to │ │ │ │ │ +compile │ │ │ │ │ +195 // BCRSMatrix::CreateIterator createbegin () {} │ │ │ │ │ +196 // BCRSMatrix::CreateIterator createend () {} │ │ │ │ │ +197 void setrowsize (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s) {} │ │ │ │ │ +198 void incrementrowsize (_s_i_z_e___t_y_p_e i) {} │ │ │ │ │ +199 void endrowsizes () {} │ │ │ │ │ +200 void addindex (_s_i_z_e___t_y_p_e row, _s_i_z_e___t_y_p_e _c_o_l) {} │ │ │ │ │ +201 void endindices () {} │ │ │ │ │ +202 }; │ │ │ │ │ +203 │ │ │ │ │ +204 template │ │ │ │ │ +_2_0_5 struct FieldTraits< _B_T_D_M_a_t_r_i_x > │ │ │ │ │ +206 { │ │ │ │ │ +_2_0_7 using _f_i_e_l_d___t_y_p_e = typename _B_T_D_M_a_t_r_i_x_<_B_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_0_8 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ +209 }; │ │ │ │ │ +210 │ │ │ │ │ +213} // end namespace Dune │ │ │ │ │ +214 │ │ │ │ │ +215#endif │ │ │ │ │ _b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ Helper functions for determining the vector/matrix block level. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ -A Vector of blocks with different blocksizes. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_w_i_n_d_o_w___t_y_p_e │ │ │ │ │ -Imp::BlockVectorWindow< B, A > window_type │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -BlockVector< B, A > block_type │ │ │ │ │ -Same as value_type, here for historical reasons. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -DenseMatrixBase & operator=(const DenseMatrixBase &a) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -Iterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:385 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type rows, size_type columns) │ │ │ │ │ -same effect as constructor with same argument │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const window_type const_reference │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ -DenseMatrixBase(size_type rows, size_type columns) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -end Iterator │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -random access to blocks │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -BlockVector< B, A > value_type │ │ │ │ │ -Type of the elements of the outer vector, i.e., dynamic vectors of B. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_f_i_n_d │ │ │ │ │ -Iterator find(size_type i) │ │ │ │ │ -random access returning iterator (end if not contained) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:391 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_N │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_r_o_w_s_i_z_e_s │ │ │ │ │ +void endrowsizes() │ │ │ │ │ +indicate that size of all rows is defined │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1149 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_a_n_d_o_m │ │ │ │ │ +@ random │ │ │ │ │ +Build entries randomly. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:530 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_d_d_i_n_d_e_x │ │ │ │ │ +void addindex(size_type row, size_type col) │ │ │ │ │ +add index (row,col) to the matrix │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1191 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_i_n_d_i_c_e_s │ │ │ │ │ +void endindices() │ │ │ │ │ +indicate that all indices are defined, check consistency │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1248 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ size_type N() const │ │ │ │ │ -number of blocks in the vector (are of variable size here) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:525 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_e_n_d │ │ │ │ │ -ConstIterator end() const │ │ │ │ │ -end ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:518 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -window_type reference │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_r_e_n_d │ │ │ │ │ -ConstIterator rend() const │ │ │ │ │ -end ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:531 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -Iterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:378 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_g_i_n │ │ │ │ │ -ConstIterator begin() const │ │ │ │ │ -begin ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:512 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -A allocator_type │ │ │ │ │ -export the allocator type │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ -DenseMatrixBase() │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_f_i_n_d │ │ │ │ │ -ConstIterator find(size_type i) const │ │ │ │ │ -random access returning iterator (end if not contained) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:397 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +number of rows (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ +Set the size of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +BCRSMatrix & operator=(const BCRSMatrix &Mat) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:911 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x │ │ │ │ │ +A block-tridiagonal matrix. │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr auto blocklevel │ │ │ │ │ +increment block level counter │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_B_T_D_M_a_t_r_i_x │ │ │ │ │ +BTDMatrix(size_type size) │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ +void solve(V &x, const V &rhs) const │ │ │ │ │ +Use the Thomas algorithm to solve the system Ax=b in O(n) time. │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ A::size_type size_type │ │ │ │ │ -The size type for the index access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_~_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ -~DenseMatrixBase() │ │ │ │ │ -free dynamic memory │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin Iterator │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ -DenseMatrixBase(const DenseMatrixBase &a) │ │ │ │ │ -copy constructor, has copy semantics │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -Iterator & operator--() │ │ │ │ │ -prefix decrement │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:308 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -size_type index() const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:352 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator(Iterator &other)=default │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator(Iterator &&other)=default │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const Iterator &it) const │ │ │ │ │ -inequality │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -Iterator & operator=(Iterator &&other) │ │ │ │ │ -Move assignment. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -Iterator & operator++() │ │ │ │ │ -prefix increment │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator() │ │ │ │ │ -constructor, no arguments │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -window_type & operator*() const │ │ │ │ │ -dereferencing │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const Iterator &it) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:316 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -Iterator & operator=(Iterator &other) │ │ │ │ │ -Copy assignment. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:291 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator(B *data, size_type columns, size_type _i) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -window_type * operator->() const │ │ │ │ │ -arrow │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:346 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -const window_type * operator->() const │ │ │ │ │ -arrow │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:487 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -const window_type & operator*() const │ │ │ │ │ -dereferencing │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -ConstIterator & operator++() │ │ │ │ │ -prefix increment │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:441 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator(const B *data, size_type columns, size_type _i) │ │ │ │ │ -constructor from pointer │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:414 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ -ConstIterator & operator--() │ │ │ │ │ -prefix decrement │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator(const Iterator &it) │ │ │ │ │ -constructor from non_const iterator │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:420 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const ConstIterator &it) const │ │ │ │ │ -inequality │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:463 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator() │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:407 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const ConstIterator &it) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:457 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -size_type index() const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -ConstIterator & operator=(Iterator &&other) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:424 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -ConstIterator & operator=(Iterator &other) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:432 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_c_o_l_s__ │ │ │ │ │ -size_type cols_ │ │ │ │ │ -Number of columns of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:1088 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ -FieldTraits< ft >::real_type infinity_norm() const │ │ │ │ │ -infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:992 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +implement row_type with compressed vector │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ A allocator_type │ │ │ │ │ -Export the allocator. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:571 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ -FieldTraits< ft >::real_type infinity_norm_real() const │ │ │ │ │ -simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:1011 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ -void usmhv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^H x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:956 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ -void usmv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:854 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -Type for indices and sizes. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_d_a_t_a__ │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A > data_ │ │ │ │ │ -Abuse DenseMatrixBase as an engine for a 2d array ISTL-style. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:1081 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_t_r_a_n_s_p_o_s_e │ │ │ │ │ -Matrix transpose() const │ │ │ │ │ -Return the transpose of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:745 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ -void mtv(const X &x, Y &y) const │ │ │ │ │ -y = A^T x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:807 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ -void umv(const X &x, Y &y) const │ │ │ │ │ -y += A x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:820 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ -void mv(const X &x, Y &y) const │ │ │ │ │ -y = A x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:788 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator │ │ │ │ │ -Const iterator over the matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:586 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type rows, size_type cols) │ │ │ │ │ -Change the matrix size. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:608 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -RowIterator beforeBegin() │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:634 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -RowIterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M_a_t_r_i_x │ │ │ │ │ -Matrix() │ │ │ │ │ -Create empty matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:596 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -Matrix & operator-=(const Matrix &b) │ │ │ │ │ -Subtract the entries of another matrix from this one. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:735 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm2() const │ │ │ │ │ -square of frobenius norm, need for block recursion │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:980 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::iterator ColIterator │ │ │ │ │ -Iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:583 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstRowIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:653 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -Matrix & operator=(const field_type &t) │ │ │ │ │ -Assignment from scalar. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:666 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -RowIterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const row_type operator[](size_type row) const │ │ │ │ │ -The const index operator. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:684 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -ConstRowIterator end() const │ │ │ │ │ -Get const iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:646 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -friend Y operator*(const Matrix< T > &m, const X &vec) │ │ │ │ │ -Generic matrix-vector multiplication. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:770 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ -Matrix< T > & operator*=(const field_type &scalar) │ │ │ │ │ -Multiplication with a scalar. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:705 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -row_type operator[](size_type row) │ │ │ │ │ -The index operator. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:673 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ -void mmv(const X &x, Y &y) const │ │ │ │ │ -y -= A x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:837 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -Matrix & operator+=(const Matrix &b) │ │ │ │ │ -Add the entries of another matrix to this one. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:721 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -ConstRowIterator begin() const │ │ │ │ │ -Get const iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:640 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ -void mmhv(const X &x, Y &y) const │ │ │ │ │ -y -= A^H x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:939 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -RowIterator begin() │ │ │ │ │ -Get iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ -Export the type representing the underlying field. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::const_iterator ConstColIterator │ │ │ │ │ -Const iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr auto blocklevel │ │ │ │ │ -The number of nesting levels the matrix contains. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:593 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -Return the number of columns. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -T block_type │ │ │ │ │ -Export the type representing the components. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ │ -bool exists(size_type i, size_type j) const │ │ │ │ │ -return true if (i,j) is in pattern │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:1068 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ -Matrix< T > & operator/=(const field_type &scalar) │ │ │ │ │ -Division by a scalar. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:711 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2) │ │ │ │ │ -Generic matrix multiplication. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ -void umtv(const X &x, Y &y) const │ │ │ │ │ -y += A^T x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:871 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ -void mmtv(const X &x, Y &y) const │ │ │ │ │ -y -= A^T x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:888 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ -The type implementing a matrix row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ -frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:974 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ -void usmtv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^T x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:905 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ -void umhv(const X &x, Y &y) const │ │ │ │ │ -y += A^H x │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:922 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -Return the number of rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -ConstRowIterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:660 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M_a_t_r_i_x │ │ │ │ │ -Matrix(size_type rows, size_type cols) │ │ │ │ │ -Create uninitialized matrix of size rows x cols. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:601 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator │ │ │ │ │ -Iterator over the matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:580 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Matrix< T, A >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:1094 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +export the allocator type │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +B block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +BTDMatrix & operator=(const BTDMatrix &other) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_B_T_D_M_a_t_r_i_x │ │ │ │ │ +BTDMatrix() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type size) │ │ │ │ │ +Resize the matrix. Invalidates the content! │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:1095 │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename BTDMatrix< B, A >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn btdmatrix.hh:207 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00050.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: ilusubdomainsolver.hh File Reference │ │ │ │ +dune-istl: bccsmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,50 +70,31 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces
│ │ │ │ -
ilusubdomainsolver.hh File Reference
│ │ │ │ +
bccsmatrix.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. │ │ │ │ -More...

│ │ │ │ -
#include <map>
│ │ │ │ +
#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ #include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/istl/preconditioners.hh>
│ │ │ │ -#include "matrix.hh"
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <cstdlib>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::ILUSubdomainSolver< M, X, Y >
 base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver. More...
 
class  Dune::ILU0SubdomainSolver< M, X, Y >
 Exact subdomain solver using ILU(p) with appropriate p. More...
 
class  Dune::ILUNSubdomainSolver< M, X, Y >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ISTL
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,35 +1,19 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -ilusubdomainsolver.hh File Reference │ │ │ │ │ -Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +bccsmatrix.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -#include "_m_a_t_r_i_x_._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_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  base class encapsulating common algorithms of _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r and │ │ │ │ │ - _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  Exact subdomain solver using _I_L_U_(_p_) with appropriate p. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +namespace   _D_u_n_e_:_:_I_S_T_L │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: ilusubdomainsolver.hh Source File │ │ │ │ +dune-istl: bccsmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,235 +74,131 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
ilusubdomainsolver.hh
│ │ │ │ +
bccsmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
│ │ │ │ -
6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_BCCSMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_BCCSMATRIX_HH
│ │ │ │
7
│ │ │ │ -
8#include <map>
│ │ │ │ -
9#include <dune/common/typetraits.hh>
│ │ │ │ - │ │ │ │ -
11#include "matrix.hh"
│ │ │ │ -
12#include <cmath>
│ │ │ │ -
13#include <cstdlib>
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16
│ │ │ │ -
35 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
37 public:
│ │ │ │ -
39 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ -
41 typedef X domain_type;
│ │ │ │ -
43 typedef Y range_type;
│ │ │ │ -
44
│ │ │ │ -
51 virtual void apply (X& v, const Y& d) =0;
│ │ │ │ -
52
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
54 {}
│ │ │ │ -
│ │ │ │ -
55
│ │ │ │ -
56 protected:
│ │ │ │ -
62 template<class S>
│ │ │ │ -
63 std::size_t copyToLocalMatrix(const M& A, S& rowset);
│ │ │ │ -
64
│ │ │ │ -
66 // for ILUN
│ │ │ │ - │ │ │ │ -
68 };
│ │ │ │ -
│ │ │ │ -
69
│ │ │ │ -
76 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
78 : public ILUSubdomainSolver<M,X,Y>{
│ │ │ │ -
79 public:
│ │ │ │ -
81 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ -
82 typedef typename std::remove_const<M>::type rilu_type;
│ │ │ │ -
84 typedef X domain_type;
│ │ │ │ -
86 typedef Y range_type;
│ │ │ │ -
87
│ │ │ │ +
8#include <dune/common/fmatrix.hh>
│ │ │ │ +
9#include <dune/common/fvector.hh>
│ │ │ │ +
10#include <dune/common/typetraits.hh>
│ │ │ │ +
11
│ │ │ │ +
│ │ │ │ +
12namespace Dune::ISTL::Impl
│ │ │ │ +
13{
│ │ │ │ +
27 template<class B, class I = typename std::allocator<B>::size_type>
│ │ │ │ +
28 class BCCSMatrix
│ │ │ │ +
29 {
│ │ │ │ +
30 public:
│ │ │ │ +
31 using Index = I;
│ │ │ │ +
32 using size_type = std::size_t;
│ │ │ │ +
33
│ │ │ │ +
36 BCCSMatrix()
│ │ │ │ +
37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0)
│ │ │ │ +
38 {}
│ │ │ │ +
39
│ │ │ │ +
41 ~BCCSMatrix()
│ │ │ │ +
42 {
│ │ │ │ +
43 if(N_+M_+Nnz_!=0)
│ │ │ │ +
44 free();
│ │ │ │ +
45 }
│ │ │ │ +
46
│ │ │ │ +
48 void setSize(size_type rows, size_type columns)
│ │ │ │ +
49 {
│ │ │ │ +
50 N_ = rows;
│ │ │ │ +
51 M_ = columns;
│ │ │ │ +
52 }
│ │ │ │ +
53
│ │ │ │ +
58 size_type N() const
│ │ │ │ +
59 {
│ │ │ │ +
60 return N_;
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ +
64 size_type nonzeroes() const
│ │ │ │ +
65 {
│ │ │ │ +
66 return Nnz_;
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
73 size_type M() const
│ │ │ │ +
74 {
│ │ │ │ +
75 return M_;
│ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ +
84 B* getValues() const
│ │ │ │ +
85 {
│ │ │ │ +
86 return values;
│ │ │ │ +
87 }
│ │ │ │
88
│ │ │ │ -
│ │ │ │ -
93 void apply (X& v, const Y& d)
│ │ │ │ -
94 {
│ │ │ │ -
95 ILU::blockILUBacksolve(this->ILU,v,d);
│ │ │ │ -
96 }
│ │ │ │ -
│ │ │ │ -
104 template<class S>
│ │ │ │ -
105 void setSubMatrix(const M& A, S& rowset);
│ │ │ │ -
106
│ │ │ │ -
107 };
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
109 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
111 : public ILUSubdomainSolver<M,X,Y>{
│ │ │ │ -
112 public:
│ │ │ │ -
114 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ -
115 typedef typename std::remove_const<M>::type rilu_type;
│ │ │ │ -
117 typedef X domain_type;
│ │ │ │ -
119 typedef Y range_type;
│ │ │ │ -
120
│ │ │ │ -
│ │ │ │ -
125 void apply (X& v, const Y& d)
│ │ │ │ -
126 {
│ │ │ │ -
127 ILU::blockILUBacksolve(RILU,v,d);
│ │ │ │ -
128 }
│ │ │ │ -
│ │ │ │ -
129
│ │ │ │ -
137 template<class S>
│ │ │ │ -
138 void setSubMatrix(const M& A, S& rowset);
│ │ │ │ -
139
│ │ │ │ -
140 private:
│ │ │ │ -
144 rilu_type RILU;
│ │ │ │ -
145 };
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
147
│ │ │ │ +
95 Index* getRowIndex() const
│ │ │ │ +
96 {
│ │ │ │ +
97 return rowindex;
│ │ │ │ +
98 }
│ │ │ │ +
99
│ │ │ │ +
106 Index* getColStart() const
│ │ │ │ +
107 {
│ │ │ │ +
108 return colstart;
│ │ │ │ +
109 }
│ │ │ │ +
110
│ │ │ │ +
112 BCCSMatrix& operator=(const BCCSMatrix& mat)
│ │ │ │ +
113 {
│ │ │ │ +
114 if(N_+M_+Nnz_!=0)
│ │ │ │ +
115 free();
│ │ │ │ +
116 N_=mat.N_;
│ │ │ │ +
117 M_=mat.M_;
│ │ │ │ +
118 Nnz_= mat.Nnz_;
│ │ │ │ +
119 if(M_>0) {
│ │ │ │ +
120 colstart=new size_type[M_+1];
│ │ │ │ +
121 for(size_type i=0; i<=M_; ++i)
│ │ │ │ +
122 colstart[i]=mat.colstart[i];
│ │ │ │ +
123 }
│ │ │ │ +
124
│ │ │ │ +
125 if(Nnz_>0) {
│ │ │ │ +
126 values = new B[Nnz_];
│ │ │ │ +
127 rowindex = new size_type[Nnz_];
│ │ │ │ +
128
│ │ │ │ +
129 for(size_type i=0; i<Nnz_; ++i)
│ │ │ │ +
130 values[i]=mat.values[i];
│ │ │ │ +
131
│ │ │ │ +
132 for(size_type i=0; i<Nnz_; ++i)
│ │ │ │ +
133 rowindex[i]=mat.rowindex[i];
│ │ │ │ +
134 }
│ │ │ │ +
135 return *this;
│ │ │ │ +
136 }
│ │ │ │ +
137
│ │ │ │ +
139 virtual void free()
│ │ │ │ +
140 {
│ │ │ │ +
141 delete[] values;
│ │ │ │ +
142 delete[] rowindex;
│ │ │ │ +
143 delete[] colstart;
│ │ │ │ +
144 N_ = 0;
│ │ │ │ +
145 M_ = 0;
│ │ │ │ +
146 Nnz_ = 0;
│ │ │ │ +
147 }
│ │ │ │
148
│ │ │ │ -
149 template<class M, class X, class Y>
│ │ │ │ -
150 template<class S>
│ │ │ │ -
│ │ │ │ -
151 std::size_t ILUSubdomainSolver<M,X,Y>::copyToLocalMatrix(const M& A, S& rowSet)
│ │ │ │ -
152 {
│ │ │ │ -
153 // Calculate consecutive indices for local problem
│ │ │ │ -
154 // while perserving the ordering
│ │ │ │ -
155 typedef typename M::size_type size_type;
│ │ │ │ -
156 typedef std::map<typename S::value_type,size_type> IndexMap;
│ │ │ │ -
157 typedef typename IndexMap::iterator IMIter;
│ │ │ │ -
158 IndexMap indexMap;
│ │ │ │ -
159 IMIter guess = indexMap.begin();
│ │ │ │ -
160 size_type localIndex=0;
│ │ │ │ -
161
│ │ │ │ -
162 typedef typename S::const_iterator SIter;
│ │ │ │ -
163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
│ │ │ │ -
164 rowIdx!= rowEnd; ++rowIdx, ++localIndex)
│ │ │ │ -
165 guess = indexMap.insert(guess,
│ │ │ │ -
166 std::make_pair(*rowIdx,localIndex));
│ │ │ │ -
167
│ │ │ │ -
168
│ │ │ │ -
169 // Build Matrix for local subproblem
│ │ │ │ -
170 ILU.setSize(rowSet.size(),rowSet.size());
│ │ │ │ -
171 ILU.setBuildMode(matrix_type::row_wise);
│ │ │ │ -
172
│ │ │ │ -
173 // Create sparsity pattern
│ │ │ │ -
174 typedef typename matrix_type::CreateIterator CIter;
│ │ │ │ -
175 CIter rowCreator = ILU.createbegin();
│ │ │ │ -
176 std::size_t offset=0;
│ │ │ │ -
177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
│ │ │ │ -
178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) {
│ │ │ │ -
179 // See which row entries are in our subset and add them to
│ │ │ │ -
180 // the sparsity pattern
│ │ │ │ -
181 guess = indexMap.begin();
│ │ │ │ -
182
│ │ │ │ -
183 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
│ │ │ │ -
184 endcol=A[*rowIdx].end(); col != endcol; ++col) {
│ │ │ │ -
185 // search for the entry in the row set
│ │ │ │ -
186 guess = indexMap.find(col.index());
│ │ │ │ -
187 if(guess!=indexMap.end()) {
│ │ │ │ -
188 // add local index to row
│ │ │ │ -
189 rowCreator.insert(guess->second);
│ │ │ │ -
190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second-rowCreator.index())));
│ │ │ │ -
191 }
│ │ │ │ -
192 }
│ │ │ │ -
193
│ │ │ │ -
194 }
│ │ │ │ -
195
│ │ │ │ -
196 // Insert the matrix values for the local problem
│ │ │ │ -
197 typename matrix_type::iterator iluRow=ILU.begin();
│ │ │ │ -
198
│ │ │ │ -
199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
│ │ │ │ -
200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) {
│ │ │ │ -
201 // See which row entries are in our subset and add them to
│ │ │ │ -
202 // the sparsity pattern
│ │ │ │ -
203 typename matrix_type::ColIterator localCol=iluRow->begin();
│ │ │ │ -
204 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
│ │ │ │ -
205 endcol=A[*rowIdx].end(); col != endcol; ++col) {
│ │ │ │ -
206 // search for the entry in the row set
│ │ │ │ -
207 guess = indexMap.find(col.index());
│ │ │ │ -
208 if(guess!=indexMap.end()) {
│ │ │ │ -
209 // set local value
│ │ │ │ -
210 (*localCol)=(*col);
│ │ │ │ -
211 ++localCol;
│ │ │ │ -
212 }
│ │ │ │ -
213 }
│ │ │ │ -
214 }
│ │ │ │ -
215 return offset;
│ │ │ │ -
216 }
│ │ │ │ -
│ │ │ │ -
217
│ │ │ │ -
218
│ │ │ │ -
219 template<class M, class X, class Y>
│ │ │ │ -
220 template<class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
222 {
│ │ │ │ -
223 this->copyToLocalMatrix(A,rowSet);
│ │ │ │ - │ │ │ │ -
225 }
│ │ │ │ -
│ │ │ │ -
226
│ │ │ │ -
227 template<class M, class X, class Y>
│ │ │ │ -
228 template<class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
230 {
│ │ │ │ -
231 std::size_t offset=copyToLocalMatrix(A,rowSet);
│ │ │ │ -
232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size());
│ │ │ │ -
233 RILU.setBuildMode(matrix_type::row_wise);
│ │ │ │ -
234 ILU::blockILUDecomposition(this->ILU, (offset+1)/2, RILU);
│ │ │ │ -
235 }
│ │ │ │ +
149 public:
│ │ │ │ +
150 size_type N_, M_, Nnz_;
│ │ │ │ +
151 B* values;
│ │ │ │ +
152 Index* rowindex;
│ │ │ │ +
153 Index* colstart;
│ │ │ │ +
154 };
│ │ │ │ +
155
│ │ │ │ +
156}
│ │ │ │
│ │ │ │ -
236
│ │ │ │ -
238} // end name space DUNE
│ │ │ │ -
239
│ │ │ │ -
240
│ │ │ │ -
241#endif
│ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
A dynamic dense block matrix class.
│ │ │ │ -
std::size_t copyToLocalMatrix(const M &A, S &rowset)
Copy the local part of the global matrix to ILU.
Definition ilusubdomainsolver.hh:151
│ │ │ │ -
void setSubMatrix(const M &A, S &rowset)
Set the data of the local problem.
Definition ilusubdomainsolver.hh:229
│ │ │ │ -
void setSubMatrix(const M &A, S &rowset)
Set the data of the local problem.
Definition ilusubdomainsolver.hh:221
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Definition allocator.hh:11
│ │ │ │ -
void blockILUBacksolve(const M &A, X &v, const Y &d)
LU backsolve with stored inverse.
Definition ilu.hh:94
│ │ │ │ -
void blockILU0Decomposition(M &A)
compute ILU decomposition of A. A is overwritten by its decomposition
Definition ilu.hh:33
│ │ │ │ -
void blockILUDecomposition(const M &A, int n, M &ILU)
Definition ilu.hh:167
│ │ │ │ -
base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver.
Definition ilusubdomainsolver.hh:36
│ │ │ │ -
matrix_type ILU
The ILU0 decomposition of the matrix, or the local matrix.
Definition ilusubdomainsolver.hh:67
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition ilusubdomainsolver.hh:41
│ │ │ │ -
virtual ~ILUSubdomainSolver()
Definition ilusubdomainsolver.hh:53
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition ilusubdomainsolver.hh:43
│ │ │ │ -
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition ilusubdomainsolver.hh:39
│ │ │ │ -
virtual void apply(X &v, const Y &d)=0
Apply the subdomain solver.
│ │ │ │ -
Exact subdomain solver using ILU(p) with appropriate p.
Definition ilusubdomainsolver.hh:78
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition ilusubdomainsolver.hh:84
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition ilusubdomainsolver.hh:86
│ │ │ │ -
std::remove_const< M >::type rilu_type
Definition ilusubdomainsolver.hh:82
│ │ │ │ -
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition ilusubdomainsolver.hh:81
│ │ │ │ -
void apply(X &v, const Y &d)
Apply the subdomain solver.
Definition ilusubdomainsolver.hh:93
│ │ │ │ -
Definition ilusubdomainsolver.hh:111
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition ilusubdomainsolver.hh:117
│ │ │ │ -
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition ilusubdomainsolver.hh:114
│ │ │ │ -
std::remove_const< M >::type rilu_type
Definition ilusubdomainsolver.hh:115
│ │ │ │ -
void apply(X &v, const Y &d)
Apply the subdomain solver.
Definition ilusubdomainsolver.hh:125
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition ilusubdomainsolver.hh:119
│ │ │ │ -
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ +
157#endif
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,288 +1,125 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -ilusubdomainsolver.hh │ │ │ │ │ +bccsmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH │ │ │ │ │ -6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_BCCSMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_BCCSMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -11#include "_m_a_t_r_i_x_._h_h" │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e { │ │ │ │ │ -16 │ │ │ │ │ -35 template │ │ │ │ │ -_3_6 class _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r { │ │ │ │ │ -37 public: │ │ │ │ │ -_3_9 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_4_1 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_4_3 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -44 │ │ │ │ │ -_5_1 virtual void _a_p_p_l_y (X& v, const Y& d) =0; │ │ │ │ │ -52 │ │ │ │ │ -_5_3 virtual _~_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r() │ │ │ │ │ -54 {} │ │ │ │ │ -55 │ │ │ │ │ -56 protected: │ │ │ │ │ -62 template │ │ │ │ │ -63 std::size_t _c_o_p_y_T_o_L_o_c_a_l_M_a_t_r_i_x(const M& A, S& rowset); │ │ │ │ │ -64 │ │ │ │ │ -66 // for ILUN │ │ │ │ │ -_6_7 _m_a_t_r_i_x___t_y_p_e _I_L_U; │ │ │ │ │ -68 }; │ │ │ │ │ -69 │ │ │ │ │ -76 template │ │ │ │ │ -_7_7 class _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -78 : public _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r{ │ │ │ │ │ -79 public: │ │ │ │ │ -_8_1 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_8_2 typedef typename std::remove_const::type _r_i_l_u___t_y_p_e; │ │ │ │ │ -_8_4 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_8_6 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -87 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +_1_2namespace Dune::ISTL::Impl │ │ │ │ │ +13{ │ │ │ │ │ +27 template::size_type> │ │ │ │ │ +28 class BCCSMatrix │ │ │ │ │ +29 { │ │ │ │ │ +30 public: │ │ │ │ │ +31 using Index = I; │ │ │ │ │ +32 using size_type = std::size_t; │ │ │ │ │ +33 │ │ │ │ │ +36 BCCSMatrix() │ │ │ │ │ +37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0) │ │ │ │ │ +38 {} │ │ │ │ │ +39 │ │ │ │ │ +41 ~BCCSMatrix() │ │ │ │ │ +42 { │ │ │ │ │ +43 if(N_+M_+Nnz_!=0) │ │ │ │ │ +44 free(); │ │ │ │ │ +45 } │ │ │ │ │ +46 │ │ │ │ │ +48 void setSize(size_type rows, size_type columns) │ │ │ │ │ +49 { │ │ │ │ │ +50 N_ = rows; │ │ │ │ │ +51 M_ = columns; │ │ │ │ │ +52 } │ │ │ │ │ +53 │ │ │ │ │ +58 size_type N() const │ │ │ │ │ +59 { │ │ │ │ │ +60 return N_; │ │ │ │ │ +61 } │ │ │ │ │ +62 │ │ │ │ │ +64 size_type nonzeroes() const │ │ │ │ │ +65 { │ │ │ │ │ +66 return Nnz_; │ │ │ │ │ +67 } │ │ │ │ │ +68 │ │ │ │ │ +73 size_type M() const │ │ │ │ │ +74 { │ │ │ │ │ +75 return M_; │ │ │ │ │ +76 } │ │ │ │ │ +77 │ │ │ │ │ +84 B* getValues() const │ │ │ │ │ +85 { │ │ │ │ │ +86 return values; │ │ │ │ │ +87 } │ │ │ │ │ 88 │ │ │ │ │ -_9_3 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -94 { │ │ │ │ │ -95 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e(this->_I_L_U,v,d); │ │ │ │ │ -96 } │ │ │ │ │ -104 template │ │ │ │ │ -105 void _s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowset); │ │ │ │ │ -106 │ │ │ │ │ -107 }; │ │ │ │ │ -108 │ │ │ │ │ -109 template │ │ │ │ │ -_1_1_0 class _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -111 : public _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r{ │ │ │ │ │ -112 public: │ │ │ │ │ -_1_1_4 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_1_1_5 typedef typename std::remove_const::type _r_i_l_u___t_y_p_e; │ │ │ │ │ -_1_1_7 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_1_1_9 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -120 │ │ │ │ │ -_1_2_5 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ -126 { │ │ │ │ │ -127 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e(RILU,v,d); │ │ │ │ │ -128 } │ │ │ │ │ -129 │ │ │ │ │ -137 template │ │ │ │ │ -138 void _s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowset); │ │ │ │ │ -139 │ │ │ │ │ -140 private: │ │ │ │ │ -144 _r_i_l_u___t_y_p_e RILU; │ │ │ │ │ -145 }; │ │ │ │ │ -146 │ │ │ │ │ -147 │ │ │ │ │ +95 Index* getRowIndex() const │ │ │ │ │ +96 { │ │ │ │ │ +97 return rowindex; │ │ │ │ │ +98 } │ │ │ │ │ +99 │ │ │ │ │ +106 Index* getColStart() const │ │ │ │ │ +107 { │ │ │ │ │ +108 return colstart; │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +112 BCCSMatrix& operator=(const BCCSMatrix& _m_a_t) │ │ │ │ │ +113 { │ │ │ │ │ +114 if(N_+M_+Nnz_!=0) │ │ │ │ │ +115 free(); │ │ │ │ │ +116 N_=_m_a_t.N_; │ │ │ │ │ +117 M_=_m_a_t.M_; │ │ │ │ │ +118 Nnz_= _m_a_t.Nnz_; │ │ │ │ │ +119 if(M_>0) { │ │ │ │ │ +120 colstart=new size_type[M_+1]; │ │ │ │ │ +121 for(size_type i=0; i<=M_; ++i) │ │ │ │ │ +122 colstart[i]=_m_a_t.colstart[i]; │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +125 if(Nnz_>0) { │ │ │ │ │ +126 values = new B[Nnz_]; │ │ │ │ │ +127 rowindex = new size_type[Nnz_]; │ │ │ │ │ +128 │ │ │ │ │ +129 for(size_type i=0; i │ │ │ │ │ -150 template │ │ │ │ │ -_1_5_1 std::size_t _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_M_,_X_,_Y_>_:_:_c_o_p_y_T_o_L_o_c_a_l_M_a_t_r_i_x(const M& A, S& │ │ │ │ │ -rowSet) │ │ │ │ │ -152 { │ │ │ │ │ -153 // Calculate consecutive indices for local problem │ │ │ │ │ -154 // while perserving the ordering │ │ │ │ │ -155 typedef typename M::size_type size_type; │ │ │ │ │ -156 typedef std::map IndexMap; │ │ │ │ │ -157 typedef typename IndexMap::iterator IMIter; │ │ │ │ │ -158 IndexMap indexMap; │ │ │ │ │ -159 IMIter guess = indexMap.begin(); │ │ │ │ │ -160 size_type localIndex=0; │ │ │ │ │ -161 │ │ │ │ │ -162 typedef typename S::const_iterator SIter; │ │ │ │ │ -163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end(); │ │ │ │ │ -164 rowIdx!= rowEnd; ++rowIdx, ++localIndex) │ │ │ │ │ -165 guess = indexMap.insert(guess, │ │ │ │ │ -166 std::make_pair(*rowIdx,localIndex)); │ │ │ │ │ -167 │ │ │ │ │ -168 │ │ │ │ │ -169 // Build Matrix for local subproblem │ │ │ │ │ -170 ILU.setSize(rowSet.size(),rowSet.size()); │ │ │ │ │ -171 ILU.setBuildMode(matrix_type::row_wise); │ │ │ │ │ -172 │ │ │ │ │ -173 // Create sparsity pattern │ │ │ │ │ -174 typedef typename matrix_type::CreateIterator CIter; │ │ │ │ │ -175 CIter rowCreator = ILU.createbegin(); │ │ │ │ │ -176 std::size_t offset=0; │ │ │ │ │ -177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end(); │ │ │ │ │ -178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) { │ │ │ │ │ -179 // See which row entries are in our subset and add them to │ │ │ │ │ -180 // the sparsity pattern │ │ │ │ │ -181 guess = indexMap.begin(); │ │ │ │ │ -182 │ │ │ │ │ -183 for(typename matrix_type::ConstColIterator _c_o_l=A[*rowIdx].begin(), │ │ │ │ │ -184 endcol=A[*rowIdx]._e_n_d(); _c_o_l != endcol; ++_c_o_l) { │ │ │ │ │ -185 // search for the entry in the row set │ │ │ │ │ -186 guess = indexMap.find(_c_o_l.index()); │ │ │ │ │ -187 if(guess!=indexMap.end()) { │ │ │ │ │ -188 // add local index to row │ │ │ │ │ -189 rowCreator.insert(guess->second); │ │ │ │ │ -190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second- │ │ │ │ │ -rowCreator.index()))); │ │ │ │ │ -191 } │ │ │ │ │ -192 } │ │ │ │ │ -193 │ │ │ │ │ -194 } │ │ │ │ │ -195 │ │ │ │ │ -196 // Insert the matrix values for the local problem │ │ │ │ │ -197 typename matrix_type::iterator iluRow=ILU.begin(); │ │ │ │ │ -198 │ │ │ │ │ -199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end(); │ │ │ │ │ -200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) { │ │ │ │ │ -201 // See which row entries are in our subset and add them to │ │ │ │ │ -202 // the sparsity pattern │ │ │ │ │ -203 typename matrix_type::ColIterator localCol=iluRow->begin(); │ │ │ │ │ -204 for(typename matrix_type::ConstColIterator _c_o_l=A[*rowIdx].begin(), │ │ │ │ │ -205 endcol=A[*rowIdx]._e_n_d(); _c_o_l != endcol; ++_c_o_l) { │ │ │ │ │ -206 // search for the entry in the row set │ │ │ │ │ -207 guess = indexMap.find(_c_o_l.index()); │ │ │ │ │ -208 if(guess!=indexMap.end()) { │ │ │ │ │ -209 // set local value │ │ │ │ │ -210 (*localCol)=(*col); │ │ │ │ │ -211 ++localCol; │ │ │ │ │ -212 } │ │ │ │ │ -213 } │ │ │ │ │ -214 } │ │ │ │ │ -215 return offset; │ │ │ │ │ -216 } │ │ │ │ │ -217 │ │ │ │ │ -218 │ │ │ │ │ -219 template │ │ │ │ │ -220 template │ │ │ │ │ -_2_2_1 void _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_M_,_X_,_Y_>_:_:_s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowSet) │ │ │ │ │ -222 { │ │ │ │ │ -223 this->copyToLocalMatrix(A,rowSet); │ │ │ │ │ -224 _I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n(this->ILU); │ │ │ │ │ -225 } │ │ │ │ │ -226 │ │ │ │ │ -227 template │ │ │ │ │ -228 template │ │ │ │ │ -_2_2_9 void _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_M_,_X_,_Y_>_:_:_s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowSet) │ │ │ │ │ -230 { │ │ │ │ │ -231 std::size_t offset=copyToLocalMatrix(A,rowSet); │ │ │ │ │ -232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size()); │ │ │ │ │ -233 RILU.setBuildMode(matrix_type::row_wise); │ │ │ │ │ -234 _I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n(this->ILU, (offset+1)/2, RILU); │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -238} // end name space DUNE │ │ │ │ │ -239 │ │ │ │ │ -240 │ │ │ │ │ -241#endif │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -_m_a_t_r_i_x_._h_h │ │ │ │ │ -A dynamic dense block matrix class. │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_c_o_p_y_T_o_L_o_c_a_l_M_a_t_r_i_x │ │ │ │ │ -std::size_t copyToLocalMatrix(const M &A, S &rowset) │ │ │ │ │ -Copy the local part of the global matrix to ILU. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const M &A, S &rowset) │ │ │ │ │ -Set the data of the local problem. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const M &A, S &rowset) │ │ │ │ │ -Set the data of the local problem. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:221 │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e │ │ │ │ │ -void blockILUBacksolve(const M &A, X &v, const Y &d) │ │ │ │ │ -LU backsolve with stored inverse. │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void blockILU0Decomposition(M &A) │ │ │ │ │ -compute ILU decomposition of A. A is overwritten by its decomposition │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void blockILUDecomposition(const M &A, int n, M &ILU) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -base class encapsulating common algorithms of ILU0SubdomainSolver and │ │ │ │ │ -ILUNSubdomainSolver. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_I_L_U │ │ │ │ │ -matrix_type ILU │ │ │ │ │ -The ILU0 decomposition of the matrix, or the local matrix. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_~_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -virtual ~ILUSubdomainSolver() │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const Y &d)=0 │ │ │ │ │ -Apply the subdomain solver. │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -Exact subdomain solver using ILU(p) with appropriate p. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_i_l_u___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type rilu_type │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const Y &d) │ │ │ │ │ -Apply the subdomain solver. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_i_l_u___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type rilu_type │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const Y &d) │ │ │ │ │ -Apply the subdomain solver. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:119 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -RowIterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ +149 public: │ │ │ │ │ +150 size_type N_, M_, Nnz_; │ │ │ │ │ +151 B* values; │ │ │ │ │ +152 Index* rowindex; │ │ │ │ │ +153 Index* colstart; │ │ │ │ │ +154 }; │ │ │ │ │ +155 │ │ │ │ │ +156} │ │ │ │ │ +157#endif │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00053.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solvercategory.hh File Reference │ │ │ │ +dune-istl: graphcreator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,40 +65,46 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
solvercategory.hh File Reference
│ │ │ │ +
graphcreator.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include "graph.hh"
│ │ │ │ +#include "dependency.hh"
│ │ │ │ +#include "pinfo.hh"
│ │ │ │ +#include <dune/istl/operators.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::SolverCategory
 Categories for the solvers. More...
struct  Dune::Amg::PropertiesGraphCreator< M, PI >
 
class  Dune::InvalidSolverCategory
struct  Dune::Amg::PropertiesGraphCreator< M, SequentialInformation >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,21 +1,28 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -solvercategory.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +graphcreator.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +#include "_d_e_p_e_n_d_e_n_c_y_._h_h" │ │ │ │ │ +#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_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 │ │ │ │ │ -struct   _D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -  Categories for the solvers. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _P_I_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solvercategory.hh Source File │ │ │ │ +dune-istl: graphcreator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,81 +70,156 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
solvercategory.hh
│ │ │ │ +
graphcreator.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH
│ │ │ │ -
6#define DUNE_ISTL_SOLVERCATEGORY_HH
│ │ │ │ +
5#ifndef DUNE_AMG_GRAPHCREATOR_HH
│ │ │ │ +
6#define DUNE_AMG_GRAPHCREATOR_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/exceptions.hh>
│ │ │ │ +
8#include <tuple>
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12
│ │ │ │ +
10#include "graph.hh"
│ │ │ │ +
11#include "dependency.hh"
│ │ │ │ +
12#include "pinfo.hh"
│ │ │ │ + │ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
18 namespace Amg
│ │ │ │ +
19 {
│ │ │ │ +
20 template<class M, class PI>
│ │ │ │
│ │ │ │ - │ │ │ │ -
22 {
│ │ │ │ -
│ │ │ │ -
23 enum Category {
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
30 };
│ │ │ │ -
│ │ │ │ -
31
│ │ │ │ -
33 template<typename OP>
│ │ │ │ -
│ │ │ │ -
34 static Category category(const OP& op, decltype(op.category())* = nullptr)
│ │ │ │ -
35 {
│ │ │ │ -
36 return op.category();
│ │ │ │ -
37 }
│ │ │ │ -
│ │ │ │ -
38
│ │ │ │ -
39#ifndef DOXYGEN
│ │ │ │ -
40 // template<typename OP>
│ │ │ │ -
41 // static Category category(const OP& op, decltype(op.getSolverCategory())* = nullptr)
│ │ │ │ -
42 // {
│ │ │ │ -
43 // return op.getSolverCategory();
│ │ │ │ -
44 // }
│ │ │ │ -
45
│ │ │ │ -
46 template<typename OP>
│ │ │ │ -
47 static Category category(const OP& op, decltype(op.category)* = nullptr)
│ │ │ │ -
48 {
│ │ │ │ -
49 return OP::category;
│ │ │ │ -
50 }
│ │ │ │ -
51#endif
│ │ │ │ -
52 };
│ │ │ │ -
│ │ │ │ -
53
│ │ │ │ -
54 class InvalidSolverCategory : public InvalidStateException{};
│ │ │ │ -
55
│ │ │ │ -
58} // end namespace
│ │ │ │ + │ │ │ │ +
22 {
│ │ │ │ +
23 typedef typename M::matrix_type Matrix;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
26 std::vector<bool> > SubGraph;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
30 IdentityMap,
│ │ │ │ + │ │ │ │ + │ │ │ │ +
33
│ │ │ │ +
34 typedef std::tuple<MatrixGraph*,PropertiesGraph*,SubGraph*> GraphTuple;
│ │ │ │ +
35
│ │ │ │ +
36 template<class OF, class T>
│ │ │ │ +
│ │ │ │ +
37 static GraphTuple create(const M& matrix, T& excluded,
│ │ │ │ +
38 PI& pinfo, const OF& of)
│ │ │ │ +
39 {
│ │ │ │ +
40 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
│ │ │ │ +
41 typedef typename PI::ParallelIndexSet ParallelIndexSet;
│ │ │ │ +
42 typedef typename ParallelIndexSet::const_iterator IndexIterator;
│ │ │ │ +
43 IndexIterator iend = pinfo.indexSet().end();
│ │ │ │ +
44
│ │ │ │ +
45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)
│ │ │ │ +
46 excluded[index->local()] = of.contains(index->local().attribute());
│ │ │ │ +
47
│ │ │ │ +
48 SubGraph* sg= new SubGraph(*mg, excluded);
│ │ │ │ +
49 PropertiesGraph* pg = new PropertiesGraph(*sg, IdentityMap(), sg->getEdgeIndexMap());
│ │ │ │ +
50 return GraphTuple(mg,pg,sg);
│ │ │ │ +
51 }
│ │ │ │ +
│ │ │ │ +
52
│ │ │ │ +
│ │ │ │ +
53 static void free(GraphTuple& graphs)
│ │ │ │ +
54 {
│ │ │ │ +
55 delete std::get<2>(graphs);
│ │ │ │ +
56 delete std::get<1>(graphs);
│ │ │ │ +
57 }
│ │ │ │ +
│ │ │ │ +
58 };
│ │ │ │ +
│ │ │ │
59
│ │ │ │ -
60#endif
│ │ │ │ +
60 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
62 {
│ │ │ │ +
63 typedef typename M::matrix_type Matrix;
│ │ │ │ +
64
│ │ │ │ + │ │ │ │ +
66
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
70 IdentityMap,
│ │ │ │ +
71 IdentityMap> PropertiesGraph;
│ │ │ │ +
72
│ │ │ │ +
73 typedef std::tuple<MatrixGraph*,PropertiesGraph*> GraphTuple;
│ │ │ │ +
74
│ │ │ │ +
75 template<class OF, class T>
│ │ │ │ +
│ │ │ │ +
76 static GraphTuple create([[maybe_unused]] const M& matrix,
│ │ │ │ +
77 [[maybe_unused]] T& excluded,
│ │ │ │ +
78 [[maybe_unused]] const SequentialInformation& pinfo,
│ │ │ │ +
79 const OF&)
│ │ │ │ +
80 {
│ │ │ │ +
81 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
│ │ │ │ +
82 PropertiesGraph* pg = new PropertiesGraph(*mg, IdentityMap(), IdentityMap());
│ │ │ │ +
83 return GraphTuple(mg,pg);
│ │ │ │ +
84 }
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
│ │ │ │ +
86 static void free(GraphTuple& graphs)
│ │ │ │ +
87 {
│ │ │ │ +
88 delete std::get<1>(graphs);
│ │ │ │ +
89 }
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
91 };
│ │ │ │ +
│ │ │ │ +
92
│ │ │ │ +
93 } //namespace Amg
│ │ │ │ +
94} // namespace Dune
│ │ │ │ +
95#endif
│ │ │ │ + │ │ │ │ +
Provides classes for building the matrix graph.
│ │ │ │ +
Provides classes for initializing the link attributes of a matrix graph.
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ -
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ -
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ -
Definition solvercategory.hh:54
│ │ │ │ +
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ +
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ +
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ +
A subgraph of a graph.
Definition graph.hh:443
│ │ │ │ +
EdgeIndexMap getEdgeIndexMap()
Get an edge index map for the graph.
│ │ │ │ +
An index map for mapping the edges to indices.
Definition graph.hh:470
│ │ │ │ +
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ +
Definition graphcreator.hh:22
│ │ │ │ +
Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph
Definition graphcreator.hh:26
│ │ │ │ +
Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties, IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph
Definition graphcreator.hh:32
│ │ │ │ +
M::matrix_type Matrix
Definition graphcreator.hh:23
│ │ │ │ +
static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of)
Definition graphcreator.hh:37
│ │ │ │ +
static void free(GraphTuple &graphs)
Definition graphcreator.hh:53
│ │ │ │ +
Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
Definition graphcreator.hh:24
│ │ │ │ +
std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple
Definition graphcreator.hh:34
│ │ │ │ +
Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
Definition graphcreator.hh:65
│ │ │ │ +
M::matrix_type Matrix
Definition graphcreator.hh:63
│ │ │ │ +
Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties, IdentityMap, IdentityMap > PropertiesGraph
Definition graphcreator.hh:71
│ │ │ │ +
std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple
Definition graphcreator.hh:73
│ │ │ │ +
static GraphTuple create(const M &matrix, T &excluded, const SequentialInformation &pinfo, const OF &)
Definition graphcreator.hh:76
│ │ │ │ +
static void free(GraphTuple &graphs)
Definition graphcreator.hh:86
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,85 +1,188 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -solvercategory.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +graphcreator.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH │ │ │ │ │ -6#define DUNE_ISTL_SOLVERCATEGORY_HH │ │ │ │ │ +5#ifndef DUNE_AMG_GRAPHCREATOR_HH │ │ │ │ │ +6#define DUNE_AMG_GRAPHCREATOR_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#include │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11namespace _D_u_n_e { │ │ │ │ │ -12 │ │ │ │ │ -_2_1 struct _S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +10#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +11#include "_d_e_p_e_n_d_e_n_c_y_._h_h" │ │ │ │ │ +12#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +13#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e │ │ │ │ │ +17{ │ │ │ │ │ +18 namespace Amg │ │ │ │ │ +19 { │ │ │ │ │ +20 template │ │ │ │ │ +_2_1 struct _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ 22 { │ │ │ │ │ -_2_3 enum _C_a_t_e_g_o_r_y { │ │ │ │ │ -_2_5 _s_e_q_u_e_n_t_i_a_l, │ │ │ │ │ -_2_7 _n_o_n_o_v_e_r_l_a_p_p_i_n_g, │ │ │ │ │ -29 _o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -_3_0 }; │ │ │ │ │ -31 │ │ │ │ │ -33 template │ │ │ │ │ -_3_4 static _C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y(const OP& op, decltype(op.category())* = nullptr) │ │ │ │ │ -35 { │ │ │ │ │ -36 return op.category(); │ │ │ │ │ -37 } │ │ │ │ │ -38 │ │ │ │ │ -39#ifndef DOXYGEN │ │ │ │ │ -40 // template │ │ │ │ │ -41 // static Category category(const OP& op, decltype(op.getSolverCategory())* │ │ │ │ │ -= nullptr) │ │ │ │ │ -42 // { │ │ │ │ │ -43 // return op.getSolverCategory(); │ │ │ │ │ -44 // } │ │ │ │ │ -45 │ │ │ │ │ -46 template │ │ │ │ │ -47 static _C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y(const OP& op, decltype(op.category)* = nullptr) │ │ │ │ │ -48 { │ │ │ │ │ -49 return OP::category; │ │ │ │ │ -50 } │ │ │ │ │ -51#endif │ │ │ │ │ -52 }; │ │ │ │ │ -53 │ │ │ │ │ -_5_4 class _I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y : public InvalidStateException{}; │ │ │ │ │ -55 │ │ │ │ │ -58} // end namespace │ │ │ │ │ +_2_3 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ +_2_4 typedef _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_a_t_r_i_x_> _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ +25 typedef _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h, │ │ │ │ │ +_2_6 std::vector > _S_u_b_G_r_a_p_h; │ │ │ │ │ +27 typedef _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_S_u_b_G_r_a_p_h, │ │ │ │ │ +28 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +29 _E_d_g_e_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +30 IdentityMap, │ │ │ │ │ +31 typename _S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p> │ │ │ │ │ +_3_2 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ +33 │ │ │ │ │ +_3_4 typedef std::tuple _G_r_a_p_h_T_u_p_l_e; │ │ │ │ │ +35 │ │ │ │ │ +36 template │ │ │ │ │ +_3_7 static _G_r_a_p_h_T_u_p_l_e _c_r_e_a_t_e(const M& matrix, T& excluded, │ │ │ │ │ +38 PI& pinfo, const OF& of) │ │ │ │ │ +39 { │ │ │ │ │ +40 _M_a_t_r_i_x_G_r_a_p_h* mg = new _M_a_t_r_i_x_G_r_a_p_h(matrix.getmat()); │ │ │ │ │ +41 typedef typename PI::ParallelIndexSet ParallelIndexSet; │ │ │ │ │ +42 typedef typename ParallelIndexSet::const_iterator IndexIterator; │ │ │ │ │ +43 IndexIterator iend = pinfo.indexSet().end(); │ │ │ │ │ +44 │ │ │ │ │ +45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index) │ │ │ │ │ +46 excluded[index->local()] = of.contains(index->local().attribute()); │ │ │ │ │ +47 │ │ │ │ │ +48 _S_u_b_G_r_a_p_h* sg= new _S_u_b_G_r_a_p_h(*mg, excluded); │ │ │ │ │ +49 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h* pg = new _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(*sg, IdentityMap(), sg- │ │ │ │ │ +>_g_e_t_E_d_g_e_I_n_d_e_x_M_a_p()); │ │ │ │ │ +50 return _G_r_a_p_h_T_u_p_l_e(mg,pg,sg); │ │ │ │ │ +51 } │ │ │ │ │ +52 │ │ │ │ │ +_5_3 static void _f_r_e_e(_G_r_a_p_h_T_u_p_l_e& graphs) │ │ │ │ │ +54 { │ │ │ │ │ +55 delete std::get<2>(graphs); │ │ │ │ │ +56 delete std::get<1>(graphs); │ │ │ │ │ +57 } │ │ │ │ │ +58 }; │ │ │ │ │ 59 │ │ │ │ │ -60#endif │ │ │ │ │ +60 template │ │ │ │ │ +_6_1 struct _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ +62 { │ │ │ │ │ +_6_3 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ +64 │ │ │ │ │ +_6_5 typedef _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_a_t_r_i_x_> _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ +66 │ │ │ │ │ +67 typedef _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h, │ │ │ │ │ +68 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +69 _E_d_g_e_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +70 IdentityMap, │ │ │ │ │ +_7_1 IdentityMap> _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ +72 │ │ │ │ │ +_7_3 typedef std::tuple _G_r_a_p_h_T_u_p_l_e; │ │ │ │ │ +74 │ │ │ │ │ +75 template │ │ │ │ │ +_7_6 static _G_r_a_p_h_T_u_p_l_e _c_r_e_a_t_e([[maybe_unused]] const M& matrix, │ │ │ │ │ +77 [[maybe_unused]] T& excluded, │ │ │ │ │ +78 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +79 const OF&) │ │ │ │ │ +80 { │ │ │ │ │ +81 _M_a_t_r_i_x_G_r_a_p_h* mg = new _M_a_t_r_i_x_G_r_a_p_h(matrix.getmat()); │ │ │ │ │ +82 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h* pg = new _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(*mg, IdentityMap(), IdentityMap │ │ │ │ │ +()); │ │ │ │ │ +83 return _G_r_a_p_h_T_u_p_l_e(mg,pg); │ │ │ │ │ +84 } │ │ │ │ │ +85 │ │ │ │ │ +_8_6 static void _f_r_e_e(_G_r_a_p_h_T_u_p_l_e& graphs) │ │ │ │ │ +87 { │ │ │ │ │ +88 delete std::get<1>(graphs); │ │ │ │ │ +89 } │ │ │ │ │ +90 │ │ │ │ │ +91 }; │ │ │ │ │ +92 │ │ │ │ │ +93 } //namespace Amg │ │ │ │ │ +94} // namespace Dune │ │ │ │ │ +95#endif │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_g_r_a_p_h_._h_h │ │ │ │ │ +Provides classes for building the matrix graph. │ │ │ │ │ +_d_e_p_e_n_d_e_n_c_y_._h_h │ │ │ │ │ +Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -Categories for the solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ nonoverlapping │ │ │ │ │ -Category for non-overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ overlapping │ │ │ │ │ -Category for overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +Class representing the properties of an ede in the matrix graph. │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +Class representing a node in the matrix graph. │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +The (undirected) graph of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ +A subgraph of a graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:443 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_g_e_t_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +EdgeIndexMap getEdgeIndexMap() │ │ │ │ │ +Get an edge index map for the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +An index map for mapping the edges to indices. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:470 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +Attaches properties to the edges and vertices of a graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ +Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:26 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties, │ │ │ │ │ +IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_M_a_t_r_i_x │ │ │ │ │ +M::matrix_type Matrix │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e │ │ │ │ │ +static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of) │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_f_r_e_e │ │ │ │ │ +static void free(GraphTuple &graphs) │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +Dune::Amg::MatrixGraph< const Matrix > MatrixGraph │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_G_r_a_p_h_T_u_p_l_e │ │ │ │ │ +std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +Dune::Amg::MatrixGraph< const Matrix > MatrixGraph │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +M::matrix_type Matrix │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties, │ │ │ │ │ +IdentityMap, IdentityMap > PropertiesGraph │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_G_r_a_p_h_T_u_p_l_e │ │ │ │ │ +std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_c_r_e_a_t_e │ │ │ │ │ +static GraphTuple create(const M &matrix, T &excluded, const │ │ │ │ │ +SequentialInformation &pinfo, const OF &) │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_f_r_e_e │ │ │ │ │ +static void free(GraphTuple &graphs) │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00056.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: istlexception.hh File Reference │ │ │ │ +dune-istl: hierarchy.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,52 +65,56 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
istlexception.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ + │ │ │ │ +

Provides a classes representing the hierarchies in AMG. │ │ │ │ +More...

│ │ │ │ +
#include <list>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include <dune/common/bigunsignedint.hh>
│ │ │ │ +#include <dune/istl/paamg/construction.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ISTLError
 derive error class from the base class in common More...
 
class  Dune::BCRSMatrixError
 Error specific to BCRSMatrix. More...
 
class  Dune::ImplicitModeCompressionBufferExhausted
 Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted. More...
class  Dune::Amg::Hierarchy< T, A >
 A hierarchy of containers (e.g. matrices or vectors) More...
 
class  Dune::SolverAbort
 Thrown when a solver aborts due to some problem. More...
 
class  Dune::MatrixBlockError
 Error when performing an operation on a matrix block. More...
class  Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 >
 Iterator over the levels in the hierarchy. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Provides a classes representing the hierarchies in AMG.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,33 +1,38 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -istlexception.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +hierarchy.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_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_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -  derive error class from the base class in common _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _T_,_ _A_ _> │ │ │ │ │ +  A hierarchy of containers (e.g. matrices or vectors) _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ -  Error specific to _B_C_R_S_M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ -  Thrown when the compression buffer used by the implicit _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ - construction is exhausted. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ -  Thrown when a solver aborts due to some problem. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ -  Error when performing an operation on a matrix block. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _T_,_ _A_ _>_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_<_ _C_,_ _T_1_ _> │ │ │ │ │ +  Iterator over the levels in the hierarchy. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: istlexception.hh Source File │ │ │ │ +dune-istl: hierarchy.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,69 +70,423 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
istlexception.hh
│ │ │ │ +
hierarchy.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH
│ │ │ │ -
6#define DUNE_ISTL_ISTLEXCEPTION_HH
│ │ │ │ +
5#ifndef DUNE_AMGHIERARCHY_HH
│ │ │ │ +
6#define DUNE_AMGHIERARCHY_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/exceptions.hh>
│ │ │ │ -
9#include <dune/common/fmatrix.hh>
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12
│ │ │ │ -
19 class ISTLError : public Dune::MathError {};
│ │ │ │ -
20
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
23 : public ISTLError
│ │ │ │ -
24 {};
│ │ │ │ -
│ │ │ │ -
25
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
36 : public BCRSMatrixError
│ │ │ │ -
37 {};
│ │ │ │ -
│ │ │ │ -
38
│ │ │ │ -
40
│ │ │ │ -
46 class SolverAbort : public ISTLError {};
│ │ │ │ -
47
│ │ │ │ +
8#include <list>
│ │ │ │ +
9#include <memory>
│ │ │ │ +
10#include <limits>
│ │ │ │ +
11#include <dune/common/stdstreams.hh>
│ │ │ │ +
12#include <dune/common/timer.hh>
│ │ │ │ +
13#include <dune/common/bigunsignedint.hh>
│ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
18 namespace Amg
│ │ │ │ +
19 {
│ │ │ │ +
38 template<typename T, typename A=std::allocator<T> >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
40 {
│ │ │ │ +
41 public:
│ │ │ │ +
45 typedef T MemberType;
│ │ │ │ +
46
│ │ │ │ +
47 template<typename T1, typename T2>
│ │ │ │ +
48 class LevelIterator;
│ │ │ │
49
│ │ │ │ -
│ │ │ │ -
52 class MatrixBlockError : public virtual Dune::FMatrixError {
│ │ │ │ -
53 public:
│ │ │ │ -
54 int r, c; // row and column index of the entry from which the error resulted
│ │ │ │ -
55 };
│ │ │ │ -
│ │ │ │ -
56
│ │ │ │ -
59} // end namespace
│ │ │ │ -
60
│ │ │ │ -
61#endif
│ │ │ │ +
50 private:
│ │ │ │ +
54 struct Element
│ │ │ │ +
55 {
│ │ │ │ +
56 friend class LevelIterator<Hierarchy<T,A>, T>;
│ │ │ │ +
57 friend class LevelIterator<const Hierarchy<T,A>, const T>;
│ │ │ │ +
58
│ │ │ │ +
60 std::weak_ptr<Element> coarser_;
│ │ │ │ +
61
│ │ │ │ +
63 std::shared_ptr<Element> finer_;
│ │ │ │ +
64
│ │ │ │ +
66 std::shared_ptr<MemberType> element_;
│ │ │ │ +
67
│ │ │ │ +
69 std::shared_ptr<MemberType> redistributed_;
│ │ │ │ +
70 };
│ │ │ │ +
71 public:
│ │ │ │ +
72
│ │ │ │ +
76 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
│ │ │ │ +
77
│ │ │ │ + │ │ │ │ +
79
│ │ │ │ +
│ │ │ │ +
84 Hierarchy(const std::shared_ptr<MemberType> & first);
│ │ │ │ +
85
│ │ │ │ +
│ │ │ │ +
89 Hierarchy() : levels_(0)
│ │ │ │ +
90 {}
│ │ │ │ +
│ │ │ │ +
91
│ │ │ │ +
│ │ │ │ +
95 Hierarchy(const Hierarchy& other);
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
102
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
104
│ │ │ │ +
│ │ │ │ +
109 void addFiner(Arguments& args);
│ │ │ │ +
110
│ │ │ │ +
117 template<class C, class T1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
119 : public BidirectionalIteratorFacade<LevelIterator<C,T1>,T1,T1&>
│ │ │ │ +
120 {
│ │ │ │ +
121 friend class LevelIterator<typename std::remove_const<C>::type,
│ │ │ │ +
122 typename std::remove_const<T1>::type >;
│ │ │ │ +
123 friend class LevelIterator<const typename std::remove_const<C>::type,
│ │ │ │ +
124 const typename std::remove_const<T1>::type >;
│ │ │ │ +
125
│ │ │ │ +
126 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
129 {}
│ │ │ │ +
│ │ │ │ +
130
│ │ │ │ +
│ │ │ │ +
131 LevelIterator(std::shared_ptr<Element> element)
│ │ │ │ +
132 : element_(element)
│ │ │ │ +
133 {}
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
│ │ │ │ +
136 LevelIterator(const LevelIterator<typename std::remove_const<C>::type,
│ │ │ │ +
137 typename std::remove_const<T1>::type>& other)
│ │ │ │ +
138 : element_(other.element_)
│ │ │ │ +
139 {}
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ +
142 LevelIterator(const LevelIterator<const typename std::remove_const<C>::type,
│ │ │ │ +
143 const typename std::remove_const<T1>::type>& other)
│ │ │ │ +
144 : element_(other.element_)
│ │ │ │ +
145 {}
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
│ │ │ │ +
150 bool equals(const LevelIterator<typename std::remove_const<C>::type,
│ │ │ │ +
151 typename std::remove_const<T1>::type>& other) const
│ │ │ │ +
152 {
│ │ │ │ +
153 return element_ == other.element_;
│ │ │ │ +
154 }
│ │ │ │ +
│ │ │ │ +
155
│ │ │ │ +
│ │ │ │ +
159 bool equals(const LevelIterator<const typename std::remove_const<C>::type,
│ │ │ │ +
160 const typename std::remove_const<T1>::type>& other) const
│ │ │ │ +
161 {
│ │ │ │ +
162 return element_ == other.element_;
│ │ │ │ +
163 }
│ │ │ │ +
│ │ │ │ +
164
│ │ │ │ +
│ │ │ │ +
166 T1& dereference() const
│ │ │ │ +
167 {
│ │ │ │ +
168 return *(element_->element_);
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
173 {
│ │ │ │ +
174 element_ = element_->coarser_.lock();
│ │ │ │ +
175 }
│ │ │ │ +
│ │ │ │ +
176
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
179 {
│ │ │ │ +
180 element_ = element_->finer_;
│ │ │ │ +
181 }
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
│ │ │ │ +
187 bool isRedistributed() const
│ │ │ │ +
188 {
│ │ │ │ +
189 return (bool)element_->redistributed_;
│ │ │ │ +
190 }
│ │ │ │ +
│ │ │ │ +
191
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
197 {
│ │ │ │ +
198 assert(element_->redistributed_);
│ │ │ │ +
199 return *element_->redistributed_;
│ │ │ │ +
200 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
201 void addRedistributed(std::shared_ptr<T1> t)
│ │ │ │ +
202 {
│ │ │ │ +
203 element_->redistributed_ = t;
│ │ │ │ +
204 }
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
207 {
│ │ │ │ +
208 element_->redistributed_ = nullptr;
│ │ │ │ +
209 }
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
211 private:
│ │ │ │ +
212 std::shared_ptr<Element> element_;
│ │ │ │ +
213 };
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ + │ │ │ │ +
217
│ │ │ │ + │ │ │ │ +
220
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
226
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
232
│ │ │ │ +
233
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
239
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
245
│ │ │ │ +
│ │ │ │ +
250 std::size_t levels() const;
│ │ │ │ +
251
│ │ │ │ +
252 private:
│ │ │ │ +
258 std::shared_ptr<MemberType> originalFinest_;
│ │ │ │ +
260 std::shared_ptr<Element> finest_;
│ │ │ │ +
262 std::shared_ptr<Element> coarsest_;
│ │ │ │ +
264 Allocator allocator_;
│ │ │ │ +
266 int levels_;
│ │ │ │ +
267 };
│ │ │ │ +
268
│ │ │ │ +
269 template<class T, class A>
│ │ │ │ +
│ │ │ │ +
270 Hierarchy<T,A>::Hierarchy(const std::shared_ptr<MemberType> & first)
│ │ │ │ +
271 : originalFinest_(first)
│ │ │ │ +
272 {
│ │ │ │ +
273 finest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
274 finest_->element_ = originalFinest_;
│ │ │ │ +
275 coarsest_ = finest_;
│ │ │ │ +
276 levels_ = 1;
│ │ │ │ +
277 }
│ │ │ │ +
│ │ │ │ +
278
│ │ │ │ +
280 //TODO: do we actually want to support this? This might be very expensive?!
│ │ │ │ +
281 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
283 : allocator_(other.allocator_),
│ │ │ │ +
284 levels_(other.levels_)
│ │ │ │ +
285 {
│ │ │ │ +
286 if(!other.finest_)
│ │ │ │ +
287 {
│ │ │ │ +
288 finest_=coarsest_=nullptr;
│ │ │ │ +
289 return;
│ │ │ │ +
290 }
│ │ │ │ +
291 finest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
292 std::shared_ptr<Element> finer_;
│ │ │ │ +
293 std::shared_ptr<Element> current_ = finest_;
│ │ │ │ +
294 std::weak_ptr<Element> otherWeak_ = other.finest_;
│ │ │ │ +
295
│ │ │ │ +
296 while(! otherWeak_.expired())
│ │ │ │ +
297 {
│ │ │ │ +
298 // create shared_ptr from weak_ptr, we just checked that this is safe
│ │ │ │ +
299 std::shared_ptr<Element> otherCurrent_ = std::shared_ptr<Element>(otherWeak_);
│ │ │ │ +
300 // clone current level
│ │ │ │ +
301 //TODO: should we use the allocator?
│ │ │ │ +
302 current_->element_ =
│ │ │ │ +
303 std::make_shared<MemberType>(*(otherCurrent_->element_));
│ │ │ │ +
304 current_->finer_=finer_;
│ │ │ │ +
305 if(otherCurrent_->redistributed_)
│ │ │ │ +
306 current_->redistributed_ =
│ │ │ │ +
307 std::make_shared<MemberType>(*(otherCurrent_->redistributed_));
│ │ │ │ +
308 finer_=current_;
│ │ │ │ +
309 if(not otherCurrent_->coarser_.expired())
│ │ │ │ +
310 {
│ │ │ │ +
311 auto c = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
312 current_->coarser_ = c;
│ │ │ │ +
313 current_ = c;
│ │ │ │ +
314 }
│ │ │ │ +
315 // go to coarser level
│ │ │ │ +
316 otherWeak_ = otherCurrent_->coarser_;
│ │ │ │ +
317 }
│ │ │ │ +
318 coarsest_=current_;
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
321 template<class T, class A>
│ │ │ │ +
│ │ │ │ +
322 std::size_t Hierarchy<T,A>::levels() const
│ │ │ │ +
323 {
│ │ │ │ +
324 return levels_;
│ │ │ │ +
325 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
326
│ │ │ │ +
327 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
329 {
│ │ │ │ +
330 coarsest_->redistributed_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ +
331 }
│ │ │ │ +
│ │ │ │ +
332
│ │ │ │ +
333 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
335 {
│ │ │ │ +
336 if(!coarsest_) {
│ │ │ │ +
337 // we have no levels at all...
│ │ │ │ +
338 assert(!finest_);
│ │ │ │ +
339 // allocate into the shared_ptr
│ │ │ │ +
340 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ +
341 coarsest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
342 coarsest_->element_ = originalFinest_;
│ │ │ │ +
343 finest_ = coarsest_;
│ │ │ │ +
344 }else{
│ │ │ │ +
345 auto old_coarsest = coarsest_;
│ │ │ │ +
346 coarsest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
347 coarsest_->finer_ = old_coarsest;
│ │ │ │ +
348 coarsest_->element_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ +
349 old_coarsest->coarser_ = coarsest_;
│ │ │ │ +
350 }
│ │ │ │ +
351 ++levels_;
│ │ │ │ +
352 }
│ │ │ │ +
│ │ │ │ +
353
│ │ │ │ +
354
│ │ │ │ +
355 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
357 {
│ │ │ │ +
358 //TODO: wouldn't it be better to do this in the constructor?'
│ │ │ │ +
359 if(!finest_) {
│ │ │ │ +
360 // we have no levels at all...
│ │ │ │ +
361 assert(!coarsest_);
│ │ │ │ +
362 // allocate into the shared_ptr
│ │ │ │ +
363 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ +
364 finest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
365 finest_->element = originalFinest_;
│ │ │ │ +
366 coarsest_ = finest_;
│ │ │ │ +
367 }else{
│ │ │ │ +
368 finest_->finer_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ +
369 finest_->finer_->coarser_ = finest_;
│ │ │ │ +
370 finest_ = finest_->finer_;
│ │ │ │ +
371 finest_->element = ConstructionTraits<T>::construct(args);
│ │ │ │ +
372 }
│ │ │ │ +
373 ++levels_;
│ │ │ │ +
374 }
│ │ │ │ +
│ │ │ │ +
375
│ │ │ │ +
376 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
378 {
│ │ │ │ +
379 return Iterator(finest_);
│ │ │ │ +
380 }
│ │ │ │ +
│ │ │ │ +
381
│ │ │ │ +
382 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
384 {
│ │ │ │ +
385 return Iterator(coarsest_);
│ │ │ │ +
386 }
│ │ │ │ +
│ │ │ │ +
387
│ │ │ │ +
388 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
390 {
│ │ │ │ +
391 return ConstIterator(finest_);
│ │ │ │ +
392 }
│ │ │ │ +
│ │ │ │ +
393
│ │ │ │ +
394 template<class T, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
396 {
│ │ │ │ +
397 return ConstIterator(coarsest_);
│ │ │ │ +
398 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
400 } // namespace Amg
│ │ │ │ +
401} // namespace Dune
│ │ │ │ +
402
│ │ │ │ +
403#endif
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
Helper classes for the construction of classes without empty constructor.
│ │ │ │ +
Hierarchy(const Hierarchy &other)
Copy constructor (deep copy!).
Definition hierarchy.hh:282
│ │ │ │ +
void addRedistributedOnCoarsest(Arguments &args)
Definition hierarchy.hh:328
│ │ │ │ +
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition hierarchy.hh:322
│ │ │ │ +
ConstIterator coarsest() const
Get an iterator positioned at the coarsest level.
Definition hierarchy.hh:395
│ │ │ │ +
void addCoarser(Arguments &args)
Add an element on a coarser level.
Definition hierarchy.hh:334
│ │ │ │ +
void addFiner(Arguments &args)
Add an element on a finer level.
Definition hierarchy.hh:356
│ │ │ │ +
Hierarchy(const std::shared_ptr< MemberType > &first)
Construct a new hierarchy.
Definition hierarchy.hh:270
│ │ │ │ +
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ +
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ +
Iterator coarsest()
Get an iterator positioned at the coarsest level.
Definition hierarchy.hh:383
│ │ │ │ +
ConstIterator finest() const
Get an iterator positioned at the finest level.
Definition hierarchy.hh:389
│ │ │ │ +
Iterator finest()
Get an iterator positioned at the finest level.
Definition hierarchy.hh:377
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
Error specific to BCRSMatrix.
Definition istlexception.hh:24
│ │ │ │ -
Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
Definition istlexception.hh:37
│ │ │ │ -
Thrown when a solver aborts due to some problem.
Definition istlexception.hh:46
│ │ │ │ -
Error when performing an operation on a matrix block.
Definition istlexception.hh:52
│ │ │ │ -
int c
Definition istlexception.hh:54
│ │ │ │ -
int r
Definition istlexception.hh:54
│ │ │ │ +
A hierarchy of containers (e.g. matrices or vectors)
Definition hierarchy.hh:40
│ │ │ │ +
T MemberType
The type of the container we store.
Definition hierarchy.hh:45
│ │ │ │ +
LevelIterator< Hierarchy< T, A >, T > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ +
LevelIterator< const Hierarchy< T, A >, const T > ConstIterator
Type of the const iterator.
Definition hierarchy.hh:219
│ │ │ │ +
ConstructionTraits< T >::Arguments Arguments
Definition hierarchy.hh:78
│ │ │ │ +
Hierarchy()
Construct an empty hierarchy.
Definition hierarchy.hh:89
│ │ │ │ +
typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
The allocator to use for the list elements.
Definition hierarchy.hh:76
│ │ │ │ +
Iterator over the levels in the hierarchy.
Definition hierarchy.hh:120
│ │ │ │ +
LevelIterator(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other)
Copy constructor.
Definition hierarchy.hh:136
│ │ │ │ +
void addRedistributed(std::shared_ptr< T1 > t)
Definition hierarchy.hh:201
│ │ │ │ +
T1 & dereference() const
Dereference the iterator.
Definition hierarchy.hh:166
│ │ │ │ +
bool equals(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other) const
Equality check.
Definition hierarchy.hh:150
│ │ │ │ +
bool isRedistributed() const
Check whether there was a redistribution at the current level.
Definition hierarchy.hh:187
│ │ │ │ +
bool equals(const LevelIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T1 >::type > &other) const
Equality check.
Definition hierarchy.hh:159
│ │ │ │ +
void increment()
Move to the next coarser level.
Definition hierarchy.hh:172
│ │ │ │ +
LevelIterator(const LevelIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T1 >::type > &other)
Copy constructor.
Definition hierarchy.hh:142
│ │ │ │ +
void deleteRedistributed()
Definition hierarchy.hh:206
│ │ │ │ +
void decrement()
Move to the next fine level.
Definition hierarchy.hh:178
│ │ │ │ +
LevelIterator(std::shared_ptr< Element > element)
Definition hierarchy.hh:131
│ │ │ │ +
T1 & getRedistributed() const
Get the redistributed container.
Definition hierarchy.hh:196
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,69 +1,442 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -istlexception.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +hierarchy.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH │ │ │ │ │ -6#define DUNE_ISTL_ISTLEXCEPTION_HH │ │ │ │ │ +5#ifndef DUNE_AMGHIERARCHY_HH │ │ │ │ │ +6#define DUNE_AMGHIERARCHY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11namespace _D_u_n_e { │ │ │ │ │ -12 │ │ │ │ │ -_1_9 class _I_S_T_L_E_r_r_o_r : public Dune::MathError {}; │ │ │ │ │ -20 │ │ │ │ │ -_2_2 class _B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ -23 : public _I_S_T_L_E_r_r_o_r │ │ │ │ │ -24 {}; │ │ │ │ │ -25 │ │ │ │ │ -_3_5 class _I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ -36 : public _B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ -37 {}; │ │ │ │ │ -38 │ │ │ │ │ -40 │ │ │ │ │ -_4_6 class _S_o_l_v_e_r_A_b_o_r_t : public _I_S_T_L_E_r_r_o_r {}; │ │ │ │ │ -47 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e │ │ │ │ │ +17{ │ │ │ │ │ +18 namespace Amg │ │ │ │ │ +19 { │ │ │ │ │ +38 template > │ │ │ │ │ +_3_9 class _H_i_e_r_a_r_c_h_y │ │ │ │ │ +40 { │ │ │ │ │ +41 public: │ │ │ │ │ +_4_5 typedef T _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ +46 │ │ │ │ │ +47 template │ │ │ │ │ +48 class _L_e_v_e_l_I_t_e_r_a_t_o_r; │ │ │ │ │ 49 │ │ │ │ │ -_5_2 class _M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r : public virtual Dune::FMatrixError { │ │ │ │ │ -53 public: │ │ │ │ │ -_5_4 int _r, _c; // row and column index of the entry from which the error resulted │ │ │ │ │ -55 }; │ │ │ │ │ -56 │ │ │ │ │ -59} // end namespace │ │ │ │ │ -60 │ │ │ │ │ -61#endif │ │ │ │ │ +50 private: │ │ │ │ │ +54 struct Element │ │ │ │ │ +55 { │ │ │ │ │ +56 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r<_H_i_e_r_a_r_c_h_y, T>; │ │ │ │ │ +57 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r, const T>; │ │ │ │ │ +58 │ │ │ │ │ +60 std::weak_ptr coarser_; │ │ │ │ │ +61 │ │ │ │ │ +63 std::shared_ptr finer_; │ │ │ │ │ +64 │ │ │ │ │ +66 std::shared_ptr element_; │ │ │ │ │ +67 │ │ │ │ │ +_6_9 std::shared_ptr redistributed_; │ │ │ │ │ +70 }; │ │ │ │ │ +71 public: │ │ │ │ │ +72 │ │ │ │ │ +_7_6 using _A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ +rebind_alloc; │ │ │ │ │ +77 │ │ │ │ │ +_7_8 typedef typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_T_>_:_:_A_r_g_u_m_e_n_t_s _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +79 │ │ │ │ │ +_8_4 _H_i_e_r_a_r_c_h_y(const std::shared_ptr & first); │ │ │ │ │ +85 │ │ │ │ │ +_8_9 _H_i_e_r_a_r_c_h_y() : levels_(0) │ │ │ │ │ +90 {} │ │ │ │ │ +91 │ │ │ │ │ +_9_5 _H_i_e_r_a_r_c_h_y(const _H_i_e_r_a_r_c_h_y& other); │ │ │ │ │ +96 │ │ │ │ │ +_1_0_1 void _a_d_d_C_o_a_r_s_e_r(_A_r_g_u_m_e_n_t_s& args); │ │ │ │ │ +102 │ │ │ │ │ +_1_0_3 void _a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d_O_n_C_o_a_r_s_e_s_t(_A_r_g_u_m_e_n_t_s& args); │ │ │ │ │ +104 │ │ │ │ │ +_1_0_9 void _a_d_d_F_i_n_e_r(_A_r_g_u_m_e_n_t_s& args); │ │ │ │ │ +110 │ │ │ │ │ +117 template │ │ │ │ │ +_1_1_8 class _L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +119 : public BidirectionalIteratorFacade,T1,T1&> │ │ │ │ │ +120 { │ │ │ │ │ +121 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ +122 typename std::remove_const::type >; │ │ │ │ │ +123 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ +124 const typename std::remove_const::type >; │ │ │ │ │ +125 │ │ │ │ │ +126 public: │ │ │ │ │ +_1_2_8 _L_e_v_e_l_I_t_e_r_a_t_o_r() │ │ │ │ │ +129 {} │ │ │ │ │ +130 │ │ │ │ │ +_1_3_1 _L_e_v_e_l_I_t_e_r_a_t_o_r(std::shared_ptr element) │ │ │ │ │ +132 : element_(element) │ │ │ │ │ +133 {} │ │ │ │ │ +134 │ │ │ │ │ +_1_3_6 _L_e_v_e_l_I_t_e_r_a_t_o_r(const _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ +137 typename std::remove_const::type>& other) │ │ │ │ │ +138 : element_(other.element_) │ │ │ │ │ +139 {} │ │ │ │ │ +140 │ │ │ │ │ +_1_4_2 _L_e_v_e_l_I_t_e_r_a_t_o_r(const _L_e_v_e_l_I_t_e_r_a_t_o_r:: │ │ │ │ │ +type, │ │ │ │ │ +143 const typename std::remove_const::type>& other) │ │ │ │ │ +144 : element_(other.element_) │ │ │ │ │ +145 {} │ │ │ │ │ +146 │ │ │ │ │ +_1_5_0 bool _e_q_u_a_l_s(const _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ +151 typename std::remove_const::type>& other) const │ │ │ │ │ +152 { │ │ │ │ │ +153 return element_ == other.element_; │ │ │ │ │ +154 } │ │ │ │ │ +155 │ │ │ │ │ +_1_5_9 bool _e_q_u_a_l_s(const _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ +160 const typename std::remove_const::type>& other) const │ │ │ │ │ +161 { │ │ │ │ │ +162 return element_ == other.element_; │ │ │ │ │ +163 } │ │ │ │ │ +164 │ │ │ │ │ +_1_6_6 T1& _d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ +167 { │ │ │ │ │ +168 return *(element_->element_); │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +_1_7_2 void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +173 { │ │ │ │ │ +174 element_ = element_->coarser_.lock(); │ │ │ │ │ +175 } │ │ │ │ │ +176 │ │ │ │ │ +_1_7_8 void _d_e_c_r_e_m_e_n_t() │ │ │ │ │ +179 { │ │ │ │ │ +180 element_ = element_->finer_; │ │ │ │ │ +181 } │ │ │ │ │ +182 │ │ │ │ │ +_1_8_7 bool _i_s_R_e_d_i_s_t_r_i_b_u_t_e_d() const │ │ │ │ │ +188 { │ │ │ │ │ +189 return (bool)element_->redistributed_; │ │ │ │ │ +190 } │ │ │ │ │ +191 │ │ │ │ │ +_1_9_6 T1& _g_e_t_R_e_d_i_s_t_r_i_b_u_t_e_d() const │ │ │ │ │ +197 { │ │ │ │ │ +198 assert(element_->redistributed_); │ │ │ │ │ +199 return *element_->redistributed_; │ │ │ │ │ +200 } │ │ │ │ │ +_2_0_1 void _a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d(std::shared_ptr t) │ │ │ │ │ +202 { │ │ │ │ │ +203 element_->redistributed_ = t; │ │ │ │ │ +204 } │ │ │ │ │ +205 │ │ │ │ │ +_2_0_6 void _d_e_l_e_t_e_R_e_d_i_s_t_r_i_b_u_t_e_d() │ │ │ │ │ +207 { │ │ │ │ │ +208 element_->redistributed_ = nullptr; │ │ │ │ │ +209 } │ │ │ │ │ +210 │ │ │ │ │ +211 private: │ │ │ │ │ +212 std::shared_ptr element_; │ │ │ │ │ +213 }; │ │ │ │ │ +214 │ │ │ │ │ +_2_1_6 typedef _L_e_v_e_l_I_t_e_r_a_t_o_r_<_H_i_e_r_a_r_c_h_y_<_T_,_A_>,T> _I_t_e_r_a_t_o_r; │ │ │ │ │ +217 │ │ │ │ │ +_2_1_9 typedef _L_e_v_e_l_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _H_i_e_r_a_r_c_h_y_<_T_,_A_>, const T> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +220 │ │ │ │ │ +_2_2_5 _I_t_e_r_a_t_o_r _f_i_n_e_s_t(); │ │ │ │ │ +226 │ │ │ │ │ +_2_3_1 _I_t_e_r_a_t_o_r _c_o_a_r_s_e_s_t(); │ │ │ │ │ +232 │ │ │ │ │ +233 │ │ │ │ │ +_2_3_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_e_s_t() const; │ │ │ │ │ +239 │ │ │ │ │ +_2_4_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _c_o_a_r_s_e_s_t() const; │ │ │ │ │ +245 │ │ │ │ │ +_2_5_0 std::size_t _l_e_v_e_l_s() const; │ │ │ │ │ +251 │ │ │ │ │ +252 private: │ │ │ │ │ +258 std::shared_ptr originalFinest_; │ │ │ │ │ +260 std::shared_ptr finest_; │ │ │ │ │ +262 std::shared_ptr coarsest_; │ │ │ │ │ +264 _A_l_l_o_c_a_t_o_r allocator_; │ │ │ │ │ +266 int levels_; │ │ │ │ │ +267 }; │ │ │ │ │ +268 │ │ │ │ │ +269 template │ │ │ │ │ +_2_7_0 _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_H_i_e_r_a_r_c_h_y(const std::shared_ptr & first) │ │ │ │ │ +271 : originalFinest_(first) │ │ │ │ │ +272 { │ │ │ │ │ +273 finest_ = std::allocate_shared(allocator_); │ │ │ │ │ +274 finest_->element_ = originalFinest_; │ │ │ │ │ +275 coarsest_ = finest_; │ │ │ │ │ +276 levels_ = 1; │ │ │ │ │ +277 } │ │ │ │ │ +278 │ │ │ │ │ +280 //TODO: do we actually want to support this? This might be very expensive?! │ │ │ │ │ +281 template │ │ │ │ │ +_2_8_2 _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_H_i_e_r_a_r_c_h_y(const _H_i_e_r_a_r_c_h_y& other) │ │ │ │ │ +283 : allocator_(other.allocator_), │ │ │ │ │ +284 levels_(other.levels_) │ │ │ │ │ +285 { │ │ │ │ │ +286 if(!other.finest_) │ │ │ │ │ +287 { │ │ │ │ │ +288 finest_=coarsest_=nullptr; │ │ │ │ │ +289 return; │ │ │ │ │ +290 } │ │ │ │ │ +291 finest_ = std::allocate_shared(allocator_); │ │ │ │ │ +292 std::shared_ptr finer_; │ │ │ │ │ +293 std::shared_ptr current_ = finest_; │ │ │ │ │ +294 std::weak_ptr otherWeak_ = other.finest_; │ │ │ │ │ +295 │ │ │ │ │ +296 while(! otherWeak_.expired()) │ │ │ │ │ +297 { │ │ │ │ │ +298 // create shared_ptr from weak_ptr, we just checked that this is safe │ │ │ │ │ +299 std::shared_ptr otherCurrent_ = std::shared_ptr │ │ │ │ │ +(otherWeak_); │ │ │ │ │ +300 // clone current level │ │ │ │ │ +301 //TODO: should we use the allocator? │ │ │ │ │ +302 current_->element_ = │ │ │ │ │ +303 std::make_shared(*(otherCurrent_->element_)); │ │ │ │ │ +304 current_->finer_=finer_; │ │ │ │ │ +305 if(otherCurrent_->redistributed_) │ │ │ │ │ +306 current_->redistributed_ = │ │ │ │ │ +307 std::make_shared(*(otherCurrent_->redistributed_)); │ │ │ │ │ +308 finer_=current_; │ │ │ │ │ +309 if(not otherCurrent_->coarser_.expired()) │ │ │ │ │ +310 { │ │ │ │ │ +311 auto c = std::allocate_shared(allocator_); │ │ │ │ │ +312 current_->coarser_ = c; │ │ │ │ │ +313 current_ = c; │ │ │ │ │ +314 } │ │ │ │ │ +315 // go to coarser level │ │ │ │ │ +316 otherWeak_ = otherCurrent_->coarser_; │ │ │ │ │ +317 } │ │ │ │ │ +318 coarsest_=current_; │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +321 template │ │ │ │ │ +_3_2_2 std::size_t _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_l_e_v_e_l_s() const │ │ │ │ │ +323 { │ │ │ │ │ +324 return levels_; │ │ │ │ │ +325 } │ │ │ │ │ +326 │ │ │ │ │ +327 template │ │ │ │ │ +_3_2_8 void _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d_O_n_C_o_a_r_s_e_s_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +329 { │ │ │ │ │ +330 coarsest_->redistributed_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +(args); │ │ │ │ │ +331 } │ │ │ │ │ +332 │ │ │ │ │ +333 template │ │ │ │ │ +_3_3_4 void _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_a_d_d_C_o_a_r_s_e_r(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +335 { │ │ │ │ │ +336 if(!coarsest_) { │ │ │ │ │ +337 // we have no levels at all... │ │ │ │ │ +338 assert(!finest_); │ │ │ │ │ +339 // allocate into the shared_ptr │ │ │ │ │ +340 originalFinest_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ +341 coarsest_ = std::allocate_shared(allocator_); │ │ │ │ │ +342 coarsest_->element_ = originalFinest_; │ │ │ │ │ +343 finest_ = coarsest_; │ │ │ │ │ +344 }else{ │ │ │ │ │ +345 auto old_coarsest = coarsest_; │ │ │ │ │ +346 coarsest_ = std::allocate_shared(allocator_); │ │ │ │ │ +347 coarsest_->finer_ = old_coarsest; │ │ │ │ │ +348 coarsest_->element_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ +349 old_coarsest->coarser_ = coarsest_; │ │ │ │ │ +350 } │ │ │ │ │ +351 ++levels_; │ │ │ │ │ +352 } │ │ │ │ │ +353 │ │ │ │ │ +354 │ │ │ │ │ +355 template │ │ │ │ │ +_3_5_6 void _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_a_d_d_F_i_n_e_r(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +357 { │ │ │ │ │ +358 //TODO: wouldn't it be better to do this in the constructor?' │ │ │ │ │ +359 if(!finest_) { │ │ │ │ │ +360 // we have no levels at all... │ │ │ │ │ +361 assert(!coarsest_); │ │ │ │ │ +362 // allocate into the shared_ptr │ │ │ │ │ +363 originalFinest_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ +364 finest_ = std::allocate_shared(allocator_); │ │ │ │ │ +365 finest_->element = originalFinest_; │ │ │ │ │ +366 coarsest_ = finest_; │ │ │ │ │ +367 }else{ │ │ │ │ │ +368 finest_->finer_ = std::allocate_shared(allocator_); │ │ │ │ │ +369 finest_->finer_->coarser_ = finest_; │ │ │ │ │ +370 finest_ = finest_->finer_; │ │ │ │ │ +371 finest_->element = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_T_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ +372 } │ │ │ │ │ +373 ++levels_; │ │ │ │ │ +374 } │ │ │ │ │ +375 │ │ │ │ │ +376 template │ │ │ │ │ +_3_7_7 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_f_i_n_e_s_t() │ │ │ │ │ +378 { │ │ │ │ │ +379 return _I_t_e_r_a_t_o_r(finest_); │ │ │ │ │ +380 } │ │ │ │ │ +381 │ │ │ │ │ +382 template │ │ │ │ │ +_3_8_3 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_c_o_a_r_s_e_s_t() │ │ │ │ │ +384 { │ │ │ │ │ +385 return _I_t_e_r_a_t_o_r(coarsest_); │ │ │ │ │ +386 } │ │ │ │ │ +387 │ │ │ │ │ +388 template │ │ │ │ │ +_3_8_9 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_f_i_n_e_s_t() const │ │ │ │ │ +390 { │ │ │ │ │ +391 return _C_o_n_s_t_I_t_e_r_a_t_o_r(finest_); │ │ │ │ │ +392 } │ │ │ │ │ +393 │ │ │ │ │ +394 template │ │ │ │ │ +_3_9_5 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_c_o_a_r_s_e_s_t() const │ │ │ │ │ +396 { │ │ │ │ │ +397 return _C_o_n_s_t_I_t_e_r_a_t_o_r(coarsest_); │ │ │ │ │ +398 } │ │ │ │ │ +400 } // namespace Amg │ │ │ │ │ +401} // namespace Dune │ │ │ │ │ +402 │ │ │ │ │ +403#endif │ │ │ │ │ +_c_o_n_s_t_r_u_c_t_i_o_n_._h_h │ │ │ │ │ +Helper classes for the construction of classes without empty constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Hierarchy(const Hierarchy &other) │ │ │ │ │ +Copy constructor (deep copy!). │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d_O_n_C_o_a_r_s_e_s_t │ │ │ │ │ +void addRedistributedOnCoarsest(Arguments &args) │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_l_e_v_e_l_s │ │ │ │ │ +std::size_t levels() const │ │ │ │ │ +Get the number of levels in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_s_t │ │ │ │ │ +ConstIterator coarsest() const │ │ │ │ │ +Get an iterator positioned at the coarsest level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_C_o_a_r_s_e_r │ │ │ │ │ +void addCoarser(Arguments &args) │ │ │ │ │ +Add an element on a coarser level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_F_i_n_e_r │ │ │ │ │ +void addFiner(Arguments &args) │ │ │ │ │ +Add an element on a finer level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:356 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Hierarchy(const std::shared_ptr< MemberType > &first) │ │ │ │ │ +Construct a new hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const void * Arguments │ │ │ │ │ +A type holding all the arguments needed to call the constructor. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ +Construct an object with the specified arguments. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_s_t │ │ │ │ │ +Iterator coarsest() │ │ │ │ │ +Get an iterator positioned at the coarsest level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:383 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_f_i_n_e_s_t │ │ │ │ │ +ConstIterator finest() const │ │ │ │ │ +Get an iterator positioned at the finest level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:389 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_f_i_n_e_s_t │ │ │ │ │ +Iterator finest() │ │ │ │ │ +Get an iterator positioned at the finest level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:377 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ -Error specific to BCRSMatrix. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ -Thrown when the compression buffer used by the implicit BCRSMatrix construction │ │ │ │ │ -is exhausted. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ -Thrown when a solver aborts due to some problem. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ -Error when performing an operation on a matrix block. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r_:_:_c │ │ │ │ │ -int c │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r_:_:_r │ │ │ │ │ -int r │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ +A hierarchy of containers (e.g. matrices or vectors) │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_M_e_m_b_e_r_T_y_p_e │ │ │ │ │ +T MemberType │ │ │ │ │ +The type of the container we store. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< Hierarchy< T, A >, T > Iterator │ │ │ │ │ +Type of the mutable iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< const Hierarchy< T, A >, const T > ConstIterator │ │ │ │ │ +Type of the const iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +ConstructionTraits< T >::Arguments Arguments │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Hierarchy() │ │ │ │ │ +Construct an empty hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator │ │ │ │ │ +The allocator to use for the list elements. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator over the levels in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator(const LevelIterator< typename std::remove_const< C >::type, │ │ │ │ │ +typename std::remove_const< T1 >::type > &other) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:136 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ +void addRedistributed(std::shared_ptr< T1 > t) │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:201 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +T1 & dereference() const │ │ │ │ │ +Dereference the iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const LevelIterator< typename std::remove_const< C >::type, │ │ │ │ │ +typename std::remove_const< T1 >::type > &other) const │ │ │ │ │ +Equality check. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_i_s_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ +bool isRedistributed() const │ │ │ │ │ +Check whether there was a redistribution at the current level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const LevelIterator< const typename std::remove_const< C >::type, │ │ │ │ │ +const typename std::remove_const< T1 >::type > &other) const │ │ │ │ │ +Equality check. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +Move to the next coarser level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator(const LevelIterator< const typename std::remove_const< C >::type, │ │ │ │ │ +const typename std::remove_const< T1 >::type > &other) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_d_e_l_e_t_e_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ +void deleteRedistributed() │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +void decrement() │ │ │ │ │ +Move to the next fine level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator(std::shared_ptr< Element > element) │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_g_e_t_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ +T1 & getRedistributed() const │ │ │ │ │ +Get the redistributed container. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:196 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00059.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixutils.hh File Reference │ │ │ │ +dune-istl: combinedfunctor.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,99 +65,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ +
combinedfunctor.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Some handy generic functions for ISTL matrices. │ │ │ │ -More...

│ │ │ │ -
#include <set>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/dynmatrix.hh>
│ │ │ │ -#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <dune/istl/scaledidmatrix.hh>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ +
#include <tuple>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::CheckIfDiagonalPresent< Matrix, blocklevel, l >
 Check whether the a matrix has diagonal values on blocklevel recursion levels. More...
 
struct  Dune::CheckIfDiagonalPresent< Matrix, 0, l >
 
struct  Dune::CheckIfDiagonalPresent< MultiTypeBlockMatrix< T1, Args... >, blocklevel, l >
 
struct  Dune::MatrixDimension< M >
 
struct  Dune::MatrixDimension< Matrix< B, TA > >
 
struct  Dune::MatrixDimension< BCRSMatrix< B, TA > >
 
struct  Dune::MatrixDimension< BCRSMatrix< FieldMatrix< B, n, m >, TA > >
 
struct  Dune::MatrixDimension< FieldMatrix< K, n, m > >
struct  Dune::Amg::ApplyHelper< i >
 
struct  Dune::MatrixDimension< Dune::DynamicMatrix< T > >
struct  Dune::Amg::ApplyHelper< 0 >
 
struct  Dune::MatrixDimension< Matrix< FieldMatrix< K, n, m >, TA > >
 
struct  Dune::MatrixDimension< DiagonalMatrix< K, n > >
 
struct  Dune::MatrixDimension< ScaledIdentityMatrix< K, n > >
 
struct  Dune::IsMatrix< T >
 Test whether a type is an ISTL Matrix. More...
 
struct  Dune::IsMatrix< DenseMatrix< T > >
 
struct  Dune::IsMatrix< BCRSMatrix< T, A > >
 
struct  Dune::PointerCompare< T >
class  Dune::Amg::CombinedFunctor< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class M >
auto Dune::countNonZeros (const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
 Get the number of nonzero fields in the matrix.
 
template<class M >
auto Dune::countNonZeros (const M &matrix, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
 
template<class M , class C >
void Dune::printGlobalSparseMatrix (const M &mat, C &ooc, std::ostream &os)
 
namespace  Dune::Amg
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Some handy generic functions for ISTL matrices.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,80 +1,25 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -matrixutils.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s │ │ │ │ │ -Some handy generic functions for ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +combinedfunctor.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_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_a_t_r_i_x_,_ _b_l_o_c_k_l_e_v_e_l_,_ _l_ _> │ │ │ │ │ -  Check whether the a matrix has diagonal values on blocklevel recursion │ │ │ │ │ - levels. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_<_ _i_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_a_t_r_i_x_,_ _0_,_ _l_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_<_ _0_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _A_r_g_s_._._._ _>_, │ │ │ │ │ - _b_l_o_c_k_l_e_v_e_l_,_ _l_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_M_a_t_r_i_x_<_ _T_ _> │ │ │ │ │ -  Test whether a type is an _I_S_T_L _M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_M_a_t_r_i_x_<_ _D_e_n_s_e_M_a_t_r_i_x_<_ _T_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e_<_ _T_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s (const M &, typename std::enable_if_t< Dune:: │ │ │ │ │ - IsNumber< M >::value > *sfinae=nullptr) │ │ │ │ │ -  Get the number of nonzero fields in the matrix. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s (const M &matrix, typename std::enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x (const M &_m_a_t, C &ooc, std::ostream &os) │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Some handy generic functions for ISTL matrices. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixutils.hh Source File │ │ │ │ +dune-istl: combinedfunctor.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,721 +70,94 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
matrixutils.hh
│ │ │ │ +
combinedfunctor.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MATRIXUTILS_HH
│ │ │ │ -
6#define DUNE_ISTL_MATRIXUTILS_HH
│ │ │ │ +
5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH
│ │ │ │ +
6#define DUNE_AMG_COMBINEDFUNCTOR_HH
│ │ │ │
7
│ │ │ │ -
8#include <set>
│ │ │ │ -
9#include <vector>
│ │ │ │ -
10#include <limits>
│ │ │ │ -
11#include <dune/common/typetraits.hh>
│ │ │ │ -
12#include <dune/common/fmatrix.hh>
│ │ │ │ -
13#include <dune/common/dynmatrix.hh>
│ │ │ │ -
14#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -
15#include <dune/common/scalarmatrixview.hh>
│ │ │ │ - │ │ │ │ -
17#include "istlexception.hh"
│ │ │ │ -
18
│ │ │ │ -
19namespace Dune
│ │ │ │ -
20{
│ │ │ │ -
21
│ │ │ │ -
22#ifndef DOYXGEN
│ │ │ │ -
23 template<typename B, typename A>
│ │ │ │ -
24 class BCRSMatrix;
│ │ │ │ -
25
│ │ │ │ -
26 template<typename K, int n, int m>
│ │ │ │ - │ │ │ │ -
28
│ │ │ │ -
29 template<class T, class A>
│ │ │ │ -
30 class Matrix;
│ │ │ │ -
31#endif
│ │ │ │ +
8#include <tuple>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune
│ │ │ │ +
11{
│ │ │ │ +
12 namespace Amg
│ │ │ │ +
13 {
│ │ │ │ +
14
│ │ │ │ +
15 template<std::size_t i>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
17 {
│ │ │ │ +
18 template<class TT, class T>
│ │ │ │ +
│ │ │ │ +
19 static void apply(TT tuple, const T& t)
│ │ │ │ +
20 {
│ │ │ │ +
21 std::get<i-1>(tuple) (t);
│ │ │ │ + │ │ │ │ +
23 }
│ │ │ │ +
│ │ │ │ +
24 };
│ │ │ │ +
│ │ │ │ +
25 template<>
│ │ │ │ +
│ │ │ │ +
26 struct ApplyHelper<0>
│ │ │ │ +
27 {
│ │ │ │ +
28 template<class TT, class T>
│ │ │ │ +
│ │ │ │ +
29 static void apply([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t)
│ │ │ │ +
30 {}
│ │ │ │ +
│ │ │ │ +
31 };
│ │ │ │ +
│ │ │ │
32
│ │ │ │ -
46 template<class Matrix, std::size_t blocklevel, std::size_t l=blocklevel>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
48 {
│ │ │ │ -
│ │ │ │ -
53 static void check([[maybe_unused]] const Matrix& mat)
│ │ │ │ -
54 {
│ │ │ │ -
55#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
56 typedef typename Matrix::ConstRowIterator Row;
│ │ │ │ -
57 typedef typename Matrix::ConstColIterator Entry;
│ │ │ │ -
58 for(Row row = mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ -
59 Entry diagonal = row->find(row.index());
│ │ │ │ -
60 if(diagonal==row->end())
│ │ │ │ -
61 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
│ │ │ │ -
62 <<" at block recursion level "<<l-blocklevel);
│ │ │ │ -
63 else{
│ │ │ │ -
64 auto m = Impl::asMatrix(*diagonal);
│ │ │ │ -
65 CheckIfDiagonalPresent<decltype(m),blocklevel-1,l>::check(m);
│ │ │ │ -
66 }
│ │ │ │ -
67 }
│ │ │ │ -
68#endif
│ │ │ │ -
69 }
│ │ │ │ -
│ │ │ │ -
70 };
│ │ │ │ -
│ │ │ │ -
71
│ │ │ │ -
72 template<class Matrix, std::size_t l>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
74 {
│ │ │ │ -
│ │ │ │ -
75 static void check(const Matrix& mat)
│ │ │ │ -
76 {
│ │ │ │ -
77 typedef typename Matrix::ConstRowIterator Row;
│ │ │ │ -
78 for(Row row = mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ -
79 if(row->find(row.index())==row->end())
│ │ │ │ -
80 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
│ │ │ │ -
81 <<" at block recursion level "<<l);
│ │ │ │ -
82 }
│ │ │ │ -
83 }
│ │ │ │ -
│ │ │ │ -
84 };
│ │ │ │ -
│ │ │ │ -
85
│ │ │ │ -
86 template<typename FirstRow, typename... Args>
│ │ │ │ -
87 class MultiTypeBlockMatrix;
│ │ │ │ -
88
│ │ │ │ -
89 template<std::size_t blocklevel, std::size_t l, typename T1, typename... Args>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
91 blocklevel,l>
│ │ │ │ -
92 {
│ │ │ │ -
93 typedef MultiTypeBlockMatrix<T1,Args...> Matrix;
│ │ │ │ -
94
│ │ │ │ -
│ │ │ │ -
99 static void check(const Matrix& /* mat */)
│ │ │ │ -
100 {
│ │ │ │ -
101#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
102 // TODO Implement check
│ │ │ │ -
103#endif
│ │ │ │ -
104 }
│ │ │ │ -
│ │ │ │ -
105 };
│ │ │ │ -
│ │ │ │ -
106
│ │ │ │ -
118 template<class M>
│ │ │ │ -
│ │ │ │ -
119 inline auto countNonZeros(const M&,
│ │ │ │ -
120 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ -
121 {
│ │ │ │ -
122 return 1;
│ │ │ │ -
123 }
│ │ │ │ -
│ │ │ │ -
124
│ │ │ │ -
125 template<class M>
│ │ │ │ -
│ │ │ │ -
126 inline auto countNonZeros(const M& matrix,
│ │ │ │ -
127 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ -
128 {
│ │ │ │ -
129 typename M::size_type nonZeros = 0;
│ │ │ │ -
130 for(auto&& row : matrix)
│ │ │ │ -
131 for(auto&& entry : row)
│ │ │ │ -
132 nonZeros += countNonZeros(entry);
│ │ │ │ -
133 return nonZeros;
│ │ │ │ -
134 }
│ │ │ │ -
│ │ │ │ -
135
│ │ │ │ -
136 /*
│ │ │ │ -
137 template<class M>
│ │ │ │ -
138 struct ProcessOnFieldsOfMatrix
│ │ │ │ -
139 */
│ │ │ │ -
140
│ │ │ │ -
142 namespace
│ │ │ │ -
143 {
│ │ │ │ -
144 struct CompPair {
│ │ │ │ -
145 template<class G,class M>
│ │ │ │ -
146 bool operator()(const std::pair<G,M>& p1, const std::pair<G,M>& p2) const
│ │ │ │ -
147 {
│ │ │ │ -
148 return p1.first<p2.first;
│ │ │ │ -
149 }
│ │ │ │ -
150 };
│ │ │ │ -
151
│ │ │ │ -
152 }
│ │ │ │ -
153 template<class M, class C>
│ │ │ │ -
│ │ │ │ -
154 void printGlobalSparseMatrix(const M& mat, C& ooc, std::ostream& os)
│ │ │ │ -
155 {
│ │ │ │ -
156 typedef typename C::ParallelIndexSet::const_iterator IIter;
│ │ │ │ -
157 typedef typename C::OwnerSet OwnerSet;
│ │ │ │ -
158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ -
159
│ │ │ │ -
160 GlobalIndex gmax=0;
│ │ │ │ -
161
│ │ │ │ -
162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
│ │ │ │ -
163 idx!=eidx; ++idx)
│ │ │ │ -
164 gmax=std::max(gmax,idx->global());
│ │ │ │ -
165
│ │ │ │ -
166 gmax=ooc.communicator().max(gmax);
│ │ │ │ -
167 ooc.buildGlobalLookup();
│ │ │ │ -
168
│ │ │ │ -
169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
│ │ │ │ -
170 idx!=eidx; ++idx) {
│ │ │ │ -
171 if(OwnerSet::contains(idx->local().attribute()))
│ │ │ │ -
172 {
│ │ │ │ -
173 typedef typename M::block_type Block;
│ │ │ │ -
174
│ │ │ │ -
175 std::set<std::pair<GlobalIndex,Block>,CompPair> entries;
│ │ │ │ -
176
│ │ │ │ -
177 // sort rows
│ │ │ │ -
178 typedef typename M::ConstColIterator CIter;
│ │ │ │ -
179 for(CIter c=mat[idx->local()].begin(), cend=mat[idx->local()].end();
│ │ │ │ -
180 c!=cend; ++c) {
│ │ │ │ -
181 const typename C::ParallelIndexSet::IndexPair* pair
│ │ │ │ -
182 =ooc.globalLookup().pair(c.index());
│ │ │ │ -
183 assert(pair);
│ │ │ │ -
184 entries.insert(std::make_pair(pair->global(), *c));
│ │ │ │ -
185 }
│ │ │ │ -
186
│ │ │ │ -
187 //wait until its the rows turn.
│ │ │ │ -
188 GlobalIndex rowidx = idx->global();
│ │ │ │ -
189 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
│ │ │ │ -
190 while(cur!=rowidx)
│ │ │ │ -
191 cur=ooc.communicator().min(rowidx);
│ │ │ │ -
192
│ │ │ │ -
193 // print rows
│ │ │ │ -
194 typedef typename std::set<std::pair<GlobalIndex,Block>,CompPair>::iterator SIter;
│ │ │ │ -
195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)
│ │ │ │ -
196 os<<idx->global()<<" "<<s->first<<" "<<s->second<<std::endl;
│ │ │ │ -
197
│ │ │ │ -
198
│ │ │ │ -
199 }
│ │ │ │ -
200 }
│ │ │ │ -
201
│ │ │ │ -
202 ooc.freeGlobalLookup();
│ │ │ │ -
203 // Wait until everybody is finished
│ │ │ │ -
204 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
│ │ │ │ -
205 while(cur!=ooc.communicator().min(cur)) ;
│ │ │ │ -
206 }
│ │ │ │ -
│ │ │ │ -
207
│ │ │ │ -
208 // Default implementation for scalar types
│ │ │ │ -
209 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
211 {
│ │ │ │ -
212 static_assert(IsNumber<M>::value, "MatrixDimension is not implemented for this type!");
│ │ │ │ -
213
│ │ │ │ -
│ │ │ │ -
214 static auto rowdim(const M& A)
│ │ │ │ -
215 {
│ │ │ │ -
216 return 1;
│ │ │ │ -
217 }
│ │ │ │ -
│ │ │ │ -
218
│ │ │ │ -
│ │ │ │ -
219 static auto coldim(const M& A)
│ │ │ │ -
220 {
│ │ │ │ -
221 return 1;
│ │ │ │ -
222 }
│ │ │ │ -
│ │ │ │ -
223 };
│ │ │ │ -
│ │ │ │ -
224
│ │ │ │ -
225 // Default implementation for scalar types
│ │ │ │ -
226 template<typename B, typename TA>
│ │ │ │ -
│ │ │ │ -
227 struct MatrixDimension<Matrix<B,TA> >
│ │ │ │ -
228 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
231
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
233 {
│ │ │ │ - │ │ │ │ -
235 }
│ │ │ │ -
│ │ │ │ -
236
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
238 {
│ │ │ │ - │ │ │ │ -
240 }
│ │ │ │ -
│ │ │ │ -
241
│ │ │ │ -
│ │ │ │ -
242 static size_type rowdim (const Matrix<B,TA>& A)
│ │ │ │ -
243 {
│ │ │ │ -
244 size_type nn=0;
│ │ │ │ -
245 for (size_type i=0; i<A.N(); i++)
│ │ │ │ -
246 nn += rowdim(A,i);
│ │ │ │ -
247 return nn;
│ │ │ │ -
248 }
│ │ │ │ -
│ │ │ │ -
249
│ │ │ │ -
│ │ │ │ -
250 static size_type coldim (const Matrix<B,TA>& A)
│ │ │ │ -
251 {
│ │ │ │ -
252 size_type nn=0;
│ │ │ │ -
253 for (size_type i=0; i<A.M(); i++)
│ │ │ │ -
254 nn += coldim(A,i);
│ │ │ │ -
255 return nn;
│ │ │ │ -
256 }
│ │ │ │ -
│ │ │ │ -
257 };
│ │ │ │ -
│ │ │ │ -
258
│ │ │ │ -
259
│ │ │ │ -
260 template<typename B, typename TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
262 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
265 typedef typename Matrix::size_type size_type;
│ │ │ │ -
266
│ │ │ │ -
│ │ │ │ -
267 static size_type rowdim (const Matrix& A, size_type i)
│ │ │ │ -
268 {
│ │ │ │ -
269 const B* row = A.r[i].getptr();
│ │ │ │ -
270 if(row)
│ │ │ │ - │ │ │ │ -
272 else
│ │ │ │ -
273 return 0;
│ │ │ │ -
274 }
│ │ │ │ -
│ │ │ │ -
275
│ │ │ │ -
│ │ │ │ -
276 static size_type coldim (const Matrix& A, size_type c)
│ │ │ │ -
277 {
│ │ │ │ -
278 // find an entry in column c
│ │ │ │ -
279 if (A.nnz_ > 0)
│ │ │ │ -
280 {
│ │ │ │ -
281 for (size_type k=0; k<A.nnz_; k++) {
│ │ │ │ -
282 if (A.j_.get()[k] == c) {
│ │ │ │ - │ │ │ │ -
284 }
│ │ │ │ -
285 }
│ │ │ │ -
286 }
│ │ │ │ -
287 else
│ │ │ │ -
288 {
│ │ │ │ -
289 for (size_type i=0; i<A.N(); i++)
│ │ │ │ -
290 {
│ │ │ │ -
291 size_type* j = A.r[i].getindexptr();
│ │ │ │ -
292 B* a = A.r[i].getptr();
│ │ │ │ -
293 for (size_type k=0; k<A.r[i].getsize(); k++)
│ │ │ │ -
294 if (j[k]==c) {
│ │ │ │ - │ │ │ │ -
296 }
│ │ │ │ -
297 }
│ │ │ │ -
298 }
│ │ │ │ -
299
│ │ │ │ -
300 // not found
│ │ │ │ -
301 return 0;
│ │ │ │ -
302 }
│ │ │ │ -
│ │ │ │ -
303
│ │ │ │ -
│ │ │ │ -
304 static size_type rowdim (const Matrix& A){
│ │ │ │ -
305 size_type nn=0;
│ │ │ │ -
306 for (size_type i=0; i<A.N(); i++)
│ │ │ │ -
307 nn += rowdim(A,i);
│ │ │ │ -
308 return nn;
│ │ │ │ -
309 }
│ │ │ │ -
│ │ │ │ -
310
│ │ │ │ -
│ │ │ │ -
311 static size_type coldim (const Matrix& A){
│ │ │ │ -
312 typedef typename Matrix::ConstRowIterator ConstRowIterator;
│ │ │ │ -
313 typedef typename Matrix::ConstColIterator ConstColIterator;
│ │ │ │ -
314
│ │ │ │ -
315 // The following code has a complexity of nnz, and
│ │ │ │ -
316 // typically a very small constant.
│ │ │ │ -
317 //
│ │ │ │ -
318 std::vector<size_type> coldims(A.M(),
│ │ │ │ -
319 std::numeric_limits<size_type>::max());
│ │ │ │ -
320
│ │ │ │ -
321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)
│ │ │ │ -
322 for (ConstColIterator col=row->begin(); col!=row->end(); ++col)
│ │ │ │ -
323 // only compute blocksizes we don't already have
│ │ │ │ -
324 if (coldims[col.index()]==std::numeric_limits<size_type>::max())
│ │ │ │ -
325 coldims[col.index()] = MatrixDimension<block_type>::coldim(*col);
│ │ │ │ -
326
│ │ │ │ -
327 size_type sum = 0;
│ │ │ │ -
328 for (typename std::vector<size_type>::iterator it=coldims.begin();
│ │ │ │ -
329 it!=coldims.end(); ++it)
│ │ │ │ -
330 // skip rows for which no coldim could be determined
│ │ │ │ -
331 if ((*it)>=0)
│ │ │ │ -
332 sum += *it;
│ │ │ │ -
333
│ │ │ │ -
334 return sum;
│ │ │ │ -
335 }
│ │ │ │ -
│ │ │ │ -
336 };
│ │ │ │ -
│ │ │ │ -
337
│ │ │ │ -
338
│ │ │ │ -
339 template<typename B, int n, int m, typename TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
341 {
│ │ │ │ - │ │ │ │ -
343 typedef typename Matrix::size_type size_type;
│ │ │ │ -
344
│ │ │ │ -
│ │ │ │ -
345 static size_type rowdim (const Matrix& /*A*/, size_type /*i*/)
│ │ │ │ -
346 {
│ │ │ │ -
347 return n;
│ │ │ │ -
348 }
│ │ │ │ -
│ │ │ │ -
349
│ │ │ │ -
│ │ │ │ -
350 static size_type coldim (const Matrix& /*A*/, size_type /*c*/)
│ │ │ │ -
351 {
│ │ │ │ -
352 return m;
│ │ │ │ -
353 }
│ │ │ │ -
│ │ │ │ -
354
│ │ │ │ -
│ │ │ │ -
355 static size_type rowdim (const Matrix& A) {
│ │ │ │ -
356 return A.N()*n;
│ │ │ │ -
357 }
│ │ │ │ -
│ │ │ │ -
358
│ │ │ │ -
│ │ │ │ -
359 static size_type coldim (const Matrix& A) {
│ │ │ │ -
360 return A.M()*m;
│ │ │ │ -
361 }
│ │ │ │ -
│ │ │ │ -
362 };
│ │ │ │ -
│ │ │ │ -
363
│ │ │ │ -
364 template<typename K, int n, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
366 {
│ │ │ │ - │ │ │ │ -
368 typedef typename Matrix::size_type size_type;
│ │ │ │ -
369
│ │ │ │ -
│ │ │ │ -
370 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ -
371 {
│ │ │ │ -
372 return 1;
│ │ │ │ -
373 }
│ │ │ │ -
│ │ │ │ -
374
│ │ │ │ -
│ │ │ │ -
375 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ -
376 {
│ │ │ │ -
377 return 1;
│ │ │ │ -
378 }
│ │ │ │ -
│ │ │ │ -
379
│ │ │ │ -
│ │ │ │ -
380 static size_type rowdim(const Matrix& /*A*/)
│ │ │ │ -
381 {
│ │ │ │ -
382 return n;
│ │ │ │ -
383 }
│ │ │ │ -
│ │ │ │ -
384
│ │ │ │ -
│ │ │ │ -
385 static size_type coldim(const Matrix& /*A*/)
│ │ │ │ -
386 {
│ │ │ │ -
387 return m;
│ │ │ │ -
388 }
│ │ │ │ -
│ │ │ │ -
389 };
│ │ │ │ -
│ │ │ │ -
390
│ │ │ │ -
391 template <class T>
│ │ │ │ -
│ │ │ │ -
392 struct MatrixDimension<Dune::DynamicMatrix<T> >
│ │ │ │ -
393 {
│ │ │ │ -
394 typedef Dune::DynamicMatrix<T> MatrixType;
│ │ │ │ -
395 typedef typename MatrixType::size_type size_type;
│ │ │ │ -
396
│ │ │ │ -
│ │ │ │ -
397 static size_type rowdim(const MatrixType& /*A*/, size_type /*r*/)
│ │ │ │ -
398 {
│ │ │ │ -
399 return 1;
│ │ │ │ -
400 }
│ │ │ │ -
│ │ │ │ -
401
│ │ │ │ -
│ │ │ │ -
402 static size_type coldim(const MatrixType& /*A*/, size_type /*r*/)
│ │ │ │ -
403 {
│ │ │ │ -
404 return 1;
│ │ │ │ -
405 }
│ │ │ │ -
│ │ │ │ -
406
│ │ │ │ -
│ │ │ │ -
407 static size_type rowdim(const MatrixType& A)
│ │ │ │ -
408 {
│ │ │ │ -
409 return A.N();
│ │ │ │ -
410 }
│ │ │ │ -
│ │ │ │ -
411
│ │ │ │ -
│ │ │ │ -
412 static size_type coldim(const MatrixType& A)
│ │ │ │ -
413 {
│ │ │ │ -
414 return A.M();
│ │ │ │ -
415 }
│ │ │ │ -
│ │ │ │ -
416 };
│ │ │ │ -
│ │ │ │ -
417
│ │ │ │ -
418 template<typename K, int n, int m, typename TA>
│ │ │ │ -
│ │ │ │ -
419 struct MatrixDimension<Matrix<FieldMatrix<K,n,m>, TA> >
│ │ │ │ -
420 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
423
│ │ │ │ -
│ │ │ │ -
424 static size_type rowdim(const ThisMatrix& /*A*/, size_type /*r*/)
│ │ │ │ -
425 {
│ │ │ │ -
426 return n;
│ │ │ │ -
427 }
│ │ │ │ -
│ │ │ │ -
428
│ │ │ │ -
│ │ │ │ -
429 static size_type coldim(const ThisMatrix& /*A*/, size_type /*r*/)
│ │ │ │ -
430 {
│ │ │ │ -
431 return m;
│ │ │ │ -
432 }
│ │ │ │ -
│ │ │ │ -
433
│ │ │ │ -
│ │ │ │ -
434 static size_type rowdim(const ThisMatrix& A)
│ │ │ │ -
435 {
│ │ │ │ -
436 return A.N()*n;
│ │ │ │ -
437 }
│ │ │ │ -
│ │ │ │ -
438
│ │ │ │ -
│ │ │ │ -
439 static size_type coldim(const ThisMatrix& A)
│ │ │ │ -
440 {
│ │ │ │ -
441 return A.M()*m;
│ │ │ │ -
442 }
│ │ │ │ -
│ │ │ │ -
443 };
│ │ │ │ -
│ │ │ │ -
444
│ │ │ │ -
445 template<typename K, int n>
│ │ │ │ -
│ │ │ │ -
446 struct MatrixDimension<DiagonalMatrix<K,n> >
│ │ │ │ -
447 {
│ │ │ │ -
448 typedef DiagonalMatrix<K,n> Matrix;
│ │ │ │ -
449 typedef typename Matrix::size_type size_type;
│ │ │ │ -
450
│ │ │ │ -
│ │ │ │ -
451 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ -
452 {
│ │ │ │ -
453 return 1;
│ │ │ │ -
454 }
│ │ │ │ -
│ │ │ │ -
455
│ │ │ │ -
│ │ │ │ -
456 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ -
457 {
│ │ │ │ -
458 return 1;
│ │ │ │ -
459 }
│ │ │ │ -
│ │ │ │ -
460
│ │ │ │ -
│ │ │ │ -
461 static size_type rowdim(const Matrix& /*A*/)
│ │ │ │ -
462 {
│ │ │ │ -
463 return n;
│ │ │ │ -
464 }
│ │ │ │ -
│ │ │ │ -
465
│ │ │ │ -
│ │ │ │ -
466 static size_type coldim(const Matrix& /*A*/)
│ │ │ │ -
467 {
│ │ │ │ -
468 return n;
│ │ │ │ -
469 }
│ │ │ │ -
│ │ │ │ -
470 };
│ │ │ │ -
│ │ │ │ -
471
│ │ │ │ -
472 template<typename K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
474 {
│ │ │ │ - │ │ │ │ -
476 typedef typename Matrix::size_type size_type;
│ │ │ │ -
477
│ │ │ │ -
│ │ │ │ -
478 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ -
479 {
│ │ │ │ -
480 return 1;
│ │ │ │ -
481 }
│ │ │ │ -
│ │ │ │ -
482
│ │ │ │ -
│ │ │ │ -
483 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ -
484 {
│ │ │ │ -
485 return 1;
│ │ │ │ -
486 }
│ │ │ │ -
│ │ │ │ -
487
│ │ │ │ -
│ │ │ │ -
488 static size_type rowdim(const Matrix& /*A*/)
│ │ │ │ -
489 {
│ │ │ │ -
490 return n;
│ │ │ │ -
491 }
│ │ │ │ -
│ │ │ │ -
492
│ │ │ │ -
│ │ │ │ -
493 static size_type coldim(const Matrix& /*A*/)
│ │ │ │ -
494 {
│ │ │ │ -
495 return n;
│ │ │ │ -
496 }
│ │ │ │ -
│ │ │ │ -
497 };
│ │ │ │ -
│ │ │ │ -
498
│ │ │ │ -
502 template<typename T>
│ │ │ │ -
│ │ │ │ -
503 struct IsMatrix
│ │ │ │ -
504 {
│ │ │ │ -
505 enum {
│ │ │ │ -
509 value = false
│ │ │ │ -
510 };
│ │ │ │ -
511 };
│ │ │ │ -
│ │ │ │ -
512
│ │ │ │ -
513 template<typename T>
│ │ │ │ -
│ │ │ │ -
514 struct IsMatrix<DenseMatrix<T> >
│ │ │ │ -
515 {
│ │ │ │ -
516 enum {
│ │ │ │ -
520 value = true
│ │ │ │ -
521 };
│ │ │ │ -
522 };
│ │ │ │ -
│ │ │ │ -
523
│ │ │ │ -
524
│ │ │ │ -
525 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ -
526 struct IsMatrix<BCRSMatrix<T,A> >
│ │ │ │ -
527 {
│ │ │ │ -
528 enum {
│ │ │ │ -
532 value = true
│ │ │ │ -
533 };
│ │ │ │ -
534 };
│ │ │ │ -
│ │ │ │ -
535
│ │ │ │ -
536 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
538 {
│ │ │ │ -
│ │ │ │ -
539 bool operator()(const T* l, const T* r)
│ │ │ │ -
540 {
│ │ │ │ -
541 return *l < *r;
│ │ │ │ -
542 }
│ │ │ │ -
│ │ │ │ -
543 };
│ │ │ │ -
│ │ │ │ -
544
│ │ │ │ -
545}
│ │ │ │ -
546#endif
│ │ │ │ - │ │ │ │ -
This file implements a quadratic matrix of fixed size which is a multiple of the identity.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
Get the number of nonzero fields in the matrix.
Definition matrixutils.hh:119
│ │ │ │ +
33 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
35 public T
│ │ │ │ +
36 {
│ │ │ │ +
37 public:
│ │ │ │ +
│ │ │ │ +
38 CombinedFunctor(const T& tuple_)
│ │ │ │ +
39 : T(tuple_)
│ │ │ │ +
40 {}
│ │ │ │ +
│ │ │ │ +
41
│ │ │ │ +
42 template<class T1>
│ │ │ │ +
│ │ │ │ +
43 void operator()(const T1& t)
│ │ │ │ +
44 {
│ │ │ │ + │ │ │ │ +
46 }
│ │ │ │ +
│ │ │ │ +
47 };
│ │ │ │ +
│ │ │ │ +
48
│ │ │ │ +
49
│ │ │ │ +
50 } //namespace Amg
│ │ │ │ +
51} // namespace Dune
│ │ │ │ +
52#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
Definition matrixutils.hh:154
│ │ │ │ -
Definition matrixutils.hh:211
│ │ │ │ -
static auto coldim(const M &A)
Definition matrixutils.hh:219
│ │ │ │ -
static auto rowdim(const M &A)
Definition matrixutils.hh:214
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ -
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition bcrsmatrix.hh:741
│ │ │ │ -
B block_type
export the type representing the components
Definition bcrsmatrix.hh:491
│ │ │ │ -
Iterator access to matrix rows
Definition bcrsmatrix.hh:579
│ │ │ │ -
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ -
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ -
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ -
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ -
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ -
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:48
│ │ │ │ -
static void check(const Matrix &mat)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:53
│ │ │ │ -
static void check(const Matrix &mat)
Definition matrixutils.hh:75
│ │ │ │ -
static void check(const Matrix &)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:99
│ │ │ │ -
MultiTypeBlockMatrix< T1, Args... > Matrix
Definition matrixutils.hh:93
│ │ │ │ -
static size_type rowdim(const Matrix< B, TA > &A, size_type i)
Definition matrixutils.hh:232
│ │ │ │ -
static size_type coldim(const Matrix< B, TA > &A)
Definition matrixutils.hh:250
│ │ │ │ -
static size_type rowdim(const Matrix< B, TA > &A)
Definition matrixutils.hh:242
│ │ │ │ -
typename Matrix< B, TA >::size_type size_type
Definition matrixutils.hh:230
│ │ │ │ -
static size_type coldim(const Matrix< B, TA > &A, size_type c)
Definition matrixutils.hh:237
│ │ │ │ -
typename Matrix< B, TA >::block_type block_type
Definition matrixutils.hh:229
│ │ │ │ -
BCRSMatrix< B, TA > Matrix
Definition matrixutils.hh:263
│ │ │ │ -
static size_type coldim(const Matrix &A)
Definition matrixutils.hh:311
│ │ │ │ -
Matrix::block_type block_type
Definition matrixutils.hh:264
│ │ │ │ -
static size_type coldim(const Matrix &A, size_type c)
Definition matrixutils.hh:276
│ │ │ │ -
Matrix::size_type size_type
Definition matrixutils.hh:265
│ │ │ │ -
static size_type rowdim(const Matrix &A, size_type i)
Definition matrixutils.hh:267
│ │ │ │ -
static size_type rowdim(const Matrix &A)
Definition matrixutils.hh:304
│ │ │ │ -
static size_type coldim(const Matrix &A)
Definition matrixutils.hh:359
│ │ │ │ -
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:345
│ │ │ │ -
static size_type rowdim(const Matrix &A)
Definition matrixutils.hh:355
│ │ │ │ -
Matrix::size_type size_type
Definition matrixutils.hh:343
│ │ │ │ -
BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
Definition matrixutils.hh:342
│ │ │ │ -
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:350
│ │ │ │ -
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:370
│ │ │ │ -
static size_type coldim(const Matrix &)
Definition matrixutils.hh:385
│ │ │ │ -
Matrix::size_type size_type
Definition matrixutils.hh:368
│ │ │ │ -
FieldMatrix< K, n, m > Matrix
Definition matrixutils.hh:367
│ │ │ │ -
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:375
│ │ │ │ -
static size_type rowdim(const Matrix &)
Definition matrixutils.hh:380
│ │ │ │ -
static size_type coldim(const MatrixType &A)
Definition matrixutils.hh:412
│ │ │ │ -
static size_type rowdim(const MatrixType &A)
Definition matrixutils.hh:407
│ │ │ │ -
static size_type rowdim(const MatrixType &, size_type)
Definition matrixutils.hh:397
│ │ │ │ -
MatrixType::size_type size_type
Definition matrixutils.hh:395
│ │ │ │ -
static size_type coldim(const MatrixType &, size_type)
Definition matrixutils.hh:402
│ │ │ │ -
Dune::DynamicMatrix< T > MatrixType
Definition matrixutils.hh:394
│ │ │ │ -
static size_type coldim(const ThisMatrix &A)
Definition matrixutils.hh:439
│ │ │ │ -
static size_type rowdim(const ThisMatrix &A)
Definition matrixutils.hh:434
│ │ │ │ -
Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
Definition matrixutils.hh:421
│ │ │ │ -
static size_type coldim(const ThisMatrix &, size_type)
Definition matrixutils.hh:429
│ │ │ │ -
static size_type rowdim(const ThisMatrix &, size_type)
Definition matrixutils.hh:424
│ │ │ │ -
ThisMatrix::size_type size_type
Definition matrixutils.hh:422
│ │ │ │ -
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:456
│ │ │ │ -
Matrix::size_type size_type
Definition matrixutils.hh:449
│ │ │ │ -
static size_type coldim(const Matrix &)
Definition matrixutils.hh:466
│ │ │ │ -
static size_type rowdim(const Matrix &)
Definition matrixutils.hh:461
│ │ │ │ -
DiagonalMatrix< K, n > Matrix
Definition matrixutils.hh:448
│ │ │ │ -
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:451
│ │ │ │ -
static size_type coldim(const Matrix &)
Definition matrixutils.hh:493
│ │ │ │ -
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:478
│ │ │ │ -
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:483
│ │ │ │ -
Matrix::size_type size_type
Definition matrixutils.hh:476
│ │ │ │ -
ScaledIdentityMatrix< K, n > Matrix
Definition matrixutils.hh:475
│ │ │ │ -
static size_type rowdim(const Matrix &)
Definition matrixutils.hh:488
│ │ │ │ -
Test whether a type is an ISTL Matrix.
Definition matrixutils.hh:504
│ │ │ │ -
@ value
True if T is an ISTL matrix.
Definition matrixutils.hh:509
│ │ │ │ -
Definition matrixutils.hh:538
│ │ │ │ -
bool operator()(const T *l, const T *r)
Definition matrixutils.hh:539
│ │ │ │ -
A multiple of the identity matrix of static size.
Definition scaledidmatrix.hh:30
│ │ │ │ -
std::size_t size_type
The type used for the index access and size operations.
Definition scaledidmatrix.hh:43
│ │ │ │ +
Definition combinedfunctor.hh:17
│ │ │ │ +
static void apply(TT tuple, const T &t)
Definition combinedfunctor.hh:19
│ │ │ │ +
static void apply(TT tuple, const T &t)
Definition combinedfunctor.hh:29
│ │ │ │ +
Definition combinedfunctor.hh:36
│ │ │ │ +
CombinedFunctor(const T &tuple_)
Definition combinedfunctor.hh:38
│ │ │ │ +
void operator()(const T1 &t)
Definition combinedfunctor.hh:43
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,782 +1,82 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -matrixutils.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +combinedfunctor.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MATRIXUTILS_HH │ │ │ │ │ -6#define DUNE_ISTL_MATRIXUTILS_HH │ │ │ │ │ +5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH │ │ │ │ │ +6#define DUNE_AMG_COMBINEDFUNCTOR_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ -17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -18 │ │ │ │ │ -19namespace _D_u_n_e │ │ │ │ │ -20{ │ │ │ │ │ -21 │ │ │ │ │ -22#ifndef DOYXGEN │ │ │ │ │ -23 template │ │ │ │ │ -24 class BCRSMatrix; │ │ │ │ │ -25 │ │ │ │ │ -26 template │ │ │ │ │ -_2_7 class _F_i_e_l_d_M_a_t_r_i_x; │ │ │ │ │ -28 │ │ │ │ │ -29 template │ │ │ │ │ -30 class _M_a_t_r_i_x; │ │ │ │ │ -31#endif │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e │ │ │ │ │ +11{ │ │ │ │ │ +12 namespace Amg │ │ │ │ │ +13 { │ │ │ │ │ +14 │ │ │ │ │ +15 template │ │ │ │ │ +_1_6 struct _A_p_p_l_y_H_e_l_p_e_r │ │ │ │ │ +17 { │ │ │ │ │ +18 template │ │ │ │ │ +_1_9 static void _a_p_p_l_y(TT tuple, const T& t) │ │ │ │ │ +20 { │ │ │ │ │ +21 std::get(tuple) (t); │ │ │ │ │ +22 _A_p_p_l_y_H_e_l_p_e_r_<_i_-_1_>_:_:_a_p_p_l_y(tuple, t); │ │ │ │ │ +23 } │ │ │ │ │ +24 }; │ │ │ │ │ +25 template<> │ │ │ │ │ +_2_6 struct _A_p_p_l_y_H_e_l_p_e_r<0> │ │ │ │ │ +27 { │ │ │ │ │ +28 template │ │ │ │ │ +_2_9 static void _a_p_p_l_y([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t) │ │ │ │ │ +30 {} │ │ │ │ │ +31 }; │ │ │ │ │ 32 │ │ │ │ │ -46 template │ │ │ │ │ -_4_7 struct _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t │ │ │ │ │ -48 { │ │ │ │ │ -_5_3 static void _c_h_e_c_k([[maybe_unused]] const _M_a_t_r_i_x& _m_a_t) │ │ │ │ │ -54 { │ │ │ │ │ -55#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -56 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r Row; │ │ │ │ │ -57 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r Entry; │ │ │ │ │ -58 for(Row row = _m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ -59 Entry diagonal = row->find(row.index()); │ │ │ │ │ -60 if(diagonal==row->end()) │ │ │ │ │ -61 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Missing diagonal value in row "<_:_:_c_h_e_c_k(m); │ │ │ │ │ -66 } │ │ │ │ │ -67 } │ │ │ │ │ -68#endif │ │ │ │ │ -69 } │ │ │ │ │ -70 }; │ │ │ │ │ -71 │ │ │ │ │ -72 template │ │ │ │ │ -_7_3 struct _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t<_M_a_t_r_i_x,0,l> │ │ │ │ │ -74 { │ │ │ │ │ -_7_5 static void _c_h_e_c_k(const _M_a_t_r_i_x& _m_a_t) │ │ │ │ │ -76 { │ │ │ │ │ -77 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r Row; │ │ │ │ │ -78 for(Row row = _m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ -79 if(row->find(row.index())==row->end()) │ │ │ │ │ -80 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Missing diagonal value in row "< │ │ │ │ │ -87 class MultiTypeBlockMatrix; │ │ │ │ │ -88 │ │ │ │ │ -89 template │ │ │ │ │ -_9_0 struct _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t<_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x, │ │ │ │ │ -91 blocklevel,l> │ │ │ │ │ -92 { │ │ │ │ │ -_9_3 typedef _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x _M_a_t_r_i_x; │ │ │ │ │ -94 │ │ │ │ │ -_9_9 static void _c_h_e_c_k(const _M_a_t_r_i_x& /* mat */) │ │ │ │ │ -100 { │ │ │ │ │ -101#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -102 // TODO Implement check │ │ │ │ │ -103#endif │ │ │ │ │ -104 } │ │ │ │ │ -105 }; │ │ │ │ │ -106 │ │ │ │ │ -118 template │ │ │ │ │ -_1_1_9 inline auto _c_o_u_n_t_N_o_n_Z_e_r_o_s(const M&, │ │ │ │ │ -120 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ -sfinae = nullptr) │ │ │ │ │ -121 { │ │ │ │ │ -122 return 1; │ │ │ │ │ -123 } │ │ │ │ │ -124 │ │ │ │ │ -125 template │ │ │ │ │ -_1_2_6 inline auto _c_o_u_n_t_N_o_n_Z_e_r_o_s(const M& matrix, │ │ │ │ │ -127 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ -sfinae = nullptr) │ │ │ │ │ -128 { │ │ │ │ │ -129 typename M::size_type nonZeros = 0; │ │ │ │ │ -130 for(auto&& row : matrix) │ │ │ │ │ -131 for(auto&& entry : row) │ │ │ │ │ -132 nonZeros += _c_o_u_n_t_N_o_n_Z_e_r_o_s(entry); │ │ │ │ │ -133 return nonZeros; │ │ │ │ │ -134 } │ │ │ │ │ -135 │ │ │ │ │ -136 /* │ │ │ │ │ -137 template │ │ │ │ │ -138 struct ProcessOnFieldsOfMatrix │ │ │ │ │ -139 */ │ │ │ │ │ -140 │ │ │ │ │ -142 namespace │ │ │ │ │ -143 { │ │ │ │ │ -144 struct CompPair { │ │ │ │ │ -145 template │ │ │ │ │ -146 bool operator()(const std::pair& p1, const std::pair& p2) const │ │ │ │ │ -147 { │ │ │ │ │ -148 return p1.first │ │ │ │ │ -_1_5_4 void _p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x(const M& _m_a_t, C& ooc, std::ostream& os) │ │ │ │ │ -155 { │ │ │ │ │ -156 typedef typename C::ParallelIndexSet::const_iterator IIter; │ │ │ │ │ -157 typedef typename C::OwnerSet OwnerSet; │ │ │ │ │ -158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex; │ │ │ │ │ -159 │ │ │ │ │ -160 GlobalIndex gmax=0; │ │ │ │ │ -161 │ │ │ │ │ -162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end(); │ │ │ │ │ -163 idx!=eidx; ++idx) │ │ │ │ │ -164 gmax=std::max(gmax,idx->global()); │ │ │ │ │ -165 │ │ │ │ │ -166 gmax=ooc.communicator().max(gmax); │ │ │ │ │ -167 ooc.buildGlobalLookup(); │ │ │ │ │ -168 │ │ │ │ │ -169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end(); │ │ │ │ │ -170 idx!=eidx; ++idx) { │ │ │ │ │ -171 if(OwnerSet::contains(idx->local().attribute())) │ │ │ │ │ -172 { │ │ │ │ │ -173 typedef typename M::block_type Block; │ │ │ │ │ -174 │ │ │ │ │ -175 std::set,CompPair> entries; │ │ │ │ │ -176 │ │ │ │ │ -177 // sort rows │ │ │ │ │ -178 typedef typename M::ConstColIterator CIter; │ │ │ │ │ -179 for(CIter c=_m_a_t[idx->local()]._b_e_g_i_n(), cend=_m_a_t[idx->local()]._e_n_d(); │ │ │ │ │ -180 c!=cend; ++c) { │ │ │ │ │ -181 const typename C::ParallelIndexSet::IndexPair* pair │ │ │ │ │ -182 =ooc.globalLookup().pair(c.index()); │ │ │ │ │ -183 assert(pair); │ │ │ │ │ -184 entries.insert(std::make_pair(pair->global(), *c)); │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -187 //wait until its the rows turn. │ │ │ │ │ -188 GlobalIndex rowidx = idx->global(); │ │ │ │ │ -189 GlobalIndex cur=std::numeric_limits::max(); │ │ │ │ │ -190 while(cur!=rowidx) │ │ │ │ │ -191 cur=ooc.communicator().min(rowidx); │ │ │ │ │ -192 │ │ │ │ │ -193 // print rows │ │ │ │ │ -194 typedef typename std::set,CompPair>::iterator │ │ │ │ │ -SIter; │ │ │ │ │ -195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s) │ │ │ │ │ -196 os<global()<<" "<first<<" "<second<::max(); │ │ │ │ │ -205 while(cur!=ooc.communicator().min(cur)) ; │ │ │ │ │ -206 } │ │ │ │ │ -207 │ │ │ │ │ -208 // Default implementation for scalar types │ │ │ │ │ -209 template │ │ │ │ │ -_2_1_0 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -211 { │ │ │ │ │ -212 static_assert(IsNumber::value, "MatrixDimension is not implemented for │ │ │ │ │ -this type!"); │ │ │ │ │ -213 │ │ │ │ │ -_2_1_4 static auto _r_o_w_d_i_m(const M& A) │ │ │ │ │ -215 { │ │ │ │ │ -216 return 1; │ │ │ │ │ -217 } │ │ │ │ │ -218 │ │ │ │ │ -_2_1_9 static auto _c_o_l_d_i_m(const M& A) │ │ │ │ │ -220 { │ │ │ │ │ -221 return 1; │ │ │ │ │ -222 } │ │ │ │ │ -223 }; │ │ │ │ │ -224 │ │ │ │ │ -225 // Default implementation for scalar types │ │ │ │ │ -226 template │ │ │ │ │ -_2_2_7 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_M_a_t_r_i_x > │ │ │ │ │ -228 { │ │ │ │ │ -_2_2_9 using _b_l_o_c_k___t_y_p_e = typename _M_a_t_r_i_x_<_B_,_T_A_>_:_:_b_l_o_c_k___t_y_p_e; │ │ │ │ │ -_2_3_0 using _s_i_z_e___t_y_p_e = typename _M_a_t_r_i_x_<_B_,_T_A_>_:_:_s_i_z_e___t_y_p_e; │ │ │ │ │ -231 │ │ │ │ │ -_2_3_2 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x_<_B_,_T_A_>& A, _s_i_z_e___t_y_p_e i) │ │ │ │ │ -233 { │ │ │ │ │ -234 return _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_r_o_w_d_i_m(A[i][0]); │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -_2_3_7 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x_<_B_,_T_A_>& A, _s_i_z_e___t_y_p_e c) │ │ │ │ │ -238 { │ │ │ │ │ -239 return _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_c_o_l_d_i_m(A[0][c]); │ │ │ │ │ -240 } │ │ │ │ │ -241 │ │ │ │ │ -_2_4_2 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x_<_B_,_T_A_>& A) │ │ │ │ │ -243 { │ │ │ │ │ -244 _s_i_z_e___t_y_p_e nn=0; │ │ │ │ │ -245 for (_s_i_z_e___t_y_p_e i=0; i& A) │ │ │ │ │ -251 { │ │ │ │ │ -252 _s_i_z_e___t_y_p_e nn=0; │ │ │ │ │ -253 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_2_6_1 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -262 { │ │ │ │ │ -_2_6_3 typedef _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> _M_a_t_r_i_x; │ │ │ │ │ -_2_6_4 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -_2_6_5 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -266 │ │ │ │ │ -_2_6_7 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& A, _s_i_z_e___t_y_p_e i) │ │ │ │ │ -268 { │ │ │ │ │ -269 const B* row = A.r[i].getptr(); │ │ │ │ │ -270 if(row) │ │ │ │ │ -271 return _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_r_o_w_d_i_m(*row); │ │ │ │ │ -272 else │ │ │ │ │ -273 return 0; │ │ │ │ │ -274 } │ │ │ │ │ -275 │ │ │ │ │ -_2_7_6 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x& A, _s_i_z_e___t_y_p_e c) │ │ │ │ │ -277 { │ │ │ │ │ -278 // find an entry in column c │ │ │ │ │ -279 if (A.nnz_ > 0) │ │ │ │ │ -280 { │ │ │ │ │ -281 for (_s_i_z_e___t_y_p_e k=0; k_:_:_c_o_l_d_i_m(A.a[k]); │ │ │ │ │ -284 } │ │ │ │ │ -285 } │ │ │ │ │ -286 } │ │ │ │ │ -287 else │ │ │ │ │ -288 { │ │ │ │ │ -289 for (_s_i_z_e___t_y_p_e i=0; i_:_:_c_o_l_d_i_m(a[k]); │ │ │ │ │ -296 } │ │ │ │ │ -297 } │ │ │ │ │ -298 } │ │ │ │ │ -299 │ │ │ │ │ -300 // not found │ │ │ │ │ -301 return 0; │ │ │ │ │ -302 } │ │ │ │ │ -303 │ │ │ │ │ -_3_0_4 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& A){ │ │ │ │ │ -305 _s_i_z_e___t_y_p_e nn=0; │ │ │ │ │ -306 for (_s_i_z_e___t_y_p_e i=0; i coldims(A.M(), │ │ │ │ │ -319 std::numeric_limits::max()); │ │ │ │ │ -320 │ │ │ │ │ -321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row) │ │ │ │ │ -322 for (ConstColIterator _c_o_l=row->begin(); _c_o_l!=row->end(); ++_c_o_l) │ │ │ │ │ -323 // only compute blocksizes we don't already have │ │ │ │ │ -324 if (coldims[_c_o_l.index()]==std::numeric_limits::max()) │ │ │ │ │ -325 coldims[_c_o_l.index()] = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_c_o_l_d_i_m(*_c_o_l); │ │ │ │ │ -326 │ │ │ │ │ -327 _s_i_z_e___t_y_p_e sum = 0; │ │ │ │ │ -328 for (typename std::vector::iterator it=coldims.begin(); │ │ │ │ │ -329 it!=coldims.end(); ++it) │ │ │ │ │ -330 // skip rows for which no coldim could be determined │ │ │ │ │ -331 if ((*it)>=0) │ │ │ │ │ -332 sum += *it; │ │ │ │ │ -333 │ │ │ │ │ -334 return sum; │ │ │ │ │ -335 } │ │ │ │ │ -336 }; │ │ │ │ │ -337 │ │ │ │ │ -338 │ │ │ │ │ -339 template │ │ │ │ │ -_3_4_0 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x ,TA> > │ │ │ │ │ -341 { │ │ │ │ │ -_3_4_2 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_B_,_n_,_m_> ,TA> _M_a_t_r_i_x; │ │ │ │ │ -_3_4_3 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -344 │ │ │ │ │ -_3_4_5 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*i*/) │ │ │ │ │ -346 { │ │ │ │ │ -347 return n; │ │ │ │ │ -348 } │ │ │ │ │ -349 │ │ │ │ │ -_3_5_0 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*c*/) │ │ │ │ │ -351 { │ │ │ │ │ -352 return m; │ │ │ │ │ -353 } │ │ │ │ │ -354 │ │ │ │ │ -_3_5_5 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& A) { │ │ │ │ │ -356 return A.N()*n; │ │ │ │ │ -357 } │ │ │ │ │ -358 │ │ │ │ │ -_3_5_9 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x& A) { │ │ │ │ │ -360 return A.M()*m; │ │ │ │ │ -361 } │ │ │ │ │ -362 }; │ │ │ │ │ -363 │ │ │ │ │ -364 template │ │ │ │ │ -_3_6_5 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -366 { │ │ │ │ │ -_3_6_7 typedef _F_i_e_l_d_M_a_t_r_i_x_<_K_,_n_,_m_> _M_a_t_r_i_x; │ │ │ │ │ -_3_6_8 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -369 │ │ │ │ │ -_3_7_0 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -371 { │ │ │ │ │ -372 return 1; │ │ │ │ │ -373 } │ │ │ │ │ -374 │ │ │ │ │ -_3_7_5 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -376 { │ │ │ │ │ -377 return 1; │ │ │ │ │ -378 } │ │ │ │ │ -379 │ │ │ │ │ -_3_8_0 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ -381 { │ │ │ │ │ -382 return n; │ │ │ │ │ -383 } │ │ │ │ │ -384 │ │ │ │ │ -_3_8_5 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ -386 { │ │ │ │ │ -387 return m; │ │ │ │ │ -388 } │ │ │ │ │ -389 }; │ │ │ │ │ -390 │ │ │ │ │ -391 template │ │ │ │ │ -_3_9_2 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_D_u_n_e::DynamicMatrix > │ │ │ │ │ -393 { │ │ │ │ │ -_3_9_4 typedef Dune::DynamicMatrix _M_a_t_r_i_x_T_y_p_e; │ │ │ │ │ -_3_9_5 typedef typename MatrixType::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -396 │ │ │ │ │ -_3_9_7 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x_T_y_p_e& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -398 { │ │ │ │ │ -399 return 1; │ │ │ │ │ -400 } │ │ │ │ │ -401 │ │ │ │ │ -_4_0_2 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x_T_y_p_e& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -403 { │ │ │ │ │ -404 return 1; │ │ │ │ │ -405 } │ │ │ │ │ -406 │ │ │ │ │ -_4_0_7 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x_T_y_p_e& A) │ │ │ │ │ -408 { │ │ │ │ │ -409 return A.N(); │ │ │ │ │ -410 } │ │ │ │ │ -411 │ │ │ │ │ -_4_1_2 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x_T_y_p_e& A) │ │ │ │ │ -413 { │ │ │ │ │ -414 return A.M(); │ │ │ │ │ -415 } │ │ │ │ │ -416 }; │ │ │ │ │ -417 │ │ │ │ │ -418 template │ │ │ │ │ -_4_1_9 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x, TA> > │ │ │ │ │ -420 { │ │ │ │ │ -_4_2_1 typedef _M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_K_,_n_,_m_>, TA> _T_h_i_s_M_a_t_r_i_x; │ │ │ │ │ -_4_2_2 typedef typename _T_h_i_s_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -423 │ │ │ │ │ -_4_2_4 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _T_h_i_s_M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -425 { │ │ │ │ │ -426 return n; │ │ │ │ │ -427 } │ │ │ │ │ -428 │ │ │ │ │ -_4_2_9 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _T_h_i_s_M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -430 { │ │ │ │ │ -431 return m; │ │ │ │ │ -432 } │ │ │ │ │ -433 │ │ │ │ │ -_4_3_4 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _T_h_i_s_M_a_t_r_i_x& A) │ │ │ │ │ -435 { │ │ │ │ │ -436 return A.N()*n; │ │ │ │ │ -437 } │ │ │ │ │ -438 │ │ │ │ │ -_4_3_9 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _T_h_i_s_M_a_t_r_i_x& A) │ │ │ │ │ -440 { │ │ │ │ │ -441 return A.M()*m; │ │ │ │ │ -442 } │ │ │ │ │ -443 }; │ │ │ │ │ -444 │ │ │ │ │ -445 template │ │ │ │ │ -_4_4_6 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n > │ │ │ │ │ -447 { │ │ │ │ │ -_4_4_8 typedef DiagonalMatrix _M_a_t_r_i_x; │ │ │ │ │ -_4_4_9 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -450 │ │ │ │ │ -_4_5_1 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -452 { │ │ │ │ │ -453 return 1; │ │ │ │ │ -454 } │ │ │ │ │ -455 │ │ │ │ │ -_4_5_6 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -457 { │ │ │ │ │ -458 return 1; │ │ │ │ │ -459 } │ │ │ │ │ -460 │ │ │ │ │ -_4_6_1 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ -462 { │ │ │ │ │ -463 return n; │ │ │ │ │ -464 } │ │ │ │ │ -465 │ │ │ │ │ -_4_6_6 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ -467 { │ │ │ │ │ -468 return n; │ │ │ │ │ -469 } │ │ │ │ │ -470 }; │ │ │ │ │ -471 │ │ │ │ │ -472 template │ │ │ │ │ -_4_7_3 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x > │ │ │ │ │ -474 { │ │ │ │ │ -_4_7_5 typedef _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_n_> _M_a_t_r_i_x; │ │ │ │ │ -_4_7_6 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -477 │ │ │ │ │ -_4_7_8 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -479 { │ │ │ │ │ -480 return 1; │ │ │ │ │ -481 } │ │ │ │ │ -482 │ │ │ │ │ -_4_8_3 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ -484 { │ │ │ │ │ -485 return 1; │ │ │ │ │ -486 } │ │ │ │ │ -487 │ │ │ │ │ -_4_8_8 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ -489 { │ │ │ │ │ -490 return n; │ │ │ │ │ -491 } │ │ │ │ │ -492 │ │ │ │ │ -_4_9_3 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ -494 { │ │ │ │ │ -495 return n; │ │ │ │ │ -496 } │ │ │ │ │ -497 }; │ │ │ │ │ -498 │ │ │ │ │ -502 template │ │ │ │ │ -_5_0_3 struct _I_s_M_a_t_r_i_x │ │ │ │ │ -504 { │ │ │ │ │ -505 enum { │ │ │ │ │ -509 _v_a_l_u_e = false │ │ │ │ │ -_5_1_0 }; │ │ │ │ │ -511 }; │ │ │ │ │ -512 │ │ │ │ │ -513 template │ │ │ │ │ -_5_1_4 struct _I_s_M_a_t_r_i_x > │ │ │ │ │ -515 { │ │ │ │ │ -516 enum { │ │ │ │ │ -520 _v_a_l_u_e = true │ │ │ │ │ -_5_2_1 }; │ │ │ │ │ -522 }; │ │ │ │ │ -523 │ │ │ │ │ -524 │ │ │ │ │ -525 template │ │ │ │ │ -_5_2_6 struct _I_s_M_a_t_r_i_x<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -527 { │ │ │ │ │ -528 enum { │ │ │ │ │ -532 _v_a_l_u_e = true │ │ │ │ │ -_5_3_3 }; │ │ │ │ │ -534 }; │ │ │ │ │ -535 │ │ │ │ │ -536 template │ │ │ │ │ -_5_3_7 struct _P_o_i_n_t_e_r_C_o_m_p_a_r_e │ │ │ │ │ -538 { │ │ │ │ │ -_5_3_9 bool _o_p_e_r_a_t_o_r_(_)(const T* l, const T* r) │ │ │ │ │ -540 { │ │ │ │ │ -541 return *l < *r; │ │ │ │ │ -542 } │ │ │ │ │ -543 }; │ │ │ │ │ -544 │ │ │ │ │ -545} │ │ │ │ │ -546#endif │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h │ │ │ │ │ -This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ -the identity. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s │ │ │ │ │ -auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ -value > *sfinae=nullptr) │ │ │ │ │ -Get the number of nonzero fields in the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:119 │ │ │ │ │ +33 template │ │ │ │ │ +_3_4 class _C_o_m_b_i_n_e_d_F_u_n_c_t_o_r : │ │ │ │ │ +35 public T │ │ │ │ │ +36 { │ │ │ │ │ +37 public: │ │ │ │ │ +_3_8 _C_o_m_b_i_n_e_d_F_u_n_c_t_o_r(const T& tuple_) │ │ │ │ │ +39 : T(tuple_) │ │ │ │ │ +40 {} │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 void _o_p_e_r_a_t_o_r_(_)(const T1& t) │ │ │ │ │ +44 { │ │ │ │ │ +45 _A_p_p_l_y_H_e_l_p_e_r_<_s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_T_>_:_:_v_a_l_u_e>::apply(*this, t); │ │ │ │ │ +46 } │ │ │ │ │ +47 }; │ │ │ │ │ +48 │ │ │ │ │ +49 │ │ │ │ │ +50 } //namespace Amg │ │ │ │ │ +51} // namespace Dune │ │ │ │ │ +52#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x │ │ │ │ │ -void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_c_o_l_d_i_m │ │ │ │ │ -static auto coldim(const M &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_r_o_w_d_i_m │ │ │ │ │ -static auto rowdim(const M &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access and the size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::ConstIterator ConstColIterator │ │ │ │ │ -Const iterator to the entries of a row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:741 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -B block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:491 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator access to matrix rows │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:579 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ -A Matrix class to support different block types. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -Type for indices and sizes. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -RowIterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -RowIterator begin() │ │ │ │ │ -Get iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::const_iterator ConstColIterator │ │ │ │ │ -Const iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -T block_type │ │ │ │ │ -Export the type representing the components. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t │ │ │ │ │ -Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_:_:_c_h_e_c_k │ │ │ │ │ -static void check(const Matrix &mat) │ │ │ │ │ -Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_a_t_r_i_x_,_ _0_,_ _l_ _>_:_:_c_h_e_c_k │ │ │ │ │ -static void check(const Matrix &mat) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _A_r_g_s_._._._ _>_,_ _b_l_o_c_k_l_e_v_e_l_, │ │ │ │ │ -_l_ _>_:_:_c_h_e_c_k │ │ │ │ │ -static void check(const Matrix &) │ │ │ │ │ -Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _A_r_g_s_._._._ _>_,_ _b_l_o_c_k_l_e_v_e_l_, │ │ │ │ │ -_l_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -MultiTypeBlockMatrix< T1, Args... > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix< B, TA > &A, size_type i) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix< B, TA > &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:250 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix< B, TA > &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:242 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -typename Matrix< B, TA >::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix< B, TA > &A, size_type c) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:237 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -typename Matrix< B, TA >::block_type block_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< B, TA > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -Matrix::block_type block_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:264 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &A, size_type c) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:265 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &A, size_type i) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:267 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:345 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:343 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:342 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:370 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:385 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:368 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -FieldMatrix< K, n, m > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:367 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:375 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:380 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const MatrixType &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:412 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const MatrixType &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:407 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const MatrixType &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:397 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -MatrixType::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const MatrixType &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:402 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_M_a_t_r_i_x_T_y_p_e │ │ │ │ │ -Dune::DynamicMatrix< T > MatrixType │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:394 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const ThisMatrix &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:439 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const ThisMatrix &A) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:434 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_T_h_i_s_M_a_t_r_i_x │ │ │ │ │ -Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:421 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const ThisMatrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:429 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const ThisMatrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:424 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -ThisMatrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:422 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:456 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -DiagonalMatrix< K, n > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:448 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:451 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:478 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ -static size_type coldim(const Matrix &, size_type) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:483 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:476 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -ScaledIdentityMatrix< K, n > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:475 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ -static size_type rowdim(const Matrix &) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_I_s_M_a_t_r_i_x │ │ │ │ │ -Test whether a type is an ISTL Matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_I_s_M_a_t_r_i_x_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -True if T is an ISTL matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:509 │ │ │ │ │ -_D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:538 │ │ │ │ │ -_D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -bool operator()(const T *l, const T *r) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ -A multiple of the identity matrix of static size. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for the index access and size operations. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r │ │ │ │ │ +DDeeffiinniittiioonn combinedfunctor.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(TT tuple, const T &t) │ │ │ │ │ +DDeeffiinniittiioonn combinedfunctor.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_<_ _0_ _>_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(TT tuple, const T &t) │ │ │ │ │ +DDeeffiinniittiioonn combinedfunctor.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn combinedfunctor.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r │ │ │ │ │ +CombinedFunctor(const T &tuple_) │ │ │ │ │ +DDeeffiinniittiioonn combinedfunctor.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const T1 &t) │ │ │ │ │ +DDeeffiinniittiioonn combinedfunctor.hh:43 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00062.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: cholmod.hh File Reference │ │ │ │ +dune-istl: globalaggregates.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,23 +65,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
cholmod.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ +

Provdes class for identifying aggregates globally. │ │ │ │ +More...

│ │ │ │ +
#include "aggregates.hh"
│ │ │ │ +#include "pinfo.hh"
│ │ │ │ +#include <dune/common/parallel/indexset.hh>
│ │ │ │ +
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::Amg::GlobalAggregatesMap< T, TI >
 
class  Dune::Amg::GlobalAggregatesMap< T, TI >::Proxy
 
struct  Dune::Amg::AggregatesGatherScatter< T, TI >
 
struct  Dune::Amg::AggregatesPublisher< T, O, I >
 
struct  Dune::Amg::AggregatesPublisher< T, O, OwnerOverlapCopyCommunication< T1, T2 > >
 Utility class for publishing the aggregate number of the DOFs in the overlap to other processors and convert them to local indices. More...
 
struct  Dune::Amg::AggregatesPublisher< T, O, SequentialInformation >
 
struct  Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > >
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

Provdes class for identifying aggregates globally.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,10 +1,45 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -cholmod.hh File Reference │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +globalaggregates.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Provdes class for identifying aggregates globally. _M_o_r_e_._._. │ │ │ │ │ +#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +#include "_p_i_n_f_o_._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 │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_:_:_P_r_o_x_y │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_,_ _T_I_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _I_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_< │ │ │ │ │ + _T_1_,_ _T_2_ _>_ _> │ │ │ │ │ +  Utility class for publishing the aggregate number of the DOFs in the │ │ │ │ │ + overlap to other processors and convert them to local indices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provdes class for identifying aggregates globally. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: cholmod.hh Source File │ │ │ │ +dune-istl: globalaggregates.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,382 +70,343 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
cholmod.hh
│ │ │ │ +
globalaggregates.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#pragma once
│ │ │ │ -
4
│ │ │ │ -
5#if HAVE_SUITESPARSE_CHOLMOD
│ │ │ │ -
6
│ │ │ │ -
7#include <dune/common/fmatrix.hh>
│ │ │ │ -
8#include <dune/common/fvector.hh>
│ │ │ │ - │ │ │ │ -
10#include <dune/istl/bvector.hh>
│ │ │ │ -
11#include<dune/istl/solver.hh>
│ │ │ │ - │ │ │ │ -
13#include <dune/istl/foreach.hh>
│ │ │ │ -
14
│ │ │ │ -
15#include <vector>
│ │ │ │ -
16#include <memory>
│ │ │ │ -
17
│ │ │ │ -
18#include <cholmod.h>
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ +
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
5#ifndef DUNE_GLOBALAGGREGATES_HH
│ │ │ │ +
6#define DUNE_GLOBALAGGREGATES_HH
│ │ │ │ +
7
│ │ │ │ +
18#include "aggregates.hh"
│ │ │ │ +
19#include "pinfo.hh"
│ │ │ │ +
20#include <dune/common/parallel/indexset.hh>
│ │ │ │
21
│ │ │ │ -
22namespace Impl{
│ │ │ │ -
23
│ │ │ │ -
32 struct NoIgnore
│ │ │ │ -
33 {
│ │ │ │ -
34 const NoIgnore& operator[](std::size_t) const { return *this; }
│ │ │ │ -
35 explicit operator bool() const { return false; }
│ │ │ │ -
36 static constexpr std::size_t size() { return 0; }
│ │ │ │ -
37
│ │ │ │ -
38 };
│ │ │ │ -
39
│ │ │ │ +
22namespace Dune
│ │ │ │ +
23{
│ │ │ │ +
24 namespace Amg
│ │ │ │ +
25 {
│ │ │ │ +
26
│ │ │ │ +
27 template<typename T, typename TI>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
29 {
│ │ │ │ +
30 public:
│ │ │ │ +
31 typedef TI ParallelIndexSet;
│ │ │ │ +
32
│ │ │ │ +
33 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ +
34
│ │ │ │ +
35 typedef typename ParallelIndexSet::GlobalIndex IndexedType;
│ │ │ │ +
36
│ │ │ │ +
37 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
│ │ │ │ +
38
│ │ │ │ +
39 typedef T Vertex;
│ │ │ │
40
│ │ │ │ -
41 template<class BlockedVector, class FlatVector>
│ │ │ │ -
42 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector& flatVector)
│ │ │ │ -
43 {
│ │ │ │ -
44 // traverse the vector once just to compute the size
│ │ │ │ -
45 std::size_t len = flatVectorForEach(blockedVector, [&](auto&&, auto...){});
│ │ │ │ -
46 flatVector.resize(len);
│ │ │ │ -
47
│ │ │ │ -
48 flatVectorForEach(blockedVector, [&](auto&& entry, auto offset){
│ │ │ │ -
49 flatVector[offset] = entry;
│ │ │ │ -
50 });
│ │ │ │ -
51 }
│ │ │ │ -
52
│ │ │ │ -
53 // special (dummy) case for NoIgnore
│ │ │ │ -
54 template<class FlatVector>
│ │ │ │ -
55 void copyToFlatVector(const NoIgnore&, FlatVector&)
│ │ │ │ -
56 {
│ │ │ │ -
57 // just do nothing
│ │ │ │ -
58 return;
│ │ │ │ -
59 }
│ │ │ │ -
60
│ │ │ │ -
61 template<class FlatVector, class BlockedVector>
│ │ │ │ -
62 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector& blockedVector)
│ │ │ │ -
63 {
│ │ │ │ -
64 flatVectorForEach(blockedVector, [&](auto& entry, auto offset){
│ │ │ │ -
65 entry = flatVector[offset];
│ │ │ │ -
66 });
│ │ │ │ -
67 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
42 const GlobalLookupIndexSet<ParallelIndexSet>& indexset)
│ │ │ │ +
43 : aggregates_(aggregates), indexset_(indexset)
│ │ │ │ +
44 {}
│ │ │ │ +
│ │ │ │ +
45
│ │ │ │ +
│ │ │ │ +
46 inline const GlobalIndex& operator[](std::size_t index) const
│ │ │ │ +
47 {
│ │ │ │ +
48 const Vertex& aggregate = aggregates_[index];
│ │ │ │ +
49 if(aggregate >= AggregatesMap<Vertex>::ISOLATED) {
│ │ │ │ +
50 assert(aggregate != AggregatesMap<Vertex>::UNAGGREGATED);
│ │ │ │ +
51 return isolatedMarker;
│ │ │ │ +
52 }else{
│ │ │ │ +
53 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
│ │ │ │ +
54 assert(pair!=0);
│ │ │ │ +
55 return pair->global();
│ │ │ │ +
56 }
│ │ │ │ +
57 }
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
59
│ │ │ │ +
│ │ │ │ +
60 inline GlobalIndex& get(std::size_t index)
│ │ │ │ +
61 {
│ │ │ │ +
62 const Vertex& aggregate = aggregates_[index];
│ │ │ │ +
63 assert(aggregate < AggregatesMap<Vertex>::ISOLATED);
│ │ │ │ +
64 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
│ │ │ │ +
65 assert(pair!=0);
│ │ │ │ +
66 return const_cast<GlobalIndex&>(pair->global());
│ │ │ │ +
67 }
│ │ │ │ +
│ │ │ │
68
│ │ │ │ -
69
│ │ │ │ -
70} //namespace Impl
│ │ │ │ -
71
│ │ │ │ -
76template<class Vector>
│ │ │ │ -
77class Cholmod : public InverseOperator<Vector, Vector>
│ │ │ │ -
78{
│ │ │ │ -
79public:
│ │ │ │ -
80
│ │ │ │ -
86 Cholmod()
│ │ │ │ -
87 {
│ │ │ │ -
88 cholmod_start(&c_);
│ │ │ │ -
89 }
│ │ │ │ +
│ │ │ │ +
69 class Proxy
│ │ │ │ +
70 {
│ │ │ │ +
71 public:
│ │ │ │ +
│ │ │ │ +
72 Proxy(const GlobalLookupIndexSet<ParallelIndexSet>& indexset, Vertex& aggregate)
│ │ │ │ +
73 : indexset_(&indexset), aggregate_(&aggregate)
│ │ │ │ +
74 {}
│ │ │ │ +
│ │ │ │ +
75
│ │ │ │ +
│ │ │ │ +
76 Proxy& operator=(const GlobalIndex& global)
│ │ │ │ +
77 {
│ │ │ │ +
78 if(global==isolatedMarker)
│ │ │ │ + │ │ │ │ +
80 else{
│ │ │ │ +
81 //assert(global < AggregatesMap<Vertex>::ISOLATED);
│ │ │ │ +
82 *aggregate_ = indexset_->operator[](global).local();
│ │ │ │ +
83 }
│ │ │ │ +
84 return *this;
│ │ │ │ +
85 }
│ │ │ │ +
│ │ │ │ +
86 private:
│ │ │ │ +
87 const GlobalLookupIndexSet<ParallelIndexSet>* indexset_;
│ │ │ │ +
88 Vertex* aggregate_;
│ │ │ │ +
89 };
│ │ │ │ +
│ │ │ │
90
│ │ │ │ -
96 ~Cholmod()
│ │ │ │ -
97 {
│ │ │ │ -
98 if (L_)
│ │ │ │ -
99 cholmod_free_factor(&L_, &c_);
│ │ │ │ -
100 cholmod_finish(&c_);
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ -
103 // forbid copying to avoid freeing memory twice
│ │ │ │ -
104 Cholmod(const Cholmod&) = delete;
│ │ │ │ -
105 Cholmod& operator=(const Cholmod&) = delete;
│ │ │ │ -
106
│ │ │ │ +
│ │ │ │ +
91 inline Proxy operator[](std::size_t index)
│ │ │ │ +
92 {
│ │ │ │ +
93 return Proxy(indexset_, aggregates_[index]);
│ │ │ │ +
94 }
│ │ │ │ +
│ │ │ │ +
95
│ │ │ │ +
│ │ │ │ +
96 inline void put(const GlobalIndex& global, size_t i)
│ │ │ │ +
97 {
│ │ │ │ +
98 aggregates_[i]=indexset_[global].local();
│ │ │ │ +
99
│ │ │ │ +
100 }
│ │ │ │ +
│ │ │ │ +
101
│ │ │ │ +
102 private:
│ │ │ │ +
103 AggregatesMap<Vertex>& aggregates_;
│ │ │ │ +
104 const GlobalLookupIndexSet<ParallelIndexSet>& indexset_;
│ │ │ │ +
105 static const GlobalIndex isolatedMarker;
│ │ │ │ +
106 };
│ │ │ │ +
│ │ │ │
107
│ │ │ │ -
110 void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ -
111 {
│ │ │ │ -
112 apply(x,b,res);
│ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ -
120 void apply(Vector& x, Vector& b, InverseOperatorResult& res)
│ │ │ │ -
121 {
│ │ │ │ -
122 // do nothing if N=0
│ │ │ │ -
123 if ( nIsZero_ )
│ │ │ │ -
124 {
│ │ │ │ -
125 return;
│ │ │ │ -
126 }
│ │ │ │ -
127
│ │ │ │ -
128 if (x.size() != b.size())
│ │ │ │ -
129 DUNE_THROW(Exception, "Error in apply(): sizes of x and b do not match!");
│ │ │ │ -
130
│ │ │ │ -
131 // cast to double array
│ │ │ │ -
132 auto b2 = std::make_unique<double[]>(L_->n);
│ │ │ │ -
133 auto x2 = std::make_unique<double[]>(L_->n);
│ │ │ │ +
108 template<typename T, typename TI>
│ │ │ │ +
109 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
│ │ │ │ +
110 std::numeric_limits<typename TI::GlobalIndex>::max();
│ │ │ │ +
111
│ │ │ │ +
112 template<typename T, typename TI>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
114 {
│ │ │ │ + │ │ │ │ +
116 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ +
117
│ │ │ │ +
│ │ │ │ +
118 static const GlobalIndex& gather(const GlobalAggregatesMap<T,TI>& ga, size_t i)
│ │ │ │ +
119 {
│ │ │ │ +
120 return ga[i];
│ │ │ │ +
121 }
│ │ │ │ +
│ │ │ │ +
122
│ │ │ │ +
│ │ │ │ +
123 static void scatter(GlobalAggregatesMap<T,TI>& ga, GlobalIndex global, size_t i)
│ │ │ │ +
124 {
│ │ │ │ +
125 ga[i]=global;
│ │ │ │ +
126 }
│ │ │ │ +
│ │ │ │ +
127 };
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
129 template<typename T, typename O, typename I>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
131 {};
│ │ │ │ +
│ │ │ │ +
132
│ │ │ │ +
133#if HAVE_MPI
│ │ │ │
134
│ │ │ │ -
135 // copy to cholmod
│ │ │ │ -
136 auto bp = b2.get();
│ │ │ │ -
137
│ │ │ │ -
138 flatVectorForEach(b, [&](auto&& entry, auto&& flatIndex){
│ │ │ │ -
139 if ( subIndices_.empty() )
│ │ │ │ -
140 bp[ flatIndex ] = entry;
│ │ │ │ -
141 else
│ │ │ │ -
142 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
│ │ │ │ -
143 bp[ subIndices_[ flatIndex ] ] = entry;
│ │ │ │ -
144 });
│ │ │ │ -
145
│ │ │ │ -
146 // create a cholmod dense object
│ │ │ │ -
147 auto b3 = make_cholmod_dense(cholmod_allocate_dense(L_->n, 1, L_->n, CHOLMOD_REAL, &c_), &c_);
│ │ │ │ -
148 // cast because void-ptr
│ │ │ │ -
149 auto b4 = static_cast<double*>(b3->x);
│ │ │ │ -
150 std::copy(b2.get(), b2.get() + L_->n, b4);
│ │ │ │ -
151
│ │ │ │ -
152 // solve for a cholmod x object
│ │ │ │ -
153 auto x3 = make_cholmod_dense(cholmod_solve(CHOLMOD_A, L_, b3.get(), &c_), &c_);
│ │ │ │ -
154 // cast because void-ptr
│ │ │ │ -
155 auto xp = static_cast<double*>(x3->x);
│ │ │ │ -
156
│ │ │ │ -
157 // copy into x
│ │ │ │ -
158 flatVectorForEach(x, [&](auto&& entry, auto&& flatIndex){
│ │ │ │ -
159 if ( subIndices_.empty() )
│ │ │ │ -
160 entry = xp[ flatIndex ];
│ │ │ │ -
161 else
│ │ │ │ -
162 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
│ │ │ │ -
163 entry = xp[ subIndices_[ flatIndex ] ];
│ │ │ │ -
164 });
│ │ │ │ -
165
│ │ │ │ -
166 // statistics for a direct solver
│ │ │ │ -
167 res.iterations = 1;
│ │ │ │ -
168 res.converged = true;
│ │ │ │ -
169 }
│ │ │ │ -
170
│ │ │ │ -
171
│ │ │ │ -
177 template<class Matrix>
│ │ │ │ -
178 void setMatrix(const Matrix& matrix)
│ │ │ │ -
179 {
│ │ │ │ -
180 const Impl::NoIgnore* noIgnore = nullptr;
│ │ │ │ -
181 setMatrix(matrix, noIgnore);
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
198 template<class Matrix, class Ignore>
│ │ │ │ -
199 void setMatrix(const Matrix& matrix, const Ignore* ignore)
│ │ │ │ -
200 {
│ │ │ │ -
201 // count the number of entries and diagonal entries
│ │ │ │ -
202 int nonZeros = 0;
│ │ │ │ -
203 int numberOfIgnoredDofs = 0;
│ │ │ │ -
204
│ │ │ │ -
205
│ │ │ │ -
206 auto [flatRows,flatCols] = flatMatrixForEach( matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
│ │ │ │ -
207 if( flatRowIndex <= flatColIndex )
│ │ │ │ -
208 nonZeros++;
│ │ │ │ -
209 });
│ │ │ │ -
210
│ │ │ │ -
211 std::vector<bool> flatIgnore;
│ │ │ │ -
212
│ │ │ │ -
213 if ( ignore )
│ │ │ │ -
214 {
│ │ │ │ -
215 Impl::copyToFlatVector(*ignore,flatIgnore);
│ │ │ │ -
216 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true);
│ │ │ │ -
217 }
│ │ │ │ +
135#endif
│ │ │ │ +
136
│ │ │ │ +
137 } // namespace Amg
│ │ │ │ +
138
│ │ │ │ +
139#if HAVE_MPI
│ │ │ │ +
140 // forward declaration
│ │ │ │ +
141 template<class T1, class T2>
│ │ │ │ + │ │ │ │ +
143#endif
│ │ │ │ +
144
│ │ │ │ +
145 namespace Amg
│ │ │ │ +
146 {
│ │ │ │ +
147
│ │ │ │ +
148#if HAVE_MPI
│ │ │ │ +
158 template<typename T, typename O, typename T1, typename T2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
160 {
│ │ │ │ +
161 typedef T Vertex;
│ │ │ │ +
162 typedef O OverlapFlags;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
166
│ │ │ │ +
│ │ │ │ +
167 static void publish(AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
168 ParallelInformation& pinfo,
│ │ │ │ +
169 const GlobalLookupIndexSet& globalLookup)
│ │ │ │ +
170 {
│ │ │ │ + │ │ │ │ +
172 GlobalMap gmap(aggregates, globalLookup);
│ │ │ │ +
173 pinfo.copyOwnerToAll(gmap,gmap);
│ │ │ │ +
174 // communication only needed for ALU
│ │ │ │ +
175 // (ghosts with same global id as owners on the same process)
│ │ │ │ +
176 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping))
│ │ │ │ +
177 pinfo.copyCopyToAll(gmap,gmap);
│ │ │ │ +
178
│ │ │ │ +
179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
│ │ │ │ +
180 Lists lists = pinfo.remoteIndices().find(pinfo.communicator().rank());
│ │ │ │ +
181 if(lists!=pinfo.remoteIndices().end()) {
│ │ │ │ +
182
│ │ │ │ +
183 // For periodic boundary conditions we must renumber
│ │ │ │ +
184 // the aggregates of vertices in the overlap whose owners are
│ │ │ │ +
185 // on the same process
│ │ │ │ +
186 Vertex maxAggregate =0;
│ │ │ │ +
187 typedef typename AggregatesMap<Vertex>::const_iterator Iter;
│ │ │ │ +
188 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
│ │ │ │ +
189 maxAggregate = std::max(maxAggregate, *i);
│ │ │ │ +
190
│ │ │ │ +
191 // Compute new mapping of aggregates in the overlap that we also own
│ │ │ │ +
192 std::map<Vertex,Vertex> newMapping;
│ │ │ │ +
193
│ │ │ │ +
194 // insert all elements into map
│ │ │ │ +
195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
│ │ │ │ +
196 ::const_iterator RIter;
│ │ │ │ +
197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
│ │ │ │ +
198 ri!=rend; ++ri)
│ │ │ │ +
199 if(O::contains(ri->localIndexPair().local().attribute()))
│ │ │ │ +
200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
│ │ │ │ +
201 maxAggregate));
│ │ │ │ +
202 // renumber
│ │ │ │ +
203 typedef typename std::map<Vertex,Vertex>::iterator MIter;
│ │ │ │ +
204 for(MIter mi=newMapping.begin(), mend=newMapping.end();
│ │ │ │ +
205 mi != mend; ++mi)
│ │ │ │ +
206 mi->second=++maxAggregate;
│ │ │ │ +
207
│ │ │ │ +
208
│ │ │ │ +
209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
│ │ │ │ +
210 ri!=rend; ++ri)
│ │ │ │ +
211 if(O::contains(ri->localIndexPair().local().attribute()))
│ │ │ │ +
212 aggregates[ri->localIndexPair().local()] =
│ │ │ │ +
213 newMapping[aggregates[ri->localIndexPair().local()]];
│ │ │ │ +
214 }
│ │ │ │ +
215 }
│ │ │ │ +
│ │ │ │ +
216 };
│ │ │ │ +
│ │ │ │ +
217#endif
│ │ │ │
218
│ │ │ │ -
219 // Total number of rows
│ │ │ │ -
220 int N = flatRows - numberOfIgnoredDofs;
│ │ │ │ -
221
│ │ │ │ -
222 nIsZero_ = (N <= 0);
│ │ │ │ -
223
│ │ │ │ -
224 if ( nIsZero_ )
│ │ │ │ -
225 {
│ │ │ │ -
226 return;
│ │ │ │ -
227 }
│ │ │ │ -
228
│ │ │ │ -
229 /*
│ │ │ │ -
230 * CHOLMOD uses compressed-column sparse matrices, but for symmetric
│ │ │ │ -
231 * matrices this is the same as the compressed-row sparse matrix used
│ │ │ │ -
232 * by DUNE. So we can just store Mᵀ instead of M (as M = Mᵀ).
│ │ │ │ -
233 */
│ │ │ │ -
234 const auto deleter = [c = &this->c_](auto* p) {
│ │ │ │ -
235 cholmod_free_sparse(&p, c);
│ │ │ │ -
236 };
│ │ │ │ -
237 auto M = std::unique_ptr<cholmod_sparse, decltype(deleter)>(
│ │ │ │ -
238 cholmod_allocate_sparse(N, // # rows
│ │ │ │ -
239 N, // # cols
│ │ │ │ -
240 nonZeros, // # of nonzeroes
│ │ │ │ -
241 1, // indices are sorted ( 1 = true)
│ │ │ │ -
242 1, // matrix is "packed" ( 1 = true)
│ │ │ │ -
243 -1, // stype of matrix ( -1 = consider the lower part only )
│ │ │ │ -
244 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex numbers)
│ │ │ │ -
245 &c_ // cholmod_common ptr
│ │ │ │ -
246 ), deleter);
│ │ │ │ -
247
│ │ │ │ -
248 // copy the data of BCRS matrix to Cholmod Sparse matrix
│ │ │ │ -
249 int* Ap = static_cast<int*>(M->p);
│ │ │ │ -
250 int* Ai = static_cast<int*>(M->i);
│ │ │ │ -
251 double* Ax = static_cast<double*>(M->x);
│ │ │ │ -
252
│ │ │ │ -
253
│ │ │ │ -
254 if ( ignore )
│ │ │ │ -
255 {
│ │ │ │ -
256 // init the mapping
│ │ │ │ -
257 subIndices_.resize(flatRows,std::numeric_limits<std::size_t>::max());
│ │ │ │ -
258
│ │ │ │ -
259 std::size_t subIndexCounter = 0;
│ │ │ │ -
260
│ │ │ │ -
261 for ( std::size_t i=0; i<flatRows; i++ )
│ │ │ │ -
262 {
│ │ │ │ -
263 if ( not flatIgnore[ i ] )
│ │ │ │ -
264 {
│ │ │ │ -
265 subIndices_[ i ] = subIndexCounter++;
│ │ │ │ -
266 }
│ │ │ │ -
267 }
│ │ │ │ -
268 }
│ │ │ │ -
269
│ │ │ │ -
270 // at first, we need to compute the row starts "Ap"
│ │ │ │ -
271 // therefore, we count all (not ignored) entries in each row and in the end we accumulate everything
│ │ │ │ -
272 flatMatrixForEach(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
│ │ │ │ -
273
│ │ │ │ -
274 // stop if ignored
│ │ │ │ -
275 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
│ │ │ │ -
276 return;
│ │ │ │ -
277
│ │ │ │ -
278 // stop if in lower half
│ │ │ │ -
279 if ( flatRowIndex > flatColIndex )
│ │ │ │ -
280 return;
│ │ │ │ -
281
│ │ │ │ -
282 // ok, count the entry
│ │ │ │ -
283 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
│ │ │ │ -
284 Ap[idx+1]++;
│ │ │ │ -
285
│ │ │ │ -
286 });
│ │ │ │ -
287
│ │ │ │ -
288 // now accumulate
│ │ │ │ -
289 Ap[0] = 0;
│ │ │ │ -
290 for ( int i=0; i<N; i++ )
│ │ │ │ -
291 {
│ │ │ │ -
292 Ap[i+1] += Ap[i];
│ │ │ │ -
293 }
│ │ │ │ -
294
│ │ │ │ -
295 // we need a compressed row position counter
│ │ │ │ -
296 std::vector<std::size_t> rowPosition(N,0);
│ │ │ │ -
297
│ │ │ │ -
298 // now we can set the entries
│ │ │ │ -
299 flatMatrixForEach(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& flatColIndex){
│ │ │ │ -
300
│ │ │ │ -
301 // stop if ignored
│ │ │ │ -
302 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
│ │ │ │ -
303 return;
│ │ │ │ -
304
│ │ │ │ -
305 // stop if in lower half
│ │ │ │ -
306 if ( flatRowIndex > flatColIndex )
│ │ │ │ -
307 return;
│ │ │ │ -
308
│ │ │ │ -
309 // ok, set the entry
│ │ │ │ -
310 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
│ │ │ │ -
311 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex;
│ │ │ │ -
312 auto rowStart = Ap[rowIdx];
│ │ │ │ -
313 auto rowPos = rowPosition[rowIdx];
│ │ │ │ -
314 Ai[ rowStart + rowPos ] = colIdx;
│ │ │ │ -
315 Ax[ rowStart + rowPos ] = entry;
│ │ │ │ -
316 rowPosition[rowIdx]++;
│ │ │ │ -
317
│ │ │ │ -
318 });
│ │ │ │ -
319
│ │ │ │ -
320 // Now analyse the pattern and optimal row order
│ │ │ │ -
321 L_ = cholmod_analyze(M.get(), &c_);
│ │ │ │ -
322
│ │ │ │ -
323 // Do the factorization (this may take some time)
│ │ │ │ -
324 cholmod_factorize(M.get(), L_, &c_);
│ │ │ │ -
325 }
│ │ │ │ -
326
│ │ │ │ -
327 virtual SolverCategory::Category category() const
│ │ │ │ -
328 {
│ │ │ │ -
329 return SolverCategory::Category::sequential;
│ │ │ │ -
330 }
│ │ │ │ -
331
│ │ │ │ -
337 cholmod_common& cholmodCommonObject()
│ │ │ │ -
338 {
│ │ │ │ -
339 return c_;
│ │ │ │ -
340 }
│ │ │ │ -
341
│ │ │ │ -
347 cholmod_factor& cholmodFactor()
│ │ │ │ -
348 {
│ │ │ │ -
349 return *L_;
│ │ │ │ -
350 }
│ │ │ │ -
351
│ │ │ │ -
357 const cholmod_factor& cholmodFactor() const
│ │ │ │ -
358 {
│ │ │ │ -
359 return *L_;
│ │ │ │ -
360 }
│ │ │ │ -
361private:
│ │ │ │ -
362
│ │ │ │ -
363 // create a std::unique_ptr to a cholmod_dense object with a deleter
│ │ │ │ -
364 // that calls the appropriate cholmod cleanup routine
│ │ │ │ -
365 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c)
│ │ │ │ -
366 {
│ │ │ │ -
367 const auto deleter = [c](auto* p) {
│ │ │ │ -
368 cholmod_free_dense(&p, c);
│ │ │ │ -
369 };
│ │ │ │ -
370 return std::unique_ptr<cholmod_dense, decltype(deleter)>(x, deleter);
│ │ │ │ -
371 }
│ │ │ │ -
372
│ │ │ │ -
373 cholmod_common c_;
│ │ │ │ -
374 cholmod_factor* L_ = nullptr;
│ │ │ │ -
375
│ │ │ │ -
376 // indicator for a 0x0 problem (due to ignore dof's)
│ │ │ │ -
377 bool nIsZero_ = false;
│ │ │ │ -
378
│ │ │ │ -
379 // vector mapping all indices in flat order to the not ignored indices
│ │ │ │ -
380 std::vector<std::size_t> subIndices_;
│ │ │ │ -
381};
│ │ │ │ -
382
│ │ │ │ -
383 struct CholmodCreator{
│ │ │ │ -
384 template<class F> struct isValidBlock : std::false_type{};
│ │ │ │ -
385 template<int k> struct isValidBlock<FieldVector<double,k>> : std::true_type{};
│ │ │ │ -
386 template<int k> struct isValidBlock<FieldVector<float,k>> : std::true_type{};
│ │ │ │ -
387
│ │ │ │ -
388 template<class TL, typename M>
│ │ │ │ -
389 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
390 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
391 operator()(TL /*tl*/, const M& mat, const Dune::ParameterTree& /*config*/,
│ │ │ │ -
392 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ -
393 {
│ │ │ │ -
394 using D = typename Dune::TypeListElement<1, TL>::type;
│ │ │ │ -
395 auto solver = std::make_shared<Dune::Cholmod<D>>();
│ │ │ │ -
396 solver->setMatrix(mat);
│ │ │ │ -
397 return solver;
│ │ │ │ -
398 }
│ │ │ │ -
399
│ │ │ │ -
400 // second version with SFINAE to validate the template parameters of Cholmod
│ │ │ │ -
401 template<typename TL, typename M>
│ │ │ │ -
402 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
403 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
404 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ -
405 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ -
406 {
│ │ │ │ -
407 DUNE_THROW(UnsupportedType, "Unsupported Type in Cholmod");
│ │ │ │ -
408 }
│ │ │ │ -
409 };
│ │ │ │ -
410 DUNE_REGISTER_DIRECT_SOLVER("cholmod", Dune::CholmodCreator());
│ │ │ │ -
411
│ │ │ │ -
412} /* namespace Dune */
│ │ │ │ -
413
│ │ │ │ -
414#endif // HAVE_SUITESPARSE_CHOLMOD
│ │ │ │ -
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Define general, extensible interface for inverse operators.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
219 template<typename T, typename O>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
221 {
│ │ │ │ +
222 typedef T Vertex;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
225
│ │ │ │ +
│ │ │ │ +
226 static void publish([[maybe_unused]] AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
227 [[maybe_unused]] ParallelInformation& pinfo,
│ │ │ │ +
228 [[maybe_unused]] const GlobalLookupIndexSet& globalLookup)
│ │ │ │ +
229 {}
│ │ │ │ +
│ │ │ │ +
230 };
│ │ │ │ +
│ │ │ │ +
231
│ │ │ │ +
232 } // end Amg namespace
│ │ │ │ +
233
│ │ │ │ +
234
│ │ │ │ +
235#if HAVE_MPI
│ │ │ │ +
236 template<typename T, typename TI>
│ │ │ │ +
│ │ │ │ +
237 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
│ │ │ │ +
238 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
241 typedef SizeOne IndexedTypeFlag;
│ │ │ │ +
│ │ │ │ +
242 static int getSize(const Type&, int)
│ │ │ │ +
243 {
│ │ │ │ +
244 return 1;
│ │ │ │ +
245 }
│ │ │ │ +
│ │ │ │ +
246 };
│ │ │ │ +
│ │ │ │ +
247#endif
│ │ │ │ +
248
│ │ │ │ +
249} // end Dune namespace
│ │ │ │ +
250 /* @} */
│ │ │ │ +
251#endif
│ │ │ │ + │ │ │ │ +
Provides classes for the Coloring process of AMG.
│ │ │ │ +
ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
Definition globalaggregates.hh:164
│ │ │ │ +
const GlobalIndex & operator[](std::size_t index) const
Definition globalaggregates.hh:46
│ │ │ │ + │ │ │ │ +
static int getSize(const Type &, int)
Definition globalaggregates.hh:242
│ │ │ │ +
Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
Definition globalaggregates.hh:240
│ │ │ │ +
GlobalIndex & get(std::size_t index)
Definition globalaggregates.hh:60
│ │ │ │ + │ │ │ │ +
static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
Definition globalaggregates.hh:226
│ │ │ │ +
SequentialInformation ParallelInformation
Definition globalaggregates.hh:223
│ │ │ │ +
ParallelIndexSet::GlobalIndex GlobalIndex
Definition globalaggregates.hh:33
│ │ │ │ +
ParallelInformation::ParallelIndexSet IndexSet
Definition globalaggregates.hh:165
│ │ │ │ +
void put(const GlobalIndex &global, size_t i)
Definition globalaggregates.hh:96
│ │ │ │ +
T Vertex
Definition globalaggregates.hh:39
│ │ │ │ +
GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const GlobalLookupIndexSet< ParallelIndexSet > &indexset)
Definition globalaggregates.hh:41
│ │ │ │ +
TI ParallelIndexSet
Definition globalaggregates.hh:31
│ │ │ │ +
Amg::AggregatesMap< T > Type
Definition globalaggregates.hh:239
│ │ │ │ +
static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, size_t i)
Definition globalaggregates.hh:123
│ │ │ │ +
OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation
Definition globalaggregates.hh:163
│ │ │ │ +
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ +
SizeOne IndexedTypeFlag
Definition globalaggregates.hh:241
│ │ │ │ +
Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
Definition globalaggregates.hh:72
│ │ │ │ +
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ +
static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
Definition globalaggregates.hh:167
│ │ │ │ +
ParallelIndexSet::GlobalIndex GlobalIndex
Definition globalaggregates.hh:116
│ │ │ │ +
const AggregateDescriptor * const_iterator
Definition aggregates.hh:723
│ │ │ │ +
ParallelIndexSet::LocalIndex LocalIndex
Definition globalaggregates.hh:37
│ │ │ │ +
TI ParallelIndexSet
Definition globalaggregates.hh:115
│ │ │ │ + │ │ │ │ +
ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
Definition globalaggregates.hh:224
│ │ │ │ +
static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, size_t i)
Definition globalaggregates.hh:118
│ │ │ │ +
Proxy & operator=(const GlobalIndex &global)
Definition globalaggregates.hh:76
│ │ │ │ +
ParallelIndexSet::GlobalIndex IndexedType
Definition globalaggregates.hh:35
│ │ │ │ +
Proxy operator[](std::size_t index)
Definition globalaggregates.hh:91
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, std::size_t rowOffset=0, std::size_t colOffset=0)
Traverse a blocked matrix and call a functor at each scalar entry.
Definition foreach.hh:132
│ │ │ │ -
std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)
Traverse a blocked vector and call a functor at each scalar entry.
Definition foreach.hh:95
│ │ │ │ +
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ +
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition owneroverlapcopy.hh:328
│ │ │ │ +
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition owneroverlapcopy.hh:456
│ │ │ │ +
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ +
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │ +
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ +
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
Definition globalaggregates.hh:29
│ │ │ │ +
Definition globalaggregates.hh:70
│ │ │ │ +
Definition globalaggregates.hh:114
│ │ │ │ +
Definition globalaggregates.hh:131
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
int GlobalLookupIndexSet
Definition pinfo.hh:54
│ │ │ │ +
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,406 +1,424 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -cholmod.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +globalaggregates.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#pragma once │ │ │ │ │ -4 │ │ │ │ │ -5#if HAVE_SUITESPARSE_CHOLMOD │ │ │ │ │ -6 │ │ │ │ │ -7#include │ │ │ │ │ -8#include │ │ │ │ │ -9#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -10#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -11#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_i_s_t_l_/_f_o_r_e_a_c_h_._h_h> │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20namespace _D_u_n_e { │ │ │ │ │ +3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +5#ifndef DUNE_GLOBALAGGREGATES_HH │ │ │ │ │ +6#define DUNE_GLOBALAGGREGATES_HH │ │ │ │ │ +7 │ │ │ │ │ +18#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +19#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +20#include │ │ │ │ │ 21 │ │ │ │ │ -22namespace Impl{ │ │ │ │ │ -23 │ │ │ │ │ -32 struct NoIgnore │ │ │ │ │ -33 { │ │ │ │ │ -34 const NoIgnore& operator[](std::size_t) const { return *this; } │ │ │ │ │ -35 explicit operator bool() const { return false; } │ │ │ │ │ -36 static constexpr std::size_t size() { return 0; } │ │ │ │ │ -37 │ │ │ │ │ -38 }; │ │ │ │ │ -39 │ │ │ │ │ +22namespace _D_u_n_e │ │ │ │ │ +23{ │ │ │ │ │ +24 namespace Amg │ │ │ │ │ +25 { │ │ │ │ │ +26 │ │ │ │ │ +27 template │ │ │ │ │ +_2_8 struct _G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +29 { │ │ │ │ │ +30 public: │ │ │ │ │ +_3_1 typedef TI _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +32 │ │ │ │ │ +_3_3 typedef typename ParallelIndexSet::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +34 │ │ │ │ │ +_3_5 typedef typename ParallelIndexSet::GlobalIndex _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +36 │ │ │ │ │ +_3_7 typedef typename ParallelIndexSet::LocalIndex _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +38 │ │ │ │ │ +_3_9 typedef T _V_e_r_t_e_x; │ │ │ │ │ 40 │ │ │ │ │ -41 template │ │ │ │ │ -42 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector& │ │ │ │ │ -flatVector) │ │ │ │ │ -43 { │ │ │ │ │ -44 // traverse the vector once just to compute the size │ │ │ │ │ -45 std::size_t len = _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(blockedVector, [&](auto&&, auto...){}); │ │ │ │ │ -46 flatVector.resize(len); │ │ │ │ │ -47 │ │ │ │ │ -48 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(blockedVector, [&](auto&& entry, auto offset){ │ │ │ │ │ -49 flatVector[offset] = entry; │ │ │ │ │ -50 }); │ │ │ │ │ -51 } │ │ │ │ │ -52 │ │ │ │ │ -53 // special (dummy) case for NoIgnore │ │ │ │ │ -54 template │ │ │ │ │ -55 void copyToFlatVector(const NoIgnore&, FlatVector&) │ │ │ │ │ -56 { │ │ │ │ │ -57 // just do nothing │ │ │ │ │ -58 return; │ │ │ │ │ -59 } │ │ │ │ │ -60 │ │ │ │ │ -61 template │ │ │ │ │ -62 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector& │ │ │ │ │ -blockedVector) │ │ │ │ │ -63 { │ │ │ │ │ -64 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(blockedVector, [&](auto& entry, auto offset){ │ │ │ │ │ -65 entry = flatVector[offset]; │ │ │ │ │ -66 }); │ │ │ │ │ +_4_1 _G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +42 const GlobalLookupIndexSet& indexset) │ │ │ │ │ +43 : aggregates_(aggregates), indexset_(indexset) │ │ │ │ │ +44 {} │ │ │ │ │ +45 │ │ │ │ │ +_4_6 inline const _G_l_o_b_a_l_I_n_d_e_x& _o_p_e_r_a_t_o_r_[_](std::size_t index) const │ │ │ │ │ +47 { │ │ │ │ │ +48 const _V_e_r_t_e_x& aggregate = aggregates_[index]; │ │ │ │ │ +49 if(aggregate >= _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) { │ │ │ │ │ +50 assert(aggregate != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_U_N_A_G_G_R_E_G_A_T_E_D); │ │ │ │ │ +51 return isolatedMarker; │ │ │ │ │ +52 }else{ │ │ │ │ │ +53 const Dune::IndexPair* pair = indexset_.pair │ │ │ │ │ +(aggregate); │ │ │ │ │ +54 assert(pair!=0); │ │ │ │ │ +55 return pair->global(); │ │ │ │ │ +56 } │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +59 │ │ │ │ │ +_6_0 inline _G_l_o_b_a_l_I_n_d_e_x& _g_e_t(std::size_t index) │ │ │ │ │ +61 { │ │ │ │ │ +62 const _V_e_r_t_e_x& aggregate = aggregates_[index]; │ │ │ │ │ +63 assert(aggregate < _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D); │ │ │ │ │ +64 const Dune::IndexPair* pair = indexset_.pair │ │ │ │ │ +(aggregate); │ │ │ │ │ +65 assert(pair!=0); │ │ │ │ │ +66 return const_cast<_G_l_o_b_a_l_I_n_d_e_x&>(pair->global()); │ │ │ │ │ 67 } │ │ │ │ │ 68 │ │ │ │ │ -69 │ │ │ │ │ -70} //namespace Impl │ │ │ │ │ -71 │ │ │ │ │ -76template │ │ │ │ │ -77class Cholmod : public InverseOperator │ │ │ │ │ -78{ │ │ │ │ │ -79public: │ │ │ │ │ -80 │ │ │ │ │ -86 Cholmod() │ │ │ │ │ -87 { │ │ │ │ │ -88 cholmod_start(&c_); │ │ │ │ │ -89 } │ │ │ │ │ +_6_9 class _P_r_o_x_y │ │ │ │ │ +70 { │ │ │ │ │ +71 public: │ │ │ │ │ +_7_2 _P_r_o_x_y(const GlobalLookupIndexSet& indexset, _V_e_r_t_e_x& │ │ │ │ │ +aggregate) │ │ │ │ │ +73 : indexset_(&indexset), aggregate_(&aggregate) │ │ │ │ │ +74 {} │ │ │ │ │ +75 │ │ │ │ │ +_7_6 _P_r_o_x_y& _o_p_e_r_a_t_o_r_=(const _G_l_o_b_a_l_I_n_d_e_x& global) │ │ │ │ │ +77 { │ │ │ │ │ +78 if(global==isolatedMarker) │ │ │ │ │ +79 *aggregate_ = _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D; │ │ │ │ │ +80 else{ │ │ │ │ │ +81 //assert(global < AggregatesMap::ISOLATED); │ │ │ │ │ +82 *aggregate_ = indexset_->operator[](global).local(); │ │ │ │ │ +83 } │ │ │ │ │ +84 return *this; │ │ │ │ │ +85 } │ │ │ │ │ +86 private: │ │ │ │ │ +87 const GlobalLookupIndexSet* indexset_; │ │ │ │ │ +88 _V_e_r_t_e_x* aggregate_; │ │ │ │ │ +89 }; │ │ │ │ │ 90 │ │ │ │ │ -96 ~Cholmod() │ │ │ │ │ +_9_1 inline _P_r_o_x_y _o_p_e_r_a_t_o_r_[_](std::size_t index) │ │ │ │ │ +92 { │ │ │ │ │ +93 return _P_r_o_x_y(indexset_, aggregates_[index]); │ │ │ │ │ +94 } │ │ │ │ │ +95 │ │ │ │ │ +_9_6 inline void _p_u_t(const _G_l_o_b_a_l_I_n_d_e_x& global, size_t i) │ │ │ │ │ 97 { │ │ │ │ │ -98 if (L_) │ │ │ │ │ -99 cholmod_free_factor(&L_, &c_); │ │ │ │ │ -100 cholmod_finish(&c_); │ │ │ │ │ -101 } │ │ │ │ │ -102 │ │ │ │ │ -103 // forbid copying to avoid freeing memory twice │ │ │ │ │ -104 Cholmod(const Cholmod&) = delete; │ │ │ │ │ -105 Cholmod& operator=(const Cholmod&) = delete; │ │ │ │ │ -106 │ │ │ │ │ +98 aggregates_[i]=indexset_[global].local(); │ │ │ │ │ +99 │ │ │ │ │ +100 } │ │ │ │ │ +101 │ │ │ │ │ +102 private: │ │ │ │ │ +103 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ +104 const GlobalLookupIndexSet& indexset_; │ │ │ │ │ +105 static const _G_l_o_b_a_l_I_n_d_e_x isolatedMarker; │ │ │ │ │ +106 }; │ │ │ │ │ 107 │ │ │ │ │ -110 void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, │ │ │ │ │ -InverseOperatorResult& res) │ │ │ │ │ -111 { │ │ │ │ │ -112 apply(x,b,res); │ │ │ │ │ -113 } │ │ │ │ │ -114 │ │ │ │ │ -120 void apply(Vector& x, Vector& b, InverseOperatorResult& res) │ │ │ │ │ -121 { │ │ │ │ │ -122 // do nothing if N=0 │ │ │ │ │ -123 if ( nIsZero_ ) │ │ │ │ │ +108 template │ │ │ │ │ +109 const typename TI::GlobalIndex GlobalAggregatesMap::isolatedMarker = │ │ │ │ │ +110 std::numeric_limits::max(); │ │ │ │ │ +111 │ │ │ │ │ +112 template │ │ │ │ │ +_1_1_3 struct _A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +114 { │ │ │ │ │ +_1_1_5 typedef TI _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +_1_1_6 typedef typename ParallelIndexSet::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +117 │ │ │ │ │ +_1_1_8 static const _G_l_o_b_a_l_I_n_d_e_x& _g_a_t_h_e_r(const _G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_,_T_I_>& ga, │ │ │ │ │ +size_t i) │ │ │ │ │ +119 { │ │ │ │ │ +120 return ga[i]; │ │ │ │ │ +121 } │ │ │ │ │ +122 │ │ │ │ │ +_1_2_3 static void _s_c_a_t_t_e_r(_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_,_T_I_>& ga, _G_l_o_b_a_l_I_n_d_e_x global, │ │ │ │ │ +size_t i) │ │ │ │ │ 124 { │ │ │ │ │ -125 return; │ │ │ │ │ +125 ga[i]=global; │ │ │ │ │ 126 } │ │ │ │ │ -127 │ │ │ │ │ -128 if (x.size() != b.size()) │ │ │ │ │ -129 DUNE_THROW(Exception, "Error in apply(): sizes of x and b do not match!"); │ │ │ │ │ -130 │ │ │ │ │ -131 // cast to double array │ │ │ │ │ -132 auto b2 = std::make_unique(L_->n); │ │ │ │ │ -133 auto x2 = std::make_unique(L_->n); │ │ │ │ │ +127 }; │ │ │ │ │ +128 │ │ │ │ │ +129 template │ │ │ │ │ +_1_3_0 struct _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ +131 {}; │ │ │ │ │ +132 │ │ │ │ │ +133#if HAVE_MPI │ │ │ │ │ 134 │ │ │ │ │ -135 // copy to cholmod │ │ │ │ │ -136 auto bp = b2.get(); │ │ │ │ │ -137 │ │ │ │ │ -138 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(b, [&](auto&& entry, auto&& flatIndex){ │ │ │ │ │ -139 if ( subIndices_.empty() ) │ │ │ │ │ -140 bp[ flatIndex ] = entry; │ │ │ │ │ -141 else │ │ │ │ │ -142 if( subIndices_[ flatIndex ] != std::numeric_limits::max() ) │ │ │ │ │ -143 bp[ subIndices_[ flatIndex ] ] = entry; │ │ │ │ │ -144 }); │ │ │ │ │ -145 │ │ │ │ │ -146 // create a cholmod dense object │ │ │ │ │ -147 auto b3 = make_cholmod_dense(cholmod_allocate_dense(L_->n, 1, L_->n, │ │ │ │ │ -CHOLMOD_REAL, &c_), &c_); │ │ │ │ │ -148 // cast because void-ptr │ │ │ │ │ -149 auto b4 = static_cast(b3->x); │ │ │ │ │ -150 std::copy(b2.get(), b2.get() + L_->n, b4); │ │ │ │ │ -151 │ │ │ │ │ -152 // solve for a cholmod x object │ │ │ │ │ -153 auto x3 = make_cholmod_dense(cholmod_solve(CHOLMOD_A, L_, b3.get(), &c_), │ │ │ │ │ -&c_); │ │ │ │ │ -154 // cast because void-ptr │ │ │ │ │ -155 auto xp = static_cast(x3->x); │ │ │ │ │ -156 │ │ │ │ │ -157 // copy into x │ │ │ │ │ -158 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(x, [&](auto&& entry, auto&& flatIndex){ │ │ │ │ │ -159 if ( subIndices_.empty() ) │ │ │ │ │ -160 entry = xp[ flatIndex ]; │ │ │ │ │ -161 else │ │ │ │ │ -162 if( subIndices_[ flatIndex ] != std::numeric_limits::max() ) │ │ │ │ │ -163 entry = xp[ subIndices_[ flatIndex ] ]; │ │ │ │ │ -164 }); │ │ │ │ │ -165 │ │ │ │ │ -166 // statistics for a direct solver │ │ │ │ │ -167 res.iterations = 1; │ │ │ │ │ -168 res.converged = true; │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -171 │ │ │ │ │ -177 template │ │ │ │ │ -178 void setMatrix(const Matrix& matrix) │ │ │ │ │ -179 { │ │ │ │ │ -180 const Impl::NoIgnore* noIgnore = nullptr; │ │ │ │ │ -181 setMatrix(matrix, noIgnore); │ │ │ │ │ -182 } │ │ │ │ │ -183 │ │ │ │ │ -198 template │ │ │ │ │ -199 void setMatrix(const Matrix& matrix, const Ignore* ignore) │ │ │ │ │ -200 { │ │ │ │ │ -201 // count the number of entries and diagonal entries │ │ │ │ │ -202 int nonZeros = 0; │ │ │ │ │ -203 int numberOfIgnoredDofs = 0; │ │ │ │ │ -204 │ │ │ │ │ -205 │ │ │ │ │ -206 auto [flatRows,flatCols] = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h( matrix, [&](auto&& /*entry*/, │ │ │ │ │ -auto&& flatRowIndex, auto&& flatColIndex){ │ │ │ │ │ -207 if( flatRowIndex <= flatColIndex ) │ │ │ │ │ -208 nonZeros++; │ │ │ │ │ -209 }); │ │ │ │ │ -210 │ │ │ │ │ -211 std::vector flatIgnore; │ │ │ │ │ -212 │ │ │ │ │ -213 if ( ignore ) │ │ │ │ │ -214 { │ │ │ │ │ -215 Impl::copyToFlatVector(*ignore,flatIgnore); │ │ │ │ │ -216 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true); │ │ │ │ │ -217 } │ │ │ │ │ +135#endif │ │ │ │ │ +136 │ │ │ │ │ +137 } // namespace Amg │ │ │ │ │ +138 │ │ │ │ │ +139#if HAVE_MPI │ │ │ │ │ +140 // forward declaration │ │ │ │ │ +141 template │ │ │ │ │ +142 class _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n; │ │ │ │ │ +143#endif │ │ │ │ │ +144 │ │ │ │ │ +145 namespace Amg │ │ │ │ │ +146 { │ │ │ │ │ +147 │ │ │ │ │ +148#if HAVE_MPI │ │ │ │ │ +158 template │ │ │ │ │ +_1_5_9 struct _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r > │ │ │ │ │ +160 { │ │ │ │ │ +_1_6_1 typedef T _V_e_r_t_e_x; │ │ │ │ │ +_1_6_2 typedef O _O_v_e_r_l_a_p_F_l_a_g_s; │ │ │ │ │ +_1_6_3 typedef _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +_1_6_4 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ +_1_6_5 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t _I_n_d_e_x_S_e_t; │ │ │ │ │ +166 │ │ │ │ │ +_1_6_7 static void _p_u_b_l_i_s_h(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +168 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +169 const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& globalLookup) │ │ │ │ │ +170 { │ │ │ │ │ +171 typedef _D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_,_I_n_d_e_x_S_e_t_> GlobalMap; │ │ │ │ │ +172 GlobalMap gmap(aggregates, globalLookup); │ │ │ │ │ +173 pinfo._c_o_p_y_O_w_n_e_r_T_o_A_l_l(gmap,gmap); │ │ │ │ │ +174 // communication only needed for ALU │ │ │ │ │ +175 // (ghosts with same global id as owners on the same process) │ │ │ │ │ +176 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(pinfo) == static_cast(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ +_n_o_n_o_v_e_r_l_a_p_p_i_n_g)) │ │ │ │ │ +177 pinfo._c_o_p_y_C_o_p_y_T_o_A_l_l(gmap,gmap); │ │ │ │ │ +178 │ │ │ │ │ +179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists; │ │ │ │ │ +180 Lists lists = pinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().find(pinfo._c_o_m_m_u_n_i_c_a_t_o_r().rank()); │ │ │ │ │ +181 if(lists!=pinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().end()) { │ │ │ │ │ +182 │ │ │ │ │ +183 // For periodic boundary conditions we must renumber │ │ │ │ │ +184 // the aggregates of vertices in the overlap whose owners are │ │ │ │ │ +185 // on the same process │ │ │ │ │ +186 _V_e_r_t_e_x maxAggregate =0; │ │ │ │ │ +187 typedef typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r Iter; │ │ │ │ │ +188 for(Iter i=aggregates._b_e_g_i_n(), end=aggregates._e_n_d(); i!=end; ++i) │ │ │ │ │ +189 maxAggregate = std::max(maxAggregate, *i); │ │ │ │ │ +190 │ │ │ │ │ +191 // Compute new mapping of aggregates in the overlap that we also own │ │ │ │ │ +192 std::map newMapping; │ │ │ │ │ +193 │ │ │ │ │ +194 // insert all elements into map │ │ │ │ │ +195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList │ │ │ │ │ +196 ::const_iterator RIter; │ │ │ │ │ +197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end │ │ │ │ │ +(); │ │ │ │ │ +198 ri!=rend; ++ri) │ │ │ │ │ +199 if(O::contains(ri->localIndexPair().local().attribute())) │ │ │ │ │ +200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()], │ │ │ │ │ +201 maxAggregate)); │ │ │ │ │ +202 // renumber │ │ │ │ │ +203 typedef typename std::map::iterator MIter; │ │ │ │ │ +204 for(MIter mi=newMapping.begin(), mend=newMapping.end(); │ │ │ │ │ +205 mi != mend; ++mi) │ │ │ │ │ +206 mi->second=++maxAggregate; │ │ │ │ │ +207 │ │ │ │ │ +208 │ │ │ │ │ +209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end │ │ │ │ │ +(); │ │ │ │ │ +210 ri!=rend; ++ri) │ │ │ │ │ +211 if(O::contains(ri->localIndexPair().local().attribute())) │ │ │ │ │ +212 aggregates[ri->localIndexPair().local()] = │ │ │ │ │ +213 newMapping[aggregates[ri->localIndexPair().local()]]; │ │ │ │ │ +214 } │ │ │ │ │ +215 } │ │ │ │ │ +216 }; │ │ │ │ │ +217#endif │ │ │ │ │ 218 │ │ │ │ │ -219 // Total number of rows │ │ │ │ │ -220 int N = flatRows - numberOfIgnoredDofs; │ │ │ │ │ -221 │ │ │ │ │ -222 nIsZero_ = (N <= 0); │ │ │ │ │ -223 │ │ │ │ │ -224 if ( nIsZero_ ) │ │ │ │ │ -225 { │ │ │ │ │ -226 return; │ │ │ │ │ -227 } │ │ │ │ │ -228 │ │ │ │ │ -229 /* │ │ │ │ │ -230 * CHOLMOD uses compressed-column sparse matrices, but for symmetric │ │ │ │ │ -231 * matrices this is the same as the compressed-row sparse matrix used │ │ │ │ │ -232 * by DUNE. So we can just store Mᵀ instead of M (as M = Mᵀ). │ │ │ │ │ -233 */ │ │ │ │ │ -234 const auto deleter = [c = &this->c_](auto* p) { │ │ │ │ │ -235 cholmod_free_sparse(&p, c); │ │ │ │ │ -236 }; │ │ │ │ │ -237 auto M = std::unique_ptr( │ │ │ │ │ -238 cholmod_allocate_sparse(N, // # rows │ │ │ │ │ -239 N, // # cols │ │ │ │ │ -240 nonZeros, // # of nonzeroes │ │ │ │ │ -241 1, // indices are sorted ( 1 = true) │ │ │ │ │ -242 1, // matrix is "packed" ( 1 = true) │ │ │ │ │ -243 -1, // stype of matrix ( -1 = consider the lower part only ) │ │ │ │ │ -244 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex │ │ │ │ │ -numbers) │ │ │ │ │ -245 &c_ // cholmod_common ptr │ │ │ │ │ -246 ), deleter); │ │ │ │ │ -247 │ │ │ │ │ -248 // copy the data of BCRS matrix to Cholmod Sparse matrix │ │ │ │ │ -249 int* Ap = static_cast(M->p); │ │ │ │ │ -250 int* Ai = static_cast(M->i); │ │ │ │ │ -251 double* Ax = static_cast(M->x); │ │ │ │ │ -252 │ │ │ │ │ -253 │ │ │ │ │ -254 if ( ignore ) │ │ │ │ │ -255 { │ │ │ │ │ -256 // init the mapping │ │ │ │ │ -257 subIndices_.resize(flatRows,std::numeric_limits::max()); │ │ │ │ │ -258 │ │ │ │ │ -259 std::size_t subIndexCounter = 0; │ │ │ │ │ -260 │ │ │ │ │ -261 for ( std::size_t i=0; i flatColIndex ) │ │ │ │ │ -280 return; │ │ │ │ │ -281 │ │ │ │ │ -282 // ok, count the entry │ │ │ │ │ -283 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex; │ │ │ │ │ -284 Ap[idx+1]++; │ │ │ │ │ -285 │ │ │ │ │ -286 }); │ │ │ │ │ -287 │ │ │ │ │ -288 // now accumulate │ │ │ │ │ -289 Ap[0] = 0; │ │ │ │ │ -290 for ( int i=0; i rowPosition(N,0); │ │ │ │ │ -297 │ │ │ │ │ -298 // now we can set the entries │ │ │ │ │ -299 _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& │ │ │ │ │ -flatColIndex){ │ │ │ │ │ -300 │ │ │ │ │ -301 // stop if ignored │ │ │ │ │ -302 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) ) │ │ │ │ │ -303 return; │ │ │ │ │ -304 │ │ │ │ │ -305 // stop if in lower half │ │ │ │ │ -306 if ( flatRowIndex > flatColIndex ) │ │ │ │ │ -307 return; │ │ │ │ │ -308 │ │ │ │ │ -309 // ok, set the entry │ │ │ │ │ -310 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex; │ │ │ │ │ -311 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex; │ │ │ │ │ -312 auto rowStart = Ap[rowIdx]; │ │ │ │ │ -313 auto rowPos = rowPosition[rowIdx]; │ │ │ │ │ -314 Ai[ rowStart + rowPos ] = colIdx; │ │ │ │ │ -315 Ax[ rowStart + rowPos ] = entry; │ │ │ │ │ -316 rowPosition[rowIdx]++; │ │ │ │ │ -317 │ │ │ │ │ -318 }); │ │ │ │ │ -319 │ │ │ │ │ -320 // Now analyse the pattern and optimal row order │ │ │ │ │ -321 L_ = cholmod_analyze(M.get(), &c_); │ │ │ │ │ -322 │ │ │ │ │ -323 // Do the factorization (this may take some time) │ │ │ │ │ -324 cholmod_factorize(M.get(), L_, &c_); │ │ │ │ │ -325 } │ │ │ │ │ -326 │ │ │ │ │ -327 virtual SolverCategory::Category category() const │ │ │ │ │ -328 { │ │ │ │ │ -329 return SolverCategory::Category::sequential; │ │ │ │ │ -330 } │ │ │ │ │ -331 │ │ │ │ │ -337 cholmod_common& cholmodCommonObject() │ │ │ │ │ -338 { │ │ │ │ │ -339 return c_; │ │ │ │ │ -340 } │ │ │ │ │ -341 │ │ │ │ │ -347 cholmod_factor& cholmodFactor() │ │ │ │ │ -348 { │ │ │ │ │ -349 return *L_; │ │ │ │ │ -350 } │ │ │ │ │ -351 │ │ │ │ │ -357 const cholmod_factor& cholmodFactor() const │ │ │ │ │ -358 { │ │ │ │ │ -359 return *L_; │ │ │ │ │ -360 } │ │ │ │ │ -361private: │ │ │ │ │ -362 │ │ │ │ │ -363 // create a std::unique_ptr to a cholmod_dense object with a deleter │ │ │ │ │ -364 // that calls the appropriate cholmod cleanup routine │ │ │ │ │ -365 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c) │ │ │ │ │ -366 { │ │ │ │ │ -367 const auto deleter = [c](auto* p) { │ │ │ │ │ -368 cholmod_free_dense(&p, c); │ │ │ │ │ -369 }; │ │ │ │ │ -370 return std::unique_ptr(x, deleter); │ │ │ │ │ -371 } │ │ │ │ │ -372 │ │ │ │ │ -373 cholmod_common c_; │ │ │ │ │ -374 cholmod_factor* L_ = nullptr; │ │ │ │ │ -375 │ │ │ │ │ -376 // indicator for a 0x0 problem (due to ignore dof's) │ │ │ │ │ -377 bool nIsZero_ = false; │ │ │ │ │ -378 │ │ │ │ │ -379 // vector mapping all indices in flat order to the not ignored indices │ │ │ │ │ -380 std::vector subIndices_; │ │ │ │ │ -381}; │ │ │ │ │ -382 │ │ │ │ │ -383 struct CholmodCreator{ │ │ │ │ │ -384 template struct isValidBlock : std::false_type{}; │ │ │ │ │ -385 template struct isValidBlock> : std::true_type │ │ │ │ │ -{}; │ │ │ │ │ -386 template struct isValidBlock> : std::true_type │ │ │ │ │ -{}; │ │ │ │ │ -387 │ │ │ │ │ -388 template │ │ │ │ │ -389 std::shared_ptr::type, │ │ │ │ │ -390 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -391 operator()(TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& /*config*/, │ │ │ │ │ -392 std::enable_if_t::type:: │ │ │ │ │ -block_type>::value,int> = 0) const │ │ │ │ │ -393 { │ │ │ │ │ -394 using D = typename Dune::TypeListElement<1, TL>::type; │ │ │ │ │ -395 auto solver = std::make_shared>(); │ │ │ │ │ -396 solver->setMatrix(_m_a_t); │ │ │ │ │ -397 return solver; │ │ │ │ │ -398 } │ │ │ │ │ -399 │ │ │ │ │ -400 // second version with SFINAE to validate the template parameters of │ │ │ │ │ -Cholmod │ │ │ │ │ -401 template │ │ │ │ │ -402 std::shared_ptr::type, │ │ │ │ │ -403 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -404 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ -*config*/, │ │ │ │ │ -405 std::enable_if_t:: │ │ │ │ │ -type::block_type>::value,int> = 0) const │ │ │ │ │ -406 { │ │ │ │ │ -407 DUNE_THROW(UnsupportedType, "Unsupported Type in Cholmod"); │ │ │ │ │ -408 } │ │ │ │ │ -409 }; │ │ │ │ │ -410 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("cholmod", Dune::CholmodCreator()); │ │ │ │ │ -411 │ │ │ │ │ -412} /* namespace Dune */ │ │ │ │ │ -413 │ │ │ │ │ -414#endif // HAVE_SUITESPARSE_CHOLMOD │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ -#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_o_l_v_e_r_._h_h │ │ │ │ │ -Define general, extensible interface for inverse operators. │ │ │ │ │ -_f_o_r_e_a_c_h_._h_h │ │ │ │ │ -_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +219 template │ │ │ │ │ +_2_2_0 struct _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ +221 { │ │ │ │ │ +_2_2_2 typedef T _V_e_r_t_e_x; │ │ │ │ │ +_2_2_3 typedef _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +_2_2_4 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ +225 │ │ │ │ │ +_2_2_6 static void _p_u_b_l_i_s_h([[maybe_unused]] _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +227 [[maybe_unused]] _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +228 [[maybe_unused]] const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& globalLookup) │ │ │ │ │ +229 {} │ │ │ │ │ +230 }; │ │ │ │ │ +231 │ │ │ │ │ +232 } // end Amg namespace │ │ │ │ │ +233 │ │ │ │ │ +234 │ │ │ │ │ +235#if HAVE_MPI │ │ │ │ │ +236 template │ │ │ │ │ +_2_3_7 struct CommPolicy > │ │ │ │ │ +238 { │ │ │ │ │ +_2_3_9 typedef _A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_> _T_y_p_e; │ │ │ │ │ +_2_4_0 typedef typename _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_,_T_I_>_:_:_I_n_d_e_x_e_d_T_y_p_e _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ +_2_4_1 typedef SizeOne _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ +_2_4_2 static int _g_e_t_S_i_z_e(const _T_y_p_e&, int) │ │ │ │ │ +243 { │ │ │ │ │ +244 return 1; │ │ │ │ │ +245 } │ │ │ │ │ +246 }; │ │ │ │ │ +247#endif │ │ │ │ │ +248 │ │ │ │ │ +249} // end Dune namespace │ │ │ │ │ +250 /* @} */ │ │ │ │ │ +251#endif │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ +Provides classes for the Coloring process of AMG. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +_>_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const GlobalIndex & operator[](std::size_t index) const │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +_>_:_:_O_v_e_r_l_a_p_F_l_a_g_s │ │ │ │ │ +O OverlapFlags │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_g_e_t_S_i_z_e │ │ │ │ │ +static int getSize(const Type &, int) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:242 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:240 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_g_e_t │ │ │ │ │ +GlobalIndex & get(std::size_t index) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +_>_:_:_V_e_r_t_e_x │ │ │ │ │ +T Vertex │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_p_u_b_l_i_s_h │ │ │ │ │ +static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation │ │ │ │ │ +&pinfo, const GlobalLookupIndexSet &globalLookup) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_: │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +SequentialInformation ParallelInformation │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:223 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +_>_:_:_I_n_d_e_x_S_e_t │ │ │ │ │ +ParallelInformation::ParallelIndexSet IndexSet │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_p_u_t │ │ │ │ │ +void put(const GlobalIndex &global, size_t i) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:96 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x │ │ │ │ │ +T Vertex │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const │ │ │ │ │ +GlobalLookupIndexSet< ParallelIndexSet > &indexset) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +TI ParallelIndexSet │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ +Amg::AggregatesMap< T > Type │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:239 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ +static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, │ │ │ │ │ +size_t i) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +_>_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:725 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ +SizeOne IndexedTypeFlag │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_r_o_x_y_:_:_P_r_o_x_y │ │ │ │ │ +Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex │ │ │ │ │ +&aggregate) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ +_>_:_:_p_u_b_l_i_s_h │ │ │ │ │ +static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation │ │ │ │ │ +&pinfo, const GlobalLookupIndexSet &globalLookup) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +const AggregateDescriptor * const_iterator │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:723 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +TI ParallelIndexSet │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ +T Vertex │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_: │ │ │ │ │ +_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ +static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, │ │ │ │ │ +size_t i) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_r_o_x_y_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +Proxy & operator=(const GlobalIndex &global) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ +ParallelIndexSet::GlobalIndex IndexedType │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +Proxy operator[](std::size_t index) │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:91 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h │ │ │ │ │ -std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, │ │ │ │ │ -std::size_t rowOffset=0, std::size_t colOffset=0) │ │ │ │ │ -Traverse a blocked matrix and call a functor at each scalar entry. │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h │ │ │ │ │ -std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0) │ │ │ │ │ -Traverse a blocked vector and call a functor at each scalar entry. │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_C_o_p_y_T_o_A_l_l │ │ │ │ │ +void copyCopyToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from copy data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet │ │ │ │ │ +The type of the reverse lookup of indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:456 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +const Communication< MPI_Comm > & communicator() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ +void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +const RemoteIndices & remoteIndices() const │ │ │ │ │ +Get the underlying remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ +The type of the parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_r_o_x_y │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +int GlobalLookupIndexSet │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ +@ nonoverlapping │ │ │ │ │ +Category for non-overlapping solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ +Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ +newly introduced virtu... │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00065.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixmatrix.hh File Reference │ │ │ │ +dune-istl: parameters.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,75 +65,67 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Enumerations
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

provides functions for sparse matrix matrix multiplication. │ │ │ │ +

Parameter classes for customizing AMG. │ │ │ │ More...

│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::MatMultMatResult< M1, M2 >
 Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$) More...
class  Dune::Amg::DependencyParameters
 Parameters needed to check whether a node depends on another. More...
 
struct  Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >
class  Dune::Amg::AggregationParameters
 Parameters needed for the aggregation process. More...
 
struct  Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >
class  Dune::Amg::CoarseningParameters
 Parameters for the complete coarsening process. More...
 
struct  Dune::TransposedMatMultMatResult< M1, M2 >
 Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$) More...
 
struct  Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > >
 
struct  Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >
class  Dune::Amg::Parameters
 All parameters for AMG. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<class T , class A , class A1 , class A2 , int n, int m, int k>
void Dune::matMultTransposeMat (BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
 Calculate product of a sparse matrix with a transposed sparse matrices ( $C=A*B^T$).
 
template<class T , class A , class A1 , class A2 , int n, int m, int k>
void Dune::matMultMat (BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
 Calculate product of two sparse matrices ( $C=A*B$).
 
template<class T , class A , class A1 , class A2 , int n, int m, int k>
void Dune::transposeMatMultMat (BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
 Calculate product of a transposed sparse matrix with another sparse matrices ( $C=A^T*B$).
 

│ │ │ │ +Enumerations

enum  Dune::Amg::AccumulationMode { Dune::Amg::noAccu = 0 │ │ │ │ +, Dune::Amg::atOnceAccu =1 │ │ │ │ +, Dune::Amg::successiveAccu =2 │ │ │ │ + }
 Identifiers for the different accumulation modes. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

provides functions for sparse matrix matrix multiplication.

│ │ │ │ +

Parameter classes for customizing AMG.

│ │ │ │
Author
Markus Blatt
│ │ │ │ +

All parameters of the AMG can be set by using the class Parameter, which can be provided to CoarsenCriterion via its constructor.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,66 +1,45 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -matrixmatrix.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s │ │ │ │ │ -provides functions for sparse matrix matrix multiplication. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s │ │ │ │ │ +parameters.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Parameter classes for customizing AMG. _M_o_r_e_._._. │ │ │ │ │ +#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_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _M_1_,_ _M_2_ _> │ │ │ │ │ -  Helper TMP to get the result type of a sparse matrix matrix │ │ │ │ │ - multiplication ( [$C=A*B$]) _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +  _P_a_r_a_m_e_t_e_r_s needed to check whether a node depends on another. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _> │ │ │ │ │ - _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +  _P_a_r_a_m_e_t_e_r_s needed for the aggregation process. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _A_ _>_, │ │ │ │ │ - _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +  _P_a_r_a_m_e_t_e_r_s for the complete coarsening process. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _M_1_,_ _M_2_ _> │ │ │ │ │ -  Helper TMP to get the result type of a sparse matrix matrix │ │ │ │ │ - multiplication ( [$C=A*B$]) _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_< │ │ │ │ │ - _T_,_ _k_,_ _m_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_, │ │ │ │ │ - _A_ _>_,_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +  All parameters for _A_M_G. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_m_a_t_M_u_l_t_T_r_a_n_s_p_o_s_e_M_a_t (_B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, k >, A > &res, │ │ │ │ │ - const _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, m >, A1 > &_m_a_t, const _B_C_R_S_M_a_t_r_i_x< │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ -  Calculate product of a sparse matrix with a transposed sparse matrices ( │ │ │ │ │ - [$C=A*B^T$]). │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_m_a_t_M_u_l_t_M_a_t (_B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, m >, A > &res, const │ │ │ │ │ - _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, k >, A1 > &_m_a_t, const _B_C_R_S_M_a_t_r_i_x< │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ -  Calculate product of two sparse matrices ( [$C=A*B$]). │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_t_r_a_n_s_p_o_s_e_M_a_t_M_u_l_t_M_a_t (_B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, m >, A > &res, │ │ │ │ │ - const _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, k, n >, A1 > &_m_a_t, const _B_C_R_S_M_a_t_r_i_x< │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ -  Calculate product of a transposed sparse matrix with another sparse │ │ │ │ │ - matrices ( [$C=A^T*B$]). │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   _D_u_n_e_:_:_A_m_g_:_:_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e { _D_u_n_e_:_:_A_m_g_:_:_n_o_A_c_c_u = 0 , _D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ + _a_t_O_n_c_e_A_c_c_u =1 , _D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u =2 } │ │ │ │ │ +  Identifiers for the different accumulation modes. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -provides functions for sparse matrix matrix multiplication. │ │ │ │ │ +Parameter classes for customizing AMG. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ +All parameters of the AMG can be set by using the class Parameter, which can be │ │ │ │ │ +provided to CoarsenCriterion via its constructor. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixmatrix.hh Source File │ │ │ │ +dune-istl: parameters.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,626 +70,395 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
matrixmatrix.hh
│ │ │ │ +
parameters.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MATRIXMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_MATRIXMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_AMG_PARAMETERS_HH
│ │ │ │ +
6#define DUNE_AMG_PARAMETERS_HH
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ +
8#include <cstddef>
│ │ │ │
9
│ │ │ │ - │ │ │ │ -
11#include <dune/common/fmatrix.hh>
│ │ │ │ -
12#include <dune/common/timer.hh>
│ │ │ │ -
13namespace Dune
│ │ │ │ -
14{
│ │ │ │ -
15
│ │ │ │ -
26 namespace
│ │ │ │ -
27 {
│ │ │ │ -
28
│ │ │ │ -
37 template<int b>
│ │ │ │ -
38 struct NonzeroPatternTraverser
│ │ │ │ -
39 {};
│ │ │ │ -
40
│ │ │ │ -
41
│ │ │ │ -
42 template<>
│ │ │ │ -
43 struct NonzeroPatternTraverser<0>
│ │ │ │ -
44 {
│ │ │ │ -
45 template<class T,class A1, class A2, class F, int n, int m, int k>
│ │ │ │ -
46 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>& A,
│ │ │ │ - │ │ │ │ -
48 F& func)
│ │ │ │ -
49 {
│ │ │ │ -
50 if(A.M()!=B.N())
│ │ │ │ -
51 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.M()<<"!="<<B.N());
│ │ │ │ -
52
│ │ │ │ -
53 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstRowIterator Row;
│ │ │ │ -
54 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstColIterator Col;
│ │ │ │ -
55 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
│ │ │ │ -
56 for(Row row= A.begin(); row != A.end(); ++row) {
│ │ │ │ -
57 // Loop over all column entries
│ │ │ │ -
58 for(Col col = row->begin(); col != row->end(); ++col) {
│ │ │ │ -
59 // entry at i,k
│ │ │ │ -
60 // search for all nonzeros in row k
│ │ │ │ -
61 for(BCol bcol = B[col.index()].begin(); bcol != B[col.index()].end(); ++bcol) {
│ │ │ │ -
62 func(*col, *bcol, row.index(), bcol.index());
│ │ │ │ -
63 }
│ │ │ │ -
64 }
│ │ │ │ -
65 }
│ │ │ │ -
66 }
│ │ │ │ -
67
│ │ │ │ -
68 };
│ │ │ │ -
69
│ │ │ │ -
70 template<>
│ │ │ │ -
71 struct NonzeroPatternTraverser<1>
│ │ │ │ -
72 {
│ │ │ │ -
73 template<class T, class A1, class A2, class F, int n, int m, int k>
│ │ │ │ -
74 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>& A,
│ │ │ │ - │ │ │ │ -
76 F& func)
│ │ │ │ -
77 {
│ │ │ │ +
10namespace Dune
│ │ │ │ +
11{
│ │ │ │ +
12 namespace Amg
│ │ │ │ +
13 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
31 {
│ │ │ │ +
32 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
35 : alpha_(1.0/3.0), beta_(1.0E-5)
│ │ │ │ +
36 {}
│ │ │ │ +
│ │ │ │ +
37
│ │ │ │ +
│ │ │ │ +
42 void setBeta(double b)
│ │ │ │ +
43 {
│ │ │ │ +
44 beta_ = b;
│ │ │ │ +
45 }
│ │ │ │ +
│ │ │ │ +
46
│ │ │ │ +
│ │ │ │ +
52 double beta() const
│ │ │ │ +
53 {
│ │ │ │ +
54 return beta_;
│ │ │ │ +
55 }
│ │ │ │ +
│ │ │ │ +
56
│ │ │ │ +
│ │ │ │ +
61 void setAlpha(double a)
│ │ │ │ +
62 {
│ │ │ │ +
63 alpha_ = a;
│ │ │ │ +
64 }
│ │ │ │ +
│ │ │ │ +
65
│ │ │ │ +
│ │ │ │ +
70 double alpha() const
│ │ │ │ +
71 {
│ │ │ │ +
72 return alpha_;
│ │ │ │ +
73 }
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
75 private:
│ │ │ │ +
76 double alpha_, beta_;
│ │ │ │ +
77 };
│ │ │ │ +
│ │ │ │
78
│ │ │ │ -
79 if(A.N()!=B.N())
│ │ │ │ -
80 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.N()<<"!="<<B.N());
│ │ │ │ -
81
│ │ │ │ -
82 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstRowIterator Row;
│ │ │ │ -
83 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstColIterator Col;
│ │ │ │ -
84 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
│ │ │ │ -
85
│ │ │ │ -
86 for(Row row=A.begin(); row!=A.end(); ++row) {
│ │ │ │ -
87 for(Col col=row->begin(); col!=row->end(); ++col) {
│ │ │ │ -
88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end(); ++bcol) {
│ │ │ │ -
89 func(*col, *bcol, col.index(), bcol.index());
│ │ │ │ -
90 }
│ │ │ │ -
91 }
│ │ │ │ -
92 }
│ │ │ │ -
93 }
│ │ │ │ -
94 };
│ │ │ │ -
95
│ │ │ │ -
96 template<>
│ │ │ │ -
97 struct NonzeroPatternTraverser<2>
│ │ │ │ -
98 {
│ │ │ │ -
99 template<class T, class A1, class A2, class F, int n, int m, int k>
│ │ │ │ -
100 static void traverse(const BCRSMatrix<FieldMatrix<T,n,m>,A1>& mat,
│ │ │ │ -
101 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt,
│ │ │ │ -
102 F& func)
│ │ │ │ -
103 {
│ │ │ │ -
104 if(mat.M()!=matt.M())
│ │ │ │ -
105 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<mat.M()<<"!="<<matt.M());
│ │ │ │ -
106
│ │ │ │ -
107 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstRowIterator row_iterator;
│ │ │ │ -
108 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstColIterator col_iterator;
│ │ │ │ -
109 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstRowIterator row_iterator_t;
│ │ │ │ -
110 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstColIterator col_iterator_t;
│ │ │ │ -
111
│ │ │ │ -
112 for(row_iterator mrow=mat.begin(); mrow != mat.end(); ++mrow) {
│ │ │ │ -
113 //iterate over the column entries
│ │ │ │ -
114 // mt is a transposed matrix crs therefore it is treated as a ccs matrix
│ │ │ │ -
115 // and the row_iterator iterates over the columns of the transposed matrix.
│ │ │ │ -
116 // search the row of the transposed matrix for an entry with the same index
│ │ │ │ -
117 // as the mcol iterator
│ │ │ │ -
118
│ │ │ │ -
119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {
│ │ │ │ -
120 //Search for col entries in mat that have a corrsponding row index in matt
│ │ │ │ -
121 // (i.e. corresponding col index in the as this is the transposed matrix
│ │ │ │ -
122 col_iterator_t mtrow=mtcol->begin();
│ │ │ │ -
123 bool funcCalled = false;
│ │ │ │ -
124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {
│ │ │ │ -
125 // search
│ │ │ │ -
126 // TODO: This should probably be substituted by a binary search
│ │ │ │ -
127 for( ; mtrow != mtcol->end(); ++mtrow)
│ │ │ │ -
128 if(mtrow.index()>=mcol.index())
│ │ │ │ -
129 break;
│ │ │ │ -
130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {
│ │ │ │ -
131 func(*mcol, *mtrow, mtcol.index());
│ │ │ │ -
132 funcCalled = true;
│ │ │ │ -
133 // In some cases we only search for one pair, then we break here
│ │ │ │ -
134 // and continue with the next column.
│ │ │ │ -
135 if(F::do_break)
│ │ │ │ -
136 break;
│ │ │ │ -
137 }
│ │ │ │ -
138 }
│ │ │ │ -
139 // move on with func only if func was called, otherwise they might
│ │ │ │ -
140 // get out of sync
│ │ │ │ -
141 if (funcCalled)
│ │ │ │ -
142 func.nextCol();
│ │ │ │ -
143 }
│ │ │ │ -
144 func.nextRow();
│ │ │ │ -
145 }
│ │ │ │ -
146 }
│ │ │ │ -
147 };
│ │ │ │ -
148
│ │ │ │ -
149
│ │ │ │ -
150
│ │ │ │ -
151 template<class T, class A, int n, int m>
│ │ │ │ -
152 class SparsityPatternInitializer
│ │ │ │ -
153 {
│ │ │ │ -
154 public:
│ │ │ │ -
155 enum {do_break=true};
│ │ │ │ - │ │ │ │ - │ │ │ │ -
158
│ │ │ │ -
159 SparsityPatternInitializer(CreateIterator iter)
│ │ │ │ -
160 : rowiter(iter)
│ │ │ │ -
161 {}
│ │ │ │ -
162
│ │ │ │ -
163 template<class T1, class T2>
│ │ │ │ -
164 void operator()(const T1&, const T2&, size_type j)
│ │ │ │ -
165 {
│ │ │ │ -
166 rowiter.insert(j);
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ -
169 void nextRow()
│ │ │ │ -
170 {
│ │ │ │ -
171 ++rowiter;
│ │ │ │ -
172 }
│ │ │ │ -
173 void nextCol()
│ │ │ │ -
174 {}
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
84 {
│ │ │ │ +
85 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
96 : maxDistance_(2), minAggregateSize_(4), maxAggregateSize_(6),
│ │ │ │ +
97 connectivity_(15), skipiso_(false)
│ │ │ │ +
98 {}
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
│ │ │ │ +
109 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
│ │ │ │ +
110 {
│ │ │ │ +
111 maxDistance_=diameter-1;
│ │ │ │ +
112 std::size_t csize=1;
│ │ │ │ +
113
│ │ │ │ +
114 for(; dim>0; dim--) {
│ │ │ │ +
115 csize*=diameter;
│ │ │ │ +
116 maxDistance_+=diameter-1;
│ │ │ │ +
117 }
│ │ │ │ +
118 minAggregateSize_=csize;
│ │ │ │ +
119 maxAggregateSize_=static_cast<std::size_t>(csize*1.5);
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ +
132 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
│ │ │ │ +
133 {
│ │ │ │ +
134 setDefaultValuesIsotropic(dim, diameter);
│ │ │ │ +
135 maxDistance_+=dim-1;
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
144 std::size_t maxDistance() const { return maxDistance_;}
│ │ │ │ +
145
│ │ │ │ +
154 void setMaxDistance(std::size_t distance) { maxDistance_ = distance;}
│ │ │ │ +
155
│ │ │ │ +
│ │ │ │ +
161 bool skipIsolated() const
│ │ │ │ +
162 {
│ │ │ │ +
163 return skipiso_;
│ │ │ │ +
164 }
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
│ │ │ │ +
171 void setSkipIsolated(bool skip)
│ │ │ │ +
172 {
│ │ │ │ +
173 skipiso_=skip;
│ │ │ │ +
174 }
│ │ │ │ +
│ │ │ │
175
│ │ │ │ -
176 private:
│ │ │ │ -
177 CreateIterator rowiter;
│ │ │ │ -
178 };
│ │ │ │ -
179
│ │ │ │ -
180
│ │ │ │ -
181 template<int transpose, class T, class TA, int n, int m>
│ │ │ │ -
182 class MatrixInitializer
│ │ │ │ -
183 {
│ │ │ │ -
184 public:
│ │ │ │ -
185 enum {do_break=true};
│ │ │ │ - │ │ │ │ - │ │ │ │ -
188 typedef typename Matrix::size_type size_type;
│ │ │ │ +
180 std::size_t minAggregateSize() const { return minAggregateSize_;}
│ │ │ │ +
181
│ │ │ │ +
188 void setMinAggregateSize(std::size_t size){ minAggregateSize_=size;}
│ │ │ │
189
│ │ │ │ -
190 MatrixInitializer(Matrix& A_, size_type)
│ │ │ │ -
191 : count(0), A(A_)
│ │ │ │ -
192 {}
│ │ │ │ -
193 template<class T1, class T2>
│ │ │ │ -
194 void operator()(const T1&, const T2&, int)
│ │ │ │ -
195 {
│ │ │ │ -
196 ++count;
│ │ │ │ -
197 }
│ │ │ │ -
198
│ │ │ │ -
199 void nextCol()
│ │ │ │ -
200 {}
│ │ │ │ -
201
│ │ │ │ -
202 void nextRow()
│ │ │ │ -
203 {}
│ │ │ │ -
204
│ │ │ │ -
205 std::size_t nonzeros()
│ │ │ │ -
206 {
│ │ │ │ -
207 return count;
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
210 template<class A1, class A2, int n2, int m2, int n3, int m3>
│ │ │ │ -
211 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
│ │ │ │ -
212 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
│ │ │ │ -
213 {
│ │ │ │ -
214 SparsityPatternInitializer<T, TA, n, m> sparsity(A.createbegin());
│ │ │ │ -
215 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,sparsity);
│ │ │ │ -
216 }
│ │ │ │ -
217
│ │ │ │ -
218 private:
│ │ │ │ -
219 std::size_t count;
│ │ │ │ -
220 Matrix& A;
│ │ │ │ -
221 };
│ │ │ │ -
222
│ │ │ │ -
223 template<class T, class TA, int n, int m>
│ │ │ │ -
224 class MatrixInitializer<1,T,TA,n,m>
│ │ │ │ -
225 {
│ │ │ │ -
226 public:
│ │ │ │ -
227 enum {do_break=false};
│ │ │ │ - │ │ │ │ - │ │ │ │ -
230 typedef typename Matrix::size_type size_type;
│ │ │ │ -
231
│ │ │ │ -
232 MatrixInitializer(Matrix& A_, size_type rows)
│ │ │ │ -
233 : A(A_), entries(rows)
│ │ │ │ -
234 {}
│ │ │ │ -
235
│ │ │ │ -
236 template<class T1, class T2>
│ │ │ │ -
237 void operator()(const T1&, const T2&, size_type i, size_type j)
│ │ │ │ -
238 {
│ │ │ │ -
239 entries[i].insert(j);
│ │ │ │ -
240 }
│ │ │ │ -
241
│ │ │ │ -
242 void nextCol()
│ │ │ │ -
243 {}
│ │ │ │ -
244
│ │ │ │ -
245 size_type nonzeros()
│ │ │ │ -
246 {
│ │ │ │ -
247 size_type nnz=0;
│ │ │ │ -
248 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
│ │ │ │ -
249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)
│ │ │ │ -
250 nnz+=(*iter).size();
│ │ │ │ -
251 return nnz;
│ │ │ │ -
252 }
│ │ │ │ -
253 template<class A1, class A2, int n2, int m2, int n3, int m3>
│ │ │ │ -
254 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>&,
│ │ │ │ -
255 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>&)
│ │ │ │ -
256 {
│ │ │ │ -
257 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
│ │ │ │ -
258 CreateIterator citer = A.createbegin();
│ │ │ │ -
259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {
│ │ │ │ -
260 typedef std::set<size_t>::const_iterator SetIter;
│ │ │ │ -
261 for(SetIter index=iter->begin(); index != iter->end(); ++index)
│ │ │ │ -
262 citer.insert(*index);
│ │ │ │ -
263 }
│ │ │ │ -
264 }
│ │ │ │ -
265
│ │ │ │ -
266 private:
│ │ │ │ -
267 Matrix& A;
│ │ │ │ -
268 std::vector<std::set<size_t> > entries;
│ │ │ │ -
269 };
│ │ │ │ -
270
│ │ │ │ -
271 template<class T, class TA, int n, int m>
│ │ │ │ -
272 struct MatrixInitializer<0,T,TA,n,m>
│ │ │ │ -
273 : public MatrixInitializer<1,T,TA,n,m>
│ │ │ │ -
274 {
│ │ │ │ -
275 MatrixInitializer(Dune::BCRSMatrix<Dune::FieldMatrix<T,n,m>,TA>& A_,
│ │ │ │ - │ │ │ │ -
277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)
│ │ │ │ -
278 {}
│ │ │ │ -
279 };
│ │ │ │ -
280
│ │ │ │ -
281
│ │ │ │ -
282 template<class T, class T1, class T2, int n, int m, int k>
│ │ │ │ -
283 void addMatMultTransposeMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,n,m>& mat,
│ │ │ │ -
284 const FieldMatrix<T2,k,m>& matt)
│ │ │ │ -
285 {
│ │ │ │ -
286 typedef typename FieldMatrix<T,n,k>::size_type size_type;
│ │ │ │ -
287
│ │ │ │ -
288 for(size_type row=0; row<n; ++row)
│ │ │ │ -
289 for(size_type col=0; col<k; ++col) {
│ │ │ │ -
290 for(size_type i=0; i < m; ++i)
│ │ │ │ -
291 res[row][col]+=mat[row][i]*matt[col][i];
│ │ │ │ -
292 }
│ │ │ │ -
293 }
│ │ │ │ -
294
│ │ │ │ -
295 template<class T, class T1, class T2, int n, int m, int k>
│ │ │ │ -
296 void addTransposeMatMultMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,m,n>& mat,
│ │ │ │ -
297 const FieldMatrix<T2,m,k>& matt)
│ │ │ │ -
298 {
│ │ │ │ -
299 typedef typename FieldMatrix<T,n,k>::size_type size_type;
│ │ │ │ -
300 for(size_type i=0; i<m; ++i)
│ │ │ │ -
301 for(size_type row=0; row<n; ++row) {
│ │ │ │ -
302 for(size_type col=0; col < k; ++col)
│ │ │ │ -
303 res[row][col]+=mat[i][row]*matt[i][col];
│ │ │ │ -
304 }
│ │ │ │ -
305 }
│ │ │ │ -
306
│ │ │ │ -
307 template<class T, class T1, class T2, int n, int m, int k>
│ │ │ │ -
308 void addMatMultMat(FieldMatrix<T,n,m>& res, const FieldMatrix<T1,n,k>& mat,
│ │ │ │ -
309 const FieldMatrix<T2,k,m>& matt)
│ │ │ │ -
310 {
│ │ │ │ -
311 typedef typename FieldMatrix<T,n,k>::size_type size_type;
│ │ │ │ -
312 for(size_type row=0; row<n; ++row)
│ │ │ │ -
313 for(size_type col=0; col<m; ++col) {
│ │ │ │ -
314 for(size_type i=0; i < k; ++i)
│ │ │ │ -
315 res[row][col]+=mat[row][i]*matt[i][col];
│ │ │ │ -
316 }
│ │ │ │ -
317 }
│ │ │ │ -
318
│ │ │ │ -
319
│ │ │ │ -
320 template<class T, class A, int n, int m>
│ │ │ │ -
321 class EntryAccumulatorFather
│ │ │ │ -
322 {
│ │ │ │ -
323 public:
│ │ │ │ -
324 enum {do_break=false};
│ │ │ │ - │ │ │ │ -
326 typedef typename Matrix::RowIterator Row;
│ │ │ │ -
327 typedef typename Matrix::ColIterator Col;
│ │ │ │ -
328
│ │ │ │ -
329 EntryAccumulatorFather(Matrix& mat_)
│ │ │ │ -
330 : mat(mat_), row(mat.begin())
│ │ │ │ -
331 {
│ │ │ │ -
332 mat=0;
│ │ │ │ -
333 col=row->begin();
│ │ │ │ -
334 }
│ │ │ │ -
335 void nextRow()
│ │ │ │ -
336 {
│ │ │ │ -
337 ++row;
│ │ │ │ -
338 if(row!=mat.end())
│ │ │ │ -
339 col=row->begin();
│ │ │ │ -
340 }
│ │ │ │ -
341
│ │ │ │ -
342 void nextCol()
│ │ │ │ -
343 {
│ │ │ │ -
344 ++this->col;
│ │ │ │ +
194 std::size_t maxAggregateSize() const { return maxAggregateSize_;}
│ │ │ │ +
195
│ │ │ │ +
202 void setMaxAggregateSize(std::size_t size){ maxAggregateSize_ = size;}
│ │ │ │ +
203
│ │ │ │ +
211 std::size_t maxConnectivity() const { return connectivity_;}
│ │ │ │ +
212
│ │ │ │ +
220 void setMaxConnectivity(std::size_t connectivity){ connectivity_ = connectivity;}
│ │ │ │ +
221
│ │ │ │ +
222 private:
│ │ │ │ +
223 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_, connectivity_;
│ │ │ │ +
224 bool skipiso_;
│ │ │ │ +
225
│ │ │ │ +
226 };
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
249 };
│ │ │ │ +
│ │ │ │ +
250
│ │ │ │ +
251
│ │ │ │ +
252
│ │ │ │ +
253
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
258 {
│ │ │ │ +
259 public:
│ │ │ │ +
│ │ │ │ +
263 void setMaxLevel(int l)
│ │ │ │ +
264 {
│ │ │ │ +
265 maxLevel_ = l;
│ │ │ │ +
266 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
270 int maxLevel() const
│ │ │ │ +
271 {
│ │ │ │ +
272 return maxLevel_;
│ │ │ │ +
273 }
│ │ │ │ +
│ │ │ │ +
274
│ │ │ │ +
│ │ │ │ +
278 void setCoarsenTarget(int nodes)
│ │ │ │ +
279 {
│ │ │ │ +
280 coarsenTarget_ = nodes;
│ │ │ │ +
281 }
│ │ │ │ +
│ │ │ │ +
282
│ │ │ │ +
│ │ │ │ +
286 int coarsenTarget() const
│ │ │ │ +
287 {
│ │ │ │ +
288 return coarsenTarget_;
│ │ │ │ +
289 }
│ │ │ │ +
│ │ │ │ +
290
│ │ │ │ +
│ │ │ │ +
296 void setMinCoarsenRate(double rate)
│ │ │ │ +
297 {
│ │ │ │ +
298 minCoarsenRate_ = rate;
│ │ │ │ +
299 }
│ │ │ │ +
│ │ │ │ +
300
│ │ │ │ +
│ │ │ │ +
304 double minCoarsenRate() const
│ │ │ │ +
305 {
│ │ │ │ +
306 return minCoarsenRate_;
│ │ │ │ +
307 }
│ │ │ │ +
│ │ │ │ +
308
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
313 {
│ │ │ │ +
314 return accumulate_;
│ │ │ │ +
315 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
320 {
│ │ │ │ +
321 accumulate_=accu;
│ │ │ │ +
322 }
│ │ │ │ +
│ │ │ │ +
323
│ │ │ │ +
│ │ │ │ +
324 void setAccumulate(bool accu){
│ │ │ │ +
325 accumulate_=accu ? successiveAccu : noAccu;
│ │ │ │ +
326 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
333 {
│ │ │ │ +
334 dampingFactor_ = d;
│ │ │ │ +
335 }
│ │ │ │ +
│ │ │ │ +
336
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
343 {
│ │ │ │ +
344 return dampingFactor_;
│ │ │ │
345 }
│ │ │ │ -
346 protected:
│ │ │ │ -
347 Matrix& mat;
│ │ │ │ -
348 private:
│ │ │ │ -
349 Row row;
│ │ │ │ -
350 protected:
│ │ │ │ - │ │ │ │ -
352 };
│ │ │ │ -
353
│ │ │ │ -
354 template<class T, class A, int n, int m, int transpose>
│ │ │ │ -
355 class EntryAccumulator
│ │ │ │ -
356 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ -
357 {
│ │ │ │ -
358 public:
│ │ │ │ - │ │ │ │ -
360 typedef typename Matrix::size_type size_type;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
357 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
│ │ │ │ +
358 : maxLevel_(maxLevel), coarsenTarget_(coarsenTarget), minCoarsenRate_(minCoarsenRate),
│ │ │ │ +
359 dampingFactor_(prolongDamp), accumulate_( accumulate)
│ │ │ │ +
360 {}
│ │ │ │ +
│ │ │ │
361
│ │ │ │ -
362 EntryAccumulator(Matrix& mat_)
│ │ │ │ -
363 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ -
364 {}
│ │ │ │ -
365
│ │ │ │ -
366 template<class T1, class T2>
│ │ │ │ -
367 void operator()(const T1& t1, const T2& t2, size_type i)
│ │ │ │ -
368 {
│ │ │ │ -
369 assert(this->col.index()==i);
│ │ │ │ -
370 addMatMultMat(*(this->col),t1,t2);
│ │ │ │ -
371 }
│ │ │ │ -
372 };
│ │ │ │ -
373
│ │ │ │ -
374 template<class T, class A, int n, int m>
│ │ │ │ -
375 class EntryAccumulator<T,A,n,m,0>
│ │ │ │ -
376 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ -
377 {
│ │ │ │ -
378 public:
│ │ │ │ - │ │ │ │ -
380 typedef typename Matrix::size_type size_type;
│ │ │ │ -
381
│ │ │ │ -
382 EntryAccumulator(Matrix& mat_)
│ │ │ │ -
383 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ -
384 {}
│ │ │ │ +
362 private:
│ │ │ │ +
366 int maxLevel_;
│ │ │ │ +
370 int coarsenTarget_;
│ │ │ │ +
374 double minCoarsenRate_;
│ │ │ │ +
378 double dampingFactor_;
│ │ │ │ +
383 AccumulationMode accumulate_;
│ │ │ │ +
384 };
│ │ │ │ +
│ │ │ │
385
│ │ │ │ -
386 template<class T1, class T2>
│ │ │ │ -
387 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
│ │ │ │ -
388 {
│ │ │ │ -
389 addMatMultMat(this->mat[i][j], t1, t2);
│ │ │ │ -
390 }
│ │ │ │ -
391 };
│ │ │ │ -
392
│ │ │ │ -
393 template<class T, class A, int n, int m>
│ │ │ │ -
394 class EntryAccumulator<T,A,n,m,1>
│ │ │ │ -
395 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ -
396 {
│ │ │ │ -
397 public:
│ │ │ │ - │ │ │ │ -
399 typedef typename Matrix::size_type size_type;
│ │ │ │ -
400
│ │ │ │ -
401 EntryAccumulator(Matrix& mat_)
│ │ │ │ -
402 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ -
403 {}
│ │ │ │ -
404
│ │ │ │ -
405 template<class T1, class T2>
│ │ │ │ -
406 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
│ │ │ │ -
407 {
│ │ │ │ -
408 addTransposeMatMultMat(this->mat[i][j], t1, t2);
│ │ │ │ -
409 }
│ │ │ │ -
410 };
│ │ │ │ -
411
│ │ │ │ -
412 template<class T, class A, int n, int m>
│ │ │ │ -
413 class EntryAccumulator<T,A,n,m,2>
│ │ │ │ -
414 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ -
415 {
│ │ │ │ -
416 public:
│ │ │ │ - │ │ │ │ -
418 typedef typename Matrix::size_type size_type;
│ │ │ │ -
419
│ │ │ │ -
420 EntryAccumulator(Matrix& mat_)
│ │ │ │ -
421 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ -
422 {}
│ │ │ │ -
423
│ │ │ │ -
424 template<class T1, class T2>
│ │ │ │ -
425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] size_type i)
│ │ │ │ -
426 {
│ │ │ │ -
427 assert(this->col.index()==i);
│ │ │ │ -
428 addMatMultTransposeMat(*this->col,t1,t2);
│ │ │ │ -
429 }
│ │ │ │ -
430 };
│ │ │ │ -
431
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
393 {
│ │ │ │ +
394 public:
│ │ │ │ +
│ │ │ │ +
401 void setDebugLevel(int level)
│ │ │ │ +
402 {
│ │ │ │ +
403 debugLevel_ = level;
│ │ │ │ +
404 }
│ │ │ │ +
│ │ │ │ +
405
│ │ │ │ +
│ │ │ │ +
411 int debugLevel() const
│ │ │ │ +
412 {
│ │ │ │ +
413 return debugLevel_;
│ │ │ │ +
414 }
│ │ │ │ +
│ │ │ │ +
415
│ │ │ │ +
│ │ │ │ +
420 void setNoPreSmoothSteps(std::size_t steps)
│ │ │ │ +
421 {
│ │ │ │ +
422 preSmoothSteps_=steps;
│ │ │ │ +
423 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
428 std::size_t getNoPreSmoothSteps() const
│ │ │ │ +
429 {
│ │ │ │ +
430 return preSmoothSteps_;
│ │ │ │ +
431 }
│ │ │ │ +
│ │ │ │
432
│ │ │ │ -
433 template<int transpose>
│ │ │ │ -
434 struct SizeSelector
│ │ │ │ -
435 {};
│ │ │ │ -
436
│ │ │ │ -
437 template<>
│ │ │ │ -
438 struct SizeSelector<0>
│ │ │ │ -
439 {
│ │ │ │ -
440 template<class M1, class M2>
│ │ │ │ -
441 static std::tuple<typename M1::size_type, typename M2::size_type>
│ │ │ │ -
442 size(const M1& m1, const M2& m2)
│ │ │ │ -
443 {
│ │ │ │ -
444 return std::make_tuple(m1.N(), m2.M());
│ │ │ │ -
445 }
│ │ │ │ -
446 };
│ │ │ │ -
447
│ │ │ │ -
448 template<>
│ │ │ │ -
449 struct SizeSelector<1>
│ │ │ │ -
450 {
│ │ │ │ -
451 template<class M1, class M2>
│ │ │ │ -
452 static std::tuple<typename M1::size_type, typename M2::size_type>
│ │ │ │ -
453 size(const M1& m1, const M2& m2)
│ │ │ │ +
│ │ │ │ +
437 void setNoPostSmoothSteps(std::size_t steps)
│ │ │ │ +
438 {
│ │ │ │ +
439 postSmoothSteps_=steps;
│ │ │ │ +
440 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
445 std::size_t getNoPostSmoothSteps() const
│ │ │ │ +
446 {
│ │ │ │ +
447 return postSmoothSteps_;
│ │ │ │ +
448 }
│ │ │ │ +
│ │ │ │ +
449
│ │ │ │ +
│ │ │ │ +
453 void setGamma(std::size_t gamma)
│ │ │ │
454 {
│ │ │ │ -
455 return std::make_tuple(m1.M(), m2.M());
│ │ │ │ +
455 gamma_=gamma;
│ │ │ │
456 }
│ │ │ │ -
457 };
│ │ │ │ -
458
│ │ │ │ -
459
│ │ │ │ -
460 template<>
│ │ │ │ -
461 struct SizeSelector<2>
│ │ │ │ -
462 {
│ │ │ │ -
463 template<class M1, class M2>
│ │ │ │ -
464 static std::tuple<typename M1::size_type, typename M2::size_type>
│ │ │ │ -
465 size(const M1& m1, const M2& m2)
│ │ │ │ -
466 {
│ │ │ │ -
467 return std::make_tuple(m1.N(), m2.N());
│ │ │ │ -
468 }
│ │ │ │ -
469 };
│ │ │ │ -
470
│ │ │ │ -
471 template<int transpose, class T, class A, class A1, class A2, int n1, int m1, int n2, int m2, int n3, int m3>
│ │ │ │ -
472 void matMultMat(BCRSMatrix<FieldMatrix<T,n1,m1>,A>& res, const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
│ │ │ │ -
473 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
│ │ │ │ -
474 {
│ │ │ │ -
475 // First step is to count the number of nonzeros
│ │ │ │ -
476 typename BCRSMatrix<FieldMatrix<T,n1,m1>,A>::size_type rows, cols;
│ │ │ │ -
477 std::tie(rows,cols)=SizeSelector<transpose>::size(mat1, mat2);
│ │ │ │ -
478 MatrixInitializer<transpose,T,A,n1,m1> patternInit(res, rows);
│ │ │ │ -
479 Timer timer;
│ │ │ │ -
480 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,patternInit);
│ │ │ │ -
481 res.setSize(rows, cols, patternInit.nonzeros());
│ │ │ │ -
482 res.setBuildMode(BCRSMatrix<FieldMatrix<T,n1,m1>,A>::row_wise);
│ │ │ │ -
483
│ │ │ │ -
484 //std::cout<<"Counting nonzeros took "<<timer.elapsed()<<std::endl;
│ │ │ │ -
485 timer.reset();
│ │ │ │ -
486
│ │ │ │ -
487 // Second step is to allocate the storage for the result and initialize the nonzero pattern
│ │ │ │ -
488 patternInit.initPattern(mat1, mat2);
│ │ │ │ -
489
│ │ │ │ -
490 //std::cout<<"Setting up sparsity pattern took "<<timer.elapsed()<<std::endl;
│ │ │ │ -
491 timer.reset();
│ │ │ │ -
492 // As a last step calculate the entries
│ │ │ │ -
493 res = 0.0;
│ │ │ │ -
494 EntryAccumulator<T,A,n1,m1, transpose> entriesAccu(res);
│ │ │ │ -
495 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,entriesAccu);
│ │ │ │ -
496 //std::cout<<"Calculating entries took "<<timer.elapsed()<<std::endl;
│ │ │ │ -
497 }
│ │ │ │ -
498
│ │ │ │ -
499 }
│ │ │ │ -
500
│ │ │ │ -
508 template<typename M1, typename M2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
510 {};
│ │ │ │ -
│ │ │ │ -
511
│ │ │ │ -
512 template<typename T, int n, int k, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
514 {
│ │ │ │ - │ │ │ │ -
516 };
│ │ │ │ -
│ │ │ │ -
517
│ │ │ │ -
518 template<typename T, typename A, typename A1, int n, int k, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
520 {
│ │ │ │ - │ │ │ │ -
522 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
│ │ │ │ -
523 };
│ │ │ │ -
│ │ │ │ -
524
│ │ │ │ -
525
│ │ │ │ -
533 template<typename M1, typename M2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
535 {};
│ │ │ │ -
│ │ │ │ -
536
│ │ │ │ -
537 template<typename T, int n, int k, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
539 {
│ │ │ │ - │ │ │ │ -
541 };
│ │ │ │ -
│ │ │ │ -
542
│ │ │ │ -
543 template<typename T, typename A, typename A1, int n, int k, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
545 {
│ │ │ │ - │ │ │ │ -
547 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
│ │ │ │ -
548 };
│ │ │ │ -
│ │ │ │ -
549
│ │ │ │ -
550
│ │ │ │ -
559 template<class T, class A, class A1, class A2, int n, int m, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
561 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
│ │ │ │ -
562 {
│ │ │ │ -
563 matMultMat<2>(res,mat, matt);
│ │ │ │ -
564 }
│ │ │ │ -
│ │ │ │ -
565
│ │ │ │ -
574 template<class T, class A, class A1, class A2, int n, int m, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
576 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, bool tryHard=false)
│ │ │ │ -
577 {
│ │ │ │ -
578 matMultMat<0>(res,mat, matt);
│ │ │ │ -
579 }
│ │ │ │ -
│ │ │ │ -
580
│ │ │ │ -
589 template<class T, class A, class A1, class A2, int n, int m, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
591 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
│ │ │ │ -
592 {
│ │ │ │ -
593 matMultMat<1>(res,mat, matt);
│ │ │ │ -
594 }
│ │ │ │ -
│ │ │ │ -
595
│ │ │ │ -
596}
│ │ │ │ -
597#endif
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:379
│ │ │ │ -
FieldMatrix< T, n, m > type
Definition matrixmatrix.hh:515
│ │ │ │ -
void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of a transposed sparse matrix with another sparse matrices ( ).
Definition matrixmatrix.hh:590
│ │ │ │ -
void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of two sparse matrices ( ).
Definition matrixmatrix.hh:575
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:359
│ │ │ │ -
Matrix::RowIterator Row
Definition matrixmatrix.hh:326
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:417
│ │ │ │ -
Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix
Definition matrixmatrix.hh:228
│ │ │ │ -
Matrix::size_type size_type
Definition matrixmatrix.hh:360
│ │ │ │ -
Matrix::size_type size_type
Definition matrixmatrix.hh:380
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix::ColIterator Col
Definition matrixmatrix.hh:327
│ │ │ │ -
Matrix::size_type size_type
Definition matrixmatrix.hh:188
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
Matrix::size_type size_type
Definition matrixmatrix.hh:230
│ │ │ │ - │ │ │ │ -
void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of a sparse matrix with a transposed sparse matrices ( ).
Definition matrixmatrix.hh:560
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator
Definition matrixmatrix.hh:156
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:398
│ │ │ │ -
Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix
Definition matrixmatrix.hh:186
│ │ │ │ -
BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
Definition matrixmatrix.hh:522
│ │ │ │ -
Matrix::CreateIterator CreateIterator
Definition matrixmatrix.hh:229
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:325
│ │ │ │ -
Matrix::size_type size_type
Definition matrixmatrix.hh:399
│ │ │ │ -
Matrix::CreateIterator CreateIterator
Definition matrixmatrix.hh:187
│ │ │ │ -
BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
Definition matrixmatrix.hh:547
│ │ │ │ -
Matrix::size_type size_type
Definition matrixmatrix.hh:418
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type
Definition matrixmatrix.hh:157
│ │ │ │ -
@ do_break
Definition matrixmatrix.hh:155
│ │ │ │ -
@ do_break
Definition matrixmatrix.hh:324
│ │ │ │ -
@ do_break
Definition matrixmatrix.hh:185
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
460 std::size_t getGamma() const
│ │ │ │ +
461 {
│ │ │ │ +
462 return gamma_;
│ │ │ │ +
463 }
│ │ │ │ +
│ │ │ │ +
464
│ │ │ │ +
│ │ │ │ +
469 void setAdditive(bool additive)
│ │ │ │ +
470 {
│ │ │ │ +
471 additive_=additive;
│ │ │ │ +
472 }
│ │ │ │ +
│ │ │ │ +
473
│ │ │ │ +
│ │ │ │ +
478 bool getAdditive() const
│ │ │ │ +
479 {
│ │ │ │ +
480 return additive_;
│ │ │ │ +
481 }
│ │ │ │ +
│ │ │ │ +
482
│ │ │ │ +
│ │ │ │ +
493 Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
│ │ │ │ +
494 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
│ │ │ │ + │ │ │ │ +
496 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1),
│ │ │ │ +
497 additive_(false)
│ │ │ │ +
498 {}
│ │ │ │ +
│ │ │ │ +
499 private:
│ │ │ │ +
500 int debugLevel_;
│ │ │ │ +
501 std::size_t preSmoothSteps_;
│ │ │ │ +
502 std::size_t postSmoothSteps_;
│ │ │ │ +
503 std::size_t gamma_;
│ │ │ │ +
504 bool additive_;
│ │ │ │ +
505 };
│ │ │ │ +
│ │ │ │ +
506
│ │ │ │ +
507 } //namespace AMG
│ │ │ │ +
508
│ │ │ │ +
509} //namespace Dune
│ │ │ │ +
510#endif
│ │ │ │ +
void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an anisotropic problem.
Definition parameters.hh:132
│ │ │ │ +
void setAdditive(bool additive)
Set whether to use additive multigrid.
Definition parameters.hh:469
│ │ │ │ +
void setSkipIsolated(bool skip)
Set whether isolated aggregates will not be represented on the coarse level.
Definition parameters.hh:171
│ │ │ │ +
void setProlongationDampingFactor(double d)
Set the damping factor for the prolongation.
Definition parameters.hh:332
│ │ │ │ +
double alpha() const
Get the scaling value for marking connections as strong. Default value is 1/3.
Definition parameters.hh:70
│ │ │ │ +
void setMaxAggregateSize(std::size_t size)
Set the maximum number of nodes a aggregate is allowed to have.
Definition parameters.hh:202
│ │ │ │ +
void setMinCoarsenRate(double rate)
Set the minimum coarsening rate to be achieved in each coarsening.
Definition parameters.hh:296
│ │ │ │ +
double minCoarsenRate() const
Get the minimum coarsening rate to be achieved.
Definition parameters.hh:304
│ │ │ │ +
std::size_t maxAggregateSize() const
Get the maximum number of nodes a aggregate is allowed to have.
Definition parameters.hh:194
│ │ │ │ +
void setAlpha(double a)
Set the scaling value for marking connections as strong. Default value is 1/3.
Definition parameters.hh:61
│ │ │ │ +
double beta() const
Get the threshold for marking nodes as isolated. The default value is 1.0E-5.
Definition parameters.hh:52
│ │ │ │ +
std::size_t maxConnectivity() const
Get the maximum number of connections a aggregate is allowed to have.
Definition parameters.hh:211
│ │ │ │ +
int coarsenTarget() const
Get the maximum number of unknowns allowed on the coarsest level.
Definition parameters.hh:286
│ │ │ │ +
void setAccumulate(AccumulationMode accu)
Set whether he data should be accumulated on fewer processes on coarser levels.
Definition parameters.hh:319
│ │ │ │ +
double getProlongationDampingFactor() const
Get the damping factor for the prolongation.
Definition parameters.hh:342
│ │ │ │ +
AccumulationMode accumulate() const
Whether the data should be accumulated on fewer processes on coarser levels.
Definition parameters.hh:312
│ │ │ │ +
void setMaxConnectivity(std::size_t connectivity)
Set the maximum number of connections a aggregate is allowed to have.
Definition parameters.hh:220
│ │ │ │ +
std::size_t minAggregateSize() const
Get the minimum number of nodes a aggregate has to consist of.
Definition parameters.hh:180
│ │ │ │ +
bool getAdditive() const
Get whether to use additive multigrid.
Definition parameters.hh:478
│ │ │ │ +
void setMaxLevel(int l)
Set the maximum number of levels allowed in the hierarchy.
Definition parameters.hh:263
│ │ │ │ +
void setDebugLevel(int level)
Set the debugging level.
Definition parameters.hh:401
│ │ │ │ +
std::size_t getGamma() const
Get the value of gamma; 1 for V-cycle, 2 for W-cycle.
Definition parameters.hh:460
│ │ │ │ +
void setNoPostSmoothSteps(std::size_t steps)
Set the number of postsmoothing steps to apply.
Definition parameters.hh:437
│ │ │ │ +
std::size_t getNoPreSmoothSteps() const
Get the number of presmoothing steps to apply.
Definition parameters.hh:428
│ │ │ │ +
DependencyParameters()
Constructor.
Definition parameters.hh:34
│ │ │ │ +
void setMinAggregateSize(std::size_t size)
Set the minimum number of nodes a aggregate has to consist of.
Definition parameters.hh:188
│ │ │ │ +
int maxLevel() const
Get the maximum number of levels allowed in the hierarchy.
Definition parameters.hh:270
│ │ │ │ +
void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an isotropic problem.
Definition parameters.hh:109
│ │ │ │ +
AggregationParameters()
Constructor.
Definition parameters.hh:95
│ │ │ │ +
bool skipIsolated() const
Whether isolated aggregates will not be represented on the coarse level.
Definition parameters.hh:161
│ │ │ │ +
Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition parameters.hh:493
│ │ │ │ +
void setCoarsenTarget(int nodes)
Set the maximum number of unknowns allowed on the coarsest level.
Definition parameters.hh:278
│ │ │ │ +
void setNoPreSmoothSteps(std::size_t steps)
Set the number of presmoothing steps to apply.
Definition parameters.hh:420
│ │ │ │ +
AccumulationMode
Identifiers for the different accumulation modes.
Definition parameters.hh:232
│ │ │ │ +
void setBeta(double b)
Set threshold for marking nodes as isolated. The default value is 1.0E-5.
Definition parameters.hh:42
│ │ │ │ +
std::size_t maxDistance() const
Get the maximal distance allowed between two nodes in a aggregate.
Definition parameters.hh:144
│ │ │ │ +
CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition parameters.hh:356
│ │ │ │ +
void setGamma(std::size_t gamma)
Set the value of gamma; 1 for V-cycle, 2 for W-cycle.
Definition parameters.hh:453
│ │ │ │ +
void setAccumulate(bool accu)
Definition parameters.hh:324
│ │ │ │ +
void setMaxDistance(std::size_t distance)
Set the maximal distance allowed between two nodes in a aggregate.
Definition parameters.hh:154
│ │ │ │ +
int debugLevel() const
Get the debugging Level.
Definition parameters.hh:411
│ │ │ │ +
std::size_t getNoPostSmoothSteps() const
Get the number of postsmoothing steps to apply.
Definition parameters.hh:445
│ │ │ │ +
@ atOnceAccu
Accumulate data to one process at once.
Definition parameters.hh:244
│ │ │ │ +
@ noAccu
No data accumulution.
Definition parameters.hh:238
│ │ │ │ +
@ successiveAccu
Successively accumulate to fewer processes.
Definition parameters.hh:248
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ -
row_type::Iterator ColIterator
Iterator for the entries of each row.
Definition bcrsmatrix.hh:704
│ │ │ │ -
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ -
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ -
Iterator access to matrix rows
Definition bcrsmatrix.hh:579
│ │ │ │ -
Iterator class for sequential creation of blocks
Definition bcrsmatrix.hh:957
│ │ │ │ -
void insert(size_type j)
put column index in row
Definition bcrsmatrix.hh:1064
│ │ │ │ -
Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
Definition matrixmatrix.hh:510
│ │ │ │ -
Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
Definition matrixmatrix.hh:535
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ +
Parameters needed to check whether a node depends on another.
Definition parameters.hh:31
│ │ │ │ +
Parameters needed for the aggregation process.
Definition parameters.hh:84
│ │ │ │ +
Parameters for the complete coarsening process.
Definition parameters.hh:258
│ │ │ │ +
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,742 +1,462 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -matrixmatrix.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +parameters.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MATRIXMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_MATRIXMATRIX_HH │ │ │ │ │ +5#ifndef DUNE_AMG_PARAMETERS_HH │ │ │ │ │ +6#define DUNE_AMG_PARAMETERS_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#include │ │ │ │ │ 9 │ │ │ │ │ -10#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13namespace _D_u_n_e │ │ │ │ │ -14{ │ │ │ │ │ -15 │ │ │ │ │ -26 namespace │ │ │ │ │ -27 { │ │ │ │ │ -28 │ │ │ │ │ -37 template │ │ │ │ │ -38 struct NonzeroPatternTraverser │ │ │ │ │ -39 {}; │ │ │ │ │ -40 │ │ │ │ │ -41 │ │ │ │ │ -42 template<> │ │ │ │ │ -43 struct NonzeroPatternTraverser<0> │ │ │ │ │ -44 { │ │ │ │ │ -45 template │ │ │ │ │ -46 static void traverse(const _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,A1>& A, │ │ │ │ │ -47 const _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& B, │ │ │ │ │ -48 F& func) │ │ │ │ │ -49 { │ │ │ │ │ -50 if(A.M()!=B.N()) │ │ │ │ │ -51 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "< entriesAccu(res); │ │ │ │ │ -495 NonzeroPatternTraverser::traverse(mat1,mat2,entriesAccu); │ │ │ │ │ -496 //std::cout<<"Calculating entries took "< │ │ │ │ │ -_5_0_9 struct _M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ -510 {}; │ │ │ │ │ -511 │ │ │ │ │ -512 template │ │ │ │ │ -_5_1_3 struct _M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_F_i_e_l_d_M_a_t_r_i_x,_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -514 { │ │ │ │ │ -_5_1_5 typedef _F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_> _t_y_p_e; │ │ │ │ │ -516 }; │ │ │ │ │ -517 │ │ │ │ │ -518 template │ │ │ │ │ -_5_1_9 struct _M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A │ │ │ │ │ ->,_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A1 > > │ │ │ │ │ -520 { │ │ │ │ │ -521 typedef _B_C_R_S_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e │ │ │ │ │ -_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type, │ │ │ │ │ -_5_2_2 std::allocator,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type> > _t_y_p_e; │ │ │ │ │ -523 }; │ │ │ │ │ -524 │ │ │ │ │ -525 │ │ │ │ │ -533 template │ │ │ │ │ -_5_3_4 struct _T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ -535 {}; │ │ │ │ │ -536 │ │ │ │ │ -537 template │ │ │ │ │ -_5_3_8 struct _T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_F_i_e_l_d_M_a_t_r_i_x,_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -539 { │ │ │ │ │ -_5_4_0 typedef _F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_> _t_y_p_e; │ │ │ │ │ -541 }; │ │ │ │ │ -542 │ │ │ │ │ -543 template │ │ │ │ │ -_5_4_4 struct _T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A │ │ │ │ │ ->,_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A1 > > │ │ │ │ │ -545 { │ │ │ │ │ -546 typedef _B_C_R_S_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e │ │ │ │ │ -_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type, │ │ │ │ │ -_5_4_7 std::allocator,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type> > _t_y_p_e; │ │ │ │ │ -548 }; │ │ │ │ │ -549 │ │ │ │ │ -550 │ │ │ │ │ -559 template │ │ │ │ │ -_5_6_0 void _m_a_t_M_u_l_t_T_r_a_n_s_p_o_s_e_M_a_t(_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,A>& res, const │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A1>& _m_a_t, │ │ │ │ │ -561 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& matt, [[maybe_unused]] bool │ │ │ │ │ -tryHard=false) │ │ │ │ │ -562 { │ │ │ │ │ -563 matMultMat<2>(res,_m_a_t, matt); │ │ │ │ │ -564 } │ │ │ │ │ -565 │ │ │ │ │ -574 template │ │ │ │ │ -_5_7_5 void _m_a_t_M_u_l_t_M_a_t(_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A>& res, const │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,A1>& _m_a_t, │ │ │ │ │ -576 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& matt, bool tryHard=false) │ │ │ │ │ -577 { │ │ │ │ │ -578 matMultMat<0>(res,_m_a_t, matt); │ │ │ │ │ -579 } │ │ │ │ │ -580 │ │ │ │ │ -589 template │ │ │ │ │ -_5_9_0 void _t_r_a_n_s_p_o_s_e_M_a_t_M_u_l_t_M_a_t(_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A>& res, const │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_n_>,A1>& _m_a_t, │ │ │ │ │ -591 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& matt, [[maybe_unused]] bool │ │ │ │ │ -tryHard=false) │ │ │ │ │ -592 { │ │ │ │ │ -593 matMultMat<1>(res,_m_a_t, matt); │ │ │ │ │ -594 } │ │ │ │ │ -595 │ │ │ │ │ -596} │ │ │ │ │ -597#endif │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _0_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -FieldMatrix< T, n, m > type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:515 │ │ │ │ │ -_D_u_n_e_:_:_t_r_a_n_s_p_o_s_e_M_a_t_M_u_l_t_M_a_t │ │ │ │ │ -void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< │ │ │ │ │ -T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ -Calculate product of a transposed sparse matrix with another sparse matrices │ │ │ │ │ -( ). │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:590 │ │ │ │ │ -_D_u_n_e_:_:_m_a_t_M_u_l_t_M_a_t │ │ │ │ │ -void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< │ │ │ │ │ -FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 │ │ │ │ │ -> &matt, bool tryHard=false) │ │ │ │ │ -Calculate product of two sparse matrices ( ). │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:575 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_R_o_w │ │ │ │ │ -Matrix::RowIterator Row │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _2_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:417 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _1_,_ _T_,_ _T_A_,_ _n_,_ _m_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _0_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:380 │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_C_o_l │ │ │ │ │ -Matrix::ColIterator Col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:327 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _1_,_ _T_,_ _T_A_,_ _n_,_ _m_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m │ │ │ │ │ -_>_ _>_:_:_t_y_p_e │ │ │ │ │ -FieldMatrix< T, n, m > type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:540 │ │ │ │ │ -_D_u_n_e_:_:_m_a_t_M_u_l_t_T_r_a_n_s_p_o_s_e_M_a_t │ │ │ │ │ -void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< │ │ │ │ │ -T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ -Calculate product of a sparse matrix with a transposed sparse matrices ( ). │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_I_n_i_t_i_a_l_i_z_e_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _1_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:398 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ -Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _A_ _>_,_ _B_C_R_S_M_a_t_r_i_x_< │ │ │ │ │ -_F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, │ │ │ │ │ -k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k │ │ │ │ │ ->, FieldMatrix< T, k, m > >::type > > type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:522 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _1_,_ _T_,_ _T_A_,_ _n_,_ _m_ _>_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Matrix::CreateIterator CreateIterator │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:325 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _1_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:399 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Matrix::CreateIterator CreateIterator │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:187 │ │ │ │ │ -_D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_,_ _A_ _>_, │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, │ │ │ │ │ -k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k │ │ │ │ │ ->, FieldMatrix< T, k, m > >::type > > type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:547 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _2_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:418 │ │ │ │ │ -_D_u_n_e_:_:_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_I_n_i_t_i_a_l_i_z_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_I_n_i_t_i_a_l_i_z_e_r_:_:_d_o___b_r_e_a_k │ │ │ │ │ -@ do_break │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_d_o___b_r_e_a_k │ │ │ │ │ -@ do_break │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:324 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_d_o___b_r_e_a_k │ │ │ │ │ -@ do_break │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:185 │ │ │ │ │ +_4_6_0 std::size_t _g_e_t_G_a_m_m_a() const │ │ │ │ │ +461 { │ │ │ │ │ +462 return gamma_; │ │ │ │ │ +463 } │ │ │ │ │ +464 │ │ │ │ │ +_4_6_9 void _s_e_t_A_d_d_i_t_i_v_e(bool additive) │ │ │ │ │ +470 { │ │ │ │ │ +471 additive_=additive; │ │ │ │ │ +472 } │ │ │ │ │ +473 │ │ │ │ │ +_4_7_8 bool _g_e_t_A_d_d_i_t_i_v_e() const │ │ │ │ │ +479 { │ │ │ │ │ +480 return additive_; │ │ │ │ │ +481 } │ │ │ │ │ +482 │ │ │ │ │ +_4_9_3 _P_a_r_a_m_e_t_e_r_s(int _m_a_x_L_e_v_e_l=100, int _c_o_a_r_s_e_n_T_a_r_g_e_t=1000, double │ │ │ │ │ +_m_i_n_C_o_a_r_s_e_n_R_a_t_e=1.2, │ │ │ │ │ +494 double prolongDamp=1.6, _A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e _a_c_c_u_m_u_l_a_t_e=_s_u_c_c_e_s_s_i_v_e_A_c_c_u) │ │ │ │ │ +495 : _C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s(_m_a_x_L_e_v_e_l, _c_o_a_r_s_e_n_T_a_r_g_e_t, _m_i_n_C_o_a_r_s_e_n_R_a_t_e, │ │ │ │ │ +prolongDamp, _a_c_c_u_m_u_l_a_t_e) │ │ │ │ │ +496 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1), │ │ │ │ │ +497 additive_(false) │ │ │ │ │ +498 {} │ │ │ │ │ +499 private: │ │ │ │ │ +500 int debugLevel_; │ │ │ │ │ +501 std::size_t preSmoothSteps_; │ │ │ │ │ +502 std::size_t postSmoothSteps_; │ │ │ │ │ +503 std::size_t gamma_; │ │ │ │ │ +504 bool additive_; │ │ │ │ │ +505 }; │ │ │ │ │ +506 │ │ │ │ │ +507 } //namespace AMG │ │ │ │ │ +508 │ │ │ │ │ +509} //namespace Dune │ │ │ │ │ +510#endif │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c │ │ │ │ │ +void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ +Sets reasonable default values for an anisotropic problem. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_d_d_i_t_i_v_e │ │ │ │ │ +void setAdditive(bool additive) │ │ │ │ │ +Set whether to use additive multigrid. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:469 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_S_k_i_p_I_s_o_l_a_t_e_d │ │ │ │ │ +void setSkipIsolated(bool skip) │ │ │ │ │ +Set whether isolated aggregates will not be represented on the coarse level. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r │ │ │ │ │ +void setProlongationDampingFactor(double d) │ │ │ │ │ +Set the damping factor for the prolongation. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:332 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_a_l_p_h_a │ │ │ │ │ +double alpha() const │ │ │ │ │ +Get the scaling value for marking connections as strong. Default value is 1/3. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ +void setMaxAggregateSize(std::size_t size) │ │ │ │ │ +Set the maximum number of nodes a aggregate is allowed to have. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_i_n_C_o_a_r_s_e_n_R_a_t_e │ │ │ │ │ +void setMinCoarsenRate(double rate) │ │ │ │ │ +Set the minimum coarsening rate to be achieved in each coarsening. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_m_i_n_C_o_a_r_s_e_n_R_a_t_e │ │ │ │ │ +double minCoarsenRate() const │ │ │ │ │ +Get the minimum coarsening rate to be achieved. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ +std::size_t maxAggregateSize() const │ │ │ │ │ +Get the maximum number of nodes a aggregate is allowed to have. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_l_p_h_a │ │ │ │ │ +void setAlpha(double a) │ │ │ │ │ +Set the scaling value for marking connections as strong. Default value is 1/3. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_b_e_t_a │ │ │ │ │ +double beta() const │ │ │ │ │ +Get the threshold for marking nodes as isolated. The default value is 1.0E-5. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ +std::size_t maxConnectivity() const │ │ │ │ │ +Get the maximum number of connections a aggregate is allowed to have. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_c_o_a_r_s_e_n_T_a_r_g_e_t │ │ │ │ │ +int coarsenTarget() const │ │ │ │ │ +Get the maximum number of unknowns allowed on the coarsest level. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_c_c_u_m_u_l_a_t_e │ │ │ │ │ +void setAccumulate(AccumulationMode accu) │ │ │ │ │ +Set whether he data should be accumulated on fewer processes on coarser levels. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r │ │ │ │ │ +double getProlongationDampingFactor() const │ │ │ │ │ +Get the damping factor for the prolongation. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_a_c_c_u_m_u_l_a_t_e │ │ │ │ │ +AccumulationMode accumulate() const │ │ │ │ │ +Whether the data should be accumulated on fewer processes on coarser levels. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:312 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ +void setMaxConnectivity(std::size_t connectivity) │ │ │ │ │ +Set the maximum number of connections a aggregate is allowed to have. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:220 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_i_n_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ +std::size_t minAggregateSize() const │ │ │ │ │ +Get the minimum number of nodes a aggregate has to consist of. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_A_d_d_i_t_i_v_e │ │ │ │ │ +bool getAdditive() const │ │ │ │ │ +Get whether to use additive multigrid. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:478 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_L_e_v_e_l │ │ │ │ │ +void setMaxLevel(int l) │ │ │ │ │ +Set the maximum number of levels allowed in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ +void setDebugLevel(int level) │ │ │ │ │ +Set the debugging level. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:401 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_G_a_m_m_a │ │ │ │ │ +std::size_t getGamma() const │ │ │ │ │ +Get the value of gamma; 1 for V-cycle, 2 for W-cycle. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:460 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_N_o_P_o_s_t_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ +void setNoPostSmoothSteps(std::size_t steps) │ │ │ │ │ +Set the number of postsmoothing steps to apply. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:437 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_N_o_P_r_e_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ +std::size_t getNoPreSmoothSteps() const │ │ │ │ │ +Get the number of presmoothing steps to apply. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:428 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +DependencyParameters() │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_i_n_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ +void setMinAggregateSize(std::size_t size) │ │ │ │ │ +Set the minimum number of nodes a aggregate has to consist of. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_L_e_v_e_l │ │ │ │ │ +int maxLevel() const │ │ │ │ │ +Get the maximum number of levels allowed in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c │ │ │ │ │ +void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ +Sets reasonable default values for an isotropic problem. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +AggregationParameters() │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_k_i_p_I_s_o_l_a_t_e_d │ │ │ │ │ +bool skipIsolated() const │ │ │ │ │ +Whether isolated aggregates will not be represented on the coarse level. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, │ │ │ │ │ +double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:493 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_C_o_a_r_s_e_n_T_a_r_g_e_t │ │ │ │ │ +void setCoarsenTarget(int nodes) │ │ │ │ │ +Set the maximum number of unknowns allowed on the coarsest level. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:278 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_N_o_P_r_e_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ +void setNoPreSmoothSteps(std::size_t steps) │ │ │ │ │ +Set the number of presmoothing steps to apply. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:420 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e │ │ │ │ │ +AccumulationMode │ │ │ │ │ +Identifiers for the different accumulation modes. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_B_e_t_a │ │ │ │ │ +void setBeta(double b) │ │ │ │ │ +Set threshold for marking nodes as isolated. The default value is 1.0E-5. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_D_i_s_t_a_n_c_e │ │ │ │ │ +std::size_t maxDistance() const │ │ │ │ │ +Get the maximal distance allowed between two nodes in a aggregate. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double │ │ │ │ │ +minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode │ │ │ │ │ +accumulate=successiveAccu) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:356 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_G_a_m_m_a │ │ │ │ │ +void setGamma(std::size_t gamma) │ │ │ │ │ +Set the value of gamma; 1 for V-cycle, 2 for W-cycle. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:453 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_c_c_u_m_u_l_a_t_e │ │ │ │ │ +void setAccumulate(bool accu) │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:324 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_D_i_s_t_a_n_c_e │ │ │ │ │ +void setMaxDistance(std::size_t distance) │ │ │ │ │ +Set the maximal distance allowed between two nodes in a aggregate. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_d_e_b_u_g_L_e_v_e_l │ │ │ │ │ +int debugLevel() const │ │ │ │ │ +Get the debugging Level. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:411 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_N_o_P_o_s_t_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ +std::size_t getNoPostSmoothSteps() const │ │ │ │ │ +Get the number of postsmoothing steps to apply. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:445 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_a_t_O_n_c_e_A_c_c_u │ │ │ │ │ +@ atOnceAccu │ │ │ │ │ +Accumulate data to one process at once. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_n_o_A_c_c_u │ │ │ │ │ +@ noAccu │ │ │ │ │ +No data accumulution. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:238 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u │ │ │ │ │ +@ successiveAccu │ │ │ │ │ +Successively accumulate to fewer processes. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:248 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::Iterator ColIterator │ │ │ │ │ -Iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:704 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access and the size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ -CreateIterator createbegin() │ │ │ │ │ -get initial create iterator │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator access to matrix rows │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:579 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator class for sequential creation of blocks │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:957 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_s_e_r_t │ │ │ │ │ -void insert(size_type j) │ │ │ │ │ -put column index in row │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1064 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ -Helper TMP to get the result type of a sparse matrix matrix multiplication ( ) │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:510 │ │ │ │ │ -_D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ -Helper TMP to get the result type of a sparse matrix matrix multiplication ( ) │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:535 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +Parameters needed to check whether a node depends on another. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +Parameters needed for the aggregation process. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +Parameters for the complete coarsening process. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +All parameters for AMG. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00068.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bcrsmatrix.hh File Reference │ │ │ │ +dune-istl: pinfo.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,79 +65,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
bcrsmatrix.hh File Reference
│ │ │ │ +
pinfo.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Implementation of the BCRSMatrix class. │ │ │ │ -More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <set>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <numeric>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include "matrixutils.hh"
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ -#include <dune/common/scalarvectorview.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ +
#include <dune/common/parallel/communication.hh>
│ │ │ │ +#include <dune/common/enumset.hh>
│ │ │ │ +#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ +#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ +#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ +#include <dune/common/parallel/interface.hh>
│ │ │ │ +#include <dune/common/parallel/communicator.hh>
│ │ │ │ +#include <dune/istl/solvercategory.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::CompressionStatistics< size_type >
 Statistics about compression achieved in implicit mode. More...
 
class  Dune::ImplicitMatrixBuilder< M_ >
 A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mode. More...
 
class  Dune::ImplicitMatrixBuilder< M_ >::row_object
 Proxy row object for entry access. More...
 
class  Dune::BCRSMatrix< B, A >
 A sparse block matrix with compressed row storage. More...
 
class  Dune::BCRSMatrix< B, A >::RealRowIterator< T >
 Iterator access to matrix rows More...
 
class  Dune::BCRSMatrix< B, A >::CreateIterator
 Iterator class for sequential creation of blocks More...
 
struct  Dune::FieldTraits< BCRSMatrix< B, A > >
class  Dune::Amg::SequentialInformation
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Implementation of the BCRSMatrix class.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,58 +1,28 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -bcrsmatrix.hh File Reference │ │ │ │ │ -Implementation of the BCRSMatrix class. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +pinfo.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_<_ _s_i_z_e___t_y_p_e_ _> │ │ │ │ │ -  Statistics about compression achieved in implicit mode. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_<_ _M___ _> │ │ │ │ │ -  A wrapper for uniform access to the _B_C_R_S_M_a_t_r_i_x during and after the │ │ │ │ │ - build stage in implicit build mode. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_<_ _M___ _>_:_:_r_o_w___o_b_j_e_c_t │ │ │ │ │ -  Proxy row object for entry access. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _> │ │ │ │ │ -  A sparse block matrix with compressed row storage. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_ _T_ _> │ │ │ │ │ -  Iterator access to matrix rows _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -  Iterator class for sequential creation of blocks _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bcrsmatrix.hh Source File │ │ │ │ +dune-istl: pinfo.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,2076 +70,174 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
bcrsmatrix.hh
│ │ │ │ +
pinfo.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_ISTL_BCRSMATRIX_HH
│ │ │ │ -
7#define DUNE_ISTL_BCRSMATRIX_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <cmath>
│ │ │ │ -
10#include <complex>
│ │ │ │ -
11#include <set>
│ │ │ │ -
12#include <iostream>
│ │ │ │ -
13#include <algorithm>
│ │ │ │ -
14#include <numeric>
│ │ │ │ -
15#include <vector>
│ │ │ │ -
16#include <map>
│ │ │ │ -
17#include <memory>
│ │ │ │ +
5#ifndef DUNE_AMG_PINFO_HH
│ │ │ │ +
6#define DUNE_AMG_PINFO_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/parallel/communication.hh>
│ │ │ │ +
9#include <dune/common/enumset.hh>
│ │ │ │ +
10
│ │ │ │ +
11#if HAVE_MPI
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ +
14#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ +
15#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ +
16#include <dune/common/parallel/interface.hh>
│ │ │ │ +
17#include <dune/common/parallel/communicator.hh>
│ │ │ │
18
│ │ │ │ -
19#include "istlexception.hh"
│ │ │ │ -
20#include "bvector.hh"
│ │ │ │ -
21#include "matrixutils.hh"
│ │ │ │ -
22#include <dune/common/stdstreams.hh>
│ │ │ │ -
23#include <dune/common/iteratorfacades.hh>
│ │ │ │ -
24#include <dune/common/typetraits.hh>
│ │ │ │ -
25#include <dune/common/ftraits.hh>
│ │ │ │ -
26#include <dune/common/scalarvectorview.hh>
│ │ │ │ -
27#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -
28
│ │ │ │ - │ │ │ │ -
30
│ │ │ │ -
35namespace Dune {
│ │ │ │ -
36
│ │ │ │ -
76 template<typename M>
│ │ │ │ -
77 struct MatrixDimension;
│ │ │ │ -
78
│ │ │ │ -
80
│ │ │ │ -
86 template<typename size_type>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
88 {
│ │ │ │ -
90 double avg;
│ │ │ │ -
92 size_type maximum;
│ │ │ │ -
94 size_type overflow_total;
│ │ │ │ -
96
│ │ │ │ -
99 double mem_ratio;
│ │ │ │ -
100 };
│ │ │ │ +
19#endif
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ +
22namespace Dune
│ │ │ │ +
23{
│ │ │ │ +
24 namespace Amg
│ │ │ │ +
25 {
│ │ │ │ +
26
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
28 {
│ │ │ │ +
29 public:
│ │ │ │ +
30 typedef Communication<void*> MPICommunicator;
│ │ │ │ +
31 typedef EmptySet<int> CopyFlags;
│ │ │ │ +
32 typedef AllSet<int> OwnerSet;
│ │ │ │ +
33
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
36 }
│ │ │ │ +
│ │ │ │ +
37
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
39 {
│ │ │ │ +
40 return comm_;
│ │ │ │ +
41 }
│ │ │ │ +
│ │ │ │ +
42
│ │ │ │ +
│ │ │ │ +
43 int procs() const
│ │ │ │ +
44 {
│ │ │ │ +
45 return 1;
│ │ │ │ +
46 }
│ │ │ │ +
│ │ │ │ +
47
│ │ │ │ +
48 template<typename T>
│ │ │ │ +
│ │ │ │ +
49 T globalSum(const T& t) const
│ │ │ │ +
50 {
│ │ │ │ +
51 return t;
│ │ │ │ +
52 }
│ │ │ │ +
│ │ │ │ +
53
│ │ │ │ + │ │ │ │ +
55
│ │ │ │ +
56 void buildGlobalLookup(std::size_t){}
│ │ │ │ +
57
│ │ │ │ + │ │ │ │ +
59
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 {
│ │ │ │ +
62 return gli;
│ │ │ │ +
63 }
│ │ │ │ +
│ │ │ │ +
64
│ │ │ │ +
65 template<class V>
│ │ │ │ +
│ │ │ │ +
66 void copyOwnerToAll([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const
│ │ │ │ +
67 {}
│ │ │ │ +
│ │ │ │ +
68
│ │ │ │ +
69 template<class V>
│ │ │ │ +
│ │ │ │ +
70 void project([[maybe_unused]] V& v) const
│ │ │ │ +
71 {}
│ │ │ │ +
│ │ │ │ +
72
│ │ │ │ +
73 template<class T1, class T2>
│ │ │ │ +
│ │ │ │ +
74 void dot (const T1&, const T1&, T2&) const
│ │ │ │ +
75 {
│ │ │ │ +
76 // This function should never be called
│ │ │ │ +
77 std::abort();
│ │ │ │ +
78 }
│ │ │ │ +
│ │ │ │ +
79
│ │ │ │ +
80 template<class T1>
│ │ │ │ +
│ │ │ │ +
81 typename FieldTraits<typename T1::field_type>::real_type norm (const T1&) const
│ │ │ │ +
82 {
│ │ │ │ +
83 // This function should never be called
│ │ │ │ +
84 std::abort();
│ │ │ │ +
85 }
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
87 template<class T>
│ │ │ │ +
│ │ │ │ +
88 SequentialInformation(const Communication<T>&)
│ │ │ │ +
89 {}
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
92 {}
│ │ │ │ +
│ │ │ │ +
93
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
95 {}
│ │ │ │ +
│ │ │ │ +
96 private:
│ │ │ │ +
97 MPICommunicator comm_;
│ │ │ │ + │ │ │ │ +
99 };
│ │ │ │
│ │ │ │ +
100
│ │ │ │
101
│ │ │ │ -
103
│ │ │ │ -
115 template<class M_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 {
│ │ │ │ -
118
│ │ │ │ -
119 public:
│ │ │ │ -
120
│ │ │ │ -
122 typedef M_ Matrix;
│ │ │ │ -
123
│ │ │ │ - │ │ │ │ -
126
│ │ │ │ -
128 typedef typename Matrix::size_type size_type;
│ │ │ │ -
129
│ │ │ │ -
131
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
137 {
│ │ │ │ -
138
│ │ │ │ -
139 public:
│ │ │ │ -
140
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
143 {
│ │ │ │ -
144 return _m.entry(_i,j);
│ │ │ │ -
145 }
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
147#ifndef DOXYGEN
│ │ │ │ -
148
│ │ │ │ - │ │ │ │ -
150 : _m(m)
│ │ │ │ -
151 , _i(i)
│ │ │ │ -
152 {}
│ │ │ │ -
153
│ │ │ │ -
154#endif
│ │ │ │ -
155
│ │ │ │ -
156 private:
│ │ │ │ -
157
│ │ │ │ -
158 Matrix& _m;
│ │ │ │ - │ │ │ │ -
160
│ │ │ │ -
161 };
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
164
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
171 : _m(m)
│ │ │ │ -
172 {
│ │ │ │ -
173 if (m.buildMode() != Matrix::implicit)
│ │ │ │ -
174 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix in implicit build mode");
│ │ │ │ -
175 if (m.buildStage() != Matrix::building)
│ │ │ │ -
176 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix with set size that has not been compressed() yet");
│ │ │ │ -
177 }
│ │ │ │ -
│ │ │ │ -
178
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ -
194 ImplicitMatrixBuilder(Matrix& m, size_type rows, size_type cols, size_type avg_cols_per_row, double overflow_fraction)
│ │ │ │ -
195 : _m(m)
│ │ │ │ -
196 {
│ │ │ │ -
197 if (m.buildStage() != Matrix::notAllocated)
│ │ │ │ -
198 DUNE_THROW(BCRSMatrixError,"You can only set up a matrix for this ImplicitBuilder if it has no memory allocated yet");
│ │ │ │ -
199 m.setBuildMode(Matrix::implicit);
│ │ │ │ -
200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction);
│ │ │ │ -
201 m.setSize(rows,cols);
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
206 {
│ │ │ │ -
207 return row_object(_m,i);
│ │ │ │ -
208 }
│ │ │ │ -
│ │ │ │ -
209
│ │ │ │ -
│ │ │ │ -
211 size_type N() const
│ │ │ │ -
212 {
│ │ │ │ -
213 return _m.N();
│ │ │ │ -
214 }
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
│ │ │ │ -
217 size_type M() const
│ │ │ │ -
218 {
│ │ │ │ -
219 return _m.M();
│ │ │ │ -
220 }
│ │ │ │ -
│ │ │ │ -
221
│ │ │ │ -
222 private:
│ │ │ │ -
223
│ │ │ │ -
224 Matrix& _m;
│ │ │ │ -
225
│ │ │ │ -
226 };
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
464 template<class B, class A=std::allocator<B> >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
466 {
│ │ │ │ -
467 friend struct MatrixDimension<BCRSMatrix>;
│ │ │ │ -
468 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
482 built=3
│ │ │ │ -
483 };
│ │ │ │ -
│ │ │ │ -
484
│ │ │ │ -
485 //===== type definitions and constants
│ │ │ │ -
486
│ │ │ │ -
488 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
489
│ │ │ │ -
491 typedef B block_type;
│ │ │ │ -
492
│ │ │ │ -
494 typedef A allocator_type;
│ │ │ │ -
495
│ │ │ │ -
497 typedef Imp::CompressedBlockVectorWindow<B,A> row_type;
│ │ │ │ -
498
│ │ │ │ -
500 typedef typename A::size_type size_type;
│ │ │ │ -
501
│ │ │ │ -
503 typedef ::Dune::CompressionStatistics<size_type> CompressionStatistics;
│ │ │ │ -
504
│ │ │ │ -
506 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
507 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ -
508
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
543 unknown
│ │ │ │ -
544 };
│ │ │ │ -
│ │ │ │ -
545
│ │ │ │ -
546 //===== random access interface to rows of the matrix
│ │ │ │ -
547
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
550 {
│ │ │ │ -
551#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
552 if (build_mode == implicit && ready != built)
│ │ │ │ -
553 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
│ │ │ │ -
554 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
│ │ │ │ -
555 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
556#endif
│ │ │ │ -
557 return r[i];
│ │ │ │ -
558 }
│ │ │ │ -
│ │ │ │ -
559
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
562 {
│ │ │ │ -
563#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
564 if (build_mode == implicit && ready != built)
│ │ │ │ -
565 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
│ │ │ │ -
566 if (built!=ready) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
│ │ │ │ -
567 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
568#endif
│ │ │ │ -
569 return r[i];
│ │ │ │ -
570 }
│ │ │ │ -
│ │ │ │ -
571
│ │ │ │ -
572
│ │ │ │ -
573 //===== iterator interface to rows of the matrix
│ │ │ │ -
574
│ │ │ │ -
576 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
578 : public RandomAccessIteratorFacade<RealRowIterator<T>, T>
│ │ │ │ -
579 {
│ │ │ │ -
580
│ │ │ │ -
581 public:
│ │ │ │ -
583 typedef typename std::remove_const<T>::type ValueType;
│ │ │ │ -
584
│ │ │ │ -
585 friend class RandomAccessIteratorFacade<RealRowIterator<const ValueType>, const ValueType>;
│ │ │ │ -
586 friend class RandomAccessIteratorFacade<RealRowIterator<ValueType>, ValueType>;
│ │ │ │ -
587 friend class RealRowIterator<const ValueType>;
│ │ │ │ -
588 friend class RealRowIterator<ValueType>;
│ │ │ │ -
589
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
592 : p(_p), i(_i)
│ │ │ │ -
593 {}
│ │ │ │ -
│ │ │ │ -
594
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
597 : p(0), i(0)
│ │ │ │ -
598 {}
│ │ │ │ -
│ │ │ │ -
599
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
601 : p(it.p), i(it.i)
│ │ │ │ -
602 {}
│ │ │ │ -
│ │ │ │ -
603
│ │ │ │ -
604
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
607 {
│ │ │ │ -
608 return i;
│ │ │ │ -
609 }
│ │ │ │ -
│ │ │ │ -
610
│ │ │ │ -
│ │ │ │ -
611 std::ptrdiff_t distanceTo(const RealRowIterator<ValueType>& other) const
│ │ │ │ -
612 {
│ │ │ │ -
613 assert(other.p==p);
│ │ │ │ -
614 return (other.i-i);
│ │ │ │ -
615 }
│ │ │ │ -
│ │ │ │ -
616
│ │ │ │ -
│ │ │ │ -
617 std::ptrdiff_t distanceTo(const RealRowIterator<const ValueType>& other) const
│ │ │ │ -
618 {
│ │ │ │ -
619 assert(other.p==p);
│ │ │ │ -
620 return (other.i-i);
│ │ │ │ -
621 }
│ │ │ │ -
│ │ │ │ -
622
│ │ │ │ -
│ │ │ │ -
624 bool equals (const RealRowIterator<ValueType>& other) const
│ │ │ │ -
625 {
│ │ │ │ -
626 assert(other.p==p);
│ │ │ │ -
627 return i==other.i;
│ │ │ │ -
628 }
│ │ │ │ -
│ │ │ │ -
629
│ │ │ │ -
│ │ │ │ -
631 bool equals (const RealRowIterator<const ValueType>& other) const
│ │ │ │ -
632 {
│ │ │ │ -
633 assert(other.p==p);
│ │ │ │ -
634 return i==other.i;
│ │ │ │ -
635 }
│ │ │ │ -
│ │ │ │ -
636
│ │ │ │ -
637 private:
│ │ │ │ -
639 void increment()
│ │ │ │ -
640 {
│ │ │ │ -
641 ++i;
│ │ │ │ -
642 }
│ │ │ │ -
643
│ │ │ │ -
645 void decrement()
│ │ │ │ -
646 {
│ │ │ │ -
647 --i;
│ │ │ │ -
648 }
│ │ │ │ -
649
│ │ │ │ -
650 void advance(std::ptrdiff_t diff)
│ │ │ │ -
651 {
│ │ │ │ -
652 i+=diff;
│ │ │ │ -
653 }
│ │ │ │ -
654
│ │ │ │ -
655 T& elementAt(std::ptrdiff_t diff) const
│ │ │ │ -
656 {
│ │ │ │ -
657 return p[i+diff];
│ │ │ │ -
658 }
│ │ │ │ -
659
│ │ │ │ -
661 row_type& dereference () const
│ │ │ │ -
662 {
│ │ │ │ -
663 return p[i];
│ │ │ │ -
664 }
│ │ │ │ -
665
│ │ │ │ -
666 row_type* p;
│ │ │ │ -
667 size_type i;
│ │ │ │ -
668 };
│ │ │ │ -
│ │ │ │ -
669
│ │ │ │ - │ │ │ │ - │ │ │ │ -
673
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
676 {
│ │ │ │ -
677 return Iterator(r,0);
│ │ │ │ -
678 }
│ │ │ │ -
│ │ │ │ -
679
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
682 {
│ │ │ │ -
683 return Iterator(r,n);
│ │ │ │ -
684 }
│ │ │ │ -
│ │ │ │ -
685
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
689 {
│ │ │ │ -
690 return Iterator(r,n-1);
│ │ │ │ -
691 }
│ │ │ │ -
│ │ │ │ -
692
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
696 {
│ │ │ │ -
697 return Iterator(r,-1);
│ │ │ │ -
698 }
│ │ │ │ -
│ │ │ │ -
699
│ │ │ │ - │ │ │ │ -
702
│ │ │ │ -
704 typedef typename row_type::Iterator ColIterator;
│ │ │ │ -
705
│ │ │ │ - │ │ │ │ - │ │ │ │ -
709
│ │ │ │ -
710
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
713 {
│ │ │ │ -
714 return ConstIterator(r,0);
│ │ │ │ -
715 }
│ │ │ │ -
│ │ │ │ -
716
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
719 {
│ │ │ │ -
720 return ConstIterator(r,n);
│ │ │ │ -
721 }
│ │ │ │ -
│ │ │ │ -
722
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
726 {
│ │ │ │ -
727 return ConstIterator(r,n-1);
│ │ │ │ -
728 }
│ │ │ │ -
│ │ │ │ -
729
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
733 {
│ │ │ │ -
734 return ConstIterator(r,-1);
│ │ │ │ -
735 }
│ │ │ │ -
│ │ │ │ -
736
│ │ │ │ - │ │ │ │ -
739
│ │ │ │ -
741 typedef typename row_type::ConstIterator ConstColIterator;
│ │ │ │ -
742
│ │ │ │ -
743 //===== constructors & resizers
│ │ │ │ -
744
│ │ │ │ -
745 // we use a negative compressionBufferSize to indicate that the implicit
│ │ │ │ -
746 // mode parameters have not been set yet
│ │ │ │ -
747
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
750 : build_mode(unknown), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ -
751 allocationSize_(0), r(0), a(0),
│ │ │ │ - │ │ │ │ -
753 {}
│ │ │ │ -
│ │ │ │ -
754
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
757 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ -
758 allocationSize_(0), r(0), a(0),
│ │ │ │ - │ │ │ │ -
760 {
│ │ │ │ -
761 allocate(_n, _m, _nnz,true,false);
│ │ │ │ -
762 }
│ │ │ │ -
│ │ │ │ -
763
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
766 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ -
767 allocationSize_(0), r(0), a(0),
│ │ │ │ - │ │ │ │ -
769 {
│ │ │ │ -
770 allocate(_n, _m,0,true,false);
│ │ │ │ -
771 }
│ │ │ │ -
│ │ │ │ -
772
│ │ │ │ -
774
│ │ │ │ -
│ │ │ │ -
784 BCRSMatrix (size_type _n, size_type _m, size_type _avg, double compressionBufferSize, BuildMode bm)
│ │ │ │ -
785 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ -
786 allocationSize_(0), r(0), a(0),
│ │ │ │ -
787 avg(_avg), compressionBufferSize_(compressionBufferSize)
│ │ │ │ -
788 {
│ │ │ │ -
789 if (bm != implicit)
│ │ │ │ -
790 DUNE_THROW(BCRSMatrixError,"Only call this constructor when using the implicit build mode");
│ │ │ │ -
791 // Prevent user from setting a negative compression buffer size:
│ │ │ │ -
792 // 1) It doesn't make sense
│ │ │ │ -
793 // 2) We use a negative value to indicate that the parameters
│ │ │ │ -
794 // have not been set yet
│ │ │ │ -
795 if (compressionBufferSize_ < 0.0)
│ │ │ │ -
796 DUNE_THROW(BCRSMatrixError,"You cannot set a negative overflow fraction");
│ │ │ │ -
797 implicit_allocate(_n,_m);
│ │ │ │ -
798 }
│ │ │ │ -
│ │ │ │ -
799
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
806 : build_mode(Mat.build_mode), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ -
807 allocationSize_(0), r(0), a(0),
│ │ │ │ - │ │ │ │ -
809 {
│ │ │ │ -
810 if (!(Mat.ready == notAllocated || Mat.ready == built))
│ │ │ │ -
811 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copy-constructed when source matrix is completely empty (size not set) or fully built)");
│ │ │ │ -
812
│ │ │ │ -
813 // deep copy in global array
│ │ │ │ -
814 size_type _nnz = Mat.nonzeroes();
│ │ │ │ -
815
│ │ │ │ -
816 j_ = Mat.j_; // enable column index sharing, release array in case of row-wise allocation
│ │ │ │ -
817 allocate(Mat.n, Mat.m, _nnz, true, true);
│ │ │ │ -
818
│ │ │ │ -
819 // build window structure
│ │ │ │ - │ │ │ │ -
821 }
│ │ │ │ -
│ │ │ │ -
822
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
825 {
│ │ │ │ -
826 deallocate();
│ │ │ │ -
827 }
│ │ │ │ -
│ │ │ │ -
828
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
834 {
│ │ │ │ -
835 if (ready == notAllocated)
│ │ │ │ -
836 {
│ │ │ │ -
837 build_mode = bm;
│ │ │ │ -
838 return;
│ │ │ │ -
839 }
│ │ │ │ -
840 if (ready == building && (build_mode == unknown || build_mode == random || build_mode == row_wise) && (bm == row_wise || bm == random))
│ │ │ │ -
841 build_mode = bm;
│ │ │ │ -
842 else
│ │ │ │ -
843 DUNE_THROW(InvalidStateException, "Matrix structure cannot be changed at this stage anymore (ready == "<<ready<<").");
│ │ │ │ -
844 }
│ │ │ │ -
│ │ │ │ -
845
│ │ │ │ -
│ │ │ │ -
861 void setSize(size_type rows, size_type columns, size_type nnz=0)
│ │ │ │ -
862 {
│ │ │ │ -
863 // deallocate already setup memory
│ │ │ │ -
864 deallocate();
│ │ │ │ -
865
│ │ │ │ -
866 if (build_mode == implicit)
│ │ │ │ -
867 {
│ │ │ │ -
868 if (nnz>0)
│ │ │ │ -
869 DUNE_THROW(Dune::BCRSMatrixError,"number of non-zeroes may not be set in implicit mode, use setImplicitBuildModeParameters() instead");
│ │ │ │ -
870
│ │ │ │ -
871 // implicit allocates differently
│ │ │ │ -
872 implicit_allocate(rows,columns);
│ │ │ │ -
873 }
│ │ │ │ -
874 else
│ │ │ │ -
875 {
│ │ │ │ -
876 // allocate matrix memory
│ │ │ │ -
877 allocate(rows, columns, nnz, true, false);
│ │ │ │ -
878 }
│ │ │ │ -
879 }
│ │ │ │ -
│ │ │ │ -
880
│ │ │ │ -
│ │ │ │ -
889 void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
│ │ │ │ -
890 {
│ │ │ │ -
891 // Prevent user from setting a negative compression buffer size:
│ │ │ │ -
892 // 1) It doesn't make sense
│ │ │ │ -
893 // 2) We use a negative value to indicate that the parameters
│ │ │ │ -
894 // have not been set yet
│ │ │ │ -
895 if (compressionBufferSize < 0.0)
│ │ │ │ -
896 DUNE_THROW(BCRSMatrixError,"You cannot set a negative compressionBufferSize value");
│ │ │ │ -
897
│ │ │ │ -
898 // make sure the parameters aren't changed after memory has been allocated
│ │ │ │ -
899 if (ready != notAllocated)
│ │ │ │ -
900 DUNE_THROW(InvalidStateException,"You cannot modify build mode parameters at this stage anymore");
│ │ │ │ -
901 avg = _avg;
│ │ │ │ -
902 compressionBufferSize_ = compressionBufferSize;
│ │ │ │ -
903 }
│ │ │ │ -
│ │ │ │ -
904
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
912 {
│ │ │ │ -
913 // return immediately when self-assignment
│ │ │ │ -
914 if (&Mat==this) return *this;
│ │ │ │ -
915
│ │ │ │ -
916 if (!((ready == notAllocated || ready == built) && (Mat.ready == notAllocated || Mat.ready == built)))
│ │ │ │ -
917 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copied when both target and source are empty or fully built)");
│ │ │ │ -
918
│ │ │ │ -
919 // make it simple: ALWAYS throw away memory for a and j_
│ │ │ │ -
920 // and deallocate rows only if n != Mat.n
│ │ │ │ -
921 deallocate(n!=Mat.n);
│ │ │ │ -
922
│ │ │ │ -
923 // reallocate the rows if required
│ │ │ │ -
924 if (n>0 && n!=Mat.n) {
│ │ │ │ -
925 // free rows
│ │ │ │ -
926 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
│ │ │ │ -
927 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
│ │ │ │ -
928 rowAllocator_.deallocate(r,n);
│ │ │ │ -
929 }
│ │ │ │ -
930
│ │ │ │ -
931 nnz_ = Mat.nonzeroes();
│ │ │ │ -
932
│ │ │ │ -
933 // allocate a, share j_
│ │ │ │ -
934 j_ = Mat.j_;
│ │ │ │ -
935 allocate(Mat.n, Mat.m, nnz_, n!=Mat.n, true);
│ │ │ │ -
936
│ │ │ │ -
937 // build window structure
│ │ │ │ - │ │ │ │ -
939 return *this;
│ │ │ │ -
940 }
│ │ │ │ -
│ │ │ │ -
941
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
944 {
│ │ │ │ -
945
│ │ │ │ -
946 if (!(ready == notAllocated || ready == built))
│ │ │ │ -
947 DUNE_THROW(InvalidStateException,"Scalar assignment only works on fully built BCRSMatrix)");
│ │ │ │ -
948
│ │ │ │ -
949 for (size_type i=0; i<n; i++) r[i] = k;
│ │ │ │ -
950 return *this;
│ │ │ │ -
951 }
│ │ │ │ -
│ │ │ │ -
952
│ │ │ │ -
953 //===== row-wise creation interface
│ │ │ │ -
954
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
957 {
│ │ │ │ -
958 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
961 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat.j_.get(), 0)
│ │ │ │ -
962 {
│ │ │ │ -
963 if (Mat.build_mode == unknown && Mat.ready == building)
│ │ │ │ -
964 {
│ │ │ │ -
965 Mat.build_mode = row_wise;
│ │ │ │ -
966 }
│ │ │ │ -
967 if (i==0 && Mat.ready != building)
│ │ │ │ -
968 DUNE_THROW(BCRSMatrixError,"creation only allowed for uninitialized matrix");
│ │ │ │ -
969 if(Mat.build_mode!=row_wise)
│ │ │ │ -
970 DUNE_THROW(BCRSMatrixError,"creation only allowed if row wise allocation was requested in the constructor");
│ │ │ │ -
971 if(i==0 && _Mat.N()==0)
│ │ │ │ -
972 // empty Matrix is always built.
│ │ │ │ -
973 Mat.ready = built;
│ │ │ │ -
974 }
│ │ │ │ -
│ │ │ │ -
975
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
978 {
│ │ │ │ -
979 // this should only be called if matrix is in creation
│ │ │ │ -
980 if (Mat.ready != building)
│ │ │ │ -
981 DUNE_THROW(BCRSMatrixError,"matrix already built up");
│ │ │ │ -
982
│ │ │ │ -
983 // row i is defined through the pattern
│ │ │ │ -
984 // get memory for the row and initialize the j_ array
│ │ │ │ -
985 // this depends on the allocation mode
│ │ │ │ -
986
│ │ │ │ -
987 // compute size of the row
│ │ │ │ -
988 size_type s = pattern.size();
│ │ │ │ -
989
│ │ │ │ -
990 if(s>0) {
│ │ │ │ -
991 // update number of nonzeroes including this row
│ │ │ │ -
992 nnz += s;
│ │ │ │ -
993
│ │ │ │ -
994 // alloc memory / set window
│ │ │ │ -
995 if (Mat.nnz_ > 0)
│ │ │ │ -
996 {
│ │ │ │ -
997 // memory is allocated in one long array
│ │ │ │ -
998
│ │ │ │ -
999 // check if that memory is sufficient
│ │ │ │ -
1000 if (nnz > Mat.nnz_)
│ │ │ │ -
1001 DUNE_THROW(BCRSMatrixError,"allocated nnz too small");
│ │ │ │ -
1002
│ │ │ │ -
1003 // set row i
│ │ │ │ -
1004 Mat.r[i].set(s,nullptr,current_row.getindexptr());
│ │ │ │ -
1005 current_row.setindexptr(current_row.getindexptr()+s);
│ │ │ │ -
1006 }else{
│ │ │ │ -
1007 // memory is allocated individually per row
│ │ │ │ -
1008 // allocate and set row i
│ │ │ │ -
1009 B* b = Mat.allocator_.allocate(s);
│ │ │ │ -
1010 // use placement new to call constructor that allocates
│ │ │ │ -
1011 // additional memory.
│ │ │ │ -
1012 new (b) B[s];
│ │ │ │ -
1013 size_type* j = Mat.sizeAllocator_.allocate(s);
│ │ │ │ -
1014 Mat.r[i].set(s,b,j);
│ │ │ │ -
1015 }
│ │ │ │ -
1016 }else
│ │ │ │ -
1017 // setup empty row
│ │ │ │ -
1018 Mat.r[i].set(0,nullptr,nullptr);
│ │ │ │ -
1019
│ │ │ │ -
1020 // initialize the j array for row i from pattern
│ │ │ │ -
1021 std::copy(pattern.cbegin(), pattern.cend(), Mat.r[i].getindexptr());
│ │ │ │ -
1022
│ │ │ │ -
1023 // now go to next row
│ │ │ │ -
1024 i++;
│ │ │ │ -
1025 pattern.clear();
│ │ │ │ -
1026
│ │ │ │ -
1027 // check if this was last row
│ │ │ │ -
1028 if (i==Mat.n)
│ │ │ │ -
1029 {
│ │ │ │ -
1030 Mat.ready = built;
│ │ │ │ -
1031 if(Mat.nnz_ > 0)
│ │ │ │ -
1032 {
│ │ │ │ -
1033 // Set nnz to the exact number of nonzero blocks inserted
│ │ │ │ -
1034 // as some methods rely on it
│ │ │ │ -
1035 Mat.nnz_ = nnz;
│ │ │ │ -
1036 // allocate data array
│ │ │ │ -
1037 Mat.allocateData();
│ │ │ │ -
1038 Mat.setDataPointers();
│ │ │ │ -
1039 }
│ │ │ │ -
1040 }
│ │ │ │ -
1041 // done
│ │ │ │ -
1042 return *this;
│ │ │ │ -
1043 }
│ │ │ │ -
│ │ │ │ -
1044
│ │ │ │ -
│ │ │ │ -
1046 bool operator!= (const CreateIterator& it) const
│ │ │ │ -
1047 {
│ │ │ │ -
1048 return (i!=it.i) || (&Mat!=&it.Mat);
│ │ │ │ -
1049 }
│ │ │ │ -
│ │ │ │ -
1050
│ │ │ │ -
│ │ │ │ -
1052 bool operator== (const CreateIterator& it) const
│ │ │ │ -
1053 {
│ │ │ │ -
1054 return (i==it.i) && (&Mat==&it.Mat);
│ │ │ │ -
1055 }
│ │ │ │ -
│ │ │ │ -
1056
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1059 {
│ │ │ │ -
1060 return i;
│ │ │ │ -
1061 }
│ │ │ │ -
│ │ │ │ -
1062
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1065 {
│ │ │ │ -
1066 pattern.insert(j);
│ │ │ │ -
1067 }
│ │ │ │ -
│ │ │ │ -
1068
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1071 {
│ │ │ │ -
1072 return pattern.find(j) != pattern.end();
│ │ │ │ -
1073 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1080 {
│ │ │ │ -
1081 return pattern.size();
│ │ │ │ -
1082 }
│ │ │ │ -
│ │ │ │ -
1083
│ │ │ │ -
1084 private:
│ │ │ │ -
1085 BCRSMatrix& Mat; // the matrix we are defining
│ │ │ │ -
1086 size_type i; // current row to be defined
│ │ │ │ -
1087 size_type nnz; // count total number of nonzeros
│ │ │ │ -
1088 typedef std::set<size_type,std::less<size_type> > PatternType;
│ │ │ │ -
1089 PatternType pattern; // used to compile entries in a row
│ │ │ │ -
1090 row_type current_row; // row pointing to the current row to setup
│ │ │ │ -
1091 };
│ │ │ │ -
│ │ │ │ -
1092
│ │ │ │ -
1094 friend class CreateIterator;
│ │ │ │ -
1095
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1098 {
│ │ │ │ -
1099 return CreateIterator(*this,0);
│ │ │ │ -
1100 }
│ │ │ │ -
│ │ │ │ -
1101
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1104 {
│ │ │ │ -
1105 return CreateIterator(*this,n);
│ │ │ │ -
1106 }
│ │ │ │ -
│ │ │ │ -
1107
│ │ │ │ -
1108
│ │ │ │ -
1109 //===== random creation interface
│ │ │ │ -
1110
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1118 {
│ │ │ │ -
1119 if (build_mode!=random)
│ │ │ │ -
1120 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ -
1121 if (ready != building)
│ │ │ │ -
1122 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
│ │ │ │ -
1123
│ │ │ │ -
1124 r[i].setsize(s);
│ │ │ │ -
1125 }
│ │ │ │ -
│ │ │ │ -
1126
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1129 {
│ │ │ │ -
1130#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1131 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
│ │ │ │ -
1132 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1133#endif
│ │ │ │ -
1134 return r[i].getsize();
│ │ │ │ -
1135 }
│ │ │ │ -
│ │ │ │ -
1136
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1139 {
│ │ │ │ -
1140 if (build_mode!=random)
│ │ │ │ -
1141 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ -
1142 if (ready != building)
│ │ │ │ -
1143 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
│ │ │ │ -
1144
│ │ │ │ -
1145 r[i].setsize(r[i].getsize()+s);
│ │ │ │ -
1146 }
│ │ │ │ -
│ │ │ │ -
1147
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1150 {
│ │ │ │ -
1151 if (build_mode!=random)
│ │ │ │ -
1152 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ -
1153 if (ready != building)
│ │ │ │ -
1154 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
│ │ │ │ -
1155
│ │ │ │ -
1156 // compute total size, check positivity
│ │ │ │ -
1157 size_type total=0;
│ │ │ │ -
1158 for (size_type i=0; i<n; i++)
│ │ │ │ -
1159 {
│ │ │ │ -
1160 total += r[i].getsize();
│ │ │ │ -
1161 }
│ │ │ │ -
1162
│ │ │ │ -
1163 if(nnz_ == 0)
│ │ │ │ -
1164 // allocate/check memory
│ │ │ │ -
1165 allocate(n,m,total,false,false);
│ │ │ │ -
1166 else if(nnz_ < total)
│ │ │ │ -
1167 DUNE_THROW(BCRSMatrixError,"Specified number of nonzeros ("<<nnz_<<") not "
│ │ │ │ -
1168 <<"sufficient for calculated nonzeros ("<<total<<"! ");
│ │ │ │ -
1169
│ │ │ │ -
1170 // set the window pointers correctly
│ │ │ │ - │ │ │ │ -
1172
│ │ │ │ -
1173 // initialize j_ array with m (an invalid column index)
│ │ │ │ -
1174 // this indicates an unused entry
│ │ │ │ -
1175 for (size_type k=0; k<nnz_; k++)
│ │ │ │ -
1176 j_.get()[k] = m;
│ │ │ │ - │ │ │ │ -
1178 }
│ │ │ │ -
│ │ │ │ -
1179
│ │ │ │ -
1181
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1192 {
│ │ │ │ -
1193 if (build_mode!=random)
│ │ │ │ -
1194 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ -
1195 if (ready==built)
│ │ │ │ -
1196 DUNE_THROW(BCRSMatrixError,"matrix already built up");
│ │ │ │ -
1197 if (ready==building)
│ │ │ │ -
1198 DUNE_THROW(BCRSMatrixError,"matrix row sizes not built up yet");
│ │ │ │ -
1199 if (ready==notAllocated)
│ │ │ │ -
1200 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ -
1201
│ │ │ │ -
1202 if (col >= m)
│ │ │ │ -
1203 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
│ │ │ │ -
1204
│ │ │ │ -
1205 // get row range
│ │ │ │ -
1206 size_type* const first = r[row].getindexptr();
│ │ │ │ -
1207 size_type* const last = first + r[row].getsize();
│ │ │ │ -
1208
│ │ │ │ -
1209 // find correct insertion position for new column index
│ │ │ │ -
1210 size_type* pos = std::lower_bound(first,last,col);
│ │ │ │ -
1211
│ │ │ │ -
1212 // check if index is already in row
│ │ │ │ -
1213 if (pos!=last && *pos == col) return;
│ │ │ │ -
1214
│ │ │ │ -
1215 // find end of already inserted column indices
│ │ │ │ -
1216 size_type* end = std::lower_bound(pos,last,m);
│ │ │ │ -
1217 if (end==last)
│ │ │ │ -
1218 DUNE_THROW(BCRSMatrixError,"row is too small");
│ │ │ │ -
1219
│ │ │ │ -
1220 // insert new column index at correct position
│ │ │ │ -
1221 std::copy_backward(pos,end,end+1);
│ │ │ │ -
1222 *pos = col;
│ │ │ │ -
1223 }
│ │ │ │ -
│ │ │ │ -
1224
│ │ │ │ -
1226
│ │ │ │ -
1233 template<typename It>
│ │ │ │ -
│ │ │ │ -
1234 void setIndices(size_type row, It begin, It end)
│ │ │ │ -
1235 {
│ │ │ │ -
1236 size_type row_size = r[row].size();
│ │ │ │ -
1237 size_type* col_begin = r[row].getindexptr();
│ │ │ │ -
1238 size_type* col_end;
│ │ │ │ -
1239 // consistency check between allocated row size and number of passed column indices
│ │ │ │ -
1240 if ((col_end = std::copy(begin,end,r[row].getindexptr())) != col_begin + row_size)
│ │ │ │ -
1241 DUNE_THROW(BCRSMatrixError,"Given size of row " << row
│ │ │ │ -
1242 << " (" << row_size
│ │ │ │ -
1243 << ") does not match number of passed entries (" << (col_end - col_begin) << ")");
│ │ │ │ -
1244 std::sort(col_begin,col_end);
│ │ │ │ -
1245 }
│ │ │ │ -
│ │ │ │ -
1246
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1249 {
│ │ │ │ -
1250 if (build_mode!=random)
│ │ │ │ -
1251 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ -
1252 if (ready==built)
│ │ │ │ -
1253 DUNE_THROW(BCRSMatrixError,"matrix already built up");
│ │ │ │ -
1254 if (ready==building)
│ │ │ │ -
1255 DUNE_THROW(BCRSMatrixError,"row sizes are not built up yet");
│ │ │ │ -
1256 if (ready==notAllocated)
│ │ │ │ -
1257 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ -
1258
│ │ │ │ -
1259 // check if there are undefined indices
│ │ │ │ -
1260 RowIterator endi=end();
│ │ │ │ -
1261 for (RowIterator i=begin(); i!=endi; ++i)
│ │ │ │ -
1262 {
│ │ │ │ -
1263 ColIterator endj = (*i).end();
│ │ │ │ -
1264 for (ColIterator j=(*i).begin(); j!=endj; ++j) {
│ │ │ │ -
1265 if (j.index() >= m) {
│ │ │ │ -
1266 dwarn << "WARNING: size of row "<< i.index()<<" is "<<j.offset()<<". But was specified as being "<< (*i).end().offset()
│ │ │ │ -
1267 <<". This means you are wasting valuable space and creating additional cache misses!"<<std::endl;
│ │ │ │ -
1268 nnz_ -= ((*i).end().offset() - j.offset());
│ │ │ │ -
1269 r[i.index()].setsize(j.offset());
│ │ │ │ -
1270 break;
│ │ │ │ -
1271 }
│ │ │ │ -
1272 }
│ │ │ │ -
1273 }
│ │ │ │ -
1274
│ │ │ │ -
1275 allocateData();
│ │ │ │ - │ │ │ │ -
1277
│ │ │ │ -
1278 // if not, set matrix to built
│ │ │ │ -
1279 ready = built;
│ │ │ │ -
1280 }
│ │ │ │ -
│ │ │ │ -
1281
│ │ │ │ -
1282 //===== implicit creation interface
│ │ │ │ -
1283
│ │ │ │ -
1285
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1297 {
│ │ │ │ -
1298#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1299 if (build_mode!=implicit)
│ │ │ │ -
1300 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
│ │ │ │ -
1301 if (ready==built)
│ │ │ │ -
1302 DUNE_THROW(BCRSMatrixError,"matrix already built up, use operator[] for entry access now");
│ │ │ │ -
1303 if (ready==notAllocated)
│ │ │ │ -
1304 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ -
1305 if (ready!=building)
│ │ │ │ -
1306 DUNE_THROW(InvalidStateException,"You may only use entry() during the 'building' stage");
│ │ │ │ -
1307
│ │ │ │ -
1308 if (row >= n)
│ │ │ │ -
1309 DUNE_THROW(BCRSMatrixError,"row index exceeds matrix size");
│ │ │ │ -
1310 if (col >= m)
│ │ │ │ -
1311 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
│ │ │ │ -
1312#endif
│ │ │ │ -
1313
│ │ │ │ -
1314 size_type* begin = r[row].getindexptr();
│ │ │ │ -
1315 size_type* end = begin + r[row].getsize();
│ │ │ │ -
1316
│ │ │ │ -
1317 size_type* pos = std::find(begin, end, col);
│ │ │ │ -
1318
│ │ │ │ -
1319 //treat the case that there was a match in the array
│ │ │ │ -
1320 if (pos != end)
│ │ │ │ -
1321 if (*pos == col)
│ │ │ │ -
1322 {
│ │ │ │ -
1323 std::ptrdiff_t offset = pos - r[row].getindexptr();
│ │ │ │ -
1324 B* aptr = r[row].getptr() + offset;
│ │ │ │ -
1325
│ │ │ │ -
1326 return *aptr;
│ │ │ │ -
1327 }
│ │ │ │ -
1328
│ │ │ │ -
1329 //determine whether overflow has to be taken into account or not
│ │ │ │ -
1330 if (r[row].getsize() == avg)
│ │ │ │ -
1331 return overflow[std::make_pair(row,col)];
│ │ │ │ -
1332 else
│ │ │ │ -
1333 {
│ │ │ │ -
1334 //modify index array
│ │ │ │ -
1335 *end = col;
│ │ │ │ -
1336
│ │ │ │ -
1337 //do simultaneous operations on data array a
│ │ │ │ -
1338 std::ptrdiff_t offset = end - r[row].getindexptr();
│ │ │ │ -
1339 B* apos = r[row].getptr() + offset;
│ │ │ │ -
1340
│ │ │ │ -
1341 //increase rowsize
│ │ │ │ -
1342 r[row].setsize(r[row].getsize()+1);
│ │ │ │ -
1343
│ │ │ │ -
1344 //return reference to the newly created entry
│ │ │ │ -
1345 return *apos;
│ │ │ │ -
1346 }
│ │ │ │ -
1347 }
│ │ │ │ -
│ │ │ │ -
1348
│ │ │ │ -
1350
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1361 {
│ │ │ │ -
1362 if (build_mode!=implicit)
│ │ │ │ -
1363 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
│ │ │ │ -
1364 if (ready==built)
│ │ │ │ -
1365 DUNE_THROW(BCRSMatrixError,"matrix already built up, no more need for compression");
│ │ │ │ -
1366 if (ready==notAllocated)
│ │ │ │ -
1367 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ -
1368 if (ready!=building)
│ │ │ │ -
1369 DUNE_THROW(InvalidStateException,"You may only call compress() at the end of the 'building' stage");
│ │ │ │ -
1370
│ │ │ │ -
1371 //calculate statistics
│ │ │ │ - │ │ │ │ -
1373 stats.overflow_total = overflow.size();
│ │ │ │ -
1374 stats.maximum = 0;
│ │ │ │ -
1375
│ │ │ │ -
1376 //get insertion iterators pointing to one before start (for later use of ++it)
│ │ │ │ -
1377 size_type* jiit = j_.get();
│ │ │ │ -
1378 B* aiit = a;
│ │ │ │ -
1379
│ │ │ │ -
1380 //get iterator to the smallest overflow element
│ │ │ │ -
1381 typename OverflowType::iterator oit = overflow.begin();
│ │ │ │ -
1382
│ │ │ │ -
1383 //store a copy of index pointers on which to perform sorting
│ │ │ │ -
1384 std::vector<size_type*> perm;
│ │ │ │ -
1385
│ │ │ │ -
1386 //iterate over all rows and copy elements into their position in the compressed array
│ │ │ │ -
1387 for (size_type i=0; i<n; i++)
│ │ │ │ -
1388 {
│ │ │ │ -
1389 //get old pointers into a and j and size without overflow changes
│ │ │ │ -
1390 size_type* begin = r[i].getindexptr();
│ │ │ │ -
1391 //B* apos = r[i].getptr();
│ │ │ │ -
1392 size_type size = r[i].getsize();
│ │ │ │ -
1393
│ │ │ │ -
1394 perm.resize(size);
│ │ │ │ -
1395
│ │ │ │ -
1396 typename std::vector<size_type*>::iterator it = perm.begin();
│ │ │ │ -
1397 for (size_type* iit = begin; iit < begin + size; ++iit, ++it)
│ │ │ │ -
1398 *it = iit;
│ │ │ │ -
1399
│ │ │ │ -
1400 //sort permutation array
│ │ │ │ -
1401 std::sort(perm.begin(),perm.end(),PointerCompare<size_type>());
│ │ │ │ -
1402
│ │ │ │ -
1403 //change row window pointer to their new positions
│ │ │ │ -
1404 r[i].setindexptr(jiit);
│ │ │ │ -
1405 r[i].setptr(aiit);
│ │ │ │ -
1406
│ │ │ │ -
1407 for (it = perm.begin(); it != perm.end(); ++it)
│ │ │ │ -
1408 {
│ │ │ │ -
1409 //check whether there are elements in the overflow area which take precedence
│ │ │ │ -
1410 while ((oit!=overflow.end()) && (oit->first < std::make_pair(i,**it)))
│ │ │ │ -
1411 {
│ │ │ │ -
1412 //check whether there is enough memory to write to
│ │ │ │ -
1413 if (jiit > begin)
│ │ │ │ - │ │ │ │ -
1415 "Allocated memory for BCRSMatrix exhausted during compress()!"
│ │ │ │ -
1416 "Please increase either the average number of entries per row or the compressionBufferSize value."
│ │ │ │ -
1417 );
│ │ │ │ -
1418 //copy an element from the overflow area to the insertion position in a and j
│ │ │ │ -
1419 *jiit = oit->first.second;
│ │ │ │ -
1420 ++jiit;
│ │ │ │ -
1421 *aiit = oit->second;
│ │ │ │ -
1422 ++aiit;
│ │ │ │ -
1423 ++oit;
│ │ │ │ -
1424 r[i].setsize(r[i].getsize()+1);
│ │ │ │ -
1425 }
│ │ │ │ -
1426
│ │ │ │ -
1427 //check whether there is enough memory to write to
│ │ │ │ -
1428 if (jiit > begin)
│ │ │ │ - │ │ │ │ -
1430 "Allocated memory for BCRSMatrix exhausted during compress()!"
│ │ │ │ -
1431 "Please increase either the average number of entries per row or the compressionBufferSize value."
│ │ │ │ -
1432 );
│ │ │ │ -
1433
│ │ │ │ -
1434 //copy element from array
│ │ │ │ -
1435 *jiit = **it;
│ │ │ │ -
1436 ++jiit;
│ │ │ │ -
1437 B* apos = *it - j_.get() + a;
│ │ │ │ -
1438 *aiit = *apos;
│ │ │ │ -
1439 ++aiit;
│ │ │ │ -
1440 }
│ │ │ │ -
1441
│ │ │ │ -
1442 //copy remaining elements from the overflow area
│ │ │ │ -
1443 while ((oit!=overflow.end()) && (oit->first.first == i))
│ │ │ │ -
1444 {
│ │ │ │ -
1445 //check whether there is enough memory to write to
│ │ │ │ -
1446 if (jiit > begin)
│ │ │ │ - │ │ │ │ -
1448 "Allocated memory for BCRSMatrix exhausted during compress()!"
│ │ │ │ -
1449 "Please increase either the average number of entries per row or the compressionBufferSize value."
│ │ │ │ -
1450 );
│ │ │ │ -
1451
│ │ │ │ -
1452 //copy and element from the overflow area to the insertion position in a and j
│ │ │ │ -
1453 *jiit = oit->first.second;
│ │ │ │ -
1454 ++jiit;
│ │ │ │ -
1455 *aiit = oit->second;
│ │ │ │ -
1456 ++aiit;
│ │ │ │ -
1457 ++oit;
│ │ │ │ -
1458 r[i].setsize(r[i].getsize()+1);
│ │ │ │ -
1459 }
│ │ │ │ -
1460
│ │ │ │ -
1461 // update maximum row size
│ │ │ │ -
1462 if (r[i].getsize()>stats.maximum)
│ │ │ │ -
1463 stats.maximum = r[i].getsize();
│ │ │ │ -
1464 }
│ │ │ │ -
1465
│ │ │ │ -
1466 // overflow area may be cleared
│ │ │ │ -
1467 overflow.clear();
│ │ │ │ -
1468
│ │ │ │ -
1469 //determine average number of entries and memory usage
│ │ │ │ -
1470 std::ptrdiff_t diff = (r[n-1].getindexptr() + r[n-1].getsize() - j_.get());
│ │ │ │ -
1471 nnz_ = diff;
│ │ │ │ -
1472 stats.avg = (double) (nnz_) / (double) n;
│ │ │ │ -
1473 stats.mem_ratio = (double) (nnz_) / (double) allocationSize_;
│ │ │ │ -
1474
│ │ │ │ -
1475 //matrix is now built
│ │ │ │ -
1476 ready = built;
│ │ │ │ -
1477
│ │ │ │ -
1478 return stats;
│ │ │ │ -
1479 }
│ │ │ │ -
│ │ │ │ -
1480
│ │ │ │ -
1481 //===== vector space arithmetic
│ │ │ │ -
1482
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1485 {
│ │ │ │ -
1486#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1487 if (ready != built)
│ │ │ │ -
1488 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1489#endif
│ │ │ │ -
1490
│ │ │ │ -
1491 if (nnz_ > 0)
│ │ │ │ -
1492 {
│ │ │ │ -
1493 // process 1D array
│ │ │ │ -
1494 for (size_type i=0; i<nnz_; i++)
│ │ │ │ -
1495 a[i] *= k;
│ │ │ │ -
1496 }
│ │ │ │ -
1497 else
│ │ │ │ -
1498 {
│ │ │ │ -
1499 RowIterator endi=end();
│ │ │ │ -
1500 for (RowIterator i=begin(); i!=endi; ++i)
│ │ │ │ -
1501 {
│ │ │ │ -
1502 ColIterator endj = (*i).end();
│ │ │ │ -
1503 for (ColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1504 (*j) *= k;
│ │ │ │ -
1505 }
│ │ │ │ -
1506 }
│ │ │ │ -
1507
│ │ │ │ -
1508 return *this;
│ │ │ │ -
1509 }
│ │ │ │ -
│ │ │ │ -
1510
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1513 {
│ │ │ │ -
1514#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1515 if (ready != built)
│ │ │ │ -
1516 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1517#endif
│ │ │ │ -
1518
│ │ │ │ -
1519 if (nnz_ > 0)
│ │ │ │ -
1520 {
│ │ │ │ -
1521 // process 1D array
│ │ │ │ -
1522 for (size_type i=0; i<nnz_; i++)
│ │ │ │ -
1523 a[i] /= k;
│ │ │ │ -
1524 }
│ │ │ │ -
1525 else
│ │ │ │ -
1526 {
│ │ │ │ -
1527 RowIterator endi=end();
│ │ │ │ -
1528 for (RowIterator i=begin(); i!=endi; ++i)
│ │ │ │ -
1529 {
│ │ │ │ -
1530 ColIterator endj = (*i).end();
│ │ │ │ -
1531 for (ColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1532 (*j) /= k;
│ │ │ │ -
1533 }
│ │ │ │ -
1534 }
│ │ │ │ -
1535
│ │ │ │ -
1536 return *this;
│ │ │ │ -
1537 }
│ │ │ │ -
│ │ │ │ -
1538
│ │ │ │ -
1539
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1546 {
│ │ │ │ -
1547#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1548 if (ready != built || b.ready != built)
│ │ │ │ -
1549 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1550 if(N()!=b.N() || M() != b.M())
│ │ │ │ -
1551 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ -
1552#endif
│ │ │ │ -
1553 RowIterator endi=end();
│ │ │ │ -
1554 ConstRowIterator j=b.begin();
│ │ │ │ -
1555 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
│ │ │ │ -
1556 i->operator+=(*j);
│ │ │ │ -
1557 }
│ │ │ │ -
1558
│ │ │ │ -
1559 return *this;
│ │ │ │ -
1560 }
│ │ │ │ -
│ │ │ │ -
1561
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1568 {
│ │ │ │ -
1569#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1570 if (ready != built || b.ready != built)
│ │ │ │ -
1571 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1572 if(N()!=b.N() || M() != b.M())
│ │ │ │ -
1573 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ -
1574#endif
│ │ │ │ -
1575 RowIterator endi=end();
│ │ │ │ -
1576 ConstRowIterator j=b.begin();
│ │ │ │ -
1577 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
│ │ │ │ -
1578 i->operator-=(*j);
│ │ │ │ -
1579 }
│ │ │ │ -
1580
│ │ │ │ -
1581 return *this;
│ │ │ │ -
1582 }
│ │ │ │ -
│ │ │ │ -
1583
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1593 {
│ │ │ │ -
1594#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1595 if (ready != built || b.ready != built)
│ │ │ │ -
1596 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1597 if(N()!=b.N() || M() != b.M())
│ │ │ │ -
1598 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ -
1599#endif
│ │ │ │ -
1600 RowIterator endi=end();
│ │ │ │ -
1601 ConstRowIterator j=b.begin();
│ │ │ │ -
1602 for(RowIterator i=begin(); i!=endi; ++i, ++j)
│ │ │ │ -
1603 i->axpy(alpha, *j);
│ │ │ │ -
1604
│ │ │ │ -
1605 return *this;
│ │ │ │ -
1606 }
│ │ │ │ -
│ │ │ │ -
1607
│ │ │ │ -
1608 //===== linear maps
│ │ │ │ -
1609
│ │ │ │ -
1611 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1612 void mv (const X& x, Y& y) const
│ │ │ │ -
1613 {
│ │ │ │ -
1614#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1615 if (ready != built)
│ │ │ │ -
1616 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1617 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,
│ │ │ │ -
1618 "Size mismatch: M: " << N() << "x" << M() << " x: " << x.N());
│ │ │ │ -
1619 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,
│ │ │ │ -
1620 "Size mismatch: M: " << N() << "x" << M() << " y: " << y.N());
│ │ │ │ -
1621#endif
│ │ │ │ -
1622 ConstRowIterator endi=end();
│ │ │ │ -
1623 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1624 {
│ │ │ │ -
1625 y[i.index()]=0;
│ │ │ │ -
1626 ConstColIterator endj = (*i).end();
│ │ │ │ -
1627 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1628 {
│ │ │ │ -
1629 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ -
1630 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ -
1631 Impl::asMatrix(*j).umv(xj, yi);
│ │ │ │ -
1632 }
│ │ │ │ -
1633 }
│ │ │ │ -
1634 }
│ │ │ │ -
│ │ │ │ -
1635
│ │ │ │ -
1637 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1638 void umv (const X& x, Y& y) const
│ │ │ │ -
1639 {
│ │ │ │ -
1640#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1641 if (ready != built)
│ │ │ │ -
1642 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1643 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1644 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1645#endif
│ │ │ │ -
1646 ConstRowIterator endi=end();
│ │ │ │ -
1647 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1648 {
│ │ │ │ -
1649 ConstColIterator endj = (*i).end();
│ │ │ │ -
1650 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1651 {
│ │ │ │ -
1652 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ -
1653 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ -
1654 Impl::asMatrix(*j).umv(xj,yi);
│ │ │ │ -
1655 }
│ │ │ │ -
1656 }
│ │ │ │ -
1657 }
│ │ │ │ -
│ │ │ │ -
1658
│ │ │ │ -
1660 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1661 void mmv (const X& x, Y& y) const
│ │ │ │ -
1662 {
│ │ │ │ -
1663#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1664 if (ready != built)
│ │ │ │ -
1665 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1666 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1667 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1668#endif
│ │ │ │ -
1669 ConstRowIterator endi=end();
│ │ │ │ -
1670 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1671 {
│ │ │ │ -
1672 ConstColIterator endj = (*i).end();
│ │ │ │ -
1673 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1674 {
│ │ │ │ -
1675 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ -
1676 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ -
1677 Impl::asMatrix(*j).mmv(xj,yi);
│ │ │ │ -
1678 }
│ │ │ │ -
1679 }
│ │ │ │ -
1680 }
│ │ │ │ -
│ │ │ │ -
1681
│ │ │ │ -
1683 template<class X, class Y, class F>
│ │ │ │ -
│ │ │ │ -
1684 void usmv (F&& alpha, const X& x, Y& y) const
│ │ │ │ -
1685 {
│ │ │ │ -
1686#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1687 if (ready != built)
│ │ │ │ -
1688 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1689 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1690 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1691#endif
│ │ │ │ -
1692 ConstRowIterator endi=end();
│ │ │ │ -
1693 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1694 {
│ │ │ │ -
1695 ConstColIterator endj = (*i).end();
│ │ │ │ -
1696 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1697 {
│ │ │ │ -
1698 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ -
1699 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ -
1700 Impl::asMatrix(*j).usmv(alpha,xj,yi);
│ │ │ │ -
1701 }
│ │ │ │ -
1702 }
│ │ │ │ -
1703 }
│ │ │ │ -
│ │ │ │ -
1704
│ │ │ │ -
1706 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1707 void mtv (const X& x, Y& y) const
│ │ │ │ -
1708 {
│ │ │ │ -
1709#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1710 if (ready != built)
│ │ │ │ -
1711 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1712 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1713 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1714#endif
│ │ │ │ -
1715 for(size_type i=0; i<y.N(); ++i)
│ │ │ │ -
1716 y[i]=0;
│ │ │ │ -
1717 umtv(x,y);
│ │ │ │ -
1718 }
│ │ │ │ -
│ │ │ │ -
1719
│ │ │ │ -
1721 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1722 void umtv (const X& x, Y& y) const
│ │ │ │ -
1723 {
│ │ │ │ -
1724#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1725 if (ready != built)
│ │ │ │ -
1726 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1727 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1728 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1729#endif
│ │ │ │ -
1730 ConstRowIterator endi=end();
│ │ │ │ -
1731 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1732 {
│ │ │ │ -
1733 ConstColIterator endj = (*i).end();
│ │ │ │ -
1734 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1735 {
│ │ │ │ -
1736 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ -
1737 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ -
1738 Impl::asMatrix(*j).umtv(xi,yj);
│ │ │ │ -
1739 }
│ │ │ │ -
1740 }
│ │ │ │ -
1741 }
│ │ │ │ -
│ │ │ │ -
1742
│ │ │ │ -
1744 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1745 void mmtv (const X& x, Y& y) const
│ │ │ │ -
1746 {
│ │ │ │ -
1747#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1748 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1749 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1750#endif
│ │ │ │ -
1751 ConstRowIterator endi=end();
│ │ │ │ -
1752 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1753 {
│ │ │ │ -
1754 ConstColIterator endj = (*i).end();
│ │ │ │ -
1755 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1756 {
│ │ │ │ -
1757 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ -
1758 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ -
1759 Impl::asMatrix(*j).mmtv(xi,yj);
│ │ │ │ -
1760 }
│ │ │ │ -
1761 }
│ │ │ │ -
1762 }
│ │ │ │ -
│ │ │ │ -
1763
│ │ │ │ -
1765 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1766 void usmtv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ -
1767 {
│ │ │ │ -
1768#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1769 if (ready != built)
│ │ │ │ -
1770 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1771 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1772 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1773#endif
│ │ │ │ -
1774 ConstRowIterator endi=end();
│ │ │ │ -
1775 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1776 {
│ │ │ │ -
1777 ConstColIterator endj = (*i).end();
│ │ │ │ -
1778 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1779 {
│ │ │ │ -
1780 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ -
1781 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ -
1782 Impl::asMatrix(*j).usmtv(alpha,xi,yj);
│ │ │ │ -
1783 }
│ │ │ │ -
1784 }
│ │ │ │ -
1785 }
│ │ │ │ -
│ │ │ │ -
1786
│ │ │ │ -
1788 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1789 void umhv (const X& x, Y& y) const
│ │ │ │ -
1790 {
│ │ │ │ -
1791#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1792 if (ready != built)
│ │ │ │ -
1793 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1794 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1795 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1796#endif
│ │ │ │ -
1797 ConstRowIterator endi=end();
│ │ │ │ -
1798 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1799 {
│ │ │ │ -
1800 ConstColIterator endj = (*i).end();
│ │ │ │ -
1801 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1802 {
│ │ │ │ -
1803 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ -
1804 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ -
1805 Impl::asMatrix(*j).umhv(xi,yj);
│ │ │ │ -
1806 }
│ │ │ │ -
1807 }
│ │ │ │ -
1808 }
│ │ │ │ -
│ │ │ │ -
1809
│ │ │ │ -
1811 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1812 void mmhv (const X& x, Y& y) const
│ │ │ │ -
1813 {
│ │ │ │ -
1814#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1815 if (ready != built)
│ │ │ │ -
1816 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1817 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1818 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1819#endif
│ │ │ │ -
1820 ConstRowIterator endi=end();
│ │ │ │ -
1821 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1822 {
│ │ │ │ -
1823 ConstColIterator endj = (*i).end();
│ │ │ │ -
1824 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1825 {
│ │ │ │ -
1826 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ -
1827 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ -
1828 Impl::asMatrix(*j).mmhv(xi,yj);
│ │ │ │ -
1829 }
│ │ │ │ -
1830 }
│ │ │ │ -
1831 }
│ │ │ │ -
│ │ │ │ -
1832
│ │ │ │ -
1834 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
1835 void usmhv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ -
1836 {
│ │ │ │ -
1837#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1838 if (ready != built)
│ │ │ │ -
1839 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1840 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1841 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ -
1842#endif
│ │ │ │ -
1843 ConstRowIterator endi=end();
│ │ │ │ -
1844 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ -
1845 {
│ │ │ │ -
1846 ConstColIterator endj = (*i).end();
│ │ │ │ -
1847 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ -
1848 {
│ │ │ │ -
1849 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ -
1850 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ -
1851 Impl::asMatrix(*j).usmhv(alpha,xi,yj);
│ │ │ │ -
1852 }
│ │ │ │ -
1853 }
│ │ │ │ -
1854 }
│ │ │ │ -
│ │ │ │ -
1855
│ │ │ │ -
1856
│ │ │ │ -
1857 //===== norms
│ │ │ │ -
1858
│ │ │ │ -
│ │ │ │ -
1860 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
│ │ │ │ -
1861 {
│ │ │ │ -
1862#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1863 if (ready != built)
│ │ │ │ -
1864 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1865#endif
│ │ │ │ -
1866
│ │ │ │ -
1867 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
1868
│ │ │ │ -
1869 for (auto&& row : (*this))
│ │ │ │ -
1870 for (auto&& entry : row)
│ │ │ │ -
1871 sum += Impl::asMatrix(entry).frobenius_norm2();
│ │ │ │ -
1872
│ │ │ │ -
1873 return sum;
│ │ │ │ -
1874 }
│ │ │ │ -
│ │ │ │ -
1875
│ │ │ │ -
│ │ │ │ -
1877 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ -
1878 {
│ │ │ │ -
1879 return sqrt(frobenius_norm2());
│ │ │ │ -
1880 }
│ │ │ │ -
│ │ │ │ -
1881
│ │ │ │ -
1883 template <typename ft = field_type,
│ │ │ │ -
1884 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1885 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
1886 if (ready != built)
│ │ │ │ -
1887 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1888
│ │ │ │ -
1889 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1890 using std::max;
│ │ │ │ -
1891
│ │ │ │ -
1892 real_type norm = 0;
│ │ │ │ -
1893 for (auto const &x : *this) {
│ │ │ │ -
1894 real_type sum = 0;
│ │ │ │ -
1895 for (auto const &y : x)
│ │ │ │ -
1896 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ -
1897 norm = max(sum, norm);
│ │ │ │ -
1898 }
│ │ │ │ -
1899 return norm;
│ │ │ │ -
1900 }
│ │ │ │ -
│ │ │ │ -
1901
│ │ │ │ -
1903 template <typename ft = field_type,
│ │ │ │ -
1904 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1905 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
1906 if (ready != built)
│ │ │ │ -
1907 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1908
│ │ │ │ -
1909 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1910 using std::max;
│ │ │ │ -
1911
│ │ │ │ -
1912 real_type norm = 0;
│ │ │ │ -
1913 for (auto const &x : *this) {
│ │ │ │ -
1914 real_type sum = 0;
│ │ │ │ -
1915 for (auto const &y : x)
│ │ │ │ -
1916 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ -
1917 norm = max(sum, norm);
│ │ │ │ -
1918 }
│ │ │ │ -
1919 return norm;
│ │ │ │ -
1920 }
│ │ │ │ -
│ │ │ │ -
1921
│ │ │ │ -
1923 template <typename ft = field_type,
│ │ │ │ -
1924 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1925 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
1926 if (ready != built)
│ │ │ │ -
1927 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1928
│ │ │ │ -
1929 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1930 using std::max;
│ │ │ │ -
1931
│ │ │ │ -
1932 real_type norm = 0;
│ │ │ │ -
1933 real_type isNaN = 1;
│ │ │ │ -
1934 for (auto const &x : *this) {
│ │ │ │ -
1935 real_type sum = 0;
│ │ │ │ -
1936 for (auto const &y : x)
│ │ │ │ -
1937 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ -
1938 norm = max(sum, norm);
│ │ │ │ -
1939 isNaN += sum;
│ │ │ │ -
1940 }
│ │ │ │ -
1941
│ │ │ │ -
1942 return norm * (isNaN / isNaN);
│ │ │ │ -
1943 }
│ │ │ │ -
│ │ │ │ -
1944
│ │ │ │ -
1946 template <typename ft = field_type,
│ │ │ │ -
1947 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
1948 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
1949 if (ready != built)
│ │ │ │ -
1950 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ -
1951
│ │ │ │ -
1952 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
1953 using std::max;
│ │ │ │ -
1954
│ │ │ │ -
1955 real_type norm = 0;
│ │ │ │ -
1956 real_type isNaN = 1;
│ │ │ │ -
1957
│ │ │ │ -
1958 for (auto const &x : *this) {
│ │ │ │ -
1959 real_type sum = 0;
│ │ │ │ -
1960 for (auto const &y : x)
│ │ │ │ -
1961 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ -
1962 norm = max(sum, norm);
│ │ │ │ -
1963 isNaN += sum;
│ │ │ │ -
1964 }
│ │ │ │ -
1965
│ │ │ │ -
1966 return norm * (isNaN / isNaN);
│ │ │ │ -
1967 }
│ │ │ │ -
│ │ │ │ -
1968
│ │ │ │ -
1969 //===== sizes
│ │ │ │ -
1970
│ │ │ │ -
│ │ │ │ -
1972 size_type N () const
│ │ │ │ -
1973 {
│ │ │ │ -
1974 return n;
│ │ │ │ -
1975 }
│ │ │ │ -
│ │ │ │ -
1976
│ │ │ │ -
│ │ │ │ -
1978 size_type M () const
│ │ │ │ -
1979 {
│ │ │ │ -
1980 return m;
│ │ │ │ -
1981 }
│ │ │ │ -
│ │ │ │ -
1982
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1985 {
│ │ │ │ -
1986 // in case of row-wise allocation
│ │ │ │ -
1987 if( nnz_ <= 0 )
│ │ │ │ -
1988 nnz_ = std::accumulate( begin(), end(), size_type( 0 ), [] ( size_type s, const row_type &row ) { return s+row.getsize(); } );
│ │ │ │ -
1989 return nnz_;
│ │ │ │ -
1990 }
│ │ │ │ -
│ │ │ │ -
1991
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1994 {
│ │ │ │ -
1995 return ready;
│ │ │ │ -
1996 }
│ │ │ │ -
│ │ │ │ -
1997
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2000 {
│ │ │ │ -
2001 return build_mode;
│ │ │ │ -
2002 }
│ │ │ │ -
│ │ │ │ -
2003
│ │ │ │ -
2004 //===== query
│ │ │ │ -
2005
│ │ │ │ -
│ │ │ │ -
2007 bool exists (size_type i, size_type j) const
│ │ │ │ -
2008 {
│ │ │ │ -
2009#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
2010 if (i<0 || i>=n) DUNE_THROW(BCRSMatrixError,"row index out of range");
│ │ │ │ -
2011 if (j<0 || j>=m) DUNE_THROW(BCRSMatrixError,"column index out of range");
│ │ │ │ -
2012#endif
│ │ │ │ -
2013 return (r[i].size() && r[i].find(j) != r[i].end());
│ │ │ │ -
2014 }
│ │ │ │ -
│ │ │ │ -
2015
│ │ │ │ -
2016
│ │ │ │ -
2017 protected:
│ │ │ │ -
2018 // state information
│ │ │ │ -
2019 BuildMode build_mode; // row wise or whole matrix
│ │ │ │ -
2020 BuildStage ready; // indicate the stage the matrix building is in
│ │ │ │ -
2021
│ │ │ │ -
2022 // The allocator used for memory management
│ │ │ │ -
2023 typename std::allocator_traits<A>::template rebind_alloc<B> allocator_;
│ │ │ │ -
2024
│ │ │ │ -
2025 typename std::allocator_traits<A>::template rebind_alloc<row_type> rowAllocator_;
│ │ │ │ -
2026
│ │ │ │ -
2027 typename std::allocator_traits<A>::template rebind_alloc<size_type> sizeAllocator_;
│ │ │ │ -
2028
│ │ │ │ -
2029 // size of the matrix
│ │ │ │ -
2030 size_type n; // number of rows
│ │ │ │ -
2031 size_type m; // number of columns
│ │ │ │ -
2032 mutable size_type nnz_; // number of nonzeroes contained in the matrix
│ │ │ │ -
2033 size_type allocationSize_; //allocated size of a and j arrays, except in implicit mode: nnz_==allocationsSize_
│ │ │ │ -
2034 // zero means that memory is allocated separately for each row.
│ │ │ │ -
2035
│ │ │ │ -
2036 // the rows are dynamically allocated
│ │ │ │ -
2037 row_type* r; // [n] the individual rows having pointers into a,j arrays
│ │ │ │ -
2038
│ │ │ │ -
2039 // dynamically allocated memory
│ │ │ │ -
2040 B* a; // [allocationSize] non-zero entries of the matrix in row-wise ordering
│ │ │ │ -
2041 // If a single array of column indices is used, it can be shared
│ │ │ │ -
2042 // between different matrices with the same sparsity pattern
│ │ │ │ -
2043 std::shared_ptr<size_type> j_; // [allocationSize] column indices of entries
│ │ │ │ -
2044
│ │ │ │ -
2045 // additional data is needed in implicit buildmode
│ │ │ │ - │ │ │ │ - │ │ │ │ -
2048
│ │ │ │ -
2049 typedef std::map<std::pair<size_type,size_type>, B> OverflowType;
│ │ │ │ - │ │ │ │ -
2051
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2053 {
│ │ │ │ -
2054 row_type current_row(a,j_.get(),0); // Pointers to current row data
│ │ │ │ -
2055 for (size_type i=0; i<n; i++, ++row) {
│ │ │ │ -
2056 // set row i
│ │ │ │ -
2057 size_type s = row->getsize();
│ │ │ │ -
2058
│ │ │ │ -
2059 if (s>0) {
│ │ │ │ -
2060 // setup pointers and size
│ │ │ │ -
2061 r[i].set(s,current_row.getptr(), current_row.getindexptr());
│ │ │ │ -
2062 // update pointer for next row
│ │ │ │ -
2063 current_row.setptr(current_row.getptr()+s);
│ │ │ │ -
2064 current_row.setindexptr(current_row.getindexptr()+s);
│ │ │ │ -
2065 } else{
│ │ │ │ -
2066 // empty row
│ │ │ │ -
2067 r[i].set(0,nullptr,nullptr);
│ │ │ │ -
2068 }
│ │ │ │ -
2069 }
│ │ │ │ -
2070 }
│ │ │ │ -
│ │ │ │ -
2071
│ │ │ │ -
2073
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2078 {
│ │ │ │ -
2079 size_type* jptr = j_.get();
│ │ │ │ -
2080 for (size_type i=0; i<n; ++i, ++row) {
│ │ │ │ -
2081 // set row i
│ │ │ │ -
2082 size_type s = row->getsize();
│ │ │ │ -
2083
│ │ │ │ -
2084 if (s>0) {
│ │ │ │ -
2085 // setup pointers and size
│ │ │ │ -
2086 r[i].setsize(s);
│ │ │ │ -
2087 r[i].setindexptr(jptr);
│ │ │ │ -
2088 } else{
│ │ │ │ -
2089 // empty row
│ │ │ │ -
2090 r[i].set(0,nullptr,nullptr);
│ │ │ │ -
2091 }
│ │ │ │ -
2092
│ │ │ │ -
2093 // advance position in global array
│ │ │ │ -
2094 jptr += s;
│ │ │ │ -
2095 }
│ │ │ │ -
2096 }
│ │ │ │ -
│ │ │ │ -
2097
│ │ │ │ -
2099
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2104 {
│ │ │ │ -
2105 B* aptr = a;
│ │ │ │ -
2106 for (size_type i=0; i<n; ++i) {
│ │ │ │ -
2107 // set row i
│ │ │ │ -
2108 if (r[i].getsize() > 0) {
│ │ │ │ -
2109 // setup pointers and size
│ │ │ │ -
2110 r[i].setptr(aptr);
│ │ │ │ -
2111 } else{
│ │ │ │ -
2112 // empty row
│ │ │ │ -
2113 r[i].set(0,nullptr,nullptr);
│ │ │ │ -
2114 }
│ │ │ │ -
2115
│ │ │ │ -
2116 // advance position in global array
│ │ │ │ -
2117 aptr += r[i].getsize();
│ │ │ │ -
2118 }
│ │ │ │ -
2119 }
│ │ │ │ -
│ │ │ │ -
2120
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2123 {
│ │ │ │ -
2124 setWindowPointers(Mat.begin());
│ │ │ │ -
2125
│ │ │ │ -
2126 // copy data
│ │ │ │ -
2127 for (size_type i=0; i<n; i++) r[i] = Mat.r[i];
│ │ │ │ -
2128
│ │ │ │ -
2129 // finish off
│ │ │ │ -
2130 build_mode = row_wise; // dummy
│ │ │ │ -
2131 ready = built;
│ │ │ │ -
2132 }
│ │ │ │ -
│ │ │ │ -
2133
│ │ │ │ -
│ │ │ │ -
2139 void deallocate(bool deallocateRows=true)
│ │ │ │ -
2140 {
│ │ │ │ -
2141
│ │ │ │ -
2142 if (notAllocated)
│ │ │ │ -
2143 return;
│ │ │ │ -
2144
│ │ │ │ -
2145 if (allocationSize_>0)
│ │ │ │ -
2146 {
│ │ │ │ -
2147 // a,j_ have been allocated as one long vector
│ │ │ │ -
2148 j_.reset();
│ │ │ │ -
2149 if (a)
│ │ │ │ -
2150 {
│ │ │ │ -
2151 for(B *aiter=a+(allocationSize_-1), *aend=a-1; aiter!=aend; --aiter)
│ │ │ │ -
2152 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, aiter);
│ │ │ │ -
2153 allocator_.deallocate(a,allocationSize_);
│ │ │ │ -
2154 a = nullptr;
│ │ │ │ -
2155 }
│ │ │ │ -
2156 }
│ │ │ │ -
2157 else if (r)
│ │ │ │ -
2158 {
│ │ │ │ -
2159 // check if memory for rows have been allocated individually
│ │ │ │ -
2160 for (size_type i=0; i<n; i++)
│ │ │ │ -
2161 if (r[i].getsize()>0)
│ │ │ │ -
2162 {
│ │ │ │ -
2163 for (B *col=r[i].getptr()+(r[i].getsize()-1),
│ │ │ │ -
2164 *colend = r[i].getptr()-1; col!=colend; --col) {
│ │ │ │ -
2165 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, col);
│ │ │ │ -
2166 }
│ │ │ │ -
2167 sizeAllocator_.deallocate(r[i].getindexptr(),1);
│ │ │ │ -
2168 allocator_.deallocate(r[i].getptr(),1);
│ │ │ │ -
2169 // clear out row data in case we don't want to deallocate the rows
│ │ │ │ -
2170 // otherwise we might run into a double free problem here later
│ │ │ │ -
2171 r[i].set(0,nullptr,nullptr);
│ │ │ │ -
2172 }
│ │ │ │ -
2173 }
│ │ │ │ -
2174
│ │ │ │ -
2175 // deallocate the rows
│ │ │ │ -
2176 if (n>0 && deallocateRows && r) {
│ │ │ │ -
2177 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
│ │ │ │ -
2178 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
│ │ │ │ -
2179 rowAllocator_.deallocate(r,n);
│ │ │ │ -
2180 r = nullptr;
│ │ │ │ -
2181 }
│ │ │ │ -
2182
│ │ │ │ -
2183 // Mark matrix as not built at all.
│ │ │ │ - │ │ │ │ -
2185
│ │ │ │ -
2186 }
│ │ │ │ -
│ │ │ │ -
2187
│ │ │ │ -
│ │ │ │ -
2205 void allocate(size_type rows, size_type columns, size_type allocationSize, bool allocateRows, bool allocate_data)
│ │ │ │ -
2206 {
│ │ │ │ -
2207 // Store size
│ │ │ │ -
2208 n = rows;
│ │ │ │ -
2209 m = columns;
│ │ │ │ -
2210 nnz_ = allocationSize;
│ │ │ │ -
2211 allocationSize_ = allocationSize;
│ │ │ │ -
2212
│ │ │ │ -
2213 // allocate rows
│ │ │ │ -
2214 if(allocateRows) {
│ │ │ │ -
2215 if (n>0) {
│ │ │ │ -
2216 if (r)
│ │ │ │ -
2217 DUNE_THROW(InvalidStateException,"Rows have already been allocated, cannot allocate a second time");
│ │ │ │ -
2218 r = rowAllocator_.allocate(rows);
│ │ │ │ -
2219 // initialize row entries
│ │ │ │ -
2220 for(row_type* ri=r; ri!=r+rows; ++ri)
│ │ │ │ -
2221 std::allocator_traits<decltype(rowAllocator_)>::construct(rowAllocator_, ri, row_type());
│ │ │ │ -
2222 }else{
│ │ │ │ -
2223 r = 0;
│ │ │ │ -
2224 }
│ │ │ │ -
2225 }
│ │ │ │ -
2226
│ │ │ │ -
2227 // allocate a and j_ array
│ │ │ │ -
2228 if (allocate_data)
│ │ │ │ -
2229 allocateData();
│ │ │ │ -
2230 // allocate column indices only if not yet present (enable sharing)
│ │ │ │ -
2231 if (allocationSize_>0) {
│ │ │ │ -
2232 // we copy allocator and size to the deleter since _j may outlive this class
│ │ │ │ -
2233 if (!j_.get())
│ │ │ │ -
2234 j_.reset(sizeAllocator_.allocate(allocationSize_),
│ │ │ │ -
2235 [alloc = sizeAllocator_, size = allocationSize_](auto ptr) mutable {
│ │ │ │ -
2236 alloc.deallocate(ptr, size);
│ │ │ │ -
2237 });
│ │ │ │ -
2238 }else{
│ │ │ │ -
2239 j_.reset();
│ │ │ │ -
2240 }
│ │ │ │ -
2241
│ │ │ │ -
2242 // Mark the matrix as not built.
│ │ │ │ -
2243 ready = building;
│ │ │ │ -
2244 }
│ │ │ │ -
│ │ │ │ -
2245
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2247 {
│ │ │ │ -
2248 if (a)
│ │ │ │ -
2249 DUNE_THROW(InvalidStateException,"Cannot allocate data array (already allocated)");
│ │ │ │ -
2250 if (allocationSize_>0) {
│ │ │ │ -
2251 a = allocator_.allocate(allocationSize_);
│ │ │ │ -
2252 // use placement new to call constructor that allocates
│ │ │ │ -
2253 // additional memory.
│ │ │ │ -
2254 new (a) B[allocationSize_];
│ │ │ │ -
2255 } else {
│ │ │ │ -
2256 a = nullptr;
│ │ │ │ -
2257 }
│ │ │ │ -
2258 }
│ │ │ │ -
│ │ │ │ -
2259
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
2266 {
│ │ │ │ -
2267 if (build_mode != implicit)
│ │ │ │ -
2268 DUNE_THROW(InvalidStateException,"implicit_allocate() may only be called in implicit build mode");
│ │ │ │ -
2269 if (ready != notAllocated)
│ │ │ │ -
2270 DUNE_THROW(InvalidStateException,"memory has already been allocated");
│ │ │ │ -
2271
│ │ │ │ -
2272 // check to make sure the user has actually set the parameters
│ │ │ │ -
2273 if (compressionBufferSize_ < 0)
│ │ │ │ -
2274 DUNE_THROW(InvalidStateException,"You have to set the implicit build mode parameters before starting to build the matrix");
│ │ │ │ -
2275 //calculate size of overflow region, add buffer for row sort!
│ │ │ │ - │ │ │ │ -
2277 allocationSize_ = _n*avg + osize;
│ │ │ │ -
2278
│ │ │ │ -
2279 allocate(_n, _m, allocationSize_,true,true);
│ │ │ │ -
2280
│ │ │ │ -
2281 //set row pointers correctly
│ │ │ │ -
2282 size_type* jptr = j_.get() + osize;
│ │ │ │ -
2283 B* aptr = a + osize;
│ │ │ │ -
2284 for (size_type i=0; i<n; i++)
│ │ │ │ -
2285 {
│ │ │ │ -
2286 r[i].set(0,aptr,jptr);
│ │ │ │ -
2287 jptr = jptr + avg;
│ │ │ │ -
2288 aptr = aptr + avg;
│ │ │ │ -
2289 }
│ │ │ │ -
2290
│ │ │ │ -
2291 ready = building;
│ │ │ │ -
2292 }
│ │ │ │ -
│ │ │ │ -
2293 };
│ │ │ │ -
│ │ │ │ -
2294
│ │ │ │ -
2295
│ │ │ │ -
2296 template<class B, class A>
│ │ │ │ -
│ │ │ │ -
2297 struct FieldTraits< BCRSMatrix<B, A> >
│ │ │ │ -
2298 {
│ │ │ │ - │ │ │ │ -
2300 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
2301 };
│ │ │ │ -
│ │ │ │ -
2302
│ │ │ │ -
2305} // end namespace
│ │ │ │ -
2306
│ │ │ │ -
2307#endif
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ -
Some handy generic functions for ISTL matrices.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
102 } // namespace Amg
│ │ │ │ +
103} //namespace Dune
│ │ │ │ +
104#endif
│ │ │ │ + │ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
Definition matrixutils.hh:211
│ │ │ │ -
Statistics about compression achieved in implicit mode.
Definition bcrsmatrix.hh:88
│ │ │ │ -
size_type overflow_total
total number of elements written to the overflow area during construction.
Definition bcrsmatrix.hh:94
│ │ │ │ -
size_type maximum
maximum number of non-zeroes per row.
Definition bcrsmatrix.hh:92
│ │ │ │ -
double avg
average number of non-zeroes per row.
Definition bcrsmatrix.hh:90
│ │ │ │ -
double mem_ratio
fraction of wasted memory resulting from non-used overflow area.
Definition bcrsmatrix.hh:99
│ │ │ │ -
A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mod...
Definition bcrsmatrix.hh:117
│ │ │ │ -
Matrix::block_type block_type
The block_type of the underlying matrix.
Definition bcrsmatrix.hh:125
│ │ │ │ -
ImplicitMatrixBuilder(Matrix &m)
Creates an ImplicitMatrixBuilder for matrix m.
Definition bcrsmatrix.hh:170
│ │ │ │ -
M_ Matrix
The underlying matrix.
Definition bcrsmatrix.hh:122
│ │ │ │ -
ImplicitMatrixBuilder(Matrix &m, size_type rows, size_type cols, size_type avg_cols_per_row, double overflow_fraction)
Sets up matrix m for implicit construction using the given parameters and creates an ImplicitBmatrixu...
Definition bcrsmatrix.hh:194
│ │ │ │ -
size_type M() const
The number of columns in the matrix.
Definition bcrsmatrix.hh:217
│ │ │ │ -
Matrix::size_type size_type
The size_type of the underlying matrix.
Definition bcrsmatrix.hh:128
│ │ │ │ -
row_object operator[](size_type i) const
Returns a proxy for entries in row i.
Definition bcrsmatrix.hh:205
│ │ │ │ -
size_type N() const
The number of rows in the matrix.
Definition bcrsmatrix.hh:211
│ │ │ │ -
Proxy row object for entry access.
Definition bcrsmatrix.hh:137
│ │ │ │ -
block_type & operator[](size_type j) const
Returns entry in column j.
Definition bcrsmatrix.hh:142
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bcrsmatrix.hh:488
│ │ │ │ -
std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_
Definition bcrsmatrix.hh:2025
│ │ │ │ -
bool exists(size_type i, size_type j) const
return true if (i,j) is in pattern
Definition bcrsmatrix.hh:2007
│ │ │ │ -
BuildStage buildStage() const
The current build stage of the matrix.
Definition bcrsmatrix.hh:1993
│ │ │ │ -
Iterator begin()
Get iterator to first row.
Definition bcrsmatrix.hh:675
│ │ │ │ -
void copyWindowStructure(const BCRSMatrix &Mat)
Copy the window structure from another matrix.
Definition bcrsmatrix.hh:2122
│ │ │ │ -
B & entry(size_type row, size_type col)
Returns reference to entry (row,col) of the matrix.
Definition bcrsmatrix.hh:1296
│ │ │ │ -
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition bcrsmatrix.hh:1812
│ │ │ │ -
void usmhv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition bcrsmatrix.hh:1835
│ │ │ │ -
void umtv(const X &x, Y &y) const
y += A^T x
Definition bcrsmatrix.hh:1722
│ │ │ │ -
double compressionBufferSize_
Definition bcrsmatrix.hh:2047
│ │ │ │ -
size_type m
Definition bcrsmatrix.hh:2031
│ │ │ │ -
RealRowIterator< const row_type > const_iterator
The const iterator over the matrix rows.
Definition bcrsmatrix.hh:707
│ │ │ │ -
static constexpr unsigned int blocklevel
increment block level counter
Definition bcrsmatrix.hh:507
│ │ │ │ -
void allocate(size_type rows, size_type columns, size_type allocationSize, bool allocateRows, bool allocate_data)
Allocate memory for the matrix structure.
Definition bcrsmatrix.hh:2205
│ │ │ │ -
BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b)
Add the scaled entries of another matrix to this one.
Definition bcrsmatrix.hh:1592
│ │ │ │ -
FieldTraits< ft >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition bcrsmatrix.hh:1905
│ │ │ │ -
~BCRSMatrix()
destructor
Definition bcrsmatrix.hh:824
│ │ │ │ -
void allocateData()
Definition bcrsmatrix.hh:2246
│ │ │ │ -
void deallocate(bool deallocateRows=true)
deallocate memory of the matrix.
Definition bcrsmatrix.hh:2139
│ │ │ │ -
Iterator RowIterator
rename the iterators for easier access
Definition bcrsmatrix.hh:701
│ │ │ │ -
row_type & operator[](size_type i)
random access to the rows
Definition bcrsmatrix.hh:549
│ │ │ │ -
BCRSMatrix()
an empty matrix
Definition bcrsmatrix.hh:749
│ │ │ │ -
void endrowsizes()
indicate that size of all rows is defined
Definition bcrsmatrix.hh:1149
│ │ │ │ -
void incrementrowsize(size_type i, size_type s=1)
increment size of row i by s (1 by default)
Definition bcrsmatrix.hh:1138
│ │ │ │ -
void mtv(const X &x, Y &y) const
y = A^T x
Definition bcrsmatrix.hh:1707
│ │ │ │ -
void umhv(const X &x, Y &y) const
y += A^H x
Definition bcrsmatrix.hh:1789
│ │ │ │ -
size_type nonzeroes() const
number of blocks that are stored (the number of blocks that possibly are nonzero)
Definition bcrsmatrix.hh:1984
│ │ │ │ -
size_type allocationSize_
Definition bcrsmatrix.hh:2033
│ │ │ │ -
ConstIterator ConstRowIterator
rename the const row iterator for easier access
Definition bcrsmatrix.hh:738
│ │ │ │ -
BuildStage ready
Definition bcrsmatrix.hh:2020
│ │ │ │ -
BuildMode build_mode
Definition bcrsmatrix.hh:2019
│ │ │ │ -
void setrowsize(size_type i, size_type s)
Set number of indices in row i to s.
Definition bcrsmatrix.hh:1117
│ │ │ │ -
RealRowIterator< row_type > Iterator
Definition bcrsmatrix.hh:672
│ │ │ │ -
size_type nnz_
Definition bcrsmatrix.hh:2032
│ │ │ │ -
BCRSMatrix & operator*=(const field_type &k)
vector space multiplication with scalar
Definition bcrsmatrix.hh:1484
│ │ │ │ -
std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_
Definition bcrsmatrix.hh:2027
│ │ │ │ -
RealRowIterator< row_type > iterator
The iterator over the (mutable matrix rows.
Definition bcrsmatrix.hh:671
│ │ │ │ -
void usmtv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition bcrsmatrix.hh:1766
│ │ │ │ -
ConstIterator beforeBegin() const
Definition bcrsmatrix.hh:732
│ │ │ │ -
RealRowIterator< const row_type > ConstIterator
Definition bcrsmatrix.hh:708
│ │ │ │ -
Iterator beforeBegin()
Definition bcrsmatrix.hh:695
│ │ │ │ -
B * a
Definition bcrsmatrix.hh:2040
│ │ │ │ -
BuildMode
we support two modes
Definition bcrsmatrix.hh:510
│ │ │ │ -
@ implicit
Build entries randomly with an educated guess for the number of entries per row.
Definition bcrsmatrix.hh:539
│ │ │ │ -
@ unknown
Build mode not set!
Definition bcrsmatrix.hh:543
│ │ │ │ -
@ random
Build entries randomly.
Definition bcrsmatrix.hh:530
│ │ │ │ -
@ row_wise
Build in a row-wise manner.
Definition bcrsmatrix.hh:521
│ │ │ │ -
BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm)
matrix with known number of nonzeroes
Definition bcrsmatrix.hh:756
│ │ │ │ -
::Dune::CompressionStatistics< size_type > CompressionStatistics
The type for the statistics object returned by compress()
Definition bcrsmatrix.hh:503
│ │ │ │ -
BCRSMatrix & operator-=(const BCRSMatrix &b)
Subtract the entries of another matrix from this one.
Definition bcrsmatrix.hh:1567
│ │ │ │ -
BCRSMatrix(const BCRSMatrix &Mat)
copy constructor
Definition bcrsmatrix.hh:805
│ │ │ │ -
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ -
row_type * r
Definition bcrsmatrix.hh:2037
│ │ │ │ -
void setIndices(size_type row, It begin, It end)
Set all column indices for row from the given iterator range.
Definition bcrsmatrix.hh:1234
│ │ │ │ -
void addindex(size_type row, size_type col)
add index (row,col) to the matrix
Definition bcrsmatrix.hh:1191
│ │ │ │ -
std::map< std::pair< size_type, size_type >, B > OverflowType
Definition bcrsmatrix.hh:2049
│ │ │ │ -
row_type::Iterator ColIterator
Iterator for the entries of each row.
Definition bcrsmatrix.hh:704
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition bcrsmatrix.hh:1877
│ │ │ │ -
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ -
BCRSMatrix & operator/=(const field_type &k)
vector space division by scalar
Definition bcrsmatrix.hh:1512
│ │ │ │ -
OverflowType overflow
Definition bcrsmatrix.hh:2050
│ │ │ │ -
BCRSMatrix & operator+=(const BCRSMatrix &b)
Add the entries of another matrix to this one.
Definition bcrsmatrix.hh:1545
│ │ │ │ -
BCRSMatrix(size_type _n, size_type _m, size_type _avg, double compressionBufferSize, BuildMode bm)
construct matrix with a known average number of entries per row
Definition bcrsmatrix.hh:784
│ │ │ │ -
CreateIterator createend()
get create iterator pointing to one after the last block
Definition bcrsmatrix.hh:1103
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition bcrsmatrix.hh:1860
│ │ │ │ -
Iterator beforeEnd()
Definition bcrsmatrix.hh:688
│ │ │ │ -
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition bcrsmatrix.hh:741
│ │ │ │ -
void usmv(F &&alpha, const X &x, Y &y) const
y += alpha A x
Definition bcrsmatrix.hh:1684
│ │ │ │ -
size_type getrowsize(size_type i) const
get current number of indices in row i
Definition bcrsmatrix.hh:1128
│ │ │ │ -
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │ -
size_type n
Definition bcrsmatrix.hh:2030
│ │ │ │ -
Imp::CompressedBlockVectorWindow< B, A > row_type
implement row_type with compressed vector
Definition bcrsmatrix.hh:497
│ │ │ │ -
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ -
BuildStage
Definition bcrsmatrix.hh:469
│ │ │ │ -
@ rowSizesBuilt
The row sizes of the matrix are known.
Definition bcrsmatrix.hh:480
│ │ │ │ -
@ built
The matrix structure is fully built.
Definition bcrsmatrix.hh:482
│ │ │ │ -
@ notbuilt
Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
Definition bcrsmatrix.hh:471
│ │ │ │ -
@ notAllocated
Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
Definition bcrsmatrix.hh:473
│ │ │ │ -
@ building
Matrix is currently being built, some memory has been allocated, build mode and size are fixed.
Definition bcrsmatrix.hh:475
│ │ │ │ -
BuildMode buildMode() const
The currently selected build mode of the matrix.
Definition bcrsmatrix.hh:1999
│ │ │ │ -
void mmv(const X &x, Y &y) const
y -= A x
Definition bcrsmatrix.hh:1661
│ │ │ │ -
FieldTraits< ft >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition bcrsmatrix.hh:1885
│ │ │ │ -
void mv(const X &x, Y &y) const
y = A x
Definition bcrsmatrix.hh:1612
│ │ │ │ -
B block_type
export the type representing the components
Definition bcrsmatrix.hh:491
│ │ │ │ -
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition bcrsmatrix.hh:1745
│ │ │ │ -
size_type avg
Definition bcrsmatrix.hh:2046
│ │ │ │ -
void umv(const X &x, Y &y) const
y += A x
Definition bcrsmatrix.hh:1638
│ │ │ │ -
void implicit_allocate(size_type _n, size_type _m)
organizes allocation implicit mode calculates correct array size to be allocated and sets the the win...
Definition bcrsmatrix.hh:2265
│ │ │ │ -
void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
Set parameters needed for creation in implicit build mode.
Definition bcrsmatrix.hh:889
│ │ │ │ -
BCRSMatrix(size_type _n, size_type _m, BuildMode bm)
matrix with unknown number of nonzeroes
Definition bcrsmatrix.hh:765
│ │ │ │ -
void endindices()
indicate that all indices are defined, check consistency
Definition bcrsmatrix.hh:1248
│ │ │ │ -
CompressionStatistics compress()
Finishes the buildstage in implicit mode.
Definition bcrsmatrix.hh:1360
│ │ │ │ -
void setDataPointers()
Set data pointers for all rows.
Definition bcrsmatrix.hh:2103
│ │ │ │ -
std::allocator_traits< A >::template rebind_alloc< B > allocator_
Definition bcrsmatrix.hh:2023
│ │ │ │ -
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ -
void setBuildMode(BuildMode bm)
Sets the build mode of the matrix.
Definition bcrsmatrix.hh:833
│ │ │ │ -
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ -
std::shared_ptr< size_type > j_
Definition bcrsmatrix.hh:2043
│ │ │ │ -
void setWindowPointers(ConstRowIterator row)
Definition bcrsmatrix.hh:2052
│ │ │ │ -
BCRSMatrix & operator=(const BCRSMatrix &Mat)
assignment
Definition bcrsmatrix.hh:911
│ │ │ │ -
void setColumnPointers(ConstRowIterator row)
Copy row sizes from iterator range starting at row and set column index pointers for all rows.
Definition bcrsmatrix.hh:2077
│ │ │ │ -
ConstIterator end() const
Get const iterator to one beyond last row.
Definition bcrsmatrix.hh:718
│ │ │ │ -
ConstIterator begin() const
Get const iterator to first row.
Definition bcrsmatrix.hh:712
│ │ │ │ -
A allocator_type
export the allocator type
Definition bcrsmatrix.hh:494
│ │ │ │ -
ConstIterator beforeEnd() const
Definition bcrsmatrix.hh:725
│ │ │ │ -
Iterator access to matrix rows
Definition bcrsmatrix.hh:579
│ │ │ │ -
RealRowIterator()
empty constructor, use with care!
Definition bcrsmatrix.hh:596
│ │ │ │ -
bool equals(const RealRowIterator< ValueType > &other) const
equality
Definition bcrsmatrix.hh:624
│ │ │ │ -
std::remove_const< T >::type ValueType
The unqualified value type.
Definition bcrsmatrix.hh:583
│ │ │ │ -
RealRowIterator(const RealRowIterator< ValueType > &it)
Definition bcrsmatrix.hh:600
│ │ │ │ -
bool equals(const RealRowIterator< const ValueType > &other) const
equality
Definition bcrsmatrix.hh:631
│ │ │ │ -
RealRowIterator(row_type *_p, size_type _i)
constructor
Definition bcrsmatrix.hh:591
│ │ │ │ -
std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other) const
Definition bcrsmatrix.hh:617
│ │ │ │ -
size_type index() const
return index
Definition bcrsmatrix.hh:606
│ │ │ │ -
std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const
Definition bcrsmatrix.hh:611
│ │ │ │ -
Iterator class for sequential creation of blocks
Definition bcrsmatrix.hh:957
│ │ │ │ -
bool operator==(const CreateIterator &it) const
equality
Definition bcrsmatrix.hh:1052
│ │ │ │ -
CreateIterator & operator++()
prefix increment
Definition bcrsmatrix.hh:977
│ │ │ │ -
size_type index() const
The number of the row that the iterator currently points to.
Definition bcrsmatrix.hh:1058
│ │ │ │ -
bool operator!=(const CreateIterator &it) const
inequality
Definition bcrsmatrix.hh:1046
│ │ │ │ -
CreateIterator(BCRSMatrix &_Mat, size_type _i)
constructor
Definition bcrsmatrix.hh:960
│ │ │ │ -
void insert(size_type j)
put column index in row
Definition bcrsmatrix.hh:1064
│ │ │ │ -
bool contains(size_type j)
return true if column index is in row
Definition bcrsmatrix.hh:1070
│ │ │ │ -
size_type size() const
Get the current row size.
Definition bcrsmatrix.hh:1079
│ │ │ │ -
typename BCRSMatrix< B, A >::field_type field_type
Definition bcrsmatrix.hh:2299
│ │ │ │ -
typename FieldTraits< field_type >::real_type real_type
Definition bcrsmatrix.hh:2300
│ │ │ │ -
Error specific to BCRSMatrix.
Definition istlexception.hh:24
│ │ │ │ -
Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
Definition istlexception.hh:37
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ -
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ -
Definition matrixutils.hh:538
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
SequentialInformation()
Definition pinfo.hh:91
│ │ │ │ +
T globalSum(const T &t) const
Definition pinfo.hh:49
│ │ │ │ +
void dot(const T1 &, const T1 &, T2 &) const
Definition pinfo.hh:74
│ │ │ │ +
EmptySet< int > CopyFlags
Definition pinfo.hh:31
│ │ │ │ +
AllSet< int > OwnerSet
Definition pinfo.hh:32
│ │ │ │ +
void copyOwnerToAll(V &v, V &v1) const
Definition pinfo.hh:66
│ │ │ │ +
MPICommunicator communicator() const
Definition pinfo.hh:38
│ │ │ │ +
void buildGlobalLookup(std::size_t)
Definition pinfo.hh:56
│ │ │ │ +
FieldTraits< typenameT1::field_type >::real_type norm(const T1 &) const
Definition pinfo.hh:81
│ │ │ │ +
void project(V &v) const
Definition pinfo.hh:70
│ │ │ │ +
Communication< void * > MPICommunicator
Definition pinfo.hh:30
│ │ │ │ +
SequentialInformation(const Communication< T > &)
Definition pinfo.hh:88
│ │ │ │ +
const GlobalLookupIndexSet & globalLookup() const
Definition pinfo.hh:60
│ │ │ │ +
SequentialInformation(const SequentialInformation &)
Definition pinfo.hh:94
│ │ │ │ +
void freeGlobalLookup()
Definition pinfo.hh:58
│ │ │ │ +
int GlobalLookupIndexSet
Definition pinfo.hh:54
│ │ │ │ +
SolverCategory::Category category() const
Definition pinfo.hh:34
│ │ │ │ +
int procs() const
Definition pinfo.hh:43
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,2387 +1,183 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -bcrsmatrix.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +pinfo.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_ISTL_BCRSMATRIX_HH │ │ │ │ │ -7#define DUNE_ISTL_BCRSMATRIX_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ +5#ifndef DUNE_AMG_PINFO_HH │ │ │ │ │ +6#define DUNE_AMG_PINFO_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11#if HAVE_MPI │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ 18 │ │ │ │ │ -19#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -20#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -21#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ -24#include │ │ │ │ │ -25#include │ │ │ │ │ -26#include │ │ │ │ │ -27#include │ │ │ │ │ -28 │ │ │ │ │ -29#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -30 │ │ │ │ │ -35namespace _D_u_n_e { │ │ │ │ │ -36 │ │ │ │ │ -76 template │ │ │ │ │ -77 struct MatrixDimension; │ │ │ │ │ -78 │ │ │ │ │ -80 │ │ │ │ │ -86 template │ │ │ │ │ -_8_7 struct _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s │ │ │ │ │ -88 { │ │ │ │ │ -_9_0 double _a_v_g; │ │ │ │ │ -_9_2 size_type _m_a_x_i_m_u_m; │ │ │ │ │ -_9_4 size_type _o_v_e_r_f_l_o_w___t_o_t_a_l; │ │ │ │ │ -96 │ │ │ │ │ -_9_9 double _m_e_m___r_a_t_i_o; │ │ │ │ │ -100 }; │ │ │ │ │ -101 │ │ │ │ │ -103 │ │ │ │ │ -115 template │ │ │ │ │ -_1_1_6 class _I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ -117 { │ │ │ │ │ -118 │ │ │ │ │ -119 public: │ │ │ │ │ -120 │ │ │ │ │ -_1_2_2 typedef M_ _M_a_t_r_i_x; │ │ │ │ │ -123 │ │ │ │ │ -_1_2_5 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -126 │ │ │ │ │ -_1_2_8 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -129 │ │ │ │ │ -131 │ │ │ │ │ -_1_3_6 class _r_o_w___o_b_j_e_c_t │ │ │ │ │ -137 { │ │ │ │ │ -138 │ │ │ │ │ -139 public: │ │ │ │ │ -140 │ │ │ │ │ -_1_4_2 _b_l_o_c_k___t_y_p_e& _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e j) const │ │ │ │ │ -143 { │ │ │ │ │ -144 return _m.entry(_i,j); │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ -147#ifndef DOXYGEN │ │ │ │ │ -148 │ │ │ │ │ -149 _r_o_w___o_b_j_e_c_t(_M_a_t_r_i_x& m, _s_i_z_e___t_y_p_e i) │ │ │ │ │ -150 : _m(m) │ │ │ │ │ -151 , _i(i) │ │ │ │ │ -152 {} │ │ │ │ │ -153 │ │ │ │ │ -154#endif │ │ │ │ │ -155 │ │ │ │ │ -156 private: │ │ │ │ │ -157 │ │ │ │ │ -158 _M_a_t_r_i_x& _m; │ │ │ │ │ -_1_5_9 _s_i_z_e___t_y_p_e _i; │ │ │ │ │ -160 │ │ │ │ │ -161 }; │ │ │ │ │ -162 │ │ │ │ │ -164 │ │ │ │ │ -_1_7_0 _I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r(_M_a_t_r_i_x& m) │ │ │ │ │ -171 : _m(m) │ │ │ │ │ -172 { │ │ │ │ │ -173 if (m.buildMode() != Matrix::implicit) │ │ │ │ │ -174 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only create an ImplicitBuilder for a │ │ │ │ │ -matrix in implicit build mode"); │ │ │ │ │ -175 if (m.buildStage() != Matrix::building) │ │ │ │ │ -176 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only create an ImplicitBuilder for a │ │ │ │ │ -matrix with set size that has not been compressed() yet"); │ │ │ │ │ -177 } │ │ │ │ │ -178 │ │ │ │ │ -180 │ │ │ │ │ -_1_9_4 _I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r(_M_a_t_r_i_x& m, _s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e cols, _s_i_z_e___t_y_p_e │ │ │ │ │ -avg_cols_per_row, double overflow_fraction) │ │ │ │ │ -195 : _m(m) │ │ │ │ │ -196 { │ │ │ │ │ -197 if (m.buildStage() != Matrix::notAllocated) │ │ │ │ │ -198 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only set up a matrix for this │ │ │ │ │ -ImplicitBuilder if it has no memory allocated yet"); │ │ │ │ │ -199 m.setBuildMode(Matrix::implicit); │ │ │ │ │ -200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction); │ │ │ │ │ -201 m.setSize(rows,cols); │ │ │ │ │ -202 } │ │ │ │ │ -203 │ │ │ │ │ -_2_0_5 _r_o_w___o_b_j_e_c_t _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -206 { │ │ │ │ │ -207 return _r_o_w___o_b_j_e_c_t(_m,i); │ │ │ │ │ -208 } │ │ │ │ │ -209 │ │ │ │ │ -_2_1_1 _s_i_z_e___t_y_p_e _N() const │ │ │ │ │ -212 { │ │ │ │ │ -213 return _m.N(); │ │ │ │ │ -214 } │ │ │ │ │ -215 │ │ │ │ │ -_2_1_7 _s_i_z_e___t_y_p_e _M() const │ │ │ │ │ -218 { │ │ │ │ │ -219 return _m.M(); │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -222 private: │ │ │ │ │ -223 │ │ │ │ │ -224 _M_a_t_r_i_x& _m; │ │ │ │ │ -225 │ │ │ │ │ -226 }; │ │ │ │ │ -227 │ │ │ │ │ -464 template > │ │ │ │ │ -_4_6_5 class _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -466 { │ │ │ │ │ -467 friend struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_B_C_R_S_M_a_t_r_i_x>; │ │ │ │ │ -468 public: │ │ │ │ │ -_4_6_9 enum _B_u_i_l_d_S_t_a_g_e { │ │ │ │ │ -_4_7_1 _n_o_t_b_u_i_l_t=0, │ │ │ │ │ -_4_7_3 _n_o_t_A_l_l_o_c_a_t_e_d=0, │ │ │ │ │ -_4_7_5 _b_u_i_l_d_i_n_g=1, │ │ │ │ │ -_4_8_0 _r_o_w_S_i_z_e_s_B_u_i_l_t=2, │ │ │ │ │ -482 _b_u_i_l_t=3 │ │ │ │ │ -_4_8_3 }; │ │ │ │ │ -484 │ │ │ │ │ -485 //===== type definitions and constants │ │ │ │ │ -486 │ │ │ │ │ -_4_8_8 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ -489 │ │ │ │ │ -_4_9_1 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -492 │ │ │ │ │ -_4_9_4 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -495 │ │ │ │ │ -_4_9_7 typedef Imp::CompressedBlockVectorWindow _r_o_w___t_y_p_e; │ │ │ │ │ -498 │ │ │ │ │ -_5_0_0 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -501 │ │ │ │ │ -_5_0_3 typedef ::Dune::CompressionStatistics _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s; │ │ │ │ │ -504 │ │ │ │ │ -506 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ -2.8.")]] │ │ │ │ │ -_5_0_7 static constexpr unsigned int _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ -508 │ │ │ │ │ -_5_1_0 enum _B_u_i_l_d_M_o_d_e { │ │ │ │ │ -_5_2_1 _r_o_w___w_i_s_e, │ │ │ │ │ -_5_3_0 _r_a_n_d_o_m, │ │ │ │ │ -_5_3_9 _i_m_p_l_i_c_i_t, │ │ │ │ │ -543 _u_n_k_n_o_w_n │ │ │ │ │ -_5_4_4 }; │ │ │ │ │ -545 │ │ │ │ │ -546 //===== random access interface to rows of the matrix │ │ │ │ │ -547 │ │ │ │ │ -_5_4_9 _r_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ -550 { │ │ │ │ │ -551#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -552 if (_b_u_i_l_d___m_o_d_e == _i_m_p_l_i_c_i_t && _r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -553 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot use operator[] in implicit build │ │ │ │ │ -mode before calling compress()"); │ │ │ │ │ -554 if (_r==0) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row not initialized yet"); │ │ │ │ │ -555 if (i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -556#endif │ │ │ │ │ -557 return _r[i]; │ │ │ │ │ -558 } │ │ │ │ │ -559 │ │ │ │ │ -_5_6_1 const _r_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -562 { │ │ │ │ │ -563#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -564 if (_b_u_i_l_d___m_o_d_e == _i_m_p_l_i_c_i_t && _r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -565 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot use operator[] in implicit build │ │ │ │ │ -mode before calling compress()"); │ │ │ │ │ -566 if (_b_u_i_l_t!=_r_e_a_d_y) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row not initialized yet"); │ │ │ │ │ -567 if (i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -568#endif │ │ │ │ │ -569 return _r[i]; │ │ │ │ │ -570 } │ │ │ │ │ -571 │ │ │ │ │ -572 │ │ │ │ │ -573 //===== iterator interface to rows of the matrix │ │ │ │ │ -574 │ │ │ │ │ -576 template │ │ │ │ │ -_5_7_7 class _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -578 : public RandomAccessIteratorFacade, T> │ │ │ │ │ -579 { │ │ │ │ │ -580 │ │ │ │ │ -581 public: │ │ │ │ │ -_5_8_3 typedef typename std::remove_const::type _V_a_l_u_e_T_y_p_e; │ │ │ │ │ -584 │ │ │ │ │ -585 friend class RandomAccessIteratorFacade<_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r, │ │ │ │ │ -const _V_a_l_u_e_T_y_p_e>; │ │ │ │ │ -586 friend class RandomAccessIteratorFacade<_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r<_V_a_l_u_e_T_y_p_e>, │ │ │ │ │ -_V_a_l_u_e_T_y_p_e>; │ │ │ │ │ -587 friend class _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -588 friend class _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r<_V_a_l_u_e_T_y_p_e>; │ │ │ │ │ -589 │ │ │ │ │ -_5_9_1 _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r (_r_o_w___t_y_p_e* _p, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ -592 : p(_p), i(_i) │ │ │ │ │ -593 {} │ │ │ │ │ -594 │ │ │ │ │ -_5_9_6 _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r () │ │ │ │ │ -597 : p(0), i(0) │ │ │ │ │ -598 {} │ │ │ │ │ -599 │ │ │ │ │ -_6_0_0 _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r(const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_V_a_l_u_e_T_y_p_e_>& it) │ │ │ │ │ -601 : p(it.p), i(it.i) │ │ │ │ │ -602 {} │ │ │ │ │ -603 │ │ │ │ │ -604 │ │ │ │ │ -_6_0_6 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ -607 { │ │ │ │ │ -608 return i; │ │ │ │ │ -609 } │ │ │ │ │ -610 │ │ │ │ │ -_6_1_1 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_V_a_l_u_e_T_y_p_e_>& other) const │ │ │ │ │ -612 { │ │ │ │ │ -613 assert(other.p==p); │ │ │ │ │ -614 return (other.i-i); │ │ │ │ │ -615 } │ │ │ │ │ -616 │ │ │ │ │ -_6_1_7 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _V_a_l_u_e_T_y_p_e_>& other) │ │ │ │ │ +19#endif │ │ │ │ │ +20 │ │ │ │ │ +21#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ +22namespace _D_u_n_e │ │ │ │ │ +23{ │ │ │ │ │ +24 namespace Amg │ │ │ │ │ +25 { │ │ │ │ │ +26 │ │ │ │ │ +_2_7 class _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +28 { │ │ │ │ │ +29 public: │ │ │ │ │ +_3_0 typedef Communication _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ +_3_1 typedef EmptySet _C_o_p_y_F_l_a_g_s; │ │ │ │ │ +_3_2 typedef AllSet _O_w_n_e_r_S_e_t; │ │ │ │ │ +33 │ │ │ │ │ +_3_4 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y () const { │ │ │ │ │ +35 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +36 } │ │ │ │ │ +37 │ │ │ │ │ +_3_8 _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r _c_o_m_m_u_n_i_c_a_t_o_r() const │ │ │ │ │ +39 { │ │ │ │ │ +40 return comm_; │ │ │ │ │ +41 } │ │ │ │ │ +42 │ │ │ │ │ +_4_3 int _p_r_o_c_s() const │ │ │ │ │ +44 { │ │ │ │ │ +45 return 1; │ │ │ │ │ +46 } │ │ │ │ │ +47 │ │ │ │ │ +48 template │ │ │ │ │ +_4_9 T _g_l_o_b_a_l_S_u_m(const T& t) const │ │ │ │ │ +50 { │ │ │ │ │ +51 return t; │ │ │ │ │ +52 } │ │ │ │ │ +53 │ │ │ │ │ +_5_4 typedef int _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ +55 │ │ │ │ │ +_5_6 void _b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(std::size_t){} │ │ │ │ │ +57 │ │ │ │ │ +_5_8 void _f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p(){} │ │ │ │ │ +59 │ │ │ │ │ +_6_0 const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& _g_l_o_b_a_l_L_o_o_k_u_p() const │ │ │ │ │ +61 { │ │ │ │ │ +62 return gli; │ │ │ │ │ +63 } │ │ │ │ │ +64 │ │ │ │ │ +65 template │ │ │ │ │ +_6_6 void _c_o_p_y_O_w_n_e_r_T_o_A_l_l([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const │ │ │ │ │ +67 {} │ │ │ │ │ +68 │ │ │ │ │ +69 template │ │ │ │ │ +_7_0 void _p_r_o_j_e_c_t([[maybe_unused]] V& v) const │ │ │ │ │ +71 {} │ │ │ │ │ +72 │ │ │ │ │ +73 template │ │ │ │ │ +_7_4 void _d_o_t (const T1&, const T1&, T2&) const │ │ │ │ │ +75 { │ │ │ │ │ +76 // This function should never be called │ │ │ │ │ +77 std::abort(); │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +80 template │ │ │ │ │ +_8_1 typename FieldTraits::real_type _n_o_r_m (const T1&) │ │ │ │ │ const │ │ │ │ │ -618 { │ │ │ │ │ -619 assert(other.p==p); │ │ │ │ │ -620 return (other.i-i); │ │ │ │ │ -621 } │ │ │ │ │ -622 │ │ │ │ │ -_6_2_4 bool _e_q_u_a_l_s (const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_V_a_l_u_e_T_y_p_e_>& other) const │ │ │ │ │ -625 { │ │ │ │ │ -626 assert(other.p==p); │ │ │ │ │ -627 return i==other.i; │ │ │ │ │ -628 } │ │ │ │ │ -629 │ │ │ │ │ -_6_3_1 bool _e_q_u_a_l_s (const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _V_a_l_u_e_T_y_p_e_>& other) const │ │ │ │ │ -632 { │ │ │ │ │ -633 assert(other.p==p); │ │ │ │ │ -634 return i==other.i; │ │ │ │ │ -635 } │ │ │ │ │ -636 │ │ │ │ │ -637 private: │ │ │ │ │ -639 void increment() │ │ │ │ │ -640 { │ │ │ │ │ -641 ++i; │ │ │ │ │ -642 } │ │ │ │ │ -643 │ │ │ │ │ -645 void decrement() │ │ │ │ │ -646 { │ │ │ │ │ -647 --i; │ │ │ │ │ -648 } │ │ │ │ │ -649 │ │ │ │ │ -650 void advance(std::ptrdiff_t diff) │ │ │ │ │ -651 { │ │ │ │ │ -652 i+=diff; │ │ │ │ │ -653 } │ │ │ │ │ -654 │ │ │ │ │ -655 T& elementAt(std::ptrdiff_t diff) const │ │ │ │ │ -656 { │ │ │ │ │ -657 return p[i+diff]; │ │ │ │ │ -658 } │ │ │ │ │ -659 │ │ │ │ │ -661 _r_o_w___t_y_p_e& dereference () const │ │ │ │ │ -662 { │ │ │ │ │ -663 return p[i]; │ │ │ │ │ -664 } │ │ │ │ │ -665 │ │ │ │ │ -666 _r_o_w___t_y_p_e* p; │ │ │ │ │ -667 _s_i_z_e___t_y_p_e i; │ │ │ │ │ -668 }; │ │ │ │ │ -669 │ │ │ │ │ -_6_7_1 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_r_o_w___t_y_p_e_> _i_t_e_r_a_t_o_r; │ │ │ │ │ -_6_7_2 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_r_o_w___t_y_p_e_> _I_t_e_r_a_t_o_r; │ │ │ │ │ -673 │ │ │ │ │ -_6_7_5 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ -676 { │ │ │ │ │ -677 return _I_t_e_r_a_t_o_r(_r,0); │ │ │ │ │ -678 } │ │ │ │ │ -679 │ │ │ │ │ -_6_8_1 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ -682 { │ │ │ │ │ -683 return _I_t_e_r_a_t_o_r(_r,_n); │ │ │ │ │ -684 } │ │ │ │ │ -685 │ │ │ │ │ -_6_8_8 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ -689 { │ │ │ │ │ -690 return _I_t_e_r_a_t_o_r(_r,_n-1); │ │ │ │ │ -691 } │ │ │ │ │ -692 │ │ │ │ │ -_6_9_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ -696 { │ │ │ │ │ -697 return _I_t_e_r_a_t_o_r(_r,-1); │ │ │ │ │ -698 } │ │ │ │ │ -699 │ │ │ │ │ -_7_0_1 typedef _I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -702 │ │ │ │ │ -_7_0_4 typedef typename row_type::Iterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -705 │ │ │ │ │ -_7_0_7 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _r_o_w___t_y_p_e_> _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -_7_0_8 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _r_o_w___t_y_p_e_> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -709 │ │ │ │ │ -710 │ │ │ │ │ -_7_1_2 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ -713 { │ │ │ │ │ -714 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,0); │ │ │ │ │ -715 } │ │ │ │ │ -716 │ │ │ │ │ -_7_1_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ -719 { │ │ │ │ │ -720 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,_n); │ │ │ │ │ -721 } │ │ │ │ │ -722 │ │ │ │ │ -_7_2_5 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ -726 { │ │ │ │ │ -727 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,_n-1); │ │ │ │ │ -728 } │ │ │ │ │ -729 │ │ │ │ │ -_7_3_2 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ -733 { │ │ │ │ │ -734 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,-1); │ │ │ │ │ -735 } │ │ │ │ │ -736 │ │ │ │ │ -_7_3_8 typedef _C_o_n_s_t_I_t_e_r_a_t_o_r _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ -739 │ │ │ │ │ -_7_4_1 typedef typename row_type::ConstIterator _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -742 │ │ │ │ │ -743 //===== constructors & resizers │ │ │ │ │ -744 │ │ │ │ │ -745 // we use a negative compressionBufferSize to indicate that the implicit │ │ │ │ │ -746 // mode parameters have not been set yet │ │ │ │ │ -747 │ │ │ │ │ -_7_4_9 _B_C_R_S_M_a_t_r_i_x () │ │ │ │ │ -750 : _b_u_i_l_d___m_o_d_e(_u_n_k_n_o_w_n), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ -751 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ -752 _a_v_g(0), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(-1.0) │ │ │ │ │ -753 {} │ │ │ │ │ -754 │ │ │ │ │ -_7_5_6 _B_C_R_S_M_a_t_r_i_x (_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m, _s_i_z_e___t_y_p_e _nnz, _B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ -757 : _b_u_i_l_d___m_o_d_e(bm), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ -758 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ -759 _a_v_g(0), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(-1.0) │ │ │ │ │ -760 { │ │ │ │ │ -761 _a_l_l_o_c_a_t_e(_n, _m, _nnz,true,false); │ │ │ │ │ -762 } │ │ │ │ │ -763 │ │ │ │ │ -_7_6_5 _B_C_R_S_M_a_t_r_i_x (_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m, _B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ -766 : _b_u_i_l_d___m_o_d_e(bm), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ -767 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ -768 _a_v_g(0), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(-1.0) │ │ │ │ │ -769 { │ │ │ │ │ -770 _a_l_l_o_c_a_t_e(_n, _m,0,true,false); │ │ │ │ │ -771 } │ │ │ │ │ -772 │ │ │ │ │ -774 │ │ │ │ │ -_7_8_4 _B_C_R_S_M_a_t_r_i_x (_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m, _s_i_z_e___t_y_p_e _avg, double │ │ │ │ │ -compressionBufferSize, _B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ -785 : _b_u_i_l_d___m_o_d_e(bm), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ -786 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ -787 _a_v_g(_avg), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(compressionBufferSize) │ │ │ │ │ -788 { │ │ │ │ │ -789 if (bm != _i_m_p_l_i_c_i_t) │ │ │ │ │ -790 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"Only call this constructor when using the │ │ │ │ │ -implicit build mode"); │ │ │ │ │ -791 // Prevent user from setting a negative compression buffer size: │ │ │ │ │ -792 // 1) It doesn't make sense │ │ │ │ │ -793 // 2) We use a negative value to indicate that the parameters │ │ │ │ │ -794 // have not been set yet │ │ │ │ │ -795 if (_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ < 0.0) │ │ │ │ │ -796 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot set a negative overflow fraction"); │ │ │ │ │ -797 _i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e(_n,_m); │ │ │ │ │ -798 } │ │ │ │ │ -799 │ │ │ │ │ -_8_0_5 _B_C_R_S_M_a_t_r_i_x (const _B_C_R_S_M_a_t_r_i_x& Mat) │ │ │ │ │ -806 : _b_u_i_l_d___m_o_d_e(Mat._b_u_i_l_d___m_o_d_e), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ -807 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ -808 _a_v_g(Mat._a_v_g), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(Mat._c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__) │ │ │ │ │ -809 { │ │ │ │ │ -810 if (!(Mat._r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d || Mat._r_e_a_d_y == _b_u_i_l_t)) │ │ │ │ │ -811 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copy-constructed │ │ │ │ │ -when source matrix is completely empty (size not set) or fully built)"); │ │ │ │ │ -812 │ │ │ │ │ -813 // deep copy in global array │ │ │ │ │ -814 _s_i_z_e___t_y_p_e _nnz = Mat._n_o_n_z_e_r_o_e_s(); │ │ │ │ │ -815 │ │ │ │ │ -816 _j__ = Mat._j__; // enable column index sharing, release array in case of row- │ │ │ │ │ -wise allocation │ │ │ │ │ -817 _a_l_l_o_c_a_t_e(Mat._n, Mat._m, _nnz, true, true); │ │ │ │ │ -818 │ │ │ │ │ -819 // build window structure │ │ │ │ │ -820 _c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e(Mat); │ │ │ │ │ -821 } │ │ │ │ │ -822 │ │ │ │ │ -_8_2_4 _~_B_C_R_S_M_a_t_r_i_x () │ │ │ │ │ -825 { │ │ │ │ │ -826 _d_e_a_l_l_o_c_a_t_e(); │ │ │ │ │ -827 } │ │ │ │ │ -828 │ │ │ │ │ -_8_3_3 void _s_e_t_B_u_i_l_d_M_o_d_e(_B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ -834 { │ │ │ │ │ -835 if (_r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ -836 { │ │ │ │ │ -837 _b_u_i_l_d___m_o_d_e = bm; │ │ │ │ │ -838 return; │ │ │ │ │ -839 } │ │ │ │ │ -840 if (_r_e_a_d_y == _b_u_i_l_d_i_n_g && (_b_u_i_l_d___m_o_d_e == _u_n_k_n_o_w_n || _b_u_i_l_d___m_o_d_e == _r_a_n_d_o_m || │ │ │ │ │ -_b_u_i_l_d___m_o_d_e == _r_o_w___w_i_s_e) && (bm == _r_o_w___w_i_s_e || bm == _r_a_n_d_o_m)) │ │ │ │ │ -841 _b_u_i_l_d___m_o_d_e = bm; │ │ │ │ │ -842 else │ │ │ │ │ -843 DUNE_THROW(InvalidStateException, "Matrix structure cannot be changed at │ │ │ │ │ -this stage anymore (ready == "<<_r_e_a_d_y<<")."); │ │ │ │ │ -844 } │ │ │ │ │ -845 │ │ │ │ │ -_8_6_1 void _s_e_t_S_i_z_e(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e nnz=0) │ │ │ │ │ -862 { │ │ │ │ │ -863 // deallocate already setup memory │ │ │ │ │ -864 _d_e_a_l_l_o_c_a_t_e(); │ │ │ │ │ -865 │ │ │ │ │ -866 if (_b_u_i_l_d___m_o_d_e == _i_m_p_l_i_c_i_t) │ │ │ │ │ -867 { │ │ │ │ │ -868 if (nnz>0) │ │ │ │ │ -869 DUNE_THROW(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"number of non-zeroes may not be set in │ │ │ │ │ -implicit mode, use setImplicitBuildModeParameters() instead"); │ │ │ │ │ -870 │ │ │ │ │ -871 // implicit allocates differently │ │ │ │ │ -872 _i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e(rows,columns); │ │ │ │ │ -873 } │ │ │ │ │ -874 else │ │ │ │ │ -875 { │ │ │ │ │ -876 // allocate matrix memory │ │ │ │ │ -877 _a_l_l_o_c_a_t_e(rows, columns, nnz, true, false); │ │ │ │ │ -878 } │ │ │ │ │ -879 } │ │ │ │ │ -880 │ │ │ │ │ -_8_8_9 void _s_e_t_I_m_p_l_i_c_i_t_B_u_i_l_d_M_o_d_e_P_a_r_a_m_e_t_e_r_s(_s_i_z_e___t_y_p_e _avg, double │ │ │ │ │ -compressionBufferSize) │ │ │ │ │ -890 { │ │ │ │ │ -891 // Prevent user from setting a negative compression buffer size: │ │ │ │ │ -892 // 1) It doesn't make sense │ │ │ │ │ -893 // 2) We use a negative value to indicate that the parameters │ │ │ │ │ -894 // have not been set yet │ │ │ │ │ -895 if (compressionBufferSize < 0.0) │ │ │ │ │ -896 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot set a negative compressionBufferSize │ │ │ │ │ -value"); │ │ │ │ │ -897 │ │ │ │ │ -898 // make sure the parameters aren't changed after memory has been allocated │ │ │ │ │ -899 if (_r_e_a_d_y != _n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ -900 DUNE_THROW(InvalidStateException,"You cannot modify build mode parameters │ │ │ │ │ -at this stage anymore"); │ │ │ │ │ -901 _a_v_g = _avg; │ │ │ │ │ -902 _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ = compressionBufferSize; │ │ │ │ │ -903 } │ │ │ │ │ -904 │ │ │ │ │ -_9_1_1 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _B_C_R_S_M_a_t_r_i_x& Mat) │ │ │ │ │ -912 { │ │ │ │ │ -913 // return immediately when self-assignment │ │ │ │ │ -914 if (&Mat==this) return *this; │ │ │ │ │ -915 │ │ │ │ │ -916 if (!((_r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d || _r_e_a_d_y == _b_u_i_l_t) && (Mat._r_e_a_d_y == │ │ │ │ │ -_n_o_t_A_l_l_o_c_a_t_e_d || Mat._r_e_a_d_y == _b_u_i_l_t))) │ │ │ │ │ -917 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copied when both │ │ │ │ │ -target and source are empty or fully built)"); │ │ │ │ │ -918 │ │ │ │ │ -919 // make it simple: ALWAYS throw away memory for a and j_ │ │ │ │ │ -920 // and deallocate rows only if n != Mat.n │ │ │ │ │ -921 _d_e_a_l_l_o_c_a_t_e(_n!=Mat._n); │ │ │ │ │ -922 │ │ │ │ │ -923 // reallocate the rows if required │ │ │ │ │ -924 if (_n>0 && _n!=Mat._n) { │ │ │ │ │ -925 // free rows │ │ │ │ │ -926 for(_r_o_w___t_y_p_e *riter=_r+(_n-1), *rend=_r-1; riter!=rend; --riter) │ │ │ │ │ -927 std::allocator_traits::destroy(_r_o_w_A_l_l_o_c_a_t_o_r__, │ │ │ │ │ -riter); │ │ │ │ │ -928 _r_o_w_A_l_l_o_c_a_t_o_r__.deallocate(_r,_n); │ │ │ │ │ -929 } │ │ │ │ │ -930 │ │ │ │ │ -931 _n_n_z__ = Mat._n_o_n_z_e_r_o_e_s(); │ │ │ │ │ -932 │ │ │ │ │ -933 // allocate a, share j_ │ │ │ │ │ -934 _j__ = Mat._j__; │ │ │ │ │ -935 _a_l_l_o_c_a_t_e(Mat._n, Mat._m, _n_n_z__, _n!=Mat._n, true); │ │ │ │ │ -936 │ │ │ │ │ -937 // build window structure │ │ │ │ │ -938 _c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e(Mat); │ │ │ │ │ -939 return *this; │ │ │ │ │ -940 } │ │ │ │ │ -941 │ │ │ │ │ -_9_4_3 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -944 { │ │ │ │ │ -945 │ │ │ │ │ -946 if (!(_r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d || _r_e_a_d_y == _b_u_i_l_t)) │ │ │ │ │ -947 DUNE_THROW(InvalidStateException,"Scalar assignment only works on fully │ │ │ │ │ -built BCRSMatrix)"); │ │ │ │ │ -948 │ │ │ │ │ -949 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) _r[i] = k; │ │ │ │ │ -950 return *this; │ │ │ │ │ -951 } │ │ │ │ │ -952 │ │ │ │ │ -953 //===== row-wise creation interface │ │ │ │ │ -954 │ │ │ │ │ -_9_5_6 class _C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -957 { │ │ │ │ │ -958 public: │ │ │ │ │ -_9_6_0 _C_r_e_a_t_e_I_t_e_r_a_t_o_r (_B_C_R_S_M_a_t_r_i_x& _Mat, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ -961 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat._j__._g_e_t(), 0) │ │ │ │ │ -962 { │ │ │ │ │ -963 if (Mat._b_u_i_l_d___m_o_d_e == _u_n_k_n_o_w_n && Mat._r_e_a_d_y == _b_u_i_l_d_i_n_g) │ │ │ │ │ -964 { │ │ │ │ │ -965 Mat._b_u_i_l_d___m_o_d_e = _r_o_w___w_i_s_e; │ │ │ │ │ -966 } │ │ │ │ │ -967 if (i==0 && Mat._r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ -968 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"creation only allowed for uninitialized │ │ │ │ │ -matrix"); │ │ │ │ │ -969 if(Mat._b_u_i_l_d___m_o_d_e!=_r_o_w___w_i_s_e) │ │ │ │ │ -970 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"creation only allowed if row wise allocation │ │ │ │ │ -was requested in the constructor"); │ │ │ │ │ -971 if(i==0 && _Mat._N()==0) │ │ │ │ │ -972 // empty Matrix is always built. │ │ │ │ │ -973 Mat._r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ -974 } │ │ │ │ │ -975 │ │ │ │ │ -_9_7_7 _C_r_e_a_t_e_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -978 { │ │ │ │ │ -979 // this should only be called if matrix is in creation │ │ │ │ │ -980 if (Mat._r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ -981 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix already built up"); │ │ │ │ │ -982 │ │ │ │ │ -983 // row i is defined through the pattern │ │ │ │ │ -984 // get memory for the row and initialize the j_ array │ │ │ │ │ -985 // this depends on the allocation mode │ │ │ │ │ -986 │ │ │ │ │ -987 // compute size of the row │ │ │ │ │ -988 _s_i_z_e___t_y_p_e s = pattern.size(); │ │ │ │ │ -989 │ │ │ │ │ -990 if(s>0) { │ │ │ │ │ -991 // update number of nonzeroes including this row │ │ │ │ │ -992 nnz += s; │ │ │ │ │ -993 │ │ │ │ │ -994 // alloc memory / set window │ │ │ │ │ -995 if (Mat._n_n_z__ > 0) │ │ │ │ │ -996 { │ │ │ │ │ -997 // memory is allocated in one long array │ │ │ │ │ -998 │ │ │ │ │ -999 // check if that memory is sufficient │ │ │ │ │ -1000 if (nnz > Mat._n_n_z__) │ │ │ │ │ -1001 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"allocated nnz too small"); │ │ │ │ │ -1002 │ │ │ │ │ -1003 // set row i │ │ │ │ │ -1004 Mat._r[i].set(s,nullptr,current_row.getindexptr()); │ │ │ │ │ -1005 current_row.setindexptr(current_row.getindexptr()+s); │ │ │ │ │ -1006 }else{ │ │ │ │ │ -1007 // memory is allocated individually per row │ │ │ │ │ -1008 // allocate and set row i │ │ │ │ │ -1009 B* b = Mat._a_l_l_o_c_a_t_o_r__.allocate(s); │ │ │ │ │ -1010 // use placement new to call constructor that allocates │ │ │ │ │ -1011 // additional memory. │ │ │ │ │ -1012 new (b) B[s]; │ │ │ │ │ -1013 _s_i_z_e___t_y_p_e* j = Mat._s_i_z_e_A_l_l_o_c_a_t_o_r__.allocate(s); │ │ │ │ │ -1014 Mat._r[i].set(s,b,j); │ │ │ │ │ -1015 } │ │ │ │ │ -1016 }else │ │ │ │ │ -1017 // setup empty row │ │ │ │ │ -1018 Mat._r[i].set(0,nullptr,nullptr); │ │ │ │ │ -1019 │ │ │ │ │ -1020 // initialize the j array for row i from pattern │ │ │ │ │ -1021 std::copy(pattern.cbegin(), pattern.cend(), Mat._r[i].getindexptr()); │ │ │ │ │ -1022 │ │ │ │ │ -1023 // now go to next row │ │ │ │ │ -1024 i++; │ │ │ │ │ -1025 pattern.clear(); │ │ │ │ │ -1026 │ │ │ │ │ -1027 // check if this was last row │ │ │ │ │ -1028 if (i==Mat._n) │ │ │ │ │ -1029 { │ │ │ │ │ -1030 Mat._r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ -1031 if(Mat._n_n_z__ > 0) │ │ │ │ │ -1032 { │ │ │ │ │ -1033 // Set nnz to the exact number of nonzero blocks inserted │ │ │ │ │ -1034 // as some methods rely on it │ │ │ │ │ -1035 Mat._n_n_z__ = nnz; │ │ │ │ │ -1036 // allocate data array │ │ │ │ │ -1037 Mat._a_l_l_o_c_a_t_e_D_a_t_a(); │ │ │ │ │ -1038 Mat._s_e_t_D_a_t_a_P_o_i_n_t_e_r_s(); │ │ │ │ │ -1039 } │ │ │ │ │ -1040 } │ │ │ │ │ -1041 // done │ │ │ │ │ -1042 return *this; │ │ │ │ │ -1043 } │ │ │ │ │ -1044 │ │ │ │ │ -_1_0_4_6 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -1047 { │ │ │ │ │ -1048 return (i!=it.i) || (&Mat!=&it.Mat); │ │ │ │ │ -1049 } │ │ │ │ │ -1050 │ │ │ │ │ -_1_0_5_2 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -1053 { │ │ │ │ │ -1054 return (i==it.i) && (&Mat==&it.Mat); │ │ │ │ │ -1055 } │ │ │ │ │ -1056 │ │ │ │ │ -_1_0_5_8 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ -1059 { │ │ │ │ │ -1060 return i; │ │ │ │ │ -1061 } │ │ │ │ │ -1062 │ │ │ │ │ -_1_0_6_4 void _i_n_s_e_r_t (_s_i_z_e___t_y_p_e j) │ │ │ │ │ -1065 { │ │ │ │ │ -1066 pattern.insert(j); │ │ │ │ │ -1067 } │ │ │ │ │ -1068 │ │ │ │ │ -_1_0_7_0 bool _c_o_n_t_a_i_n_s (_s_i_z_e___t_y_p_e j) │ │ │ │ │ -1071 { │ │ │ │ │ -1072 return pattern.find(j) != pattern.end(); │ │ │ │ │ -1073 } │ │ │ │ │ -_1_0_7_9 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -1080 { │ │ │ │ │ -1081 return pattern.size(); │ │ │ │ │ -1082 } │ │ │ │ │ -1083 │ │ │ │ │ -1084 private: │ │ │ │ │ -1085 _B_C_R_S_M_a_t_r_i_x& Mat; // the matrix we are defining │ │ │ │ │ -1086 _s_i_z_e___t_y_p_e i; // current row to be defined │ │ │ │ │ -1087 _s_i_z_e___t_y_p_e nnz; // count total number of nonzeros │ │ │ │ │ -1088 typedef std::set > PatternType; │ │ │ │ │ -1089 PatternType pattern; // used to compile entries in a row │ │ │ │ │ -1090 _r_o_w___t_y_p_e current_row; // row pointing to the current row to setup │ │ │ │ │ -1091 }; │ │ │ │ │ -1092 │ │ │ │ │ -_1_0_9_4 friend class _C_r_e_a_t_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -1095 │ │ │ │ │ -_1_0_9_7 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_b_e_g_i_n () │ │ │ │ │ -1098 { │ │ │ │ │ -1099 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,0); │ │ │ │ │ -1100 } │ │ │ │ │ -1101 │ │ │ │ │ -_1_1_0_3 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_e_n_d () │ │ │ │ │ -1104 { │ │ │ │ │ -1105 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,_n); │ │ │ │ │ -1106 } │ │ │ │ │ -1107 │ │ │ │ │ -1108 │ │ │ │ │ -1109 //===== random creation interface │ │ │ │ │ -1110 │ │ │ │ │ -_1_1_1_7 void _s_e_t_r_o_w_s_i_z_e (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s) │ │ │ │ │ -1118 { │ │ │ │ │ -1119 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ -1120 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ -1121 if (_r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ -1122 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix row sizes already built up"); │ │ │ │ │ -1123 │ │ │ │ │ -1124 _r[i].setsize(s); │ │ │ │ │ -1125 } │ │ │ │ │ -1126 │ │ │ │ │ -_1_1_2_8 _s_i_z_e___t_y_p_e _g_e_t_r_o_w_s_i_z_e (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -1129 { │ │ │ │ │ -1130#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1131 if (_r==0) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row not initialized yet"); │ │ │ │ │ -1132 if (i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1133#endif │ │ │ │ │ -1134 return _r[i].getsize(); │ │ │ │ │ -1135 } │ │ │ │ │ -1136 │ │ │ │ │ -_1_1_3_8 void _i_n_c_r_e_m_e_n_t_r_o_w_s_i_z_e (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s = 1) │ │ │ │ │ -1139 { │ │ │ │ │ -1140 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ -1141 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ -1142 if (_r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ -1143 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix row sizes already built up"); │ │ │ │ │ -1144 │ │ │ │ │ -1145 _r[i].setsize(_r[i].getsize()+s); │ │ │ │ │ -1146 } │ │ │ │ │ -1147 │ │ │ │ │ -_1_1_4_9 void _e_n_d_r_o_w_s_i_z_e_s () │ │ │ │ │ -1150 { │ │ │ │ │ -1151 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ -1152 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ -1153 if (_r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ -1154 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix row sizes already built up"); │ │ │ │ │ -1155 │ │ │ │ │ -1156 // compute total size, check positivity │ │ │ │ │ -1157 _s_i_z_e___t_y_p_e total=0; │ │ │ │ │ -1158 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ -1159 { │ │ │ │ │ -1160 total += _r[i].getsize(); │ │ │ │ │ -1161 } │ │ │ │ │ -1162 │ │ │ │ │ -1163 if(_n_n_z__ == 0) │ │ │ │ │ -1164 // allocate/check memory │ │ │ │ │ -1165 _a_l_l_o_c_a_t_e(_n,_m,total,false,false); │ │ │ │ │ -1166 else if(_n_n_z__ < total) │ │ │ │ │ -1167 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"Specified number of nonzeros ("<<_n_n_z__<<") not │ │ │ │ │ -" │ │ │ │ │ -1168 <<"sufficient for calculated nonzeros ("<= _m) │ │ │ │ │ -1203 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"column index exceeds matrix size"); │ │ │ │ │ -1204 │ │ │ │ │ -1205 // get row range │ │ │ │ │ -1206 _s_i_z_e___t_y_p_e* const first = _r[row].getindexptr(); │ │ │ │ │ -1207 _s_i_z_e___t_y_p_e* const last = first + _r[row].getsize(); │ │ │ │ │ -1208 │ │ │ │ │ -1209 // find correct insertion position for new column index │ │ │ │ │ -1210 _s_i_z_e___t_y_p_e* pos = std::lower_bound(first,last,_c_o_l); │ │ │ │ │ -1211 │ │ │ │ │ -1212 // check if index is already in row │ │ │ │ │ -1213 if (pos!=last && *pos == _c_o_l) return; │ │ │ │ │ -1214 │ │ │ │ │ -1215 // find end of already inserted column indices │ │ │ │ │ -1216 _s_i_z_e___t_y_p_e* _e_n_d = std::lower_bound(pos,last,_m); │ │ │ │ │ -1217 if (_e_n_d==last) │ │ │ │ │ -1218 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row is too small"); │ │ │ │ │ -1219 │ │ │ │ │ -1220 // insert new column index at correct position │ │ │ │ │ -1221 std::copy_backward(pos,_e_n_d,_e_n_d+1); │ │ │ │ │ -1222 *pos = _c_o_l; │ │ │ │ │ -1223 } │ │ │ │ │ -1224 │ │ │ │ │ -1226 │ │ │ │ │ -1233 template │ │ │ │ │ -_1_2_3_4 void _s_e_t_I_n_d_i_c_e_s(_s_i_z_e___t_y_p_e row, It _b_e_g_i_n, It _e_n_d) │ │ │ │ │ -1235 { │ │ │ │ │ -1236 _s_i_z_e___t_y_p_e row_size = _r[row].size(); │ │ │ │ │ -1237 _s_i_z_e___t_y_p_e* col_begin = _r[row].getindexptr(); │ │ │ │ │ -1238 _s_i_z_e___t_y_p_e* col_end; │ │ │ │ │ -1239 // consistency check between allocated row size and number of passed │ │ │ │ │ -column indices │ │ │ │ │ -1240 if ((col_end = std::copy(_b_e_g_i_n,_e_n_d,_r[row].getindexptr())) != col_begin + │ │ │ │ │ -row_size) │ │ │ │ │ -1241 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"Given size of row " << row │ │ │ │ │ -1242 << " (" << row_size │ │ │ │ │ -1243 << ") does not match number of passed entries (" << (col_end - col_begin) │ │ │ │ │ -<< ")"); │ │ │ │ │ -1244 std::sort(col_begin,col_end); │ │ │ │ │ -1245 } │ │ │ │ │ -1246 │ │ │ │ │ -_1_2_4_8 void _e_n_d_i_n_d_i_c_e_s () │ │ │ │ │ -1249 { │ │ │ │ │ -1250 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ -1251 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ -1252 if (_r_e_a_d_y==_b_u_i_l_t) │ │ │ │ │ -1253 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix already built up"); │ │ │ │ │ -1254 if (_r_e_a_d_y==_b_u_i_l_d_i_n_g) │ │ │ │ │ -1255 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row sizes are not built up yet"); │ │ │ │ │ -1256 if (_r_e_a_d_y==_n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ -1257 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix size not set and no memory allocated │ │ │ │ │ -yet"); │ │ │ │ │ -1258 │ │ │ │ │ -1259 // check if there are undefined indices │ │ │ │ │ -1260 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1261 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1262 { │ │ │ │ │ -1263 _C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1264 for (_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) { │ │ │ │ │ -1265 if (j.index() >= _m) { │ │ │ │ │ -1266 dwarn << "WARNING: size of row "<< i.index()<<" is "<= _n) │ │ │ │ │ -1309 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row index exceeds matrix size"); │ │ │ │ │ -1310 if (_c_o_l >= _m) │ │ │ │ │ -1311 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"column index exceeds matrix size"); │ │ │ │ │ -1312#endif │ │ │ │ │ -1313 │ │ │ │ │ -1314 _s_i_z_e___t_y_p_e* _b_e_g_i_n = _r[row].getindexptr(); │ │ │ │ │ -1315 _s_i_z_e___t_y_p_e* _e_n_d = _b_e_g_i_n + _r[row].getsize(); │ │ │ │ │ -1316 │ │ │ │ │ -1317 _s_i_z_e___t_y_p_e* pos = std::find(_b_e_g_i_n, _e_n_d, _c_o_l); │ │ │ │ │ -1318 │ │ │ │ │ -1319 //treat the case that there was a match in the array │ │ │ │ │ -1320 if (pos != _e_n_d) │ │ │ │ │ -1321 if (*pos == _c_o_l) │ │ │ │ │ -1322 { │ │ │ │ │ -1323 std::ptrdiff_t offset = pos - _r[row].getindexptr(); │ │ │ │ │ -1324 B* aptr = _r[row].getptr() + offset; │ │ │ │ │ -1325 │ │ │ │ │ -1326 return *aptr; │ │ │ │ │ -1327 } │ │ │ │ │ -1328 │ │ │ │ │ -1329 //determine whether overflow has to be taken into account or not │ │ │ │ │ -1330 if (_r[row].getsize() == _a_v_g) │ │ │ │ │ -1331 return _o_v_e_r_f_l_o_w[std::make_pair(row,_c_o_l)]; │ │ │ │ │ -1332 else │ │ │ │ │ -1333 { │ │ │ │ │ -1334 //modify index array │ │ │ │ │ -1335 *_e_n_d = _c_o_l; │ │ │ │ │ -1336 │ │ │ │ │ -1337 //do simultaneous operations on data array a │ │ │ │ │ -1338 std::ptrdiff_t offset = _e_n_d - _r[row].getindexptr(); │ │ │ │ │ -1339 B* apos = _r[row].getptr() + offset; │ │ │ │ │ -1340 │ │ │ │ │ -1341 //increase rowsize │ │ │ │ │ -1342 _r[row].setsize(_r[row].getsize()+1); │ │ │ │ │ -1343 │ │ │ │ │ -1344 //return reference to the newly created entry │ │ │ │ │ -1345 return *apos; │ │ │ │ │ -1346 } │ │ │ │ │ -1347 } │ │ │ │ │ -1348 │ │ │ │ │ -1350 │ │ │ │ │ -_1_3_6_0 _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s _c_o_m_p_r_e_s_s() │ │ │ │ │ -1361 { │ │ │ │ │ -1362 if (_b_u_i_l_d___m_o_d_e!=_i_m_p_l_i_c_i_t) │ │ │ │ │ -1363 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires implicit build mode"); │ │ │ │ │ -1364 if (_r_e_a_d_y==_b_u_i_l_t) │ │ │ │ │ -1365 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix already built up, no more need for │ │ │ │ │ -compression"); │ │ │ │ │ -1366 if (_r_e_a_d_y==_n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ -1367 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix size not set and no memory allocated │ │ │ │ │ -yet"); │ │ │ │ │ -1368 if (_r_e_a_d_y!=_b_u_i_l_d_i_n_g) │ │ │ │ │ -1369 DUNE_THROW(InvalidStateException,"You may only call compress() at the end │ │ │ │ │ -of the 'building' stage"); │ │ │ │ │ -1370 │ │ │ │ │ -1371 //calculate statistics │ │ │ │ │ -1372 _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s stats; │ │ │ │ │ -1373 stats._o_v_e_r_f_l_o_w___t_o_t_a_l = _o_v_e_r_f_l_o_w.size(); │ │ │ │ │ -1374 stats._m_a_x_i_m_u_m = 0; │ │ │ │ │ -1375 │ │ │ │ │ -1376 //get insertion iterators pointing to one before start (for later use of │ │ │ │ │ -++it) │ │ │ │ │ -1377 _s_i_z_e___t_y_p_e* jiit = _j__.get(); │ │ │ │ │ -1378 B* aiit = _a; │ │ │ │ │ -1379 │ │ │ │ │ -1380 //get iterator to the smallest overflow element │ │ │ │ │ -1381 typename OverflowType::iterator oit = _o_v_e_r_f_l_o_w.begin(); │ │ │ │ │ -1382 │ │ │ │ │ -1383 //store a copy of index pointers on which to perform sorting │ │ │ │ │ -1384 std::vector perm; │ │ │ │ │ -1385 │ │ │ │ │ -1386 //iterate over all rows and copy elements into their position in the │ │ │ │ │ -compressed array │ │ │ │ │ -1387 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ -1388 { │ │ │ │ │ -1389 //get old pointers into a and j and size without overflow changes │ │ │ │ │ -1390 _s_i_z_e___t_y_p_e* _b_e_g_i_n = _r[i].getindexptr(); │ │ │ │ │ -1391 //B* apos = r[i].getptr(); │ │ │ │ │ -1392 _s_i_z_e___t_y_p_e size = _r[i].getsize(); │ │ │ │ │ -1393 │ │ │ │ │ -1394 perm.resize(size); │ │ │ │ │ -1395 │ │ │ │ │ -1396 typename std::vector::iterator it = perm.begin(); │ │ │ │ │ -1397 for (_s_i_z_e___t_y_p_e* iit = _b_e_g_i_n; iit < _b_e_g_i_n + size; ++iit, ++it) │ │ │ │ │ -1398 *it = iit; │ │ │ │ │ -1399 │ │ │ │ │ -1400 //sort permutation array │ │ │ │ │ -1401 std::sort(perm.begin(),perm.end(),_P_o_i_n_t_e_r_C_o_m_p_a_r_e_<_s_i_z_e___t_y_p_e_>()); │ │ │ │ │ -1402 │ │ │ │ │ -1403 //change row window pointer to their new positions │ │ │ │ │ -1404 _r[i].setindexptr(jiit); │ │ │ │ │ -1405 _r[i].setptr(aiit); │ │ │ │ │ -1406 │ │ │ │ │ -1407 for (it = perm.begin(); it != perm.end(); ++it) │ │ │ │ │ -1408 { │ │ │ │ │ -1409 //check whether there are elements in the overflow area which take │ │ │ │ │ -precedence │ │ │ │ │ -1410 while ((oit!=_o_v_e_r_f_l_o_w.end()) && (oit->first < std::make_pair(i,**it))) │ │ │ │ │ -1411 { │ │ │ │ │ -1412 //check whether there is enough memory to write to │ │ │ │ │ -1413 if (jiit > _b_e_g_i_n) │ │ │ │ │ -1414 DUNE_THROW(_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d, │ │ │ │ │ -1415 "Allocated memory for BCRSMatrix exhausted during compress()!" │ │ │ │ │ -1416 "Please increase either the average number of entries per row or the │ │ │ │ │ -compressionBufferSize value." │ │ │ │ │ -1417 ); │ │ │ │ │ -1418 //copy an element from the overflow area to the insertion position in a │ │ │ │ │ -and j │ │ │ │ │ -1419 *jiit = oit->first.second; │ │ │ │ │ -1420 ++jiit; │ │ │ │ │ -1421 *aiit = oit->second; │ │ │ │ │ -1422 ++aiit; │ │ │ │ │ -1423 ++oit; │ │ │ │ │ -1424 _r[i].setsize(_r[i].getsize()+1); │ │ │ │ │ -1425 } │ │ │ │ │ -1426 │ │ │ │ │ -1427 //check whether there is enough memory to write to │ │ │ │ │ -1428 if (jiit > _b_e_g_i_n) │ │ │ │ │ -1429 DUNE_THROW(_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d, │ │ │ │ │ -1430 "Allocated memory for BCRSMatrix exhausted during compress()!" │ │ │ │ │ -1431 "Please increase either the average number of entries per row or the │ │ │ │ │ -compressionBufferSize value." │ │ │ │ │ -1432 ); │ │ │ │ │ -1433 │ │ │ │ │ -1434 //copy element from array │ │ │ │ │ -1435 *jiit = **it; │ │ │ │ │ -1436 ++jiit; │ │ │ │ │ -1437 B* apos = *it - _j__.get() + _a; │ │ │ │ │ -1438 *aiit = *apos; │ │ │ │ │ -1439 ++aiit; │ │ │ │ │ -1440 } │ │ │ │ │ -1441 │ │ │ │ │ -1442 //copy remaining elements from the overflow area │ │ │ │ │ -1443 while ((oit!=_o_v_e_r_f_l_o_w.end()) && (oit->first.first == i)) │ │ │ │ │ -1444 { │ │ │ │ │ -1445 //check whether there is enough memory to write to │ │ │ │ │ -1446 if (jiit > _b_e_g_i_n) │ │ │ │ │ -1447 DUNE_THROW(_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d, │ │ │ │ │ -1448 "Allocated memory for BCRSMatrix exhausted during compress()!" │ │ │ │ │ -1449 "Please increase either the average number of entries per row or the │ │ │ │ │ -compressionBufferSize value." │ │ │ │ │ -1450 ); │ │ │ │ │ -1451 │ │ │ │ │ -1452 //copy and element from the overflow area to the insertion position in a │ │ │ │ │ -and j │ │ │ │ │ -1453 *jiit = oit->first.second; │ │ │ │ │ -1454 ++jiit; │ │ │ │ │ -1455 *aiit = oit->second; │ │ │ │ │ -1456 ++aiit; │ │ │ │ │ -1457 ++oit; │ │ │ │ │ -1458 _r[i].setsize(_r[i].getsize()+1); │ │ │ │ │ -1459 } │ │ │ │ │ -1460 │ │ │ │ │ -1461 // update maximum row size │ │ │ │ │ -1462 if (_r[i].getsize()>stats._m_a_x_i_m_u_m) │ │ │ │ │ -1463 stats._m_a_x_i_m_u_m = _r[i].getsize(); │ │ │ │ │ -1464 } │ │ │ │ │ -1465 │ │ │ │ │ -1466 // overflow area may be cleared │ │ │ │ │ -1467 _o_v_e_r_f_l_o_w.clear(); │ │ │ │ │ -1468 │ │ │ │ │ -1469 //determine average number of entries and memory usage │ │ │ │ │ -1470 std::ptrdiff_t diff = (_r[_n-1].getindexptr() + _r[_n-1].getsize() - _j__.get │ │ │ │ │ -()); │ │ │ │ │ -1471 _n_n_z__ = diff; │ │ │ │ │ -1472 stats._a_v_g = (double) (_n_n_z__) / (double) _n; │ │ │ │ │ -1473 stats._m_e_m___r_a_t_i_o = (double) (_n_n_z__) / (double) _a_l_l_o_c_a_t_i_o_n_S_i_z_e__; │ │ │ │ │ -1474 │ │ │ │ │ -1475 //matrix is now built │ │ │ │ │ -1476 _r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ -1477 │ │ │ │ │ -1478 return stats; │ │ │ │ │ -1479 } │ │ │ │ │ -1480 │ │ │ │ │ -1481 //===== vector space arithmetic │ │ │ │ │ -1482 │ │ │ │ │ -_1_4_8_4 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_*_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -1485 { │ │ │ │ │ -1486#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1487 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1488 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1489#endif │ │ │ │ │ -1490 │ │ │ │ │ -1491 if (_n_n_z__ > 0) │ │ │ │ │ -1492 { │ │ │ │ │ -1493 // process 1D array │ │ │ │ │ -1494 for (_s_i_z_e___t_y_p_e i=0; i<_n_n_z__; i++) │ │ │ │ │ -1495 _a[i] *= k; │ │ │ │ │ -1496 } │ │ │ │ │ -1497 else │ │ │ │ │ -1498 { │ │ │ │ │ -1499 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1500 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1501 { │ │ │ │ │ -1502 _C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1503 for (_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1504 (*j) *= k; │ │ │ │ │ -1505 } │ │ │ │ │ -1506 } │ │ │ │ │ -1507 │ │ │ │ │ -1508 return *this; │ │ │ │ │ -1509 } │ │ │ │ │ -1510 │ │ │ │ │ -_1_5_1_2 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_/_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -1513 { │ │ │ │ │ -1514#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1515 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1516 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1517#endif │ │ │ │ │ -1518 │ │ │ │ │ -1519 if (_n_n_z__ > 0) │ │ │ │ │ -1520 { │ │ │ │ │ -1521 // process 1D array │ │ │ │ │ -1522 for (_s_i_z_e___t_y_p_e i=0; i<_n_n_z__; i++) │ │ │ │ │ -1523 _a[i] /= k; │ │ │ │ │ -1524 } │ │ │ │ │ -1525 else │ │ │ │ │ -1526 { │ │ │ │ │ -1527 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1528 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1529 { │ │ │ │ │ -1530 _C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1531 for (_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1532 (*j) /= k; │ │ │ │ │ -1533 } │ │ │ │ │ -1534 } │ │ │ │ │ -1535 │ │ │ │ │ -1536 return *this; │ │ │ │ │ -1537 } │ │ │ │ │ -1538 │ │ │ │ │ -1539 │ │ │ │ │ -_1_5_4_5 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _B_C_R_S_M_a_t_r_i_x& b) │ │ │ │ │ -1546 { │ │ │ │ │ -1547#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1548 if (_r_e_a_d_y != _b_u_i_l_t || b._r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1549 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1550 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ -1551 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ -1552#endif │ │ │ │ │ -1553 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1554 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r j=b._b_e_g_i_n(); │ │ │ │ │ -1555 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i, ++j) { │ │ │ │ │ -1556 i->operator+=(*j); │ │ │ │ │ -1557 } │ │ │ │ │ -1558 │ │ │ │ │ -1559 return *this; │ │ │ │ │ -1560 } │ │ │ │ │ -1561 │ │ │ │ │ -_1_5_6_7 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _B_C_R_S_M_a_t_r_i_x& b) │ │ │ │ │ -1568 { │ │ │ │ │ -1569#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1570 if (_r_e_a_d_y != _b_u_i_l_t || b._r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1571 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1572 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ -1573 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ -1574#endif │ │ │ │ │ -1575 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1576 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r j=b._b_e_g_i_n(); │ │ │ │ │ -1577 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i, ++j) { │ │ │ │ │ -1578 i->operator-=(*j); │ │ │ │ │ -1579 } │ │ │ │ │ -1580 │ │ │ │ │ -1581 return *this; │ │ │ │ │ -1582 } │ │ │ │ │ -1583 │ │ │ │ │ -_1_5_9_2 _B_C_R_S_M_a_t_r_i_x& _a_x_p_y(_f_i_e_l_d___t_y_p_e alpha, const _B_C_R_S_M_a_t_r_i_x& b) │ │ │ │ │ -1593 { │ │ │ │ │ -1594#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1595 if (_r_e_a_d_y != _b_u_i_l_t || b._r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1596 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1597 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ -1598 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ -1599#endif │ │ │ │ │ -1600 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1601 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r j=b._b_e_g_i_n(); │ │ │ │ │ -1602 for(_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i, ++j) │ │ │ │ │ -1603 i->axpy(alpha, *j); │ │ │ │ │ -1604 │ │ │ │ │ -1605 return *this; │ │ │ │ │ -1606 } │ │ │ │ │ -1607 │ │ │ │ │ -1608 //===== linear maps │ │ │ │ │ -1609 │ │ │ │ │ -1611 template │ │ │ │ │ -_1_6_1_2 void _m_v (const X& x, Y& y) const │ │ │ │ │ -1613 { │ │ │ │ │ -1614#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1615 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1616 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1617 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r, │ │ │ │ │ -1618 "Size mismatch: M: " << _N() << "x" << _M() << " x: " << x.N()); │ │ │ │ │ -1619 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r, │ │ │ │ │ -1620 "Size mismatch: M: " << _N() << "x" << _M() << " y: " << y.N()); │ │ │ │ │ -1621#endif │ │ │ │ │ -1622 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1623 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1624 { │ │ │ │ │ -1625 y[i.index()]=0; │ │ │ │ │ -1626 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1627 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1628 { │ │ │ │ │ -1629 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ -1630 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ -1631 Impl::asMatrix(*j).umv(xj, yi); │ │ │ │ │ -1632 } │ │ │ │ │ -1633 } │ │ │ │ │ -1634 } │ │ │ │ │ -1635 │ │ │ │ │ -1637 template │ │ │ │ │ -_1_6_3_8 void _u_m_v (const X& x, Y& y) const │ │ │ │ │ -1639 { │ │ │ │ │ -1640#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1641 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1642 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1643 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1644 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1645#endif │ │ │ │ │ -1646 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1647 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1648 { │ │ │ │ │ -1649 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1650 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1651 { │ │ │ │ │ -1652 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ -1653 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ -1654 Impl::asMatrix(*j).umv(xj,yi); │ │ │ │ │ -1655 } │ │ │ │ │ -1656 } │ │ │ │ │ -1657 } │ │ │ │ │ -1658 │ │ │ │ │ -1660 template │ │ │ │ │ -_1_6_6_1 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ -1662 { │ │ │ │ │ -1663#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1664 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1665 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1666 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1667 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1668#endif │ │ │ │ │ -1669 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1670 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1671 { │ │ │ │ │ -1672 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1673 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1674 { │ │ │ │ │ -1675 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ -1676 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ -1677 Impl::asMatrix(*j).mmv(xj,yi); │ │ │ │ │ -1678 } │ │ │ │ │ -1679 } │ │ │ │ │ -1680 } │ │ │ │ │ -1681 │ │ │ │ │ -1683 template │ │ │ │ │ -_1_6_8_4 void _u_s_m_v (F&& alpha, const X& x, Y& y) const │ │ │ │ │ -1685 { │ │ │ │ │ -1686#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1687 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1688 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1689 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1690 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1691#endif │ │ │ │ │ -1692 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1693 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1694 { │ │ │ │ │ -1695 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1696 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1697 { │ │ │ │ │ -1698 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ -1699 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ -1700 Impl::asMatrix(*j).usmv(alpha,xj,yi); │ │ │ │ │ -1701 } │ │ │ │ │ -1702 } │ │ │ │ │ -1703 } │ │ │ │ │ -1704 │ │ │ │ │ -1706 template │ │ │ │ │ -_1_7_0_7 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ -1708 { │ │ │ │ │ -1709#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1710 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1711 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1712 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1713 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1714#endif │ │ │ │ │ -1715 for(_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_1_7_2_2 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ -1723 { │ │ │ │ │ -1724#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1725 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1726 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1727 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1728 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1729#endif │ │ │ │ │ -1730 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1731 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1732 { │ │ │ │ │ -1733 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1734 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1735 { │ │ │ │ │ -1736 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ -1737 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ -1738 Impl::asMatrix(*j).umtv(xi,yj); │ │ │ │ │ -1739 } │ │ │ │ │ -1740 } │ │ │ │ │ -1741 } │ │ │ │ │ -1742 │ │ │ │ │ -1744 template │ │ │ │ │ -_1_7_4_5 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ -1746 { │ │ │ │ │ -1747#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1748 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1749 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1750#endif │ │ │ │ │ -1751 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1752 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1753 { │ │ │ │ │ -1754 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1755 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1756 { │ │ │ │ │ -1757 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ -1758 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ -1759 Impl::asMatrix(*j).mmtv(xi,yj); │ │ │ │ │ -1760 } │ │ │ │ │ -1761 } │ │ │ │ │ -1762 } │ │ │ │ │ -1763 │ │ │ │ │ -1765 template │ │ │ │ │ -_1_7_6_6 void _u_s_m_t_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ -1767 { │ │ │ │ │ -1768#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1769 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1770 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1771 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1772 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1773#endif │ │ │ │ │ -1774 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1775 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1776 { │ │ │ │ │ -1777 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1778 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1779 { │ │ │ │ │ -1780 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ -1781 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ -1782 Impl::asMatrix(*j).usmtv(alpha,xi,yj); │ │ │ │ │ -1783 } │ │ │ │ │ -1784 } │ │ │ │ │ -1785 } │ │ │ │ │ -1786 │ │ │ │ │ -1788 template │ │ │ │ │ -_1_7_8_9 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ -1790 { │ │ │ │ │ -1791#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1792 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1793 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1794 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1795 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1796#endif │ │ │ │ │ -1797 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1798 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1799 { │ │ │ │ │ -1800 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1801 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1802 { │ │ │ │ │ -1803 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ -1804 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ -1805 Impl::asMatrix(*j).umhv(xi,yj); │ │ │ │ │ -1806 } │ │ │ │ │ -1807 } │ │ │ │ │ -1808 } │ │ │ │ │ -1809 │ │ │ │ │ -1811 template │ │ │ │ │ -_1_8_1_2 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ -1813 { │ │ │ │ │ -1814#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1815 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1816 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1817 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1818 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1819#endif │ │ │ │ │ -1820 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1821 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1822 { │ │ │ │ │ -1823 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1824 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1825 { │ │ │ │ │ -1826 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ -1827 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ -1828 Impl::asMatrix(*j).mmhv(xi,yj); │ │ │ │ │ -1829 } │ │ │ │ │ -1830 } │ │ │ │ │ -1831 } │ │ │ │ │ -1832 │ │ │ │ │ -1834 template │ │ │ │ │ -_1_8_3_5 void _u_s_m_h_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ -1836 { │ │ │ │ │ -1837#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1838 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1839 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1840 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1841 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ -1842#endif │ │ │ │ │ -1843 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ -1844 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ -1845 { │ │ │ │ │ -1846 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ -1847 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ -1848 { │ │ │ │ │ -1849 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ -1850 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ -1851 Impl::asMatrix(*j).usmhv(alpha,xi,yj); │ │ │ │ │ -1852 } │ │ │ │ │ -1853 } │ │ │ │ │ -1854 } │ │ │ │ │ -1855 │ │ │ │ │ -1856 │ │ │ │ │ -1857 //===== norms │ │ │ │ │ -1858 │ │ │ │ │ -_1_8_6_0 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ -1861 { │ │ │ │ │ -1862#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1863 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1864 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1865#endif │ │ │ │ │ -1866 │ │ │ │ │ -1867 typename FieldTraits::real_type sum=0; │ │ │ │ │ -1868 │ │ │ │ │ -1869 for (auto&& row : (*this)) │ │ │ │ │ -1870 for (auto&& _e_n_t_r_y : row) │ │ │ │ │ -1871 sum += Impl::asMatrix(_e_n_t_r_y).frobenius_norm2(); │ │ │ │ │ -1872 │ │ │ │ │ -1873 return sum; │ │ │ │ │ -1874 } │ │ │ │ │ -1875 │ │ │ │ │ -_1_8_7_7 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ -1878 { │ │ │ │ │ -1879 return sqrt(_f_r_o_b_e_n_i_u_s___n_o_r_m_2()); │ │ │ │ │ -1880 } │ │ │ │ │ -1881 │ │ │ │ │ -1883 template ::value, int>::type = 0> │ │ │ │ │ -_1_8_8_5 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ -1886 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1887 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1888 │ │ │ │ │ -1889 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1890 using std::max; │ │ │ │ │ -1891 │ │ │ │ │ -1892 real_type norm = 0; │ │ │ │ │ -1893 for (auto const &x : *this) { │ │ │ │ │ -1894 real_type sum = 0; │ │ │ │ │ -1895 for (auto const &y : x) │ │ │ │ │ -1896 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ -1897 norm = max(sum, norm); │ │ │ │ │ -1898 } │ │ │ │ │ -1899 return norm; │ │ │ │ │ -1900 } │ │ │ │ │ -1901 │ │ │ │ │ -1903 template ::value, int>::type = 0> │ │ │ │ │ -_1_9_0_5 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ -1906 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1907 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1908 │ │ │ │ │ -1909 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1910 using std::max; │ │ │ │ │ -1911 │ │ │ │ │ -1912 real_type norm = 0; │ │ │ │ │ -1913 for (auto const &x : *this) { │ │ │ │ │ -1914 real_type sum = 0; │ │ │ │ │ -1915 for (auto const &y : x) │ │ │ │ │ -1916 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ -1917 norm = max(sum, norm); │ │ │ │ │ -1918 } │ │ │ │ │ -1919 return norm; │ │ │ │ │ -1920 } │ │ │ │ │ -1921 │ │ │ │ │ -1923 template ::value, int>::type = 0> │ │ │ │ │ -_1_9_2_5 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ -1926 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1927 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1928 │ │ │ │ │ -1929 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1930 using std::max; │ │ │ │ │ -1931 │ │ │ │ │ -1932 real_type norm = 0; │ │ │ │ │ -1933 real_type isNaN = 1; │ │ │ │ │ -1934 for (auto const &x : *this) { │ │ │ │ │ -1935 real_type sum = 0; │ │ │ │ │ -1936 for (auto const &y : x) │ │ │ │ │ -1937 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ -1938 norm = max(sum, norm); │ │ │ │ │ -1939 isNaN += sum; │ │ │ │ │ -1940 } │ │ │ │ │ -1941 │ │ │ │ │ -1942 return norm * (isNaN / isNaN); │ │ │ │ │ -1943 } │ │ │ │ │ -1944 │ │ │ │ │ -1946 template ::value, int>::type = 0> │ │ │ │ │ -_1_9_4_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ -1949 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ -1950 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ -fully built BCRSMatrix instances"); │ │ │ │ │ -1951 │ │ │ │ │ -1952 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1953 using std::max; │ │ │ │ │ -1954 │ │ │ │ │ -1955 real_type norm = 0; │ │ │ │ │ -1956 real_type isNaN = 1; │ │ │ │ │ -1957 │ │ │ │ │ -1958 for (auto const &x : *this) { │ │ │ │ │ -1959 real_type sum = 0; │ │ │ │ │ -1960 for (auto const &y : x) │ │ │ │ │ -1961 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ -1962 norm = max(sum, norm); │ │ │ │ │ -1963 isNaN += sum; │ │ │ │ │ -1964 } │ │ │ │ │ -1965 │ │ │ │ │ -1966 return norm * (isNaN / isNaN); │ │ │ │ │ -1967 } │ │ │ │ │ -1968 │ │ │ │ │ -1969 //===== sizes │ │ │ │ │ -1970 │ │ │ │ │ -_1_9_7_2 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ -1973 { │ │ │ │ │ -1974 return _n; │ │ │ │ │ -1975 } │ │ │ │ │ -1976 │ │ │ │ │ -_1_9_7_8 _s_i_z_e___t_y_p_e _M () const │ │ │ │ │ -1979 { │ │ │ │ │ -1980 return _m; │ │ │ │ │ -1981 } │ │ │ │ │ -1982 │ │ │ │ │ -_1_9_8_4 _s_i_z_e___t_y_p_e _n_o_n_z_e_r_o_e_s () const │ │ │ │ │ -1985 { │ │ │ │ │ -1986 // in case of row-wise allocation │ │ │ │ │ -1987 if( _n_n_z__ <= 0 ) │ │ │ │ │ -1988 _n_n_z__ = std::accumulate( _b_e_g_i_n(), _e_n_d(), _s_i_z_e___t_y_p_e( 0 ), [] ( _s_i_z_e___t_y_p_e s, │ │ │ │ │ -const _r_o_w___t_y_p_e &row ) { return s+row.getsize(); } ); │ │ │ │ │ -1989 return _n_n_z__; │ │ │ │ │ -1990 } │ │ │ │ │ -1991 │ │ │ │ │ -_1_9_9_3 _B_u_i_l_d_S_t_a_g_e _b_u_i_l_d_S_t_a_g_e() const │ │ │ │ │ -1994 { │ │ │ │ │ -1995 return _r_e_a_d_y; │ │ │ │ │ -1996 } │ │ │ │ │ -1997 │ │ │ │ │ -_1_9_9_9 _B_u_i_l_d_M_o_d_e _b_u_i_l_d_M_o_d_e() const │ │ │ │ │ -2000 { │ │ │ │ │ -2001 return _b_u_i_l_d___m_o_d_e; │ │ │ │ │ -2002 } │ │ │ │ │ -2003 │ │ │ │ │ -2004 //===== query │ │ │ │ │ -2005 │ │ │ │ │ -_2_0_0_7 bool _e_x_i_s_t_s (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) const │ │ │ │ │ -2008 { │ │ │ │ │ -2009#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -2010 if (i<0 || i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row index out of range"); │ │ │ │ │ -2011 if (j<0 || j>=_m) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"column index out of range"); │ │ │ │ │ -2012#endif │ │ │ │ │ -2013 return (_r[i].size() && _r[i].find(j) != _r[i]._e_n_d()); │ │ │ │ │ -2014 } │ │ │ │ │ -2015 │ │ │ │ │ -2016 │ │ │ │ │ -2017 protected: │ │ │ │ │ -2018 // state information │ │ │ │ │ -_2_0_1_9 _B_u_i_l_d_M_o_d_e _b_u_i_l_d___m_o_d_e; // row wise or whole matrix │ │ │ │ │ -_2_0_2_0 _B_u_i_l_d_S_t_a_g_e _r_e_a_d_y; // indicate the stage the matrix building is in │ │ │ │ │ -2021 │ │ │ │ │ -2022 // The allocator used for memory management │ │ │ │ │ -_2_0_2_3 typename std::allocator_traits::template rebind_alloc _a_l_l_o_c_a_t_o_r__; │ │ │ │ │ -2024 │ │ │ │ │ -_2_0_2_5 typename std::allocator_traits::template rebind_alloc │ │ │ │ │ -_r_o_w_A_l_l_o_c_a_t_o_r__; │ │ │ │ │ -2026 │ │ │ │ │ -_2_0_2_7 typename std::allocator_traits::template rebind_alloc │ │ │ │ │ -_s_i_z_e_A_l_l_o_c_a_t_o_r__; │ │ │ │ │ -2028 │ │ │ │ │ -2029 // size of the matrix │ │ │ │ │ -_2_0_3_0 _s_i_z_e___t_y_p_e _n; // number of rows │ │ │ │ │ -_2_0_3_1 _s_i_z_e___t_y_p_e _m; // number of columns │ │ │ │ │ -_2_0_3_2 mutable _s_i_z_e___t_y_p_e _n_n_z__; // number of nonzeroes contained in the matrix │ │ │ │ │ -_2_0_3_3 _s_i_z_e___t_y_p_e _a_l_l_o_c_a_t_i_o_n_S_i_z_e__; //allocated size of a and j arrays, except in │ │ │ │ │ -implicit mode: nnz_==allocationsSize_ │ │ │ │ │ -2034 // zero means that memory is allocated separately for each row. │ │ │ │ │ -2035 │ │ │ │ │ -2036 // the rows are dynamically allocated │ │ │ │ │ -_2_0_3_7 _r_o_w___t_y_p_e* _r; // [n] the individual rows having pointers into a,j arrays │ │ │ │ │ -2038 │ │ │ │ │ -2039 // dynamically allocated memory │ │ │ │ │ -_2_0_4_0 B* _a; // [allocationSize] non-zero entries of the matrix in row-wise │ │ │ │ │ -ordering │ │ │ │ │ -2041 // If a single array of column indices is used, it can be shared │ │ │ │ │ -2042 // between different matrices with the same sparsity pattern │ │ │ │ │ -_2_0_4_3 std::shared_ptr _j__; // [allocationSize] column indices of │ │ │ │ │ -entries │ │ │ │ │ -2044 │ │ │ │ │ -2045 // additional data is needed in implicit buildmode │ │ │ │ │ -_2_0_4_6 _s_i_z_e___t_y_p_e _a_v_g; │ │ │ │ │ -_2_0_4_7 double _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__; │ │ │ │ │ -2048 │ │ │ │ │ -_2_0_4_9 typedef std::map, B> _O_v_e_r_f_l_o_w_T_y_p_e; │ │ │ │ │ -_2_0_5_0 _O_v_e_r_f_l_o_w_T_y_p_e _o_v_e_r_f_l_o_w; │ │ │ │ │ -2051 │ │ │ │ │ -_2_0_5_2 void _s_e_t_W_i_n_d_o_w_P_o_i_n_t_e_r_s(_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r row) │ │ │ │ │ -2053 { │ │ │ │ │ -2054 _r_o_w___t_y_p_e current_row(_a,_j__.get(),0); // Pointers to current row data │ │ │ │ │ -2055 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++, ++row) { │ │ │ │ │ -2056 // set row i │ │ │ │ │ -2057 _s_i_z_e___t_y_p_e s = row->getsize(); │ │ │ │ │ -2058 │ │ │ │ │ -2059 if (s>0) { │ │ │ │ │ -2060 // setup pointers and size │ │ │ │ │ -2061 _r[i].set(s,current_row.getptr(), current_row.getindexptr()); │ │ │ │ │ -2062 // update pointer for next row │ │ │ │ │ -2063 current_row.setptr(current_row.getptr()+s); │ │ │ │ │ -2064 current_row.setindexptr(current_row.getindexptr()+s); │ │ │ │ │ -2065 } else{ │ │ │ │ │ -2066 // empty row │ │ │ │ │ -2067 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ -2068 } │ │ │ │ │ -2069 } │ │ │ │ │ -2070 } │ │ │ │ │ -2071 │ │ │ │ │ -2073 │ │ │ │ │ -_2_0_7_7 void _s_e_t_C_o_l_u_m_n_P_o_i_n_t_e_r_s(_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r row) │ │ │ │ │ -2078 { │ │ │ │ │ -2079 _s_i_z_e___t_y_p_e* jptr = _j__.get(); │ │ │ │ │ -2080 for (_s_i_z_e___t_y_p_e i=0; i<_n; ++i, ++row) { │ │ │ │ │ -2081 // set row i │ │ │ │ │ -2082 _s_i_z_e___t_y_p_e s = row->getsize(); │ │ │ │ │ -2083 │ │ │ │ │ -2084 if (s>0) { │ │ │ │ │ -2085 // setup pointers and size │ │ │ │ │ -2086 _r[i].setsize(s); │ │ │ │ │ -2087 _r[i].setindexptr(jptr); │ │ │ │ │ -2088 } else{ │ │ │ │ │ -2089 // empty row │ │ │ │ │ -2090 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ -2091 } │ │ │ │ │ -2092 │ │ │ │ │ -2093 // advance position in global array │ │ │ │ │ -2094 jptr += s; │ │ │ │ │ -2095 } │ │ │ │ │ -2096 } │ │ │ │ │ -2097 │ │ │ │ │ -2099 │ │ │ │ │ -_2_1_0_3 void _s_e_t_D_a_t_a_P_o_i_n_t_e_r_s() │ │ │ │ │ -2104 { │ │ │ │ │ -2105 B* aptr = _a; │ │ │ │ │ -2106 for (_s_i_z_e___t_y_p_e i=0; i<_n; ++i) { │ │ │ │ │ -2107 // set row i │ │ │ │ │ -2108 if (_r[i].getsize() > 0) { │ │ │ │ │ -2109 // setup pointers and size │ │ │ │ │ -2110 _r[i].setptr(aptr); │ │ │ │ │ -2111 } else{ │ │ │ │ │ -2112 // empty row │ │ │ │ │ -2113 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ -2114 } │ │ │ │ │ -2115 │ │ │ │ │ -2116 // advance position in global array │ │ │ │ │ -2117 aptr += _r[i].getsize(); │ │ │ │ │ -2118 } │ │ │ │ │ -2119 } │ │ │ │ │ -2120 │ │ │ │ │ -_2_1_2_2 void _c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e(const _B_C_R_S_M_a_t_r_i_x& Mat) │ │ │ │ │ -2123 { │ │ │ │ │ -2124 _s_e_t_W_i_n_d_o_w_P_o_i_n_t_e_r_s(Mat._b_e_g_i_n()); │ │ │ │ │ -2125 │ │ │ │ │ -2126 // copy data │ │ │ │ │ -2127 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) _r[i] = Mat._r[i]; │ │ │ │ │ -2128 │ │ │ │ │ -2129 // finish off │ │ │ │ │ -2130 _b_u_i_l_d___m_o_d_e = _r_o_w___w_i_s_e; // dummy │ │ │ │ │ -2131 _r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ -2132 } │ │ │ │ │ -2133 │ │ │ │ │ -_2_1_3_9 void _d_e_a_l_l_o_c_a_t_e(bool deallocateRows=true) │ │ │ │ │ -2140 { │ │ │ │ │ -2141 │ │ │ │ │ -2142 if (_n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ -2143 return; │ │ │ │ │ -2144 │ │ │ │ │ -2145 if (_a_l_l_o_c_a_t_i_o_n_S_i_z_e__>0) │ │ │ │ │ -2146 { │ │ │ │ │ -2147 // a,j_ have been allocated as one long vector │ │ │ │ │ -2148 _j__.reset(); │ │ │ │ │ -2149 if (_a) │ │ │ │ │ -2150 { │ │ │ │ │ -2151 for(B *aiter=_a+(_a_l_l_o_c_a_t_i_o_n_S_i_z_e__-1), *aend=_a-1; aiter!=aend; --aiter) │ │ │ │ │ -2152 std::allocator_traits::destroy(_a_l_l_o_c_a_t_o_r__, aiter); │ │ │ │ │ -2153 _a_l_l_o_c_a_t_o_r__.deallocate(_a,_a_l_l_o_c_a_t_i_o_n_S_i_z_e__); │ │ │ │ │ -2154 _a = nullptr; │ │ │ │ │ -2155 } │ │ │ │ │ -2156 } │ │ │ │ │ -2157 else if (_r) │ │ │ │ │ -2158 { │ │ │ │ │ -2159 // check if memory for rows have been allocated individually │ │ │ │ │ -2160 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ -2161 if (_r[i].getsize()>0) │ │ │ │ │ -2162 { │ │ │ │ │ -2163 for (B *_c_o_l=_r[i].getptr()+(_r[i].getsize()-1), │ │ │ │ │ -2164 *colend = _r[i].getptr()-1; _c_o_l!=colend; --_c_o_l) { │ │ │ │ │ -2165 std::allocator_traits::destroy(_a_l_l_o_c_a_t_o_r__, _c_o_l); │ │ │ │ │ -2166 } │ │ │ │ │ -2167 _s_i_z_e_A_l_l_o_c_a_t_o_r__.deallocate(_r[i].getindexptr(),1); │ │ │ │ │ -2168 _a_l_l_o_c_a_t_o_r__.deallocate(_r[i].getptr(),1); │ │ │ │ │ -2169 // clear out row data in case we don't want to deallocate the rows │ │ │ │ │ -2170 // otherwise we might run into a double free problem here later │ │ │ │ │ -2171 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ -2172 } │ │ │ │ │ -2173 } │ │ │ │ │ -2174 │ │ │ │ │ -2175 // deallocate the rows │ │ │ │ │ -2176 if (_n>0 && deallocateRows && _r) { │ │ │ │ │ -2177 for(_r_o_w___t_y_p_e *riter=_r+(_n-1), *rend=_r-1; riter!=rend; --riter) │ │ │ │ │ -2178 std::allocator_traits::destroy(_r_o_w_A_l_l_o_c_a_t_o_r__, │ │ │ │ │ -riter); │ │ │ │ │ -2179 _r_o_w_A_l_l_o_c_a_t_o_r__.deallocate(_r,_n); │ │ │ │ │ -2180 _r = nullptr; │ │ │ │ │ -2181 } │ │ │ │ │ -2182 │ │ │ │ │ -2183 // Mark matrix as not built at all. │ │ │ │ │ -2184 _r_e_a_d_y=_n_o_t_A_l_l_o_c_a_t_e_d; │ │ │ │ │ -2185 │ │ │ │ │ -2186 } │ │ │ │ │ -2187 │ │ │ │ │ -_2_2_0_5 void _a_l_l_o_c_a_t_e(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e allocationSize, │ │ │ │ │ -bool allocateRows, bool allocate_data) │ │ │ │ │ -2206 { │ │ │ │ │ -2207 // Store size │ │ │ │ │ -2208 _n = rows; │ │ │ │ │ -2209 _m = columns; │ │ │ │ │ -2210 _n_n_z__ = allocationSize; │ │ │ │ │ -2211 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__ = allocationSize; │ │ │ │ │ -2212 │ │ │ │ │ -2213 // allocate rows │ │ │ │ │ -2214 if(allocateRows) { │ │ │ │ │ -2215 if (_n>0) { │ │ │ │ │ -2216 if (_r) │ │ │ │ │ -2217 DUNE_THROW(InvalidStateException,"Rows have already been allocated, cannot │ │ │ │ │ -allocate a second time"); │ │ │ │ │ -2218 _r = _r_o_w_A_l_l_o_c_a_t_o_r__.allocate(rows); │ │ │ │ │ -2219 // initialize row entries │ │ │ │ │ -2220 for(_r_o_w___t_y_p_e* ri=_r; ri!=_r+rows; ++ri) │ │ │ │ │ -2221 std::allocator_traits::construct(_r_o_w_A_l_l_o_c_a_t_o_r__, │ │ │ │ │ -ri, _r_o_w___t_y_p_e()); │ │ │ │ │ -2222 }else{ │ │ │ │ │ -2223 _r = 0; │ │ │ │ │ -2224 } │ │ │ │ │ -2225 } │ │ │ │ │ -2226 │ │ │ │ │ -2227 // allocate a and j_ array │ │ │ │ │ -2228 if (allocate_data) │ │ │ │ │ -2229 _a_l_l_o_c_a_t_e_D_a_t_a(); │ │ │ │ │ -2230 // allocate column indices only if not yet present (enable sharing) │ │ │ │ │ -2231 if (_a_l_l_o_c_a_t_i_o_n_S_i_z_e__>0) { │ │ │ │ │ -2232 // we copy allocator and size to the deleter since _j may outlive this │ │ │ │ │ -class │ │ │ │ │ -2233 if (!_j__.get()) │ │ │ │ │ -2234 _j__.reset(_s_i_z_e_A_l_l_o_c_a_t_o_r__.allocate(_a_l_l_o_c_a_t_i_o_n_S_i_z_e__), │ │ │ │ │ -2235 [alloc = _s_i_z_e_A_l_l_o_c_a_t_o_r__, size = _a_l_l_o_c_a_t_i_o_n_S_i_z_e__](auto ptr) mutable { │ │ │ │ │ -2236 alloc.deallocate(ptr, size); │ │ │ │ │ -2237 }); │ │ │ │ │ -2238 }else{ │ │ │ │ │ -2239 _j__.reset(); │ │ │ │ │ -2240 } │ │ │ │ │ -2241 │ │ │ │ │ -2242 // Mark the matrix as not built. │ │ │ │ │ -2243 _r_e_a_d_y = _b_u_i_l_d_i_n_g; │ │ │ │ │ -2244 } │ │ │ │ │ -2245 │ │ │ │ │ -_2_2_4_6 void _a_l_l_o_c_a_t_e_D_a_t_a() │ │ │ │ │ -2247 { │ │ │ │ │ -2248 if (_a) │ │ │ │ │ -2249 DUNE_THROW(InvalidStateException,"Cannot allocate data array (already │ │ │ │ │ -allocated)"); │ │ │ │ │ -2250 if (_a_l_l_o_c_a_t_i_o_n_S_i_z_e__>0) { │ │ │ │ │ -2251 _a = _a_l_l_o_c_a_t_o_r__.allocate(_a_l_l_o_c_a_t_i_o_n_S_i_z_e__); │ │ │ │ │ -2252 // use placement new to call constructor that allocates │ │ │ │ │ -2253 // additional memory. │ │ │ │ │ -2254 new (_a) B[_a_l_l_o_c_a_t_i_o_n_S_i_z_e__]; │ │ │ │ │ -2255 } else { │ │ │ │ │ -2256 _a = nullptr; │ │ │ │ │ -2257 } │ │ │ │ │ -2258 } │ │ │ │ │ -2259 │ │ │ │ │ -_2_2_6_5 void _i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e(_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m) │ │ │ │ │ -2266 { │ │ │ │ │ -2267 if (_b_u_i_l_d___m_o_d_e != _i_m_p_l_i_c_i_t) │ │ │ │ │ -2268 DUNE_THROW(InvalidStateException,"implicit_allocate() may only be called │ │ │ │ │ -in implicit build mode"); │ │ │ │ │ -2269 if (_r_e_a_d_y != _n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ -2270 DUNE_THROW(InvalidStateException,"memory has already been allocated"); │ │ │ │ │ -2271 │ │ │ │ │ -2272 // check to make sure the user has actually set the parameters │ │ │ │ │ -2273 if (_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ < 0) │ │ │ │ │ -2274 DUNE_THROW(InvalidStateException,"You have to set the implicit build mode │ │ │ │ │ -parameters before starting to build the matrix"); │ │ │ │ │ -2275 //calculate size of overflow region, add buffer for row sort! │ │ │ │ │ -2276 _s_i_z_e___t_y_p_e osize = (_s_i_z_e___t_y_p_e) (_n*_a_v_g)*_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ + 4*_a_v_g; │ │ │ │ │ -2277 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__ = _n*_a_v_g + osize; │ │ │ │ │ -2278 │ │ │ │ │ -2279 _a_l_l_o_c_a_t_e(_n, _m, _a_l_l_o_c_a_t_i_o_n_S_i_z_e__,true,true); │ │ │ │ │ -2280 │ │ │ │ │ -2281 //set row pointers correctly │ │ │ │ │ -2282 _s_i_z_e___t_y_p_e* jptr = _j__.get() + osize; │ │ │ │ │ -2283 B* aptr = _a + osize; │ │ │ │ │ -2284 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ -2285 { │ │ │ │ │ -2286 _r[i].set(0,aptr,jptr); │ │ │ │ │ -2287 jptr = jptr + _a_v_g; │ │ │ │ │ -2288 aptr = aptr + _a_v_g; │ │ │ │ │ -2289 } │ │ │ │ │ -2290 │ │ │ │ │ -2291 _r_e_a_d_y = _b_u_i_l_d_i_n_g; │ │ │ │ │ -2292 } │ │ │ │ │ -2293 }; │ │ │ │ │ -2294 │ │ │ │ │ -2295 │ │ │ │ │ -2296 template │ │ │ │ │ -_2_2_9_7 struct FieldTraits< _B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -2298 { │ │ │ │ │ -_2_2_9_9 using _f_i_e_l_d___t_y_p_e = typename _B_C_R_S_M_a_t_r_i_x_<_B_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_3_0_0 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ -2301 }; │ │ │ │ │ -2302 │ │ │ │ │ -2305} // end namespace │ │ │ │ │ -2306 │ │ │ │ │ -2307#endif │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ -Some handy generic functions for ISTL matrices. │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +82 { │ │ │ │ │ +83 // This function should never be called │ │ │ │ │ +84 std::abort(); │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +87 template │ │ │ │ │ +_8_8 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n(const Communication&) │ │ │ │ │ +89 {} │ │ │ │ │ +90 │ │ │ │ │ +_9_1 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n() │ │ │ │ │ +92 {} │ │ │ │ │ +93 │ │ │ │ │ +_9_4 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n(const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n&) │ │ │ │ │ +95 {} │ │ │ │ │ +96 private: │ │ │ │ │ +97 _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r comm_; │ │ │ │ │ +98 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t gli; │ │ │ │ │ +99 }; │ │ │ │ │ +100 │ │ │ │ │ +101 │ │ │ │ │ +102 } // namespace Amg │ │ │ │ │ +103} //namespace Dune │ │ │ │ │ +104#endif │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s │ │ │ │ │ -Statistics about compression achieved in implicit mode. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_o_v_e_r_f_l_o_w___t_o_t_a_l │ │ │ │ │ -size_type overflow_total │ │ │ │ │ -total number of elements written to the overflow area during construction. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_m_a_x_i_m_u_m │ │ │ │ │ -size_type maximum │ │ │ │ │ -maximum number of non-zeroes per row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_a_v_g │ │ │ │ │ -double avg │ │ │ │ │ -average number of non-zeroes per row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_m_e_m___r_a_t_i_o │ │ │ │ │ -double mem_ratio │ │ │ │ │ -fraction of wasted memory resulting from non-used overflow area. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ -A wrapper for uniform access to the BCRSMatrix during and after the build stage │ │ │ │ │ -in implicit build mod... │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -Matrix::block_type block_type │ │ │ │ │ -The block_type of the underlying matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ -ImplicitMatrixBuilder(Matrix &m) │ │ │ │ │ -Creates an ImplicitMatrixBuilder for matrix m. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:170 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ -M_ Matrix │ │ │ │ │ -The underlying matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ -ImplicitMatrixBuilder(Matrix &m, size_type rows, size_type cols, size_type │ │ │ │ │ -avg_cols_per_row, double overflow_fraction) │ │ │ │ │ -Sets up matrix m for implicit construction using the given parameters and │ │ │ │ │ -creates an ImplicitBmatrixu... │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -The number of columns in the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:217 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -The size_type of the underlying matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -row_object operator[](size_type i) const │ │ │ │ │ -Returns a proxy for entries in row i. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -The number of rows in the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_r_o_w___o_b_j_e_c_t │ │ │ │ │ -Proxy row object for entry access. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_r_o_w___o_b_j_e_c_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -block_type & operator[](size_type j) const │ │ │ │ │ -Returns entry in column j. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w_A_l_l_o_c_a_t_o_r__ │ │ │ │ │ -std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2025 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ │ -bool exists(size_type i, size_type j) const │ │ │ │ │ -return true if (i,j) is in pattern │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2007 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d_S_t_a_g_e │ │ │ │ │ -BuildStage buildStage() const │ │ │ │ │ -The current build stage of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1993 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -Get iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:675 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e │ │ │ │ │ -void copyWindowStructure(const BCRSMatrix &Mat) │ │ │ │ │ -Copy the window structure from another matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2122 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_t_r_y │ │ │ │ │ -B & entry(size_type row, size_type col) │ │ │ │ │ -Returns reference to entry (row,col) of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1296 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ -void mmhv(const X &x, Y &y) const │ │ │ │ │ -y -= A^H x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1812 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ -void usmhv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^H x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1835 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ -void umtv(const X &x, Y &y) const │ │ │ │ │ -y += A^T x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1722 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ │ │ │ │ │ -double compressionBufferSize_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2047 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m │ │ │ │ │ -size_type m │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2031 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator< const row_type > const_iterator │ │ │ │ │ -The const iterator over the matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:707 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr unsigned int blocklevel │ │ │ │ │ -increment block level counter │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:507 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ -void allocate(size_type rows, size_type columns, size_type allocationSize, bool │ │ │ │ │ -allocateRows, bool allocate_data) │ │ │ │ │ -Allocate memory for the matrix structure. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2205 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_x_p_y │ │ │ │ │ -BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b) │ │ │ │ │ -Add the scaled entries of another matrix to this one. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1592 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ -FieldTraits< ft >::real_type infinity_norm_real() const │ │ │ │ │ -simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1905 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_~_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -~BCRSMatrix() │ │ │ │ │ -destructor │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:824 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_e_D_a_t_a │ │ │ │ │ -void allocateData() │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2246 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_d_e_a_l_l_o_c_a_t_e │ │ │ │ │ -void deallocate(bool deallocateRows=true) │ │ │ │ │ -deallocate memory of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2139 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator RowIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:701 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -row_type & operator[](size_type i) │ │ │ │ │ -random access to the rows │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:549 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix() │ │ │ │ │ -an empty matrix │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:749 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_r_o_w_s_i_z_e_s │ │ │ │ │ -void endrowsizes() │ │ │ │ │ -indicate that size of all rows is defined │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1149 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_n_c_r_e_m_e_n_t_r_o_w_s_i_z_e │ │ │ │ │ -void incrementrowsize(size_type i, size_type s=1) │ │ │ │ │ -increment size of row i by s (1 by default) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1138 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ -void mtv(const X &x, Y &y) const │ │ │ │ │ -y = A^T x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1707 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ -void umhv(const X &x, Y &y) const │ │ │ │ │ -y += A^H x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1789 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_o_n_z_e_r_o_e_s │ │ │ │ │ -size_type nonzeroes() const │ │ │ │ │ -number of blocks that are stored (the number of blocks that possibly are │ │ │ │ │ -nonzero) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1984 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_i_o_n_S_i_z_e__ │ │ │ │ │ -size_type allocationSize_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2033 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator ConstRowIterator │ │ │ │ │ -rename the const row iterator for easier access │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:738 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_e_a_d_y │ │ │ │ │ -BuildStage ready │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2020 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d___m_o_d_e │ │ │ │ │ -BuildMode build_mode │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2019 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_r_o_w_s_i_z_e │ │ │ │ │ -void setrowsize(size_type i, size_type s) │ │ │ │ │ -Set number of indices in row i to s. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1117 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator< row_type > Iterator │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:672 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_n_z__ │ │ │ │ │ -size_type nnz_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2032 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ -BCRSMatrix & operator*=(const field_type &k) │ │ │ │ │ -vector space multiplication with scalar │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1484 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e_A_l_l_o_c_a_t_o_r__ │ │ │ │ │ -std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2027 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator< row_type > iterator │ │ │ │ │ -The iterator over the (mutable matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:671 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ -void usmtv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^T x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1766 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -ConstIterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:732 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator< const row_type > ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:708 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -Iterator beforeBegin() │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a │ │ │ │ │ -B * a │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2040 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_u_i_l_d_M_o_d_e │ │ │ │ │ -BuildMode │ │ │ │ │ -we support two modes │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:510 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_m_p_l_i_c_i_t │ │ │ │ │ -@ implicit │ │ │ │ │ -Build entries randomly with an educated guess for the number of entries per │ │ │ │ │ -row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_n_k_n_o_w_n │ │ │ │ │ -@ unknown │ │ │ │ │ -Build mode not set! │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:543 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_a_n_d_o_m │ │ │ │ │ -@ random │ │ │ │ │ -Build entries randomly. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:530 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w___w_i_s_e │ │ │ │ │ -@ row_wise │ │ │ │ │ -Build in a row-wise manner. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:521 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm) │ │ │ │ │ -matrix with known number of nonzeroes │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:756 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s │ │ │ │ │ -::Dune::CompressionStatistics< size_type > CompressionStatistics │ │ │ │ │ -The type for the statistics object returned by compress() │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:503 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -BCRSMatrix & operator-=(const BCRSMatrix &b) │ │ │ │ │ -Subtract the entries of another matrix from this one. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1567 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix(const BCRSMatrix &Mat) │ │ │ │ │ -copy constructor │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:805 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r │ │ │ │ │ -row_type * r │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2037 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_I_n_d_i_c_e_s │ │ │ │ │ -void setIndices(size_type row, It begin, It end) │ │ │ │ │ -Set all column indices for row from the given iterator range. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1234 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_d_d_i_n_d_e_x │ │ │ │ │ -void addindex(size_type row, size_type col) │ │ │ │ │ -add index (row,col) to the matrix │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1191 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_O_v_e_r_f_l_o_w_T_y_p_e │ │ │ │ │ -std::map< std::pair< size_type, size_type >, B > OverflowType │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2049 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::Iterator ColIterator │ │ │ │ │ -Iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:704 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ -frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1877 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access and the size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ -BCRSMatrix & operator/=(const field_type &k) │ │ │ │ │ -vector space division by scalar │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1512 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_v_e_r_f_l_o_w │ │ │ │ │ -OverflowType overflow │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2050 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -BCRSMatrix & operator+=(const BCRSMatrix &b) │ │ │ │ │ -Add the entries of another matrix to this one. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1545 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix(size_type _n, size_type _m, size_type _avg, double │ │ │ │ │ -compressionBufferSize, BuildMode bm) │ │ │ │ │ -construct matrix with a known average number of entries per row │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:784 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ -CreateIterator createend() │ │ │ │ │ -get create iterator pointing to one after the last block │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1103 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm2() const │ │ │ │ │ -square of frobenius norm, need for block recursion │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1860 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -Iterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:688 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::ConstIterator ConstColIterator │ │ │ │ │ -Const iterator to the entries of a row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:741 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ -void usmv(F &&alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1684 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_g_e_t_r_o_w_s_i_z_e │ │ │ │ │ -size_type getrowsize(size_type i) const │ │ │ │ │ -get current number of indices in row i │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1128 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -number of columns (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n │ │ │ │ │ -size_type n │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2030 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -Imp::CompressedBlockVectorWindow< B, A > row_type │ │ │ │ │ -implement row_type with compressed vector │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:497 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ -CreateIterator createbegin() │ │ │ │ │ -get initial create iterator │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_u_i_l_d_S_t_a_g_e │ │ │ │ │ -BuildStage │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:469 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w_S_i_z_e_s_B_u_i_l_t │ │ │ │ │ -@ rowSizesBuilt │ │ │ │ │ -The row sizes of the matrix are known. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:480 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_t │ │ │ │ │ -@ built │ │ │ │ │ -The matrix structure is fully built. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:482 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_o_t_b_u_i_l_t │ │ │ │ │ -@ notbuilt │ │ │ │ │ -Matrix is not built at all, no memory has been allocated, build mode and size │ │ │ │ │ -can still be set. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:471 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_o_t_A_l_l_o_c_a_t_e_d │ │ │ │ │ -@ notAllocated │ │ │ │ │ -Matrix is not built at all, no memory has been allocated, build mode and size │ │ │ │ │ -can still be set. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:473 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d_i_n_g │ │ │ │ │ -@ building │ │ │ │ │ -Matrix is currently being built, some memory has been allocated, build mode and │ │ │ │ │ -size are fixed. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:475 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d_M_o_d_e │ │ │ │ │ -BuildMode buildMode() const │ │ │ │ │ -The currently selected build mode of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1999 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ -void mmv(const X &x, Y &y) const │ │ │ │ │ -y -= A x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1661 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ -FieldTraits< ft >::real_type infinity_norm() const │ │ │ │ │ -infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1885 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ -void mv(const X &x, Y &y) const │ │ │ │ │ -y = A x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1612 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -B block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:491 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ -void mmtv(const X &x, Y &y) const │ │ │ │ │ -y -= A^T x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1745 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_v_g │ │ │ │ │ -size_type avg │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2046 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ -void umv(const X &x, Y &y) const │ │ │ │ │ -y += A x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1638 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e │ │ │ │ │ -void implicit_allocate(size_type _n, size_type _m) │ │ │ │ │ -organizes allocation implicit mode calculates correct array size to be │ │ │ │ │ -allocated and sets the the win... │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2265 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_I_m_p_l_i_c_i_t_B_u_i_l_d_M_o_d_e_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -void setImplicitBuildModeParameters(size_type _avg, double │ │ │ │ │ -compressionBufferSize) │ │ │ │ │ -Set parameters needed for creation in implicit build mode. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:889 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -BCRSMatrix(size_type _n, size_type _m, BuildMode bm) │ │ │ │ │ -matrix with unknown number of nonzeroes │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:765 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_i_n_d_i_c_e_s │ │ │ │ │ -void endindices() │ │ │ │ │ -indicate that all indices are defined, check consistency │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1248 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_m_p_r_e_s_s │ │ │ │ │ -CompressionStatistics compress() │ │ │ │ │ -Finishes the buildstage in implicit mode. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1360 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_D_a_t_a_P_o_i_n_t_e_r_s │ │ │ │ │ -void setDataPointers() │ │ │ │ │ -Set data pointers for all rows. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2103 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r__ │ │ │ │ │ -std::allocator_traits< A >::template rebind_alloc< B > allocator_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2023 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_B_u_i_l_d_M_o_d_e │ │ │ │ │ -void setBuildMode(BuildMode bm) │ │ │ │ │ -Sets the build mode of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:833 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ -Set the size of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_j__ │ │ │ │ │ -std::shared_ptr< size_type > j_ │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2043 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_W_i_n_d_o_w_P_o_i_n_t_e_r_s │ │ │ │ │ -void setWindowPointers(ConstRowIterator row) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2052 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BCRSMatrix & operator=(const BCRSMatrix &Mat) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:911 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_C_o_l_u_m_n_P_o_i_n_t_e_r_s │ │ │ │ │ -void setColumnPointers(ConstRowIterator row) │ │ │ │ │ -Copy row sizes from iterator range starting at row and set column index │ │ │ │ │ -pointers for all rows. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2077 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -ConstIterator end() const │ │ │ │ │ -Get const iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:718 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -ConstIterator begin() const │ │ │ │ │ -Get const iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:712 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -A allocator_type │ │ │ │ │ -export the allocator type │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:494 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:725 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator access to matrix rows │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:579 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator() │ │ │ │ │ -empty constructor, use with care! │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:596 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const RealRowIterator< ValueType > &other) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:624 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_V_a_l_u_e_T_y_p_e │ │ │ │ │ -std::remove_const< T >::type ValueType │ │ │ │ │ -The unqualified value type. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:583 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator(const RealRowIterator< ValueType > &it) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:600 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const RealRowIterator< const ValueType > &other) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:631 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -RealRowIterator(row_type *_p, size_type _i) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:591 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:617 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -size_type index() const │ │ │ │ │ -return index │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:606 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:611 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator class for sequential creation of blocks │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:957 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const CreateIterator &it) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1052 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -CreateIterator & operator++() │ │ │ │ │ -prefix increment │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:977 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -size_type index() const │ │ │ │ │ -The number of the row that the iterator currently points to. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1058 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const CreateIterator &it) const │ │ │ │ │ -inequality │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1046 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -CreateIterator(BCRSMatrix &_Mat, size_type _i) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:960 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_s_e_r_t │ │ │ │ │ -void insert(size_type j) │ │ │ │ │ -put column index in row │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1064 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ -bool contains(size_type j) │ │ │ │ │ -return true if column index is in row │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1070 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Get the current row size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1079 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename BCRSMatrix< B, A >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2299 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:2300 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ -Error specific to BCRSMatrix. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ -Thrown when the compression buffer used by the implicit BCRSMatrix construction │ │ │ │ │ -is exhausted. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -Type for indices and sizes. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -T block_type │ │ │ │ │ -Export the type representing the components. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:538 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +SequentialInformation() │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_g_l_o_b_a_l_S_u_m │ │ │ │ │ +T globalSum(const T &t) const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_d_o_t │ │ │ │ │ +void dot(const T1 &, const T1 &, T2 &) const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_C_o_p_y_F_l_a_g_s │ │ │ │ │ +EmptySet< int > CopyFlags │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ +AllSet< int > OwnerSet │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ +void copyOwnerToAll(V &v, V &v1) const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +MPICommunicator communicator() const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void buildGlobalLookup(std::size_t) │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_n_o_r_m │ │ │ │ │ +FieldTraits< typenameT1::field_type >::real_type norm(const T1 &) const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_p_r_o_j_e_c_t │ │ │ │ │ +void project(V &v) const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +Communication< void * > MPICommunicator │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +SequentialInformation(const Communication< T > &) │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_g_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +const GlobalLookupIndexSet & globalLookup() const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +SequentialInformation(const SequentialInformation &) │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void freeGlobalLookup() │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +int GlobalLookupIndexSet │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +SolverCategory::Category category() const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_p_r_o_c_s │ │ │ │ │ +int procs() const │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00071.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solvers.hh File Reference │ │ │ │ +dune-istl: matrixhierarchy.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,117 +65,86 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Enumerations | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Implementations of the inverse operator interface. │ │ │ │ +

Provides a classes representing the hierarchies in AMG. │ │ │ │ More...

│ │ │ │ -
#include <array>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/common/simd/io.hh>
│ │ │ │ -#include <dune/common/simd/simd.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ -#include <dune/istl/allocator.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/eigenvalue/arpackpp.hh>
│ │ │ │ -#include <dune/istl/istlexception.hh>
│ │ │ │ -#include <dune/istl/operators.hh>
│ │ │ │ -#include <dune/istl/preconditioner.hh>
│ │ │ │ -#include <dune/istl/scalarproducts.hh>
│ │ │ │ -#include <dune/istl/solver.hh>
│ │ │ │ -#include <dune/istl/solverregistry.hh>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include "aggregates.hh"
│ │ │ │ +#include "graph.hh"
│ │ │ │ +#include "galerkin.hh"
│ │ │ │ +#include "renumberer.hh"
│ │ │ │ +#include "graphcreator.hh"
│ │ │ │ +#include "hierarchy.hh"
│ │ │ │ +#include <dune/istl/bvector.hh>
│ │ │ │ +#include <dune/common/parallel/indexset.hh>
│ │ │ │ +#include <dune/istl/matrixutils.hh>
│ │ │ │ +#include <dune/istl/matrixredistribute.hh>
│ │ │ │ +#include <dune/istl/paamg/dependency.hh>
│ │ │ │ +#include <dune/istl/paamg/indicescoarsener.hh>
│ │ │ │ +#include <dune/istl/paamg/globalaggregates.hh>
│ │ │ │ +#include <dune/istl/paamg/construction.hh>
│ │ │ │ +#include <dune/istl/paamg/smoother.hh>
│ │ │ │ +#include <dune/istl/paamg/transfer.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::LoopSolver< X >
 Preconditioned loop solver. More...
class  Dune::Amg::MatrixHierarchy< M, PI, A >
 The hierarchies build by the coarsening process. More...
 
class  Dune::GradientSolver< X >
 gradient method More...
struct  Dune::Amg::MatrixHierarchy< M, PI, A >::MatrixStats< Matrix, true >::calc
 
class  Dune::CGSolver< X >
 conjugate gradient method More...
 
class  Dune::BiCGSTABSolver< X >
 Bi-conjugate Gradient Stabilized (BiCG-STAB) More...
 
class  Dune::MINRESSolver< X >
 Minimal Residual Method (MINRES) More...
 
class  Dune::RestartedGMResSolver< X, Y, F >
 implements the Generalized Minimal Residual (GMRes) method More...
 
class  Dune::RestartedFlexibleGMResSolver< X, Y, F >
 implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned) More...
 
class  Dune::GeneralizedPCGSolver< X >
 Generalized preconditioned conjugate gradient solver. More...
 
class  Dune::RestartedFCGSolver< X >
 Accelerated flexible conjugate gradient method. More...
 
class  Dune::CompleteFCGSolver< X >
 Complete flexible conjugate gradient method. More...
class  Dune::Amg::CoarsenCriterion< T >
 The criterion describing the stop criteria for the coarsening process. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Enumerations

enum  { Dune::Amg::MAX_PROCESSES = 72000 │ │ │ │ + }
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("loopsolver", defaultIterativeSolverCreator< Dune::LoopSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("gradientsolver", defaultIterativeSolverCreator< Dune::GradientSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("cgsolver", defaultIterativeSolverCreator< Dune::CGSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("bicgstabsolver", defaultIterativeSolverCreator< Dune::BiCGSTABSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("minressolver", defaultIterativeSolverCreator< Dune::MINRESSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("restartedgmressolver", defaultIterativeSolverCreator< Dune::RestartedGMResSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("restartedflexiblegmressolver", defaultIterativeSolverCreator< Dune::RestartedFlexibleGMResSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("generalizedpcgsolver", defaultIterativeSolverCreator< Dune::GeneralizedPCGSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("restartedfcgsolver", defaultIterativeSolverCreator< Dune::RestartedFCGSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("completefcgsolver", defaultIterativeSolverCreator< Dune::CompleteFCGSolver >())
 
template<typename M , typename C1 >
bool Dune::Amg::repartitionAndDistributeMatrix (const M &origMatrix, std::shared_ptr< M > newMatrix, SequentialInformation &origComm, std::shared_ptr< SequentialInformation > &newComm, RedistributeInformation< SequentialInformation > &ri, int nparts, C1 &criterion)
 
template<typename M , typename C , typename C1 >
bool Dune::Amg::repartitionAndDistributeMatrix (const M &origMatrix, std::shared_ptr< M > newMatrix, C &origComm, std::shared_ptr< C > &newComm, RedistributeInformation< C > &ri, int nparts, C1 &criterion)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implementations of the inverse operator interface.

│ │ │ │ -

This file provides various preconditioned Krylov methods.

│ │ │ │ +

Provides a classes representing the hierarchies in AMG.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,104 +1,68 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -solvers.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s │ │ │ │ │ -Implementations of the inverse operator interface. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_a_l_l_o_c_a_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_e_i_g_e_n_v_a_l_u_e_/_a_r_p_a_c_k_p_p_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +matrixhierarchy.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +#include "_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ +#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ +#include "_g_r_a_p_h_c_r_e_a_t_o_r_._h_h" │ │ │ │ │ +#include "_h_i_e_r_a_r_c_h_y_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_d_e_p_e_n_d_e_n_c_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_i_n_d_i_c_e_s_c_o_a_r_s_e_n_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_l_o_b_a_l_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  Preconditioned loop solver. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_ _M_,_ _P_I_,_ _A_ _> │ │ │ │ │ +  The hierarchies build by the coarsening process. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  gradient method _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_ _M_,_ _P_I_,_ _A_ _>_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_: │ │ │ │ │ + _c_a_l_c │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  conjugate gradient method _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  Bi-conjugate Gradient Stabilized (BiCG-STAB) _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  Minimal Residual Method (MINRES) _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_ _X_,_ _Y_,_ _F_ _> │ │ │ │ │ -  implements the Generalized Minimal Residual (GMRes) method _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r_<_ _X_,_ _Y_,_ _F_ _> │ │ │ │ │ -  implements the Flexible Generalized Minimal Residual (FGMRes) method │ │ │ │ │ - (right preconditioned) _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  Generalized preconditioned conjugate gradient solver. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  Accelerated flexible conjugate gradient method. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ -  Complete flexible conjugate gradient method. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_<_ _T_ _> │ │ │ │ │ +  The criterion describing the stop criteria for the coarsening process. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("loopsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("gradientsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("cgsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_C_G_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("bicgstabsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("minressolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r >()) │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("restartedgmressolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r >()) │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   { _D_u_n_e_:_:_A_m_g_:_:_M_A_X___P_R_O_C_E_S_S_E_S = 72000 } │ │ │ │ │   │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("restartedflexiblegmressolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("generalizedpcgsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("restartedfcgsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r >()) │ │ │ │ │ -  │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("completefcgsolver", │ │ │ │ │ - _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r >()) │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_A_m_g_:_:_r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (const M &origMatrix, std:: │ │ │ │ │ + shared_ptr< M > newMatrix, _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n &origComm, std:: │ │ │ │ │ + shared_ptr< _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< │ │ │ │ │ + _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > &ri, int nparts, C1 &criterion) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool  _D_u_n_e_:_:_A_m_g_:_:_r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (const M &origMatrix, std:: │ │ │ │ │ + shared_ptr< M > newMatrix, C &origComm, std::shared_ptr< C > &newComm, │ │ │ │ │ + _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri, int nparts, C1 &criterion) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -This file provides various preconditioned Krylov methods. │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solvers.hh Source File │ │ │ │ +dune-istl: matrixhierarchy.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,1674 +70,1008 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
solvers.hh
│ │ │ │ +
matrixhierarchy.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_ISTL_SOLVERS_HH
│ │ │ │ -
7#define DUNE_ISTL_SOLVERS_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <array>
│ │ │ │ -
10#include <cmath>
│ │ │ │ -
11#include <complex>
│ │ │ │ -
12#include <iostream>
│ │ │ │ -
13#include <memory>
│ │ │ │ -
14#include <type_traits>
│ │ │ │ -
15#include <vector>
│ │ │ │ -
16
│ │ │ │ -
17#include <dune/common/exceptions.hh>
│ │ │ │ -
18#include <dune/common/math.hh>
│ │ │ │ -
19#include <dune/common/simd/io.hh>
│ │ │ │ -
20#include <dune/common/simd/simd.hh>
│ │ │ │ -
21#include <dune/common/std/type_traits.hh>
│ │ │ │ -
22#include <dune/common/timer.hh>
│ │ │ │ -
23
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
31#include <dune/istl/solver.hh>
│ │ │ │ - │ │ │ │ -
33
│ │ │ │ -
34namespace Dune {
│ │ │ │ -
46 //=====================================================================
│ │ │ │ -
47 // Implementation of this interface
│ │ │ │ -
48 //=====================================================================
│ │ │ │ -
49
│ │ │ │ -
58 template<class X>
│ │ │ │ -
│ │ │ │ -
59 class LoopSolver : public IterativeSolver<X,X> {
│ │ │ │ -
60 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH
│ │ │ │ +
6#define DUNE_AMG_MATRIXHIERARCHY_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <tuple>
│ │ │ │ +
10#include "aggregates.hh"
│ │ │ │ +
11#include "graph.hh"
│ │ │ │ +
12#include "galerkin.hh"
│ │ │ │ +
13#include "renumberer.hh"
│ │ │ │ +
14#include "graphcreator.hh"
│ │ │ │ +
15#include "hierarchy.hh"
│ │ │ │ +
16#include <dune/istl/bvector.hh>
│ │ │ │ +
17#include <dune/common/parallel/indexset.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
27
│ │ │ │ +
28namespace Dune
│ │ │ │ +
29{
│ │ │ │ +
30 namespace Amg
│ │ │ │ +
31 {
│ │ │ │ +
42 enum {
│ │ │ │ +
50 MAX_PROCESSES = 72000
│ │ │ │ +
51 };
│ │ │ │ +
52
│ │ │ │ +
59 template<class M, class PI, class A=std::allocator<M> >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 {
│ │ │ │ +
62 public:
│ │ │ │ +
64 typedef M MatrixOperator;
│ │ │ │
65
│ │ │ │ -
66 // copy base class constructors
│ │ │ │ -
67 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
67 typedef typename MatrixOperator::matrix_type Matrix;
│ │ │ │
68
│ │ │ │ -
69 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
70 using IterativeSolver<X,X>::apply;
│ │ │ │ + │ │ │ │
71
│ │ │ │ -
│ │ │ │ -
73 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
74 {
│ │ │ │ -
75 Iteration iteration(*this, res);
│ │ │ │ -
76 _prec->pre(x,b);
│ │ │ │ +
73 typedef A Allocator;
│ │ │ │ +
74
│ │ │ │ + │ │ │ │
77
│ │ │ │ -
78 // overwrite b with defect
│ │ │ │ -
79 _op->applyscaleadd(-1,x,b);
│ │ │ │ + │ │ │ │
80
│ │ │ │ -
81 // compute norm, \todo parallelization
│ │ │ │ -
82 real_type def = _sp->norm(b);
│ │ │ │ -
83 if(iteration.step(0, def)){
│ │ │ │ -
84 _prec->post(x);
│ │ │ │ -
85 return;
│ │ │ │ -
86 }
│ │ │ │ -
87 // prepare preconditioner
│ │ │ │ -
88
│ │ │ │ -
89 // allocate correction vector
│ │ │ │ -
90 X v(x);
│ │ │ │ -
91
│ │ │ │ -
92 // iteration loop
│ │ │ │ -
93 int i=1;
│ │ │ │ -
94 for ( ; i<=_maxit; i++ )
│ │ │ │ -
95 {
│ │ │ │ -
96 v = 0; // clear correction
│ │ │ │ -
97 _prec->apply(v,b); // apply preconditioner
│ │ │ │ -
98 x += v; // update solution
│ │ │ │ -
99 _op->applyscaleadd(-1,v,b); // update defect
│ │ │ │ -
100 def=_sp->norm(b); // comp defect norm
│ │ │ │ -
101 if(iteration.step(i, def))
│ │ │ │ -
102 break;
│ │ │ │ -
103 }
│ │ │ │ -
104
│ │ │ │ -
105 // postprocess preconditioner
│ │ │ │ -
106 _prec->post(x);
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ + │ │ │ │ +
83
│ │ │ │ +
85 using AAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<AggregatesMap*>;
│ │ │ │ +
86
│ │ │ │ +
88 typedef std::list<AggregatesMap*,AAllocator> AggregatesMapList;
│ │ │ │ +
89
│ │ │ │ + │ │ │ │ +
92
│ │ │ │ +
94 using RILAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<RedistributeInfoType>;
│ │ │ │ +
95
│ │ │ │ +
97 typedef std::list<RedistributeInfoType,RILAllocator> RedistributeInfoList;
│ │ │ │ +
98
│ │ │ │ +
104 MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
│ │ │ │ +
105 std::shared_ptr<ParallelInformation> pinfo = std::make_shared<ParallelInformation>());
│ │ │ │ +
106
│ │ │ │ + │ │ │ │
108
│ │ │ │ -
109 protected:
│ │ │ │ -
110 using IterativeSolver<X,X>::_op;
│ │ │ │ -
111 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
112 using IterativeSolver<X,X>::_sp;
│ │ │ │ - │ │ │ │ -
114 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
115 using IterativeSolver<X,X>::_verbose;
│ │ │ │ - │ │ │ │ -
117 };
│ │ │ │ -
│ │ │ │ -
118 DUNE_REGISTER_ITERATIVE_SOLVER("loopsolver", defaultIterativeSolverCreator<Dune::LoopSolver>());
│ │ │ │ -
119
│ │ │ │ -
120
│ │ │ │ -
121 // all these solvers are taken from the SUMO library
│ │ │ │ -
123 template<class X>
│ │ │ │ -
│ │ │ │ -
124 class GradientSolver : public IterativeSolver<X,X> {
│ │ │ │ -
125 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
129 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ -
130
│ │ │ │ -
131 // copy base class constructors
│ │ │ │ -
132 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
114 template<typename O, typename T>
│ │ │ │ +
115 void build(const T& criterion);
│ │ │ │ +
116
│ │ │ │ +
124 template<class F>
│ │ │ │ +
125 void recalculateGalerkin(const F& copyFlags);
│ │ │ │ +
126
│ │ │ │ +
131 template<class V, class BA, class TA>
│ │ │ │ +
132 void coarsenVector(Hierarchy<BlockVector<V,BA>, TA>& hierarchy) const;
│ │ │ │
133
│ │ │ │ -
134 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
135 using IterativeSolver<X,X>::apply;
│ │ │ │ -
136
│ │ │ │ -
│ │ │ │ -
142 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
143 {
│ │ │ │ -
144 Iteration iteration(*this, res);
│ │ │ │ -
145 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ -
146
│ │ │ │ -
147 _op->applyscaleadd(-1,x,b); // overwrite b with defec
│ │ │ │ +
139 template<class S, class TA>
│ │ │ │ +
140 void coarsenSmoother(Hierarchy<S,TA>& smoothers,
│ │ │ │ +
141 const typename SmootherTraits<S>::Arguments& args) const;
│ │ │ │ +
142
│ │ │ │ +
147 std::size_t levels() const;
│ │ │ │
148
│ │ │ │ -
149 real_type def = _sp->norm(b); // compute norm
│ │ │ │ -
150 if(iteration.step(0, def)){
│ │ │ │ -
151 _prec->post(x);
│ │ │ │ -
152 return;
│ │ │ │ -
153 }
│ │ │ │ +
153 std::size_t maxlevels() const;
│ │ │ │
154
│ │ │ │ -
155 X p(x); // create local vectors
│ │ │ │ -
156 X q(b);
│ │ │ │ -
157
│ │ │ │ -
158 int i=1; // loop variables
│ │ │ │ -
159 field_type lambda;
│ │ │ │ -
160 for ( ; i<=_maxit; i++ )
│ │ │ │ -
161 {
│ │ │ │ -
162 p = 0; // clear correction
│ │ │ │ -
163 _prec->apply(p,b); // apply preconditioner
│ │ │ │ -
164 _op->apply(p,q); // q=Ap
│ │ │ │ -
165 auto alpha = _sp->dot(q,p);
│ │ │ │ -
166 lambda = Simd::cond(def==field_type(0.),
│ │ │ │ -
167 field_type(0.), // no need for minimization if def is already 0
│ │ │ │ -
168 _sp->dot(p,b)/alpha); // minimization
│ │ │ │ -
169 x.axpy(lambda,p); // update solution
│ │ │ │ -
170 b.axpy(-lambda,q); // update defect
│ │ │ │ -
171
│ │ │ │ -
172 def =_sp->norm(b); // comp defect norm
│ │ │ │ -
173 if(iteration.step(i, def))
│ │ │ │ -
174 break;
│ │ │ │ -
175 }
│ │ │ │ -
176 // postprocess preconditioner
│ │ │ │ -
177 _prec->post(x);
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
180 protected:
│ │ │ │ -
181 using IterativeSolver<X,X>::_op;
│ │ │ │ -
182 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
183 using IterativeSolver<X,X>::_sp;
│ │ │ │ - │ │ │ │ -
185 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
186 using IterativeSolver<X,X>::_verbose;
│ │ │ │ - │ │ │ │ -
188 };
│ │ │ │ -
│ │ │ │ -
189 DUNE_REGISTER_ITERATIVE_SOLVER("gradientsolver", defaultIterativeSolverCreator<Dune::GradientSolver>());
│ │ │ │ -
190
│ │ │ │ -
192 template<class X>
│ │ │ │ -
│ │ │ │ -
193 class CGSolver : public IterativeSolver<X,X> {
│ │ │ │ -
194 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
198 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ -
199
│ │ │ │ -
200 // copy base class constructors
│ │ │ │ -
201 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ -
202
│ │ │ │ -
203 private:
│ │ │ │ - │ │ │ │ -
205
│ │ │ │ -
206 protected:
│ │ │ │ -
207
│ │ │ │ -
208 static constexpr bool enableConditionEstimate = (std::is_same_v<field_type,float> || std::is_same_v<field_type,double>);
│ │ │ │ -
209
│ │ │ │ -
210 public:
│ │ │ │ -
211
│ │ │ │ -
212 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
213 using IterativeSolver<X,X>::apply;
│ │ │ │ -
214
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
223 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) : IterativeSolver<X,X>(op, prec, reduction, maxit, verbose),
│ │ │ │ -
224 condition_estimate_(condition_estimate)
│ │ │ │ -
225 {
│ │ │ │ -
226 if (condition_estimate && !enableConditionEstimate) {
│ │ │ │ -
227 condition_estimate_ = false;
│ │ │ │ -
228 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
│ │ │ │ -
229 }
│ │ │ │ -
230 }
│ │ │ │ -
│ │ │ │ +
155 bool hasCoarsest() const;
│ │ │ │ +
156
│ │ │ │ +
161 bool isBuilt() const;
│ │ │ │ +
162
│ │ │ │ +
167 const ParallelMatrixHierarchy& matrices() const;
│ │ │ │ +
168
│ │ │ │ + │ │ │ │ +
174
│ │ │ │ +
179 const AggregatesMapList& aggregatesMaps() const;
│ │ │ │ +
180
│ │ │ │ + │ │ │ │ +
187
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
189 {
│ │ │ │ +
190 return prolongDamp_;
│ │ │ │ +
191 }
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
203 void getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const;
│ │ │ │ +
204
│ │ │ │ +
205 private:
│ │ │ │ +
206 typedef typename ConstructionTraits<MatrixOperator>::Arguments MatrixArgs;
│ │ │ │ +
207 typedef typename ConstructionTraits<ParallelInformation>::Arguments CommunicationArgs;
│ │ │ │ +
209 AggregatesMapList aggregatesMaps_;
│ │ │ │ +
211 RedistributeInfoList redistributes_;
│ │ │ │ +
213 ParallelMatrixHierarchy matrices_;
│ │ │ │ +
215 ParallelInformationHierarchy parallelInformation_;
│ │ │ │ +
216
│ │ │ │ +
218 bool built_;
│ │ │ │ +
219
│ │ │ │ +
221 int maxlevels_;
│ │ │ │ +
222
│ │ │ │ +
223 double prolongDamp_;
│ │ │ │ +
224
│ │ │ │ +
228 template<class Matrix, bool print>
│ │ │ │ +
229 struct MatrixStats
│ │ │ │ +
230 {
│ │ │ │
231
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
240 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose),
│ │ │ │ -
241 condition_estimate_(condition_estimate)
│ │ │ │ -
242 {
│ │ │ │ -
243 if (condition_estimate && !(std::is_same<field_type,float>::value || std::is_same<field_type,double>::value)) {
│ │ │ │ -
244 condition_estimate_ = false;
│ │ │ │ -
245 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
│ │ │ │ -
246 }
│ │ │ │ -
247 }
│ │ │ │ -
│ │ │ │ -
248
│ │ │ │ -
│ │ │ │ -
256 CGSolver (std::shared_ptr<const LinearOperator<X,X>> op, std::shared_ptr<ScalarProduct<X>> sp,
│ │ │ │ -
257 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ -
258 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
│ │ │ │ -
259 : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose),
│ │ │ │ -
260 condition_estimate_(condition_estimate)
│ │ │ │ -
261 {
│ │ │ │ -
262 if (condition_estimate && !(std::is_same<field_type,float>::value || std::is_same<field_type,double>::value)) {
│ │ │ │ -
263 condition_estimate_ = false;
│ │ │ │ -
264 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
│ │ │ │ -
265 }
│ │ │ │ -
266 }
│ │ │ │ -
│ │ │ │ -
267
│ │ │ │ -
│ │ │ │ -
279 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
280 {
│ │ │ │ -
281 Iteration iteration(*this,res);
│ │ │ │ -
282 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ -
283
│ │ │ │ -
284 _op->applyscaleadd(-1,x,b); // overwrite b with defect
│ │ │ │ -
285
│ │ │ │ -
286 real_type def = _sp->norm(b); // compute norm
│ │ │ │ -
287 if(iteration.step(0, def)){
│ │ │ │ -
288 _prec->post(x);
│ │ │ │ -
289 return;
│ │ │ │ -
290 }
│ │ │ │ -
291
│ │ │ │ -
292 X p(x); // the search direction
│ │ │ │ -
293 X q(x); // a temporary vector
│ │ │ │ -
294
│ │ │ │ -
295 // Remember lambda and beta values for condition estimate
│ │ │ │ -
296 std::vector<real_type> lambdas(0);
│ │ │ │ -
297 std::vector<real_type> betas(0);
│ │ │ │ -
298
│ │ │ │ -
299 // some local variables
│ │ │ │ -
300 field_type rho,rholast,lambda,alpha,beta;
│ │ │ │ -
301
│ │ │ │ -
302 // determine initial search direction
│ │ │ │ -
303 p = 0; // clear correction
│ │ │ │ -
304 _prec->apply(p,b); // apply preconditioner
│ │ │ │ -
305 rholast = _sp->dot(p,b); // orthogonalization
│ │ │ │ -
306
│ │ │ │ -
307 // the loop
│ │ │ │ -
308 int i=1;
│ │ │ │ -
309 for ( ; i<=_maxit; i++ )
│ │ │ │ -
310 {
│ │ │ │ -
311 // minimize in given search direction p
│ │ │ │ -
312 _op->apply(p,q); // q=Ap
│ │ │ │ -
313 alpha = _sp->dot(p,q); // scalar product
│ │ │ │ -
314 lambda = Simd::cond(def==field_type(0.), field_type(0.), rholast/alpha); // minimization
│ │ │ │ -
315 if constexpr (enableConditionEstimate)
│ │ │ │ -
316 if (condition_estimate_)
│ │ │ │ -
317 lambdas.push_back(std::real(lambda));
│ │ │ │ -
318 x.axpy(lambda,p); // update solution
│ │ │ │ -
319 b.axpy(-lambda,q); // update defect
│ │ │ │ -
320
│ │ │ │ -
321 // convergence test
│ │ │ │ -
322 def=_sp->norm(b); // comp defect norm
│ │ │ │ -
323 if(iteration.step(i, def))
│ │ │ │ -
324 break;
│ │ │ │ -
325
│ │ │ │ -
326 // determine new search direction
│ │ │ │ -
327 q = 0; // clear correction
│ │ │ │ -
328 _prec->apply(q,b); // apply preconditioner
│ │ │ │ -
329 rho = _sp->dot(q,b); // orthogonalization
│ │ │ │ -
330 beta = Simd::cond(def==field_type(0.), field_type(0.), rho/rholast); // scaling factor
│ │ │ │ -
331 if constexpr (enableConditionEstimate)
│ │ │ │ -
332 if (condition_estimate_)
│ │ │ │ -
333 betas.push_back(std::real(beta));
│ │ │ │ -
334 p *= beta; // scale old search direction
│ │ │ │ -
335 p += q; // orthogonalization with correction
│ │ │ │ -
336 rholast = rho; // remember rho for recurrence
│ │ │ │ -
337 }
│ │ │ │ -
338
│ │ │ │ -
339 _prec->post(x); // postprocess preconditioner
│ │ │ │ -
340
│ │ │ │ -
341 if (condition_estimate_) {
│ │ │ │ -
342#if HAVE_ARPACKPP
│ │ │ │ -
343 if constexpr (enableConditionEstimate) {
│ │ │ │ -
344 using std::sqrt;
│ │ │ │ -
345
│ │ │ │ -
346 // Build T matrix which has extreme eigenvalues approximating
│ │ │ │ -
347 // those of the original system
│ │ │ │ -
348 // (see Y. Saad, Iterative methods for sparse linear systems)
│ │ │ │ -
349
│ │ │ │ - │ │ │ │ -
351
│ │ │ │ -
352 for (auto row = T.createbegin(); row != T.createend(); ++row) {
│ │ │ │ -
353 if (row.index() > 0)
│ │ │ │ -
354 row.insert(row.index()-1);
│ │ │ │ -
355 row.insert(row.index());
│ │ │ │ -
356 if (row.index() < T.N() - 1)
│ │ │ │ -
357 row.insert(row.index()+1);
│ │ │ │ -
358 }
│ │ │ │ -
359 for (int row = 0; row < i; ++row) {
│ │ │ │ -
360 if (row > 0) {
│ │ │ │ -
361 T[row][row-1] = sqrt(betas[row-1]) / lambdas[row-1];
│ │ │ │ -
362 }
│ │ │ │ -
363
│ │ │ │ -
364 T[row][row] = 1.0 / lambdas[row];
│ │ │ │ -
365 if (row > 0) {
│ │ │ │ -
366 T[row][row] += betas[row-1] / lambdas[row-1];
│ │ │ │ -
367 }
│ │ │ │ -
368
│ │ │ │ -
369 if (row < i - 1) {
│ │ │ │ -
370 T[row][row+1] = sqrt(betas[row]) / lambdas[row];
│ │ │ │ -
371 }
│ │ │ │ -
372 }
│ │ │ │ -
373
│ │ │ │ -
374 // Compute largest and smallest eigenvalue of T matrix and return as estimate
│ │ │ │ - │ │ │ │ -
376
│ │ │ │ -
377 real_type eps = 0.0;
│ │ │ │ -
378 COND_VEC eigv;
│ │ │ │ -
379 real_type min_eigv, max_eigv;
│ │ │ │ -
380 arpack.computeSymMinMagnitude (eps, eigv, min_eigv);
│ │ │ │ -
381 arpack.computeSymMaxMagnitude (eps, eigv, max_eigv);
│ │ │ │ -
382
│ │ │ │ -
383 res.condition_estimate = max_eigv / min_eigv;
│ │ │ │ -
384
│ │ │ │ -
385 if (this->_verbose > 0) {
│ │ │ │ -
386 std::cout << "Min eigv estimate: " << Simd::io(min_eigv) << '\n';
│ │ │ │ -
387 std::cout << "Max eigv estimate: " << Simd::io(max_eigv) << '\n';
│ │ │ │ -
388 std::cout << "Condition estimate: "
│ │ │ │ -
389 << Simd::io(max_eigv / min_eigv) << std::endl;
│ │ │ │ -
390 }
│ │ │ │ -
391 }
│ │ │ │ -
392#else
│ │ │ │ -
393 std::cerr << "WARNING: Condition estimate was requested. This requires ARPACK, but ARPACK was not found!" << std::endl;
│ │ │ │ -
394#endif
│ │ │ │ -
395 }
│ │ │ │ +
235 static void stats([[maybe_unused]] const Matrix& matrix)
│ │ │ │ +
236 {}
│ │ │ │ +
237 };
│ │ │ │ +
238
│ │ │ │ +
239 template<class Matrix>
│ │ │ │ +
240 struct MatrixStats<Matrix,true>
│ │ │ │ +
241 {
│ │ │ │ +
│ │ │ │ +
242 struct calc
│ │ │ │ +
243 {
│ │ │ │ +
244 typedef typename Matrix::size_type size_type;
│ │ │ │ +
245 typedef typename Matrix::row_type matrix_row;
│ │ │ │ +
246
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
248 {
│ │ │ │ +
249 min=std::numeric_limits<size_type>::max();
│ │ │ │ +
250 max=0;
│ │ │ │ +
251 sum=0;
│ │ │ │ +
252 }
│ │ │ │ +
│ │ │ │ +
253
│ │ │ │ +
│ │ │ │ +
254 void operator()(const matrix_row& row)
│ │ │ │ +
255 {
│ │ │ │ +
256 min=std::min(min, row.size());
│ │ │ │ +
257 max=std::max(max, row.size());
│ │ │ │ +
258 sum += row.size();
│ │ │ │ +
259 }
│ │ │ │ +
│ │ │ │ +
260
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
264 };
│ │ │ │ +
│ │ │ │ +
268 static void stats(const Matrix& matrix)
│ │ │ │ +
269 {
│ │ │ │ +
270 calc c= for_each(matrix.begin(), matrix.end(), calc());
│ │ │ │ +
271 dinfo<<"Matrix row: min="<<c.min<<" max="<<c.max
│ │ │ │ +
272 <<" average="<<static_cast<double>(c.sum)/matrix.N()
│ │ │ │ +
273 <<std::endl;
│ │ │ │ +
274 }
│ │ │ │ +
275 };
│ │ │ │ +
276 };
│ │ │ │ +
│ │ │ │ +
277
│ │ │ │ +
281 template<class T>
│ │ │ │ +
│ │ │ │ +
282 class CoarsenCriterion : public T
│ │ │ │ +
283 {
│ │ │ │ +
284 public:
│ │ │ │ + │ │ │ │ +
290
│ │ │ │ +
│ │ │ │ +
301 CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
│ │ │ │ +
302 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
│ │ │ │ +
303 : AggregationCriterion(Dune::Amg::Parameters(maxLevel, coarsenTarget, minCoarsenRate, prolongDamp, accumulate))
│ │ │ │ +
304 {}
│ │ │ │ +
│ │ │ │ +
305
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
307 : AggregationCriterion(parms)
│ │ │ │ +
308 {}
│ │ │ │ +
│ │ │ │ +
309
│ │ │ │ +
310 };
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
312 template<typename M, typename C1>
│ │ │ │ +
│ │ │ │ +
313 bool repartitionAndDistributeMatrix([[maybe_unused]] const M& origMatrix,
│ │ │ │ +
314 [[maybe_unused]] std::shared_ptr<M> newMatrix,
│ │ │ │ +
315 [[maybe_unused]] SequentialInformation& origComm,
│ │ │ │ +
316 [[maybe_unused]] std::shared_ptr<SequentialInformation>& newComm,
│ │ │ │ + │ │ │ │ +
318 [[maybe_unused]] int nparts,
│ │ │ │ +
319 [[maybe_unused]] C1& criterion)
│ │ │ │ +
320 {
│ │ │ │ +
321 DUNE_THROW(NotImplemented, "Redistribution does not make sense in sequential code!");
│ │ │ │ +
322 }
│ │ │ │ +
│ │ │ │ +
323
│ │ │ │ +
324
│ │ │ │ +
325 template<typename M, typename C, typename C1>
│ │ │ │ +
│ │ │ │ +
326 bool repartitionAndDistributeMatrix(const M& origMatrix,
│ │ │ │ +
327 std::shared_ptr<M> newMatrix,
│ │ │ │ +
328 C& origComm,
│ │ │ │ +
329 std::shared_ptr<C>& newComm,
│ │ │ │ + │ │ │ │ +
331 int nparts, C1& criterion)
│ │ │ │ +
332 {
│ │ │ │ +
333 Timer time;
│ │ │ │ +
334#ifdef AMG_REPART_ON_COMM_GRAPH
│ │ │ │ +
335 // Done not repartition the matrix graph, but a graph of the communication scheme.
│ │ │ │ +
336 bool existentOnRedist=Dune::commGraphRepartition(origMatrix, origComm, nparts, newComm,
│ │ │ │ +
337 ri.getInterface(),
│ │ │ │ +
338 criterion.debugLevel()>1);
│ │ │ │ +
339
│ │ │ │ +
340#else
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
345 IdentityMap,
│ │ │ │ +
346 IdentityMap> PropertiesGraph;
│ │ │ │ +
347 MatrixGraph graph(origMatrix);
│ │ │ │ +
348 PropertiesGraph pgraph(graph);
│ │ │ │ +
349 buildDependency(pgraph, origMatrix, criterion, false);
│ │ │ │ +
350
│ │ │ │ +
351#ifdef DEBUG_REPART
│ │ │ │ +
352 if(origComm.communicator().rank()==0)
│ │ │ │ +
353 std::cout<<"Original matrix"<<std::endl;
│ │ │ │ +
354 origComm.communicator().barrier();
│ │ │ │ +
355 printGlobalSparseMatrix(origMatrix, origComm, std::cout);
│ │ │ │ +
356#endif
│ │ │ │ +
357 bool existentOnRedist=Dune::graphRepartition(pgraph, origComm, nparts,
│ │ │ │ +
358 newComm, ri.getInterface(),
│ │ │ │ +
359 criterion.debugLevel()>1);
│ │ │ │ +
360#endif // if else AMG_REPART
│ │ │ │ +
361
│ │ │ │ +
362 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
│ │ │ │ +
363 std::cout<<"Repartitioning took "<<time.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
364
│ │ │ │ +
365 ri.setSetup();
│ │ │ │ +
366
│ │ │ │ +
367#ifdef DEBUG_REPART
│ │ │ │ +
368 ri.checkInterface(origComm.indexSet(), newComm->indexSet(), origComm.communicator());
│ │ │ │ +
369#endif
│ │ │ │ +
370
│ │ │ │ +
371 redistributeMatrix(const_cast<M&>(origMatrix), *newMatrix, origComm, *newComm, ri);
│ │ │ │ +
372
│ │ │ │ +
373#ifdef DEBUG_REPART
│ │ │ │ +
374 if(origComm.communicator().rank()==0)
│ │ │ │ +
375 std::cout<<"Original matrix"<<std::endl;
│ │ │ │ +
376 origComm.communicator().barrier();
│ │ │ │ +
377 if(newComm->communicator().size()>0)
│ │ │ │ +
378 printGlobalSparseMatrix(*newMatrix, *newComm, std::cout);
│ │ │ │ +
379 origComm.communicator().barrier();
│ │ │ │ +
380#endif
│ │ │ │ +
381
│ │ │ │ +
382 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
│ │ │ │ +
383 std::cout<<"Redistributing matrix took "<<time.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
384 return existentOnRedist;
│ │ │ │ +
385
│ │ │ │ +
386 }
│ │ │ │ +
│ │ │ │ +
387
│ │ │ │ +
388 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ +
389 MatrixHierarchy<M,IS,A>::MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
│ │ │ │ +
390 std::shared_ptr<ParallelInformation> pinfo)
│ │ │ │ +
391 : matrices_(fineMatrix),
│ │ │ │ +
392 parallelInformation_(pinfo)
│ │ │ │ +
393 {
│ │ │ │ +
394 if (SolverCategory::category(*fineMatrix) != SolverCategory::category(*pinfo))
│ │ │ │ +
395 DUNE_THROW(ISTLError, "MatrixOperator and ParallelInformation must belong to the same category!");
│ │ │ │
396 }
│ │ │ │
│ │ │ │
397
│ │ │ │ -
398 private:
│ │ │ │ -
399 bool condition_estimate_ = false;
│ │ │ │ -
400
│ │ │ │ -
401 // Matrix and vector types used for condition estimate
│ │ │ │ - │ │ │ │ - │ │ │ │ -
404
│ │ │ │ -
405 protected:
│ │ │ │ -
406 using IterativeSolver<X,X>::_op;
│ │ │ │ -
407 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
408 using IterativeSolver<X,X>::_sp;
│ │ │ │ - │ │ │ │ -
410 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
411 using IterativeSolver<X,X>::_verbose;
│ │ │ │ - │ │ │ │ -
413 };
│ │ │ │ -
│ │ │ │ -
414 DUNE_REGISTER_ITERATIVE_SOLVER("cgsolver", defaultIterativeSolverCreator<Dune::CGSolver>());
│ │ │ │ -
415
│ │ │ │ -
416 // Ronald Kriemanns BiCG-STAB implementation from Sumo
│ │ │ │ -
418 template<class X>
│ │ │ │ -
│ │ │ │ -
419 class BiCGSTABSolver : public IterativeSolver<X,X> {
│ │ │ │ -
420 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
424 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ -
425
│ │ │ │ -
426 // copy base class constructors
│ │ │ │ -
427 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ -
428
│ │ │ │ -
429 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
430 using IterativeSolver<X,X>::apply;
│ │ │ │ -
431
│ │ │ │ -
│ │ │ │ -
439 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
440 {
│ │ │ │ -
441 using std::abs;
│ │ │ │ -
442 const Simd::Scalar<real_type> EPSILON=1e-80;
│ │ │ │ -
443 using std::abs;
│ │ │ │ -
444 double it;
│ │ │ │ -
445 field_type rho, rho_new, alpha, beta, h, omega;
│ │ │ │ -
446 real_type norm;
│ │ │ │ -
447
│ │ │ │ -
448 //
│ │ │ │ -
449 // get vectors and matrix
│ │ │ │ -
450 //
│ │ │ │ -
451 X& r=b;
│ │ │ │ -
452 X p(x);
│ │ │ │ -
453 X v(x);
│ │ │ │ -
454 X t(x);
│ │ │ │ -
455 X y(x);
│ │ │ │ -
456 X rt(x);
│ │ │ │ -
457
│ │ │ │ -
458 //
│ │ │ │ -
459 // begin iteration
│ │ │ │ -
460 //
│ │ │ │ -
461
│ │ │ │ -
462 // r = r - Ax; rt = r
│ │ │ │ -
463 Iteration<double> iteration(*this,res);
│ │ │ │ -
464 _prec->pre(x,r); // prepare preconditioner
│ │ │ │ -
465
│ │ │ │ -
466 _op->applyscaleadd(-1,x,r); // overwrite b with defect
│ │ │ │ -
467
│ │ │ │ -
468 rt=r;
│ │ │ │ -
469
│ │ │ │ -
470 norm = _sp->norm(r);
│ │ │ │ -
471 if(iteration.step(0, norm)){
│ │ │ │ -
472 _prec->post(x);
│ │ │ │ -
473 return;
│ │ │ │ -
474 }
│ │ │ │ -
475 p=0;
│ │ │ │ -
476 v=0;
│ │ │ │ -
477
│ │ │ │ -
478 rho = 1;
│ │ │ │ -
479 alpha = 1;
│ │ │ │ -
480 omega = 1;
│ │ │ │ -
481
│ │ │ │ -
482 //
│ │ │ │ -
483 // iteration
│ │ │ │ -
484 //
│ │ │ │ +
398 template<class M, class IS, class A>
│ │ │ │ +
399 template<typename O, typename T>
│ │ │ │ +
│ │ │ │ +
400 void MatrixHierarchy<M,IS,A>::build(const T& criterion)
│ │ │ │ +
401 {
│ │ │ │ +
402 prolongDamp_ = criterion.getProlongationDampingFactor();
│ │ │ │ +
403 typedef O OverlapFlags;
│ │ │ │ +
404 typedef typename ParallelMatrixHierarchy::Iterator MatIterator;
│ │ │ │ +
405 typedef typename ParallelInformationHierarchy::Iterator PInfoIterator;
│ │ │ │ +
406
│ │ │ │ +
407 static const int noints=(Dune::Amg::MAX_PROCESSES/4096>0) ? (Dune::Amg::MAX_PROCESSES/4096) : 1;
│ │ │ │ +
408
│ │ │ │ +
409 typedef bigunsignedint<sizeof(int)*8*noints> BIGINT;
│ │ │ │ + │ │ │ │ +
411 MatIterator mlevel = matrices_.finest();
│ │ │ │ +
412 MatrixStats<typename M::matrix_type,MINIMAL_DEBUG_LEVEL<=INFO_DEBUG_LEVEL>::stats(mlevel->getmat());
│ │ │ │ +
413
│ │ │ │ +
414 PInfoIterator infoLevel = parallelInformation_.finest();
│ │ │ │ +
415 BIGINT finenonzeros=countNonZeros(mlevel->getmat());
│ │ │ │ +
416 finenonzeros = infoLevel->communicator().sum(finenonzeros);
│ │ │ │ +
417 BIGINT allnonzeros = finenonzeros;
│ │ │ │ +
418
│ │ │ │ +
419
│ │ │ │ +
420 int level = 0;
│ │ │ │ +
421 int rank = 0;
│ │ │ │ +
422
│ │ │ │ +
423 BIGINT unknowns = mlevel->getmat().N();
│ │ │ │ +
424
│ │ │ │ +
425 unknowns = infoLevel->communicator().sum(unknowns);
│ │ │ │ +
426 double dunknowns=unknowns.todouble();
│ │ │ │ +
427 infoLevel->buildGlobalLookup(mlevel->getmat().N());
│ │ │ │ +
428 redistributes_.push_back(RedistributeInfoType());
│ │ │ │ +
429
│ │ │ │ +
430 for(; level < criterion.maxLevel(); ++level, ++mlevel) {
│ │ │ │ +
431 assert(matrices_.levels()==redistributes_.size());
│ │ │ │ +
432 rank = infoLevel->communicator().rank();
│ │ │ │ +
433 if(rank==0 && criterion.debugLevel()>1)
│ │ │ │ +
434 std::cout<<"Level "<<level<<" has "<<dunknowns<<" unknowns, "<<dunknowns/infoLevel->communicator().size()
│ │ │ │ +
435 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
│ │ │ │ +
436
│ │ │ │ +
437 MatrixOperator* matrix=&(*mlevel);
│ │ │ │ +
438 ParallelInformation* info =&(*infoLevel);
│ │ │ │ +
439
│ │ │ │ +
440 if((
│ │ │ │ +
441#if HAVE_PARMETIS
│ │ │ │ +
442 criterion.accumulate()==successiveAccu
│ │ │ │ +
443#else
│ │ │ │ +
444 false
│ │ │ │ +
445#endif
│ │ │ │ +
446 || (criterion.accumulate()==atOnceAccu
│ │ │ │ +
447 && dunknowns < 30*infoLevel->communicator().size()))
│ │ │ │ +
448 && infoLevel->communicator().size()>1 &&
│ │ │ │ +
449 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())
│ │ │ │ +
450 {
│ │ │ │ +
451 // accumulate to fewer processors
│ │ │ │ +
452 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
│ │ │ │ +
453 std::shared_ptr<ParallelInformation> redistComm;
│ │ │ │ +
454 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/(criterion.minAggregateSize()
│ │ │ │ +
455 *criterion.coarsenTarget()));
│ │ │ │ +
456 if( nodomains<=criterion.minAggregateSize()/2 ||
│ │ │ │ +
457 dunknowns <= criterion.coarsenTarget() )
│ │ │ │ +
458 nodomains=1;
│ │ │ │ +
459
│ │ │ │ +
460 bool existentOnNextLevel =
│ │ │ │ +
461 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
│ │ │ │ +
462 redistComm, redistributes_.back(), nodomains,
│ │ │ │ +
463 criterion);
│ │ │ │ +
464 BIGINT unknownsRedist = redistMat->N();
│ │ │ │ +
465 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
│ │ │ │ +
466 dunknowns= unknownsRedist.todouble();
│ │ │ │ +
467 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)
│ │ │ │ +
468 std::cout<<"Level "<<level<<" (redistributed) has "<<dunknowns<<" unknowns, "<<dunknowns/redistComm->communicator().size()
│ │ │ │ +
469 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
│ │ │ │ +
470 MatrixArgs args(redistMat, *redistComm);
│ │ │ │ +
471 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
│ │ │ │ +
472 assert(mlevel.isRedistributed());
│ │ │ │ +
473 infoLevel.addRedistributed(redistComm);
│ │ │ │ +
474 infoLevel->freeGlobalLookup();
│ │ │ │ +
475
│ │ │ │ +
476 if(!existentOnNextLevel)
│ │ │ │ +
477 // We do not hold any data on the redistributed partitioning
│ │ │ │ +
478 break;
│ │ │ │ +
479
│ │ │ │ +
480 // Work on the redistributed Matrix from now on
│ │ │ │ +
481 matrix = &(mlevel.getRedistributed());
│ │ │ │ +
482 info = &(infoLevel.getRedistributed());
│ │ │ │ +
483 info->buildGlobalLookup(matrix->getmat().N());
│ │ │ │ +
484 }
│ │ │ │
485
│ │ │ │ -
486 for (it = 0.5; it < _maxit; it+=.5)
│ │ │ │ -
487 {
│ │ │ │ -
488 //
│ │ │ │ -
489 // preprocess, set vecsizes etc.
│ │ │ │ -
490 //
│ │ │ │ -
491
│ │ │ │ -
492 // rho_new = < rt , r >
│ │ │ │ -
493 rho_new = _sp->dot(rt,r);
│ │ │ │ +
486 rank = info->communicator().rank();
│ │ │ │ +
487 if(dunknowns <= criterion.coarsenTarget())
│ │ │ │ +
488 // No further coarsening needed
│ │ │ │ +
489 break;
│ │ │ │ +
490
│ │ │ │ + │ │ │ │ +
492 typedef typename GraphCreator::PropertiesGraph PropertiesGraph;
│ │ │ │ +
493 typedef typename GraphCreator::GraphTuple GraphTuple;
│ │ │ │
494
│ │ │ │ -
495 // look if breakdown occurred
│ │ │ │ -
496 if (Simd::allTrue(abs(rho) <= EPSILON))
│ │ │ │ -
497 DUNE_THROW(SolverAbort,"breakdown in BiCGSTAB - rho "
│ │ │ │ -
498 << Simd::io(rho) << " <= EPSILON " << EPSILON
│ │ │ │ -
499 << " after " << it << " iterations");
│ │ │ │ -
500 if (Simd::allTrue(abs(omega) <= EPSILON))
│ │ │ │ -
501 DUNE_THROW(SolverAbort,"breakdown in BiCGSTAB - omega "
│ │ │ │ -
502 << Simd::io(omega) << " <= EPSILON " << EPSILON
│ │ │ │ -
503 << " after " << it << " iterations");
│ │ │ │ +
495 typedef typename PropertiesGraph::VertexDescriptor Vertex;
│ │ │ │ +
496
│ │ │ │ +
497 std::vector<bool> excluded(matrix->getmat().N(), false);
│ │ │ │ +
498
│ │ │ │ +
499 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, OverlapFlags());
│ │ │ │ +
500
│ │ │ │ +
501 AggregatesMap* aggregatesMap=new AggregatesMap(std::get<1>(graphs)->maxVertex()+1);
│ │ │ │ +
502
│ │ │ │ +
503 aggregatesMaps_.push_back(aggregatesMap);
│ │ │ │
504
│ │ │ │ -
505
│ │ │ │ -
506 if (it<1)
│ │ │ │ -
507 p = r;
│ │ │ │ -
508 else
│ │ │ │ -
509 {
│ │ │ │ -
510 beta = Simd::cond(norm==field_type(0.),
│ │ │ │ -
511 field_type(0.), // no need for orthogonalization if norm is already 0
│ │ │ │ -
512 ( rho_new / rho ) * ( alpha / omega ));
│ │ │ │ -
513 p.axpy(-omega,v); // p = r + beta (p - omega*v)
│ │ │ │ -
514 p *= beta;
│ │ │ │ -
515 p += r;
│ │ │ │ -
516 }
│ │ │ │ -
517
│ │ │ │ -
518 // y = W^-1 * p
│ │ │ │ -
519 y = 0;
│ │ │ │ -
520 _prec->apply(y,p); // apply preconditioner
│ │ │ │ +
505 Timer watch;
│ │ │ │ +
506 watch.reset();
│ │ │ │ +
507 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] =
│ │ │ │ +
508 aggregatesMap->buildAggregates(matrix->getmat(), *(std::get<1>(graphs)), criterion, level==0);
│ │ │ │ +
509
│ │ │ │ +
510 if(rank==0 && criterion.debugLevel()>2)
│ │ │ │ +
511 std::cout<<" Have built "<<noAggregates<<" aggregates totally ("<<isoAggregates<<" isolated aggregates, "<<
│ │ │ │ +
512 oneAggregates<<" aggregates of one vertex, and skipped "<<
│ │ │ │ +
513 skippedAggregates<<" aggregates)."<<std::endl;
│ │ │ │ +
514#ifdef TEST_AGGLO
│ │ │ │ +
515 {
│ │ │ │ +
516 // calculate size of local matrix in the distributed direction
│ │ │ │ +
517 int start, end, overlapStart, overlapEnd;
│ │ │ │ +
518 int procs=info->communicator().rank();
│ │ │ │ +
519 int n = UNKNOWNS/procs; // number of unknowns per process
│ │ │ │ +
520 int bigger = UNKNOWNS%procs; // number of process with n+1 unknows
│ │ │ │
521
│ │ │ │ -
522 // v = A * y
│ │ │ │ -
523 _op->apply(y,v);
│ │ │ │ -
524
│ │ │ │ -
525 // alpha = rho_new / < rt, v >
│ │ │ │ -
526 h = _sp->dot(rt,v);
│ │ │ │ -
527
│ │ │ │ -
528 if ( Simd::allTrue(abs(h) < EPSILON) )
│ │ │ │ -
529 DUNE_THROW(SolverAbort,"abs(h) < EPSILON in BiCGSTAB - abs(h) "
│ │ │ │ -
530 << Simd::io(abs(h)) << " < EPSILON " << EPSILON
│ │ │ │ -
531 << " after " << it << " iterations");
│ │ │ │ -
532
│ │ │ │ -
533 alpha = Simd::cond(norm==field_type(0.),
│ │ │ │ -
534 field_type(0.),
│ │ │ │ -
535 rho_new / h);
│ │ │ │ +
522 // Compute owner region
│ │ │ │ +
523 if(rank<bigger) {
│ │ │ │ +
524 start = rank*(n+1);
│ │ │ │ +
525 end = (rank+1)*(n+1);
│ │ │ │ +
526 }else{
│ │ │ │ +
527 start = bigger + rank * n;
│ │ │ │ +
528 end = bigger + (rank + 1) * n;
│ │ │ │ +
529 }
│ │ │ │ +
530
│ │ │ │ +
531 // Compute overlap region
│ │ │ │ +
532 if(start>0)
│ │ │ │ +
533 overlapStart = start - 1;
│ │ │ │ +
534 else
│ │ │ │ +
535 overlapStart = start;
│ │ │ │
536
│ │ │ │ -
537 // apply first correction to x
│ │ │ │ -
538 // x <- x + alpha y
│ │ │ │ -
539 x.axpy(alpha,y);
│ │ │ │ -
540
│ │ │ │ -
541 // r = r - alpha*v
│ │ │ │ -
542 r.axpy(-alpha,v);
│ │ │ │ -
543
│ │ │ │ -
544 //
│ │ │ │ -
545 // test stop criteria
│ │ │ │ -
546 //
│ │ │ │ -
547
│ │ │ │ -
548 norm = _sp->norm(r);
│ │ │ │ -
549 if(iteration.step(it, norm)){
│ │ │ │ -
550 break;
│ │ │ │ -
551 }
│ │ │ │ -
552
│ │ │ │ -
553 it+=.5;
│ │ │ │ -
554
│ │ │ │ -
555 // y = W^-1 * r
│ │ │ │ -
556 y = 0;
│ │ │ │ -
557 _prec->apply(y,r);
│ │ │ │ -
558
│ │ │ │ -
559 // t = A * y
│ │ │ │ -
560 _op->apply(y,t);
│ │ │ │ -
561
│ │ │ │ -
562 // omega = < t, r > / < t, t >
│ │ │ │ -
563 h = _sp->dot(t,t);
│ │ │ │ -
564 omega = Simd::cond(norm==field_type(0.),
│ │ │ │ -
565 field_type(0.),
│ │ │ │ -
566 _sp->dot(t,r)/h);
│ │ │ │ -
567
│ │ │ │ -
568 // apply second correction to x
│ │ │ │ -
569 // x <- x + omega y
│ │ │ │ -
570 x.axpy(omega,y);
│ │ │ │ -
571
│ │ │ │ -
572 // r = s - omega*t (remember : r = s)
│ │ │ │ -
573 r.axpy(-omega,t);
│ │ │ │ -
574
│ │ │ │ -
575 rho = rho_new;
│ │ │ │ -
576
│ │ │ │ -
577 //
│ │ │ │ -
578 // test stop criteria
│ │ │ │ -
579 //
│ │ │ │ -
580
│ │ │ │ -
581 norm = _sp->norm(r);
│ │ │ │ -
582 if(iteration.step(it, norm)){
│ │ │ │ -
583 break;
│ │ │ │ -
584 }
│ │ │ │ -
585 } // end for
│ │ │ │ -
586
│ │ │ │ -
587 _prec->post(x); // postprocess preconditioner
│ │ │ │ -
588 }
│ │ │ │ -
│ │ │ │ -
589
│ │ │ │ -
590 protected:
│ │ │ │ -
591 using IterativeSolver<X,X>::_op;
│ │ │ │ -
592 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
593 using IterativeSolver<X,X>::_sp;
│ │ │ │ - │ │ │ │ -
595 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
596 using IterativeSolver<X,X>::_verbose;
│ │ │ │ -
597 template<class CountType>
│ │ │ │ - │ │ │ │ -
599 };
│ │ │ │ -
│ │ │ │ -
600 DUNE_REGISTER_ITERATIVE_SOLVER("bicgstabsolver", defaultIterativeSolverCreator<Dune::BiCGSTABSolver>());
│ │ │ │ -
601
│ │ │ │ -
608 template<class X>
│ │ │ │ -
│ │ │ │ -
609 class MINRESSolver : public IterativeSolver<X,X> {
│ │ │ │ -
610 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
614 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
537 if(end<UNKNOWNS)
│ │ │ │ +
538 overlapEnd = end + 1;
│ │ │ │ +
539 else
│ │ │ │ +
540 overlapEnd = end;
│ │ │ │ +
541
│ │ │ │ +
542 assert((UNKNOWNS)*(overlapEnd-overlapStart)==aggregatesMap->noVertices());
│ │ │ │ +
543 for(int j=0; j< UNKNOWNS; ++j)
│ │ │ │ +
544 for(int i=0; i < UNKNOWNS; ++i)
│ │ │ │ +
545 {
│ │ │ │ +
546 if(i>=overlapStart && i<overlapEnd)
│ │ │ │ +
547 {
│ │ │ │ +
548 int no = (j/2)*((UNKNOWNS)/2)+i/2;
│ │ │ │ +
549 (*aggregatesMap)[j*(overlapEnd-overlapStart)+i-overlapStart]=no;
│ │ │ │ +
550 }
│ │ │ │ +
551 }
│ │ │ │ +
552 }
│ │ │ │ +
553#endif
│ │ │ │ +
554 if(criterion.debugLevel()>1 && info->communicator().rank()==0)
│ │ │ │ +
555 std::cout<<"aggregating finished."<<std::endl;
│ │ │ │ +
556
│ │ │ │ +
557 BIGINT gnoAggregates=noAggregates;
│ │ │ │ +
558 gnoAggregates = info->communicator().sum(gnoAggregates);
│ │ │ │ +
559 double dgnoAggregates = gnoAggregates.todouble();
│ │ │ │ +
560#ifdef TEST_AGGLO
│ │ │ │ +
561 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);
│ │ │ │ +
562#endif
│ │ │ │ +
563
│ │ │ │ +
564 if(criterion.debugLevel()>2 && rank==0)
│ │ │ │ +
565 std::cout << "Building "<<dgnoAggregates<<" aggregates took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
566
│ │ │ │ +
567 if(dgnoAggregates==0 || dunknowns/dgnoAggregates<criterion.minCoarsenRate())
│ │ │ │ +
568 {
│ │ │ │ +
569 if(rank==0)
│ │ │ │ +
570 {
│ │ │ │ +
571 if(dgnoAggregates>0)
│ │ │ │ +
572 std::cerr << "Stopped coarsening because of rate breakdown "<<dunknowns<<"/"<<dgnoAggregates
│ │ │ │ +
573 <<"="<<dunknowns/dgnoAggregates<<"<"
│ │ │ │ +
574 <<criterion.minCoarsenRate()<<std::endl;
│ │ │ │ +
575 else
│ │ │ │ +
576 std::cerr<< "Could not build any aggregates. Probably no connected nodes."<<std::endl;
│ │ │ │ +
577 }
│ │ │ │ +
578 aggregatesMap->free();
│ │ │ │ +
579 delete aggregatesMap;
│ │ │ │ +
580 aggregatesMaps_.pop_back();
│ │ │ │ +
581
│ │ │ │ +
582 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator().size()>1) {
│ │ │ │ +
583 // coarse level matrix was already redistributed, but to more than 1 process
│ │ │ │ +
584 // Therefore need to delete the redistribution. Further down it will
│ │ │ │ +
585 // then be redistributed to 1 process
│ │ │ │ +
586 delete &(mlevel.getRedistributed().getmat());
│ │ │ │ +
587 mlevel.deleteRedistributed();
│ │ │ │ +
588 delete &(infoLevel.getRedistributed());
│ │ │ │ +
589 infoLevel.deleteRedistributed();
│ │ │ │ +
590 redistributes_.back().resetSetup();
│ │ │ │ +
591 }
│ │ │ │ +
592
│ │ │ │ +
593 break;
│ │ │ │ +
594 }
│ │ │ │ +
595 unknowns = noAggregates;
│ │ │ │ +
596 dunknowns = dgnoAggregates;
│ │ │ │ +
597
│ │ │ │ +
598 CommunicationArgs commargs(info->communicator(),info->category());
│ │ │ │ +
599 parallelInformation_.addCoarser(commargs);
│ │ │ │ +
600
│ │ │ │ +
601 ++infoLevel; // parallel information on coarse level
│ │ │ │ +
602
│ │ │ │ +
603 typename PropertyMapTypeSelector<VertexVisitedTag,PropertiesGraph>::Type visitedMap =
│ │ │ │ +
604 get(VertexVisitedTag(), *(std::get<1>(graphs)));
│ │ │ │ +
605
│ │ │ │ +
606 watch.reset();
│ │ │ │ + │ │ │ │ +
608 ::coarsen(*info,
│ │ │ │ +
609 *(std::get<1>(graphs)),
│ │ │ │ +
610 visitedMap,
│ │ │ │ +
611 *aggregatesMap,
│ │ │ │ +
612 *infoLevel,
│ │ │ │ +
613 noAggregates);
│ │ │ │ +
614 GraphCreator::free(graphs);
│ │ │ │
615
│ │ │ │ -
616 // copy base class constructors
│ │ │ │ -
617 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ -
618
│ │ │ │ -
619 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
620 using IterativeSolver<X,X>::apply;
│ │ │ │ -
621
│ │ │ │ -
│ │ │ │ -
627 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
628 {
│ │ │ │ -
629 using std::sqrt;
│ │ │ │ -
630 using std::abs;
│ │ │ │ -
631 Iteration iteration(*this, res);
│ │ │ │ -
632 // prepare preconditioner
│ │ │ │ -
633 _prec->pre(x,b);
│ │ │ │ -
634
│ │ │ │ -
635 // overwrite rhs with defect
│ │ │ │ -
636 _op->applyscaleadd(-1.0,x,b); // b -= Ax
│ │ │ │ -
637
│ │ │ │ -
638 // some temporary vectors
│ │ │ │ -
639 X z(b), dummy(b);
│ │ │ │ -
640 z = 0.0;
│ │ │ │ -
641
│ │ │ │ -
642 // calculate preconditioned defect
│ │ │ │ -
643 _prec->apply(z,b); // r = W^-1 (b - Ax)
│ │ │ │ -
644 real_type def = _sp->norm(z);
│ │ │ │ -
645 if (iteration.step(0, def)){
│ │ │ │ -
646 _prec->post(x);
│ │ │ │ -
647 return;
│ │ │ │ -
648 }
│ │ │ │ -
649
│ │ │ │ -
650 // recurrence coefficients as computed in Lanczos algorithm
│ │ │ │ -
651 field_type alpha, beta;
│ │ │ │ -
652 // diagonal entries of givens rotation
│ │ │ │ -
653 std::array<real_type,2> c{{0.0,0.0}};
│ │ │ │ -
654 // off-diagonal entries of givens rotation
│ │ │ │ -
655 std::array<field_type,2> s{{0.0,0.0}};
│ │ │ │ -
656
│ │ │ │ -
657 // recurrence coefficients (column k of tridiag matrix T_k)
│ │ │ │ -
658 std::array<field_type,3> T{{0.0,0.0,0.0}};
│ │ │ │ -
659
│ │ │ │ -
660 // the rhs vector of the min problem
│ │ │ │ -
661 std::array<field_type,2> xi{{1.0,0.0}};
│ │ │ │ +
616 if(criterion.debugLevel()>2) {
│ │ │ │ +
617 if(rank==0)
│ │ │ │ +
618 std::cout<<"Coarsening of index sets took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
619 }
│ │ │ │ +
620
│ │ │ │ +
621 watch.reset();
│ │ │ │ +
622
│ │ │ │ +
623 infoLevel->buildGlobalLookup(aggregates);
│ │ │ │ + │ │ │ │ +
625 *info,
│ │ │ │ +
626 infoLevel->globalLookup());
│ │ │ │ +
627
│ │ │ │ +
628
│ │ │ │ +
629 if(criterion.debugLevel()>2) {
│ │ │ │ +
630 if(rank==0)
│ │ │ │ +
631 std::cout<<"Communicating global aggregate numbers took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
632 }
│ │ │ │ +
633
│ │ │ │ +
634 watch.reset();
│ │ │ │ +
635 std::vector<bool>& visited=excluded;
│ │ │ │ +
636
│ │ │ │ +
637 typedef std::vector<bool>::iterator Iterator;
│ │ │ │ +
638 typedef IteratorPropertyMap<Iterator, IdentityMap> VisitedMap2;
│ │ │ │ +
639 Iterator end = visited.end();
│ │ │ │ +
640 for(Iterator iter= visited.begin(); iter != end; ++iter)
│ │ │ │ +
641 *iter=false;
│ │ │ │ +
642
│ │ │ │ +
643 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());
│ │ │ │ +
644
│ │ │ │ +
645 std::shared_ptr<typename MatrixOperator::matrix_type>
│ │ │ │ +
646 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2,
│ │ │ │ +
647 *info,
│ │ │ │ +
648 *aggregatesMap,
│ │ │ │ +
649 aggregates,
│ │ │ │ +
650 OverlapFlags()));
│ │ │ │ +
651 dverb<<"Building of sparsity pattern took "<<watch.elapsed()<<std::endl;
│ │ │ │ +
652 watch.reset();
│ │ │ │ +
653 info->freeGlobalLookup();
│ │ │ │ +
654
│ │ │ │ +
655 delete std::get<0>(graphs);
│ │ │ │ +
656 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, *infoLevel, OverlapFlags());
│ │ │ │ +
657
│ │ │ │ +
658 if(criterion.debugLevel()>2) {
│ │ │ │ +
659 if(rank==0)
│ │ │ │ +
660 std::cout<<"Calculation entries of Galerkin product took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
661 }
│ │ │ │
662
│ │ │ │ -
663 // beta is real and positive in exact arithmetic
│ │ │ │ -
664 // since it is the norm of the basis vectors (in unpreconditioned case)
│ │ │ │ -
665 beta = sqrt(_sp->dot(b,z));
│ │ │ │ -
666 field_type beta0 = beta;
│ │ │ │ -
667
│ │ │ │ -
668 // the search directions
│ │ │ │ -
669 std::array<X,3> p{{b,b,b}};
│ │ │ │ -
670 p[0] = 0.0;
│ │ │ │ -
671 p[1] = 0.0;
│ │ │ │ -
672 p[2] = 0.0;
│ │ │ │ +
663 BIGINT nonzeros = countNonZeros(*coarseMatrix);
│ │ │ │ +
664 allnonzeros = allnonzeros + infoLevel->communicator().sum(nonzeros);
│ │ │ │ +
665 MatrixArgs args(coarseMatrix, *infoLevel);
│ │ │ │ +
666
│ │ │ │ +
667 matrices_.addCoarser(args);
│ │ │ │ +
668 redistributes_.push_back(RedistributeInfoType());
│ │ │ │ +
669 } // end level loop
│ │ │ │ +
670
│ │ │ │ +
671
│ │ │ │ +
672 infoLevel->freeGlobalLookup();
│ │ │ │
673
│ │ │ │ -
674 // orthonormal basis vectors (in unpreconditioned case)
│ │ │ │ -
675 std::array<X,3> q{{b,b,b}};
│ │ │ │ -
676 q[0] = 0.0;
│ │ │ │ -
677 q[1] *= Simd::cond(def==field_type(0.),
│ │ │ │ -
678 field_type(0.),
│ │ │ │ -
679 real_type(1.0)/beta);
│ │ │ │ -
680 q[2] = 0.0;
│ │ │ │ -
681
│ │ │ │ -
682 z *= Simd::cond(def==field_type(0.),
│ │ │ │ -
683 field_type(0.),
│ │ │ │ -
684 real_type(1.0)/beta);
│ │ │ │ -
685
│ │ │ │ -
686 // the loop
│ │ │ │ -
687 int i = 1;
│ │ │ │ -
688 for( ; i<=_maxit; i++) {
│ │ │ │ +
674 built_=true;
│ │ │ │ +
675 AggregatesMap* aggregatesMap=new AggregatesMap(0);
│ │ │ │ +
676 aggregatesMaps_.push_back(aggregatesMap);
│ │ │ │ +
677
│ │ │ │ +
678 if(criterion.debugLevel()>0) {
│ │ │ │ +
679 if(level==criterion.maxLevel()) {
│ │ │ │ +
680 BIGINT unknownsLevel = mlevel->getmat().N();
│ │ │ │ +
681 unknownsLevel = infoLevel->communicator().sum(unknownsLevel);
│ │ │ │ +
682 double dunknownsLevel = unknownsLevel.todouble();
│ │ │ │ +
683 if(rank==0 && criterion.debugLevel()>1) {
│ │ │ │ +
684 std::cout<<"Level "<<level<<" has "<<dunknownsLevel<<" unknowns, "<<dunknownsLevel/infoLevel->communicator().size()
│ │ │ │ +
685 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
│ │ │ │ +
686 }
│ │ │ │ +
687 }
│ │ │ │ +
688 }
│ │ │ │
689
│ │ │ │ -
690 dummy = z;
│ │ │ │ -
691 int i1 = i%3,
│ │ │ │ -
692 i0 = (i1+2)%3,
│ │ │ │ -
693 i2 = (i1+1)%3;
│ │ │ │ -
694
│ │ │ │ -
695 // symmetrically preconditioned Lanczos algorithm (see Greenbaum p.121)
│ │ │ │ -
696 _op->apply(z,q[i2]); // q[i2] = Az
│ │ │ │ -
697 q[i2].axpy(-beta,q[i0]);
│ │ │ │ -
698 // alpha is real since it is the diagonal entry of the hermitian tridiagonal matrix
│ │ │ │ -
699 // from the Lanczos Algorithm
│ │ │ │ -
700 // so the order in the scalar product doesn't matter even for the complex case
│ │ │ │ -
701 alpha = _sp->dot(z,q[i2]);
│ │ │ │ -
702 q[i2].axpy(-alpha,q[i1]);
│ │ │ │ +
690 if(criterion.accumulate() && !redistributes_.back().isSetup() &&
│ │ │ │ +
691 infoLevel->communicator().size()>1) {
│ │ │ │ +
692#if HAVE_MPI && !HAVE_PARMETIS
│ │ │ │ +
693 if(criterion.accumulate()==successiveAccu &&
│ │ │ │ +
694 infoLevel->communicator().rank()==0)
│ │ │ │ +
695 std::cerr<<"Successive accumulation of data on coarse levels only works with ParMETIS installed."
│ │ │ │ +
696 <<" Fell back to accumulation to one domain on coarsest level"<<std::endl;
│ │ │ │ +
697#endif
│ │ │ │ +
698
│ │ │ │ +
699 // accumulate to fewer processors
│ │ │ │ +
700 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
│ │ │ │ +
701 std::shared_ptr<ParallelInformation> redistComm;
│ │ │ │ +
702 int nodomains = 1;
│ │ │ │
703
│ │ │ │ -
704 z = 0.0;
│ │ │ │ -
705 _prec->apply(z,q[i2]);
│ │ │ │ -
706
│ │ │ │ -
707 // beta is real and positive in exact arithmetic
│ │ │ │ -
708 // since it is the norm of the basis vectors (in unpreconditioned case)
│ │ │ │ -
709 beta = sqrt(_sp->dot(q[i2],z));
│ │ │ │ -
710
│ │ │ │ -
711 q[i2] *= Simd::cond(def==field_type(0.),
│ │ │ │ -
712 field_type(0.),
│ │ │ │ -
713 real_type(1.0)/beta);
│ │ │ │ -
714 z *= Simd::cond(def==field_type(0.),
│ │ │ │ -
715 field_type(0.),
│ │ │ │ -
716 real_type(1.0)/beta);
│ │ │ │ -
717
│ │ │ │ -
718 // QR Factorization of recurrence coefficient matrix
│ │ │ │ -
719 // apply previous givens rotations to last column of T
│ │ │ │ -
720 T[1] = T[2];
│ │ │ │ -
721 if(i>2) {
│ │ │ │ -
722 T[0] = s[i%2]*T[1];
│ │ │ │ -
723 T[1] = c[i%2]*T[1];
│ │ │ │ -
724 }
│ │ │ │ -
725 if(i>1) {
│ │ │ │ -
726 T[2] = c[(i+1)%2]*alpha - s[(i+1)%2]*T[1];
│ │ │ │ -
727 T[1] = c[(i+1)%2]*T[1] + s[(i+1)%2]*alpha;
│ │ │ │ -
728 }
│ │ │ │ -
729 else
│ │ │ │ -
730 T[2] = alpha;
│ │ │ │ -
731
│ │ │ │ -
732 // update QR factorization
│ │ │ │ -
733 generateGivensRotation(T[2],beta,c[i%2],s[i%2]);
│ │ │ │ -
734 // to last column of T_k
│ │ │ │ -
735 T[2] = c[i%2]*T[2] + s[i%2]*beta;
│ │ │ │ -
736 // and to the rhs xi of the min problem
│ │ │ │ -
737 xi[i%2] = -s[i%2]*xi[(i+1)%2];
│ │ │ │ -
738 xi[(i+1)%2] *= c[i%2];
│ │ │ │ -
739
│ │ │ │ -
740 // compute correction direction
│ │ │ │ -
741 p[i2] = dummy;
│ │ │ │ -
742 p[i2].axpy(-T[1],p[i1]);
│ │ │ │ -
743 p[i2].axpy(-T[0],p[i0]);
│ │ │ │ -
744 p[i2] *= real_type(1.0)/T[2];
│ │ │ │ -
745
│ │ │ │ -
746 // apply correction/update solution
│ │ │ │ -
747 x.axpy(beta0*xi[(i+1)%2],p[i2]);
│ │ │ │ -
748
│ │ │ │ -
749 // remember beta_old
│ │ │ │ -
750 T[2] = beta;
│ │ │ │ +
704 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
│ │ │ │ +
705 redistComm, redistributes_.back(), nodomains,criterion);
│ │ │ │ +
706 MatrixArgs args(redistMat, *redistComm);
│ │ │ │ +
707 BIGINT unknownsRedist = redistMat->N();
│ │ │ │ +
708 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
│ │ │ │ +
709
│ │ │ │ +
710 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {
│ │ │ │ +
711 double dunknownsRedist = unknownsRedist.todouble();
│ │ │ │ +
712 std::cout<<"Level "<<level<<" redistributed has "<<dunknownsRedist<<" unknowns, "<<dunknownsRedist/redistComm->communicator().size()
│ │ │ │ +
713 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
│ │ │ │ +
714 }
│ │ │ │ +
715 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
│ │ │ │ +
716 infoLevel.addRedistributed(redistComm);
│ │ │ │ +
717 infoLevel->freeGlobalLookup();
│ │ │ │ +
718 }
│ │ │ │ +
719
│ │ │ │ +
720 int levels = matrices_.levels();
│ │ │ │ +
721 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);
│ │ │ │ +
722 assert(matrices_.levels()==redistributes_.size());
│ │ │ │ +
723 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)
│ │ │ │ +
724 std::cout<<"operator complexity: "<<allnonzeros.todouble()/finenonzeros.todouble()<<std::endl;
│ │ │ │ +
725
│ │ │ │ +
726 }
│ │ │ │ +
│ │ │ │ +
727
│ │ │ │ +
728 template<class M, class IS, class A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
731 {
│ │ │ │ +
732 return matrices_;
│ │ │ │ +
733 }
│ │ │ │ +
│ │ │ │ +
734
│ │ │ │ +
735 template<class M, class IS, class A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
738 {
│ │ │ │ +
739 return parallelInformation_;
│ │ │ │ +
740 }
│ │ │ │ +
│ │ │ │ +
741
│ │ │ │ +
742 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ +
743 void MatrixHierarchy<M,IS,A>::getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const
│ │ │ │ +
744 {
│ │ │ │ +
745 int levels=aggregatesMaps().size();
│ │ │ │ +
746 int maxlevels=parallelInformation_.finest()->communicator().max(levels);
│ │ │ │ +
747 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();
│ │ │ │ +
748 // We need an auxiliary vector for the consecutive prolongation.
│ │ │ │ +
749 std::vector<std::size_t> tmp;
│ │ │ │ +
750 std::vector<std::size_t> *coarse, *fine;
│ │ │ │
751
│ │ │ │ -
752 // check for convergence
│ │ │ │ -
753 // the last entry in the rhs of the min-problem is the residual
│ │ │ │ -
754 def = abs(beta0*xi[i%2]);
│ │ │ │ -
755 if(iteration.step(i, def)){
│ │ │ │ -
756 break;
│ │ │ │ -
757 }
│ │ │ │ -
758 } // end for
│ │ │ │ -
759
│ │ │ │ -
760 // postprocess preconditioner
│ │ │ │ -
761 _prec->post(x);
│ │ │ │ -
762 }
│ │ │ │ -
│ │ │ │ -
763
│ │ │ │ -
764 private:
│ │ │ │ +
752 // make sure the allocated space suffices.
│ │ │ │ +
753 tmp.reserve(size);
│ │ │ │ +
754 data.reserve(size);
│ │ │ │ +
755
│ │ │ │ +
756 // Correctly assign coarse and fine for the first prolongation such that
│ │ │ │ +
757 // we end up in data in the end.
│ │ │ │ +
758 if(levels%2==0) {
│ │ │ │ +
759 coarse=&tmp;
│ │ │ │ +
760 fine=&data;
│ │ │ │ +
761 }else{
│ │ │ │ +
762 coarse=&data;
│ │ │ │ +
763 fine=&tmp;
│ │ │ │ +
764 }
│ │ │ │
765
│ │ │ │ -
766 void generateGivensRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
│ │ │ │ -
767 {
│ │ │ │ -
768 using std::sqrt;
│ │ │ │ -
769 using std::abs;
│ │ │ │ -
770 using std::max;
│ │ │ │ -
771 using std::min;
│ │ │ │ -
772 const real_type eps = 1e-15;
│ │ │ │ -
773 real_type norm_dx = abs(dx);
│ │ │ │ -
774 real_type norm_dy = abs(dy);
│ │ │ │ -
775 real_type norm_max = max(norm_dx, norm_dy);
│ │ │ │ -
776 real_type norm_min = min(norm_dx, norm_dy);
│ │ │ │ -
777 real_type temp = norm_min/norm_max;
│ │ │ │ -
778 // we rewrite the code in a vectorizable fashion
│ │ │ │ -
779 cs = Simd::cond(norm_dy < eps,
│ │ │ │ -
780 real_type(1.0),
│ │ │ │ -
781 Simd::cond(norm_dx < eps,
│ │ │ │ -
782 real_type(0.0),
│ │ │ │ -
783 Simd::cond(norm_dy > norm_dx,
│ │ │ │ -
784 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)*temp,
│ │ │ │ -
785 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)
│ │ │ │ -
786 )));
│ │ │ │ -
787 sn = Simd::cond(norm_dy < eps,
│ │ │ │ -
788 field_type(0.0),
│ │ │ │ -
789 Simd::cond(norm_dx < eps,
│ │ │ │ -
790 field_type(1.0),
│ │ │ │ -
791 Simd::cond(norm_dy > norm_dx,
│ │ │ │ -
792 // dy and dx are real in exact arithmetic
│ │ │ │ -
793 // thus dx*dy is real so we can explicitly enforce it
│ │ │ │ -
794 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dx*dy/norm_dx/norm_dy,
│ │ │ │ -
795 // dy and dx is real in exact arithmetic
│ │ │ │ -
796 // so we don't have to conjugate both of them
│ │ │ │ -
797 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dy/dx
│ │ │ │ -
798 )));
│ │ │ │ -
799 }
│ │ │ │ -
800
│ │ │ │ -
801 protected:
│ │ │ │ -
802 using IterativeSolver<X,X>::_op;
│ │ │ │ -
803 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
804 using IterativeSolver<X,X>::_sp;
│ │ │ │ -
805 using IterativeSolver<X,X>::_reduction;
│ │ │ │ -
806 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
807 using IterativeSolver<X,X>::_verbose;
│ │ │ │ - │ │ │ │ -
809 };
│ │ │ │ -
│ │ │ │ -
810 DUNE_REGISTER_ITERATIVE_SOLVER("minressolver", defaultIterativeSolverCreator<Dune::MINRESSolver>());
│ │ │ │ -
811
│ │ │ │ -
825 template<class X, class Y=X, class F = Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
827 {
│ │ │ │ -
828 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
832 using typename IterativeSolver<X,Y>::real_type;
│ │ │ │ -
833
│ │ │ │ -
834 protected:
│ │ │ │ - │ │ │ │ -
836
│ │ │ │ - │ │ │ │ - │ │ │ │ -
841
│ │ │ │ -
842 public:
│ │ │ │ -
843
│ │ │ │ -
│ │ │ │ -
850 RestartedGMResSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int restart, int maxit, int verbose) :
│ │ │ │ -
851 IterativeSolver<X,Y>::IterativeSolver(op,prec,reduction,maxit,verbose),
│ │ │ │ -
852 _restart(restart)
│ │ │ │ -
853 {}
│ │ │ │ -
│ │ │ │ -
854
│ │ │ │ -
│ │ │ │ -
861 RestartedGMResSolver (const LinearOperator<X,Y>& op, const ScalarProduct<X>& sp, Preconditioner<X,Y>& prec, scalar_real_type reduction, int restart, int maxit, int verbose) :
│ │ │ │ -
862 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ -
863 _restart(restart)
│ │ │ │ -
864 {}
│ │ │ │ +
766 // Number the unknowns on the coarsest level consecutively for each process.
│ │ │ │ +
767 if(levels==maxlevels) {
│ │ │ │ +
768 const AggregatesMap& map = *(*(++aggregatesMaps().rbegin()));
│ │ │ │ +
769 std::size_t m=0;
│ │ │ │ +
770
│ │ │ │ +
771 for(typename AggregatesMap::const_iterator iter = map.begin(); iter != map.end(); ++iter)
│ │ │ │ +
772 if(*iter< AggregatesMap::ISOLATED)
│ │ │ │ +
773 m=std::max(*iter,m);
│ │ │ │ +
774
│ │ │ │ +
775 coarse->resize(m+1);
│ │ │ │ +
776 std::size_t i=0;
│ │ │ │ +
777 srand((unsigned)std::clock());
│ │ │ │ +
778 std::set<size_t> used;
│ │ │ │ +
779 for(typename std::vector<std::size_t>::iterator iter=coarse->begin(); iter != coarse->end();
│ │ │ │ +
780 ++iter, ++i)
│ │ │ │ +
781 {
│ │ │ │ +
782 std::pair<std::set<std::size_t>::iterator,bool> ibpair
│ │ │ │ +
783 = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0)))*coarse->size());
│ │ │ │ +
784
│ │ │ │ +
785 while(!ibpair.second)
│ │ │ │ +
786 ibpair = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0))*coarse->size()));
│ │ │ │ +
787 *iter=*(ibpair.first);
│ │ │ │ +
788 }
│ │ │ │ +
789 }
│ │ │ │ +
790
│ │ │ │ +
791 typename ParallelInformationHierarchy::Iterator pinfo = parallelInformation().coarsest();
│ │ │ │ +
792 --pinfo;
│ │ │ │ +
793
│ │ │ │ +
794 // Now consecutively project the numbers to the finest level.
│ │ │ │ +
795 for(typename AggregatesMapList::const_reverse_iterator aggregates=++aggregatesMaps().rbegin();
│ │ │ │ +
796 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {
│ │ │ │ +
797
│ │ │ │ +
798 fine->resize((*aggregates)->noVertices());
│ │ │ │ +
799 fine->assign(fine->size(), 0);
│ │ │ │ + │ │ │ │ +
801 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast<std::size_t>(1), *pinfo);
│ │ │ │ +
802 --pinfo;
│ │ │ │ +
803 std::swap(coarse, fine);
│ │ │ │ +
804 }
│ │ │ │ +
805
│ │ │ │ +
806 // Assertion to check that we really projected to data on the last step.
│ │ │ │ +
807 assert(coarse==&data);
│ │ │ │ +
808 }
│ │ │ │ +
│ │ │ │ +
809
│ │ │ │ +
810 template<class M, class IS, class A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
813 {
│ │ │ │ +
814 return aggregatesMaps_;
│ │ │ │ +
815 }
│ │ │ │ +
│ │ │ │ +
816 template<class M, class IS, class A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
819 {
│ │ │ │ +
820 return redistributes_;
│ │ │ │ +
821 }
│ │ │ │ +
│ │ │ │ +
822
│ │ │ │ +
823 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
825 {
│ │ │ │ +
826 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;
│ │ │ │ +
827 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
│ │ │ │ +
828 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
│ │ │ │ +
829
│ │ │ │ +
830 AggregatesMapIterator amap = aggregatesMaps_.rbegin();
│ │ │ │ +
831 InfoIterator info = parallelInformation_.coarsest();
│ │ │ │ +
832 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level != finest; --level, --info, ++amap) {
│ │ │ │ +
833 (*amap)->free();
│ │ │ │ +
834 delete *amap;
│ │ │ │ +
835 }
│ │ │ │ +
836 delete *amap;
│ │ │ │ +
837 }
│ │ │ │ +
│ │ │ │ +
838
│ │ │ │ +
839 template<class M, class IS, class A>
│ │ │ │ +
840 template<class V, class BA, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
842 {
│ │ │ │ +
843 assert(hierarchy.levels()==1);
│ │ │ │ +
844 typedef typename ParallelMatrixHierarchy::ConstIterator Iterator;
│ │ │ │ +
845 typedef typename RedistributeInfoList::const_iterator RIter;
│ │ │ │ +
846 RIter redist = redistributes_.begin();
│ │ │ │ +
847
│ │ │ │ +
848 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
│ │ │ │ +
849 int level=0;
│ │ │ │ +
850 if(redist->isSetup())
│ │ │ │ +
851 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
│ │ │ │ +
852 Dune::dvverb<<"Level "<<level<<" has "<<matrices_.finest()->getmat().N()<<" unknowns!"<<std::endl;
│ │ │ │ +
853
│ │ │ │ +
854 while(matrix != coarsest) {
│ │ │ │ +
855 ++matrix; ++level; ++redist;
│ │ │ │ +
856 Dune::dvverb<<"Level "<<level<<" has "<<matrix->getmat().N()<<" unknowns!"<<std::endl;
│ │ │ │ +
857
│ │ │ │ +
858 hierarchy.addCoarser(matrix->getmat().N());
│ │ │ │ +
859 if(redist->isSetup())
│ │ │ │ +
860 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
│ │ │ │ +
861
│ │ │ │ +
862 }
│ │ │ │ +
863
│ │ │ │ +
864 }
│ │ │ │
│ │ │ │
865
│ │ │ │ -
│ │ │ │ -
878 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ -
879 IterativeSolver<X,Y>::IterativeSolver(op,prec,configuration),
│ │ │ │ -
880 _restart(configuration.get<int>("restart"))
│ │ │ │ -
881 {}
│ │ │ │ -
│ │ │ │ -
882
│ │ │ │ -
│ │ │ │ -
883 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<const ScalarProduct<X> > sp, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ -
884 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,configuration),
│ │ │ │ -
885 _restart(configuration.get<int>("restart"))
│ │ │ │ -
886 {}
│ │ │ │ -
│ │ │ │ -
887
│ │ │ │ -
│ │ │ │ -
894 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
│ │ │ │ -
895 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ -
896 std::shared_ptr<Preconditioner<X,Y>> prec,
│ │ │ │ -
897 scalar_real_type reduction, int restart, int maxit, int verbose) :
│ │ │ │ -
898 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ -
899 _restart(restart)
│ │ │ │ -
900 {}
│ │ │ │ -
│ │ │ │ -
901
│ │ │ │ -
│ │ │ │ -
910 virtual void apply (X& x, Y& b, InverseOperatorResult& res)
│ │ │ │ -
911 {
│ │ │ │ -
912 apply(x,b,Simd::max(_reduction),res);
│ │ │ │ -
913 }
│ │ │ │ -
│ │ │ │ -
914
│ │ │ │ -
│ │ │ │ -
923 virtual void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ -
924 {
│ │ │ │ -
925 using std::abs;
│ │ │ │ -
926 const Simd::Scalar<real_type> EPSILON = 1e-80;
│ │ │ │ -
927 const int m = _restart;
│ │ │ │ -
928 real_type norm = 0.0;
│ │ │ │ -
929 int j = 1;
│ │ │ │ -
930 std::vector<field_type,fAlloc> s(m+1), sn(m);
│ │ │ │ -
931 std::vector<real_type,rAlloc> cs(m);
│ │ │ │ -
932 // need copy of rhs if GMRes has to be restarted
│ │ │ │ -
933 Y b2(b);
│ │ │ │ -
934 // helper vector
│ │ │ │ -
935 Y w(b);
│ │ │ │ -
936 std::vector< std::vector<field_type,fAlloc> > H(m+1,s);
│ │ │ │ -
937 std::vector<F> v(m+1,b);
│ │ │ │ +
866 template<class M, class IS, class A>
│ │ │ │ +
867 template<class S, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
869 const typename SmootherTraits<S>::Arguments& sargs) const
│ │ │ │ +
870 {
│ │ │ │ +
871 assert(smoothers.levels()==0);
│ │ │ │ +
872 typedef typename ParallelMatrixHierarchy::ConstIterator MatrixIterator;
│ │ │ │ +
873 typedef typename ParallelInformationHierarchy::ConstIterator PinfoIterator;
│ │ │ │ +
874 typedef typename AggregatesMapList::const_iterator AggregatesIterator;
│ │ │ │ +
875
│ │ │ │ + │ │ │ │ +
877 cargs.setArgs(sargs);
│ │ │ │ +
878 PinfoIterator pinfo = parallelInformation_.finest();
│ │ │ │ +
879 AggregatesIterator aggregates = aggregatesMaps_.begin();
│ │ │ │ +
880 int level=0;
│ │ │ │ +
881 for(MatrixIterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
│ │ │ │ +
882 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {
│ │ │ │ +
883 cargs.setMatrix(matrix->getmat(), **aggregates);
│ │ │ │ +
884 cargs.setComm(*pinfo);
│ │ │ │ +
885 smoothers.addCoarser(cargs);
│ │ │ │ +
886 }
│ │ │ │ +
887 if(maxlevels()>levels()) {
│ │ │ │ +
888 // This is not the globally coarsest level and therefore smoothing is needed
│ │ │ │ +
889 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);
│ │ │ │ +
890 cargs.setComm(*pinfo);
│ │ │ │ +
891 smoothers.addCoarser(cargs);
│ │ │ │ +
892 ++level;
│ │ │ │ +
893 }
│ │ │ │ +
894 }
│ │ │ │ +
│ │ │ │ +
895
│ │ │ │ +
896 template<class M, class IS, class A>
│ │ │ │ +
897 template<class F>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
899 {
│ │ │ │ +
900 typedef typename AggregatesMapList::iterator AggregatesMapIterator;
│ │ │ │ +
901 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
│ │ │ │ +
902 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
│ │ │ │ +
903
│ │ │ │ +
904 AggregatesMapIterator amap = aggregatesMaps_.begin();
│ │ │ │ +
905 BaseGalerkinProduct productBuilder;
│ │ │ │ +
906 InfoIterator info = parallelInformation_.finest();
│ │ │ │ +
907 typename RedistributeInfoList::iterator riIter = redistributes_.begin();
│ │ │ │ +
908 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();
│ │ │ │ +
909 if(level.isRedistributed()) {
│ │ │ │ +
910 info->buildGlobalLookup(level->getmat().N());
│ │ │ │ +
911 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
│ │ │ │ +
912 const_cast<Matrix&>(level.getRedistributed().getmat()),
│ │ │ │ +
913 *info,info.getRedistributed(), *riIter);
│ │ │ │ +
914 info->freeGlobalLookup();
│ │ │ │ +
915 }
│ │ │ │ +
916
│ │ │ │ +
917 for(; level!=coarsest; ++amap) {
│ │ │ │ +
918 const Matrix& fine = (level.isRedistributed() ? level.getRedistributed() : *level).getmat();
│ │ │ │ +
919 ++level;
│ │ │ │ +
920 ++info;
│ │ │ │ +
921 ++riIter;
│ │ │ │ +
922 productBuilder.calculate(fine, *(*amap), const_cast<Matrix&>(level->getmat()), *info, copyFlags);
│ │ │ │ +
923 if(level.isRedistributed()) {
│ │ │ │ +
924 info->buildGlobalLookup(level->getmat().N());
│ │ │ │ +
925 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
│ │ │ │ +
926 const_cast<Matrix&>(level.getRedistributed().getmat()), *info,
│ │ │ │ +
927 info.getRedistributed(), *riIter);
│ │ │ │ +
928 info->freeGlobalLookup();
│ │ │ │ +
929 }
│ │ │ │ +
930 }
│ │ │ │ +
931 }
│ │ │ │ +
│ │ │ │ +
932
│ │ │ │ +
933 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
935 {
│ │ │ │ +
936 return matrices_.levels();
│ │ │ │ +
937 }
│ │ │ │ +
│ │ │ │
938
│ │ │ │ -
939 Iteration iteration(*this,res);
│ │ │ │ -
940
│ │ │ │ -
941 // clear solver statistics and set res.converged to false
│ │ │ │ -
942 _prec->pre(x,b);
│ │ │ │ -
943
│ │ │ │ -
944 // calculate defect and overwrite rhs with it
│ │ │ │ -
945 _op->applyscaleadd(-1.0,x,b); // b -= Ax
│ │ │ │ -
946 // calculate preconditioned defect
│ │ │ │ -
947 v[0] = 0.0; _prec->apply(v[0],b); // r = W^-1 b
│ │ │ │ -
948 norm = _sp->norm(v[0]);
│ │ │ │ -
949 if(iteration.step(0, norm)){
│ │ │ │ -
950 _prec->post(x);
│ │ │ │ -
951 return;
│ │ │ │ -
952 }
│ │ │ │ -
953
│ │ │ │ -
954 while(j <= _maxit && res.converged != true) {
│ │ │ │ -
955
│ │ │ │ -
956 int i = 0;
│ │ │ │ -
957 v[0] *= Simd::cond(norm==real_type(0.),
│ │ │ │ -
958 real_type(0.),
│ │ │ │ -
959 real_type(1.0)/norm);
│ │ │ │ -
960 s[0] = norm;
│ │ │ │ -
961 for(i=1; i<m+1; i++)
│ │ │ │ -
962 s[i] = 0.0;
│ │ │ │ -
963
│ │ │ │ -
964 for(i=0; i < m && j <= _maxit && res.converged != true; i++, j++) {
│ │ │ │ -
965 w = 0.0;
│ │ │ │ -
966 // use v[i+1] as temporary vector
│ │ │ │ -
967 v[i+1] = 0.0;
│ │ │ │ -
968 // do Arnoldi algorithm
│ │ │ │ -
969 _op->apply(v[i],v[i+1]);
│ │ │ │ -
970 _prec->apply(w,v[i+1]);
│ │ │ │ -
971 for(int k=0; k<i+1; k++) {
│ │ │ │ -
972 // notice that _sp->dot(v[k],w) = v[k]\adjoint w
│ │ │ │ -
973 // so one has to pay attention to the order
│ │ │ │ -
974 // in the scalar product for the complex case
│ │ │ │ -
975 // doing the modified Gram-Schmidt algorithm
│ │ │ │ -
976 H[k][i] = _sp->dot(v[k],w);
│ │ │ │ -
977 // w -= H[k][i] * v[k]
│ │ │ │ -
978 w.axpy(-H[k][i],v[k]);
│ │ │ │ -
979 }
│ │ │ │ -
980 H[i+1][i] = _sp->norm(w);
│ │ │ │ -
981 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))
│ │ │ │ -
982 DUNE_THROW(SolverAbort,
│ │ │ │ -
983 "breakdown in GMRes - |w| == 0.0 after " << j << " iterations");
│ │ │ │ -
984
│ │ │ │ -
985 // normalize new vector
│ │ │ │ -
986 v[i+1] = w;
│ │ │ │ -
987 v[i+1] *= Simd::cond(norm==real_type(0.),
│ │ │ │ -
988 field_type(0.),
│ │ │ │ -
989 real_type(1.0)/H[i+1][i]);
│ │ │ │ -
990
│ │ │ │ -
991 // update QR factorization
│ │ │ │ -
992 for(int k=0; k<i; k++)
│ │ │ │ -
993 applyPlaneRotation(H[k][i],H[k+1][i],cs[k],sn[k]);
│ │ │ │ -
994
│ │ │ │ -
995 // compute new givens rotation
│ │ │ │ -
996 generatePlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ -
997 // finish updating QR factorization
│ │ │ │ -
998 applyPlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ -
999 applyPlaneRotation(s[i],s[i+1],cs[i],sn[i]);
│ │ │ │ -
1000
│ │ │ │ -
1001 // norm of the defect is the last component the vector s
│ │ │ │ -
1002 norm = abs(s[i+1]);
│ │ │ │ -
1003
│ │ │ │ -
1004 iteration.step(j, norm);
│ │ │ │ -
1005
│ │ │ │ -
1006 } // end for
│ │ │ │ -
1007
│ │ │ │ -
1008 // calculate update vector
│ │ │ │ -
1009 w = 0.0;
│ │ │ │ -
1010 update(w,i,H,s,v);
│ │ │ │ -
1011 // and current iterate
│ │ │ │ -
1012 x += w;
│ │ │ │ -
1013
│ │ │ │ -
1014 // restart GMRes if convergence was not achieved,
│ │ │ │ -
1015 // i.e. linear defect has not reached desired reduction
│ │ │ │ -
1016 // and if j < _maxit (do not restart on last iteration)
│ │ │ │ -
1017 if( res.converged != true && j < _maxit ) {
│ │ │ │ -
1018
│ │ │ │ -
1019 if(_verbose > 0)
│ │ │ │ -
1020 std::cout << "=== GMRes::restart" << std::endl;
│ │ │ │ -
1021 // get saved rhs
│ │ │ │ -
1022 b = b2;
│ │ │ │ -
1023 // calculate new defect
│ │ │ │ -
1024 _op->applyscaleadd(-1.0,x,b); // b -= Ax;
│ │ │ │ -
1025 // calculate preconditioned defect
│ │ │ │ -
1026 v[0] = 0.0;
│ │ │ │ -
1027 _prec->apply(v[0],b);
│ │ │ │ -
1028 norm = _sp->norm(v[0]);
│ │ │ │ -
1029 }
│ │ │ │ -
1030
│ │ │ │ -
1031 } //end while
│ │ │ │ -
1032
│ │ │ │ -
1033 // postprocess preconditioner
│ │ │ │ -
1034 _prec->post(x);
│ │ │ │ -
1035 }
│ │ │ │ -
│ │ │ │ -
1036
│ │ │ │ -
1037 protected :
│ │ │ │ -
1038
│ │ │ │ -
│ │ │ │ -
1039 void update(X& w, int i,
│ │ │ │ -
1040 const std::vector<std::vector<field_type,fAlloc> >& H,
│ │ │ │ -
1041 const std::vector<field_type,fAlloc>& s,
│ │ │ │ -
1042 const std::vector<X>& v) {
│ │ │ │ -
1043 // solution vector of the upper triangular system
│ │ │ │ -
1044 std::vector<field_type,fAlloc> y(s);
│ │ │ │ -
1045
│ │ │ │ -
1046 // backsolve
│ │ │ │ -
1047 for(int a=i-1; a>=0; a--) {
│ │ │ │ -
1048 field_type rhs(s[a]);
│ │ │ │ -
1049 for(int b=a+1; b<i; b++)
│ │ │ │ -
1050 rhs -= H[a][b]*y[b];
│ │ │ │ -
1051 y[a] = Simd::cond(rhs==field_type(0.),
│ │ │ │ -
1052 field_type(0.),
│ │ │ │ -
1053 rhs/H[a][a]);
│ │ │ │ -
1054
│ │ │ │ -
1055 // compute update on the fly
│ │ │ │ -
1056 // w += y[a]*v[a]
│ │ │ │ -
1057 w.axpy(y[a],v[a]);
│ │ │ │ -
1058 }
│ │ │ │ -
1059 }
│ │ │ │ -
│ │ │ │ -
1060
│ │ │ │ -
1061 template<typename T>
│ │ │ │ -
│ │ │ │ -
1062 typename std::enable_if<std::is_same<field_type,real_type>::value,T>::type conjugate(const T& t) {
│ │ │ │ -
1063 return t;
│ │ │ │ -
1064 }
│ │ │ │ -
│ │ │ │ -
1065
│ │ │ │ -
1066 template<typename T>
│ │ │ │ -
│ │ │ │ -
1067 typename std::enable_if<!std::is_same<field_type,real_type>::value,T>::type conjugate(const T& t) {
│ │ │ │ -
1068 using std::conj;
│ │ │ │ -
1069 return conj(t);
│ │ │ │ -
1070 }
│ │ │ │ -
│ │ │ │ -
1071
│ │ │ │ -
1072 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1074 {
│ │ │ │ -
1075 using std::sqrt;
│ │ │ │ -
1076 using std::abs;
│ │ │ │ -
1077 using std::max;
│ │ │ │ -
1078 using std::min;
│ │ │ │ -
1079 const real_type eps = 1e-15;
│ │ │ │ -
1080 real_type norm_dx = abs(dx);
│ │ │ │ -
1081 real_type norm_dy = abs(dy);
│ │ │ │ -
1082 real_type norm_max = max(norm_dx, norm_dy);
│ │ │ │ -
1083 real_type norm_min = min(norm_dx, norm_dy);
│ │ │ │ -
1084 real_type temp = norm_min/norm_max;
│ │ │ │ -
1085 // we rewrite the code in a vectorizable fashion
│ │ │ │ -
1086 cs = Simd::cond(norm_dy < eps,
│ │ │ │ -
1087 real_type(1.0),
│ │ │ │ -
1088 Simd::cond(norm_dx < eps,
│ │ │ │ -
1089 real_type(0.0),
│ │ │ │ -
1090 Simd::cond(norm_dy > norm_dx,
│ │ │ │ -
1091 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)*temp,
│ │ │ │ -
1092 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)
│ │ │ │ -
1093 )));
│ │ │ │ -
1094 sn = Simd::cond(norm_dy < eps,
│ │ │ │ -
1095 field_type(0.0),
│ │ │ │ -
1096 Simd::cond(norm_dx < eps,
│ │ │ │ -
1097 field_type(1.0),
│ │ │ │ -
1098 Simd::cond(norm_dy > norm_dx,
│ │ │ │ -
1099 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dx*conjugate(dy)/norm_dx/norm_dy,
│ │ │ │ -
1100 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*conjugate(dy/dx)
│ │ │ │ -
1101 )));
│ │ │ │ -
1102 }
│ │ │ │ -
│ │ │ │ -
1103
│ │ │ │ -
1104
│ │ │ │ -
1105 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1107 {
│ │ │ │ -
1108 field_type temp = cs * dx + sn * dy;
│ │ │ │ -
1109 dy = -conjugate(sn) * dx + cs * dy;
│ │ │ │ -
1110 dx = temp;
│ │ │ │ -
1111 }
│ │ │ │ -
│ │ │ │ -
1112
│ │ │ │ -
1113 using IterativeSolver<X,Y>::_op;
│ │ │ │ -
1114 using IterativeSolver<X,Y>::_prec;
│ │ │ │ -
1115 using IterativeSolver<X,Y>::_sp;
│ │ │ │ -
1116 using IterativeSolver<X,Y>::_reduction;
│ │ │ │ -
1117 using IterativeSolver<X,Y>::_maxit;
│ │ │ │ -
1118 using IterativeSolver<X,Y>::_verbose;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1121 };
│ │ │ │ -
│ │ │ │ -
1122 DUNE_REGISTER_ITERATIVE_SOLVER("restartedgmressolver", defaultIterativeSolverCreator<Dune::RestartedGMResSolver>());
│ │ │ │ -
1123
│ │ │ │ -
1137 template<class X, class Y=X, class F = Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1139 {
│ │ │ │ -
1140 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
1145
│ │ │ │ -
1146 private:
│ │ │ │ - │ │ │ │ -
1148
│ │ │ │ -
1150 using fAlloc = typename RestartedGMResSolver<X,Y>::fAlloc;
│ │ │ │ -
1152 using rAlloc = typename RestartedGMResSolver<X,Y>::rAlloc;
│ │ │ │ -
1153
│ │ │ │ -
1154 public:
│ │ │ │ -
1155 // copy base class constructors
│ │ │ │ -
1156 using RestartedGMResSolver<X,Y>::RestartedGMResSolver;
│ │ │ │ -
1157
│ │ │ │ -
1158 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
1159 using RestartedGMResSolver<X,Y>::apply;
│ │ │ │ -
1160
│ │ │ │ -
│ │ │ │ -
1169 void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
│ │ │ │ -
1170 {
│ │ │ │ -
1171 using std::abs;
│ │ │ │ -
1172 const Simd::Scalar<real_type> EPSILON = 1e-80;
│ │ │ │ -
1173 const int m = _restart;
│ │ │ │ -
1174 real_type norm = 0.0;
│ │ │ │ -
1175 int i, j = 1, k;
│ │ │ │ -
1176 std::vector<field_type,fAlloc> s(m+1), sn(m);
│ │ │ │ -
1177 std::vector<real_type,rAlloc> cs(m);
│ │ │ │ -
1178 // helper vector
│ │ │ │ -
1179 Y tmp(b);
│ │ │ │ -
1180 std::vector< std::vector<field_type,fAlloc> > H(m+1,s);
│ │ │ │ -
1181 std::vector<F> v(m+1,b);
│ │ │ │ -
1182 std::vector<X> w(m+1,b);
│ │ │ │ -
1183
│ │ │ │ -
1184 Iteration iteration(*this,res);
│ │ │ │ -
1185 // setup preconditioner if it does something in pre
│ │ │ │ -
1186
│ │ │ │ -
1187 // calculate residual and overwrite a copy of the rhs with it
│ │ │ │ -
1188 _prec->pre(x, b);
│ │ │ │ -
1189 v[0] = b;
│ │ │ │ -
1190 _op->applyscaleadd(-1.0, x, v[0]); // b -= Ax
│ │ │ │ -
1191
│ │ │ │ -
1192 norm = _sp->norm(v[0]); // the residual norm
│ │ │ │ -
1193 if(iteration.step(0, norm)){
│ │ │ │ -
1194 _prec->post(x);
│ │ │ │ -
1195 return;
│ │ │ │ -
1196 }
│ │ │ │ -
1197
│ │ │ │ -
1198 // start iterations
│ │ │ │ -
1199 res.converged = false;;
│ │ │ │ -
1200 while(j <= _maxit && res.converged != true)
│ │ │ │ -
1201 {
│ │ │ │ -
1202 v[0] *= (1.0 / norm);
│ │ │ │ -
1203 s[0] = norm;
│ │ │ │ -
1204 for(i=1; i<m+1; ++i)
│ │ │ │ -
1205 s[i] = 0.0;
│ │ │ │ -
1206
│ │ │ │ -
1207 // inner loop
│ │ │ │ -
1208 for(i=0; i < m && j <= _maxit && res.converged != true; i++, j++)
│ │ │ │ -
1209 {
│ │ │ │ -
1210 w[i] = 0.0;
│ │ │ │ -
1211 // compute wi = M^-1*vi (also called zi)
│ │ │ │ -
1212 _prec->apply(w[i], v[i]);
│ │ │ │ -
1213 // compute vi = A*wi
│ │ │ │ -
1214 // use v[i+1] as temporary vector for w
│ │ │ │ -
1215 _op->apply(w[i], v[i+1]);
│ │ │ │ -
1216 // do Arnoldi algorithm
│ │ │ │ -
1217 for(int kk=0; kk<i+1; kk++)
│ │ │ │ -
1218 {
│ │ │ │ -
1219 // notice that _sp->dot(v[k],v[i+1]) = v[k]\adjoint v[i+1]
│ │ │ │ -
1220 // so one has to pay attention to the order
│ │ │ │ -
1221 // in the scalar product for the complex case
│ │ │ │ -
1222 // doing the modified Gram-Schmidt algorithm
│ │ │ │ -
1223 H[kk][i] = _sp->dot(v[kk],v[i+1]);
│ │ │ │ -
1224 // w -= H[k][i] * v[kk]
│ │ │ │ -
1225 v[i+1].axpy(-H[kk][i], v[kk]);
│ │ │ │ -
1226 }
│ │ │ │ -
1227 H[i+1][i] = _sp->norm(v[i+1]);
│ │ │ │ -
1228 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))
│ │ │ │ -
1229 DUNE_THROW(SolverAbort, "breakdown in fGMRes - |w| (-> "
│ │ │ │ -
1230 << w[i] << ") == 0.0 after "
│ │ │ │ -
1231 << j << " iterations");
│ │ │ │ -
1232
│ │ │ │ -
1233 // v[i+1] = w*1/H[i+1][i]
│ │ │ │ -
1234 v[i+1] *= real_type(1.0)/H[i+1][i];
│ │ │ │ -
1235
│ │ │ │ -
1236 // update QR factorization
│ │ │ │ -
1237 for(k=0; k<i; k++)
│ │ │ │ -
1238 this->applyPlaneRotation(H[k][i],H[k+1][i],cs[k],sn[k]);
│ │ │ │ -
1239
│ │ │ │ -
1240 // compute new givens rotation
│ │ │ │ -
1241 this->generatePlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ -
1242
│ │ │ │ -
1243 // finish updating QR factorization
│ │ │ │ -
1244 this->applyPlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ -
1245 this->applyPlaneRotation(s[i],s[i+1],cs[i],sn[i]);
│ │ │ │ -
1246
│ │ │ │ -
1247 // norm of the residual is the last component of vector s
│ │ │ │ -
1248 using std::abs;
│ │ │ │ -
1249 norm = abs(s[i+1]);
│ │ │ │ -
1250 iteration.step(j, norm);
│ │ │ │ -
1251 } // end inner for loop
│ │ │ │ -
1252
│ │ │ │ -
1253 // calculate update vector
│ │ │ │ -
1254 tmp = 0.0;
│ │ │ │ -
1255 this->update(tmp, i, H, s, w);
│ │ │ │ -
1256 // and update current iterate
│ │ │ │ -
1257 x += tmp;
│ │ │ │ -
1258
│ │ │ │ -
1259 // restart fGMRes if convergence was not achieved,
│ │ │ │ -
1260 // i.e. linear residual has not reached desired reduction
│ │ │ │ -
1261 // and if still j < _maxit (do not restart on last iteration)
│ │ │ │ -
1262 if( res.converged != true && j < _maxit)
│ │ │ │ -
1263 {
│ │ │ │ -
1264 if (_verbose > 0)
│ │ │ │ -
1265 std::cout << "=== fGMRes::restart" << std::endl;
│ │ │ │ -
1266 // get rhs
│ │ │ │ -
1267 v[0] = b;
│ │ │ │ -
1268 // calculate new defect
│ │ │ │ -
1269 _op->applyscaleadd(-1.0, x,v[0]); // b -= Ax;
│ │ │ │ -
1270 // calculate preconditioned defect
│ │ │ │ -
1271 norm = _sp->norm(v[0]); // update the residual norm
│ │ │ │ -
1272 }
│ │ │ │ -
1273
│ │ │ │ -
1274 } // end outer while loop
│ │ │ │ -
1275
│ │ │ │ -
1276 // post-process preconditioner
│ │ │ │ -
1277 _prec->post(x);
│ │ │ │ -
1278 }
│ │ │ │ -
│ │ │ │ -
1279
│ │ │ │ -
1280private:
│ │ │ │ -
1281 using RestartedGMResSolver<X,Y>::_op;
│ │ │ │ -
1282 using RestartedGMResSolver<X,Y>::_prec;
│ │ │ │ -
1283 using RestartedGMResSolver<X,Y>::_sp;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
1288 using Iteration = typename IterativeSolver<X,X>::template Iteration<unsigned int>;
│ │ │ │ -
1289 };
│ │ │ │ -
│ │ │ │ -
1290 DUNE_REGISTER_ITERATIVE_SOLVER("restartedflexiblegmressolver", defaultIterativeSolverCreator<Dune::RestartedFlexibleGMResSolver>());
│ │ │ │ -
1291
│ │ │ │ -
1305 template<class X>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1307 {
│ │ │ │ -
1308 public:
│ │ │ │ -
1309 using typename IterativeSolver<X,X>::domain_type;
│ │ │ │ -
1310 using typename IterativeSolver<X,X>::range_type;
│ │ │ │ -
1311 using typename IterativeSolver<X,X>::field_type;
│ │ │ │ -
1312 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ -
1313
│ │ │ │ -
1314 private:
│ │ │ │ - │ │ │ │ -
1316
│ │ │ │ - │ │ │ │ -
1319
│ │ │ │ -
1320 public:
│ │ │ │ -
1321
│ │ │ │ -
1322 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
1323 using IterativeSolver<X,X>::apply;
│ │ │ │ -
1324
│ │ │ │ -
│ │ │ │ -
1331 GeneralizedPCGSolver (const LinearOperator<X,X>& op, Preconditioner<X,X>& prec, scalar_real_type reduction, int maxit, int verbose, int restart = 10) :
│ │ │ │ -
1332 IterativeSolver<X,X>::IterativeSolver(op,prec,reduction,maxit,verbose),
│ │ │ │ -
1333 _restart(restart)
│ │ │ │ -
1334 {}
│ │ │ │ -
│ │ │ │ -
1335
│ │ │ │ -
│ │ │ │ -
1343 GeneralizedPCGSolver (const LinearOperator<X,X>& op, const ScalarProduct<X>& sp, Preconditioner<X,X>& prec, scalar_real_type reduction, int maxit, int verbose, int restart = 10) :
│ │ │ │ -
1344 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ -
1345 _restart(restart)
│ │ │ │ -
1346 {}
│ │ │ │ -
│ │ │ │ -
1347
│ │ │ │ -
1348
│ │ │ │ -
│ │ │ │ -
1361 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ -
1362 IterativeSolver<X,X>::IterativeSolver(op,prec,configuration),
│ │ │ │ -
1363 _restart(configuration.get<int>("restart"))
│ │ │ │ -
1364 {}
│ │ │ │ -
│ │ │ │ -
1365
│ │ │ │ -
│ │ │ │ -
1366 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X> > op, std::shared_ptr<const ScalarProduct<X> > sp, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ -
1367 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,configuration),
│ │ │ │ -
1368 _restart(configuration.get<int>("restart"))
│ │ │ │ -
1369 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
1377 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ -
1378 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ -
1379 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ -
1380 scalar_real_type reduction, int maxit, int verbose,
│ │ │ │ -
1381 int restart = 10) :
│ │ │ │ -
1382 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ -
1383 _restart(restart)
│ │ │ │ -
1384 {}
│ │ │ │ -
│ │ │ │ -
1385
│ │ │ │ -
│ │ │ │ -
1391 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
1392 {
│ │ │ │ -
1393 Iteration iteration(*this, res);
│ │ │ │ -
1394 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ -
1395 _op->applyscaleadd(-1,x,b); // overwrite b with defect
│ │ │ │ -
1396
│ │ │ │ -
1397 std::vector<std::shared_ptr<X> > p(_restart);
│ │ │ │ -
1398 std::vector<field_type,fAlloc> pp(_restart);
│ │ │ │ -
1399 X q(x); // a temporary vector
│ │ │ │ -
1400 X prec_res(x); // a temporary vector for preconditioner output
│ │ │ │ -
1401
│ │ │ │ -
1402 p[0].reset(new X(x));
│ │ │ │ -
1403
│ │ │ │ -
1404 real_type def = _sp->norm(b); // compute norm
│ │ │ │ -
1405 if(iteration.step(0, def)){
│ │ │ │ -
1406 _prec->post(x);
│ │ │ │ -
1407 return;
│ │ │ │ -
1408 }
│ │ │ │ -
1409 // some local variables
│ │ │ │ -
1410 field_type rho, lambda;
│ │ │ │ -
1411
│ │ │ │ -
1412 int i=0;
│ │ │ │ -
1413 int ii=0;
│ │ │ │ -
1414 // determine initial search direction
│ │ │ │ -
1415 *(p[0]) = 0; // clear correction
│ │ │ │ -
1416 _prec->apply(*(p[0]),b); // apply preconditioner
│ │ │ │ -
1417 rho = _sp->dot(*(p[0]),b); // orthogonalization
│ │ │ │ -
1418 _op->apply(*(p[0]),q); // q=Ap
│ │ │ │ -
1419 pp[0] = _sp->dot(*(p[0]),q); // scalar product
│ │ │ │ -
1420 lambda = rho/pp[0]; // minimization
│ │ │ │ -
1421 x.axpy(lambda,*(p[0])); // update solution
│ │ │ │ -
1422 b.axpy(-lambda,q); // update defect
│ │ │ │ -
1423
│ │ │ │ -
1424 // convergence test
│ │ │ │ -
1425 def=_sp->norm(b); // comp defect norm
│ │ │ │ -
1426 ++i;
│ │ │ │ -
1427 if(iteration.step(i, def)){
│ │ │ │ -
1428 _prec->post(x);
│ │ │ │ -
1429 return;
│ │ │ │ -
1430 }
│ │ │ │ -
1431
│ │ │ │ -
1432 while(i<_maxit) {
│ │ │ │ -
1433 // the loop
│ │ │ │ -
1434 int end=std::min(_restart, _maxit-i+1);
│ │ │ │ -
1435 for (ii=1; ii<end; ++ii )
│ │ │ │ -
1436 {
│ │ │ │ -
1437 //std::cout<<" ii="<<ii<<" i="<<i<<std::endl;
│ │ │ │ -
1438 // compute next conjugate direction
│ │ │ │ -
1439 prec_res = 0; // clear correction
│ │ │ │ -
1440 _prec->apply(prec_res,b); // apply preconditioner
│ │ │ │ -
1441
│ │ │ │ -
1442 p[ii].reset(new X(prec_res));
│ │ │ │ -
1443 _op->apply(prec_res, q);
│ │ │ │ -
1444
│ │ │ │ -
1445 for(int j=0; j<ii; ++j) {
│ │ │ │ -
1446 rho =_sp->dot(q,*(p[j]))/pp[j];
│ │ │ │ -
1447 p[ii]->axpy(-rho, *(p[j]));
│ │ │ │ -
1448 }
│ │ │ │ -
1449
│ │ │ │ -
1450 // minimize in given search direction
│ │ │ │ -
1451 _op->apply(*(p[ii]),q); // q=Ap
│ │ │ │ -
1452 pp[ii] = _sp->dot(*(p[ii]),q); // scalar product
│ │ │ │ -
1453 rho = _sp->dot(*(p[ii]),b); // orthogonalization
│ │ │ │ -
1454 lambda = rho/pp[ii]; // minimization
│ │ │ │ -
1455 x.axpy(lambda,*(p[ii])); // update solution
│ │ │ │ -
1456 b.axpy(-lambda,q); // update defect
│ │ │ │ -
1457
│ │ │ │ -
1458 // convergence test
│ │ │ │ -
1459 def = _sp->norm(b); // comp defect norm
│ │ │ │ -
1460
│ │ │ │ -
1461 ++i;
│ │ │ │ -
1462 iteration.step(i, def);
│ │ │ │ -
1463 }
│ │ │ │ -
1464 if(res.converged)
│ │ │ │ -
1465 break;
│ │ │ │ -
1466 if(end==_restart) {
│ │ │ │ -
1467 *(p[0])=*(p[_restart-1]);
│ │ │ │ -
1468 pp[0]=pp[_restart-1];
│ │ │ │ -
1469 }
│ │ │ │ -
1470 }
│ │ │ │ -
1471
│ │ │ │ -
1472 // postprocess preconditioner
│ │ │ │ -
1473 _prec->post(x);
│ │ │ │ -
1474
│ │ │ │ -
1475 }
│ │ │ │ -
│ │ │ │ -
1476
│ │ │ │ -
1477 private:
│ │ │ │ -
1478 using IterativeSolver<X,X>::_op;
│ │ │ │ -
1479 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
1480 using IterativeSolver<X,X>::_sp;
│ │ │ │ -
1481 using IterativeSolver<X,X>::_reduction;
│ │ │ │ -
1482 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
1483 using IterativeSolver<X,X>::_verbose;
│ │ │ │ -
1484 using Iteration = typename IterativeSolver<X,X>::template Iteration<unsigned int>;
│ │ │ │ -
1485 int _restart;
│ │ │ │ -
1486 };
│ │ │ │ -
│ │ │ │ -
1487 DUNE_REGISTER_ITERATIVE_SOLVER("generalizedpcgsolver", defaultIterativeSolverCreator<Dune::GeneralizedPCGSolver>());
│ │ │ │ -
1488
│ │ │ │ -
1500 template<class X>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1502 public:
│ │ │ │ -
1503 using typename IterativeSolver<X,X>::domain_type;
│ │ │ │ -
1504 using typename IterativeSolver<X,X>::range_type;
│ │ │ │ -
1505 using typename IterativeSolver<X,X>::field_type;
│ │ │ │ -
1506 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ -
1507
│ │ │ │ -
1508 private:
│ │ │ │ - │ │ │ │ -
1510
│ │ │ │ -
1511 public:
│ │ │ │ -
1512 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ -
1513 using IterativeSolver<X,X>::apply;
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1520 scalar_real_type reduction, int maxit, int verbose, int mmax = 10) : IterativeSolver<X,X>(op, prec, reduction, maxit, verbose), _mmax(mmax)
│ │ │ │ -
1521 {
│ │ │ │ -
1522 }
│ │ │ │ -
│ │ │ │ -
1523
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1530 scalar_real_type reduction, int maxit, int verbose, int mmax = 10) : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose), _mmax(mmax)
│ │ │ │ -
1531 {
│ │ │ │ -
1532 }
│ │ │ │ -
│ │ │ │ -
1533
│ │ │ │ -
│ │ │ │ -
1539 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ -
1540 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ -
1541 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ -
1542 scalar_real_type reduction, int maxit, int verbose,
│ │ │ │ -
1543 int mmax = 10)
│ │ │ │ -
1544 : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose), _mmax(mmax)
│ │ │ │ -
1545 {}
│ │ │ │ -
│ │ │ │ -
1546
│ │ │ │ -
│ │ │ │ -
1559 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ -
1560 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ -
1561 const ParameterTree& config)
│ │ │ │ -
1562 : IterativeSolver<X,X>(op, prec, config), _mmax(config.get("mmax", 10))
│ │ │ │ -
1563 {}
│ │ │ │ -
│ │ │ │ -
1564
│ │ │ │ -
│ │ │ │ -
1565 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ -
1566 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ -
1567 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ -
1568 const ParameterTree& config)
│ │ │ │ -
1569 : IterativeSolver<X,X>(op, sp, prec, config), _mmax(config.get("mmax", 10))
│ │ │ │ -
1570 {}
│ │ │ │ -
│ │ │ │ -
1571
│ │ │ │ -
│ │ │ │ -
1584 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
1585 {
│ │ │ │ - │ │ │ │ -
1587 res.clear();
│ │ │ │ -
1588 Iteration iteration(*this,res);
│ │ │ │ -
1589 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ -
1590 _op->applyscaleadd(-1,x,b); // overwrite b with defect
│ │ │ │ -
1591
│ │ │ │ -
1592 //arrays for interim values:
│ │ │ │ -
1593 std::vector<X> d(_mmax+1, x); // array for directions
│ │ │ │ -
1594 std::vector<X> Ad(_mmax+1, x); // array for Ad[i]
│ │ │ │ -
1595 std::vector<field_type,rAlloc> ddotAd(_mmax+1,0); // array for <d[i],Ad[i]>
│ │ │ │ -
1596 X w(x);
│ │ │ │ -
1597
│ │ │ │ -
1598 real_type def = _sp->norm(b); // compute norm
│ │ │ │ -
1599 if(iteration.step(0, def)){
│ │ │ │ -
1600 _prec->post(x);
│ │ │ │ -
1601 return;
│ │ │ │ -
1602 }
│ │ │ │ -
1603
│ │ │ │ -
1604 // some local variables
│ │ │ │ -
1605 field_type alpha;
│ │ │ │ -
1606
│ │ │ │ -
1607 // the loop
│ │ │ │ -
1608 int i=1;
│ │ │ │ -
1609 int i_bounded=0;
│ │ │ │ -
1610 while(i<=_maxit && !res.converged) {
│ │ │ │ -
1611 for (; i_bounded <= _mmax && i<= _maxit; i_bounded++) {
│ │ │ │ -
1612 d[i_bounded] = 0; // reset search direction
│ │ │ │ -
1613 _prec->apply(d[i_bounded], b); // apply preconditioner
│ │ │ │ -
1614 w = d[i_bounded]; // copy of current d[i]
│ │ │ │ -
1615 // orthogonalization with previous directions
│ │ │ │ -
1616 orthogonalizations(i_bounded,Ad,w,ddotAd,d);
│ │ │ │ -
1617
│ │ │ │ -
1618 //saving interim values for future calculating
│ │ │ │ -
1619 _op->apply(d[i_bounded], Ad[i_bounded]); // save Ad[i]
│ │ │ │ -
1620 ddotAd[i_bounded]=_sp->dot(d[i_bounded],Ad[i_bounded]); // save <d[i],Ad[i]>
│ │ │ │ -
1621 alpha = _sp->dot(d[i_bounded], b)/ddotAd[i_bounded]; // <d[i],b>/<d[i],Ad[i]>
│ │ │ │ -
1622
│ │ │ │ -
1623 //update solution and defect
│ │ │ │ -
1624 x.axpy(alpha, d[i_bounded]);
│ │ │ │ -
1625 b.axpy(-alpha, Ad[i_bounded]);
│ │ │ │ -
1626
│ │ │ │ -
1627 // convergence test
│ │ │ │ -
1628 def = _sp->norm(b); // comp defect norm
│ │ │ │ -
1629
│ │ │ │ -
1630 iteration.step(i, def);
│ │ │ │ -
1631 i++;
│ │ │ │ -
1632 }
│ │ │ │ -
1633 //restart: exchange first and last stored values
│ │ │ │ -
1634 cycle(Ad,d,ddotAd,i_bounded);
│ │ │ │ -
1635 }
│ │ │ │ -
1636
│ │ │ │ -
1637 //correct i which is wrong if convergence was not achieved.
│ │ │ │ -
1638 i=std::min(_maxit,i);
│ │ │ │ -
1639
│ │ │ │ -
1640 _prec->post(x); // postprocess preconditioner
│ │ │ │ -
1641 }
│ │ │ │ -
│ │ │ │ -
1642
│ │ │ │ -
1643 private:
│ │ │ │ -
1644 //This function is called every iteration to orthogonalize against the last search directions
│ │ │ │ -
1645 virtual void orthogonalizations(const int& i_bounded,const std::vector<X>& Ad, const X& w, const std::vector<field_type,ReboundAllocatorType<X,field_type>>& ddotAd,std::vector<X>& d) {
│ │ │ │ -
1646 // The RestartedFCGSolver uses only values with lower array index;
│ │ │ │ -
1647 for (int k = 0; k < i_bounded; k++) {
│ │ │ │ -
1648 d[i_bounded].axpy(-_sp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= <<Ad[k],w>/<d[k],Ad[k]>>d[k]
│ │ │ │ -
1649 }
│ │ │ │ -
1650 }
│ │ │ │ -
1651
│ │ │ │ -
1652 // This function is called every mmax iterations to handle limited array sizes.
│ │ │ │ -
1653 virtual void cycle(std::vector<X>& Ad,std::vector<X>& d,std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) {
│ │ │ │ -
1654 // Reset loop index and exchange the first and last arrays
│ │ │ │ -
1655 i_bounded = 1;
│ │ │ │ -
1656 std::swap(Ad[0], Ad[_mmax]);
│ │ │ │ -
1657 std::swap(d[0], d[_mmax]);
│ │ │ │ -
1658 std::swap(ddotAd[0], ddotAd[_mmax]);
│ │ │ │ -
1659 }
│ │ │ │ -
1660
│ │ │ │ -
1661 protected:
│ │ │ │ - │ │ │ │ -
1663 using IterativeSolver<X,X>::_op;
│ │ │ │ -
1664 using IterativeSolver<X,X>::_prec;
│ │ │ │ -
1665 using IterativeSolver<X,X>::_sp;
│ │ │ │ -
1666 using IterativeSolver<X,X>::_reduction;
│ │ │ │ -
1667 using IterativeSolver<X,X>::_maxit;
│ │ │ │ -
1668 using IterativeSolver<X,X>::_verbose;
│ │ │ │ - │ │ │ │ -
1670 };
│ │ │ │ -
│ │ │ │ -
1671 DUNE_REGISTER_ITERATIVE_SOLVER("restartedfcgsolver", defaultIterativeSolverCreator<Dune::RestartedFCGSolver>());
│ │ │ │ -
1672
│ │ │ │ -
1679 template<class X>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1681 public:
│ │ │ │ - │ │ │ │ -
1683 using typename RestartedFCGSolver<X>::range_type;
│ │ │ │ -
1684 using typename RestartedFCGSolver<X>::field_type;
│ │ │ │ -
1685 using typename RestartedFCGSolver<X>::real_type;
│ │ │ │ -
1686
│ │ │ │ -
1687 // copy base class constructors
│ │ │ │ -
1688 using RestartedFCGSolver<X>::RestartedFCGSolver;
│ │ │ │ -
1689
│ │ │ │ -
1690 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ - │ │ │ │ -
1692
│ │ │ │ -
1693 // just a minor part of the RestartedFCGSolver apply method will be modified
│ │ │ │ -
│ │ │ │ -
1694 virtual void apply (X& x, X& b, InverseOperatorResult& res) override {
│ │ │ │ -
1695 // reset limiter of orthogonalization loop
│ │ │ │ -
1696 _k_limit = 0;
│ │ │ │ -
1697 this->RestartedFCGSolver<X>::apply(x,b,res);
│ │ │ │ -
1698 };
│ │ │ │ -
│ │ │ │ -
1699
│ │ │ │ -
1700 private:
│ │ │ │ -
1701 // This function is called every iteration to orthogonalize against the last search directions.
│ │ │ │ -
1702 virtual void orthogonalizations(const int& i_bounded,const std::vector<X>& Ad, const X& w, const std::vector<field_type,ReboundAllocatorType<X,field_type>>& ddotAd,std::vector<X>& d) override {
│ │ │ │ -
1703 // This FCGSolver uses values with higher array indexes too, if existent.
│ │ │ │ -
1704 for (int k = 0; k < _k_limit; k++) {
│ │ │ │ -
1705 if(i_bounded!=k)
│ │ │ │ -
1706 d[i_bounded].axpy(-_sp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= <<Ad[k],w>/<d[k],Ad[k]>>d[k]
│ │ │ │ -
1707 }
│ │ │ │ -
1708 // The loop limit increase, if array is not completely filled.
│ │ │ │ -
1709 if(_k_limit<=i_bounded)
│ │ │ │ -
1710 _k_limit++;
│ │ │ │ -
1711
│ │ │ │ -
1712 };
│ │ │ │ -
1713
│ │ │ │ -
1714 // This function is called every mmax iterations to handle limited array sizes.
│ │ │ │ -
1715 virtual void cycle(std::vector<X>& Ad, [[maybe_unused]] std::vector<X>& d, [[maybe_unused]] std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) override {
│ │ │ │ -
1716 // Only the loop index i_bounded return to 0, if it reached mmax.
│ │ │ │ -
1717 i_bounded = 0;
│ │ │ │ -
1718 // Now all arrays are filled and the loop in void orthogonalizations can use the whole arrays.
│ │ │ │ -
1719 _k_limit = Ad.size();
│ │ │ │ -
1720 };
│ │ │ │ -
1721
│ │ │ │ -
1722 int _k_limit = 0;
│ │ │ │ -
1723
│ │ │ │ -
1724 protected:
│ │ │ │ - │ │ │ │ -
1726 using RestartedFCGSolver<X>::_op;
│ │ │ │ - │ │ │ │ -
1728 using RestartedFCGSolver<X>::_sp;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
1732 };
│ │ │ │ -
│ │ │ │ -
1733 DUNE_REGISTER_ITERATIVE_SOLVER("completefcgsolver", defaultIterativeSolverCreator<Dune::CompleteFCGSolver>());
│ │ │ │ -
1735} // end namespace
│ │ │ │ -
1736
│ │ │ │ -
1737#endif
│ │ │ │ - │ │ │ │ -
#define DUNE_REGISTER_ITERATIVE_SOLVER(name,...)
Definition solverregistry.hh:19
│ │ │ │ -
Define base class for scalar product and norm.
│ │ │ │ - │ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Define general, extensible interface for inverse operators.
│ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ - │ │ │ │ +
939 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
941 {
│ │ │ │ +
942 return maxlevels_;
│ │ │ │ +
943 }
│ │ │ │ +
│ │ │ │ +
944
│ │ │ │ +
945 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
947 {
│ │ │ │ +
948 return levels()==maxlevels() &&
│ │ │ │ +
949 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N()>0);
│ │ │ │ +
950 }
│ │ │ │ +
│ │ │ │ +
951
│ │ │ │ +
952 template<class M, class IS, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
954 {
│ │ │ │ +
955 return built_;
│ │ │ │ +
956 }
│ │ │ │ +
│ │ │ │ +
957
│ │ │ │ +
959 } // namespace Amg
│ │ │ │ +
960} // namespace Dune
│ │ │ │ +
961
│ │ │ │ +
962#endif // end DUNE_AMG_MATRIXHIERARCHY_HH
│ │ │ │ +
Functionality for redistributing a sparse matrix.
│ │ │ │ + │ │ │ │ +
Provides a classes representing the hierarchies in AMG.
│ │ │ │ +
Provdes class for identifying aggregates globally.
│ │ │ │ +
Classes for the generic construction and application of the smoothers.
│ │ │ │ +
Provides classes for the Coloring process of AMG.
│ │ │ │ +
Provides a class for building the index set and remote indices on the coarse level.
│ │ │ │ +
Provides classes for building the matrix graph.
│ │ │ │ +
Helper classes for the construction of classes without empty constructor.
│ │ │ │ +
Provides classes for initializing the link attributes of a matrix graph.
│ │ │ │ + │ │ │ │ +
Provides a class for building the galerkin product based on a aggregation scheme.
│ │ │ │ +
Prolongation and restriction for amg.
│ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Some handy generic functions for ISTL matrices.
│ │ │ │ +
auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
Get the number of nonzero fields in the matrix.
Definition matrixutils.hh:119
│ │ │ │ +
const AggregatesMapList & aggregatesMaps() const
Get the hierarchy of the mappings of the nodes onto aggregates.
Definition matrixhierarchy.hh:812
│ │ │ │ +
bool isBuilt() const
Whether the hierarchy was built.
Definition matrixhierarchy.hh:953
│ │ │ │ +
bool hasCoarsest() const
Definition matrixhierarchy.hh:946
│ │ │ │ +
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition hierarchy.hh:322
│ │ │ │ +
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition matrixhierarchy.hh:934
│ │ │ │ +
void addCoarser(Arguments &args)
Add an element on a coarser level.
Definition hierarchy.hh:334
│ │ │ │ +
const RedistributeInfoList & redistributeInformation() const
Get the hierarchy of the information about redistributions,.
Definition matrixhierarchy.hh:818
│ │ │ │ +
const ParallelInformationHierarchy & parallelInformation() const
Get the hierarchy of the parallel data distribution information.
Definition matrixhierarchy.hh:737
│ │ │ │ +
bool repartitionAndDistributeMatrix(const M &origMatrix, std::shared_ptr< M > newMatrix, SequentialInformation &origComm, std::shared_ptr< SequentialInformation > &newComm, RedistributeInformation< SequentialInformation > &ri, int nparts, C1 &criterion)
Definition matrixhierarchy.hh:313
│ │ │ │ +
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ +
const ParallelMatrixHierarchy & matrices() const
Get the matrix hierarchy.
Definition matrixhierarchy.hh:730
│ │ │ │ +
std::size_t maxlevels() const
Get the max number of levels in the hierarchy of processors.
Definition matrixhierarchy.hh:940
│ │ │ │ +
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ +
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ +
void recalculateGalerkin(const F &copyFlags)
Recalculate the galerkin products.
Definition matrixhierarchy.hh:898
│ │ │ │ +
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices.
│ │ │ │ +
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ +
void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const
Coarsen the vector hierarchy according to the matrix hierarchy.
Definition matrixhierarchy.hh:841
│ │ │ │ +
const AggregateDescriptor * const_iterator
Definition aggregates.hh:723
│ │ │ │ +
MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr< ParallelInformation > pinfo=std::make_shared< ParallelInformation >())
Constructor.
Definition matrixhierarchy.hh:389
│ │ │ │ +
AccumulationMode
Identifiers for the different accumulation modes.
Definition parameters.hh:232
│ │ │ │ +
Iterator finest()
Get an iterator positioned at the finest level.
Definition hierarchy.hh:377
│ │ │ │ +
void build(const T &criterion)
Build the matrix hierarchy using aggregation.
Definition matrixhierarchy.hh:400
│ │ │ │ +
void free()
Free the allocated memory.
│ │ │ │ +
void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename SmootherTraits< S >::Arguments &args) const
Coarsen the smoother hierarchy according to the matrix hierarchy.
Definition matrixhierarchy.hh:868
│ │ │ │ +
void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
Build the dependency of the matrix graph.
│ │ │ │ +
std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
Build the aggregates.
│ │ │ │ +
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
Calculate the galerkin product.
│ │ │ │ +
void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const
Get the mapping of fine level unknowns to coarse level aggregates.
Definition matrixhierarchy.hh:743
│ │ │ │ +
~MatrixHierarchy()
Definition matrixhierarchy.hh:824
│ │ │ │ +
@ MAX_PROCESSES
Hard limit for the number of processes allowed.
Definition matrixhierarchy.hh:50
│ │ │ │ +
@ atOnceAccu
Accumulate data to one process at once.
Definition parameters.hh:244
│ │ │ │ +
@ successiveAccu
Successively accumulate to fewer processes.
Definition parameters.hh:248
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
Definition matrixutils.hh:154
│ │ │ │
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X > ReboundAllocatorType
Definition allocator.hh:37
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
@ row_wise
Build in a row-wise manner.
Definition bcrsmatrix.hh:521
│ │ │ │ -
CreateIterator createend()
get create iterator pointing to one after the last block
Definition bcrsmatrix.hh:1103
│ │ │ │ -
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ -
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition matrixredistribute.hh:757
│ │ │ │ +
bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
Definition repartition.hh:829
│ │ │ │ +
void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Redistribute a matrix according to given domain decompositions.
Definition matrixredistribute.hh:820
│ │ │ │ +
bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
execute a graph repartition for a giving graph and indexset.
Definition repartition.hh:1235
│ │ │ │
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
Wrapper to use a range of ARPACK++ eigenvalue solvers.
Definition arpackpp.hh:245
│ │ │ │ -
void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:289
│ │ │ │ -
void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:391
│ │ │ │ -
Thrown when a solver aborts due to some problem.
Definition istlexception.hh:46
│ │ │ │ -
A linear operator.
Definition operators.hh:67
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
double condition_estimate
Estimate of condition number.
Definition solver.hh:79
│ │ │ │ -
void clear()
Resets all data.
Definition solver.hh:56
│ │ │ │ -
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ -
Simd::Scalar< real_type > scalar_real_type
scalar type underlying the field_type
Definition solver.hh:114
│ │ │ │ -
Y range_type
Type of the range of the operator to be inverted.
Definition solver.hh:105
│ │ │ │ -
X domain_type
Type of the domain of the operator to be inverted.
Definition solver.hh:102
│ │ │ │ -
X::field_type field_type
The field type of the operator.
Definition solver.hh:108
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
The real type of the field type (is the same if using real numbers, but differs for std::complex)
Definition solver.hh:111
│ │ │ │ -
Base class for all implementations of iterative solvers.
Definition solver.hh:203
│ │ │ │ -
std::shared_ptr< const ScalarProduct< X > > _sp
Definition solver.hh:506
│ │ │ │ -
std::shared_ptr< const LinearOperator< X, X > > _op
Definition solver.hh:504
│ │ │ │ -
int _maxit
Definition solver.hh:508
│ │ │ │ -
int _verbose
Definition solver.hh:509
│ │ │ │ -
scalar_real_type _reduction
Definition solver.hh:507
│ │ │ │ -
std::shared_ptr< Preconditioner< X, X > > _prec
Definition solver.hh:505
│ │ │ │ -
Preconditioned loop solver.
Definition solvers.hh:59
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition solvers.hh:73
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:116
│ │ │ │ -
gradient method
Definition solvers.hh:124
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:142
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:187
│ │ │ │ -
conjugate gradient method
Definition solvers.hh:193
│ │ │ │ -
CGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
Constructor to initialize a CG solver.
Definition solvers.hh:256
│ │ │ │ -
static constexpr bool enableConditionEstimate
Definition solvers.hh:208
│ │ │ │ -
CGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
Constructor to initialize a CG solver.
Definition solvers.hh:239
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:279
│ │ │ │ -
CGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
Constructor to initialize a CG solver.
Definition solvers.hh:222
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:412
│ │ │ │ -
Bi-conjugate Gradient Stabilized (BiCG-STAB)
Definition solvers.hh:419
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< CountType > Iteration
Definition solvers.hh:598
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:439
│ │ │ │ -
Minimal Residual Method (MINRES)
Definition solvers.hh:609
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:627
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:808
│ │ │ │ -
implements the Generalized Minimal Residual (GMRes) method
Definition solvers.hh:827
│ │ │ │ -
RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solvers.hh:878
│ │ │ │ -
std::enable_if<!std::is_same< field_type, real_type >::value, T >::type conjugate(const T &t)
Definition solvers.hh:1067
│ │ │ │ -
RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Definition solvers.hh:883
│ │ │ │ -
void update(X &w, int i, const std::vector< std::vector< field_type, fAlloc > > &H, const std::vector< field_type, fAlloc > &s, const std::vector< X > &v)
Definition solvers.hh:1039
│ │ │ │ -
std::enable_if< std::is_same< field_type, real_type >::value, T >::type conjugate(const T &t)
Definition solvers.hh:1062
│ │ │ │ -
ReboundAllocatorType< X, field_type > fAlloc
field_type Allocator retrieved from domain type
Definition solvers.hh:838
│ │ │ │ -
int _restart
Definition solvers.hh:1120
│ │ │ │ -
ReboundAllocatorType< X, real_type > rAlloc
real_type Allocator retrieved from domain type
Definition solvers.hh:840
│ │ │ │ -
virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:923
│ │ │ │ -
RestartedGMResSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int maxit, int verbose)
Set up RestartedGMResSolver solver.
Definition solvers.hh:850
│ │ │ │ -
RestartedGMResSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int maxit, int verbose)
Set up RestartedGMResSolver solver.
Definition solvers.hh:861
│ │ │ │ -
void generatePlaneRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
Definition solvers.hh:1073
│ │ │ │ -
RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, Y > > prec, scalar_real_type reduction, int restart, int maxit, int verbose)
Set up RestartedGMResSolver solver.
Definition solvers.hh:894
│ │ │ │ -
virtual void apply(X &x, Y &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:910
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:1119
│ │ │ │ -
void applyPlaneRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
Definition solvers.hh:1106
│ │ │ │ -
implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned)
Definition solvers.hh:1139
│ │ │ │ -
void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) override
Apply inverse operator.
Definition solvers.hh:1169
│ │ │ │ -
Generalized preconditioned conjugate gradient solver.
Definition solvers.hh:1307
│ │ │ │ -
GeneralizedPCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)
Set up nonlinear preconditioned conjugate gradient solver.
Definition solvers.hh:1343
│ │ │ │ -
GeneralizedPCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)
Set up nonlinear preconditioned conjugate gradient solver.
Definition solvers.hh:1331
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:1391
│ │ │ │ -
GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solvers.hh:1361
│ │ │ │ -
GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)
Set up nonlinear preconditioned conjugate gradient solver.
Definition solvers.hh:1377
│ │ │ │ -
GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Definition solvers.hh:1366
│ │ │ │ -
Accelerated flexible conjugate gradient method.
Definition solvers.hh:1501
│ │ │ │ -
RestartedFCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)
Constructor to initialize a RestartedFCG solver.
Definition solvers.hh:1519
│ │ │ │ -
RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config)
Constructor.
Definition solvers.hh:1559
│ │ │ │ -
RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)
Constructor to initialize a RestartedFCG solver.
Definition solvers.hh:1539
│ │ │ │ -
int _mmax
Definition solvers.hh:1662
│ │ │ │ -
RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config)
Definition solvers.hh:1565
│ │ │ │ -
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:1669
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:1584
│ │ │ │ -
RestartedFCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)
Constructor to initialize a RestartedFCG solver.
Definition solvers.hh:1529
│ │ │ │ -
Complete flexible conjugate gradient method.
Definition solvers.hh:1680
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res) override
Apply inverse operator.
Definition solvers.hh:1694
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │ +
Definition matrixredistribute.hh:22
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ +
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ +
Definition galerkin.hh:99
│ │ │ │ +
Definition galerkin.hh:118
│ │ │ │ +
Definition globalaggregates.hh:131
│ │ │ │ +
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ +
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ +
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:988
│ │ │ │ +
Definition graphcreator.hh:22
│ │ │ │ +
A hierarchy of containers (e.g. matrices or vectors)
Definition hierarchy.hh:40
│ │ │ │ +
LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ +
LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const MatrixOperator > ConstIterator
Type of the const iterator.
Definition hierarchy.hh:219
│ │ │ │ +
Definition indicescoarsener.hh:36
│ │ │ │ +
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ +
typename std::allocator_traits< Allocator >::template rebind_alloc< AggregatesMap * > AAllocator
Allocator for pointers.
Definition matrixhierarchy.hh:85
│ │ │ │ +
Dune::Amg::Hierarchy< ParallelInformation, Allocator > ParallelInformationHierarchy
The type of the parallel informarion hierarchy.
Definition matrixhierarchy.hh:82
│ │ │ │ +
std::list< AggregatesMap *, AAllocator > AggregatesMapList
The type of the aggregates maps list.
Definition matrixhierarchy.hh:88
│ │ │ │ +
PI ParallelInformation
The type of the index set.
Definition matrixhierarchy.hh:70
│ │ │ │ +
Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy
The type of the parallel matrix hierarchy.
Definition matrixhierarchy.hh:79
│ │ │ │ +
A Allocator
The allocator to use.
Definition matrixhierarchy.hh:73
│ │ │ │ +
RedistributeInformation< ParallelInformation > RedistributeInfoType
The type of the redistribute information.
Definition matrixhierarchy.hh:91
│ │ │ │ +
double getProlongationDampingFactor() const
Definition matrixhierarchy.hh:188
│ │ │ │ +
typename std::allocator_traits< Allocator >::template rebind_alloc< RedistributeInfoType > RILAllocator
Allocator for RedistributeInfoType.
Definition matrixhierarchy.hh:94
│ │ │ │ +
std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList
The type of the list of redistribute information.
Definition matrixhierarchy.hh:97
│ │ │ │ +
Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > AggregatesMap
The type of the aggregates map we use.
Definition matrixhierarchy.hh:76
│ │ │ │ +
MatrixOperator::matrix_type Matrix
The type of the matrix.
Definition matrixhierarchy.hh:67
│ │ │ │ +
M MatrixOperator
The type of the matrix operator.
Definition matrixhierarchy.hh:64
│ │ │ │ +
void operator()(const matrix_row &row)
Definition matrixhierarchy.hh:254
│ │ │ │ +
Matrix::row_type matrix_row
Definition matrixhierarchy.hh:245
│ │ │ │ +
size_type min
Definition matrixhierarchy.hh:261
│ │ │ │ + │ │ │ │ +
size_type max
Definition matrixhierarchy.hh:262
│ │ │ │ +
size_type sum
Definition matrixhierarchy.hh:263
│ │ │ │ +
Matrix::size_type size_type
Definition matrixhierarchy.hh:244
│ │ │ │ +
The criterion describing the stop criteria for the coarsening process.
Definition matrixhierarchy.hh:283
│ │ │ │ +
CoarsenCriterion(const Dune::Amg::Parameters &parms)
Definition matrixhierarchy.hh:306
│ │ │ │ +
T AggregationCriterion
The criterion for tagging connections as strong and nodes as isolated. This might be e....
Definition matrixhierarchy.hh:289
│ │ │ │ +
CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition matrixhierarchy.hh:301
│ │ │ │ +
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
Tag idnetifying the visited property of a vertex.
Definition properties.hh:29
│ │ │ │ +
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ +
Definition transfer.hh:32
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1929 +1,1288 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -solvers.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +matrixhierarchy.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_ISTL_SOLVERS_HH │ │ │ │ │ -7#define DUNE_ISTL_SOLVERS_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23 │ │ │ │ │ -24#include <_d_u_n_e_/_i_s_t_l_/_a_l_l_o_c_a_t_o_r_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_i_s_t_l_/_e_i_g_e_n_v_a_l_u_e_/_a_r_p_a_c_k_p_p_._h_h> │ │ │ │ │ -27#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -28#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -29#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h> │ │ │ │ │ -30#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ -31#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ -32#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ -33 │ │ │ │ │ -34namespace _D_u_n_e { │ │ │ │ │ -46 //===================================================================== │ │ │ │ │ -47 // Implementation of this interface │ │ │ │ │ -48 //===================================================================== │ │ │ │ │ -49 │ │ │ │ │ -58 template │ │ │ │ │ -_5_9 class _L_o_o_p_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ -60 public: │ │ │ │ │ -61 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -62 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -63 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -64 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH │ │ │ │ │ +6#define DUNE_AMG_MATRIXHIERARCHY_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +11#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +12#include "_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ +13#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ +14#include "_g_r_a_p_h_c_r_e_a_t_o_r_._h_h" │ │ │ │ │ +15#include "_h_i_e_r_a_r_c_h_y_._h_h" │ │ │ │ │ +16#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +17#include │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_d_e_p_e_n_d_e_n_c_y_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_r_a_p_h_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_i_n_d_i_c_e_s_c_o_a_r_s_e_n_e_r_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_l_o_b_a_l_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ +27 │ │ │ │ │ +28namespace _D_u_n_e │ │ │ │ │ +29{ │ │ │ │ │ +30 namespace Amg │ │ │ │ │ +31 { │ │ │ │ │ +42 enum { │ │ │ │ │ +50 _M_A_X___P_R_O_C_E_S_S_E_S = 72000 │ │ │ │ │ +_5_1 }; │ │ │ │ │ +52 │ │ │ │ │ +59 template > │ │ │ │ │ +_6_0 class _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +61 { │ │ │ │ │ +62 public: │ │ │ │ │ +_6_4 typedef M _M_a_t_r_i_x_O_p_e_r_a_t_o_r; │ │ │ │ │ 65 │ │ │ │ │ -66 // copy base class constructors │ │ │ │ │ -67 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +_6_7 typedef typename MatrixOperator::matrix_type _M_a_t_r_i_x; │ │ │ │ │ 68 │ │ │ │ │ -69 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -70 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +_7_0 typedef PI _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ 71 │ │ │ │ │ -_7_3 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -74 { │ │ │ │ │ -75 _I_t_e_r_a_t_i_o_n iteration(*this, res); │ │ │ │ │ -76 ___p_r_e_c->pre(x,b); │ │ │ │ │ +_7_3 typedef A _A_l_l_o_c_a_t_o_r; │ │ │ │ │ +74 │ │ │ │ │ +_7_6 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_>_:_: │ │ │ │ │ +_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r> _A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ 77 │ │ │ │ │ -78 // overwrite b with defect │ │ │ │ │ -79 ___o_p->applyscaleadd(-1,x,b); │ │ │ │ │ +_7_9 typedef _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_A_l_l_o_c_a_t_o_r_> │ │ │ │ │ +_P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y; │ │ │ │ │ 80 │ │ │ │ │ -81 // compute norm, \todo parallelization │ │ │ │ │ -82 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); │ │ │ │ │ -83 if(iteration.step(0, def)){ │ │ │ │ │ -84 ___p_r_e_c->post(x); │ │ │ │ │ -85 return; │ │ │ │ │ -86 } │ │ │ │ │ -87 // prepare preconditioner │ │ │ │ │ -88 │ │ │ │ │ -89 // allocate correction vector │ │ │ │ │ -90 X v(x); │ │ │ │ │ -91 │ │ │ │ │ -92 // iteration loop │ │ │ │ │ -93 int i=1; │ │ │ │ │ -94 for ( ; i<=___m_a_x_i_t; i++ ) │ │ │ │ │ -95 { │ │ │ │ │ -96 v = 0; // clear correction │ │ │ │ │ -97 ___p_r_e_c->apply(v,b); // apply preconditioner │ │ │ │ │ -98 x += v; // update solution │ │ │ │ │ -99 ___o_p->applyscaleadd(-1,v,b); // update defect │ │ │ │ │ -100 def=___s_p->norm(b); // comp defect norm │ │ │ │ │ -101 if(iteration.step(i, def)) │ │ │ │ │ -102 break; │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -105 // postprocess preconditioner │ │ │ │ │ -106 ___p_r_e_c->post(x); │ │ │ │ │ -107 } │ │ │ │ │ +_8_2 typedef _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_A_l_l_o_c_a_t_o_r_> │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ +83 │ │ │ │ │ +_8_5 using _A_A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ +rebind_alloc; │ │ │ │ │ +86 │ │ │ │ │ +_8_8 typedef std::list _A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t; │ │ │ │ │ +89 │ │ │ │ │ +_9_1 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e; │ │ │ │ │ +92 │ │ │ │ │ +_9_4 using _R_I_L_A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ +rebind_alloc; │ │ │ │ │ +95 │ │ │ │ │ +_9_7 typedef std::list _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t; │ │ │ │ │ +98 │ │ │ │ │ +104 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y(std::shared_ptr fineMatrix, │ │ │ │ │ +105 std::shared_ptr pinfo = std:: │ │ │ │ │ +make_shared()); │ │ │ │ │ +106 │ │ │ │ │ +107 _~_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y(); │ │ │ │ │ 108 │ │ │ │ │ -109 protected: │ │ │ │ │ -110 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -111 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -112 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -113 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -114 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -115 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -_1_1_6 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ -117 }; │ │ │ │ │ -_1_1_8 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("loopsolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -119 │ │ │ │ │ -120 │ │ │ │ │ -121 // all these solvers are taken from the SUMO library │ │ │ │ │ -123 template │ │ │ │ │ -_1_2_4 class _G_r_a_d_i_e_n_t_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ -125 public: │ │ │ │ │ -126 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -127 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -128 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -129 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -130 │ │ │ │ │ -131 // copy base class constructors │ │ │ │ │ -132 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +114 template │ │ │ │ │ +115 void _b_u_i_l_d(const T& criterion); │ │ │ │ │ +116 │ │ │ │ │ +124 template │ │ │ │ │ +125 void _r_e_c_a_l_c_u_l_a_t_e_G_a_l_e_r_k_i_n(const F& copyFlags); │ │ │ │ │ +126 │ │ │ │ │ +131 template │ │ │ │ │ +132 void _c_o_a_r_s_e_n_V_e_c_t_o_r(_H_i_e_r_a_r_c_h_y<_B_l_o_c_k_V_e_c_t_o_r_<_V_,_B_A_>, TA>& hierarchy) const; │ │ │ │ │ 133 │ │ │ │ │ -134 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -135 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -136 │ │ │ │ │ -_1_4_2 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -143 { │ │ │ │ │ -144 _I_t_e_r_a_t_i_o_n iteration(*this, res); │ │ │ │ │ -145 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ -146 │ │ │ │ │ -147 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defec │ │ │ │ │ +139 template │ │ │ │ │ +140 void _c_o_a_r_s_e_n_S_m_o_o_t_h_e_r(_H_i_e_r_a_r_c_h_y_<_S_,_T_A_>& smoothers, │ │ │ │ │ +141 const typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_>_:_:_A_r_g_u_m_e_n_t_s& args) const; │ │ │ │ │ +142 │ │ │ │ │ +147 std::size_t _l_e_v_e_l_s() const; │ │ │ │ │ 148 │ │ │ │ │ -149 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ -150 if(iteration.step(0, def)){ │ │ │ │ │ -151 ___p_r_e_c->post(x); │ │ │ │ │ -152 return; │ │ │ │ │ -153 } │ │ │ │ │ +153 std::size_t _m_a_x_l_e_v_e_l_s() const; │ │ │ │ │ 154 │ │ │ │ │ -155 X p(x); // create local vectors │ │ │ │ │ -156 X q(b); │ │ │ │ │ -157 │ │ │ │ │ -158 int i=1; // loop variables │ │ │ │ │ -159 _f_i_e_l_d___t_y_p_e lambda; │ │ │ │ │ -160 for ( ; i<=___m_a_x_i_t; i++ ) │ │ │ │ │ -161 { │ │ │ │ │ -162 p = 0; // clear correction │ │ │ │ │ -163 ___p_r_e_c->apply(p,b); // apply preconditioner │ │ │ │ │ -164 ___o_p->apply(p,q); // q=Ap │ │ │ │ │ -165 auto alpha = ___s_p->dot(q,p); │ │ │ │ │ -166 lambda = Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -167 _f_i_e_l_d___t_y_p_e(0.), // no need for minimization if def is already 0 │ │ │ │ │ -168 ___s_p->dot(p,b)/alpha); // minimization │ │ │ │ │ -169 x.axpy(lambda,p); // update solution │ │ │ │ │ -170 b.axpy(-lambda,q); // update defect │ │ │ │ │ -171 │ │ │ │ │ -172 def =___s_p->norm(b); // comp defect norm │ │ │ │ │ -173 if(iteration.step(i, def)) │ │ │ │ │ -174 break; │ │ │ │ │ -175 } │ │ │ │ │ -176 // postprocess preconditioner │ │ │ │ │ -177 ___p_r_e_c->post(x); │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -180 protected: │ │ │ │ │ -181 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -182 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -183 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -184 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -185 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -186 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -_1_8_7 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ -188 }; │ │ │ │ │ -_1_8_9 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("gradientsolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -190 │ │ │ │ │ -192 template │ │ │ │ │ -_1_9_3 class _C_G_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ -194 public: │ │ │ │ │ -195 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -196 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -197 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -198 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -199 │ │ │ │ │ -200 // copy base class constructors │ │ │ │ │ -201 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ -202 │ │ │ │ │ -203 private: │ │ │ │ │ -204 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ -205 │ │ │ │ │ -206 protected: │ │ │ │ │ -207 │ │ │ │ │ -_2_0_8 static constexpr bool _e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e = (std:: │ │ │ │ │ -is_same_v || std::is_same_v); │ │ │ │ │ -209 │ │ │ │ │ -210 public: │ │ │ │ │ -211 │ │ │ │ │ -212 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -213 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -214 │ │ │ │ │ -_2_2_2 _C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, │ │ │ │ │ -223 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, bool │ │ │ │ │ -condition_estimate) : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, prec, reduction, maxit, │ │ │ │ │ -verbose), │ │ │ │ │ -224 condition_estimate_(condition_estimate) │ │ │ │ │ -225 { │ │ │ │ │ -226 if (condition_estimate && !_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) { │ │ │ │ │ -227 condition_estimate_ = false; │ │ │ │ │ -228 std::cerr << "WARNING: Condition estimate was disabled. It is only │ │ │ │ │ -available for double and float field types!" << std::endl; │ │ │ │ │ -229 } │ │ │ │ │ -230 } │ │ │ │ │ +155 bool _h_a_s_C_o_a_r_s_e_s_t() const; │ │ │ │ │ +156 │ │ │ │ │ +161 bool _i_s_B_u_i_l_t() const; │ │ │ │ │ +162 │ │ │ │ │ +167 const _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y& _m_a_t_r_i_c_e_s() const; │ │ │ │ │ +168 │ │ │ │ │ +173 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y& _p_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n() const; │ │ │ │ │ +174 │ │ │ │ │ +179 const _A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t& _a_g_g_r_e_g_a_t_e_s_M_a_p_s() const; │ │ │ │ │ +180 │ │ │ │ │ +186 const _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t& _r_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n() const; │ │ │ │ │ +187 │ │ │ │ │ +_1_8_8 double _g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r() const │ │ │ │ │ +189 { │ │ │ │ │ +190 return prolongDamp_; │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +203 void _g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_s_O_n_F_i_n_e_s_t(std::vector& data) const; │ │ │ │ │ +204 │ │ │ │ │ +205 private: │ │ │ │ │ +206 typedef typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_a_t_r_i_x_O_p_e_r_a_t_o_r_>_:_:_A_r_g_u_m_e_n_t_s MatrixArgs; │ │ │ │ │ +207 typedef typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +CommunicationArgs; │ │ │ │ │ +209 _A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t aggregatesMaps_; │ │ │ │ │ +211 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t redistributes_; │ │ │ │ │ +213 _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y matrices_; │ │ │ │ │ +215 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y parallelInformation_; │ │ │ │ │ +216 │ │ │ │ │ +218 bool built_; │ │ │ │ │ +219 │ │ │ │ │ +221 int maxlevels_; │ │ │ │ │ +222 │ │ │ │ │ +223 double prolongDamp_; │ │ │ │ │ +224 │ │ │ │ │ +228 template │ │ │ │ │ +229 struct MatrixStats │ │ │ │ │ +230 { │ │ │ │ │ 231 │ │ │ │ │ -_2_3_9 _C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, const _S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, │ │ │ │ │ -_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, │ │ │ │ │ -240 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, bool │ │ │ │ │ -condition_estimate) : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, │ │ │ │ │ -verbose), │ │ │ │ │ -241 condition_estimate_(condition_estimate) │ │ │ │ │ -242 { │ │ │ │ │ -243 if (condition_estimate && !(std::is_same::value || std:: │ │ │ │ │ -is_same::value)) { │ │ │ │ │ -244 condition_estimate_ = false; │ │ │ │ │ -245 std::cerr << "WARNING: Condition estimate was disabled. It is only │ │ │ │ │ -available for double and float field types!" << std::endl; │ │ │ │ │ -246 } │ │ │ │ │ -247 } │ │ │ │ │ -248 │ │ │ │ │ -_2_5_6 _C_G_S_o_l_v_e_r (std::shared_ptr> op, std:: │ │ │ │ │ -shared_ptr<_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>> sp, │ │ │ │ │ -257 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ -258 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, bool │ │ │ │ │ -condition_estimate) │ │ │ │ │ -259 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, verbose), │ │ │ │ │ -260 condition_estimate_(condition_estimate) │ │ │ │ │ -261 { │ │ │ │ │ -262 if (condition_estimate && !(std::is_same::value || std:: │ │ │ │ │ -is_same::value)) { │ │ │ │ │ -263 condition_estimate_ = false; │ │ │ │ │ -264 std::cerr << "WARNING: Condition estimate was disabled. It is only │ │ │ │ │ -available for double and float field types!" << std::endl; │ │ │ │ │ -265 } │ │ │ │ │ -266 } │ │ │ │ │ -267 │ │ │ │ │ -_2_7_9 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -280 { │ │ │ │ │ -281 _I_t_e_r_a_t_i_o_n iteration(*this,res); │ │ │ │ │ -282 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ -283 │ │ │ │ │ -284 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defect │ │ │ │ │ -285 │ │ │ │ │ -286 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ -287 if(iteration.step(0, def)){ │ │ │ │ │ -288 ___p_r_e_c->post(x); │ │ │ │ │ -289 return; │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -292 X p(x); // the search direction │ │ │ │ │ -293 X q(x); // a temporary vector │ │ │ │ │ -294 │ │ │ │ │ -295 // Remember lambda and beta values for condition estimate │ │ │ │ │ -296 std::vector lambdas(0); │ │ │ │ │ -297 std::vector betas(0); │ │ │ │ │ -298 │ │ │ │ │ -299 // some local variables │ │ │ │ │ -300 _f_i_e_l_d___t_y_p_e rho,rholast,lambda,alpha,beta; │ │ │ │ │ -301 │ │ │ │ │ -302 // determine initial search direction │ │ │ │ │ -303 p = 0; // clear correction │ │ │ │ │ -304 ___p_r_e_c->apply(p,b); // apply preconditioner │ │ │ │ │ -305 rholast = ___s_p->dot(p,b); // orthogonalization │ │ │ │ │ -306 │ │ │ │ │ -307 // the loop │ │ │ │ │ -308 int i=1; │ │ │ │ │ -309 for ( ; i<=___m_a_x_i_t; i++ ) │ │ │ │ │ -310 { │ │ │ │ │ -311 // minimize in given search direction p │ │ │ │ │ -312 ___o_p->apply(p,q); // q=Ap │ │ │ │ │ -313 alpha = ___s_p->dot(p,q); // scalar product │ │ │ │ │ -314 lambda = Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), _f_i_e_l_d___t_y_p_e(0.), rholast/alpha); / │ │ │ │ │ -/ minimization │ │ │ │ │ -315 if constexpr (_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) │ │ │ │ │ -316 if (condition_estimate_) │ │ │ │ │ -317 lambdas.push_back(std::real(lambda)); │ │ │ │ │ -318 x.axpy(lambda,p); // update solution │ │ │ │ │ -319 b.axpy(-lambda,q); // update defect │ │ │ │ │ -320 │ │ │ │ │ -321 // convergence test │ │ │ │ │ -322 def=___s_p->norm(b); // comp defect norm │ │ │ │ │ -323 if(iteration.step(i, def)) │ │ │ │ │ -324 break; │ │ │ │ │ -325 │ │ │ │ │ -326 // determine new search direction │ │ │ │ │ -327 q = 0; // clear correction │ │ │ │ │ -328 ___p_r_e_c->apply(q,b); // apply preconditioner │ │ │ │ │ -329 rho = ___s_p->dot(q,b); // orthogonalization │ │ │ │ │ -330 beta = Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), _f_i_e_l_d___t_y_p_e(0.), rho/rholast); / │ │ │ │ │ -/ scaling factor │ │ │ │ │ -331 if constexpr (_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) │ │ │ │ │ -332 if (condition_estimate_) │ │ │ │ │ -333 betas.push_back(std::real(beta)); │ │ │ │ │ -334 p *= beta; // scale old search direction │ │ │ │ │ -335 p += q; // orthogonalization with correction │ │ │ │ │ -336 rholast = rho; // remember rho for recurrence │ │ │ │ │ -337 } │ │ │ │ │ -338 │ │ │ │ │ -339 ___p_r_e_c->post(x); // postprocess preconditioner │ │ │ │ │ -340 │ │ │ │ │ -341 if (condition_estimate_) { │ │ │ │ │ -342#if HAVE_ARPACKPP │ │ │ │ │ -343 if constexpr (_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) { │ │ │ │ │ -344 using std::sqrt; │ │ │ │ │ -345 │ │ │ │ │ -346 // Build T matrix which has extreme eigenvalues approximating │ │ │ │ │ -347 // those of the original system │ │ │ │ │ -348 // (see Y. Saad, Iterative methods for sparse linear systems) │ │ │ │ │ -349 │ │ │ │ │ -350 _C_O_N_D___M_A_T T(i, i, _C_O_N_D___M_A_T_:_:_r_o_w___w_i_s_e); │ │ │ │ │ -351 │ │ │ │ │ -352 for (auto row = T._c_r_e_a_t_e_b_e_g_i_n(); row != T._c_r_e_a_t_e_e_n_d(); ++row) { │ │ │ │ │ -353 if (row.index() > 0) │ │ │ │ │ -354 row.insert(row.index()-1); │ │ │ │ │ -355 row.insert(row.index()); │ │ │ │ │ -356 if (row.index() < T._N() - 1) │ │ │ │ │ -357 row.insert(row.index()+1); │ │ │ │ │ -358 } │ │ │ │ │ -359 for (int row = 0; row < i; ++row) { │ │ │ │ │ -360 if (row > 0) { │ │ │ │ │ -361 T[row][row-1] = sqrt(betas[row-1]) / lambdas[row-1]; │ │ │ │ │ -362 } │ │ │ │ │ -363 │ │ │ │ │ -364 T[row][row] = 1.0 / lambdas[row]; │ │ │ │ │ -365 if (row > 0) { │ │ │ │ │ -366 T[row][row] += betas[row-1] / lambdas[row-1]; │ │ │ │ │ -367 } │ │ │ │ │ -368 │ │ │ │ │ -369 if (row < i - 1) { │ │ │ │ │ -370 T[row][row+1] = sqrt(betas[row]) / lambdas[row]; │ │ │ │ │ -371 } │ │ │ │ │ -372 } │ │ │ │ │ -373 │ │ │ │ │ -374 // Compute largest and smallest eigenvalue of T matrix and return as │ │ │ │ │ -estimate │ │ │ │ │ -375 _D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_<_C_O_N_D___M_A_T_,_ _C_O_N_D___V_E_C_> arpack(T); │ │ │ │ │ -376 │ │ │ │ │ -377 _r_e_a_l___t_y_p_e eps = 0.0; │ │ │ │ │ -378 _C_O_N_D___V_E_C eigv; │ │ │ │ │ -379 _r_e_a_l___t_y_p_e min_eigv, max_eigv; │ │ │ │ │ -380 arpack._c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e (eps, eigv, min_eigv); │ │ │ │ │ -381 arpack._c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e (eps, eigv, max_eigv); │ │ │ │ │ -382 │ │ │ │ │ -383 res._c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e = max_eigv / min_eigv; │ │ │ │ │ -384 │ │ │ │ │ -385 if (this->___v_e_r_b_o_s_e > 0) { │ │ │ │ │ -386 std::cout << "Min eigv estimate: " << Simd::io(min_eigv) << '\n'; │ │ │ │ │ -387 std::cout << "Max eigv estimate: " << Simd::io(max_eigv) << '\n'; │ │ │ │ │ -388 std::cout << "Condition estimate: " │ │ │ │ │ -389 << Simd::io(max_eigv / min_eigv) << std::endl; │ │ │ │ │ -390 } │ │ │ │ │ -391 } │ │ │ │ │ -392#else │ │ │ │ │ -393 std::cerr << "WARNING: Condition estimate was requested. This requires │ │ │ │ │ -ARPACK, but ARPACK was not found!" << std::endl; │ │ │ │ │ -394#endif │ │ │ │ │ -395 } │ │ │ │ │ +235 static void stats([[maybe_unused]] const _M_a_t_r_i_x& matrix) │ │ │ │ │ +236 {} │ │ │ │ │ +237 }; │ │ │ │ │ +238 │ │ │ │ │ +239 template │ │ │ │ │ +240 struct MatrixStats<_M_a_t_r_i_x,true> │ │ │ │ │ +241 { │ │ │ │ │ +_2_4_2 struct calc │ │ │ │ │ +243 { │ │ │ │ │ +_2_4_4 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +_2_4_5 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _m_a_t_r_i_x___r_o_w; │ │ │ │ │ +246 │ │ │ │ │ +_2_4_7 _c_a_l_c() │ │ │ │ │ +248 { │ │ │ │ │ +249 min=std::numeric_limits::max(); │ │ │ │ │ +250 max=0; │ │ │ │ │ +251 sum=0; │ │ │ │ │ +252 } │ │ │ │ │ +253 │ │ │ │ │ +_2_5_4 void _o_p_e_r_a_t_o_r_(_)(const _m_a_t_r_i_x___r_o_w& row) │ │ │ │ │ +255 { │ │ │ │ │ +256 min=std::min(min, row.size()); │ │ │ │ │ +257 max=std::max(max, row.size()); │ │ │ │ │ +258 sum += row.size(); │ │ │ │ │ +259 } │ │ │ │ │ +260 │ │ │ │ │ +_2_6_1 _s_i_z_e___t_y_p_e _m_i_n; │ │ │ │ │ +_2_6_2 _s_i_z_e___t_y_p_e _m_a_x; │ │ │ │ │ +_2_6_3 _s_i_z_e___t_y_p_e _s_u_m; │ │ │ │ │ +264 }; │ │ │ │ │ +268 static void stats(const _M_a_t_r_i_x& matrix) │ │ │ │ │ +269 { │ │ │ │ │ +270 calc c= for_each(matrix.begin(), matrix.end(), calc()); │ │ │ │ │ +271 dinfo<<"Matrix row: min="< │ │ │ │ │ +_3_2_6 bool _r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(const M& origMatrix, │ │ │ │ │ +327 std::shared_ptr newMatrix, │ │ │ │ │ +328 C& origComm, │ │ │ │ │ +329 std::shared_ptr& newComm, │ │ │ │ │ +330 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri, │ │ │ │ │ +331 int nparts, C1& criterion) │ │ │ │ │ +332 { │ │ │ │ │ +333 Timer time; │ │ │ │ │ +334#ifdef AMG_REPART_ON_COMM_GRAPH │ │ │ │ │ +335 // Done not repartition the matrix graph, but a graph of the communication │ │ │ │ │ +scheme. │ │ │ │ │ +336 bool existentOnRedist=_D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(origMatrix, origComm, │ │ │ │ │ +nparts, newComm, │ │ │ │ │ +337 ri.getInterface(), │ │ │ │ │ +338 criterion.debugLevel()>1); │ │ │ │ │ +339 │ │ │ │ │ +340#else │ │ │ │ │ +341 typedef _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_> _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ +342 typedef _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h, │ │ │ │ │ +343 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +344 _E_d_g_e_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +345 IdentityMap, │ │ │ │ │ +346 IdentityMap> _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ +347 _M_a_t_r_i_x_G_r_a_p_h graph(origMatrix); │ │ │ │ │ +348 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h pgraph(graph); │ │ │ │ │ +349 _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(pgraph, origMatrix, criterion, false); │ │ │ │ │ +350 │ │ │ │ │ +351#ifdef DEBUG_REPART │ │ │ │ │ +352 if(origComm.communicator().rank()==0) │ │ │ │ │ +353 std::cout<<"Original matrix"<1); │ │ │ │ │ +360#endif // if else AMG_REPART │ │ │ │ │ +361 │ │ │ │ │ +362 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1) │ │ │ │ │ +363 std::cout<<"Repartitioning took "<indexSet(), │ │ │ │ │ +origComm.communicator()); │ │ │ │ │ +369#endif │ │ │ │ │ +370 │ │ │ │ │ +371 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(const_cast(origMatrix), *newMatrix, origComm, │ │ │ │ │ +*newComm, ri); │ │ │ │ │ +372 │ │ │ │ │ +373#ifdef DEBUG_REPART │ │ │ │ │ +374 if(origComm.communicator().rank()==0) │ │ │ │ │ +375 std::cout<<"Original matrix"<communicator().size()>0) │ │ │ │ │ +378 _p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x(*newMatrix, *newComm, std::cout); │ │ │ │ │ +379 origComm.communicator().barrier(); │ │ │ │ │ +380#endif │ │ │ │ │ +381 │ │ │ │ │ +382 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1) │ │ │ │ │ +383 std::cout<<"Redistributing matrix took "< │ │ │ │ │ +_3_8_9 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y(std::shared_ptr │ │ │ │ │ +fineMatrix, │ │ │ │ │ +390 std::shared_ptr pinfo) │ │ │ │ │ +391 : matrices_(fineMatrix), │ │ │ │ │ +392 parallelInformation_(pinfo) │ │ │ │ │ +393 { │ │ │ │ │ +394 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*fineMatrix) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +(*pinfo)) │ │ │ │ │ +395 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "MatrixOperator and ParallelInformation must belong │ │ │ │ │ +to the same category!"); │ │ │ │ │ 396 } │ │ │ │ │ 397 │ │ │ │ │ -398 private: │ │ │ │ │ -399 bool condition_estimate_ = false; │ │ │ │ │ -400 │ │ │ │ │ -401 // Matrix and vector types used for condition estimate │ │ │ │ │ -402 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_r_e_a_l___t_y_p_e_,_1_,_1_> > COND_MAT; │ │ │ │ │ -403 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_r_e_a_l___t_y_p_e_,_1_> > COND_VEC; │ │ │ │ │ -404 │ │ │ │ │ -405 protected: │ │ │ │ │ -406 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -407 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -408 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -409 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -410 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -411 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -_4_1_2 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ -413 }; │ │ │ │ │ -_4_1_4 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("cgsolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -415 │ │ │ │ │ -416 // Ronald Kriemanns BiCG-STAB implementation from Sumo │ │ │ │ │ -418 template │ │ │ │ │ -_4_1_9 class _B_i_C_G_S_T_A_B_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ -420 public: │ │ │ │ │ -421 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -422 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -423 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -424 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -425 │ │ │ │ │ -426 // copy base class constructors │ │ │ │ │ -427 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ -428 │ │ │ │ │ -429 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -430 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -431 │ │ │ │ │ -_4_3_9 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -440 { │ │ │ │ │ -441 using std::abs; │ │ │ │ │ -442 const Simd::Scalar EPSILON=1e-80; │ │ │ │ │ -443 using std::abs; │ │ │ │ │ -444 double it; │ │ │ │ │ -445 _f_i_e_l_d___t_y_p_e rho, rho_new, alpha, beta, h, omega; │ │ │ │ │ -446 _r_e_a_l___t_y_p_e norm; │ │ │ │ │ -447 │ │ │ │ │ -448 // │ │ │ │ │ -449 // get vectors and matrix │ │ │ │ │ -450 // │ │ │ │ │ -451 X& r=b; │ │ │ │ │ -452 X p(x); │ │ │ │ │ -453 X v(x); │ │ │ │ │ -454 X t(x); │ │ │ │ │ -455 X y(x); │ │ │ │ │ -456 X rt(x); │ │ │ │ │ -457 │ │ │ │ │ -458 // │ │ │ │ │ -459 // begin iteration │ │ │ │ │ -460 // │ │ │ │ │ -461 │ │ │ │ │ -462 // r = r - Ax; rt = r │ │ │ │ │ -463 _I_t_e_r_a_t_i_o_n_<_d_o_u_b_l_e_> iteration(*this,res); │ │ │ │ │ -464 ___p_r_e_c->pre(x,r); // prepare preconditioner │ │ │ │ │ -465 │ │ │ │ │ -466 ___o_p->applyscaleadd(-1,x,r); // overwrite b with defect │ │ │ │ │ -467 │ │ │ │ │ -468 rt=r; │ │ │ │ │ -469 │ │ │ │ │ -470 norm = ___s_p->norm(r); │ │ │ │ │ -471 if(iteration.step(0, norm)){ │ │ │ │ │ -472 ___p_r_e_c->post(x); │ │ │ │ │ -473 return; │ │ │ │ │ -474 } │ │ │ │ │ -475 p=0; │ │ │ │ │ -476 v=0; │ │ │ │ │ -477 │ │ │ │ │ -478 rho = 1; │ │ │ │ │ -479 alpha = 1; │ │ │ │ │ -480 omega = 1; │ │ │ │ │ -481 │ │ │ │ │ -482 // │ │ │ │ │ -483 // iteration │ │ │ │ │ -484 // │ │ │ │ │ +398 template │ │ │ │ │ +399 template │ │ │ │ │ +_4_0_0 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_b_u_i_l_d(const T& criterion) │ │ │ │ │ +401 { │ │ │ │ │ +402 prolongDamp_ = criterion.getProlongationDampingFactor(); │ │ │ │ │ +403 typedef O OverlapFlags; │ │ │ │ │ +404 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r MatIterator; │ │ │ │ │ +405 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r PInfoIterator; │ │ │ │ │ +406 │ │ │ │ │ +407 static const int noints=(_D_u_n_e_:_:_A_m_g_:_:_M_A_X___P_R_O_C_E_S_S_E_S/4096>0) ? (_D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ +_M_A_X___P_R_O_C_E_S_S_E_S/4096) : 1; │ │ │ │ │ +408 │ │ │ │ │ +409 typedef bigunsignedint BIGINT; │ │ │ │ │ +410 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> productBuilder; │ │ │ │ │ +411 MatIterator mlevel = matrices_.finest(); │ │ │ │ │ +412 MatrixStats::stats(mlevel->getmat()); │ │ │ │ │ +413 │ │ │ │ │ +414 PInfoIterator infoLevel = parallelInformation_.finest(); │ │ │ │ │ +415 BIGINT finenonzeros=_c_o_u_n_t_N_o_n_Z_e_r_o_s(mlevel->getmat()); │ │ │ │ │ +416 finenonzeros = infoLevel->communicator().sum(finenonzeros); │ │ │ │ │ +417 BIGINT allnonzeros = finenonzeros; │ │ │ │ │ +418 │ │ │ │ │ +419 │ │ │ │ │ +420 int level = 0; │ │ │ │ │ +421 int rank = 0; │ │ │ │ │ +422 │ │ │ │ │ +423 BIGINT unknowns = mlevel->getmat().N(); │ │ │ │ │ +424 │ │ │ │ │ +425 unknowns = infoLevel->communicator().sum(unknowns); │ │ │ │ │ +426 double dunknowns=unknowns.todouble(); │ │ │ │ │ +427 infoLevel->buildGlobalLookup(mlevel->getmat().N()); │ │ │ │ │ +428 redistributes_.push_back(_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e()); │ │ │ │ │ +429 │ │ │ │ │ +430 for(; level < criterion.maxLevel(); ++level, ++mlevel) { │ │ │ │ │ +431 assert(matrices_.levels()==redistributes_.size()); │ │ │ │ │ +432 rank = infoLevel->communicator().rank(); │ │ │ │ │ +433 if(rank==0 && criterion.debugLevel()>1) │ │ │ │ │ +434 std::cout<<"Level "<communicator().size() │ │ │ │ │ +435 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ +()<<")"<communicator().size())) │ │ │ │ │ +448 && infoLevel->communicator().size()>1 && │ │ │ │ │ +449 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget()) │ │ │ │ │ +450 { │ │ │ │ │ +451 // accumulate to fewer processors │ │ │ │ │ +452 std::shared_ptr redistMat = std::make_shared(); │ │ │ │ │ +453 std::shared_ptr redistComm; │ │ │ │ │ +454 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/ │ │ │ │ │ +(criterion.minAggregateSize() │ │ │ │ │ +455 *criterion.coarsenTarget())); │ │ │ │ │ +456 if( nodomains<=criterion.minAggregateSize()/2 || │ │ │ │ │ +457 dunknowns <= criterion.coarsenTarget() ) │ │ │ │ │ +458 nodomains=1; │ │ │ │ │ +459 │ │ │ │ │ +460 bool existentOnNextLevel = │ │ │ │ │ +461 _r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(mlevel->getmat(), redistMat, *infoLevel, │ │ │ │ │ +462 redistComm, redistributes_.back(), nodomains, │ │ │ │ │ +463 criterion); │ │ │ │ │ +464 BIGINT unknownsRedist = redistMat->N(); │ │ │ │ │ +465 unknownsRedist = infoLevel->communicator().sum(unknownsRedist); │ │ │ │ │ +466 dunknowns= unknownsRedist.todouble(); │ │ │ │ │ +467 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) │ │ │ │ │ +468 std::cout<<"Level "<communicator().size() │ │ │ │ │ +469 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ +()<<")"<_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +(args)); │ │ │ │ │ +472 assert(mlevel.isRedistributed()); │ │ │ │ │ +473 infoLevel.addRedistributed(redistComm); │ │ │ │ │ +474 infoLevel->freeGlobalLookup(); │ │ │ │ │ +475 │ │ │ │ │ +476 if(!existentOnNextLevel) │ │ │ │ │ +477 // We do not hold any data on the redistributed partitioning │ │ │ │ │ +478 break; │ │ │ │ │ +479 │ │ │ │ │ +480 // Work on the redistributed Matrix from now on │ │ │ │ │ +481 matrix = &(mlevel.getRedistributed()); │ │ │ │ │ +482 info = &(infoLevel.getRedistributed()); │ │ │ │ │ +483 info->buildGlobalLookup(matrix->getmat().N()); │ │ │ │ │ +484 } │ │ │ │ │ 485 │ │ │ │ │ -486 for (it = 0.5; it < ___m_a_x_i_t; it+=.5) │ │ │ │ │ -487 { │ │ │ │ │ -488 // │ │ │ │ │ -489 // preprocess, set vecsizes etc. │ │ │ │ │ -490 // │ │ │ │ │ -491 │ │ │ │ │ -492 // rho_new = < rt , r > │ │ │ │ │ -493 rho_new = ___s_p->dot(rt,r); │ │ │ │ │ +486 rank = info->communicator().rank(); │ │ │ │ │ +487 if(dunknowns <= criterion.coarsenTarget()) │ │ │ │ │ +488 // No further coarsening needed │ │ │ │ │ +489 break; │ │ │ │ │ +490 │ │ │ │ │ +491 typedef _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> │ │ │ │ │ +GraphCreator; │ │ │ │ │ +492 typedef typename GraphCreator::PropertiesGraph _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ +493 typedef typename GraphCreator::GraphTuple GraphTuple; │ │ │ │ │ 494 │ │ │ │ │ -495 // look if breakdown occurred │ │ │ │ │ -496 if (Simd::allTrue(abs(rho) <= EPSILON)) │ │ │ │ │ -497 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t,"breakdown in BiCGSTAB - rho " │ │ │ │ │ -498 << Simd::io(rho) << " <= EPSILON " << EPSILON │ │ │ │ │ -499 << " after " << it << " iterations"); │ │ │ │ │ -500 if (Simd::allTrue(abs(omega) <= EPSILON)) │ │ │ │ │ -501 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t,"breakdown in BiCGSTAB - omega " │ │ │ │ │ -502 << Simd::io(omega) << " <= EPSILON " << EPSILON │ │ │ │ │ -503 << " after " << it << " iterations"); │ │ │ │ │ +495 typedef typename _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r Vertex; │ │ │ │ │ +496 │ │ │ │ │ +497 std::vector excluded(matrix->getmat().N(), false); │ │ │ │ │ +498 │ │ │ │ │ +499 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, │ │ │ │ │ +OverlapFlags()); │ │ │ │ │ +500 │ │ │ │ │ +501 _A_g_g_r_e_g_a_t_e_s_M_a_p* aggregatesMap=new _A_g_g_r_e_g_a_t_e_s_M_a_p(std::get<1>(graphs)- │ │ │ │ │ +>maxVertex()+1); │ │ │ │ │ +502 │ │ │ │ │ +503 aggregatesMaps_.push_back(aggregatesMap); │ │ │ │ │ 504 │ │ │ │ │ -505 │ │ │ │ │ -506 if (it<1) │ │ │ │ │ -507 p = r; │ │ │ │ │ -508 else │ │ │ │ │ -509 { │ │ │ │ │ -510 beta = Simd::cond(norm==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -511 _f_i_e_l_d___t_y_p_e(0.), // no need for orthogonalization if norm is already 0 │ │ │ │ │ -512 ( rho_new / rho ) * ( alpha / omega )); │ │ │ │ │ -513 p.axpy(-omega,v); // p = r + beta (p - omega*v) │ │ │ │ │ -514 p *= beta; │ │ │ │ │ -515 p += r; │ │ │ │ │ -516 } │ │ │ │ │ -517 │ │ │ │ │ -518 // y = W^-1 * p │ │ │ │ │ -519 y = 0; │ │ │ │ │ -520 ___p_r_e_c->apply(y,p); // apply preconditioner │ │ │ │ │ +505 Timer watch; │ │ │ │ │ +506 watch.reset(); │ │ │ │ │ +507 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] = │ │ │ │ │ +508 aggregatesMap->_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s(matrix->getmat(), *(std::get<1>(graphs)), │ │ │ │ │ +criterion, level==0); │ │ │ │ │ +509 │ │ │ │ │ +510 if(rank==0 && criterion.debugLevel()>2) │ │ │ │ │ +511 std::cout<<" Have built "<communicator().rank(); │ │ │ │ │ +519 int n = UNKNOWNS/procs; // number of unknowns per process │ │ │ │ │ +520 int bigger = UNKNOWNS%procs; // number of process with n+1 unknows │ │ │ │ │ 521 │ │ │ │ │ -522 // v = A * y │ │ │ │ │ -523 ___o_p->apply(y,v); │ │ │ │ │ -524 │ │ │ │ │ -525 // alpha = rho_new / < rt, v > │ │ │ │ │ -526 h = ___s_p->dot(rt,v); │ │ │ │ │ -527 │ │ │ │ │ -528 if ( Simd::allTrue(abs(h) < EPSILON) ) │ │ │ │ │ -529 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t,"abs(h) < EPSILON in BiCGSTAB - abs(h) " │ │ │ │ │ -530 << Simd::io(abs(h)) << " < EPSILON " << EPSILON │ │ │ │ │ -531 << " after " << it << " iterations"); │ │ │ │ │ -532 │ │ │ │ │ -533 alpha = Simd::cond(norm==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -534 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -535 rho_new / h); │ │ │ │ │ +522 // Compute owner region │ │ │ │ │ +523 if(rank0) │ │ │ │ │ +533 overlapStart = start - 1; │ │ │ │ │ +534 else │ │ │ │ │ +535 overlapStart = start; │ │ │ │ │ 536 │ │ │ │ │ -537 // apply first correction to x │ │ │ │ │ -538 // x <- x + alpha y │ │ │ │ │ -539 x.axpy(alpha,y); │ │ │ │ │ -540 │ │ │ │ │ -541 // r = r - alpha*v │ │ │ │ │ -542 r.axpy(-alpha,v); │ │ │ │ │ -543 │ │ │ │ │ -544 // │ │ │ │ │ -545 // test stop criteria │ │ │ │ │ -546 // │ │ │ │ │ -547 │ │ │ │ │ -548 norm = ___s_p->norm(r); │ │ │ │ │ -549 if(iteration.step(it, norm)){ │ │ │ │ │ -550 break; │ │ │ │ │ +537 if(end_n_o_V_e_r_t_i_c_e_s()); │ │ │ │ │ +543 for(int j=0; j< UNKNOWNS; ++j) │ │ │ │ │ +544 for(int i=0; i < UNKNOWNS; ++i) │ │ │ │ │ +545 { │ │ │ │ │ +546 if(i>=overlapStart && iapply(y,r); │ │ │ │ │ -558 │ │ │ │ │ -559 // t = A * y │ │ │ │ │ -560 ___o_p->apply(y,t); │ │ │ │ │ -561 │ │ │ │ │ -562 // omega = < t, r > / < t, t > │ │ │ │ │ -563 h = ___s_p->dot(t,t); │ │ │ │ │ -564 omega = Simd::cond(norm==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -565 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -566 ___s_p->dot(t,r)/h); │ │ │ │ │ -567 │ │ │ │ │ -568 // apply second correction to x │ │ │ │ │ -569 // x <- x + omega y │ │ │ │ │ -570 x.axpy(omega,y); │ │ │ │ │ -571 │ │ │ │ │ -572 // r = s - omega*t (remember : r = s) │ │ │ │ │ -573 r.axpy(-omega,t); │ │ │ │ │ -574 │ │ │ │ │ -575 rho = rho_new; │ │ │ │ │ -576 │ │ │ │ │ -577 // │ │ │ │ │ -578 // test stop criteria │ │ │ │ │ -579 // │ │ │ │ │ -580 │ │ │ │ │ -581 norm = ___s_p->norm(r); │ │ │ │ │ -582 if(iteration.step(it, norm)){ │ │ │ │ │ -583 break; │ │ │ │ │ -584 } │ │ │ │ │ -585 } // end for │ │ │ │ │ -586 │ │ │ │ │ -587 ___p_r_e_c->post(x); // postprocess preconditioner │ │ │ │ │ -588 } │ │ │ │ │ -589 │ │ │ │ │ -590 protected: │ │ │ │ │ -591 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -592 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -593 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -594 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -595 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -596 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -597 template │ │ │ │ │ -_5_9_8 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_C_o_u_n_t_T_y_p_e_>; │ │ │ │ │ -599 }; │ │ │ │ │ -_6_0_0 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("bicgstabsolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -601 │ │ │ │ │ -608 template │ │ │ │ │ -_6_0_9 class _M_I_N_R_E_S_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ -610 public: │ │ │ │ │ -611 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -612 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -613 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -614 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +552 } │ │ │ │ │ +553#endif │ │ │ │ │ +554 if(criterion.debugLevel()>1 && info->communicator().rank()==0) │ │ │ │ │ +555 std::cout<<"aggregating finished."<communicator().sum(gnoAggregates); │ │ │ │ │ +559 double dgnoAggregates = gnoAggregates.todouble(); │ │ │ │ │ +560#ifdef TEST_AGGLO │ │ │ │ │ +561 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2); │ │ │ │ │ +562#endif │ │ │ │ │ +563 │ │ │ │ │ +564 if(criterion.debugLevel()>2 && rank==0) │ │ │ │ │ +565 std::cout << "Building "<0) │ │ │ │ │ +572 std::cerr << "Stopped coarsening because of rate breakdown "<_f_r_e_e(); │ │ │ │ │ +579 delete aggregatesMap; │ │ │ │ │ +580 aggregatesMaps_.pop_back(); │ │ │ │ │ +581 │ │ │ │ │ +582 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator │ │ │ │ │ +().size()>1) { │ │ │ │ │ +583 // coarse level matrix was already redistributed, but to more than 1 │ │ │ │ │ +process │ │ │ │ │ +584 // Therefore need to delete the redistribution. Further down it will │ │ │ │ │ +585 // then be redistributed to 1 process │ │ │ │ │ +586 delete &(mlevel.getRedistributed().getmat()); │ │ │ │ │ +587 mlevel.deleteRedistributed(); │ │ │ │ │ +588 delete &(infoLevel.getRedistributed()); │ │ │ │ │ +589 infoLevel.deleteRedistributed(); │ │ │ │ │ +590 redistributes_.back().resetSetup(); │ │ │ │ │ +591 } │ │ │ │ │ +592 │ │ │ │ │ +593 break; │ │ │ │ │ +594 } │ │ │ │ │ +595 unknowns = noAggregates; │ │ │ │ │ +596 dunknowns = dgnoAggregates; │ │ │ │ │ +597 │ │ │ │ │ +598 CommunicationArgs commargs(info->communicator(),info->category()); │ │ │ │ │ +599 parallelInformation_.addCoarser(commargs); │ │ │ │ │ +600 │ │ │ │ │ +601 ++infoLevel; // parallel information on coarse level │ │ │ │ │ +602 │ │ │ │ │ +603 typename PropertyMapTypeSelector::Type │ │ │ │ │ +visitedMap = │ │ │ │ │ +604 _g_e_t(_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g(), *(std::get<1>(graphs))); │ │ │ │ │ +605 │ │ │ │ │ +606 watch.reset(); │ │ │ │ │ +607 int aggregates = _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_O_v_e_r_l_a_p_F_l_a_g_s_> │ │ │ │ │ +608_ _:_:_c_o_a_r_s_e_n(*info, │ │ │ │ │ +609 *(std::get<1>(graphs)), │ │ │ │ │ +610 visitedMap, │ │ │ │ │ +611 *aggregatesMap, │ │ │ │ │ +612 *infoLevel, │ │ │ │ │ +613 noAggregates); │ │ │ │ │ +614 GraphCreator::free(graphs); │ │ │ │ │ 615 │ │ │ │ │ -616 // copy base class constructors │ │ │ │ │ -617 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ -618 │ │ │ │ │ -619 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -620 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -621 │ │ │ │ │ -_6_2_7 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -628 { │ │ │ │ │ -629 using std::sqrt; │ │ │ │ │ -630 using std::abs; │ │ │ │ │ -631 _I_t_e_r_a_t_i_o_n iteration(*this, res); │ │ │ │ │ -632 // prepare preconditioner │ │ │ │ │ -633 ___p_r_e_c->pre(x,b); │ │ │ │ │ -634 │ │ │ │ │ -635 // overwrite rhs with defect │ │ │ │ │ -636 ___o_p->applyscaleadd(-1.0,x,b); // b -= Ax │ │ │ │ │ -637 │ │ │ │ │ -638 // some temporary vectors │ │ │ │ │ -639 X z(b), dummy(b); │ │ │ │ │ -640 z = 0.0; │ │ │ │ │ -641 │ │ │ │ │ -642 // calculate preconditioned defect │ │ │ │ │ -643 ___p_r_e_c->apply(z,b); // r = W^-1 (b - Ax) │ │ │ │ │ -644 _r_e_a_l___t_y_p_e def = ___s_p->norm(z); │ │ │ │ │ -645 if (iteration.step(0, def)){ │ │ │ │ │ -646 ___p_r_e_c->post(x); │ │ │ │ │ -647 return; │ │ │ │ │ -648 } │ │ │ │ │ -649 │ │ │ │ │ -650 // recurrence coefficients as computed in Lanczos algorithm │ │ │ │ │ -651 _f_i_e_l_d___t_y_p_e alpha, beta; │ │ │ │ │ -652 // diagonal entries of givens rotation │ │ │ │ │ -653 std::array c{{0.0,0.0}}; │ │ │ │ │ -654 // off-diagonal entries of givens rotation │ │ │ │ │ -655 std::array s{{0.0,0.0}}; │ │ │ │ │ -656 │ │ │ │ │ -657 // recurrence coefficients (column k of tridiag matrix T_k) │ │ │ │ │ -658 std::array T{{0.0,0.0,0.0}}; │ │ │ │ │ -659 │ │ │ │ │ -660 // the rhs vector of the min problem │ │ │ │ │ -661 std::array xi{{1.0,0.0}}; │ │ │ │ │ +616 if(criterion.debugLevel()>2) { │ │ │ │ │ +617 if(rank==0) │ │ │ │ │ +618 std::cout<<"Coarsening of index sets took "<buildGlobalLookup(aggregates); │ │ │ │ │ +624 _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_V_e_r_t_e_x_,_O_v_e_r_l_a_p_F_l_a_g_s_,_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_u_b_l_i_s_h │ │ │ │ │ +(*aggregatesMap, │ │ │ │ │ +625 *info, │ │ │ │ │ +626 infoLevel->globalLookup()); │ │ │ │ │ +627 │ │ │ │ │ +628 │ │ │ │ │ +629 if(criterion.debugLevel()>2) { │ │ │ │ │ +630 if(rank==0) │ │ │ │ │ +631 std::cout<<"Communicating global aggregate numbers took "<& visited=excluded; │ │ │ │ │ +636 │ │ │ │ │ +637 typedef std::vector::iterator Iterator; │ │ │ │ │ +638 typedef IteratorPropertyMap VisitedMap2; │ │ │ │ │ +639 Iterator end = visited.end(); │ │ │ │ │ +640 for(Iterator iter= visited.begin(); iter != end; ++iter) │ │ │ │ │ +641 *iter=false; │ │ │ │ │ +642 │ │ │ │ │ +643 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap()); │ │ │ │ │ +644 │ │ │ │ │ +645 std::shared_ptr │ │ │ │ │ +646 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2, │ │ │ │ │ +647 *info, │ │ │ │ │ +648 *aggregatesMap, │ │ │ │ │ +649 aggregates, │ │ │ │ │ +650 OverlapFlags())); │ │ │ │ │ +651 dverb<<"Building of sparsity pattern took "<freeGlobalLookup(); │ │ │ │ │ +654 │ │ │ │ │ +655 delete std::get<0>(graphs); │ │ │ │ │ +656 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, │ │ │ │ │ +*infoLevel, OverlapFlags()); │ │ │ │ │ +657 │ │ │ │ │ +658 if(criterion.debugLevel()>2) { │ │ │ │ │ +659 if(rank==0) │ │ │ │ │ +660 std::cout<<"Calculation entries of Galerkin product took "<dot(b,z)); │ │ │ │ │ -666 _f_i_e_l_d___t_y_p_e beta0 = beta; │ │ │ │ │ -667 │ │ │ │ │ -668 // the search directions │ │ │ │ │ -669 std::array p{{b,b,b}}; │ │ │ │ │ -670 p[0] = 0.0; │ │ │ │ │ -671 p[1] = 0.0; │ │ │ │ │ -672 p[2] = 0.0; │ │ │ │ │ +663 BIGINT nonzeros = _c_o_u_n_t_N_o_n_Z_e_r_o_s(*coarseMatrix); │ │ │ │ │ +664 allnonzeros = allnonzeros + infoLevel->communicator().sum(nonzeros); │ │ │ │ │ +665 MatrixArgs args(coarseMatrix, *infoLevel); │ │ │ │ │ +666 │ │ │ │ │ +667 matrices_.addCoarser(args); │ │ │ │ │ +668 redistributes_.push_back(_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e()); │ │ │ │ │ +669 } // end level loop │ │ │ │ │ +670 │ │ │ │ │ +671 │ │ │ │ │ +672 infoLevel->freeGlobalLookup(); │ │ │ │ │ 673 │ │ │ │ │ -674 // orthonormal basis vectors (in unpreconditioned case) │ │ │ │ │ -675 std::array q{{b,b,b}}; │ │ │ │ │ -676 q[0] = 0.0; │ │ │ │ │ -677 q[1] *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -678 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -679 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ -680 q[2] = 0.0; │ │ │ │ │ -681 │ │ │ │ │ -682 z *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -683 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -684 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ -685 │ │ │ │ │ -686 // the loop │ │ │ │ │ -687 int i = 1; │ │ │ │ │ -688 for( ; i<=___m_a_x_i_t; i++) { │ │ │ │ │ +674 built_=true; │ │ │ │ │ +675 _A_g_g_r_e_g_a_t_e_s_M_a_p* aggregatesMap=new _A_g_g_r_e_g_a_t_e_s_M_a_p(0); │ │ │ │ │ +676 aggregatesMaps_.push_back(aggregatesMap); │ │ │ │ │ +677 │ │ │ │ │ +678 if(criterion.debugLevel()>0) { │ │ │ │ │ +679 if(level==criterion.maxLevel()) { │ │ │ │ │ +680 BIGINT unknownsLevel = mlevel->getmat().N(); │ │ │ │ │ +681 unknownsLevel = infoLevel->communicator().sum(unknownsLevel); │ │ │ │ │ +682 double dunknownsLevel = unknownsLevel.todouble(); │ │ │ │ │ +683 if(rank==0 && criterion.debugLevel()>1) { │ │ │ │ │ +684 std::cout<<"Level "<communicator().size() │ │ │ │ │ +685 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ +()<<")"<apply(z,q[i2]); // q[i2] = Az │ │ │ │ │ -697 q[i2].axpy(-beta,q[i0]); │ │ │ │ │ -698 // alpha is real since it is the diagonal entry of the hermitian │ │ │ │ │ -tridiagonal matrix │ │ │ │ │ -699 // from the Lanczos Algorithm │ │ │ │ │ -700 // so the order in the scalar product doesn't matter even for the complex │ │ │ │ │ -case │ │ │ │ │ -701 alpha = ___s_p->dot(z,q[i2]); │ │ │ │ │ -702 q[i2].axpy(-alpha,q[i1]); │ │ │ │ │ +690 if(criterion.accumulate() && !redistributes_.back().isSetup() && │ │ │ │ │ +691 infoLevel->communicator().size()>1) { │ │ │ │ │ +692#if HAVE_MPI && !HAVE_PARMETIS │ │ │ │ │ +693 if(criterion.accumulate()==_s_u_c_c_e_s_s_i_v_e_A_c_c_u && │ │ │ │ │ +694 infoLevel->communicator().rank()==0) │ │ │ │ │ +695 std::cerr<<"Successive accumulation of data on coarse levels only works │ │ │ │ │ +with ParMETIS installed." │ │ │ │ │ +696 <<" Fell back to accumulation to one domain on coarsest level"< redistMat = std::make_shared(); │ │ │ │ │ +701 std::shared_ptr redistComm; │ │ │ │ │ +702 int nodomains = 1; │ │ │ │ │ 703 │ │ │ │ │ -704 z = 0.0; │ │ │ │ │ -705 ___p_r_e_c->apply(z,q[i2]); │ │ │ │ │ -706 │ │ │ │ │ -707 // beta is real and positive in exact arithmetic │ │ │ │ │ -708 // since it is the norm of the basis vectors (in unpreconditioned case) │ │ │ │ │ -709 beta = sqrt(___s_p->dot(q[i2],z)); │ │ │ │ │ -710 │ │ │ │ │ -711 q[i2] *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -712 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -713 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ -714 z *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -715 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -716 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ -717 │ │ │ │ │ -718 // QR Factorization of recurrence coefficient matrix │ │ │ │ │ -719 // apply previous givens rotations to last column of T │ │ │ │ │ -720 T[1] = T[2]; │ │ │ │ │ -721 if(i>2) { │ │ │ │ │ -722 T[0] = s[i%2]*T[1]; │ │ │ │ │ -723 T[1] = c[i%2]*T[1]; │ │ │ │ │ -724 } │ │ │ │ │ -725 if(i>1) { │ │ │ │ │ -726 T[2] = c[(i+1)%2]*alpha - s[(i+1)%2]*T[1]; │ │ │ │ │ -727 T[1] = c[(i+1)%2]*T[1] + s[(i+1)%2]*alpha; │ │ │ │ │ -728 } │ │ │ │ │ -729 else │ │ │ │ │ -730 T[2] = alpha; │ │ │ │ │ -731 │ │ │ │ │ -732 // update QR factorization │ │ │ │ │ -733 generateGivensRotation(T[2],beta,c[i%2],s[i%2]); │ │ │ │ │ -734 // to last column of T_k │ │ │ │ │ -735 T[2] = c[i%2]*T[2] + s[i%2]*beta; │ │ │ │ │ -736 // and to the rhs xi of the min problem │ │ │ │ │ -737 xi[i%2] = -s[i%2]*xi[(i+1)%2]; │ │ │ │ │ -738 xi[(i+1)%2] *= c[i%2]; │ │ │ │ │ -739 │ │ │ │ │ -740 // compute correction direction │ │ │ │ │ -741 p[i2] = dummy; │ │ │ │ │ -742 p[i2].axpy(-T[1],p[i1]); │ │ │ │ │ -743 p[i2].axpy(-T[0],p[i0]); │ │ │ │ │ -744 p[i2] *= _r_e_a_l___t_y_p_e(1.0)/T[2]; │ │ │ │ │ -745 │ │ │ │ │ -746 // apply correction/update solution │ │ │ │ │ -747 x.axpy(beta0*xi[(i+1)%2],p[i2]); │ │ │ │ │ -748 │ │ │ │ │ -749 // remember beta_old │ │ │ │ │ -750 T[2] = beta; │ │ │ │ │ +704 _r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(mlevel->getmat(), redistMat, *infoLevel, │ │ │ │ │ +705 redistComm, redistributes_.back(), nodomains,criterion); │ │ │ │ │ +706 MatrixArgs args(redistMat, *redistComm); │ │ │ │ │ +707 BIGINT unknownsRedist = redistMat->N(); │ │ │ │ │ +708 unknownsRedist = infoLevel->communicator().sum(unknownsRedist); │ │ │ │ │ +709 │ │ │ │ │ +710 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) { │ │ │ │ │ +711 double dunknownsRedist = unknownsRedist.todouble(); │ │ │ │ │ +712 std::cout<<"Level "<communicator().size() │ │ │ │ │ +713 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ +()<<")"<_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +(args)); │ │ │ │ │ +716 infoLevel.addRedistributed(redistComm); │ │ │ │ │ +717 infoLevel->freeGlobalLookup(); │ │ │ │ │ +718 } │ │ │ │ │ +719 │ │ │ │ │ +720 int levels = matrices_.levels(); │ │ │ │ │ +721 maxlevels_ = parallelInformation_.finest()->communicator().max(levels); │ │ │ │ │ +722 assert(matrices_.levels()==redistributes_.size()); │ │ │ │ │ +723 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1) │ │ │ │ │ +724 std::cout<<"operator complexity: "< │ │ │ │ │ +729 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y& │ │ │ │ │ +_7_3_0 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_m_a_t_r_i_c_e_s() const │ │ │ │ │ +731 { │ │ │ │ │ +732 return matrices_; │ │ │ │ │ +733 } │ │ │ │ │ +734 │ │ │ │ │ +735 template │ │ │ │ │ +736 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y& │ │ │ │ │ +_7_3_7 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_p_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n() const │ │ │ │ │ +738 { │ │ │ │ │ +739 return parallelInformation_; │ │ │ │ │ +740 } │ │ │ │ │ +741 │ │ │ │ │ +742 template │ │ │ │ │ +_7_4_3 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_s_O_n_F_i_n_e_s_t(std:: │ │ │ │ │ +vector& data) const │ │ │ │ │ +744 { │ │ │ │ │ +745 int levels=aggregatesMaps().size(); │ │ │ │ │ +746 int maxlevels=parallelInformation_._f_i_n_e_s_t()->communicator().max(levels); │ │ │ │ │ +747 std::size_t size=(*(aggregatesMaps().begin()))->noVertices(); │ │ │ │ │ +748 // We need an auxiliary vector for the consecutive prolongation. │ │ │ │ │ +749 std::vector tmp; │ │ │ │ │ +750 std::vector *coarse, *fine; │ │ │ │ │ 751 │ │ │ │ │ -752 // check for convergence │ │ │ │ │ -753 // the last entry in the rhs of the min-problem is the residual │ │ │ │ │ -754 def = abs(beta0*xi[i%2]); │ │ │ │ │ -755 if(iteration.step(i, def)){ │ │ │ │ │ -756 break; │ │ │ │ │ -757 } │ │ │ │ │ -758 } // end for │ │ │ │ │ -759 │ │ │ │ │ -760 // postprocess preconditioner │ │ │ │ │ -761 ___p_r_e_c->post(x); │ │ │ │ │ -762 } │ │ │ │ │ -763 │ │ │ │ │ -764 private: │ │ │ │ │ +752 // make sure the allocated space suffices. │ │ │ │ │ +753 tmp.reserve(size); │ │ │ │ │ +754 data.reserve(size); │ │ │ │ │ +755 │ │ │ │ │ +756 // Correctly assign coarse and fine for the first prolongation such that │ │ │ │ │ +757 // we end up in data in the end. │ │ │ │ │ +758 if(levels%2==0) { │ │ │ │ │ +759 coarse=&tmp; │ │ │ │ │ +760 fine=&data; │ │ │ │ │ +761 }else{ │ │ │ │ │ +762 coarse=&data; │ │ │ │ │ +763 fine=&tmp; │ │ │ │ │ +764 } │ │ │ │ │ 765 │ │ │ │ │ -766 void generateGivensRotation(_f_i_e_l_d___t_y_p_e &dx, _f_i_e_l_d___t_y_p_e &dy, _r_e_a_l___t_y_p_e &cs, │ │ │ │ │ -_f_i_e_l_d___t_y_p_e &sn) │ │ │ │ │ -767 { │ │ │ │ │ -768 using std::sqrt; │ │ │ │ │ -769 using std::abs; │ │ │ │ │ -770 using std::max; │ │ │ │ │ -771 using std::min; │ │ │ │ │ -772 const _r_e_a_l___t_y_p_e eps = 1e-15; │ │ │ │ │ -773 _r_e_a_l___t_y_p_e norm_dx = abs(dx); │ │ │ │ │ -774 _r_e_a_l___t_y_p_e norm_dy = abs(dy); │ │ │ │ │ -775 _r_e_a_l___t_y_p_e norm_max = max(norm_dx, norm_dy); │ │ │ │ │ -776 _r_e_a_l___t_y_p_e norm_min = min(norm_dx, norm_dy); │ │ │ │ │ -777 _r_e_a_l___t_y_p_e temp = norm_min/norm_max; │ │ │ │ │ -778 // we rewrite the code in a vectorizable fashion │ │ │ │ │ -779 cs = Simd::cond(norm_dy < eps, │ │ │ │ │ -780 _r_e_a_l___t_y_p_e(1.0), │ │ │ │ │ -781 Simd::cond(norm_dx < eps, │ │ │ │ │ -782 _r_e_a_l___t_y_p_e(0.0), │ │ │ │ │ -783 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ -784 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*temp, │ │ │ │ │ -785 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp) │ │ │ │ │ -786 ))); │ │ │ │ │ -787 sn = Simd::cond(norm_dy < eps, │ │ │ │ │ -788 _f_i_e_l_d___t_y_p_e(0.0), │ │ │ │ │ -789 Simd::cond(norm_dx < eps, │ │ │ │ │ -790 _f_i_e_l_d___t_y_p_e(1.0), │ │ │ │ │ -791 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ -792 // dy and dx are real in exact arithmetic │ │ │ │ │ -793 // thus dx*dy is real so we can explicitly enforce it │ │ │ │ │ -794 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*dx*dy/norm_dx/norm_dy, │ │ │ │ │ -795 // dy and dx is real in exact arithmetic │ │ │ │ │ -796 // so we don't have to conjugate both of them │ │ │ │ │ -797 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*dy/dx │ │ │ │ │ -798 ))); │ │ │ │ │ -799 } │ │ │ │ │ -800 │ │ │ │ │ -801 protected: │ │ │ │ │ -802 using IterativeSolver_:_:___o_p; │ │ │ │ │ -803 using IterativeSolver_:_:___p_r_e_c; │ │ │ │ │ -804 using IterativeSolver_:_:___s_p; │ │ │ │ │ -805 using IterativeSolver_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -806 using IterativeSolver_:_:___m_a_x_i_t; │ │ │ │ │ -807 using IterativeSolver_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -_8_0_8 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ -809 }; │ │ │ │ │ -_8_1_0 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("minressolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -811 │ │ │ │ │ -825 template │ │ │ │ │ -_8_2_6 class _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -827 { │ │ │ │ │ -828 public: │ │ │ │ │ -829 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -830 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -831 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -832 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -833 │ │ │ │ │ -834 protected: │ │ │ │ │ -835 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ -836 │ │ │ │ │ -_8_3_8 using _f_A_l_l_o_c = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>; │ │ │ │ │ -_8_4_0 using _r_A_l_l_o_c = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_r_e_a_l___t_y_p_e_>; │ │ │ │ │ -841 │ │ │ │ │ -842 public: │ │ │ │ │ -843 │ │ │ │ │ -_8_5_0 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& │ │ │ │ │ -prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int restart, int maxit, int verbose) : │ │ │ │ │ -851 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,reduction,maxit,verbose), │ │ │ │ │ -852 ___r_e_s_t_a_r_t(restart) │ │ │ │ │ -853 {} │ │ │ │ │ -854 │ │ │ │ │ -_8_6_1 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, const │ │ │ │ │ -_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, │ │ │ │ │ -int restart, int maxit, int verbose) : │ │ │ │ │ -862 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ -863 ___r_e_s_t_a_r_t(restart) │ │ │ │ │ -864 {} │ │ │ │ │ +766 // Number the unknowns on the coarsest level consecutively for each │ │ │ │ │ +process. │ │ │ │ │ +767 if(levels==maxlevels) { │ │ │ │ │ +768 const _A_g_g_r_e_g_a_t_e_s_M_a_p& map = *(*(++aggregatesMaps().rbegin())); │ │ │ │ │ +769 std::size_t m=0; │ │ │ │ │ +770 │ │ │ │ │ +771 for(typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r iter = map._b_e_g_i_n(); iter != │ │ │ │ │ +map._e_n_d(); ++iter) │ │ │ │ │ +772 if(*iter< _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ +773 m=std::max(*iter,m); │ │ │ │ │ +774 │ │ │ │ │ +775 coarse->resize(m+1); │ │ │ │ │ +776 std::size_t i=0; │ │ │ │ │ +777 srand((unsigned)std::clock()); │ │ │ │ │ +778 std::set used; │ │ │ │ │ +779 for(typename std::vector::iterator iter=coarse->begin(); iter │ │ │ │ │ +!= coarse->end(); │ │ │ │ │ +780 ++iter, ++i) │ │ │ │ │ +781 { │ │ │ │ │ +782 std::pair::iterator,bool> ibpair │ │ │ │ │ +783 = used.insert(static_cast((((double)rand())/ │ │ │ │ │ +(RAND_MAX+1.0)))*coarse->size()); │ │ │ │ │ +784 │ │ │ │ │ +785 while(!ibpair.second) │ │ │ │ │ +786 ibpair = used.insert(static_cast((((double)rand())/ │ │ │ │ │ +(RAND_MAX+1.0))*coarse->size())); │ │ │ │ │ +787 *iter=*(ibpair.first); │ │ │ │ │ +788 } │ │ │ │ │ +789 } │ │ │ │ │ +790 │ │ │ │ │ +791 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r pinfo = parallelInformation │ │ │ │ │ +().coarsest(); │ │ │ │ │ +792 --pinfo; │ │ │ │ │ +793 │ │ │ │ │ +794 // Now consecutively project the numbers to the finest level. │ │ │ │ │ +795 for(typename AggregatesMapList::const_reverse_iterator │ │ │ │ │ +aggregates=++aggregatesMaps().rbegin(); │ │ │ │ │ +796 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) { │ │ │ │ │ +797 │ │ │ │ │ +798 fine->resize((*aggregates)->noVertices()); │ │ │ │ │ +799 fine->assign(fine->size(), 0); │ │ │ │ │ +800 _T_r_a_n_s_f_e_r_<_t_y_p_e_n_a_m_e_ _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r_,_ _s_t_d_:_:_v_e_c_t_o_r_<_s_t_d_:_: │ │ │ │ │ +_s_i_z_e___t_>, _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ +801 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast │ │ │ │ │ +(1), *pinfo); │ │ │ │ │ +802 --pinfo; │ │ │ │ │ +803 std::swap(coarse, fine); │ │ │ │ │ +804 } │ │ │ │ │ +805 │ │ │ │ │ +806 // Assertion to check that we really projected to data on the last step. │ │ │ │ │ +807 assert(coarse==&data); │ │ │ │ │ +808 } │ │ │ │ │ +809 │ │ │ │ │ +810 template │ │ │ │ │ +811 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t& │ │ │ │ │ +_8_1_2 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_a_g_g_r_e_g_a_t_e_s_M_a_p_s() const │ │ │ │ │ +813 { │ │ │ │ │ +814 return aggregatesMaps_; │ │ │ │ │ +815 } │ │ │ │ │ +816 template │ │ │ │ │ +817 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t& │ │ │ │ │ +_8_1_8 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_r_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n() const │ │ │ │ │ +819 { │ │ │ │ │ +820 return redistributes_; │ │ │ │ │ +821 } │ │ │ │ │ +822 │ │ │ │ │ +823 template │ │ │ │ │ +_8_2_4 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_~_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y() │ │ │ │ │ +825 { │ │ │ │ │ +826 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator; │ │ │ │ │ +827 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +828 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r InfoIterator; │ │ │ │ │ +829 │ │ │ │ │ +830 AggregatesMapIterator amap = aggregatesMaps_.rbegin(); │ │ │ │ │ +831 InfoIterator info = parallelInformation_.coarsest(); │ │ │ │ │ +832 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level │ │ │ │ │ +!= finest; --level, --info, ++amap) { │ │ │ │ │ +833 (*amap)->free(); │ │ │ │ │ +834 delete *amap; │ │ │ │ │ +835 } │ │ │ │ │ +836 delete *amap; │ │ │ │ │ +837 } │ │ │ │ │ +838 │ │ │ │ │ +839 template │ │ │ │ │ +840 template │ │ │ │ │ +_8_4_1 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_c_o_a_r_s_e_n_V_e_c_t_o_r(_H_i_e_r_a_r_c_h_y<_B_l_o_c_k_V_e_c_t_o_r_<_V_,_B_A_>, │ │ │ │ │ +TA>& hierarchy) const │ │ │ │ │ +842 { │ │ │ │ │ +843 assert(hierarchy.levels()==1); │ │ │ │ │ +844 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +845 typedef typename RedistributeInfoList::const_iterator RIter; │ │ │ │ │ +846 RIter redist = redistributes_.begin(); │ │ │ │ │ +847 │ │ │ │ │ +848 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest(); │ │ │ │ │ +849 int level=0; │ │ │ │ │ +850 if(redist->isSetup()) │ │ │ │ │ +851 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N │ │ │ │ │ +()); │ │ │ │ │ +852 Dune::dvverb<<"Level "<getmat().N()<<" │ │ │ │ │ +unknowns!"<getmat().N()<<" │ │ │ │ │ +unknowns!"<getmat().N()); │ │ │ │ │ +859 if(redist->isSetup()) │ │ │ │ │ +860 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N │ │ │ │ │ +()); │ │ │ │ │ +861 │ │ │ │ │ +862 } │ │ │ │ │ +863 │ │ │ │ │ +864 } │ │ │ │ │ 865 │ │ │ │ │ -_8_7_8 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ -shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) : │ │ │ │ │ -879 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,configuration), │ │ │ │ │ -880 ___r_e_s_t_a_r_t(configuration._g_e_t("restart")) │ │ │ │ │ -881 {} │ │ │ │ │ -882 │ │ │ │ │ -_8_8_3 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ -shared_ptr > sp, std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > │ │ │ │ │ -prec, const ParameterTree& configuration) : │ │ │ │ │ -884 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,configuration), │ │ │ │ │ -885 ___r_e_s_t_a_r_t(configuration._g_e_t("restart")) │ │ │ │ │ -886 {} │ │ │ │ │ -887 │ │ │ │ │ -_8_9_4 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ -895 std::shared_ptr> sp, │ │ │ │ │ -896 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>> prec, │ │ │ │ │ -897 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int restart, int maxit, int verbose) : │ │ │ │ │ -898 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ -899 ___r_e_s_t_a_r_t(restart) │ │ │ │ │ -900 {} │ │ │ │ │ -901 │ │ │ │ │ -_9_1_0 virtual void _a_p_p_l_y (X& x, Y& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -911 { │ │ │ │ │ -912 _a_p_p_l_y(x,b,Simd::max(___r_e_d_u_c_t_i_o_n),res); │ │ │ │ │ -913 } │ │ │ │ │ -914 │ │ │ │ │ -_9_2_3 virtual void _a_p_p_l_y (X& x, Y& b, [[maybe_unused]] double reduction, │ │ │ │ │ -_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -924 { │ │ │ │ │ -925 using std::abs; │ │ │ │ │ -926 const Simd::Scalar EPSILON = 1e-80; │ │ │ │ │ -927 const int m = ___r_e_s_t_a_r_t; │ │ │ │ │ -928 _r_e_a_l___t_y_p_e norm = 0.0; │ │ │ │ │ -929 int j = 1; │ │ │ │ │ -930 std::vector s(m+1), sn(m); │ │ │ │ │ -931 std::vector cs(m); │ │ │ │ │ -932 // need copy of rhs if GMRes has to be restarted │ │ │ │ │ -933 Y b2(b); │ │ │ │ │ -934 // helper vector │ │ │ │ │ -935 Y w(b); │ │ │ │ │ -936 std::vector< std::vector > H(m+1,s); │ │ │ │ │ -937 std::vector v(m+1,b); │ │ │ │ │ +866 template │ │ │ │ │ +867 template │ │ │ │ │ +_8_6_8 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_c_o_a_r_s_e_n_S_m_o_o_t_h_e_r(_H_i_e_r_a_r_c_h_y_<_S_,_T_A_>& smoothers, │ │ │ │ │ +869 const typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_>_:_:_A_r_g_u_m_e_n_t_s& sargs) const │ │ │ │ │ +870 { │ │ │ │ │ +871 assert(smoothers._l_e_v_e_l_s()==0); │ │ │ │ │ +872 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r MatrixIterator; │ │ │ │ │ +873 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r PinfoIterator; │ │ │ │ │ +874 typedef typename AggregatesMapList::const_iterator AggregatesIterator; │ │ │ │ │ +875 │ │ │ │ │ +876 typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_>_:_:_A_r_g_u_m_e_n_t_s cargs; │ │ │ │ │ +877 cargs.setArgs(sargs); │ │ │ │ │ +878 PinfoIterator pinfo = parallelInformation_.finest(); │ │ │ │ │ +879 AggregatesIterator aggregates = aggregatesMaps_.begin(); │ │ │ │ │ +880 int level=0; │ │ │ │ │ +881 for(MatrixIterator matrix = matrices_.finest(), coarsest = │ │ │ │ │ +matrices_.coarsest(); │ │ │ │ │ +882 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) { │ │ │ │ │ +883 cargs.setMatrix(matrix->getmat(), **aggregates); │ │ │ │ │ +884 cargs.setComm(*pinfo); │ │ │ │ │ +885 smoothers._a_d_d_C_o_a_r_s_e_r(cargs); │ │ │ │ │ +886 } │ │ │ │ │ +887 if(maxlevels()>levels()) { │ │ │ │ │ +888 // This is not the globally coarsest level and therefore smoothing is │ │ │ │ │ +needed │ │ │ │ │ +889 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates); │ │ │ │ │ +890 cargs.setComm(*pinfo); │ │ │ │ │ +891 smoothers._a_d_d_C_o_a_r_s_e_r(cargs); │ │ │ │ │ +892 ++level; │ │ │ │ │ +893 } │ │ │ │ │ +894 } │ │ │ │ │ +895 │ │ │ │ │ +896 template │ │ │ │ │ +897 template │ │ │ │ │ +_8_9_8 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_r_e_c_a_l_c_u_l_a_t_e_G_a_l_e_r_k_i_n(const F& copyFlags) │ │ │ │ │ +899 { │ │ │ │ │ +900 typedef typename AggregatesMapList::iterator AggregatesMapIterator; │ │ │ │ │ +901 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +902 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r InfoIterator; │ │ │ │ │ +903 │ │ │ │ │ +904 AggregatesMapIterator amap = aggregatesMaps_.begin(); │ │ │ │ │ +905 _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t productBuilder; │ │ │ │ │ +906 InfoIterator info = parallelInformation_.finest(); │ │ │ │ │ +907 typename RedistributeInfoList::iterator riIter = redistributes_.begin(); │ │ │ │ │ +908 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest(); │ │ │ │ │ +909 if(level.isRedistributed()) { │ │ │ │ │ +910 info->buildGlobalLookup(level->getmat().N()); │ │ │ │ │ +911 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(const_cast<_M_a_t_r_i_x&>(level->getmat()), │ │ │ │ │ +912 const_cast<_M_a_t_r_i_x&>(level.getRedistributed().getmat()), │ │ │ │ │ +913 *info,info.getRedistributed(), *riIter); │ │ │ │ │ +914 info->freeGlobalLookup(); │ │ │ │ │ +915 } │ │ │ │ │ +916 │ │ │ │ │ +917 for(; level!=coarsest; ++amap) { │ │ │ │ │ +918 const _M_a_t_r_i_x& fine = (level.isRedistributed() ? level.getRedistributed() : │ │ │ │ │ +*level).getmat(); │ │ │ │ │ +919 ++level; │ │ │ │ │ +920 ++info; │ │ │ │ │ +921 ++riIter; │ │ │ │ │ +922 productBuilder._c_a_l_c_u_l_a_t_e(fine, *(*amap), const_cast<_M_a_t_r_i_x&>(level->getmat │ │ │ │ │ +()), *info, copyFlags); │ │ │ │ │ +923 if(level.isRedistributed()) { │ │ │ │ │ +924 info->buildGlobalLookup(level->getmat().N()); │ │ │ │ │ +925 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(const_cast<_M_a_t_r_i_x&>(level->getmat()), │ │ │ │ │ +926 const_cast<_M_a_t_r_i_x&>(level.getRedistributed().getmat()), *info, │ │ │ │ │ +927 info.getRedistributed(), *riIter); │ │ │ │ │ +928 info->freeGlobalLookup(); │ │ │ │ │ +929 } │ │ │ │ │ +930 } │ │ │ │ │ +931 } │ │ │ │ │ +932 │ │ │ │ │ +933 template │ │ │ │ │ +_9_3_4 std::size_t _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_l_e_v_e_l_s() const │ │ │ │ │ +935 { │ │ │ │ │ +936 return matrices_.levels(); │ │ │ │ │ +937 } │ │ │ │ │ 938 │ │ │ │ │ -939 _I_t_e_r_a_t_i_o_n iteration(*this,res); │ │ │ │ │ -940 │ │ │ │ │ -941 // clear solver statistics and set res.converged to false │ │ │ │ │ -942 ___p_r_e_c->pre(x,b); │ │ │ │ │ -943 │ │ │ │ │ -944 // calculate defect and overwrite rhs with it │ │ │ │ │ -945 ___o_p->applyscaleadd(-1.0,x,b); // b -= Ax │ │ │ │ │ -946 // calculate preconditioned defect │ │ │ │ │ -947 v[0] = 0.0; ___p_r_e_c->apply(v[0],b); // r = W^-1 b │ │ │ │ │ -948 norm = ___s_p->norm(v[0]); │ │ │ │ │ -949 if(iteration.step(0, norm)){ │ │ │ │ │ -950 ___p_r_e_c->post(x); │ │ │ │ │ -951 return; │ │ │ │ │ -952 } │ │ │ │ │ -953 │ │ │ │ │ -954 while(j <= ___m_a_x_i_t && res._c_o_n_v_e_r_g_e_d != true) { │ │ │ │ │ -955 │ │ │ │ │ -956 int i = 0; │ │ │ │ │ -957 v[0] *= Simd::cond(norm==_r_e_a_l___t_y_p_e(0.), │ │ │ │ │ -958 _r_e_a_l___t_y_p_e(0.), │ │ │ │ │ -959 _r_e_a_l___t_y_p_e(1.0)/norm); │ │ │ │ │ -960 s[0] = norm; │ │ │ │ │ -961 for(i=1; iapply(v[i],v[i+1]); │ │ │ │ │ -970 ___p_r_e_c->apply(w,v[i+1]); │ │ │ │ │ -971 for(int k=0; kdot(v[k],w) = v[k]\adjoint w │ │ │ │ │ -973 // so one has to pay attention to the order │ │ │ │ │ -974 // in the scalar product for the complex case │ │ │ │ │ -975 // doing the modified Gram-Schmidt algorithm │ │ │ │ │ -976 H[k][i] = ___s_p->dot(v[k],w); │ │ │ │ │ -977 // w -= H[k][i] * v[k] │ │ │ │ │ -978 w.axpy(-H[k][i],v[k]); │ │ │ │ │ -979 } │ │ │ │ │ -980 H[i+1][i] = ___s_p->norm(w); │ │ │ │ │ -981 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON)) │ │ │ │ │ -982 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t, │ │ │ │ │ -983 "breakdown in GMRes - |w| == 0.0 after " << j << " iterations"); │ │ │ │ │ -984 │ │ │ │ │ -985 // normalize new vector │ │ │ │ │ -986 v[i+1] = w; │ │ │ │ │ -987 v[i+1] *= Simd::cond(norm==_r_e_a_l___t_y_p_e(0.), │ │ │ │ │ -988 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ -989 _r_e_a_l___t_y_p_e(1.0)/H[i+1][i]); │ │ │ │ │ -990 │ │ │ │ │ -991 // update QR factorization │ │ │ │ │ -992 for(int k=0; k 0) │ │ │ │ │ -1020 std::cout << "=== GMRes::restart" << std::endl; │ │ │ │ │ -1021 // get saved rhs │ │ │ │ │ -1022 b = b2; │ │ │ │ │ -1023 // calculate new defect │ │ │ │ │ -1024 ___o_p->applyscaleadd(-1.0,x,b); // b -= Ax; │ │ │ │ │ -1025 // calculate preconditioned defect │ │ │ │ │ -1026 v[0] = 0.0; │ │ │ │ │ -1027 ___p_r_e_c->apply(v[0],b); │ │ │ │ │ -1028 norm = ___s_p->norm(v[0]); │ │ │ │ │ -1029 } │ │ │ │ │ -1030 │ │ │ │ │ -1031 } //end while │ │ │ │ │ -1032 │ │ │ │ │ -1033 // postprocess preconditioner │ │ │ │ │ -1034 ___p_r_e_c->post(x); │ │ │ │ │ -1035 } │ │ │ │ │ -1036 │ │ │ │ │ -1037 protected : │ │ │ │ │ -1038 │ │ │ │ │ -_1_0_3_9 void _u_p_d_a_t_e(X& w, int i, │ │ │ │ │ -1040 const std::vector >& H, │ │ │ │ │ -1041 const std::vector& s, │ │ │ │ │ -1042 const std::vector& v) { │ │ │ │ │ -1043 // solution vector of the upper triangular system │ │ │ │ │ -1044 std::vector y(s); │ │ │ │ │ -1045 │ │ │ │ │ -1046 // backsolve │ │ │ │ │ -1047 for(int a=i-1; a>=0; a--) { │ │ │ │ │ -1048 _f_i_e_l_d___t_y_p_e rhs(s[a]); │ │ │ │ │ -1049 for(int b=a+1; b │ │ │ │ │ -_1_0_6_2 typename std::enable_if::value,T>::type │ │ │ │ │ -_c_o_n_j_u_g_a_t_e(const T& t) { │ │ │ │ │ -1063 return t; │ │ │ │ │ -1064 } │ │ │ │ │ -1065 │ │ │ │ │ -1066 template │ │ │ │ │ -_1_0_6_7 typename std::enable_if::value,T>:: │ │ │ │ │ -type _c_o_n_j_u_g_a_t_e(const T& t) { │ │ │ │ │ -1068 using std::conj; │ │ │ │ │ -1069 return conj(t); │ │ │ │ │ -1070 } │ │ │ │ │ -1071 │ │ │ │ │ -1072 void │ │ │ │ │ -_1_0_7_3 _g_e_n_e_r_a_t_e_P_l_a_n_e_R_o_t_a_t_i_o_n(_f_i_e_l_d___t_y_p_e &dx, _f_i_e_l_d___t_y_p_e &dy, _r_e_a_l___t_y_p_e &cs, │ │ │ │ │ -_f_i_e_l_d___t_y_p_e &sn) │ │ │ │ │ -1074 { │ │ │ │ │ -1075 using std::sqrt; │ │ │ │ │ -1076 using std::abs; │ │ │ │ │ -1077 using std::max; │ │ │ │ │ -1078 using std::min; │ │ │ │ │ -1079 const _r_e_a_l___t_y_p_e eps = 1e-15; │ │ │ │ │ -1080 _r_e_a_l___t_y_p_e norm_dx = abs(dx); │ │ │ │ │ -1081 _r_e_a_l___t_y_p_e norm_dy = abs(dy); │ │ │ │ │ -1082 _r_e_a_l___t_y_p_e norm_max = max(norm_dx, norm_dy); │ │ │ │ │ -1083 _r_e_a_l___t_y_p_e norm_min = min(norm_dx, norm_dy); │ │ │ │ │ -1084 _r_e_a_l___t_y_p_e temp = norm_min/norm_max; │ │ │ │ │ -1085 // we rewrite the code in a vectorizable fashion │ │ │ │ │ -1086 cs = Simd::cond(norm_dy < eps, │ │ │ │ │ -1087 _r_e_a_l___t_y_p_e(1.0), │ │ │ │ │ -1088 Simd::cond(norm_dx < eps, │ │ │ │ │ -1089 _r_e_a_l___t_y_p_e(0.0), │ │ │ │ │ -1090 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ -1091 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*temp, │ │ │ │ │ -1092 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp) │ │ │ │ │ -1093 ))); │ │ │ │ │ -1094 sn = Simd::cond(norm_dy < eps, │ │ │ │ │ -1095 _f_i_e_l_d___t_y_p_e(0.0), │ │ │ │ │ -1096 Simd::cond(norm_dx < eps, │ │ │ │ │ -1097 _f_i_e_l_d___t_y_p_e(1.0), │ │ │ │ │ -1098 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ -1099 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*dx*_c_o_n_j_u_g_a_t_e(dy)/norm_dx/ │ │ │ │ │ -norm_dy, │ │ │ │ │ -1100 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*_c_o_n_j_u_g_a_t_e(dy/dx) │ │ │ │ │ -1101 ))); │ │ │ │ │ -1102 } │ │ │ │ │ -1103 │ │ │ │ │ -1104 │ │ │ │ │ -1105 void │ │ │ │ │ -_1_1_0_6 _a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(_f_i_e_l_d___t_y_p_e &dx, _f_i_e_l_d___t_y_p_e &dy, _r_e_a_l___t_y_p_e &cs, │ │ │ │ │ -_f_i_e_l_d___t_y_p_e &sn) │ │ │ │ │ -1107 { │ │ │ │ │ -1108 _f_i_e_l_d___t_y_p_e temp = cs * dx + sn * dy; │ │ │ │ │ -1109 dy = -_c_o_n_j_u_g_a_t_e(sn) * dx + cs * dy; │ │ │ │ │ -1110 dx = temp; │ │ │ │ │ -1111 } │ │ │ │ │ -1112 │ │ │ │ │ -1113 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -1114 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -1115 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -1116 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -1117 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -1118 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -_1_1_1_9 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ -_1_1_2_0 int ___r_e_s_t_a_r_t; │ │ │ │ │ -1121 }; │ │ │ │ │ -_1_1_2_2 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("restartedgmressolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -1123 │ │ │ │ │ -1137 template │ │ │ │ │ -_1_1_3_8 class _R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r : public _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -1139 { │ │ │ │ │ -1140 public: │ │ │ │ │ -1141 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -1142 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -1143 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -1144 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -1145 │ │ │ │ │ -1146 private: │ │ │ │ │ -1147 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ -1148 │ │ │ │ │ -1150 using fAlloc = typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_f_A_l_l_o_c; │ │ │ │ │ -1152 using rAlloc = typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_A_l_l_o_c; │ │ │ │ │ -1153 │ │ │ │ │ -1154 public: │ │ │ │ │ -1155 // copy base class constructors │ │ │ │ │ -1156 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r::RestartedGMResSolver; │ │ │ │ │ -1157 │ │ │ │ │ -1158 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -1159 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -1160 │ │ │ │ │ -_1_1_6_9 void _a_p_p_l_y (X& x, Y& b, [[maybe_unused]] double reduction, │ │ │ │ │ -_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) override │ │ │ │ │ -1170 { │ │ │ │ │ -1171 using std::abs; │ │ │ │ │ -1172 const Simd::Scalar EPSILON = 1e-80; │ │ │ │ │ -1173 const int m = ___r_e_s_t_a_r_t; │ │ │ │ │ -1174 _r_e_a_l___t_y_p_e norm = 0.0; │ │ │ │ │ -1175 int i, j = 1, k; │ │ │ │ │ -1176 std::vector s(m+1), sn(m); │ │ │ │ │ -1177 std::vector cs(m); │ │ │ │ │ -1178 // helper vector │ │ │ │ │ -1179 Y tmp(b); │ │ │ │ │ -1180 std::vector< std::vector > H(m+1,s); │ │ │ │ │ -1181 std::vector v(m+1,b); │ │ │ │ │ -1182 std::vector w(m+1,b); │ │ │ │ │ -1183 │ │ │ │ │ -1184 Iteration iteration(*this,res); │ │ │ │ │ -1185 // setup preconditioner if it does something in pre │ │ │ │ │ -1186 │ │ │ │ │ -1187 // calculate residual and overwrite a copy of the rhs with it │ │ │ │ │ -1188 ___p_r_e_c->pre(x, b); │ │ │ │ │ -1189 v[0] = b; │ │ │ │ │ -1190 ___o_p->applyscaleadd(-1.0, x, v[0]); // b -= Ax │ │ │ │ │ -1191 │ │ │ │ │ -1192 norm = ___s_p->norm(v[0]); // the residual norm │ │ │ │ │ -1193 if(iteration.step(0, norm)){ │ │ │ │ │ -1194 ___p_r_e_c->post(x); │ │ │ │ │ -1195 return; │ │ │ │ │ -1196 } │ │ │ │ │ -1197 │ │ │ │ │ -1198 // start iterations │ │ │ │ │ -1199 res._c_o_n_v_e_r_g_e_d = false;; │ │ │ │ │ -1200 while(j <= ___m_a_x_i_t && res._c_o_n_v_e_r_g_e_d != true) │ │ │ │ │ -1201 { │ │ │ │ │ -1202 v[0] *= (1.0 / norm); │ │ │ │ │ -1203 s[0] = norm; │ │ │ │ │ -1204 for(i=1; iapply(w[i], v[i]); │ │ │ │ │ -1213 // compute vi = A*wi │ │ │ │ │ -1214 // use v[i+1] as temporary vector for w │ │ │ │ │ -1215 ___o_p->apply(w[i], v[i+1]); │ │ │ │ │ -1216 // do Arnoldi algorithm │ │ │ │ │ -1217 for(int kk=0; kkdot(v[k],v[i+1]) = v[k]\adjoint v[i+1] │ │ │ │ │ -1220 // so one has to pay attention to the order │ │ │ │ │ -1221 // in the scalar product for the complex case │ │ │ │ │ -1222 // doing the modified Gram-Schmidt algorithm │ │ │ │ │ -1223 H[kk][i] = ___s_p->dot(v[kk],v[i+1]); │ │ │ │ │ -1224 // w -= H[k][i] * v[kk] │ │ │ │ │ -1225 v[i+1].axpy(-H[kk][i], v[kk]); │ │ │ │ │ -1226 } │ │ │ │ │ -1227 H[i+1][i] = ___s_p->norm(v[i+1]); │ │ │ │ │ -1228 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON)) │ │ │ │ │ -1229 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t, "breakdown in fGMRes - |w| (-> " │ │ │ │ │ -1230 << w[i] << ") == 0.0 after " │ │ │ │ │ -1231 << j << " iterations"); │ │ │ │ │ -1232 │ │ │ │ │ -1233 // v[i+1] = w*1/H[i+1][i] │ │ │ │ │ -1234 v[i+1] *= _r_e_a_l___t_y_p_e(1.0)/H[i+1][i]; │ │ │ │ │ -1235 │ │ │ │ │ -1236 // update QR factorization │ │ │ │ │ -1237 for(k=0; k_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(H[k][i],H[k+1][i],cs[k],sn[k]); │ │ │ │ │ -1239 │ │ │ │ │ -1240 // compute new givens rotation │ │ │ │ │ -1241 this->_g_e_n_e_r_a_t_e_P_l_a_n_e_R_o_t_a_t_i_o_n(H[i][i],H[i+1][i],cs[i],sn[i]); │ │ │ │ │ -1242 │ │ │ │ │ -1243 // finish updating QR factorization │ │ │ │ │ -1244 this->_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(H[i][i],H[i+1][i],cs[i],sn[i]); │ │ │ │ │ -1245 this->_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(s[i],s[i+1],cs[i],sn[i]); │ │ │ │ │ -1246 │ │ │ │ │ -1247 // norm of the residual is the last component of vector s │ │ │ │ │ -1248 using std::abs; │ │ │ │ │ -1249 norm = abs(s[i+1]); │ │ │ │ │ -1250 iteration.step(j, norm); │ │ │ │ │ -1251 } // end inner for loop │ │ │ │ │ -1252 │ │ │ │ │ -1253 // calculate update vector │ │ │ │ │ -1254 tmp = 0.0; │ │ │ │ │ -1255 this->_u_p_d_a_t_e(tmp, i, H, s, w); │ │ │ │ │ -1256 // and update current iterate │ │ │ │ │ -1257 x += tmp; │ │ │ │ │ -1258 │ │ │ │ │ -1259 // restart fGMRes if convergence was not achieved, │ │ │ │ │ -1260 // i.e. linear residual has not reached desired reduction │ │ │ │ │ -1261 // and if still j < _maxit (do not restart on last iteration) │ │ │ │ │ -1262 if( res._c_o_n_v_e_r_g_e_d != true && j < ___m_a_x_i_t) │ │ │ │ │ -1263 { │ │ │ │ │ -1264 if (___v_e_r_b_o_s_e > 0) │ │ │ │ │ -1265 std::cout << "=== fGMRes::restart" << std::endl; │ │ │ │ │ -1266 // get rhs │ │ │ │ │ -1267 v[0] = b; │ │ │ │ │ -1268 // calculate new defect │ │ │ │ │ -1269 ___o_p->applyscaleadd(-1.0, x,v[0]); // b -= Ax; │ │ │ │ │ -1270 // calculate preconditioned defect │ │ │ │ │ -1271 norm = ___s_p->norm(v[0]); // update the residual norm │ │ │ │ │ -1272 } │ │ │ │ │ -1273 │ │ │ │ │ -1274 } // end outer while loop │ │ │ │ │ -1275 │ │ │ │ │ -1276 // post-process preconditioner │ │ │ │ │ -1277 ___p_r_e_c->post(x); │ │ │ │ │ -1278 } │ │ │ │ │ -1279 │ │ │ │ │ -1280private: │ │ │ │ │ -1281 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -1282 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -1283 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -1284 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -1285 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -1286 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -1287 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___r_e_s_t_a_r_t; │ │ │ │ │ -1288 using Iteration = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -Iteration; │ │ │ │ │ -1289 }; │ │ │ │ │ -_1_2_9_0 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("restartedflexiblegmressolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -1291 │ │ │ │ │ -1305 template │ │ │ │ │ -_1_3_0_6 class _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -1307 { │ │ │ │ │ -1308 public: │ │ │ │ │ -1309 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -1310 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -1311 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -1312 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -1313 │ │ │ │ │ -1314 private: │ │ │ │ │ -1315 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ -1316 │ │ │ │ │ -1318 using fAlloc = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>; │ │ │ │ │ -1319 │ │ │ │ │ -1320 public: │ │ │ │ │ -1321 │ │ │ │ │ -1322 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -1323 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -1324 │ │ │ │ │ -_1_3_3_1 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& │ │ │ │ │ -prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, int restart = 10) : │ │ │ │ │ -1332 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,reduction,maxit,verbose), │ │ │ │ │ -1333 _restart(restart) │ │ │ │ │ -1334 {} │ │ │ │ │ -1335 │ │ │ │ │ -_1_3_4_3 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, const │ │ │ │ │ -_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, │ │ │ │ │ -int maxit, int verbose, int restart = 10) : │ │ │ │ │ -1344 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ -1345 _restart(restart) │ │ │ │ │ -1346 {} │ │ │ │ │ -1347 │ │ │ │ │ -1348 │ │ │ │ │ -_1_3_6_1 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (std::shared_ptr > op, │ │ │ │ │ -std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) │ │ │ │ │ -: │ │ │ │ │ -1362 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,configuration), │ │ │ │ │ -1363 _restart(configuration._g_e_t("restart")) │ │ │ │ │ -1364 {} │ │ │ │ │ -1365 │ │ │ │ │ -_1_3_6_6 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (std::shared_ptr > op, │ │ │ │ │ -std::shared_ptr > sp, std:: │ │ │ │ │ -shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) : │ │ │ │ │ -1367 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,configuration), │ │ │ │ │ -1368 _restart(configuration._g_e_t("restart")) │ │ │ │ │ -1369 {} │ │ │ │ │ -_1_3_7_7 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ -1378 std::shared_ptr> sp, │ │ │ │ │ -1379 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ -1380 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, │ │ │ │ │ -1381 int restart = 10) : │ │ │ │ │ -1382 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ -1383 _restart(restart) │ │ │ │ │ -1384 {} │ │ │ │ │ -1385 │ │ │ │ │ -_1_3_9_1 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -1392 { │ │ │ │ │ -1393 Iteration iteration(*this, res); │ │ │ │ │ -1394 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ -1395 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defect │ │ │ │ │ -1396 │ │ │ │ │ -1397 std::vector > p(_restart); │ │ │ │ │ -1398 std::vector pp(_restart); │ │ │ │ │ -1399 X q(x); // a temporary vector │ │ │ │ │ -1400 X prec_res(x); // a temporary vector for preconditioner output │ │ │ │ │ -1401 │ │ │ │ │ -1402 p[0].reset(new X(x)); │ │ │ │ │ -1403 │ │ │ │ │ -1404 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ -1405 if(iteration.step(0, def)){ │ │ │ │ │ -1406 ___p_r_e_c->post(x); │ │ │ │ │ -1407 return; │ │ │ │ │ -1408 } │ │ │ │ │ -1409 // some local variables │ │ │ │ │ -1410 _f_i_e_l_d___t_y_p_e rho, lambda; │ │ │ │ │ -1411 │ │ │ │ │ -1412 int i=0; │ │ │ │ │ -1413 int ii=0; │ │ │ │ │ -1414 // determine initial search direction │ │ │ │ │ -1415 *(p[0]) = 0; // clear correction │ │ │ │ │ -1416 ___p_r_e_c->apply(*(p[0]),b); // apply preconditioner │ │ │ │ │ -1417 rho = ___s_p->dot(*(p[0]),b); // orthogonalization │ │ │ │ │ -1418 ___o_p->apply(*(p[0]),q); // q=Ap │ │ │ │ │ -1419 pp[0] = ___s_p->dot(*(p[0]),q); // scalar product │ │ │ │ │ -1420 lambda = rho/pp[0]; // minimization │ │ │ │ │ -1421 x.axpy(lambda,*(p[0])); // update solution │ │ │ │ │ -1422 b.axpy(-lambda,q); // update defect │ │ │ │ │ -1423 │ │ │ │ │ -1424 // convergence test │ │ │ │ │ -1425 def=___s_p->norm(b); // comp defect norm │ │ │ │ │ -1426 ++i; │ │ │ │ │ -1427 if(iteration.step(i, def)){ │ │ │ │ │ -1428 ___p_r_e_c->post(x); │ │ │ │ │ -1429 return; │ │ │ │ │ -1430 } │ │ │ │ │ -1431 │ │ │ │ │ -1432 while(i<___m_a_x_i_t) { │ │ │ │ │ -1433 // the loop │ │ │ │ │ -1434 int end=std::min(_restart, ___m_a_x_i_t-i+1); │ │ │ │ │ -1435 for (ii=1; ii()); │ │ │ │ │ -1488 │ │ │ │ │ -1500 template │ │ │ │ │ -_1_5_0_1 class _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ -1502 public: │ │ │ │ │ -1503 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -1504 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -1505 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -1506 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -1507 │ │ │ │ │ -1508 private: │ │ │ │ │ -1509 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ -1510 │ │ │ │ │ -1511 public: │ │ │ │ │ -1512 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -1513 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -_1_5_1_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& │ │ │ │ │ -prec, │ │ │ │ │ -1520 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, int mmax = 10) : │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, prec, reduction, maxit, verbose), ___m_m_a_x(mmax) │ │ │ │ │ -1521 { │ │ │ │ │ -1522 } │ │ │ │ │ -1523 │ │ │ │ │ -_1_5_2_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, const _S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& │ │ │ │ │ -sp, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, │ │ │ │ │ -1530 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, int mmax = 10) : │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, verbose), ___m_m_a_x(mmax) │ │ │ │ │ -1531 { │ │ │ │ │ -1532 } │ │ │ │ │ -1533 │ │ │ │ │ -_1_5_3_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ -1540 std::shared_ptr> sp, │ │ │ │ │ -1541 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ -1542 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, │ │ │ │ │ -1543 int mmax = 10) │ │ │ │ │ -1544 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, verbose), ___m_m_a_x │ │ │ │ │ -(mmax) │ │ │ │ │ -1545 {} │ │ │ │ │ -1546 │ │ │ │ │ -_1_5_5_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ -1560 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ -1561 const ParameterTree& config) │ │ │ │ │ -1562 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, prec, config), ___m_m_a_x(config._g_e_t("mmax", 10)) │ │ │ │ │ -1563 {} │ │ │ │ │ -1564 │ │ │ │ │ -_1_5_6_5 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ -1566 std::shared_ptr> sp, │ │ │ │ │ -1567 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ -1568 const ParameterTree& config) │ │ │ │ │ -1569 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, config), ___m_m_a_x(config._g_e_t("mmax", │ │ │ │ │ -10)) │ │ │ │ │ -1570 {} │ │ │ │ │ -1571 │ │ │ │ │ -_1_5_8_4 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -1585 { │ │ │ │ │ -1586 using rAlloc = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>; │ │ │ │ │ -1587 res._c_l_e_a_r(); │ │ │ │ │ -1588 _I_t_e_r_a_t_i_o_n iteration(*this,res); │ │ │ │ │ -1589 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ -1590 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defect │ │ │ │ │ -1591 │ │ │ │ │ -1592 //arrays for interim values: │ │ │ │ │ -1593 std::vector d(___m_m_a_x+1, x); // array for directions │ │ │ │ │ -1594 std::vector Ad(___m_m_a_x+1, x); // array for Ad[i] │ │ │ │ │ -1595 std::vector ddotAd(___m_m_a_x+1,0); // array for │ │ │ │ │ -1596 X w(x); │ │ │ │ │ -1597 │ │ │ │ │ -1598 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ -1599 if(iteration.step(0, def)){ │ │ │ │ │ -1600 ___p_r_e_c->post(x); │ │ │ │ │ -1601 return; │ │ │ │ │ -1602 } │ │ │ │ │ -1603 │ │ │ │ │ -1604 // some local variables │ │ │ │ │ -1605 _f_i_e_l_d___t_y_p_e alpha; │ │ │ │ │ -1606 │ │ │ │ │ -1607 // the loop │ │ │ │ │ -1608 int i=1; │ │ │ │ │ -1609 int i_bounded=0; │ │ │ │ │ -1610 while(i<=___m_a_x_i_t && !res._c_o_n_v_e_r_g_e_d) { │ │ │ │ │ -1611 for (; i_bounded <= ___m_m_a_x && i<= ___m_a_x_i_t; i_bounded++) { │ │ │ │ │ -1612 d[i_bounded] = 0; // reset search direction │ │ │ │ │ -1613 ___p_r_e_c->apply(d[i_bounded], b); // apply preconditioner │ │ │ │ │ -1614 w = d[i_bounded]; // copy of current d[i] │ │ │ │ │ -1615 // orthogonalization with previous directions │ │ │ │ │ -1616 orthogonalizations(i_bounded,Ad,w,ddotAd,d); │ │ │ │ │ -1617 │ │ │ │ │ -1618 //saving interim values for future calculating │ │ │ │ │ -1619 ___o_p->apply(d[i_bounded], Ad[i_bounded]); // save Ad[i] │ │ │ │ │ -1620 ddotAd[i_bounded]=___s_p->dot(d[i_bounded],Ad[i_bounded]); // save │ │ │ │ │ -1621 alpha = ___s_p->dot(d[i_bounded], b)/ddotAd[i_bounded]; // / │ │ │ │ │ -1622 │ │ │ │ │ -1623 //update solution and defect │ │ │ │ │ -1624 x.axpy(alpha, d[i_bounded]); │ │ │ │ │ -1625 b.axpy(-alpha, Ad[i_bounded]); │ │ │ │ │ -1626 │ │ │ │ │ -1627 // convergence test │ │ │ │ │ -1628 def = ___s_p->norm(b); // comp defect norm │ │ │ │ │ -1629 │ │ │ │ │ -1630 iteration.step(i, def); │ │ │ │ │ -1631 i++; │ │ │ │ │ -1632 } │ │ │ │ │ -1633 //restart: exchange first and last stored values │ │ │ │ │ -1634 cycle(Ad,d,ddotAd,i_bounded); │ │ │ │ │ -1635 } │ │ │ │ │ -1636 │ │ │ │ │ -1637 //correct i which is wrong if convergence was not achieved. │ │ │ │ │ -1638 i=std::min(___m_a_x_i_t,i); │ │ │ │ │ -1639 │ │ │ │ │ -1640 ___p_r_e_c->post(x); // postprocess preconditioner │ │ │ │ │ -1641 } │ │ │ │ │ -1642 │ │ │ │ │ -1643 private: │ │ │ │ │ -1644 //This function is called every iteration to orthogonalize against the │ │ │ │ │ -last search directions │ │ │ │ │ -1645 virtual void orthogonalizations(const int& i_bounded,const std::vector& │ │ │ │ │ -Ad, const X& w, const std:: │ │ │ │ │ -vector<_f_i_e_l_d___t_y_p_e,_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>>& ddotAd,std::vector& │ │ │ │ │ -d) { │ │ │ │ │ -1646 // The RestartedFCGSolver uses only values with lower array index; │ │ │ │ │ -1647 for (int k = 0; k < i_bounded; k++) { │ │ │ │ │ -1648 d[i_bounded].axpy(-___s_p->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= </>d[k] │ │ │ │ │ -1649 } │ │ │ │ │ -1650 } │ │ │ │ │ -1651 │ │ │ │ │ -1652 // This function is called every mmax iterations to handle limited array │ │ │ │ │ -sizes. │ │ │ │ │ -1653 virtual void cycle(std::vector& Ad,std::vector& d,std:: │ │ │ │ │ -vector<_f_i_e_l_d___t_y_p_e,ReboundAllocatorType >& ddotAd,int& i_bounded) │ │ │ │ │ -{ │ │ │ │ │ -1654 // Reset loop index and exchange the first and last arrays │ │ │ │ │ -1655 i_bounded = 1; │ │ │ │ │ -1656 std::swap(Ad[0], Ad[___m_m_a_x]); │ │ │ │ │ -1657 std::swap(d[0], d[___m_m_a_x]); │ │ │ │ │ -1658 std::swap(ddotAd[0], ddotAd[___m_m_a_x]); │ │ │ │ │ -1659 } │ │ │ │ │ -1660 │ │ │ │ │ -1661 protected: │ │ │ │ │ -_1_6_6_2 int ___m_m_a_x; │ │ │ │ │ -1663 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -1664 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -1665 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -1666 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -1667 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -1668 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -_1_6_6_9 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ -1670 }; │ │ │ │ │ -_1_6_7_1 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("restartedfcgsolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -1672 │ │ │ │ │ -1679 template │ │ │ │ │ -_1_6_8_0 class _C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r : public _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r { │ │ │ │ │ -1681 public: │ │ │ │ │ -1682 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -1683 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -1684 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -1685 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -1686 │ │ │ │ │ -1687 // copy base class constructors │ │ │ │ │ -1688 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r::RestartedFCGSolver; │ │ │ │ │ -1689 │ │ │ │ │ -1690 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ -1691 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ -1692 │ │ │ │ │ -1693 // just a minor part of the RestartedFCGSolver apply method will be │ │ │ │ │ -modified │ │ │ │ │ -_1_6_9_4 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) override { │ │ │ │ │ -1695 // reset limiter of orthogonalization loop │ │ │ │ │ -1696 _k_limit = 0; │ │ │ │ │ -1697 this->_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_a_p_p_l_y(x,b,res); │ │ │ │ │ -1698 }; │ │ │ │ │ -1699 │ │ │ │ │ -1700 private: │ │ │ │ │ -1701 // This function is called every iteration to orthogonalize against the │ │ │ │ │ -last search directions. │ │ │ │ │ -1702 virtual void orthogonalizations(const int& i_bounded,const std::vector& │ │ │ │ │ -Ad, const X& w, const std:: │ │ │ │ │ -vector<_f_i_e_l_d___t_y_p_e,_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>>& ddotAd,std::vector& │ │ │ │ │ -d) override { │ │ │ │ │ -1703 // This FCGSolver uses values with higher array indexes too, if existent. │ │ │ │ │ -1704 for (int k = 0; k < _k_limit; k++) { │ │ │ │ │ -1705 if(i_bounded!=k) │ │ │ │ │ -1706 d[i_bounded].axpy(-___s_p->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= </>d[k] │ │ │ │ │ -1707 } │ │ │ │ │ -1708 // The loop limit increase, if array is not completely filled. │ │ │ │ │ -1709 if(_k_limit<=i_bounded) │ │ │ │ │ -1710 _k_limit++; │ │ │ │ │ -1711 │ │ │ │ │ -1712 }; │ │ │ │ │ -1713 │ │ │ │ │ -1714 // This function is called every mmax iterations to handle limited array │ │ │ │ │ -sizes. │ │ │ │ │ -1715 virtual void cycle(std::vector& Ad, [[maybe_unused]] std::vector& d, │ │ │ │ │ -[[maybe_unused]] std::vector<_f_i_e_l_d___t_y_p_e,ReboundAllocatorType >& │ │ │ │ │ -ddotAd,int& i_bounded) override { │ │ │ │ │ -1716 // Only the loop index i_bounded return to 0, if it reached mmax. │ │ │ │ │ -1717 i_bounded = 0; │ │ │ │ │ -1718 // Now all arrays are filled and the loop in void orthogonalizations can │ │ │ │ │ -use the whole arrays. │ │ │ │ │ -1719 _k_limit = Ad.size(); │ │ │ │ │ -1720 }; │ │ │ │ │ -1721 │ │ │ │ │ -1722 int _k_limit = 0; │ │ │ │ │ -1723 │ │ │ │ │ -1724 protected: │ │ │ │ │ -1725 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___m_m_a_x; │ │ │ │ │ -1726 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ -1727 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ -1728 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ -1729 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -1730 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ -1731 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ -1732 }; │ │ │ │ │ -_1_7_3_3 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("completefcgsolver", │ │ │ │ │ -defaultIterativeSolverCreator()); │ │ │ │ │ -1735} // end namespace │ │ │ │ │ -1736 │ │ │ │ │ -1737#endif │ │ │ │ │ -_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R │ │ │ │ │ -#define DUNE_REGISTER_ITERATIVE_SOLVER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:19 │ │ │ │ │ -_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_a_l_l_o_c_a_t_o_r_._h_h │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ -_s_o_l_v_e_r_._h_h │ │ │ │ │ -Define general, extensible interface for inverse operators. │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ -_a_r_p_a_c_k_p_p_._h_h │ │ │ │ │ +939 template │ │ │ │ │ +_9_4_0 std::size_t _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_m_a_x_l_e_v_e_l_s() const │ │ │ │ │ +941 { │ │ │ │ │ +942 return maxlevels_; │ │ │ │ │ +943 } │ │ │ │ │ +944 │ │ │ │ │ +945 template │ │ │ │ │ +_9_4_6 bool _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_h_a_s_C_o_a_r_s_e_s_t() const │ │ │ │ │ +947 { │ │ │ │ │ +948 return levels()==maxlevels() && │ │ │ │ │ +949 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N │ │ │ │ │ +()>0); │ │ │ │ │ +950 } │ │ │ │ │ +951 │ │ │ │ │ +952 template │ │ │ │ │ +_9_5_3 bool _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_i_s_B_u_i_l_t() const │ │ │ │ │ +954 { │ │ │ │ │ +955 return built_; │ │ │ │ │ +956 } │ │ │ │ │ +957 │ │ │ │ │ +959 } // namespace Amg │ │ │ │ │ +960} // namespace Dune │ │ │ │ │ +961 │ │ │ │ │ +962#endif // end DUNE_AMG_MATRIXHIERARCHY_HH │ │ │ │ │ +_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h │ │ │ │ │ +Functionality for redistributing a sparse matrix. │ │ │ │ │ +_g_r_a_p_h_c_r_e_a_t_o_r_._h_h │ │ │ │ │ +_h_i_e_r_a_r_c_h_y_._h_h │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. │ │ │ │ │ +_g_l_o_b_a_l_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ +Provdes class for identifying aggregates globally. │ │ │ │ │ +_s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ +Classes for the generic construction and application of the smoothers. │ │ │ │ │ +_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ +Provides classes for the Coloring process of AMG. │ │ │ │ │ +_i_n_d_i_c_e_s_c_o_a_r_s_e_n_e_r_._h_h │ │ │ │ │ +Provides a class for building the index set and remote indices on the coarse │ │ │ │ │ +level. │ │ │ │ │ +_g_r_a_p_h_._h_h │ │ │ │ │ +Provides classes for building the matrix graph. │ │ │ │ │ +_c_o_n_s_t_r_u_c_t_i_o_n_._h_h │ │ │ │ │ +Helper classes for the construction of classes without empty constructor. │ │ │ │ │ +_d_e_p_e_n_d_e_n_c_y_._h_h │ │ │ │ │ +Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ +_r_e_n_u_m_b_e_r_e_r_._h_h │ │ │ │ │ +_g_a_l_e_r_k_i_n_._h_h │ │ │ │ │ +Provides a class for building the galerkin product based on a aggregation │ │ │ │ │ +scheme. │ │ │ │ │ +_t_r_a_n_s_f_e_r_._h_h │ │ │ │ │ +Prolongation and restriction for amg. │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ +Some handy generic functions for ISTL matrices. │ │ │ │ │ +_D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s │ │ │ │ │ +auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ +value > *sfinae=nullptr) │ │ │ │ │ +Get the number of nonzero fields in the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:119 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_a_g_g_r_e_g_a_t_e_s_M_a_p_s │ │ │ │ │ +const AggregatesMapList & aggregatesMaps() const │ │ │ │ │ +Get the hierarchy of the mappings of the nodes onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:812 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_i_s_B_u_i_l_t │ │ │ │ │ +bool isBuilt() const │ │ │ │ │ +Whether the hierarchy was built. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:953 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_h_a_s_C_o_a_r_s_e_s_t │ │ │ │ │ +bool hasCoarsest() const │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:946 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_l_e_v_e_l_s │ │ │ │ │ +std::size_t levels() const │ │ │ │ │ +Get the number of levels in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_l_e_v_e_l_s │ │ │ │ │ +std::size_t levels() const │ │ │ │ │ +Get the number of levels in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:934 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_C_o_a_r_s_e_r │ │ │ │ │ +void addCoarser(Arguments &args) │ │ │ │ │ +Add an element on a coarser level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_r_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +const RedistributeInfoList & redistributeInformation() const │ │ │ │ │ +Get the hierarchy of the information about redistributions,. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:818 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_p_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +const ParallelInformationHierarchy & parallelInformation() const │ │ │ │ │ +Get the hierarchy of the parallel data distribution information. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:737 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x │ │ │ │ │ +bool repartitionAndDistributeMatrix(const M &origMatrix, std::shared_ptr< M > │ │ │ │ │ +newMatrix, SequentialInformation &origComm, std::shared_ptr< │ │ │ │ │ +SequentialInformation > &newComm, RedistributeInformation< │ │ │ │ │ +SequentialInformation > &ri, int nparts, C1 &criterion) │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:725 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_m_a_t_r_i_c_e_s │ │ │ │ │ +const ParallelMatrixHierarchy & matrices() const │ │ │ │ │ +Get the matrix hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:730 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ +std::size_t maxlevels() const │ │ │ │ │ +Get the max number of levels in the hierarchy of processors. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:940 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ +static const V ISOLATED │ │ │ │ │ +Identifier of isolated vertices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:571 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_r_e_c_a_l_c_u_l_a_t_e_G_a_l_e_r_k_i_n │ │ │ │ │ +void recalculateGalerkin(const F ©Flags) │ │ │ │ │ +Recalculate the galerkin products. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:898 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const void * Arguments │ │ │ │ │ +A type holding all the arguments needed to call the constructor. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ +std::size_t noVertices() const │ │ │ │ │ +Get the number of vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ +Construct an object with the specified arguments. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_n_V_e_c_t_o_r │ │ │ │ │ +void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const │ │ │ │ │ +Coarsen the vector hierarchy according to the matrix hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:841 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +const AggregateDescriptor * const_iterator │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:723 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr< │ │ │ │ │ +ParallelInformation > pinfo=std::make_shared< ParallelInformation >()) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:389 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e │ │ │ │ │ +AccumulationMode │ │ │ │ │ +Identifiers for the different accumulation modes. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_f_i_n_e_s_t │ │ │ │ │ +Iterator finest() │ │ │ │ │ +Get an iterator positioned at the finest level. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:377 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_b_u_i_l_d │ │ │ │ │ +void build(const T &criterion) │ │ │ │ │ +Build the matrix hierarchy using aggregation. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:400 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +Free the allocated memory. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_n_S_m_o_o_t_h_e_r │ │ │ │ │ +void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename │ │ │ │ │ +SmootherTraits< S >::Arguments &args) const │ │ │ │ │ +Coarsen the smoother hierarchy according to the matrix hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:868 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_b_u_i_l_d_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, │ │ │ │ │ +bool finestLevel) │ │ │ │ │ +Build the dependency of the matrix graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s │ │ │ │ │ +std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, │ │ │ │ │ +const C &criterion, bool finestLevel) │ │ │ │ │ +Build the aggregates. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_c_a_l_c_u_l_a_t_e │ │ │ │ │ +void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, │ │ │ │ │ +const I &pinfo, const O ©) │ │ │ │ │ +Calculate the galerkin product. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_s_O_n_F_i_n_e_s_t │ │ │ │ │ +void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const │ │ │ │ │ +Get the mapping of fine level unknowns to coarse level aggregates. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:743 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_~_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +~MatrixHierarchy() │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:824 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_A_X___P_R_O_C_E_S_S_E_S │ │ │ │ │ +@ MAX_PROCESSES │ │ │ │ │ +Hard limit for the number of processes allowed. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_a_t_O_n_c_e_A_c_c_u │ │ │ │ │ +@ atOnceAccu │ │ │ │ │ +Accumulate data to one process at once. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u │ │ │ │ │ +@ successiveAccu │ │ │ │ │ +Successively accumulate to fewer processes. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:248 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x │ │ │ │ │ +void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:154 │ │ │ │ │ _D_u_n_e_:_:_g_e_t │ │ │ │ │ PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e │ │ │ │ │ -typename std::allocator_traits< typename AllocatorTraits< T >::type >::template │ │ │ │ │ -rebind_alloc< X > ReboundAllocatorType │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w___w_i_s_e │ │ │ │ │ -@ row_wise │ │ │ │ │ -Build in a row-wise manner. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:521 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ -CreateIterator createend() │ │ │ │ │ -get create iterator pointing to one after the last block │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1103 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ -CreateIterator createbegin() │ │ │ │ │ -get initial create iterator │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s │ │ │ │ │ +void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ +&newComm, RedistributeInformation< C > &ri) │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:757 │ │ │ │ │ +_D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ +bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< │ │ │ │ │ +T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ +&redistInf, bool verbose=false) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:829 │ │ │ │ │ +_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x │ │ │ │ │ +void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, │ │ │ │ │ +RedistributeInformation< C > &ri) │ │ │ │ │ +Redistribute a matrix according to given domain decompositions. │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:820 │ │ │ │ │ +_D_u_n_e_:_:_g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ +bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, │ │ │ │ │ +T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ +&redistInf, bool verbose=false) │ │ │ │ │ +execute a graph repartition for a giving graph and indexset. │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:1235 │ │ │ │ │ _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ A vector of blocks with memory management. │ │ │ │ │ DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -Wrapper to use a range of ARPACK++ eigenvalue solvers. │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e │ │ │ │ │ -void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ -const │ │ │ │ │ -Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ -approximation lambda of its ... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e │ │ │ │ │ -void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ -const │ │ │ │ │ -Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ -approximation lambda of its ... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:391 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ -Thrown when a solver aborts due to some problem. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -A linear operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Base class for scalar product and norm computation. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e │ │ │ │ │ -double condition_estimate │ │ │ │ │ -Estimate of condition number. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Resets all data. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e │ │ │ │ │ -Simd::Scalar< real_type > scalar_real_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -Type of the range of the operator to be inverted. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -Type of the domain of the operator to be inverted. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -The real type of the field type (is the same if using real numbers, but differs │ │ │ │ │ -for std::complex) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -Base class for all implementations of iterative solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___s_p │ │ │ │ │ -std::shared_ptr< const ScalarProduct< X > > _sp │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:506 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___o_p │ │ │ │ │ -std::shared_ptr< const LinearOperator< X, X > > _op │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___m_a_x_i_t │ │ │ │ │ -int _maxit │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:508 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___v_e_r_b_o_s_e │ │ │ │ │ -int _verbose │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:509 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___r_e_d_u_c_t_i_o_n │ │ │ │ │ -scalar_real_type _reduction │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:507 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___p_r_e_c │ │ │ │ │ -std::shared_ptr< Preconditioner< X, X > > _prec │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r │ │ │ │ │ -Preconditioned loop solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator,. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r │ │ │ │ │ -gradient method │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:187 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ -conjugate gradient method │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:193 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ -CGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< │ │ │ │ │ -ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, │ │ │ │ │ -scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) │ │ │ │ │ -Constructor to initialize a CG solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:256 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e │ │ │ │ │ -static constexpr bool enableConditionEstimate │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ -CGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, │ │ │ │ │ -Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ -verbose, bool condition_estimate) │ │ │ │ │ -Constructor to initialize a CG solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:239 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ -CGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, │ │ │ │ │ -scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) │ │ │ │ │ -Constructor to initialize a CG solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:222 │ │ │ │ │ -_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:412 │ │ │ │ │ -_D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r │ │ │ │ │ -Bi-conjugate Gradient Stabilized (BiCG-STAB) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:419 │ │ │ │ │ -_D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< CountType > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:598 │ │ │ │ │ -_D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:439 │ │ │ │ │ -_D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r │ │ │ │ │ -Minimal Residual Method (MINRES) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:609 │ │ │ │ │ -_D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:808 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -implements the Generalized Minimal Residual (GMRes) method │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:827 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ -shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:878 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_c_o_n_j_u_g_a_t_e │ │ │ │ │ -std::enable_if::value, T >::type │ │ │ │ │ -conjugate(const T &t) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1067 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -X > > prec, const ParameterTree &configuration) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:883 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(X &w, int i, const std::vector< std::vector< field_type, fAlloc > > │ │ │ │ │ -&H, const std::vector< field_type, fAlloc > &s, const std::vector< X > &v) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1039 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_c_o_n_j_u_g_a_t_e │ │ │ │ │ -std::enable_if< std::is_same< field_type, real_type >::value, T >::type │ │ │ │ │ -conjugate(const T &t) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1062 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_f_A_l_l_o_c │ │ │ │ │ -ReboundAllocatorType< X, field_type > fAlloc │ │ │ │ │ -field_type Allocator retrieved from domain type │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:838 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___r_e_s_t_a_r_t │ │ │ │ │ -int _restart │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1120 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_r_A_l_l_o_c │ │ │ │ │ -ReboundAllocatorType< X, real_type > rAlloc │ │ │ │ │ -real_type Allocator retrieved from domain type │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:840 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:923 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -RestartedGMResSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > │ │ │ │ │ -&prec, scalar_real_type reduction, int restart, int maxit, int verbose) │ │ │ │ │ -Set up RestartedGMResSolver solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:850 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -RestartedGMResSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > │ │ │ │ │ -&sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int │ │ │ │ │ -maxit, int verbose) │ │ │ │ │ -Set up RestartedGMResSolver solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_g_e_n_e_r_a_t_e_P_l_a_n_e_R_o_t_a_t_i_o_n │ │ │ │ │ -void generatePlaneRotation(field_type &dx, field_type &dy, real_type &cs, │ │ │ │ │ -field_type &sn) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1073 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -Y > > prec, scalar_real_type reduction, int restart, int maxit, int verbose) │ │ │ │ │ -Set up RestartedGMResSolver solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:894 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, Y &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:910 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1119 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n │ │ │ │ │ -void applyPlaneRotation(field_type &dx, field_type &dy, real_type &cs, │ │ │ │ │ -field_type &sn) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1106 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ -implements the Flexible Generalized Minimal Residual (FGMRes) method (right │ │ │ │ │ -preconditioned) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1139 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) override │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1169 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -Generalized preconditioned conjugate gradient solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1307 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -GeneralizedPCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > │ │ │ │ │ -&sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ -verbose, int restart=10) │ │ │ │ │ -Set up nonlinear preconditioned conjugate gradient solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1343 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -GeneralizedPCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > │ │ │ │ │ -&prec, scalar_real_type reduction, int maxit, int verbose, int restart=10) │ │ │ │ │ -Set up nonlinear preconditioned conjugate gradient solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1331 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1391 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ -shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1361 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -X > > prec, scalar_real_type reduction, int maxit, int verbose, int restart=10) │ │ │ │ │ -Set up nonlinear preconditioned conjugate gradient solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1377 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -X > > prec, const ParameterTree &configuration) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1366 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ -Accelerated flexible conjugate gradient method. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1501 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ -RestartedFCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > │ │ │ │ │ -&prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10) │ │ │ │ │ -Constructor to initialize a RestartedFCG solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1519 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ -RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ -shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config) │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +Type for indices and sizes. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ +The type implementing a matrix row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +Class representing the properties of an ede in the matrix graph. │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +Class representing a node in the matrix graph. │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ +DDeeffiinniittiioonn globalaggregates.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +The (undirected) graph of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +Attaches properties to the edges and vertices of a graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:988 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn graphcreator.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ +A hierarchy of containers (e.g. matrices or vectors) │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator > │ │ │ │ │ +Iterator │ │ │ │ │ +Type of the mutable iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const │ │ │ │ │ +MatrixOperator > ConstIterator │ │ │ │ │ +Type of the const iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +The hierarchies build by the coarsening process. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_A_l_l_o_c_a_t_o_r │ │ │ │ │ +typename std::allocator_traits< Allocator >::template rebind_alloc< │ │ │ │ │ +AggregatesMap * > AAllocator │ │ │ │ │ +Allocator for pointers. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Dune::Amg::Hierarchy< ParallelInformation, Allocator > │ │ │ │ │ +ParallelInformationHierarchy │ │ │ │ │ +The type of the parallel informarion hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t │ │ │ │ │ +std::list< AggregatesMap *, AAllocator > AggregatesMapList │ │ │ │ │ +The type of the aggregates maps list. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +PI ParallelInformation │ │ │ │ │ +The type of the index set. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy │ │ │ │ │ +The type of the parallel matrix hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +A Allocator │ │ │ │ │ +The allocator to use. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e │ │ │ │ │ +RedistributeInformation< ParallelInformation > RedistributeInfoType │ │ │ │ │ +The type of the redistribute information. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r │ │ │ │ │ +double getProlongationDampingFactor() const │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_R_I_L_A_l_l_o_c_a_t_o_r │ │ │ │ │ +typename std::allocator_traits< Allocator >::template rebind_alloc< │ │ │ │ │ +RedistributeInfoType > RILAllocator │ │ │ │ │ +Allocator for RedistributeInfoType. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t │ │ │ │ │ +std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList │ │ │ │ │ +The type of the list of redistribute information. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > │ │ │ │ │ +AggregatesMap │ │ │ │ │ +The type of the aggregates map we use. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x │ │ │ │ │ +MatrixOperator::matrix_type Matrix │ │ │ │ │ +The type of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_O_p_e_r_a_t_o_r │ │ │ │ │ +M MatrixOperator │ │ │ │ │ +The type of the matrix operator. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const matrix_row &row) │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_m_a_t_r_i_x___r_o_w │ │ │ │ │ +Matrix::row_type matrix_row │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_m_i_n │ │ │ │ │ +size_type min │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_c_a_l_c │ │ │ │ │ +calc() │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:247 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_m_a_x │ │ │ │ │ +size_type max │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_s_u_m │ │ │ │ │ +size_type sum │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +The criterion describing the stop criteria for the coarsening process. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +CoarsenCriterion(const Dune::Amg::Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +T AggregationCriterion │ │ │ │ │ +The criterion for tagging connections as strong and nodes as isolated. This │ │ │ │ │ +might be e.... │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double │ │ │ │ │ +minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode │ │ │ │ │ +accumulate=successiveAccu) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1559 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ -RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -X > > prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10) │ │ │ │ │ -Constructor to initialize a RestartedFCG solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1539 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___m_m_a_x │ │ │ │ │ -int _mmax │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1662 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ -RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -X > > prec, const ParameterTree &config) │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1565 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1669 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1584 │ │ │ │ │ -_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ -RestartedFCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > │ │ │ │ │ -&sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ -verbose, int mmax=10) │ │ │ │ │ -Constructor to initialize a RestartedFCG solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1529 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r │ │ │ │ │ -Complete flexible conjugate gradient method. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1680 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, InverseOperatorResult &res) override │ │ │ │ │ -Apply inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1694 │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +All parameters for AMG. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ +Tag idnetifying the visited property of a vertex. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +The default class for the smoother arguments. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ +Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ +newly introduced virtu... │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00074.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: allocator.hh File Reference │ │ │ │ +dune-istl: kamg.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,56 +65,51 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
allocator.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ + │ │ │ │ +

Provides an algebraic multigrid using a Krylov cycle. │ │ │ │ +More...

│ │ │ │ +
#include <dune/istl/preconditioners.hh>
│ │ │ │ +#include "amg.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::exists< T >
 
struct  Dune::DefaultAllocatorTraits< T, typename >
 
struct  Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > >
class  Dune::Amg::KAmgTwoGrid< AMG >
 Two grid operator for AMG with Krylov cycle. More...
 
struct  Dune::AllocatorTraits< T >
class  Dune::Amg::KAMG< M, X, S, PI, K, A >
 an algebraic multigrid method using a Krylov-cycle. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<typename T >
using Dune::AllocatorType = typename AllocatorTraits< T >::type
 
template<typename T , typename X >
using Dune::ReboundAllocatorType = typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X >
 
namespace  Dune::Amg
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Provides an algebraic multigrid using a Krylov cycle.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,35 +1,33 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -allocator.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +kamg.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Provides an algebraic multigrid using a Krylov cycle. _M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +#include "_a_m_g_._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_:_:_e_x_i_s_t_s_<_ _T_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_<_ _A_M_G_ _> │ │ │ │ │ +  Two grid operator for _A_M_G with Krylov cycle. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _t_y_p_e_n_a_m_e_ _T_:_: │ │ │ │ │ - _a_l_l_o_c_a_t_o_r___t_y_p_e_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_<_ _M_,_ _X_,_ _S_,_ _P_I_,_ _K_,_ _A_ _> │ │ │ │ │ +  an algebraic multigrid method using a Krylov-cycle. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_y_p_e = typename _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s< T >::type │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e = typename std::allocator_traits< typename │ │ │ │ │ - _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s< T >::type >::template rebind_alloc< X > │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provides an algebraic multigrid using a Krylov cycle. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00074_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: allocator.hh Source File │ │ │ │ +dune-istl: kamg.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,80 +70,336 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
allocator.hh
│ │ │ │ +
kamg.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#ifndef DUNE_ISTL_ALLOCATOR_HH
│ │ │ │ -
4#define DUNE_ISTL_ALLOCATOR_HH
│ │ │ │ -
5
│ │ │ │ -
6#include <memory>
│ │ │ │ -
7#include <type_traits>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/typetraits.hh>
│ │ │ │ +
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
5#ifndef DUNE_AMG_KAMG_HH
│ │ │ │ +
6#define DUNE_AMG_KAMG_HH
│ │ │ │ +
7
│ │ │ │ + │ │ │ │ +
9#include "amg.hh"
│ │ │ │
10
│ │ │ │ -
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12
│ │ │ │ -
13 template<typename T>
│ │ │ │ -
│ │ │ │ -
14 struct exists{
│ │ │ │ -
15 static const bool value = true;
│ │ │ │ -
16 };
│ │ │ │ -
│ │ │ │ -
17
│ │ │ │ -
18 template<typename T, typename = void>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
20 {
│ │ │ │ -
21 using type = std::allocator<T>;
│ │ │ │ -
22 };
│ │ │ │ -
│ │ │ │ -
23
│ │ │ │ -
24 template<typename T>
│ │ │ │ -
│ │ │ │ -
25 struct DefaultAllocatorTraits<T, std::void_t<typename T::allocator_type> >
│ │ │ │ -
26 {
│ │ │ │ -
27 using type = typename T::allocator_type;
│ │ │ │ -
28 };
│ │ │ │ -
│ │ │ │ -
29
│ │ │ │ -
30 template<typename T>
│ │ │ │ - │ │ │ │ -
32
│ │ │ │ -
33 template<typename T>
│ │ │ │ - │ │ │ │ -
35
│ │ │ │ -
36 template<typename T, typename X>
│ │ │ │ -
37 using ReboundAllocatorType = typename std::allocator_traits<typename AllocatorTraits<T>::type>::template rebind_alloc<X>;
│ │ │ │ -
38
│ │ │ │ -
39} // end namespace Dune
│ │ │ │ -
│ │ │ │ -
40
│ │ │ │ -
41#endif // DUNE_ISTL_ALLOCATOR_HH
│ │ │ │ -
STL namespace.
│ │ │ │ +
11namespace Dune
│ │ │ │ +
12{
│ │ │ │ +
13 namespace Amg
│ │ │ │ +
14 {
│ │ │ │ +
15
│ │ │ │ +
30 template<class AMG>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
32 : public Preconditioner<typename AMG::Domain,typename AMG::Range>
│ │ │ │ +
33 {
│ │ │ │ +
35 typedef typename AMG::Domain Domain;
│ │ │ │ +
37 typedef typename AMG::Range Range;
│ │ │ │ +
38 public:
│ │ │ │ +
39
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
42 {
│ │ │ │ +
43 return amg_.category();
│ │ │ │ +
44 };
│ │ │ │ +
│ │ │ │ +
45
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
54 : amg_(amg), coarseSolver_(coarseSolver)
│ │ │ │ +
55 {}
│ │ │ │ +
│ │ │ │ +
56
│ │ │ │ +
│ │ │ │ +
58 void pre([[maybe_unused]] typename AMG::Domain& x, [[maybe_unused]] typename AMG::Range& b)
│ │ │ │ +
59 {}
│ │ │ │ +
│ │ │ │ +
60
│ │ │ │ +
│ │ │ │ +
62 void post([[maybe_unused]] typename AMG::Domain& x)
│ │ │ │ +
63 {}
│ │ │ │ +
│ │ │ │ +
64
│ │ │ │ +
│ │ │ │ +
66 void apply(typename AMG::Domain& v, const typename AMG::Range& d)
│ │ │ │ +
67 {
│ │ │ │ +
68 // Copy data
│ │ │ │ +
69 *levelContext_->update=0;
│ │ │ │ +
70 *levelContext_->rhs = d;
│ │ │ │ +
71 *levelContext_->lhs = v;
│ │ │ │ +
72
│ │ │ │ +
73 presmooth(*levelContext_, amg_.preSteps_);
│ │ │ │ +
74 bool processFineLevel =
│ │ │ │ +
75 amg_.moveToCoarseLevel(*levelContext_);
│ │ │ │ +
76
│ │ │ │ +
77 if(processFineLevel) {
│ │ │ │ +
78 typename AMG::Range b=*levelContext_->rhs;
│ │ │ │ +
79 typename AMG::Domain x=*levelContext_->update;
│ │ │ │ + │ │ │ │ +
81 coarseSolver_->apply(x, b, res);
│ │ │ │ +
82 *levelContext_->update=x;
│ │ │ │ +
83 }
│ │ │ │ +
84
│ │ │ │ +
85 amg_.moveToFineLevel(*levelContext_, processFineLevel);
│ │ │ │ +
86
│ │ │ │ +
87 postsmooth(*levelContext_, amg_.postSteps_);
│ │ │ │ +
88 v=*levelContext_->update;
│ │ │ │ +
89 }
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
96 {
│ │ │ │ +
97 return coarseSolver_;
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
│ │ │ │ +
104 void setLevelContext(std::shared_ptr<typename AMG::LevelContext> p)
│ │ │ │ +
105 {
│ │ │ │ +
106 levelContext_=p;
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
111 {}
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
113 private:
│ │ │ │ +
115 AMG& amg_;
│ │ │ │ +
117 std::shared_ptr<InverseOperator<Domain,Range> > coarseSolver_;
│ │ │ │ +
119 std::shared_ptr<typename AMG::LevelContext> levelContext_;
│ │ │ │ +
120 };
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
122
│ │ │ │ +
123
│ │ │ │ +
137 template<class M, class X, class S, class PI=SequentialInformation,
│ │ │ │ +
138 class K=GeneralizedPCGSolver<X>, class A=std::allocator<X> >
│ │ │ │ +
│ │ │ │ +
139 class KAMG : public Preconditioner<X,X>
│ │ │ │ +
140 {
│ │ │ │ +
141 public:
│ │ │ │ + │ │ │ │ +
145 typedef K KrylovSolver;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
155 typedef typename Amg::Operator Operator;
│ │ │ │ +
157 typedef typename Amg::Domain Domain;
│ │ │ │ +
159 typedef typename Amg::Range Range;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
164
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
167 {
│ │ │ │ +
168 return amg.category();
│ │ │ │ +
169 };
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
182 KAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
│ │ │ │ +
183 const SmootherArgs& smootherArgs, const Parameters& parms,
│ │ │ │ +
184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1);
│ │ │ │ +
185
│ │ │ │ +
199 template<class C>
│ │ │ │ +
200 KAMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ +
201 const SmootherArgs& smootherArgs=SmootherArgs(),
│ │ │ │ +
202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1,
│ │ │ │ + │ │ │ │ +
204
│ │ │ │ +
206 void pre(Domain& x, Range& b);
│ │ │ │ +
208 void post(Domain& x);
│ │ │ │ +
210 void apply(Domain& v, const Range& d);
│ │ │ │ +
211
│ │ │ │ +
212 std::size_t maxlevels();
│ │ │ │ +
213
│ │ │ │ +
214 private:
│ │ │ │ +
216 Amg amg;
│ │ │ │ +
217
│ │ │ │ +
219 std::size_t maxLevelKrylovSteps;
│ │ │ │ +
220
│ │ │ │ +
222 double levelDefectReduction;
│ │ │ │ +
223
│ │ │ │ +
225 std::vector<std::shared_ptr<typename Amg::ScalarProduct> > scalarproducts;
│ │ │ │ +
226
│ │ │ │ +
228 std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > > ksolvers;
│ │ │ │ +
229 };
│ │ │ │ +
│ │ │ │ +
230
│ │ │ │ +
231
│ │ │ │ +
232 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
234 const SmootherArgs& smootherArgs, const Parameters& params,
│ │ │ │ +
235 std::size_t ksteps, double reduction)
│ │ │ │ +
236 : amg(matrices, coarseSolver, smootherArgs, params),
│ │ │ │ +
237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
│ │ │ │ +
238 {}
│ │ │ │ +
│ │ │ │ +
239
│ │ │ │ +
240
│ │ │ │ +
241 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
242 template<class C>
│ │ │ │ +
│ │ │ │ +
243 KAMG<M,X,S,P,K,A>::KAMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ +
244 const SmootherArgs& smootherArgs,
│ │ │ │ +
245 std::size_t ksteps, double reduction,
│ │ │ │ +
246 const ParallelInformation& pinfo)
│ │ │ │ +
247 : amg(fineOperator, criterion, smootherArgs, pinfo),
│ │ │ │ +
248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
│ │ │ │ +
249 {}
│ │ │ │ +
│ │ │ │ +
250
│ │ │ │ +
251
│ │ │ │ +
252 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
254 {
│ │ │ │ +
255 amg.pre(x,b);
│ │ │ │ +
256 scalarproducts.reserve(amg.levels());
│ │ │ │ +
257 ksolvers.reserve(amg.levels());
│ │ │ │ +
258
│ │ │ │ +
259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator
│ │ │ │ +
260 matrix = amg.matrices_->matrices().coarsest();
│ │ │ │ + │ │ │ │ +
262 pinfo = amg.matrices_->parallelInformation().coarsest();
│ │ │ │ +
263 bool hasCoarsest=(amg.levels()==amg.maxlevels());
│ │ │ │ +
264
│ │ │ │ +
265 if(hasCoarsest) {
│ │ │ │ +
266 if(matrix==amg.matrices_->matrices().finest())
│ │ │ │ +
267 return;
│ │ │ │ +
268 --matrix;
│ │ │ │ +
269 --pinfo;
│ │ │ │ +
270 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, amg.solver_)));
│ │ │ │ +
271 }else
│ │ │ │ +
272 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, std::shared_ptr<InverseOperator<Domain,Range> >())));
│ │ │ │ +
273
│ │ │ │ +
274 std::ostringstream s;
│ │ │ │ +
275
│ │ │ │ +
276 if(matrix!=amg.matrices_->matrices().finest())
│ │ │ │ +
277 while(true) {
│ │ │ │ +
278 scalarproducts.push_back(createScalarProduct<X>(*pinfo,category()));
│ │ │ │ +
279 std::shared_ptr<InverseOperator<Domain,Range> > ks =
│ │ │ │ +
280 std::shared_ptr<InverseOperator<Domain,Range> >(new KrylovSolver(*matrix, *(scalarproducts.back()),
│ │ │ │ +
281 *(ksolvers.back()), levelDefectReduction,
│ │ │ │ +
282 maxLevelKrylovSteps, 0));
│ │ │ │ +
283 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, ks)));
│ │ │ │ +
284 --matrix;
│ │ │ │ +
285 --pinfo;
│ │ │ │ +
286 if(matrix==amg.matrices_->matrices().finest())
│ │ │ │ +
287 break;
│ │ │ │ +
288 }
│ │ │ │ +
289 }
│ │ │ │ +
│ │ │ │ +
290
│ │ │ │ +
291
│ │ │ │ +
292 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
294 {
│ │ │ │ +
295 amg.post(x);
│ │ │ │ +
296
│ │ │ │ +
297 }
│ │ │ │ +
│ │ │ │ +
298
│ │ │ │ +
299 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
301 {
│ │ │ │ +
302 if(ksolvers.size()==0)
│ │ │ │ +
303 {
│ │ │ │ +
304 Range td=d;
│ │ │ │ + │ │ │ │ +
306 amg.solver_->apply(v,td,res);
│ │ │ │ +
307 }else
│ │ │ │ +
308 {
│ │ │ │ +
309 typedef typename Amg::LevelContext LevelContext;
│ │ │ │ +
310 std::shared_ptr<LevelContext> levelContext(new LevelContext);
│ │ │ │ +
311 amg.initIteratorsWithFineLevel(*levelContext);
│ │ │ │ +
312 typedef typename std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > >::iterator Iter;
│ │ │ │ +
313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)
│ │ │ │ +
314 (*solver)->setLevelContext(levelContext);
│ │ │ │ +
315 ksolvers.back()->apply(v,d);
│ │ │ │ +
316 }
│ │ │ │ +
317 }
│ │ │ │ +
│ │ │ │ +
318
│ │ │ │ +
319 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
321 {
│ │ │ │ +
322 return amg.maxlevels();
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
326 } // Amg
│ │ │ │ +
327} // Dune
│ │ │ │ +
328
│ │ │ │ +
329#endif
│ │ │ │ +
The AMG preconditioner.
│ │ │ │ +
Define general preconditioner interface.
│ │ │ │ +
void apply(Domain &v, const Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition kamg.hh:300
│ │ │ │ +
X Domain
The domain type.
Definition amg.hh:87
│ │ │ │ +
KAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs &smootherArgs, const Parameters &parms, std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1)
Construct a new amg with a specific coarse solver.
Definition kamg.hh:233
│ │ │ │ +
std::size_t maxlevels()
Definition kamg.hh:320
│ │ │ │ +
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition amg.hh:100
│ │ │ │ +
M Operator
The matrix operator type.
Definition amg.hh:73
│ │ │ │ +
void post(Domain &x)
Clean up.
Definition kamg.hh:293
│ │ │ │ +
X Range
The range type.
Definition amg.hh:89
│ │ │ │ +
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ +
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ +
void pre(Domain &x, Range &b)
Prepare the preconditioner.
Definition kamg.hh:253
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition amg.hh:194
│ │ │ │ +
PI ParallelInformation
The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
Definition amg.hh:80
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X > ReboundAllocatorType
Definition allocator.hh:37
│ │ │ │ -
typename AllocatorTraits< T >::type AllocatorType
Definition allocator.hh:34
│ │ │ │ -
Definition allocator.hh:14
│ │ │ │ -
static const bool value
Definition allocator.hh:15
│ │ │ │ -
Definition allocator.hh:20
│ │ │ │ -
std::allocator< T > type
Definition allocator.hh:21
│ │ │ │ -
typename T::allocator_type type
Definition allocator.hh:27
│ │ │ │ -
Definition allocator.hh:31
│ │ │ │ +
an algebraic multigrid method using a Krylov-cycle.
Definition kamg.hh:140
│ │ │ │ +
Amg::Domain Domain
the type of the domain.
Definition kamg.hh:157
│ │ │ │ +
Amg::SmootherArgs SmootherArgs
The type of the arguments for construction of the smoothers.
Definition kamg.hh:153
│ │ │ │ +
Amg::ParallelInformation ParallelInformation
the type of the parallelinformation to use.
Definition kamg.hh:151
│ │ │ │ +
Amg::CoarseSolver CoarseSolver
The type of the coarse solver.
Definition kamg.hh:149
│ │ │ │ +
Amg::OperatorHierarchy OperatorHierarchy
The type of the hierarchy of operators.
Definition kamg.hh:147
│ │ │ │ +
Amg::Range Range
The type of the range.
Definition kamg.hh:159
│ │ │ │ +
Amg::ScalarProduct ScalarProduct
The type of the scalar product.
Definition kamg.hh:163
│ │ │ │ +
AMG< M, X, S, PI, A > Amg
The type of the underlying AMG.
Definition kamg.hh:143
│ │ │ │ +
Amg::Operator Operator
the type of the lineatr operator.
Definition kamg.hh:155
│ │ │ │ +
Amg::ParallelInformationHierarchy ParallelInformationHierarchy
The type of the hierarchy of parallel information.
Definition kamg.hh:161
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition kamg.hh:166
│ │ │ │ +
K KrylovSolver
The type of the Krylov solver for the cycle.
Definition kamg.hh:145
│ │ │ │ +
Two grid operator for AMG with Krylov cycle.
Definition kamg.hh:33
│ │ │ │ +
void pre(typename AMG::Domain &x, typename AMG::Range &b)
Prepare the preconditioner.
Definition kamg.hh:58
│ │ │ │ +
KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > > coarseSolver)
Constructor.
Definition kamg.hh:53
│ │ │ │ +
~KAmgTwoGrid()
Destructor.
Definition kamg.hh:110
│ │ │ │ +
void post(typename AMG::Domain &x)
Clean up.
Definition kamg.hh:62
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition kamg.hh:41
│ │ │ │ +
void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p)
Set the level context pointer.
Definition kamg.hh:104
│ │ │ │ +
InverseOperator< Domain, Range > * coarseSolver()
Get a pointer to the coarse grid solver.
Definition kamg.hh:95
│ │ │ │ +
void apply(typename AMG::Domain &v, const typename AMG::Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition kamg.hh:66
│ │ │ │ +
Parallel algebraic multigrid based on agglomeration.
Definition amg.hh:65
│ │ │ │ + │ │ │ │ +
LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ +
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ +
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
Generalized preconditioned conjugate gradient solver.
Definition solvers.hh:1307
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,80 +1,433 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -allocator.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +kamg.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#ifndef DUNE_ISTL_ALLOCATOR_HH │ │ │ │ │ -4#define DUNE_ISTL_ALLOCATOR_HH │ │ │ │ │ -5 │ │ │ │ │ -6#include │ │ │ │ │ -7#include │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ +3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +5#ifndef DUNE_AMG_KAMG_HH │ │ │ │ │ +6#define DUNE_AMG_KAMG_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +9#include "_a_m_g_._h_h" │ │ │ │ │ 10 │ │ │ │ │ -_1_1namespace _D_u_n_e { │ │ │ │ │ -12 │ │ │ │ │ -13 template │ │ │ │ │ -_1_4 struct _e_x_i_s_t_s{ │ │ │ │ │ -_1_5 static const bool _v_a_l_u_e = true; │ │ │ │ │ -16 }; │ │ │ │ │ -17 │ │ │ │ │ -18 template │ │ │ │ │ -_1_9 struct _D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s │ │ │ │ │ -20 { │ │ │ │ │ -_2_1 using _t_y_p_e = std::allocator; │ │ │ │ │ -22 }; │ │ │ │ │ -23 │ │ │ │ │ -24 template │ │ │ │ │ -_2_5 struct _D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s > │ │ │ │ │ -26 { │ │ │ │ │ -_2_7 using _t_y_p_e = typename T::allocator_type; │ │ │ │ │ -28 }; │ │ │ │ │ -29 │ │ │ │ │ -30 template │ │ │ │ │ -_3_1 struct _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s : public _D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s {}; │ │ │ │ │ -32 │ │ │ │ │ -33 template │ │ │ │ │ -_3_4 using _A_l_l_o_c_a_t_o_r_T_y_p_e = typename _A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_T_>_:_:_t_y_p_e; │ │ │ │ │ -35 │ │ │ │ │ -36 template │ │ │ │ │ -_3_7 using _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e = typename std::allocator_traits::type>::template rebind_alloc; │ │ │ │ │ -38 │ │ │ │ │ -39} // end namespace Dune │ │ │ │ │ -40 │ │ │ │ │ -41#endif // DUNE_ISTL_ALLOCATOR_HH │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +11namespace _D_u_n_e │ │ │ │ │ +12{ │ │ │ │ │ +13 namespace Amg │ │ │ │ │ +14 { │ │ │ │ │ +15 │ │ │ │ │ +30 template │ │ │ │ │ +_3_1 class _K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ +32 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +33 { │ │ │ │ │ +35 typedef typename _A_M_G_:_:_D_o_m_a_i_n Domain; │ │ │ │ │ +37 typedef typename _A_M_G_:_:_R_a_n_g_e Range; │ │ │ │ │ +38 public: │ │ │ │ │ +39 │ │ │ │ │ +_4_1 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +42 { │ │ │ │ │ +43 return amg_._c_a_t_e_g_o_r_y(); │ │ │ │ │ +44 }; │ │ │ │ │ +45 │ │ │ │ │ +_5_3 _K_A_m_g_T_w_o_G_r_i_d(_A_M_G& amg, std::shared_ptr<_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_> > │ │ │ │ │ +_c_o_a_r_s_e_S_o_l_v_e_r) │ │ │ │ │ +54 : amg_(amg), coarseSolver_(_c_o_a_r_s_e_S_o_l_v_e_r) │ │ │ │ │ +55 {} │ │ │ │ │ +56 │ │ │ │ │ +_5_8 void _p_r_e([[maybe_unused]] typename _A_M_G_:_:_D_o_m_a_i_n& x, [[maybe_unused]] typename │ │ │ │ │ +_A_M_G_:_:_R_a_n_g_e& b) │ │ │ │ │ +59 {} │ │ │ │ │ +60 │ │ │ │ │ +_6_2 void _p_o_s_t([[maybe_unused]] typename _A_M_G_:_:_D_o_m_a_i_n& x) │ │ │ │ │ +63 {} │ │ │ │ │ +64 │ │ │ │ │ +_6_6 void _a_p_p_l_y(typename _A_M_G_:_:_D_o_m_a_i_n& v, const typename _A_M_G_:_:_R_a_n_g_e& d) │ │ │ │ │ +67 { │ │ │ │ │ +68 // Copy data │ │ │ │ │ +69 *levelContext_->update=0; │ │ │ │ │ +70 *levelContext_->rhs = d; │ │ │ │ │ +71 *levelContext_->lhs = v; │ │ │ │ │ +72 │ │ │ │ │ +73 _p_r_e_s_m_o_o_t_h(*levelContext_, amg_.preSteps_); │ │ │ │ │ +74 bool processFineLevel = │ │ │ │ │ +75 amg_.moveToCoarseLevel(*levelContext_); │ │ │ │ │ +76 │ │ │ │ │ +77 if(processFineLevel) { │ │ │ │ │ +78 typename _A_M_G_:_:_R_a_n_g_e b=*levelContext_->rhs; │ │ │ │ │ +79 typename _A_M_G_:_:_D_o_m_a_i_n x=*levelContext_->update; │ │ │ │ │ +80 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ +81 coarseSolver_->apply(x, b, res); │ │ │ │ │ +82 *levelContext_->update=x; │ │ │ │ │ +83 } │ │ │ │ │ +84 │ │ │ │ │ +85 amg_.moveToFineLevel(*levelContext_, processFineLevel); │ │ │ │ │ +86 │ │ │ │ │ +87 _p_o_s_t_s_m_o_o_t_h(*levelContext_, amg_.postSteps_); │ │ │ │ │ +88 v=*levelContext_->update; │ │ │ │ │ +89 } │ │ │ │ │ +90 │ │ │ │ │ +_9_5 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_>* _c_o_a_r_s_e_S_o_l_v_e_r() │ │ │ │ │ +96 { │ │ │ │ │ +97 return coarseSolver_; │ │ │ │ │ +98 } │ │ │ │ │ +99 │ │ │ │ │ +_1_0_4 void _s_e_t_L_e_v_e_l_C_o_n_t_e_x_t(std::shared_ptr p) │ │ │ │ │ +105 { │ │ │ │ │ +106 levelContext_=p; │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +_1_1_0 _~_K_A_m_g_T_w_o_G_r_i_d() │ │ │ │ │ +111 {} │ │ │ │ │ +112 │ │ │ │ │ +113 private: │ │ │ │ │ +115 _A_M_G& amg_; │ │ │ │ │ +117 std::shared_ptr > coarseSolver_; │ │ │ │ │ +119 std::shared_ptr levelContext_; │ │ │ │ │ +120 }; │ │ │ │ │ +121 │ │ │ │ │ +122 │ │ │ │ │ +123 │ │ │ │ │ +137 template, class A=std::allocator > │ │ │ │ │ +_1_3_9 class _K_A_M_G : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +140 { │ │ │ │ │ +141 public: │ │ │ │ │ +_1_4_3 typedef _A_M_G_<_M_,_X_,_S_,_P_I_,_A_> _A_m_g; │ │ │ │ │ +_1_4_5 typedef K _K_r_y_l_o_v_S_o_l_v_e_r; │ │ │ │ │ +_1_4_7 typedef typename _A_m_g_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y; │ │ │ │ │ +_1_4_9 typedef typename _A_m_g_:_:_C_o_a_r_s_e_S_o_l_v_e_r _C_o_a_r_s_e_S_o_l_v_e_r; │ │ │ │ │ +_1_5_1 typedef typename _A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +_1_5_3 typedef typename _A_m_g_:_:_S_m_o_o_t_h_e_r_A_r_g_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +_1_5_5 typedef typename _A_m_g_:_:_O_p_e_r_a_t_o_r _O_p_e_r_a_t_o_r; │ │ │ │ │ +_1_5_7 typedef typename _A_m_g_:_:_D_o_m_a_i_n _D_o_m_a_i_n; │ │ │ │ │ +_1_5_9 typedef typename _A_m_g_:_:_R_a_n_g_e _R_a_n_g_e; │ │ │ │ │ +_1_6_1 typedef typename _A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ +_1_6_3 typedef typename _A_m_g_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t _S_c_a_l_a_r_P_r_o_d_u_c_t; │ │ │ │ │ +164 │ │ │ │ │ +_1_6_6 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +167 { │ │ │ │ │ +168 return amg._c_a_t_e_g_o_r_y(); │ │ │ │ │ +169 }; │ │ │ │ │ +170 │ │ │ │ │ +182 _K_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& coarseSolver, │ │ │ │ │ +183 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, const _P_a_r_a_m_e_t_e_r_s& parms, │ │ │ │ │ +184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1); │ │ │ │ │ +185 │ │ │ │ │ +199 template │ │ │ │ │ +200 _K_A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ +201 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs=_S_m_o_o_t_h_e_r_A_r_g_s(), │ │ │ │ │ +202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1, │ │ │ │ │ +203 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ +204 │ │ │ │ │ +206 void _p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b); │ │ │ │ │ +208 void _p_o_s_t(_D_o_m_a_i_n& x); │ │ │ │ │ +210 void _a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d); │ │ │ │ │ +211 │ │ │ │ │ +212 std::size_t _m_a_x_l_e_v_e_l_s(); │ │ │ │ │ +213 │ │ │ │ │ +214 private: │ │ │ │ │ +216 _A_m_g amg; │ │ │ │ │ +217 │ │ │ │ │ +219 std::size_t maxLevelKrylovSteps; │ │ │ │ │ +220 │ │ │ │ │ +222 double levelDefectReduction; │ │ │ │ │ +223 │ │ │ │ │ +225 std::vector > scalarproducts; │ │ │ │ │ +226 │ │ │ │ │ +228 std::vector > > ksolvers; │ │ │ │ │ +229 }; │ │ │ │ │ +230 │ │ │ │ │ +231 │ │ │ │ │ +232 template │ │ │ │ │ +_2_3_3 _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_K_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& │ │ │ │ │ +coarseSolver, │ │ │ │ │ +234 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, const _P_a_r_a_m_e_t_e_r_s& params, │ │ │ │ │ +235 std::size_t ksteps, double reduction) │ │ │ │ │ +236 : amg(matrices, coarseSolver, smootherArgs, params), │ │ │ │ │ +237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction) │ │ │ │ │ +238 {} │ │ │ │ │ +239 │ │ │ │ │ +240 │ │ │ │ │ +241 template │ │ │ │ │ +242 template │ │ │ │ │ +_2_4_3 _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_K_A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ +244 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, │ │ │ │ │ +245 std::size_t ksteps, double reduction, │ │ │ │ │ +246 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo) │ │ │ │ │ +247 : amg(fineOperator, criterion, smootherArgs, pinfo), │ │ │ │ │ +248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction) │ │ │ │ │ +249 {} │ │ │ │ │ +250 │ │ │ │ │ +251 │ │ │ │ │ +252 template │ │ │ │ │ +_2_5_3 void _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b) │ │ │ │ │ +254 { │ │ │ │ │ +255 amg.pre(x,b); │ │ │ │ │ +256 scalarproducts.reserve(amg.levels()); │ │ │ │ │ +257 ksolvers.reserve(amg.levels()); │ │ │ │ │ +258 │ │ │ │ │ +259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator │ │ │ │ │ +260 matrix = amg.matrices_->matrices().coarsest(); │ │ │ │ │ +261 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +262 pinfo = amg.matrices_->parallelInformation().coarsest(); │ │ │ │ │ +263 bool hasCoarsest=(amg.levels()==amg.maxlevels()); │ │ │ │ │ +264 │ │ │ │ │ +265 if(hasCoarsest) { │ │ │ │ │ +266 if(matrix==amg.matrices_->matrices().finest()) │ │ │ │ │ +267 return; │ │ │ │ │ +268 --matrix; │ │ │ │ │ +269 --pinfo; │ │ │ │ │ +270 ksolvers.push_back(std::shared_ptr<_K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> >(new _K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> │ │ │ │ │ +(amg, amg.solver_))); │ │ │ │ │ +271 }else │ │ │ │ │ +272 ksolvers.push_back(std::shared_ptr<_K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> >(new _K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> │ │ │ │ │ +(amg, std::shared_ptr<_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_> >()))); │ │ │ │ │ +273 │ │ │ │ │ +274 std::ostringstream s; │ │ │ │ │ +275 │ │ │ │ │ +276 if(matrix!=amg.matrices_->matrices().finest()) │ │ │ │ │ +277 while(true) { │ │ │ │ │ +278 scalarproducts.push_back(createScalarProduct(*pinfo,category())); │ │ │ │ │ +279 std::shared_ptr > ks = │ │ │ │ │ +280 std::shared_ptr >(new _K_r_y_l_o_v_S_o_l_v_e_r(*matrix, * │ │ │ │ │ +(scalarproducts.back()), │ │ │ │ │ +281 *(ksolvers.back()), levelDefectReduction, │ │ │ │ │ +282 maxLevelKrylovSteps, 0)); │ │ │ │ │ +283 ksolvers.push_back(std::shared_ptr<_K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> >(new _K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> │ │ │ │ │ +(amg, ks))); │ │ │ │ │ +284 --matrix; │ │ │ │ │ +285 --pinfo; │ │ │ │ │ +286 if(matrix==amg.matrices_->matrices().finest()) │ │ │ │ │ +287 break; │ │ │ │ │ +288 } │ │ │ │ │ +289 } │ │ │ │ │ +290 │ │ │ │ │ +291 │ │ │ │ │ +292 template │ │ │ │ │ +_2_9_3 void _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_p_o_s_t(_D_o_m_a_i_n& x) │ │ │ │ │ +294 { │ │ │ │ │ +295 amg.post(x); │ │ │ │ │ +296 │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +299 template │ │ │ │ │ +_3_0_0 void _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +301 { │ │ │ │ │ +302 if(ksolvers.size()==0) │ │ │ │ │ +303 { │ │ │ │ │ +304 _R_a_n_g_e td=d; │ │ │ │ │ +305 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ +306 amg.solver_->apply(v,td,res); │ │ │ │ │ +307 }else │ │ │ │ │ +308 { │ │ │ │ │ +309 typedef typename Amg::LevelContext LevelContext; │ │ │ │ │ +310 std::shared_ptr levelContext(new LevelContext); │ │ │ │ │ +311 amg.initIteratorsWithFineLevel(*levelContext); │ │ │ │ │ +312 typedef typename std::vector > >::iterator │ │ │ │ │ +Iter; │ │ │ │ │ +313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver) │ │ │ │ │ +314 (*solver)->setLevelContext(levelContext); │ │ │ │ │ +315 ksolvers.back()->apply(v,d); │ │ │ │ │ +316 } │ │ │ │ │ +317 } │ │ │ │ │ +318 │ │ │ │ │ +319 template │ │ │ │ │ +_3_2_0 std::size_t _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_m_a_x_l_e_v_e_l_s() │ │ │ │ │ +321 { │ │ │ │ │ +322 return amg.maxlevels(); │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +326 } // Amg │ │ │ │ │ +327} // Dune │ │ │ │ │ +328 │ │ │ │ │ +329#endif │ │ │ │ │ +_a_m_g_._h_h │ │ │ │ │ +The AMG preconditioner. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_a_p_p_l_y │ │ │ │ │ +void apply(Domain &v, const Range &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ +X Domain │ │ │ │ │ +The domain type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_K_A_M_G │ │ │ │ │ +KAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const │ │ │ │ │ +SmootherArgs &smootherArgs, const Parameters &parms, std::size_t │ │ │ │ │ +maxLevelKrylovSteps=3, double minDefectReduction=1e-1) │ │ │ │ │ +Construct a new amg with a specific coarse solver. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:233 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ +std::size_t maxlevels() │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:320 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +SmootherTraits< Smoother >::Arguments SmootherArgs │ │ │ │ │ +The argument type for the construction of the smoother. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ +M Operator │ │ │ │ │ +The matrix operator type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_p_o_s_t │ │ │ │ │ +void post(Domain &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ +X Range │ │ │ │ │ +The range type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h │ │ │ │ │ +void presmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ +Apply pre smoothing on the current level. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:406 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h │ │ │ │ │ +void postsmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ +Apply post smoothing on the current level. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:428 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_p_r_e │ │ │ │ │ +void pre(Domain &x, Range &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:253 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +PI ParallelInformation │ │ │ │ │ +The type of the parallel information. Either OwnerOverlapCommunication or │ │ │ │ │ +another type describing the... │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:80 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e │ │ │ │ │ -typename std::allocator_traits< typename AllocatorTraits< T >::type >::template │ │ │ │ │ -rebind_alloc< X > ReboundAllocatorType │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_y_p_e │ │ │ │ │ -typename AllocatorTraits< T >::type AllocatorType │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_e_x_i_s_t_s │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:14 │ │ │ │ │ -_D_u_n_e_:_:_e_x_i_s_t_s_:_:_v_a_l_u_e │ │ │ │ │ -static const bool value │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:15 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:20 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_:_:_t_y_p_e │ │ │ │ │ -std::allocator< T > type │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_D_e_f_a_u_l_t_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s_<_ _T_,_ _s_t_d_:_:_v_o_i_d___t_<_ _t_y_p_e_n_a_m_e_ _T_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e_ _>_ _>_:_: │ │ │ │ │ -_t_y_p_e │ │ │ │ │ -typename T::allocator_type type │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_A_l_l_o_c_a_t_o_r_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn allocator.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G │ │ │ │ │ +an algebraic multigrid method using a Krylov-cycle. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ +Amg::Domain Domain │ │ │ │ │ +the type of the domain. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +Amg::SmootherArgs SmootherArgs │ │ │ │ │ +The type of the arguments for construction of the smoothers. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +Amg::ParallelInformation ParallelInformation │ │ │ │ │ +the type of the parallelinformation to use. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_C_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ +Amg::CoarseSolver CoarseSolver │ │ │ │ │ +The type of the coarse solver. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Amg::OperatorHierarchy OperatorHierarchy │ │ │ │ │ +The type of the hierarchy of operators. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ +Amg::Range Range │ │ │ │ │ +The type of the range. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Amg::ScalarProduct ScalarProduct │ │ │ │ │ +The type of the scalar product. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_A_m_g │ │ │ │ │ +AMG< M, X, S, PI, A > Amg │ │ │ │ │ +The type of the underlying AMG. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ +Amg::Operator Operator │ │ │ │ │ +the type of the lineatr operator. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ +Amg::ParallelInformationHierarchy ParallelInformationHierarchy │ │ │ │ │ +The type of the hierarchy of parallel information. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_K_r_y_l_o_v_S_o_l_v_e_r │ │ │ │ │ +K KrylovSolver │ │ │ │ │ +The type of the Krylov solver for the cycle. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ +Two grid operator for AMG with Krylov cycle. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_p_r_e │ │ │ │ │ +void pre(typename AMG::Domain &x, typename AMG::Range &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ +KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > > │ │ │ │ │ +coarseSolver) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_~_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ +~KAmgTwoGrid() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_p_o_s_t │ │ │ │ │ +void post(typename AMG::Domain &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_s_e_t_L_e_v_e_l_C_o_n_t_e_x_t │ │ │ │ │ +void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p) │ │ │ │ │ +Set the level context pointer. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_c_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ +InverseOperator< Domain, Range > * coarseSolver() │ │ │ │ │ +Get a pointer to the coarse grid solver. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_a_p_p_l_y │ │ │ │ │ +void apply(typename AMG::Domain &v, const typename AMG::Range &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G │ │ │ │ │ +Parallel algebraic multigrid based on agglomeration. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation │ │ │ │ │ +> Iterator │ │ │ │ │ +Type of the mutable iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +The hierarchies build by the coarsening process. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +All parameters for AMG. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Base class for scalar product and norm computation. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +Generalized preconditioned conjugate gradient solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1307 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00077.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: preconditioner.hh File Reference │ │ │ │ +dune-istl: smoother.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,40 +65,126 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
preconditioner.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -#include "solvercategory.hh"
│ │ │ │ + │ │ │ │ +

Classes for the generic construction and application of the smoothers. │ │ │ │ +More...

│ │ │ │ +
#include <dune/istl/paamg/construction.hh>
│ │ │ │ +#include <dune/istl/paamg/aggregates.hh>
│ │ │ │ +#include <dune/istl/preconditioners.hh>
│ │ │ │ +#include <dune/istl/schwarz.hh>
│ │ │ │ +#include <dune/istl/novlpschwarz.hh>
│ │ │ │ +#include <dune/common/propertymap.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Preconditioner< X, Y >
 Base class for matrix free definition of preconditioners. More...
struct  Dune::Amg::DefaultSmootherArgs< T >
 The default class for the smoother arguments. More...
 
struct  Dune::Amg::SmootherTraits< T >
 Traits class for getting the attribute class of a smoother. More...
 
struct  Dune::Amg::SmootherTraits< Richardson< X, Y > >
 
struct  Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > >
 
struct  Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > >
 
class  Dune::Amg::DefaultConstructionArgs< T >
 Construction Arguments for the default smoothers. More...
 
struct  Dune::Amg::ConstructionArgs< T >
 
class  Dune::Amg::DefaultParallelConstructionArgs< T, C >
 
class  Dune::Amg::DefaultConstructionArgs< Richardson< X, Y > >
 
struct  Dune::Amg::ConstructionTraits< SeqSSOR< M, X, Y, l > >
 Policy for the construction of the SeqSSOR smoother. More...
 
struct  Dune::Amg::ConstructionTraits< SeqSOR< M, X, Y, l > >
 Policy for the construction of the SeqSOR smoother. More...
 
struct  Dune::Amg::ConstructionTraits< SeqJac< M, X, Y, l > >
 Policy for the construction of the SeqJac smoother. More...
 
struct  Dune::Amg::ConstructionTraits< Richardson< X, Y > >
 Policy for the construction of the Richardson smoother. More...
 
class  Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > >
 
struct  Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > >
 Policy for the construction of the SeqILU smoother. More...
 
struct  Dune::Amg::ConstructionTraits< ParSSOR< M, X, Y, C > >
 Policy for the construction of the ParSSOR smoother. More...
 
struct  Dune::Amg::ConstructionTraits< BlockPreconditioner< X, Y, C, T > >
 
struct  Dune::Amg::ConstructionTraits< NonoverlappingBlockPreconditioner< C, T > >
 
struct  Dune::Amg::SmootherApplier< T >
 Helper class for applying the smoothers. More...
 
struct  Dune::Amg::SmootherApplier< SeqSOR< M, X, Y, l > >
 
struct  Dune::Amg::SmootherApplier< BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > >
 
struct  Dune::Amg::SmootherApplier< NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > >
 
struct  Dune::Amg::SmootherApplier< SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > >
 
struct  Dune::Amg::SeqOverlappingSchwarzSmootherArgs< T >
 
struct  Dune::Amg::SmootherTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > >
 
class  Dune::Amg::ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > >
 
struct  Dune::Amg::ConstructionTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<typename LevelContext >
void Dune::Amg::presmooth (LevelContext &levelContext, size_t steps)
 Apply pre smoothing on the current level.
 
template<typename LevelContext >
void Dune::Amg::postsmooth (LevelContext &levelContext, size_t steps)
 Apply post smoothing on the current level.
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Classes for the generic construction and application of the smoothers.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,111 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -preconditioner.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +_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 │ │ │ │ │ +smoother.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Classes for the generic construction and application of the smoothers. _M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._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_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_ _> │ │ │ │ │ -  Base class for matrix free definition of preconditioners. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_<_ _T_ _> │ │ │ │ │ +  The default class for the smoother arguments. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ +  Traits class for getting the attribute class of a smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_,_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _T_ _> │ │ │ │ │ +  Construction Arguments for the default smoothers. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _T_,_ _C_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ +  Policy for the construction of the _S_e_q_S_S_O_R smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ +  Policy for the construction of the _S_e_q_S_O_R smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_J_a_c_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ +  Policy for the construction of the _S_e_q_J_a_c smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _>_ _> │ │ │ │ │ +  Policy for the construction of the _R_i_c_h_a_r_d_s_o_n smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _S_e_q_I_L_U_<_ _M_,_ _X_,_ _Y_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_I_L_U_<_ _M_,_ _X_,_ _Y_ _>_ _> │ │ │ │ │ +  Policy for the construction of the _S_e_q_I_L_U smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _P_a_r_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _> │ │ │ │ │ +  Policy for the construction of the _P_a_r_S_S_O_R smoother. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_,_ _T │ │ │ │ │ + _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _T_ _> │ │ │ │ │ +  Helper class for applying the smoothers. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _S_e_q_S_O_R_<_ _M_, │ │ │ │ │ + _X_,_ _Y_,_ _l_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_, │ │ │ │ │ + _S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ + _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _M_S_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_S_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_S_,_ _T_A_ _> │ │ │ │ │ + _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_S_,_ _T_A │ │ │ │ │ + _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h (LevelContext &levelContext, size_t steps) │ │ │ │ │ +  Apply pre smoothing on the current level. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h (LevelContext &levelContext, size_t steps) │ │ │ │ │ +  Apply post smoothing on the current level. │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Classes for the generic construction and application of the smoothers. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: preconditioner.hh Source File │ │ │ │ +dune-istl: smoother.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,77 +70,1130 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
preconditioner.hh
│ │ │ │ +
smoother.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_PRECONDITIONER_HH
│ │ │ │ -
6#define DUNE_ISTL_PRECONDITIONER_HH
│ │ │ │ +
5#ifndef DUNE_AMGSMOOTHER_HH
│ │ │ │ +
6#define DUNE_AMGSMOOTHER_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/exceptions.hh>
│ │ │ │ -
9
│ │ │ │ -
10#include "solvercategory.hh"
│ │ │ │ -
11
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
17 //=====================================================================
│ │ │ │ -
30 //=====================================================================
│ │ │ │ -
31 template<class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
33 public:
│ │ │ │ -
35 typedef X domain_type;
│ │ │ │ -
37 typedef Y range_type;
│ │ │ │ -
39 typedef typename X::field_type field_type;
│ │ │ │ -
40
│ │ │ │ -
69 virtual void pre (X& x, Y& b) = 0;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
11#include <dune/istl/schwarz.hh>
│ │ │ │ + │ │ │ │ +
13#include <dune/common/propertymap.hh>
│ │ │ │ +
14#include <dune/common/ftraits.hh>
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
18 namespace Amg
│ │ │ │ +
19 {
│ │ │ │ +
20
│ │ │ │ +
36 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
38 {
│ │ │ │ +
42 typedef typename FieldTraits<T>::real_type RelaxationFactor;
│ │ │ │ +
43
│ │ │ │ + │ │ │ │ + │ │ │ │ +
52
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
58 {}
│ │ │ │ +
│ │ │ │ +
59 };
│ │ │ │ +
│ │ │ │ +
60
│ │ │ │ +
64 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
66 {
│ │ │ │ + │ │ │ │ +
68
│ │ │ │ +
69 };
│ │ │ │ +
│ │ │ │
70
│ │ │ │ -
81 virtual void apply (X& v, const Y& d) = 0;
│ │ │ │ +
71 template<class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
73 {
│ │ │ │ + │ │ │ │ +
75
│ │ │ │ +
76 };
│ │ │ │ +
│ │ │ │ +
77
│ │ │ │ +
78 template<class X, class Y, class C, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
80 : public SmootherTraits<T>
│ │ │ │ +
81 {};
│ │ │ │ +
│ │ │ │
82
│ │ │ │ -
91 virtual void post (X& x) = 0;
│ │ │ │ -
92
│ │ │ │ - │ │ │ │ -
95#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
│ │ │ │ -
96 {
│ │ │ │ -
97 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
│ │ │ │ -
98 }
│ │ │ │ -
99#else
│ │ │ │ -
100 = 0;
│ │ │ │ -
101#endif
│ │ │ │ -
102
│ │ │ │ -
104 virtual ~Preconditioner () {}
│ │ │ │ -
105
│ │ │ │ -
106 };
│ │ │ │ -
│ │ │ │ -
107
│ │ │ │ -
111}
│ │ │ │ -
112#endif
│ │ │ │ - │ │ │ │ +
83 template<class C, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
85 : public SmootherTraits<T>
│ │ │ │ +
86 {};
│ │ │ │ +
│ │ │ │ +
87
│ │ │ │ +
91 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
93 {
│ │ │ │ +
94 typedef typename T::matrix_type Matrix;
│ │ │ │ +
95
│ │ │ │ + │ │ │ │ +
97
│ │ │ │ + │ │ │ │ +
99
│ │ │ │ +
100 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
102 {}
│ │ │ │ +
│ │ │ │ +
103
│ │ │ │ +
│ │ │ │ +
104 void setMatrix(const Matrix& matrix)
│ │ │ │ +
105 {
│ │ │ │ +
106 matrix_=&matrix;
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
108 virtual void setMatrix(const Matrix& matrix, [[maybe_unused]] const AggregatesMap& amap)
│ │ │ │ +
109 {
│ │ │ │ +
110 setMatrix(matrix);
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
113
│ │ │ │ +
│ │ │ │ +
114 const Matrix& getMatrix() const
│ │ │ │ +
115 {
│ │ │ │ +
116 return *matrix_;
│ │ │ │ +
117 }
│ │ │ │ +
│ │ │ │ +
118
│ │ │ │ +
│ │ │ │ +
119 void setArgs(const SmootherArgs& args)
│ │ │ │ +
120 {
│ │ │ │ +
121 args_=&args;
│ │ │ │ +
122 }
│ │ │ │ +
│ │ │ │ +
123
│ │ │ │ +
124 template<class T1>
│ │ │ │ +
│ │ │ │ +
125 void setComm([[maybe_unused]] T1& comm)
│ │ │ │ +
126 {}
│ │ │ │ +
│ │ │ │ +
127
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
129 {
│ │ │ │ +
130 return comm_;
│ │ │ │ +
131 }
│ │ │ │ +
│ │ │ │ +
132
│ │ │ │ +
│ │ │ │ +
133 const SmootherArgs getArgs() const
│ │ │ │ +
134 {
│ │ │ │ +
135 return *args_;
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
138 protected:
│ │ │ │ +
139 const Matrix* matrix_;
│ │ │ │ +
140 private:
│ │ │ │ +
141 const SmootherArgs* args_;
│ │ │ │ + │ │ │ │ +
143 };
│ │ │ │ +
│ │ │ │ +
144
│ │ │ │ +
145 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
147 : public DefaultConstructionArgs<T>
│ │ │ │ +
148 {};
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
150 template<class T, class C=SequentialInformation>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
152 : public ConstructionArgs<T>
│ │ │ │ +
153 {
│ │ │ │ +
154 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 {}
│ │ │ │ +
│ │ │ │ +
157
│ │ │ │ +
│ │ │ │ +
158 void setComm(const C& comm)
│ │ │ │ +
159 {
│ │ │ │ +
160 comm_ = &comm;
│ │ │ │ +
161 }
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
│ │ │ │ +
163 const C& getComm() const
│ │ │ │ +
164 {
│ │ │ │ +
165 return *comm_;
│ │ │ │ +
166 }
│ │ │ │ +
│ │ │ │ +
167 private:
│ │ │ │ +
168 const C* comm_;
│ │ │ │ +
169 };
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
171
│ │ │ │ +
172 template<class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
174 {
│ │ │ │ +
175 typedef Richardson<X,Y> T;
│ │ │ │ +
176
│ │ │ │ + │ │ │ │ +
178
│ │ │ │ +
179 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
181 {}
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
183 template <class... Args>
│ │ │ │ +
│ │ │ │ +
184 void setMatrix(const Args&...)
│ │ │ │ +
185 {}
│ │ │ │ +
│ │ │ │ +
186
│ │ │ │ +
│ │ │ │ +
187 void setArgs(const SmootherArgs& args)
│ │ │ │ +
188 {
│ │ │ │ +
189 args_=&args;
│ │ │ │ +
190 }
│ │ │ │ +
│ │ │ │ +
191
│ │ │ │ +
192 template<class T1>
│ │ │ │ +
│ │ │ │ +
193 void setComm([[maybe_unused]] T1& comm)
│ │ │ │ +
194 {}
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
197 {
│ │ │ │ +
198 return comm_;
│ │ │ │ +
199 }
│ │ │ │ +
│ │ │ │ +
200
│ │ │ │ +
│ │ │ │ +
201 const SmootherArgs getArgs() const
│ │ │ │ +
202 {
│ │ │ │ +
203 return *args_;
│ │ │ │ +
204 }
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
206 private:
│ │ │ │ +
207 const SmootherArgs* args_;
│ │ │ │ + │ │ │ │ +
209 };
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
211
│ │ │ │ +
212
│ │ │ │ +
213 template<class T>
│ │ │ │ +
214 struct ConstructionTraits;
│ │ │ │ +
215
│ │ │ │ +
219 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
220 struct ConstructionTraits<SeqSSOR<M,X,Y,l> >
│ │ │ │ +
221 {
│ │ │ │ + │ │ │ │ +
223
│ │ │ │ +
│ │ │ │ +
224 static inline std::shared_ptr<SeqSSOR<M,X,Y,l>> construct(Arguments& args)
│ │ │ │ +
225 {
│ │ │ │ +
226 return std::make_shared<SeqSSOR<M,X,Y,l>>
│ │ │ │ +
227 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
│ │ │ │ +
228 }
│ │ │ │ +
│ │ │ │ +
229 };
│ │ │ │ +
│ │ │ │ +
230
│ │ │ │ +
231
│ │ │ │ +
235 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
236 struct ConstructionTraits<SeqSOR<M,X,Y,l> >
│ │ │ │ +
237 {
│ │ │ │ + │ │ │ │ +
239
│ │ │ │ +
│ │ │ │ +
240 static inline std::shared_ptr<SeqSOR<M,X,Y,l>> construct(Arguments& args)
│ │ │ │ +
241 {
│ │ │ │ +
242 return std::make_shared<SeqSOR<M,X,Y,l>>
│ │ │ │ +
243 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
│ │ │ │ +
244 }
│ │ │ │ +
│ │ │ │ +
245 };
│ │ │ │ +
│ │ │ │ +
246
│ │ │ │ +
247
│ │ │ │ +
251 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
252 struct ConstructionTraits<SeqJac<M,X,Y,l> >
│ │ │ │ +
253 {
│ │ │ │ + │ │ │ │ +
255
│ │ │ │ +
│ │ │ │ +
256 static inline std::shared_ptr<SeqJac<M,X,Y,l>> construct(Arguments& args)
│ │ │ │ +
257 {
│ │ │ │ +
258 return std::make_shared<SeqJac<M,X,Y,l>>
│ │ │ │ +
259 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
│ │ │ │ +
260 }
│ │ │ │ +
│ │ │ │ +
261 };
│ │ │ │ +
│ │ │ │ +
262
│ │ │ │ +
266 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
267 struct ConstructionTraits<Richardson<X,Y> >
│ │ │ │ +
268 {
│ │ │ │ + │ │ │ │ +
270
│ │ │ │ +
│ │ │ │ +
271 static inline std::shared_ptr<Richardson<X,Y>> construct(Arguments& args)
│ │ │ │ +
272 {
│ │ │ │ +
273 return std::make_shared<Richardson<X,Y>>
│ │ │ │ +
274 (args.getArgs().relaxationFactor);
│ │ │ │ +
275 }
│ │ │ │ +
│ │ │ │ +
276 };
│ │ │ │ +
│ │ │ │ +
277
│ │ │ │ +
278
│ │ │ │ +
279 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
281 : public DefaultConstructionArgs<SeqILU<M,X,Y> >
│ │ │ │ +
282 {
│ │ │ │ +
283 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
285 : n_(n)
│ │ │ │ +
286 {}
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
│ │ │ │ +
288 void setN(int n)
│ │ │ │ +
289 {
│ │ │ │ +
290 n_ = n;
│ │ │ │ +
291 }
│ │ │ │ +
│ │ │ │ +
292
│ │ │ │ +
│ │ │ │ +
293 int getN()
│ │ │ │ +
294 {
│ │ │ │ +
295 return n_;
│ │ │ │ +
296 }
│ │ │ │ +
│ │ │ │ +
297
│ │ │ │ +
298 private:
│ │ │ │ +
299 int n_;
│ │ │ │ +
300 };
│ │ │ │ +
│ │ │ │ +
301
│ │ │ │ +
302
│ │ │ │ +
306 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
307 struct ConstructionTraits<SeqILU<M,X,Y> >
│ │ │ │ +
308 {
│ │ │ │ + │ │ │ │ +
310
│ │ │ │ +
│ │ │ │ +
311 static inline std::shared_ptr<SeqILU<M,X,Y>> construct(Arguments& args)
│ │ │ │ +
312 {
│ │ │ │ +
313 return std::make_shared<SeqILU<M,X,Y>>
│ │ │ │ +
314 (args.getMatrix(), args.getN(), args.getArgs().relaxationFactor);
│ │ │ │ +
315 }
│ │ │ │ +
│ │ │ │ +
316 };
│ │ │ │ +
│ │ │ │ +
317
│ │ │ │ +
321 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ +
322 struct ConstructionTraits<ParSSOR<M,X,Y,C> >
│ │ │ │ +
323 {
│ │ │ │ + │ │ │ │ +
325
│ │ │ │ +
│ │ │ │ +
326 static inline std::shared_ptr<ParSSOR<M,X,Y,C>> construct(Arguments& args)
│ │ │ │ +
327 {
│ │ │ │ +
328 return std::make_shared<ParSSOR<M,X,Y,C>>
│ │ │ │ +
329 (args.getMatrix(), args.getArgs().iterations,
│ │ │ │ +
330 args.getArgs().relaxationFactor, args.getComm());
│ │ │ │ +
331 }
│ │ │ │ +
│ │ │ │ +
332 };
│ │ │ │ +
│ │ │ │ +
333
│ │ │ │ +
334 template<class X, class Y, class C, class T>
│ │ │ │ +
│ │ │ │ +
335 struct ConstructionTraits<BlockPreconditioner<X,Y,C,T> >
│ │ │ │ +
336 {
│ │ │ │ + │ │ │ │ +
338 typedef ConstructionTraits<T> SeqConstructionTraits;
│ │ │ │ +
│ │ │ │ +
339 static inline std::shared_ptr<BlockPreconditioner<X,Y,C,T>> construct(Arguments& args)
│ │ │ │ +
340 {
│ │ │ │ +
341 auto seqPrec = SeqConstructionTraits::construct(args);
│ │ │ │ +
342 return std::make_shared<BlockPreconditioner<X,Y,C,T>> (seqPrec, args.getComm());
│ │ │ │ +
343 }
│ │ │ │ +
│ │ │ │ +
344 };
│ │ │ │ +
│ │ │ │ +
345
│ │ │ │ +
346 template<class C, class T>
│ │ │ │ +
│ │ │ │ +
347 struct ConstructionTraits<NonoverlappingBlockPreconditioner<C,T> >
│ │ │ │ +
348 {
│ │ │ │ + │ │ │ │ +
350 typedef ConstructionTraits<T> SeqConstructionTraits;
│ │ │ │ +
│ │ │ │ +
351 static inline std::shared_ptr<NonoverlappingBlockPreconditioner<C,T>> construct(Arguments& args)
│ │ │ │ +
352 {
│ │ │ │ +
353 auto seqPrec = SeqConstructionTraits::construct(args);
│ │ │ │ +
354 return std::make_shared<NonoverlappingBlockPreconditioner<C,T>> (seqPrec, args.getComm());
│ │ │ │ +
355 }
│ │ │ │ +
│ │ │ │ +
356 };
│ │ │ │ +
│ │ │ │ +
357
│ │ │ │ +
368 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
370 {
│ │ │ │ +
371 typedef T Smoother;
│ │ │ │ +
372 typedef typename Smoother::range_type Range;
│ │ │ │ +
373 typedef typename Smoother::domain_type Domain;
│ │ │ │ +
374
│ │ │ │ +
│ │ │ │ +
382 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ +
383 {
│ │ │ │ +
384 smoother.apply(v,d);
│ │ │ │ +
385 }
│ │ │ │ +
│ │ │ │ +
386
│ │ │ │ +
│ │ │ │ +
394 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ +
395 {
│ │ │ │ +
396 smoother.apply(v,d);
│ │ │ │ +
397 }
│ │ │ │ +
│ │ │ │ +
398 };
│ │ │ │ +
│ │ │ │ +
399
│ │ │ │ +
405 template<typename LevelContext>
│ │ │ │ +
│ │ │ │ +
406 void presmooth(LevelContext& levelContext, size_t steps)
│ │ │ │ +
407 {
│ │ │ │ +
408 for(std::size_t i=0; i < steps; ++i) {
│ │ │ │ +
409 *levelContext.lhs=0;
│ │ │ │ + │ │ │ │ +
411 ::preSmooth(*levelContext.smoother, *levelContext.lhs,
│ │ │ │ +
412 *levelContext.rhs);
│ │ │ │ +
413 // Accumulate update
│ │ │ │ +
414 *levelContext.update += *levelContext.lhs;
│ │ │ │ +
415
│ │ │ │ +
416 // update defect
│ │ │ │ +
417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, *levelContext.rhs);
│ │ │ │ +
418 levelContext.pinfo->project(*levelContext.rhs);
│ │ │ │ +
419 }
│ │ │ │ +
420 }
│ │ │ │ +
│ │ │ │ +
421
│ │ │ │ +
427 template<typename LevelContext>
│ │ │ │ +
│ │ │ │ +
428 void postsmooth(LevelContext& levelContext, size_t steps)
│ │ │ │ +
429 {
│ │ │ │ +
430 for(std::size_t i=0; i < steps; ++i) {
│ │ │ │ +
431 // update defect
│ │ │ │ +
432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,
│ │ │ │ +
433 *levelContext.rhs);
│ │ │ │ +
434 *levelContext.lhs=0;
│ │ │ │ +
435 levelContext.pinfo->project(*levelContext.rhs);
│ │ │ │ + │ │ │ │ +
437 ::postSmooth(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs);
│ │ │ │ +
438 // Accumulate update
│ │ │ │ +
439 *levelContext.update += *levelContext.lhs;
│ │ │ │ +
440 }
│ │ │ │ +
441 }
│ │ │ │ +
│ │ │ │ +
442
│ │ │ │ +
443 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
444 struct SmootherApplier<SeqSOR<M,X,Y,l> >
│ │ │ │ +
445 {
│ │ │ │ + │ │ │ │ +
447 typedef typename Smoother::range_type Range;
│ │ │ │ + │ │ │ │ +
449
│ │ │ │ +
│ │ │ │ +
450 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ +
451 {
│ │ │ │ +
452 smoother.template apply<true>(v,d);
│ │ │ │ +
453 }
│ │ │ │ +
│ │ │ │ +
454
│ │ │ │ +
455
│ │ │ │ +
│ │ │ │ +
456 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ +
457 {
│ │ │ │ +
458 smoother.template apply<false>(v,d);
│ │ │ │ +
459 }
│ │ │ │ +
│ │ │ │ +
460 };
│ │ │ │ +
│ │ │ │ +
461
│ │ │ │ +
462 template<class M, class X, class Y, class C, int l>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
464 {
│ │ │ │ + │ │ │ │ +
466 typedef typename Smoother::range_type Range;
│ │ │ │ + │ │ │ │ +
468
│ │ │ │ +
│ │ │ │ +
469 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ +
470 {
│ │ │ │ +
471 smoother.template apply<true>(v,d);
│ │ │ │ +
472 }
│ │ │ │ +
│ │ │ │ +
473
│ │ │ │ +
474
│ │ │ │ +
│ │ │ │ +
475 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ +
476 {
│ │ │ │ +
477 smoother.template apply<false>(v,d);
│ │ │ │ +
478 }
│ │ │ │ +
│ │ │ │ +
479 };
│ │ │ │ +
│ │ │ │ +
480
│ │ │ │ +
481 template<class M, class X, class Y, class C, int l>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
483 {
│ │ │ │ + │ │ │ │ +
485 typedef typename Smoother::range_type Range;
│ │ │ │ + │ │ │ │ +
487
│ │ │ │ +
│ │ │ │ +
488 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ +
489 {
│ │ │ │ +
490 smoother.template apply<true>(v,d);
│ │ │ │ +
491 }
│ │ │ │ +
│ │ │ │ +
492
│ │ │ │ +
493
│ │ │ │ +
│ │ │ │ +
494 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ +
495 {
│ │ │ │ +
496 smoother.template apply<false>(v,d);
│ │ │ │ +
497 }
│ │ │ │ +
│ │ │ │ +
498 };
│ │ │ │ +
│ │ │ │ +
499
│ │ │ │ +
500 } // end namespace Amg
│ │ │ │ +
501
│ │ │ │ +
502 // forward declarations
│ │ │ │ +
503 template<class M, class X, class MO, class MS, class A>
│ │ │ │ +
504 class SeqOverlappingSchwarz;
│ │ │ │ +
505
│ │ │ │ +
506 struct MultiplicativeSchwarzMode;
│ │ │ │ +
507
│ │ │ │ +
508 namespace Amg
│ │ │ │ +
509 {
│ │ │ │ +
510 template<class M, class X, class MS, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
512 MS,TA> >
│ │ │ │ +
513 {
│ │ │ │ + │ │ │ │ +
515 typedef typename Smoother::range_type Range;
│ │ │ │ + │ │ │ │ +
517
│ │ │ │ +
│ │ │ │ +
518 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ +
519 {
│ │ │ │ +
520 smoother.template apply<true>(v,d);
│ │ │ │ +
521 }
│ │ │ │ +
│ │ │ │ +
522
│ │ │ │ +
523
│ │ │ │ +
│ │ │ │ +
524 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ +
525 {
│ │ │ │ +
526 smoother.template apply<false>(v,d);
│ │ │ │ +
527
│ │ │ │ +
528 }
│ │ │ │ +
│ │ │ │ +
529 };
│ │ │ │ +
│ │ │ │ +
530
│ │ │ │ +
531 // template<class M, class X, class TM, class TA>
│ │ │ │ +
532 // class SeqOverlappingSchwarz;
│ │ │ │ +
533
│ │ │ │ +
534 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
536 : public DefaultSmootherArgs<T>
│ │ │ │ +
537 {
│ │ │ │ + │ │ │ │ +
539
│ │ │ │ + │ │ │ │ + │ │ │ │ +
542
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
544 bool onthefly_=false)
│ │ │ │ +
545 : overlap(overlap_), onthefly(onthefly_)
│ │ │ │ +
546 {}
│ │ │ │ +
│ │ │ │ +
547 };
│ │ │ │ +
│ │ │ │ +
548
│ │ │ │ +
549 template<class M, class X, class TM, class TS, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
551 {
│ │ │ │ + │ │ │ │ +
553 };
│ │ │ │ +
│ │ │ │ +
554
│ │ │ │ +
555 template<class M, class X, class TM, class TS, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
557 : public DefaultConstructionArgs<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
│ │ │ │ +
558 {
│ │ │ │ + │ │ │ │ +
560
│ │ │ │ +
561 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
566 typedef typename Vector::value_type Subdomain;
│ │ │ │ +
567
│ │ │ │ +
│ │ │ │ +
568 virtual void setMatrix(const M& matrix, const AggregatesMap& amap)
│ │ │ │ +
569 {
│ │ │ │ +
570 Father::setMatrix(matrix);
│ │ │ │ +
571
│ │ │ │ +
572 std::vector<bool> visited(amap.noVertices(), false);
│ │ │ │ +
573 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
│ │ │ │ +
574 VisitedMapType visitedMap(visited.begin());
│ │ │ │ +
575
│ │ │ │ +
576 MatrixGraph<const M> graph(matrix);
│ │ │ │ +
577
│ │ │ │ + │ │ │ │ +
579
│ │ │ │ +
580 switch(Father::getArgs().overlap) {
│ │ │ │ +
581 case SmootherArgs::vertex :
│ │ │ │ +
582 {
│ │ │ │ +
583 VertexAdder visitor(subdomains, amap);
│ │ │ │ +
584 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ +
585 }
│ │ │ │ +
586 break;
│ │ │ │ +
587 case SmootherArgs::pairwise :
│ │ │ │ +
588 {
│ │ │ │ +
589 createPairDomains(graph);
│ │ │ │ +
590 }
│ │ │ │ +
591 break;
│ │ │ │ +
592 case SmootherArgs::aggregate :
│ │ │ │ +
593 {
│ │ │ │ +
594 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
│ │ │ │ +
595 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ +
596 }
│ │ │ │ +
597 break;
│ │ │ │ +
598 case SmootherArgs::none :
│ │ │ │ +
599 NoneAdder visitor;
│ │ │ │ +
600 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ +
601 break;
│ │ │ │ +
602 default :
│ │ │ │ +
603 DUNE_THROW(NotImplemented, "This overlapping scheme is not supported!");
│ │ │ │ +
604 }
│ │ │ │ +
605 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
606 void setMatrix(const M& matrix)
│ │ │ │ +
607 {
│ │ │ │ +
608 Father::setMatrix(matrix);
│ │ │ │ +
609
│ │ │ │ +
610 /* Create aggregates map where each aggregate is just one vertex. */
│ │ │ │ +
611 AggregatesMap amap(matrix.N());
│ │ │ │ + │ │ │ │ +
613 for(typename AggregatesMap::iterator iter=amap.begin();
│ │ │ │ +
614 iter!=amap.end(); ++iter)
│ │ │ │ +
615 *iter=v++;
│ │ │ │ +
616
│ │ │ │ +
617 std::vector<bool> visited(amap.noVertices(), false);
│ │ │ │ +
618 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
│ │ │ │ +
619 VisitedMapType visitedMap(visited.begin());
│ │ │ │ +
620
│ │ │ │ +
621 MatrixGraph<const M> graph(matrix);
│ │ │ │ +
622
│ │ │ │ + │ │ │ │ +
624
│ │ │ │ +
625 switch(Father::getArgs().overlap) {
│ │ │ │ +
626 case SmootherArgs::vertex :
│ │ │ │ +
627 {
│ │ │ │ +
628 VertexAdder visitor(subdomains, amap);
│ │ │ │ +
629 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ +
630 }
│ │ │ │ +
631 break;
│ │ │ │ +
632 case SmootherArgs::aggregate :
│ │ │ │ +
633 {
│ │ │ │ +
634 DUNE_THROW(NotImplemented, "Aggregate overlap is not supported yet");
│ │ │ │ +
635 /*
│ │ │ │ +
636 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
│ │ │ │ +
637 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ +
638 */
│ │ │ │ +
639 }
│ │ │ │ +
640 break;
│ │ │ │ +
641 case SmootherArgs::pairwise :
│ │ │ │ +
642 {
│ │ │ │ +
643 createPairDomains(graph);
│ │ │ │ +
644 }
│ │ │ │ +
645 break;
│ │ │ │ +
646 case SmootherArgs::none :
│ │ │ │ +
647 NoneAdder visitor;
│ │ │ │ +
648 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ +
649
│ │ │ │ +
650 }
│ │ │ │ +
651 }
│ │ │ │ +
│ │ │ │ +
652
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
654 {
│ │ │ │ +
655 return subdomains;
│ │ │ │ +
656 }
│ │ │ │ +
│ │ │ │ +
657
│ │ │ │ +
658 private:
│ │ │ │ +
659 struct VertexAdder
│ │ │ │ +
660 {
│ │ │ │ +
│ │ │ │ +
661 VertexAdder(Vector& subdomains_, const AggregatesMap& aggregates_)
│ │ │ │ +
662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_)
│ │ │ │ +
663 {}
│ │ │ │ +
│ │ │ │ +
664 template<class T>
│ │ │ │ +
│ │ │ │ +
665 void operator()(const T& edge)
│ │ │ │ +
666 {
│ │ │ │ +
667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED)
│ │ │ │ +
668 subdomains[subdomain].insert(edge.target());
│ │ │ │ +
669 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
670 int setAggregate(const AggregateDescriptor& aggregate_)
│ │ │ │ +
671 {
│ │ │ │ +
672 subdomain=aggregate_;
│ │ │ │ +
673 max = std::max(subdomain, aggregate_);
│ │ │ │ +
674 return subdomain;
│ │ │ │ +
675 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
676 int noSubdomains() const
│ │ │ │ +
677 {
│ │ │ │ +
678 return max+1;
│ │ │ │ +
679 }
│ │ │ │ +
│ │ │ │ +
680 private:
│ │ │ │ +
681 Vector& subdomains;
│ │ │ │ + │ │ │ │ +
683 AggregateDescriptor subdomain;
│ │ │ │ +
684 const AggregatesMap& aggregates;
│ │ │ │ +
685 };
│ │ │ │ +
686 struct NoneAdder
│ │ │ │ +
687 {
│ │ │ │ +
688 template<class T>
│ │ │ │ +
│ │ │ │ +
689 void operator()(const T& edge)
│ │ │ │ +
690 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
691 int setAggregate(const AggregateDescriptor& aggregate_)
│ │ │ │ +
692 {
│ │ │ │ +
693 return -1;
│ │ │ │ +
694 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
695 int noSubdomains() const
│ │ │ │ +
696 {
│ │ │ │ +
697 return -1;
│ │ │ │ +
698 }
│ │ │ │ +
│ │ │ │ +
699 };
│ │ │ │ +
700
│ │ │ │ +
701 template<class VM>
│ │ │ │ +
702 struct AggregateAdder
│ │ │ │ +
703 {
│ │ │ │ +
│ │ │ │ +
704 AggregateAdder(Vector& subdomains_, const AggregatesMap& aggregates_,
│ │ │ │ +
705 const MatrixGraph<const M>& graph_, VM& visitedMap_)
│ │ │ │ +
706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_),
│ │ │ │ +
707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_)
│ │ │ │ +
708 {}
│ │ │ │ +
│ │ │ │ +
709 template<class T>
│ │ │ │ +
│ │ │ │ +
710 void operator()(const T& edge)
│ │ │ │ +
711 {
│ │ │ │ +
712 subdomains[subdomain].insert(edge.target());
│ │ │ │ +
713 // If we (the neighbouring vertex of the aggregate)
│ │ │ │ +
714 // are not isolated, add the aggregate we belong to
│ │ │ │ +
715 // to the same subdomain using the OneOverlapAdder
│ │ │ │ +
716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) {
│ │ │ │ +
717 assert(aggregates[edge.target()]!=aggregate);
│ │ │ │ +
718 typename AggregatesMap::VertexList vlist;
│ │ │ │ +
719 aggregates.template breadthFirstSearch<true,false>(edge.target(), aggregate,
│ │ │ │ +
720 graph, vlist, adder, adder,
│ │ │ │ +
721 visitedMap);
│ │ │ │ +
722 }
│ │ │ │ +
723 }
│ │ │ │ +
│ │ │ │ +
724
│ │ │ │ +
│ │ │ │ +
725 int setAggregate(const AggregateDescriptor& aggregate_)
│ │ │ │ +
726 {
│ │ │ │ +
727 adder.setAggregate(aggregate_);
│ │ │ │ +
728 aggregate=aggregate_;
│ │ │ │ +
729 return ++subdomain;
│ │ │ │ +
730 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
731 int noSubdomains() const
│ │ │ │ +
732 {
│ │ │ │ +
733 return subdomain+1;
│ │ │ │ +
734 }
│ │ │ │ +
│ │ │ │ +
735
│ │ │ │ +
736 private:
│ │ │ │ +
737 AggregateDescriptor aggregate;
│ │ │ │ +
738 Vector& subdomains;
│ │ │ │ +
739 int subdomain;
│ │ │ │ +
740 const AggregatesMap& aggregates;
│ │ │ │ +
741 VertexAdder adder;
│ │ │ │ +
742 const MatrixGraph<const M>& graph;
│ │ │ │ +
743 VM& visitedMap;
│ │ │ │ +
744 };
│ │ │ │ +
745
│ │ │ │ +
746 void createPairDomains(const MatrixGraph<const M>& graph)
│ │ │ │ +
747 {
│ │ │ │ +
748 typedef typename MatrixGraph<const M>::ConstVertexIterator VIter;
│ │ │ │ +
749 typedef typename MatrixGraph<const M>::ConstEdgeIterator EIter;
│ │ │ │ +
750 typedef typename M::size_type size_type;
│ │ │ │ +
751
│ │ │ │ +
752 std::set<std::pair<size_type,size_type> > pairs;
│ │ │ │ +
753 int total=0;
│ │ │ │ +
754 for(VIter v=graph.begin(), ve=graph.end(); ve != v; ++v)
│ │ │ │ +
755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e)
│ │ │ │ +
756 {
│ │ │ │ +
757 ++total;
│ │ │ │ +
758 if(e.source()<e.target())
│ │ │ │ +
759 pairs.insert(std::make_pair(e.source(),e.target()));
│ │ │ │ +
760 else
│ │ │ │ +
761 pairs.insert(std::make_pair(e.target(),e.source()));
│ │ │ │ +
762 }
│ │ │ │ +
763
│ │ │ │ +
764
│ │ │ │ +
765 subdomains.resize(pairs.size());
│ │ │ │ +
766 Dune::dinfo <<std::endl<< "Created "<<pairs.size()<<" ("<<total<<") pair domains"<<std::endl<<std::endl;
│ │ │ │ +
767 typedef typename std::set<std::pair<size_type,size_type> >::const_iterator SIter;
│ │ │ │ +
768 typename Vector::iterator subdomain=subdomains.begin();
│ │ │ │ +
769
│ │ │ │ +
770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s)
│ │ │ │ +
771 {
│ │ │ │ +
772 subdomain->insert(s->first);
│ │ │ │ +
773 subdomain->insert(s->second);
│ │ │ │ +
774 ++subdomain;
│ │ │ │ +
775 }
│ │ │ │ +
776 std::size_t minsize=10000;
│ │ │ │ +
777 std::size_t maxsize=0;
│ │ │ │ +
778 int sum=0;
│ │ │ │ +
779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
│ │ │ │ +
780 sum+=subdomains[i].size();
│ │ │ │ +
781 minsize=std::min(minsize, subdomains[i].size());
│ │ │ │ +
782 maxsize=std::max(maxsize, subdomains[i].size());
│ │ │ │ +
783 }
│ │ │ │ +
784 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
│ │ │ │ +
785 <<" no="<<subdomains.size()<<std::endl;
│ │ │ │ +
786 }
│ │ │ │ +
787
│ │ │ │ +
788 template<class Visitor>
│ │ │ │ +
789 void createSubdomains(const M& matrix, const MatrixGraph<const M>& graph,
│ │ │ │ +
790 const AggregatesMap& amap, Visitor& overlapVisitor,
│ │ │ │ +
791 IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap>& visitedMap )
│ │ │ │ +
792 {
│ │ │ │ +
793 // count number ag aggregates. We assume that the
│ │ │ │ +
794 // aggregates are numbered consecutively from 0 except
│ │ │ │ +
795 // for the isolated ones. All isolated vertices form
│ │ │ │ +
796 // one aggregate, here.
│ │ │ │ +
797 int isolated=0;
│ │ │ │ +
798 AggregateDescriptor maxAggregate=0;
│ │ │ │ +
799
│ │ │ │ +
800 for(std::size_t i=0; i < amap.noVertices(); ++i)
│ │ │ │ +
801 if(amap[i]==AggregatesMap::ISOLATED)
│ │ │ │ +
802 isolated++;
│ │ │ │ +
803 else
│ │ │ │ +
804 maxAggregate = std::max(maxAggregate, amap[i]);
│ │ │ │ +
805
│ │ │ │ +
806 subdomains.resize(maxAggregate+1+isolated);
│ │ │ │ +
807
│ │ │ │ +
808 // reset the subdomains
│ │ │ │ +
809 for(typename Vector::size_type i=0; i < subdomains.size(); ++i)
│ │ │ │ +
810 subdomains[i].clear();
│ │ │ │ +
811
│ │ │ │ +
812 // Create the subdomains from the aggregates mapping.
│ │ │ │ +
813 // For each aggregate we mark all entries and the
│ │ │ │ +
814 // neighbouring vertices as belonging to the same subdomain
│ │ │ │ +
815 VertexAdder aggregateVisitor(subdomains, amap);
│ │ │ │ +
816
│ │ │ │ +
817 for(VertexDescriptor i=0; i < amap.noVertices(); ++i)
│ │ │ │ +
818 if(!get(visitedMap, i)) {
│ │ │ │ +
819 AggregateDescriptor aggregate=amap[i];
│ │ │ │ +
820
│ │ │ │ +
821 if(amap[i]==AggregatesMap::ISOLATED) {
│ │ │ │ +
822 // isolated vertex gets its own aggregate
│ │ │ │ +
823 subdomains.push_back(Subdomain());
│ │ │ │ +
824 aggregate=subdomains.size()-1;
│ │ │ │ +
825 }
│ │ │ │ +
826 overlapVisitor.setAggregate(aggregate);
│ │ │ │ +
827 aggregateVisitor.setAggregate(aggregate);
│ │ │ │ +
828 subdomains[aggregate].insert(i);
│ │ │ │ +
829 typename AggregatesMap::VertexList vlist;
│ │ │ │ +
830 amap.template breadthFirstSearch<false,false>(i, aggregate, graph, vlist, aggregateVisitor,
│ │ │ │ +
831 overlapVisitor, visitedMap);
│ │ │ │ +
832 }
│ │ │ │ +
833
│ │ │ │ +
834 std::size_t minsize=10000;
│ │ │ │ +
835 std::size_t maxsize=0;
│ │ │ │ +
836 int sum=0;
│ │ │ │ +
837 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
│ │ │ │ +
838 sum+=subdomains[i].size();
│ │ │ │ +
839 minsize=std::min(minsize, subdomains[i].size());
│ │ │ │ +
840 maxsize=std::max(maxsize, subdomains[i].size());
│ │ │ │ +
841 }
│ │ │ │ +
842 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
│ │ │ │ +
843 <<" no="<<subdomains.size()<<" isolated="<<isolated<<std::endl;
│ │ │ │ +
844
│ │ │ │ +
845
│ │ │ │ +
846
│ │ │ │ +
847 }
│ │ │ │ +
848 Vector subdomains;
│ │ │ │ +
849 };
│ │ │ │ +
│ │ │ │ +
850
│ │ │ │ +
851
│ │ │ │ +
852 template<class M, class X, class TM, class TS, class TA>
│ │ │ │ +
│ │ │ │ +
853 struct ConstructionTraits<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
│ │ │ │ +
854 {
│ │ │ │ + │ │ │ │ +
856
│ │ │ │ +
│ │ │ │ +
857 static inline std::shared_ptr<SeqOverlappingSchwarz<M,X,TM,TS,TA>> construct(Arguments& args)
│ │ │ │ +
858 {
│ │ │ │ +
859 return std::make_shared<SeqOverlappingSchwarz<M,X,TM,TS,TA>>
│ │ │ │ +
860 (args.getMatrix(),
│ │ │ │ +
861 args.getSubDomains(),
│ │ │ │ + │ │ │ │ +
863 args.getArgs().onthefly);
│ │ │ │ +
864 }
│ │ │ │ +
│ │ │ │ +
865 };
│ │ │ │ +
│ │ │ │ +
866
│ │ │ │ +
867
│ │ │ │ +
868 } // namespace Amg
│ │ │ │ +
869} // namespace Dune
│ │ │ │ +
870
│ │ │ │ +
871
│ │ │ │ +
872
│ │ │ │ +
873#endif
│ │ │ │ + │ │ │ │ +
Provides classes for the Coloring process of AMG.
│ │ │ │ +
Helper classes for the construction of classes without empty constructor.
│ │ │ │ + │ │ │ │ +
Define general preconditioner interface.
│ │ │ │ +
DefaultSmootherArgs< typename X::field_type > Arguments
Definition smoother.hh:74
│ │ │ │ +
static void postSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:494
│ │ │ │ + │ │ │ │ +
static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
Definition smoother.hh:518
│ │ │ │ +
static std::shared_ptr< SeqJac< M, X, Y, l > > construct(Arguments &args)
Definition smoother.hh:256
│ │ │ │ +
ConstructionArgs< SeqILU< M, X, Y > > Arguments
Definition smoother.hh:309
│ │ │ │ +
const Matrix & getMatrix() const
Definition smoother.hh:114
│ │ │ │ + │ │ │ │ +
int setAggregate(const AggregateDescriptor &aggregate_)
Definition smoother.hh:691
│ │ │ │ +
DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
Definition smoother.hh:67
│ │ │ │ +
int setAggregate(const AggregateDescriptor &aggregate_)
Definition smoother.hh:670
│ │ │ │ +
ConstructionTraits< T > SeqConstructionTraits
Definition smoother.hh:350
│ │ │ │ +
void setArgs(const SmootherArgs &args)
Definition smoother.hh:119
│ │ │ │ +
ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments
Definition smoother.hh:855
│ │ │ │ +
NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother
Definition smoother.hh:484
│ │ │ │ +
static void postSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:456
│ │ │ │ +
AggregateAdder(Vector &subdomains_, const AggregatesMap &aggregates_, const MatrixGraph< const M > &graph_, VM &visitedMap_)
Definition smoother.hh:704
│ │ │ │ + │ │ │ │ +
void setComm(const C &comm)
Definition smoother.hh:158
│ │ │ │ +
DefaultConstructionArgs< Richardson< X, Y > > Arguments
Definition smoother.hh:269
│ │ │ │ +
virtual ~DefaultConstructionArgs()
Definition smoother.hh:180
│ │ │ │ +
SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments
Definition smoother.hh:552
│ │ │ │ + │ │ │ │ +
static void preSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:488
│ │ │ │ +
int getN()
Definition smoother.hh:293
│ │ │ │ + │ │ │ │ +
SeqSOR< M, X, Y, l > Smoother
Definition smoother.hh:446
│ │ │ │ + │ │ │ │ +
static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct(Arguments &args)
Definition smoother.hh:224
│ │ │ │ +
AggregatesMap::AggregateDescriptor AggregateDescriptor
Definition smoother.hh:564
│ │ │ │ +
bool onthefly
Definition smoother.hh:541
│ │ │ │ +
DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments
Definition smoother.hh:238
│ │ │ │ +
virtual void setMatrix(const M &matrix, const AggregatesMap &amap)
Definition smoother.hh:568
│ │ │ │ +
void setMatrix(const Args &...)
Definition smoother.hh:184
│ │ │ │ +
DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments
Definition smoother.hh:254
│ │ │ │ +
DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments
Definition smoother.hh:222
│ │ │ │ +
const SmootherArgs getArgs() const
Definition smoother.hh:133
│ │ │ │ +
VertexAdder(Vector &subdomains_, const AggregatesMap &aggregates_)
Definition smoother.hh:661
│ │ │ │ + │ │ │ │ +
SeqOverlappingSchwarz< M, X, TM, TS, TA >::subdomain_vector Vector
Definition smoother.hh:565
│ │ │ │ +
static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct(Arguments &args)
Definition smoother.hh:857
│ │ │ │ +
static void preSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:469
│ │ │ │ +
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ +
void setMatrix(const Matrix &matrix)
Definition smoother.hh:104
│ │ │ │ +
T Smoother
Definition smoother.hh:371
│ │ │ │ +
static void preSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:450
│ │ │ │ +
BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother
Definition smoother.hh:465
│ │ │ │ +
void setComm(T1 &comm)
Definition smoother.hh:193
│ │ │ │ + │ │ │ │ +
AggregateDescriptor * iterator
Definition aggregates.hh:735
│ │ │ │ +
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ + │ │ │ │ +
SeqOverlappingSchwarzSmootherArgs(Overlap overlap_=vertex, bool onthefly_=false)
Definition smoother.hh:543
│ │ │ │ +
DefaultParallelConstructionArgs< T, C > Arguments
Definition smoother.hh:337
│ │ │ │ +
DefaultParallelConstructionArgs< T, C > Arguments
Definition smoother.hh:349
│ │ │ │ +
const Matrix * matrix_
Definition smoother.hh:139
│ │ │ │ +
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ +
const SequentialInformation & getComm()
Definition smoother.hh:128
│ │ │ │ +
V AggregateDescriptor
The aggregate descriptor type.
Definition aggregates.hh:580
│ │ │ │ +
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ +
DefaultSmootherArgs()
Default constructor.
Definition smoother.hh:56
│ │ │ │ +
void setMatrix(const M &matrix)
Definition smoother.hh:606
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices.
│ │ │ │ + │ │ │ │ +
static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
apply post smoothing in forward direction
Definition smoother.hh:394
│ │ │ │ +
FieldTraits< T >::real_type RelaxationFactor
The type of the relaxation factor.
Definition smoother.hh:42
│ │ │ │ + │ │ │ │ +
Smoother::domain_type Domain
Definition smoother.hh:373
│ │ │ │ +
void setN(int n)
Definition smoother.hh:288
│ │ │ │ +
static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct(Arguments &args)
Definition smoother.hh:339
│ │ │ │ +
SLList< VertexDescriptor, Allocator > VertexList
The type of a single linked list of vertex descriptors.
Definition aggregates.hh:592
│ │ │ │ +
static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct(Arguments &args)
Definition smoother.hh:351
│ │ │ │ +
SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother
Definition smoother.hh:514
│ │ │ │ +
static std::shared_ptr< ParSSOR< M, X, Y, C > > construct(Arguments &args)
Definition smoother.hh:326
│ │ │ │ +
MatrixGraph< M >::VertexDescriptor VertexDescriptor
Definition smoother.hh:562
│ │ │ │ +
static std::shared_ptr< SeqILU< M, X, Y > > construct(Arguments &args)
Definition smoother.hh:311
│ │ │ │ + │ │ │ │ +
const SequentialInformation & getComm()
Definition smoother.hh:196
│ │ │ │ +
static std::shared_ptr< SeqSOR< M, X, Y, l > > construct(Arguments &args)
Definition smoother.hh:240
│ │ │ │ +
static std::shared_ptr< Richardson< X, Y > > construct(Arguments &args)
Definition smoother.hh:271
│ │ │ │ +
virtual void setMatrix(const Matrix &matrix, const AggregatesMap &amap)
Definition smoother.hh:108
│ │ │ │ + │ │ │ │ +
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ +
Dune::Amg::AggregatesMap< VertexDescriptor > AggregatesMap
Definition smoother.hh:563
│ │ │ │ +
const SmootherArgs getArgs() const
Definition smoother.hh:201
│ │ │ │ +
void setComm(T1 &comm)
Definition smoother.hh:125
│ │ │ │ +
static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
Definition smoother.hh:524
│ │ │ │ +
DefaultParallelConstructionArgs< M, C > Arguments
Definition smoother.hh:324
│ │ │ │ +
RelaxationFactor relaxationFactor
The relaxation factor to use.
Definition smoother.hh:51
│ │ │ │ +
virtual ~DefaultParallelConstructionArgs()
Definition smoother.hh:155
│ │ │ │ +
Smoother::domain_type Domain
Definition smoother.hh:448
│ │ │ │ +
int setAggregate(const AggregateDescriptor &aggregate_)
Definition smoother.hh:725
│ │ │ │ +
Smoother::range_type Range
Definition smoother.hh:447
│ │ │ │ +
const C & getComm() const
Definition smoother.hh:163
│ │ │ │ +
virtual ~DefaultConstructionArgs()
Definition smoother.hh:101
│ │ │ │ +
static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
apply pre smoothing in forward direction
Definition smoother.hh:382
│ │ │ │ +
static void postSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:475
│ │ │ │ +
ConstructionTraits< T > SeqConstructionTraits
Definition smoother.hh:338
│ │ │ │ +
ConstructionArgs(int n=0)
Definition smoother.hh:284
│ │ │ │ + │ │ │ │ +
void setArgs(const SmootherArgs &args)
Definition smoother.hh:187
│ │ │ │ +
int iterations
The numbe of iterations to perform.
Definition smoother.hh:47
│ │ │ │ +
Smoother::range_type Range
Definition smoother.hh:372
│ │ │ │ +
Overlap overlap
Definition smoother.hh:540
│ │ │ │ + │ │ │ │ +
@ aggregate
Definition smoother.hh:538
│ │ │ │ + │ │ │ │ +
@ pairwise
Definition smoother.hh:538
│ │ │ │ + │ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
virtual void post(X &x)=0
Clean up.
│ │ │ │ -
virtual void apply(X &v, const Y &d)=0
Apply one step of the preconditioner to the system A(v)=d.
│ │ │ │ -
virtual ~Preconditioner()
every abstract base class has a virtual destructor
Definition preconditioner.hh:104
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioner.hh:37
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioner.hh:35
│ │ │ │ -
virtual SolverCategory::Category category() const =0
Category of the preconditioner (see SolverCategory::Category)
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioner.hh:39
│ │ │ │ -
virtual void pre(X &x, Y &b)=0
Prepare the preconditioner.
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ +
X range_type
The range type of the preconditioner.
Definition overlappingschwarz.hh:770
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition overlappingschwarz.hh:765
│ │ │ │ +
std::vector< subdomain_type, typename std::allocator_traits< TA >::template rebind_alloc< subdomain_type > > subdomain_vector
The vector type containing the subdomain to row index mapping.
Definition overlappingschwarz.hh:797
│ │ │ │ +
Nonoverlapping parallel preconditioner.
Definition novlpschwarz.hh:276
│ │ │ │ +
P::range_type range_type
The range type of the preconditioner.
Definition novlpschwarz.hh:284
│ │ │ │ +
P::domain_type domain_type
The domain type of the preconditioner.
Definition novlpschwarz.hh:282
│ │ │ │ +
Tag that tells the Schwarz method to be multiplicative.
Definition overlappingschwarz.hh:126
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ +
VertexIterator end()
Get an iterator over the vertices.
│ │ │ │ +
M::size_type VertexDescriptor
The vertex descriptor.
Definition graph.hh:73
│ │ │ │ +
VertexIterator begin()
Get an iterator over the vertices.
│ │ │ │ +
Iterator over all edges starting from a vertex.
Definition graph.hh:95
│ │ │ │ +
The vertex iterator type of the graph.
Definition graph.hh:209
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ +
Traits class for getting the attribute class of a smoother.
Definition smoother.hh:66
│ │ │ │ +
Construction Arguments for the default smoothers.
Definition smoother.hh:93
│ │ │ │ +
Definition smoother.hh:148
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Helper class for applying the smoothers.
Definition smoother.hh:370
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Sequential SSOR preconditioner.
Definition preconditioners.hh:141
│ │ │ │ +
Sequential SOR preconditioner.
Definition preconditioners.hh:261
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:266
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:268
│ │ │ │ +
The sequential jacobian preconditioner.
Definition preconditioners.hh:412
│ │ │ │ +
Sequential ILU preconditioner.
Definition preconditioners.hh:532
│ │ │ │ +
Richardson preconditioner.
Definition preconditioners.hh:713
│ │ │ │ +
A parallel SSOR preconditioner.
Definition schwarz.hh:175
│ │ │ │ +
Block parallel preconditioner.
Definition schwarz.hh:278
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition schwarz.hh:285
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition schwarz.hh:290
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,91 +1,1343 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -preconditioner.hh │ │ │ │ │ + * _p_a_a_m_g │ │ │ │ │ +smoother.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_PRECONDITIONER_HH │ │ │ │ │ -6#define DUNE_ISTL_PRECONDITIONER_HH │ │ │ │ │ +5#ifndef DUNE_AMGSMOOTHER_HH │ │ │ │ │ +6#define DUNE_AMGSMOOTHER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ -11 │ │ │ │ │ -12namespace _D_u_n_e { │ │ │ │ │ -17 //===================================================================== │ │ │ │ │ -30 //===================================================================== │ │ │ │ │ -31 template │ │ │ │ │ -_3_2 class _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ -33 public: │ │ │ │ │ -_3_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_3_7 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_3_9 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -40 │ │ │ │ │ -_6_9 virtual void _p_r_e (X& x, Y& b) = 0; │ │ │ │ │ +8#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +9#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e │ │ │ │ │ +17{ │ │ │ │ │ +18 namespace Amg │ │ │ │ │ +19 { │ │ │ │ │ +20 │ │ │ │ │ +36 template │ │ │ │ │ +_3_7 struct _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +38 { │ │ │ │ │ +_4_2 typedef typename FieldTraits::real_type _R_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r; │ │ │ │ │ +43 │ │ │ │ │ +_4_7 int _i_t_e_r_a_t_i_o_n_s; │ │ │ │ │ +_5_1 _R_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r _r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r; │ │ │ │ │ +52 │ │ │ │ │ +_5_6 _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s() │ │ │ │ │ +57 : _i_t_e_r_a_t_i_o_n_s(1), _r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r(1.0) │ │ │ │ │ +58 {} │ │ │ │ │ +59 }; │ │ │ │ │ +60 │ │ │ │ │ +64 template │ │ │ │ │ +_6_5 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s │ │ │ │ │ +66 { │ │ │ │ │ +_6_7 typedef _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _T_:_:_m_a_t_r_i_x___t_y_p_e_:_:_f_i_e_l_d___t_y_p_e_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +68 │ │ │ │ │ +69 }; │ │ │ │ │ 70 │ │ │ │ │ -_8_1 virtual void _a_p_p_l_y (X& v, const Y& d) = 0; │ │ │ │ │ +71 template │ │ │ │ │ +_7_2 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_R_i_c_h_a_r_d_s_o_n> │ │ │ │ │ +73 { │ │ │ │ │ +_7_4 typedef _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _X_:_:_f_i_e_l_d___t_y_p_e_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +75 │ │ │ │ │ +76 }; │ │ │ │ │ +77 │ │ │ │ │ +78 template │ │ │ │ │ +_7_9 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ +80 : public _S_m_o_o_t_h_e_r_T_r_a_i_t_s │ │ │ │ │ +81 {}; │ │ │ │ │ 82 │ │ │ │ │ -_9_1 virtual void _p_o_s_t (X& x) = 0; │ │ │ │ │ -92 │ │ │ │ │ -_9_4 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -95#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE │ │ │ │ │ -96 { │ │ │ │ │ -97 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method │ │ │ │ │ -in a derived classes, in the future this method will pure virtual."); │ │ │ │ │ -98 } │ │ │ │ │ -99#else │ │ │ │ │ -100 = 0; │ │ │ │ │ -101#endif │ │ │ │ │ -102 │ │ │ │ │ -_1_0_4 virtual _~_P_r_e_c_o_n_d_i_t_i_o_n_e_r () {} │ │ │ │ │ -105 │ │ │ │ │ -106 }; │ │ │ │ │ -107 │ │ │ │ │ -111} │ │ │ │ │ -112#endif │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +83 template │ │ │ │ │ +_8_4 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ +85 : public _S_m_o_o_t_h_e_r_T_r_a_i_t_s │ │ │ │ │ +86 {}; │ │ │ │ │ +87 │ │ │ │ │ +91 template │ │ │ │ │ +_9_2 class _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ +93 { │ │ │ │ │ +94 typedef typename T::matrix_type Matrix; │ │ │ │ │ +95 │ │ │ │ │ +96 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_T_>_:_:_A_r_g_u_m_e_n_t_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +97 │ │ │ │ │ +98 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_>_:_: │ │ │ │ │ +_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r> _A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ +99 │ │ │ │ │ +100 public: │ │ │ │ │ +_1_0_1 virtual _~_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s() │ │ │ │ │ +102 {} │ │ │ │ │ +103 │ │ │ │ │ +_1_0_4 void _s_e_t_M_a_t_r_i_x(const Matrix& matrix) │ │ │ │ │ +105 { │ │ │ │ │ +106 _m_a_t_r_i_x__=&matrix; │ │ │ │ │ +107 } │ │ │ │ │ +_1_0_8 virtual void _s_e_t_M_a_t_r_i_x(const Matrix& matrix, [[maybe_unused]] const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p& amap) │ │ │ │ │ +109 { │ │ │ │ │ +110 _s_e_t_M_a_t_r_i_x(matrix); │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +113 │ │ │ │ │ +_1_1_4 const Matrix& _g_e_t_M_a_t_r_i_x() const │ │ │ │ │ +115 { │ │ │ │ │ +116 return *_m_a_t_r_i_x__; │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +_1_1_9 void _s_e_t_A_r_g_s(const _S_m_o_o_t_h_e_r_A_r_g_s& args) │ │ │ │ │ +120 { │ │ │ │ │ +121 args_=&args; │ │ │ │ │ +122 } │ │ │ │ │ +123 │ │ │ │ │ +124 template │ │ │ │ │ +_1_2_5 void _s_e_t_C_o_m_m([[maybe_unused]] T1& comm) │ │ │ │ │ +126 {} │ │ │ │ │ +127 │ │ │ │ │ +_1_2_8 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& _g_e_t_C_o_m_m() │ │ │ │ │ +129 { │ │ │ │ │ +130 return comm_; │ │ │ │ │ +131 } │ │ │ │ │ +132 │ │ │ │ │ +_1_3_3 const _S_m_o_o_t_h_e_r_A_r_g_s _g_e_t_A_r_g_s() const │ │ │ │ │ +134 { │ │ │ │ │ +135 return *args_; │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +138 protected: │ │ │ │ │ +_1_3_9 const Matrix* _m_a_t_r_i_x__; │ │ │ │ │ +140 private: │ │ │ │ │ +141 const _S_m_o_o_t_h_e_r_A_r_g_s* args_; │ │ │ │ │ +142 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n comm_; │ │ │ │ │ +143 }; │ │ │ │ │ +144 │ │ │ │ │ +145 template │ │ │ │ │ +_1_4_6 struct _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ +147 : public _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ +148 {}; │ │ │ │ │ +149 │ │ │ │ │ +150 template │ │ │ │ │ +_1_5_1 class _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ +152 : public _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ +153 { │ │ │ │ │ +154 public: │ │ │ │ │ +_1_5_5 virtual _~_D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s() │ │ │ │ │ +156 {} │ │ │ │ │ +157 │ │ │ │ │ +_1_5_8 void _s_e_t_C_o_m_m(const C& comm) │ │ │ │ │ +159 { │ │ │ │ │ +160 comm_ = &comm; │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +_1_6_3 const C& _g_e_t_C_o_m_m() const │ │ │ │ │ +164 { │ │ │ │ │ +165 return *comm_; │ │ │ │ │ +166 } │ │ │ │ │ +167 private: │ │ │ │ │ +168 const C* comm_; │ │ │ │ │ +169 }; │ │ │ │ │ +170 │ │ │ │ │ +171 │ │ │ │ │ +172 template │ │ │ │ │ +_1_7_3 class _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s<_R_i_c_h_a_r_d_s_o_n> │ │ │ │ │ +174 { │ │ │ │ │ +175 typedef _R_i_c_h_a_r_d_s_o_n_<_X_,_Y_> _T; │ │ │ │ │ +176 │ │ │ │ │ +177 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_T_>_:_:_A_r_g_u_m_e_n_t_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +178 │ │ │ │ │ +179 public: │ │ │ │ │ +_1_8_0 virtual _~_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s() │ │ │ │ │ +181 {} │ │ │ │ │ +182 │ │ │ │ │ +183 template │ │ │ │ │ +_1_8_4 void _s_e_t_M_a_t_r_i_x(const Args&...) │ │ │ │ │ +185 {} │ │ │ │ │ +186 │ │ │ │ │ +_1_8_7 void _s_e_t_A_r_g_s(const _S_m_o_o_t_h_e_r_A_r_g_s& args) │ │ │ │ │ +188 { │ │ │ │ │ +189 args_=&args; │ │ │ │ │ +190 } │ │ │ │ │ +191 │ │ │ │ │ +192 template │ │ │ │ │ +_1_9_3 void _s_e_t_C_o_m_m([[maybe_unused]] T1& comm) │ │ │ │ │ +194 {} │ │ │ │ │ +195 │ │ │ │ │ +_1_9_6 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& _g_e_t_C_o_m_m() │ │ │ │ │ +197 { │ │ │ │ │ +198 return comm_; │ │ │ │ │ +199 } │ │ │ │ │ +200 │ │ │ │ │ +_2_0_1 const _S_m_o_o_t_h_e_r_A_r_g_s _g_e_t_A_r_g_s() const │ │ │ │ │ +202 { │ │ │ │ │ +203 return *args_; │ │ │ │ │ +204 } │ │ │ │ │ +205 │ │ │ │ │ +206 private: │ │ │ │ │ +207 const SmootherArgs* args_; │ │ │ │ │ +208 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n comm_; │ │ │ │ │ +209 }; │ │ │ │ │ +210 │ │ │ │ │ +211 │ │ │ │ │ +212 │ │ │ │ │ +213 template │ │ │ │ │ +214 struct ConstructionTraits; │ │ │ │ │ +215 │ │ │ │ │ +219 template │ │ │ │ │ +_2_2_0 struct ConstructionTraits<_S_e_q_S_S_O_R > │ │ │ │ │ +221 { │ │ │ │ │ +_2_2_2 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_S_S_O_R_<_M_,_X_,_Y_,_l_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +223 │ │ │ │ │ +_2_2_4 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +225 { │ │ │ │ │ +226 return std::make_shared> │ │ │ │ │ +227 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, args._g_e_t_A_r_g_s │ │ │ │ │ +()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ +228 } │ │ │ │ │ +229 }; │ │ │ │ │ +230 │ │ │ │ │ +231 │ │ │ │ │ +235 template │ │ │ │ │ +_2_3_6 struct ConstructionTraits<_S_e_q_S_O_R > │ │ │ │ │ +237 { │ │ │ │ │ +_2_3_8 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +239 │ │ │ │ │ +_2_4_0 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +241 { │ │ │ │ │ +242 return std::make_shared> │ │ │ │ │ +243 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, args._g_e_t_A_r_g_s │ │ │ │ │ +()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ +244 } │ │ │ │ │ +245 }; │ │ │ │ │ +246 │ │ │ │ │ +247 │ │ │ │ │ +251 template │ │ │ │ │ +_2_5_2 struct ConstructionTraits<_S_e_q_J_a_c > │ │ │ │ │ +253 { │ │ │ │ │ +_2_5_4 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_J_a_c_<_M_,_X_,_Y_,_l_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +255 │ │ │ │ │ +_2_5_6 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +257 { │ │ │ │ │ +258 return std::make_shared> │ │ │ │ │ +259 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, args._g_e_t_A_r_g_s │ │ │ │ │ +()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ +260 } │ │ │ │ │ +261 }; │ │ │ │ │ +262 │ │ │ │ │ +266 template │ │ │ │ │ +_2_6_7 struct ConstructionTraits<_R_i_c_h_a_r_d_s_o_n > │ │ │ │ │ +268 { │ │ │ │ │ +_2_6_9 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_R_i_c_h_a_r_d_s_o_n_<_X_,_Y_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +270 │ │ │ │ │ +_2_7_1 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +272 { │ │ │ │ │ +273 return std::make_shared> │ │ │ │ │ +274 (args._g_e_t_A_r_g_s()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ +275 } │ │ │ │ │ +276 }; │ │ │ │ │ +277 │ │ │ │ │ +278 │ │ │ │ │ +279 template │ │ │ │ │ +_2_8_0 class _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s<_S_e_q_I_L_U > │ │ │ │ │ +281 : public _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s > │ │ │ │ │ +282 { │ │ │ │ │ +283 public: │ │ │ │ │ +_2_8_4 _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s(int n=0) │ │ │ │ │ +285 : n_(n) │ │ │ │ │ +286 {} │ │ │ │ │ +287 │ │ │ │ │ +_2_8_8 void _s_e_t_N(int n) │ │ │ │ │ +289 { │ │ │ │ │ +290 n_ = n; │ │ │ │ │ +291 } │ │ │ │ │ +292 │ │ │ │ │ +_2_9_3 int _g_e_t_N() │ │ │ │ │ +294 { │ │ │ │ │ +295 return n_; │ │ │ │ │ +296 } │ │ │ │ │ +297 │ │ │ │ │ +298 private: │ │ │ │ │ +299 int n_; │ │ │ │ │ +300 }; │ │ │ │ │ +301 │ │ │ │ │ +302 │ │ │ │ │ +306 template │ │ │ │ │ +_3_0_7 struct ConstructionTraits<_S_e_q_I_L_U > │ │ │ │ │ +308 { │ │ │ │ │ +_3_0_9 typedef _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_I_L_U_<_M_,_X_,_Y_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +310 │ │ │ │ │ +_3_1_1 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +312 { │ │ │ │ │ +313 return std::make_shared> │ │ │ │ │ +314 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_N(), args._g_e_t_A_r_g_s()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ +315 } │ │ │ │ │ +316 }; │ │ │ │ │ +317 │ │ │ │ │ +321 template │ │ │ │ │ +_3_2_2 struct ConstructionTraits<_P_a_r_S_S_O_R > │ │ │ │ │ +323 { │ │ │ │ │ +_3_2_4 typedef _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_M_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +325 │ │ │ │ │ +_3_2_6 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +327 { │ │ │ │ │ +328 return std::make_shared> │ │ │ │ │ +329 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, │ │ │ │ │ +330 args._g_e_t_A_r_g_s()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r, args._g_e_t_C_o_m_m()); │ │ │ │ │ +331 } │ │ │ │ │ +332 }; │ │ │ │ │ +333 │ │ │ │ │ +334 template │ │ │ │ │ +_3_3_5 struct ConstructionTraits<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ +336 { │ │ │ │ │ +_3_3_7 typedef _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_T_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +_3_3_8 typedef ConstructionTraits _S_e_q_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s; │ │ │ │ │ +_3_3_9 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t │ │ │ │ │ +(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +340 { │ │ │ │ │ +341 auto seqPrec = SeqConstructionTraits::construct(args); │ │ │ │ │ +342 return std::make_shared> (seqPrec, │ │ │ │ │ +args._g_e_t_C_o_m_m()); │ │ │ │ │ +343 } │ │ │ │ │ +344 }; │ │ │ │ │ +345 │ │ │ │ │ +346 template │ │ │ │ │ +_3_4_7 struct ConstructionTraits<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ +348 { │ │ │ │ │ +_3_4_9 typedef _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_T_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +_3_5_0 typedef ConstructionTraits _S_e_q_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s; │ │ │ │ │ +_3_5_1 static inline std::shared_ptr> │ │ │ │ │ +_c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +352 { │ │ │ │ │ +353 auto seqPrec = SeqConstructionTraits::construct(args); │ │ │ │ │ +354 return std::make_shared> (seqPrec, │ │ │ │ │ +args._g_e_t_C_o_m_m()); │ │ │ │ │ +355 } │ │ │ │ │ +356 }; │ │ │ │ │ +357 │ │ │ │ │ +368 template │ │ │ │ │ +_3_6_9 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r │ │ │ │ │ +370 { │ │ │ │ │ +_3_7_1 typedef T _S_m_o_o_t_h_e_r; │ │ │ │ │ +_3_7_2 typedef typename Smoother::range_type _R_a_n_g_e; │ │ │ │ │ +_3_7_3 typedef typename Smoother::domain_type _D_o_m_a_i_n; │ │ │ │ │ +374 │ │ │ │ │ +_3_8_2 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +383 { │ │ │ │ │ +384 smoother.apply(v,d); │ │ │ │ │ +385 } │ │ │ │ │ +386 │ │ │ │ │ +_3_9_4 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +395 { │ │ │ │ │ +396 smoother.apply(v,d); │ │ │ │ │ +397 } │ │ │ │ │ +398 }; │ │ │ │ │ +399 │ │ │ │ │ +405 template │ │ │ │ │ +_4_0_6 void _p_r_e_s_m_o_o_t_h(LevelContext& levelContext, size_t steps) │ │ │ │ │ +407 { │ │ │ │ │ +408 for(std::size_t i=0; i < steps; ++i) { │ │ │ │ │ +409 *levelContext.lhs=0; │ │ │ │ │ +410 _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_t_y_p_e_n_a_m_e_ _L_e_v_e_l_C_o_n_t_e_x_t_:_:_S_m_o_o_t_h_e_r_T_y_p_e_> │ │ │ │ │ +411_ _:_:_p_r_e_S_m_o_o_t_h(*levelContext.smoother, *levelContext.lhs, │ │ │ │ │ +412 *levelContext.rhs); │ │ │ │ │ +413 // Accumulate update │ │ │ │ │ +414 *levelContext.update += *levelContext.lhs; │ │ │ │ │ +415 │ │ │ │ │ +416 // update defect │ │ │ │ │ +417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, │ │ │ │ │ +*levelContext.rhs); │ │ │ │ │ +418 levelContext.pinfo->project(*levelContext.rhs); │ │ │ │ │ +419 } │ │ │ │ │ +420 } │ │ │ │ │ +421 │ │ │ │ │ +427 template │ │ │ │ │ +_4_2_8 void _p_o_s_t_s_m_o_o_t_h(LevelContext& levelContext, size_t steps) │ │ │ │ │ +429 { │ │ │ │ │ +430 for(std::size_t i=0; i < steps; ++i) { │ │ │ │ │ +431 // update defect │ │ │ │ │ +432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, │ │ │ │ │ +433 *levelContext.rhs); │ │ │ │ │ +434 *levelContext.lhs=0; │ │ │ │ │ +435 levelContext.pinfo->project(*levelContext.rhs); │ │ │ │ │ +436 _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_t_y_p_e_n_a_m_e_ _L_e_v_e_l_C_o_n_t_e_x_t_:_:_S_m_o_o_t_h_e_r_T_y_p_e_> │ │ │ │ │ +437_ _:_:_p_o_s_t_S_m_o_o_t_h(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs); │ │ │ │ │ +438 // Accumulate update │ │ │ │ │ +439 *levelContext.update += *levelContext.lhs; │ │ │ │ │ +440 } │ │ │ │ │ +441 } │ │ │ │ │ +442 │ │ │ │ │ +443 template │ │ │ │ │ +_4_4_4 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_S_e_q_S_O_R > │ │ │ │ │ +445 { │ │ │ │ │ +_4_4_6 typedef _S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> _S_m_o_o_t_h_e_r; │ │ │ │ │ +_4_4_7 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ +_4_4_8 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ +449 │ │ │ │ │ +_4_5_0 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +451 { │ │ │ │ │ +452 smoother.template apply(v,d); │ │ │ │ │ +453 } │ │ │ │ │ +454 │ │ │ │ │ +455 │ │ │ │ │ +_4_5_6 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +457 { │ │ │ │ │ +458 smoother.template apply(v,d); │ │ │ │ │ +459 } │ │ │ │ │ +460 }; │ │ │ │ │ +461 │ │ │ │ │ +462 template │ │ │ │ │ +_4_6_3 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > > │ │ │ │ │ +464 { │ │ │ │ │ +_4_6_5 typedef _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_,_C_,_S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> > _S_m_o_o_t_h_e_r; │ │ │ │ │ +_4_6_6 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ +_4_6_7 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ +468 │ │ │ │ │ +_4_6_9 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +470 { │ │ │ │ │ +471 smoother.template apply(v,d); │ │ │ │ │ +472 } │ │ │ │ │ +473 │ │ │ │ │ +474 │ │ │ │ │ +_4_7_5 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +476 { │ │ │ │ │ +477 smoother.template apply(v,d); │ │ │ │ │ +478 } │ │ │ │ │ +479 }; │ │ │ │ │ +480 │ │ │ │ │ +481 template │ │ │ │ │ +_4_8_2 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +> > │ │ │ │ │ +483 { │ │ │ │ │ +_4_8_4 typedef _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_C_,_S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> > _S_m_o_o_t_h_e_r; │ │ │ │ │ +_4_8_5 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ +_4_8_6 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ +487 │ │ │ │ │ +_4_8_8 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +489 { │ │ │ │ │ +490 smoother.template apply(v,d); │ │ │ │ │ +491 } │ │ │ │ │ +492 │ │ │ │ │ +493 │ │ │ │ │ +_4_9_4 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +495 { │ │ │ │ │ +496 smoother.template apply(v,d); │ │ │ │ │ +497 } │ │ │ │ │ +498 }; │ │ │ │ │ +499 │ │ │ │ │ +500 } // end namespace Amg │ │ │ │ │ +501 │ │ │ │ │ +502 // forward declarations │ │ │ │ │ +503 template │ │ │ │ │ +504 class SeqOverlappingSchwarz; │ │ │ │ │ +505 │ │ │ │ │ +506 struct MultiplicativeSchwarzMode; │ │ │ │ │ +507 │ │ │ │ │ +508 namespace Amg │ │ │ │ │ +509 { │ │ │ │ │ +510 template │ │ │ │ │ +_5_1_1 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z > │ │ │ │ │ +513 { │ │ │ │ │ +_5_1_4 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_M_S_,_T_A_> │ │ │ │ │ +_S_m_o_o_t_h_e_r; │ │ │ │ │ +_5_1_5 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ +_5_1_6 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ +517 │ │ │ │ │ +_5_1_8 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +519 { │ │ │ │ │ +520 smoother.template apply(v,d); │ │ │ │ │ +521 } │ │ │ │ │ +522 │ │ │ │ │ +523 │ │ │ │ │ +_5_2_4 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +525 { │ │ │ │ │ +526 smoother.template apply(v,d); │ │ │ │ │ +527 │ │ │ │ │ +528 } │ │ │ │ │ +529 }; │ │ │ │ │ +530 │ │ │ │ │ +531 // template │ │ │ │ │ +532 // class SeqOverlappingSchwarz; │ │ │ │ │ +533 │ │ │ │ │ +534 template │ │ │ │ │ +_5_3_5 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +536 : public _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +537 { │ │ │ │ │ +_5_3_8 enum _O_v_e_r_l_a_p {_v_e_r_t_e_x, _a_g_g_r_e_g_a_t_e, _p_a_i_r_w_i_s_e, _n_o_n_e}; │ │ │ │ │ +539 │ │ │ │ │ +_5_4_0 _O_v_e_r_l_a_p _o_v_e_r_l_a_p; │ │ │ │ │ +_5_4_1 bool _o_n_t_h_e_f_l_y; │ │ │ │ │ +542 │ │ │ │ │ +_5_4_3 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s(_O_v_e_r_l_a_p overlap_=_v_e_r_t_e_x, │ │ │ │ │ +544 bool onthefly_=false) │ │ │ │ │ +545 : _o_v_e_r_l_a_p(overlap_), _o_n_t_h_e_f_l_y(onthefly_) │ │ │ │ │ +546 {} │ │ │ │ │ +547 }; │ │ │ │ │ +548 │ │ │ │ │ +549 template │ │ │ │ │ +_5_5_0 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z > │ │ │ │ │ +551 { │ │ │ │ │ +_5_5_2 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _M_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ +_A_r_g_u_m_e_n_t_s; │ │ │ │ │ +553 }; │ │ │ │ │ +554 │ │ │ │ │ +555 template │ │ │ │ │ +_5_5_6 class _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z > │ │ │ │ │ +557 : public _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s > │ │ │ │ │ +558 { │ │ │ │ │ +559 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_S_,_T_A_> > │ │ │ │ │ +_F_a_t_h_e_r; │ │ │ │ │ +560 │ │ │ │ │ +561 public: │ │ │ │ │ +_5_6_2 typedef typename _M_a_t_r_i_x_G_r_a_p_h_<_M_>_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +_5_6_3 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_> _A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ +_5_6_4 typedef typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +_5_6_5 typedef typename _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_S_,_T_A_>_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ +_V_e_c_t_o_r; │ │ │ │ │ +_5_6_6 typedef typename Vector::value_type _S_u_b_d_o_m_a_i_n; │ │ │ │ │ +567 │ │ │ │ │ +_5_6_8 virtual void _s_e_t_M_a_t_r_i_x(const M& matrix, const _A_g_g_r_e_g_a_t_e_s_M_a_p& amap) │ │ │ │ │ +569 { │ │ │ │ │ +570 Father::setMatrix(matrix); │ │ │ │ │ +571 │ │ │ │ │ +572 std::vector visited(amap._n_o_V_e_r_t_i_c_e_s(), false); │ │ │ │ │ +573 typedef IteratorPropertyMap::iterator,IdentityMap> │ │ │ │ │ +VisitedMapType; │ │ │ │ │ +574 VisitedMapType visitedMap(visited.begin()); │ │ │ │ │ +575 │ │ │ │ │ +576 _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_> graph(matrix); │ │ │ │ │ +577 │ │ │ │ │ +578 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _M_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ +_S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +579 │ │ │ │ │ +580 switch(Father::getArgs().overlap) { │ │ │ │ │ +581 case SmootherArgs::vertex : │ │ │ │ │ +582 { │ │ │ │ │ +583 VertexAdder visitor(subdomains, amap); │ │ │ │ │ +584 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ +585 } │ │ │ │ │ +586 break; │ │ │ │ │ +587 case SmootherArgs::pairwise : │ │ │ │ │ +588 { │ │ │ │ │ +589 createPairDomains(graph); │ │ │ │ │ +590 } │ │ │ │ │ +591 break; │ │ │ │ │ +592 case SmootherArgs::aggregate : │ │ │ │ │ +593 { │ │ │ │ │ +594 AggregateAdder visitor(subdomains, amap, graph, │ │ │ │ │ +visitedMap); │ │ │ │ │ +595 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ +596 } │ │ │ │ │ +597 break; │ │ │ │ │ +598 case SmootherArgs::none : │ │ │ │ │ +599 NoneAdder visitor; │ │ │ │ │ +600 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ +601 break; │ │ │ │ │ +602 default : │ │ │ │ │ +603 DUNE_THROW(NotImplemented, "This overlapping scheme is not supported!"); │ │ │ │ │ +604 } │ │ │ │ │ +605 } │ │ │ │ │ +_6_0_6 void _s_e_t_M_a_t_r_i_x(const M& matrix) │ │ │ │ │ +607 { │ │ │ │ │ +608 Father::setMatrix(matrix); │ │ │ │ │ +609 │ │ │ │ │ +610 /* Create aggregates map where each aggregate is just one vertex. */ │ │ │ │ │ +611 _A_g_g_r_e_g_a_t_e_s_M_a_p amap(matrix.N()); │ │ │ │ │ +612 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r v=0; │ │ │ │ │ +613 for(typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_i_t_e_r_a_t_o_r iter=amap._b_e_g_i_n(); │ │ │ │ │ +614 iter!=amap._e_n_d(); ++iter) │ │ │ │ │ +615 *iter=v++; │ │ │ │ │ +616 │ │ │ │ │ +617 std::vector visited(amap._n_o_V_e_r_t_i_c_e_s(), false); │ │ │ │ │ +618 typedef IteratorPropertyMap::iterator,IdentityMap> │ │ │ │ │ +VisitedMapType; │ │ │ │ │ +619 VisitedMapType visitedMap(visited.begin()); │ │ │ │ │ +620 │ │ │ │ │ +621 _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_> graph(matrix); │ │ │ │ │ +622 │ │ │ │ │ +623 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _M_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ +_S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +624 │ │ │ │ │ +625 switch(Father::getArgs().overlap) { │ │ │ │ │ +626 case SmootherArgs::vertex : │ │ │ │ │ +627 { │ │ │ │ │ +628 VertexAdder visitor(subdomains, amap); │ │ │ │ │ +629 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ +630 } │ │ │ │ │ +631 break; │ │ │ │ │ +632 case SmootherArgs::aggregate : │ │ │ │ │ +633 { │ │ │ │ │ +634 DUNE_THROW(NotImplemented, "Aggregate overlap is not supported yet"); │ │ │ │ │ +635 /* │ │ │ │ │ +636 AggregateAdder visitor(subdomains, amap, graph, │ │ │ │ │ +visitedMap); │ │ │ │ │ +637 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ +638 */ │ │ │ │ │ +639 } │ │ │ │ │ +640 break; │ │ │ │ │ +641 case SmootherArgs::pairwise : │ │ │ │ │ +642 { │ │ │ │ │ +643 createPairDomains(graph); │ │ │ │ │ +644 } │ │ │ │ │ +645 break; │ │ │ │ │ +646 case SmootherArgs::none : │ │ │ │ │ +647 NoneAdder visitor; │ │ │ │ │ +648 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ +649 │ │ │ │ │ +650 } │ │ │ │ │ +651 } │ │ │ │ │ +652 │ │ │ │ │ +_6_5_3 const _V_e_c_t_o_r& _g_e_t_S_u_b_D_o_m_a_i_n_s() │ │ │ │ │ +654 { │ │ │ │ │ +655 return subdomains; │ │ │ │ │ +656 } │ │ │ │ │ +657 │ │ │ │ │ +658 private: │ │ │ │ │ +659 struct VertexAdder │ │ │ │ │ +660 { │ │ │ │ │ +_6_6_1 _V_e_r_t_e_x_A_d_d_e_r(_V_e_c_t_o_r& subdomains_, const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates_) │ │ │ │ │ +662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_) │ │ │ │ │ +663 {} │ │ │ │ │ +664 template │ │ │ │ │ +_6_6_5 void _o_p_e_r_a_t_o_r_(_)(const T& edge) │ │ │ │ │ +666 { │ │ │ │ │ +667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) │ │ │ │ │ +668 subdomains[subdomain].insert(edge.target()); │ │ │ │ │ +669 } │ │ │ │ │ +_6_7_0 int _s_e_t_A_g_g_r_e_g_a_t_e(const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate_) │ │ │ │ │ +671 { │ │ │ │ │ +672 subdomain=aggregate_; │ │ │ │ │ +673 max = std::max(subdomain, aggregate_); │ │ │ │ │ +674 return subdomain; │ │ │ │ │ +675 } │ │ │ │ │ +_6_7_6 int _n_o_S_u_b_d_o_m_a_i_n_s() const │ │ │ │ │ +677 { │ │ │ │ │ +678 return max+1; │ │ │ │ │ +679 } │ │ │ │ │ +680 private: │ │ │ │ │ +681 _V_e_c_t_o_r& subdomains; │ │ │ │ │ +682 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r max; │ │ │ │ │ +683 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r subdomain; │ │ │ │ │ +684 const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates; │ │ │ │ │ +685 }; │ │ │ │ │ +686 struct NoneAdder │ │ │ │ │ +687 { │ │ │ │ │ +688 template │ │ │ │ │ +_6_8_9 void _o_p_e_r_a_t_o_r_(_)(const T& edge) │ │ │ │ │ +690 {} │ │ │ │ │ +_6_9_1 int _s_e_t_A_g_g_r_e_g_a_t_e(const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate_) │ │ │ │ │ +692 { │ │ │ │ │ +693 return -1; │ │ │ │ │ +694 } │ │ │ │ │ +_6_9_5 int _n_o_S_u_b_d_o_m_a_i_n_s() const │ │ │ │ │ +696 { │ │ │ │ │ +697 return -1; │ │ │ │ │ +698 } │ │ │ │ │ +699 }; │ │ │ │ │ +700 │ │ │ │ │ +701 template │ │ │ │ │ +702 struct AggregateAdder │ │ │ │ │ +703 { │ │ │ │ │ +_7_0_4 _A_g_g_r_e_g_a_t_e_A_d_d_e_r(_V_e_c_t_o_r& subdomains_, const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates_, │ │ │ │ │ +705 const _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>& graph_, VM& visitedMap_) │ │ │ │ │ +706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_), │ │ │ │ │ +707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_) │ │ │ │ │ +708 {} │ │ │ │ │ +709 template │ │ │ │ │ +_7_1_0 void _o_p_e_r_a_t_o_r_(_)(const T& edge) │ │ │ │ │ +711 { │ │ │ │ │ +712 subdomains[subdomain].insert(edge.target()); │ │ │ │ │ +713 // If we (the neighbouring vertex of the aggregate) │ │ │ │ │ +714 // are not isolated, add the aggregate we belong to │ │ │ │ │ +715 // to the same subdomain using the OneOverlapAdder │ │ │ │ │ +716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) { │ │ │ │ │ +717 assert(aggregates[edge.target()]!=aggregate); │ │ │ │ │ +718 typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x_L_i_s_t vlist; │ │ │ │ │ +719 aggregates.template breadthFirstSearch(edge.target(), │ │ │ │ │ +aggregate, │ │ │ │ │ +720 graph, vlist, adder, adder, │ │ │ │ │ +721 visitedMap); │ │ │ │ │ +722 } │ │ │ │ │ +723 } │ │ │ │ │ +724 │ │ │ │ │ +_7_2_5 int _s_e_t_A_g_g_r_e_g_a_t_e(const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate_) │ │ │ │ │ +726 { │ │ │ │ │ +727 adder.setAggregate(aggregate_); │ │ │ │ │ +728 aggregate=aggregate_; │ │ │ │ │ +729 return ++subdomain; │ │ │ │ │ +730 } │ │ │ │ │ +_7_3_1 int _n_o_S_u_b_d_o_m_a_i_n_s() const │ │ │ │ │ +732 { │ │ │ │ │ +733 return subdomain+1; │ │ │ │ │ +734 } │ │ │ │ │ +735 │ │ │ │ │ +736 private: │ │ │ │ │ +737 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r aggregate; │ │ │ │ │ +738 _V_e_c_t_o_r& subdomains; │ │ │ │ │ +739 int subdomain; │ │ │ │ │ +740 const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates; │ │ │ │ │ +741 VertexAdder adder; │ │ │ │ │ +742 const _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>& graph; │ │ │ │ │ +743 VM& visitedMap; │ │ │ │ │ +744 }; │ │ │ │ │ +745 │ │ │ │ │ +746 void createPairDomains(const _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>& graph) │ │ │ │ │ +747 { │ │ │ │ │ +748 typedef typename _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r VIter; │ │ │ │ │ +749 typedef typename _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r EIter; │ │ │ │ │ +750 typedef typename M::size_type size_type; │ │ │ │ │ +751 │ │ │ │ │ +752 std::set > pairs; │ │ │ │ │ +753 int total=0; │ │ │ │ │ +754 for(VIter v=graph._b_e_g_i_n(), ve=graph._e_n_d(); ve != v; ++v) │ │ │ │ │ +755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e) │ │ │ │ │ +756 { │ │ │ │ │ +757 ++total; │ │ │ │ │ +758 if(e.source() >::const_iterator │ │ │ │ │ +SIter; │ │ │ │ │ +768 typename Vector::iterator subdomain=subdomains.begin(); │ │ │ │ │ +769 │ │ │ │ │ +770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s) │ │ │ │ │ +771 { │ │ │ │ │ +772 subdomain->insert(s->first); │ │ │ │ │ +773 subdomain->insert(s->second); │ │ │ │ │ +774 ++subdomain; │ │ │ │ │ +775 } │ │ │ │ │ +776 std::size_t minsize=10000; │ │ │ │ │ +777 std::size_t maxsize=0; │ │ │ │ │ +778 int sum=0; │ │ │ │ │ +779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) { │ │ │ │ │ +780 sum+=subdomains[i].size(); │ │ │ │ │ +781 minsize=std::min(minsize, subdomains[i].size()); │ │ │ │ │ +782 maxsize=std::max(maxsize, subdomains[i].size()); │ │ │ │ │ +783 } │ │ │ │ │ +784 Dune::dinfo<<"Subdomain size: min="< │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: parameters.hh File Reference │ │ │ │ +dune-istl: aggregates.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,60 +72,110 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Enumerations
│ │ │ │ - │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Parameter classes for customizing AMG. │ │ │ │ +

Provides classes for the Coloring process of AMG. │ │ │ │ More...

│ │ │ │ -
#include <cstddef>
│ │ │ │ +
#include "parameters.hh"
│ │ │ │ +#include "graph.hh"
│ │ │ │ +#include "properties.hh"
│ │ │ │ +#include "combinedfunctor.hh"
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/common/poolallocator.hh>
│ │ │ │ +#include <dune/common/sllist.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <set>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <ostream>
│ │ │ │ +#include <tuple>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::DependencyParameters
 Parameters needed to check whether a node depends on another. More...
class  Dune::Amg::AggregationCriterion< T >
 Base class of all aggregation criterions. More...
 
class  Dune::Amg::AggregationParameters
 Parameters needed for the aggregation process. More...
class  Dune::Amg::SymmetricMatrixDependency< M, N >
 Dependency policy for symmetric matrices. More...
 
class  Dune::Amg::CoarseningParameters
 Parameters for the complete coarsening process. More...
class  Dune::Amg::Dependency< M, N >
 Dependency policy for symmetric matrices. More...
 
class  Dune::Amg::Parameters
 All parameters for AMG. More...
class  Dune::Amg::SymmetricDependency< M, N >
 Dependency policy for symmetric matrices. More...
 
class  Dune::Amg::Diagonal< N >
 Norm that uses only the [N][N] entry of the block to determine couplings. More...
 
class  Dune::Amg::FirstDiagonal
 Norm that uses only the [0][0] entry of the block to determine couplings. More...
 
struct  Dune::Amg::RowSum
 Functor using the row sum (infinity) norm to determine strong couplings. More...
 
struct  Dune::Amg::FrobeniusNorm
 
struct  Dune::Amg::AlwaysOneNorm
 
class  Dune::Amg::SymmetricCriterion< M, Norm >
 Criterion taking advantage of symmetric matrices. More...
 
class  Dune::Amg::UnSymmetricCriterion< M, Norm >
 Criterion suitable for unsymmetric matrices. More...
 
class  Dune::Amg::AggregatesMap< V >
 Class providing information about the mapping of the vertices onto aggregates. More...
 
class  Dune::Amg::AggregatesMap< V >::DummyEdgeVisitor
 A Dummy visitor that does nothing for each visited edge. More...
 
class  Dune::Amg::Aggregate< G, S >
 A class for temporarily storing the vertices of an aggregate in. More...
 
class  Dune::Amg::Aggregator< G >
 Class for building the aggregates. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Enumerations

enum  Dune::Amg::AccumulationMode { Dune::Amg::noAccu = 0 │ │ │ │ -, Dune::Amg::atOnceAccu =1 │ │ │ │ -, Dune::Amg::successiveAccu =2 │ │ │ │ - }
 Identifiers for the different accumulation modes. More...
 

│ │ │ │ +Functions

template<class T >
std::ostream & Dune::Amg::operator<< (std::ostream &os, const AggregationCriterion< T > &criterion)
 
template<class G , class C >
void Dune::Amg::buildDependency (G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
 Build the dependency of the matrix graph.
 
template<class V >
void Dune::Amg::printAggregates2d (const AggregatesMap< V > &aggregates, int n, int m, std::ostream &os)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Parameter classes for customizing AMG.

│ │ │ │ +

Provides classes for the Coloring process of AMG.

│ │ │ │
Author
Markus Blatt
│ │ │ │ -

All parameters of the AMG can be set by using the class Parameter, which can be provided to CoarsenCriterion via its constructor.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,45 +1,104 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s │ │ │ │ │ -parameters.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 │ │ │ │ │ +aggregates.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Parameter classes for customizing AMG. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +Provides classes for the Coloring process of AMG. _M_o_r_e_._._. │ │ │ │ │ +#include "_p_a_r_a_m_e_t_e_r_s_._h_h" │ │ │ │ │ +#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ +#include "_c_o_m_b_i_n_e_d_f_u_n_c_t_o_r_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#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_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -  _P_a_r_a_m_e_t_e_r_s needed to check whether a node depends on another. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_<_ _T_ _> │ │ │ │ │ +  Base class of all aggregation criterions. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -  _P_a_r_a_m_e_t_e_r_s needed for the aggregation process. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_ _M_,_ _N_ _> │ │ │ │ │ +  _D_e_p_e_n_d_e_n_c_y policy for symmetric matrices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -  _P_a_r_a_m_e_t_e_r_s for the complete coarsening process. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_<_ _M_,_ _N_ _> │ │ │ │ │ +  _D_e_p_e_n_d_e_n_c_y policy for symmetric matrices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -  All parameters for _A_M_G. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_ _M_,_ _N_ _> │ │ │ │ │ +  _D_e_p_e_n_d_e_n_c_y policy for symmetric matrices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_<_ _N_ _> │ │ │ │ │ +  Norm that uses only the [N][N] entry of the block to determine │ │ │ │ │ + couplings. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_F_i_r_s_t_D_i_a_g_o_n_a_l │ │ │ │ │ +  Norm that uses only the [0][0] entry of the block to determine │ │ │ │ │ + couplings. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m │ │ │ │ │ +  Functor using the row sum (infinity) norm to determine strong │ │ │ │ │ + couplings. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_ _M_,_ _N_o_r_m_ _> │ │ │ │ │ +  Criterion taking advantage of symmetric matrices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_ _M_,_ _N_o_r_m_ _> │ │ │ │ │ +  Criterion suitable for unsymmetric matrices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _V_ _> │ │ │ │ │ +  Class providing information about the mapping of the vertices onto │ │ │ │ │ + aggregates. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _V_ _>_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ +  A Dummy visitor that does nothing for each visited edge. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_<_ _G_,_ _S_ _> │ │ │ │ │ +  A class for temporarily storing the vertices of an aggregate in. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_<_ _G_ _> │ │ │ │ │ +  Class for building the aggregates. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -EEnnuummeerraattiioonnss │ │ │ │ │ -enum   _D_u_n_e_:_:_A_m_g_:_:_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e { _D_u_n_e_:_:_A_m_g_:_:_n_o_A_c_c_u = 0 , _D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ - _a_t_O_n_c_e_A_c_c_u =1 , _D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u =2 } │ │ │ │ │ -  Identifiers for the different accumulation modes. _M_o_r_e_._._. │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const │ │ │ │ │ + _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n< T > &criterion) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_A_m_g_:_:_b_u_i_l_d_D_e_p_e_n_d_e_n_c_y (G &graph, const typename C::Matrix │ │ │ │ │ + &matrix, C criterion, bool finestLevel) │ │ │ │ │ +  Build the dependency of the matrix graph. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_A_m_g_:_:_p_r_i_n_t_A_g_g_r_e_g_a_t_e_s_2_d (const _A_g_g_r_e_g_a_t_e_s_M_a_p< V > │ │ │ │ │ + &aggregates, int n, int m, std::ostream &os) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Parameter classes for customizing AMG. │ │ │ │ │ +Provides classes for the Coloring process of AMG. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ -All parameters of the AMG can be set by using the class Parameter, which can be │ │ │ │ │ -provided to CoarsenCriterion via its constructor. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: parameters.hh Source File │ │ │ │ +dune-istl: aggregates.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,390 +74,2254 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
parameters.hh
│ │ │ │ +
aggregates.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_PARAMETERS_HH
│ │ │ │ -
6#define DUNE_AMG_PARAMETERS_HH
│ │ │ │ +
5#ifndef DUNE_AMG_AGGREGATES_HH
│ │ │ │ +
6#define DUNE_AMG_AGGREGATES_HH
│ │ │ │
7
│ │ │ │ -
8#include <cstddef>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune
│ │ │ │ -
11{
│ │ │ │ -
12 namespace Amg
│ │ │ │ -
13 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
31 {
│ │ │ │ -
32 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
35 : alpha_(1.0/3.0), beta_(1.0E-5)
│ │ │ │ -
36 {}
│ │ │ │ -
│ │ │ │ -
37
│ │ │ │ -
│ │ │ │ -
42 void setBeta(double b)
│ │ │ │ -
43 {
│ │ │ │ -
44 beta_ = b;
│ │ │ │ -
45 }
│ │ │ │ -
│ │ │ │ -
46
│ │ │ │ -
│ │ │ │ -
52 double beta() const
│ │ │ │ -
53 {
│ │ │ │ -
54 return beta_;
│ │ │ │ -
55 }
│ │ │ │ -
│ │ │ │ +
8
│ │ │ │ +
9#include "parameters.hh"
│ │ │ │ +
10#include "graph.hh"
│ │ │ │ +
11#include "properties.hh"
│ │ │ │ +
12#include "combinedfunctor.hh"
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/timer.hh>
│ │ │ │ +
15#include <dune/common/stdstreams.hh>
│ │ │ │ +
16#include <dune/common/poolallocator.hh>
│ │ │ │ +
17#include <dune/common/sllist.hh>
│ │ │ │ +
18#include <dune/common/ftraits.hh>
│ │ │ │ +
19#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
20
│ │ │ │ +
21#include <utility>
│ │ │ │ +
22#include <set>
│ │ │ │ +
23#include <algorithm>
│ │ │ │ +
24#include <complex>
│ │ │ │ +
25#include <limits>
│ │ │ │ +
26#include <ostream>
│ │ │ │ +
27#include <tuple>
│ │ │ │ +
28
│ │ │ │ +
29namespace Dune
│ │ │ │ +
30{
│ │ │ │ +
31 namespace Amg
│ │ │ │ +
32 {
│ │ │ │ +
33
│ │ │ │ +
47 template<class T>
│ │ │ │ +
│ │ │ │ +
48 class AggregationCriterion : public T
│ │ │ │ +
49 {
│ │ │ │ +
50
│ │ │ │ +
51 public:
│ │ │ │ + │ │ │ │
56
│ │ │ │ -
│ │ │ │ -
61 void setAlpha(double a)
│ │ │ │ -
62 {
│ │ │ │ -
63 alpha_ = a;
│ │ │ │ -
64 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
67 : T()
│ │ │ │ +
68 {}
│ │ │ │
│ │ │ │ -
65
│ │ │ │ +
69
│ │ │ │
│ │ │ │ -
70 double alpha() const
│ │ │ │ -
71 {
│ │ │ │ -
72 return alpha_;
│ │ │ │ -
73 }
│ │ │ │ -
│ │ │ │ -
74
│ │ │ │ -
75 private:
│ │ │ │ -
76 double alpha_, beta_;
│ │ │ │ -
77 };
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
84 {
│ │ │ │ -
85 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
96 : maxDistance_(2), minAggregateSize_(4), maxAggregateSize_(6),
│ │ │ │ -
97 connectivity_(15), skipiso_(false)
│ │ │ │ -
98 {}
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
109 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
│ │ │ │ -
110 {
│ │ │ │ -
111 maxDistance_=diameter-1;
│ │ │ │ -
112 std::size_t csize=1;
│ │ │ │ -
113
│ │ │ │ -
114 for(; dim>0; dim--) {
│ │ │ │ -
115 csize*=diameter;
│ │ │ │ -
116 maxDistance_+=diameter-1;
│ │ │ │ -
117 }
│ │ │ │ -
118 minAggregateSize_=csize;
│ │ │ │ -
119 maxAggregateSize_=static_cast<std::size_t>(csize*1.5);
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ -
132 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
│ │ │ │ -
133 {
│ │ │ │ -
134 setDefaultValuesIsotropic(dim, diameter);
│ │ │ │ -
135 maxDistance_+=dim-1;
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
144 std::size_t maxDistance() const { return maxDistance_;}
│ │ │ │ + │ │ │ │ +
71 : T(parms)
│ │ │ │ +
72 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
82 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
│ │ │ │ +
83 {
│ │ │ │ +
84 this->setMaxDistance(diameter-1);
│ │ │ │ +
85 std::size_t csize=1;
│ │ │ │ +
86
│ │ │ │ +
87 for(; dim>0; dim--) {
│ │ │ │ +
88 csize*=diameter;
│ │ │ │ +
89 this->setMaxDistance(this->maxDistance()+diameter-1);
│ │ │ │ +
90 }
│ │ │ │ +
91 this->setMinAggregateSize(csize);
│ │ │ │ +
92 this->setMaxAggregateSize(static_cast<std::size_t>(csize*1.5));
│ │ │ │ +
93 }
│ │ │ │ +
│ │ │ │ +
94
│ │ │ │ +
│ │ │ │ +
105 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
│ │ │ │ +
106 {
│ │ │ │ +
107 setDefaultValuesIsotropic(dim, diameter);
│ │ │ │ +
108 this->setMaxDistance(this->maxDistance()+dim-1);
│ │ │ │ +
109 }
│ │ │ │ +
│ │ │ │ +
110 };
│ │ │ │ +
│ │ │ │ +
111
│ │ │ │ +
112 template<class T>
│ │ │ │ +
│ │ │ │ +
113 std::ostream& operator<<(std::ostream& os, const AggregationCriterion<T>& criterion)
│ │ │ │ +
114 {
│ │ │ │ +
115 os<<"{ maxdistance="<<criterion.maxDistance()<<" minAggregateSize="
│ │ │ │ +
116 <<criterion.minAggregateSize()<< " maxAggregateSize="<<criterion.maxAggregateSize()
│ │ │ │ +
117 <<" connectivity="<<criterion.maxConnectivity()<<" debugLevel="<<criterion.debugLevel()<<"}";
│ │ │ │ +
118 return os;
│ │ │ │ +
119 }
│ │ │ │ +
│ │ │ │ +
120
│ │ │ │ +
132 template<class M, class N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
134 {
│ │ │ │ +
135 public:
│ │ │ │ +
139 typedef M Matrix;
│ │ │ │ +
140
│ │ │ │ +
144 typedef N Norm;
│ │ │ │
145
│ │ │ │ -
154 void setMaxDistance(std::size_t distance) { maxDistance_ = distance;}
│ │ │ │ +
149 typedef typename Matrix::row_type Row;
│ │ │ │ +
150
│ │ │ │ + │ │ │ │
155
│ │ │ │ -
│ │ │ │ -
161 bool skipIsolated() const
│ │ │ │ -
162 {
│ │ │ │ -
163 return skipiso_;
│ │ │ │ -
164 }
│ │ │ │ +
156 void init(const Matrix* matrix);
│ │ │ │ +
157
│ │ │ │ +
158 void initRow(const Row& row, int index);
│ │ │ │ +
159
│ │ │ │ +
160 void examine(const ColIter& col);
│ │ │ │ +
161
│ │ │ │ +
162 template<class G>
│ │ │ │ +
163 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
│ │ │ │ +
164
│ │ │ │ +
165 bool isIsolated();
│ │ │ │ +
166
│ │ │ │ +
167
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
169 : Parameters(parms)
│ │ │ │ +
170 {}
│ │ │ │
│ │ │ │ -
165
│ │ │ │
│ │ │ │ -
171 void setSkipIsolated(bool skip)
│ │ │ │ -
172 {
│ │ │ │ -
173 skipiso_=skip;
│ │ │ │ -
174 }
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
180 std::size_t minAggregateSize() const { return minAggregateSize_;}
│ │ │ │ -
181
│ │ │ │ -
188 void setMinAggregateSize(std::size_t size){ minAggregateSize_=size;}
│ │ │ │ -
189
│ │ │ │ -
194 std::size_t maxAggregateSize() const { return maxAggregateSize_;}
│ │ │ │ -
195
│ │ │ │ -
202 void setMaxAggregateSize(std::size_t size){ maxAggregateSize_ = size;}
│ │ │ │ -
203
│ │ │ │ -
211 std::size_t maxConnectivity() const { return connectivity_;}
│ │ │ │ + │ │ │ │ +
172 : Parameters()
│ │ │ │ +
173 {}
│ │ │ │ +
│ │ │ │ +
174
│ │ │ │ +
175 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
180 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
185 int row_;
│ │ │ │ + │ │ │ │ +
188 std::vector<real_type> vals_;
│ │ │ │ +
189 typename std::vector<real_type>::iterator valIter_;
│ │ │ │ +
190
│ │ │ │ +
191 };
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
193
│ │ │ │ +
194 template<class M, class N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
196 {
│ │ │ │ +
197 matrix_ = matrix;
│ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │ +
199
│ │ │ │ +
200 template<class M, class N>
│ │ │ │ +
│ │ │ │ +
201 inline void SymmetricMatrixDependency<M,N>::initRow(const Row& row, int index)
│ │ │ │ +
202 {
│ │ │ │ +
203 using std::min;
│ │ │ │ +
204 vals_.assign(row.size(), 0.0);
│ │ │ │ +
205 assert(vals_.size()==row.size());
│ │ │ │ +
206 valIter_=vals_.begin();
│ │ │ │ +
207
│ │ │ │ +
208 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
│ │ │ │ +
209 diagonal_=norm_(row[index]);
│ │ │ │ +
210 row_ = index;
│ │ │ │ +
211 }
│ │ │ │ +
│ │ │ │
212
│ │ │ │ -
220 void setMaxConnectivity(std::size_t connectivity){ connectivity_ = connectivity;}
│ │ │ │ -
221
│ │ │ │ -
222 private:
│ │ │ │ -
223 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_, connectivity_;
│ │ │ │ -
224 bool skipiso_;
│ │ │ │ -
225
│ │ │ │ -
226 };
│ │ │ │ +
213 template<class M, class N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
215 {
│ │ │ │ +
216 using std::max;
│ │ │ │ +
217 // skip positive offdiagonals if norm preserves sign of them.
│ │ │ │ +
218 real_type eij = norm_(*col);
│ │ │ │ +
219 if(!N::is_sign_preserving || eij<0) // || eji<0)
│ │ │ │ +
220 {
│ │ │ │ +
221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](col.index())[col.index()]);
│ │ │ │ +
222 maxValue_ = max(maxValue_, *valIter_);
│ │ │ │ +
223 }else
│ │ │ │ +
224 *valIter_ =0;
│ │ │ │ +
225 ++valIter_;
│ │ │ │ +
226 }
│ │ │ │
│ │ │ │
227
│ │ │ │ -
228
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
249 };
│ │ │ │ -
│ │ │ │ -
250
│ │ │ │ -
251
│ │ │ │ -
252
│ │ │ │ -
253
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
258 {
│ │ │ │ -
259 public:
│ │ │ │ -
│ │ │ │ -
263 void setMaxLevel(int l)
│ │ │ │ -
264 {
│ │ │ │ -
265 maxLevel_ = l;
│ │ │ │ -
266 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
270 int maxLevel() const
│ │ │ │ -
271 {
│ │ │ │ -
272 return maxLevel_;
│ │ │ │ -
273 }
│ │ │ │ -
│ │ │ │ +
228 template<class M, class N>
│ │ │ │ +
229 template<class G>
│ │ │ │ +
│ │ │ │ +
230 inline void SymmetricMatrixDependency<M,N>::examine(G&, const typename G::EdgeIterator& edge, const ColIter&)
│ │ │ │ +
231 {
│ │ │ │ +
232 if(*valIter_ > alpha() * maxValue_) {
│ │ │ │ +
233 edge.properties().setDepends();
│ │ │ │ +
234 edge.properties().setInfluences();
│ │ │ │ +
235 }
│ │ │ │ +
236 ++valIter_;
│ │ │ │ +
237 }
│ │ │ │ +
│ │ │ │ +
238
│ │ │ │ +
239 template<class M, class N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
241 {
│ │ │ │ +
242 if(diagonal_==0)
│ │ │ │ +
243 DUNE_THROW(Dune::ISTLError, "No diagonal entry for row "<<row_<<".");
│ │ │ │ +
244 valIter_=vals_.begin();
│ │ │ │ +
245 return maxValue_ < beta();
│ │ │ │ +
246 }
│ │ │ │ +
│ │ │ │ +
247
│ │ │ │ +
251 template<class M, class N>
│ │ │ │ +
│ │ │ │ +
252 class Dependency : public Parameters
│ │ │ │ +
253 {
│ │ │ │ +
254 public:
│ │ │ │ +
258 typedef M Matrix;
│ │ │ │ +
259
│ │ │ │ +
263 typedef N Norm;
│ │ │ │ +
264
│ │ │ │ +
268 typedef typename Matrix::row_type Row;
│ │ │ │ +
269
│ │ │ │ + │ │ │ │
274
│ │ │ │ -
│ │ │ │ -
278 void setCoarsenTarget(int nodes)
│ │ │ │ -
279 {
│ │ │ │ -
280 coarsenTarget_ = nodes;
│ │ │ │ -
281 }
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ +
275 void init(const Matrix* matrix);
│ │ │ │ +
276
│ │ │ │ +
277 void initRow(const Row& row, int index);
│ │ │ │ +
278
│ │ │ │ +
279 void examine(const ColIter& col);
│ │ │ │ +
280
│ │ │ │ +
281 template<class G>
│ │ │ │ +
282 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
│ │ │ │ +
283
│ │ │ │ + │ │ │ │ +
285
│ │ │ │
│ │ │ │ -
286 int coarsenTarget() const
│ │ │ │ -
287 {
│ │ │ │ -
288 return coarsenTarget_;
│ │ │ │ -
289 }
│ │ │ │ -
│ │ │ │ -
290
│ │ │ │ -
│ │ │ │ -
296 void setMinCoarsenRate(double rate)
│ │ │ │ -
297 {
│ │ │ │ -
298 minCoarsenRate_ = rate;
│ │ │ │ -
299 }
│ │ │ │ -
│ │ │ │ -
300
│ │ │ │ -
│ │ │ │ -
304 double minCoarsenRate() const
│ │ │ │ -
305 {
│ │ │ │ -
306 return minCoarsenRate_;
│ │ │ │ -
307 }
│ │ │ │ +
286 Dependency(const Parameters& parms)
│ │ │ │ +
287 : Parameters(parms)
│ │ │ │ +
288 {}
│ │ │ │ +
│ │ │ │ +
289
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
291 : Parameters()
│ │ │ │ +
292 {}
│ │ │ │ +
│ │ │ │ +
293
│ │ │ │ +
294 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
299 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
304 int row_;
│ │ │ │ + │ │ │ │ +
307 };
│ │ │ │
│ │ │ │
308
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
313 {
│ │ │ │ -
314 return accumulate_;
│ │ │ │ -
315 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
320 {
│ │ │ │ -
321 accumulate_=accu;
│ │ │ │ -
322 }
│ │ │ │ -
│ │ │ │ -
323
│ │ │ │ -
│ │ │ │ -
324 void setAccumulate(bool accu){
│ │ │ │ -
325 accumulate_=accu ? successiveAccu : noAccu;
│ │ │ │ -
326 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
333 {
│ │ │ │ -
334 dampingFactor_ = d;
│ │ │ │ -
335 }
│ │ │ │ -
│ │ │ │ -
336
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
343 {
│ │ │ │ -
344 return dampingFactor_;
│ │ │ │ -
345 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
357 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
│ │ │ │ -
358 : maxLevel_(maxLevel), coarsenTarget_(coarsenTarget), minCoarsenRate_(minCoarsenRate),
│ │ │ │ -
359 dampingFactor_(prolongDamp), accumulate_( accumulate)
│ │ │ │ -
360 {}
│ │ │ │ -
│ │ │ │ -
361
│ │ │ │ -
362 private:
│ │ │ │ -
366 int maxLevel_;
│ │ │ │ -
370 int coarsenTarget_;
│ │ │ │ -
374 double minCoarsenRate_;
│ │ │ │ -
378 double dampingFactor_;
│ │ │ │ -
383 AccumulationMode accumulate_;
│ │ │ │ -
384 };
│ │ │ │ -
│ │ │ │ -
385
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
393 {
│ │ │ │ -
394 public:
│ │ │ │ -
│ │ │ │ -
401 void setDebugLevel(int level)
│ │ │ │ -
402 {
│ │ │ │ -
403 debugLevel_ = level;
│ │ │ │ -
404 }
│ │ │ │ -
│ │ │ │ -
405
│ │ │ │ -
│ │ │ │ -
411 int debugLevel() const
│ │ │ │ -
412 {
│ │ │ │ -
413 return debugLevel_;
│ │ │ │ +
312 template<class M, class N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
314 {
│ │ │ │ +
315 public:
│ │ │ │ +
319 typedef M Matrix;
│ │ │ │ +
320
│ │ │ │ +
324 typedef N Norm;
│ │ │ │ +
325
│ │ │ │ +
329 typedef typename Matrix::row_type Row;
│ │ │ │ +
330
│ │ │ │ + │ │ │ │ +
335
│ │ │ │ +
336 void init(const Matrix* matrix);
│ │ │ │ +
337
│ │ │ │ +
338 void initRow(const Row& row, int index);
│ │ │ │ +
339
│ │ │ │ +
340 void examine(const ColIter& col);
│ │ │ │ +
341
│ │ │ │ +
342 template<class G>
│ │ │ │ +
343 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
│ │ │ │ +
344
│ │ │ │ + │ │ │ │ +
346
│ │ │ │ +
347
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
349 : Parameters(parms)
│ │ │ │ +
350 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
352 : Parameters()
│ │ │ │ +
353 {}
│ │ │ │ +
│ │ │ │ +
354
│ │ │ │ +
355 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
360 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
365 int row_;
│ │ │ │ + │ │ │ │ +
368 private:
│ │ │ │ +
369 void initRow(const Row& row, int index, const std::true_type&);
│ │ │ │ +
370 void initRow(const Row& row, int index, const std::false_type&);
│ │ │ │ +
371 };
│ │ │ │ +
│ │ │ │ +
372
│ │ │ │ +
377 template<int N>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
379 {
│ │ │ │ +
380 public:
│ │ │ │ +
381 enum { /* @brief We preserve the sign.*/
│ │ │ │ +
382 is_sign_preserving = true
│ │ │ │ +
383 };
│ │ │ │ +
384
│ │ │ │ +
389 template<class M>
│ │ │ │ +
│ │ │ │ +
390 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m,
│ │ │ │ +
391 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr) const
│ │ │ │ +
392 {
│ │ │ │ +
393 typedef typename M::field_type field_type;
│ │ │ │ +
394 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ +
395 static_assert( std::is_convertible<field_type, real_type >::value,
│ │ │ │ +
396 "use of diagonal norm in AMG not implemented for complex field_type");
│ │ │ │ +
397 return m[N][N];
│ │ │ │ +
398 // possible implementation for complex types: return signed_abs(m[N][N]);
│ │ │ │ +
399 }
│ │ │ │ +
│ │ │ │ +
400
│ │ │ │ +
405 template<class M>
│ │ │ │ +
│ │ │ │ +
406 auto operator()(const M& m,
│ │ │ │ +
407 typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr) const
│ │ │ │ +
408 {
│ │ │ │ +
409 typedef typename FieldTraits<M>::real_type real_type;
│ │ │ │ +
410 static_assert( std::is_convertible<M, real_type >::value,
│ │ │ │ +
411 "use of diagonal norm in AMG not implemented for complex field_type");
│ │ │ │ +
412 return m;
│ │ │ │ +
413 // possible implementation for complex types: return signed_abs(m[N][N]);
│ │ │ │
414 }
│ │ │ │
│ │ │ │
415
│ │ │ │ -
│ │ │ │ -
420 void setNoPreSmoothSteps(std::size_t steps)
│ │ │ │ +
416 private:
│ │ │ │ +
417
│ │ │ │ +
419 template<typename T>
│ │ │ │ +
420 static T signed_abs(const T & v)
│ │ │ │
421 {
│ │ │ │ -
422 preSmoothSteps_=steps;
│ │ │ │ +
422 return v;
│ │ │ │
423 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
428 std::size_t getNoPreSmoothSteps() const
│ │ │ │ -
429 {
│ │ │ │ -
430 return preSmoothSteps_;
│ │ │ │ -
431 }
│ │ │ │ -
│ │ │ │ -
432
│ │ │ │ -
│ │ │ │ -
437 void setNoPostSmoothSteps(std::size_t steps)
│ │ │ │ -
438 {
│ │ │ │ -
439 postSmoothSteps_=steps;
│ │ │ │ -
440 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
445 std::size_t getNoPostSmoothSteps() const
│ │ │ │ -
446 {
│ │ │ │ -
447 return postSmoothSteps_;
│ │ │ │ -
448 }
│ │ │ │ +
424
│ │ │ │ +
426 template<typename T>
│ │ │ │ +
427 static T signed_abs(const std::complex<T> & v)
│ │ │ │ +
428 {
│ │ │ │ +
429 // return sign * abs_value
│ │ │ │ +
430 // in case of complex numbers this extends to using the csgn function to determine the sign
│ │ │ │ +
431 return csgn(v) * std::abs(v);
│ │ │ │ +
432 }
│ │ │ │ +
433
│ │ │ │ +
435 template<typename T>
│ │ │ │ +
436 static T csgn(const T & v)
│ │ │ │ +
437 {
│ │ │ │ +
438 return (T(0) < v) - (v < T(0));
│ │ │ │ +
439 }
│ │ │ │ +
440
│ │ │ │ +
442 template<typename T>
│ │ │ │ +
443 static T csgn(std::complex<T> a)
│ │ │ │ +
444 {
│ │ │ │ +
445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag());
│ │ │ │ +
446 }
│ │ │ │ +
447
│ │ │ │ +
448 };
│ │ │ │
│ │ │ │
449
│ │ │ │ -
│ │ │ │ -
453 void setGamma(std::size_t gamma)
│ │ │ │ -
454 {
│ │ │ │ -
455 gamma_=gamma;
│ │ │ │ -
456 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
460 std::size_t getGamma() const
│ │ │ │ -
461 {
│ │ │ │ -
462 return gamma_;
│ │ │ │ -
463 }
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
454 class FirstDiagonal : public Diagonal<0>
│ │ │ │ +
455 {};
│ │ │ │ +
│ │ │ │ +
456
│ │ │ │ +
│ │ │ │ +
462 struct RowSum
│ │ │ │ +
463 {
│ │ │ │
464
│ │ │ │ -
│ │ │ │ -
469 void setAdditive(bool additive)
│ │ │ │ -
470 {
│ │ │ │ -
471 additive_=additive;
│ │ │ │ -
472 }
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
│ │ │ │ -
478 bool getAdditive() const
│ │ │ │ -
479 {
│ │ │ │ -
480 return additive_;
│ │ │ │ -
481 }
│ │ │ │ -
│ │ │ │ -
482
│ │ │ │ -
│ │ │ │ -
493 Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
│ │ │ │ -
494 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
│ │ │ │ - │ │ │ │ -
496 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1),
│ │ │ │ -
497 additive_(false)
│ │ │ │ -
498 {}
│ │ │ │ -
│ │ │ │ -
499 private:
│ │ │ │ -
500 int debugLevel_;
│ │ │ │ -
501 std::size_t preSmoothSteps_;
│ │ │ │ -
502 std::size_t postSmoothSteps_;
│ │ │ │ -
503 std::size_t gamma_;
│ │ │ │ -
504 bool additive_;
│ │ │ │ -
505 };
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
507 } //namespace AMG
│ │ │ │ -
508
│ │ │ │ -
509} //namespace Dune
│ │ │ │ -
510#endif
│ │ │ │ -
void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an anisotropic problem.
Definition parameters.hh:132
│ │ │ │ -
void setAdditive(bool additive)
Set whether to use additive multigrid.
Definition parameters.hh:469
│ │ │ │ -
void setSkipIsolated(bool skip)
Set whether isolated aggregates will not be represented on the coarse level.
Definition parameters.hh:171
│ │ │ │ -
void setProlongationDampingFactor(double d)
Set the damping factor for the prolongation.
Definition parameters.hh:332
│ │ │ │ -
double alpha() const
Get the scaling value for marking connections as strong. Default value is 1/3.
Definition parameters.hh:70
│ │ │ │ -
void setMaxAggregateSize(std::size_t size)
Set the maximum number of nodes a aggregate is allowed to have.
Definition parameters.hh:202
│ │ │ │ -
void setMinCoarsenRate(double rate)
Set the minimum coarsening rate to be achieved in each coarsening.
Definition parameters.hh:296
│ │ │ │ -
double minCoarsenRate() const
Get the minimum coarsening rate to be achieved.
Definition parameters.hh:304
│ │ │ │ -
std::size_t maxAggregateSize() const
Get the maximum number of nodes a aggregate is allowed to have.
Definition parameters.hh:194
│ │ │ │ -
void setAlpha(double a)
Set the scaling value for marking connections as strong. Default value is 1/3.
Definition parameters.hh:61
│ │ │ │ -
double beta() const
Get the threshold for marking nodes as isolated. The default value is 1.0E-5.
Definition parameters.hh:52
│ │ │ │ -
std::size_t maxConnectivity() const
Get the maximum number of connections a aggregate is allowed to have.
Definition parameters.hh:211
│ │ │ │ -
int coarsenTarget() const
Get the maximum number of unknowns allowed on the coarsest level.
Definition parameters.hh:286
│ │ │ │ -
void setAccumulate(AccumulationMode accu)
Set whether he data should be accumulated on fewer processes on coarser levels.
Definition parameters.hh:319
│ │ │ │ -
double getProlongationDampingFactor() const
Get the damping factor for the prolongation.
Definition parameters.hh:342
│ │ │ │ -
AccumulationMode accumulate() const
Whether the data should be accumulated on fewer processes on coarser levels.
Definition parameters.hh:312
│ │ │ │ -
void setMaxConnectivity(std::size_t connectivity)
Set the maximum number of connections a aggregate is allowed to have.
Definition parameters.hh:220
│ │ │ │ -
std::size_t minAggregateSize() const
Get the minimum number of nodes a aggregate has to consist of.
Definition parameters.hh:180
│ │ │ │ -
bool getAdditive() const
Get whether to use additive multigrid.
Definition parameters.hh:478
│ │ │ │ -
void setMaxLevel(int l)
Set the maximum number of levels allowed in the hierarchy.
Definition parameters.hh:263
│ │ │ │ -
void setDebugLevel(int level)
Set the debugging level.
Definition parameters.hh:401
│ │ │ │ -
std::size_t getGamma() const
Get the value of gamma; 1 for V-cycle, 2 for W-cycle.
Definition parameters.hh:460
│ │ │ │ -
void setNoPostSmoothSteps(std::size_t steps)
Set the number of postsmoothing steps to apply.
Definition parameters.hh:437
│ │ │ │ -
std::size_t getNoPreSmoothSteps() const
Get the number of presmoothing steps to apply.
Definition parameters.hh:428
│ │ │ │ -
DependencyParameters()
Constructor.
Definition parameters.hh:34
│ │ │ │ -
void setMinAggregateSize(std::size_t size)
Set the minimum number of nodes a aggregate has to consist of.
Definition parameters.hh:188
│ │ │ │ -
int maxLevel() const
Get the maximum number of levels allowed in the hierarchy.
Definition parameters.hh:270
│ │ │ │ -
void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an isotropic problem.
Definition parameters.hh:109
│ │ │ │ -
AggregationParameters()
Constructor.
Definition parameters.hh:95
│ │ │ │ -
bool skipIsolated() const
Whether isolated aggregates will not be represented on the coarse level.
Definition parameters.hh:161
│ │ │ │ -
Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition parameters.hh:493
│ │ │ │ -
void setCoarsenTarget(int nodes)
Set the maximum number of unknowns allowed on the coarsest level.
Definition parameters.hh:278
│ │ │ │ -
void setNoPreSmoothSteps(std::size_t steps)
Set the number of presmoothing steps to apply.
Definition parameters.hh:420
│ │ │ │ -
AccumulationMode
Identifiers for the different accumulation modes.
Definition parameters.hh:232
│ │ │ │ -
void setBeta(double b)
Set threshold for marking nodes as isolated. The default value is 1.0E-5.
Definition parameters.hh:42
│ │ │ │ -
std::size_t maxDistance() const
Get the maximal distance allowed between two nodes in a aggregate.
Definition parameters.hh:144
│ │ │ │ -
CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition parameters.hh:356
│ │ │ │ -
void setGamma(std::size_t gamma)
Set the value of gamma; 1 for V-cycle, 2 for W-cycle.
Definition parameters.hh:453
│ │ │ │ -
void setAccumulate(bool accu)
Definition parameters.hh:324
│ │ │ │ -
void setMaxDistance(std::size_t distance)
Set the maximal distance allowed between two nodes in a aggregate.
Definition parameters.hh:154
│ │ │ │ -
int debugLevel() const
Get the debugging Level.
Definition parameters.hh:411
│ │ │ │ -
std::size_t getNoPostSmoothSteps() const
Get the number of postsmoothing steps to apply.
Definition parameters.hh:445
│ │ │ │ -
@ atOnceAccu
Accumulate data to one process at once.
Definition parameters.hh:244
│ │ │ │ -
@ noAccu
No data accumulution.
Definition parameters.hh:238
│ │ │ │ -
@ successiveAccu
Successively accumulate to fewer processes.
Definition parameters.hh:248
│ │ │ │ +
465 enum { /* @brief We preserve the sign.*/
│ │ │ │ +
466 is_sign_preserving = false
│ │ │ │ +
467 };
│ │ │ │ +
472 template<class M>
│ │ │ │ +
│ │ │ │ +
473 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
│ │ │ │ +
474 {
│ │ │ │ +
475 return m.infinity_norm();
│ │ │ │ +
476 }
│ │ │ │ +
│ │ │ │ +
477 };
│ │ │ │ +
│ │ │ │ +
478
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
480 {
│ │ │ │ +
481
│ │ │ │ +
482 enum { /* @brief We preserve the sign.*/
│ │ │ │ +
483 is_sign_preserving = false
│ │ │ │ +
484 };
│ │ │ │ +
489 template<class M>
│ │ │ │ +
│ │ │ │ +
490 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
│ │ │ │ +
491 {
│ │ │ │ +
492 return m.frobenius_norm();
│ │ │ │ +
493 }
│ │ │ │ +
│ │ │ │ +
494 };
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
496 {
│ │ │ │ +
497
│ │ │ │ +
498 enum { /* @brief We preserve the sign.*/
│ │ │ │ +
499 is_sign_preserving = false
│ │ │ │ +
500 };
│ │ │ │ +
505 template<class M>
│ │ │ │ +
│ │ │ │ +
506 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
│ │ │ │ +
507 {
│ │ │ │ +
508 return 1;
│ │ │ │ +
509 }
│ │ │ │ +
│ │ │ │ +
510 };
│ │ │ │ +
│ │ │ │ +
517 template<class M, class Norm>
│ │ │ │ +
│ │ │ │ +
518 class SymmetricCriterion : public AggregationCriterion<SymmetricDependency<M,Norm> >
│ │ │ │ +
519 {
│ │ │ │ +
520 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
523 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
525 {}
│ │ │ │ +
│ │ │ │ +
526 };
│ │ │ │ +
│ │ │ │ +
527
│ │ │ │ +
528
│ │ │ │ +
537 template<class M, class Norm>
│ │ │ │ +
│ │ │ │ +
538 class UnSymmetricCriterion : public AggregationCriterion<Dependency<M,Norm> >
│ │ │ │ +
539 {
│ │ │ │ +
540 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
543 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
545 {}
│ │ │ │ +
│ │ │ │ +
546 };
│ │ │ │ +
│ │ │ │ +
547 // forward declaration
│ │ │ │ +
548 template<class G> class Aggregator;
│ │ │ │ +
549
│ │ │ │ +
550
│ │ │ │ +
558 template<class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
560 {
│ │ │ │ +
561 public:
│ │ │ │ +
562
│ │ │ │ +
566 static const V UNAGGREGATED;
│ │ │ │ +
567
│ │ │ │ +
571 static const V ISOLATED;
│ │ │ │ + │ │ │ │ +
576
│ │ │ │ + │ │ │ │ +
581
│ │ │ │ +
586 typedef PoolAllocator<VertexDescriptor,100> Allocator;
│ │ │ │ +
587
│ │ │ │ +
592 typedef SLList<VertexDescriptor,Allocator> VertexList;
│ │ │ │ +
593
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
598 {
│ │ │ │ +
599 public:
│ │ │ │ +
600 template<class EdgeIterator>
│ │ │ │ +
│ │ │ │ +
601 void operator()([[maybe_unused]] const EdgeIterator& edge) const
│ │ │ │ +
602 {}
│ │ │ │ +
│ │ │ │ +
603 };
│ │ │ │ +
│ │ │ │ +
604
│ │ │ │ +
605
│ │ │ │ + │ │ │ │ +
610
│ │ │ │ + │ │ │ │ +
617
│ │ │ │ + │ │ │ │ +
622
│ │ │ │ +
634 template<class M, class G, class C>
│ │ │ │ +
635 std::tuple<int,int,int,int> buildAggregates(const M& matrix, G& graph, const C& criterion,
│ │ │ │ +
636 bool finestLevel);
│ │ │ │ +
637
│ │ │ │ +
655 template<bool reset, class G, class F, class VM>
│ │ │ │ +
656 std::size_t breadthFirstSearch(const VertexDescriptor& start,
│ │ │ │ +
657 const AggregateDescriptor& aggregate,
│ │ │ │ +
658 const G& graph,
│ │ │ │ +
659 F& aggregateVisitor,
│ │ │ │ +
660 VM& visitedMap) const;
│ │ │ │ +
661
│ │ │ │ +
685 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
│ │ │ │ +
686 std::size_t breadthFirstSearch(const VertexDescriptor& start,
│ │ │ │ +
687 const AggregateDescriptor& aggregate,
│ │ │ │ +
688 const G& graph, L& visited, F1& aggregateVisitor,
│ │ │ │ +
689 F2& nonAggregateVisitor,
│ │ │ │ +
690 VM& visitedMap) const;
│ │ │ │ +
691
│ │ │ │ +
697 void allocate(std::size_t noVertices);
│ │ │ │ +
698
│ │ │ │ +
702 std::size_t noVertices() const;
│ │ │ │ +
703
│ │ │ │ +
707 void free();
│ │ │ │ +
708
│ │ │ │ + │ │ │ │ +
715
│ │ │ │ + │ │ │ │ +
722
│ │ │ │ + │ │ │ │ +
724
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
726 {
│ │ │ │ +
727 return aggregates_;
│ │ │ │ +
728 }
│ │ │ │ +
│ │ │ │ +
729
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
731 {
│ │ │ │ +
732 return aggregates_+noVertices();
│ │ │ │ +
733 }
│ │ │ │ +
│ │ │ │ +
734
│ │ │ │ + │ │ │ │ +
736
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
738 {
│ │ │ │ +
739 return aggregates_;
│ │ │ │ +
740 }
│ │ │ │ +
│ │ │ │ +
741
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
743 {
│ │ │ │ +
744 return aggregates_+noVertices();
│ │ │ │ +
745 }
│ │ │ │ +
│ │ │ │ +
746 private:
│ │ │ │ +
748 AggregatesMap(const AggregatesMap<V>&) = delete;
│ │ │ │ +
750 AggregatesMap<V>& operator=(const AggregatesMap<V>&) = delete;
│ │ │ │ +
751
│ │ │ │ +
755 AggregateDescriptor* aggregates_;
│ │ │ │ +
756
│ │ │ │ +
760 std::size_t noVertices_;
│ │ │ │ +
761 };
│ │ │ │ +
│ │ │ │ +
762
│ │ │ │ +
766 template<class G, class C>
│ │ │ │ +
767 void buildDependency(G& graph,
│ │ │ │ +
768 const typename C::Matrix& matrix,
│ │ │ │ +
769 C criterion,
│ │ │ │ +
770 bool finestLevel);
│ │ │ │ +
771
│ │ │ │ +
776 template<class G, class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
778 {
│ │ │ │ +
779
│ │ │ │ +
780 public:
│ │ │ │ +
781
│ │ │ │ +
782 /***
│ │ │ │ +
783 * @brief The type of the matrix graph we work with.
│ │ │ │ +
784 */
│ │ │ │ +
785 typedef G MatrixGraph;
│ │ │ │ + │ │ │ │ +
790
│ │ │ │ +
795 typedef PoolAllocator<Vertex,100> Allocator;
│ │ │ │ +
796
│ │ │ │ +
801 typedef S VertexSet;
│ │ │ │ +
802
│ │ │ │ +
804 typedef typename VertexSet::const_iterator const_iterator;
│ │ │ │ +
805
│ │ │ │ +
809 typedef std::size_t* SphereMap;
│ │ │ │ +
810
│ │ │ │ + │ │ │ │ +
820 VertexSet& connectivity, std::vector<Vertex>& front_);
│ │ │ │ +
821
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
823 {
│ │ │ │ +
824 --id_;
│ │ │ │ +
825 }
│ │ │ │ +
│ │ │ │ +
826
│ │ │ │ +
833 void reconstruct(const Vertex& vertex);
│ │ │ │ +
834
│ │ │ │ +
838 void seed(const Vertex& vertex);
│ │ │ │ +
839
│ │ │ │ +
843 void add(const Vertex& vertex);
│ │ │ │ +
844
│ │ │ │ +
845 void add(std::vector<Vertex>& vertex);
│ │ │ │ +
849 void clear();
│ │ │ │ +
850
│ │ │ │ +
854 typename VertexSet::size_type size();
│ │ │ │ +
858 typename VertexSet::size_type connectSize();
│ │ │ │ +
859
│ │ │ │ +
863 int id();
│ │ │ │ +
864
│ │ │ │ + │ │ │ │ +
867
│ │ │ │ + │ │ │ │ +
870
│ │ │ │ +
871 private:
│ │ │ │ +
875 VertexSet vertices_;
│ │ │ │ +
876
│ │ │ │ +
881 int id_;
│ │ │ │ +
882
│ │ │ │ +
886 MatrixGraph& graph_;
│ │ │ │ +
887
│ │ │ │ +
891 AggregatesMap<Vertex>& aggregates_;
│ │ │ │ +
892
│ │ │ │ +
896 VertexSet& connected_;
│ │ │ │ +
897
│ │ │ │ +
901 std::vector<Vertex>& front_;
│ │ │ │ +
902 };
│ │ │ │ +
│ │ │ │ +
903
│ │ │ │ +
907 template<class G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
909 {
│ │ │ │ +
910 public:
│ │ │ │ +
911
│ │ │ │ +
915 typedef G MatrixGraph;
│ │ │ │ +
916
│ │ │ │ + │ │ │ │ +
921
│ │ │ │ + │ │ │ │ +
924
│ │ │ │ + │ │ │ │ +
929
│ │ │ │ + │ │ │ │ +
934
│ │ │ │ +
951 template<class M, class C>
│ │ │ │ +
952 std::tuple<int,int,int,int> build(const M& m, G& graph,
│ │ │ │ +
953 AggregatesMap<Vertex>& aggregates, const C& c,
│ │ │ │ +
954 bool finestLevel);
│ │ │ │ +
955 private:
│ │ │ │ +
960 typedef PoolAllocator<Vertex,100> Allocator;
│ │ │ │ +
961
│ │ │ │ +
965 typedef SLList<Vertex,Allocator> VertexList;
│ │ │ │ +
966
│ │ │ │ +
970 typedef std::set<Vertex,std::less<Vertex>,Allocator> VertexSet;
│ │ │ │ +
971
│ │ │ │ +
975 typedef std::size_t* SphereMap;
│ │ │ │ +
976
│ │ │ │ +
980 MatrixGraph* graph_;
│ │ │ │ +
981
│ │ │ │ + │ │ │ │ +
986
│ │ │ │ +
990 std::vector<Vertex> front_;
│ │ │ │ +
991
│ │ │ │ +
995 VertexSet connected_;
│ │ │ │ +
996
│ │ │ │ +
1000 int size_;
│ │ │ │ +
1001
│ │ │ │ +
1005 class Stack
│ │ │ │ +
1006 {
│ │ │ │ +
1007 public:
│ │ │ │ +
1008 static const Vertex NullEntry;
│ │ │ │ +
1009
│ │ │ │ +
1010 Stack(const MatrixGraph& graph,
│ │ │ │ +
1011 const Aggregator<G>& aggregatesBuilder,
│ │ │ │ +
1012 const AggregatesMap<Vertex>& aggregates);
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1015 private:
│ │ │ │ +
1016 enum { N = 1300000 };
│ │ │ │ +
1017
│ │ │ │ +
1019 const MatrixGraph& graph_;
│ │ │ │ +
1021 const Aggregator<G>& aggregatesBuilder_;
│ │ │ │ +
1023 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ +
1025 int size_;
│ │ │ │ +
1026 Vertex maxSize_;
│ │ │ │ +
1028 typename MatrixGraph::ConstVertexIterator begin_;
│ │ │ │ + │ │ │ │ +
1030
│ │ │ │ +
1032 Vertex* vals_;
│ │ │ │ +
1033
│ │ │ │ +
1034 };
│ │ │ │ +
1035
│ │ │ │ +
1036 friend class Stack;
│ │ │ │ +
1037
│ │ │ │ +
1048 template<class V>
│ │ │ │ +
1049 void visitAggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ +
1050 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
1051 V& visitor) const;
│ │ │ │ +
1052
│ │ │ │ +
1057 template<class V>
│ │ │ │ +
1058 class AggregateVisitor
│ │ │ │ +
1059 {
│ │ │ │ +
1060 public:
│ │ │ │ +
1064 typedef V Visitor;
│ │ │ │ + │ │ │ │ +
1073 Visitor& visitor);
│ │ │ │ +
1074
│ │ │ │ +
1081 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1082
│ │ │ │ +
1083 private:
│ │ │ │ +
1085 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ +
1087 AggregateDescriptor aggregate_;
│ │ │ │ +
1089 Visitor* visitor_;
│ │ │ │ +
1090 };
│ │ │ │ +
1091
│ │ │ │ +
1095 class Counter
│ │ │ │ +
1096 {
│ │ │ │ +
1097 public:
│ │ │ │ + │ │ │ │ +
1101 int value();
│ │ │ │ +
1102
│ │ │ │ +
1103 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1108
│ │ │ │ +
1109 private:
│ │ │ │ +
1110 int count_;
│ │ │ │ +
1111 };
│ │ │ │ +
1112
│ │ │ │ +
1113
│ │ │ │ +
1118 class FrontNeighbourCounter : public Counter
│ │ │ │ +
1119 {
│ │ │ │ +
1120 public:
│ │ │ │ + │ │ │ │ +
1126
│ │ │ │ +
1127 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1128
│ │ │ │ +
1129 private:
│ │ │ │ +
1130 const MatrixGraph& graph_;
│ │ │ │ +
1131 };
│ │ │ │ +
1132
│ │ │ │ +
1137 int noFrontNeighbours(const Vertex& vertex) const;
│ │ │ │ +
1138
│ │ │ │ +
1142 class TwoWayCounter : public Counter
│ │ │ │ +
1143 {
│ │ │ │ +
1144 public:
│ │ │ │ +
1145 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1146 };
│ │ │ │ +
1147
│ │ │ │ +
1159 int twoWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
│ │ │ │ +
1160 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1161
│ │ │ │ +
1165 class OneWayCounter : public Counter
│ │ │ │ +
1166 {
│ │ │ │ +
1167 public:
│ │ │ │ +
1168 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1169 };
│ │ │ │ +
1170
│ │ │ │ +
1182 int oneWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
│ │ │ │ +
1183 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1184
│ │ │ │ +
1191 class ConnectivityCounter : public Counter
│ │ │ │ +
1192 {
│ │ │ │ +
1193 public:
│ │ │ │ +
1200 ConnectivityCounter(const VertexSet& connected, const AggregatesMap<Vertex>& aggregates);
│ │ │ │ +
1201
│ │ │ │ +
1202 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1203
│ │ │ │ +
1204 private:
│ │ │ │ +
1206 const VertexSet& connected_;
│ │ │ │ +
1208 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ +
1209
│ │ │ │ +
1210 };
│ │ │ │ +
1211
│ │ │ │ +
1223 double connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1231 bool connected(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ +
1232 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1233
│ │ │ │ +
1241 bool connected(const Vertex& vertex, const SLList<AggregateDescriptor>& aggregateList,
│ │ │ │ +
1242 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1243
│ │ │ │ +
1251 class DependencyCounter : public Counter
│ │ │ │ +
1252 {
│ │ │ │ +
1253 public:
│ │ │ │ + │ │ │ │ +
1258
│ │ │ │ +
1259 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1260 };
│ │ │ │ +
1261
│ │ │ │ +
1268 class FrontMarker
│ │ │ │ +
1269 {
│ │ │ │ +
1270 public:
│ │ │ │ +
1277 FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph);
│ │ │ │ +
1278
│ │ │ │ +
1279 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ +
1280
│ │ │ │ +
1281 private:
│ │ │ │ +
1283 std::vector<Vertex>& front_;
│ │ │ │ +
1285 MatrixGraph& graph_;
│ │ │ │ +
1286 };
│ │ │ │ +
1287
│ │ │ │ +
1291 void unmarkFront();
│ │ │ │ +
1292
│ │ │ │ +
1307 int unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1308
│ │ │ │ +
1322 std::pair<int,int> neighbours(const Vertex& vertex,
│ │ │ │ +
1323 const AggregateDescriptor& aggregate,
│ │ │ │ +
1324 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1341 int aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1342
│ │ │ │ +
1350 bool admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1351
│ │ │ │ +
1359 std::size_t distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates);
│ │ │ │ +
1360
│ │ │ │ +
1369 Vertex mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ +
1370
│ │ │ │ +
1379 void nonisoNeighbourAggregate(const Vertex& vertex,
│ │ │ │ +
1380 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
1381 SLList<Vertex>& neighbours) const;
│ │ │ │ +
1382
│ │ │ │ +
1390 template<class C>
│ │ │ │ +
1391 void growAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
│ │ │ │ +
1392 template<class C>
│ │ │ │ +
1393 void growIsolatedAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
│ │ │ │ +
1394 };
│ │ │ │ +
│ │ │ │ +
1395
│ │ │ │ +
1396#ifndef DOXYGEN
│ │ │ │ +
1397
│ │ │ │ +
1398 template<class M, class N>
│ │ │ │ +
1399 inline void SymmetricDependency<M,N>::init(const Matrix* matrix)
│ │ │ │ +
1400 {
│ │ │ │ +
1401 matrix_ = matrix;
│ │ │ │ +
1402 }
│ │ │ │ +
1403
│ │ │ │ +
1404 template<class M, class N>
│ │ │ │ +
1405 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index)
│ │ │ │ +
1406 {
│ │ │ │ +
1407 initRow(row, index, std::is_convertible<field_type, real_type>());
│ │ │ │ +
1408 }
│ │ │ │ +
1409
│ │ │ │ +
1410 template<class M, class N>
│ │ │ │ +
1411 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index, const std::false_type&)
│ │ │ │ +
1412 {
│ │ │ │ +
1413 DUNE_THROW(InvalidStateException, "field_type needs to convertible to real_type");
│ │ │ │ +
1414 }
│ │ │ │ +
1415
│ │ │ │ +
1416 template<class M, class N>
│ │ │ │ +
1417 inline void SymmetricDependency<M,N>::initRow([[maybe_unused]] const Row& row, int index, const std::true_type&)
│ │ │ │ +
1418 {
│ │ │ │ +
1419 using std::min;
│ │ │ │ +
1420 maxValue_ = min(- std::numeric_limits<typename Matrix::field_type>::max(), std::numeric_limits<typename Matrix::field_type>::min());
│ │ │ │ +
1421 row_ = index;
│ │ │ │ +
1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
│ │ │ │ +
1423 }
│ │ │ │ +
1424
│ │ │ │ +
1425 template<class M, class N>
│ │ │ │ +
1426 inline void SymmetricDependency<M,N>::examine(const ColIter& col)
│ │ │ │ +
1427 {
│ │ │ │ +
1428 using std::max;
│ │ │ │ +
1429 real_type eij = norm_(*col);
│ │ │ │ +
1430 typename Matrix::ConstColIterator opposite_entry =
│ │ │ │ +
1431 matrix_->operator[](col.index()).find(row_);
│ │ │ │ +
1432 if ( opposite_entry == matrix_->operator[](col.index()).end() )
│ │ │ │ +
1433 {
│ │ │ │ +
1434 // Consider this a weak connection we disregard.
│ │ │ │ +
1435 return;
│ │ │ │ +
1436 }
│ │ │ │ +
1437 real_type eji = norm_(*opposite_entry);
│ │ │ │ +
1438
│ │ │ │ +
1439 // skip positive offdiagonals if norm preserves sign of them.
│ │ │ │ +
1440 if(!N::is_sign_preserving || eij<0 || eji<0)
│ │ │ │ +
1441 maxValue_ = max(maxValue_,
│ │ │ │ +
1442 eij /diagonal_ * eji/
│ │ │ │ +
1443 norm_(matrix_->operator[](col.index())[col.index()]));
│ │ │ │ +
1444 }
│ │ │ │ +
1445
│ │ │ │ +
1446 template<class M, class N>
│ │ │ │ +
1447 template<class G>
│ │ │ │ +
1448 inline void SymmetricDependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
│ │ │ │ +
1449 {
│ │ │ │ +
1450 real_type eij = norm_(*col);
│ │ │ │ +
1451 typename Matrix::ConstColIterator opposite_entry =
│ │ │ │ +
1452 matrix_->operator[](col.index()).find(row_);
│ │ │ │ +
1453
│ │ │ │ +
1454 if ( opposite_entry == matrix_->operator[](col.index()).end() )
│ │ │ │ +
1455 {
│ │ │ │ +
1456 // Consider this as a weak connection we disregard.
│ │ │ │ +
1457 return;
│ │ │ │ +
1458 }
│ │ │ │ +
1459 real_type eji = norm_(*opposite_entry);
│ │ │ │ +
1460 // skip positve offdiagonals if norm preserves sign of them.
│ │ │ │ +
1461 if(!N::is_sign_preserving || (eij<0 || eji<0))
│ │ │ │ +
1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) *
│ │ │ │ +
1463 eij/ diagonal_ > alpha() * maxValue_) {
│ │ │ │ +
1464 edge.properties().setDepends();
│ │ │ │ +
1465 edge.properties().setInfluences();
│ │ │ │ +
1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), edge.source());
│ │ │ │ +
1467 other.setInfluences();
│ │ │ │ +
1468 other.setDepends();
│ │ │ │ +
1469 }
│ │ │ │ +
1470 }
│ │ │ │ +
1471
│ │ │ │ +
1472 template<class M, class N>
│ │ │ │ + │ │ │ │ +
1474 {
│ │ │ │ +
1475 return maxValue_ < beta();
│ │ │ │ +
1476 }
│ │ │ │ +
1477
│ │ │ │ +
1478
│ │ │ │ +
1479 template<class M, class N>
│ │ │ │ +
1480 inline void Dependency<M,N>::init(const Matrix* matrix)
│ │ │ │ +
1481 {
│ │ │ │ +
1482 matrix_ = matrix;
│ │ │ │ +
1483 }
│ │ │ │ +
1484
│ │ │ │ +
1485 template<class M, class N>
│ │ │ │ +
1486 inline void Dependency<M,N>::initRow([[maybe_unused]] const Row& row, int index)
│ │ │ │ +
1487 {
│ │ │ │ +
1488 using std::min;
│ │ │ │ +
1489 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
│ │ │ │ +
1490 row_ = index;
│ │ │ │ +
1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
│ │ │ │ +
1492 }
│ │ │ │ +
1493
│ │ │ │ +
1494 template<class M, class N>
│ │ │ │ +
1495 inline void Dependency<M,N>::examine(const ColIter& col)
│ │ │ │ +
1496 {
│ │ │ │ +
1497 using std::max;
│ │ │ │ +
1498 maxValue_ = max(maxValue_, -norm_(*col));
│ │ │ │ +
1499 }
│ │ │ │ +
1500
│ │ │ │ +
1501 template<class M, class N>
│ │ │ │ +
1502 template<class G>
│ │ │ │ +
1503 inline void Dependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
│ │ │ │ +
1504 {
│ │ │ │ +
1505 if(-norm_(*col) >= maxValue_ * alpha()) {
│ │ │ │ +
1506 edge.properties().setDepends();
│ │ │ │ +
1507 typedef typename G::EdgeDescriptor ED;
│ │ │ │ +
1508 ED e= graph.findEdge(edge.target(), edge.source());
│ │ │ │ +
1509 if(e!=std::numeric_limits<ED>::max())
│ │ │ │ +
1510 {
│ │ │ │ +
1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e);
│ │ │ │ +
1512 other.setInfluences();
│ │ │ │ +
1513 }
│ │ │ │ +
1514 }
│ │ │ │ +
1515 }
│ │ │ │ +
1516
│ │ │ │ +
1517 template<class M, class N>
│ │ │ │ +
1518 inline bool Dependency<M,N>::isIsolated()
│ │ │ │ +
1519 {
│ │ │ │ +
1520 return maxValue_ < beta() * diagonal_;
│ │ │ │ +
1521 }
│ │ │ │ +
1522
│ │ │ │ +
1523 template<class G,class S>
│ │ │ │ +
1524 Aggregate<G,S>::Aggregate(MatrixGraph& graph, AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
1525 VertexSet& connected, std::vector<Vertex>& front)
│ │ │ │ +
1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates),
│ │ │ │ +
1527 connected_(connected), front_(front)
│ │ │ │ +
1528 {}
│ │ │ │ +
1529
│ │ │ │ +
1530 template<class G,class S>
│ │ │ │ +
1531 void Aggregate<G,S>::reconstruct(const Vertex& vertex)
│ │ │ │ +
1532 {
│ │ │ │ +
1533 /*
│ │ │ │ +
1534 vertices_.push_back(vertex);
│ │ │ │ +
1535 typedef typename VertexList::const_iterator iterator;
│ │ │ │ +
1536 iterator begin = vertices_.begin();
│ │ │ │ +
1537 iterator end = vertices_.end();*/
│ │ │ │ +
1538 throw "Not yet implemented";
│ │ │ │ +
1539
│ │ │ │ +
1540 // while(begin!=end){
│ │ │ │ +
1541 //for();
│ │ │ │ +
1542 // }
│ │ │ │ +
1543
│ │ │ │ +
1544 }
│ │ │ │ +
1545
│ │ │ │ +
1546 template<class G,class S>
│ │ │ │ +
1547 inline void Aggregate<G,S>::seed(const Vertex& vertex)
│ │ │ │ +
1548 {
│ │ │ │ +
1549 dvverb<<"Connected cleared"<<std::endl;
│ │ │ │ +
1550 connected_.clear();
│ │ │ │ +
1551 vertices_.clear();
│ │ │ │ +
1552 connected_.insert(vertex);
│ │ │ │ +
1553 dvverb << " Inserting "<<vertex<<" size="<<connected_.size();
│ │ │ │ +
1554 ++id_ ;
│ │ │ │ +
1555 add(vertex);
│ │ │ │ +
1556 }
│ │ │ │ +
1557
│ │ │ │ +
1558
│ │ │ │ +
1559 template<class G,class S>
│ │ │ │ +
1560 inline void Aggregate<G,S>::add(const Vertex& vertex)
│ │ │ │ +
1561 {
│ │ │ │ +
1562 vertices_.insert(vertex);
│ │ │ │ +
1563 aggregates_[vertex]=id_;
│ │ │ │ +
1564 if(front_.size())
│ │ │ │ +
1565 front_.erase(std::lower_bound(front_.begin(), front_.end(), vertex));
│ │ │ │ +
1566
│ │ │ │ +
1567
│ │ │ │ +
1568 typedef typename MatrixGraph::ConstEdgeIterator iterator;
│ │ │ │ +
1569 const iterator end = graph_.endEdges(vertex);
│ │ │ │ +
1570 for(iterator edge = graph_.beginEdges(vertex); edge != end; ++edge) {
│ │ │ │ +
1571 dvverb << " Inserting "<<aggregates_[edge.target()];
│ │ │ │ +
1572 connected_.insert(aggregates_[edge.target()]);
│ │ │ │ +
1573 dvverb <<" size="<<connected_.size();
│ │ │ │ +
1574 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
│ │ │ │ +
1575 !graph_.getVertexProperties(edge.target()).front())
│ │ │ │ +
1576 {
│ │ │ │ +
1577 front_.push_back(edge.target());
│ │ │ │ +
1578 graph_.getVertexProperties(edge.target()).setFront();
│ │ │ │ +
1579 }
│ │ │ │ +
1580 }
│ │ │ │ +
1581 dvverb <<std::endl;
│ │ │ │ +
1582 std::sort(front_.begin(), front_.end());
│ │ │ │ +
1583 }
│ │ │ │ +
1584
│ │ │ │ +
1585 template<class G,class S>
│ │ │ │ +
1586 inline void Aggregate<G,S>::add(std::vector<Vertex>& vertices)
│ │ │ │ +
1587 {
│ │ │ │ +
1588#ifndef NDEBUG
│ │ │ │ +
1589 std::size_t oldsize = vertices_.size();
│ │ │ │ +
1590#endif
│ │ │ │ +
1591 typedef typename std::vector<Vertex>::iterator Iterator;
│ │ │ │ +
1592
│ │ │ │ +
1593 typedef typename VertexSet::iterator SIterator;
│ │ │ │ +
1594
│ │ │ │ +
1595 SIterator pos=vertices_.begin();
│ │ │ │ +
1596 std::vector<Vertex> newFront;
│ │ │ │ +
1597 newFront.reserve(front_.capacity());
│ │ │ │ +
1598
│ │ │ │ +
1599 std::set_difference(front_.begin(), front_.end(), vertices.begin(), vertices.end(),
│ │ │ │ +
1600 std::back_inserter(newFront));
│ │ │ │ +
1601 front_=newFront;
│ │ │ │ +
1602
│ │ │ │ +
1603 for(Iterator vertex=vertices.begin(); vertex != vertices.end(); ++vertex)
│ │ │ │ +
1604 {
│ │ │ │ +
1605 pos=vertices_.insert(pos,*vertex);
│ │ │ │ +
1606 vertices_.insert(*vertex);
│ │ │ │ +
1607 graph_.getVertexProperties(*vertex).resetFront(); // Not a front node any more.
│ │ │ │ +
1608 aggregates_[*vertex]=id_;
│ │ │ │ +
1609
│ │ │ │ +
1610 typedef typename MatrixGraph::ConstEdgeIterator iterator;
│ │ │ │ +
1611 const iterator end = graph_.endEdges(*vertex);
│ │ │ │ +
1612 for(iterator edge = graph_.beginEdges(*vertex); edge != end; ++edge) {
│ │ │ │ +
1613 dvverb << " Inserting "<<aggregates_[edge.target()];
│ │ │ │ +
1614 connected_.insert(aggregates_[edge.target()]);
│ │ │ │ +
1615 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
│ │ │ │ +
1616 !graph_.getVertexProperties(edge.target()).front())
│ │ │ │ +
1617 {
│ │ │ │ +
1618 front_.push_back(edge.target());
│ │ │ │ +
1619 graph_.getVertexProperties(edge.target()).setFront();
│ │ │ │ +
1620 }
│ │ │ │ +
1621 dvverb <<" size="<<connected_.size();
│ │ │ │ +
1622 }
│ │ │ │ +
1623 dvverb <<std::endl;
│ │ │ │ +
1624 }
│ │ │ │ +
1625 std::sort(front_.begin(), front_.end());
│ │ │ │ +
1626 assert(oldsize+vertices.size()==vertices_.size());
│ │ │ │ +
1627 }
│ │ │ │ +
1628 template<class G,class S>
│ │ │ │ +
1629 inline void Aggregate<G,S>::clear()
│ │ │ │ +
1630 {
│ │ │ │ +
1631 vertices_.clear();
│ │ │ │ +
1632 connected_.clear();
│ │ │ │ +
1633 id_=-1;
│ │ │ │ +
1634 }
│ │ │ │ +
1635
│ │ │ │ +
1636 template<class G,class S>
│ │ │ │ +
1637 inline typename Aggregate<G,S>::VertexSet::size_type
│ │ │ │ + │ │ │ │ +
1639 {
│ │ │ │ +
1640 return vertices_.size();
│ │ │ │ +
1641 }
│ │ │ │ +
1642
│ │ │ │ +
1643 template<class G,class S>
│ │ │ │ +
1644 inline typename Aggregate<G,S>::VertexSet::size_type
│ │ │ │ + │ │ │ │ +
1646 {
│ │ │ │ +
1647 return connected_.size();
│ │ │ │ +
1648 }
│ │ │ │ +
1649
│ │ │ │ +
1650 template<class G,class S>
│ │ │ │ +
1651 inline int Aggregate<G,S>::id()
│ │ │ │ +
1652 {
│ │ │ │ +
1653 return id_;
│ │ │ │ +
1654 }
│ │ │ │ +
1655
│ │ │ │ +
1656 template<class G,class S>
│ │ │ │ + │ │ │ │ +
1658 {
│ │ │ │ +
1659 return vertices_.begin();
│ │ │ │ +
1660 }
│ │ │ │ +
1661
│ │ │ │ +
1662 template<class G,class S>
│ │ │ │ + │ │ │ │ +
1664 {
│ │ │ │ +
1665 return vertices_.end();
│ │ │ │ +
1666 }
│ │ │ │ +
1667
│ │ │ │ +
1668 template<class V>
│ │ │ │ +
1669 const V AggregatesMap<V>::UNAGGREGATED = std::numeric_limits<V>::max();
│ │ │ │ +
1670
│ │ │ │ +
1671 template<class V>
│ │ │ │ +
1672 const V AggregatesMap<V>::ISOLATED = std::numeric_limits<V>::max()-1;
│ │ │ │ +
1673
│ │ │ │ +
1674 template<class V>
│ │ │ │ + │ │ │ │ +
1676 : aggregates_(0)
│ │ │ │ +
1677 {}
│ │ │ │ +
1678
│ │ │ │ +
1679 template<class V>
│ │ │ │ + │ │ │ │ +
1681 {
│ │ │ │ +
1682 if(aggregates_!=0)
│ │ │ │ +
1683 delete[] aggregates_;
│ │ │ │ +
1684 }
│ │ │ │ +
1685
│ │ │ │ +
1686
│ │ │ │ +
1687 template<class V>
│ │ │ │ +
1688 inline AggregatesMap<V>::AggregatesMap(std::size_t noVertices)
│ │ │ │ +
1689 {
│ │ │ │ +
1690 allocate(noVertices);
│ │ │ │ +
1691 }
│ │ │ │ +
1692
│ │ │ │ +
1693 template<class V>
│ │ │ │ +
1694 inline std::size_t AggregatesMap<V>::noVertices() const
│ │ │ │ +
1695 {
│ │ │ │ +
1696 return noVertices_;
│ │ │ │ +
1697 }
│ │ │ │ +
1698
│ │ │ │ +
1699 template<class V>
│ │ │ │ +
1700 inline void AggregatesMap<V>::allocate(std::size_t noVertices)
│ │ │ │ +
1701 {
│ │ │ │ +
1702 aggregates_ = new AggregateDescriptor[noVertices];
│ │ │ │ +
1703 noVertices_ = noVertices;
│ │ │ │ +
1704
│ │ │ │ +
1705 for(std::size_t i=0; i < noVertices; i++)
│ │ │ │ +
1706 aggregates_[i]=UNAGGREGATED;
│ │ │ │ +
1707 }
│ │ │ │ +
1708
│ │ │ │ +
1709 template<class V>
│ │ │ │ +
1710 inline void AggregatesMap<V>::free()
│ │ │ │ +
1711 {
│ │ │ │ +
1712 assert(aggregates_ != 0);
│ │ │ │ +
1713 delete[] aggregates_;
│ │ │ │ +
1714 aggregates_=0;
│ │ │ │ +
1715 }
│ │ │ │ +
1716
│ │ │ │ +
1717 template<class V>
│ │ │ │ + │ │ │ │ +
1719 AggregatesMap<V>::operator[](const VertexDescriptor& v)
│ │ │ │ +
1720 {
│ │ │ │ +
1721 return aggregates_[v];
│ │ │ │ +
1722 }
│ │ │ │ +
1723
│ │ │ │ +
1724 template<class V>
│ │ │ │ +
1725 inline const typename AggregatesMap<V>::AggregateDescriptor&
│ │ │ │ +
1726 AggregatesMap<V>::operator[](const VertexDescriptor& v) const
│ │ │ │ +
1727 {
│ │ │ │ +
1728 return aggregates_[v];
│ │ │ │ +
1729 }
│ │ │ │ +
1730
│ │ │ │ +
1731 template<class V>
│ │ │ │ +
1732 template<bool reset, class G, class F,class VM>
│ │ │ │ +
1733 inline std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
│ │ │ │ +
1734 const AggregateDescriptor& aggregate,
│ │ │ │ +
1735 const G& graph, F& aggregateVisitor,
│ │ │ │ +
1736 VM& visitedMap) const
│ │ │ │ +
1737 {
│ │ │ │ +
1738 VertexList vlist;
│ │ │ │ +
1739
│ │ │ │ +
1740 DummyEdgeVisitor dummy;
│ │ │ │ +
1741 return breadthFirstSearch<true,reset>(start, aggregate, graph, vlist, aggregateVisitor, dummy, visitedMap);
│ │ │ │ +
1742 }
│ │ │ │ +
1743
│ │ │ │ +
1744 template<class V>
│ │ │ │ +
1745 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
│ │ │ │ +
1746 std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
│ │ │ │ +
1747 const AggregateDescriptor& aggregate,
│ │ │ │ +
1748 const G& graph,
│ │ │ │ +
1749 L& visited,
│ │ │ │ +
1750 F1& aggregateVisitor,
│ │ │ │ +
1751 F2& nonAggregateVisitor,
│ │ │ │ +
1752 VM& visitedMap) const
│ │ │ │ +
1753 {
│ │ │ │ +
1754 typedef typename L::const_iterator ListIterator;
│ │ │ │ +
1755 int visitedSpheres = 0;
│ │ │ │ +
1756
│ │ │ │ +
1757 visited.push_back(start);
│ │ │ │ +
1758 put(visitedMap, start, true);
│ │ │ │ +
1759
│ │ │ │ +
1760 ListIterator current = visited.begin();
│ │ │ │ +
1761 ListIterator end = visited.end();
│ │ │ │ +
1762 std::size_t i=0, size=visited.size();
│ │ │ │ +
1763
│ │ │ │ +
1764 // visit the neighbours of all vertices of the
│ │ │ │ +
1765 // current sphere.
│ │ │ │ +
1766 while(current != end) {
│ │ │ │ +
1767
│ │ │ │ +
1768 for(; i<size; ++current, ++i) {
│ │ │ │ +
1769 typedef typename G::ConstEdgeIterator EdgeIterator;
│ │ │ │ +
1770 const EdgeIterator endEdge = graph.endEdges(*current);
│ │ │ │ +
1771
│ │ │ │ +
1772 for(EdgeIterator edge = graph.beginEdges(*current);
│ │ │ │ +
1773 edge != endEdge; ++edge) {
│ │ │ │ +
1774
│ │ │ │ +
1775 if(aggregates_[edge.target()]==aggregate) {
│ │ │ │ +
1776 if(!get(visitedMap, edge.target())) {
│ │ │ │ +
1777 put(visitedMap, edge.target(), true);
│ │ │ │ +
1778 visited.push_back(edge.target());
│ │ │ │ +
1779 aggregateVisitor(edge);
│ │ │ │ +
1780 }
│ │ │ │ +
1781 }else
│ │ │ │ +
1782 nonAggregateVisitor(edge);
│ │ │ │ +
1783 }
│ │ │ │ +
1784 }
│ │ │ │ +
1785 end = visited.end();
│ │ │ │ +
1786 size = visited.size();
│ │ │ │ +
1787 if(current != end)
│ │ │ │ +
1788 visitedSpheres++;
│ │ │ │ +
1789 }
│ │ │ │ +
1790
│ │ │ │ +
1791 if(reset)
│ │ │ │ +
1792 for(current = visited.begin(); current != end; ++current)
│ │ │ │ +
1793 put(visitedMap, *current, false);
│ │ │ │ +
1794
│ │ │ │ +
1795
│ │ │ │ +
1796 if(remove)
│ │ │ │ +
1797 visited.clear();
│ │ │ │ +
1798
│ │ │ │ +
1799 return visitedSpheres;
│ │ │ │ +
1800 }
│ │ │ │ +
1801
│ │ │ │ +
1802 template<class G>
│ │ │ │ + │ │ │ │ +
1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1)
│ │ │ │ +
1805 {}
│ │ │ │ +
1806
│ │ │ │ +
1807 template<class G>
│ │ │ │ + │ │ │ │ +
1809 {
│ │ │ │ +
1810 size_=-1;
│ │ │ │ +
1811 }
│ │ │ │ +
1812
│ │ │ │ +
1813 template<class G, class C>
│ │ │ │ +
1814 void buildDependency(G& graph,
│ │ │ │ +
1815 const typename C::Matrix& matrix,
│ │ │ │ +
1816 C criterion, bool firstlevel)
│ │ │ │ +
1817 {
│ │ │ │ +
1818 // assert(graph.isBuilt());
│ │ │ │ +
1819 typedef typename C::Matrix Matrix;
│ │ │ │ +
1820 typedef typename G::VertexIterator VertexIterator;
│ │ │ │ +
1821
│ │ │ │ +
1822 criterion.init(&matrix);
│ │ │ │ +
1823
│ │ │ │ +
1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end(); ++vertex) {
│ │ │ │ +
1825 typedef typename Matrix::row_type Row;
│ │ │ │ +
1826
│ │ │ │ +
1827 const Row& row = matrix[*vertex];
│ │ │ │ +
1828
│ │ │ │ +
1829 // Tell the criterion what row we will examine now
│ │ │ │ +
1830 // This might for example be used for calculating the
│ │ │ │ +
1831 // maximum offdiagonal value
│ │ │ │ +
1832 criterion.initRow(row, *vertex);
│ │ │ │ +
1833
│ │ │ │ +
1834 // On a first path all columns are examined. After this
│ │ │ │ +
1835 // the calculator should know whether the vertex is isolated.
│ │ │ │ +
1836 typedef typename Matrix::ConstColIterator ColIterator;
│ │ │ │ +
1837 ColIterator end = row.end();
│ │ │ │ +
1838 typename FieldTraits<typename Matrix::field_type>::real_type absoffdiag=0.;
│ │ │ │ +
1839
│ │ │ │ +
1840 using std::max;
│ │ │ │ +
1841 if(firstlevel) {
│ │ │ │ +
1842 for(ColIterator col = row.begin(); col != end; ++col)
│ │ │ │ +
1843 if(col.index()!=*vertex) {
│ │ │ │ +
1844 criterion.examine(col);
│ │ │ │ +
1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm());
│ │ │ │ +
1846 }
│ │ │ │ +
1847
│ │ │ │ +
1848 if(absoffdiag==0)
│ │ │ │ +
1849 vertex.properties().setExcludedBorder();
│ │ │ │ +
1850 }
│ │ │ │ +
1851 else
│ │ │ │ +
1852 for(ColIterator col = row.begin(); col != end; ++col)
│ │ │ │ +
1853 if(col.index()!=*vertex)
│ │ │ │ +
1854 criterion.examine(col);
│ │ │ │ +
1855
│ │ │ │ +
1856 // reset the vertex properties
│ │ │ │ +
1857 //vertex.properties().reset();
│ │ │ │ +
1858
│ │ │ │ +
1859 // Check whether the vertex is isolated.
│ │ │ │ +
1860 if(criterion.isIsolated()) {
│ │ │ │ +
1861 //std::cout<<"ISOLATED: "<<*vertex<<std::endl;
│ │ │ │ +
1862 vertex.properties().setIsolated();
│ │ │ │ +
1863 }else{
│ │ │ │ +
1864 // Examine all the edges beginning at this vertex.
│ │ │ │ +
1865 auto eEnd = vertex.end();
│ │ │ │ +
1866 auto col = matrix[*vertex].begin();
│ │ │ │ +
1867
│ │ │ │ +
1868 for(auto edge = vertex.begin(); edge!= eEnd; ++edge, ++col) {
│ │ │ │ +
1869 // Move to the right column.
│ │ │ │ +
1870 while(col.index()!=edge.target())
│ │ │ │ +
1871 ++col;
│ │ │ │ +
1872 criterion.examine(graph, edge, col);
│ │ │ │ +
1873 }
│ │ │ │ +
1874 }
│ │ │ │ +
1875
│ │ │ │ +
1876 }
│ │ │ │ +
1877 }
│ │ │ │ +
1878
│ │ │ │ +
1879
│ │ │ │ +
1880 template<class G>
│ │ │ │ +
1881 template<class V>
│ │ │ │ +
1882 inline Aggregator<G>::AggregateVisitor<V>::AggregateVisitor(const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
1883 const AggregateDescriptor& aggregate, V& visitor)
│ │ │ │ +
1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor)
│ │ │ │ +
1885 {}
│ │ │ │ +
1886
│ │ │ │ +
1887 template<class G>
│ │ │ │ +
1888 template<class V>
│ │ │ │ + │ │ │ │ +
1890 {
│ │ │ │ +
1891 if(aggregates_[edge.target()]==aggregate_)
│ │ │ │ +
1892 visitor_->operator()(edge);
│ │ │ │ +
1893 }
│ │ │ │ +
1894
│ │ │ │ +
1895 template<class G>
│ │ │ │ +
1896 template<class V>
│ │ │ │ +
1897 inline void Aggregator<G>::visitAggregateNeighbours(const Vertex& vertex,
│ │ │ │ +
1898 const AggregateDescriptor& aggregate,
│ │ │ │ +
1899 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
1900 V& visitor) const
│ │ │ │ +
1901 {
│ │ │ │ +
1902 // Only evaluates for edge pointing to the aggregate
│ │ │ │ +
1903 AggregateVisitor<V> v(aggregates, aggregate, visitor);
│ │ │ │ +
1904 visitNeighbours(*graph_, vertex, v);
│ │ │ │ +
1905 }
│ │ │ │ +
1906
│ │ │ │ +
1907
│ │ │ │ +
1908 template<class G>
│ │ │ │ + │ │ │ │ +
1910 : count_(0)
│ │ │ │ +
1911 {}
│ │ │ │ +
1912
│ │ │ │ +
1913 template<class G>
│ │ │ │ + │ │ │ │ +
1915 {
│ │ │ │ +
1916 ++count_;
│ │ │ │ +
1917 }
│ │ │ │ +
1918
│ │ │ │ +
1919 template<class G>
│ │ │ │ + │ │ │ │ +
1921 {
│ │ │ │ +
1922 --count_;
│ │ │ │ +
1923 }
│ │ │ │ +
1924 template<class G>
│ │ │ │ + │ │ │ │ +
1926 {
│ │ │ │ +
1927 return count_;
│ │ │ │ +
1928 }
│ │ │ │ +
1929
│ │ │ │ +
1930 template<class G>
│ │ │ │ + │ │ │ │ +
1932 {
│ │ │ │ +
1933 if(edge.properties().isTwoWay())
│ │ │ │ + │ │ │ │ +
1935 }
│ │ │ │ +
1936
│ │ │ │ +
1937 template<class G>
│ │ │ │ +
1938 int Aggregator<G>::twoWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ +
1939 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
1940 {
│ │ │ │ +
1941 TwoWayCounter counter;
│ │ │ │ +
1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
│ │ │ │ +
1943 return counter.value();
│ │ │ │ +
1944 }
│ │ │ │ +
1945
│ │ │ │ +
1946 template<class G>
│ │ │ │ +
1947 int Aggregator<G>::oneWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ +
1948 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
1949 {
│ │ │ │ +
1950 OneWayCounter counter;
│ │ │ │ +
1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
│ │ │ │ +
1952 return counter.value();
│ │ │ │ +
1953 }
│ │ │ │ +
1954
│ │ │ │ +
1955 template<class G>
│ │ │ │ + │ │ │ │ +
1957 {
│ │ │ │ +
1958 if(edge.properties().isOneWay())
│ │ │ │ + │ │ │ │ +
1960 }
│ │ │ │ +
1961
│ │ │ │ +
1962 template<class G>
│ │ │ │ +
1963 inline Aggregator<G>::ConnectivityCounter::ConnectivityCounter(const VertexSet& connected,
│ │ │ │ +
1964 const AggregatesMap<Vertex>& aggregates)
│ │ │ │ +
1965 : Counter(), connected_(connected), aggregates_(aggregates)
│ │ │ │ +
1966 {}
│ │ │ │ +
1967
│ │ │ │ +
1968
│ │ │ │ +
1969 template<class G>
│ │ │ │ + │ │ │ │ +
1971 {
│ │ │ │ +
1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() || aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED)
│ │ │ │ +
1973 // Would be a new connection
│ │ │ │ + │ │ │ │ +
1975 else{
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1978 }
│ │ │ │ +
1979 }
│ │ │ │ +
1980
│ │ │ │ +
1981 template<class G>
│ │ │ │ +
1982 inline double Aggregator<G>::connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
1983 {
│ │ │ │ +
1984 ConnectivityCounter counter(connected_, aggregates);
│ │ │ │ +
1985 double noNeighbours=visitNeighbours(*graph_, vertex, counter);
│ │ │ │ +
1986 return (double)counter.value()/noNeighbours;
│ │ │ │ +
1987 }
│ │ │ │ +
1988
│ │ │ │ +
1989 template<class G>
│ │ │ │ + │ │ │ │ +
1991 : Counter()
│ │ │ │ +
1992 {}
│ │ │ │ +
1993
│ │ │ │ +
1994 template<class G>
│ │ │ │ + │ │ │ │ +
1996 {
│ │ │ │ +
1997 if(edge.properties().depends())
│ │ │ │ + │ │ │ │ +
1999 if(edge.properties().influences())
│ │ │ │ + │ │ │ │ +
2001 }
│ │ │ │ +
2002
│ │ │ │ +
2003 template<class G>
│ │ │ │ +
2004 int Aggregator<G>::unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2005 {
│ │ │ │ +
2006 return aggregateNeighbours(vertex, AggregatesMap<Vertex>::UNAGGREGATED, aggregates);
│ │ │ │ +
2007 }
│ │ │ │ +
2008
│ │ │ │ +
2009 template<class G>
│ │ │ │ +
2010 std::pair<int,int> Aggregator<G>::neighbours(const Vertex& vertex,
│ │ │ │ +
2011 const AggregateDescriptor& aggregate,
│ │ │ │ +
2012 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2013 {
│ │ │ │ +
2014 DependencyCounter unused, aggregated;
│ │ │ │ +
2015 typedef AggregateVisitor<DependencyCounter> CounterT;
│ │ │ │ +
2016 typedef std::tuple<CounterT,CounterT> CounterTuple;
│ │ │ │ +
2017 CombinedFunctor<CounterTuple> visitors(CounterTuple(CounterT(aggregates, AggregatesMap<Vertex>::UNAGGREGATED, unused), CounterT(aggregates, aggregate, aggregated)));
│ │ │ │ +
2018 visitNeighbours(*graph_, vertex, visitors);
│ │ │ │ +
2019 return std::make_pair(unused.value(), aggregated.value());
│ │ │ │ +
2020 }
│ │ │ │ +
2021
│ │ │ │ +
2022
│ │ │ │ +
2023 template<class G>
│ │ │ │ +
2024 int Aggregator<G>::aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2025 {
│ │ │ │ +
2026 DependencyCounter counter;
│ │ │ │ +
2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
│ │ │ │ +
2028 return counter.value();
│ │ │ │ +
2029 }
│ │ │ │ +
2030
│ │ │ │ +
2031 template<class G>
│ │ │ │ +
2032 std::size_t Aggregator<G>::distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates)
│ │ │ │ +
2033 {
│ │ │ │ +
2034 return 0;
│ │ │ │ +
2035 typename PropertyMapTypeSelector<VertexVisitedTag,G>::Type visitedMap = get(VertexVisitedTag(), *graph_);
│ │ │ │ +
2036 VertexList vlist;
│ │ │ │ +
2037 typename AggregatesMap<Vertex>::DummyEdgeVisitor dummy;
│ │ │ │ +
2038 return aggregates.template breadthFirstSearch<true,true>(vertex,
│ │ │ │ +
2039 aggregate_->id(), *graph_,
│ │ │ │ +
2040 vlist, dummy, dummy, visitedMap);
│ │ │ │ +
2041 }
│ │ │ │ +
2042
│ │ │ │ +
2043 template<class G>
│ │ │ │ +
2044 inline Aggregator<G>::FrontMarker::FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph)
│ │ │ │ +
2045 : front_(front), graph_(graph)
│ │ │ │ +
2046 {}
│ │ │ │ +
2047
│ │ │ │ +
2048 template<class G>
│ │ │ │ + │ │ │ │ +
2050 {
│ │ │ │ +
2051 Vertex target = edge.target();
│ │ │ │ +
2052
│ │ │ │ +
2053 if(!graph_.getVertexProperties(target).front()) {
│ │ │ │ +
2054 front_.push_back(target);
│ │ │ │ +
2055 graph_.getVertexProperties(target).setFront();
│ │ │ │ +
2056 }
│ │ │ │ +
2057 }
│ │ │ │ +
2058
│ │ │ │ +
2059 template<class G>
│ │ │ │ +
2060 inline bool Aggregator<G>::admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2061 {
│ │ │ │ +
2062 // Todo
│ │ │ │ +
2063 Dune::dvverb<<" Admissible not yet implemented!"<<std::endl;
│ │ │ │ +
2064 return true;
│ │ │ │ +
2065 //Situation 1: front node depends on two nodes. Then these
│ │ │ │ +
2066 // have to be strongly connected to each other
│ │ │ │ +
2067
│ │ │ │ +
2068 // Iterate over all all neighbours of front node
│ │ │ │ +
2069 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
│ │ │ │ +
2070 Iterator vend = graph_->endEdges(vertex);
│ │ │ │ +
2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
│ │ │ │ +
2072 // if(edge.properties().depends() && !edge.properties().influences()
│ │ │ │ +
2073 if(edge.properties().isStrong()
│ │ │ │ +
2074 && aggregates[edge.target()]==aggregate)
│ │ │ │ +
2075 {
│ │ │ │ +
2076 // Search for another link to the aggregate
│ │ │ │ +
2077 Iterator edge1 = edge;
│ │ │ │ +
2078 for(++edge1; edge1 != vend; ++edge1) {
│ │ │ │ +
2079 //if(edge1.properties().depends() && !edge1.properties().influences()
│ │ │ │ +
2080 if(edge1.properties().isStrong()
│ │ │ │ +
2081 && aggregates[edge.target()]==aggregate)
│ │ │ │ +
2082 {
│ │ │ │ +
2083 //Search for an edge connecting the two vertices that is
│ │ │ │ +
2084 //strong
│ │ │ │ +
2085 bool found=false;
│ │ │ │ +
2086 Iterator v2end = graph_->endEdges(edge.target());
│ │ │ │ +
2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end; ++edge2) {
│ │ │ │ +
2088 if(edge2.target()==edge1.target() &&
│ │ │ │ +
2089 edge2.properties().isStrong()) {
│ │ │ │ +
2090 found =true;
│ │ │ │ +
2091 break;
│ │ │ │ +
2092 }
│ │ │ │ +
2093 }
│ │ │ │ +
2094 if(found)
│ │ │ │ +
2095 {
│ │ │ │ +
2096 return true;
│ │ │ │ +
2097 }
│ │ │ │ +
2098 }
│ │ │ │ +
2099 }
│ │ │ │ +
2100 }
│ │ │ │ +
2101 }
│ │ │ │ +
2102
│ │ │ │ +
2103 // Situation 2: cluster node depends on front node and other cluster node
│ │ │ │ +
2105 vend = graph_->endEdges(vertex);
│ │ │ │ +
2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
│ │ │ │ +
2107 //if(!edge.properties().depends() && edge.properties().influences()
│ │ │ │ +
2108 if(edge.properties().isStrong()
│ │ │ │ +
2109 && aggregates[edge.target()]==aggregate)
│ │ │ │ +
2110 {
│ │ │ │ +
2111 // Search for a link from target that stays within the aggregate
│ │ │ │ +
2112 Iterator v1end = graph_->endEdges(edge.target());
│ │ │ │ +
2113
│ │ │ │ +
2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end; ++edge1) {
│ │ │ │ +
2115 //if(edge1.properties().depends() && !edge1.properties().influences()
│ │ │ │ +
2116 if(edge1.properties().isStrong()
│ │ │ │ +
2117 && aggregates[edge1.target()]==aggregate)
│ │ │ │ +
2118 {
│ │ │ │ +
2119 bool found=false;
│ │ │ │ +
2120 // Check if front node is also connected to this one
│ │ │ │ +
2121 Iterator v2end = graph_->endEdges(vertex);
│ │ │ │ +
2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2) {
│ │ │ │ +
2123 if(edge2.target()==edge1.target()) {
│ │ │ │ +
2124 if(edge2.properties().isStrong())
│ │ │ │ +
2125 found=true;
│ │ │ │ +
2126 break;
│ │ │ │ +
2127 }
│ │ │ │ +
2128 }
│ │ │ │ +
2129 if(found)
│ │ │ │ +
2130 {
│ │ │ │ +
2131 return true;
│ │ │ │ +
2132 }
│ │ │ │ +
2133 }
│ │ │ │ +
2134 }
│ │ │ │ +
2135 }
│ │ │ │ +
2136 }
│ │ │ │ +
2137 return false;
│ │ │ │ +
2138 }
│ │ │ │ +
2139
│ │ │ │ +
2140 template<class G>
│ │ │ │ +
2141 void Aggregator<G>::unmarkFront()
│ │ │ │ +
2142 {
│ │ │ │ +
2143 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ +
2144
│ │ │ │ +
2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex)
│ │ │ │ +
2146 graph_->getVertexProperties(*vertex).resetFront();
│ │ │ │ +
2147
│ │ │ │ +
2148 front_.clear();
│ │ │ │ +
2149 }
│ │ │ │ +
2150
│ │ │ │ +
2151 template<class G>
│ │ │ │ +
2152 inline void
│ │ │ │ +
2153 Aggregator<G>::nonisoNeighbourAggregate(const Vertex& vertex,
│ │ │ │ +
2154 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
2155 SLList<Vertex>& neighbours) const
│ │ │ │ +
2156 {
│ │ │ │ +
2157 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
│ │ │ │ +
2158 Iterator end=graph_->beginEdges(vertex);
│ │ │ │ +
2159 neighbours.clear();
│ │ │ │ +
2160
│ │ │ │ +
2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge)
│ │ │ │ +
2162 {
│ │ │ │ +
2163 if(aggregates[edge.target()]!=AggregatesMap<Vertex>::UNAGGREGATED && graph_->getVertexProperties(edge.target()).isolated())
│ │ │ │ +
2164 neighbours.push_back(aggregates[edge.target()]);
│ │ │ │ +
2165 }
│ │ │ │ +
2166 }
│ │ │ │ +
2167
│ │ │ │ +
2168 template<class G>
│ │ │ │ +
2169 inline typename G::VertexDescriptor Aggregator<G>::mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2170 {
│ │ │ │ +
2171 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
│ │ │ │ +
2172
│ │ │ │ +
2173 Iterator end = graph_->endEdges(vertex);
│ │ │ │ +
2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) {
│ │ │ │ +
2175 if(aggregates[edge.target()] != AggregatesMap<Vertex>::UNAGGREGATED &&
│ │ │ │ +
2176 graph_->getVertexProperties(edge.target()).isolated() == graph_->getVertexProperties(edge.source()).isolated()) {
│ │ │ │ +
2177 if( graph_->getVertexProperties(vertex).isolated() ||
│ │ │ │ +
2178 ((edge.properties().depends() || edge.properties().influences())
│ │ │ │ +
2179 && admissible(vertex, aggregates[edge.target()], aggregates)))
│ │ │ │ +
2180 return edge.target();
│ │ │ │ +
2181 }
│ │ │ │ +
2182 }
│ │ │ │ +
2183 return AggregatesMap<Vertex>::UNAGGREGATED;
│ │ │ │ +
2184 }
│ │ │ │ +
2185
│ │ │ │ +
2186 template<class G>
│ │ │ │ + │ │ │ │ +
2188 : Counter(), graph_(graph)
│ │ │ │ +
2189 {}
│ │ │ │ +
2190
│ │ │ │ +
2191 template<class G>
│ │ │ │ + │ │ │ │ +
2193 {
│ │ │ │ +
2194 if(graph_.getVertexProperties(edge.target()).front())
│ │ │ │ + │ │ │ │ +
2196 }
│ │ │ │ +
2197
│ │ │ │ +
2198 template<class G>
│ │ │ │ +
2199 int Aggregator<G>::noFrontNeighbours(const Vertex& vertex) const
│ │ │ │ +
2200 {
│ │ │ │ +
2201 FrontNeighbourCounter counter(*graph_);
│ │ │ │ +
2202 visitNeighbours(*graph_, vertex, counter);
│ │ │ │ +
2203 return counter.value();
│ │ │ │ +
2204 }
│ │ │ │ +
2205 template<class G>
│ │ │ │ +
2206 inline bool Aggregator<G>::connected(const Vertex& vertex,
│ │ │ │ +
2207 const AggregateDescriptor& aggregate,
│ │ │ │ +
2208 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2209 {
│ │ │ │ +
2210 typedef typename G::ConstEdgeIterator iterator;
│ │ │ │ +
2211 const iterator end = graph_->endEdges(vertex);
│ │ │ │ +
2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge)
│ │ │ │ +
2213 if(aggregates[edge.target()]==aggregate)
│ │ │ │ +
2214 return true;
│ │ │ │ +
2215 return false;
│ │ │ │ +
2216 }
│ │ │ │ +
2217 template<class G>
│ │ │ │ +
2218 inline bool Aggregator<G>::connected(const Vertex& vertex,
│ │ │ │ +
2219 const SLList<AggregateDescriptor>& aggregateList,
│ │ │ │ +
2220 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ +
2221 {
│ │ │ │ +
2222 typedef typename SLList<AggregateDescriptor>::const_iterator Iter;
│ │ │ │ +
2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i)
│ │ │ │ +
2224 if(connected(vertex, *i, aggregates))
│ │ │ │ +
2225 return true;
│ │ │ │ +
2226 return false;
│ │ │ │ +
2227 }
│ │ │ │ +
2228
│ │ │ │ +
2229 template<class G>
│ │ │ │ +
2230 template<class C>
│ │ │ │ +
2231 void Aggregator<G>::growIsolatedAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
│ │ │ │ +
2232 {
│ │ │ │ +
2233 SLList<Vertex> connectedAggregates;
│ │ │ │ +
2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates);
│ │ │ │ +
2235
│ │ │ │ +
2236 while(aggregate_->size()< c.minAggregateSize() && aggregate_->connectSize() < c.maxConnectivity()) {
│ │ │ │ +
2237 double maxCon=-1;
│ │ │ │ +
2238 std::size_t maxFrontNeighbours=0;
│ │ │ │ +
2239
│ │ │ │ +
2240 Vertex candidate=AggregatesMap<Vertex>::UNAGGREGATED;
│ │ │ │ +
2241
│ │ │ │ +
2242 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ +
2243
│ │ │ │ +
2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
│ │ │ │ +
2245 if(distance(*vertex, aggregates)>c.maxDistance())
│ │ │ │ +
2246 continue; // distance of proposes aggregate too big
│ │ │ │ +
2247
│ │ │ │ +
2248 if(connectedAggregates.size()>0) {
│ │ │ │ +
2249 // there is already a neighbour cluster
│ │ │ │ +
2250 // front node must be connected to same neighbour cluster
│ │ │ │ +
2251
│ │ │ │ +
2252 if(!connected(*vertex, connectedAggregates, aggregates))
│ │ │ │ +
2253 continue;
│ │ │ │ +
2254 }
│ │ │ │ +
2255
│ │ │ │ +
2256 double con = connectivity(*vertex, aggregates);
│ │ │ │ +
2257
│ │ │ │ +
2258 if(con == maxCon) {
│ │ │ │ +
2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2260
│ │ │ │ +
2261 if(frontNeighbours >= maxFrontNeighbours) {
│ │ │ │ +
2262 maxFrontNeighbours = frontNeighbours;
│ │ │ │ +
2263 candidate = *vertex;
│ │ │ │ +
2264 }
│ │ │ │ +
2265 }else if(con > maxCon) {
│ │ │ │ +
2266 maxCon = con;
│ │ │ │ +
2267 maxFrontNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2268 candidate = *vertex;
│ │ │ │ +
2269 }
│ │ │ │ +
2270 }
│ │ │ │ +
2271
│ │ │ │ +
2272 if(candidate==AggregatesMap<Vertex>::UNAGGREGATED)
│ │ │ │ +
2273 break;
│ │ │ │ +
2274
│ │ │ │ +
2275 aggregate_->add(candidate);
│ │ │ │ +
2276 }
│ │ │ │ +
2277 }
│ │ │ │ +
2278
│ │ │ │ +
2279 template<class G>
│ │ │ │ +
2280 template<class C>
│ │ │ │ +
2281 void Aggregator<G>::growAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
│ │ │ │ +
2282 {
│ │ │ │ +
2283 using std::min;
│ │ │ │ +
2284
│ │ │ │ +
2285 std::size_t distance_ =0;
│ │ │ │ +
2286 while(aggregate_->size() < c.minAggregateSize()&& distance_<c.maxDistance()) {
│ │ │ │ +
2287 int maxTwoCons=0, maxOneCons=0, maxNeighbours=-1;
│ │ │ │ +
2288 double maxCon=-1;
│ │ │ │ +
2289
│ │ │ │ +
2290 std::vector<Vertex> candidates;
│ │ │ │ +
2291 candidates.reserve(30);
│ │ │ │ +
2292
│ │ │ │ +
2293 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ +
2294
│ │ │ │ +
2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
│ │ │ │ +
2296 // Only nonisolated nodes are considered
│ │ │ │ +
2297 if(graph_->getVertexProperties(*vertex).isolated())
│ │ │ │ +
2298 continue;
│ │ │ │ +
2299
│ │ │ │ +
2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->id(), aggregates);
│ │ │ │ +
2301
│ │ │ │ +
2302 /* The case of two way connections. */
│ │ │ │ +
2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) {
│ │ │ │ +
2304 double con = connectivity(*vertex, aggregates);
│ │ │ │ +
2305
│ │ │ │ +
2306 if(con == maxCon) {
│ │ │ │ +
2307 int neighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2308
│ │ │ │ +
2309 if(neighbours > maxNeighbours) {
│ │ │ │ +
2310 maxNeighbours = neighbours;
│ │ │ │ +
2311 candidates.clear();
│ │ │ │ +
2312 candidates.push_back(*vertex);
│ │ │ │ +
2313 }else{
│ │ │ │ +
2314 candidates.push_back(*vertex);
│ │ │ │ +
2315 }
│ │ │ │ +
2316 }else if( con > maxCon) {
│ │ │ │ +
2317 maxCon = con;
│ │ │ │ +
2318 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2319 candidates.clear();
│ │ │ │ +
2320 candidates.push_back(*vertex);
│ │ │ │ +
2321 }
│ │ │ │ +
2322 }else if(twoWayCons > maxTwoCons) {
│ │ │ │ +
2323 maxTwoCons = twoWayCons;
│ │ │ │ +
2324 maxCon = connectivity(*vertex, aggregates);
│ │ │ │ +
2325 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2326 candidates.clear();
│ │ │ │ +
2327 candidates.push_back(*vertex);
│ │ │ │ +
2328
│ │ │ │ +
2329 // two way connections precede
│ │ │ │ +
2330 maxOneCons = std::numeric_limits<int>::max();
│ │ │ │ +
2331 }
│ │ │ │ +
2332
│ │ │ │ +
2333 if(twoWayCons > 0)
│ │ │ │ +
2334 {
│ │ │ │ +
2335 continue; // THis is a two-way node, skip tests for one way nodes
│ │ │ │ +
2336 }
│ │ │ │ +
2337
│ │ │ │ +
2338 /* The one way case */
│ │ │ │ +
2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->id(), aggregates);
│ │ │ │ +
2340
│ │ │ │ +
2341 if(oneWayCons==0)
│ │ │ │ +
2342 continue; // No strong connections, skip the tests.
│ │ │ │ +
2343
│ │ │ │ +
2344 if(!admissible(*vertex, aggregate_->id(), aggregates))
│ │ │ │ +
2345 continue;
│ │ │ │ +
2346
│ │ │ │ +
2347 if( maxOneCons == oneWayCons && oneWayCons > 0) {
│ │ │ │ +
2348 double con = connectivity(*vertex, aggregates);
│ │ │ │ +
2349
│ │ │ │ +
2350 if(con == maxCon) {
│ │ │ │ +
2351 int neighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2352
│ │ │ │ +
2353 if(neighbours > maxNeighbours) {
│ │ │ │ +
2354 maxNeighbours = neighbours;
│ │ │ │ +
2355 candidates.clear();
│ │ │ │ +
2356 candidates.push_back(*vertex);
│ │ │ │ +
2357 }else{
│ │ │ │ +
2358 if(neighbours==maxNeighbours)
│ │ │ │ +
2359 {
│ │ │ │ +
2360 candidates.push_back(*vertex);
│ │ │ │ +
2361 }
│ │ │ │ +
2362 }
│ │ │ │ +
2363 }else if( con > maxCon) {
│ │ │ │ +
2364 maxCon = con;
│ │ │ │ +
2365 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2366 candidates.clear();
│ │ │ │ +
2367 candidates.push_back(*vertex);
│ │ │ │ +
2368 }
│ │ │ │ +
2369 }else if(oneWayCons > maxOneCons) {
│ │ │ │ +
2370 maxOneCons = oneWayCons;
│ │ │ │ +
2371 maxCon = connectivity(*vertex, aggregates);
│ │ │ │ +
2372 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ +
2373 candidates.clear();
│ │ │ │ +
2374 candidates.push_back(*vertex);
│ │ │ │ +
2375 }
│ │ │ │ +
2376 }
│ │ │ │ +
2377
│ │ │ │ +
2378
│ │ │ │ +
2379 if(!candidates.size())
│ │ │ │ +
2380 break; // No more candidates found
│ │ │ │ +
2381 distance_=distance(seed, aggregates);
│ │ │ │ +
2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
│ │ │ │ +
2383 aggregate_->size()));
│ │ │ │ +
2384 aggregate_->add(candidates);
│ │ │ │ +
2385 }
│ │ │ │ +
2386 }
│ │ │ │ +
2387
│ │ │ │ +
2388 template<typename V>
│ │ │ │ +
2389 template<typename M, typename G, typename C>
│ │ │ │ +
2390 std::tuple<int,int,int,int> AggregatesMap<V>::buildAggregates(const M& matrix, G& graph, const C& criterion,
│ │ │ │ +
2391 bool finestLevel)
│ │ │ │ +
2392 {
│ │ │ │ +
2393 Aggregator<G> aggregator;
│ │ │ │ +
2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel);
│ │ │ │ +
2395 }
│ │ │ │ +
2396
│ │ │ │ +
2397 template<class G>
│ │ │ │ +
2398 template<class M, class C>
│ │ │ │ +
2399 std::tuple<int,int,int,int> Aggregator<G>::build(const M& m, G& graph, AggregatesMap<Vertex>& aggregates, const C& c,
│ │ │ │ +
2400 bool finestLevel)
│ │ │ │ +
2401 {
│ │ │ │ +
2402 using std::max;
│ │ │ │ +
2403 using std::min;
│ │ │ │ +
2404 // Stack for fast vertex access
│ │ │ │ +
2405 Stack stack_(graph, *this, aggregates);
│ │ │ │ +
2406
│ │ │ │ +
2407 graph_ = &graph;
│ │ │ │ +
2408
│ │ │ │ +
2409 aggregate_ = new Aggregate<G,VertexSet>(graph, aggregates, connected_, front_);
│ │ │ │ +
2410
│ │ │ │ +
2411 Timer watch;
│ │ │ │ +
2412 watch.reset();
│ │ │ │ +
2413
│ │ │ │ +
2414 buildDependency(graph, m, c, finestLevel);
│ │ │ │ +
2415
│ │ │ │ +
2416 dverb<<"Build dependency took "<< watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
2417 int noAggregates, conAggregates, isoAggregates, oneAggregates;
│ │ │ │ +
2418 std::size_t maxA=0, minA=1000000, avg=0;
│ │ │ │ +
2419 int skippedAggregates;
│ │ │ │ +
2420 noAggregates = conAggregates = isoAggregates = oneAggregates =
│ │ │ │ +
2421 skippedAggregates = 0;
│ │ │ │ +
2422
│ │ │ │ +
2423 while(true) {
│ │ │ │ +
2424 Vertex seed = stack_.pop();
│ │ │ │ +
2425
│ │ │ │ +
2426 if(seed == Stack::NullEntry)
│ │ │ │ +
2427 // No more unaggregated vertices. We are finished!
│ │ │ │ +
2428 break;
│ │ │ │ +
2429
│ │ │ │ +
2430 // Debugging output
│ │ │ │ +
2431 if((noAggregates+1)%10000 == 0)
│ │ │ │ +
2432 Dune::dverb<<"c";
│ │ │ │ +
2433 unmarkFront();
│ │ │ │ +
2434
│ │ │ │ +
2435 if(graph.getVertexProperties(seed).excludedBorder()) {
│ │ │ │ +
2436 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
│ │ │ │ +
2437 ++skippedAggregates;
│ │ │ │ +
2438 continue;
│ │ │ │ +
2439 }
│ │ │ │ +
2440
│ │ │ │ +
2441 if(graph.getVertexProperties(seed).isolated()) {
│ │ │ │ +
2442 if(c.skipIsolated()) {
│ │ │ │ +
2443 // isolated vertices are not aggregated but skipped on the coarser levels.
│ │ │ │ +
2444 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
│ │ │ │ +
2445 ++skippedAggregates;
│ │ │ │ +
2446 // skip rest as no agglomeration is done.
│ │ │ │ +
2447 continue;
│ │ │ │ +
2448 }else{
│ │ │ │ +
2449 aggregate_->seed(seed);
│ │ │ │ +
2450 growIsolatedAggregate(seed, aggregates, c);
│ │ │ │ +
2451 }
│ │ │ │ +
2452 }else{
│ │ │ │ +
2453 aggregate_->seed(seed);
│ │ │ │ +
2454 growAggregate(seed, aggregates, c);
│ │ │ │ +
2455 }
│ │ │ │ +
2456
│ │ │ │ +
2457 /* The rounding step. */
│ │ │ │ +
2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->size() < c.maxAggregateSize()) {
│ │ │ │ +
2459
│ │ │ │ +
2460 std::vector<Vertex> candidates;
│ │ │ │ +
2461 candidates.reserve(30);
│ │ │ │ +
2462
│ │ │ │ +
2463 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ +
2464
│ │ │ │ +
2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
│ │ │ │ +
2466
│ │ │ │ +
2467 if(graph.getVertexProperties(*vertex).isolated())
│ │ │ │ +
2468 continue; // No isolated nodes here
│ │ │ │ +
2469
│ │ │ │ +
2470 if(twoWayConnections( *vertex, aggregate_->id(), aggregates) == 0 &&
│ │ │ │ +
2471 (oneWayConnections( *vertex, aggregate_->id(), aggregates) == 0 ||
│ │ │ │ +
2472 !admissible( *vertex, aggregate_->id(), aggregates) ))
│ │ │ │ +
2473 continue;
│ │ │ │ +
2474
│ │ │ │ +
2475 std::pair<int,int> neighbourPair=neighbours(*vertex, aggregate_->id(),
│ │ │ │ +
2476 aggregates);
│ │ │ │ +
2477
│ │ │ │ +
2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <= unusedNeighbours(*vertex, aggregates))
│ │ │ │ +
2479 // continue;
│ │ │ │ +
2480
│ │ │ │ +
2481 if(neighbourPair.first >= neighbourPair.second)
│ │ │ │ +
2482 continue;
│ │ │ │ +
2483
│ │ │ │ +
2484 if(distance(*vertex, aggregates) > c.maxDistance())
│ │ │ │ +
2485 continue; // Distance too far
│ │ │ │ +
2486 candidates.push_back(*vertex);
│ │ │ │ +
2487 break;
│ │ │ │ +
2488 }
│ │ │ │ +
2489
│ │ │ │ +
2490 if(!candidates.size()) break; // no more candidates found.
│ │ │ │ +
2491
│ │ │ │ +
2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
│ │ │ │ +
2493 aggregate_->size()));
│ │ │ │ +
2494 aggregate_->add(candidates);
│ │ │ │ +
2495
│ │ │ │ +
2496 }
│ │ │ │ +
2497
│ │ │ │ +
2498 // try to merge aggregates consisting of only one nonisolated vertex with other aggregates
│ │ │ │ +
2499 if(aggregate_->size()==1 && c.maxAggregateSize()>1) {
│ │ │ │ +
2500 if(!graph.getVertexProperties(seed).isolated()) {
│ │ │ │ +
2501 Vertex mergedNeighbour = mergeNeighbour(seed, aggregates);
│ │ │ │ +
2502
│ │ │ │ +
2503 if(mergedNeighbour != AggregatesMap<Vertex>::UNAGGREGATED) {
│ │ │ │ +
2504 // assign vertex to the neighbouring cluster
│ │ │ │ +
2505 aggregates[seed] = aggregates[mergedNeighbour];
│ │ │ │ +
2506 aggregate_->invalidate();
│ │ │ │ +
2507 }else{
│ │ │ │ +
2508 ++avg;
│ │ │ │ +
2509 minA=min(minA,static_cast<std::size_t>(1));
│ │ │ │ +
2510 maxA=max(maxA,static_cast<std::size_t>(1));
│ │ │ │ +
2511 ++oneAggregates;
│ │ │ │ +
2512 ++conAggregates;
│ │ │ │ +
2513 }
│ │ │ │ +
2514 }else{
│ │ │ │ +
2515 ++avg;
│ │ │ │ +
2516 minA=min(minA,static_cast<std::size_t>(1));
│ │ │ │ +
2517 maxA=max(maxA,static_cast<std::size_t>(1));
│ │ │ │ +
2518 ++oneAggregates;
│ │ │ │ +
2519 ++isoAggregates;
│ │ │ │ +
2520 }
│ │ │ │ +
2521 ++avg;
│ │ │ │ +
2522 }else{
│ │ │ │ +
2523 avg+=aggregate_->size();
│ │ │ │ +
2524 minA=min(minA,aggregate_->size());
│ │ │ │ +
2525 maxA=max(maxA,aggregate_->size());
│ │ │ │ +
2526 if(graph.getVertexProperties(seed).isolated())
│ │ │ │ +
2527 ++isoAggregates;
│ │ │ │ +
2528 else
│ │ │ │ +
2529 ++conAggregates;
│ │ │ │ +
2530 }
│ │ │ │ +
2531
│ │ │ │ +
2532 }
│ │ │ │ +
2533
│ │ │ │ +
2534 Dune::dinfo<<"connected aggregates: "<<conAggregates;
│ │ │ │ +
2535 Dune::dinfo<<" isolated aggregates: "<<isoAggregates;
│ │ │ │ +
2536 if(conAggregates+isoAggregates>0)
│ │ │ │ +
2537 Dune::dinfo<<" one node aggregates: "<<oneAggregates<<" min size="
│ │ │ │ +
2538 <<minA<<" max size="<<maxA
│ │ │ │ +
2539 <<" avg="<<avg/(conAggregates+isoAggregates)<<std::endl;
│ │ │ │ +
2540
│ │ │ │ +
2541 delete aggregate_;
│ │ │ │ +
2542 return std::make_tuple(conAggregates+isoAggregates,isoAggregates,
│ │ │ │ +
2543 oneAggregates,skippedAggregates);
│ │ │ │ +
2544 }
│ │ │ │ +
2545
│ │ │ │ +
2546
│ │ │ │ +
2547 template<class G>
│ │ │ │ +
2548 Aggregator<G>::Stack::Stack(const MatrixGraph& graph, const Aggregator<G>& aggregatesBuilder,
│ │ │ │ +
2549 const AggregatesMap<Vertex>& aggregates)
│ │ │ │ +
2550 : graph_(graph), aggregatesBuilder_(aggregatesBuilder), aggregates_(aggregates), begin_(graph.begin()), end_(graph.end())
│ │ │ │ +
2551 {
│ │ │ │ +
2552 //vals_ = new Vertex[N];
│ │ │ │ +
2553 }
│ │ │ │ +
2554
│ │ │ │ +
2555 template<class G>
│ │ │ │ + │ │ │ │ +
2557 {
│ │ │ │ +
2558 //Dune::dverb << "Max stack size was "<<maxSize_<<" filled="<<filled_<<std::endl;
│ │ │ │ +
2559 //delete[] vals_;
│ │ │ │ +
2560 }
│ │ │ │ +
2561
│ │ │ │ +
2562 template<class G>
│ │ │ │ + │ │ │ │ +
2564 = std::numeric_limits<typename G::VertexDescriptor>::max();
│ │ │ │ +
2565
│ │ │ │ +
2566 template<class G>
│ │ │ │ +
2567 inline typename G::VertexDescriptor Aggregator<G>::Stack::pop()
│ │ │ │ +
2568 {
│ │ │ │ +
2569 for(; begin_!=end_ && aggregates_[*begin_] != AggregatesMap<Vertex>::UNAGGREGATED; ++begin_) ;
│ │ │ │ +
2570
│ │ │ │ +
2571 if(begin_!=end_)
│ │ │ │ +
2572 {
│ │ │ │ +
2573 typename G::VertexDescriptor current=*begin_;
│ │ │ │ +
2574 ++begin_;
│ │ │ │ +
2575 return current;
│ │ │ │ +
2576 }else
│ │ │ │ +
2577 return NullEntry;
│ │ │ │ +
2578 }
│ │ │ │ +
2579
│ │ │ │ +
2580#endif // DOXYGEN
│ │ │ │ +
2581
│ │ │ │ +
2582 template<class V>
│ │ │ │ +
│ │ │ │ +
2583 void printAggregates2d(const AggregatesMap<V>& aggregates, int n, int m, std::ostream& os)
│ │ │ │ +
2584 {
│ │ │ │ +
2585 using std::max;
│ │ │ │ +
2586
│ │ │ │ +
2587 std::ios_base::fmtflags oldOpts=os.flags();
│ │ │ │ +
2588
│ │ │ │ +
2589 os.setf(std::ios_base::right, std::ios_base::adjustfield);
│ │ │ │ +
2590
│ │ │ │ +
2591 V maxVal=0;
│ │ │ │ +
2592 int width=1;
│ │ │ │ +
2593
│ │ │ │ +
2594 for(int i=0; i< n*m; i++)
│ │ │ │ +
2595 maxVal=max(maxVal, aggregates[i]);
│ │ │ │ +
2596
│ │ │ │ +
2597 for(int i=10; i < 1000000; i*=10)
│ │ │ │ +
2598 if(maxVal/i>0)
│ │ │ │ +
2599 width++;
│ │ │ │ +
2600 else
│ │ │ │ +
2601 break;
│ │ │ │ +
2602
│ │ │ │ +
2603 for(int j=0, entry=0; j < m; j++) {
│ │ │ │ +
2604 for(int i=0; i<n; i++, entry++) {
│ │ │ │ +
2605 os.width(width);
│ │ │ │ +
2606 os<<aggregates[entry]<<" ";
│ │ │ │ +
2607 }
│ │ │ │ +
2608
│ │ │ │ +
2609 os<<std::endl;
│ │ │ │ +
2610 }
│ │ │ │ +
2611 os<<std::endl;
│ │ │ │ +
2612 os.flags(oldOpts);
│ │ │ │ +
2613 }
│ │ │ │ +
│ │ │ │ +
2614
│ │ │ │ +
2615
│ │ │ │ +
2616 } // namespace Amg
│ │ │ │ +
2617
│ │ │ │ +
2618} // namespace Dune
│ │ │ │ +
2619
│ │ │ │ +
2620
│ │ │ │ +
2621#endif
│ │ │ │ + │ │ │ │ +
Parameter classes for customizing AMG.
│ │ │ │ +
Provides classes for handling internal properties in a graph.
│ │ │ │ +
Provides classes for building the matrix graph.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix::ConstColIterator ColIter
Constant column iterator of the matrix.
Definition aggregates.hh:273
│ │ │ │ +
std::vector< real_type >::iterator valIter_
Definition aggregates.hh:189
│ │ │ │ +
Matrix::ConstColIterator ColIter
Constant column iterator of the matrix.
Definition aggregates.hh:154
│ │ │ │ +
std::size_t breadthFirstSearch(const VertexDescriptor &start, const AggregateDescriptor &aggregate, const G &graph, L &visited, F1 &aggregateVisitor, F2 &nonAggregateVisitor, VM &visitedMap) const
Breadth first search within an aggregate.
│ │ │ │ +
PoolAllocator< VertexDescriptor, 100 > Allocator
The allocator we use for our lists and the set.
Definition aggregates.hh:586
│ │ │ │ +
iterator begin()
Definition aggregates.hh:737
│ │ │ │ +
int id()
Get the id identifying the aggregate.
│ │ │ │ +
Norm norm_
The functor for calculating the norm.
Definition aggregates.hh:302
│ │ │ │ +
MatrixGraph::VertexDescriptor Vertex
The vertex identifier.
Definition aggregates.hh:920
│ │ │ │ +
AggregationCriterion()
Constructor.
Definition aggregates.hh:66
│ │ │ │ +
const Matrix * matrix_
The matrix we work on.
Definition aggregates.hh:357
│ │ │ │ +
auto operator()(const M &m, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr) const
Compute the norm of a scalar.
Definition aggregates.hh:406
│ │ │ │ +
void initRow(const Row &row, int index)
│ │ │ │ +
SymmetricMatrixDependency(const Parameters &parms)
Definition aggregates.hh:168
│ │ │ │ +
M Matrix
The matrix type we build the dependency of.
Definition aggregates.hh:258
│ │ │ │ + │ │ │ │ +
G MatrixGraph
The matrix graph type used.
Definition aggregates.hh:915
│ │ │ │ +
Norm norm_
The functor for calculating the norm.
Definition aggregates.hh:363
│ │ │ │ +
void operator()(const EdgeIterator &edge) const
Definition aggregates.hh:601
│ │ │ │ +
SymmetricCriterion()
Definition aggregates.hh:524
│ │ │ │ +
Dependency()
Definition aggregates.hh:290
│ │ │ │ +
void examine(const ColIter &col)
│ │ │ │ +
M Matrix
The matrix type we build the dependency of.
Definition aggregates.hh:319
│ │ │ │ +
real_type diagonal_
The norm of the current diagonal.
Definition aggregates.hh:187
│ │ │ │ +
N Norm
The norm to use for examining the matrix entries.
Definition aggregates.hh:263
│ │ │ │ +
iterator end()
Definition aggregates.hh:742
│ │ │ │ +
UnSymmetricCriterion(const Parameters &parms)
Definition aggregates.hh:541
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ +
void initRow(const Row &row, int index)
Definition aggregates.hh:201
│ │ │ │ + │ │ │ │ +
static const Vertex NullEntry
Definition aggregates.hh:1008
│ │ │ │ +
void examine(const ColIter &col)
Definition aggregates.hh:214
│ │ │ │ +
Dependency(const Parameters &parms)
Definition aggregates.hh:286
│ │ │ │ +
int row_
index of the currently evaluated row.
Definition aggregates.hh:185
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ +
std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap< Vertex > &aggregates, const C &c, bool finestLevel)
Build the aggregates.
│ │ │ │ +
FrontNeighbourCounter(const MatrixGraph &front)
Constructor.
│ │ │ │ +
Matrix::row_type Row
Constant Row iterator of the matrix.
Definition aggregates.hh:329
│ │ │ │ +
const Matrix * matrix_
The matrix we work on.
Definition aggregates.hh:296
│ │ │ │ +
const AggregateDescriptor & operator[](const VertexDescriptor &v) const
Get the aggregate a vertex belongs to.
│ │ │ │ +
void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
│ │ │ │ +
AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const AggregateDescriptor &aggregate, Visitor &visitor)
Constructor.
│ │ │ │ +
Matrix::ConstColIterator ColIter
Constant column iterator of the matrix.
Definition aggregates.hh:334
│ │ │ │ +
~AggregatesMap()
Destructor.
│ │ │ │ +
Matrix::field_type field_type
The current max value.
Definition aggregates.hh:179
│ │ │ │ +
void decrement()
Decrement counter.
│ │ │ │ +
Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet &connectivity, std::vector< Vertex > &front_)
Constructor.
│ │ │ │ +
V Visitor
The type of the adapted visitor.
Definition aggregates.hh:1064
│ │ │ │ +
std::size_t * SphereMap
Type of the mapping of aggregate members onto distance spheres.
Definition aggregates.hh:809
│ │ │ │ +
AggregationCriterion(const Parameters &parms)
Definition aggregates.hh:70
│ │ │ │ +
Matrix::row_type Row
Constant Row iterator of the matrix.
Definition aggregates.hh:268
│ │ │ │ +
VertexSet::size_type connectSize()
Get tne number of connections to other aggregates.
│ │ │ │ +
std::vector< real_type > vals_
Definition aggregates.hh:188
│ │ │ │ +
N Norm
The norm to use for examining the matrix entries.
Definition aggregates.hh:324
│ │ │ │ +
void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m, std::ostream &os)
Definition aggregates.hh:2583
│ │ │ │ +
void invalidate()
Definition aggregates.hh:822
│ │ │ │ +
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ +
real_type maxValue_
Definition aggregates.hh:181
│ │ │ │ +
Norm norm_
The functor for calculating the norm.
Definition aggregates.hh:183
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ +
VertexSet::const_iterator const_iterator
Const iterator over a vertex list.
Definition aggregates.hh:804
│ │ │ │ +
SymmetricCriterion(const Parameters &parms)
Definition aggregates.hh:521
│ │ │ │ +
MatrixGraph::VertexDescriptor AggregateDescriptor
The type of the aggregate descriptor.
Definition aggregates.hh:923
│ │ │ │ +
real_type maxValue_
Definition aggregates.hh:361
│ │ │ │ +
void init(const Matrix *matrix)
Definition aggregates.hh:195
│ │ │ │ +
real_type diagonal_
The norm of the current diagonal.
Definition aggregates.hh:367
│ │ │ │ +
AggregateDescriptor * iterator
Definition aggregates.hh:735
│ │ │ │ +
SymmetricDependency(const Parameters &parms)
Definition aggregates.hh:348
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
Definition aggregates.hh:360
│ │ │ │ +
~Aggregator()
Destructor.
│ │ │ │ +
void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
│ │ │ │ +
void add(const Vertex &vertex)
Add a vertex to the aggregate.
│ │ │ │ +
T DependencyPolicy
The policy for calculating the dependency graph.
Definition aggregates.hh:55
│ │ │ │ +
void add(std::vector< Vertex > &vertex)
│ │ │ │ +
void examine(const ColIter &col)
│ │ │ │ +
Aggregator()
Constructor.
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
Examine an edge.
│ │ │ │ +
FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph)
Constructor.
│ │ │ │ +
FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
compute the norm of a matrix.
Definition aggregates.hh:506
│ │ │ │ +
void init(const Matrix *matrix)
│ │ │ │ +
int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
Visit all neighbour vertices of a vertex in a graph.
│ │ │ │ +
void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an isotropic problem.
Definition aggregates.hh:82
│ │ │ │ +
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ +
V AggregateDescriptor
The aggregate descriptor type.
Definition aggregates.hh:580
│ │ │ │ +
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ +
int row_
index of the currently evaluated row.
Definition aggregates.hh:365
│ │ │ │ +
SymmetricMatrixDependency()
Definition aggregates.hh:171
│ │ │ │ + │ │ │ │ + │ │ │ │ +
real_type diagonal_
The norm of the current diagonal.
Definition aggregates.hh:306
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices.
│ │ │ │ +
void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an aisotropic problem.
Definition aggregates.hh:105
│ │ │ │ +
AggregatesMap(std::size_t noVertices)
Constructs with allocating memory.
│ │ │ │ +
Matrix::field_type field_type
The current max value.
Definition aggregates.hh:359
│ │ │ │ +
AggregateDescriptor & operator[](const VertexDescriptor &v)
Get the aggregate a vertex belongs to.
│ │ │ │ +
AggregatesMap()
Constructs without allocating memory.
│ │ │ │ +
int value()
Access the current count.
│ │ │ │ +
SLList< VertexDescriptor, Allocator > VertexList
The type of a single linked list of vertex descriptors.
Definition aggregates.hh:592
│ │ │ │ + │ │ │ │ +
ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex > &aggregates)
Constructor.
│ │ │ │ +
VertexSet::size_type size()
Get the size of the aggregate.
│ │ │ │ +
const_iterator end() const
get an iterator over the vertices of the aggregate.
│ │ │ │ +
void init(const Matrix *matrix)
│ │ │ │ +
UnSymmetricCriterion()
Definition aggregates.hh:544
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ +
const AggregateDescriptor * const_iterator
Definition aggregates.hh:723
│ │ │ │ +
int row_
index of the currently evaluated row.
Definition aggregates.hh:304
│ │ │ │ +
Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const AggregatesMap< Vertex > &aggregates)
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
Definition aggregates.hh:180
│ │ │ │ +
void initRow(const Row &row, int index)
│ │ │ │ +
M Matrix
The matrix type we build the dependency of.
Definition aggregates.hh:139
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
Definition aggregates.hh:299
│ │ │ │ +
const Matrix * matrix_
The matrix we work on.
Definition aggregates.hh:177
│ │ │ │ +
S VertexSet
The type of a single linked list of vertex descriptors.
Definition aggregates.hh:801
│ │ │ │ +
FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
compute the norm of a matrix.
Definition aggregates.hh:490
│ │ │ │ +
static const V UNAGGREGATED
Identifier of not yet aggregated vertices.
Definition aggregates.hh:566
│ │ │ │ +
std::size_t breadthFirstSearch(const VertexDescriptor &start, const AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM &visitedMap) const
Breadth first search within an aggregate.
│ │ │ │ +
Matrix::field_type field_type
The current max value.
Definition aggregates.hh:298
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ +
std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
Definition aggregates.hh:113
│ │ │ │ +
bool isIsolated()
Definition aggregates.hh:240
│ │ │ │ +
void allocate(std::size_t noVertices)
Allocate memory for holding the information.
│ │ │ │ +
N Norm
The norm to use for examining the matrix entries.
Definition aggregates.hh:144
│ │ │ │ +
FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
compute the norm of a matrix.
Definition aggregates.hh:473
│ │ │ │ +
void reconstruct(const Vertex &vertex)
Reconstruct the aggregat from an seed node.
│ │ │ │ +
const_iterator begin() const
get an iterator over the vertices of the aggregate.
│ │ │ │ +
FieldTraits< typenameM::field_type >::real_type operator()(const M &m, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr) const
compute the norm of a matrix.
Definition aggregates.hh:390
│ │ │ │ +
MatrixGraph::VertexDescriptor Vertex
The vertex descriptor type.
Definition aggregates.hh:789
│ │ │ │ +
void seed(const Vertex &vertex)
Initialize the aggregate with one vertex.
│ │ │ │ + │ │ │ │ +
SymmetricDependency()
Definition aggregates.hh:351
│ │ │ │ +
void clear()
Clear the aggregate.
│ │ │ │ +
void free()
Free the allocated memory.
│ │ │ │ +
void increment()
Increment counter.
│ │ │ │ +
void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
Build the dependency of the matrix graph.
│ │ │ │ +
V VertexDescriptor
The vertex descriptor type.
Definition aggregates.hh:575
│ │ │ │ +
real_type maxValue_
Definition aggregates.hh:300
│ │ │ │ +
std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
Build the aggregates.
│ │ │ │ +
Matrix::row_type Row
Constant Row iterator of the matrix.
Definition aggregates.hh:149
│ │ │ │ +
PoolAllocator< Vertex, 100 > Allocator
The allocator we use for our lists and the set.
Definition aggregates.hh:795
│ │ │ │ +
G MatrixGraph
Definition aggregates.hh:785
│ │ │ │ +
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ +
@ is_sign_preserving
Definition aggregates.hh:483
│ │ │ │ +
@ is_sign_preserving
Definition aggregates.hh:382
│ │ │ │ +
@ is_sign_preserving
Definition aggregates.hh:499
│ │ │ │ +
@ is_sign_preserving
Definition aggregates.hh:466
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Parameters needed to check whether a node depends on another.
Definition parameters.hh:31
│ │ │ │ -
Parameters needed for the aggregation process.
Definition parameters.hh:84
│ │ │ │ -
Parameters for the complete coarsening process.
Definition parameters.hh:258
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ +
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │ +
Base class of all aggregation criterions.
Definition aggregates.hh:49
│ │ │ │ +
Dependency policy for symmetric matrices.
Definition aggregates.hh:134
│ │ │ │ +
Dependency policy for symmetric matrices.
Definition aggregates.hh:253
│ │ │ │ +
Dependency policy for symmetric matrices.
Definition aggregates.hh:314
│ │ │ │ +
Norm that uses only the [N][N] entry of the block to determine couplings.
Definition aggregates.hh:379
│ │ │ │ +
Norm that uses only the [0][0] entry of the block to determine couplings.
Definition aggregates.hh:455
│ │ │ │ +
Functor using the row sum (infinity) norm to determine strong couplings.
Definition aggregates.hh:463
│ │ │ │ +
Definition aggregates.hh:480
│ │ │ │ +
Definition aggregates.hh:496
│ │ │ │ +
Criterion taking advantage of symmetric matrices.
Definition aggregates.hh:519
│ │ │ │ +
Criterion suitable for unsymmetric matrices.
Definition aggregates.hh:539
│ │ │ │ +
Class for building the aggregates.
Definition aggregates.hh:909
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
A Dummy visitor that does nothing for each visited edge.
Definition aggregates.hh:598
│ │ │ │ +
A class for temporarily storing the vertices of an aggregate in.
Definition aggregates.hh:778
│ │ │ │ +
M::size_type VertexDescriptor
The vertex descriptor.
Definition graph.hh:73
│ │ │ │ +
EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
The constant edge iterator type.
Definition graph.hh:298
│ │ │ │ +
Iterator over all edges starting from a vertex.
Definition graph.hh:95
│ │ │ │ +
The vertex iterator type of the graph.
Definition graph.hh:209
│ │ │ │
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,462 +1,2654 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -parameters.hh │ │ │ │ │ +aggregates.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_PARAMETERS_HH │ │ │ │ │ -6#define DUNE_AMG_PARAMETERS_HH │ │ │ │ │ +5#ifndef DUNE_AMG_AGGREGATES_HH │ │ │ │ │ +6#define DUNE_AMG_AGGREGATES_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10namespace _D_u_n_e │ │ │ │ │ -11{ │ │ │ │ │ -12 namespace Amg │ │ │ │ │ -13 { │ │ │ │ │ -_3_0 class _D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -31 { │ │ │ │ │ -32 public: │ │ │ │ │ -_3_4 _D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ -35 : alpha_(1.0/3.0), beta_(1.0E-5) │ │ │ │ │ -36 {} │ │ │ │ │ -37 │ │ │ │ │ -_4_2 void _s_e_t_B_e_t_a(double b) │ │ │ │ │ -43 { │ │ │ │ │ -44 beta_ = b; │ │ │ │ │ -45 } │ │ │ │ │ -46 │ │ │ │ │ -_5_2 double _b_e_t_a() const │ │ │ │ │ -53 { │ │ │ │ │ -54 return beta_; │ │ │ │ │ -55 } │ │ │ │ │ +8 │ │ │ │ │ +9#include "_p_a_r_a_m_e_t_e_r_s_._h_h" │ │ │ │ │ +10#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +11#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ +12#include "_c_o_m_b_i_n_e_d_f_u_n_c_t_o_r_._h_h" │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20 │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23#include │ │ │ │ │ +24#include │ │ │ │ │ +25#include │ │ │ │ │ +26#include │ │ │ │ │ +27#include │ │ │ │ │ +28 │ │ │ │ │ +29namespace _D_u_n_e │ │ │ │ │ +30{ │ │ │ │ │ +31 namespace Amg │ │ │ │ │ +32 { │ │ │ │ │ +33 │ │ │ │ │ +47 template │ │ │ │ │ +_4_8 class _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n : public T │ │ │ │ │ +49 { │ │ │ │ │ +50 │ │ │ │ │ +51 public: │ │ │ │ │ +_5_5 typedef T _D_e_p_e_n_d_e_n_c_y_P_o_l_i_c_y; │ │ │ │ │ 56 │ │ │ │ │ -_6_1 void _s_e_t_A_l_p_h_a(double a) │ │ │ │ │ -62 { │ │ │ │ │ -63 alpha_ = a; │ │ │ │ │ -64 } │ │ │ │ │ -65 │ │ │ │ │ -_7_0 double _a_l_p_h_a() const │ │ │ │ │ -71 { │ │ │ │ │ -72 return alpha_; │ │ │ │ │ -73 } │ │ │ │ │ -74 │ │ │ │ │ -75 private: │ │ │ │ │ -76 double alpha_, beta_; │ │ │ │ │ -77 }; │ │ │ │ │ -78 │ │ │ │ │ -_8_2 class _A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s : │ │ │ │ │ -83 public _D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -84 { │ │ │ │ │ -85 public: │ │ │ │ │ -_9_5 _A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ -96 : maxDistance_(2), minAggregateSize_(4), maxAggregateSize_(6), │ │ │ │ │ -97 connectivity_(15), skipiso_(false) │ │ │ │ │ -98 {} │ │ │ │ │ -99 │ │ │ │ │ -_1_0_9 void _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ -110 { │ │ │ │ │ -111 maxDistance_=diameter-1; │ │ │ │ │ -112 std::size_t csize=1; │ │ │ │ │ -113 │ │ │ │ │ -114 for(; dim>0; dim--) { │ │ │ │ │ -115 csize*=diameter; │ │ │ │ │ -116 maxDistance_+=diameter-1; │ │ │ │ │ -117 } │ │ │ │ │ -118 minAggregateSize_=csize; │ │ │ │ │ -119 maxAggregateSize_=static_cast(csize*1.5); │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -_1_3_2 void _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c(std::size_t dim,std::size_t diameter=2) │ │ │ │ │ -133 { │ │ │ │ │ -134 _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c(dim, diameter); │ │ │ │ │ -135 maxDistance_+=dim-1; │ │ │ │ │ -136 } │ │ │ │ │ -_1_4_4 std::size_t _m_a_x_D_i_s_t_a_n_c_e() const { return maxDistance_;} │ │ │ │ │ +_6_6 _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n() │ │ │ │ │ +67 : T() │ │ │ │ │ +68 {} │ │ │ │ │ +69 │ │ │ │ │ +_7_0 _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +71 : T(parms) │ │ │ │ │ +72 {} │ │ │ │ │ +_8_2 void _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ +83 { │ │ │ │ │ +84 this->setMaxDistance(diameter-1); │ │ │ │ │ +85 std::size_t csize=1; │ │ │ │ │ +86 │ │ │ │ │ +87 for(; dim>0; dim--) { │ │ │ │ │ +88 csize*=diameter; │ │ │ │ │ +89 this->setMaxDistance(this->maxDistance()+diameter-1); │ │ │ │ │ +90 } │ │ │ │ │ +91 this->setMinAggregateSize(csize); │ │ │ │ │ +92 this->setMaxAggregateSize(static_cast(csize*1.5)); │ │ │ │ │ +93 } │ │ │ │ │ +94 │ │ │ │ │ +_1_0_5 void _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c(std::size_t dim,std::size_t diameter=2) │ │ │ │ │ +106 { │ │ │ │ │ +107 _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c(dim, diameter); │ │ │ │ │ +108 this->setMaxDistance(this->maxDistance()+dim-1); │ │ │ │ │ +109 } │ │ │ │ │ +110 }; │ │ │ │ │ +111 │ │ │ │ │ +112 template │ │ │ │ │ +_1_1_3 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_<_T_>& │ │ │ │ │ +criterion) │ │ │ │ │ +114 { │ │ │ │ │ +115 os<<"{ maxdistance="< │ │ │ │ │ +_1_3_3 class _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y : public _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +134 { │ │ │ │ │ +135 public: │ │ │ │ │ +_1_3_9 typedef M _M_a_t_r_i_x; │ │ │ │ │ +140 │ │ │ │ │ +_1_4_4 typedef N _N_o_r_m; │ │ │ │ │ 145 │ │ │ │ │ -_1_5_4 void _s_e_t_M_a_x_D_i_s_t_a_n_c_e(std::size_t distance) { maxDistance_ = distance;} │ │ │ │ │ +_1_4_9 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _R_o_w; │ │ │ │ │ +150 │ │ │ │ │ +_1_5_4 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r; │ │ │ │ │ 155 │ │ │ │ │ -_1_6_1 bool _s_k_i_p_I_s_o_l_a_t_e_d() const │ │ │ │ │ -162 { │ │ │ │ │ -163 return skipiso_; │ │ │ │ │ -164 } │ │ │ │ │ -165 │ │ │ │ │ -_1_7_1 void _s_e_t_S_k_i_p_I_s_o_l_a_t_e_d(bool skip) │ │ │ │ │ -172 { │ │ │ │ │ -173 skipiso_=skip; │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -_1_8_0 std::size_t _m_i_n_A_g_g_r_e_g_a_t_e_S_i_z_e() const { return minAggregateSize_;} │ │ │ │ │ -181 │ │ │ │ │ -_1_8_8 void _s_e_t_M_i_n_A_g_g_r_e_g_a_t_e_S_i_z_e(std::size_t size){ minAggregateSize_=size;} │ │ │ │ │ -189 │ │ │ │ │ -_1_9_4 std::size_t _m_a_x_A_g_g_r_e_g_a_t_e_S_i_z_e() const { return maxAggregateSize_;} │ │ │ │ │ -195 │ │ │ │ │ -_2_0_2 void _s_e_t_M_a_x_A_g_g_r_e_g_a_t_e_S_i_z_e(std::size_t size){ maxAggregateSize_ = size;} │ │ │ │ │ -203 │ │ │ │ │ -_2_1_1 std::size_t _m_a_x_C_o_n_n_e_c_t_i_v_i_t_y() const { return connectivity_;} │ │ │ │ │ +156 void _i_n_i_t(const _M_a_t_r_i_x* matrix); │ │ │ │ │ +157 │ │ │ │ │ +158 void _i_n_i_t_R_o_w(const _R_o_w& row, int index); │ │ │ │ │ +159 │ │ │ │ │ +160 void _e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l); │ │ │ │ │ +161 │ │ │ │ │ +162 template │ │ │ │ │ +163 void _e_x_a_m_i_n_e(G& graph, const typename G::EdgeIterator& edge, const _C_o_l_I_t_e_r& │ │ │ │ │ +_c_o_l); │ │ │ │ │ +164 │ │ │ │ │ +165 bool _i_s_I_s_o_l_a_t_e_d(); │ │ │ │ │ +166 │ │ │ │ │ +167 │ │ │ │ │ +_1_6_8 _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +169 : _P_a_r_a_m_e_t_e_r_s(parms) │ │ │ │ │ +170 {} │ │ │ │ │ +_1_7_1 _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y() │ │ │ │ │ +172 : _P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ +173 {} │ │ │ │ │ +174 │ │ │ │ │ +175 protected: │ │ │ │ │ +_1_7_7 const _M_a_t_r_i_x* _m_a_t_r_i_x__; │ │ │ │ │ +_1_7_9 typedef typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_8_0 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +_1_8_1 _r_e_a_l___t_y_p_e _m_a_x_V_a_l_u_e__; │ │ │ │ │ +_1_8_3 _N_o_r_m _n_o_r_m__; │ │ │ │ │ +_1_8_5 int _r_o_w__; │ │ │ │ │ +_1_8_7 _r_e_a_l___t_y_p_e _d_i_a_g_o_n_a_l__; │ │ │ │ │ +_1_8_8 std::vector _v_a_l_s__; │ │ │ │ │ +_1_8_9 typename std::vector::iterator _v_a_l_I_t_e_r__; │ │ │ │ │ +190 │ │ │ │ │ +191 }; │ │ │ │ │ +192 │ │ │ │ │ +193 │ │ │ │ │ +194 template │ │ │ │ │ +_1_9_5 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t(const _M_a_t_r_i_x* matrix) │ │ │ │ │ +196 { │ │ │ │ │ +197 matrix_ = matrix; │ │ │ │ │ +198 } │ │ │ │ │ +199 │ │ │ │ │ +200 template │ │ │ │ │ +_2_0_1 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w(const _R_o_w& row, int │ │ │ │ │ +index) │ │ │ │ │ +202 { │ │ │ │ │ +203 using std::min; │ │ │ │ │ +204 vals_.assign(row.size(), 0.0); │ │ │ │ │ +205 assert(vals_.size()==row.size()); │ │ │ │ │ +206 valIter_=vals_.begin(); │ │ │ │ │ +207 │ │ │ │ │ +208 maxValue_ = min(- std::numeric_limits::max(), std:: │ │ │ │ │ +numeric_limits::min()); │ │ │ │ │ +209 diagonal_=norm_(row[index]); │ │ │ │ │ +210 row_ = index; │ │ │ │ │ +211 } │ │ │ │ │ 212 │ │ │ │ │ -_2_2_0 void _s_e_t_M_a_x_C_o_n_n_e_c_t_i_v_i_t_y(std::size_t connectivity){ connectivity_ = │ │ │ │ │ -connectivity;} │ │ │ │ │ -221 │ │ │ │ │ -222 private: │ │ │ │ │ -223 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_, │ │ │ │ │ -connectivity_; │ │ │ │ │ -224 bool skipiso_; │ │ │ │ │ -225 │ │ │ │ │ -226 }; │ │ │ │ │ +213 template │ │ │ │ │ +_2_1_4 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l) │ │ │ │ │ +215 { │ │ │ │ │ +216 using std::max; │ │ │ │ │ +217 // skip positive offdiagonals if norm preserves sign of them. │ │ │ │ │ +218 _r_e_a_l___t_y_p_e eij = norm_(*_c_o_l); │ │ │ │ │ +219 if(!N::is_sign_preserving || eij<0) // || eji<0) │ │ │ │ │ +220 { │ │ │ │ │ +221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](_c_o_l.index()) │ │ │ │ │ +[_c_o_l.index()]); │ │ │ │ │ +222 maxValue_ = max(maxValue_, *valIter_); │ │ │ │ │ +223 }else │ │ │ │ │ +224 *valIter_ =0; │ │ │ │ │ +225 ++valIter_; │ │ │ │ │ +226 } │ │ │ │ │ 227 │ │ │ │ │ -228 │ │ │ │ │ -_2_3_2 enum _A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e { │ │ │ │ │ -_2_3_8 _n_o_A_c_c_u = 0, │ │ │ │ │ -_2_4_4 _a_t_O_n_c_e_A_c_c_u=1, │ │ │ │ │ -248 _s_u_c_c_e_s_s_i_v_e_A_c_c_u=2 │ │ │ │ │ -_2_4_9 }; │ │ │ │ │ -250 │ │ │ │ │ -251 │ │ │ │ │ -252 │ │ │ │ │ -253 │ │ │ │ │ -_2_5_7 class _C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s : public _A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -258 { │ │ │ │ │ -259 public: │ │ │ │ │ -_2_6_3 void _s_e_t_M_a_x_L_e_v_e_l(int l) │ │ │ │ │ -264 { │ │ │ │ │ -265 maxLevel_ = l; │ │ │ │ │ -266 } │ │ │ │ │ -_2_7_0 int _m_a_x_L_e_v_e_l() const │ │ │ │ │ -271 { │ │ │ │ │ -272 return maxLevel_; │ │ │ │ │ -273 } │ │ │ │ │ +228 template │ │ │ │ │ +229 template │ │ │ │ │ +_2_3_0 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(G&, const typename G:: │ │ │ │ │ +EdgeIterator& edge, const _C_o_l_I_t_e_r&) │ │ │ │ │ +231 { │ │ │ │ │ +232 if(*valIter_ > alpha() * maxValue_) { │ │ │ │ │ +233 edge.properties().setDepends(); │ │ │ │ │ +234 edge.properties().setInfluences(); │ │ │ │ │ +235 } │ │ │ │ │ +236 ++valIter_; │ │ │ │ │ +237 } │ │ │ │ │ +238 │ │ │ │ │ +239 template │ │ │ │ │ +_2_4_0 inline bool _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_s_I_s_o_l_a_t_e_d() │ │ │ │ │ +241 { │ │ │ │ │ +242 if(diagonal_==0) │ │ │ │ │ +243 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r, "No diagonal entry for row "< │ │ │ │ │ +_2_5_2 class _D_e_p_e_n_d_e_n_c_y : public _P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +253 { │ │ │ │ │ +254 public: │ │ │ │ │ +_2_5_8 typedef M _M_a_t_r_i_x; │ │ │ │ │ +259 │ │ │ │ │ +_2_6_3 typedef N _N_o_r_m; │ │ │ │ │ +264 │ │ │ │ │ +_2_6_8 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _R_o_w; │ │ │ │ │ +269 │ │ │ │ │ +_2_7_3 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r; │ │ │ │ │ 274 │ │ │ │ │ -_2_7_8 void _s_e_t_C_o_a_r_s_e_n_T_a_r_g_e_t(int nodes) │ │ │ │ │ -279 { │ │ │ │ │ -280 coarsenTarget_ = nodes; │ │ │ │ │ -281 } │ │ │ │ │ -282 │ │ │ │ │ -_2_8_6 int _c_o_a_r_s_e_n_T_a_r_g_e_t() const │ │ │ │ │ -287 { │ │ │ │ │ -288 return coarsenTarget_; │ │ │ │ │ -289 } │ │ │ │ │ -290 │ │ │ │ │ -_2_9_6 void _s_e_t_M_i_n_C_o_a_r_s_e_n_R_a_t_e(double rate) │ │ │ │ │ -297 { │ │ │ │ │ -298 minCoarsenRate_ = rate; │ │ │ │ │ -299 } │ │ │ │ │ -300 │ │ │ │ │ -_3_0_4 double _m_i_n_C_o_a_r_s_e_n_R_a_t_e() const │ │ │ │ │ -305 { │ │ │ │ │ -306 return minCoarsenRate_; │ │ │ │ │ -307 } │ │ │ │ │ +_2_7_5 void _i_n_i_t(const _M_a_t_r_i_x* matrix); │ │ │ │ │ +276 │ │ │ │ │ +_2_7_7 void _i_n_i_t_R_o_w(const _R_o_w& row, int index); │ │ │ │ │ +278 │ │ │ │ │ +_2_7_9 void _e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l); │ │ │ │ │ +280 │ │ │ │ │ +281 template │ │ │ │ │ +_2_8_2 void _e_x_a_m_i_n_e(G& graph, const typename G::EdgeIterator& edge, const _C_o_l_I_t_e_r& │ │ │ │ │ +_c_o_l); │ │ │ │ │ +283 │ │ │ │ │ +_2_8_4 bool _i_s_I_s_o_l_a_t_e_d(); │ │ │ │ │ +285 │ │ │ │ │ +_2_8_6 _D_e_p_e_n_d_e_n_c_y(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +287 : _P_a_r_a_m_e_t_e_r_s(parms) │ │ │ │ │ +288 {} │ │ │ │ │ +289 │ │ │ │ │ +_2_9_0 _D_e_p_e_n_d_e_n_c_y() │ │ │ │ │ +291 : _P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ +292 {} │ │ │ │ │ +293 │ │ │ │ │ +294 protected: │ │ │ │ │ +_2_9_6 const _M_a_t_r_i_x* _m_a_t_r_i_x__; │ │ │ │ │ +_2_9_8 typedef typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_9_9 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +_3_0_0 _r_e_a_l___t_y_p_e _m_a_x_V_a_l_u_e__; │ │ │ │ │ +_3_0_2 _N_o_r_m _n_o_r_m__; │ │ │ │ │ +_3_0_4 int _r_o_w__; │ │ │ │ │ +_3_0_6 _r_e_a_l___t_y_p_e _d_i_a_g_o_n_a_l__; │ │ │ │ │ +307 }; │ │ │ │ │ 308 │ │ │ │ │ -_3_1_2 _A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e _a_c_c_u_m_u_l_a_t_e() const │ │ │ │ │ -313 { │ │ │ │ │ -314 return accumulate_; │ │ │ │ │ -315 } │ │ │ │ │ -_3_1_9 void _s_e_t_A_c_c_u_m_u_l_a_t_e(_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e accu) │ │ │ │ │ -320 { │ │ │ │ │ -321 accumulate_=accu; │ │ │ │ │ -322 } │ │ │ │ │ -323 │ │ │ │ │ -_3_2_4 void _s_e_t_A_c_c_u_m_u_l_a_t_e(bool accu){ │ │ │ │ │ -325 accumulate_=accu ? _s_u_c_c_e_s_s_i_v_e_A_c_c_u : _n_o_A_c_c_u; │ │ │ │ │ -326 } │ │ │ │ │ -_3_3_2 void _s_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r(double d) │ │ │ │ │ -333 { │ │ │ │ │ -334 dampingFactor_ = d; │ │ │ │ │ -335 } │ │ │ │ │ -336 │ │ │ │ │ -_3_4_2 double _g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r() const │ │ │ │ │ -343 { │ │ │ │ │ -344 return dampingFactor_; │ │ │ │ │ -345 } │ │ │ │ │ -_3_5_6 _C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s(int _m_a_x_L_e_v_e_l=100, int _c_o_a_r_s_e_n_T_a_r_g_e_t=1000, double │ │ │ │ │ -_m_i_n_C_o_a_r_s_e_n_R_a_t_e=1.2, │ │ │ │ │ -357 double prolongDamp=1.6, _A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e _a_c_c_u_m_u_l_a_t_e=_s_u_c_c_e_s_s_i_v_e_A_c_c_u) │ │ │ │ │ -358 : maxLevel_(_m_a_x_L_e_v_e_l), coarsenTarget_(_c_o_a_r_s_e_n_T_a_r_g_e_t), minCoarsenRate_ │ │ │ │ │ -(_m_i_n_C_o_a_r_s_e_n_R_a_t_e), │ │ │ │ │ -359 dampingFactor_(prolongDamp), accumulate_( _a_c_c_u_m_u_l_a_t_e) │ │ │ │ │ -360 {} │ │ │ │ │ -361 │ │ │ │ │ -362 private: │ │ │ │ │ -366 int maxLevel_; │ │ │ │ │ -370 int coarsenTarget_; │ │ │ │ │ -374 double minCoarsenRate_; │ │ │ │ │ -378 double dampingFactor_; │ │ │ │ │ -383 _A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e accumulate_; │ │ │ │ │ -384 }; │ │ │ │ │ -385 │ │ │ │ │ -_3_9_2 class _P_a_r_a_m_e_t_e_r_s : public _C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -393 { │ │ │ │ │ -394 public: │ │ │ │ │ -_4_0_1 void _s_e_t_D_e_b_u_g_L_e_v_e_l(int level) │ │ │ │ │ -402 { │ │ │ │ │ -403 debugLevel_ = level; │ │ │ │ │ -404 } │ │ │ │ │ -405 │ │ │ │ │ -_4_1_1 int _d_e_b_u_g_L_e_v_e_l() const │ │ │ │ │ -412 { │ │ │ │ │ -413 return debugLevel_; │ │ │ │ │ +312 template │ │ │ │ │ +_3_1_3 class _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y : public _P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +314 { │ │ │ │ │ +315 public: │ │ │ │ │ +_3_1_9 typedef M _M_a_t_r_i_x; │ │ │ │ │ +320 │ │ │ │ │ +_3_2_4 typedef N _N_o_r_m; │ │ │ │ │ +325 │ │ │ │ │ +_3_2_9 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _R_o_w; │ │ │ │ │ +330 │ │ │ │ │ +_3_3_4 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r; │ │ │ │ │ +335 │ │ │ │ │ +_3_3_6 void _i_n_i_t(const _M_a_t_r_i_x* matrix); │ │ │ │ │ +337 │ │ │ │ │ +_3_3_8 void _i_n_i_t_R_o_w(const _R_o_w& row, int index); │ │ │ │ │ +339 │ │ │ │ │ +_3_4_0 void _e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l); │ │ │ │ │ +341 │ │ │ │ │ +342 template │ │ │ │ │ +_3_4_3 void _e_x_a_m_i_n_e(G& graph, const typename G::EdgeIterator& edge, const _C_o_l_I_t_e_r& │ │ │ │ │ +_c_o_l); │ │ │ │ │ +344 │ │ │ │ │ +_3_4_5 bool _i_s_I_s_o_l_a_t_e_d(); │ │ │ │ │ +346 │ │ │ │ │ +347 │ │ │ │ │ +_3_4_8 _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +349 : _P_a_r_a_m_e_t_e_r_s(parms) │ │ │ │ │ +350 {} │ │ │ │ │ +_3_5_1 _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y() │ │ │ │ │ +352 : _P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ +353 {} │ │ │ │ │ +354 │ │ │ │ │ +355 protected: │ │ │ │ │ +_3_5_7 const _M_a_t_r_i_x* _m_a_t_r_i_x__; │ │ │ │ │ +_3_5_9 typedef typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_3_6_0 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +_3_6_1 _r_e_a_l___t_y_p_e _m_a_x_V_a_l_u_e__; │ │ │ │ │ +_3_6_3 _N_o_r_m _n_o_r_m__; │ │ │ │ │ +_3_6_5 int _r_o_w__; │ │ │ │ │ +_3_6_7 _r_e_a_l___t_y_p_e _d_i_a_g_o_n_a_l__; │ │ │ │ │ +368 private: │ │ │ │ │ +369 void _i_n_i_t_R_o_w(const _R_o_w& row, int index, const std::true_type&); │ │ │ │ │ +370 void _i_n_i_t_R_o_w(const _R_o_w& row, int index, const std::false_type&); │ │ │ │ │ +371 }; │ │ │ │ │ +372 │ │ │ │ │ +377 template │ │ │ │ │ +_3_7_8 class _D_i_a_g_o_n_a_l │ │ │ │ │ +379 { │ │ │ │ │ +380 public: │ │ │ │ │ +381 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ +382 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = true │ │ │ │ │ +_3_8_3 }; │ │ │ │ │ +384 │ │ │ │ │ +389 template │ │ │ │ │ +_3_9_0 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ +m, │ │ │ │ │ +391 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ +sfinae = nullptr) const │ │ │ │ │ +392 { │ │ │ │ │ +393 typedef typename M::field_type field_type; │ │ │ │ │ +394 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ +395 static_assert( std::is_convertible::value, │ │ │ │ │ +396 "use of diagonal norm in AMG not implemented for complex field_type"); │ │ │ │ │ +397 return m[N][N]; │ │ │ │ │ +398 // possible implementation for complex types: return signed_abs(m[N][N]); │ │ │ │ │ +399 } │ │ │ │ │ +400 │ │ │ │ │ +405 template │ │ │ │ │ +_4_0_6 auto _o_p_e_r_a_t_o_r_(_)(const M& m, │ │ │ │ │ +407 typename std::enable_if_t::value>* sfinae = nullptr) │ │ │ │ │ +const │ │ │ │ │ +408 { │ │ │ │ │ +409 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ +410 static_assert( std::is_convertible::value, │ │ │ │ │ +411 "use of diagonal norm in AMG not implemented for complex field_type"); │ │ │ │ │ +412 return m; │ │ │ │ │ +413 // possible implementation for complex types: return signed_abs(m[N][N]); │ │ │ │ │ 414 } │ │ │ │ │ 415 │ │ │ │ │ -_4_2_0 void _s_e_t_N_o_P_r_e_S_m_o_o_t_h_S_t_e_p_s(std::size_t steps) │ │ │ │ │ +416 private: │ │ │ │ │ +417 │ │ │ │ │ +419 template │ │ │ │ │ +420 static T signed_abs(const T & v) │ │ │ │ │ 421 { │ │ │ │ │ -422 preSmoothSteps_=steps; │ │ │ │ │ +422 return v; │ │ │ │ │ 423 } │ │ │ │ │ -_4_2_8 std::size_t _g_e_t_N_o_P_r_e_S_m_o_o_t_h_S_t_e_p_s() const │ │ │ │ │ -429 { │ │ │ │ │ -430 return preSmoothSteps_; │ │ │ │ │ -431 } │ │ │ │ │ -432 │ │ │ │ │ -_4_3_7 void _s_e_t_N_o_P_o_s_t_S_m_o_o_t_h_S_t_e_p_s(std::size_t steps) │ │ │ │ │ -438 { │ │ │ │ │ -439 postSmoothSteps_=steps; │ │ │ │ │ -440 } │ │ │ │ │ -_4_4_5 std::size_t _g_e_t_N_o_P_o_s_t_S_m_o_o_t_h_S_t_e_p_s() const │ │ │ │ │ -446 { │ │ │ │ │ -447 return postSmoothSteps_; │ │ │ │ │ -448 } │ │ │ │ │ +424 │ │ │ │ │ +426 template │ │ │ │ │ +427 static T signed_abs(const std::complex & v) │ │ │ │ │ +428 { │ │ │ │ │ +429 // return sign * abs_value │ │ │ │ │ +430 // in case of complex numbers this extends to using the csgn function to │ │ │ │ │ +determine the sign │ │ │ │ │ +431 return csgn(v) * std::abs(v); │ │ │ │ │ +432 } │ │ │ │ │ +433 │ │ │ │ │ +435 template │ │ │ │ │ +436 static T csgn(const T & v) │ │ │ │ │ +437 { │ │ │ │ │ +438 return (T(0) < v) - (v < T(0)); │ │ │ │ │ +439 } │ │ │ │ │ +440 │ │ │ │ │ +442 template │ │ │ │ │ +443 static T csgn(std::complex a) │ │ │ │ │ +444 { │ │ │ │ │ +445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag()); │ │ │ │ │ +446 } │ │ │ │ │ +447 │ │ │ │ │ +448 }; │ │ │ │ │ 449 │ │ │ │ │ -_4_5_3 void _s_e_t_G_a_m_m_a(std::size_t gamma) │ │ │ │ │ -454 { │ │ │ │ │ -455 gamma_=gamma; │ │ │ │ │ -456 } │ │ │ │ │ -_4_6_0 std::size_t _g_e_t_G_a_m_m_a() const │ │ │ │ │ -461 { │ │ │ │ │ -462 return gamma_; │ │ │ │ │ -463 } │ │ │ │ │ +_4_5_4 class _F_i_r_s_t_D_i_a_g_o_n_a_l : public _D_i_a_g_o_n_a_l<0> │ │ │ │ │ +455 {}; │ │ │ │ │ +456 │ │ │ │ │ +_4_6_2 struct _R_o_w_S_u_m │ │ │ │ │ +463 { │ │ │ │ │ 464 │ │ │ │ │ -_4_6_9 void _s_e_t_A_d_d_i_t_i_v_e(bool additive) │ │ │ │ │ -470 { │ │ │ │ │ -471 additive_=additive; │ │ │ │ │ -472 } │ │ │ │ │ -473 │ │ │ │ │ -_4_7_8 bool _g_e_t_A_d_d_i_t_i_v_e() const │ │ │ │ │ -479 { │ │ │ │ │ -480 return additive_; │ │ │ │ │ -481 } │ │ │ │ │ -482 │ │ │ │ │ -_4_9_3 _P_a_r_a_m_e_t_e_r_s(int _m_a_x_L_e_v_e_l=100, int _c_o_a_r_s_e_n_T_a_r_g_e_t=1000, double │ │ │ │ │ -_m_i_n_C_o_a_r_s_e_n_R_a_t_e=1.2, │ │ │ │ │ -494 double prolongDamp=1.6, _A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e _a_c_c_u_m_u_l_a_t_e=_s_u_c_c_e_s_s_i_v_e_A_c_c_u) │ │ │ │ │ -495 : _C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s(_m_a_x_L_e_v_e_l, _c_o_a_r_s_e_n_T_a_r_g_e_t, _m_i_n_C_o_a_r_s_e_n_R_a_t_e, │ │ │ │ │ -prolongDamp, _a_c_c_u_m_u_l_a_t_e) │ │ │ │ │ -496 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1), │ │ │ │ │ -497 additive_(false) │ │ │ │ │ -498 {} │ │ │ │ │ -499 private: │ │ │ │ │ -500 int debugLevel_; │ │ │ │ │ -501 std::size_t preSmoothSteps_; │ │ │ │ │ -502 std::size_t postSmoothSteps_; │ │ │ │ │ -503 std::size_t gamma_; │ │ │ │ │ -504 bool additive_; │ │ │ │ │ -505 }; │ │ │ │ │ -506 │ │ │ │ │ -507 } //namespace AMG │ │ │ │ │ -508 │ │ │ │ │ -509} //namespace Dune │ │ │ │ │ -510#endif │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c │ │ │ │ │ -void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ -Sets reasonable default values for an anisotropic problem. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_d_d_i_t_i_v_e │ │ │ │ │ -void setAdditive(bool additive) │ │ │ │ │ -Set whether to use additive multigrid. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:469 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_S_k_i_p_I_s_o_l_a_t_e_d │ │ │ │ │ -void setSkipIsolated(bool skip) │ │ │ │ │ -Set whether isolated aggregates will not be represented on the coarse level. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r │ │ │ │ │ -void setProlongationDampingFactor(double d) │ │ │ │ │ -Set the damping factor for the prolongation. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_a_l_p_h_a │ │ │ │ │ -double alpha() const │ │ │ │ │ -Get the scaling value for marking connections as strong. Default value is 1/3. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ -void setMaxAggregateSize(std::size_t size) │ │ │ │ │ -Set the maximum number of nodes a aggregate is allowed to have. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_i_n_C_o_a_r_s_e_n_R_a_t_e │ │ │ │ │ -void setMinCoarsenRate(double rate) │ │ │ │ │ -Set the minimum coarsening rate to be achieved in each coarsening. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_m_i_n_C_o_a_r_s_e_n_R_a_t_e │ │ │ │ │ -double minCoarsenRate() const │ │ │ │ │ -Get the minimum coarsening rate to be achieved. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ -std::size_t maxAggregateSize() const │ │ │ │ │ -Get the maximum number of nodes a aggregate is allowed to have. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_l_p_h_a │ │ │ │ │ -void setAlpha(double a) │ │ │ │ │ -Set the scaling value for marking connections as strong. Default value is 1/3. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_b_e_t_a │ │ │ │ │ -double beta() const │ │ │ │ │ -Get the threshold for marking nodes as isolated. The default value is 1.0E-5. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ -std::size_t maxConnectivity() const │ │ │ │ │ -Get the maximum number of connections a aggregate is allowed to have. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_c_o_a_r_s_e_n_T_a_r_g_e_t │ │ │ │ │ -int coarsenTarget() const │ │ │ │ │ -Get the maximum number of unknowns allowed on the coarsest level. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_c_c_u_m_u_l_a_t_e │ │ │ │ │ -void setAccumulate(AccumulationMode accu) │ │ │ │ │ -Set whether he data should be accumulated on fewer processes on coarser levels. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r │ │ │ │ │ -double getProlongationDampingFactor() const │ │ │ │ │ -Get the damping factor for the prolongation. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:342 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_a_c_c_u_m_u_l_a_t_e │ │ │ │ │ -AccumulationMode accumulate() const │ │ │ │ │ -Whether the data should be accumulated on fewer processes on coarser levels. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:312 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ -void setMaxConnectivity(std::size_t connectivity) │ │ │ │ │ -Set the maximum number of connections a aggregate is allowed to have. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_i_n_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ -std::size_t minAggregateSize() const │ │ │ │ │ -Get the minimum number of nodes a aggregate has to consist of. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_A_d_d_i_t_i_v_e │ │ │ │ │ -bool getAdditive() const │ │ │ │ │ -Get whether to use additive multigrid. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:478 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_L_e_v_e_l │ │ │ │ │ -void setMaxLevel(int l) │ │ │ │ │ -Set the maximum number of levels allowed in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_D_e_b_u_g_L_e_v_e_l │ │ │ │ │ -void setDebugLevel(int level) │ │ │ │ │ -Set the debugging level. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:401 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_G_a_m_m_a │ │ │ │ │ -std::size_t getGamma() const │ │ │ │ │ -Get the value of gamma; 1 for V-cycle, 2 for W-cycle. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:460 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_N_o_P_o_s_t_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ -void setNoPostSmoothSteps(std::size_t steps) │ │ │ │ │ -Set the number of postsmoothing steps to apply. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:437 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_N_o_P_r_e_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ -std::size_t getNoPreSmoothSteps() const │ │ │ │ │ -Get the number of presmoothing steps to apply. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:428 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -DependencyParameters() │ │ │ │ │ +465 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ +466 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = false │ │ │ │ │ +_4_6_7 }; │ │ │ │ │ +472 template │ │ │ │ │ +_4_7_3 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ +m) const │ │ │ │ │ +474 { │ │ │ │ │ +475 return m.infinity_norm(); │ │ │ │ │ +476 } │ │ │ │ │ +477 }; │ │ │ │ │ +478 │ │ │ │ │ +_4_7_9 struct _F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ +480 { │ │ │ │ │ +481 │ │ │ │ │ +482 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ +483 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = false │ │ │ │ │ +_4_8_4 }; │ │ │ │ │ +489 template │ │ │ │ │ +_4_9_0 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ +m) const │ │ │ │ │ +491 { │ │ │ │ │ +492 return m.frobenius_norm(); │ │ │ │ │ +493 } │ │ │ │ │ +494 }; │ │ │ │ │ +_4_9_5 struct _A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ +496 { │ │ │ │ │ +497 │ │ │ │ │ +498 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ +499 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = false │ │ │ │ │ +_5_0_0 }; │ │ │ │ │ +505 template │ │ │ │ │ +_5_0_6 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ +m) const │ │ │ │ │ +507 { │ │ │ │ │ +508 return 1; │ │ │ │ │ +509 } │ │ │ │ │ +510 }; │ │ │ │ │ +517 template │ │ │ │ │ +_5_1_8 class _S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n : public │ │ │ │ │ +_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n > │ │ │ │ │ +519 { │ │ │ │ │ +520 public: │ │ │ │ │ +_5_2_1 _S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +522 : _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n<_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y >(parms) │ │ │ │ │ +523 {} │ │ │ │ │ +_5_2_4 _S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n() │ │ │ │ │ +525 {} │ │ │ │ │ +526 }; │ │ │ │ │ +527 │ │ │ │ │ +528 │ │ │ │ │ +537 template │ │ │ │ │ +_5_3_8 class _U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n : public _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +> │ │ │ │ │ +539 { │ │ │ │ │ +540 public: │ │ │ │ │ +_5_4_1 _U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +542 : _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n<_D_e_p_e_n_d_e_n_c_y >(parms) │ │ │ │ │ +543 {} │ │ │ │ │ +_5_4_4 _U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n() │ │ │ │ │ +545 {} │ │ │ │ │ +546 }; │ │ │ │ │ +547 // forward declaration │ │ │ │ │ +548 template class Aggregator; │ │ │ │ │ +549 │ │ │ │ │ +550 │ │ │ │ │ +558 template │ │ │ │ │ +_5_5_9 class _A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +560 { │ │ │ │ │ +561 public: │ │ │ │ │ +562 │ │ │ │ │ +_5_6_6 static const V _U_N_A_G_G_R_E_G_A_T_E_D; │ │ │ │ │ +567 │ │ │ │ │ +_5_7_1 static const V _I_S_O_L_A_T_E_D; │ │ │ │ │ +_5_7_5 typedef V _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +576 │ │ │ │ │ +_5_8_0 typedef V _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +581 │ │ │ │ │ +_5_8_6 typedef PoolAllocator _A_l_l_o_c_a_t_o_r; │ │ │ │ │ +587 │ │ │ │ │ +_5_9_2 typedef SLList _V_e_r_t_e_x_L_i_s_t; │ │ │ │ │ +593 │ │ │ │ │ +_5_9_7 class _D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ +598 { │ │ │ │ │ +599 public: │ │ │ │ │ +600 template │ │ │ │ │ +_6_0_1 void _o_p_e_r_a_t_o_r_(_)([[maybe_unused]] const EdgeIterator& edge) const │ │ │ │ │ +602 {} │ │ │ │ │ +603 }; │ │ │ │ │ +604 │ │ │ │ │ +605 │ │ │ │ │ +_6_0_9 _A_g_g_r_e_g_a_t_e_s_M_a_p(); │ │ │ │ │ +610 │ │ │ │ │ +_6_1_6 _A_g_g_r_e_g_a_t_e_s_M_a_p(std::size_t _n_o_V_e_r_t_i_c_e_s); │ │ │ │ │ +617 │ │ │ │ │ +_6_2_1 _~_A_g_g_r_e_g_a_t_e_s_M_a_p(); │ │ │ │ │ +622 │ │ │ │ │ +634 template │ │ │ │ │ +_6_3_5 std::tuple _b_u_i_l_d_A_g_g_r_e_g_a_t_e_s(const M& matrix, G& graph, │ │ │ │ │ +const C& criterion, │ │ │ │ │ +636 bool finestLevel); │ │ │ │ │ +637 │ │ │ │ │ +655 template │ │ │ │ │ +_6_5_6 std::size_t _b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& start, │ │ │ │ │ +657 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +658 const G& graph, │ │ │ │ │ +659 F& aggregateVisitor, │ │ │ │ │ +660 VM& visitedMap) const; │ │ │ │ │ +661 │ │ │ │ │ +685 template │ │ │ │ │ +_6_8_6 std::size_t _b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& start, │ │ │ │ │ +687 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +688 const G& graph, L& visited, F1& aggregateVisitor, │ │ │ │ │ +689 F2& nonAggregateVisitor, │ │ │ │ │ +690 VM& visitedMap) const; │ │ │ │ │ +691 │ │ │ │ │ +_6_9_7 void _a_l_l_o_c_a_t_e(std::size_t _n_o_V_e_r_t_i_c_e_s); │ │ │ │ │ +698 │ │ │ │ │ +_7_0_2 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ +703 │ │ │ │ │ +_7_0_7 void _f_r_e_e(); │ │ │ │ │ +708 │ │ │ │ │ +_7_1_4 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& _o_p_e_r_a_t_o_r_[_](const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& v); │ │ │ │ │ +715 │ │ │ │ │ +_7_2_1 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& _o_p_e_r_a_t_o_r_[_](const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& v) const; │ │ │ │ │ +722 │ │ │ │ │ +_7_2_3 typedef const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r* _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +724 │ │ │ │ │ +_7_2_5 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ +726 { │ │ │ │ │ +727 return aggregates_; │ │ │ │ │ +728 } │ │ │ │ │ +729 │ │ │ │ │ +_7_3_0 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ +731 { │ │ │ │ │ +732 return aggregates_+_n_o_V_e_r_t_i_c_e_s(); │ │ │ │ │ +733 } │ │ │ │ │ +734 │ │ │ │ │ +_7_3_5 typedef _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r* _i_t_e_r_a_t_o_r; │ │ │ │ │ +736 │ │ │ │ │ +_7_3_7 _i_t_e_r_a_t_o_r _b_e_g_i_n() │ │ │ │ │ +738 { │ │ │ │ │ +739 return aggregates_; │ │ │ │ │ +740 } │ │ │ │ │ +741 │ │ │ │ │ +_7_4_2 _i_t_e_r_a_t_o_r _e_n_d() │ │ │ │ │ +743 { │ │ │ │ │ +744 return aggregates_+_n_o_V_e_r_t_i_c_e_s(); │ │ │ │ │ +745 } │ │ │ │ │ +746 private: │ │ │ │ │ +748 _A_g_g_r_e_g_a_t_e_s_M_a_p(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>&) = delete; │ │ │ │ │ +750 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>& operator=(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>&) = delete; │ │ │ │ │ +751 │ │ │ │ │ +755 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r* aggregates_; │ │ │ │ │ +756 │ │ │ │ │ +760 std::size_t noVertices_; │ │ │ │ │ +761 }; │ │ │ │ │ +762 │ │ │ │ │ +766 template │ │ │ │ │ +_7_6_7 void _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(G& graph, │ │ │ │ │ +768 const typename C::Matrix& matrix, │ │ │ │ │ +769 C criterion, │ │ │ │ │ +770 bool finestLevel); │ │ │ │ │ +771 │ │ │ │ │ +776 template │ │ │ │ │ +_7_7_7 class _A_g_g_r_e_g_a_t_e │ │ │ │ │ +778 { │ │ │ │ │ +779 │ │ │ │ │ +780 public: │ │ │ │ │ +781 │ │ │ │ │ +782 /*** │ │ │ │ │ +783 * @brief The type of the matrix graph we work with. │ │ │ │ │ +784 */ │ │ │ │ │ +_7_8_5 typedef G _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ +_7_8_9 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _V_e_r_t_e_x; │ │ │ │ │ +790 │ │ │ │ │ +_7_9_5 typedef PoolAllocator _A_l_l_o_c_a_t_o_r; │ │ │ │ │ +796 │ │ │ │ │ +_8_0_1 typedef S _V_e_r_t_e_x_S_e_t; │ │ │ │ │ +802 │ │ │ │ │ +_8_0_4 typedef typename VertexSet::const_iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +805 │ │ │ │ │ +_8_0_9 typedef std::size_t* _S_p_h_e_r_e_M_a_p; │ │ │ │ │ +810 │ │ │ │ │ +_8_1_9 _A_g_g_r_e_g_a_t_e(_M_a_t_r_i_x_G_r_a_p_h& graph, _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +820 _V_e_r_t_e_x_S_e_t& connectivity, std::vector& front_); │ │ │ │ │ +821 │ │ │ │ │ +_8_2_2 void _i_n_v_a_l_i_d_a_t_e() │ │ │ │ │ +823 { │ │ │ │ │ +824 --id_; │ │ │ │ │ +825 } │ │ │ │ │ +826 │ │ │ │ │ +_8_3_3 void _r_e_c_o_n_s_t_r_u_c_t(const _V_e_r_t_e_x& vertex); │ │ │ │ │ +834 │ │ │ │ │ +_8_3_8 void _s_e_e_d(const _V_e_r_t_e_x& vertex); │ │ │ │ │ +839 │ │ │ │ │ +_8_4_3 void _a_d_d(const _V_e_r_t_e_x& vertex); │ │ │ │ │ +844 │ │ │ │ │ +_8_4_5 void _a_d_d(std::vector& vertex); │ │ │ │ │ +_8_4_9 void _c_l_e_a_r(); │ │ │ │ │ +850 │ │ │ │ │ +_8_5_4 typename VertexSet::size_type _s_i_z_e(); │ │ │ │ │ +_8_5_8 typename VertexSet::size_type _c_o_n_n_e_c_t_S_i_z_e(); │ │ │ │ │ +859 │ │ │ │ │ +_8_6_3 int _i_d(); │ │ │ │ │ +864 │ │ │ │ │ +_8_6_6 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +867 │ │ │ │ │ +_8_6_9 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +870 │ │ │ │ │ +871 private: │ │ │ │ │ +875 _V_e_r_t_e_x_S_e_t vertices_; │ │ │ │ │ +876 │ │ │ │ │ +881 int id_; │ │ │ │ │ +882 │ │ │ │ │ +886 _M_a_t_r_i_x_G_r_a_p_h& graph_; │ │ │ │ │ +887 │ │ │ │ │ +891 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ +892 │ │ │ │ │ +896 _V_e_r_t_e_x_S_e_t& connected_; │ │ │ │ │ +897 │ │ │ │ │ +901 std::vector& front_; │ │ │ │ │ +902 }; │ │ │ │ │ +903 │ │ │ │ │ +907 template │ │ │ │ │ +_9_0_8 class _A_g_g_r_e_g_a_t_o_r │ │ │ │ │ +909 { │ │ │ │ │ +910 public: │ │ │ │ │ +911 │ │ │ │ │ +_9_1_5 typedef G _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ +916 │ │ │ │ │ +_9_2_0 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _V_e_r_t_e_x; │ │ │ │ │ +921 │ │ │ │ │ +_9_2_3 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +924 │ │ │ │ │ +_9_2_8 _A_g_g_r_e_g_a_t_o_r(); │ │ │ │ │ +929 │ │ │ │ │ +_9_3_3 _~_A_g_g_r_e_g_a_t_o_r(); │ │ │ │ │ +934 │ │ │ │ │ +951 template │ │ │ │ │ +_9_5_2 std::tuple _b_u_i_l_d(const M& m, G& graph, │ │ │ │ │ +953 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, const C& c, │ │ │ │ │ +954 bool finestLevel); │ │ │ │ │ +955 private: │ │ │ │ │ +960 typedef PoolAllocator Allocator; │ │ │ │ │ +961 │ │ │ │ │ +965 typedef SLList VertexList; │ │ │ │ │ +966 │ │ │ │ │ +970 typedef std::set,Allocator> VertexSet; │ │ │ │ │ +971 │ │ │ │ │ +975 typedef std::size_t* SphereMap; │ │ │ │ │ +976 │ │ │ │ │ +980 _M_a_t_r_i_x_G_r_a_p_h* graph_; │ │ │ │ │ +981 │ │ │ │ │ +985 _A_g_g_r_e_g_a_t_e_<_M_a_t_r_i_x_G_r_a_p_h_,_V_e_r_t_e_x_S_e_t_>* aggregate_; │ │ │ │ │ +986 │ │ │ │ │ +990 std::vector front_; │ │ │ │ │ +991 │ │ │ │ │ +995 VertexSet connected_; │ │ │ │ │ +996 │ │ │ │ │ +1000 int size_; │ │ │ │ │ +1001 │ │ │ │ │ +1005 class Stack │ │ │ │ │ +1006 { │ │ │ │ │ +1007 public: │ │ │ │ │ +_1_0_0_8 static const _V_e_r_t_e_x _N_u_l_l_E_n_t_r_y; │ │ │ │ │ +1009 │ │ │ │ │ +_1_0_1_0 _S_t_a_c_k(const _M_a_t_r_i_x_G_r_a_p_h& graph, │ │ │ │ │ +1011 const _A_g_g_r_e_g_a_t_o_r_<_G_>& aggregatesBuilder, │ │ │ │ │ +1012 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates); │ │ │ │ │ +_1_0_1_3 _~_S_t_a_c_k(); │ │ │ │ │ +_1_0_1_4 _V_e_r_t_e_x _p_o_p(); │ │ │ │ │ +1015 private: │ │ │ │ │ +1016 enum { N = 1300000 }; │ │ │ │ │ +1017 │ │ │ │ │ +1019 const _M_a_t_r_i_x_G_r_a_p_h& graph_; │ │ │ │ │ +1021 const _A_g_g_r_e_g_a_t_o_r_<_G_>& aggregatesBuilder_; │ │ │ │ │ +1023 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ +1025 int size_; │ │ │ │ │ +1026 _V_e_r_t_e_x maxSize_; │ │ │ │ │ +1028 typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r begin_; │ │ │ │ │ +1029 typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r end_; │ │ │ │ │ +1030 │ │ │ │ │ +1032 _V_e_r_t_e_x* vals_; │ │ │ │ │ +1033 │ │ │ │ │ +1034 }; │ │ │ │ │ +1035 │ │ │ │ │ +_1_0_3_6 friend class Stack; │ │ │ │ │ +1037 │ │ │ │ │ +1048 template │ │ │ │ │ +1049 void visitAggregateNeighbours(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1050 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +1051 V& visitor) const; │ │ │ │ │ +1052 │ │ │ │ │ +1057 template │ │ │ │ │ +1058 class AggregateVisitor │ │ │ │ │ +1059 { │ │ │ │ │ +1060 public: │ │ │ │ │ +_1_0_6_4 typedef V _V_i_s_i_t_o_r; │ │ │ │ │ +_1_0_7_2 _A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1073 _V_i_s_i_t_o_r& visitor); │ │ │ │ │ +1074 │ │ │ │ │ +_1_0_8_1 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1082 │ │ │ │ │ +1083 private: │ │ │ │ │ +1085 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ +1087 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r aggregate_; │ │ │ │ │ +1089 _V_i_s_i_t_o_r* visitor_; │ │ │ │ │ +1090 }; │ │ │ │ │ +1091 │ │ │ │ │ +1095 class Counter │ │ │ │ │ +1096 { │ │ │ │ │ +1097 public: │ │ │ │ │ +_1_0_9_9 _C_o_u_n_t_e_r(); │ │ │ │ │ +_1_1_0_1 int _v_a_l_u_e(); │ │ │ │ │ +1102 │ │ │ │ │ +1103 protected: │ │ │ │ │ +_1_1_0_5 void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +_1_1_0_7 void _d_e_c_r_e_m_e_n_t(); │ │ │ │ │ +1108 │ │ │ │ │ +1109 private: │ │ │ │ │ +1110 int count_; │ │ │ │ │ +1111 }; │ │ │ │ │ +1112 │ │ │ │ │ +1113 │ │ │ │ │ +1118 class FrontNeighbourCounter : public Counter │ │ │ │ │ +1119 { │ │ │ │ │ +1120 public: │ │ │ │ │ +_1_1_2_5 _F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r(const _M_a_t_r_i_x_G_r_a_p_h& front); │ │ │ │ │ +1126 │ │ │ │ │ +_1_1_2_7 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1128 │ │ │ │ │ +1129 private: │ │ │ │ │ +1130 const _M_a_t_r_i_x_G_r_a_p_h& graph_; │ │ │ │ │ +1131 }; │ │ │ │ │ +1132 │ │ │ │ │ +1137 int noFrontNeighbours(const _V_e_r_t_e_x& vertex) const; │ │ │ │ │ +1138 │ │ │ │ │ +1142 class TwoWayCounter : public Counter │ │ │ │ │ +1143 { │ │ │ │ │ +1144 public: │ │ │ │ │ +_1_1_4_5 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1146 }; │ │ │ │ │ +1147 │ │ │ │ │ +1159 int twoWayConnections(const _V_e_r_t_e_x&, const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1160 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1161 │ │ │ │ │ +1165 class OneWayCounter : public Counter │ │ │ │ │ +1166 { │ │ │ │ │ +1167 public: │ │ │ │ │ +_1_1_6_8 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1169 }; │ │ │ │ │ +1170 │ │ │ │ │ +1182 int oneWayConnections(const _V_e_r_t_e_x&, const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1183 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1184 │ │ │ │ │ +1191 class ConnectivityCounter : public Counter │ │ │ │ │ +1192 { │ │ │ │ │ +1193 public: │ │ │ │ │ +_1_2_0_0 _C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r(const VertexSet& connected, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates); │ │ │ │ │ +1201 │ │ │ │ │ +_1_2_0_2 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1203 │ │ │ │ │ +1204 private: │ │ │ │ │ +1206 const VertexSet& connected_; │ │ │ │ │ +1208 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ +1209 │ │ │ │ │ +1210 }; │ │ │ │ │ +1211 │ │ │ │ │ +1223 double connectivity(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ +aggregates) const; │ │ │ │ │ +1231 bool connected(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1232 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1233 │ │ │ │ │ +1241 bool connected(const _V_e_r_t_e_x& vertex, const SLList& │ │ │ │ │ +aggregateList, │ │ │ │ │ +1242 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1243 │ │ │ │ │ +1251 class DependencyCounter : public Counter │ │ │ │ │ +1252 { │ │ │ │ │ +1253 public: │ │ │ │ │ +_1_2_5_7 _D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r(); │ │ │ │ │ +1258 │ │ │ │ │ +_1_2_5_9 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1260 }; │ │ │ │ │ +1261 │ │ │ │ │ +1268 class FrontMarker │ │ │ │ │ +1269 { │ │ │ │ │ +1270 public: │ │ │ │ │ +_1_2_7_7 _F_r_o_n_t_M_a_r_k_e_r(std::vector& front, _M_a_t_r_i_x_G_r_a_p_h& graph); │ │ │ │ │ +1278 │ │ │ │ │ +_1_2_7_9 void _o_p_e_r_a_t_o_r_(_)(const typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ +1280 │ │ │ │ │ +1281 private: │ │ │ │ │ +1283 std::vector& front_; │ │ │ │ │ +1285 _M_a_t_r_i_x_G_r_a_p_h& graph_; │ │ │ │ │ +1286 }; │ │ │ │ │ +1287 │ │ │ │ │ +1291 void unmarkFront(); │ │ │ │ │ +1292 │ │ │ │ │ +1307 int unusedNeighbours(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ +aggregates) const; │ │ │ │ │ +1308 │ │ │ │ │ +1322 std::pair neighbours(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +1323 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1324 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1341 int aggregateNeighbours(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ +aggregate, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1342 │ │ │ │ │ +1350 bool admissible(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ +aggregate, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates) const; │ │ │ │ │ +1351 │ │ │ │ │ +1359 std::size_t distance(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ +aggregates); │ │ │ │ │ +1360 │ │ │ │ │ +1369 _V_e_r_t_e_x mergeNeighbour(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ +aggregates) const; │ │ │ │ │ +1370 │ │ │ │ │ +1379 void nonisoNeighbourAggregate(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +1380 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +1381 SLList& neighbours) const; │ │ │ │ │ +1382 │ │ │ │ │ +1390 template │ │ │ │ │ +1391 void growAggregate(const _V_e_r_t_e_x& vertex, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ +aggregates, const C& c); │ │ │ │ │ +1392 template │ │ │ │ │ +1393 void growIsolatedAggregate(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, const C& c); │ │ │ │ │ +1394 }; │ │ │ │ │ +1395 │ │ │ │ │ +1396#ifndef DOXYGEN │ │ │ │ │ +1397 │ │ │ │ │ +1398 template │ │ │ │ │ +1399 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t(const _M_a_t_r_i_x* matrix) │ │ │ │ │ +1400 { │ │ │ │ │ +1401 matrix_ = matrix; │ │ │ │ │ +1402 } │ │ │ │ │ +1403 │ │ │ │ │ +1404 template │ │ │ │ │ +1405 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w(const Row& row, int index) │ │ │ │ │ +1406 { │ │ │ │ │ +1407 initRow(row, index, std::is_convertible()); │ │ │ │ │ +1408 } │ │ │ │ │ +1409 │ │ │ │ │ +1410 template │ │ │ │ │ +1411 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w(const Row& row, int index, │ │ │ │ │ +const std::false_type&) │ │ │ │ │ +1412 { │ │ │ │ │ +1413 DUNE_THROW(InvalidStateException, "field_type needs to convertible to │ │ │ │ │ +real_type"); │ │ │ │ │ +1414 } │ │ │ │ │ +1415 │ │ │ │ │ +1416 template │ │ │ │ │ +1417 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w([[maybe_unused]] const Row& │ │ │ │ │ +row, int index, const std::true_type&) │ │ │ │ │ +1418 { │ │ │ │ │ +1419 using std::min; │ │ │ │ │ +1420 maxValue_ = min(- std::numeric_limits::max(), │ │ │ │ │ +std::numeric_limits::min()); │ │ │ │ │ +1421 row_ = index; │ │ │ │ │ +1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]); │ │ │ │ │ +1423 } │ │ │ │ │ +1424 │ │ │ │ │ +1425 template │ │ │ │ │ +1426 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(const ColIter& _c_o_l) │ │ │ │ │ +1427 { │ │ │ │ │ +1428 using std::max; │ │ │ │ │ +1429 real_type eij = norm_(*_c_o_l); │ │ │ │ │ +1430 typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r opposite_entry = │ │ │ │ │ +1431 matrix_->operator[](_c_o_l.index()).find(row_); │ │ │ │ │ +1432 if ( opposite_entry == matrix_->operator[](_c_o_l.index()).end() ) │ │ │ │ │ +1433 { │ │ │ │ │ +1434 // Consider this a weak connection we disregard. │ │ │ │ │ +1435 return; │ │ │ │ │ +1436 } │ │ │ │ │ +1437 real_type eji = norm_(*opposite_entry); │ │ │ │ │ +1438 │ │ │ │ │ +1439 // skip positive offdiagonals if norm preserves sign of them. │ │ │ │ │ +1440 if(!N::is_sign_preserving || eij<0 || eji<0) │ │ │ │ │ +1441 maxValue_ = max(maxValue_, │ │ │ │ │ +1442 eij /diagonal_ * eji/ │ │ │ │ │ +1443 norm_(matrix_->operator[](_c_o_l.index())[_c_o_l.index()])); │ │ │ │ │ +1444 } │ │ │ │ │ +1445 │ │ │ │ │ +1446 template │ │ │ │ │ +1447 template │ │ │ │ │ +1448 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(G& graph, const typename G:: │ │ │ │ │ +EdgeIterator& edge, const ColIter& _c_o_l) │ │ │ │ │ +1449 { │ │ │ │ │ +1450 real_type eij = norm_(*_c_o_l); │ │ │ │ │ +1451 typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r opposite_entry = │ │ │ │ │ +1452 matrix_->operator[](_c_o_l.index()).find(row_); │ │ │ │ │ +1453 │ │ │ │ │ +1454 if ( opposite_entry == matrix_->operator[](_c_o_l.index()).end() ) │ │ │ │ │ +1455 { │ │ │ │ │ +1456 // Consider this as a weak connection we disregard. │ │ │ │ │ +1457 return; │ │ │ │ │ +1458 } │ │ │ │ │ +1459 real_type eji = norm_(*opposite_entry); │ │ │ │ │ +1460 // skip positve offdiagonals if norm preserves sign of them. │ │ │ │ │ +1461 if(!N::is_sign_preserving || (eij<0 || eji<0)) │ │ │ │ │ +1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) * │ │ │ │ │ +1463 eij/ diagonal_ > alpha() * maxValue_) { │ │ │ │ │ +1464 edge.properties().setDepends(); │ │ │ │ │ +1465 edge.properties().setInfluences(); │ │ │ │ │ +1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), │ │ │ │ │ +edge.source()); │ │ │ │ │ +1467 other.setInfluences(); │ │ │ │ │ +1468 other.setDepends(); │ │ │ │ │ +1469 } │ │ │ │ │ +1470 } │ │ │ │ │ +1471 │ │ │ │ │ +1472 template │ │ │ │ │ +1473 inline bool _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_s_I_s_o_l_a_t_e_d() │ │ │ │ │ +1474 { │ │ │ │ │ +1475 return maxValue_ < beta(); │ │ │ │ │ +1476 } │ │ │ │ │ +1477 │ │ │ │ │ +1478 │ │ │ │ │ +1479 template │ │ │ │ │ +1480 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t(const Matrix* matrix) │ │ │ │ │ +1481 { │ │ │ │ │ +1482 matrix_ = matrix; │ │ │ │ │ +1483 } │ │ │ │ │ +1484 │ │ │ │ │ +1485 template │ │ │ │ │ +1486 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w([[maybe_unused]] const Row& row, int │ │ │ │ │ +index) │ │ │ │ │ +1487 { │ │ │ │ │ +1488 using std::min; │ │ │ │ │ +1489 maxValue_ = min(- std::numeric_limits::max(), std:: │ │ │ │ │ +numeric_limits::min()); │ │ │ │ │ +1490 row_ = index; │ │ │ │ │ +1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]); │ │ │ │ │ +1492 } │ │ │ │ │ +1493 │ │ │ │ │ +1494 template │ │ │ │ │ +1495 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(const ColIter& _c_o_l) │ │ │ │ │ +1496 { │ │ │ │ │ +1497 using std::max; │ │ │ │ │ +1498 maxValue_ = max(maxValue_, -norm_(*_c_o_l)); │ │ │ │ │ +1499 } │ │ │ │ │ +1500 │ │ │ │ │ +1501 template │ │ │ │ │ +1502 template │ │ │ │ │ +1503 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(G& graph, const typename G:: │ │ │ │ │ +EdgeIterator& edge, const ColIter& _c_o_l) │ │ │ │ │ +1504 { │ │ │ │ │ +1505 if(-norm_(*_c_o_l) >= maxValue_ * alpha()) { │ │ │ │ │ +1506 edge.properties().setDepends(); │ │ │ │ │ +1507 typedef typename G::EdgeDescriptor ED; │ │ │ │ │ +1508 ED e= graph.findEdge(edge.target(), edge.source()); │ │ │ │ │ +1509 if(e!=std::numeric_limits::max()) │ │ │ │ │ +1510 { │ │ │ │ │ +1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e); │ │ │ │ │ +1512 other.setInfluences(); │ │ │ │ │ +1513 } │ │ │ │ │ +1514 } │ │ │ │ │ +1515 } │ │ │ │ │ +1516 │ │ │ │ │ +1517 template │ │ │ │ │ +1518 inline bool _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_s_I_s_o_l_a_t_e_d() │ │ │ │ │ +1519 { │ │ │ │ │ +1520 return maxValue_ < beta() * diagonal_; │ │ │ │ │ +1521 } │ │ │ │ │ +1522 │ │ │ │ │ +1523 template │ │ │ │ │ +1524 _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_A_g_g_r_e_g_a_t_e(MatrixGraph& graph, AggregatesMap& │ │ │ │ │ +aggregates, │ │ │ │ │ +1525 VertexSet& connected, std::vector& front) │ │ │ │ │ +1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates), │ │ │ │ │ +1527 connected_(connected), front_(front) │ │ │ │ │ +1528 {} │ │ │ │ │ +1529 │ │ │ │ │ +1530 template │ │ │ │ │ +1531 void _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_r_e_c_o_n_s_t_r_u_c_t(const _V_e_r_t_e_x& vertex) │ │ │ │ │ +1532 { │ │ │ │ │ +1533 /* │ │ │ │ │ +1534 vertices_.push_back(vertex); │ │ │ │ │ +1535 typedef typename VertexList::const_iterator iterator; │ │ │ │ │ +1536 iterator begin = vertices_.begin(); │ │ │ │ │ +1537 iterator end = vertices_.end();*/ │ │ │ │ │ +1538 throw "Not yet implemented"; │ │ │ │ │ +1539 │ │ │ │ │ +1540 // while(begin!=end){ │ │ │ │ │ +1541 //for(); │ │ │ │ │ +1542 // } │ │ │ │ │ +1543 │ │ │ │ │ +1544 } │ │ │ │ │ +1545 │ │ │ │ │ +1546 template │ │ │ │ │ +1547 inline void _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_s_e_e_d(const _V_e_r_t_e_x& vertex) │ │ │ │ │ +1548 { │ │ │ │ │ +1549 dvverb<<"Connected cleared"<::UNAGGREGATED && │ │ │ │ │ +1616 !graph_.getVertexProperties(edge.target()).front()) │ │ │ │ │ +1617 { │ │ │ │ │ +1618 front_.push_back(edge.target()); │ │ │ │ │ +1619 graph_.getVertexProperties(edge.target()).setFront(); │ │ │ │ │ +1620 } │ │ │ │ │ +1621 dvverb <<" size="< │ │ │ │ │ +1629 inline void _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_l_e_a_r() │ │ │ │ │ +1630 { │ │ │ │ │ +1631 vertices_.clear(); │ │ │ │ │ +1632 connected_.clear(); │ │ │ │ │ +1633 id_=-1; │ │ │ │ │ +1634 } │ │ │ │ │ +1635 │ │ │ │ │ +1636 template │ │ │ │ │ +1637 inline typename Aggregate::VertexSet::size_type │ │ │ │ │ +1638 _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_s_i_z_e() │ │ │ │ │ +1639 { │ │ │ │ │ +1640 return vertices_.size(); │ │ │ │ │ +1641 } │ │ │ │ │ +1642 │ │ │ │ │ +1643 template │ │ │ │ │ +1644 inline typename Aggregate::VertexSet::size_type │ │ │ │ │ +1645 _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_o_n_n_e_c_t_S_i_z_e() │ │ │ │ │ +1646 { │ │ │ │ │ +1647 return connected_.size(); │ │ │ │ │ +1648 } │ │ │ │ │ +1649 │ │ │ │ │ +1650 template │ │ │ │ │ +1651 inline int _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_i_d() │ │ │ │ │ +1652 { │ │ │ │ │ +1653 return id_; │ │ │ │ │ +1654 } │ │ │ │ │ +1655 │ │ │ │ │ +1656 template │ │ │ │ │ +1657 inline typename _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_b_e_g_i_n() │ │ │ │ │ +const │ │ │ │ │ +1658 { │ │ │ │ │ +1659 return vertices_.begin(); │ │ │ │ │ +1660 } │ │ │ │ │ +1661 │ │ │ │ │ +1662 template │ │ │ │ │ +1663 inline typename _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_e_n_d() const │ │ │ │ │ +1664 { │ │ │ │ │ +1665 return vertices_.end(); │ │ │ │ │ +1666 } │ │ │ │ │ +1667 │ │ │ │ │ +1668 template │ │ │ │ │ +1669 const V _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_U_N_A_G_G_R_E_G_A_T_E_D = std::numeric_limits::max(); │ │ │ │ │ +1670 │ │ │ │ │ +1671 template │ │ │ │ │ +1672 const V _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_I_S_O_L_A_T_E_D = std::numeric_limits::max()-1; │ │ │ │ │ +1673 │ │ │ │ │ +1674 template │ │ │ │ │ +1675 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p() │ │ │ │ │ +1676 : aggregates_(0) │ │ │ │ │ +1677 {} │ │ │ │ │ +1678 │ │ │ │ │ +1679 template │ │ │ │ │ +1680 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_~_A_g_g_r_e_g_a_t_e_s_M_a_p() │ │ │ │ │ +1681 { │ │ │ │ │ +1682 if(aggregates_!=0) │ │ │ │ │ +1683 delete[] aggregates_; │ │ │ │ │ +1684 } │ │ │ │ │ +1685 │ │ │ │ │ +1686 │ │ │ │ │ +1687 template │ │ │ │ │ +1688 inline _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p(std::size_t noVertices) │ │ │ │ │ +1689 { │ │ │ │ │ +1690 allocate(noVertices); │ │ │ │ │ +1691 } │ │ │ │ │ +1692 │ │ │ │ │ +1693 template │ │ │ │ │ +1694 inline std::size_t _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_n_o_V_e_r_t_i_c_e_s() const │ │ │ │ │ +1695 { │ │ │ │ │ +1696 return noVertices_; │ │ │ │ │ +1697 } │ │ │ │ │ +1698 │ │ │ │ │ +1699 template │ │ │ │ │ +1700 inline void _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_a_l_l_o_c_a_t_e(std::size_t noVertices) │ │ │ │ │ +1701 { │ │ │ │ │ +1702 aggregates_ = new _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r[noVertices]; │ │ │ │ │ +1703 noVertices_ = noVertices; │ │ │ │ │ +1704 │ │ │ │ │ +1705 for(std::size_t i=0; i < noVertices; i++) │ │ │ │ │ +1706 aggregates_[i]=UNAGGREGATED; │ │ │ │ │ +1707 } │ │ │ │ │ +1708 │ │ │ │ │ +1709 template │ │ │ │ │ +1710 inline void _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_f_r_e_e() │ │ │ │ │ +1711 { │ │ │ │ │ +1712 assert(aggregates_ != 0); │ │ │ │ │ +1713 delete[] aggregates_; │ │ │ │ │ +1714 aggregates_=0; │ │ │ │ │ +1715 } │ │ │ │ │ +1716 │ │ │ │ │ +1717 template │ │ │ │ │ +1718 inline typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ +1719 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_o_p_e_r_a_t_o_r_[_](const VertexDescriptor& v) │ │ │ │ │ +1720 { │ │ │ │ │ +1721 return aggregates_[v]; │ │ │ │ │ +1722 } │ │ │ │ │ +1723 │ │ │ │ │ +1724 template │ │ │ │ │ +1725 inline const typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ +1726 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_o_p_e_r_a_t_o_r_[_](const VertexDescriptor& v) const │ │ │ │ │ +1727 { │ │ │ │ │ +1728 return aggregates_[v]; │ │ │ │ │ +1729 } │ │ │ │ │ +1730 │ │ │ │ │ +1731 template │ │ │ │ │ +1732 template │ │ │ │ │ +1733 inline std::size_t _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h(const V& start, │ │ │ │ │ +1734 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1735 const G& graph, F& aggregateVisitor, │ │ │ │ │ +1736 VM& visitedMap) const │ │ │ │ │ +1737 { │ │ │ │ │ +1738 VertexList vlist; │ │ │ │ │ +1739 │ │ │ │ │ +1740 DummyEdgeVisitor dummy; │ │ │ │ │ +1741 return breadthFirstSearch(start, aggregate, graph, vlist, │ │ │ │ │ +aggregateVisitor, dummy, visitedMap); │ │ │ │ │ +1742 } │ │ │ │ │ +1743 │ │ │ │ │ +1744 template │ │ │ │ │ +1745 template │ │ │ │ │ +1746 std::size_t _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h(const V& start, │ │ │ │ │ +1747 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1748 const G& graph, │ │ │ │ │ +1749 L& visited, │ │ │ │ │ +1750 F1& aggregateVisitor, │ │ │ │ │ +1751 F2& nonAggregateVisitor, │ │ │ │ │ +1752 VM& visitedMap) const │ │ │ │ │ +1753 { │ │ │ │ │ +1754 typedef typename L::const_iterator ListIterator; │ │ │ │ │ +1755 int visitedSpheres = 0; │ │ │ │ │ +1756 │ │ │ │ │ +1757 visited.push_back(start); │ │ │ │ │ +1758 put(visitedMap, start, true); │ │ │ │ │ +1759 │ │ │ │ │ +1760 ListIterator current = visited.begin(); │ │ │ │ │ +1761 ListIterator end = visited.end(); │ │ │ │ │ +1762 std::size_t i=0, size=visited.size(); │ │ │ │ │ +1763 │ │ │ │ │ +1764 // visit the neighbours of all vertices of the │ │ │ │ │ +1765 // current sphere. │ │ │ │ │ +1766 while(current != end) { │ │ │ │ │ +1767 │ │ │ │ │ +1768 for(; i │ │ │ │ │ +1803 _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_A_g_g_r_e_g_a_t_o_r() │ │ │ │ │ +1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1) │ │ │ │ │ +1805 {} │ │ │ │ │ +1806 │ │ │ │ │ +1807 template │ │ │ │ │ +1808 _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_~_A_g_g_r_e_g_a_t_o_r() │ │ │ │ │ +1809 { │ │ │ │ │ +1810 size_=-1; │ │ │ │ │ +1811 } │ │ │ │ │ +1812 │ │ │ │ │ +1813 template │ │ │ │ │ +1814 void _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(G& graph, │ │ │ │ │ +1815 const typename C::Matrix& matrix, │ │ │ │ │ +1816 C criterion, bool firstlevel) │ │ │ │ │ +1817 { │ │ │ │ │ +1818 // assert(graph.isBuilt()); │ │ │ │ │ +1819 typedef typename C::Matrix Matrix; │ │ │ │ │ +1820 typedef typename G::VertexIterator VertexIterator; │ │ │ │ │ +1821 │ │ │ │ │ +1822 criterion.init(&matrix); │ │ │ │ │ +1823 │ │ │ │ │ +1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end(); │ │ │ │ │ +++vertex) { │ │ │ │ │ +1825 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e Row; │ │ │ │ │ +1826 │ │ │ │ │ +1827 const Row& row = matrix[*vertex]; │ │ │ │ │ +1828 │ │ │ │ │ +1829 // Tell the criterion what row we will examine now │ │ │ │ │ +1830 // This might for example be used for calculating the │ │ │ │ │ +1831 // maximum offdiagonal value │ │ │ │ │ +1832 criterion.initRow(row, *vertex); │ │ │ │ │ +1833 │ │ │ │ │ +1834 // On a first path all columns are examined. After this │ │ │ │ │ +1835 // the calculator should know whether the vertex is isolated. │ │ │ │ │ +1836 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r ColIterator; │ │ │ │ │ +1837 ColIterator end = row.end(); │ │ │ │ │ +1838 typename FieldTraits::real_type │ │ │ │ │ +absoffdiag=0.; │ │ │ │ │ +1839 │ │ │ │ │ +1840 using std::max; │ │ │ │ │ +1841 if(firstlevel) { │ │ │ │ │ +1842 for(ColIterator _c_o_l = row.begin(); _c_o_l != end; ++_c_o_l) │ │ │ │ │ +1843 if(_c_o_l.index()!=*vertex) { │ │ │ │ │ +1844 criterion.examine(_c_o_l); │ │ │ │ │ +1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm()); │ │ │ │ │ +1846 } │ │ │ │ │ +1847 │ │ │ │ │ +1848 if(absoffdiag==0) │ │ │ │ │ +1849 vertex.properties().setExcludedBorder(); │ │ │ │ │ +1850 } │ │ │ │ │ +1851 else │ │ │ │ │ +1852 for(ColIterator _c_o_l = row.begin(); _c_o_l != end; ++_c_o_l) │ │ │ │ │ +1853 if(_c_o_l.index()!=*vertex) │ │ │ │ │ +1854 criterion.examine(_c_o_l); │ │ │ │ │ +1855 │ │ │ │ │ +1856 // reset the vertex properties │ │ │ │ │ +1857 //vertex.properties().reset(); │ │ │ │ │ +1858 │ │ │ │ │ +1859 // Check whether the vertex is isolated. │ │ │ │ │ +1860 if(criterion.isIsolated()) { │ │ │ │ │ +1861 //std::cout<<"ISOLATED: "<<*vertex< │ │ │ │ │ +1881 template │ │ │ │ │ +1882 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_<_V_>_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r(const │ │ │ │ │ +AggregatesMap& aggregates, │ │ │ │ │ +1883 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, V& visitor) │ │ │ │ │ +1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor) │ │ │ │ │ +1885 {} │ │ │ │ │ +1886 │ │ │ │ │ +1887 template │ │ │ │ │ +1888 template │ │ │ │ │ +1889 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_<_V_>_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +1890 { │ │ │ │ │ +1891 if(aggregates_[edge.target()]==aggregate_) │ │ │ │ │ +1892 visitor_->operator()(edge); │ │ │ │ │ +1893 } │ │ │ │ │ +1894 │ │ │ │ │ +1895 template │ │ │ │ │ +1896 template │ │ │ │ │ +1897 inline void Aggregator::visitAggregateNeighbours(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +1898 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1899 const AggregatesMap& aggregates, │ │ │ │ │ +1900 V& visitor) const │ │ │ │ │ +1901 { │ │ │ │ │ +1902 // Only evaluates for edge pointing to the aggregate │ │ │ │ │ +1903 AggregateVisitor v(aggregates, aggregate, visitor); │ │ │ │ │ +1904 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, v); │ │ │ │ │ +1905 } │ │ │ │ │ +1906 │ │ │ │ │ +1907 │ │ │ │ │ +1908 template │ │ │ │ │ +1909 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_C_o_u_n_t_e_r() │ │ │ │ │ +1910 : count_(0) │ │ │ │ │ +1911 {} │ │ │ │ │ +1912 │ │ │ │ │ +1913 template │ │ │ │ │ +1914 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t() │ │ │ │ │ +1915 { │ │ │ │ │ +1916 ++count_; │ │ │ │ │ +1917 } │ │ │ │ │ +1918 │ │ │ │ │ +1919 template │ │ │ │ │ +1920 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_d_e_c_r_e_m_e_n_t() │ │ │ │ │ +1921 { │ │ │ │ │ +1922 --count_; │ │ │ │ │ +1923 } │ │ │ │ │ +1924 template │ │ │ │ │ +1925 inline int _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_v_a_l_u_e() │ │ │ │ │ +1926 { │ │ │ │ │ +1927 return count_; │ │ │ │ │ +1928 } │ │ │ │ │ +1929 │ │ │ │ │ +1930 template │ │ │ │ │ +1931 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_T_w_o_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +1932 { │ │ │ │ │ +1933 if(edge.properties().isTwoWay()) │ │ │ │ │ +1934 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +1935 } │ │ │ │ │ +1936 │ │ │ │ │ +1937 template │ │ │ │ │ +1938 int Aggregator::twoWayConnections(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1939 const AggregatesMap& aggregates) const │ │ │ │ │ +1940 { │ │ │ │ │ +1941 TwoWayCounter counter; │ │ │ │ │ +1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter); │ │ │ │ │ +1943 return counter.value(); │ │ │ │ │ +1944 } │ │ │ │ │ +1945 │ │ │ │ │ +1946 template │ │ │ │ │ +1947 int Aggregator::oneWayConnections(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +1948 const AggregatesMap& aggregates) const │ │ │ │ │ +1949 { │ │ │ │ │ +1950 OneWayCounter counter; │ │ │ │ │ +1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter); │ │ │ │ │ +1952 return counter.value(); │ │ │ │ │ +1953 } │ │ │ │ │ +1954 │ │ │ │ │ +1955 template │ │ │ │ │ +1956 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_O_n_e_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +1957 { │ │ │ │ │ +1958 if(edge.properties().isOneWay()) │ │ │ │ │ +1959 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +1960 } │ │ │ │ │ +1961 │ │ │ │ │ +1962 template │ │ │ │ │ +1963 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r(const │ │ │ │ │ +VertexSet& connected, │ │ │ │ │ +1964 const AggregatesMap& aggregates) │ │ │ │ │ +1965 : Counter(), connected_(connected), aggregates_(aggregates) │ │ │ │ │ +1966 {} │ │ │ │ │ +1967 │ │ │ │ │ +1968 │ │ │ │ │ +1969 template │ │ │ │ │ +1970 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +1971 { │ │ │ │ │ +1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() || │ │ │ │ │ +aggregates_[edge.target()]==AggregatesMap::UNAGGREGATED) │ │ │ │ │ +1973 // Would be a new connection │ │ │ │ │ +1974 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +1975 else{ │ │ │ │ │ +1976 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +1977 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +1978 } │ │ │ │ │ +1979 } │ │ │ │ │ +1980 │ │ │ │ │ +1981 template │ │ │ │ │ +1982 inline double Aggregator::connectivity(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +AggregatesMap& aggregates) const │ │ │ │ │ +1983 { │ │ │ │ │ +1984 ConnectivityCounter counter(connected_, aggregates); │ │ │ │ │ +1985 double noNeighbours=_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, counter); │ │ │ │ │ +1986 return (double)counter.value()/noNeighbours; │ │ │ │ │ +1987 } │ │ │ │ │ +1988 │ │ │ │ │ +1989 template │ │ │ │ │ +1990 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r() │ │ │ │ │ +1991 : Counter() │ │ │ │ │ +1992 {} │ │ │ │ │ +1993 │ │ │ │ │ +1994 template │ │ │ │ │ +1995 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +1996 { │ │ │ │ │ +1997 if(edge.properties().depends()) │ │ │ │ │ +1998 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +1999 if(edge.properties().influences()) │ │ │ │ │ +2000 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +2001 } │ │ │ │ │ +2002 │ │ │ │ │ +2003 template │ │ │ │ │ +2004 int Aggregator::unusedNeighbours(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +AggregatesMap& aggregates) const │ │ │ │ │ +2005 { │ │ │ │ │ +2006 return aggregateNeighbours(vertex, AggregatesMap::UNAGGREGATED, │ │ │ │ │ +aggregates); │ │ │ │ │ +2007 } │ │ │ │ │ +2008 │ │ │ │ │ +2009 template │ │ │ │ │ +2010 std::pair Aggregator::neighbours(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +2011 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +2012 const AggregatesMap& aggregates) const │ │ │ │ │ +2013 { │ │ │ │ │ +2014 DependencyCounter unused, aggregated; │ │ │ │ │ +2015 typedef AggregateVisitor CounterT; │ │ │ │ │ +2016 typedef std::tuple CounterTuple; │ │ │ │ │ +2017 CombinedFunctor visitors(CounterTuple(CounterT(aggregates, │ │ │ │ │ +AggregatesMap::UNAGGREGATED, unused), CounterT(aggregates, aggregate, │ │ │ │ │ +aggregated))); │ │ │ │ │ +2018 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, visitors); │ │ │ │ │ +2019 return std::make_pair(unused.value(), aggregated.value()); │ │ │ │ │ +2020 } │ │ │ │ │ +2021 │ │ │ │ │ +2022 │ │ │ │ │ +2023 template │ │ │ │ │ +2024 int Aggregator::aggregateNeighbours(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, const AggregatesMap& aggregates) const │ │ │ │ │ +2025 { │ │ │ │ │ +2026 DependencyCounter counter; │ │ │ │ │ +2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter); │ │ │ │ │ +2028 return counter.value(); │ │ │ │ │ +2029 } │ │ │ │ │ +2030 │ │ │ │ │ +2031 template │ │ │ │ │ +2032 std::size_t Aggregator::distance(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +AggregatesMap& aggregates) │ │ │ │ │ +2033 { │ │ │ │ │ +2034 return 0; │ │ │ │ │ +2035 typename PropertyMapTypeSelector::Type visitedMap = │ │ │ │ │ +_g_e_t(VertexVisitedTag(), *graph_); │ │ │ │ │ +2036 VertexList vlist; │ │ │ │ │ +2037 typename AggregatesMap::DummyEdgeVisitor dummy; │ │ │ │ │ +2038 return aggregates.template breadthFirstSearch(vertex, │ │ │ │ │ +2039 aggregate_->_i_d(), *graph_, │ │ │ │ │ +2040 vlist, dummy, dummy, visitedMap); │ │ │ │ │ +2041 } │ │ │ │ │ +2042 │ │ │ │ │ +2043 template │ │ │ │ │ +2044 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_F_r_o_n_t_M_a_r_k_e_r(std::vector& front, │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h& graph) │ │ │ │ │ +2045 : front_(front), graph_(graph) │ │ │ │ │ +2046 {} │ │ │ │ │ +2047 │ │ │ │ │ +2048 template │ │ │ │ │ +2049 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +2050 { │ │ │ │ │ +2051 _V_e_r_t_e_x target = edge.target(); │ │ │ │ │ +2052 │ │ │ │ │ +2053 if(!graph_.getVertexProperties(target).front()) { │ │ │ │ │ +2054 front_.push_back(target); │ │ │ │ │ +2055 graph_.getVertexProperties(target).setFront(); │ │ │ │ │ +2056 } │ │ │ │ │ +2057 } │ │ │ │ │ +2058 │ │ │ │ │ +2059 template │ │ │ │ │ +2060 inline bool Aggregator::admissible(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, const AggregatesMap& aggregates) const │ │ │ │ │ +2061 { │ │ │ │ │ +2062 // Todo │ │ │ │ │ +2063 Dune::dvverb<<" Admissible not yet implemented!"<endEdges(vertex); │ │ │ │ │ +2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) { │ │ │ │ │ +2072 // if(edge.properties().depends() && !edge.properties().influences() │ │ │ │ │ +2073 if(edge.properties().isStrong() │ │ │ │ │ +2074 && aggregates[edge.target()]==aggregate) │ │ │ │ │ +2075 { │ │ │ │ │ +2076 // Search for another link to the aggregate │ │ │ │ │ +2077 Iterator edge1 = edge; │ │ │ │ │ +2078 for(++edge1; edge1 != vend; ++edge1) { │ │ │ │ │ +2079 //if(edge1.properties().depends() && !edge1.properties().influences() │ │ │ │ │ +2080 if(edge1.properties().isStrong() │ │ │ │ │ +2081 && aggregates[edge.target()]==aggregate) │ │ │ │ │ +2082 { │ │ │ │ │ +2083 //Search for an edge connecting the two vertices that is │ │ │ │ │ +2084 //strong │ │ │ │ │ +2085 bool found=false; │ │ │ │ │ +2086 Iterator v2end = graph_->endEdges(edge.target()); │ │ │ │ │ +2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end; │ │ │ │ │ +++edge2) { │ │ │ │ │ +2088 if(edge2.target()==edge1.target() && │ │ │ │ │ +2089 edge2.properties().isStrong()) { │ │ │ │ │ +2090 found =true; │ │ │ │ │ +2091 break; │ │ │ │ │ +2092 } │ │ │ │ │ +2093 } │ │ │ │ │ +2094 if(found) │ │ │ │ │ +2095 { │ │ │ │ │ +2096 return true; │ │ │ │ │ +2097 } │ │ │ │ │ +2098 } │ │ │ │ │ +2099 } │ │ │ │ │ +2100 } │ │ │ │ │ +2101 } │ │ │ │ │ +2102 │ │ │ │ │ +2103 // Situation 2: cluster node depends on front node and other cluster node │ │ │ │ │ +2105 vend = graph_->endEdges(vertex); │ │ │ │ │ +2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) { │ │ │ │ │ +2107 //if(!edge.properties().depends() && edge.properties().influences() │ │ │ │ │ +2108 if(edge.properties().isStrong() │ │ │ │ │ +2109 && aggregates[edge.target()]==aggregate) │ │ │ │ │ +2110 { │ │ │ │ │ +2111 // Search for a link from target that stays within the aggregate │ │ │ │ │ +2112 Iterator v1end = graph_->endEdges(edge.target()); │ │ │ │ │ +2113 │ │ │ │ │ +2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end; │ │ │ │ │ +++edge1) { │ │ │ │ │ +2115 //if(edge1.properties().depends() && !edge1.properties().influences() │ │ │ │ │ +2116 if(edge1.properties().isStrong() │ │ │ │ │ +2117 && aggregates[edge1.target()]==aggregate) │ │ │ │ │ +2118 { │ │ │ │ │ +2119 bool found=false; │ │ │ │ │ +2120 // Check if front node is also connected to this one │ │ │ │ │ +2121 Iterator v2end = graph_->endEdges(vertex); │ │ │ │ │ +2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2) │ │ │ │ │ +{ │ │ │ │ │ +2123 if(edge2.target()==edge1.target()) { │ │ │ │ │ +2124 if(edge2.properties().isStrong()) │ │ │ │ │ +2125 found=true; │ │ │ │ │ +2126 break; │ │ │ │ │ +2127 } │ │ │ │ │ +2128 } │ │ │ │ │ +2129 if(found) │ │ │ │ │ +2130 { │ │ │ │ │ +2131 return true; │ │ │ │ │ +2132 } │ │ │ │ │ +2133 } │ │ │ │ │ +2134 } │ │ │ │ │ +2135 } │ │ │ │ │ +2136 } │ │ │ │ │ +2137 return false; │ │ │ │ │ +2138 } │ │ │ │ │ +2139 │ │ │ │ │ +2140 template │ │ │ │ │ +2141 void Aggregator::unmarkFront() │ │ │ │ │ +2142 { │ │ │ │ │ +2143 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ +2144 │ │ │ │ │ +2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex) │ │ │ │ │ +2146 graph_->getVertexProperties(*vertex).resetFront(); │ │ │ │ │ +2147 │ │ │ │ │ +2148 front_.clear(); │ │ │ │ │ +2149 } │ │ │ │ │ +2150 │ │ │ │ │ +2151 template │ │ │ │ │ +2152 inline void │ │ │ │ │ +2153 Aggregator::nonisoNeighbourAggregate(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +2154 const AggregatesMap& aggregates, │ │ │ │ │ +2155 SLList& neighbours) const │ │ │ │ │ +2156 { │ │ │ │ │ +2157 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +2158 Iterator end=graph_->beginEdges(vertex); │ │ │ │ │ +2159 neighbours.clear(); │ │ │ │ │ +2160 │ │ │ │ │ +2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge) │ │ │ │ │ +2162 { │ │ │ │ │ +2163 if(aggregates[edge.target()]!=AggregatesMap::UNAGGREGATED && │ │ │ │ │ +graph_->getVertexProperties(edge.target()).isolated()) │ │ │ │ │ +2164 neighbours.push_back(aggregates[edge.target()]); │ │ │ │ │ +2165 } │ │ │ │ │ +2166 } │ │ │ │ │ +2167 │ │ │ │ │ +2168 template │ │ │ │ │ +2169 inline typename G::VertexDescriptor Aggregator::mergeNeighbour(const │ │ │ │ │ +_V_e_r_t_e_x& vertex, const AggregatesMap& aggregates) const │ │ │ │ │ +2170 { │ │ │ │ │ +2171 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +2172 │ │ │ │ │ +2173 Iterator end = graph_->endEdges(vertex); │ │ │ │ │ +2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) { │ │ │ │ │ +2175 if(aggregates[edge.target()] != AggregatesMap::UNAGGREGATED && │ │ │ │ │ +2176 graph_->getVertexProperties(edge.target()).isolated() == graph_- │ │ │ │ │ +>getVertexProperties(edge.source()).isolated()) { │ │ │ │ │ +2177 if( graph_->getVertexProperties(vertex).isolated() || │ │ │ │ │ +2178 ((edge.properties().depends() || edge.properties().influences()) │ │ │ │ │ +2179 && admissible(vertex, aggregates[edge.target()], aggregates))) │ │ │ │ │ +2180 return edge.target(); │ │ │ │ │ +2181 } │ │ │ │ │ +2182 } │ │ │ │ │ +2183 return AggregatesMap::UNAGGREGATED; │ │ │ │ │ +2184 } │ │ │ │ │ +2185 │ │ │ │ │ +2186 template │ │ │ │ │ +2187 _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r(const │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h& graph) │ │ │ │ │ +2188 : Counter(), graph_(graph) │ │ │ │ │ +2189 {} │ │ │ │ │ +2190 │ │ │ │ │ +2191 template │ │ │ │ │ +2192 void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +2193 { │ │ │ │ │ +2194 if(graph_.getVertexProperties(edge.target()).front()) │ │ │ │ │ +2195 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +2196 } │ │ │ │ │ +2197 │ │ │ │ │ +2198 template │ │ │ │ │ +2199 int Aggregator::noFrontNeighbours(const _V_e_r_t_e_x& vertex) const │ │ │ │ │ +2200 { │ │ │ │ │ +2201 FrontNeighbourCounter counter(*graph_); │ │ │ │ │ +2202 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, counter); │ │ │ │ │ +2203 return counter.value(); │ │ │ │ │ +2204 } │ │ │ │ │ +2205 template │ │ │ │ │ +2206 inline bool Aggregator::connected(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +2207 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ +2208 const AggregatesMap& aggregates) const │ │ │ │ │ +2209 { │ │ │ │ │ +2210 typedef typename G::ConstEdgeIterator iterator; │ │ │ │ │ +2211 const iterator end = graph_->endEdges(vertex); │ │ │ │ │ +2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) │ │ │ │ │ +2213 if(aggregates[edge.target()]==aggregate) │ │ │ │ │ +2214 return true; │ │ │ │ │ +2215 return false; │ │ │ │ │ +2216 } │ │ │ │ │ +2217 template │ │ │ │ │ +2218 inline bool Aggregator::connected(const _V_e_r_t_e_x& vertex, │ │ │ │ │ +2219 const SLList& aggregateList, │ │ │ │ │ +2220 const AggregatesMap& aggregates) const │ │ │ │ │ +2221 { │ │ │ │ │ +2222 typedef typename SLList::const_iterator Iter; │ │ │ │ │ +2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i) │ │ │ │ │ +2224 if(connected(vertex, *i, aggregates)) │ │ │ │ │ +2225 return true; │ │ │ │ │ +2226 return false; │ │ │ │ │ +2227 } │ │ │ │ │ +2228 │ │ │ │ │ +2229 template │ │ │ │ │ +2230 template │ │ │ │ │ +2231 void Aggregator::growIsolatedAggregate(const _V_e_r_t_e_x& seed, const │ │ │ │ │ +AggregatesMap& aggregates, const C& c) │ │ │ │ │ +2232 { │ │ │ │ │ +2233 SLList connectedAggregates; │ │ │ │ │ +2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates); │ │ │ │ │ +2235 │ │ │ │ │ +2236 while(aggregate_->_s_i_z_e()< c.minAggregateSize() && aggregate_->_c_o_n_n_e_c_t_S_i_z_e │ │ │ │ │ +() < c.maxConnectivity()) { │ │ │ │ │ +2237 double maxCon=-1; │ │ │ │ │ +2238 std::size_t maxFrontNeighbours=0; │ │ │ │ │ +2239 │ │ │ │ │ +2240 _V_e_r_t_e_x candidate=AggregatesMap::UNAGGREGATED; │ │ │ │ │ +2241 │ │ │ │ │ +2242 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ +2243 │ │ │ │ │ +2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) { │ │ │ │ │ +2245 if(distance(*vertex, aggregates)>c.maxDistance()) │ │ │ │ │ +2246 continue; // distance of proposes aggregate too big │ │ │ │ │ +2247 │ │ │ │ │ +2248 if(connectedAggregates.size()>0) { │ │ │ │ │ +2249 // there is already a neighbour cluster │ │ │ │ │ +2250 // front node must be connected to same neighbour cluster │ │ │ │ │ +2251 │ │ │ │ │ +2252 if(!connected(*vertex, connectedAggregates, aggregates)) │ │ │ │ │ +2253 continue; │ │ │ │ │ +2254 } │ │ │ │ │ +2255 │ │ │ │ │ +2256 double con = connectivity(*vertex, aggregates); │ │ │ │ │ +2257 │ │ │ │ │ +2258 if(con == maxCon) { │ │ │ │ │ +2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2260 │ │ │ │ │ +2261 if(frontNeighbours >= maxFrontNeighbours) { │ │ │ │ │ +2262 maxFrontNeighbours = frontNeighbours; │ │ │ │ │ +2263 candidate = *vertex; │ │ │ │ │ +2264 } │ │ │ │ │ +2265 }else if(con > maxCon) { │ │ │ │ │ +2266 maxCon = con; │ │ │ │ │ +2267 maxFrontNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2268 candidate = *vertex; │ │ │ │ │ +2269 } │ │ │ │ │ +2270 } │ │ │ │ │ +2271 │ │ │ │ │ +2272 if(candidate==AggregatesMap::UNAGGREGATED) │ │ │ │ │ +2273 break; │ │ │ │ │ +2274 │ │ │ │ │ +2275 aggregate_->_a_d_d(candidate); │ │ │ │ │ +2276 } │ │ │ │ │ +2277 } │ │ │ │ │ +2278 │ │ │ │ │ +2279 template │ │ │ │ │ +2280 template │ │ │ │ │ +2281 void Aggregator::growAggregate(const _V_e_r_t_e_x& seed, const │ │ │ │ │ +AggregatesMap& aggregates, const C& c) │ │ │ │ │ +2282 { │ │ │ │ │ +2283 using std::min; │ │ │ │ │ +2284 │ │ │ │ │ +2285 std::size_t distance_ =0; │ │ │ │ │ +2286 while(aggregate_->_s_i_z_e() < c.minAggregateSize()&& distance_ candidates; │ │ │ │ │ +2291 candidates.reserve(30); │ │ │ │ │ +2292 │ │ │ │ │ +2293 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ +2294 │ │ │ │ │ +2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) { │ │ │ │ │ +2296 // Only nonisolated nodes are considered │ │ │ │ │ +2297 if(graph_->getVertexProperties(*vertex).isolated()) │ │ │ │ │ +2298 continue; │ │ │ │ │ +2299 │ │ │ │ │ +2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->_i_d(), aggregates); │ │ │ │ │ +2301 │ │ │ │ │ +2302 /* The case of two way connections. */ │ │ │ │ │ +2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) { │ │ │ │ │ +2304 double con = connectivity(*vertex, aggregates); │ │ │ │ │ +2305 │ │ │ │ │ +2306 if(con == maxCon) { │ │ │ │ │ +2307 int neighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2308 │ │ │ │ │ +2309 if(neighbours > maxNeighbours) { │ │ │ │ │ +2310 maxNeighbours = neighbours; │ │ │ │ │ +2311 candidates.clear(); │ │ │ │ │ +2312 candidates.push_back(*vertex); │ │ │ │ │ +2313 }else{ │ │ │ │ │ +2314 candidates.push_back(*vertex); │ │ │ │ │ +2315 } │ │ │ │ │ +2316 }else if( con > maxCon) { │ │ │ │ │ +2317 maxCon = con; │ │ │ │ │ +2318 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2319 candidates.clear(); │ │ │ │ │ +2320 candidates.push_back(*vertex); │ │ │ │ │ +2321 } │ │ │ │ │ +2322 }else if(twoWayCons > maxTwoCons) { │ │ │ │ │ +2323 maxTwoCons = twoWayCons; │ │ │ │ │ +2324 maxCon = connectivity(*vertex, aggregates); │ │ │ │ │ +2325 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2326 candidates.clear(); │ │ │ │ │ +2327 candidates.push_back(*vertex); │ │ │ │ │ +2328 │ │ │ │ │ +2329 // two way connections precede │ │ │ │ │ +2330 maxOneCons = std::numeric_limits::max(); │ │ │ │ │ +2331 } │ │ │ │ │ +2332 │ │ │ │ │ +2333 if(twoWayCons > 0) │ │ │ │ │ +2334 { │ │ │ │ │ +2335 continue; // THis is a two-way node, skip tests for one way nodes │ │ │ │ │ +2336 } │ │ │ │ │ +2337 │ │ │ │ │ +2338 /* The one way case */ │ │ │ │ │ +2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->_i_d(), aggregates); │ │ │ │ │ +2340 │ │ │ │ │ +2341 if(oneWayCons==0) │ │ │ │ │ +2342 continue; // No strong connections, skip the tests. │ │ │ │ │ +2343 │ │ │ │ │ +2344 if(!admissible(*vertex, aggregate_->_i_d(), aggregates)) │ │ │ │ │ +2345 continue; │ │ │ │ │ +2346 │ │ │ │ │ +2347 if( maxOneCons == oneWayCons && oneWayCons > 0) { │ │ │ │ │ +2348 double con = connectivity(*vertex, aggregates); │ │ │ │ │ +2349 │ │ │ │ │ +2350 if(con == maxCon) { │ │ │ │ │ +2351 int neighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2352 │ │ │ │ │ +2353 if(neighbours > maxNeighbours) { │ │ │ │ │ +2354 maxNeighbours = neighbours; │ │ │ │ │ +2355 candidates.clear(); │ │ │ │ │ +2356 candidates.push_back(*vertex); │ │ │ │ │ +2357 }else{ │ │ │ │ │ +2358 if(neighbours==maxNeighbours) │ │ │ │ │ +2359 { │ │ │ │ │ +2360 candidates.push_back(*vertex); │ │ │ │ │ +2361 } │ │ │ │ │ +2362 } │ │ │ │ │ +2363 }else if( con > maxCon) { │ │ │ │ │ +2364 maxCon = con; │ │ │ │ │ +2365 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2366 candidates.clear(); │ │ │ │ │ +2367 candidates.push_back(*vertex); │ │ │ │ │ +2368 } │ │ │ │ │ +2369 }else if(oneWayCons > maxOneCons) { │ │ │ │ │ +2370 maxOneCons = oneWayCons; │ │ │ │ │ +2371 maxCon = connectivity(*vertex, aggregates); │ │ │ │ │ +2372 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ +2373 candidates.clear(); │ │ │ │ │ +2374 candidates.push_back(*vertex); │ │ │ │ │ +2375 } │ │ │ │ │ +2376 } │ │ │ │ │ +2377 │ │ │ │ │ +2378 │ │ │ │ │ +2379 if(!candidates.size()) │ │ │ │ │ +2380 break; // No more candidates found │ │ │ │ │ +2381 distance_=distance(seed, aggregates); │ │ │ │ │ +2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()- │ │ │ │ │ +2383 aggregate_->_s_i_z_e())); │ │ │ │ │ +2384 aggregate_->_a_d_d(candidates); │ │ │ │ │ +2385 } │ │ │ │ │ +2386 } │ │ │ │ │ +2387 │ │ │ │ │ +2388 template │ │ │ │ │ +2389 template │ │ │ │ │ +2390 std::tuple _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s(const M& │ │ │ │ │ +matrix, G& graph, const C& criterion, │ │ │ │ │ +2391 bool finestLevel) │ │ │ │ │ +2392 { │ │ │ │ │ +2393 Aggregator aggregator; │ │ │ │ │ +2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel); │ │ │ │ │ +2395 } │ │ │ │ │ +2396 │ │ │ │ │ +2397 template │ │ │ │ │ +2398 template │ │ │ │ │ +2399 std::tuple _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_b_u_i_l_d(const M& m, G& graph, │ │ │ │ │ +AggregatesMap& aggregates, const C& c, │ │ │ │ │ +2400 bool finestLevel) │ │ │ │ │ +2401 { │ │ │ │ │ +2402 using std::max; │ │ │ │ │ +2403 using std::min; │ │ │ │ │ +2404 // Stack for fast vertex access │ │ │ │ │ +2405 Stack stack_(graph, *this, aggregates); │ │ │ │ │ +2406 │ │ │ │ │ +2407 graph_ = &graph; │ │ │ │ │ +2408 │ │ │ │ │ +2409 aggregate_ = new Aggregate(graph, aggregates, connected_, │ │ │ │ │ +front_); │ │ │ │ │ +2410 │ │ │ │ │ +2411 Timer watch; │ │ │ │ │ +2412 watch.reset(); │ │ │ │ │ +2413 │ │ │ │ │ +2414 _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(graph, m, c, finestLevel); │ │ │ │ │ +2415 │ │ │ │ │ +2416 dverb<<"Build dependency took "<< watch.elapsed()<<" seconds."<::ISOLATED; │ │ │ │ │ +2437 ++skippedAggregates; │ │ │ │ │ +2438 continue; │ │ │ │ │ +2439 } │ │ │ │ │ +2440 │ │ │ │ │ +2441 if(graph.getVertexProperties(seed).isolated()) { │ │ │ │ │ +2442 if(c.skipIsolated()) { │ │ │ │ │ +2443 // isolated vertices are not aggregated but skipped on the coarser levels. │ │ │ │ │ +2444 aggregates[seed]=AggregatesMap::ISOLATED; │ │ │ │ │ +2445 ++skippedAggregates; │ │ │ │ │ +2446 // skip rest as no agglomeration is done. │ │ │ │ │ +2447 continue; │ │ │ │ │ +2448 }else{ │ │ │ │ │ +2449 aggregate_->_s_e_e_d(seed); │ │ │ │ │ +2450 growIsolatedAggregate(seed, aggregates, c); │ │ │ │ │ +2451 } │ │ │ │ │ +2452 }else{ │ │ │ │ │ +2453 aggregate_->_s_e_e_d(seed); │ │ │ │ │ +2454 growAggregate(seed, aggregates, c); │ │ │ │ │ +2455 } │ │ │ │ │ +2456 │ │ │ │ │ +2457 /* The rounding step. */ │ │ │ │ │ +2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->_s_i_z_e() │ │ │ │ │ +< c.maxAggregateSize()) { │ │ │ │ │ +2459 │ │ │ │ │ +2460 std::vector candidates; │ │ │ │ │ +2461 candidates.reserve(30); │ │ │ │ │ +2462 │ │ │ │ │ +2463 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ +2464 │ │ │ │ │ +2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) { │ │ │ │ │ +2466 │ │ │ │ │ +2467 if(graph.getVertexProperties(*vertex).isolated()) │ │ │ │ │ +2468 continue; // No isolated nodes here │ │ │ │ │ +2469 │ │ │ │ │ +2470 if(twoWayConnections( *vertex, aggregate_->_i_d(), aggregates) == 0 && │ │ │ │ │ +2471 (oneWayConnections( *vertex, aggregate_->_i_d(), aggregates) == 0 || │ │ │ │ │ +2472 !admissible( *vertex, aggregate_->_i_d(), aggregates) )) │ │ │ │ │ +2473 continue; │ │ │ │ │ +2474 │ │ │ │ │ +2475 std::pair neighbourPair=neighbours(*vertex, aggregate_->_i_d(), │ │ │ │ │ +2476 aggregates); │ │ │ │ │ +2477 │ │ │ │ │ +2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <= │ │ │ │ │ +unusedNeighbours(*vertex, aggregates)) │ │ │ │ │ +2479 // continue; │ │ │ │ │ +2480 │ │ │ │ │ +2481 if(neighbourPair.first >= neighbourPair.second) │ │ │ │ │ +2482 continue; │ │ │ │ │ +2483 │ │ │ │ │ +2484 if(distance(*vertex, aggregates) > c.maxDistance()) │ │ │ │ │ +2485 continue; // Distance too far │ │ │ │ │ +2486 candidates.push_back(*vertex); │ │ │ │ │ +2487 break; │ │ │ │ │ +2488 } │ │ │ │ │ +2489 │ │ │ │ │ +2490 if(!candidates.size()) break; // no more candidates found. │ │ │ │ │ +2491 │ │ │ │ │ +2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()- │ │ │ │ │ +2493 aggregate_->_s_i_z_e())); │ │ │ │ │ +2494 aggregate_->_a_d_d(candidates); │ │ │ │ │ +2495 │ │ │ │ │ +2496 } │ │ │ │ │ +2497 │ │ │ │ │ +2498 // try to merge aggregates consisting of only one nonisolated vertex with │ │ │ │ │ +other aggregates │ │ │ │ │ +2499 if(aggregate_->_s_i_z_e()==1 && c.maxAggregateSize()>1) { │ │ │ │ │ +2500 if(!graph.getVertexProperties(seed).isolated()) { │ │ │ │ │ +2501 _V_e_r_t_e_x mergedNeighbour = mergeNeighbour(seed, aggregates); │ │ │ │ │ +2502 │ │ │ │ │ +2503 if(mergedNeighbour != AggregatesMap::UNAGGREGATED) { │ │ │ │ │ +2504 // assign vertex to the neighbouring cluster │ │ │ │ │ +2505 aggregates[seed] = aggregates[mergedNeighbour]; │ │ │ │ │ +2506 aggregate_->_i_n_v_a_l_i_d_a_t_e(); │ │ │ │ │ +2507 }else{ │ │ │ │ │ +2508 ++avg; │ │ │ │ │ +2509 minA=min(minA,static_cast(1)); │ │ │ │ │ +2510 maxA=max(maxA,static_cast(1)); │ │ │ │ │ +2511 ++oneAggregates; │ │ │ │ │ +2512 ++conAggregates; │ │ │ │ │ +2513 } │ │ │ │ │ +2514 }else{ │ │ │ │ │ +2515 ++avg; │ │ │ │ │ +2516 minA=min(minA,static_cast(1)); │ │ │ │ │ +2517 maxA=max(maxA,static_cast(1)); │ │ │ │ │ +2518 ++oneAggregates; │ │ │ │ │ +2519 ++isoAggregates; │ │ │ │ │ +2520 } │ │ │ │ │ +2521 ++avg; │ │ │ │ │ +2522 }else{ │ │ │ │ │ +2523 avg+=aggregate_->_s_i_z_e(); │ │ │ │ │ +2524 minA=min(minA,aggregate_->_s_i_z_e()); │ │ │ │ │ +2525 maxA=max(maxA,aggregate_->_s_i_z_e()); │ │ │ │ │ +2526 if(graph.getVertexProperties(seed).isolated()) │ │ │ │ │ +2527 ++isoAggregates; │ │ │ │ │ +2528 else │ │ │ │ │ +2529 ++conAggregates; │ │ │ │ │ +2530 } │ │ │ │ │ +2531 │ │ │ │ │ +2532 } │ │ │ │ │ +2533 │ │ │ │ │ +2534 Dune::dinfo<<"connected aggregates: "<0) │ │ │ │ │ +2537 Dune::dinfo<<" one node aggregates: "<::iterator valIter_ │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_C_o_l_I_t_e_r │ │ │ │ │ +Matrix::ConstColIterator ColIter │ │ │ │ │ +Constant column iterator of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h │ │ │ │ │ +std::size_t breadthFirstSearch(const VertexDescriptor &start, const │ │ │ │ │ +AggregateDescriptor &aggregate, const G &graph, L &visited, F1 │ │ │ │ │ +&aggregateVisitor, F2 &nonAggregateVisitor, VM &visitedMap) const │ │ │ │ │ +Breadth first search within an aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +PoolAllocator< VertexDescriptor, 100 > Allocator │ │ │ │ │ +The allocator we use for our lists and the set. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:586 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:737 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_i_d │ │ │ │ │ +int id() │ │ │ │ │ +Get the id identifying the aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_n_o_r_m__ │ │ │ │ │ +Norm norm_ │ │ │ │ │ +The functor for calculating the norm. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:302 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_V_e_r_t_e_x │ │ │ │ │ +MatrixGraph::VertexDescriptor Vertex │ │ │ │ │ +The vertex identifier. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:920 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +AggregationCriterion() │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_m_a_t_r_i_x__ │ │ │ │ │ +const Matrix * matrix_ │ │ │ │ │ +The matrix we work on. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:357 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +auto operator()(const M &m, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ +value > *sfinae=nullptr) const │ │ │ │ │ +Compute the norm of a scalar. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:406 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t_R_o_w │ │ │ │ │ +void initRow(const Row &row, int index) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +SymmetricMatrixDependency(const Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_M_a_t_r_i_x │ │ │ │ │ +M Matrix │ │ │ │ │ +The matrix type we build the dependency of. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_C_o_u_n_t_e_r │ │ │ │ │ +Counter() │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +G MatrixGraph │ │ │ │ │ +The matrix graph type used. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:915 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_n_o_r_m__ │ │ │ │ │ +Norm norm_ │ │ │ │ │ +The functor for calculating the norm. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:363 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const EdgeIterator &edge) const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:601 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +SymmetricCriterion() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:524 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +Dependency() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ +void examine(const ColIter &col) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_M_a_t_r_i_x │ │ │ │ │ +M Matrix │ │ │ │ │ +The matrix type we build the dependency of. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_d_i_a_g_o_n_a_l__ │ │ │ │ │ +real_type diagonal_ │ │ │ │ │ +The norm of the current diagonal. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_N_o_r_m │ │ │ │ │ +N Norm │ │ │ │ │ +The norm to use for examining the matrix entries. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:742 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +UnSymmetricCriterion(const Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:541 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_T_w_o_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t_R_o_w │ │ │ │ │ +void initRow(const Row &row, int index) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:201 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_i_s_I_s_o_l_a_t_e_d │ │ │ │ │ +bool isIsolated() │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_N_u_l_l_E_n_t_r_y │ │ │ │ │ +static const Vertex NullEntry │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:1008 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ +void examine(const ColIter &col) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +Dependency(const Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_r_o_w__ │ │ │ │ │ +int row_ │ │ │ │ │ +index of the currently evaluated row. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_b_u_i_l_d │ │ │ │ │ +std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap< │ │ │ │ │ +Vertex > &aggregates, const C &c, bool finestLevel) │ │ │ │ │ +Build the aggregates. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r │ │ │ │ │ +FrontNeighbourCounter(const MatrixGraph &front) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_R_o_w │ │ │ │ │ +Matrix::row_type Row │ │ │ │ │ +Constant Row iterator of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:329 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_m_a_t_r_i_x__ │ │ │ │ │ +const Matrix * matrix_ │ │ │ │ │ +The matrix we work on. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const AggregateDescriptor & operator[](const VertexDescriptor &v) const │ │ │ │ │ +Get the aggregate a vertex belongs to. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ +void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter │ │ │ │ │ +&col) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r │ │ │ │ │ +AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const │ │ │ │ │ +AggregateDescriptor &aggregate, Visitor &visitor) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_C_o_l_I_t_e_r │ │ │ │ │ +Matrix::ConstColIterator ColIter │ │ │ │ │ +Constant column iterator of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_~_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +~AggregatesMap() │ │ │ │ │ +Destructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +Matrix::field_type field_type │ │ │ │ │ +The current max value. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +void decrement() │ │ │ │ │ +Decrement counter. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_A_g_g_r_e_g_a_t_e │ │ │ │ │ +Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet │ │ │ │ │ +&connectivity, std::vector< Vertex > &front_) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_i_n_A_g_g_r_e_g_a_t_e_S_i_z_e │ │ │ │ │ -void setMinAggregateSize(std::size_t size) │ │ │ │ │ -Set the minimum number of nodes a aggregate has to consist of. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_L_e_v_e_l │ │ │ │ │ -int maxLevel() const │ │ │ │ │ -Get the maximum number of levels allowed in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:270 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_:_:_V_i_s_i_t_o_r │ │ │ │ │ +V Visitor │ │ │ │ │ +The type of the adapted visitor. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:1064 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_S_p_h_e_r_e_M_a_p │ │ │ │ │ +std::size_t * SphereMap │ │ │ │ │ +Type of the mapping of aggregate members onto distance spheres. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:809 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +AggregationCriterion(const Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_R_o_w │ │ │ │ │ +Matrix::row_type Row │ │ │ │ │ +Constant Row iterator of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_c_o_n_n_e_c_t_S_i_z_e │ │ │ │ │ +VertexSet::size_type connectSize() │ │ │ │ │ +Get tne number of connections to other aggregates. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_v_a_l_s__ │ │ │ │ │ +std::vector< real_type > vals_ │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_N_o_r_m │ │ │ │ │ +N Norm │ │ │ │ │ +The norm to use for examining the matrix entries. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:324 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_r_i_n_t_A_g_g_r_e_g_a_t_e_s_2_d │ │ │ │ │ +void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m, │ │ │ │ │ +std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:2583 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_i_n_v_a_l_i_d_a_t_e │ │ │ │ │ +void invalidate() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:822 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:725 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_m_a_x_V_a_l_u_e__ │ │ │ │ │ +real_type maxValue_ │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_n_o_r_m__ │ │ │ │ │ +Norm norm_ │ │ │ │ │ +The functor for calculating the norm. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +VertexSet::const_iterator const_iterator │ │ │ │ │ +Const iterator over a vertex list. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:804 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +SymmetricCriterion(const Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:521 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +MatrixGraph::VertexDescriptor AggregateDescriptor │ │ │ │ │ +The type of the aggregate descriptor. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:923 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_m_a_x_V_a_l_u_e__ │ │ │ │ │ +real_type maxValue_ │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:361 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t │ │ │ │ │ +void init(const Matrix *matrix) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:195 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_d_i_a_g_o_n_a_l__ │ │ │ │ │ +real_type diagonal_ │ │ │ │ │ +The norm of the current diagonal. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:367 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +AggregateDescriptor * iterator │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:735 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +SymmetricDependency(const Parameters &parms) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:348 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_~_A_g_g_r_e_g_a_t_o_r │ │ │ │ │ +~Aggregator() │ │ │ │ │ +Destructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ +void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter │ │ │ │ │ +&col) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_a_d_d │ │ │ │ │ +void add(const Vertex &vertex) │ │ │ │ │ +Add a vertex to the aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_D_e_p_e_n_d_e_n_c_y_P_o_l_i_c_y │ │ │ │ │ +T DependencyPolicy │ │ │ │ │ +The policy for calculating the dependency graph. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_a_d_d │ │ │ │ │ +void add(std::vector< Vertex > &vertex) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ +void examine(const ColIter &col) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_o_r │ │ │ │ │ +Aggregator() │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +Examine an edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_F_r_o_n_t_M_a_r_k_e_r │ │ │ │ │ +FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const │ │ │ │ │ +compute the norm of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:506 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t │ │ │ │ │ +void init(const Matrix *matrix) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ +int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, │ │ │ │ │ +V &visitor) │ │ │ │ │ +Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c │ │ │ │ │ void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ Sets reasonable default values for an isotropic problem. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -AggregationParameters() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +V AggregateDescriptor │ │ │ │ │ +The aggregate descriptor type. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:580 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ +static const V ISOLATED │ │ │ │ │ +Identifier of isolated vertices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:571 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_r_o_w__ │ │ │ │ │ +int row_ │ │ │ │ │ +index of the currently evaluated row. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +SymmetricMatrixDependency() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r │ │ │ │ │ +DependencyCounter() │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_k_i_p_I_s_o_l_a_t_e_d │ │ │ │ │ -bool skipIsolated() const │ │ │ │ │ -Whether isolated aggregates will not be represented on the coarse level. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, │ │ │ │ │ -double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_C_o_a_r_s_e_n_T_a_r_g_e_t │ │ │ │ │ -void setCoarsenTarget(int nodes) │ │ │ │ │ -Set the maximum number of unknowns allowed on the coarsest level. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_N_o_P_r_e_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ -void setNoPreSmoothSteps(std::size_t steps) │ │ │ │ │ -Set the number of presmoothing steps to apply. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:420 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e │ │ │ │ │ -AccumulationMode │ │ │ │ │ -Identifiers for the different accumulation modes. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_B_e_t_a │ │ │ │ │ -void setBeta(double b) │ │ │ │ │ -Set threshold for marking nodes as isolated. The default value is 1.0E-5. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_m_a_x_D_i_s_t_a_n_c_e │ │ │ │ │ -std::size_t maxDistance() const │ │ │ │ │ -Get the maximal distance allowed between two nodes in a aggregate. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double │ │ │ │ │ -minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode │ │ │ │ │ -accumulate=successiveAccu) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_p_o_p │ │ │ │ │ +Vertex pop() │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_d_i_a_g_o_n_a_l__ │ │ │ │ │ +real_type diagonal_ │ │ │ │ │ +The norm of the current diagonal. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ +std::size_t noVertices() const │ │ │ │ │ +Get the number of vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c │ │ │ │ │ +void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ +Sets reasonable default values for an aisotropic problem. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +AggregatesMap(std::size_t noVertices) │ │ │ │ │ +Constructs with allocating memory. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +Matrix::field_type field_type │ │ │ │ │ +The current max value. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +AggregateDescriptor & operator[](const VertexDescriptor &v) │ │ │ │ │ +Get the aggregate a vertex belongs to. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +AggregatesMap() │ │ │ │ │ +Constructs without allocating memory. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_v_a_l_u_e │ │ │ │ │ +int value() │ │ │ │ │ +Access the current count. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x_L_i_s_t │ │ │ │ │ +SLList< VertexDescriptor, Allocator > VertexList │ │ │ │ │ +The type of a single linked list of vertex descriptors. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:592 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_~_S_t_a_c_k │ │ │ │ │ +~Stack() │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r │ │ │ │ │ +ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex > │ │ │ │ │ +&aggregates) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:356 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_G_a_m_m_a │ │ │ │ │ -void setGamma(std::size_t gamma) │ │ │ │ │ -Set the value of gamma; 1 for V-cycle, 2 for W-cycle. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:453 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_A_c_c_u_m_u_l_a_t_e │ │ │ │ │ -void setAccumulate(bool accu) │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:324 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s_:_:_s_e_t_M_a_x_D_i_s_t_a_n_c_e │ │ │ │ │ -void setMaxDistance(std::size_t distance) │ │ │ │ │ -Set the maximal distance allowed between two nodes in a aggregate. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_d_e_b_u_g_L_e_v_e_l │ │ │ │ │ -int debugLevel() const │ │ │ │ │ -Get the debugging Level. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:411 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s_:_:_g_e_t_N_o_P_o_s_t_S_m_o_o_t_h_S_t_e_p_s │ │ │ │ │ -std::size_t getNoPostSmoothSteps() const │ │ │ │ │ -Get the number of postsmoothing steps to apply. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:445 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_a_t_O_n_c_e_A_c_c_u │ │ │ │ │ -@ atOnceAccu │ │ │ │ │ -Accumulate data to one process at once. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_n_o_A_c_c_u │ │ │ │ │ -@ noAccu │ │ │ │ │ -No data accumulution. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u │ │ │ │ │ -@ successiveAccu │ │ │ │ │ -Successively accumulate to fewer processes. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_s_i_z_e │ │ │ │ │ +VertexSet::size_type size() │ │ │ │ │ +Get the size of the aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +get an iterator over the vertices of the aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t │ │ │ │ │ +void init(const Matrix *matrix) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +UnSymmetricCriterion() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:544 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +const AggregateDescriptor * const_iterator │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:723 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_r_o_w__ │ │ │ │ │ +int row_ │ │ │ │ │ +index of the currently evaluated row. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_S_t_a_c_k │ │ │ │ │ +Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const │ │ │ │ │ +AggregatesMap< Vertex > &aggregates) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t_R_o_w │ │ │ │ │ +void initRow(const Row &row, int index) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_M_a_t_r_i_x │ │ │ │ │ +M Matrix │ │ │ │ │ +The matrix type we build the dependency of. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:139 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_m_a_t_r_i_x__ │ │ │ │ │ +const Matrix * matrix_ │ │ │ │ │ +The matrix we work on. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:177 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_V_e_r_t_e_x_S_e_t │ │ │ │ │ +S VertexSet │ │ │ │ │ +The type of a single linked list of vertex descriptors. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:801 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const │ │ │ │ │ +compute the norm of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:490 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_U_N_A_G_G_R_E_G_A_T_E_D │ │ │ │ │ +static const V UNAGGREGATED │ │ │ │ │ +Identifier of not yet aggregated vertices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:566 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h │ │ │ │ │ +std::size_t breadthFirstSearch(const VertexDescriptor &start, const │ │ │ │ │ +AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM │ │ │ │ │ +&visitedMap) const │ │ │ │ │ +Breadth first search within an aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +Matrix::field_type field_type │ │ │ │ │ +The current max value. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:298 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_O_n_e_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > │ │ │ │ │ +&criterion) │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_i_s_I_s_o_l_a_t_e_d │ │ │ │ │ +bool isIsolated() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:240 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ +void allocate(std::size_t noVertices) │ │ │ │ │ +Allocate memory for holding the information. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_N_o_r_m │ │ │ │ │ +N Norm │ │ │ │ │ +The norm to use for examining the matrix entries. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const │ │ │ │ │ +compute the norm of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:473 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_r_e_c_o_n_s_t_r_u_c_t │ │ │ │ │ +void reconstruct(const Vertex &vertex) │ │ │ │ │ +Reconstruct the aggregat from an seed node. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +get an iterator over the vertices of the aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +FieldTraits< typenameM::field_type >::real_type operator()(const M &m, typename │ │ │ │ │ +std::enable_if_t::value > *sfinae=nullptr) const │ │ │ │ │ +compute the norm of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:390 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_V_e_r_t_e_x │ │ │ │ │ +MatrixGraph::VertexDescriptor Vertex │ │ │ │ │ +The vertex descriptor type. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:789 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_s_e_e_d │ │ │ │ │ +void seed(const Vertex &vertex) │ │ │ │ │ +Initialize the aggregate with one vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_i_s_I_s_o_l_a_t_e_d │ │ │ │ │ +bool isIsolated() │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +SymmetricDependency() │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:351 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +Clear the aggregate. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +Free the allocated memory. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +Increment counter. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_b_u_i_l_d_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, │ │ │ │ │ +bool finestLevel) │ │ │ │ │ +Build the dependency of the matrix graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +V VertexDescriptor │ │ │ │ │ +The vertex descriptor type. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:575 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_m_a_x_V_a_l_u_e__ │ │ │ │ │ +real_type maxValue_ │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s │ │ │ │ │ +std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, │ │ │ │ │ +const C &criterion, bool finestLevel) │ │ │ │ │ +Build the aggregates. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_R_o_w │ │ │ │ │ +Matrix::row_type Row │ │ │ │ │ +Constant Row iterator of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ +PoolAllocator< Vertex, 100 > Allocator │ │ │ │ │ +The allocator we use for our lists and the set. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:795 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +G MatrixGraph │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:785 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ +@ is_sign_preserving │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:483 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ +@ is_sign_preserving │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:382 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ +@ is_sign_preserving │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:499 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ +@ is_sign_preserving │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:466 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -Parameters needed to check whether a node depends on another. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -Parameters needed for the aggregation process. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -Parameters for the complete coarsening process. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ +Export the type representing the underlying field. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::const_iterator ConstColIterator │ │ │ │ │ +Const iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ +The type implementing a matrix row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +Base class of all aggregation criterions. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +Dependency policy for symmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +Dependency policy for symmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:253 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ +Dependency policy for symmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:314 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l │ │ │ │ │ +Norm that uses only the [N][N] entry of the block to determine couplings. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_i_r_s_t_D_i_a_g_o_n_a_l │ │ │ │ │ +Norm that uses only the [0][0] entry of the block to determine couplings. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:455 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m │ │ │ │ │ +Functor using the row sum (infinity) norm to determine strong couplings. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:463 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:480 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:496 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +Criterion taking advantage of symmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:519 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +Criterion suitable for unsymmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r │ │ │ │ │ +Class for building the aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:909 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ +A Dummy visitor that does nothing for each visited edge. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:598 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e │ │ │ │ │ +A class for temporarily storing the vertices of an aggregate in. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:778 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +M::size_type VertexDescriptor │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator │ │ │ │ │ +The constant edge iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:298 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +Iterator over all edges starting from a vertex. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +The vertex iterator type of the graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:209 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ All parameters for AMG. │ │ │ │ │ DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00083.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: renumberer.hh File Reference │ │ │ │ +dune-istl: properties.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,41 +71,44 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
renumberer.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include "aggregates.hh"
│ │ │ │ + │ │ │ │ +

Provides classes for handling internal properties in a graph. │ │ │ │ +More...

│ │ │ │ +
#include <dune/common/propertymap.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::AggregateRenumberer< G >
struct  Dune::Amg::VertexVisitedTag
 Tag idnetifying the visited property of a vertex. More...
 
class  Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >
 A property map that extracts one property out of a bundle using operator[]() More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class G , class I , class V >
void Dune::Amg::renumberAggregates (const G &graph, I index, I endIndex, V &visitedMap, AggregatesMap< typename G::VertexDescriptor > &aggregates)
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Provides classes for handling internal properties in a graph.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,26 +1,33 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_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 │ │ │ │ │ -renumberer.hh File Reference │ │ │ │ │ -#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +properties.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Provides classes for handling internal properties in a graph. _M_o_r_e_._._. │ │ │ │ │ +#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_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_ _G_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ +  Tag idnetifying the visited property of a vertex. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_<_ _C_,_ _K_,_ _i_,_ _T_,_ _R_ _> │ │ │ │ │ +  A property map that extracts one property out of a bundle using │ │ │ │ │ + _o_p_e_r_a_t_o_r_[_]_(_) _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_A_m_g_:_:_r_e_n_u_m_b_e_r_A_g_g_r_e_g_a_t_e_s (const G &graph, I index, I endIndex, V │ │ │ │ │ - &visitedMap, _A_g_g_r_e_g_a_t_e_s_M_a_p< typename G::VertexDescriptor > &aggregates) │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Provides classes for handling internal properties in a graph. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: renumberer.hh Source File │ │ │ │ +dune-istl: properties.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,118 +74,95 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
renumberer.hh
│ │ │ │ +
properties.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_RENUMBERER_HH
│ │ │ │ -
6#define DUNE_AMG_RENUMBERER_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH
│ │ │ │ +
6#define DUNE_ISTL_AMG_PROPERTIES_HH
│ │ │ │
7
│ │ │ │ -
8#include "aggregates.hh"
│ │ │ │ +
8#include <dune/common/propertymap.hh>
│ │ │ │
9
│ │ │ │
10namespace Dune
│ │ │ │
11{
│ │ │ │ -
12 namespace Amg
│ │ │ │ -
13 {
│ │ │ │ -
14 template<class G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
16 {
│ │ │ │ -
17 public:
│ │ │ │ -
19 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
20
│ │ │ │ - │ │ │ │ -
26
│ │ │ │ -
28 operator Vertex() const;
│ │ │ │ -
29
│ │ │ │ -
30 void operator()(const typename G::ConstEdgeIterator& edge);
│ │ │ │ +
12
│ │ │ │ +
13 namespace Amg
│ │ │ │ +
14 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
29 {};
│ │ │ │ +
│ │ │ │ +
30
│ │ │ │
31
│ │ │ │ -
32 void operator++();
│ │ │ │ -
33
│ │ │ │ -
34 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
37 };
│ │ │ │ -
│ │ │ │ -
38
│ │ │ │ -
39 template<class G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
41 : number_(0), aggregates_(aggregates)
│ │ │ │ -
42 {}
│ │ │ │ -
│ │ │ │ -
43
│ │ │ │ -
44 template<class G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
46 {
│ │ │ │ -
47 return number_;
│ │ │ │ -
48 }
│ │ │ │ -
│ │ │ │ -
49
│ │ │ │ -
50 template<class G>
│ │ │ │ -
│ │ │ │ -
51 void AggregateRenumberer<G>::operator()(const typename G::ConstEdgeIterator& edge)
│ │ │ │ -
52 {
│ │ │ │ -
53 aggregates_[edge.target()]=number_;
│ │ │ │ -
54 }
│ │ │ │ -
│ │ │ │ -
55
│ │ │ │ -
56 template<class G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
58 {
│ │ │ │ -
59 ++number_;
│ │ │ │ -
60 }
│ │ │ │ -
│ │ │ │ -
61
│ │ │ │ -
62 template<class G, class I, class V>
│ │ │ │ -
│ │ │ │ -
63 void renumberAggregates(const G& graph, I index, I endIndex, V& visitedMap,
│ │ │ │ - │ │ │ │ -
65 {
│ │ │ │ -
66 AggregateRenumberer<G> renumberer(aggregates);
│ │ │ │ -
67
│ │ │ │ -
68 for(I index1=index; index1 != endIndex; ++index1)
│ │ │ │ -
69 if(aggregates[index1.index()]!=AggregatesMap<typename G::VertexDescriptor>::ISOLATED &&
│ │ │ │ -
70 !get(visitedMap, index1.index())) {
│ │ │ │ -
71
│ │ │ │ -
72 aggregates.template breadthFirstSearch<false>(index1.index(), aggregates[index1.index()],
│ │ │ │ -
73 graph, renumberer, visitedMap);
│ │ │ │ -
74 aggregates[index1.index()] = renumberer;
│ │ │ │ -
75 ++renumberer;
│ │ │ │ -
76 }
│ │ │ │ -
77 for(; index != endIndex; ++index)
│ │ │ │ -
78 put(visitedMap, index.index(), false);
│ │ │ │ -
79 }
│ │ │ │ -
│ │ │ │ -
80
│ │ │ │ -
81 } // namespace AMG
│ │ │ │ -
82} // namespace Dune
│ │ │ │ -
83#endif
│ │ │ │ -
Provides classes for the Coloring process of AMG.
│ │ │ │ +
38 template<typename C, typename K, std::size_t i,typename T=typename C::ValueType,
│ │ │ │ +
39 typename R = typename C::Reference>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
41 : public RAPropertyMapHelper<R,
│ │ │ │ +
42 RandomAccessBundledPropertyMap<C,K,i,T,R> >
│ │ │ │ +
43 {
│ │ │ │ +
44 public:
│ │ │ │ +
46 typedef C Container;
│ │ │ │ +
47
│ │ │ │ +
49 typedef R Reference;
│ │ │ │ +
50
│ │ │ │ +
52 typedef K Key;
│ │ │ │ +
53
│ │ │ │ +
57 typedef LvaluePropertyMapTag Category;
│ │ │ │ +
58
│ │ │ │ +
59 enum {
│ │ │ │ +
61 index = i
│ │ │ │ +
62 };
│ │ │ │ +
63
│ │ │ │ +
│ │ │ │ +
69 Reference operator[](const Key& key) const
│ │ │ │ +
70 {
│ │ │ │ +
71 return container_[key][index];
│ │ │ │ +
72 }
│ │ │ │ +
│ │ │ │ +
73
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
79 : container_(&container)
│ │ │ │ +
80 {}
│ │ │ │ +
│ │ │ │ +
81
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
84 : container_(0)
│ │ │ │ +
85 {}
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
87 private:
│ │ │ │ +
89 Container* container_;
│ │ │ │ +
90 };
│ │ │ │ +
│ │ │ │ +
91 }
│ │ │ │ +
92}
│ │ │ │ +
93
│ │ │ │ +
94#endif
│ │ │ │ +
Reference operator[](const Key &key) const
Get the property for a key.
Definition properties.hh:69
│ │ │ │ +
RandomAccessBundledPropertyMap()
The default constructor.
Definition properties.hh:83
│ │ │ │ +
R Reference
The reference type of the container.
Definition properties.hh:49
│ │ │ │ +
RandomAccessBundledPropertyMap(Container &container)
Constructor.
Definition properties.hh:78
│ │ │ │ +
K Key
The key of the property map.
Definition properties.hh:52
│ │ │ │ +
LvaluePropertyMapTag Category
The category of the property map.
Definition properties.hh:57
│ │ │ │ +
C Container
The container that holds the properties.
Definition properties.hh:46
│ │ │ │ +
@ index
The index of the property in the bundle.
Definition properties.hh:61
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap, AggregatesMap< typename G::VertexDescriptor > &aggregates)
Definition renumberer.hh:63
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
Definition renumberer.hh:16
│ │ │ │ -
void operator++()
Definition renumberer.hh:57
│ │ │ │ -
G::VertexDescriptor Vertex
The vertex type.
Definition renumberer.hh:19
│ │ │ │ -
void operator()(const typename G::ConstEdgeIterator &edge)
Definition renumberer.hh:51
│ │ │ │ -
AggregatesMap< Vertex > & aggregates_
Definition renumberer.hh:36
│ │ │ │ -
AggregateRenumberer(AggregatesMap< Vertex > &aggregates)
Constructor.
Definition renumberer.hh:40
│ │ │ │ -
Vertex number_
Definition renumberer.hh:35
│ │ │ │ +
Tag idnetifying the visited property of a vertex.
Definition properties.hh:29
│ │ │ │ +
A property map that extracts one property out of a bundle using operator[]()
Definition properties.hh:43
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,131 +1,110 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -renumberer.hh │ │ │ │ │ +properties.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_RENUMBERER_HH │ │ │ │ │ -6#define DUNE_AMG_RENUMBERER_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH │ │ │ │ │ +6#define DUNE_ISTL_AMG_PROPERTIES_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +8#include │ │ │ │ │ 9 │ │ │ │ │ 10namespace _D_u_n_e │ │ │ │ │ 11{ │ │ │ │ │ -12 namespace Amg │ │ │ │ │ -13 { │ │ │ │ │ -14 template │ │ │ │ │ -_1_5 class _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ -16 { │ │ │ │ │ -17 public: │ │ │ │ │ -_1_9 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ -20 │ │ │ │ │ -25 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates); │ │ │ │ │ -26 │ │ │ │ │ -28 operator _V_e_r_t_e_x() const; │ │ │ │ │ -29 │ │ │ │ │ -30 void _o_p_e_r_a_t_o_r_(_)(const typename G::ConstEdgeIterator& edge); │ │ │ │ │ +12 │ │ │ │ │ +13 namespace Amg │ │ │ │ │ +14 { │ │ │ │ │ +_2_8 struct _V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ +29 {}; │ │ │ │ │ +30 │ │ │ │ │ 31 │ │ │ │ │ -32 void _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -33 │ │ │ │ │ -34 protected: │ │ │ │ │ -_3_5 _V_e_r_t_e_x _n_u_m_b_e_r__; │ │ │ │ │ -_3_6 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& _a_g_g_r_e_g_a_t_e_s__; │ │ │ │ │ -37 }; │ │ │ │ │ -38 │ │ │ │ │ -39 template │ │ │ │ │ -_4_0 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ -aggregates) │ │ │ │ │ -41 : number_(0), aggregates_(aggregates) │ │ │ │ │ -42 {} │ │ │ │ │ -43 │ │ │ │ │ -44 template │ │ │ │ │ -_4_5 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r _V_e_r_t_e_x() const │ │ │ │ │ -46 { │ │ │ │ │ -47 return number_; │ │ │ │ │ -48 } │ │ │ │ │ -49 │ │ │ │ │ -50 template │ │ │ │ │ -_5_1 void _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r_(_)(const typename G::ConstEdgeIterator& │ │ │ │ │ -edge) │ │ │ │ │ -52 { │ │ │ │ │ -53 aggregates_[edge.target()]=number_; │ │ │ │ │ -54 } │ │ │ │ │ -55 │ │ │ │ │ -56 template │ │ │ │ │ -_5_7 void _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -58 { │ │ │ │ │ -59 ++number_; │ │ │ │ │ -60 } │ │ │ │ │ -61 │ │ │ │ │ -62 template │ │ │ │ │ -_6_3 void _r_e_n_u_m_b_e_r_A_g_g_r_e_g_a_t_e_s(const G& graph, I index, I endIndex, V& visitedMap, │ │ │ │ │ -64 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates) │ │ │ │ │ -65 { │ │ │ │ │ -66 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_> renumberer(aggregates); │ │ │ │ │ -67 │ │ │ │ │ -68 for(I index1=index; index1 != endIndex; ++index1) │ │ │ │ │ -69 if(aggregates[index1.index()]!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_: │ │ │ │ │ -_I_S_O_L_A_T_E_D && │ │ │ │ │ -70 !_g_e_t(visitedMap, index1.index())) { │ │ │ │ │ -71 │ │ │ │ │ -72 aggregates.template breadthFirstSearch(index1.index(), aggregates │ │ │ │ │ -[index1.index()], │ │ │ │ │ -73 graph, renumberer, visitedMap); │ │ │ │ │ -74 aggregates[index1.index()] = renumberer; │ │ │ │ │ -75 ++renumberer; │ │ │ │ │ -76 } │ │ │ │ │ -77 for(; index != endIndex; ++index) │ │ │ │ │ -78 put(visitedMap, index.index(), false); │ │ │ │ │ -79 } │ │ │ │ │ -80 │ │ │ │ │ -81 } // namespace AMG │ │ │ │ │ -82} // namespace Dune │ │ │ │ │ -83#endif │ │ │ │ │ -_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ -Provides classes for the Coloring process of AMG. │ │ │ │ │ +38 template │ │ │ │ │ +_4_0 class _R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ +41 : public RAPropertyMapHelper > │ │ │ │ │ +43 { │ │ │ │ │ +44 public: │ │ │ │ │ +_4_6 typedef C _C_o_n_t_a_i_n_e_r; │ │ │ │ │ +47 │ │ │ │ │ +_4_9 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ +50 │ │ │ │ │ +_5_2 typedef K _K_e_y; │ │ │ │ │ +53 │ │ │ │ │ +_5_7 typedef LvaluePropertyMapTag _C_a_t_e_g_o_r_y; │ │ │ │ │ +58 │ │ │ │ │ +59 enum { │ │ │ │ │ +61 _i_n_d_e_x = i │ │ │ │ │ +_6_2 }; │ │ │ │ │ +63 │ │ │ │ │ +_6_9 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](const _K_e_y& key) const │ │ │ │ │ +70 { │ │ │ │ │ +71 return container_[key][_i_n_d_e_x]; │ │ │ │ │ +72 } │ │ │ │ │ +73 │ │ │ │ │ +_7_8 _R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p(_C_o_n_t_a_i_n_e_r& container) │ │ │ │ │ +79 : container_(&container) │ │ │ │ │ +80 {} │ │ │ │ │ +81 │ │ │ │ │ +_8_3 _R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p() │ │ │ │ │ +84 : container_(0) │ │ │ │ │ +85 {} │ │ │ │ │ +86 │ │ │ │ │ +87 private: │ │ │ │ │ +89 _C_o_n_t_a_i_n_e_r* container_; │ │ │ │ │ +90 }; │ │ │ │ │ +91 } │ │ │ │ │ +92} │ │ │ │ │ +93 │ │ │ │ │ +94#endif │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +Reference operator[](const Key &key) const │ │ │ │ │ +Get the property for a key. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ +RandomAccessBundledPropertyMap() │ │ │ │ │ +The default constructor. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ +R Reference │ │ │ │ │ +The reference type of the container. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ +RandomAccessBundledPropertyMap(Container &container) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_K_e_y │ │ │ │ │ +K Key │ │ │ │ │ +The key of the property map. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +LvaluePropertyMapTag Category │ │ │ │ │ +The category of the property map. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ +C Container │ │ │ │ │ +The container that holds the properties. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_i_n_d_e_x │ │ │ │ │ +@ index │ │ │ │ │ +The index of the property in the bundle. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:61 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_r_e_n_u_m_b_e_r_A_g_g_r_e_g_a_t_e_s │ │ │ │ │ -void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap, │ │ │ │ │ -AggregatesMap< typename G::VertexDescriptor > &aggregates) │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -void operator++() │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_V_e_r_t_e_x │ │ │ │ │ -G::VertexDescriptor Vertex │ │ │ │ │ -The vertex type. │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename G::ConstEdgeIterator &edge) │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_a_g_g_r_e_g_a_t_e_s__ │ │ │ │ │ -AggregatesMap< Vertex > & aggregates_ │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ -AggregateRenumberer(AggregatesMap< Vertex > &aggregates) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_n_u_m_b_e_r__ │ │ │ │ │ -Vertex number_ │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ +Tag idnetifying the visited property of a vertex. │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ +A property map that extracts one property out of a bundle using operator[]() │ │ │ │ │ +DDeeffiinniittiioonn properties.hh:43 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00086.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: construction.hh File Reference │ │ │ │ +dune-istl: indicescoarsener.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,60 +72,50 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Helper classes for the construction of classes without empty constructor. │ │ │ │ +

Provides a class for building the index set and remote indices on the coarse level. │ │ │ │ More...

│ │ │ │ -
#include <dune/istl/bvector.hh>
│ │ │ │ -#include <dune/istl/operators.hh>
│ │ │ │ -#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ -#include <dune/istl/solvercategory.hh>
│ │ │ │ -#include "pinfo.hh"
│ │ │ │ +
#include <dune/common/parallel/indicessyncer.hh>
│ │ │ │ +#include <vector>
│ │ │ │ +#include "renumberer.hh"
│ │ │ │ +#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ +#include "pinfo.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::ConstructionTraits< BlockVector< T, A > >
class  Dune::Amg::IndicesCoarsener< T, E >
 
struct  Dune::Amg::ParallelOperatorArgs< M, C >
class  Dune::Amg::ParallelIndicesCoarsener< T, E >
 
struct  Dune::Amg::OwnerOverlapCopyCommunicationArgs
class  Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >
 Coarsen Indices in the parallel case. More...
 
struct  Dune::Amg::SequentialCommunicationArgs
 
struct  Dune::Amg::ConstructionTraits< OverlappingSchwarzOperator< M, X, Y, C > >
 
struct  Dune::Amg::ConstructionTraits< NonoverlappingSchwarzOperator< M, X, Y, C > >
 
struct  Dune::Amg::MatrixAdapterArgs< M, X, Y >
 
struct  Dune::Amg::ConstructionTraits< MatrixAdapter< M, X, Y > >
 
struct  Dune::Amg::ConstructionTraits< SequentialInformation >
 
struct  Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > >
class  Dune::Amg::IndicesCoarsener< SequentialInformation, E >
 Coarsen Indices in the sequential case. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │

Detailed Description

│ │ │ │ -

Helper classes for the construction of classes without empty constructor.

│ │ │ │ +

Provides a class for building the index set and remote indices on the coarse level.

│ │ │ │
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,53 +2,41 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -construction.hh File Reference │ │ │ │ │ +indicescoarsener.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Helper classes for the construction of classes without empty constructor. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +Provides a class for building the index set and remote indices on the coarse │ │ │ │ │ +level. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ #include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ #include "_p_i_n_f_o_._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_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _T_,_ _E_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_<_ _M_,_ _C_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _T_,_ _E_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_,_ _L_ _>_,_ _E_ _> │ │ │ │ │ +  Coarsen Indices in the parallel case. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C │ │ │ │ │ - _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_, │ │ │ │ │ - _C_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ - _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_,_ _E_ _> │ │ │ │ │ +  Coarsen Indices in the sequential case. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Helper classes for the construction of classes without empty constructor. │ │ │ │ │ +Provides a class for building the index set and remote indices on the coarse │ │ │ │ │ +level. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: construction.hh Source File │ │ │ │ +dune-istl: indicescoarsener.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,256 +74,436 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
construction.hh
│ │ │ │ +
indicescoarsener.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMGCONSTRUCTION_HH
│ │ │ │ -
6#define DUNE_AMGCONSTRUCTION_HH
│ │ │ │ +
5#ifndef DUNE_AMG_INDICESCOARSENER_HH
│ │ │ │ +
6#define DUNE_AMG_INDICESCOARSENER_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
12#include "pinfo.hh"
│ │ │ │ -
13
│ │ │ │ -
14namespace Dune
│ │ │ │ -
15{
│ │ │ │ -
16 namespace Amg
│ │ │ │ -
17 {
│ │ │ │ -
18
│ │ │ │ -
37 template<typename T>
│ │ │ │ -
38 struct ConstructionTraits
│ │ │ │ -
39 {
│ │ │ │ -
44 typedef const void* Arguments;
│ │ │ │ -
45
│ │ │ │ -
│ │ │ │ -
52 static inline std::shared_ptr<T> construct(Arguments& args)
│ │ │ │ -
53 {
│ │ │ │ -
54 return std::make_shared<T>();
│ │ │ │ -
55 }
│ │ │ │ -
│ │ │ │ -
56 };
│ │ │ │ -
57
│ │ │ │ -
58 template<class T, class A>
│ │ │ │ -
│ │ │ │ -
59 struct ConstructionTraits<BlockVector<T,A> >
│ │ │ │ -
60 {
│ │ │ │ -
61 typedef const int Arguments;
│ │ │ │ -
│ │ │ │ -
62 static inline std::shared_ptr<BlockVector<T,A>> construct(Arguments& n)
│ │ │ │ -
63 {
│ │ │ │ -
64 return std::make_shared<BlockVector<T,A>>(n);
│ │ │ │ -
65 }
│ │ │ │ -
│ │ │ │ -
66 };
│ │ │ │ -
│ │ │ │ -
67
│ │ │ │ -
68 template<class M, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
70 {
│ │ │ │ -
│ │ │ │ -
71 ParallelOperatorArgs(std::shared_ptr<M> matrix, const C& comm)
│ │ │ │ -
72 : matrix_(matrix), comm_(comm)
│ │ │ │ -
73 {}
│ │ │ │ -
│ │ │ │ -
74
│ │ │ │ -
75 std::shared_ptr<M> matrix_;
│ │ │ │ -
76 const C& comm_;
│ │ │ │ -
77 };
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
79#if HAVE_MPI
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
81 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
83 : comm_(comm), cat_(cat)
│ │ │ │ -
84 {}
│ │ │ │ -
│ │ │ │ -
85
│ │ │ │ -
86 MPI_Comm comm_;
│ │ │ │ - │ │ │ │ -
88 };
│ │ │ │ -
│ │ │ │ -
89#endif
│ │ │ │ -
90
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
92 {
│ │ │ │ -
│ │ │ │ -
93 SequentialCommunicationArgs(Communication<void*> comm, [[maybe_unused]] int cat)
│ │ │ │ -
94 : comm_(comm)
│ │ │ │ -
95 {}
│ │ │ │ -
│ │ │ │ +
8#include <dune/common/parallel/indicessyncer.hh>
│ │ │ │ +
9#include <vector>
│ │ │ │ +
10#include "renumberer.hh"
│ │ │ │ +
11
│ │ │ │ +
12#if HAVE_MPI
│ │ │ │ + │ │ │ │ +
14#endif
│ │ │ │ +
15
│ │ │ │ +
16#include "pinfo.hh"
│ │ │ │ +
17
│ │ │ │ +
18namespace Dune
│ │ │ │ +
19{
│ │ │ │ +
20 namespace Amg
│ │ │ │ +
21 {
│ │ │ │ +
22
│ │ │ │ +
34 template<typename T, typename E>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
36 {};
│ │ │ │ +
│ │ │ │ +
37
│ │ │ │ +
38
│ │ │ │ +
39#if HAVE_MPI
│ │ │ │ +
40
│ │ │ │ +
41 template<typename T, typename E>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
43 {
│ │ │ │ +
44 public:
│ │ │ │ + │ │ │ │ +
49
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
55 typedef typename ParallelInformation::ParallelIndexSet ParallelIndexSet;
│ │ │ │ +
56
│ │ │ │ +
60 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ +
61
│ │ │ │ +
65 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
│ │ │ │ +
66
│ │ │ │ +
70 typedef typename LocalIndex::Attribute Attribute;
│ │ │ │ +
71
│ │ │ │ +
75 typedef Dune::RemoteIndices<ParallelIndexSet> RemoteIndices;
│ │ │ │ +
76
│ │ │ │ +
88 template<typename Graph, typename VM>
│ │ │ │ +
89 static typename Graph::VertexDescriptor
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
91 Graph& fineGraph,
│ │ │ │ +
92 VM& visitedMap,
│ │ │ │ + │ │ │ │ +
94 ParallelInformation& coarseInfo,
│ │ │ │ +
95 typename Graph::VertexDescriptor noAggregates);
│ │ │ │
96
│ │ │ │ -
97 Communication<void*> comm_;
│ │ │ │ -
98 };
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
100 } // end Amg namspace
│ │ │ │ -
101
│ │ │ │ -
102 // forward declaration
│ │ │ │ -
103 template<class M, class X, class Y, class C>
│ │ │ │ - │ │ │ │ -
105
│ │ │ │ -
106 template<class M, class X, class Y, class C>
│ │ │ │ - │ │ │ │ +
97 private:
│ │ │ │ +
98 template<typename G, typename I>
│ │ │ │ +
99 class ParallelAggregateRenumberer : public AggregateRenumberer<G>
│ │ │ │ +
100 {
│ │ │ │ +
101 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
102
│ │ │ │ +
103 typedef I GlobalLookupIndexSet;
│ │ │ │ +
104
│ │ │ │ +
105 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
│ │ │ │ +
106
│ │ │ │ +
107 typedef typename IndexPair::GlobalIndex GlobalIndex;
│ │ │ │
108
│ │ │ │ -
109 namespace Amg
│ │ │ │ -
110 {
│ │ │ │ -
111 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ -
112 struct ConstructionTraits<OverlappingSchwarzOperator<M,X,Y,C> >
│ │ │ │ -
113 {
│ │ │ │ - │ │ │ │ +
109 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
111 : AggregateRenumberer<G>(aggregates), isPublic_(false), lookup_(lookup),
│ │ │ │ +
112 globalIndex_(std::numeric_limits<GlobalIndex>::max())
│ │ │ │ +
113 {}
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │
115
│ │ │ │
│ │ │ │ -
116 static inline std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
│ │ │ │ -
117 {
│ │ │ │ -
118 return std::make_shared<OverlappingSchwarzOperator<M,X,Y,C>>
│ │ │ │ -
119 (args.matrix_, args.comm_);
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121 };
│ │ │ │ -
│ │ │ │ -
122
│ │ │ │ -
123 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ -
124 struct ConstructionTraits<NonoverlappingSchwarzOperator<M,X,Y,C> >
│ │ │ │ -
125 {
│ │ │ │ - │ │ │ │ -
127
│ │ │ │ -
│ │ │ │ -
128 static inline std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
│ │ │ │ -
129 {
│ │ │ │ -
130 return std::make_shared<NonoverlappingSchwarzOperator<M,X,Y,C>>
│ │ │ │ -
131 (args.matrix_, args.comm_);
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133 };
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
135 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
137 {
│ │ │ │ -
│ │ │ │ -
138 MatrixAdapterArgs(std::shared_ptr<M> matrix, const SequentialInformation)
│ │ │ │ -
139 : matrix_(matrix)
│ │ │ │ -
140 {}
│ │ │ │ -
│ │ │ │ -
141
│ │ │ │ -
142 std::shared_ptr<M> matrix_;
│ │ │ │ -
143 };
│ │ │ │ -
│ │ │ │ -
144
│ │ │ │ -
145 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
146 struct ConstructionTraits<MatrixAdapter<M,X,Y> >
│ │ │ │ -
147 {
│ │ │ │ - │ │ │ │ +
116 void operator()(const typename G::ConstEdgeIterator& edge)
│ │ │ │ +
117 {
│ │ │ │ + │ │ │ │ +
119 const IndexPair* pair= lookup_.pair(edge.target());
│ │ │ │ +
120 if(pair!=0) {
│ │ │ │ +
121 globalIndex(pair->global());
│ │ │ │ +
122 attribute(pair->local().attribute());
│ │ │ │ +
123 isPublic(pair->local().isPublic());
│ │ │ │ +
124 }
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
│ │ │ │ +
127 Vertex operator()([[maybe_unused]] const GlobalIndex& global)
│ │ │ │ +
128 {
│ │ │ │ +
129 Vertex current = this->number_;
│ │ │ │ +
130 this->operator++();
│ │ │ │ +
131 return current;
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
│ │ │ │ +
134 bool isPublic()
│ │ │ │ +
135 {
│ │ │ │ +
136 return isPublic_;
│ │ │ │ +
137 }
│ │ │ │ +
│ │ │ │ +
138
│ │ │ │ +
│ │ │ │ +
139 void isPublic(bool b)
│ │ │ │ +
140 {
│ │ │ │ +
141 isPublic_ = isPublic_ || b;
│ │ │ │ +
142 }
│ │ │ │ +
│ │ │ │ +
143
│ │ │ │ +
│ │ │ │ +
144 void reset()
│ │ │ │ +
145 {
│ │ │ │ +
146 globalIndex_ = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ +
147 isPublic_=false;
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │
149
│ │ │ │
│ │ │ │ -
150 static inline std::shared_ptr<MatrixAdapter<M,X,Y>> construct(Arguments& args)
│ │ │ │ -
151 {
│ │ │ │ -
152 return std::make_shared<MatrixAdapter<M,X,Y>>(args.matrix_);
│ │ │ │ -
153 }
│ │ │ │ -
│ │ │ │ -
154 };
│ │ │ │ -
│ │ │ │ -
155
│ │ │ │ -
156 template<>
│ │ │ │ -
│ │ │ │ -
157 struct ConstructionTraits<SequentialInformation>
│ │ │ │ -
158 {
│ │ │ │ - │ │ │ │ + │ │ │ │ +
151 {
│ │ │ │ +
152 attribute_=attribute;
│ │ │ │ +
153 }
│ │ │ │ +
│ │ │ │ +
154
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 {
│ │ │ │ +
157 return attribute_;
│ │ │ │ +
158 }
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │
│ │ │ │ -
160 static inline std::shared_ptr<SequentialInformation> construct(Arguments& args)
│ │ │ │ -
161 {
│ │ │ │ -
162 return std::make_shared<SequentialInformation>(args.comm_);
│ │ │ │ -
163 }
│ │ │ │ -
│ │ │ │ -
164 };
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
166
│ │ │ │ -
167#if HAVE_MPI
│ │ │ │ -
168
│ │ │ │ -
169 template<class T1, class T2>
│ │ │ │ -
│ │ │ │ -
170 struct ConstructionTraits<OwnerOverlapCopyCommunication<T1,T2> >
│ │ │ │ -
171 {
│ │ │ │ - │ │ │ │ -
173
│ │ │ │ -
│ │ │ │ -
174 static inline std::shared_ptr<OwnerOverlapCopyCommunication<T1,T2>> construct(Arguments& args)
│ │ │ │ -
175 {
│ │ │ │ -
176 return std::make_shared<OwnerOverlapCopyCommunication<T1,T2>>(args.comm_, args.cat_);
│ │ │ │ -
177 }
│ │ │ │ -
│ │ │ │ -
178 };
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
180#endif
│ │ │ │ -
181
│ │ │ │ -
183 } // namespace Amg
│ │ │ │ -
184} // namespace Dune
│ │ │ │ -
185#endif
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
const int Arguments
Definition construction.hh:61
│ │ │ │ -
SequentialCommunicationArgs(Communication< void * > comm, int cat)
Definition construction.hh:93
│ │ │ │ -
OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat)
Definition construction.hh:82
│ │ │ │ -
MPI_Comm comm_
Definition construction.hh:86
│ │ │ │ -
SolverCategory::Category cat_
Definition construction.hh:87
│ │ │ │ -
const C & comm_
Definition construction.hh:76
│ │ │ │ -
ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm)
Definition construction.hh:71
│ │ │ │ -
std::shared_ptr< M > matrix_
Definition construction.hh:75
│ │ │ │ -
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ -
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ -
Communication< void * > comm_
Definition construction.hh:97
│ │ │ │ -
static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n)
Definition construction.hh:62
│ │ │ │ +
160 const GlobalIndex& globalIndex() const
│ │ │ │ +
161 {
│ │ │ │ +
162 return globalIndex_;
│ │ │ │ +
163 }
│ │ │ │ +
│ │ │ │ +
164
│ │ │ │ +
│ │ │ │ +
165 void globalIndex(const GlobalIndex& global)
│ │ │ │ +
166 {
│ │ │ │ +
167 globalIndex_ = global;
│ │ │ │ +
168 }
│ │ │ │ +
│ │ │ │ +
169
│ │ │ │ +
170 private:
│ │ │ │ +
171 bool isPublic_;
│ │ │ │ +
172 Attribute attribute_;
│ │ │ │ +
173 const GlobalLookupIndexSet& lookup_;
│ │ │ │ +
174 GlobalIndex globalIndex_;
│ │ │ │ +
175 };
│ │ │ │ +
176
│ │ │ │ +
177 template<typename Graph, typename VM, typename I>
│ │ │ │ +
178 static void buildCoarseIndexSet(const ParallelInformation& pinfo,
│ │ │ │ +
179 Graph& fineGraph,
│ │ │ │ +
180 VM& visitedMap,
│ │ │ │ + │ │ │ │ +
182 ParallelIndexSet& coarseIndices,
│ │ │ │ +
183 ParallelAggregateRenumberer<Graph,I>& renumberer);
│ │ │ │ +
184
│ │ │ │ +
185 template<typename Graph,typename I>
│ │ │ │ +
186 static void buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
│ │ │ │ + │ │ │ │ +
188 ParallelIndexSet& coarseIndices,
│ │ │ │ +
189 RemoteIndices& coarseRemote,
│ │ │ │ +
190 ParallelAggregateRenumberer<Graph,I>& renumberer);
│ │ │ │ +
191
│ │ │ │ +
192 };
│ │ │ │ +
193
│ │ │ │ +
197 template<typename G, typename L, typename E>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
199 : public ParallelIndicesCoarsener<OwnerOverlapCopyCommunication<G,L>,E>
│ │ │ │ +
200 {};
│ │ │ │ +
│ │ │ │ +
201
│ │ │ │ +
202
│ │ │ │ +
203#endif
│ │ │ │ +
204
│ │ │ │ +
211 template<typename E>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
213 {
│ │ │ │ +
214 public:
│ │ │ │ +
215 template<typename Graph, typename VM>
│ │ │ │ +
216 static typename Graph::VertexDescriptor
│ │ │ │ +
217 coarsen(const SequentialInformation & fineInfo,
│ │ │ │ +
218 Graph& fineGraph,
│ │ │ │ +
219 VM& visitedMap,
│ │ │ │ + │ │ │ │ +
221 SequentialInformation& coarseInfo,
│ │ │ │ +
222 typename Graph::VertexDescriptor noAggregates);
│ │ │ │ +
223 };
│ │ │ │ +
│ │ │ │ +
224
│ │ │ │ +
225#if HAVE_MPI
│ │ │ │ +
226 template<typename T, typename E>
│ │ │ │ +
227 template<typename Graph, typename VM>
│ │ │ │ +
228 inline typename Graph::VertexDescriptor
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
230 Graph& fineGraph,
│ │ │ │ +
231 VM& visitedMap,
│ │ │ │ + │ │ │ │ +
233 ParallelInformation& coarseInfo,
│ │ │ │ +
234 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates)
│ │ │ │ +
235 {
│ │ │ │ +
236 ParallelAggregateRenumberer<Graph,typename ParallelInformation::GlobalLookupIndexSet> renumberer(aggregates, fineInfo.globalLookup());
│ │ │ │ +
237 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,
│ │ │ │ +
238 coarseInfo.indexSet(), renumberer);
│ │ │ │ +
239 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, coarseInfo.indexSet(),
│ │ │ │ +
240 coarseInfo.remoteIndices(), renumberer);
│ │ │ │ +
241
│ │ │ │ +
242 return renumberer;
│ │ │ │ +
243 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ +
245 template<typename T, typename E>
│ │ │ │ +
246 template<typename Graph, typename VM, typename I>
│ │ │ │ +
247 void ParallelIndicesCoarsener<T,E>::buildCoarseIndexSet(const ParallelInformation& pinfo,
│ │ │ │ +
248 Graph& fineGraph,
│ │ │ │ +
249 VM& visitedMap,
│ │ │ │ + │ │ │ │ +
251 ParallelIndexSet& coarseIndices,
│ │ │ │ +
252 ParallelAggregateRenumberer<Graph,I>& renumberer)
│ │ │ │ +
253 {
│ │ │ │ +
254 // fineGraph is the local subgraph corresponding to the vertices the process owns.
│ │ │ │ +
255 // i.e. no overlap/copy vertices can be visited traversing the graph
│ │ │ │ +
256 typedef typename Graph::ConstVertexIterator Iterator;
│ │ │ │ +
257 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
│ │ │ │ +
258
│ │ │ │ +
259 Iterator end = fineGraph.end();
│ │ │ │ +
260 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();
│ │ │ │ +
261
│ │ │ │ +
262 coarseIndices.beginResize();
│ │ │ │ +
263
│ │ │ │ +
264 // Setup the coarse index set and renumber the aggregate consecutively
│ │ │ │ +
265 // ascending from zero according to the minimum global index belonging
│ │ │ │ +
266 // to the aggregate
│ │ │ │ +
267 for(Iterator index = fineGraph.begin(); index != end; ++index) {
│ │ │ │ + │ │ │ │ +
269 // Isolated vertices will not be represented on the next level.
│ │ │ │ +
270 // These should only be there if skipIsolated is activiated in
│ │ │ │ +
271 // the coarsening criterion as otherwise they will be aggregated
│ │ │ │ +
272 // and should have real aggregate number in the map right now.
│ │ │ │ +
273 if(!get(visitedMap, *index)) {
│ │ │ │ +
274 // This vertex was not visited by breadthFirstSearch yet.
│ │ │ │ +
275 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
│ │ │ │ +
276 const IndexPair* pair= lookup.pair(*index);
│ │ │ │ +
277
│ │ │ │ +
278 renumberer.reset(); // reset attribute and global index.
│ │ │ │ +
279 if(pair!=0) {
│ │ │ │ +
280 // vertex is in the index set. Note that not all vertices have
│ │ │ │ +
281 // to be in the index set, just the ones where communication
│ │ │ │ +
282 // will happen.
│ │ │ │ +
283 assert(!ExcludedAttributes::contains(pair->local().attribute()));
│ │ │ │ +
284 renumberer.attribute(pair->local().attribute());
│ │ │ │ +
285 renumberer.isPublic(pair->local().isPublic());
│ │ │ │ +
286 renumberer.globalIndex(pair->global());
│ │ │ │ +
287 }
│ │ │ │ +
288
│ │ │ │ +
289 // Reconstruct aggregate and mark vertices as visited
│ │ │ │ +
290 aggregates.template breadthFirstSearch<false>(*index, aggregates[*index],
│ │ │ │ +
291 fineGraph, renumberer, visitedMap);
│ │ │ │ +
292
│ │ │ │ +
293 if(renumberer.globalIndex()!=std::numeric_limits<GlobalIndex>::max()) {
│ │ │ │ +
294 // vertex is in the index set.
│ │ │ │ +
295 //std::cout <<" Adding global="<< renumberer.globalIndex()<<" local="<<static_cast<std::size_t>(renumberer)<<std::endl;
│ │ │ │ +
296 coarseIndices.add(renumberer.globalIndex(),
│ │ │ │ +
297 LocalIndex(renumberer, renumberer.attribute(),
│ │ │ │ +
298 renumberer.isPublic()));
│ │ │ │ +
299 }
│ │ │ │ +
300
│ │ │ │ +
301 aggregates[*index] = renumberer;
│ │ │ │ +
302 ++renumberer;
│ │ │ │ +
303 }
│ │ │ │ +
304 }
│ │ │ │ +
305
│ │ │ │ +
306 coarseIndices.endResize();
│ │ │ │ +
307
│ │ │ │ +
308 assert(static_cast<std::size_t>(renumberer) >= coarseIndices.size());
│ │ │ │ +
309
│ │ │ │ +
310 // Reset the visited flags
│ │ │ │ +
311 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)
│ │ │ │ +
312 put(visitedMap, *vertex, false);
│ │ │ │ +
313 }
│ │ │ │ +
314
│ │ │ │ +
315 template<typename T, typename E>
│ │ │ │ +
316 template<typename Graph, typename I>
│ │ │ │ +
317 void ParallelIndicesCoarsener<T,E>::buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
│ │ │ │ +
318 const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
│ │ │ │ +
319 ParallelIndexSet& coarseIndices,
│ │ │ │ +
320 RemoteIndices& coarseRemote,
│ │ │ │ +
321 ParallelAggregateRenumberer<Graph,I>& renumberer)
│ │ │ │ +
322 {
│ │ │ │ +
323 std::vector<char> attributes(static_cast<std::size_t>(renumberer));
│ │ │ │ +
324
│ │ │ │ +
325 GlobalLookupIndexSet<ParallelIndexSet> coarseLookup(coarseIndices, static_cast<std::size_t>(renumberer));
│ │ │ │ +
326
│ │ │ │ +
327 typedef typename RemoteIndices::const_iterator Iterator;
│ │ │ │ +
328 Iterator end = fineRemote.end();
│ │ │ │ +
329
│ │ │ │ +
330 for(Iterator neighbour = fineRemote.begin();
│ │ │ │ +
331 neighbour != end; ++neighbour) {
│ │ │ │ +
332 int process = neighbour->first;
│ │ │ │ +
333
│ │ │ │ +
334 assert(neighbour->second.first==neighbour->second.second);
│ │ │ │ +
335
│ │ │ │ +
336 // Mark all as not known
│ │ │ │ +
337 typedef typename std::vector<char>::iterator CIterator;
│ │ │ │ +
338
│ │ │ │ +
339 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)
│ │ │ │ +
340 *iter = std::numeric_limits<char>::max();
│ │ │ │ +
341
│ │ │ │ +
342 auto riEnd = neighbour->second.second->end();
│ │ │ │ +
343
│ │ │ │ +
344 for(auto index = neighbour->second.second->begin();
│ │ │ │ +
345 index != riEnd; ++index) {
│ │ │ │ +
346 if(!E::contains(index->localIndexPair().local().attribute()) &&
│ │ │ │ +
347 aggregates[index->localIndexPair().local()] !=
│ │ │ │ + │ │ │ │ +
349 {
│ │ │ │ +
350 assert(aggregates[index->localIndexPair().local()]<attributes.size());
│ │ │ │ +
351 if (attributes[aggregates[index->localIndexPair().local()]] != 3)
│ │ │ │ +
352 attributes[aggregates[index->localIndexPair().local()]] = index->attribute();
│ │ │ │ +
353 }
│ │ │ │ +
354 }
│ │ │ │ +
355
│ │ │ │ +
356 // Build remote index list
│ │ │ │ +
357 typedef RemoteIndexListModifier<ParallelIndexSet,typename RemoteIndices::Allocator,false> Modifier;
│ │ │ │ +
358 typedef typename RemoteIndices::RemoteIndex RemoteIndex;
│ │ │ │ +
359 typedef typename ParallelIndexSet::const_iterator IndexIterator;
│ │ │ │ +
360
│ │ │ │ +
361 Modifier coarseList = coarseRemote.template getModifier<false,true>(process);
│ │ │ │ +
362
│ │ │ │ +
363 IndexIterator iend = coarseIndices.end();
│ │ │ │ +
364 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)
│ │ │ │ +
365 if(attributes[index->local()] != std::numeric_limits<char>::max()) {
│ │ │ │ +
366 // remote index is present
│ │ │ │ +
367 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &(*index)));
│ │ │ │ +
368 }
│ │ │ │ +
369 //std::cout<<coarseRemote<<std::endl;
│ │ │ │ +
370 }
│ │ │ │ +
371
│ │ │ │ +
372 // The number of neighbours should not change!
│ │ │ │ +
373 assert(coarseRemote.neighbours()==fineRemote.neighbours());
│ │ │ │ +
374
│ │ │ │ +
375 // snyc the index set and the remote indices to recompute missing
│ │ │ │ +
376 // indices
│ │ │ │ +
377 IndicesSyncer<ParallelIndexSet> syncer(coarseIndices, coarseRemote);
│ │ │ │ +
378 syncer.sync(renumberer);
│ │ │ │ +
379
│ │ │ │ +
380 }
│ │ │ │ +
381
│ │ │ │ +
382#endif
│ │ │ │ +
383
│ │ │ │ +
384 template<typename E>
│ │ │ │ +
385 template<typename Graph, typename VM>
│ │ │ │ +
386 typename Graph::VertexDescriptor
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
388 [[maybe_unused]] const SequentialInformation& fineInfo,
│ │ │ │ +
389 [[maybe_unused]] Graph& fineGraph,
│ │ │ │ +
390 [[maybe_unused]] VM& visitedMap,
│ │ │ │ +
391 [[maybe_unused]] AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
│ │ │ │ +
392 [[maybe_unused]] SequentialInformation& coarseInfo,
│ │ │ │ +
393 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates)
│ │ │ │ +
394 {
│ │ │ │ +
395 return noAggregates;
│ │ │ │ +
396 }
│ │ │ │ +
│ │ │ │ +
397
│ │ │ │ +
398 } //namespace Amg
│ │ │ │ +
399} // namespace Dune
│ │ │ │ +
400#endif
│ │ │ │ +
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
LocalIndex::Attribute Attribute
The type of the attribute.
Definition indicescoarsener.hh:70
│ │ │ │ +
void operator()(const typename G::ConstEdgeIterator &edge)
Definition indicescoarsener.hh:116
│ │ │ │ +
void isPublic(bool b)
Definition indicescoarsener.hh:139
│ │ │ │ +
ParallelInformation::ParallelIndexSet ParallelIndexSet
Definition indicescoarsener.hh:55
│ │ │ │ + │ │ │ │ +
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition indicescoarsener.hh:65
│ │ │ │ +
T ParallelInformation
The type of the parallel information.
Definition indicescoarsener.hh:53
│ │ │ │ +
Attribute attribute()
Definition indicescoarsener.hh:155
│ │ │ │ +
Vertex operator()(const GlobalIndex &global)
Definition indicescoarsener.hh:127
│ │ │ │ +
static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates)
Build the coarse index set after the aggregatio.
Definition indicescoarsener.hh:229
│ │ │ │ +
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ +
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition indicescoarsener.hh:60
│ │ │ │ +
void attribute(const Attribute &attribute)
Definition indicescoarsener.hh:150
│ │ │ │ +
E ExcludedAttributes
The set of excluded attributes.
Definition indicescoarsener.hh:48
│ │ │ │ +
void globalIndex(const GlobalIndex &global)
Definition indicescoarsener.hh:165
│ │ │ │ +
Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
The type of the remote indices.
Definition indicescoarsener.hh:75
│ │ │ │ +
ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I &lookup)
Definition indicescoarsener.hh:110
│ │ │ │ +
const GlobalIndex & globalIndex() const
Definition indicescoarsener.hh:160
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │ -
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
Definition construction.hh:70
│ │ │ │ - │ │ │ │ -
Definition construction.hh:92
│ │ │ │ -
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ -
ParallelOperatorArgs< M, C > Arguments
Definition construction.hh:114
│ │ │ │ -
static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
Definition construction.hh:116
│ │ │ │ -
ParallelOperatorArgs< M, C > Arguments
Definition construction.hh:126
│ │ │ │ -
static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
Definition construction.hh:128
│ │ │ │ -
Definition construction.hh:137
│ │ │ │ -
MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation)
Definition construction.hh:138
│ │ │ │ -
std::shared_ptr< M > matrix_
Definition construction.hh:142
│ │ │ │ -
static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args)
Definition construction.hh:150
│ │ │ │ -
const MatrixAdapterArgs< M, X, Y > Arguments
Definition construction.hh:148
│ │ │ │ -
const SequentialCommunicationArgs Arguments
Definition construction.hh:159
│ │ │ │ -
static std::shared_ptr< SequentialInformation > construct(Arguments &args)
Definition construction.hh:160
│ │ │ │ -
static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct(Arguments &args)
Definition construction.hh:174
│ │ │ │ -
const OwnerOverlapCopyCommunicationArgs Arguments
Definition construction.hh:172
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
Definition indicescoarsener.hh:36
│ │ │ │ +
Definition indicescoarsener.hh:43
│ │ │ │
Definition pinfo.hh:28
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ +
Definition renumberer.hh:16
│ │ │ │ +
void operator++()
Definition renumberer.hh:57
│ │ │ │ +
void operator()(const typename G::ConstEdgeIterator &edge)
Definition renumberer.hh:51
│ │ │ │ +
Vertex number_
Definition renumberer.hh:35
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,300 +1,485 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -construction.hh │ │ │ │ │ +indicescoarsener.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMGCONSTRUCTION_HH │ │ │ │ │ -6#define DUNE_AMGCONSTRUCTION_HH │ │ │ │ │ +5#ifndef DUNE_AMG_INDICESCOARSENER_HH │ │ │ │ │ +6#define DUNE_AMG_INDICESCOARSENER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -9#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -10#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ -12#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -13 │ │ │ │ │ -14namespace _D_u_n_e │ │ │ │ │ -15{ │ │ │ │ │ -16 namespace Amg │ │ │ │ │ -17 { │ │ │ │ │ -18 │ │ │ │ │ -37 template │ │ │ │ │ -38 struct ConstructionTraits │ │ │ │ │ -39 { │ │ │ │ │ -_4_4 typedef const void* _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -45 │ │ │ │ │ -_5_2 static inline std::shared_ptr _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -53 { │ │ │ │ │ -54 return std::make_shared(); │ │ │ │ │ -55 } │ │ │ │ │ -56 }; │ │ │ │ │ -57 │ │ │ │ │ -58 template │ │ │ │ │ -_5_9 struct ConstructionTraits<_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ -60 { │ │ │ │ │ -_6_1 typedef const int _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -_6_2 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& n) │ │ │ │ │ -63 { │ │ │ │ │ -64 return std::make_shared>(n); │ │ │ │ │ -65 } │ │ │ │ │ -66 }; │ │ │ │ │ -67 │ │ │ │ │ -68 template │ │ │ │ │ -_6_9 struct _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s │ │ │ │ │ -70 { │ │ │ │ │ -_7_1 _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s(std::shared_ptr matrix, const C& comm) │ │ │ │ │ -72 : _m_a_t_r_i_x__(matrix), _c_o_m_m__(comm) │ │ │ │ │ -73 {} │ │ │ │ │ -74 │ │ │ │ │ -_7_5 std::shared_ptr _m_a_t_r_i_x__; │ │ │ │ │ -_7_6 const C& _c_o_m_m__; │ │ │ │ │ -77 }; │ │ │ │ │ -78 │ │ │ │ │ -79#if HAVE_MPI │ │ │ │ │ -_8_0 struct _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -81 { │ │ │ │ │ -_8_2 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s(MPI_Comm comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -cat) │ │ │ │ │ -83 : _c_o_m_m__(comm), _c_a_t__(cat) │ │ │ │ │ -84 {} │ │ │ │ │ -85 │ │ │ │ │ -_8_6 MPI_Comm _c_o_m_m__; │ │ │ │ │ -_8_7 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t__; │ │ │ │ │ -88 }; │ │ │ │ │ -89#endif │ │ │ │ │ -90 │ │ │ │ │ -_9_1 struct _S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -92 { │ │ │ │ │ -_9_3 _S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s(Communication comm, [[maybe_unused]] int │ │ │ │ │ -cat) │ │ │ │ │ -94 : _c_o_m_m__(comm) │ │ │ │ │ -95 {} │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ +11 │ │ │ │ │ +12#if HAVE_MPI │ │ │ │ │ +13#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +14#endif │ │ │ │ │ +15 │ │ │ │ │ +16#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +17 │ │ │ │ │ +18namespace _D_u_n_e │ │ │ │ │ +19{ │ │ │ │ │ +20 namespace Amg │ │ │ │ │ +21 { │ │ │ │ │ +22 │ │ │ │ │ +34 template │ │ │ │ │ +_3_5 class _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ +36 {}; │ │ │ │ │ +37 │ │ │ │ │ +38 │ │ │ │ │ +39#if HAVE_MPI │ │ │ │ │ +40 │ │ │ │ │ +41 template │ │ │ │ │ +_4_2 class _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ +43 { │ │ │ │ │ +44 public: │ │ │ │ │ +_4_8 typedef E _E_x_c_l_u_d_e_d_A_t_t_r_i_b_u_t_e_s; │ │ │ │ │ +49 │ │ │ │ │ +_5_3 typedef T _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +54 │ │ │ │ │ +_5_5 typedef typename ParallelInformation::ParallelIndexSet _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +56 │ │ │ │ │ +_6_0 typedef typename ParallelIndexSet::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ +61 │ │ │ │ │ +_6_5 typedef typename ParallelIndexSet::LocalIndex _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +66 │ │ │ │ │ +_7_0 typedef typename LocalIndex::Attribute _A_t_t_r_i_b_u_t_e; │ │ │ │ │ +71 │ │ │ │ │ +_7_5 typedef Dune::RemoteIndices _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ +76 │ │ │ │ │ +88 template │ │ │ │ │ +89 static typename Graph::VertexDescriptor │ │ │ │ │ +_9_0 _c_o_a_r_s_e_n(_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& fineInfo, │ │ │ │ │ +91 Graph& fineGraph, │ │ │ │ │ +92 VM& visitedMap, │ │ │ │ │ +93 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +94 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ +95 typename Graph::VertexDescriptor noAggregates); │ │ │ │ │ 96 │ │ │ │ │ -_9_7 Communication _c_o_m_m__; │ │ │ │ │ -98 }; │ │ │ │ │ -99 │ │ │ │ │ -100 } // end Amg namspace │ │ │ │ │ -101 │ │ │ │ │ -102 // forward declaration │ │ │ │ │ -103 template │ │ │ │ │ -104 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r; │ │ │ │ │ -105 │ │ │ │ │ -106 template │ │ │ │ │ -107 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r; │ │ │ │ │ +97 private: │ │ │ │ │ +98 template │ │ │ │ │ +99 class ParallelAggregateRenumberer : public _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ +100 { │ │ │ │ │ +101 typedef typename G::VertexDescriptor Vertex; │ │ │ │ │ +102 │ │ │ │ │ +103 typedef I GlobalLookupIndexSet; │ │ │ │ │ +104 │ │ │ │ │ +105 typedef typename GlobalLookupIndexSet::IndexPair IndexPair; │ │ │ │ │ +106 │ │ │ │ │ +107 typedef typename IndexPair::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ 108 │ │ │ │ │ -109 namespace Amg │ │ │ │ │ -110 { │ │ │ │ │ -111 template │ │ │ │ │ -_1_1_2 struct ConstructionTraits<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r > │ │ │ │ │ -113 { │ │ │ │ │ -_1_1_4 typedef _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_<_M_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +109 public: │ │ │ │ │ +_1_1_0 _P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, const I& │ │ │ │ │ +lookup) │ │ │ │ │ +111 : _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(aggregates), isPublic_(false), lookup_(lookup), │ │ │ │ │ +112 globalIndex_(_s_t_d::numeric_limits::max()) │ │ │ │ │ +113 {} │ │ │ │ │ +114 │ │ │ │ │ 115 │ │ │ │ │ -_1_1_6 static inline std::shared_ptr> │ │ │ │ │ -_c_o_n_s_t_r_u_c_t(const _A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +_1_1_6 void _o_p_e_r_a_t_o_r_(_)(const typename G::ConstEdgeIterator& edge) │ │ │ │ │ 117 { │ │ │ │ │ -118 return std::make_shared> │ │ │ │ │ -119 (args._m_a_t_r_i_x__, args._c_o_m_m__); │ │ │ │ │ -120 } │ │ │ │ │ -121 }; │ │ │ │ │ -122 │ │ │ │ │ -123 template │ │ │ │ │ -_1_2_4 struct ConstructionTraits<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r > │ │ │ │ │ -125 { │ │ │ │ │ -_1_2_6 typedef _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_<_M_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -127 │ │ │ │ │ -_1_2_8 static inline std::shared_ptr> │ │ │ │ │ -_c_o_n_s_t_r_u_c_t(const _A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -129 { │ │ │ │ │ -130 return std::make_shared> │ │ │ │ │ -131 (args._m_a_t_r_i_x__, args._c_o_m_m__); │ │ │ │ │ +118 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r_(_)(edge); │ │ │ │ │ +119 const IndexPair* pair= lookup_.pair(edge.target()); │ │ │ │ │ +120 if(pair!=0) { │ │ │ │ │ +121 _g_l_o_b_a_l_I_n_d_e_x(pair->global()); │ │ │ │ │ +122 _a_t_t_r_i_b_u_t_e(pair->local().attribute()); │ │ │ │ │ +123 _i_s_P_u_b_l_i_c(pair->local().isPublic()); │ │ │ │ │ +124 } │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +_1_2_7 Vertex _o_p_e_r_a_t_o_r_(_)([[maybe_unused]] const GlobalIndex& global) │ │ │ │ │ +128 { │ │ │ │ │ +129 Vertex current = this->_n_u_m_b_e_r__; │ │ │ │ │ +130 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +131 return current; │ │ │ │ │ 132 } │ │ │ │ │ -133 }; │ │ │ │ │ -134 │ │ │ │ │ -135 template │ │ │ │ │ -_1_3_6 struct _M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s │ │ │ │ │ -137 { │ │ │ │ │ -_1_3_8 _M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s(std::shared_ptr matrix, const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n) │ │ │ │ │ -139 : _m_a_t_r_i_x__(matrix) │ │ │ │ │ -140 {} │ │ │ │ │ -141 │ │ │ │ │ -_1_4_2 std::shared_ptr _m_a_t_r_i_x__; │ │ │ │ │ -143 }; │ │ │ │ │ -144 │ │ │ │ │ -145 template │ │ │ │ │ -_1_4_6 struct ConstructionTraits<_M_a_t_r_i_x_A_d_a_p_t_e_r > │ │ │ │ │ -147 { │ │ │ │ │ -_1_4_8 typedef const _M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_<_M_,_X_,_Y_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +133 │ │ │ │ │ +_1_3_4 bool _i_s_P_u_b_l_i_c() │ │ │ │ │ +135 { │ │ │ │ │ +136 return isPublic_; │ │ │ │ │ +137 } │ │ │ │ │ +138 │ │ │ │ │ +_1_3_9 void _i_s_P_u_b_l_i_c(bool b) │ │ │ │ │ +140 { │ │ │ │ │ +141 isPublic_ = isPublic_ || b; │ │ │ │ │ +142 } │ │ │ │ │ +143 │ │ │ │ │ +_1_4_4 void _r_e_s_e_t() │ │ │ │ │ +145 { │ │ │ │ │ +146 globalIndex_ = std::numeric_limits::max(); │ │ │ │ │ +147 isPublic_=false; │ │ │ │ │ +148 } │ │ │ │ │ 149 │ │ │ │ │ -_1_5_0 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& │ │ │ │ │ -args) │ │ │ │ │ +_1_5_0 void _a_t_t_r_i_b_u_t_e(const _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e) │ │ │ │ │ 151 { │ │ │ │ │ -152 return std::make_shared>(args._m_a_t_r_i_x__); │ │ │ │ │ +152 attribute_=_a_t_t_r_i_b_u_t_e; │ │ │ │ │ 153 } │ │ │ │ │ -154 }; │ │ │ │ │ -155 │ │ │ │ │ -156 template<> │ │ │ │ │ -_1_5_7 struct ConstructionTraits<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ -158 { │ │ │ │ │ -_1_5_9 typedef const _S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -_1_6_0 static inline std::shared_ptr _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& │ │ │ │ │ -args) │ │ │ │ │ +154 │ │ │ │ │ +_1_5_5 _A_t_t_r_i_b_u_t_e _a_t_t_r_i_b_u_t_e() │ │ │ │ │ +156 { │ │ │ │ │ +157 return attribute_; │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +_1_6_0 const GlobalIndex& _g_l_o_b_a_l_I_n_d_e_x() const │ │ │ │ │ 161 { │ │ │ │ │ -162 return std::make_shared(args._c_o_m_m__); │ │ │ │ │ +162 return globalIndex_; │ │ │ │ │ 163 } │ │ │ │ │ -164 }; │ │ │ │ │ -165 │ │ │ │ │ -166 │ │ │ │ │ -167#if HAVE_MPI │ │ │ │ │ -168 │ │ │ │ │ -169 template │ │ │ │ │ -_1_7_0 struct ConstructionTraits<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n > │ │ │ │ │ -171 { │ │ │ │ │ -_1_7_2 typedef const _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -173 │ │ │ │ │ -_1_7_4 static inline std::shared_ptr> │ │ │ │ │ -_c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -175 { │ │ │ │ │ -176 return std::make_shared>(args._c_o_m_m__, │ │ │ │ │ -args._c_a_t__); │ │ │ │ │ -177 } │ │ │ │ │ -178 }; │ │ │ │ │ -179 │ │ │ │ │ -180#endif │ │ │ │ │ -181 │ │ │ │ │ -183 } // namespace Amg │ │ │ │ │ -184} // namespace Dune │ │ │ │ │ -185#endif │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ -_p_i_n_f_o_._h_h │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ +164 │ │ │ │ │ +_1_6_5 void _g_l_o_b_a_l_I_n_d_e_x(const GlobalIndex& global) │ │ │ │ │ +166 { │ │ │ │ │ +167 globalIndex_ = global; │ │ │ │ │ +168 } │ │ │ │ │ +169 │ │ │ │ │ +170 private: │ │ │ │ │ +171 bool isPublic_; │ │ │ │ │ +172 _A_t_t_r_i_b_u_t_e attribute_; │ │ │ │ │ +173 const GlobalLookupIndexSet& lookup_; │ │ │ │ │ +174 _G_l_o_b_a_l_I_n_d_e_x globalIndex_; │ │ │ │ │ +175 }; │ │ │ │ │ +176 │ │ │ │ │ +177 template │ │ │ │ │ +178 static void buildCoarseIndexSet(const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +179 Graph& fineGraph, │ │ │ │ │ +180 VM& visitedMap, │ │ │ │ │ +181 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +182 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& coarseIndices, │ │ │ │ │ +183 ParallelAggregateRenumberer& renumberer); │ │ │ │ │ +184 │ │ │ │ │ +185 template │ │ │ │ │ +186 static void buildCoarseRemoteIndices(const _R_e_m_o_t_e_I_n_d_i_c_e_s& fineRemote, │ │ │ │ │ +187 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +188 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& coarseIndices, │ │ │ │ │ +189 _R_e_m_o_t_e_I_n_d_i_c_e_s& coarseRemote, │ │ │ │ │ +190 ParallelAggregateRenumberer& renumberer); │ │ │ │ │ +191 │ │ │ │ │ +192 }; │ │ │ │ │ +193 │ │ │ │ │ +197 template │ │ │ │ │ +_1_9_8 class _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n,E> │ │ │ │ │ +199 : public _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r,E> │ │ │ │ │ +200 {}; │ │ │ │ │ +201 │ │ │ │ │ +202 │ │ │ │ │ +203#endif │ │ │ │ │ +204 │ │ │ │ │ +211 template │ │ │ │ │ +_2_1_2 class _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n,E> │ │ │ │ │ +213 { │ │ │ │ │ +214 public: │ │ │ │ │ +215 template │ │ │ │ │ +216 static typename Graph::VertexDescriptor │ │ │ │ │ +217 coarsen(const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n & fineInfo, │ │ │ │ │ +218 Graph& fineGraph, │ │ │ │ │ +219 VM& visitedMap, │ │ │ │ │ +220 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +221 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ +222 typename Graph::VertexDescriptor noAggregates); │ │ │ │ │ +223 }; │ │ │ │ │ +224 │ │ │ │ │ +225#if HAVE_MPI │ │ │ │ │ +226 template │ │ │ │ │ +227 template │ │ │ │ │ +228 inline typename Graph::VertexDescriptor │ │ │ │ │ +_2_2_9 _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_T_,_E_>_:_:_c_o_a_r_s_e_n(_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& fineInfo, │ │ │ │ │ +230 Graph& fineGraph, │ │ │ │ │ +231 VM& visitedMap, │ │ │ │ │ +232 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +233 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ +234 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates) │ │ │ │ │ +235 { │ │ │ │ │ +236 ParallelAggregateRenumberer renumberer(aggregates, fineInfo.globalLookup()); │ │ │ │ │ +237 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates, │ │ │ │ │ +238 coarseInfo.indexSet(), renumberer); │ │ │ │ │ +239 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, │ │ │ │ │ +coarseInfo.indexSet(), │ │ │ │ │ +240 coarseInfo.remoteIndices(), renumberer); │ │ │ │ │ +241 │ │ │ │ │ +242 return renumberer; │ │ │ │ │ +243 } │ │ │ │ │ +244 │ │ │ │ │ +245 template │ │ │ │ │ +246 template │ │ │ │ │ +247 void _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_T_,_E_>_:_:_b_u_i_l_d_C_o_a_r_s_e_I_n_d_e_x_S_e_t(const │ │ │ │ │ +ParallelInformation& pinfo, │ │ │ │ │ +248 Graph& fineGraph, │ │ │ │ │ +249 VM& visitedMap, │ │ │ │ │ +250 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +251 ParallelIndexSet& coarseIndices, │ │ │ │ │ +252 ParallelAggregateRenumberer& renumberer) │ │ │ │ │ +253 { │ │ │ │ │ +254 // fineGraph is the local subgraph corresponding to the vertices the │ │ │ │ │ +process owns. │ │ │ │ │ +255 // i.e. no overlap/copy vertices can be visited traversing the graph │ │ │ │ │ +256 typedef typename Graph::ConstVertexIterator Iterator; │ │ │ │ │ +257 typedef typename ParallelInformation::GlobalLookupIndexSet │ │ │ │ │ +GlobalLookupIndexSet; │ │ │ │ │ +258 │ │ │ │ │ +259 Iterator end = fineGraph.end(); │ │ │ │ │ +260 const GlobalLookupIndexSet& lookup = pinfo.globalLookup(); │ │ │ │ │ +261 │ │ │ │ │ +262 coarseIndices.beginResize(); │ │ │ │ │ +263 │ │ │ │ │ +264 // Setup the coarse index set and renumber the aggregate consecutively │ │ │ │ │ +265 // ascending from zero according to the minimum global index belonging │ │ │ │ │ +266 // to the aggregate │ │ │ │ │ +267 for(Iterator index = fineGraph.begin(); index != end; ++index) { │ │ │ │ │ +268 if(aggregates[*index]!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_: │ │ │ │ │ +_I_S_O_L_A_T_E_D) │ │ │ │ │ +269 // Isolated vertices will not be represented on the next level. │ │ │ │ │ +270 // These should only be there if skipIsolated is activiated in │ │ │ │ │ +271 // the coarsening criterion as otherwise they will be aggregated │ │ │ │ │ +272 // and should have real aggregate number in the map right now. │ │ │ │ │ +273 if(!_g_e_t(visitedMap, *index)) { │ │ │ │ │ +274 // This vertex was not visited by breadthFirstSearch yet. │ │ │ │ │ +275 typedef typename GlobalLookupIndexSet::IndexPair IndexPair; │ │ │ │ │ +276 const IndexPair* pair= lookup.pair(*index); │ │ │ │ │ +277 │ │ │ │ │ +278 renumberer.reset(); // reset attribute and global index. │ │ │ │ │ +279 if(pair!=0) { │ │ │ │ │ +280 // vertex is in the index set. Note that not all vertices have │ │ │ │ │ +281 // to be in the index set, just the ones where communication │ │ │ │ │ +282 // will happen. │ │ │ │ │ +283 assert(!ExcludedAttributes::contains(pair->local().attribute())); │ │ │ │ │ +284 renumberer.attribute(pair->local().attribute()); │ │ │ │ │ +285 renumberer.isPublic(pair->local().isPublic()); │ │ │ │ │ +286 renumberer.globalIndex(pair->global()); │ │ │ │ │ +287 } │ │ │ │ │ +288 │ │ │ │ │ +289 // Reconstruct aggregate and mark vertices as visited │ │ │ │ │ +290 aggregates.template breadthFirstSearch(*index, aggregates[*index], │ │ │ │ │ +291 fineGraph, renumberer, visitedMap); │ │ │ │ │ +292 │ │ │ │ │ +293 if(renumberer.globalIndex()!=std::numeric_limits::max()) { │ │ │ │ │ +294 // vertex is in the index set. │ │ │ │ │ +295 //std::cout <<" Adding global="<< renumberer.globalIndex()<<" │ │ │ │ │ +local="<(renumberer)<(renumberer) >= coarseIndices.size()); │ │ │ │ │ +309 │ │ │ │ │ +310 // Reset the visited flags │ │ │ │ │ +311 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex) │ │ │ │ │ +312 put(visitedMap, *vertex, false); │ │ │ │ │ +313 } │ │ │ │ │ +314 │ │ │ │ │ +315 template │ │ │ │ │ +316 template │ │ │ │ │ +317 void ParallelIndicesCoarsener::buildCoarseRemoteIndices(const │ │ │ │ │ +RemoteIndices& fineRemote, │ │ │ │ │ +318 const AggregatesMap& aggregates, │ │ │ │ │ +319 ParallelIndexSet& coarseIndices, │ │ │ │ │ +320 RemoteIndices& coarseRemote, │ │ │ │ │ +321 ParallelAggregateRenumberer& renumberer) │ │ │ │ │ +322 { │ │ │ │ │ +323 std::vector attributes(static_cast(renumberer)); │ │ │ │ │ +324 │ │ │ │ │ +325 GlobalLookupIndexSet coarseLookup(coarseIndices, │ │ │ │ │ +static_cast(renumberer)); │ │ │ │ │ +326 │ │ │ │ │ +327 typedef typename RemoteIndices::const_iterator Iterator; │ │ │ │ │ +328 Iterator end = fineRemote.end(); │ │ │ │ │ +329 │ │ │ │ │ +330 for(Iterator neighbour = fineRemote.begin(); │ │ │ │ │ +331 neighbour != end; ++neighbour) { │ │ │ │ │ +332 int process = neighbour->first; │ │ │ │ │ +333 │ │ │ │ │ +334 assert(neighbour->second.first==neighbour->second.second); │ │ │ │ │ +335 │ │ │ │ │ +336 // Mark all as not known │ │ │ │ │ +337 typedef typename std::vector::iterator CIterator; │ │ │ │ │ +338 │ │ │ │ │ +339 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter) │ │ │ │ │ +340 *iter = std::numeric_limits::max(); │ │ │ │ │ +341 │ │ │ │ │ +342 auto riEnd = neighbour->second.second->end(); │ │ │ │ │ +343 │ │ │ │ │ +344 for(auto index = neighbour->second.second->begin(); │ │ │ │ │ +345 index != riEnd; ++index) { │ │ │ │ │ +346 if(!E::contains(index->localIndexPair().local().attribute()) && │ │ │ │ │ +347 aggregates[index->localIndexPair().local()] != │ │ │ │ │ +348 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ +349 { │ │ │ │ │ +350 assert(aggregates[index->localIndexPair().local()]localIndexPair().local()]] != 3) │ │ │ │ │ +352 attributes[aggregates[index->localIndexPair().local()]] = index->attribute │ │ │ │ │ +(); │ │ │ │ │ +353 } │ │ │ │ │ +354 } │ │ │ │ │ +355 │ │ │ │ │ +356 // Build remote index list │ │ │ │ │ +357 typedef RemoteIndexListModifier Modifier; │ │ │ │ │ +358 typedef typename RemoteIndices::RemoteIndex RemoteIndex; │ │ │ │ │ +359 typedef typename ParallelIndexSet::const_iterator IndexIterator; │ │ │ │ │ +360 │ │ │ │ │ +361 Modifier coarseList = coarseRemote.template getModifier │ │ │ │ │ +(process); │ │ │ │ │ +362 │ │ │ │ │ +363 IndexIterator iend = coarseIndices.end(); │ │ │ │ │ +364 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index) │ │ │ │ │ +365 if(attributes[index->local()] != std::numeric_limits::max()) { │ │ │ │ │ +366 // remote index is present │ │ │ │ │ +367 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), & │ │ │ │ │ +(*index))); │ │ │ │ │ +368 } │ │ │ │ │ +369 //std::cout< syncer(coarseIndices, coarseRemote); │ │ │ │ │ +378 syncer.sync(renumberer); │ │ │ │ │ +379 │ │ │ │ │ +380 } │ │ │ │ │ +381 │ │ │ │ │ +382#endif │ │ │ │ │ +383 │ │ │ │ │ +384 template │ │ │ │ │ +385 template │ │ │ │ │ +386 typename Graph::VertexDescriptor │ │ │ │ │ +_3_8_7 _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_,_E_>_:_:_c_o_a_r_s_e_n( │ │ │ │ │ +388 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& fineInfo, │ │ │ │ │ +389 [[maybe_unused]] Graph& fineGraph, │ │ │ │ │ +390 [[maybe_unused]] VM& visitedMap, │ │ │ │ │ +391 [[maybe_unused]] _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& │ │ │ │ │ +aggregates, │ │ │ │ │ +392 [[maybe_unused]] _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ +393 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates) │ │ │ │ │ +394 { │ │ │ │ │ +395 return noAggregates; │ │ │ │ │ +396 } │ │ │ │ │ +397 │ │ │ │ │ +398 } //namespace Amg │ │ │ │ │ +399} // namespace Dune │ │ │ │ │ +400#endif │ │ │ │ │ _o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const int Arguments │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -SequentialCommunicationArgs(Communication< void * > comm, int cat) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_c_o_m_m__ │ │ │ │ │ -MPI_Comm comm_ │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_c_a_t__ │ │ │ │ │ -SolverCategory::Category cat_ │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_:_:_c_o_m_m__ │ │ │ │ │ -const C & comm_ │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s │ │ │ │ │ -ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_:_:_m_a_t_r_i_x__ │ │ │ │ │ -std::shared_ptr< M > matrix_ │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const void * Arguments │ │ │ │ │ -A type holding all the arguments needed to call the constructor. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ -Construct an object with the specified arguments. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_c_o_m_m__ │ │ │ │ │ -Communication< void * > comm_ │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:62 │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_r_e_n_u_m_b_e_r_e_r_._h_h │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_r_e_s_e_t │ │ │ │ │ +void reset() │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ +LocalIndex::Attribute Attribute │ │ │ │ │ +The type of the attribute. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename G::ConstEdgeIterator &edge) │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_i_s_P_u_b_l_i_c │ │ │ │ │ +void isPublic(bool b) │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:139 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +ParallelInformation::ParallelIndexSet ParallelIndexSet │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_i_s_P_u_b_l_i_c │ │ │ │ │ +bool isPublic() │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ +The type of the local index. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +T ParallelInformation │ │ │ │ │ +The type of the parallel information. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ +Attribute attribute() │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Vertex operator()(const GlobalIndex &global) │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_c_o_a_r_s_e_n │ │ │ │ │ +static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph │ │ │ │ │ +&fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > │ │ │ │ │ +&aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor │ │ │ │ │ +noAggregates) │ │ │ │ │ +Build the coarse index set after the aggregatio. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ +static const V ISOLATED │ │ │ │ │ +Identifier of isolated vertices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:571 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ +The type of the global index. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ +void attribute(const Attribute &attribute) │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_E_x_c_l_u_d_e_d_A_t_t_r_i_b_u_t_e_s │ │ │ │ │ +E ExcludedAttributes │ │ │ │ │ +The set of excluded attributes. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_g_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +void globalIndex(const GlobalIndex &global) │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +Dune::RemoteIndices< ParallelIndexSet > RemoteIndices │ │ │ │ │ +The type of the remote indices. │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_: │ │ │ │ │ +_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ +ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I │ │ │ │ │ +&lookup) │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_g_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ +const GlobalIndex & globalIndex() const │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:160 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -A nonoverlapping operator with communication object. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ -Adapter to turn a matrix into a linear operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ owner/overlap/copy sema... │ │ │ │ │ DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -An overlapping Schwarz operator. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ -_A_r_g_u_m_e_n_t_s │ │ │ │ │ -ParallelOperatorArgs< M, C > Arguments │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ -_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct │ │ │ │ │ -(const Arguments &args) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ -_A_r_g_u_m_e_n_t_s │ │ │ │ │ -ParallelOperatorArgs< M, C > Arguments │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ -_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct │ │ │ │ │ -(const Arguments &args) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s │ │ │ │ │ -MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:138 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_:_:_m_a_t_r_i_x__ │ │ │ │ │ -std::shared_ptr< M > matrix_ │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _>_ _>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _>_ _>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const MatrixAdapterArgs< M, X, Y > Arguments │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const SequentialCommunicationArgs Arguments │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< SequentialInformation > construct(Arguments &args) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_: │ │ │ │ │ -_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct │ │ │ │ │ -(Arguments &args) │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_: │ │ │ │ │ -_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const OwnerOverlapCopyCommunicationArgs Arguments │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ +DDeeffiinniittiioonn indicescoarsener.hh:43 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +void operator++() │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename G::ConstEdgeIterator &edge) │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_n_u_m_b_e_r__ │ │ │ │ │ +Vertex number_ │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:35 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00089.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: indicescoarsener.hh File Reference │ │ │ │ +dune-istl: graph.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,52 +71,94 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides a class for building the index set and remote indices on the coarse level. │ │ │ │ +

Provides classes for building the matrix graph. │ │ │ │ More...

│ │ │ │ -
#include <dune/common/parallel/indicessyncer.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <algorithm>
│ │ │ │ #include <vector>
│ │ │ │ -#include "renumberer.hh"
│ │ │ │ -#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ -#include "pinfo.hh"
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include <dune/istl/istlexception.hh>
│ │ │ │ +#include <dune/common/propertymap.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::IndicesCoarsener< T, E >
class  Dune::Amg::MatrixGraph< M >
 The (undirected) graph of a matrix. More...
 
class  Dune::Amg::ParallelIndicesCoarsener< T, E >
class  Dune::Amg::MatrixGraph< M >::EdgeIteratorT< C >
 Iterator over all edges starting from a vertex. More...
 
class  Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >
 Coarsen Indices in the parallel case. More...
class  Dune::Amg::MatrixGraph< M >::VertexIteratorT< C >
 The vertex iterator type of the graph. More...
 
class  Dune::Amg::IndicesCoarsener< SequentialInformation, E >
 Coarsen Indices in the sequential case. More...
class  Dune::Amg::SubGraph< G, T >
 A subgraph of a graph. More...
 
class  Dune::Amg::SubGraph< G, T >::EdgeIndexMap
 An index map for mapping the edges to indices. More...
 
class  Dune::Amg::SubGraph< G, T >::EdgeIterator
 The edge iterator of the graph. More...
 
class  Dune::Amg::SubGraph< G, T >::VertexIterator
 The vertex iterator of the graph. More...
 
class  Dune::Amg::VertexPropertiesGraph< G, VP, VM >
 Attaches properties to the vertices of a graph. More...
 
class  Dune::Amg::VertexPropertiesGraph< G, VP, VM >::VertexIteratorT< C >
 
class  Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >
 Attaches properties to the edges and vertices of a graph. More...
 
class  Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::EdgeIteratorT< C >
 
class  Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::VertexIteratorT< C >
 
class  Dune::Amg::GraphVertexPropertiesSelector< G >
 Wrapper to access the internal edge properties of a graph via operator[]() More...
 
class  Dune::Amg::GraphEdgePropertiesSelector< G >
 Wrapper to access the internal vertex properties of a graph via operator[]() More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class G , class V >
int Dune::Amg::visitNeighbours (const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
 Visit all neighbour vertices of a vertex in a graph.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides a class for building the index set and remote indices on the coarse level.

│ │ │ │ +

Provides classes for building the matrix graph.

│ │ │ │
Author
Markus Blatt
│ │ │ │ +

During the coarsening process in AMG the matrix graph together with the dependencies, what connections in the graph are considered strong or weak, what vertices are isolated, etc., have to build. This information will be contained in the MatrixGraph class.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,42 +1,85 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -indicescoarsener.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 │ │ │ │ │ +graph.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides a class for building the index set and remote indices on the coarse │ │ │ │ │ -level. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +Provides classes for building the matrix graph. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_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_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _T_,_ _E_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_ _M_ _> │ │ │ │ │ +  The (undirected) graph of a matrix. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _T_,_ _E_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_ _M_ _>_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ +  Iterator over all edges starting from a vertex. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_,_ _L_ _>_,_ _E_ _> │ │ │ │ │ -  Coarsen Indices in the parallel case. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_ _M_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ +  The vertex iterator type of the graph. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_,_ _E_ _> │ │ │ │ │ -  Coarsen Indices in the sequential case. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _> │ │ │ │ │ +  A subgraph of a graph. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _>_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +  An index map for mapping the edges to indices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _>_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +  The edge iterator of the graph. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +  The vertex iterator of the graph. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _V_M_ _> │ │ │ │ │ +  Attaches properties to the vertices of a graph. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _V_M_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _E_P_,_ _V_M_,_ _E_M_ _> │ │ │ │ │ +  Attaches properties to the edges and vertices of a graph. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _E_P_,_ _V_M_,_ _E_M_ _>_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _E_P_,_ _V_M_,_ _E_M_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_<_ _G_ _> │ │ │ │ │ +  Wrapper to access the internal edge properties of a graph via _o_p_e_r_a_t_o_r │ │ │ │ │ + _[_]_(_) _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_<_ _G_ _> │ │ │ │ │ +  Wrapper to access the internal vertex properties of a graph via │ │ │ │ │ + _o_p_e_r_a_t_o_r_[_]_(_) _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +int  _D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s (const G &graph, const typename G:: │ │ │ │ │ + VertexDescriptor &vertex, V &visitor) │ │ │ │ │ +  Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides a class for building the index set and remote indices on the coarse │ │ │ │ │ -level. │ │ │ │ │ +Provides classes for building the matrix graph. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ +During the coarsening process in AMG the matrix graph together with the │ │ │ │ │ +dependencies, what connections in the graph are considered strong or weak, what │ │ │ │ │ +vertices are isolated, etc., have to build. This information will be contained │ │ │ │ │ +in the MatrixGraph class. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: indicescoarsener.hh Source File │ │ │ │ +dune-istl: graph.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,436 +74,1821 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
indicescoarsener.hh
│ │ │ │ +
graph.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_INDICESCOARSENER_HH
│ │ │ │ -
6#define DUNE_AMG_INDICESCOARSENER_HH
│ │ │ │ +
5#ifndef DUNE_AMG_GRAPH_HH
│ │ │ │ +
6#define DUNE_AMG_GRAPH_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/parallel/indicessyncer.hh>
│ │ │ │ -
9#include <vector>
│ │ │ │ -
10#include "renumberer.hh"
│ │ │ │ -
11
│ │ │ │ -
12#if HAVE_MPI
│ │ │ │ - │ │ │ │ -
14#endif
│ │ │ │ -
15
│ │ │ │ -
16#include "pinfo.hh"
│ │ │ │ +
8#include <cstddef>
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <vector>
│ │ │ │ +
11#include <cassert>
│ │ │ │ +
12#include <limits>
│ │ │ │ +
13#include <dune/common/typetraits.hh>
│ │ │ │ +
14#include <dune/common/iteratorfacades.hh>
│ │ │ │ + │ │ │ │ +
16#include <dune/common/propertymap.hh>
│ │ │ │
17
│ │ │ │
18namespace Dune
│ │ │ │
19{
│ │ │ │
20 namespace Amg
│ │ │ │
21 {
│ │ │ │ -
22
│ │ │ │ -
34 template<typename T, typename E>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
36 {};
│ │ │ │ -
│ │ │ │ -
37
│ │ │ │ -
38
│ │ │ │ -
39#if HAVE_MPI
│ │ │ │ -
40
│ │ │ │ -
41 template<typename T, typename E>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
43 {
│ │ │ │ -
44 public:
│ │ │ │ - │ │ │ │ -
49
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ -
55 typedef typename ParallelInformation::ParallelIndexSet ParallelIndexSet;
│ │ │ │ -
56
│ │ │ │ -
60 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ -
61
│ │ │ │ -
65 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
│ │ │ │ -
66
│ │ │ │ -
70 typedef typename LocalIndex::Attribute Attribute;
│ │ │ │ -
71
│ │ │ │ -
75 typedef Dune::RemoteIndices<ParallelIndexSet> RemoteIndices;
│ │ │ │ -
76
│ │ │ │ -
88 template<typename Graph, typename VM>
│ │ │ │ -
89 static typename Graph::VertexDescriptor
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
91 Graph& fineGraph,
│ │ │ │ -
92 VM& visitedMap,
│ │ │ │ - │ │ │ │ -
94 ParallelInformation& coarseInfo,
│ │ │ │ -
95 typename Graph::VertexDescriptor noAggregates);
│ │ │ │ +
49 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
51 {
│ │ │ │ +
52 public:
│ │ │ │ +
56 typedef M Matrix;
│ │ │ │ +
57
│ │ │ │ +
61 typedef typename std::remove_const<M>::type MutableMatrix;
│ │ │ │ +
62
│ │ │ │ +
66 typedef typename M::block_type Weight;
│ │ │ │ +
67
│ │ │ │ +
73 typedef typename M::size_type VertexDescriptor;
│ │ │ │ +
74
│ │ │ │ +
80 typedef std::ptrdiff_t EdgeDescriptor;
│ │ │ │ +
81
│ │ │ │ +
82 enum {
│ │ │ │ +
83 /*
│ │ │ │ +
84 * @brief Whether Matrix is mutable.
│ │ │ │ +
85 */
│ │ │ │ +
86 mutableMatrix = std::is_same<M, typename std::remove_const<M>::type>::value
│ │ │ │ +
87 };
│ │ │ │ +
88
│ │ │ │ +
89
│ │ │ │ +
93 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
95 {
│ │ │ │
96
│ │ │ │ -
97 private:
│ │ │ │ -
98 template<typename G, typename I>
│ │ │ │ -
99 class ParallelAggregateRenumberer : public AggregateRenumberer<G>
│ │ │ │ -
100 {
│ │ │ │ -
101 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
102
│ │ │ │ -
103 typedef I GlobalLookupIndexSet;
│ │ │ │ -
104
│ │ │ │ -
105 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
│ │ │ │ +
97 public:
│ │ │ │ +
101 typedef typename std::remove_const<C>::type MutableContainer;
│ │ │ │ +
105 typedef const typename std::remove_const<C>::type ConstContainer;
│ │ │ │
106
│ │ │ │ -
107 typedef typename IndexPair::GlobalIndex GlobalIndex;
│ │ │ │ -
108
│ │ │ │ -
109 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
111 : AggregateRenumberer<G>(aggregates), isPublic_(false), lookup_(lookup),
│ │ │ │ -
112 globalIndex_(std::numeric_limits<GlobalIndex>::max())
│ │ │ │ -
113 {}
│ │ │ │ -
│ │ │ │ +
107 friend class EdgeIteratorT<MutableContainer>;
│ │ │ │ +
108 friend class EdgeIteratorT<ConstContainer>;
│ │ │ │ +
109
│ │ │ │ +
110 enum {
│ │ │ │ +
112 isMutable = std::is_same<C, MutableContainer>::value
│ │ │ │ +
113 };
│ │ │ │
114
│ │ │ │ -
115
│ │ │ │ -
│ │ │ │ -
116 void operator()(const typename G::ConstEdgeIterator& edge)
│ │ │ │ -
117 {
│ │ │ │ - │ │ │ │ -
119 const IndexPair* pair= lookup_.pair(edge.target());
│ │ │ │ -
120 if(pair!=0) {
│ │ │ │ -
121 globalIndex(pair->global());
│ │ │ │ -
122 attribute(pair->local().attribute());
│ │ │ │ -
123 isPublic(pair->local().isPublic());
│ │ │ │ -
124 }
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
│ │ │ │ -
127 Vertex operator()([[maybe_unused]] const GlobalIndex& global)
│ │ │ │ -
128 {
│ │ │ │ -
129 Vertex current = this->number_;
│ │ │ │ -
130 this->operator++();
│ │ │ │ -
131 return current;
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
│ │ │ │ -
134 bool isPublic()
│ │ │ │ -
135 {
│ │ │ │ -
136 return isPublic_;
│ │ │ │ -
137 }
│ │ │ │ -
│ │ │ │ +
118 typedef typename std::conditional<isMutable && C::mutableMatrix,typename Matrix::row_type::Iterator,
│ │ │ │ +
119 typename Matrix::row_type::ConstIterator>::type
│ │ │ │ + │ │ │ │ +
121
│ │ │ │ +
125 typedef typename std::conditional<isMutable && C::mutableMatrix,typename M::block_type,
│ │ │ │ +
126 const typename M::block_type>::type
│ │ │ │ + │ │ │ │ +
128
│ │ │ │ + │ │ │ │ +
137 const ColIterator& end, const EdgeDescriptor& edge);
│ │ │ │
138
│ │ │ │ -
│ │ │ │ -
139 void isPublic(bool b)
│ │ │ │ -
140 {
│ │ │ │ -
141 isPublic_ = isPublic_ || b;
│ │ │ │ -
142 }
│ │ │ │ -
│ │ │ │ -
143
│ │ │ │ -
│ │ │ │ -
144 void reset()
│ │ │ │ -
145 {
│ │ │ │ -
146 globalIndex_ = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ -
147 isPublic_=false;
│ │ │ │ -
148 }
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
151 {
│ │ │ │ -
152 attribute_=attribute;
│ │ │ │ -
153 }
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 {
│ │ │ │ -
157 return attribute_;
│ │ │ │ -
158 }
│ │ │ │ -
│ │ │ │ -
159
│ │ │ │ -
│ │ │ │ -
160 const GlobalIndex& globalIndex() const
│ │ │ │ -
161 {
│ │ │ │ -
162 return globalIndex_;
│ │ │ │ -
163 }
│ │ │ │ -
│ │ │ │ -
164
│ │ │ │ -
│ │ │ │ -
165 void globalIndex(const GlobalIndex& global)
│ │ │ │ -
166 {
│ │ │ │ -
167 globalIndex_ = global;
│ │ │ │ -
168 }
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
170 private:
│ │ │ │ -
171 bool isPublic_;
│ │ │ │ -
172 Attribute attribute_;
│ │ │ │ -
173 const GlobalLookupIndexSet& lookup_;
│ │ │ │ -
174 GlobalIndex globalIndex_;
│ │ │ │ -
175 };
│ │ │ │ -
176
│ │ │ │ -
177 template<typename Graph, typename VM, typename I>
│ │ │ │ -
178 static void buildCoarseIndexSet(const ParallelInformation& pinfo,
│ │ │ │ -
179 Graph& fineGraph,
│ │ │ │ -
180 VM& visitedMap,
│ │ │ │ - │ │ │ │ -
182 ParallelIndexSet& coarseIndices,
│ │ │ │ -
183 ParallelAggregateRenumberer<Graph,I>& renumberer);
│ │ │ │ -
184
│ │ │ │ -
185 template<typename Graph,typename I>
│ │ │ │ -
186 static void buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
│ │ │ │ - │ │ │ │ -
188 ParallelIndexSet& coarseIndices,
│ │ │ │ -
189 RemoteIndices& coarseRemote,
│ │ │ │ -
190 ParallelAggregateRenumberer<Graph,I>& renumberer);
│ │ │ │ -
191
│ │ │ │ -
192 };
│ │ │ │ -
193
│ │ │ │ -
197 template<typename G, typename L, typename E>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
199 : public ParallelIndicesCoarsener<OwnerOverlapCopyCommunication<G,L>,E>
│ │ │ │ -
200 {};
│ │ │ │ -
│ │ │ │ -
201
│ │ │ │ -
202
│ │ │ │ -
203#endif
│ │ │ │ -
204
│ │ │ │ -
211 template<typename E>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
213 {
│ │ │ │ -
214 public:
│ │ │ │ -
215 template<typename Graph, typename VM>
│ │ │ │ -
216 static typename Graph::VertexDescriptor
│ │ │ │ -
217 coarsen(const SequentialInformation & fineInfo,
│ │ │ │ -
218 Graph& fineGraph,
│ │ │ │ -
219 VM& visitedMap,
│ │ │ │ - │ │ │ │ -
221 SequentialInformation& coarseInfo,
│ │ │ │ -
222 typename Graph::VertexDescriptor noAggregates);
│ │ │ │ -
223 };
│ │ │ │ -
│ │ │ │ -
224
│ │ │ │ -
225#if HAVE_MPI
│ │ │ │ -
226 template<typename T, typename E>
│ │ │ │ -
227 template<typename Graph, typename VM>
│ │ │ │ -
228 inline typename Graph::VertexDescriptor
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
230 Graph& fineGraph,
│ │ │ │ -
231 VM& visitedMap,
│ │ │ │ - │ │ │ │ -
233 ParallelInformation& coarseInfo,
│ │ │ │ -
234 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates)
│ │ │ │ -
235 {
│ │ │ │ -
236 ParallelAggregateRenumberer<Graph,typename ParallelInformation::GlobalLookupIndexSet> renumberer(aggregates, fineInfo.globalLookup());
│ │ │ │ -
237 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,
│ │ │ │ -
238 coarseInfo.indexSet(), renumberer);
│ │ │ │ -
239 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, coarseInfo.indexSet(),
│ │ │ │ -
240 coarseInfo.remoteIndices(), renumberer);
│ │ │ │ -
241
│ │ │ │ -
242 return renumberer;
│ │ │ │ -
243 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ -
245 template<typename T, typename E>
│ │ │ │ -
246 template<typename Graph, typename VM, typename I>
│ │ │ │ -
247 void ParallelIndicesCoarsener<T,E>::buildCoarseIndexSet(const ParallelInformation& pinfo,
│ │ │ │ -
248 Graph& fineGraph,
│ │ │ │ -
249 VM& visitedMap,
│ │ │ │ - │ │ │ │ -
251 ParallelIndexSet& coarseIndices,
│ │ │ │ -
252 ParallelAggregateRenumberer<Graph,I>& renumberer)
│ │ │ │ -
253 {
│ │ │ │ -
254 // fineGraph is the local subgraph corresponding to the vertices the process owns.
│ │ │ │ -
255 // i.e. no overlap/copy vertices can be visited traversing the graph
│ │ │ │ -
256 typedef typename Graph::ConstVertexIterator Iterator;
│ │ │ │ -
257 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
│ │ │ │ -
258
│ │ │ │ -
259 Iterator end = fineGraph.end();
│ │ │ │ -
260 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();
│ │ │ │ -
261
│ │ │ │ -
262 coarseIndices.beginResize();
│ │ │ │ + │ │ │ │ +
146
│ │ │ │ +
151 template<class C1>
│ │ │ │ + │ │ │ │ +
153
│ │ │ │ +
154 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
│ │ │ │ +
155 typename M::block_type, const typename M::block_type>::type
│ │ │ │ + │ │ │ │ +
157
│ │ │ │ + │ │ │ │ +
162
│ │ │ │ + │ │ │ │ +
165
│ │ │ │ +
167 bool operator!=(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
│ │ │ │ +
168
│ │ │ │ +
170 bool operator!=(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
│ │ │ │ +
171
│ │ │ │ +
173 bool operator==(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
│ │ │ │ +
174
│ │ │ │ +
176 bool operator==(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
│ │ │ │ +
177
│ │ │ │ + │ │ │ │ +
180
│ │ │ │ + │ │ │ │ +
183
│ │ │ │ +
185 const EdgeDescriptor& operator*() const;
│ │ │ │ +
186
│ │ │ │ + │ │ │ │ +
189
│ │ │ │ +
190 private:
│ │ │ │ +
192 VertexDescriptor source_;
│ │ │ │ +
194 ColIterator block_;
│ │ │ │ +
195 /***
│ │ │ │ +
196 * @brief The column iterator positioned at the end of the row
│ │ │ │ +
197 * of vertex source_
│ │ │ │ +
198 */
│ │ │ │ +
199 ColIterator blockEnd_;
│ │ │ │ +
201 EdgeDescriptor edge_;
│ │ │ │ +
202 };
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
207 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
209 {
│ │ │ │ +
210 public:
│ │ │ │ +
214 typedef typename std::remove_const<C>::type MutableContainer;
│ │ │ │ +
218 typedef const typename std::remove_const<C>::type ConstContainer;
│ │ │ │ +
219
│ │ │ │ +
220 friend class VertexIteratorT<MutableContainer>;
│ │ │ │ +
221 friend class VertexIteratorT<ConstContainer>;
│ │ │ │ +
222
│ │ │ │ +
223 enum {
│ │ │ │ +
225 isMutable = std::is_same<C, MutableContainer>::value
│ │ │ │ +
226 };
│ │ │ │ +
227
│ │ │ │ +
233 explicit VertexIteratorT(C* graph, const VertexDescriptor& current);
│ │ │ │ +
234
│ │ │ │ +
242 explicit VertexIteratorT(const VertexDescriptor& current);
│ │ │ │ +
243
│ │ │ │ + │ │ │ │ +
245
│ │ │ │ + │ │ │ │ +
251
│ │ │ │ + │ │ │ │ +
254
│ │ │ │ + │ │ │ │ +
257
│ │ │ │ + │ │ │ │ +
260
│ │ │ │ + │ │ │ │
263
│ │ │ │ -
264 // Setup the coarse index set and renumber the aggregate consecutively
│ │ │ │ -
265 // ascending from zero according to the minimum global index belonging
│ │ │ │ -
266 // to the aggregate
│ │ │ │ -
267 for(Iterator index = fineGraph.begin(); index != end; ++index) {
│ │ │ │ - │ │ │ │ -
269 // Isolated vertices will not be represented on the next level.
│ │ │ │ -
270 // These should only be there if skipIsolated is activiated in
│ │ │ │ -
271 // the coarsening criterion as otherwise they will be aggregated
│ │ │ │ -
272 // and should have real aggregate number in the map right now.
│ │ │ │ -
273 if(!get(visitedMap, *index)) {
│ │ │ │ -
274 // This vertex was not visited by breadthFirstSearch yet.
│ │ │ │ -
275 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
│ │ │ │ -
276 const IndexPair* pair= lookup.pair(*index);
│ │ │ │ -
277
│ │ │ │ -
278 renumberer.reset(); // reset attribute and global index.
│ │ │ │ -
279 if(pair!=0) {
│ │ │ │ -
280 // vertex is in the index set. Note that not all vertices have
│ │ │ │ -
281 // to be in the index set, just the ones where communication
│ │ │ │ -
282 // will happen.
│ │ │ │ -
283 assert(!ExcludedAttributes::contains(pair->local().attribute()));
│ │ │ │ -
284 renumberer.attribute(pair->local().attribute());
│ │ │ │ -
285 renumberer.isPublic(pair->local().isPublic());
│ │ │ │ -
286 renumberer.globalIndex(pair->global());
│ │ │ │ -
287 }
│ │ │ │ -
288
│ │ │ │ -
289 // Reconstruct aggregate and mark vertices as visited
│ │ │ │ -
290 aggregates.template breadthFirstSearch<false>(*index, aggregates[*index],
│ │ │ │ -
291 fineGraph, renumberer, visitedMap);
│ │ │ │ -
292
│ │ │ │ -
293 if(renumberer.globalIndex()!=std::numeric_limits<GlobalIndex>::max()) {
│ │ │ │ -
294 // vertex is in the index set.
│ │ │ │ -
295 //std::cout <<" Adding global="<< renumberer.globalIndex()<<" local="<<static_cast<std::size_t>(renumberer)<<std::endl;
│ │ │ │ -
296 coarseIndices.add(renumberer.globalIndex(),
│ │ │ │ -
297 LocalIndex(renumberer, renumberer.attribute(),
│ │ │ │ -
298 renumberer.isPublic()));
│ │ │ │ -
299 }
│ │ │ │ -
300
│ │ │ │ -
301 aggregates[*index] = renumberer;
│ │ │ │ -
302 ++renumberer;
│ │ │ │ -
303 }
│ │ │ │ -
304 }
│ │ │ │ -
305
│ │ │ │ -
306 coarseIndices.endResize();
│ │ │ │ -
307
│ │ │ │ -
308 assert(static_cast<std::size_t>(renumberer) >= coarseIndices.size());
│ │ │ │ +
264 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
│ │ │ │ +
265 typename M::block_type, const typename M::block_type>::type
│ │ │ │ + │ │ │ │ + │ │ │ │ +
269
│ │ │ │ + │ │ │ │ +
275
│ │ │ │ + │ │ │ │ +
282
│ │ │ │ + │ │ │ │ +
289
│ │ │ │ +
290 private:
│ │ │ │ +
291 C* graph_;
│ │ │ │ +
292 VertexDescriptor current_;
│ │ │ │ +
293 };
│ │ │ │ +
│ │ │ │ +
294
│ │ │ │ + │ │ │ │ +
299
│ │ │ │ + │ │ │ │ +
304
│ │ │ │ + │ │ │ │
309
│ │ │ │ -
310 // Reset the visited flags
│ │ │ │ -
311 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)
│ │ │ │ -
312 put(visitedMap, *vertex, false);
│ │ │ │ -
313 }
│ │ │ │ + │ │ │ │
314
│ │ │ │ -
315 template<typename T, typename E>
│ │ │ │ -
316 template<typename Graph, typename I>
│ │ │ │ -
317 void ParallelIndicesCoarsener<T,E>::buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
│ │ │ │ -
318 const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
│ │ │ │ -
319 ParallelIndexSet& coarseIndices,
│ │ │ │ -
320 RemoteIndices& coarseRemote,
│ │ │ │ -
321 ParallelAggregateRenumberer<Graph,I>& renumberer)
│ │ │ │ -
322 {
│ │ │ │ -
323 std::vector<char> attributes(static_cast<std::size_t>(renumberer));
│ │ │ │ -
324
│ │ │ │ -
325 GlobalLookupIndexSet<ParallelIndexSet> coarseLookup(coarseIndices, static_cast<std::size_t>(renumberer));
│ │ │ │ -
326
│ │ │ │ -
327 typedef typename RemoteIndices::const_iterator Iterator;
│ │ │ │ -
328 Iterator end = fineRemote.end();
│ │ │ │ -
329
│ │ │ │ -
330 for(Iterator neighbour = fineRemote.begin();
│ │ │ │ -
331 neighbour != end; ++neighbour) {
│ │ │ │ -
332 int process = neighbour->first;
│ │ │ │ -
333
│ │ │ │ -
334 assert(neighbour->second.first==neighbour->second.second);
│ │ │ │ -
335
│ │ │ │ -
336 // Mark all as not known
│ │ │ │ -
337 typedef typename std::vector<char>::iterator CIterator;
│ │ │ │ -
338
│ │ │ │ -
339 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)
│ │ │ │ -
340 *iter = std::numeric_limits<char>::max();
│ │ │ │ -
341
│ │ │ │ -
342 auto riEnd = neighbour->second.second->end();
│ │ │ │ + │ │ │ │ +
320
│ │ │ │ + │ │ │ │ +
325
│ │ │ │ + │ │ │ │ +
331
│ │ │ │ + │ │ │ │ +
337
│ │ │ │ + │ │ │ │
343
│ │ │ │ -
344 for(auto index = neighbour->second.second->begin();
│ │ │ │ -
345 index != riEnd; ++index) {
│ │ │ │ -
346 if(!E::contains(index->localIndexPair().local().attribute()) &&
│ │ │ │ -
347 aggregates[index->localIndexPair().local()] !=
│ │ │ │ - │ │ │ │ -
349 {
│ │ │ │ -
350 assert(aggregates[index->localIndexPair().local()]<attributes.size());
│ │ │ │ -
351 if (attributes[aggregates[index->localIndexPair().local()]] != 3)
│ │ │ │ -
352 attributes[aggregates[index->localIndexPair().local()]] = index->attribute();
│ │ │ │ -
353 }
│ │ │ │ -
354 }
│ │ │ │ -
355
│ │ │ │ -
356 // Build remote index list
│ │ │ │ -
357 typedef RemoteIndexListModifier<ParallelIndexSet,typename RemoteIndices::Allocator,false> Modifier;
│ │ │ │ -
358 typedef typename RemoteIndices::RemoteIndex RemoteIndex;
│ │ │ │ -
359 typedef typename ParallelIndexSet::const_iterator IndexIterator;
│ │ │ │ -
360
│ │ │ │ -
361 Modifier coarseList = coarseRemote.template getModifier<false,true>(process);
│ │ │ │ -
362
│ │ │ │ -
363 IndexIterator iend = coarseIndices.end();
│ │ │ │ -
364 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)
│ │ │ │ -
365 if(attributes[index->local()] != std::numeric_limits<char>::max()) {
│ │ │ │ -
366 // remote index is present
│ │ │ │ -
367 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &(*index)));
│ │ │ │ -
368 }
│ │ │ │ -
369 //std::cout<<coarseRemote<<std::endl;
│ │ │ │ -
370 }
│ │ │ │ -
371
│ │ │ │ -
372 // The number of neighbours should not change!
│ │ │ │ -
373 assert(coarseRemote.neighbours()==fineRemote.neighbours());
│ │ │ │ + │ │ │ │ +
349
│ │ │ │ + │ │ │ │ +
357
│ │ │ │ + │ │ │ │ +
365
│ │ │ │ +
366
│ │ │ │ + │ │ │ │
374
│ │ │ │ -
375 // snyc the index set and the remote indices to recompute missing
│ │ │ │ -
376 // indices
│ │ │ │ -
377 IndicesSyncer<ParallelIndexSet> syncer(coarseIndices, coarseRemote);
│ │ │ │ -
378 syncer.sync(renumberer);
│ │ │ │ -
379
│ │ │ │ -
380 }
│ │ │ │ -
381
│ │ │ │ -
382#endif
│ │ │ │ -
383
│ │ │ │ -
384 template<typename E>
│ │ │ │ -
385 template<typename Graph, typename VM>
│ │ │ │ -
386 typename Graph::VertexDescriptor
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
388 [[maybe_unused]] const SequentialInformation& fineInfo,
│ │ │ │ -
389 [[maybe_unused]] Graph& fineGraph,
│ │ │ │ -
390 [[maybe_unused]] VM& visitedMap,
│ │ │ │ -
391 [[maybe_unused]] AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
│ │ │ │ -
392 [[maybe_unused]] SequentialInformation& coarseInfo,
│ │ │ │ -
393 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates)
│ │ │ │ -
394 {
│ │ │ │ -
395 return noAggregates;
│ │ │ │ -
396 }
│ │ │ │ -
│ │ │ │ -
397
│ │ │ │ -
398 } //namespace Amg
│ │ │ │ -
399} // namespace Dune
│ │ │ │ -
400#endif
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ - │ │ │ │ -
LocalIndex::Attribute Attribute
The type of the attribute.
Definition indicescoarsener.hh:70
│ │ │ │ -
void operator()(const typename G::ConstEdgeIterator &edge)
Definition indicescoarsener.hh:116
│ │ │ │ -
void isPublic(bool b)
Definition indicescoarsener.hh:139
│ │ │ │ -
ParallelInformation::ParallelIndexSet ParallelIndexSet
Definition indicescoarsener.hh:55
│ │ │ │ - │ │ │ │ -
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition indicescoarsener.hh:65
│ │ │ │ -
T ParallelInformation
The type of the parallel information.
Definition indicescoarsener.hh:53
│ │ │ │ -
Attribute attribute()
Definition indicescoarsener.hh:155
│ │ │ │ -
Vertex operator()(const GlobalIndex &global)
Definition indicescoarsener.hh:127
│ │ │ │ -
static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates)
Build the coarse index set after the aggregatio.
Definition indicescoarsener.hh:229
│ │ │ │ -
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ -
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition indicescoarsener.hh:60
│ │ │ │ -
void attribute(const Attribute &attribute)
Definition indicescoarsener.hh:150
│ │ │ │ -
E ExcludedAttributes
The set of excluded attributes.
Definition indicescoarsener.hh:48
│ │ │ │ -
void globalIndex(const GlobalIndex &global)
Definition indicescoarsener.hh:165
│ │ │ │ -
Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
The type of the remote indices.
Definition indicescoarsener.hh:75
│ │ │ │ -
ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I &lookup)
Definition indicescoarsener.hh:110
│ │ │ │ -
const GlobalIndex & globalIndex() const
Definition indicescoarsener.hh:160
│ │ │ │ + │ │ │ │ +
382
│ │ │ │ + │ │ │ │ +
388
│ │ │ │ +
393 const Matrix& matrix() const;
│ │ │ │ +
394
│ │ │ │ +
398 std::size_t noVertices() const;
│ │ │ │ +
399
│ │ │ │ + │ │ │ │ +
407
│ │ │ │ +
411 std::size_t noEdges() const;
│ │ │ │ +
412
│ │ │ │ + │ │ │ │ +
420 const VertexDescriptor& target) const;
│ │ │ │ +
421
│ │ │ │ +
422 private:
│ │ │ │ +
424 Matrix& matrix_;
│ │ │ │ +
426 EdgeDescriptor* start_;
│ │ │ │ +
428 MatrixGraph(const MatrixGraph&);
│ │ │ │ +
429
│ │ │ │ +
430 };
│ │ │ │ +
│ │ │ │ +
431
│ │ │ │ +
441 template<class G, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
443 {
│ │ │ │ +
444 public:
│ │ │ │ +
448 typedef G Graph;
│ │ │ │ +
449
│ │ │ │ +
454 typedef T Excluded;
│ │ │ │ +
455
│ │ │ │ +
459 typedef typename Graph::VertexDescriptor VertexDescriptor;
│ │ │ │ +
460
│ │ │ │ + │ │ │ │ +
462
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
470 {
│ │ │ │ +
471 public:
│ │ │ │ +
472 typedef ReadablePropertyMapTag Category;
│ │ │ │ +
473
│ │ │ │ +
│ │ │ │ +
474 EdgeIndexMap(const EdgeDescriptor& firstEdge)
│ │ │ │ +
475 : firstEdge_(firstEdge)
│ │ │ │ +
476 {}
│ │ │ │ +
│ │ │ │ +
477
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
480 : firstEdge_(emap.firstEdge_)
│ │ │ │ +
481 {}
│ │ │ │ +
│ │ │ │ +
482
│ │ │ │ +
│ │ │ │ +
483 std::size_t operator[](const EdgeDescriptor& edge) const
│ │ │ │ +
484 {
│ │ │ │ +
485 return edge-firstEdge_;
│ │ │ │ +
486 }
│ │ │ │ +
│ │ │ │ +
487 private:
│ │ │ │ +
489 EdgeDescriptor firstEdge_;
│ │ │ │ + │ │ │ │ +
492 {}
│ │ │ │ +
493 };
│ │ │ │ +
│ │ │ │ +
494
│ │ │ │ + │ │ │ │ +
500
│ │ │ │ +
│ │ │ │ +
504 class EdgeIterator : public RandomAccessIteratorFacade<EdgeIterator,const EdgeDescriptor>
│ │ │ │ +
505 {
│ │ │ │ +
506 public:
│ │ │ │ +
512 explicit EdgeIterator(const VertexDescriptor& source, const EdgeDescriptor& edge);
│ │ │ │ +
513
│ │ │ │ +
521 explicit EdgeIterator(const EdgeDescriptor& edge);
│ │ │ │ +
522
│ │ │ │ +
524 bool equals(const EdgeIterator& other) const;
│ │ │ │ +
525
│ │ │ │ + │ │ │ │ +
528
│ │ │ │ + │ │ │ │ +
531
│ │ │ │ +
532 EdgeIterator& advance(std::ptrdiff_t n);
│ │ │ │ +
533
│ │ │ │ + │ │ │ │ +
536
│ │ │ │ +
538 const VertexDescriptor& target() const;
│ │ │ │ +
539
│ │ │ │ +
541 const VertexDescriptor& source() const;
│ │ │ │ +
542
│ │ │ │ +
543 std::ptrdiff_t distanceTo(const EdgeIterator& other) const;
│ │ │ │ +
544
│ │ │ │ +
545 private:
│ │ │ │ +
547 VertexDescriptor source_;
│ │ │ │ +
552 EdgeDescriptor edge_;
│ │ │ │ +
553 };
│ │ │ │ +
│ │ │ │ +
554
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
559 : public ForwardIteratorFacade<VertexIterator,const VertexDescriptor>
│ │ │ │ +
560 {
│ │ │ │ +
561 public:
│ │ │ │ +
568 explicit VertexIterator(const SubGraph<G,T>* graph, const VertexDescriptor& current,
│ │ │ │ +
569 const VertexDescriptor& end);
│ │ │ │ +
570
│ │ │ │ +
571
│ │ │ │ +
578 explicit VertexIterator(const VertexDescriptor& current);
│ │ │ │ +
579
│ │ │ │ + │ │ │ │ +
582
│ │ │ │ +
584 bool equals(const VertexIterator& other) const;
│ │ │ │ +
585
│ │ │ │ + │ │ │ │ +
591
│ │ │ │ + │ │ │ │ +
598
│ │ │ │ + │ │ │ │ +
605
│ │ │ │ +
606 private:
│ │ │ │ +
608 const SubGraph<Graph,T>* graph_;
│ │ │ │ +
610 VertexDescriptor current_;
│ │ │ │ +
612 VertexDescriptor end_;
│ │ │ │ +
613 };
│ │ │ │ +
│ │ │ │ +
614
│ │ │ │ + │ │ │ │ +
619
│ │ │ │ + │ │ │ │ +
624
│ │ │ │ + │ │ │ │ +
630
│ │ │ │ + │ │ │ │ +
636
│ │ │ │ + │ │ │ │ +
644
│ │ │ │ + │ │ │ │ +
652
│ │ │ │ +
656 std::size_t noVertices() const;
│ │ │ │ +
657
│ │ │ │ + │ │ │ │ +
665
│ │ │ │ +
669 std::size_t noEdges() const;
│ │ │ │ + │ │ │ │ +
677 const VertexDescriptor& target) const;
│ │ │ │ +
685 SubGraph(const Graph& graph, const T& excluded);
│ │ │ │ +
686
│ │ │ │ + │ │ │ │ +
691
│ │ │ │ +
692 private:
│ │ │ │ +
694 const T& excluded_;
│ │ │ │ +
696 std::size_t noVertices_;
│ │ │ │ +
698 VertexDescriptor endVertex_;
│ │ │ │ +
700 int noEdges_;
│ │ │ │ +
705 VertexDescriptor maxVertex_;
│ │ │ │ +
707 VertexDescriptor* edges_;
│ │ │ │ +
709 std::ptrdiff_t* start_;
│ │ │ │ +
711 std::ptrdiff_t* end_;
│ │ │ │ +
713 SubGraph(const SubGraph&)
│ │ │ │ +
714 {}
│ │ │ │ +
715 };
│ │ │ │ +
│ │ │ │ +
716
│ │ │ │ +
717
│ │ │ │ +
721 template<class G, class VP, class VM=IdentityMap>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
723 {
│ │ │ │ +
724 public:
│ │ │ │ +
728 typedef G Graph;
│ │ │ │ +
729
│ │ │ │ +
733 typedef typename Graph::VertexDescriptor VertexDescriptor;
│ │ │ │ +
734
│ │ │ │ +
738 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
│ │ │ │ +
739
│ │ │ │ + │ │ │ │ +
744
│ │ │ │ +
756 typedef VM VertexMap;
│ │ │ │ +
757
│ │ │ │ +
761 typedef typename Graph::EdgeIterator EdgeIterator;
│ │ │ │ +
762
│ │ │ │ +
766 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
│ │ │ │ +
767
│ │ │ │ + │ │ │ │ +
774
│ │ │ │ + │ │ │ │ +
781
│ │ │ │ + │ │ │ │ +
788
│ │ │ │ + │ │ │ │ +
795
│ │ │ │ +
796
│ │ │ │ +
797 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
799 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
800 C>::value,
│ │ │ │ +
801 typename Graph::VertexIterator,
│ │ │ │ +
802 typename Graph::ConstVertexIterator>::type
│ │ │ │ +
803 {
│ │ │ │ +
804 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
│ │ │ │ +
805 friend class VertexIteratorT<typename std::remove_const<C>::type>;
│ │ │ │ +
806 public:
│ │ │ │ +
810 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
811 C>::value,
│ │ │ │ +
812 typename Graph::VertexIterator,
│ │ │ │ +
813 typename Graph::ConstVertexIterator>::type
│ │ │ │ + │ │ │ │ +
815
│ │ │ │ +
819 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
820 C>::value,
│ │ │ │ +
821 typename Graph::EdgeIterator,
│ │ │ │ +
822 typename Graph::ConstEdgeIterator>::type
│ │ │ │ + │ │ │ │ +
824
│ │ │ │ +
830 explicit VertexIteratorT(const Father& iter,
│ │ │ │ +
831 C* graph);
│ │ │ │ +
832
│ │ │ │ +
833
│ │ │ │ +
841 explicit VertexIteratorT(const Father& iter);
│ │ │ │ +
842
│ │ │ │ +
847 template<class C1>
│ │ │ │ +
848 VertexIteratorT(const VertexIteratorT<C1>& other);
│ │ │ │ +
849
│ │ │ │ +
853 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ +
854 VertexProperties&,
│ │ │ │ +
855 const VertexProperties&>::type
│ │ │ │ +
856 properties() const;
│ │ │ │ +
857
│ │ │ │ + │ │ │ │ +
864
│ │ │ │ + │ │ │ │ +
871
│ │ │ │ +
872 private:
│ │ │ │ +
876 C* graph_;
│ │ │ │ +
877 };
│ │ │ │ +
│ │ │ │ +
878
│ │ │ │ +
882 typedef VertexIteratorT<VertexPropertiesGraph<Graph,
│ │ │ │ +
883 VertexProperties,VM> > VertexIterator;
│ │ │ │ +
884
│ │ │ │ +
888 typedef VertexIteratorT<const VertexPropertiesGraph<Graph,
│ │ │ │ +
889 VertexProperties,VM> > ConstVertexIterator;
│ │ │ │ +
890
│ │ │ │ + │ │ │ │ +
896
│ │ │ │ + │ │ │ │ +
902
│ │ │ │ + │ │ │ │ +
908
│ │ │ │ + │ │ │ │ +
914
│ │ │ │ +
920 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
│ │ │ │ +
921
│ │ │ │ +
927 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
│ │ │ │ +
928
│ │ │ │ +
933 const Graph& graph() const;
│ │ │ │ +
934
│ │ │ │ +
938 std::size_t noVertices() const;
│ │ │ │ +
939
│ │ │ │ +
943 std::size_t noEdges() const;
│ │ │ │ +
944
│ │ │ │ + │ │ │ │ +
952
│ │ │ │ +
958 VertexPropertiesGraph(Graph& graph, const VertexMap vmap=VertexMap());
│ │ │ │ +
959
│ │ │ │ +
960 private:
│ │ │ │ +
961 VertexPropertiesGraph(const VertexPropertiesGraph&)
│ │ │ │ +
962 {}
│ │ │ │ +
963
│ │ │ │ +
965 Graph& graph_;
│ │ │ │ +
967 VertexMap vmap_;
│ │ │ │ +
969 std::vector<VertexProperties> vertexProperties_;
│ │ │ │ +
970
│ │ │ │ +
971 };
│ │ │ │ +
│ │ │ │ +
972
│ │ │ │ +
976 template<class G, class VP, class EP, class VM=IdentityMap, class EM=IdentityMap>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
978 {
│ │ │ │ +
979 public:
│ │ │ │ +
983 typedef G Graph;
│ │ │ │ +
984
│ │ │ │ +
988 typedef typename Graph::VertexDescriptor VertexDescriptor;
│ │ │ │ +
989
│ │ │ │ +
993 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
│ │ │ │ +
994
│ │ │ │ + │ │ │ │ +
999
│ │ │ │ +
1011 typedef VM VertexMap;
│ │ │ │ +
1012
│ │ │ │ +
1016 typedef EP EdgeProperties;
│ │ │ │ +
1017
│ │ │ │ +
1018
│ │ │ │ +
1030 typedef EM EdgeMap;
│ │ │ │ +
1031
│ │ │ │ +
1032 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1034 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
1035 C>::value,
│ │ │ │ +
1036 typename Graph::EdgeIterator,
│ │ │ │ +
1037 typename Graph::ConstEdgeIterator>::type
│ │ │ │ +
1038 {
│ │ │ │ +
1039
│ │ │ │ +
1040 friend class EdgeIteratorT<const typename std::remove_const<C>::type>;
│ │ │ │ +
1041 friend class EdgeIteratorT<typename std::remove_const<C>::type>;
│ │ │ │ +
1042 public:
│ │ │ │ +
1046 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
1047 C>::value,
│ │ │ │ +
1048 typename Graph::EdgeIterator,
│ │ │ │ +
1049 typename Graph::ConstEdgeIterator>::type
│ │ │ │ + │ │ │ │ +
1051
│ │ │ │ +
1057 explicit EdgeIteratorT(const Father& iter,
│ │ │ │ +
1058 C* graph);
│ │ │ │ +
1059
│ │ │ │ +
1067 explicit EdgeIteratorT(const Father& iter);
│ │ │ │ +
1068
│ │ │ │ +
1073 template<class C1>
│ │ │ │ +
1074 EdgeIteratorT(const EdgeIteratorT<C1>& other);
│ │ │ │ +
1075
│ │ │ │ +
1079 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ +
1080 EdgeProperties&,
│ │ │ │ +
1081 const EdgeProperties&>::type
│ │ │ │ +
1082 properties() const;
│ │ │ │ +
1083
│ │ │ │ +
1084 private:
│ │ │ │ +
1088 C* graph_;
│ │ │ │ +
1089 };
│ │ │ │ +
│ │ │ │ +
1090
│ │ │ │ +
1094 typedef EdgeIteratorT<PropertiesGraph<Graph,
│ │ │ │ +
1095 VertexProperties,
│ │ │ │ +
1096 EdgeProperties,VM,EM> > EdgeIterator;
│ │ │ │ +
1097
│ │ │ │ +
1101 typedef EdgeIteratorT<const PropertiesGraph<Graph,
│ │ │ │ +
1102 VertexProperties,
│ │ │ │ +
1103 EdgeProperties,VM,EM> > ConstEdgeIterator;
│ │ │ │ +
1104
│ │ │ │ +
1110 EdgeIterator beginEdges(const VertexDescriptor& source);
│ │ │ │ +
1111
│ │ │ │ +
1117 EdgeIterator endEdges(const VertexDescriptor& source);
│ │ │ │ +
1118
│ │ │ │ +
1124 ConstEdgeIterator beginEdges(const VertexDescriptor& source) const;
│ │ │ │ +
1125
│ │ │ │ +
1131 ConstEdgeIterator endEdges(const VertexDescriptor& source) const;
│ │ │ │ +
1132
│ │ │ │ +
1133
│ │ │ │ +
1134 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1136 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
1137 C>::value,
│ │ │ │ +
1138 typename Graph::VertexIterator,
│ │ │ │ +
1139 typename Graph::ConstVertexIterator>::type
│ │ │ │ +
1140 {
│ │ │ │ +
1141 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
│ │ │ │ +
1142 friend class VertexIteratorT<typename std::remove_const<C>::type>;
│ │ │ │ +
1143 public:
│ │ │ │ +
1147 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
1148 C>::value,
│ │ │ │ +
1149 typename Graph::VertexIterator,
│ │ │ │ +
1150 typename Graph::ConstVertexIterator>::type
│ │ │ │ + │ │ │ │ +
1152
│ │ │ │ +
1158 explicit VertexIteratorT(const Father& iter,
│ │ │ │ +
1159 C* graph);
│ │ │ │ +
1160
│ │ │ │ +
1161
│ │ │ │ +
1169 explicit VertexIteratorT(const Father& iter);
│ │ │ │ +
1170
│ │ │ │ +
1175 template<class C1>
│ │ │ │ +
1176 VertexIteratorT(const VertexIteratorT<C1>& other);
│ │ │ │ +
1177
│ │ │ │ +
1181 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ +
1182 VertexProperties&,
│ │ │ │ +
1183 const VertexProperties&>::type
│ │ │ │ +
1184 properties() const;
│ │ │ │ +
1185
│ │ │ │ +
1191 EdgeIteratorT<C> begin() const;
│ │ │ │ +
1192
│ │ │ │ +
1198 EdgeIteratorT<C> end() const;
│ │ │ │ +
1199
│ │ │ │ +
1200 private:
│ │ │ │ +
1204 C* graph_;
│ │ │ │ +
1205 };
│ │ │ │ +
│ │ │ │ +
1206
│ │ │ │ +
1210 typedef VertexIteratorT<PropertiesGraph<Graph,
│ │ │ │ +
1211 VertexProperties,
│ │ │ │ +
1212 EdgeProperties,VM,EM> > VertexIterator;
│ │ │ │ +
1213
│ │ │ │ +
1217 typedef VertexIteratorT<const PropertiesGraph<Graph,
│ │ │ │ +
1218 VertexProperties,
│ │ │ │ +
1219 EdgeProperties,VM,EM> > ConstVertexIterator;
│ │ │ │ +
1220
│ │ │ │ + │ │ │ │ +
1226
│ │ │ │ + │ │ │ │ +
1232
│ │ │ │ +
1237 ConstVertexIterator begin() const;
│ │ │ │ +
1238
│ │ │ │ + │ │ │ │ +
1244
│ │ │ │ +
1250 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
│ │ │ │ +
1251
│ │ │ │ +
1257 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
│ │ │ │ +
1258
│ │ │ │ +
│ │ │ │ +
1265 EdgeDescriptor findEdge(const VertexDescriptor& source,
│ │ │ │ +
1266 const VertexDescriptor& target)
│ │ │ │ +
1267 {
│ │ │ │ +
1268 return graph_.findEdge(source,target);
│ │ │ │ +
1269 }
│ │ │ │ +
│ │ │ │ +
1270
│ │ │ │ + │ │ │ │ +
1277
│ │ │ │ +
1278
│ │ │ │ + │ │ │ │ +
1285
│ │ │ │ + │ │ │ │ +
1293 const VertexDescriptor& target);
│ │ │ │ +
1294
│ │ │ │ + │ │ │ │ +
1302 const VertexDescriptor& target) const;
│ │ │ │ +
1303
│ │ │ │ +
1308 const Graph& graph() const;
│ │ │ │ +
1309
│ │ │ │ +
1313 std::size_t noVertices() const;
│ │ │ │ +
1314
│ │ │ │ +
1318 std::size_t noEdges() const;
│ │ │ │ +
1319
│ │ │ │ + │ │ │ │ +
1327
│ │ │ │ + │ │ │ │ +
1335 const EdgeMap& emap=EdgeMap());
│ │ │ │ +
1336
│ │ │ │ +
1337 private:
│ │ │ │ + │ │ │ │ +
1339 {}
│ │ │ │ +
1340
│ │ │ │ +
1342 Graph& graph_;
│ │ │ │ +
1345 VertexMap vmap_;
│ │ │ │ +
1346 std::vector<VertexProperties> vertexProperties_;
│ │ │ │ +
1348 EdgeMap emap_;
│ │ │ │ +
1350 std::vector<EdgeProperties> edgeProperties_;
│ │ │ │ +
1351
│ │ │ │ +
1352 };
│ │ │ │ +
│ │ │ │ +
1353
│ │ │ │ +
1354
│ │ │ │ +
1359 template<typename G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1361 {
│ │ │ │ +
1362 public:
│ │ │ │ +
1366 typedef G Graph;
│ │ │ │ +
1370 typedef typename G::VertexProperties VertexProperties;
│ │ │ │ +
1374 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
1375
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1381 : graph_(g)
│ │ │ │ +
1382 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1387 : graph_(0)
│ │ │ │ +
1388 {}
│ │ │ │ +
│ │ │ │ +
1389
│ │ │ │ +
1390
│ │ │ │ +
│ │ │ │ +
1395 VertexProperties& operator[](const Vertex& vertex) const
│ │ │ │ +
1396 {
│ │ │ │ +
1397 return graph_->getVertexProperties(vertex);
│ │ │ │ +
1398 }
│ │ │ │ +
│ │ │ │ +
1399 private:
│ │ │ │ +
1400 Graph* graph_;
│ │ │ │ +
1401 };
│ │ │ │ +
│ │ │ │ +
1402
│ │ │ │ +
1407 template<typename G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1409 {
│ │ │ │ +
1410 public:
│ │ │ │ +
1414 typedef G Graph;
│ │ │ │ +
1418 typedef typename G::EdgeProperties EdgeProperties;
│ │ │ │ +
1422 typedef typename G::EdgeDescriptor Edge;
│ │ │ │ +
1423
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1429 : graph_(g)
│ │ │ │ +
1430 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1435 : graph_(0)
│ │ │ │ +
1436 {}
│ │ │ │ +
│ │ │ │ +
1437
│ │ │ │ +
│ │ │ │ +
1442 EdgeProperties& operator[](const Edge& edge) const
│ │ │ │ +
1443 {
│ │ │ │ +
1444 return graph_->getEdgeProperties(edge);
│ │ │ │ +
1445 }
│ │ │ │ +
│ │ │ │ +
1446 private:
│ │ │ │ +
1447 Graph* graph_;
│ │ │ │ +
1448 };
│ │ │ │ +
│ │ │ │ +
1449
│ │ │ │ +
1450
│ │ │ │ +
1461 template<class G, class V>
│ │ │ │ +
1462 int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
│ │ │ │ +
1463 V& visitor);
│ │ │ │ +
1464
│ │ │ │ +
1465#ifndef DOXYGEN
│ │ │ │ +
1466
│ │ │ │ +
1467 template<class M>
│ │ │ │ + │ │ │ │ +
1469 : matrix_(matrix)
│ │ │ │ +
1470 {
│ │ │ │ +
1471 if(matrix_.N()!=matrix_.M())
│ │ │ │ +
1472 DUNE_THROW(ISTLError, "Matrix has to have as many columns as rows!");
│ │ │ │ +
1473
│ │ │ │ +
1474 start_ = new EdgeDescriptor[matrix_.N()+1];
│ │ │ │ +
1475
│ │ │ │ +
1476 typedef typename M::ConstIterator Iterator;
│ │ │ │ +
1477 start_[matrix_.begin().index()] = 0;
│ │ │ │ +
1478
│ │ │ │ +
1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row)
│ │ │ │ +
1480 start_[row.index()+1] = start_[row.index()] + row->size();
│ │ │ │ +
1481 }
│ │ │ │ +
1482
│ │ │ │ +
1483 template<class M>
│ │ │ │ +
1484 MatrixGraph<M>::~MatrixGraph()
│ │ │ │ +
1485 {
│ │ │ │ +
1486 delete[] start_;
│ │ │ │ +
1487 }
│ │ │ │ +
1488
│ │ │ │ +
1489 template<class M>
│ │ │ │ +
1490 inline std::size_t MatrixGraph<M>::noEdges() const
│ │ │ │ +
1491 {
│ │ │ │ +
1492 return start_[matrix_.N()];
│ │ │ │ +
1493 }
│ │ │ │ +
1494
│ │ │ │ +
1495 template<class M>
│ │ │ │ +
1496 inline std::size_t MatrixGraph<M>::noVertices() const
│ │ │ │ +
1497 {
│ │ │ │ +
1498 return matrix_.N();
│ │ │ │ +
1499 }
│ │ │ │ +
1500
│ │ │ │ +
1501 template<class M>
│ │ │ │ +
1502 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::maxVertex() const
│ │ │ │ +
1503 {
│ │ │ │ +
1504 return matrix_.N()-1;
│ │ │ │ +
1505 }
│ │ │ │ +
1506
│ │ │ │ +
1507 template<class M>
│ │ │ │ +
1508 typename MatrixGraph<M>::EdgeDescriptor
│ │ │ │ +
1509 MatrixGraph<M>::findEdge(const VertexDescriptor& source,
│ │ │ │ +
1510 const VertexDescriptor& target) const
│ │ │ │ +
1511 {
│ │ │ │ +
1512 typename M::ConstColIterator found =matrix_[source].find(target);
│ │ │ │ +
1513 if(found == matrix_[source].end())
│ │ │ │ +
1514 return std::numeric_limits<EdgeDescriptor>::max();
│ │ │ │ +
1515 std::size_t offset = found.offset();
│ │ │ │ +
1516 if(target>source)
│ │ │ │ +
1517 offset--;
│ │ │ │ +
1518
│ │ │ │ +
1519 assert(offset<noEdges());
│ │ │ │ +
1520
│ │ │ │ +
1521 return start_[source]+offset;
│ │ │ │ +
1522 }
│ │ │ │ +
1523
│ │ │ │ +
1524
│ │ │ │ +
1525 template<class M>
│ │ │ │ +
1526 inline M& MatrixGraph<M>::matrix()
│ │ │ │ +
1527 {
│ │ │ │ +
1528 return matrix_;
│ │ │ │ +
1529 }
│ │ │ │ +
1530
│ │ │ │ +
1531 template<class M>
│ │ │ │ +
1532 inline const M& MatrixGraph<M>::matrix() const
│ │ │ │ +
1533 {
│ │ │ │ +
1534 return matrix_;
│ │ │ │ +
1535 }
│ │ │ │ +
1536
│ │ │ │ +
1537 template<class M>
│ │ │ │ +
1538 template<class C>
│ │ │ │ +
1539 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const VertexDescriptor& source, const ColIterator& block,
│ │ │ │ +
1540 const ColIterator& end, const EdgeDescriptor& edge)
│ │ │ │ +
1541 : source_(source), block_(block), blockEnd_(end), edge_(edge)
│ │ │ │ +
1542 {
│ │ │ │ +
1543 if(block_!=blockEnd_ && block_.index() == source_) {
│ │ │ │ +
1544 // This is the edge from the diagonal to the diagonal. Skip it.
│ │ │ │ +
1545 ++block_;
│ │ │ │ +
1546 }
│ │ │ │ +
1547 }
│ │ │ │ +
1548
│ │ │ │ +
1549 template<class M>
│ │ │ │ +
1550 template<class C>
│ │ │ │ +
1551 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const ColIterator& block)
│ │ │ │ +
1552 : block_(block)
│ │ │ │ +
1553 {}
│ │ │ │ +
1554
│ │ │ │ +
1555 template<class M>
│ │ │ │ +
1556 template<class C>
│ │ │ │ +
1557 template<class C1>
│ │ │ │ +
1558 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
│ │ │ │ +
1559 : source_(other.source_), block_(other.block_), blockEnd_(other.blockEnd_), edge_(other.edge_)
│ │ │ │ +
1560 {}
│ │ │ │ +
1561
│ │ │ │ +
1562
│ │ │ │ +
1563 template<class M>
│ │ │ │ +
1564 template<class C>
│ │ │ │ +
1565 inline typename MatrixGraph<M>::template EdgeIteratorT<C>::WeightType&
│ │ │ │ +
1566 MatrixGraph<M>::EdgeIteratorT<C>::weight() const
│ │ │ │ +
1567 {
│ │ │ │ +
1568 return *block_;
│ │ │ │ +
1569 }
│ │ │ │ +
1570
│ │ │ │ +
1571 template<class M>
│ │ │ │ +
1572 template<class C>
│ │ │ │ +
1573 inline typename MatrixGraph<M>::template EdgeIteratorT<C>& MatrixGraph<M>::EdgeIteratorT<C>::operator++()
│ │ │ │ +
1574 {
│ │ │ │ +
1575 ++block_;
│ │ │ │ +
1576 ++edge_;
│ │ │ │ +
1577
│ │ │ │ +
1578 if(block_!=blockEnd_ && block_.index() == source_) {
│ │ │ │ +
1579 // This is the edge from the diagonal to the diagonal. Skip it.
│ │ │ │ +
1580 ++block_;
│ │ │ │ +
1581 }
│ │ │ │ +
1582
│ │ │ │ +
1583 return *this;
│ │ │ │ +
1584 }
│ │ │ │ +
1585
│ │ │ │ +
1586 template<class M>
│ │ │ │ +
1587 template<class C>
│ │ │ │ +
1588 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
│ │ │ │ +
1589 {
│ │ │ │ +
1590 return block_!=other.block_;
│ │ │ │ +
1591 }
│ │ │ │ +
1592
│ │ │ │ +
1593 template<class M>
│ │ │ │ +
1594 template<class C>
│ │ │ │ +
1595 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
│ │ │ │ +
1596 {
│ │ │ │ +
1597 return block_!=other.block_;
│ │ │ │ +
1598 }
│ │ │ │ +
1599
│ │ │ │ +
1600 template<class M>
│ │ │ │ +
1601 template<class C>
│ │ │ │ +
1602 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
│ │ │ │ +
1603 {
│ │ │ │ +
1604 return block_==other.block_;
│ │ │ │ +
1605 }
│ │ │ │ +
1606
│ │ │ │ +
1607 template<class M>
│ │ │ │ +
1608 template<class C>
│ │ │ │ +
1609 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
│ │ │ │ +
1610 {
│ │ │ │ +
1611 return block_==other.block_;
│ │ │ │ +
1612 }
│ │ │ │ +
1613
│ │ │ │ +
1614 template<class M>
│ │ │ │ +
1615 template<class C>
│ │ │ │ +
1616 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::target() const
│ │ │ │ +
1617 {
│ │ │ │ +
1618 return block_.index();
│ │ │ │ +
1619 }
│ │ │ │ +
1620
│ │ │ │ +
1621 template<class M>
│ │ │ │ +
1622 template<class C>
│ │ │ │ +
1623 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::source() const
│ │ │ │ +
1624 {
│ │ │ │ +
1625 return source_;
│ │ │ │ +
1626 }
│ │ │ │ +
1627
│ │ │ │ +
1628 template<class M>
│ │ │ │ +
1629 template<class C>
│ │ │ │ +
1630 inline const typename MatrixGraph<M>::EdgeDescriptor& MatrixGraph<M>::EdgeIteratorT<C>::operator*() const
│ │ │ │ +
1631 {
│ │ │ │ +
1632 return edge_;
│ │ │ │ +
1633 }
│ │ │ │ +
1634
│ │ │ │ +
1635 template<class M>
│ │ │ │ +
1636 template<class C>
│ │ │ │ +
1637 inline const typename MatrixGraph<M>::EdgeDescriptor* MatrixGraph<M>::EdgeIteratorT<C>::operator->() const
│ │ │ │ +
1638 {
│ │ │ │ +
1639 return &edge_;
│ │ │ │ +
1640 }
│ │ │ │ +
1641
│ │ │ │ +
1642 template<class M>
│ │ │ │ +
1643 template<class C>
│ │ │ │ +
1644 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(C* graph,
│ │ │ │ +
1645 const VertexDescriptor& current)
│ │ │ │ +
1646 : graph_(graph), current_(current)
│ │ │ │ +
1647 {}
│ │ │ │ +
1648
│ │ │ │ +
1649
│ │ │ │ +
1650 template<class M>
│ │ │ │ +
1651 template<class C>
│ │ │ │ +
1652 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexDescriptor& current)
│ │ │ │ +
1653 : current_(current)
│ │ │ │ +
1654 {}
│ │ │ │ +
1655
│ │ │ │ +
1656 template<class M>
│ │ │ │ +
1657 template<class C>
│ │ │ │ +
1658 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexIteratorT<MutableContainer>& other)
│ │ │ │ +
1659 : graph_(other.graph_), current_(other.current_)
│ │ │ │ +
1660 {}
│ │ │ │ +
1661
│ │ │ │ +
1662 template<class M>
│ │ │ │ +
1663 template<class C>
│ │ │ │ +
1664 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<MutableContainer>& other) const
│ │ │ │ +
1665 {
│ │ │ │ +
1666 return current_ != other.current_;
│ │ │ │ +
1667 }
│ │ │ │ +
1668
│ │ │ │ +
1669 template<class M>
│ │ │ │ +
1670 template<class C>
│ │ │ │ +
1671 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<ConstContainer>& other) const
│ │ │ │ +
1672 {
│ │ │ │ +
1673 return current_ != other.current_;
│ │ │ │ +
1674 }
│ │ │ │ +
1675
│ │ │ │ +
1676
│ │ │ │ +
1677 template<class M>
│ │ │ │ +
1678 template<class C>
│ │ │ │ +
1679 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<MutableContainer>& other) const
│ │ │ │ +
1680 {
│ │ │ │ +
1681 return current_ == other.current_;
│ │ │ │ +
1682 }
│ │ │ │ +
1683
│ │ │ │ +
1684 template<class M>
│ │ │ │ +
1685 template<class C>
│ │ │ │ +
1686 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<ConstContainer>& other) const
│ │ │ │ +
1687 {
│ │ │ │ +
1688 return current_ == other.current_;
│ │ │ │ +
1689 }
│ │ │ │ +
1690
│ │ │ │ +
1691 template<class M>
│ │ │ │ +
1692 template<class C>
│ │ │ │ +
1693 inline typename MatrixGraph<M>::template VertexIteratorT<C>& MatrixGraph<M>::VertexIteratorT<C>::operator++()
│ │ │ │ +
1694 {
│ │ │ │ +
1695 ++current_;
│ │ │ │ +
1696 return *this;
│ │ │ │ +
1697 }
│ │ │ │ +
1698
│ │ │ │ +
1699 template<class M>
│ │ │ │ +
1700 template<class C>
│ │ │ │ +
1701 inline typename MatrixGraph<M>::template VertexIteratorT<C>::WeightType&
│ │ │ │ +
1702 MatrixGraph<M>::VertexIteratorT<C>::weight() const
│ │ │ │ +
1703 {
│ │ │ │ +
1704 return graph_->matrix()[current_][current_];
│ │ │ │ +
1705 }
│ │ │ │ +
1706
│ │ │ │ +
1707 template<class M>
│ │ │ │ +
1708 template<class C>
│ │ │ │ +
1709 inline const typename MatrixGraph<M>::VertexDescriptor&
│ │ │ │ +
1710 MatrixGraph<M>::VertexIteratorT<C>::operator*() const
│ │ │ │ +
1711 {
│ │ │ │ +
1712 return current_;
│ │ │ │ +
1713 }
│ │ │ │ +
1714
│ │ │ │ +
1715 template<class M>
│ │ │ │ +
1716 template<class C>
│ │ │ │ +
1717 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
│ │ │ │ +
1718 MatrixGraph<M>::VertexIteratorT<C>::begin() const
│ │ │ │ +
1719 {
│ │ │ │ +
1720 return graph_->beginEdges(current_);
│ │ │ │ +
1721 }
│ │ │ │ +
1722
│ │ │ │ +
1723 template<class M>
│ │ │ │ +
1724 template<class C>
│ │ │ │ +
1725 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
│ │ │ │ +
1726 MatrixGraph<M>::VertexIteratorT<C>::end() const
│ │ │ │ +
1727 {
│ │ │ │ +
1728 return graph_->endEdges(current_);
│ │ │ │ +
1729 }
│ │ │ │ +
1730
│ │ │ │ +
1731 template<class M>
│ │ │ │ +
1732 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
│ │ │ │ +
1733 MatrixGraph<M>::begin()
│ │ │ │ +
1734 {
│ │ │ │ +
1735 return VertexIterator(this,0);
│ │ │ │ +
1736 }
│ │ │ │ +
1737
│ │ │ │ +
1738 template<class M>
│ │ │ │ +
1739 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
│ │ │ │ +
1740 MatrixGraph<M>::end()
│ │ │ │ +
1741 {
│ │ │ │ +
1742 return VertexIterator(matrix_.N());
│ │ │ │ +
1743 }
│ │ │ │ +
1744
│ │ │ │ +
1745
│ │ │ │ +
1746 template<class M>
│ │ │ │ +
1747 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
│ │ │ │ +
1748 MatrixGraph<M>::begin() const
│ │ │ │ +
1749 {
│ │ │ │ +
1750 return ConstVertexIterator(this, 0);
│ │ │ │ +
1751 }
│ │ │ │ +
1752
│ │ │ │ +
1753 template<class M>
│ │ │ │ +
1754 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
│ │ │ │ +
1755 MatrixGraph<M>::end() const
│ │ │ │ +
1756 {
│ │ │ │ +
1757 return ConstVertexIterator(matrix_.N());
│ │ │ │ +
1758 }
│ │ │ │ +
1759
│ │ │ │ +
1760 template<class M>
│ │ │ │ +
1761 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
│ │ │ │ +
1762 MatrixGraph<M>::beginEdges(const VertexDescriptor& source)
│ │ │ │ +
1763 {
│ │ │ │ +
1764 return EdgeIterator(source, matrix_.operator[](source).begin(),
│ │ │ │ +
1765 matrix_.operator[](source).end(), start_[source]);
│ │ │ │ +
1766 }
│ │ │ │ +
1767
│ │ │ │ +
1768 template<class M>
│ │ │ │ +
1769 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
│ │ │ │ +
1770 MatrixGraph<M>::endEdges(const VertexDescriptor& source)
│ │ │ │ +
1771 {
│ │ │ │ +
1772 return EdgeIterator(matrix_.operator[](source).end());
│ │ │ │ +
1773 }
│ │ │ │ +
1774
│ │ │ │ +
1775
│ │ │ │ +
1776 template<class M>
│ │ │ │ +
1777 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
│ │ │ │ +
1778 MatrixGraph<M>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ +
1779 {
│ │ │ │ +
1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(),
│ │ │ │ +
1781 matrix_.operator[](source).end(), start_[source]);
│ │ │ │ +
1782 }
│ │ │ │ +
1783
│ │ │ │ +
1784 template<class M>
│ │ │ │ +
1785 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
│ │ │ │ +
1786 MatrixGraph<M>::endEdges(const VertexDescriptor& source) const
│ │ │ │ +
1787 {
│ │ │ │ +
1788 return ConstEdgeIterator(matrix_.operator[](source).end());
│ │ │ │ +
1789 }
│ │ │ │ +
1790
│ │ │ │ +
1791
│ │ │ │ +
1792 template<class G, class T>
│ │ │ │ +
1793 SubGraph<G,T>::EdgeIterator::EdgeIterator(const VertexDescriptor& source,
│ │ │ │ +
1794 const EdgeDescriptor& edge)
│ │ │ │ +
1795 : source_(source), edge_(edge)
│ │ │ │ +
1796 {}
│ │ │ │ +
1797
│ │ │ │ +
1798
│ │ │ │ +
1799 template<class G, class T>
│ │ │ │ +
1800 SubGraph<G,T>::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge)
│ │ │ │ +
1801 : edge_(edge)
│ │ │ │ +
1802 {}
│ │ │ │ +
1803
│ │ │ │ +
1804 template<class G, class T>
│ │ │ │ +
1805 typename SubGraph<G,T>::EdgeIndexMap SubGraph<G,T>::getEdgeIndexMap()
│ │ │ │ +
1806 {
│ │ │ │ +
1807 return EdgeIndexMap(edges_);
│ │ │ │ +
1808 }
│ │ │ │ +
1809
│ │ │ │ +
1810 template<class G, class T>
│ │ │ │ +
1811 inline bool SubGraph<G,T>::EdgeIterator::equals(const EdgeIterator & other) const
│ │ │ │ +
1812 {
│ │ │ │ +
1813 return other.edge_==edge_;
│ │ │ │ +
1814 }
│ │ │ │ +
1815
│ │ │ │ +
1816 template<class G, class T>
│ │ │ │ +
1817 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::increment()
│ │ │ │ +
1818 {
│ │ │ │ +
1819 ++edge_;
│ │ │ │ +
1820 return *this;
│ │ │ │ +
1821 }
│ │ │ │ +
1822
│ │ │ │ +
1823 template<class G, class T>
│ │ │ │ +
1824 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::decrement()
│ │ │ │ +
1825 {
│ │ │ │ +
1826 --edge_;
│ │ │ │ +
1827 return *this;
│ │ │ │ +
1828 }
│ │ │ │ +
1829
│ │ │ │ +
1830 template<class G, class T>
│ │ │ │ +
1831 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::advance(std::ptrdiff_t n)
│ │ │ │ +
1832 {
│ │ │ │ +
1833 edge_+=n;
│ │ │ │ +
1834 return *this;
│ │ │ │ +
1835 }
│ │ │ │ +
1836 template<class G, class T>
│ │ │ │ +
1837 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::source() const
│ │ │ │ +
1838 {
│ │ │ │ +
1839 return source_;
│ │ │ │ +
1840 }
│ │ │ │ +
1841
│ │ │ │ +
1842 template<class G, class T>
│ │ │ │ +
1843 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::target() const
│ │ │ │ +
1844 {
│ │ │ │ +
1845 return *edge_;
│ │ │ │ +
1846 }
│ │ │ │ +
1847
│ │ │ │ +
1848
│ │ │ │ +
1849 template<class G, class T>
│ │ │ │ +
1850 inline const typename SubGraph<G,T>::EdgeDescriptor& SubGraph<G,T>::EdgeIterator::dereference() const
│ │ │ │ +
1851 {
│ │ │ │ +
1852 return edge_;
│ │ │ │ +
1853 }
│ │ │ │ +
1854
│ │ │ │ +
1855 template<class G, class T>
│ │ │ │ +
1856 inline std::ptrdiff_t SubGraph<G,T>::EdgeIterator::distanceTo(const EdgeIterator & other) const
│ │ │ │ +
1857 {
│ │ │ │ +
1858 return other.edge_-edge_;
│ │ │ │ +
1859 }
│ │ │ │ +
1860
│ │ │ │ +
1861 template<class G, class T>
│ │ │ │ +
1862 SubGraph<G,T>::VertexIterator::VertexIterator(const SubGraph<G,T>* graph,
│ │ │ │ +
1863 const VertexDescriptor& current,
│ │ │ │ +
1864 const VertexDescriptor& end)
│ │ │ │ +
1865 : graph_(graph), current_(current), end_(end)
│ │ │ │ +
1866 {
│ │ │ │ +
1867 // Skip excluded vertices
│ │ │ │ +
1868 typedef typename T::const_iterator Iterator;
│ │ │ │ +
1869
│ │ │ │ +
1870 for(Iterator vertex = graph_->excluded_.begin();
│ │ │ │ +
1871 current_ != end_ && *vertex;
│ │ │ │ +
1872 ++vertex)
│ │ │ │ +
1873 ++current_;
│ │ │ │ +
1874 assert(current_ == end_ || !graph_->excluded_[current_]);
│ │ │ │ +
1875 }
│ │ │ │ +
1876
│ │ │ │ +
1877 template<class G, class T>
│ │ │ │ +
1878 SubGraph<G,T>::VertexIterator::VertexIterator(const VertexDescriptor& current)
│ │ │ │ +
1879 : current_(current)
│ │ │ │ +
1880 {}
│ │ │ │ +
1881
│ │ │ │ +
1882 template<class G, class T>
│ │ │ │ +
1883 inline typename SubGraph<G,T>::VertexIterator& SubGraph<G,T>::VertexIterator::increment()
│ │ │ │ +
1884 {
│ │ │ │ +
1885 ++current_;
│ │ │ │ +
1886 //Skip excluded vertices
│ │ │ │ +
1887 while(current_ != end_ && graph_->excluded_[current_])
│ │ │ │ +
1888 ++current_;
│ │ │ │ +
1889
│ │ │ │ +
1890 assert(current_ == end_ || !graph_->excluded_[current_]);
│ │ │ │ +
1891 return *this;
│ │ │ │ +
1892 }
│ │ │ │ +
1893
│ │ │ │ +
1894 template<class G, class T>
│ │ │ │ +
1895 inline bool SubGraph<G,T>::VertexIterator::equals(const VertexIterator & other) const
│ │ │ │ +
1896 {
│ │ │ │ +
1897 return current_==other.current_;
│ │ │ │ +
1898 }
│ │ │ │ +
1899
│ │ │ │ +
1900 template<class G, class T>
│ │ │ │ +
1901 inline const typename G::VertexDescriptor& SubGraph<G,T>::VertexIterator::dereference() const
│ │ │ │ +
1902 {
│ │ │ │ +
1903 return current_;
│ │ │ │ +
1904 }
│ │ │ │ +
1905
│ │ │ │ +
1906 template<class G, class T>
│ │ │ │ +
1907 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::begin() const
│ │ │ │ +
1908 {
│ │ │ │ +
1909 return graph_->beginEdges(current_);
│ │ │ │ +
1910 }
│ │ │ │ +
1911
│ │ │ │ +
1912 template<class G, class T>
│ │ │ │ +
1913 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::end() const
│ │ │ │ +
1914 {
│ │ │ │ +
1915 return graph_->endEdges(current_);
│ │ │ │ +
1916 }
│ │ │ │ +
1917
│ │ │ │ +
1918 template<class G, class T>
│ │ │ │ +
1919 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::begin() const
│ │ │ │ +
1920 {
│ │ │ │ +
1921 return VertexIterator(this, 0, endVertex_);
│ │ │ │ +
1922 }
│ │ │ │ +
1923
│ │ │ │ +
1924
│ │ │ │ +
1925 template<class G, class T>
│ │ │ │ +
1926 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::end() const
│ │ │ │ +
1927 {
│ │ │ │ +
1928 return VertexIterator(endVertex_);
│ │ │ │ +
1929 }
│ │ │ │ +
1930
│ │ │ │ +
1931
│ │ │ │ +
1932 template<class G, class T>
│ │ │ │ +
1933 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ +
1934 {
│ │ │ │ +
1935 return EdgeIterator(source, edges_+start_[source]);
│ │ │ │ +
1936 }
│ │ │ │ +
1937
│ │ │ │ +
1938 template<class G, class T>
│ │ │ │ +
1939 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::endEdges(const VertexDescriptor& source) const
│ │ │ │ +
1940 {
│ │ │ │ +
1941 return EdgeIterator(edges_+end_[source]);
│ │ │ │ +
1942 }
│ │ │ │ +
1943
│ │ │ │ +
1944 template<class G, class T>
│ │ │ │ +
1945 std::size_t SubGraph<G,T>::noVertices() const
│ │ │ │ +
1946 {
│ │ │ │ +
1947 return noVertices_;
│ │ │ │ +
1948 }
│ │ │ │ +
1949
│ │ │ │ +
1950 template<class G, class T>
│ │ │ │ +
1951 inline typename SubGraph<G,T>::VertexDescriptor SubGraph<G,T>::maxVertex() const
│ │ │ │ +
1952 {
│ │ │ │ +
1953 return maxVertex_;
│ │ │ │ +
1954 }
│ │ │ │ +
1955
│ │ │ │ +
1956 template<class G, class T>
│ │ │ │ +
1957 inline std::size_t SubGraph<G,T>::noEdges() const
│ │ │ │ +
1958 {
│ │ │ │ +
1959 return noEdges_;
│ │ │ │ +
1960 }
│ │ │ │ +
1961
│ │ │ │ +
1962 template<class G, class T>
│ │ │ │ +
1963 inline typename SubGraph<G,T>::EdgeDescriptor SubGraph<G,T>::findEdge(const VertexDescriptor& source,
│ │ │ │ +
1964 const VertexDescriptor& target) const
│ │ │ │ +
1965 {
│ │ │ │ +
1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source], edges_+end_[source], target);
│ │ │ │ +
1967 if(edge==edges_+end_[source] || *edge!=target)
│ │ │ │ +
1968 return std::numeric_limits<EdgeDescriptor>::max();
│ │ │ │ +
1969
│ │ │ │ +
1970 return edge;
│ │ │ │ +
1971 }
│ │ │ │ +
1972
│ │ │ │ +
1973 template<class G, class T>
│ │ │ │ +
1974 SubGraph<G,T>::~SubGraph()
│ │ │ │ +
1975 {
│ │ │ │ +
1976 delete[] edges_;
│ │ │ │ +
1977 delete[] end_;
│ │ │ │ +
1978 delete[] start_;
│ │ │ │ +
1979 }
│ │ │ │ +
1980
│ │ │ │ +
1981 template<class G, class T>
│ │ │ │ +
1982 SubGraph<G,T>::SubGraph(const G& graph, const T& excluded)
│ │ │ │ +
1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_(graph.maxVertex())
│ │ │ │ +
1984 {
│ │ │ │ +
1985 start_ = new std::ptrdiff_t[graph.noVertices()];
│ │ │ │ +
1986 end_ = new std::ptrdiff_t[graph.noVertices()];
│ │ │ │ +
1987 edges_ = new VertexDescriptor[graph.noEdges()];
│ │ │ │ +
1988
│ │ │ │ +
1989 VertexDescriptor* edge=edges_;
│ │ │ │ +
1990
│ │ │ │ +
1991 // Cater for the case that there are no vertices.
│ │ │ │ +
1992 // Otherwise endVertex_ will get 1 below.
│ │ │ │ +
1993 if ( graph.noVertices() == 0)
│ │ │ │ +
1994 return;
│ │ │ │ +
1995
│ │ │ │ +
1996 typedef typename Graph::ConstVertexIterator Iterator;
│ │ │ │ +
1997 Iterator endVertex=graph.end();
│ │ │ │ +
1998
│ │ │ │ +
1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex)
│ │ │ │ +
2000 if(excluded_[*vertex])
│ │ │ │ +
2001 start_[*vertex]=end_[*vertex]=-1;
│ │ │ │ +
2002 else{
│ │ │ │ +
2003 ++noVertices_;
│ │ │ │ +
2004 endVertex_ = std::max(*vertex, endVertex_);
│ │ │ │ +
2005
│ │ │ │ +
2006 start_[*vertex] = edge-edges_;
│ │ │ │ +
2007
│ │ │ │ +
2008 auto endEdge = vertex.end();
│ │ │ │ +
2009
│ │ │ │ +
2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter)
│ │ │ │ +
2011 if(!excluded[iter.target()]) {
│ │ │ │ +
2012 *edge = iter.target();
│ │ │ │ +
2013 ++edge;
│ │ │ │ +
2014 }
│ │ │ │ +
2015
│ │ │ │ +
2016 end_[*vertex] = edge - edges_;
│ │ │ │ +
2017
│ │ │ │ +
2018 // Sort the edges
│ │ │ │ +
2019 std::sort(edges_+start_[*vertex], edge);
│ │ │ │ +
2020 }
│ │ │ │ +
2021 noEdges_ = edge-edges_;
│ │ │ │ +
2022 ++endVertex_;
│ │ │ │ +
2023 }
│ │ │ │ +
2024
│ │ │ │ +
2025 template<class G, class V, class VM>
│ │ │ │ +
2026 inline std::size_t VertexPropertiesGraph<G,V,VM>::noEdges() const
│ │ │ │ +
2027 {
│ │ │ │ +
2028 return graph_.noEdges();
│ │ │ │ +
2029 }
│ │ │ │ +
2030
│ │ │ │ +
2031 template<class G, class V, class VM>
│ │ │ │ +
2032 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
│ │ │ │ +
2033 VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source)
│ │ │ │ +
2034 {
│ │ │ │ +
2035 return graph_.beginEdges(source);
│ │ │ │ +
2036 }
│ │ │ │ +
2037
│ │ │ │ +
2038 template<class G, class V, class VM>
│ │ │ │ +
2039 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
│ │ │ │ +
2040 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source)
│ │ │ │ +
2041 {
│ │ │ │ +
2042 return graph_.endEdges(source);
│ │ │ │ +
2043 }
│ │ │ │ +
2044
│ │ │ │ +
2045 template<class G, class V, class VM>
│ │ │ │ +
2046 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
│ │ │ │ +
2047 inline VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ +
2048 {
│ │ │ │ +
2049 return graph_.beginEdges(source);
│ │ │ │ +
2050 }
│ │ │ │ +
2051
│ │ │ │ +
2052 template<class G, class V, class VM>
│ │ │ │ +
2053 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
│ │ │ │ +
2054 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source) const
│ │ │ │ +
2055 {
│ │ │ │ +
2056 return graph_.endEdges(source);
│ │ │ │ +
2057 }
│ │ │ │ +
2058
│ │ │ │ +
2059 template<class G, class V, class VM>
│ │ │ │ +
2060 template<class C>
│ │ │ │ +
2061 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
│ │ │ │ +
2062 ::VertexIteratorT(const Father& iter,
│ │ │ │ +
2063 C* graph)
│ │ │ │ +
2064 : Father(iter), graph_(graph)
│ │ │ │ +
2065 {}
│ │ │ │ +
2066
│ │ │ │ +
2067 template<class G, class V, class VM>
│ │ │ │ +
2068 template<class C>
│ │ │ │ +
2069 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
│ │ │ │ +
2070 ::VertexIteratorT(const Father& iter)
│ │ │ │ +
2071 : Father(iter)
│ │ │ │ +
2072 {}
│ │ │ │ +
2073
│ │ │ │ +
2074 template<class G, class V, class VM>
│ │ │ │ +
2075 template<class C>
│ │ │ │ +
2076 template<class C1>
│ │ │ │ +
2077 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
│ │ │ │ +
2078 ::VertexIteratorT(const VertexIteratorT<C1>& other)
│ │ │ │ +
2079 : Father(other), graph_(other.graph_)
│ │ │ │ +
2080 {}
│ │ │ │ +
2081
│ │ │ │ +
2082 template<class G, class V, class VM>
│ │ │ │ +
2083 template<class C>
│ │ │ │ +
2084 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ +
2085 V&, const V&>::type
│ │ │ │ +
2086 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::properties() const
│ │ │ │ +
2087 {
│ │ │ │ +
2088 return graph_->getVertexProperties(Father::operator*());
│ │ │ │ +
2089 }
│ │ │ │ +
2090
│ │ │ │ +
2091 template<class G, class V, class VM>
│ │ │ │ +
2092 template<class C>
│ │ │ │ +
2093 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
2094 C>::value,
│ │ │ │ +
2095 typename G::EdgeIterator,
│ │ │ │ +
2096 typename G::ConstEdgeIterator>::type
│ │ │ │ +
2097 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::begin() const
│ │ │ │ +
2098 {
│ │ │ │ +
2099 return graph_->beginEdges(Father::operator*());
│ │ │ │ +
2100 }
│ │ │ │ +
2101
│ │ │ │ +
2102 template<class G, class V, class VM>
│ │ │ │ +
2103 template<class C>
│ │ │ │ +
2104 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ +
2105 C>::value,
│ │ │ │ +
2106 typename G::EdgeIterator,
│ │ │ │ +
2107 typename G::ConstEdgeIterator>::type
│ │ │ │ +
2108 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::end() const
│ │ │ │ +
2109 {
│ │ │ │ +
2110 return graph_->endEdges(Father::operator*());
│ │ │ │ +
2111 }
│ │ │ │ +
2112
│ │ │ │ +
2113 template<class G, class V, class VM>
│ │ │ │ +
2114 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::begin()
│ │ │ │ +
2115 {
│ │ │ │ +
2116 return VertexIterator(graph_.begin(), this);
│ │ │ │ +
2117 }
│ │ │ │ +
2118
│ │ │ │ +
2119 template<class G, class V, class VM>
│ │ │ │ +
2120 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::end()
│ │ │ │ +
2121 {
│ │ │ │ +
2122 return VertexIterator(graph_.end());
│ │ │ │ +
2123 }
│ │ │ │ +
2124
│ │ │ │ +
2125
│ │ │ │ +
2126 template<class G, class V, class VM>
│ │ │ │ +
2127 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::begin() const
│ │ │ │ +
2128 {
│ │ │ │ +
2129 return ConstVertexIterator(graph_.begin(), this);
│ │ │ │ +
2130 }
│ │ │ │ +
2131
│ │ │ │ +
2132 template<class G, class V, class VM>
│ │ │ │ +
2133 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::end() const
│ │ │ │ +
2134 {
│ │ │ │ +
2135 return ConstVertexIterator(graph_.end());
│ │ │ │ +
2136 }
│ │ │ │ +
2137
│ │ │ │ +
2138 template<class G, class V, class VM>
│ │ │ │ +
2139 inline V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex)
│ │ │ │ +
2140 {
│ │ │ │ +
2141 return vertexProperties_[vmap_[vertex]];
│ │ │ │ +
2142 }
│ │ │ │ +
2143
│ │ │ │ +
2144 template<class G, class V, class VM>
│ │ │ │ +
2145 inline const V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex) const
│ │ │ │ +
2146 {
│ │ │ │ +
2147 return vertexProperties_[vmap_[vertex]];
│ │ │ │ +
2148 }
│ │ │ │ +
2149
│ │ │ │ +
2150 template<class G, class V, class VM>
│ │ │ │ +
2151 inline const G& VertexPropertiesGraph<G,V,VM>::graph() const
│ │ │ │ +
2152 {
│ │ │ │ +
2153 return graph_;
│ │ │ │ +
2154 }
│ │ │ │ +
2155
│ │ │ │ +
2156 template<class G, class V, class VM>
│ │ │ │ +
2157 inline std::size_t VertexPropertiesGraph<G,V,VM>::noVertices() const
│ │ │ │ +
2158 {
│ │ │ │ +
2159 return graph_.noVertices();
│ │ │ │ +
2160 }
│ │ │ │ +
2161
│ │ │ │ +
2162
│ │ │ │ +
2163 template<class G, class V, class VM>
│ │ │ │ +
2164 inline typename VertexPropertiesGraph<G,V,VM>::VertexDescriptor VertexPropertiesGraph<G,V,VM>::maxVertex() const
│ │ │ │ +
2165 {
│ │ │ │ +
2166 return graph_.maxVertex();
│ │ │ │ +
2167 }
│ │ │ │ +
2168
│ │ │ │ +
2169 template<class G, class V, class VM>
│ │ │ │ +
2170 VertexPropertiesGraph<G,V,VM>::VertexPropertiesGraph(Graph& graph, const VM vmap)
│ │ │ │ +
2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V())
│ │ │ │ +
2172 {}
│ │ │ │ +
2173
│ │ │ │ +
2174 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2175 template<class C>
│ │ │ │ +
2176 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter,
│ │ │ │ +
2177 C* graph)
│ │ │ │ +
2178 : Father(iter), graph_(graph)
│ │ │ │ +
2179 {}
│ │ │ │ +
2180
│ │ │ │ +
2181 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2182 template<class C>
│ │ │ │ +
2183 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter)
│ │ │ │ +
2184 : Father(iter)
│ │ │ │ +
2185 {}
│ │ │ │ +
2186
│ │ │ │ +
2187 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2188 template<class C>
│ │ │ │ +
2189 template<class C1>
│ │ │ │ +
2190 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
│ │ │ │ +
2191 : Father(other), graph_(other.graph_)
│ │ │ │ +
2192 {}
│ │ │ │ +
2193
│ │ │ │ +
2194
│ │ │ │ +
2195 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2196 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noEdges() const
│ │ │ │ +
2197 {
│ │ │ │ +
2198 return graph_.noEdges();
│ │ │ │ +
2199 }
│ │ │ │ +
2200
│ │ │ │ +
2201 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2202 template<class C>
│ │ │ │ +
2203 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,E&,const E&>::type
│ │ │ │ +
2204 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::properties() const
│ │ │ │ +
2205 {
│ │ │ │ +
2206 return graph_->getEdgeProperties(Father::operator*());
│ │ │ │ +
2207 }
│ │ │ │ +
2208
│ │ │ │ +
2209 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2210 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
│ │ │ │ +
2211 PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source)
│ │ │ │ +
2212 {
│ │ │ │ +
2213 return EdgeIterator(graph_.beginEdges(source), this);
│ │ │ │ +
2214 }
│ │ │ │ +
2215
│ │ │ │ +
2216 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2217 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
│ │ │ │ +
2218 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source)
│ │ │ │ +
2219 {
│ │ │ │ +
2220 return EdgeIterator(graph_.endEdges(source));
│ │ │ │ +
2221 }
│ │ │ │ +
2222
│ │ │ │ +
2223 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2224 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
│ │ │ │ +
2225 inline PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ +
2226 {
│ │ │ │ +
2227 return ConstEdgeIterator(graph_.beginEdges(source), this);
│ │ │ │ +
2228 }
│ │ │ │ +
2229
│ │ │ │ +
2230 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2231 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
│ │ │ │ +
2232 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source) const
│ │ │ │ +
2233 {
│ │ │ │ +
2234 return ConstEdgeIterator(graph_.endEdges(source));
│ │ │ │ +
2235 }
│ │ │ │ +
2236
│ │ │ │ +
2237 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2238 template<class C>
│ │ │ │ +
2239 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
│ │ │ │ +
2240 ::VertexIteratorT(const Father& iter,
│ │ │ │ +
2241 C* graph)
│ │ │ │ +
2242 : Father(iter), graph_(graph)
│ │ │ │ +
2243 {}
│ │ │ │ +
2244
│ │ │ │ +
2245 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2246 template<class C>
│ │ │ │ +
2247 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
│ │ │ │ +
2248 ::VertexIteratorT(const Father& iter)
│ │ │ │ +
2249 : Father(iter)
│ │ │ │ +
2250 {}
│ │ │ │ +
2251
│ │ │ │ +
2252 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2253 template<class C>
│ │ │ │ +
2254 template<class C1>
│ │ │ │ +
2255 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
│ │ │ │ +
2256 ::VertexIteratorT(const VertexIteratorT<C1>& other)
│ │ │ │ +
2257 : Father(other), graph_(other.graph_)
│ │ │ │ +
2258 {}
│ │ │ │ +
2259
│ │ │ │ +
2260 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2261 template<class C>
│ │ │ │ +
2262 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ +
2263 V&, const V&>::type
│ │ │ │ +
2264 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::properties() const
│ │ │ │ +
2265 {
│ │ │ │ +
2266 return graph_->getVertexProperties(Father::operator*());
│ │ │ │ +
2267 }
│ │ │ │ +
2268
│ │ │ │ +
2269 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2270 template<class C>
│ │ │ │ +
2271 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
│ │ │ │ +
2272 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::begin() const
│ │ │ │ +
2273 {
│ │ │ │ +
2274 return graph_->beginEdges(Father::operator*());
│ │ │ │ +
2275 }
│ │ │ │ +
2276
│ │ │ │ +
2277 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2278 template<class C>
│ │ │ │ +
2279 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
│ │ │ │ +
2280 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::end() const
│ │ │ │ +
2281 {
│ │ │ │ +
2282 return graph_->endEdges(Father::operator*());
│ │ │ │ +
2283 }
│ │ │ │ +
2284
│ │ │ │ +
2285 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2286 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::begin()
│ │ │ │ +
2287 {
│ │ │ │ +
2288 return VertexIterator(graph_.begin(), this);
│ │ │ │ +
2289 }
│ │ │ │ +
2290
│ │ │ │ +
2291 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2292 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::end()
│ │ │ │ +
2293 {
│ │ │ │ +
2294 return VertexIterator(graph_.end());
│ │ │ │ +
2295 }
│ │ │ │ +
2296
│ │ │ │ +
2297
│ │ │ │ +
2298 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2299 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::begin() const
│ │ │ │ +
2300 {
│ │ │ │ +
2301 return ConstVertexIterator(graph_.begin(), this);
│ │ │ │ +
2302 }
│ │ │ │ +
2303
│ │ │ │ +
2304 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2305 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::end() const
│ │ │ │ +
2306 {
│ │ │ │ +
2307 return ConstVertexIterator(graph_.end());
│ │ │ │ +
2308 }
│ │ │ │ +
2309
│ │ │ │ +
2310 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2311 inline V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex)
│ │ │ │ +
2312 {
│ │ │ │ +
2313 return vertexProperties_[vmap_[vertex]];
│ │ │ │ +
2314 }
│ │ │ │ +
2315
│ │ │ │ +
2316 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2317 inline const V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex) const
│ │ │ │ +
2318 {
│ │ │ │ +
2319 return vertexProperties_[vmap_[vertex]];
│ │ │ │ +
2320 }
│ │ │ │ +
2321
│ │ │ │ +
2322 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2323 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge)
│ │ │ │ +
2324 {
│ │ │ │ +
2325 return edgeProperties_[emap_[edge]];
│ │ │ │ +
2326 }
│ │ │ │ +
2327
│ │ │ │ +
2328 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2329 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge) const
│ │ │ │ +
2330 {
│ │ │ │ +
2331 return edgeProperties_[emap_[edge]];
│ │ │ │ +
2332 }
│ │ │ │ +
2333
│ │ │ │ +
2334 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2335 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
│ │ │ │ +
2336 const VertexDescriptor& target)
│ │ │ │ +
2337 {
│ │ │ │ +
2338 return getEdgeProperties(graph_.findEdge(source,target));
│ │ │ │ +
2339 }
│ │ │ │ +
2340
│ │ │ │ +
2341 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2342 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
│ │ │ │ +
2343 const VertexDescriptor& target) const
│ │ │ │ +
2344 {
│ │ │ │ +
2345 return getEdgeProperties(graph_.findEdge(source,target));
│ │ │ │ +
2346 }
│ │ │ │ +
2347
│ │ │ │ +
2348 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2349 inline const G& PropertiesGraph<G,V,E,VM,EM>::graph() const
│ │ │ │ +
2350 {
│ │ │ │ +
2351 return graph_;
│ │ │ │ +
2352 }
│ │ │ │ +
2353
│ │ │ │ +
2354 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2355 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noVertices() const
│ │ │ │ +
2356 {
│ │ │ │ +
2357 return graph_.noVertices();
│ │ │ │ +
2358 }
│ │ │ │ +
2359
│ │ │ │ +
2360
│ │ │ │ +
2361 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2362 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexDescriptor PropertiesGraph<G,V,E,VM,EM>::maxVertex() const
│ │ │ │ +
2363 {
│ │ │ │ +
2364 return graph_.maxVertex();
│ │ │ │ +
2365 }
│ │ │ │ +
2366
│ │ │ │ +
2367 template<class G, class V, class E, class VM, class EM>
│ │ │ │ +
2368 PropertiesGraph<G,V,E,VM,EM>::PropertiesGraph(Graph& graph, const VM& vmap, const EM& emap)
│ │ │ │ +
2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V()),
│ │ │ │ +
2370 emap_(emap), edgeProperties_(graph_.noEdges(), E())
│ │ │ │ +
2371 {}
│ │ │ │ +
2372
│ │ │ │ +
2373 template<class G, class V>
│ │ │ │ +
2374 inline int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
│ │ │ │ +
2375 V& visitor)
│ │ │ │ +
2376 {
│ │ │ │ +
2377 typedef typename G::ConstEdgeIterator iterator;
│ │ │ │ +
2378 const iterator end = graph.endEdges(vertex);
│ │ │ │ +
2379 int noNeighbours=0;
│ │ │ │ +
2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge, ++noNeighbours)
│ │ │ │ +
2381 visitor(edge);
│ │ │ │ +
2382 return noNeighbours;
│ │ │ │ +
2383 }
│ │ │ │ +
2384
│ │ │ │ +
2385#endif // DOXYGEN
│ │ │ │ +
2386
│ │ │ │ +
2388 }
│ │ │ │ +
2389}
│ │ │ │ +
2390#endif
│ │ │ │ + │ │ │ │ +
int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
Visit all neighbour vertices of a vertex in a graph.
│ │ │ │
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
Definition indicescoarsener.hh:36
│ │ │ │ -
Definition indicescoarsener.hh:43
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
Definition renumberer.hh:16
│ │ │ │ -
void operator++()
Definition renumberer.hh:57
│ │ │ │ -
void operator()(const typename G::ConstEdgeIterator &edge)
Definition renumberer.hh:51
│ │ │ │ -
Vertex number_
Definition renumberer.hh:35
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ +
MatrixGraph(Matrix &matrix)
Constructor.
│ │ │ │ +
VertexIterator end()
Get an iterator over the vertices.
│ │ │ │ +
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ +
M Matrix
The type of the matrix we are a graph for.
Definition graph.hh:56
│ │ │ │ +
ConstVertexIterator begin() const
Get an iterator over the vertices.
│ │ │ │ +
VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator
The constant vertex iterator type.
Definition graph.hh:308
│ │ │ │ +
~MatrixGraph()
Destructor.
│ │ │ │ +
std::ptrdiff_t EdgeDescriptor
The edge descriptor.
Definition graph.hh:80
│ │ │ │ +
ConstEdgeIterator endEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ +
M::size_type VertexDescriptor
The vertex descriptor.
Definition graph.hh:73
│ │ │ │ +
const Matrix & matrix() const
Get the underlying matrix.
│ │ │ │ +
@ mutableMatrix
Definition graph.hh:86
│ │ │ │ +
ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ +
ConstVertexIterator end() const
Get an iterator over the vertices.
│ │ │ │ +
EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
The constant edge iterator type.
Definition graph.hh:298
│ │ │ │ +
EdgeIterator beginEdges(const VertexDescriptor &source)
Get an iterator over the edges starting at a vertex.
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ +
EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
Find the descriptor of an edge.
│ │ │ │ +
M::block_type Weight
The type of the weights.
Definition graph.hh:66
│ │ │ │ +
std::remove_const< M >::type MutableMatrix
The mutable type of the matrix we are a graph for.
Definition graph.hh:61
│ │ │ │ +
EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator
The mutable edge iterator type.
Definition graph.hh:303
│ │ │ │ +
VertexIteratorT< MatrixGraph< Matrix > > VertexIterator
The mutable vertex iterator type.
Definition graph.hh:313
│ │ │ │ +
EdgeIterator endEdges(const VertexDescriptor &source)
Get an iterator over the edges starting at a vertex.
│ │ │ │ +
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ +
Matrix & matrix()
Get the underlying matrix.
│ │ │ │ +
VertexIterator begin()
Get an iterator over the vertices.
│ │ │ │ +
Iterator over all edges starting from a vertex.
Definition graph.hh:95
│ │ │ │ +
std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::type WeightType
Definition graph.hh:156
│ │ │ │ +
EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const ColIterator &end, const EdgeDescriptor &edge)
Constructor.
│ │ │ │ +
@ isMutable
whether C is mutable.
Definition graph.hh:112
│ │ │ │ +
VertexDescriptor target() const
The index of the target vertex of the current edge.
│ │ │ │ +
EdgeIteratorT< C > & operator++()
preincrement operator.
│ │ │ │ +
bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
Inequality operator.
│ │ │ │ +
bool operator==(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
Equality operator.
│ │ │ │ +
EdgeIteratorT(const EdgeIteratorT< C1 > &other)
Copy Constructor.
│ │ │ │ +
bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
Inequality operator.
│ │ │ │ +
WeightType & weight() const
Access the edge weight.
│ │ │ │ +
VertexDescriptor source() const
The index of the source vertex of the current edge.
│ │ │ │ +
std::conditional< isMutable &&C::mutableMatrix, typenameMatrix::row_type::Iterator, typenameMatrix::row_type::ConstIterator >::type ColIterator
The column iterator of the matrix we use.
Definition graph.hh:120
│ │ │ │ +
const std::remove_const< C >::type ConstContainer
The constant type of the container type.
Definition graph.hh:105
│ │ │ │ +
bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
Equality operator.
│ │ │ │ +
EdgeIteratorT(const ColIterator &block)
Constructor for the end iterator.
│ │ │ │ +
std::conditional< isMutable &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::type Weight
The matrix block type we use as weights.
Definition graph.hh:127
│ │ │ │ +
const EdgeDescriptor & operator*() const
Get the edge descriptor.
│ │ │ │ +
const EdgeDescriptor * operator->() const
Get the edge descriptor.
│ │ │ │ +
std::remove_const< C >::type MutableContainer
The mutable type of the container type.
Definition graph.hh:101
│ │ │ │ +
The vertex iterator type of the graph.
Definition graph.hh:209
│ │ │ │ +
EdgeIteratorT< C > begin() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ +
const VertexDescriptor & operator*() const
Get the descriptor of the current vertex.
│ │ │ │ +
WeightType & weight() const
Access the weight of the vertex.
│ │ │ │ +
VertexIteratorT(C *graph, const VertexDescriptor &current)
Constructor.
│ │ │ │ +
std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::type WeightType
Definition graph.hh:266
│ │ │ │ +
VertexIteratorT(const VertexIteratorT< MutableContainer > &other)
│ │ │ │ +
std::remove_const< C >::type MutableContainer
The mutable type of the container type.
Definition graph.hh:214
│ │ │ │ +
bool operator!=(const VertexIteratorT< MutableContainer > &other) const
Inequality operator.
│ │ │ │ +
@ isMutable
whether C is mutable.
Definition graph.hh:225
│ │ │ │ +
bool operator==(const VertexIteratorT< MutableContainer > &other) const
Equality operator.
│ │ │ │ +
const std::remove_const< C >::type ConstContainer
The constant type of the container type.
Definition graph.hh:218
│ │ │ │ +
VertexIteratorT< C > & operator++()
Move to the next vertex.
│ │ │ │ +
EdgeIteratorT< C > end() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ +
bool operator==(const VertexIteratorT< ConstContainer > &other) const
Equality operator.
│ │ │ │ +
bool operator!=(const VertexIteratorT< ConstContainer > &other) const
Inequality operator.
│ │ │ │ +
VertexIteratorT(const VertexDescriptor &current)
Constructor for the end iterator.
│ │ │ │ +
A subgraph of a graph.
Definition graph.hh:443
│ │ │ │ +
EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
Find the descriptor of an edge.
│ │ │ │ +
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ +
EdgeIndexMap getEdgeIndexMap()
Get an edge index map for the graph.
│ │ │ │ +
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ +
ConstEdgeIterator endEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ +
ConstVertexIterator end() const
Get an iterator over the vertices.
│ │ │ │ +
ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ +
T Excluded
Random access container providing information about which vertices are excluded.
Definition graph.hh:454
│ │ │ │ +
~SubGraph()
Destructor.
│ │ │ │ +
EdgeIterator ConstEdgeIterator
The constant edge iterator type.
Definition graph.hh:618
│ │ │ │ +
G Graph
The type of the graph we are a sub graph for.
Definition graph.hh:448
│ │ │ │ +
VertexIterator ConstVertexIterator
The constant vertex iterator type.
Definition graph.hh:623
│ │ │ │ +
SubGraph(const Graph &graph, const T &excluded)
Constructor.
│ │ │ │ +
ConstVertexIterator begin() const
Get an iterator over the vertices.
│ │ │ │ +
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:459
│ │ │ │ +
VertexDescriptor * EdgeDescriptor
Definition graph.hh:461
│ │ │ │ +
An index map for mapping the edges to indices.
Definition graph.hh:470
│ │ │ │ +
EdgeIndexMap(const EdgeIndexMap &emap)
Protect copy construction.
Definition graph.hh:479
│ │ │ │ +
ReadablePropertyMapTag Category
Definition graph.hh:472
│ │ │ │ +
EdgeIndexMap(const EdgeDescriptor &firstEdge)
Definition graph.hh:474
│ │ │ │ +
std::size_t operator[](const EdgeDescriptor &edge) const
Definition graph.hh:483
│ │ │ │ +
The edge iterator of the graph.
Definition graph.hh:505
│ │ │ │ +
const EdgeDescriptor & dereference() const
The descriptor of the current edge.
│ │ │ │ +
EdgeIterator(const EdgeDescriptor &edge)
Constructor for the end iterator.
│ │ │ │ +
bool equals(const EdgeIterator &other) const
Equality operator.
│ │ │ │ +
EdgeIterator & advance(std::ptrdiff_t n)
│ │ │ │ +
EdgeIterator & increment()
Preincrement operator.
│ │ │ │ +
const VertexDescriptor & target() const
The index of the target vertex of the current edge.
│ │ │ │ +
const VertexDescriptor & source() const
The index of the source vertex of the current edge.
│ │ │ │ +
EdgeIterator & decrement()
Preincrement operator.
│ │ │ │ +
std::ptrdiff_t distanceTo(const EdgeIterator &other) const
│ │ │ │ +
EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge)
Constructor.
│ │ │ │ +
The vertex iterator of the graph.
Definition graph.hh:560
│ │ │ │ +
VertexIterator(const VertexDescriptor &current)
Constructor for end iterator.
│ │ │ │ +
VertexIterator & increment()
Preincrement operator.
│ │ │ │ +
EdgeIterator begin() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ +
bool equals(const VertexIterator &other) const
Equality iterator.
│ │ │ │ +
VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor &current, const VertexDescriptor &end)
Constructor.
│ │ │ │ +
EdgeIterator end() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ +
const VertexDescriptor & dereference() const
Get the descriptor of the current vertex.
│ │ │ │ +
Attaches properties to the vertices of a graph.
Definition graph.hh:723
│ │ │ │ +
const Graph & graph() const
Get the graph the properties are attached to.
│ │ │ │ +
Graph::ConstEdgeIterator ConstEdgeIterator
The type of the constant edge iterator.
Definition graph.hh:766
│ │ │ │ +
VertexProperties & getVertexProperties(const VertexDescriptor &vertex)
Get the properties associated with a vertex.
│ │ │ │ +
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ +
Graph::EdgeDescriptor EdgeDescriptor
The edge descritor.
Definition graph.hh:738
│ │ │ │ +
ConstEdgeIterator endEdges(const VertexDescriptor &source) const
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ +
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:733
│ │ │ │ +
G Graph
The graph we attach properties to.
Definition graph.hh:728
│ │ │ │ +
VM VertexMap
The type of the map for converting the VertexDescriptor to std::size_t.
Definition graph.hh:756
│ │ │ │ +
EdgeIterator endEdges(const VertexDescriptor &source)
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ +
EdgeIterator beginEdges(const VertexDescriptor &source)
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ +
VP VertexProperties
The type of the properties of the vertices.
Definition graph.hh:743
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ +
ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ +
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ +
Graph::EdgeIterator EdgeIterator
The type of the mutable edge iterator.
Definition graph.hh:761
│ │ │ │ + │ │ │ │ +
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type EdgeIterator
The class of the edge iterator.
Definition graph.hh:823
│ │ │ │ +
std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value, VertexProperties &, constVertexProperties & >::type properties() const
Get the properties of the current Vertex.
│ │ │ │ +
EdgeIterator end() const
Get an iterator over the edges starting from the current vertex.
│ │ │ │ +
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::type Father
The father class.
Definition graph.hh:814
│ │ │ │ +
EdgeIterator begin() const
Get an iterator over the edges starting from the current vertex.
│ │ │ │ +
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ +
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ +
Graph::EdgeDescriptor EdgeDescriptor
The edge descritor.
Definition graph.hh:993
│ │ │ │ +
const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target) const
Get the properties associated with a edge.
│ │ │ │ +
const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const
Get the properties associated with a edge.
│ │ │ │ +
const Graph & graph() const
Get the graph the properties are attached to.
│ │ │ │ +
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ +
G Graph
The graph we attach properties to.
Definition graph.hh:983
│ │ │ │ +
EM EdgeMap
The type of the map for converting the EdgeDescriptor to std::size_t.
Definition graph.hh:1030
│ │ │ │ +
VM VertexMap
The type of the map for converting the VertexDescriptor to std::size_t.
Definition graph.hh:1011
│ │ │ │ +
VP VertexProperties
The type of the properties of the vertices.
Definition graph.hh:998
│ │ │ │ +
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ +
EP EdgeProperties
The type of the properties of the edges;.
Definition graph.hh:1016
│ │ │ │ +
EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target)
Get the properties associated with a edge.
│ │ │ │ +
EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge)
Get the properties associated with a edge.
│ │ │ │ +
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:988
│ │ │ │ +
PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap &emap=EdgeMap())
Constructor.
│ │ │ │ + │ │ │ │ +
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type Father
The father class.
Definition graph.hh:1050
│ │ │ │ + │ │ │ │ +
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::type Father
The father class.
Definition graph.hh:1151
│ │ │ │ +
Wrapper to access the internal edge properties of a graph via operator[]()
Definition graph.hh:1361
│ │ │ │ +
GraphVertexPropertiesSelector(G &g)
Constructor.
Definition graph.hh:1380
│ │ │ │ +
VertexProperties & operator[](const Vertex &vertex) const
Get the properties associated to a vertex.
Definition graph.hh:1395
│ │ │ │ +
G Graph
The type of the graph with internal properties.
Definition graph.hh:1366
│ │ │ │ +
G::VertexProperties VertexProperties
The type of the vertex properties.
Definition graph.hh:1370
│ │ │ │ +
GraphVertexPropertiesSelector()
Default constructor.
Definition graph.hh:1386
│ │ │ │ +
G::VertexDescriptor Vertex
The vertex descriptor.
Definition graph.hh:1374
│ │ │ │ +
Wrapper to access the internal vertex properties of a graph via operator[]()
Definition graph.hh:1409
│ │ │ │ +
EdgeProperties & operator[](const Edge &edge) const
Get the properties associated to a vertex.
Definition graph.hh:1442
│ │ │ │ +
G::EdgeProperties EdgeProperties
The type of the vertex properties.
Definition graph.hh:1418
│ │ │ │ +
G::EdgeDescriptor Edge
The edge descriptor.
Definition graph.hh:1422
│ │ │ │ +
GraphEdgePropertiesSelector()
Default constructor.
Definition graph.hh:1434
│ │ │ │ +
G Graph
The type of the graph with internal properties.
Definition graph.hh:1414
│ │ │ │ +
GraphEdgePropertiesSelector(G &g)
Constructor.
Definition graph.hh:1428
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,485 +1,2286 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -indicescoarsener.hh │ │ │ │ │ +graph.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_INDICESCOARSENER_HH │ │ │ │ │ -6#define DUNE_AMG_INDICESCOARSENER_HH │ │ │ │ │ +5#ifndef DUNE_AMG_GRAPH_HH │ │ │ │ │ +6#define DUNE_AMG_GRAPH_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ -11 │ │ │ │ │ -12#if HAVE_MPI │ │ │ │ │ -13#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -14#endif │ │ │ │ │ -15 │ │ │ │ │ -16#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ 18namespace _D_u_n_e │ │ │ │ │ 19{ │ │ │ │ │ 20 namespace Amg │ │ │ │ │ 21 { │ │ │ │ │ -22 │ │ │ │ │ -34 template │ │ │ │ │ -_3_5 class _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ -36 {}; │ │ │ │ │ -37 │ │ │ │ │ -38 │ │ │ │ │ -39#if HAVE_MPI │ │ │ │ │ -40 │ │ │ │ │ -41 template │ │ │ │ │ -_4_2 class _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ -43 { │ │ │ │ │ -44 public: │ │ │ │ │ -_4_8 typedef E _E_x_c_l_u_d_e_d_A_t_t_r_i_b_u_t_e_s; │ │ │ │ │ -49 │ │ │ │ │ -_5_3 typedef T _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -54 │ │ │ │ │ -_5_5 typedef typename ParallelInformation::ParallelIndexSet _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ -56 │ │ │ │ │ -_6_0 typedef typename ParallelIndexSet::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ -61 │ │ │ │ │ -_6_5 typedef typename ParallelIndexSet::LocalIndex _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ -66 │ │ │ │ │ -_7_0 typedef typename LocalIndex::Attribute _A_t_t_r_i_b_u_t_e; │ │ │ │ │ -71 │ │ │ │ │ -_7_5 typedef Dune::RemoteIndices _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ -76 │ │ │ │ │ -88 template │ │ │ │ │ -89 static typename Graph::VertexDescriptor │ │ │ │ │ -_9_0 _c_o_a_r_s_e_n(_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& fineInfo, │ │ │ │ │ -91 Graph& fineGraph, │ │ │ │ │ -92 VM& visitedMap, │ │ │ │ │ -93 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -94 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ -95 typename Graph::VertexDescriptor noAggregates); │ │ │ │ │ +49 template │ │ │ │ │ +_5_0 class _M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +51 { │ │ │ │ │ +52 public: │ │ │ │ │ +_5_6 typedef M _M_a_t_r_i_x; │ │ │ │ │ +57 │ │ │ │ │ +_6_1 typedef typename std::remove_const::type _M_u_t_a_b_l_e_M_a_t_r_i_x; │ │ │ │ │ +62 │ │ │ │ │ +_6_6 typedef typename M::block_type _W_e_i_g_h_t; │ │ │ │ │ +67 │ │ │ │ │ +_7_3 typedef typename M::size_type _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +74 │ │ │ │ │ +_8_0 typedef std::ptrdiff_t _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +81 │ │ │ │ │ +82 enum { │ │ │ │ │ +83 /* │ │ │ │ │ +84 * @brief Whether Matrix is mutable. │ │ │ │ │ +85 */ │ │ │ │ │ +86 _m_u_t_a_b_l_e_M_a_t_r_i_x = std::is_same::type>::value │ │ │ │ │ +_8_7 }; │ │ │ │ │ +88 │ │ │ │ │ +89 │ │ │ │ │ +93 template │ │ │ │ │ +_9_4 class _E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +95 { │ │ │ │ │ 96 │ │ │ │ │ -97 private: │ │ │ │ │ -98 template │ │ │ │ │ -99 class ParallelAggregateRenumberer : public _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ -100 { │ │ │ │ │ -101 typedef typename G::VertexDescriptor Vertex; │ │ │ │ │ -102 │ │ │ │ │ -103 typedef I GlobalLookupIndexSet; │ │ │ │ │ -104 │ │ │ │ │ -105 typedef typename GlobalLookupIndexSet::IndexPair IndexPair; │ │ │ │ │ +97 public: │ │ │ │ │ +_1_0_1 typedef typename std::remove_const::type _M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r; │ │ │ │ │ +_1_0_5 typedef const typename std::remove_const::type _C_o_n_s_t_C_o_n_t_a_i_n_e_r; │ │ │ │ │ 106 │ │ │ │ │ -107 typedef typename IndexPair::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ -108 │ │ │ │ │ -109 public: │ │ │ │ │ -_1_1_0 _P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, const I& │ │ │ │ │ -lookup) │ │ │ │ │ -111 : _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(aggregates), isPublic_(false), lookup_(lookup), │ │ │ │ │ -112 globalIndex_(_s_t_d::numeric_limits::max()) │ │ │ │ │ -113 {} │ │ │ │ │ +107 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ +108 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T<_C_o_n_s_t_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ +109 │ │ │ │ │ +110 enum { │ │ │ │ │ +112 _i_s_M_u_t_a_b_l_e = std::is_same::value │ │ │ │ │ +_1_1_3 }; │ │ │ │ │ 114 │ │ │ │ │ -115 │ │ │ │ │ -_1_1_6 void _o_p_e_r_a_t_o_r_(_)(const typename G::ConstEdgeIterator& edge) │ │ │ │ │ -117 { │ │ │ │ │ -118 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r_(_)(edge); │ │ │ │ │ -119 const IndexPair* pair= lookup_.pair(edge.target()); │ │ │ │ │ -120 if(pair!=0) { │ │ │ │ │ -121 _g_l_o_b_a_l_I_n_d_e_x(pair->global()); │ │ │ │ │ -122 _a_t_t_r_i_b_u_t_e(pair->local().attribute()); │ │ │ │ │ -123 _i_s_P_u_b_l_i_c(pair->local().isPublic()); │ │ │ │ │ -124 } │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -_1_2_7 Vertex _o_p_e_r_a_t_o_r_(_)([[maybe_unused]] const GlobalIndex& global) │ │ │ │ │ -128 { │ │ │ │ │ -129 Vertex current = this->_n_u_m_b_e_r__; │ │ │ │ │ -130 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -131 return current; │ │ │ │ │ -132 } │ │ │ │ │ -133 │ │ │ │ │ -_1_3_4 bool _i_s_P_u_b_l_i_c() │ │ │ │ │ -135 { │ │ │ │ │ -136 return isPublic_; │ │ │ │ │ -137 } │ │ │ │ │ +118 typedef typename std::conditional<_i_s_M_u_t_a_b_l_e && C::mutableMatrix,typename │ │ │ │ │ +Matrix::row_type::Iterator, │ │ │ │ │ +119 typename Matrix::row_type::ConstIterator>::type │ │ │ │ │ +_1_2_0 _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +121 │ │ │ │ │ +125 typedef typename std::conditional<_i_s_M_u_t_a_b_l_e && C::mutableMatrix,typename │ │ │ │ │ +M::block_type, │ │ │ │ │ +126 const typename M::block_type>::type │ │ │ │ │ +_1_2_7 _W_e_i_g_h_t; │ │ │ │ │ +128 │ │ │ │ │ +_1_3_6 _E_d_g_e_I_t_e_r_a_t_o_r_T(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _s_o_u_r_c_e, const _C_o_l_I_t_e_r_a_t_o_r& block, │ │ │ │ │ +137 const _C_o_l_I_t_e_r_a_t_o_r& _e_n_d, const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge); │ │ │ │ │ 138 │ │ │ │ │ -_1_3_9 void _i_s_P_u_b_l_i_c(bool b) │ │ │ │ │ -140 { │ │ │ │ │ -141 isPublic_ = isPublic_ || b; │ │ │ │ │ -142 } │ │ │ │ │ -143 │ │ │ │ │ -_1_4_4 void _r_e_s_e_t() │ │ │ │ │ -145 { │ │ │ │ │ -146 globalIndex_ = std::numeric_limits::max(); │ │ │ │ │ -147 isPublic_=false; │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -_1_5_0 void _a_t_t_r_i_b_u_t_e(const _A_t_t_r_i_b_u_t_e& _a_t_t_r_i_b_u_t_e) │ │ │ │ │ -151 { │ │ │ │ │ -152 attribute_=_a_t_t_r_i_b_u_t_e; │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -_1_5_5 _A_t_t_r_i_b_u_t_e _a_t_t_r_i_b_u_t_e() │ │ │ │ │ -156 { │ │ │ │ │ -157 return attribute_; │ │ │ │ │ -158 } │ │ │ │ │ -159 │ │ │ │ │ -_1_6_0 const GlobalIndex& _g_l_o_b_a_l_I_n_d_e_x() const │ │ │ │ │ -161 { │ │ │ │ │ -162 return globalIndex_; │ │ │ │ │ -163 } │ │ │ │ │ -164 │ │ │ │ │ -_1_6_5 void _g_l_o_b_a_l_I_n_d_e_x(const GlobalIndex& global) │ │ │ │ │ -166 { │ │ │ │ │ -167 globalIndex_ = global; │ │ │ │ │ -168 } │ │ │ │ │ -169 │ │ │ │ │ -170 private: │ │ │ │ │ -171 bool isPublic_; │ │ │ │ │ -172 _A_t_t_r_i_b_u_t_e attribute_; │ │ │ │ │ -173 const GlobalLookupIndexSet& lookup_; │ │ │ │ │ -174 _G_l_o_b_a_l_I_n_d_e_x globalIndex_; │ │ │ │ │ -175 }; │ │ │ │ │ -176 │ │ │ │ │ -177 template │ │ │ │ │ -178 static void buildCoarseIndexSet(const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -179 Graph& fineGraph, │ │ │ │ │ -180 VM& visitedMap, │ │ │ │ │ -181 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -182 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& coarseIndices, │ │ │ │ │ -183 ParallelAggregateRenumberer& renumberer); │ │ │ │ │ -184 │ │ │ │ │ -185 template │ │ │ │ │ -186 static void buildCoarseRemoteIndices(const _R_e_m_o_t_e_I_n_d_i_c_e_s& fineRemote, │ │ │ │ │ -187 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -188 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& coarseIndices, │ │ │ │ │ -189 _R_e_m_o_t_e_I_n_d_i_c_e_s& coarseRemote, │ │ │ │ │ -190 ParallelAggregateRenumberer& renumberer); │ │ │ │ │ -191 │ │ │ │ │ -192 }; │ │ │ │ │ -193 │ │ │ │ │ -197 template │ │ │ │ │ -_1_9_8 class _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n,E> │ │ │ │ │ -199 : public _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r,E> │ │ │ │ │ -200 {}; │ │ │ │ │ -201 │ │ │ │ │ -202 │ │ │ │ │ -203#endif │ │ │ │ │ -204 │ │ │ │ │ -211 template │ │ │ │ │ -_2_1_2 class _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n,E> │ │ │ │ │ -213 { │ │ │ │ │ -214 public: │ │ │ │ │ -215 template │ │ │ │ │ -216 static typename Graph::VertexDescriptor │ │ │ │ │ -217 coarsen(const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n & fineInfo, │ │ │ │ │ -218 Graph& fineGraph, │ │ │ │ │ -219 VM& visitedMap, │ │ │ │ │ -220 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -221 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ -222 typename Graph::VertexDescriptor noAggregates); │ │ │ │ │ -223 }; │ │ │ │ │ -224 │ │ │ │ │ -225#if HAVE_MPI │ │ │ │ │ -226 template │ │ │ │ │ -227 template │ │ │ │ │ -228 inline typename Graph::VertexDescriptor │ │ │ │ │ -_2_2_9 _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_T_,_E_>_:_:_c_o_a_r_s_e_n(_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& fineInfo, │ │ │ │ │ -230 Graph& fineGraph, │ │ │ │ │ -231 VM& visitedMap, │ │ │ │ │ -232 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -233 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ -234 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates) │ │ │ │ │ -235 { │ │ │ │ │ -236 ParallelAggregateRenumberer renumberer(aggregates, fineInfo.globalLookup()); │ │ │ │ │ -237 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates, │ │ │ │ │ -238 coarseInfo.indexSet(), renumberer); │ │ │ │ │ -239 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, │ │ │ │ │ -coarseInfo.indexSet(), │ │ │ │ │ -240 coarseInfo.remoteIndices(), renumberer); │ │ │ │ │ -241 │ │ │ │ │ -242 return renumberer; │ │ │ │ │ -243 } │ │ │ │ │ -244 │ │ │ │ │ -245 template │ │ │ │ │ -246 template │ │ │ │ │ -247 void _P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_T_,_E_>_:_:_b_u_i_l_d_C_o_a_r_s_e_I_n_d_e_x_S_e_t(const │ │ │ │ │ -ParallelInformation& pinfo, │ │ │ │ │ -248 Graph& fineGraph, │ │ │ │ │ -249 VM& visitedMap, │ │ │ │ │ -250 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -251 ParallelIndexSet& coarseIndices, │ │ │ │ │ -252 ParallelAggregateRenumberer& renumberer) │ │ │ │ │ -253 { │ │ │ │ │ -254 // fineGraph is the local subgraph corresponding to the vertices the │ │ │ │ │ -process owns. │ │ │ │ │ -255 // i.e. no overlap/copy vertices can be visited traversing the graph │ │ │ │ │ -256 typedef typename Graph::ConstVertexIterator Iterator; │ │ │ │ │ -257 typedef typename ParallelInformation::GlobalLookupIndexSet │ │ │ │ │ -GlobalLookupIndexSet; │ │ │ │ │ -258 │ │ │ │ │ -259 Iterator end = fineGraph.end(); │ │ │ │ │ -260 const GlobalLookupIndexSet& lookup = pinfo.globalLookup(); │ │ │ │ │ -261 │ │ │ │ │ -262 coarseIndices.beginResize(); │ │ │ │ │ +_1_4_5 _E_d_g_e_I_t_e_r_a_t_o_r_T(const _C_o_l_I_t_e_r_a_t_o_r& block); │ │ │ │ │ +146 │ │ │ │ │ +151 template │ │ │ │ │ +_1_5_2 _E_d_g_e_I_t_e_r_a_t_o_r_T(const _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_1_>& other); │ │ │ │ │ +153 │ │ │ │ │ +154 typedef typename std::conditional::type>::value && C::mutableMatrix, │ │ │ │ │ +155 typename M::block_type, const typename M::block_type>::type │ │ │ │ │ +_1_5_6 _W_e_i_g_h_t_T_y_p_e; │ │ │ │ │ +157 │ │ │ │ │ +_1_6_1 _W_e_i_g_h_t_T_y_p_e& _w_e_i_g_h_t() const; │ │ │ │ │ +162 │ │ │ │ │ +_1_6_4 _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_>& _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +165 │ │ │ │ │ +_1_6_7 bool _o_p_e_r_a_t_o_r_!_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T::type>& │ │ │ │ │ +other) const; │ │ │ │ │ +168 │ │ │ │ │ +_1_7_0 bool _o_p_e_r_a_t_o_r_!_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T:: │ │ │ │ │ +type>& other) const; │ │ │ │ │ +171 │ │ │ │ │ +_1_7_3 bool _o_p_e_r_a_t_o_r_=_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T::type>& │ │ │ │ │ +other) const; │ │ │ │ │ +174 │ │ │ │ │ +_1_7_6 bool _o_p_e_r_a_t_o_r_=_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T:: │ │ │ │ │ +type>& other) const; │ │ │ │ │ +177 │ │ │ │ │ +_1_7_9 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _t_a_r_g_e_t() const; │ │ │ │ │ +180 │ │ │ │ │ +_1_8_2 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _s_o_u_r_c_e() const; │ │ │ │ │ +183 │ │ │ │ │ +_1_8_5 const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& _o_p_e_r_a_t_o_r_*() const; │ │ │ │ │ +186 │ │ │ │ │ +_1_8_8 const _E_d_g_e_D_e_s_c_r_i_p_t_o_r* _o_p_e_r_a_t_o_r_-_>() const; │ │ │ │ │ +189 │ │ │ │ │ +190 private: │ │ │ │ │ +192 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r source_; │ │ │ │ │ +194 _C_o_l_I_t_e_r_a_t_o_r block_; │ │ │ │ │ +195 /*** │ │ │ │ │ +196 * @brief The column iterator positioned at the end of the row │ │ │ │ │ +197 * of vertex source_ │ │ │ │ │ +198 */ │ │ │ │ │ +199 _C_o_l_I_t_e_r_a_t_o_r blockEnd_; │ │ │ │ │ +201 _E_d_g_e_D_e_s_c_r_i_p_t_o_r edge_; │ │ │ │ │ +202 }; │ │ │ │ │ +203 │ │ │ │ │ +207 template │ │ │ │ │ +_2_0_8 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +209 { │ │ │ │ │ +210 public: │ │ │ │ │ +_2_1_4 typedef typename std::remove_const::type _M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r; │ │ │ │ │ +_2_1_8 typedef const typename std::remove_const::type _C_o_n_s_t_C_o_n_t_a_i_n_e_r; │ │ │ │ │ +219 │ │ │ │ │ +220 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ +221 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T<_C_o_n_s_t_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ +222 │ │ │ │ │ +223 enum { │ │ │ │ │ +225 _i_s_M_u_t_a_b_l_e = std::is_same::value │ │ │ │ │ +_2_2_6 }; │ │ │ │ │ +227 │ │ │ │ │ +_2_3_3 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(C* graph, const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& current); │ │ │ │ │ +234 │ │ │ │ │ +_2_4_2 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& current); │ │ │ │ │ +243 │ │ │ │ │ +_2_4_4 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r_>& other); │ │ │ │ │ +245 │ │ │ │ │ +_2_5_0 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_C_>& _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +251 │ │ │ │ │ +_2_5_3 bool _o_p_e_r_a_t_o_r_!_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_C_o_n_s_t_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ +254 │ │ │ │ │ +_2_5_6 bool _o_p_e_r_a_t_o_r_=_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_C_o_n_s_t_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ +257 │ │ │ │ │ +_2_5_9 bool _o_p_e_r_a_t_o_r_!_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ +260 │ │ │ │ │ +_2_6_2 bool _o_p_e_r_a_t_o_r_=_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ 263 │ │ │ │ │ -264 // Setup the coarse index set and renumber the aggregate consecutively │ │ │ │ │ -265 // ascending from zero according to the minimum global index belonging │ │ │ │ │ -266 // to the aggregate │ │ │ │ │ -267 for(Iterator index = fineGraph.begin(); index != end; ++index) { │ │ │ │ │ -268 if(aggregates[*index]!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_: │ │ │ │ │ -_I_S_O_L_A_T_E_D) │ │ │ │ │ -269 // Isolated vertices will not be represented on the next level. │ │ │ │ │ -270 // These should only be there if skipIsolated is activiated in │ │ │ │ │ -271 // the coarsening criterion as otherwise they will be aggregated │ │ │ │ │ -272 // and should have real aggregate number in the map right now. │ │ │ │ │ -273 if(!_g_e_t(visitedMap, *index)) { │ │ │ │ │ -274 // This vertex was not visited by breadthFirstSearch yet. │ │ │ │ │ -275 typedef typename GlobalLookupIndexSet::IndexPair IndexPair; │ │ │ │ │ -276 const IndexPair* pair= lookup.pair(*index); │ │ │ │ │ -277 │ │ │ │ │ -278 renumberer.reset(); // reset attribute and global index. │ │ │ │ │ -279 if(pair!=0) { │ │ │ │ │ -280 // vertex is in the index set. Note that not all vertices have │ │ │ │ │ -281 // to be in the index set, just the ones where communication │ │ │ │ │ -282 // will happen. │ │ │ │ │ -283 assert(!ExcludedAttributes::contains(pair->local().attribute())); │ │ │ │ │ -284 renumberer.attribute(pair->local().attribute()); │ │ │ │ │ -285 renumberer.isPublic(pair->local().isPublic()); │ │ │ │ │ -286 renumberer.globalIndex(pair->global()); │ │ │ │ │ -287 } │ │ │ │ │ -288 │ │ │ │ │ -289 // Reconstruct aggregate and mark vertices as visited │ │ │ │ │ -290 aggregates.template breadthFirstSearch(*index, aggregates[*index], │ │ │ │ │ -291 fineGraph, renumberer, visitedMap); │ │ │ │ │ -292 │ │ │ │ │ -293 if(renumberer.globalIndex()!=std::numeric_limits::max()) { │ │ │ │ │ -294 // vertex is in the index set. │ │ │ │ │ -295 //std::cout <<" Adding global="<< renumberer.globalIndex()<<" │ │ │ │ │ -local="<(renumberer)<(renumberer) >= coarseIndices.size()); │ │ │ │ │ +264 typedef typename std::conditional::type>::value && C::mutableMatrix, │ │ │ │ │ +265 typename M::block_type, const typename M::block_type>::type │ │ │ │ │ +_2_6_6 _W_e_i_g_h_t_T_y_p_e; │ │ │ │ │ +_2_6_8 _W_e_i_g_h_t_T_y_p_e& _w_e_i_g_h_t() const; │ │ │ │ │ +269 │ │ │ │ │ +_2_7_4 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _o_p_e_r_a_t_o_r_*() const; │ │ │ │ │ +275 │ │ │ │ │ +_2_8_1 _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_> _b_e_g_i_n() const; │ │ │ │ │ +282 │ │ │ │ │ +_2_8_8 _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_> _e_n_d() const; │ │ │ │ │ +289 │ │ │ │ │ +290 private: │ │ │ │ │ +291 C* graph_; │ │ │ │ │ +292 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r current_; │ │ │ │ │ +293 }; │ │ │ │ │ +294 │ │ │ │ │ +_2_9_8 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T_<_c_o_n_s_t_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +299 │ │ │ │ │ +_3_0_3 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T_<_M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +304 │ │ │ │ │ +_3_0_8 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_c_o_n_s_t_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ 309 │ │ │ │ │ -310 // Reset the visited flags │ │ │ │ │ -311 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex) │ │ │ │ │ -312 put(visitedMap, *vertex, false); │ │ │ │ │ -313 } │ │ │ │ │ +_3_1_3 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ 314 │ │ │ │ │ -315 template │ │ │ │ │ -316 template │ │ │ │ │ -317 void ParallelIndicesCoarsener::buildCoarseRemoteIndices(const │ │ │ │ │ -RemoteIndices& fineRemote, │ │ │ │ │ -318 const AggregatesMap& aggregates, │ │ │ │ │ -319 ParallelIndexSet& coarseIndices, │ │ │ │ │ -320 RemoteIndices& coarseRemote, │ │ │ │ │ -321 ParallelAggregateRenumberer& renumberer) │ │ │ │ │ -322 { │ │ │ │ │ -323 std::vector attributes(static_cast(renumberer)); │ │ │ │ │ -324 │ │ │ │ │ -325 GlobalLookupIndexSet coarseLookup(coarseIndices, │ │ │ │ │ -static_cast(renumberer)); │ │ │ │ │ -326 │ │ │ │ │ -327 typedef typename RemoteIndices::const_iterator Iterator; │ │ │ │ │ -328 Iterator end = fineRemote.end(); │ │ │ │ │ -329 │ │ │ │ │ -330 for(Iterator neighbour = fineRemote.begin(); │ │ │ │ │ -331 neighbour != end; ++neighbour) { │ │ │ │ │ -332 int process = neighbour->first; │ │ │ │ │ -333 │ │ │ │ │ -334 assert(neighbour->second.first==neighbour->second.second); │ │ │ │ │ -335 │ │ │ │ │ -336 // Mark all as not known │ │ │ │ │ -337 typedef typename std::vector::iterator CIterator; │ │ │ │ │ -338 │ │ │ │ │ -339 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter) │ │ │ │ │ -340 *iter = std::numeric_limits::max(); │ │ │ │ │ -341 │ │ │ │ │ -342 auto riEnd = neighbour->second.second->end(); │ │ │ │ │ +_3_1_9 _M_a_t_r_i_x_G_r_a_p_h(_M_a_t_r_i_x& _m_a_t_r_i_x); │ │ │ │ │ +320 │ │ │ │ │ +_3_2_4 _~_M_a_t_r_i_x_G_r_a_p_h(); │ │ │ │ │ +325 │ │ │ │ │ +_3_3_0 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ +331 │ │ │ │ │ +_3_3_6 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ +337 │ │ │ │ │ +_3_4_2 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ 343 │ │ │ │ │ -344 for(auto index = neighbour->second.second->begin(); │ │ │ │ │ -345 index != riEnd; ++index) { │ │ │ │ │ -346 if(!E::contains(index->localIndexPair().local().attribute()) && │ │ │ │ │ -347 aggregates[index->localIndexPair().local()] != │ │ │ │ │ -348 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ -349 { │ │ │ │ │ -350 assert(aggregates[index->localIndexPair().local()]localIndexPair().local()]] != 3) │ │ │ │ │ -352 attributes[aggregates[index->localIndexPair().local()]] = index->attribute │ │ │ │ │ -(); │ │ │ │ │ -353 } │ │ │ │ │ -354 } │ │ │ │ │ -355 │ │ │ │ │ -356 // Build remote index list │ │ │ │ │ -357 typedef RemoteIndexListModifier Modifier; │ │ │ │ │ -358 typedef typename RemoteIndices::RemoteIndex RemoteIndex; │ │ │ │ │ -359 typedef typename ParallelIndexSet::const_iterator IndexIterator; │ │ │ │ │ -360 │ │ │ │ │ -361 Modifier coarseList = coarseRemote.template getModifier │ │ │ │ │ -(process); │ │ │ │ │ -362 │ │ │ │ │ -363 IndexIterator iend = coarseIndices.end(); │ │ │ │ │ -364 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index) │ │ │ │ │ -365 if(attributes[index->local()] != std::numeric_limits::max()) { │ │ │ │ │ -366 // remote index is present │ │ │ │ │ -367 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), & │ │ │ │ │ -(*index))); │ │ │ │ │ -368 } │ │ │ │ │ -369 //std::cout< syncer(coarseIndices, coarseRemote); │ │ │ │ │ -378 syncer.sync(renumberer); │ │ │ │ │ -379 │ │ │ │ │ -380 } │ │ │ │ │ -381 │ │ │ │ │ -382#endif │ │ │ │ │ -383 │ │ │ │ │ -384 template │ │ │ │ │ -385 template │ │ │ │ │ -386 typename Graph::VertexDescriptor │ │ │ │ │ -_3_8_7 _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_,_E_>_:_:_c_o_a_r_s_e_n( │ │ │ │ │ -388 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& fineInfo, │ │ │ │ │ -389 [[maybe_unused]] Graph& fineGraph, │ │ │ │ │ -390 [[maybe_unused]] VM& visitedMap, │ │ │ │ │ -391 [[maybe_unused]] _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& │ │ │ │ │ -aggregates, │ │ │ │ │ -392 [[maybe_unused]] _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& coarseInfo, │ │ │ │ │ -393 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates) │ │ │ │ │ -394 { │ │ │ │ │ -395 return noAggregates; │ │ │ │ │ -396 } │ │ │ │ │ -397 │ │ │ │ │ -398 } //namespace Amg │ │ │ │ │ -399} // namespace Dune │ │ │ │ │ -400#endif │ │ │ │ │ -_r_e_n_u_m_b_e_r_e_r_._h_h │ │ │ │ │ -_p_i_n_f_o_._h_h │ │ │ │ │ -_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_r_e_s_e_t │ │ │ │ │ -void reset() │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_A_t_t_r_i_b_u_t_e │ │ │ │ │ -LocalIndex::Attribute Attribute │ │ │ │ │ -The type of the attribute. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename G::ConstEdgeIterator &edge) │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_i_s_P_u_b_l_i_c │ │ │ │ │ -void isPublic(bool b) │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:139 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -ParallelInformation::ParallelIndexSet ParallelIndexSet │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_i_s_P_u_b_l_i_c │ │ │ │ │ -bool isPublic() │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ -ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ -The type of the local index. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -T ParallelInformation │ │ │ │ │ -The type of the parallel information. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ -Attribute attribute() │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Vertex operator()(const GlobalIndex &global) │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_c_o_a_r_s_e_n │ │ │ │ │ -static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph │ │ │ │ │ -&fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > │ │ │ │ │ -&aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor │ │ │ │ │ -noAggregates) │ │ │ │ │ -Build the coarse index set after the aggregatio. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ -static const V ISOLATED │ │ │ │ │ -Identifier of isolated vertices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:571 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ -The type of the global index. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_a_t_t_r_i_b_u_t_e │ │ │ │ │ -void attribute(const Attribute &attribute) │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_E_x_c_l_u_d_e_d_A_t_t_r_i_b_u_t_e_s │ │ │ │ │ -E ExcludedAttributes │ │ │ │ │ -The set of excluded attributes. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_g_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -void globalIndex(const GlobalIndex &global) │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -Dune::RemoteIndices< ParallelIndexSet > RemoteIndices │ │ │ │ │ -The type of the remote indices. │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_: │ │ │ │ │ -_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ -ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I │ │ │ │ │ -&lookup) │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_:_:_P_a_r_a_l_l_e_l_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_g_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -const GlobalIndex & globalIndex() const │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:160 │ │ │ │ │ +_3_8_1 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ +382 │ │ │ │ │ +_3_8_7 _M_a_t_r_i_x& _m_a_t_r_i_x(); │ │ │ │ │ +388 │ │ │ │ │ +_3_9_3 const _M_a_t_r_i_x& _m_a_t_r_i_x() const; │ │ │ │ │ +394 │ │ │ │ │ +_3_9_8 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ +399 │ │ │ │ │ +_4_0_6 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ +407 │ │ │ │ │ +_4_1_1 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ +412 │ │ │ │ │ +_4_1_9 _E_d_g_e_D_e_s_c_r_i_p_t_o_r _f_i_n_d_E_d_g_e(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ +420 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target) const; │ │ │ │ │ +421 │ │ │ │ │ +422 private: │ │ │ │ │ +424 _M_a_t_r_i_x& matrix_; │ │ │ │ │ +426 _E_d_g_e_D_e_s_c_r_i_p_t_o_r* start_; │ │ │ │ │ +428 _M_a_t_r_i_x_G_r_a_p_h(const _M_a_t_r_i_x_G_r_a_p_h&); │ │ │ │ │ +429 │ │ │ │ │ +430 }; │ │ │ │ │ +431 │ │ │ │ │ +441 template │ │ │ │ │ +_4_4_2 class _S_u_b_G_r_a_p_h │ │ │ │ │ +443 { │ │ │ │ │ +444 public: │ │ │ │ │ +_4_4_8 typedef G _G_r_a_p_h; │ │ │ │ │ +449 │ │ │ │ │ +_4_5_4 typedef T _E_x_c_l_u_d_e_d; │ │ │ │ │ +455 │ │ │ │ │ +_4_5_9 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +460 │ │ │ │ │ +_4_6_1 typedef _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r* _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +462 │ │ │ │ │ +_4_6_9 class _E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +470 { │ │ │ │ │ +471 public: │ │ │ │ │ +_4_7_2 typedef ReadablePropertyMapTag _C_a_t_e_g_o_r_y; │ │ │ │ │ +473 │ │ │ │ │ +_4_7_4 _E_d_g_e_I_n_d_e_x_M_a_p(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& firstEdge) │ │ │ │ │ +475 : firstEdge_(firstEdge) │ │ │ │ │ +476 {} │ │ │ │ │ +477 │ │ │ │ │ +_4_7_9 _E_d_g_e_I_n_d_e_x_M_a_p(const _E_d_g_e_I_n_d_e_x_M_a_p& emap) │ │ │ │ │ +480 : firstEdge_(emap.firstEdge_) │ │ │ │ │ +481 {} │ │ │ │ │ +482 │ │ │ │ │ +_4_8_3 std::size_t _o_p_e_r_a_t_o_r_[_](const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge) const │ │ │ │ │ +484 { │ │ │ │ │ +485 return edge-firstEdge_; │ │ │ │ │ +486 } │ │ │ │ │ +487 private: │ │ │ │ │ +489 _E_d_g_e_D_e_s_c_r_i_p_t_o_r firstEdge_; │ │ │ │ │ +491 _E_d_g_e_I_n_d_e_x_M_a_p() │ │ │ │ │ +492 {} │ │ │ │ │ +493 }; │ │ │ │ │ +494 │ │ │ │ │ +_4_9_9 _E_d_g_e_I_n_d_e_x_M_a_p _g_e_t_E_d_g_e_I_n_d_e_x_M_a_p(); │ │ │ │ │ +500 │ │ │ │ │ +_5_0_4 class _E_d_g_e_I_t_e_r_a_t_o_r : public RandomAccessIteratorFacade │ │ │ │ │ +505 { │ │ │ │ │ +506 public: │ │ │ │ │ +_5_1_2 explicit _E_d_g_e_I_t_e_r_a_t_o_r(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _s_o_u_r_c_e, const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ +edge); │ │ │ │ │ +513 │ │ │ │ │ +_5_2_1 explicit _E_d_g_e_I_t_e_r_a_t_o_r(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge); │ │ │ │ │ +522 │ │ │ │ │ +_5_2_4 bool _e_q_u_a_l_s(const _E_d_g_e_I_t_e_r_a_t_o_r& other) const; │ │ │ │ │ +525 │ │ │ │ │ +_5_2_7 _E_d_g_e_I_t_e_r_a_t_o_r& _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +528 │ │ │ │ │ +_5_3_0 _E_d_g_e_I_t_e_r_a_t_o_r& _d_e_c_r_e_m_e_n_t(); │ │ │ │ │ +531 │ │ │ │ │ +_5_3_2 _E_d_g_e_I_t_e_r_a_t_o_r& _a_d_v_a_n_c_e(std::ptrdiff_t n); │ │ │ │ │ +533 │ │ │ │ │ +_5_3_5 const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& _d_e_r_e_f_e_r_e_n_c_e() const; │ │ │ │ │ +536 │ │ │ │ │ +_5_3_8 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _t_a_r_g_e_t() const; │ │ │ │ │ +539 │ │ │ │ │ +_5_4_1 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _s_o_u_r_c_e() const; │ │ │ │ │ +542 │ │ │ │ │ +_5_4_3 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _E_d_g_e_I_t_e_r_a_t_o_r& other) const; │ │ │ │ │ +544 │ │ │ │ │ +545 private: │ │ │ │ │ +547 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r source_; │ │ │ │ │ +552 _E_d_g_e_D_e_s_c_r_i_p_t_o_r edge_; │ │ │ │ │ +553 }; │ │ │ │ │ +554 │ │ │ │ │ +_5_5_8 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +559 : public ForwardIteratorFacade │ │ │ │ │ +560 { │ │ │ │ │ +561 public: │ │ │ │ │ +_5_6_8 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r(const _S_u_b_G_r_a_p_h_<_G_,_T_>* graph, const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ +current, │ │ │ │ │ +569 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _e_n_d); │ │ │ │ │ +570 │ │ │ │ │ +571 │ │ │ │ │ +_5_7_8 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& current); │ │ │ │ │ +579 │ │ │ │ │ +_5_8_1 _V_e_r_t_e_x_I_t_e_r_a_t_o_r& _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +582 │ │ │ │ │ +_5_8_4 bool _e_q_u_a_l_s(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r& other) const; │ │ │ │ │ +585 │ │ │ │ │ +_5_9_0 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _d_e_r_e_f_e_r_e_n_c_e() const; │ │ │ │ │ +591 │ │ │ │ │ +_5_9_7 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +598 │ │ │ │ │ +_6_0_4 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +605 │ │ │ │ │ +606 private: │ │ │ │ │ +608 const _S_u_b_G_r_a_p_h_<_G_r_a_p_h_,_T_>* graph_; │ │ │ │ │ +610 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r current_; │ │ │ │ │ +612 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r end_; │ │ │ │ │ +613 }; │ │ │ │ │ +614 │ │ │ │ │ +_6_1_8 typedef _E_d_g_e_I_t_e_r_a_t_o_r _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +619 │ │ │ │ │ +_6_2_3 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +624 │ │ │ │ │ +_6_2_9 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +630 │ │ │ │ │ +_6_3_5 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +636 │ │ │ │ │ +_6_4_3 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ +644 │ │ │ │ │ +_6_5_1 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ +652 │ │ │ │ │ +_6_5_6 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ +657 │ │ │ │ │ +_6_6_4 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ +665 │ │ │ │ │ +_6_6_9 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ +_6_7_6 _E_d_g_e_D_e_s_c_r_i_p_t_o_r _f_i_n_d_E_d_g_e(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ +677 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target) const; │ │ │ │ │ +_6_8_5 _S_u_b_G_r_a_p_h(const _G_r_a_p_h& graph, const T& excluded); │ │ │ │ │ +686 │ │ │ │ │ +_6_9_0 _~_S_u_b_G_r_a_p_h(); │ │ │ │ │ +691 │ │ │ │ │ +692 private: │ │ │ │ │ +694 const T& excluded_; │ │ │ │ │ +696 std::size_t noVertices_; │ │ │ │ │ +698 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r endVertex_; │ │ │ │ │ +700 int noEdges_; │ │ │ │ │ +705 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r maxVertex_; │ │ │ │ │ +707 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r* edges_; │ │ │ │ │ +709 std::ptrdiff_t* start_; │ │ │ │ │ +711 std::ptrdiff_t* end_; │ │ │ │ │ +713 _S_u_b_G_r_a_p_h(const _S_u_b_G_r_a_p_h&) │ │ │ │ │ +714 {} │ │ │ │ │ +715 }; │ │ │ │ │ +716 │ │ │ │ │ +717 │ │ │ │ │ +721 template │ │ │ │ │ +_7_2_2 class _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +723 { │ │ │ │ │ +724 public: │ │ │ │ │ +_7_2_8 typedef G _G_r_a_p_h; │ │ │ │ │ +729 │ │ │ │ │ +_7_3_3 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +734 │ │ │ │ │ +_7_3_8 typedef typename Graph::EdgeDescriptor _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +739 │ │ │ │ │ +_7_4_3 typedef VP _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ +744 │ │ │ │ │ +_7_5_6 typedef VM _V_e_r_t_e_x_M_a_p; │ │ │ │ │ +757 │ │ │ │ │ +_7_6_1 typedef typename Graph::EdgeIterator _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +762 │ │ │ │ │ +_7_6_6 typedef typename Graph::ConstEdgeIterator _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +767 │ │ │ │ │ +_7_7_3 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source); │ │ │ │ │ +774 │ │ │ │ │ +_7_8_0 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source); │ │ │ │ │ +781 │ │ │ │ │ +_7_8_7 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ +788 │ │ │ │ │ +_7_9_4 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ +795 │ │ │ │ │ +796 │ │ │ │ │ +797 template │ │ │ │ │ +_7_9_8 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +799 : public std::conditional::type, │ │ │ │ │ +800 C>::value, │ │ │ │ │ +801 typename Graph::VertexIterator, │ │ │ │ │ +802 typename Graph::ConstVertexIterator>::type │ │ │ │ │ +803 { │ │ │ │ │ +804 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ +805 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ +806 public: │ │ │ │ │ +810 typedef typename std::conditional::type, │ │ │ │ │ +811 C>::value, │ │ │ │ │ +812 typename Graph::VertexIterator, │ │ │ │ │ +813 typename Graph::ConstVertexIterator>::type │ │ │ │ │ +_8_1_4 _F_a_t_h_e_r; │ │ │ │ │ +815 │ │ │ │ │ +819 typedef typename std::conditional::type, │ │ │ │ │ +820 C>::value, │ │ │ │ │ +821 typename Graph::EdgeIterator, │ │ │ │ │ +822 typename Graph::ConstEdgeIterator>::type │ │ │ │ │ +_8_2_3 _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +824 │ │ │ │ │ +_8_3_0 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter, │ │ │ │ │ +831 C* graph); │ │ │ │ │ +832 │ │ │ │ │ +833 │ │ │ │ │ +_8_4_1 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter); │ │ │ │ │ +842 │ │ │ │ │ +847 template │ │ │ │ │ +_8_4_8 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const VertexIteratorT& other); │ │ │ │ │ +849 │ │ │ │ │ +853 typename std::conditional:: │ │ │ │ │ +type>::value, │ │ │ │ │ +854 VertexProperties&, │ │ │ │ │ +855 const VertexProperties&>::type │ │ │ │ │ +_8_5_6 _p_r_o_p_e_r_t_i_e_s() const; │ │ │ │ │ +857 │ │ │ │ │ +_8_6_3 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +864 │ │ │ │ │ +_8_7_0 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +871 │ │ │ │ │ +872 private: │ │ │ │ │ +876 C* graph_; │ │ │ │ │ +877 }; │ │ │ │ │ +878 │ │ │ │ │ +882 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +884 │ │ │ │ │ +888 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +890 │ │ │ │ │ +_8_9_5 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ +896 │ │ │ │ │ +_9_0_1 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ +902 │ │ │ │ │ +_9_0_7 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ +908 │ │ │ │ │ +_9_1_3 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ +914 │ │ │ │ │ +_9_2_0 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& _g_e_t_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s(const VertexDescriptor& vertex); │ │ │ │ │ +921 │ │ │ │ │ +_9_2_7 const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& _g_e_t_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s(const VertexDescriptor& vertex) │ │ │ │ │ +const; │ │ │ │ │ +928 │ │ │ │ │ +_9_3_3 const _G_r_a_p_h& _g_r_a_p_h() const; │ │ │ │ │ +934 │ │ │ │ │ +_9_3_8 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ +939 │ │ │ │ │ +_9_4_3 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ +944 │ │ │ │ │ +_9_5_1 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ +952 │ │ │ │ │ +_9_5_8 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(Graph& graph, const VertexMap vmap=VertexMap()); │ │ │ │ │ +959 │ │ │ │ │ +960 private: │ │ │ │ │ +961 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(const VertexPropertiesGraph&) │ │ │ │ │ +962 {} │ │ │ │ │ +963 │ │ │ │ │ +965 _G_r_a_p_h& graph_; │ │ │ │ │ +967 _V_e_r_t_e_x_M_a_p vmap_; │ │ │ │ │ +_9_6_9 std::vector vertexProperties_; │ │ │ │ │ +970 │ │ │ │ │ +971 }; │ │ │ │ │ +972 │ │ │ │ │ +976 template │ │ │ │ │ +_9_7_7 class _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +978 { │ │ │ │ │ +979 public: │ │ │ │ │ +_9_8_3 typedef G _G_r_a_p_h; │ │ │ │ │ +984 │ │ │ │ │ +_9_8_8 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +989 │ │ │ │ │ +_9_9_3 typedef typename Graph::EdgeDescriptor _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ +994 │ │ │ │ │ +_9_9_8 typedef VP _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ +999 │ │ │ │ │ +_1_0_1_1 typedef VM _V_e_r_t_e_x_M_a_p; │ │ │ │ │ +1012 │ │ │ │ │ +_1_0_1_6 typedef EP _E_d_g_e_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ +1017 │ │ │ │ │ +1018 │ │ │ │ │ +_1_0_3_0 typedef EM _E_d_g_e_M_a_p; │ │ │ │ │ +1031 │ │ │ │ │ +1032 template │ │ │ │ │ +_1_0_3_3 class _E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +1034 : public std::conditional:: │ │ │ │ │ +type, │ │ │ │ │ +1035 C>::value, │ │ │ │ │ +1036 typename Graph::EdgeIterator, │ │ │ │ │ +1037 typename Graph::ConstEdgeIterator>::type │ │ │ │ │ +1038 { │ │ │ │ │ +1039 │ │ │ │ │ +1040 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ +1041 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ +1042 public: │ │ │ │ │ +1046 typedef typename std::conditional::type, │ │ │ │ │ +1047 C>::value, │ │ │ │ │ +1048 typename Graph::EdgeIterator, │ │ │ │ │ +1049 typename Graph::ConstEdgeIterator>::type │ │ │ │ │ +_1_0_5_0 _F_a_t_h_e_r; │ │ │ │ │ +1051 │ │ │ │ │ +_1_0_5_7 explicit _E_d_g_e_I_t_e_r_a_t_o_r_T(const Father& iter, │ │ │ │ │ +1058 C* graph); │ │ │ │ │ +1059 │ │ │ │ │ +_1_0_6_7 explicit _E_d_g_e_I_t_e_r_a_t_o_r_T(const Father& iter); │ │ │ │ │ +1068 │ │ │ │ │ +1073 template │ │ │ │ │ +_1_0_7_4 _E_d_g_e_I_t_e_r_a_t_o_r_T(const EdgeIteratorT& other); │ │ │ │ │ +1075 │ │ │ │ │ +1079 typename std::conditional:: │ │ │ │ │ +type>::value, │ │ │ │ │ +1080 EdgeProperties&, │ │ │ │ │ +1081 const EdgeProperties&>::type │ │ │ │ │ +_1_0_8_2 properties() const; │ │ │ │ │ +1083 │ │ │ │ │ +1084 private: │ │ │ │ │ +_1_0_8_8 C* graph_; │ │ │ │ │ +1089 }; │ │ │ │ │ +1090 │ │ │ │ │ +1094 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T > _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +1097 │ │ │ │ │ +1101 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T > _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +1104 │ │ │ │ │ +_1_1_1_0 _E_d_g_e_I_t_e_r_a_t_o_r beginEdges(const VertexDescriptor& source); │ │ │ │ │ +1111 │ │ │ │ │ +_1_1_1_7 _E_d_g_e_I_t_e_r_a_t_o_r endEdges(const VertexDescriptor& source); │ │ │ │ │ +1118 │ │ │ │ │ +_1_1_2_4 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r beginEdges(const VertexDescriptor& source) const; │ │ │ │ │ +1125 │ │ │ │ │ +_1_1_3_1 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r endEdges(const VertexDescriptor& source) const; │ │ │ │ │ +1132 │ │ │ │ │ +1133 │ │ │ │ │ +1134 template │ │ │ │ │ +_1_1_3_5 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +1136 : public std::conditional:: │ │ │ │ │ +type, │ │ │ │ │ +1137 C>::value, │ │ │ │ │ +1138 typename Graph::VertexIterator, │ │ │ │ │ +1139 typename Graph::ConstVertexIterator>::type │ │ │ │ │ +1140 { │ │ │ │ │ +1141 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ +1142 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ +1143 public: │ │ │ │ │ +1147 typedef typename std::conditional::type, │ │ │ │ │ +1148 C>::value, │ │ │ │ │ +1149 typename Graph::VertexIterator, │ │ │ │ │ +1150 typename Graph::ConstVertexIterator>::type │ │ │ │ │ +_1_1_5_1 _F_a_t_h_e_r; │ │ │ │ │ +1152 │ │ │ │ │ +_1_1_5_8 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter, │ │ │ │ │ +1159 C* graph); │ │ │ │ │ +1160 │ │ │ │ │ +1161 │ │ │ │ │ +_1_1_6_9 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter); │ │ │ │ │ +1170 │ │ │ │ │ +1175 template │ │ │ │ │ +_1_1_7_6 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const VertexIteratorT& other); │ │ │ │ │ +1177 │ │ │ │ │ +1181 typename std::conditional:: │ │ │ │ │ +type>::value, │ │ │ │ │ +1182 VertexProperties&, │ │ │ │ │ +1183 const VertexProperties&>::type │ │ │ │ │ +_1_1_8_4 properties() const; │ │ │ │ │ +1185 │ │ │ │ │ +_1_1_9_1 _E_d_g_e_I_t_e_r_a_t_o_r_T begin() const; │ │ │ │ │ +1192 │ │ │ │ │ +_1_1_9_8 _E_d_g_e_I_t_e_r_a_t_o_r_T end() const; │ │ │ │ │ +1199 │ │ │ │ │ +1200 private: │ │ │ │ │ +1204 C* graph_; │ │ │ │ │ +1205 }; │ │ │ │ │ +1206 │ │ │ │ │ +1210 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +1213 │ │ │ │ │ +1217 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +1220 │ │ │ │ │ +_1_2_2_5 _V_e_r_t_e_x_I_t_e_r_a_t_o_r begin(); │ │ │ │ │ +1226 │ │ │ │ │ +_1_2_3_1 _V_e_r_t_e_x_I_t_e_r_a_t_o_r end(); │ │ │ │ │ +1232 │ │ │ │ │ +_1_2_3_7 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r begin() const; │ │ │ │ │ +1238 │ │ │ │ │ +_1_2_4_3 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r end() const; │ │ │ │ │ +1244 │ │ │ │ │ +_1_2_5_0 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& getVertexProperties(const VertexDescriptor& vertex); │ │ │ │ │ +1251 │ │ │ │ │ +_1_2_5_7 const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& getVertexProperties(const VertexDescriptor& │ │ │ │ │ +vertex) const; │ │ │ │ │ +1258 │ │ │ │ │ +_1_2_6_5 _E_d_g_e_D_e_s_c_r_i_p_t_o_r findEdge(const VertexDescriptor& source, │ │ │ │ │ +1266 const VertexDescriptor& target) │ │ │ │ │ +1267 { │ │ │ │ │ +1268 return graph_.findEdge(source,target); │ │ │ │ │ +1269 } │ │ │ │ │ +1270 │ │ │ │ │ +_1_2_7_6 _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge); │ │ │ │ │ +1277 │ │ │ │ │ +1278 │ │ │ │ │ +_1_2_8_4 const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge) const; │ │ │ │ │ +1285 │ │ │ │ │ +_1_2_9_2 _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ +1293 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target); │ │ │ │ │ +1294 │ │ │ │ │ +_1_3_0_1 const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ +1302 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target) const; │ │ │ │ │ +1303 │ │ │ │ │ +_1_3_0_8 const _G_r_a_p_h& _g_r_a_p_h() const; │ │ │ │ │ +1309 │ │ │ │ │ +_1_3_1_3 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ +1314 │ │ │ │ │ +_1_3_1_8 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ +1319 │ │ │ │ │ +_1_3_2_6 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ +1327 │ │ │ │ │ +_1_3_3_4 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(_G_r_a_p_h& graph, const _V_e_r_t_e_x_M_a_p& vmap=_V_e_r_t_e_x_M_a_p(), │ │ │ │ │ +1335 const _E_d_g_e_M_a_p& emap=_E_d_g_e_M_a_p()); │ │ │ │ │ +1336 │ │ │ │ │ +1337 private: │ │ │ │ │ +1338 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(const _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h&) │ │ │ │ │ +1339 {} │ │ │ │ │ +1340 │ │ │ │ │ +1342 Graph& graph_; │ │ │ │ │ +1345 VertexMap vmap_; │ │ │ │ │ +1346 std::vector vertexProperties_; │ │ │ │ │ +1348 EdgeMap emap_; │ │ │ │ │ +_1_3_5_0 std::vector edgeProperties_; │ │ │ │ │ +1351 │ │ │ │ │ +1352 }; │ │ │ │ │ +1353 │ │ │ │ │ +1354 │ │ │ │ │ +1359 template │ │ │ │ │ +_1_3_6_0 class _G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +1361 { │ │ │ │ │ +1362 public: │ │ │ │ │ +_1_3_6_6 typedef G _G_r_a_p_h; │ │ │ │ │ +_1_3_7_0 typedef typename G::VertexProperties _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ +_1_3_7_4 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ +1375 │ │ │ │ │ +_1_3_8_0 _G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r(G& g) │ │ │ │ │ +1381 : graph_(g) │ │ │ │ │ +1382 {} │ │ │ │ │ +_1_3_8_6 _G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r() │ │ │ │ │ +1387 : graph_(0) │ │ │ │ │ +1388 {} │ │ │ │ │ +1389 │ │ │ │ │ +1390 │ │ │ │ │ +_1_3_9_5 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& _o_p_e_r_a_t_o_r_[_](const _V_e_r_t_e_x& vertex) const │ │ │ │ │ +1396 { │ │ │ │ │ +1397 return graph_->getVertexProperties(vertex); │ │ │ │ │ +1398 } │ │ │ │ │ +1399 private: │ │ │ │ │ +1400 Graph* graph_; │ │ │ │ │ +1401 }; │ │ │ │ │ +1402 │ │ │ │ │ +1407 template │ │ │ │ │ +_1_4_0_8 class _G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +1409 { │ │ │ │ │ +1410 public: │ │ │ │ │ +_1_4_1_4 typedef G _G_r_a_p_h; │ │ │ │ │ +_1_4_1_8 typedef typename G::EdgeProperties _E_d_g_e_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ +_1_4_2_2 typedef typename G::EdgeDescriptor _E_d_g_e; │ │ │ │ │ +1423 │ │ │ │ │ +_1_4_2_8 _G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r(G& g) │ │ │ │ │ +1429 : graph_(g) │ │ │ │ │ +1430 {} │ │ │ │ │ +_1_4_3_4 _G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r() │ │ │ │ │ +1435 : graph_(0) │ │ │ │ │ +1436 {} │ │ │ │ │ +1437 │ │ │ │ │ +_1_4_4_2 _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _o_p_e_r_a_t_o_r_[_](const _E_d_g_e& edge) const │ │ │ │ │ +1443 { │ │ │ │ │ +1444 return graph_->getEdgeProperties(edge); │ │ │ │ │ +1445 } │ │ │ │ │ +1446 private: │ │ │ │ │ +1447 Graph* graph_; │ │ │ │ │ +1448 }; │ │ │ │ │ +1449 │ │ │ │ │ +1450 │ │ │ │ │ +1461 template │ │ │ │ │ +_1_4_6_2 int _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(const G& graph, const typename G::VertexDescriptor& │ │ │ │ │ +vertex, │ │ │ │ │ +1463 V& visitor); │ │ │ │ │ +1464 │ │ │ │ │ +1465#ifndef DOXYGEN │ │ │ │ │ +1466 │ │ │ │ │ +1467 template │ │ │ │ │ +1468 _M_a_t_r_i_x_G_r_a_p_h_<_M_>_:_:_M_a_t_r_i_x_G_r_a_p_h(M& matrix) │ │ │ │ │ +1469 : matrix_(matrix) │ │ │ │ │ +1470 { │ │ │ │ │ +1471 if(matrix_.N()!=matrix_.M()) │ │ │ │ │ +1472 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Matrix has to have as many columns as rows!"); │ │ │ │ │ +1473 │ │ │ │ │ +1474 start_ = new EdgeDescriptor[matrix_.N()+1]; │ │ │ │ │ +1475 │ │ │ │ │ +1476 typedef typename M::ConstIterator Iterator; │ │ │ │ │ +1477 start_[matrix_.begin().index()] = 0; │ │ │ │ │ +1478 │ │ │ │ │ +1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row) │ │ │ │ │ +1480 start_[row.index()+1] = start_[row.index()] + row->size(); │ │ │ │ │ +1481 } │ │ │ │ │ +1482 │ │ │ │ │ +1483 template │ │ │ │ │ +1484 MatrixGraph::~MatrixGraph() │ │ │ │ │ +1485 { │ │ │ │ │ +1486 delete[] start_; │ │ │ │ │ +1487 } │ │ │ │ │ +1488 │ │ │ │ │ +1489 template │ │ │ │ │ +1490 inline std::size_t MatrixGraph::noEdges() const │ │ │ │ │ +1491 { │ │ │ │ │ +1492 return start_[matrix_.N()]; │ │ │ │ │ +1493 } │ │ │ │ │ +1494 │ │ │ │ │ +1495 template │ │ │ │ │ +1496 inline std::size_t MatrixGraph::noVertices() const │ │ │ │ │ +1497 { │ │ │ │ │ +1498 return matrix_.N(); │ │ │ │ │ +1499 } │ │ │ │ │ +1500 │ │ │ │ │ +1501 template │ │ │ │ │ +1502 inline typename MatrixGraph::VertexDescriptor MatrixGraph::maxVertex │ │ │ │ │ +() const │ │ │ │ │ +1503 { │ │ │ │ │ +1504 return matrix_.N()-1; │ │ │ │ │ +1505 } │ │ │ │ │ +1506 │ │ │ │ │ +1507 template │ │ │ │ │ +1508 typename MatrixGraph::EdgeDescriptor │ │ │ │ │ +1509 MatrixGraph::findEdge(const VertexDescriptor& source, │ │ │ │ │ +1510 const VertexDescriptor& target) const │ │ │ │ │ +1511 { │ │ │ │ │ +1512 typename M::ConstColIterator found =matrix_[source].find(target); │ │ │ │ │ +1513 if(found == matrix_[source].end()) │ │ │ │ │ +1514 return std::numeric_limits::max(); │ │ │ │ │ +1515 std::size_t offset = found.offset(); │ │ │ │ │ +1516 if(target>source) │ │ │ │ │ +1517 offset--; │ │ │ │ │ +1518 │ │ │ │ │ +1519 assert(offset │ │ │ │ │ +1526 inline M& MatrixGraph::matrix() │ │ │ │ │ +1527 { │ │ │ │ │ +1528 return matrix_; │ │ │ │ │ +1529 } │ │ │ │ │ +1530 │ │ │ │ │ +1531 template │ │ │ │ │ +1532 inline const M& MatrixGraph::matrix() const │ │ │ │ │ +1533 { │ │ │ │ │ +1534 return matrix_; │ │ │ │ │ +1535 } │ │ │ │ │ +1536 │ │ │ │ │ +1537 template │ │ │ │ │ +1538 template │ │ │ │ │ +1539 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const VertexDescriptor& │ │ │ │ │ +source, const ColIterator& block, │ │ │ │ │ +1540 const ColIterator& end, const EdgeDescriptor& edge) │ │ │ │ │ +1541 : source_(source), block_(block), blockEnd_(end), edge_(edge) │ │ │ │ │ +1542 { │ │ │ │ │ +1543 if(block_!=blockEnd_ && block_.index() == source_) { │ │ │ │ │ +1544 // This is the edge from the diagonal to the diagonal. Skip it. │ │ │ │ │ +1545 ++block_; │ │ │ │ │ +1546 } │ │ │ │ │ +1547 } │ │ │ │ │ +1548 │ │ │ │ │ +1549 template │ │ │ │ │ +1550 template │ │ │ │ │ +1551 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const ColIterator& block) │ │ │ │ │ +1552 : block_(block) │ │ │ │ │ +1553 {} │ │ │ │ │ +1554 │ │ │ │ │ +1555 template │ │ │ │ │ +1556 template │ │ │ │ │ +1557 template │ │ │ │ │ +1558 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const EdgeIteratorT& │ │ │ │ │ +other) │ │ │ │ │ +1559 : source_(other.source_), block_(other.block_), blockEnd_ │ │ │ │ │ +(other.blockEnd_), edge_(other.edge_) │ │ │ │ │ +1560 {} │ │ │ │ │ +1561 │ │ │ │ │ +1562 │ │ │ │ │ +1563 template │ │ │ │ │ +1564 template │ │ │ │ │ +1565 inline typename MatrixGraph::template EdgeIteratorT::WeightType& │ │ │ │ │ +1566 MatrixGraph::EdgeIteratorT::weight() const │ │ │ │ │ +1567 { │ │ │ │ │ +1568 return *block_; │ │ │ │ │ +1569 } │ │ │ │ │ +1570 │ │ │ │ │ +1571 template │ │ │ │ │ +1572 template │ │ │ │ │ +1573 inline typename MatrixGraph::template EdgeIteratorT& │ │ │ │ │ +MatrixGraph::EdgeIteratorT::operator++() │ │ │ │ │ +1574 { │ │ │ │ │ +1575 ++block_; │ │ │ │ │ +1576 ++edge_; │ │ │ │ │ +1577 │ │ │ │ │ +1578 if(block_!=blockEnd_ && block_.index() == source_) { │ │ │ │ │ +1579 // This is the edge from the diagonal to the diagonal. Skip it. │ │ │ │ │ +1580 ++block_; │ │ │ │ │ +1581 } │ │ │ │ │ +1582 │ │ │ │ │ +1583 return *this; │ │ │ │ │ +1584 } │ │ │ │ │ +1585 │ │ │ │ │ +1586 template │ │ │ │ │ +1587 template │ │ │ │ │ +1588 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename │ │ │ │ │ +MatrixGraph::template EdgeIteratorT::type>& │ │ │ │ │ +other) const │ │ │ │ │ +1589 { │ │ │ │ │ +1590 return block_!=other.block_; │ │ │ │ │ +1591 } │ │ │ │ │ +1592 │ │ │ │ │ +1593 template │ │ │ │ │ +1594 template │ │ │ │ │ +1595 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename │ │ │ │ │ +MatrixGraph::template EdgeIteratorT:: │ │ │ │ │ +type>& other) const │ │ │ │ │ +1596 { │ │ │ │ │ +1597 return block_!=other.block_; │ │ │ │ │ +1598 } │ │ │ │ │ +1599 │ │ │ │ │ +1600 template │ │ │ │ │ +1601 template │ │ │ │ │ +1602 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename │ │ │ │ │ +MatrixGraph::template EdgeIteratorT::type>& │ │ │ │ │ +other) const │ │ │ │ │ +1603 { │ │ │ │ │ +1604 return block_==other.block_; │ │ │ │ │ +1605 } │ │ │ │ │ +1606 │ │ │ │ │ +1607 template │ │ │ │ │ +1608 template │ │ │ │ │ +1609 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename │ │ │ │ │ +MatrixGraph::template EdgeIteratorT:: │ │ │ │ │ +type>& other) const │ │ │ │ │ +1610 { │ │ │ │ │ +1611 return block_==other.block_; │ │ │ │ │ +1612 } │ │ │ │ │ +1613 │ │ │ │ │ +1614 template │ │ │ │ │ +1615 template │ │ │ │ │ +1616 inline typename MatrixGraph::VertexDescriptor MatrixGraph:: │ │ │ │ │ +EdgeIteratorT::target() const │ │ │ │ │ +1617 { │ │ │ │ │ +1618 return block_.index(); │ │ │ │ │ +1619 } │ │ │ │ │ +1620 │ │ │ │ │ +1621 template │ │ │ │ │ +1622 template │ │ │ │ │ +1623 inline typename MatrixGraph::VertexDescriptor MatrixGraph:: │ │ │ │ │ +EdgeIteratorT::source() const │ │ │ │ │ +1624 { │ │ │ │ │ +1625 return source_; │ │ │ │ │ +1626 } │ │ │ │ │ +1627 │ │ │ │ │ +1628 template │ │ │ │ │ +1629 template │ │ │ │ │ +1630 inline const typename MatrixGraph::EdgeDescriptor& MatrixGraph:: │ │ │ │ │ +EdgeIteratorT::operator*() const │ │ │ │ │ +1631 { │ │ │ │ │ +1632 return edge_; │ │ │ │ │ +1633 } │ │ │ │ │ +1634 │ │ │ │ │ +1635 template │ │ │ │ │ +1636 template │ │ │ │ │ +1637 inline const typename MatrixGraph::EdgeDescriptor* MatrixGraph:: │ │ │ │ │ +EdgeIteratorT::operator->() const │ │ │ │ │ +1638 { │ │ │ │ │ +1639 return &edge_; │ │ │ │ │ +1640 } │ │ │ │ │ +1641 │ │ │ │ │ +1642 template │ │ │ │ │ +1643 template │ │ │ │ │ +1644 MatrixGraph::VertexIteratorT::VertexIteratorT(C* graph, │ │ │ │ │ +1645 const VertexDescriptor& current) │ │ │ │ │ +1646 : graph_(graph), current_(current) │ │ │ │ │ +1647 {} │ │ │ │ │ +1648 │ │ │ │ │ +1649 │ │ │ │ │ +1650 template │ │ │ │ │ +1651 template │ │ │ │ │ +1652 MatrixGraph::VertexIteratorT::VertexIteratorT(const │ │ │ │ │ +VertexDescriptor& current) │ │ │ │ │ +1653 : current_(current) │ │ │ │ │ +1654 {} │ │ │ │ │ +1655 │ │ │ │ │ +1656 template │ │ │ │ │ +1657 template │ │ │ │ │ +1658 MatrixGraph::VertexIteratorT::VertexIteratorT(const │ │ │ │ │ +VertexIteratorT& other) │ │ │ │ │ +1659 : graph_(other.graph_), current_(other.current_) │ │ │ │ │ +1660 {} │ │ │ │ │ +1661 │ │ │ │ │ +1662 template │ │ │ │ │ +1663 template │ │ │ │ │ +1664 inline bool MatrixGraph::VertexIteratorT::operator!=(const │ │ │ │ │ +VertexIteratorT& other) const │ │ │ │ │ +1665 { │ │ │ │ │ +1666 return current_ != other.current_; │ │ │ │ │ +1667 } │ │ │ │ │ +1668 │ │ │ │ │ +1669 template │ │ │ │ │ +1670 template │ │ │ │ │ +1671 inline bool MatrixGraph::VertexIteratorT::operator!=(const │ │ │ │ │ +VertexIteratorT& other) const │ │ │ │ │ +1672 { │ │ │ │ │ +1673 return current_ != other.current_; │ │ │ │ │ +1674 } │ │ │ │ │ +1675 │ │ │ │ │ +1676 │ │ │ │ │ +1677 template │ │ │ │ │ +1678 template │ │ │ │ │ +1679 inline bool MatrixGraph::VertexIteratorT::operator==(const │ │ │ │ │ +VertexIteratorT& other) const │ │ │ │ │ +1680 { │ │ │ │ │ +1681 return current_ == other.current_; │ │ │ │ │ +1682 } │ │ │ │ │ +1683 │ │ │ │ │ +1684 template │ │ │ │ │ +1685 template │ │ │ │ │ +1686 inline bool MatrixGraph::VertexIteratorT::operator==(const │ │ │ │ │ +VertexIteratorT& other) const │ │ │ │ │ +1687 { │ │ │ │ │ +1688 return current_ == other.current_; │ │ │ │ │ +1689 } │ │ │ │ │ +1690 │ │ │ │ │ +1691 template │ │ │ │ │ +1692 template │ │ │ │ │ +1693 inline typename MatrixGraph::template VertexIteratorT& │ │ │ │ │ +MatrixGraph::VertexIteratorT::operator++() │ │ │ │ │ +1694 { │ │ │ │ │ +1695 ++current_; │ │ │ │ │ +1696 return *this; │ │ │ │ │ +1697 } │ │ │ │ │ +1698 │ │ │ │ │ +1699 template │ │ │ │ │ +1700 template │ │ │ │ │ +1701 inline typename MatrixGraph::template VertexIteratorT::WeightType& │ │ │ │ │ +1702 MatrixGraph::VertexIteratorT::weight() const │ │ │ │ │ +1703 { │ │ │ │ │ +1704 return graph_->matrix()[current_][current_]; │ │ │ │ │ +1705 } │ │ │ │ │ +1706 │ │ │ │ │ +1707 template │ │ │ │ │ +1708 template │ │ │ │ │ +1709 inline const typename MatrixGraph::VertexDescriptor& │ │ │ │ │ +1710 MatrixGraph::VertexIteratorT::operator*() const │ │ │ │ │ +1711 { │ │ │ │ │ +1712 return current_; │ │ │ │ │ +1713 } │ │ │ │ │ +1714 │ │ │ │ │ +1715 template │ │ │ │ │ +1716 template │ │ │ │ │ +1717 inline typename MatrixGraph::template EdgeIteratorT │ │ │ │ │ +1718 MatrixGraph::VertexIteratorT::begin() const │ │ │ │ │ +1719 { │ │ │ │ │ +1720 return graph_->beginEdges(current_); │ │ │ │ │ +1721 } │ │ │ │ │ +1722 │ │ │ │ │ +1723 template │ │ │ │ │ +1724 template │ │ │ │ │ +1725 inline typename MatrixGraph::template EdgeIteratorT │ │ │ │ │ +1726 MatrixGraph::VertexIteratorT::end() const │ │ │ │ │ +1727 { │ │ │ │ │ +1728 return graph_->endEdges(current_); │ │ │ │ │ +1729 } │ │ │ │ │ +1730 │ │ │ │ │ +1731 template │ │ │ │ │ +1732 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ +1733 MatrixGraph::begin() │ │ │ │ │ +1734 { │ │ │ │ │ +1735 return VertexIterator(this,0); │ │ │ │ │ +1736 } │ │ │ │ │ +1737 │ │ │ │ │ +1738 template │ │ │ │ │ +1739 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ +1740 MatrixGraph::end() │ │ │ │ │ +1741 { │ │ │ │ │ +1742 return VertexIterator(matrix_.N()); │ │ │ │ │ +1743 } │ │ │ │ │ +1744 │ │ │ │ │ +1745 │ │ │ │ │ +1746 template │ │ │ │ │ +1747 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ +1748 MatrixGraph::begin() const │ │ │ │ │ +1749 { │ │ │ │ │ +1750 return ConstVertexIterator(this, 0); │ │ │ │ │ +1751 } │ │ │ │ │ +1752 │ │ │ │ │ +1753 template │ │ │ │ │ +1754 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ +1755 MatrixGraph::end() const │ │ │ │ │ +1756 { │ │ │ │ │ +1757 return ConstVertexIterator(matrix_.N()); │ │ │ │ │ +1758 } │ │ │ │ │ +1759 │ │ │ │ │ +1760 template │ │ │ │ │ +1761 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ +1762 MatrixGraph::beginEdges(const VertexDescriptor& source) │ │ │ │ │ +1763 { │ │ │ │ │ +1764 return EdgeIterator(source, matrix_.operator[](source).begin(), │ │ │ │ │ +1765 matrix_.operator[](source).end(), start_[source]); │ │ │ │ │ +1766 } │ │ │ │ │ +1767 │ │ │ │ │ +1768 template │ │ │ │ │ +1769 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ +1770 MatrixGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ +1771 { │ │ │ │ │ +1772 return EdgeIterator(matrix_.operator[](source).end()); │ │ │ │ │ +1773 } │ │ │ │ │ +1774 │ │ │ │ │ +1775 │ │ │ │ │ +1776 template │ │ │ │ │ +1777 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ +1778 MatrixGraph::beginEdges(const VertexDescriptor& source) const │ │ │ │ │ +1779 { │ │ │ │ │ +1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(), │ │ │ │ │ +1781 matrix_.operator[](source).end(), start_[source]); │ │ │ │ │ +1782 } │ │ │ │ │ +1783 │ │ │ │ │ +1784 template │ │ │ │ │ +1785 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ +1786 MatrixGraph::endEdges(const VertexDescriptor& source) const │ │ │ │ │ +1787 { │ │ │ │ │ +1788 return ConstEdgeIterator(matrix_.operator[](source).end()); │ │ │ │ │ +1789 } │ │ │ │ │ +1790 │ │ │ │ │ +1791 │ │ │ │ │ +1792 template │ │ │ │ │ +1793 SubGraph::EdgeIterator::EdgeIterator(const VertexDescriptor& source, │ │ │ │ │ +1794 const EdgeDescriptor& edge) │ │ │ │ │ +1795 : source_(source), edge_(edge) │ │ │ │ │ +1796 {} │ │ │ │ │ +1797 │ │ │ │ │ +1798 │ │ │ │ │ +1799 template │ │ │ │ │ +1800 SubGraph::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge) │ │ │ │ │ +1801 : edge_(edge) │ │ │ │ │ +1802 {} │ │ │ │ │ +1803 │ │ │ │ │ +1804 template │ │ │ │ │ +1805 typename SubGraph::EdgeIndexMap SubGraph::getEdgeIndexMap() │ │ │ │ │ +1806 { │ │ │ │ │ +1807 return EdgeIndexMap(edges_); │ │ │ │ │ +1808 } │ │ │ │ │ +1809 │ │ │ │ │ +1810 template │ │ │ │ │ +1811 inline bool SubGraph::EdgeIterator::equals(const EdgeIterator & │ │ │ │ │ +other) const │ │ │ │ │ +1812 { │ │ │ │ │ +1813 return other.edge_==edge_; │ │ │ │ │ +1814 } │ │ │ │ │ +1815 │ │ │ │ │ +1816 template │ │ │ │ │ +1817 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator:: │ │ │ │ │ +increment() │ │ │ │ │ +1818 { │ │ │ │ │ +1819 ++edge_; │ │ │ │ │ +1820 return *this; │ │ │ │ │ +1821 } │ │ │ │ │ +1822 │ │ │ │ │ +1823 template │ │ │ │ │ +1824 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator:: │ │ │ │ │ +decrement() │ │ │ │ │ +1825 { │ │ │ │ │ +1826 --edge_; │ │ │ │ │ +1827 return *this; │ │ │ │ │ +1828 } │ │ │ │ │ +1829 │ │ │ │ │ +1830 template │ │ │ │ │ +1831 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator:: │ │ │ │ │ +advance(std::ptrdiff_t n) │ │ │ │ │ +1832 { │ │ │ │ │ +1833 edge_+=n; │ │ │ │ │ +1834 return *this; │ │ │ │ │ +1835 } │ │ │ │ │ +1836 template │ │ │ │ │ +1837 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator:: │ │ │ │ │ +source() const │ │ │ │ │ +1838 { │ │ │ │ │ +1839 return source_; │ │ │ │ │ +1840 } │ │ │ │ │ +1841 │ │ │ │ │ +1842 template │ │ │ │ │ +1843 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator:: │ │ │ │ │ +target() const │ │ │ │ │ +1844 { │ │ │ │ │ +1845 return *edge_; │ │ │ │ │ +1846 } │ │ │ │ │ +1847 │ │ │ │ │ +1848 │ │ │ │ │ +1849 template │ │ │ │ │ +1850 inline const typename SubGraph::EdgeDescriptor& SubGraph:: │ │ │ │ │ +EdgeIterator::dereference() const │ │ │ │ │ +1851 { │ │ │ │ │ +1852 return edge_; │ │ │ │ │ +1853 } │ │ │ │ │ +1854 │ │ │ │ │ +1855 template │ │ │ │ │ +1856 inline std::ptrdiff_t SubGraph::EdgeIterator::distanceTo(const │ │ │ │ │ +EdgeIterator & other) const │ │ │ │ │ +1857 { │ │ │ │ │ +1858 return other.edge_-edge_; │ │ │ │ │ +1859 } │ │ │ │ │ +1860 │ │ │ │ │ +1861 template │ │ │ │ │ +1862 SubGraph::VertexIterator::VertexIterator(const SubGraph* graph, │ │ │ │ │ +1863 const VertexDescriptor& current, │ │ │ │ │ +1864 const VertexDescriptor& end) │ │ │ │ │ +1865 : graph_(graph), current_(current), end_(end) │ │ │ │ │ +1866 { │ │ │ │ │ +1867 // Skip excluded vertices │ │ │ │ │ +1868 typedef typename T::const_iterator Iterator; │ │ │ │ │ +1869 │ │ │ │ │ +1870 for(Iterator vertex = graph_->excluded_.begin(); │ │ │ │ │ +1871 current_ != end_ && *vertex; │ │ │ │ │ +1872 ++vertex) │ │ │ │ │ +1873 ++current_; │ │ │ │ │ +1874 assert(current_ == end_ || !graph_->excluded_[current_]); │ │ │ │ │ +1875 } │ │ │ │ │ +1876 │ │ │ │ │ +1877 template │ │ │ │ │ +1878 SubGraph::VertexIterator::VertexIterator(const VertexDescriptor& │ │ │ │ │ +current) │ │ │ │ │ +1879 : current_(current) │ │ │ │ │ +1880 {} │ │ │ │ │ +1881 │ │ │ │ │ +1882 template │ │ │ │ │ +1883 inline typename SubGraph::VertexIterator& SubGraph:: │ │ │ │ │ +VertexIterator::increment() │ │ │ │ │ +1884 { │ │ │ │ │ +1885 ++current_; │ │ │ │ │ +1886 //Skip excluded vertices │ │ │ │ │ +1887 while(current_ != end_ && graph_->excluded_[current_]) │ │ │ │ │ +1888 ++current_; │ │ │ │ │ +1889 │ │ │ │ │ +1890 assert(current_ == end_ || !graph_->excluded_[current_]); │ │ │ │ │ +1891 return *this; │ │ │ │ │ +1892 } │ │ │ │ │ +1893 │ │ │ │ │ +1894 template │ │ │ │ │ +1895 inline bool SubGraph::VertexIterator::equals(const VertexIterator & │ │ │ │ │ +other) const │ │ │ │ │ +1896 { │ │ │ │ │ +1897 return current_==other.current_; │ │ │ │ │ +1898 } │ │ │ │ │ +1899 │ │ │ │ │ +1900 template │ │ │ │ │ +1901 inline const typename G::VertexDescriptor& SubGraph::VertexIterator:: │ │ │ │ │ +dereference() const │ │ │ │ │ +1902 { │ │ │ │ │ +1903 return current_; │ │ │ │ │ +1904 } │ │ │ │ │ +1905 │ │ │ │ │ +1906 template │ │ │ │ │ +1907 inline typename SubGraph::EdgeIterator SubGraph:: │ │ │ │ │ +VertexIterator::begin() const │ │ │ │ │ +1908 { │ │ │ │ │ +1909 return graph_->beginEdges(current_); │ │ │ │ │ +1910 } │ │ │ │ │ +1911 │ │ │ │ │ +1912 template │ │ │ │ │ +1913 inline typename SubGraph::EdgeIterator SubGraph:: │ │ │ │ │ +VertexIterator::end() const │ │ │ │ │ +1914 { │ │ │ │ │ +1915 return graph_->endEdges(current_); │ │ │ │ │ +1916 } │ │ │ │ │ +1917 │ │ │ │ │ +1918 template │ │ │ │ │ +1919 inline typename SubGraph::VertexIterator SubGraph::begin() const │ │ │ │ │ +1920 { │ │ │ │ │ +1921 return VertexIterator(this, 0, endVertex_); │ │ │ │ │ +1922 } │ │ │ │ │ +1923 │ │ │ │ │ +1924 │ │ │ │ │ +1925 template │ │ │ │ │ +1926 inline typename SubGraph::VertexIterator SubGraph::end() const │ │ │ │ │ +1927 { │ │ │ │ │ +1928 return VertexIterator(endVertex_); │ │ │ │ │ +1929 } │ │ │ │ │ +1930 │ │ │ │ │ +1931 │ │ │ │ │ +1932 template │ │ │ │ │ +1933 inline typename SubGraph::EdgeIterator SubGraph::beginEdges │ │ │ │ │ +(const VertexDescriptor& source) const │ │ │ │ │ +1934 { │ │ │ │ │ +1935 return EdgeIterator(source, edges_+start_[source]); │ │ │ │ │ +1936 } │ │ │ │ │ +1937 │ │ │ │ │ +1938 template │ │ │ │ │ +1939 inline typename SubGraph::EdgeIterator SubGraph::endEdges(const │ │ │ │ │ +VertexDescriptor& source) const │ │ │ │ │ +1940 { │ │ │ │ │ +1941 return EdgeIterator(edges_+end_[source]); │ │ │ │ │ +1942 } │ │ │ │ │ +1943 │ │ │ │ │ +1944 template │ │ │ │ │ +1945 std::size_t SubGraph::noVertices() const │ │ │ │ │ +1946 { │ │ │ │ │ +1947 return noVertices_; │ │ │ │ │ +1948 } │ │ │ │ │ +1949 │ │ │ │ │ +1950 template │ │ │ │ │ +1951 inline typename SubGraph::VertexDescriptor SubGraph::maxVertex() │ │ │ │ │ +const │ │ │ │ │ +1952 { │ │ │ │ │ +1953 return maxVertex_; │ │ │ │ │ +1954 } │ │ │ │ │ +1955 │ │ │ │ │ +1956 template │ │ │ │ │ +1957 inline std::size_t SubGraph::noEdges() const │ │ │ │ │ +1958 { │ │ │ │ │ +1959 return noEdges_; │ │ │ │ │ +1960 } │ │ │ │ │ +1961 │ │ │ │ │ +1962 template │ │ │ │ │ +1963 inline typename SubGraph::EdgeDescriptor SubGraph::findEdge │ │ │ │ │ +(const VertexDescriptor& source, │ │ │ │ │ +1964 const VertexDescriptor& target) const │ │ │ │ │ +1965 { │ │ │ │ │ +1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source], │ │ │ │ │ +edges_+end_[source], target); │ │ │ │ │ +1967 if(edge==edges_+end_[source] || *edge!=target) │ │ │ │ │ +1968 return std::numeric_limits::max(); │ │ │ │ │ +1969 │ │ │ │ │ +1970 return edge; │ │ │ │ │ +1971 } │ │ │ │ │ +1972 │ │ │ │ │ +1973 template │ │ │ │ │ +1974 SubGraph::~SubGraph() │ │ │ │ │ +1975 { │ │ │ │ │ +1976 delete[] edges_; │ │ │ │ │ +1977 delete[] end_; │ │ │ │ │ +1978 delete[] start_; │ │ │ │ │ +1979 } │ │ │ │ │ +1980 │ │ │ │ │ +1981 template │ │ │ │ │ +1982 SubGraph::SubGraph(const G& graph, const T& excluded) │ │ │ │ │ +1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_ │ │ │ │ │ +(graph.maxVertex()) │ │ │ │ │ +1984 { │ │ │ │ │ +1985 start_ = new std::ptrdiff_t[graph.noVertices()]; │ │ │ │ │ +1986 end_ = new std::ptrdiff_t[graph.noVertices()]; │ │ │ │ │ +1987 edges_ = new VertexDescriptor[graph.noEdges()]; │ │ │ │ │ +1988 │ │ │ │ │ +1989 VertexDescriptor* edge=edges_; │ │ │ │ │ +1990 │ │ │ │ │ +1991 // Cater for the case that there are no vertices. │ │ │ │ │ +1992 // Otherwise endVertex_ will get 1 below. │ │ │ │ │ +1993 if ( graph.noVertices() == 0) │ │ │ │ │ +1994 return; │ │ │ │ │ +1995 │ │ │ │ │ +1996 typedef typename Graph::ConstVertexIterator Iterator; │ │ │ │ │ +1997 Iterator endVertex=graph.end(); │ │ │ │ │ +1998 │ │ │ │ │ +1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex) │ │ │ │ │ +2000 if(excluded_[*vertex]) │ │ │ │ │ +2001 start_[*vertex]=end_[*vertex]=-1; │ │ │ │ │ +2002 else{ │ │ │ │ │ +2003 ++noVertices_; │ │ │ │ │ +2004 endVertex_ = std::max(*vertex, endVertex_); │ │ │ │ │ +2005 │ │ │ │ │ +2006 start_[*vertex] = edge-edges_; │ │ │ │ │ +2007 │ │ │ │ │ +2008 auto endEdge = vertex.end(); │ │ │ │ │ +2009 │ │ │ │ │ +2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter) │ │ │ │ │ +2011 if(!excluded[iter.target()]) { │ │ │ │ │ +2012 *edge = iter.target(); │ │ │ │ │ +2013 ++edge; │ │ │ │ │ +2014 } │ │ │ │ │ +2015 │ │ │ │ │ +2016 end_[*vertex] = edge - edges_; │ │ │ │ │ +2017 │ │ │ │ │ +2018 // Sort the edges │ │ │ │ │ +2019 std::sort(edges_+start_[*vertex], edge); │ │ │ │ │ +2020 } │ │ │ │ │ +2021 noEdges_ = edge-edges_; │ │ │ │ │ +2022 ++endVertex_; │ │ │ │ │ +2023 } │ │ │ │ │ +2024 │ │ │ │ │ +2025 template │ │ │ │ │ +2026 inline std::size_t VertexPropertiesGraph::noEdges() const │ │ │ │ │ +2027 { │ │ │ │ │ +2028 return graph_.noEdges(); │ │ │ │ │ +2029 } │ │ │ │ │ +2030 │ │ │ │ │ +2031 template │ │ │ │ │ +2032 inline typename VertexPropertiesGraph::EdgeIterator │ │ │ │ │ +2033 VertexPropertiesGraph::beginEdges(const VertexDescriptor& source) │ │ │ │ │ +2034 { │ │ │ │ │ +2035 return graph_.beginEdges(source); │ │ │ │ │ +2036 } │ │ │ │ │ +2037 │ │ │ │ │ +2038 template │ │ │ │ │ +2039 inline typename VertexPropertiesGraph::EdgeIterator │ │ │ │ │ +2040 VertexPropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ +2041 { │ │ │ │ │ +2042 return graph_.endEdges(source); │ │ │ │ │ +2043 } │ │ │ │ │ +2044 │ │ │ │ │ +2045 template │ │ │ │ │ +2046 typename VertexPropertiesGraph::ConstEdgeIterator │ │ │ │ │ +2047 inline VertexPropertiesGraph::beginEdges(const VertexDescriptor& │ │ │ │ │ +source) const │ │ │ │ │ +2048 { │ │ │ │ │ +2049 return graph_.beginEdges(source); │ │ │ │ │ +2050 } │ │ │ │ │ +2051 │ │ │ │ │ +2052 template │ │ │ │ │ +2053 typename VertexPropertiesGraph::ConstEdgeIterator │ │ │ │ │ +2054 VertexPropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ +const │ │ │ │ │ +2055 { │ │ │ │ │ +2056 return graph_.endEdges(source); │ │ │ │ │ +2057 } │ │ │ │ │ +2058 │ │ │ │ │ +2059 template │ │ │ │ │ +2060 template │ │ │ │ │ +2061 VertexPropertiesGraph::VertexIteratorT │ │ │ │ │ +2062 ::VertexIteratorT(const Father& iter, │ │ │ │ │ +2063 C* graph) │ │ │ │ │ +2064 : Father(iter), graph_(graph) │ │ │ │ │ +2065 {} │ │ │ │ │ +2066 │ │ │ │ │ +2067 template │ │ │ │ │ +2068 template │ │ │ │ │ +2069 VertexPropertiesGraph::VertexIteratorT │ │ │ │ │ +2070 ::VertexIteratorT(const Father& iter) │ │ │ │ │ +2071 : Father(iter) │ │ │ │ │ +2072 {} │ │ │ │ │ +2073 │ │ │ │ │ +2074 template │ │ │ │ │ +2075 template │ │ │ │ │ +2076 template │ │ │ │ │ +2077 VertexPropertiesGraph::VertexIteratorT │ │ │ │ │ +2078 ::VertexIteratorT(const VertexIteratorT& other) │ │ │ │ │ +2079 : Father(other), graph_(other.graph_) │ │ │ │ │ +2080 {} │ │ │ │ │ +2081 │ │ │ │ │ +2082 template │ │ │ │ │ +2083 template │ │ │ │ │ +2084 typename std::conditional:: │ │ │ │ │ +type>::value, │ │ │ │ │ +2085 V&, const V&>::type │ │ │ │ │ +2086 inline VertexPropertiesGraph::VertexIteratorT::properties() │ │ │ │ │ +const │ │ │ │ │ +2087 { │ │ │ │ │ +2088 return graph_->getVertexProperties(Father::operator*()); │ │ │ │ │ +2089 } │ │ │ │ │ +2090 │ │ │ │ │ +2091 template │ │ │ │ │ +2092 template │ │ │ │ │ +2093 typename std::conditional:: │ │ │ │ │ +type, │ │ │ │ │ +2094 C>::value, │ │ │ │ │ +2095 typename G::EdgeIterator, │ │ │ │ │ +2096 typename G::ConstEdgeIterator>::type │ │ │ │ │ +2097 inline VertexPropertiesGraph::VertexIteratorT::begin() const │ │ │ │ │ +2098 { │ │ │ │ │ +2099 return graph_->beginEdges(Father::operator*()); │ │ │ │ │ +2100 } │ │ │ │ │ +2101 │ │ │ │ │ +2102 template │ │ │ │ │ +2103 template │ │ │ │ │ +2104 typename std::conditional:: │ │ │ │ │ +type, │ │ │ │ │ +2105 C>::value, │ │ │ │ │ +2106 typename G::EdgeIterator, │ │ │ │ │ +2107 typename G::ConstEdgeIterator>::type │ │ │ │ │ +2108 inline VertexPropertiesGraph::VertexIteratorT::end() const │ │ │ │ │ +2109 { │ │ │ │ │ +2110 return graph_->endEdges(Father::operator*()); │ │ │ │ │ +2111 } │ │ │ │ │ +2112 │ │ │ │ │ +2113 template │ │ │ │ │ +2114 inline typename VertexPropertiesGraph::VertexIterator │ │ │ │ │ +VertexPropertiesGraph::begin() │ │ │ │ │ +2115 { │ │ │ │ │ +2116 return VertexIterator(graph_.begin(), this); │ │ │ │ │ +2117 } │ │ │ │ │ +2118 │ │ │ │ │ +2119 template │ │ │ │ │ +2120 inline typename VertexPropertiesGraph::VertexIterator │ │ │ │ │ +VertexPropertiesGraph::end() │ │ │ │ │ +2121 { │ │ │ │ │ +2122 return VertexIterator(graph_.end()); │ │ │ │ │ +2123 } │ │ │ │ │ +2124 │ │ │ │ │ +2125 │ │ │ │ │ +2126 template │ │ │ │ │ +2127 inline typename VertexPropertiesGraph::ConstVertexIterator │ │ │ │ │ +VertexPropertiesGraph::begin() const │ │ │ │ │ +2128 { │ │ │ │ │ +2129 return ConstVertexIterator(graph_.begin(), this); │ │ │ │ │ +2130 } │ │ │ │ │ +2131 │ │ │ │ │ +2132 template │ │ │ │ │ +2133 inline typename VertexPropertiesGraph::ConstVertexIterator │ │ │ │ │ +VertexPropertiesGraph::end() const │ │ │ │ │ +2134 { │ │ │ │ │ +2135 return ConstVertexIterator(graph_.end()); │ │ │ │ │ +2136 } │ │ │ │ │ +2137 │ │ │ │ │ +2138 template │ │ │ │ │ +2139 inline V& VertexPropertiesGraph::getVertexProperties(const │ │ │ │ │ +VertexDescriptor& vertex) │ │ │ │ │ +2140 { │ │ │ │ │ +2141 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ +2142 } │ │ │ │ │ +2143 │ │ │ │ │ +2144 template │ │ │ │ │ +2145 inline const V& VertexPropertiesGraph::getVertexProperties(const │ │ │ │ │ +VertexDescriptor& vertex) const │ │ │ │ │ +2146 { │ │ │ │ │ +2147 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ +2148 } │ │ │ │ │ +2149 │ │ │ │ │ +2150 template │ │ │ │ │ +2151 inline const G& VertexPropertiesGraph::graph() const │ │ │ │ │ +2152 { │ │ │ │ │ +2153 return graph_; │ │ │ │ │ +2154 } │ │ │ │ │ +2155 │ │ │ │ │ +2156 template │ │ │ │ │ +2157 inline std::size_t VertexPropertiesGraph::noVertices() const │ │ │ │ │ +2158 { │ │ │ │ │ +2159 return graph_.noVertices(); │ │ │ │ │ +2160 } │ │ │ │ │ +2161 │ │ │ │ │ +2162 │ │ │ │ │ +2163 template │ │ │ │ │ +2164 inline typename VertexPropertiesGraph::VertexDescriptor │ │ │ │ │ +VertexPropertiesGraph::maxVertex() const │ │ │ │ │ +2165 { │ │ │ │ │ +2166 return graph_.maxVertex(); │ │ │ │ │ +2167 } │ │ │ │ │ +2168 │ │ │ │ │ +2169 template │ │ │ │ │ +2170 VertexPropertiesGraph::VertexPropertiesGraph(Graph& graph, const │ │ │ │ │ +VM vmap) │ │ │ │ │ +2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex │ │ │ │ │ +()+1], V()) │ │ │ │ │ +2172 {} │ │ │ │ │ +2173 │ │ │ │ │ +2174 template │ │ │ │ │ +2175 template │ │ │ │ │ +2176 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const │ │ │ │ │ +Father& iter, │ │ │ │ │ +2177 C* graph) │ │ │ │ │ +2178 : Father(iter), graph_(graph) │ │ │ │ │ +2179 {} │ │ │ │ │ +2180 │ │ │ │ │ +2181 template │ │ │ │ │ +2182 template │ │ │ │ │ +2183 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const │ │ │ │ │ +Father& iter) │ │ │ │ │ +2184 : Father(iter) │ │ │ │ │ +2185 {} │ │ │ │ │ +2186 │ │ │ │ │ +2187 template │ │ │ │ │ +2188 template │ │ │ │ │ +2189 template │ │ │ │ │ +2190 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const │ │ │ │ │ +EdgeIteratorT& other) │ │ │ │ │ +2191 : Father(other), graph_(other.graph_) │ │ │ │ │ +2192 {} │ │ │ │ │ +2193 │ │ │ │ │ +2194 │ │ │ │ │ +2195 template │ │ │ │ │ +2196 inline std::size_t PropertiesGraph::noEdges() const │ │ │ │ │ +2197 { │ │ │ │ │ +2198 return graph_.noEdges(); │ │ │ │ │ +2199 } │ │ │ │ │ +2200 │ │ │ │ │ +2201 template │ │ │ │ │ +2202 template │ │ │ │ │ +2203 inline typename std::conditional::type>::value,E&,const E&>::type │ │ │ │ │ +2204 PropertiesGraph::EdgeIteratorT::properties() const │ │ │ │ │ +2205 { │ │ │ │ │ +2206 return graph_->getEdgeProperties(Father::operator*()); │ │ │ │ │ +2207 } │ │ │ │ │ +2208 │ │ │ │ │ +2209 template │ │ │ │ │ +2210 inline typename PropertiesGraph::EdgeIterator │ │ │ │ │ +2211 PropertiesGraph::beginEdges(const VertexDescriptor& source) │ │ │ │ │ +2212 { │ │ │ │ │ +2213 return EdgeIterator(graph_.beginEdges(source), this); │ │ │ │ │ +2214 } │ │ │ │ │ +2215 │ │ │ │ │ +2216 template │ │ │ │ │ +2217 inline typename PropertiesGraph::EdgeIterator │ │ │ │ │ +2218 PropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ +2219 { │ │ │ │ │ +2220 return EdgeIterator(graph_.endEdges(source)); │ │ │ │ │ +2221 } │ │ │ │ │ +2222 │ │ │ │ │ +2223 template │ │ │ │ │ +2224 typename PropertiesGraph::ConstEdgeIterator │ │ │ │ │ +2225 inline PropertiesGraph::beginEdges(const VertexDescriptor& │ │ │ │ │ +source) const │ │ │ │ │ +2226 { │ │ │ │ │ +2227 return ConstEdgeIterator(graph_.beginEdges(source), this); │ │ │ │ │ +2228 } │ │ │ │ │ +2229 │ │ │ │ │ +2230 template │ │ │ │ │ +2231 typename PropertiesGraph::ConstEdgeIterator │ │ │ │ │ +2232 PropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ +const │ │ │ │ │ +2233 { │ │ │ │ │ +2234 return ConstEdgeIterator(graph_.endEdges(source)); │ │ │ │ │ +2235 } │ │ │ │ │ +2236 │ │ │ │ │ +2237 template │ │ │ │ │ +2238 template │ │ │ │ │ +2239 PropertiesGraph::VertexIteratorT │ │ │ │ │ +2240 ::VertexIteratorT(const Father& iter, │ │ │ │ │ +2241 C* graph) │ │ │ │ │ +2242 : Father(iter), graph_(graph) │ │ │ │ │ +2243 {} │ │ │ │ │ +2244 │ │ │ │ │ +2245 template │ │ │ │ │ +2246 template │ │ │ │ │ +2247 PropertiesGraph::VertexIteratorT │ │ │ │ │ +2248 ::VertexIteratorT(const Father& iter) │ │ │ │ │ +2249 : Father(iter) │ │ │ │ │ +2250 {} │ │ │ │ │ +2251 │ │ │ │ │ +2252 template │ │ │ │ │ +2253 template │ │ │ │ │ +2254 template │ │ │ │ │ +2255 PropertiesGraph::VertexIteratorT │ │ │ │ │ +2256 ::VertexIteratorT(const VertexIteratorT& other) │ │ │ │ │ +2257 : Father(other), graph_(other.graph_) │ │ │ │ │ +2258 {} │ │ │ │ │ +2259 │ │ │ │ │ +2260 template │ │ │ │ │ +2261 template │ │ │ │ │ +2262 inline typename std::conditional::type>::value, │ │ │ │ │ +2263 V&, const V&>::type │ │ │ │ │ +2264 PropertiesGraph::VertexIteratorT::properties() const │ │ │ │ │ +2265 { │ │ │ │ │ +2266 return graph_->getVertexProperties(Father::operator*()); │ │ │ │ │ +2267 } │ │ │ │ │ +2268 │ │ │ │ │ +2269 template │ │ │ │ │ +2270 template │ │ │ │ │ +2271 inline typename PropertiesGraph::template EdgeIteratorT │ │ │ │ │ +2272 PropertiesGraph::VertexIteratorT::begin() const │ │ │ │ │ +2273 { │ │ │ │ │ +2274 return graph_->beginEdges(Father::operator*()); │ │ │ │ │ +2275 } │ │ │ │ │ +2276 │ │ │ │ │ +2277 template │ │ │ │ │ +2278 template │ │ │ │ │ +2279 inline typename PropertiesGraph::template EdgeIteratorT │ │ │ │ │ +2280 PropertiesGraph::VertexIteratorT::end() const │ │ │ │ │ +2281 { │ │ │ │ │ +2282 return graph_->endEdges(Father::operator*()); │ │ │ │ │ +2283 } │ │ │ │ │ +2284 │ │ │ │ │ +2285 template │ │ │ │ │ +2286 inline typename PropertiesGraph::VertexIterator │ │ │ │ │ +PropertiesGraph::begin() │ │ │ │ │ +2287 { │ │ │ │ │ +2288 return VertexIterator(graph_.begin(), this); │ │ │ │ │ +2289 } │ │ │ │ │ +2290 │ │ │ │ │ +2291 template │ │ │ │ │ +2292 inline typename PropertiesGraph::VertexIterator │ │ │ │ │ +PropertiesGraph::end() │ │ │ │ │ +2293 { │ │ │ │ │ +2294 return VertexIterator(graph_.end()); │ │ │ │ │ +2295 } │ │ │ │ │ +2296 │ │ │ │ │ +2297 │ │ │ │ │ +2298 template │ │ │ │ │ +2299 inline typename PropertiesGraph::ConstVertexIterator │ │ │ │ │ +PropertiesGraph::begin() const │ │ │ │ │ +2300 { │ │ │ │ │ +2301 return ConstVertexIterator(graph_.begin(), this); │ │ │ │ │ +2302 } │ │ │ │ │ +2303 │ │ │ │ │ +2304 template │ │ │ │ │ +2305 inline typename PropertiesGraph::ConstVertexIterator │ │ │ │ │ +PropertiesGraph::end() const │ │ │ │ │ +2306 { │ │ │ │ │ +2307 return ConstVertexIterator(graph_.end()); │ │ │ │ │ +2308 } │ │ │ │ │ +2309 │ │ │ │ │ +2310 template │ │ │ │ │ +2311 inline V& PropertiesGraph::getVertexProperties(const │ │ │ │ │ +VertexDescriptor& vertex) │ │ │ │ │ +2312 { │ │ │ │ │ +2313 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ +2314 } │ │ │ │ │ +2315 │ │ │ │ │ +2316 template │ │ │ │ │ +2317 inline const V& PropertiesGraph::getVertexProperties(const │ │ │ │ │ +VertexDescriptor& vertex) const │ │ │ │ │ +2318 { │ │ │ │ │ +2319 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ +2320 } │ │ │ │ │ +2321 │ │ │ │ │ +2322 template │ │ │ │ │ +2323 inline E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ +EdgeDescriptor& edge) │ │ │ │ │ +2324 { │ │ │ │ │ +2325 return edgeProperties_[emap_[edge]]; │ │ │ │ │ +2326 } │ │ │ │ │ +2327 │ │ │ │ │ +2328 template │ │ │ │ │ +2329 inline const E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ +EdgeDescriptor& edge) const │ │ │ │ │ +2330 { │ │ │ │ │ +2331 return edgeProperties_[emap_[edge]]; │ │ │ │ │ +2332 } │ │ │ │ │ +2333 │ │ │ │ │ +2334 template │ │ │ │ │ +2335 inline E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ +VertexDescriptor& source, │ │ │ │ │ +2336 const VertexDescriptor& target) │ │ │ │ │ +2337 { │ │ │ │ │ +2338 return getEdgeProperties(graph_.findEdge(source,target)); │ │ │ │ │ +2339 } │ │ │ │ │ +2340 │ │ │ │ │ +2341 template │ │ │ │ │ +2342 inline const E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ +VertexDescriptor& source, │ │ │ │ │ +2343 const VertexDescriptor& target) const │ │ │ │ │ +2344 { │ │ │ │ │ +2345 return getEdgeProperties(graph_.findEdge(source,target)); │ │ │ │ │ +2346 } │ │ │ │ │ +2347 │ │ │ │ │ +2348 template │ │ │ │ │ +2349 inline const G& PropertiesGraph::graph() const │ │ │ │ │ +2350 { │ │ │ │ │ +2351 return graph_; │ │ │ │ │ +2352 } │ │ │ │ │ +2353 │ │ │ │ │ +2354 template │ │ │ │ │ +2355 inline std::size_t PropertiesGraph::noVertices() const │ │ │ │ │ +2356 { │ │ │ │ │ +2357 return graph_.noVertices(); │ │ │ │ │ +2358 } │ │ │ │ │ +2359 │ │ │ │ │ +2360 │ │ │ │ │ +2361 template │ │ │ │ │ +2362 inline typename PropertiesGraph::VertexDescriptor │ │ │ │ │ +PropertiesGraph::maxVertex() const │ │ │ │ │ +2363 { │ │ │ │ │ +2364 return graph_.maxVertex(); │ │ │ │ │ +2365 } │ │ │ │ │ +2366 │ │ │ │ │ +2367 template │ │ │ │ │ +2368 PropertiesGraph::PropertiesGraph(Graph& graph, const VM& │ │ │ │ │ +vmap, const EM& emap) │ │ │ │ │ +2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex │ │ │ │ │ +()+1], V()), │ │ │ │ │ +2370 emap_(emap), edgeProperties_(graph_.noEdges(), E()) │ │ │ │ │ +2371 {} │ │ │ │ │ +2372 │ │ │ │ │ +2373 template │ │ │ │ │ +2374 inline int _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(const G& graph, const typename G:: │ │ │ │ │ +VertexDescriptor& vertex, │ │ │ │ │ +2375 V& visitor) │ │ │ │ │ +2376 { │ │ │ │ │ +2377 typedef typename G::ConstEdgeIterator iterator; │ │ │ │ │ +2378 const iterator end = graph.endEdges(vertex); │ │ │ │ │ +2379 int noNeighbours=0; │ │ │ │ │ +2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge, │ │ │ │ │ +++noNeighbours) │ │ │ │ │ +2381 visitor(edge); │ │ │ │ │ +2382 return noNeighbours; │ │ │ │ │ +2383 } │ │ │ │ │ +2384 │ │ │ │ │ +2385#endif // DOXYGEN │ │ │ │ │ +2386 │ │ │ │ │ +2388 } │ │ │ │ │ +2389} │ │ │ │ │ +2390#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ +int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, │ │ │ │ │ +V &visitor) │ │ │ │ │ +Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ _s_t_d │ │ │ │ │ STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ -owner/overlap/copy sema... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -void operator++() │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename G::ConstEdgeIterator &edge) │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_n_u_m_b_e_r__ │ │ │ │ │ -Vertex number_ │ │ │ │ │ -DDeeffiinniittiioonn renumberer.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +The (undirected) graph of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +MatrixGraph(Matrix &matrix) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d │ │ │ │ │ +VertexIterator end() │ │ │ │ │ +Get an iterator over the vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ +VertexDescriptor maxVertex() const │ │ │ │ │ +Get the maximal vertex descriptor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_M_a_t_r_i_x │ │ │ │ │ +M Matrix │ │ │ │ │ +The type of the matrix we are a graph for. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n │ │ │ │ │ +ConstVertexIterator begin() const │ │ │ │ │ +Get an iterator over the vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator │ │ │ │ │ +The constant vertex iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:308 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_~_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +~MatrixGraph() │ │ │ │ │ +Destructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +std::ptrdiff_t EdgeDescriptor │ │ │ │ │ +The edge descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ +ConstEdgeIterator endEdges(const VertexDescriptor &source) const │ │ │ │ │ +Get an iterator over the edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +M::size_type VertexDescriptor │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_a_t_r_i_x │ │ │ │ │ +const Matrix & matrix() const │ │ │ │ │ +Get the underlying matrix. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_u_t_a_b_l_e_M_a_t_r_i_x │ │ │ │ │ +@ mutableMatrix │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ +ConstEdgeIterator beginEdges(const VertexDescriptor &source) const │ │ │ │ │ +Get an iterator over the edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d │ │ │ │ │ +ConstVertexIterator end() const │ │ │ │ │ +Get an iterator over the vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator │ │ │ │ │ +The constant edge iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:298 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ +EdgeIterator beginEdges(const VertexDescriptor &source) │ │ │ │ │ +Get an iterator over the edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ +std::size_t noVertices() const │ │ │ │ │ +Get the number of vertices in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_f_i_n_d_E_d_g_e │ │ │ │ │ +EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor │ │ │ │ │ +&target) const │ │ │ │ │ +Find the descriptor of an edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_W_e_i_g_h_t │ │ │ │ │ +M::block_type Weight │ │ │ │ │ +The type of the weights. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_M_u_t_a_b_l_e_M_a_t_r_i_x │ │ │ │ │ +std::remove_const< M >::type MutableMatrix │ │ │ │ │ +The mutable type of the matrix we are a graph for. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator │ │ │ │ │ +The mutable edge iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +VertexIteratorT< MatrixGraph< Matrix > > VertexIterator │ │ │ │ │ +The mutable vertex iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ +EdgeIterator endEdges(const VertexDescriptor &source) │ │ │ │ │ +Get an iterator over the edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ +std::size_t noEdges() const │ │ │ │ │ +Get the number of edges in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_a_t_r_i_x │ │ │ │ │ +Matrix & matrix() │ │ │ │ │ +Get the underlying matrix. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n │ │ │ │ │ +VertexIterator begin() │ │ │ │ │ +Get an iterator over the vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +Iterator over all edges starting from a vertex. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_W_e_i_g_h_t_T_y_p_e │ │ │ │ │ +std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >:: │ │ │ │ │ +value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >:: │ │ │ │ │ +type WeightType │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const │ │ │ │ │ +ColIterator &end, const EdgeDescriptor &edge) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_i_s_M_u_t_a_b_l_e │ │ │ │ │ +@ isMutable │ │ │ │ │ +whether C is mutable. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_t_a_r_g_e_t │ │ │ │ │ +VertexDescriptor target() const │ │ │ │ │ +The index of the target vertex of the current edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +EdgeIteratorT< C > & operator++() │ │ │ │ │ +preincrement operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >:: │ │ │ │ │ +type > &other) const │ │ │ │ │ +Inequality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const EdgeIteratorT< const typename std::remove_const< C >:: │ │ │ │ │ +type > &other) const │ │ │ │ │ +Equality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +EdgeIteratorT(const EdgeIteratorT< C1 > &other) │ │ │ │ │ +Copy Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type > │ │ │ │ │ +&other) const │ │ │ │ │ +Inequality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_w_e_i_g_h_t │ │ │ │ │ +WeightType & weight() const │ │ │ │ │ +Access the edge weight. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_s_o_u_r_c_e │ │ │ │ │ +VertexDescriptor source() const │ │ │ │ │ +The index of the source vertex of the current edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +std::conditional< isMutable &&C::mutableMatrix, typenameMatrix::row_type:: │ │ │ │ │ +Iterator, typenameMatrix::row_type::ConstIterator >::type ColIterator │ │ │ │ │ +The column iterator of the matrix we use. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_C_o_n_s_t_C_o_n_t_a_i_n_e_r │ │ │ │ │ +const std::remove_const< C >::type ConstContainer │ │ │ │ │ +The constant type of the container type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type > │ │ │ │ │ +&other) const │ │ │ │ │ +Equality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +EdgeIteratorT(const ColIterator &block) │ │ │ │ │ +Constructor for the end iterator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_W_e_i_g_h_t │ │ │ │ │ +std::conditional< isMutable &&C::mutableMatrix, typenameM::block_type, │ │ │ │ │ +consttypenameM::block_type >::type Weight │ │ │ │ │ +The matrix block type we use as weights. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +const EdgeDescriptor & operator*() const │ │ │ │ │ +Get the edge descriptor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ +const EdgeDescriptor * operator->() const │ │ │ │ │ +Get the edge descriptor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ │ +std::remove_const< C >::type MutableContainer │ │ │ │ │ +The mutable type of the container type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +The vertex iterator type of the graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_b_e_g_i_n │ │ │ │ │ +EdgeIteratorT< C > begin() const │ │ │ │ │ +Get an iterator over all edges starting at the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +const VertexDescriptor & operator*() const │ │ │ │ │ +Get the descriptor of the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_w_e_i_g_h_t │ │ │ │ │ +WeightType & weight() const │ │ │ │ │ +Access the weight of the vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +VertexIteratorT(C *graph, const VertexDescriptor ¤t) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_W_e_i_g_h_t_T_y_p_e │ │ │ │ │ +std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >:: │ │ │ │ │ +value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >:: │ │ │ │ │ +type WeightType │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +VertexIteratorT(const VertexIteratorT< MutableContainer > &other) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ │ +std::remove_const< C >::type MutableContainer │ │ │ │ │ +The mutable type of the container type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const VertexIteratorT< MutableContainer > &other) const │ │ │ │ │ +Inequality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_i_s_M_u_t_a_b_l_e │ │ │ │ │ +@ isMutable │ │ │ │ │ +whether C is mutable. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const VertexIteratorT< MutableContainer > &other) const │ │ │ │ │ +Equality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_C_o_n_s_t_C_o_n_t_a_i_n_e_r │ │ │ │ │ +const std::remove_const< C >::type ConstContainer │ │ │ │ │ +The constant type of the container type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +VertexIteratorT< C > & operator++() │ │ │ │ │ +Move to the next vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_e_n_d │ │ │ │ │ +EdgeIteratorT< C > end() const │ │ │ │ │ +Get an iterator over all edges starting at the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const VertexIteratorT< ConstContainer > &other) const │ │ │ │ │ +Equality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const VertexIteratorT< ConstContainer > &other) const │ │ │ │ │ +Inequality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +VertexIteratorT(const VertexDescriptor ¤t) │ │ │ │ │ +Constructor for the end iterator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ +A subgraph of a graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:443 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_f_i_n_d_E_d_g_e │ │ │ │ │ +EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor │ │ │ │ │ +&target) const │ │ │ │ │ +Find the descriptor of an edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ +VertexDescriptor maxVertex() const │ │ │ │ │ +Get the maximal vertex descriptor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_g_e_t_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +EdgeIndexMap getEdgeIndexMap() │ │ │ │ │ +Get an edge index map for the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ +std::size_t noEdges() const │ │ │ │ │ +Get the number of edges in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ +ConstEdgeIterator endEdges(const VertexDescriptor &source) const │ │ │ │ │ +Get an iterator over the edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_e_n_d │ │ │ │ │ +ConstVertexIterator end() const │ │ │ │ │ +Get an iterator over the vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ +ConstEdgeIterator beginEdges(const VertexDescriptor &source) const │ │ │ │ │ +Get an iterator over the edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ +std::size_t noVertices() const │ │ │ │ │ +Get the number of vertices in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_x_c_l_u_d_e_d │ │ │ │ │ +T Excluded │ │ │ │ │ +Random access container providing information about which vertices are │ │ │ │ │ +excluded. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:454 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_~_S_u_b_G_r_a_p_h │ │ │ │ │ +~SubGraph() │ │ │ │ │ +Destructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +EdgeIterator ConstEdgeIterator │ │ │ │ │ +The constant edge iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:618 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_G_r_a_p_h │ │ │ │ │ +G Graph │ │ │ │ │ +The type of the graph we are a sub graph for. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:448 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +VertexIterator ConstVertexIterator │ │ │ │ │ +The constant vertex iterator type. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:623 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ +SubGraph(const Graph &graph, const T &excluded) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_b_e_g_i_n │ │ │ │ │ +ConstVertexIterator begin() const │ │ │ │ │ +Get an iterator over the vertices. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:459 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +VertexDescriptor * EdgeDescriptor │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +An index map for mapping the edges to indices. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:470 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +EdgeIndexMap(const EdgeIndexMap &emap) │ │ │ │ │ +Protect copy construction. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:479 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +ReadablePropertyMapTag Category │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:472 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ +EdgeIndexMap(const EdgeDescriptor &firstEdge) │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:474 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +std::size_t operator[](const EdgeDescriptor &edge) const │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:483 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +The edge iterator of the graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:505 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +const EdgeDescriptor & dereference() const │ │ │ │ │ +The descriptor of the current edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +EdgeIterator(const EdgeDescriptor &edge) │ │ │ │ │ +Constructor for the end iterator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const EdgeIterator &other) const │ │ │ │ │ +Equality operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ +EdgeIterator & advance(std::ptrdiff_t n) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +EdgeIterator & increment() │ │ │ │ │ +Preincrement operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_t_a_r_g_e_t │ │ │ │ │ +const VertexDescriptor & target() const │ │ │ │ │ +The index of the target vertex of the current edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_s_o_u_r_c_e │ │ │ │ │ +const VertexDescriptor & source() const │ │ │ │ │ +The index of the source vertex of the current edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +EdgeIterator & decrement() │ │ │ │ │ +Preincrement operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +std::ptrdiff_t distanceTo(const EdgeIterator &other) const │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +The vertex iterator of the graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +VertexIterator(const VertexDescriptor ¤t) │ │ │ │ │ +Constructor for end iterator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +VertexIterator & increment() │ │ │ │ │ +Preincrement operator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +EdgeIterator begin() const │ │ │ │ │ +Get an iterator over all edges starting at the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const VertexIterator &other) const │ │ │ │ │ +Equality iterator. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor ¤t, │ │ │ │ │ +const VertexDescriptor &end) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_e_n_d │ │ │ │ │ +EdgeIterator end() const │ │ │ │ │ +Get an iterator over all edges starting at the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +const VertexDescriptor & dereference() const │ │ │ │ │ +Get the descriptor of the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +Attaches properties to the vertices of a graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:723 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_r_a_p_h │ │ │ │ │ +const Graph & graph() const │ │ │ │ │ +Get the graph the properties are attached to. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Graph::ConstEdgeIterator ConstEdgeIterator │ │ │ │ │ +The type of the constant edge iterator. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:766 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +VertexProperties & getVertexProperties(const VertexDescriptor &vertex) │ │ │ │ │ +Get the properties associated with a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ +std::size_t noEdges() const │ │ │ │ │ +Get the number of edges in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +Graph::EdgeDescriptor EdgeDescriptor │ │ │ │ │ +The edge descritor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:738 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ +ConstEdgeIterator endEdges(const VertexDescriptor &source) const │ │ │ │ │ +Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:733 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_G_r_a_p_h │ │ │ │ │ +G Graph │ │ │ │ │ +The graph we attach properties to. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:728 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_M_a_p │ │ │ │ │ +VM VertexMap │ │ │ │ │ +The type of the map for converting the VertexDescriptor to std::size_t. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:756 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ +EdgeIterator endEdges(const VertexDescriptor &source) │ │ │ │ │ +Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ +EdgeIterator beginEdges(const VertexDescriptor &source) │ │ │ │ │ +Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +VP VertexProperties │ │ │ │ │ +The type of the properties of the vertices. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:743 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ +std::size_t noVertices() const │ │ │ │ │ +Get the number of vertices in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ +ConstEdgeIterator beginEdges(const VertexDescriptor &source) const │ │ │ │ │ +Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ +VertexDescriptor maxVertex() const │ │ │ │ │ +Get the maximal vertex descriptor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Graph::EdgeIterator EdgeIterator │ │ │ │ │ +The type of the mutable edge iterator. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:761 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:803 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ +value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type │ │ │ │ │ +EdgeIterator │ │ │ │ │ +The class of the edge iterator. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:823 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_p_r_o_p_e_r_t_i_e_s │ │ │ │ │ +std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >:: │ │ │ │ │ +value, VertexProperties &, constVertexProperties & >::type properties() const │ │ │ │ │ +Get the properties of the current Vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_e_n_d │ │ │ │ │ +EdgeIterator end() const │ │ │ │ │ +Get an iterator over the edges starting from the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_F_a_t_h_e_r │ │ │ │ │ +std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ +value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >:: │ │ │ │ │ +type Father │ │ │ │ │ +The father class. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:814 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_b_e_g_i_n │ │ │ │ │ +EdgeIterator begin() const │ │ │ │ │ +Get an iterator over the edges starting from the current vertex. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +Attaches properties to the edges and vertices of a graph. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ +std::size_t noVertices() const │ │ │ │ │ +Get the number of vertices in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +Graph::EdgeDescriptor EdgeDescriptor │ │ │ │ │ +The edge descritor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:993 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const │ │ │ │ │ +VertexDescriptor &target) const │ │ │ │ │ +Get the properties associated with a edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const │ │ │ │ │ +Get the properties associated with a edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_r_a_p_h │ │ │ │ │ +const Graph & graph() const │ │ │ │ │ +Get the graph the properties are attached to. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ +VertexDescriptor maxVertex() const │ │ │ │ │ +Get the maximal vertex descriptor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_G_r_a_p_h │ │ │ │ │ +G Graph │ │ │ │ │ +The graph we attach properties to. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:983 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_M_a_p │ │ │ │ │ +EM EdgeMap │ │ │ │ │ +The type of the map for converting the EdgeDescriptor to std::size_t. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1030 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_M_a_p │ │ │ │ │ +VM VertexMap │ │ │ │ │ +The type of the map for converting the VertexDescriptor to std::size_t. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1011 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +VP VertexProperties │ │ │ │ │ +The type of the properties of the vertices. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:998 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ +std::size_t noEdges() const │ │ │ │ │ +Get the number of edges in the graph. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +EP EdgeProperties │ │ │ │ │ +The type of the properties of the edges;. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1016 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const │ │ │ │ │ +VertexDescriptor &target) │ │ │ │ │ +Get the properties associated with a edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) │ │ │ │ │ +Get the properties associated with a edge. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:988 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ +PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap │ │ │ │ │ +&emap=EdgeMap()) │ │ │ │ │ +Constructor. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1038 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_F_a_t_h_e_r │ │ │ │ │ +std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ +value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type │ │ │ │ │ +Father │ │ │ │ │ +The father class. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1050 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1140 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_F_a_t_h_e_r │ │ │ │ │ +std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ +value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >:: │ │ │ │ │ +type Father │ │ │ │ │ +The father class. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1151 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +Wrapper to access the internal edge properties of a graph via operator[]() │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1361 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +GraphVertexPropertiesSelector(G &g) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1380 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +VertexProperties & operator[](const Vertex &vertex) const │ │ │ │ │ +Get the properties associated to a vertex. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1395 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h │ │ │ │ │ +G Graph │ │ │ │ │ +The type of the graph with internal properties. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1366 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +G::VertexProperties VertexProperties │ │ │ │ │ +The type of the vertex properties. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1370 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +GraphVertexPropertiesSelector() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1386 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_V_e_r_t_e_x │ │ │ │ │ +G::VertexDescriptor Vertex │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1374 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +Wrapper to access the internal vertex properties of a graph via operator[]() │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1409 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +EdgeProperties & operator[](const Edge &edge) const │ │ │ │ │ +Get the properties associated to a vertex. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1442 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +G::EdgeProperties EdgeProperties │ │ │ │ │ +The type of the vertex properties. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1418 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_E_d_g_e │ │ │ │ │ +G::EdgeDescriptor Edge │ │ │ │ │ +The edge descriptor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1422 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +GraphEdgePropertiesSelector() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1434 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h │ │ │ │ │ +G Graph │ │ │ │ │ +The type of the graph with internal properties. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1414 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ +GraphEdgePropertiesSelector(G &g) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:1428 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00092.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: transfer.hh File Reference │ │ │ │ +dune-istl: twolevelmethod.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,47 +72,51 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Prolongation and restriction for amg. │ │ │ │ +

Algebraic twolevel methods. │ │ │ │ More...

│ │ │ │ -
#include <dune/istl/bvector.hh>
│ │ │ │ -#include <dune/istl/matrixredistribute.hh>
│ │ │ │ -#include <dune/istl/paamg/pinfo.hh>
│ │ │ │ -#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ -#include <dune/istl/paamg/aggregates.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <dune/istl/operators.hh>
│ │ │ │ +#include "amg.hh"
│ │ │ │ +#include "galerkin.hh"
│ │ │ │ +#include <dune/istl/solver.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::Transfer< V1, V2, T >
class  Dune::Amg::LevelTransferPolicy< FO, CO >
 Abstract base class for transfer between levels and creation of the coarse level system. More...
 
class  Dune::Amg::Transfer< V, V1, SequentialInformation >
class  Dune::Amg::AggregationLevelTransferPolicy< O, C >
 A LeveTransferPolicy that used aggregation to construct the coarse level system. More...
 
class  Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > >
class  Dune::Amg::OneStepAMGCoarseSolverPolicy< O, S, C >
 A policy class for solving the coarse level system using one step of AMG. More...
 
class  Dune::Amg::TwoLevelMethod< FO, CSP, S >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │

Detailed Description

│ │ │ │ -

Prolongation and restriction for amg.

│ │ │ │ +

Algebraic twolevel methods.

│ │ │ │
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,36 +2,43 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -transfer.hh File Reference │ │ │ │ │ +twolevelmethod.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Prolongation and restriction for amg. _M_o_r_e_._._. │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ -#include │ │ │ │ │ +Algebraic twolevel methods. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +#include "_a_m_g_._h_h" │ │ │ │ │ +#include "_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_1_,_ _V_2_,_ _T_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y_<_ _F_O_,_ _C_O_ _> │ │ │ │ │ +  Abstract base class for transfer between levels and creation of the │ │ │ │ │ + coarse level system. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y_<_ _O_,_ _C_ _> │ │ │ │ │ +  A LeveTransferPolicy that used aggregation to construct the coarse │ │ │ │ │ + level system. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_O_n_e_S_t_e_p_A_M_G_C_o_a_r_s_e_S_o_l_v_e_r_P_o_l_i_c_y_<_ _O_,_ _S_,_ _C_ _> │ │ │ │ │ +  A policy class for solving the coarse level system using one step of │ │ │ │ │ + _A_M_G. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_T_w_o_L_e_v_e_l_M_e_t_h_o_d_<_ _F_O_,_ _C_S_P_,_ _S_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Prolongation and restriction for amg. │ │ │ │ │ +Algebraic twolevel methods. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: transfer.hh Source File │ │ │ │ +dune-istl: twolevelmethod.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,246 +74,478 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
transfer.hh
│ │ │ │ +
twolevelmethod.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMGTRANSFER_HH
│ │ │ │ -
6#define DUNE_AMGTRANSFER_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH
│ │ │ │ +
6#define DUNE_ISTL_TWOLEVELMETHOD_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
13#include <dune/common/exceptions.hh>
│ │ │ │ +
8#include <tuple>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ +
11#include"amg.hh"
│ │ │ │ +
12#include"galerkin.hh"
│ │ │ │ +
13#include<dune/istl/solver.hh>
│ │ │ │
14
│ │ │ │ -
15namespace Dune
│ │ │ │ -
16{
│ │ │ │ -
17 namespace Amg
│ │ │ │ -
18 {
│ │ │ │ -
19
│ │ │ │ -
30 template<class V1, class V2, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
32 {
│ │ │ │ -
33
│ │ │ │ -
34 public:
│ │ │ │ -
35 typedef V1 Vertex;
│ │ │ │ -
36 typedef V2 Vector;
│ │ │ │ -
37
│ │ │ │ -
38 template<typename T1, typename R>
│ │ │ │ -
39 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ -
40 Vector& fineRedist,T1 damp, R& redistributor=R());
│ │ │ │ -
41
│ │ │ │ -
42 template<typename T1, typename R>
│ │ │ │ -
43 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ -
44 T1 damp);
│ │ │ │ -
45
│ │ │ │ -
46 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
│ │ │ │ -
47 T& comm);
│ │ │ │ -
48 };
│ │ │ │ -
│ │ │ │ -
49
│ │ │ │ -
50 template<class V,class V1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
52 {
│ │ │ │ -
53 public:
│ │ │ │ -
54 typedef V Vertex;
│ │ │ │ -
55 typedef V1 Vector;
│ │ │ │ - │ │ │ │ -
57 template<typename T1>
│ │ │ │ -
58 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ -
59 Vector& fineRedist, T1 damp,
│ │ │ │ - │ │ │ │ -
61 const Redist& redist=Redist());
│ │ │ │ -
62 template<typename T1>
│ │ │ │ -
63 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ -
64 T1 damp,
│ │ │ │ - │ │ │ │ -
66
│ │ │ │ -
67
│ │ │ │ -
68 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
│ │ │ │ -
69 const SequentialInformation& comm);
│ │ │ │ -
70 };
│ │ │ │ -
│ │ │ │ -
71
│ │ │ │ -
72#if HAVE_MPI
│ │ │ │ -
73
│ │ │ │ -
74 template<class V,class V1, class T1, class T2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
76 {
│ │ │ │ -
77 public:
│ │ │ │ -
78 typedef V Vertex;
│ │ │ │ -
79 typedef V1 Vector;
│ │ │ │ - │ │ │ │ -
81 template<typename T3>
│ │ │ │ -
82 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ -
83 Vector& fineRedist, T3 damp, OwnerOverlapCopyCommunication<T1,T2>& comm,
│ │ │ │ -
84 const Redist& redist);
│ │ │ │ -
85 template<typename T3>
│ │ │ │ -
86 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ - │ │ │ │ -
88
│ │ │ │ -
89 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
│ │ │ │ - │ │ │ │ -
91 };
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
93#endif
│ │ │ │ -
94
│ │ │ │ -
95 template<class V, class V1>
│ │ │ │ -
96 template<typename T>
│ │ │ │ -
97 inline void
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
99 Vector& coarse, Vector& fine,
│ │ │ │ -
100 [[maybe_unused]] Vector& fineRedist,
│ │ │ │ -
101 T damp,
│ │ │ │ -
102 [[maybe_unused]] const SequentialInformation& comm,
│ │ │ │ -
103 [[maybe_unused]] const Redist& redist)
│ │ │ │ -
104 {
│ │ │ │ -
105 prolongateVector(aggregates, coarse, fine, damp);
│ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ -
107 template<class V, class V1>
│ │ │ │ -
108 template<typename T>
│ │ │ │ -
109 inline void
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
111 Vector& coarse, Vector& fine,
│ │ │ │ -
112 T damp,
│ │ │ │ -
113 [[maybe_unused]] const SequentialInformation& comm)
│ │ │ │ -
114 {
│ │ │ │ -
115 typedef typename Vector::iterator Iterator;
│ │ │ │ -
116
│ │ │ │ -
117 Iterator end = coarse.end();
│ │ │ │ -
118 Iterator begin= coarse.begin();
│ │ │ │ -
119 for(; begin!=end; ++begin)
│ │ │ │ -
120 *begin*=damp;
│ │ │ │ -
121 end=fine.end();
│ │ │ │ -
122 begin=fine.begin();
│ │ │ │ -
123
│ │ │ │ -
124 for(Iterator block=begin; block != end; ++block) {
│ │ │ │ -
125 std::ptrdiff_t index=block-begin;
│ │ │ │ -
126 const Vertex& vertex = aggregates[index];
│ │ │ │ - │ │ │ │ -
128 *block += coarse[aggregates[index]];
│ │ │ │ -
129 }
│ │ │ │ -
130 }
│ │ │ │ -
│ │ │ │ -
131
│ │ │ │ -
132 template<class V, class V1>
│ │ │ │ -
133 inline void
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
135 Vector& coarse,
│ │ │ │ -
136 const Vector& fine,
│ │ │ │ -
137 [[maybe_unused]] const SequentialInformation& comm)
│ │ │ │ -
138 {
│ │ │ │ -
139 // Set coarse vector to zero
│ │ │ │ -
140 coarse=0;
│ │ │ │ -
141
│ │ │ │ -
142 typedef typename Vector::const_iterator Iterator;
│ │ │ │ -
143 Iterator end = fine.end();
│ │ │ │ -
144 Iterator begin=fine.begin();
│ │ │ │ -
145
│ │ │ │ -
146 for(Iterator block=begin; block != end; ++block) {
│ │ │ │ -
147 const Vertex& vertex = aggregates[block-begin];
│ │ │ │ - │ │ │ │ -
149 coarse[vertex] += *block;
│ │ │ │ -
150 }
│ │ │ │ -
151 }
│ │ │ │ -
│ │ │ │ -
152
│ │ │ │ -
153#if HAVE_MPI
│ │ │ │ -
154 template<class V, class V1, class T1, class T2>
│ │ │ │ -
155 template<typename T3>
│ │ │ │ -
│ │ │ │ -
156 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::prolongateVector(const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
157 Vector& coarse, Vector& fine,
│ │ │ │ -
158 Vector& fineRedist, T3 damp,
│ │ │ │ - │ │ │ │ -
160 const Redist& redist)
│ │ │ │ -
161 {
│ │ │ │ -
162 if(fineRedist.size()>0)
│ │ │ │ -
163 // we operated on the coarse level
│ │ │ │ -
164 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fineRedist, damp);
│ │ │ │ -
165
│ │ │ │ -
166 // TODO This could be accomplished with one communication, too!
│ │ │ │ -
167 redist.redistributeBackward(fine, fineRedist);
│ │ │ │ -
168 comm.copyOwnerToAll(fine,fine);
│ │ │ │ -
169 }
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
171 template<class V, class V1, class T1, class T2>
│ │ │ │ -
172 template<typename T3>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
174 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
175 Vector& coarse, Vector& fine, T3 damp,
│ │ │ │ -
176 [[maybe_unused]] OwnerOverlapCopyCommunication<T1,T2>& comm)
│ │ │ │ -
177 {
│ │ │ │ -
178 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fine, damp);
│ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
180 template<class V, class V1, class T1, class T2>
│ │ │ │ -
│ │ │ │ -
181 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::restrictVector(const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
182 Vector& coarse, const Vector& fine,
│ │ │ │ - │ │ │ │ -
184 {
│ │ │ │ - │ │ │ │ -
186 // We need this here to avoid it in the smoothers on the coarse level.
│ │ │ │ -
187 // There (in the preconditioner d is const.
│ │ │ │ -
188 comm.project(coarse);
│ │ │ │ -
189 }
│ │ │ │ -
│ │ │ │ -
190#endif
│ │ │ │ -
192 } // namspace Amg
│ │ │ │ -
193} // namspace Dune
│ │ │ │ -
194#endif
│ │ │ │ -
Provides classes for the Coloring process of AMG.
│ │ │ │ - │ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Functionality for redistributing a sparse matrix.
│ │ │ │ -
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ +
22namespace Dune
│ │ │ │ +
23{
│ │ │ │ +
24namespace Amg
│ │ │ │ +
25{
│ │ │ │ +
26
│ │ │ │ +
36template<class FO, class CO>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
38{
│ │ │ │ +
39public:
│ │ │ │ +
44 typedef FO FineOperatorType;
│ │ │ │ +
48 typedef typename FineOperatorType::range_type FineRangeType;
│ │ │ │ +
52 typedef typename FineOperatorType::domain_type FineDomainType;
│ │ │ │ + │ │ │ │ +
61 typedef typename CoarseOperatorType::range_type CoarseRangeType;
│ │ │ │ +
65 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
│ │ │ │ +
│ │ │ │ +
70 std::shared_ptr<CoarseOperatorType>& getCoarseLevelOperator()
│ │ │ │ +
71 {
│ │ │ │ +
72 return operator_;
│ │ │ │ +
73 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
79 {
│ │ │ │ +
80 return rhs_;
│ │ │ │ +
81 }
│ │ │ │ +
│ │ │ │ +
82
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
88 {
│ │ │ │ +
89 return lhs_;
│ │ │ │ +
90 }
│ │ │ │ +
│ │ │ │ +
100 virtual void moveToCoarseLevel(const FineRangeType& fineRhs)=0;
│ │ │ │ +
110 virtual void moveToFineLevel(FineDomainType& fineLhs)=0;
│ │ │ │ +
118 virtual void createCoarseLevelSystem(const FineOperatorType& fineOperator)=0;
│ │ │ │ +
119
│ │ │ │ +
121 virtual LevelTransferPolicy* clone() const =0;
│ │ │ │ +
122
│ │ │ │ + │ │ │ │ +
125
│ │ │ │ +
126 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
132 std::shared_ptr<CoarseOperatorType> operator_;
│ │ │ │ +
133};
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
140template<class O, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
142 : public LevelTransferPolicy<O,O>
│ │ │ │ +
143{
│ │ │ │ + │ │ │ │ +
145public:
│ │ │ │ + │ │ │ │ +
147 typedef C Criterion;
│ │ │ │ + │ │ │ │ +
149
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
151 : criterion_(crit)
│ │ │ │ +
152 {}
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
│ │ │ │ +
154 void createCoarseLevelSystem(const O& fineOperator)
│ │ │ │ +
155 {
│ │ │ │ +
156 prolongDamp_ = criterion_.getProlongationDampingFactor();
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
160 Dune::Amg::EdgeProperties,Dune::IdentityMap,Dune::IdentityMap> PropertiesGraph;
│ │ │ │ +
161 MatrixGraph mg(fineOperator.getmat());
│ │ │ │ +
162 PropertiesGraph pg(mg,Dune::IdentityMap(),Dune::IdentityMap());
│ │ │ │ +
163 typedef NegateSet<typename ParallelInformation::OwnerSet> OverlapFlags;
│ │ │ │ +
164
│ │ │ │ +
165 aggregatesMap_ = std::make_shared<AggregatesMap>(pg.maxVertex()+1);
│ │ │ │ +
166
│ │ │ │ +
167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
│ │ │ │ +
168
│ │ │ │ +
169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
│ │ │ │ +
170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, true);
│ │ │ │ +
171 std::cout<<"no aggregates="<<noAggregates<<" iso="<<isoAggregates<<" one="<<oneAggregates<<" skipped="<<skippedAggregates<<std::endl;
│ │ │ │ +
172 // misuse coarsener to renumber aggregates
│ │ │ │ + │ │ │ │ +
174 typedef std::vector<bool>::iterator Iterator;
│ │ │ │ +
175 typedef Dune::IteratorPropertyMap<Iterator, Dune::IdentityMap> VisitedMap;
│ │ │ │ +
176 std::vector<bool> excluded(fineOperator.getmat().N(), false);
│ │ │ │ +
177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());
│ │ │ │ + │ │ │ │ +
179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,
│ │ │ │ +
180 *aggregatesMap_, pinfo,
│ │ │ │ +
181 noAggregates);
│ │ │ │ +
182 std::vector<bool>& visited=excluded;
│ │ │ │ +
183
│ │ │ │ +
184 typedef std::vector<bool>::iterator Iterator;
│ │ │ │ +
185
│ │ │ │ +
186 for(Iterator iter= visited.begin(), end=visited.end();
│ │ │ │ +
187 iter != end; ++iter)
│ │ │ │ +
188 *iter=false;
│ │ │ │ +
189 matrix_.reset(productBuilder.build(mg, vm,
│ │ │ │ + │ │ │ │ +
191 *aggregatesMap_,
│ │ │ │ +
192 aggregates,
│ │ │ │ +
193 OverlapFlags()));
│ │ │ │ +
194 productBuilder.calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
│ │ │ │ +
195 this->lhs_.resize(this->matrix_->M());
│ │ │ │ +
196 this->rhs_.resize(this->matrix_->N());
│ │ │ │ +
197 this->operator_ = std::make_shared<O>(*matrix_);
│ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │ +
199
│ │ │ │ +
│ │ │ │ +
200 void moveToCoarseLevel(const typename FatherType::FineRangeType& fineRhs)
│ │ │ │ +
201 {
│ │ │ │ + │ │ │ │ +
203 ::restrictVector(*aggregatesMap_, this->rhs_, fineRhs, ParallelInformation());
│ │ │ │ +
204 this->lhs_=0;
│ │ │ │ +
205 }
│ │ │ │ +
│ │ │ │ +
206
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
208 {
│ │ │ │ + │ │ │ │ +
210 ::prolongateVector(*aggregatesMap_, this->lhs_, fineLhs,
│ │ │ │ +
211 prolongDamp_, ParallelInformation());
│ │ │ │ +
212 }
│ │ │ │ +
│ │ │ │ +
213
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
215 {
│ │ │ │ +
216 return new AggregationLevelTransferPolicy(*this);
│ │ │ │ +
217 }
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │ +
219private:
│ │ │ │ +
220 typename O::matrix_type::field_type prolongDamp_;
│ │ │ │ +
221 std::shared_ptr<AggregatesMap> aggregatesMap_;
│ │ │ │ +
222 Criterion criterion_;
│ │ │ │ +
223 std::shared_ptr<typename O::matrix_type> matrix_;
│ │ │ │ +
224};
│ │ │ │ +
│ │ │ │ +
225
│ │ │ │ +
232template<class O, class S, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
234{
│ │ │ │ +
235public:
│ │ │ │ +
237 typedef O Operator;
│ │ │ │ +
239 typedef typename O::range_type X;
│ │ │ │ +
241 typedef C Criterion;
│ │ │ │ +
243 typedef S Smoother;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
254 : smootherArgs_(args), criterion_(c)
│ │ │ │ +
255 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
258 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
│ │ │ │ +
259 criterion_(other.criterion_)
│ │ │ │ +
260 {}
│ │ │ │ +
│ │ │ │ +
261private:
│ │ │ │ +
268 struct AMGInverseOperator : public InverseOperator<X,X>
│ │ │ │ +
269 {
│ │ │ │ +
270 AMGInverseOperator(const typename AMGType::Operator& op,
│ │ │ │ +
271 const Criterion& crit,
│ │ │ │ +
272 const typename AMGType::SmootherArgs& args)
│ │ │ │ +
273 : amg_(op, crit,args), first_(true)
│ │ │ │ +
274 {}
│ │ │ │ +
275
│ │ │ │ +
276 void apply(X& x, X& b, [[maybe_unused]] double reduction, [[maybe_unused]] InverseOperatorResult& res)
│ │ │ │ +
277 {
│ │ │ │ +
278 if(first_)
│ │ │ │ +
279 {
│ │ │ │ +
280 amg_.pre(x,b);
│ │ │ │ +
281 first_=false;
│ │ │ │ +
282 x_=x;
│ │ │ │ +
283 }
│ │ │ │ +
284 amg_.apply(x,b);
│ │ │ │ +
285 }
│ │ │ │ +
286
│ │ │ │ +
287 void apply(X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
288 {
│ │ │ │ +
289 return apply(x,b,1e-8,res);
│ │ │ │ +
290 }
│ │ │ │ +
291
│ │ │ │ +
293 virtual SolverCategory::Category category() const
│ │ │ │ +
294 {
│ │ │ │ +
295 return amg_.category();
│ │ │ │ +
296 }
│ │ │ │ +
297
│ │ │ │ +
298 ~AMGInverseOperator()
│ │ │ │ +
299 {
│ │ │ │ +
300 if(!first_)
│ │ │ │ +
301 amg_.post(x_);
│ │ │ │ +
302 }
│ │ │ │ +
303 AMGInverseOperator(const AMGInverseOperator& other)
│ │ │ │ +
304 : x_(other.x_), amg_(other.amg_), first_(other.first_)
│ │ │ │ +
305 {
│ │ │ │ +
306 }
│ │ │ │ +
307 private:
│ │ │ │ +
308 X x_;
│ │ │ │ +
309 AMGType amg_;
│ │ │ │ +
310 bool first_;
│ │ │ │ +
311 };
│ │ │ │ +
312
│ │ │ │ +
313public:
│ │ │ │ +
315 typedef AMGInverseOperator CoarseLevelSolver;
│ │ │ │ +
316
│ │ │ │ +
324 template<class P>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
326 {
│ │ │ │ +
327 coarseOperator_=transferPolicy.getCoarseLevelOperator();
│ │ │ │ +
328 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,
│ │ │ │ +
329 criterion_,
│ │ │ │ +
330 smootherArgs_);
│ │ │ │ +
331
│ │ │ │ +
332 return inv; //std::shared_ptr<InverseOperator<X,X> >(inv);
│ │ │ │ +
333
│ │ │ │ +
334 }
│ │ │ │ +
│ │ │ │ +
335
│ │ │ │ +
336private:
│ │ │ │ +
338 std::shared_ptr<Operator> coarseOperator_;
│ │ │ │ +
340 SmootherArgs smootherArgs_;
│ │ │ │ +
342 Criterion criterion_;
│ │ │ │ +
343};
│ │ │ │ +
│ │ │ │ +
344
│ │ │ │ +
350template<class FO, class CSP, class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
352 public Preconditioner<typename FO::domain_type, typename FO::range_type>
│ │ │ │ +
353{
│ │ │ │ +
354public:
│ │ │ │ + │ │ │ │ +
358 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver;
│ │ │ │ + │ │ │ │ +
367 typedef typename FineOperatorType::range_type FineRangeType;
│ │ │ │ +
371 typedef typename FineOperatorType::domain_type FineDomainType;
│ │ │ │ +
376 typedef typename CSP::Operator CoarseOperatorType;
│ │ │ │ +
380 typedef typename CoarseOperatorType::range_type CoarseRangeType;
│ │ │ │ +
384 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
│ │ │ │ +
388 typedef S SmootherType;
│ │ │ │ +
389
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
405 std::shared_ptr<SmootherType> smoother,
│ │ │ │ + │ │ │ │ +
407 CoarseOperatorType>& policy,
│ │ │ │ +
408 CoarseLevelSolverPolicy& coarsePolicy,
│ │ │ │ +
409 std::size_t preSteps=1, std::size_t postSteps=1)
│ │ │ │ +
410 : operator_(&op), smoother_(smoother),
│ │ │ │ +
411 preSteps_(preSteps), postSteps_(postSteps)
│ │ │ │ +
412 {
│ │ │ │ +
413 policy_ = policy.clone();
│ │ │ │ +
414 policy_->createCoarseLevelSystem(*operator_);
│ │ │ │ +
415 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
│ │ │ │ +
416 }
│ │ │ │ +
│ │ │ │ +
417
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
419 : operator_(other.operator_), coarseSolver_(new CoarseLevelSolver(*other.coarseSolver_)),
│ │ │ │ +
420 smoother_(other.smoother_), policy_(other.policy_->clone()),
│ │ │ │ +
421 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
│ │ │ │ +
422 {}
│ │ │ │ +
│ │ │ │ +
423
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
425 {
│ │ │ │ +
426 // Each instance has its own policy.
│ │ │ │ +
427 delete policy_;
│ │ │ │ +
428 delete coarseSolver_;
│ │ │ │ +
429 }
│ │ │ │ +
│ │ │ │ +
430
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
432 {
│ │ │ │ +
433 smoother_->pre(x,b);
│ │ │ │ +
434 }
│ │ │ │ +
│ │ │ │ +
435
│ │ │ │ +
│ │ │ │ +
436 void post([[maybe_unused]] FineDomainType& x)
│ │ │ │ +
437 {}
│ │ │ │ +
│ │ │ │ +
438
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
440 {
│ │ │ │ +
441 FineDomainType u(v);
│ │ │ │ +
442 FineRangeType rhs(d);
│ │ │ │ +
443 LevelContext context;
│ │ │ │ + │ │ │ │ +
445 context.pinfo=&info;
│ │ │ │ +
446 context.lhs=&u;
│ │ │ │ +
447 context.update=&v;
│ │ │ │ +
448 context.smoother=smoother_;
│ │ │ │ +
449 context.rhs=&rhs;
│ │ │ │ +
450 context.matrix=operator_;
│ │ │ │ +
451 // Presmoothing
│ │ │ │ +
452 presmooth(context, preSteps_);
│ │ │ │ +
453 //Coarse grid correction
│ │ │ │ +
454 policy_->moveToCoarseLevel(*context.rhs);
│ │ │ │ + │ │ │ │ +
456 coarseSolver_->apply(policy_->getCoarseLevelLhs(), policy_->getCoarseLevelRhs(), res);
│ │ │ │ +
457 *context.lhs=0;
│ │ │ │ +
458 policy_->moveToFineLevel(*context.lhs);
│ │ │ │ +
459 *context.update += *context.lhs;
│ │ │ │ +
460 // Postsmoothing
│ │ │ │ +
461 postsmooth(context, postSteps_);
│ │ │ │ +
462
│ │ │ │ +
463 }
│ │ │ │ +
│ │ │ │ +
464
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
467 {
│ │ │ │ + │ │ │ │ +
469 }
│ │ │ │ +
│ │ │ │ +
470
│ │ │ │ +
471private:
│ │ │ │ +
475 struct LevelContext
│ │ │ │ +
476 {
│ │ │ │ +
478 typedef S SmootherType;
│ │ │ │ +
480 std::shared_ptr<SmootherType> smoother;
│ │ │ │ +
482 FineDomainType* lhs;
│ │ │ │ +
483 /*
│ │ │ │ +
484 * @brief The right hand side holding the current residual.
│ │ │ │ +
485 *
│ │ │ │ +
486 * This is passed to the smoother as the right hand side.
│ │ │ │ +
487 */
│ │ │ │ +
488 FineRangeType* rhs;
│ │ │ │ +
494 FineDomainType* update;
│ │ │ │ + │ │ │ │ +
502 const FineOperatorType* matrix;
│ │ │ │ +
503 };
│ │ │ │ +
504 const FineOperatorType* operator_;
│ │ │ │ +
506 CoarseLevelSolver* coarseSolver_;
│ │ │ │ +
508 std::shared_ptr<S> smoother_;
│ │ │ │ +
510 LevelTransferPolicy<FO,typename CSP::Operator>* policy_;
│ │ │ │ +
512 std::size_t preSteps_;
│ │ │ │ +
514 std::size_t postSteps_;
│ │ │ │ +
515};
│ │ │ │ +
│ │ │ │ +
516}// end namespace Amg
│ │ │ │ +
517}// end namespace Dune
│ │ │ │ +
518
│ │ │ │ +
520#endif
│ │ │ │ +
Provides a class for building the galerkin product based on a aggregation scheme.
│ │ │ │ +
The AMG preconditioner.
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
Define general, extensible interface for inverse operators.
│ │ │ │ +
G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation &pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::Matrix::size_type &size, const Set &copy)
Calculates the coarse matrix via a Galerkin product.
Definition galerkin.hh:563
│ │ │ │ +
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition amg.hh:100
│ │ │ │ +
Operator Operator
The matrix operator type.
Definition amg.hh:73
│ │ │ │ +
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ +
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ +
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
Calculate the galerkin product.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Definition matrixredistribute.hh:22
│ │ │ │ -
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:32
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition owneroverlapcopy.hh:538
│ │ │ │ -
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
Parallel algebraic multigrid based on agglomeration.
Definition amg.hh:65
│ │ │ │ +
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ +
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ +
Definition galerkin.hh:118
│ │ │ │ +
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ +
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ +
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ +
Definition indicescoarsener.hh:36
│ │ │ │
Definition pinfo.hh:28
│ │ │ │ +
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │
Definition transfer.hh:32
│ │ │ │ -
static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, const Vector &fine, T &comm)
│ │ │ │ -
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp)
│ │ │ │ -
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())
│ │ │ │ -
V1 Vertex
Definition transfer.hh:35
│ │ │ │ -
V2 Vector
Definition transfer.hh:36
│ │ │ │ -
RedistributeInformation< SequentialInformation > Redist
Definition transfer.hh:56
│ │ │ │ - │ │ │ │ - │ │ │ │ -
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation &comm=SequentialInformation(), const Redist &redist=Redist())
│ │ │ │ -
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp, const SequentialInformation &comm=SequentialInformation())
│ │ │ │ - │ │ │ │ -
RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist
Definition transfer.hh:80
│ │ │ │ - │ │ │ │ +
Abstract base class for transfer between levels and creation of the coarse level system.
Definition twolevelmethod.hh:38
│ │ │ │ +
CO CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:57
│ │ │ │ +
virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0
Transfers the data to the coarse level.
│ │ │ │ +
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition twolevelmethod.hh:48
│ │ │ │ +
virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0
Algebraically creates the coarse level system.
│ │ │ │ +
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition twolevelmethod.hh:61
│ │ │ │ +
virtual ~LevelTransferPolicy()
Destructor.
Definition twolevelmethod.hh:124
│ │ │ │ +
CoarseDomainType lhs_
The coarse level lhs.
Definition twolevelmethod.hh:130
│ │ │ │ +
virtual LevelTransferPolicy * clone() const =0
Clone the current object.
│ │ │ │ +
CoarseDomainType & getCoarseLevelLhs()
Get the coarse level left hand side.
Definition twolevelmethod.hh:87
│ │ │ │ +
std::shared_ptr< CoarseOperatorType > operator_
the coarse level linear operator.
Definition twolevelmethod.hh:132
│ │ │ │ +
CoarseRangeType rhs_
The coarse level rhs.
Definition twolevelmethod.hh:128
│ │ │ │ +
virtual void moveToFineLevel(FineDomainType &fineLhs)=0
Updates the fine level linear system after the correction of the coarse levels system.
│ │ │ │ +
std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
Get the coarse level operator.
Definition twolevelmethod.hh:70
│ │ │ │ +
CoarseRangeType & getCoarseLevelRhs()
Get the coarse level right hand side.
Definition twolevelmethod.hh:78
│ │ │ │ +
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:44
│ │ │ │ +
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition twolevelmethod.hh:65
│ │ │ │ +
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition twolevelmethod.hh:52
│ │ │ │ +
A LeveTransferPolicy that used aggregation to construct the coarse level system.
Definition twolevelmethod.hh:143
│ │ │ │ +
C Criterion
Definition twolevelmethod.hh:147
│ │ │ │ +
AggregationLevelTransferPolicy(const Criterion &crit)
Definition twolevelmethod.hh:150
│ │ │ │ +
AggregationLevelTransferPolicy * clone() const
Clone the current object.
Definition twolevelmethod.hh:214
│ │ │ │ +
void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
Updates the fine level linear system after the correction of the coarse levels system.
Definition twolevelmethod.hh:207
│ │ │ │ +
void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)
Definition twolevelmethod.hh:200
│ │ │ │ +
SequentialInformation ParallelInformation
Definition twolevelmethod.hh:148
│ │ │ │ +
LevelTransferPolicy< O, O > FatherType
Definition twolevelmethod.hh:146
│ │ │ │ +
void createCoarseLevelSystem(const O &fineOperator)
Algebraically creates the coarse level system.
Definition twolevelmethod.hh:154
│ │ │ │ +
A policy class for solving the coarse level system using one step of AMG.
Definition twolevelmethod.hh:234
│ │ │ │ +
OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
Constructs the coarse solver policy.
Definition twolevelmethod.hh:253
│ │ │ │ +
AMGInverseOperator CoarseLevelSolver
The type of solver constructed for the coarse level.
Definition twolevelmethod.hh:315
│ │ │ │ +
OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
Copy constructor.
Definition twolevelmethod.hh:257
│ │ │ │ +
O::range_type X
The type of the range and domain of the operator.
Definition twolevelmethod.hh:239
│ │ │ │ +
C Criterion
The type of the crition used for the aggregation within AMG.
Definition twolevelmethod.hh:241
│ │ │ │ +
Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
The type of the arguments used for constructing the smoother.
Definition twolevelmethod.hh:245
│ │ │ │ +
O Operator
The type of the linear operator used.
Definition twolevelmethod.hh:237
│ │ │ │ +
AMG< Operator, X, Smoother > AMGType
The type of the AMG construct on the coarse level.
Definition twolevelmethod.hh:247
│ │ │ │ +
CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
Constructs a coarse level solver.
Definition twolevelmethod.hh:325
│ │ │ │ +
S Smoother
The type of the smoother used in AMG.
Definition twolevelmethod.hh:243
│ │ │ │ +
Definition twolevelmethod.hh:353
│ │ │ │ +
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition twolevelmethod.hh:380
│ │ │ │ +
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition twolevelmethod.hh:371
│ │ │ │ +
TwoLevelMethod(const TwoLevelMethod &other)
Definition twolevelmethod.hh:418
│ │ │ │ +
void pre(FineDomainType &x, FineRangeType &b)
Definition twolevelmethod.hh:431
│ │ │ │ +
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:363
│ │ │ │ +
CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
The type of the coarse level solver.
Definition twolevelmethod.hh:358
│ │ │ │ +
void apply(FineDomainType &v, const FineRangeType &d)
Definition twolevelmethod.hh:439
│ │ │ │ +
CSP CoarseLevelSolverPolicy
The type of the policy for constructing the coarse level solver.
Definition twolevelmethod.hh:356
│ │ │ │ +
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition twolevelmethod.hh:384
│ │ │ │ +
TwoLevelMethod(const FineOperatorType &op, std::shared_ptr< SmootherType > smoother, const LevelTransferPolicy< FineOperatorType, CoarseOperatorType > &policy, CoarseLevelSolverPolicy &coarsePolicy, std::size_t preSteps=1, std::size_t postSteps=1)
Constructs a two level method.
Definition twolevelmethod.hh:404
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition twolevelmethod.hh:466
│ │ │ │ +
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition twolevelmethod.hh:367
│ │ │ │ +
~TwoLevelMethod()
Definition twolevelmethod.hh:424
│ │ │ │ +
CSP::Operator CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:376
│ │ │ │ +
void post(FineDomainType &x)
Definition twolevelmethod.hh:436
│ │ │ │ +
S SmootherType
The type of the fine level smoother.
Definition twolevelmethod.hh:388
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)=0
Apply inverse operator,.
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,294 +1,663 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -transfer.hh │ │ │ │ │ +twolevelmethod.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMGTRANSFER_HH │ │ │ │ │ -6#define DUNE_AMGTRANSFER_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH │ │ │ │ │ +6#define DUNE_ISTL_TWOLEVELMETHOD_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -9#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ -10#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ -13#include │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include<_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +11#include"_a_m_g_._h_h" │ │ │ │ │ +12#include"_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ +13#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ 14 │ │ │ │ │ -15namespace _D_u_n_e │ │ │ │ │ -16{ │ │ │ │ │ -17 namespace Amg │ │ │ │ │ -18 { │ │ │ │ │ -19 │ │ │ │ │ -30 template │ │ │ │ │ -_3_1 class _T_r_a_n_s_f_e_r │ │ │ │ │ -32 { │ │ │ │ │ -33 │ │ │ │ │ -34 public: │ │ │ │ │ -_3_5 typedef V1 _V_e_r_t_e_x; │ │ │ │ │ -_3_6 typedef V2 _V_e_c_t_o_r; │ │ │ │ │ -37 │ │ │ │ │ -38 template │ │ │ │ │ -_3_9 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -40 _V_e_c_t_o_r& fineRedist,T1 damp, R& redistributor=R()); │ │ │ │ │ -41 │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -44 T1 damp); │ │ │ │ │ -45 │ │ │ │ │ -_4_6 static void _r_e_s_t_r_i_c_t_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _V_e_c_t_o_r& │ │ │ │ │ -coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ -47 T& comm); │ │ │ │ │ -48 }; │ │ │ │ │ -49 │ │ │ │ │ -50 template │ │ │ │ │ -_5_1 class _T_r_a_n_s_f_e_r │ │ │ │ │ -52 { │ │ │ │ │ -53 public: │ │ │ │ │ -_5_4 typedef V _V_e_r_t_e_x; │ │ │ │ │ -_5_5 typedef V1 _V_e_c_t_o_r; │ │ │ │ │ -_5_6 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_> _R_e_d_i_s_t; │ │ │ │ │ -57 template │ │ │ │ │ -_5_8 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -59 _V_e_c_t_o_r& fineRedist, T1 damp, │ │ │ │ │ -60 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm=_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n(), │ │ │ │ │ -61 const _R_e_d_i_s_t& redist=_R_e_d_i_s_t()); │ │ │ │ │ -62 template │ │ │ │ │ -_6_3 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -64 T1 damp, │ │ │ │ │ -65 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm=_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ -66 │ │ │ │ │ -67 │ │ │ │ │ -68 static void _r_e_s_t_r_i_c_t_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _V_e_c_t_o_r& │ │ │ │ │ -coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ -69 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm); │ │ │ │ │ -70 }; │ │ │ │ │ -71 │ │ │ │ │ -72#if HAVE_MPI │ │ │ │ │ -73 │ │ │ │ │ -74 template │ │ │ │ │ -_7_5 class _T_r_a_n_s_f_e_r > │ │ │ │ │ -76 { │ │ │ │ │ -77 public: │ │ │ │ │ -_7_8 typedef V _V_e_r_t_e_x; │ │ │ │ │ -_7_9 typedef V1 _V_e_c_t_o_r; │ │ │ │ │ -_8_0 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> > │ │ │ │ │ -_R_e_d_i_s_t; │ │ │ │ │ -81 template │ │ │ │ │ -82 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -83 _V_e_c_t_o_r& fineRedist, T3 damp, _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm, │ │ │ │ │ -84 const _R_e_d_i_s_t& redist); │ │ │ │ │ -85 template │ │ │ │ │ -86 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -87 T3 damp, _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm); │ │ │ │ │ -88 │ │ │ │ │ -89 static void _r_e_s_t_r_i_c_t_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _V_e_c_t_o_r& │ │ │ │ │ -coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ -90 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm); │ │ │ │ │ -91 }; │ │ │ │ │ -92 │ │ │ │ │ -93#endif │ │ │ │ │ -94 │ │ │ │ │ -95 template │ │ │ │ │ -96 template │ │ │ │ │ -97 inline void │ │ │ │ │ -_9_8 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -99 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -100 [[maybe_unused]] _V_e_c_t_o_r& fineRedist, │ │ │ │ │ -101 T damp, │ │ │ │ │ -102 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm, │ │ │ │ │ -103 [[maybe_unused]] const _R_e_d_i_s_t& redist) │ │ │ │ │ -104 { │ │ │ │ │ -105 prolongateVector(aggregates, coarse, fine, damp); │ │ │ │ │ -106 } │ │ │ │ │ -107 template │ │ │ │ │ -108 template │ │ │ │ │ -109 inline void │ │ │ │ │ -_1_1_0 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -111 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -112 T damp, │ │ │ │ │ -113 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm) │ │ │ │ │ -114 { │ │ │ │ │ -115 typedef typename Vector::iterator Iterator; │ │ │ │ │ -116 │ │ │ │ │ -117 Iterator end = coarse.end(); │ │ │ │ │ -118 Iterator begin= coarse.begin(); │ │ │ │ │ -119 for(; begin!=end; ++begin) │ │ │ │ │ -120 *begin*=damp; │ │ │ │ │ -121 end=fine.end(); │ │ │ │ │ -122 begin=fine.begin(); │ │ │ │ │ -123 │ │ │ │ │ -124 for(Iterator block=begin; block != end; ++block) { │ │ │ │ │ -125 std::ptrdiff_t index=block-begin; │ │ │ │ │ -126 const _V_e_r_t_e_x& vertex = aggregates[index]; │ │ │ │ │ -127 if(vertex != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ -128 *block += coarse[aggregates[index]]; │ │ │ │ │ -129 } │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -132 template │ │ │ │ │ -133 inline void │ │ │ │ │ -_1_3_4 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_r_e_s_t_r_i_c_t_V_e_c_t_o_r(const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -135 _V_e_c_t_o_r& coarse, │ │ │ │ │ -136 const _V_e_c_t_o_r& fine, │ │ │ │ │ -137 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm) │ │ │ │ │ -138 { │ │ │ │ │ -139 // Set coarse vector to zero │ │ │ │ │ -140 coarse=0; │ │ │ │ │ -141 │ │ │ │ │ -142 typedef typename Vector::const_iterator Iterator; │ │ │ │ │ -143 Iterator end = fine._e_n_d(); │ │ │ │ │ -144 Iterator begin=fine.begin(); │ │ │ │ │ -145 │ │ │ │ │ -146 for(Iterator block=begin; block != end; ++block) { │ │ │ │ │ -147 const _V_e_r_t_e_x& vertex = aggregates[block-begin]; │ │ │ │ │ -148 if(vertex != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ -149 coarse[vertex] += *block; │ │ │ │ │ -150 } │ │ │ │ │ -151 } │ │ │ │ │ -152 │ │ │ │ │ -153#if HAVE_MPI │ │ │ │ │ -154 template │ │ │ │ │ -155 template │ │ │ │ │ -_1_5_6 inline void _T_r_a_n_s_f_e_r_<_V_,_V_1_,_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> >:: │ │ │ │ │ -prolongateVector(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -157 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ -158 _V_e_c_t_o_r& fineRedist, T3 damp, │ │ │ │ │ -159 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm, │ │ │ │ │ -160 const _R_e_d_i_s_t& redist) │ │ │ │ │ -161 { │ │ │ │ │ -162 if(fineRedist.size()>0) │ │ │ │ │ -163 // we operated on the coarse level │ │ │ │ │ -164 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(aggregates, coarse, │ │ │ │ │ -fineRedist, damp); │ │ │ │ │ -165 │ │ │ │ │ -166 // TODO This could be accomplished with one communication, too! │ │ │ │ │ -167 redist._r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(fine, fineRedist); │ │ │ │ │ -168 comm._c_o_p_y_O_w_n_e_r_T_o_A_l_l(fine,fine); │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -171 template │ │ │ │ │ -172 template │ │ │ │ │ -_1_7_3 inline void _T_r_a_n_s_f_e_r_<_V_,_V_1_,_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> >:: │ │ │ │ │ -prolongateVector( │ │ │ │ │ -174 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -175 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, T3 damp, │ │ │ │ │ -176 [[maybe_unused]] _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm) │ │ │ │ │ -177 { │ │ │ │ │ -178 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(aggregates, coarse, │ │ │ │ │ -fine, damp); │ │ │ │ │ -179 } │ │ │ │ │ -180 template │ │ │ │ │ -_1_8_1 inline void _T_r_a_n_s_f_e_r_<_V_,_V_1_,_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> >:: │ │ │ │ │ -restrictVector(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -182 _V_e_c_t_o_r& coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ -183 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm) │ │ │ │ │ -184 { │ │ │ │ │ -185 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_r_e_s_t_r_i_c_t_V_e_c_t_o_r(aggregates, coarse, │ │ │ │ │ -fine, _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ -186 // We need this here to avoid it in the smoothers on the coarse level. │ │ │ │ │ -187 // There (in the preconditioner d is const. │ │ │ │ │ -188 comm._p_r_o_j_e_c_t(coarse); │ │ │ │ │ -189 } │ │ │ │ │ -190#endif │ │ │ │ │ -192 } // namspace Amg │ │ │ │ │ -193} // namspace Dune │ │ │ │ │ -194#endif │ │ │ │ │ -_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ -Provides classes for the Coloring process of AMG. │ │ │ │ │ -_p_i_n_f_o_._h_h │ │ │ │ │ -_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h │ │ │ │ │ -Functionality for redistributing a sparse matrix. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ +22namespace _D_u_n_e │ │ │ │ │ +23{ │ │ │ │ │ +24namespace Amg │ │ │ │ │ +25{ │ │ │ │ │ +26 │ │ │ │ │ +36template │ │ │ │ │ +_3_7class _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y │ │ │ │ │ +38{ │ │ │ │ │ +39public: │ │ │ │ │ +_4_4 typedef FO _F_i_n_e_O_p_e_r_a_t_o_r_T_y_p_e; │ │ │ │ │ +_4_8 typedef typename FineOperatorType::range_type _F_i_n_e_R_a_n_g_e_T_y_p_e; │ │ │ │ │ +_5_2 typedef typename FineOperatorType::domain_type _F_i_n_e_D_o_m_a_i_n_T_y_p_e; │ │ │ │ │ +_5_7 typedef CO _C_o_a_r_s_e_O_p_e_r_a_t_o_r_T_y_p_e; │ │ │ │ │ +_6_1 typedef typename CoarseOperatorType::range_type _C_o_a_r_s_e_R_a_n_g_e_T_y_p_e; │ │ │ │ │ +_6_5 typedef typename CoarseOperatorType::domain_type _C_o_a_r_s_e_D_o_m_a_i_n_T_y_p_e; │ │ │ │ │ +_7_0 std::shared_ptr& _g_e_t_C_o_a_r_s_e_L_e_v_e_l_O_p_e_r_a_t_o_r() │ │ │ │ │ +71 { │ │ │ │ │ +72 return _o_p_e_r_a_t_o_r__; │ │ │ │ │ +73 } │ │ │ │ │ +_7_8 _C_o_a_r_s_e_R_a_n_g_e_T_y_p_e& _g_e_t_C_o_a_r_s_e_L_e_v_e_l_R_h_s() │ │ │ │ │ +79 { │ │ │ │ │ +80 return _r_h_s__; │ │ │ │ │ +81 } │ │ │ │ │ +82 │ │ │ │ │ +_8_7 _C_o_a_r_s_e_D_o_m_a_i_n_T_y_p_e& _g_e_t_C_o_a_r_s_e_L_e_v_e_l_L_h_s() │ │ │ │ │ +88 { │ │ │ │ │ +89 return _l_h_s__; │ │ │ │ │ +90 } │ │ │ │ │ +_1_0_0 virtual void _m_o_v_e_T_o_C_o_a_r_s_e_L_e_v_e_l(const _F_i_n_e_R_a_n_g_e_T_y_p_e& fineRhs)=0; │ │ │ │ │ +_1_1_0 virtual void _m_o_v_e_T_o_F_i_n_e_L_e_v_e_l(_F_i_n_e_D_o_m_a_i_n_T_y_p_e& fineLhs)=0; │ │ │ │ │ +_1_1_8 virtual void _c_r_e_a_t_e_C_o_a_r_s_e_L_e_v_e_l_S_y_s_t_e_m(const _F_i_n_e_O_p_e_r_a_t_o_r_T_y_p_e& │ │ │ │ │ +fineOperator)=0; │ │ │ │ │ +119 │ │ │ │ │ +_1_2_1 virtual _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y* _c_l_o_n_e() const =0; │ │ │ │ │ +122 │ │ │ │ │ +_1_2_4 virtual _~_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y(){} │ │ │ │ │ +125 │ │ │ │ │ +126 protected: │ │ │ │ │ +_1_2_8 _C_o_a_r_s_e_R_a_n_g_e_T_y_p_e _r_h_s__; │ │ │ │ │ +_1_3_0 _C_o_a_r_s_e_D_o_m_a_i_n_T_y_p_e _l_h_s__; │ │ │ │ │ +_1_3_2 std::shared_ptr _o_p_e_r_a_t_o_r__; │ │ │ │ │ +133}; │ │ │ │ │ +134 │ │ │ │ │ +140template │ │ │ │ │ +_1_4_1class _A_g_g_r_e_g_a_t_i_o_n_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y │ │ │ │ │ +142 : public _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y │ │ │ │ │ +143{ │ │ │ │ │ +144 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _O_:_:_m_a_t_r_i_x___t_y_p_e_:_:_s_i_z_e___t_y_p_e_> │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ +145public: │ │ │ │ │ +_1_4_6 typedef _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y_<_O_,_O_> _F_a_t_h_e_r_T_y_p_e; │ │ │ │ │ +_1_4_7 typedef C _C_r_i_t_e_r_i_o_n; │ │ │ │ │ +_1_4_8 typedef _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +149 │ │ │ │ │ +_1_5_0 _A_g_g_r_e_g_a_t_i_o_n_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y(const _C_r_i_t_e_r_i_o_n& crit) │ │ │ │ │ +151 : criterion_(crit) │ │ │ │ │ +152 {} │ │ │ │ │ +153 │ │ │ │ │ +_1_5_4 void _c_r_e_a_t_e_C_o_a_r_s_e_L_e_v_e_l_S_y_s_t_e_m(const O& fineOperator) │ │ │ │ │ +155 { │ │ │ │ │ +156 prolongDamp_ = criterion_.getProlongationDampingFactor(); │ │ │ │ │ +157 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> productBuilder; │ │ │ │ │ +158 typedef typename _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _t_y_p_e_n_a_m_e_ _O_:_:_m_a_t_r_i_x___t_y_p_e_> │ │ │ │ │ +_M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ +159 typedef typename _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h,_D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ +_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ +160 _D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s,Dune::IdentityMap,Dune::IdentityMap> │ │ │ │ │ +_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ +161 _M_a_t_r_i_x_G_r_a_p_h mg(fineOperator.getmat()); │ │ │ │ │ +162 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h pg(mg,Dune::IdentityMap(),Dune::IdentityMap()); │ │ │ │ │ +163 typedef NegateSet OverlapFlags; │ │ │ │ │ +164 │ │ │ │ │ +165 aggregatesMap_ = std::make_shared(pg._m_a_x_V_e_r_t_e_x()+1); │ │ │ │ │ +166 │ │ │ │ │ +167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates; │ │ │ │ │ +168 │ │ │ │ │ +169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) = │ │ │ │ │ +170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, │ │ │ │ │ +true); │ │ │ │ │ +171 std::cout<<"no aggregates="< │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: combinedfunctor.hh File Reference │ │ │ │ +dune-istl: construction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,37 +72,61 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
combinedfunctor.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ + │ │ │ │ +

Helper classes for the construction of classes without empty constructor. │ │ │ │ +More...

│ │ │ │ +
#include <dune/istl/bvector.hh>
│ │ │ │ +#include <dune/istl/operators.hh>
│ │ │ │ +#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ +#include <dune/istl/solvercategory.hh>
│ │ │ │ +#include "pinfo.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::ApplyHelper< i >
struct  Dune::Amg::ConstructionTraits< BlockVector< T, A > >
 
struct  Dune::Amg::ParallelOperatorArgs< M, C >
 
struct  Dune::Amg::OwnerOverlapCopyCommunicationArgs
 
struct  Dune::Amg::SequentialCommunicationArgs
 
struct  Dune::Amg::ConstructionTraits< OverlappingSchwarzOperator< M, X, Y, C > >
 
struct  Dune::Amg::ConstructionTraits< NonoverlappingSchwarzOperator< M, X, Y, C > >
 
struct  Dune::Amg::MatrixAdapterArgs< M, X, Y >
 
struct  Dune::Amg::ConstructionTraits< MatrixAdapter< M, X, Y > >
 
struct  Dune::Amg::ApplyHelper< 0 >
struct  Dune::Amg::ConstructionTraits< SequentialInformation >
 
class  Dune::Amg::CombinedFunctor< T >
struct  Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Helper classes for the construction of classes without empty constructor.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,24 +2,53 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -combinedfunctor.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +construction.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ +Helper classes for the construction of classes without empty constructor. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ +#include "_p_i_n_f_o_._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_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_<_ _i_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_<_ _0_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_<_ _M_,_ _C_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r_<_ _T_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C │ │ │ │ │ + _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_, │ │ │ │ │ + _C_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ + _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Helper classes for the construction of classes without empty constructor. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: combinedfunctor.hh Source File │ │ │ │ +dune-istl: construction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,90 +74,256 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
combinedfunctor.hh
│ │ │ │ +
construction.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH
│ │ │ │ -
6#define DUNE_AMG_COMBINEDFUNCTOR_HH
│ │ │ │ +
5#ifndef DUNE_AMGCONSTRUCTION_HH
│ │ │ │ +
6#define DUNE_AMGCONSTRUCTION_HH
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune
│ │ │ │ -
11{
│ │ │ │ -
12 namespace Amg
│ │ │ │ -
13 {
│ │ │ │ -
14
│ │ │ │ -
15 template<std::size_t i>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
17 {
│ │ │ │ -
18 template<class TT, class T>
│ │ │ │ -
│ │ │ │ -
19 static void apply(TT tuple, const T& t)
│ │ │ │ -
20 {
│ │ │ │ -
21 std::get<i-1>(tuple) (t);
│ │ │ │ - │ │ │ │ -
23 }
│ │ │ │ -
│ │ │ │ -
24 };
│ │ │ │ -
│ │ │ │ -
25 template<>
│ │ │ │ -
│ │ │ │ -
26 struct ApplyHelper<0>
│ │ │ │ -
27 {
│ │ │ │ -
28 template<class TT, class T>
│ │ │ │ -
│ │ │ │ -
29 static void apply([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t)
│ │ │ │ -
30 {}
│ │ │ │ -
│ │ │ │ -
31 };
│ │ │ │ -
│ │ │ │ -
32
│ │ │ │ -
33 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
35 public T
│ │ │ │ -
36 {
│ │ │ │ -
37 public:
│ │ │ │ -
│ │ │ │ -
38 CombinedFunctor(const T& tuple_)
│ │ │ │ -
39 : T(tuple_)
│ │ │ │ -
40 {}
│ │ │ │ -
│ │ │ │ -
41
│ │ │ │ -
42 template<class T1>
│ │ │ │ -
│ │ │ │ -
43 void operator()(const T1& t)
│ │ │ │ -
44 {
│ │ │ │ - │ │ │ │ -
46 }
│ │ │ │ -
│ │ │ │ -
47 };
│ │ │ │ -
│ │ │ │ -
48
│ │ │ │ -
49
│ │ │ │ -
50 } //namespace Amg
│ │ │ │ -
51} // namespace Dune
│ │ │ │ -
52#endif
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
12#include "pinfo.hh"
│ │ │ │ +
13
│ │ │ │ +
14namespace Dune
│ │ │ │ +
15{
│ │ │ │ +
16 namespace Amg
│ │ │ │ +
17 {
│ │ │ │ +
18
│ │ │ │ +
37 template<typename T>
│ │ │ │ +
38 struct ConstructionTraits
│ │ │ │ +
39 {
│ │ │ │ +
44 typedef const void* Arguments;
│ │ │ │ +
45
│ │ │ │ +
│ │ │ │ +
52 static inline std::shared_ptr<T> construct(Arguments& args)
│ │ │ │ +
53 {
│ │ │ │ +
54 return std::make_shared<T>();
│ │ │ │ +
55 }
│ │ │ │ +
│ │ │ │ +
56 };
│ │ │ │ +
57
│ │ │ │ +
58 template<class T, class A>
│ │ │ │ +
│ │ │ │ +
59 struct ConstructionTraits<BlockVector<T,A> >
│ │ │ │ +
60 {
│ │ │ │ +
61 typedef const int Arguments;
│ │ │ │ +
│ │ │ │ +
62 static inline std::shared_ptr<BlockVector<T,A>> construct(Arguments& n)
│ │ │ │ +
63 {
│ │ │ │ +
64 return std::make_shared<BlockVector<T,A>>(n);
│ │ │ │ +
65 }
│ │ │ │ +
│ │ │ │ +
66 };
│ │ │ │ +
│ │ │ │ +
67
│ │ │ │ +
68 template<class M, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
70 {
│ │ │ │ +
│ │ │ │ +
71 ParallelOperatorArgs(std::shared_ptr<M> matrix, const C& comm)
│ │ │ │ +
72 : matrix_(matrix), comm_(comm)
│ │ │ │ +
73 {}
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
75 std::shared_ptr<M> matrix_;
│ │ │ │ +
76 const C& comm_;
│ │ │ │ +
77 };
│ │ │ │ +
│ │ │ │ +
78
│ │ │ │ +
79#if HAVE_MPI
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
81 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
83 : comm_(comm), cat_(cat)
│ │ │ │ +
84 {}
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
86 MPI_Comm comm_;
│ │ │ │ + │ │ │ │ +
88 };
│ │ │ │ +
│ │ │ │ +
89#endif
│ │ │ │ +
90
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
92 {
│ │ │ │ +
│ │ │ │ +
93 SequentialCommunicationArgs(Communication<void*> comm, [[maybe_unused]] int cat)
│ │ │ │ +
94 : comm_(comm)
│ │ │ │ +
95 {}
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
97 Communication<void*> comm_;
│ │ │ │ +
98 };
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
100 } // end Amg namspace
│ │ │ │ +
101
│ │ │ │ +
102 // forward declaration
│ │ │ │ +
103 template<class M, class X, class Y, class C>
│ │ │ │ + │ │ │ │ +
105
│ │ │ │ +
106 template<class M, class X, class Y, class C>
│ │ │ │ + │ │ │ │ +
108
│ │ │ │ +
109 namespace Amg
│ │ │ │ +
110 {
│ │ │ │ +
111 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ +
112 struct ConstructionTraits<OverlappingSchwarzOperator<M,X,Y,C> >
│ │ │ │ +
113 {
│ │ │ │ + │ │ │ │ +
115
│ │ │ │ +
│ │ │ │ +
116 static inline std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
│ │ │ │ +
117 {
│ │ │ │ +
118 return std::make_shared<OverlappingSchwarzOperator<M,X,Y,C>>
│ │ │ │ +
119 (args.matrix_, args.comm_);
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121 };
│ │ │ │ +
│ │ │ │ +
122
│ │ │ │ +
123 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ +
124 struct ConstructionTraits<NonoverlappingSchwarzOperator<M,X,Y,C> >
│ │ │ │ +
125 {
│ │ │ │ + │ │ │ │ +
127
│ │ │ │ +
│ │ │ │ +
128 static inline std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
│ │ │ │ +
129 {
│ │ │ │ +
130 return std::make_shared<NonoverlappingSchwarzOperator<M,X,Y,C>>
│ │ │ │ +
131 (args.matrix_, args.comm_);
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133 };
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
135 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
137 {
│ │ │ │ +
│ │ │ │ +
138 MatrixAdapterArgs(std::shared_ptr<M> matrix, const SequentialInformation)
│ │ │ │ +
139 : matrix_(matrix)
│ │ │ │ +
140 {}
│ │ │ │ +
│ │ │ │ +
141
│ │ │ │ +
142 std::shared_ptr<M> matrix_;
│ │ │ │ +
143 };
│ │ │ │ +
│ │ │ │ +
144
│ │ │ │ +
145 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
146 struct ConstructionTraits<MatrixAdapter<M,X,Y> >
│ │ │ │ +
147 {
│ │ │ │ + │ │ │ │ +
149
│ │ │ │ +
│ │ │ │ +
150 static inline std::shared_ptr<MatrixAdapter<M,X,Y>> construct(Arguments& args)
│ │ │ │ +
151 {
│ │ │ │ +
152 return std::make_shared<MatrixAdapter<M,X,Y>>(args.matrix_);
│ │ │ │ +
153 }
│ │ │ │ +
│ │ │ │ +
154 };
│ │ │ │ +
│ │ │ │ +
155
│ │ │ │ +
156 template<>
│ │ │ │ +
│ │ │ │ +
157 struct ConstructionTraits<SequentialInformation>
│ │ │ │ +
158 {
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
160 static inline std::shared_ptr<SequentialInformation> construct(Arguments& args)
│ │ │ │ +
161 {
│ │ │ │ +
162 return std::make_shared<SequentialInformation>(args.comm_);
│ │ │ │ +
163 }
│ │ │ │ +
│ │ │ │ +
164 };
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
166
│ │ │ │ +
167#if HAVE_MPI
│ │ │ │ +
168
│ │ │ │ +
169 template<class T1, class T2>
│ │ │ │ +
│ │ │ │ +
170 struct ConstructionTraits<OwnerOverlapCopyCommunication<T1,T2> >
│ │ │ │ +
171 {
│ │ │ │ + │ │ │ │ +
173
│ │ │ │ +
│ │ │ │ +
174 static inline std::shared_ptr<OwnerOverlapCopyCommunication<T1,T2>> construct(Arguments& args)
│ │ │ │ +
175 {
│ │ │ │ +
176 return std::make_shared<OwnerOverlapCopyCommunication<T1,T2>>(args.comm_, args.cat_);
│ │ │ │ +
177 }
│ │ │ │ +
│ │ │ │ +
178 };
│ │ │ │ +
│ │ │ │ +
179
│ │ │ │ +
180#endif
│ │ │ │ +
181
│ │ │ │ +
183 } // namespace Amg
│ │ │ │ +
184} // namespace Dune
│ │ │ │ +
185#endif
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
const int Arguments
Definition construction.hh:61
│ │ │ │ +
SequentialCommunicationArgs(Communication< void * > comm, int cat)
Definition construction.hh:93
│ │ │ │ +
OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat)
Definition construction.hh:82
│ │ │ │ +
MPI_Comm comm_
Definition construction.hh:86
│ │ │ │ +
SolverCategory::Category cat_
Definition construction.hh:87
│ │ │ │ +
const C & comm_
Definition construction.hh:76
│ │ │ │ +
ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm)
Definition construction.hh:71
│ │ │ │ +
std::shared_ptr< M > matrix_
Definition construction.hh:75
│ │ │ │ +
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ +
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ +
Communication< void * > comm_
Definition construction.hh:97
│ │ │ │ +
static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n)
Definition construction.hh:62
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Definition combinedfunctor.hh:17
│ │ │ │ -
static void apply(TT tuple, const T &t)
Definition combinedfunctor.hh:19
│ │ │ │ -
static void apply(TT tuple, const T &t)
Definition combinedfunctor.hh:29
│ │ │ │ -
Definition combinedfunctor.hh:36
│ │ │ │ -
CombinedFunctor(const T &tuple_)
Definition combinedfunctor.hh:38
│ │ │ │ -
void operator()(const T1 &t)
Definition combinedfunctor.hh:43
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │ +
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ +
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ +
Definition construction.hh:70
│ │ │ │ + │ │ │ │ +
Definition construction.hh:92
│ │ │ │ +
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ +
ParallelOperatorArgs< M, C > Arguments
Definition construction.hh:114
│ │ │ │ +
static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
Definition construction.hh:116
│ │ │ │ +
ParallelOperatorArgs< M, C > Arguments
Definition construction.hh:126
│ │ │ │ +
static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
Definition construction.hh:128
│ │ │ │ +
Definition construction.hh:137
│ │ │ │ +
MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation)
Definition construction.hh:138
│ │ │ │ +
std::shared_ptr< M > matrix_
Definition construction.hh:142
│ │ │ │ +
static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args)
Definition construction.hh:150
│ │ │ │ +
const MatrixAdapterArgs< M, X, Y > Arguments
Definition construction.hh:148
│ │ │ │ +
const SequentialCommunicationArgs Arguments
Definition construction.hh:159
│ │ │ │ +
static std::shared_ptr< SequentialInformation > construct(Arguments &args)
Definition construction.hh:160
│ │ │ │ +
static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct(Arguments &args)
Definition construction.hh:174
│ │ │ │ +
const OwnerOverlapCopyCommunicationArgs Arguments
Definition construction.hh:172
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,82 +1,300 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -combinedfunctor.hh │ │ │ │ │ +construction.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH │ │ │ │ │ -6#define DUNE_AMG_COMBINEDFUNCTOR_HH │ │ │ │ │ +5#ifndef DUNE_AMGCONSTRUCTION_HH │ │ │ │ │ +6#define DUNE_AMGCONSTRUCTION_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10namespace _D_u_n_e │ │ │ │ │ -11{ │ │ │ │ │ -12 namespace Amg │ │ │ │ │ -13 { │ │ │ │ │ -14 │ │ │ │ │ -15 template │ │ │ │ │ -_1_6 struct _A_p_p_l_y_H_e_l_p_e_r │ │ │ │ │ +8#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +9#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ +12#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +13 │ │ │ │ │ +14namespace _D_u_n_e │ │ │ │ │ +15{ │ │ │ │ │ +16 namespace Amg │ │ │ │ │ 17 { │ │ │ │ │ -18 template │ │ │ │ │ -_1_9 static void _a_p_p_l_y(TT tuple, const T& t) │ │ │ │ │ -20 { │ │ │ │ │ -21 std::get(tuple) (t); │ │ │ │ │ -22 _A_p_p_l_y_H_e_l_p_e_r_<_i_-_1_>_:_:_a_p_p_l_y(tuple, t); │ │ │ │ │ -23 } │ │ │ │ │ -24 }; │ │ │ │ │ -25 template<> │ │ │ │ │ -_2_6 struct _A_p_p_l_y_H_e_l_p_e_r<0> │ │ │ │ │ -27 { │ │ │ │ │ -28 template │ │ │ │ │ -_2_9 static void _a_p_p_l_y([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t) │ │ │ │ │ -30 {} │ │ │ │ │ -31 }; │ │ │ │ │ -32 │ │ │ │ │ -33 template │ │ │ │ │ -_3_4 class _C_o_m_b_i_n_e_d_F_u_n_c_t_o_r : │ │ │ │ │ -35 public T │ │ │ │ │ -36 { │ │ │ │ │ -37 public: │ │ │ │ │ -_3_8 _C_o_m_b_i_n_e_d_F_u_n_c_t_o_r(const T& tuple_) │ │ │ │ │ -39 : T(tuple_) │ │ │ │ │ -40 {} │ │ │ │ │ -41 │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 void _o_p_e_r_a_t_o_r_(_)(const T1& t) │ │ │ │ │ -44 { │ │ │ │ │ -45 _A_p_p_l_y_H_e_l_p_e_r_<_s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_T_>_:_:_v_a_l_u_e>::apply(*this, t); │ │ │ │ │ -46 } │ │ │ │ │ -47 }; │ │ │ │ │ -48 │ │ │ │ │ -49 │ │ │ │ │ -50 } //namespace Amg │ │ │ │ │ -51} // namespace Dune │ │ │ │ │ -52#endif │ │ │ │ │ +18 │ │ │ │ │ +37 template │ │ │ │ │ +38 struct ConstructionTraits │ │ │ │ │ +39 { │ │ │ │ │ +_4_4 typedef const void* _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +45 │ │ │ │ │ +_5_2 static inline std::shared_ptr _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +53 { │ │ │ │ │ +54 return std::make_shared(); │ │ │ │ │ +55 } │ │ │ │ │ +56 }; │ │ │ │ │ +57 │ │ │ │ │ +58 template │ │ │ │ │ +_5_9 struct ConstructionTraits<_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ +60 { │ │ │ │ │ +_6_1 typedef const int _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +_6_2 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& n) │ │ │ │ │ +63 { │ │ │ │ │ +64 return std::make_shared>(n); │ │ │ │ │ +65 } │ │ │ │ │ +66 }; │ │ │ │ │ +67 │ │ │ │ │ +68 template │ │ │ │ │ +_6_9 struct _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s │ │ │ │ │ +70 { │ │ │ │ │ +_7_1 _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s(std::shared_ptr matrix, const C& comm) │ │ │ │ │ +72 : _m_a_t_r_i_x__(matrix), _c_o_m_m__(comm) │ │ │ │ │ +73 {} │ │ │ │ │ +74 │ │ │ │ │ +_7_5 std::shared_ptr _m_a_t_r_i_x__; │ │ │ │ │ +_7_6 const C& _c_o_m_m__; │ │ │ │ │ +77 }; │ │ │ │ │ +78 │ │ │ │ │ +79#if HAVE_MPI │ │ │ │ │ +_8_0 struct _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +81 { │ │ │ │ │ +_8_2 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s(MPI_Comm comm, _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +cat) │ │ │ │ │ +83 : _c_o_m_m__(comm), _c_a_t__(cat) │ │ │ │ │ +84 {} │ │ │ │ │ +85 │ │ │ │ │ +_8_6 MPI_Comm _c_o_m_m__; │ │ │ │ │ +_8_7 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t__; │ │ │ │ │ +88 }; │ │ │ │ │ +89#endif │ │ │ │ │ +90 │ │ │ │ │ +_9_1 struct _S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +92 { │ │ │ │ │ +_9_3 _S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s(Communication comm, [[maybe_unused]] int │ │ │ │ │ +cat) │ │ │ │ │ +94 : _c_o_m_m__(comm) │ │ │ │ │ +95 {} │ │ │ │ │ +96 │ │ │ │ │ +_9_7 Communication _c_o_m_m__; │ │ │ │ │ +98 }; │ │ │ │ │ +99 │ │ │ │ │ +100 } // end Amg namspace │ │ │ │ │ +101 │ │ │ │ │ +102 // forward declaration │ │ │ │ │ +103 template │ │ │ │ │ +104 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r; │ │ │ │ │ +105 │ │ │ │ │ +106 template │ │ │ │ │ +107 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r; │ │ │ │ │ +108 │ │ │ │ │ +109 namespace Amg │ │ │ │ │ +110 { │ │ │ │ │ +111 template │ │ │ │ │ +_1_1_2 struct ConstructionTraits<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r > │ │ │ │ │ +113 { │ │ │ │ │ +_1_1_4 typedef _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_<_M_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +115 │ │ │ │ │ +_1_1_6 static inline std::shared_ptr> │ │ │ │ │ +_c_o_n_s_t_r_u_c_t(const _A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +117 { │ │ │ │ │ +118 return std::make_shared> │ │ │ │ │ +119 (args._m_a_t_r_i_x__, args._c_o_m_m__); │ │ │ │ │ +120 } │ │ │ │ │ +121 }; │ │ │ │ │ +122 │ │ │ │ │ +123 template │ │ │ │ │ +_1_2_4 struct ConstructionTraits<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r > │ │ │ │ │ +125 { │ │ │ │ │ +_1_2_6 typedef _P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_<_M_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +127 │ │ │ │ │ +_1_2_8 static inline std::shared_ptr> │ │ │ │ │ +_c_o_n_s_t_r_u_c_t(const _A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +129 { │ │ │ │ │ +130 return std::make_shared> │ │ │ │ │ +131 (args._m_a_t_r_i_x__, args._c_o_m_m__); │ │ │ │ │ +132 } │ │ │ │ │ +133 }; │ │ │ │ │ +134 │ │ │ │ │ +135 template │ │ │ │ │ +_1_3_6 struct _M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s │ │ │ │ │ +137 { │ │ │ │ │ +_1_3_8 _M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s(std::shared_ptr matrix, const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n) │ │ │ │ │ +139 : _m_a_t_r_i_x__(matrix) │ │ │ │ │ +140 {} │ │ │ │ │ +141 │ │ │ │ │ +_1_4_2 std::shared_ptr _m_a_t_r_i_x__; │ │ │ │ │ +143 }; │ │ │ │ │ +144 │ │ │ │ │ +145 template │ │ │ │ │ +_1_4_6 struct ConstructionTraits<_M_a_t_r_i_x_A_d_a_p_t_e_r > │ │ │ │ │ +147 { │ │ │ │ │ +_1_4_8 typedef const _M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_<_M_,_X_,_Y_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +149 │ │ │ │ │ +_1_5_0 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& │ │ │ │ │ +args) │ │ │ │ │ +151 { │ │ │ │ │ +152 return std::make_shared>(args._m_a_t_r_i_x__); │ │ │ │ │ +153 } │ │ │ │ │ +154 }; │ │ │ │ │ +155 │ │ │ │ │ +156 template<> │ │ │ │ │ +_1_5_7 struct ConstructionTraits<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ +158 { │ │ │ │ │ +_1_5_9 typedef const _S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +_1_6_0 static inline std::shared_ptr _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& │ │ │ │ │ +args) │ │ │ │ │ +161 { │ │ │ │ │ +162 return std::make_shared(args._c_o_m_m__); │ │ │ │ │ +163 } │ │ │ │ │ +164 }; │ │ │ │ │ +165 │ │ │ │ │ +166 │ │ │ │ │ +167#if HAVE_MPI │ │ │ │ │ +168 │ │ │ │ │ +169 template │ │ │ │ │ +_1_7_0 struct ConstructionTraits<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n > │ │ │ │ │ +171 { │ │ │ │ │ +_1_7_2 typedef const _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +173 │ │ │ │ │ +_1_7_4 static inline std::shared_ptr> │ │ │ │ │ +_c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ +175 { │ │ │ │ │ +176 return std::make_shared>(args._c_o_m_m__, │ │ │ │ │ +args._c_a_t__); │ │ │ │ │ +177 } │ │ │ │ │ +178 }; │ │ │ │ │ +179 │ │ │ │ │ +180#endif │ │ │ │ │ +181 │ │ │ │ │ +183 } // namespace Amg │ │ │ │ │ +184} // namespace Dune │ │ │ │ │ +185#endif │ │ │ │ │ +_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const int Arguments │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +SequentialCommunicationArgs(Communication< void * > comm, int cat) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_c_o_m_m__ │ │ │ │ │ +MPI_Comm comm_ │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_c_a_t__ │ │ │ │ │ +SolverCategory::Category cat_ │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_:_:_c_o_m_m__ │ │ │ │ │ +const C & comm_ │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s │ │ │ │ │ +ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s_:_:_m_a_t_r_i_x__ │ │ │ │ │ +std::shared_ptr< M > matrix_ │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const void * Arguments │ │ │ │ │ +A type holding all the arguments needed to call the constructor. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ +Construct an object with the specified arguments. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s_:_:_c_o_m_m__ │ │ │ │ │ +Communication< void * > comm_ │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:62 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn combinedfunctor.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(TT tuple, const T &t) │ │ │ │ │ -DDeeffiinniittiioonn combinedfunctor.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_p_p_l_y_H_e_l_p_e_r_<_ _0_ _>_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(TT tuple, const T &t) │ │ │ │ │ -DDeeffiinniittiioonn combinedfunctor.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn combinedfunctor.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r │ │ │ │ │ -CombinedFunctor(const T &tuple_) │ │ │ │ │ -DDeeffiinniittiioonn combinedfunctor.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_m_b_i_n_e_d_F_u_n_c_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const T1 &t) │ │ │ │ │ -DDeeffiinniittiioonn combinedfunctor.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +A nonoverlapping operator with communication object. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ +Adapter to turn a matrix into a linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_l_l_e_l_O_p_e_r_a_t_o_r_A_r_g_s │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_C_o_m_m_u_n_i_c_a_t_i_o_n_A_r_g_s │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +An overlapping Schwarz operator. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ +_A_r_g_u_m_e_n_t_s │ │ │ │ │ +ParallelOperatorArgs< M, C > Arguments │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ +_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct │ │ │ │ │ +(const Arguments &args) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ +_A_r_g_u_m_e_n_t_s │ │ │ │ │ +ParallelOperatorArgs< M, C > Arguments │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _>_:_: │ │ │ │ │ +_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct │ │ │ │ │ +(const Arguments &args) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s │ │ │ │ │ +MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:138 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_A_r_g_s_:_:_m_a_t_r_i_x__ │ │ │ │ │ +std::shared_ptr< M > matrix_ │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _>_ _>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _>_ _>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const MatrixAdapterArgs< M, X, Y > Arguments │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:148 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const SequentialCommunicationArgs Arguments │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< SequentialInformation > construct(Arguments &args) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_: │ │ │ │ │ +_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct │ │ │ │ │ +(Arguments &args) │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_: │ │ │ │ │ +_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const OwnerOverlapCopyCommunicationArgs Arguments │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00098.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixhierarchy.hh File Reference │ │ │ │ +dune-istl: fastamg.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,79 +72,74 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Enumerations | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Macros
│ │ │ │ +
fastamg.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides a classes representing the hierarchies in AMG. │ │ │ │ +

A fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers. │ │ │ │ More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include "aggregates.hh"
│ │ │ │ -#include "graph.hh"
│ │ │ │ -#include "galerkin.hh"
│ │ │ │ -#include "renumberer.hh"
│ │ │ │ -#include "graphcreator.hh"
│ │ │ │ -#include "hierarchy.hh"
│ │ │ │ -#include <dune/istl/bvector.hh>
│ │ │ │ -#include <dune/common/parallel/indexset.hh>
│ │ │ │ -#include <dune/istl/matrixutils.hh>
│ │ │ │ -#include <dune/istl/matrixredistribute.hh>
│ │ │ │ -#include <dune/istl/paamg/dependency.hh>
│ │ │ │ -#include <dune/istl/paamg/indicescoarsener.hh>
│ │ │ │ -#include <dune/istl/paamg/globalaggregates.hh>
│ │ │ │ -#include <dune/istl/paamg/construction.hh>
│ │ │ │ -#include <dune/istl/paamg/smoother.hh>
│ │ │ │ -#include <dune/istl/paamg/transfer.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/istl/paamg/smoother.hh>
│ │ │ │ +#include <dune/istl/paamg/transfer.hh>
│ │ │ │ +#include <dune/istl/paamg/matrixhierarchy.hh>
│ │ │ │ +#include <dune/istl/solvers.hh>
│ │ │ │ +#include <dune/istl/scalarproducts.hh>
│ │ │ │ +#include <dune/istl/superlu.hh>
│ │ │ │ +#include <dune/istl/umfpack.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/istl/io.hh>
│ │ │ │ +#include <dune/istl/preconditioners.hh>
│ │ │ │ +#include "fastamgsmoother.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::MatrixHierarchy< M, PI, A >
 The hierarchies build by the coarsening process. More...
 
struct  Dune::Amg::MatrixHierarchy< M, PI, A >::MatrixStats< Matrix, true >::calc
 
class  Dune::Amg::CoarsenCriterion< T >
 The criterion describing the stop criteria for the coarsening process. More...
class  Dune::Amg::FastAMG< M, X, PI, A >
 A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Enumerations

enum  { Dune::Amg::MAX_PROCESSES = 72000 │ │ │ │ - }
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<typename M , typename C1 >
bool Dune::Amg::repartitionAndDistributeMatrix (const M &origMatrix, std::shared_ptr< M > newMatrix, SequentialInformation &origComm, std::shared_ptr< SequentialInformation > &newComm, RedistributeInformation< SequentialInformation > &ri, int nparts, C1 &criterion)
 
template<typename M , typename C , typename C1 >
bool Dune::Amg::repartitionAndDistributeMatrix (const M &origMatrix, std::shared_ptr< M > newMatrix, C &origComm, std::shared_ptr< C > &newComm, RedistributeInformation< C > &ri, int nparts, C1 &criterion)
 

│ │ │ │ +Macros

#define DIRECTSOLVER   SuperLU
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides a classes representing the hierarchies in AMG.

│ │ │ │ +

A fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers.

│ │ │ │
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DIRECTSOLVER

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DIRECTSOLVER   SuperLU
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,68 +1,51 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -matrixhierarchy.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ -#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -#include "_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ -#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ -#include "_g_r_a_p_h_c_r_e_a_t_o_r_._h_h" │ │ │ │ │ -#include "_h_i_e_r_a_r_c_h_y_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_d_e_p_e_n_d_e_n_c_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_i_n_d_i_c_e_s_c_o_a_r_s_e_n_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_l_o_b_a_l_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ +fastamg.hh File Reference │ │ │ │ │ +A fast AMG method, that currently only allows only Gauss-Seidel smoothing and │ │ │ │ │ +is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep │ │ │ │ │ +with the defect calculation to reduce memory transfers. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +#include "_f_a_s_t_a_m_g_s_m_o_o_t_h_e_r_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_ _M_,_ _P_I_,_ _A_ _> │ │ │ │ │ -  The hierarchies build by the coarsening process. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_ _M_,_ _P_I_,_ _A_ _>_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_: │ │ │ │ │ - _c_a_l_c │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_<_ _T_ _> │ │ │ │ │ -  The criterion describing the stop criteria for the coarsening process. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_<_ _M_,_ _X_,_ _P_I_,_ _A_ _> │ │ │ │ │ +  A fast (sequential) algebraic multigrid based on agglomeration that │ │ │ │ │ + saves memory bandwidth. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -EEnnuummeerraattiioonnss │ │ │ │ │ -enum   { _D_u_n_e_:_:_A_m_g_:_:_M_A_X___P_R_O_C_E_S_S_E_S = 72000 } │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_A_m_g_:_:_r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (const M &origMatrix, std:: │ │ │ │ │ - shared_ptr< M > newMatrix, _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n &origComm, std:: │ │ │ │ │ - shared_ptr< _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< │ │ │ │ │ - _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > &ri, int nparts, C1 &criterion) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_A_m_g_:_:_r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (const M &origMatrix, std:: │ │ │ │ │ - shared_ptr< M > newMatrix, C &origComm, std::shared_ptr< C > &newComm, │ │ │ │ │ - _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri, int nparts, C1 &criterion) │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_I_R_E_C_T_S_O_L_V_E_R   SuperLU │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. │ │ │ │ │ +A fast AMG method, that currently only allows only Gauss-Seidel smoothing and │ │ │ │ │ +is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep │ │ │ │ │ +with the defect calculation to reduce memory transfers. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDIIRREECCTTSSOOLLVVEERR ********** │ │ │ │ │ +#define DIRECTSOLVER   SuperLU │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixhierarchy.hh Source File │ │ │ │ +dune-istl: fastamg.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1004 +74,662 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
matrixhierarchy.hh
│ │ │ │ +
fastamg.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH
│ │ │ │ -
6#define DUNE_AMG_MATRIXHIERARCHY_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_FASTAMG_HH
│ │ │ │ +
6#define DUNE_ISTL_FASTAMG_HH
│ │ │ │
7
│ │ │ │ -
8#include <algorithm>
│ │ │ │ -
9#include <tuple>
│ │ │ │ -
10#include "aggregates.hh"
│ │ │ │ -
11#include "graph.hh"
│ │ │ │ -
12#include "galerkin.hh"
│ │ │ │ -
13#include "renumberer.hh"
│ │ │ │ -
14#include "graphcreator.hh"
│ │ │ │ -
15#include "hierarchy.hh"
│ │ │ │ -
16#include <dune/istl/bvector.hh>
│ │ │ │ -
17#include <dune/common/parallel/indexset.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
27
│ │ │ │ -
28namespace Dune
│ │ │ │ -
29{
│ │ │ │ -
30 namespace Amg
│ │ │ │ -
31 {
│ │ │ │ -
42 enum {
│ │ │ │ -
50 MAX_PROCESSES = 72000
│ │ │ │ -
51 };
│ │ │ │ -
52
│ │ │ │ -
59 template<class M, class PI, class A=std::allocator<M> >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 {
│ │ │ │ -
62 public:
│ │ │ │ -
64 typedef M MatrixOperator;
│ │ │ │ -
65
│ │ │ │ -
67 typedef typename MatrixOperator::matrix_type Matrix;
│ │ │ │ -
68
│ │ │ │ - │ │ │ │ -
71
│ │ │ │ -
73 typedef A Allocator;
│ │ │ │ -
74
│ │ │ │ - │ │ │ │ -
77
│ │ │ │ - │ │ │ │ -
80
│ │ │ │ - │ │ │ │ -
83
│ │ │ │ -
85 using AAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<AggregatesMap*>;
│ │ │ │ -
86
│ │ │ │ -
88 typedef std::list<AggregatesMap*,AAllocator> AggregatesMapList;
│ │ │ │ -
89
│ │ │ │ - │ │ │ │ -
92
│ │ │ │ -
94 using RILAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<RedistributeInfoType>;
│ │ │ │ -
95
│ │ │ │ -
97 typedef std::list<RedistributeInfoType,RILAllocator> RedistributeInfoList;
│ │ │ │ -
98
│ │ │ │ -
104 MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
│ │ │ │ -
105 std::shared_ptr<ParallelInformation> pinfo = std::make_shared<ParallelInformation>());
│ │ │ │ -
106
│ │ │ │ - │ │ │ │ -
108
│ │ │ │ -
114 template<typename O, typename T>
│ │ │ │ -
115 void build(const T& criterion);
│ │ │ │ -
116
│ │ │ │ -
124 template<class F>
│ │ │ │ -
125 void recalculateGalerkin(const F& copyFlags);
│ │ │ │ -
126
│ │ │ │ -
131 template<class V, class BA, class TA>
│ │ │ │ -
132 void coarsenVector(Hierarchy<BlockVector<V,BA>, TA>& hierarchy) const;
│ │ │ │ -
133
│ │ │ │ -
139 template<class S, class TA>
│ │ │ │ -
140 void coarsenSmoother(Hierarchy<S,TA>& smoothers,
│ │ │ │ -
141 const typename SmootherTraits<S>::Arguments& args) const;
│ │ │ │ -
142
│ │ │ │ -
147 std::size_t levels() const;
│ │ │ │ -
148
│ │ │ │ -
153 std::size_t maxlevels() const;
│ │ │ │ -
154
│ │ │ │ -
155 bool hasCoarsest() const;
│ │ │ │ -
156
│ │ │ │ -
161 bool isBuilt() const;
│ │ │ │ -
162
│ │ │ │ -
167 const ParallelMatrixHierarchy& matrices() const;
│ │ │ │ -
168
│ │ │ │ - │ │ │ │ -
174
│ │ │ │ -
179 const AggregatesMapList& aggregatesMaps() const;
│ │ │ │ -
180
│ │ │ │ - │ │ │ │ -
187
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ -
190 return prolongDamp_;
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
203 void getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const;
│ │ │ │ -
204
│ │ │ │ -
205 private:
│ │ │ │ -
206 typedef typename ConstructionTraits<MatrixOperator>::Arguments MatrixArgs;
│ │ │ │ -
207 typedef typename ConstructionTraits<ParallelInformation>::Arguments CommunicationArgs;
│ │ │ │ -
209 AggregatesMapList aggregatesMaps_;
│ │ │ │ -
211 RedistributeInfoList redistributes_;
│ │ │ │ -
213 ParallelMatrixHierarchy matrices_;
│ │ │ │ -
215 ParallelInformationHierarchy parallelInformation_;
│ │ │ │ -
216
│ │ │ │ -
218 bool built_;
│ │ │ │ -
219
│ │ │ │ -
221 int maxlevels_;
│ │ │ │ -
222
│ │ │ │ -
223 double prolongDamp_;
│ │ │ │ -
224
│ │ │ │ -
228 template<class Matrix, bool print>
│ │ │ │ -
229 struct MatrixStats
│ │ │ │ -
230 {
│ │ │ │ -
231
│ │ │ │ -
235 static void stats([[maybe_unused]] const Matrix& matrix)
│ │ │ │ -
236 {}
│ │ │ │ -
237 };
│ │ │ │ -
238
│ │ │ │ -
239 template<class Matrix>
│ │ │ │ -
240 struct MatrixStats<Matrix,true>
│ │ │ │ -
241 {
│ │ │ │ -
│ │ │ │ -
242 struct calc
│ │ │ │ -
243 {
│ │ │ │ -
244 typedef typename Matrix::size_type size_type;
│ │ │ │ -
245 typedef typename Matrix::row_type matrix_row;
│ │ │ │ -
246
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
248 {
│ │ │ │ -
249 min=std::numeric_limits<size_type>::max();
│ │ │ │ -
250 max=0;
│ │ │ │ -
251 sum=0;
│ │ │ │ -
252 }
│ │ │ │ -
│ │ │ │ -
253
│ │ │ │ -
│ │ │ │ -
254 void operator()(const matrix_row& row)
│ │ │ │ -
255 {
│ │ │ │ -
256 min=std::min(min, row.size());
│ │ │ │ -
257 max=std::max(max, row.size());
│ │ │ │ -
258 sum += row.size();
│ │ │ │ -
259 }
│ │ │ │ -
│ │ │ │ -
260
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
264 };
│ │ │ │ -
│ │ │ │ -
268 static void stats(const Matrix& matrix)
│ │ │ │ -
269 {
│ │ │ │ -
270 calc c= for_each(matrix.begin(), matrix.end(), calc());
│ │ │ │ -
271 dinfo<<"Matrix row: min="<<c.min<<" max="<<c.max
│ │ │ │ -
272 <<" average="<<static_cast<double>(c.sum)/matrix.N()
│ │ │ │ -
273 <<std::endl;
│ │ │ │ -
274 }
│ │ │ │ -
275 };
│ │ │ │ -
276 };
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ -
281 template<class T>
│ │ │ │ -
│ │ │ │ -
282 class CoarsenCriterion : public T
│ │ │ │ -
283 {
│ │ │ │ -
284 public:
│ │ │ │ - │ │ │ │ -
290
│ │ │ │ -
│ │ │ │ -
301 CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
│ │ │ │ -
302 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
│ │ │ │ -
303 : AggregationCriterion(Dune::Amg::Parameters(maxLevel, coarsenTarget, minCoarsenRate, prolongDamp, accumulate))
│ │ │ │ -
304 {}
│ │ │ │ -
│ │ │ │ -
305
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
307 : AggregationCriterion(parms)
│ │ │ │ -
308 {}
│ │ │ │ +
8#include <memory>
│ │ │ │ +
9#include <dune/common/exceptions.hh>
│ │ │ │ +
10#include <dune/common/typetraits.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
14#include <dune/istl/solvers.hh>
│ │ │ │ + │ │ │ │ +
16#include <dune/istl/superlu.hh>
│ │ │ │ +
17#include <dune/istl/umfpack.hh>
│ │ │ │ + │ │ │ │ +
19#include <dune/istl/io.hh>
│ │ │ │ + │ │ │ │ +
21
│ │ │ │ +
22#include "fastamgsmoother.hh"
│ │ │ │ +
23
│ │ │ │ +
32namespace Dune
│ │ │ │ +
33{
│ │ │ │ +
34 namespace Amg
│ │ │ │ +
35 {
│ │ │ │ +
58 template<class M, class X, class PI=SequentialInformation, class A=std::allocator<X> >
│ │ │ │ +
│ │ │ │ +
59 class FastAMG : public Preconditioner<X,X>
│ │ │ │ +
60 {
│ │ │ │ +
61 public:
│ │ │ │ +
63 typedef M Operator;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
75
│ │ │ │ +
77 typedef X Domain;
│ │ │ │ +
79 typedef X Range;
│ │ │ │ + │ │ │ │ +
82
│ │ │ │ +
90 FastAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
│ │ │ │ +
91 const Parameters& parms,
│ │ │ │ +
92 bool symmetric=true);
│ │ │ │ +
93
│ │ │ │ +
105 template<class C>
│ │ │ │ +
106 FastAMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ +
107 const Parameters& parms=Parameters(),
│ │ │ │ +
108 bool symmetric=true,
│ │ │ │ + │ │ │ │ +
110
│ │ │ │ +
114 FastAMG(const FastAMG& amg);
│ │ │ │ +
115
│ │ │ │ +
117 void pre(Domain& x, Range& b);
│ │ │ │ +
118
│ │ │ │ +
120 void apply(Domain& v, const Range& d);
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
124 {
│ │ │ │ + │ │ │ │ +
126 }
│ │ │ │ +
│ │ │ │ +
127
│ │ │ │ +
129 void post(Domain& x);
│ │ │ │ +
130
│ │ │ │ +
135 template<class A1>
│ │ │ │ +
136 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
│ │ │ │ +
137
│ │ │ │ +
138 std::size_t levels();
│ │ │ │ +
139
│ │ │ │ +
140 std::size_t maxlevels();
│ │ │ │ +
141
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
151 {
│ │ │ │ +
152 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
│ │ │ │ +
153 }
│ │ │ │
│ │ │ │ -
309
│ │ │ │ -
310 };
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
312 template<typename M, typename C1>
│ │ │ │ -
│ │ │ │ -
313 bool repartitionAndDistributeMatrix([[maybe_unused]] const M& origMatrix,
│ │ │ │ -
314 [[maybe_unused]] std::shared_ptr<M> newMatrix,
│ │ │ │ -
315 [[maybe_unused]] SequentialInformation& origComm,
│ │ │ │ -
316 [[maybe_unused]] std::shared_ptr<SequentialInformation>& newComm,
│ │ │ │ - │ │ │ │ -
318 [[maybe_unused]] int nparts,
│ │ │ │ -
319 [[maybe_unused]] C1& criterion)
│ │ │ │ -
320 {
│ │ │ │ -
321 DUNE_THROW(NotImplemented, "Redistribution does not make sense in sequential code!");
│ │ │ │ -
322 }
│ │ │ │ -
│ │ │ │ -
323
│ │ │ │ -
324
│ │ │ │ -
325 template<typename M, typename C, typename C1>
│ │ │ │ -
│ │ │ │ -
326 bool repartitionAndDistributeMatrix(const M& origMatrix,
│ │ │ │ -
327 std::shared_ptr<M> newMatrix,
│ │ │ │ -
328 C& origComm,
│ │ │ │ -
329 std::shared_ptr<C>& newComm,
│ │ │ │ - │ │ │ │ -
331 int nparts, C1& criterion)
│ │ │ │ -
332 {
│ │ │ │ -
333 Timer time;
│ │ │ │ -
334#ifdef AMG_REPART_ON_COMM_GRAPH
│ │ │ │ -
335 // Done not repartition the matrix graph, but a graph of the communication scheme.
│ │ │ │ -
336 bool existentOnRedist=Dune::commGraphRepartition(origMatrix, origComm, nparts, newComm,
│ │ │ │ -
337 ri.getInterface(),
│ │ │ │ -
338 criterion.debugLevel()>1);
│ │ │ │ -
339
│ │ │ │ -
340#else
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
345 IdentityMap,
│ │ │ │ -
346 IdentityMap> PropertiesGraph;
│ │ │ │ -
347 MatrixGraph graph(origMatrix);
│ │ │ │ -
348 PropertiesGraph pgraph(graph);
│ │ │ │ -
349 buildDependency(pgraph, origMatrix, criterion, false);
│ │ │ │ -
350
│ │ │ │ -
351#ifdef DEBUG_REPART
│ │ │ │ -
352 if(origComm.communicator().rank()==0)
│ │ │ │ -
353 std::cout<<"Original matrix"<<std::endl;
│ │ │ │ -
354 origComm.communicator().barrier();
│ │ │ │ -
355 printGlobalSparseMatrix(origMatrix, origComm, std::cout);
│ │ │ │ -
356#endif
│ │ │ │ -
357 bool existentOnRedist=Dune::graphRepartition(pgraph, origComm, nparts,
│ │ │ │ -
358 newComm, ri.getInterface(),
│ │ │ │ -
359 criterion.debugLevel()>1);
│ │ │ │ -
360#endif // if else AMG_REPART
│ │ │ │ -
361
│ │ │ │ -
362 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
│ │ │ │ -
363 std::cout<<"Repartitioning took "<<time.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
364
│ │ │ │ -
365 ri.setSetup();
│ │ │ │ -
366
│ │ │ │ -
367#ifdef DEBUG_REPART
│ │ │ │ -
368 ri.checkInterface(origComm.indexSet(), newComm->indexSet(), origComm.communicator());
│ │ │ │ -
369#endif
│ │ │ │ -
370
│ │ │ │ -
371 redistributeMatrix(const_cast<M&>(origMatrix), *newMatrix, origComm, *newComm, ri);
│ │ │ │ -
372
│ │ │ │ -
373#ifdef DEBUG_REPART
│ │ │ │ -
374 if(origComm.communicator().rank()==0)
│ │ │ │ -
375 std::cout<<"Original matrix"<<std::endl;
│ │ │ │ -
376 origComm.communicator().barrier();
│ │ │ │ -
377 if(newComm->communicator().size()>0)
│ │ │ │ -
378 printGlobalSparseMatrix(*newMatrix, *newComm, std::cout);
│ │ │ │ -
379 origComm.communicator().barrier();
│ │ │ │ -
380#endif
│ │ │ │ -
381
│ │ │ │ -
382 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
│ │ │ │ -
383 std::cout<<"Redistributing matrix took "<<time.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
384 return existentOnRedist;
│ │ │ │ -
385
│ │ │ │ -
386 }
│ │ │ │ -
│ │ │ │ -
387
│ │ │ │ -
388 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ -
389 MatrixHierarchy<M,IS,A>::MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
│ │ │ │ -
390 std::shared_ptr<ParallelInformation> pinfo)
│ │ │ │ -
391 : matrices_(fineMatrix),
│ │ │ │ -
392 parallelInformation_(pinfo)
│ │ │ │ -
393 {
│ │ │ │ -
394 if (SolverCategory::category(*fineMatrix) != SolverCategory::category(*pinfo))
│ │ │ │ -
395 DUNE_THROW(ISTLError, "MatrixOperator and ParallelInformation must belong to the same category!");
│ │ │ │ -
396 }
│ │ │ │ -
│ │ │ │ -
397
│ │ │ │ -
398 template<class M, class IS, class A>
│ │ │ │ -
399 template<typename O, typename T>
│ │ │ │ -
│ │ │ │ -
400 void MatrixHierarchy<M,IS,A>::build(const T& criterion)
│ │ │ │ -
401 {
│ │ │ │ -
402 prolongDamp_ = criterion.getProlongationDampingFactor();
│ │ │ │ -
403 typedef O OverlapFlags;
│ │ │ │ -
404 typedef typename ParallelMatrixHierarchy::Iterator MatIterator;
│ │ │ │ -
405 typedef typename ParallelInformationHierarchy::Iterator PInfoIterator;
│ │ │ │ -
406
│ │ │ │ -
407 static const int noints=(Dune::Amg::MAX_PROCESSES/4096>0) ? (Dune::Amg::MAX_PROCESSES/4096) : 1;
│ │ │ │ -
408
│ │ │ │ -
409 typedef bigunsignedint<sizeof(int)*8*noints> BIGINT;
│ │ │ │ - │ │ │ │ -
411 MatIterator mlevel = matrices_.finest();
│ │ │ │ -
412 MatrixStats<typename M::matrix_type,MINIMAL_DEBUG_LEVEL<=INFO_DEBUG_LEVEL>::stats(mlevel->getmat());
│ │ │ │ -
413
│ │ │ │ -
414 PInfoIterator infoLevel = parallelInformation_.finest();
│ │ │ │ -
415 BIGINT finenonzeros=countNonZeros(mlevel->getmat());
│ │ │ │ -
416 finenonzeros = infoLevel->communicator().sum(finenonzeros);
│ │ │ │ -
417 BIGINT allnonzeros = finenonzeros;
│ │ │ │ -
418
│ │ │ │ -
419
│ │ │ │ -
420 int level = 0;
│ │ │ │ -
421 int rank = 0;
│ │ │ │ -
422
│ │ │ │ -
423 BIGINT unknowns = mlevel->getmat().N();
│ │ │ │ +
154
│ │ │ │ +
159 bool usesDirectCoarseLevelSolver() const;
│ │ │ │ +
160
│ │ │ │ +
161 private:
│ │ │ │ +
168 template<class C>
│ │ │ │ +
169 void createHierarchies(C& criterion,
│ │ │ │ +
170 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ +
171 const PI& pinfo);
│ │ │ │ +
172
│ │ │ │ +
179 struct LevelContext
│ │ │ │ +
180 {
│ │ │ │ +
184 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
│ │ │ │ + │ │ │ │ +
192 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
│ │ │ │ +
196 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
212 std::size_t level;
│ │ │ │ +
213 };
│ │ │ │ +
214
│ │ │ │ +
216 void mgc(LevelContext& levelContext, Domain& x, const Range& b);
│ │ │ │ +
217
│ │ │ │ +
224 void presmooth(LevelContext& levelContext, Domain& x, const Range& b);
│ │ │ │ +
225
│ │ │ │ +
232 void postsmooth(LevelContext& levelContext, Domain& x, const Range& b);
│ │ │ │ +
233
│ │ │ │ +
240 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel,
│ │ │ │ +
241 Domain& fineX);
│ │ │ │ +
242
│ │ │ │ +
247 bool moveToCoarseLevel(LevelContext& levelContext);
│ │ │ │ +
248
│ │ │ │ +
253 void initIteratorsWithFineLevel(LevelContext& levelContext);
│ │ │ │ +
254
│ │ │ │ +
256 std::shared_ptr<OperatorHierarchy> matrices_;
│ │ │ │ +
258 std::shared_ptr<CoarseSolver> solver_;
│ │ │ │ +
260 std::shared_ptr<Hierarchy<Range,A>> rhs_;
│ │ │ │ +
262 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
│ │ │ │ +
264 std::shared_ptr<Hierarchy<Domain,A>> residual_;
│ │ │ │ +
265
│ │ │ │ + │ │ │ │ +
269 std::shared_ptr<ScalarProduct> scalarProduct_;
│ │ │ │ +
271 std::size_t gamma_;
│ │ │ │ +
273 std::size_t preSteps_;
│ │ │ │ +
275 std::size_t postSteps_;
│ │ │ │ +
276 std::size_t level;
│ │ │ │ +
277 bool buildHierarchy_;
│ │ │ │ +
278 bool symmetric;
│ │ │ │ +
279 bool coarsesolverconverged;
│ │ │ │ + │ │ │ │ +
281 typedef std::shared_ptr<Smoother> SmootherPointer;
│ │ │ │ +
282 SmootherPointer coarseSmoother_;
│ │ │ │ +
284 std::size_t verbosity_;
│ │ │ │ +
285 };
│ │ │ │ +
│ │ │ │ +
286
│ │ │ │ +
287 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
289 : matrices_(amg.matrices_), solver_(amg.solver_),
│ │ │ │ +
290 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_),
│ │ │ │ +
291 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
│ │ │ │ +
292 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged),
│ │ │ │ +
293 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_)
│ │ │ │ +
294 {}
│ │ │ │ +
│ │ │ │ +
295
│ │ │ │ +
296 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
298 const Parameters& parms, bool symmetric_)
│ │ │ │ +
299 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver),
│ │ │ │ +
300 rhs_(), lhs_(), residual_(), scalarProduct_(),
│ │ │ │ +
301 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
│ │ │ │ +
302 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
│ │ │ │ +
303 symmetric(symmetric_), coarsesolverconverged(true),
│ │ │ │ +
304 coarseSmoother_(), verbosity_(parms.debugLevel())
│ │ │ │ +
305 {
│ │ │ │ +
306 if(preSteps_>1||postSteps_>1)
│ │ │ │ +
307 {
│ │ │ │ +
308 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
│ │ │ │ +
309 preSteps_=postSteps_=0;
│ │ │ │ +
310 }
│ │ │ │ +
311 assert(matrices_->isBuilt());
│ │ │ │ +
312 static_assert(std::is_same<PI,SequentialInformation>::value,
│ │ │ │ +
313 "Currently only sequential runs are supported");
│ │ │ │ +
314 }
│ │ │ │ +
│ │ │ │ +
315 template<class M, class X, class PI, class A>
│ │ │ │ +
316 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
318 const C& criterion,
│ │ │ │ +
319 const Parameters& parms,
│ │ │ │ +
320 bool symmetric_,
│ │ │ │ +
321 const PI& pinfo)
│ │ │ │ +
322 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_(parms.getGamma()),
│ │ │ │ +
323 preSteps_(parms.getNoPreSmoothSteps()), postSteps_(parms.getNoPostSmoothSteps()),
│ │ │ │ +
324 buildHierarchy_(true),
│ │ │ │ +
325 symmetric(symmetric_), coarsesolverconverged(true),
│ │ │ │ +
326 coarseSmoother_(), verbosity_(criterion.debugLevel())
│ │ │ │ +
327 {
│ │ │ │ +
328 if(preSteps_>1||postSteps_>1)
│ │ │ │ +
329 {
│ │ │ │ +
330 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
│ │ │ │ +
331 preSteps_=postSteps_=1;
│ │ │ │ +
332 }
│ │ │ │ +
333 static_assert(std::is_same<PI,SequentialInformation>::value,
│ │ │ │ +
334 "Currently only sequential runs are supported");
│ │ │ │ +
335 // TODO: reestablish compile time checks.
│ │ │ │ +
336 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
│ │ │ │ +
337 // "Matrix and Solver must match in terms of category!");
│ │ │ │ +
338 auto matrixptr = stackobject_to_shared_ptr(matrix);
│ │ │ │ +
339 createHierarchies(criterion, matrixptr, pinfo);
│ │ │ │ +
340 }
│ │ │ │ +
│ │ │ │ +
341
│ │ │ │ +
342 template<class M, class X, class PI, class A>
│ │ │ │ +
343 template<class C>
│ │ │ │ +
344 void FastAMG<M,X,PI,A>::createHierarchies(C& criterion,
│ │ │ │ +
345 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ +
346 const PI& pinfo)
│ │ │ │ +
347 {
│ │ │ │ +
348 Timer watch;
│ │ │ │ +
349 matrices_ = std::make_shared<OperatorHierarchy>(
│ │ │ │ +
350 std::const_pointer_cast<Operator>(matrixptr),
│ │ │ │ +
351 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
│ │ │ │ +
352
│ │ │ │ +
353 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
│ │ │ │ +
354
│ │ │ │ +
355 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
│ │ │ │ +
356 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
357
│ │ │ │ +
358 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()) {
│ │ │ │ +
359 // We have the carsest level. Create the coarse Solver
│ │ │ │ +
360 typedef typename SmootherTraits<Smoother>::Arguments SmootherArgs;
│ │ │ │ +
361 SmootherArgs sargs;
│ │ │ │ +
362 sargs.iterations = 1;
│ │ │ │ +
363
│ │ │ │ + │ │ │ │ +
365 cargs.setArgs(sargs);
│ │ │ │ +
366 if(matrices_->redistributeInformation().back().isSetup()) {
│ │ │ │ +
367 // Solve on the redistributed partitioning
│ │ │ │ +
368 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
│ │ │ │ +
369 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
│ │ │ │ +
370 }else{
│ │ │ │ +
371 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
│ │ │ │ +
372 cargs.setComm(*matrices_->parallelInformation().coarsest());
│ │ │ │ +
373 }
│ │ │ │ +
374
│ │ │ │ +
375 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
│ │ │ │ +
376 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
│ │ │ │ +
377
│ │ │ │ +
378#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
379#if HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
380#define DIRECTSOLVER UMFPack
│ │ │ │ +
381#else
│ │ │ │ +
382#define DIRECTSOLVER SuperLU
│ │ │ │ +
383#endif
│ │ │ │ +
384 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
│ │ │ │ +
385 if(std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
│ │ │ │ +
386 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
│ │ │ │ +
387 || (matrices_->parallelInformation().coarsest().isRedistributed()
│ │ │ │ +
388 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
│ │ │ │ +
389 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0)) { // redistribute and 1 proc
│ │ │ │ +
390 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
│ │ │ │ +
391 std::cout<<"Using superlu"<<std::endl;
│ │ │ │ +
392 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ +
393 {
│ │ │ │ +
394 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ +
395 // We are still participating on this level
│ │ │ │ +
396 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
│ │ │ │ +
397 else
│ │ │ │ +
398 solver_.reset();
│ │ │ │ +
399 }else
│ │ │ │ +
400 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest()->getmat(), false, false));
│ │ │ │ +
401 }else
│ │ │ │ +
402#undef DIRECTSOLVER
│ │ │ │ +
403#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
404 {
│ │ │ │ +
405 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ +
406 {
│ │ │ │ +
407 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ +
408 // We are still participating on this level
│ │ │ │ +
409 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
│ │ │ │ +
410 *scalarProduct_,
│ │ │ │ +
411 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ +
412 else
│ │ │ │ +
413 solver_.reset();
│ │ │ │ +
414 }else
│ │ │ │ +
415 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
│ │ │ │ +
416 *scalarProduct_,
│ │ │ │ +
417 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ +
418 }
│ │ │ │ +
419 }
│ │ │ │ +
420
│ │ │ │ +
421 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
│ │ │ │ +
422 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
423 }
│ │ │ │
424
│ │ │ │ -
425 unknowns = infoLevel->communicator().sum(unknowns);
│ │ │ │ -
426 double dunknowns=unknowns.todouble();
│ │ │ │ -
427 infoLevel->buildGlobalLookup(mlevel->getmat().N());
│ │ │ │ -
428 redistributes_.push_back(RedistributeInfoType());
│ │ │ │ -
429
│ │ │ │ -
430 for(; level < criterion.maxLevel(); ++level, ++mlevel) {
│ │ │ │ -
431 assert(matrices_.levels()==redistributes_.size());
│ │ │ │ -
432 rank = infoLevel->communicator().rank();
│ │ │ │ -
433 if(rank==0 && criterion.debugLevel()>1)
│ │ │ │ -
434 std::cout<<"Level "<<level<<" has "<<dunknowns<<" unknowns, "<<dunknowns/infoLevel->communicator().size()
│ │ │ │ -
435 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
│ │ │ │ -
436
│ │ │ │ -
437 MatrixOperator* matrix=&(*mlevel);
│ │ │ │ -
438 ParallelInformation* info =&(*infoLevel);
│ │ │ │ -
439
│ │ │ │ -
440 if((
│ │ │ │ -
441#if HAVE_PARMETIS
│ │ │ │ -
442 criterion.accumulate()==successiveAccu
│ │ │ │ -
443#else
│ │ │ │ -
444 false
│ │ │ │ -
445#endif
│ │ │ │ -
446 || (criterion.accumulate()==atOnceAccu
│ │ │ │ -
447 && dunknowns < 30*infoLevel->communicator().size()))
│ │ │ │ -
448 && infoLevel->communicator().size()>1 &&
│ │ │ │ -
449 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())
│ │ │ │ -
450 {
│ │ │ │ -
451 // accumulate to fewer processors
│ │ │ │ -
452 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
│ │ │ │ -
453 std::shared_ptr<ParallelInformation> redistComm;
│ │ │ │ -
454 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/(criterion.minAggregateSize()
│ │ │ │ -
455 *criterion.coarsenTarget()));
│ │ │ │ -
456 if( nodomains<=criterion.minAggregateSize()/2 ||
│ │ │ │ -
457 dunknowns <= criterion.coarsenTarget() )
│ │ │ │ -
458 nodomains=1;
│ │ │ │ -
459
│ │ │ │ -
460 bool existentOnNextLevel =
│ │ │ │ -
461 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
│ │ │ │ -
462 redistComm, redistributes_.back(), nodomains,
│ │ │ │ -
463 criterion);
│ │ │ │ -
464 BIGINT unknownsRedist = redistMat->N();
│ │ │ │ -
465 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
│ │ │ │ -
466 dunknowns= unknownsRedist.todouble();
│ │ │ │ -
467 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)
│ │ │ │ -
468 std::cout<<"Level "<<level<<" (redistributed) has "<<dunknowns<<" unknowns, "<<dunknowns/redistComm->communicator().size()
│ │ │ │ -
469 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
│ │ │ │ -
470 MatrixArgs args(redistMat, *redistComm);
│ │ │ │ -
471 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
│ │ │ │ -
472 assert(mlevel.isRedistributed());
│ │ │ │ -
473 infoLevel.addRedistributed(redistComm);
│ │ │ │ -
474 infoLevel->freeGlobalLookup();
│ │ │ │ -
475
│ │ │ │ -
476 if(!existentOnNextLevel)
│ │ │ │ -
477 // We do not hold any data on the redistributed partitioning
│ │ │ │ -
478 break;
│ │ │ │ -
479
│ │ │ │ -
480 // Work on the redistributed Matrix from now on
│ │ │ │ -
481 matrix = &(mlevel.getRedistributed());
│ │ │ │ -
482 info = &(infoLevel.getRedistributed());
│ │ │ │ -
483 info->buildGlobalLookup(matrix->getmat().N());
│ │ │ │ -
484 }
│ │ │ │ +
425
│ │ │ │ +
426 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
428 {
│ │ │ │ +
429 Timer watch, watch1;
│ │ │ │ +
430 // Detect Matrix rows where all offdiagonal entries are
│ │ │ │ +
431 // zero and set x such that A_dd*x_d=b_d
│ │ │ │ +
432 // Thus users can be more careless when setting up their linear
│ │ │ │ +
433 // systems.
│ │ │ │ +
434 typedef typename M::matrix_type Matrix;
│ │ │ │ +
435 typedef typename Matrix::ConstRowIterator RowIter;
│ │ │ │ +
436 typedef typename Matrix::ConstColIterator ColIter;
│ │ │ │ +
437 typedef typename Matrix::block_type Block;
│ │ │ │ +
438 Block zero;
│ │ │ │ +
439 zero=typename Matrix::field_type();
│ │ │ │ +
440
│ │ │ │ +
441 const Matrix& mat=matrices_->matrices().finest()->getmat();
│ │ │ │ +
442 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ +
443 bool isDirichlet = true;
│ │ │ │ +
444 bool hasDiagonal = false;
│ │ │ │ +
445 ColIter diag;
│ │ │ │ +
446 for(ColIter col=row->begin(); col!=row->end(); ++col) {
│ │ │ │ +
447 if(row.index()==col.index()) {
│ │ │ │ +
448 diag = col;
│ │ │ │ +
449 hasDiagonal = (*col != zero);
│ │ │ │ +
450 }else{
│ │ │ │ +
451 if(*col!=zero)
│ │ │ │ +
452 isDirichlet = false;
│ │ │ │ +
453 }
│ │ │ │ +
454 }
│ │ │ │ +
455 if(isDirichlet && hasDiagonal)
│ │ │ │ +
456 diag->solve(x[row.index()], b[row.index()]);
│ │ │ │ +
457 }
│ │ │ │ +
458 if (verbosity_>0)
│ │ │ │ +
459 std::cout<<" Preprocessing Dirichlet took "<<watch1.elapsed()<<std::endl;
│ │ │ │ +
460 watch1.reset();
│ │ │ │ +
461 // No smoother to make x consistent! Do it by hand
│ │ │ │ +
462 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
│ │ │ │ +
463 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
│ │ │ │ +
464 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ +
465 residual_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ +
466 matrices_->coarsenVector(*rhs_);
│ │ │ │ +
467 matrices_->coarsenVector(*lhs_);
│ │ │ │ +
468 matrices_->coarsenVector(*residual_);
│ │ │ │ +
469
│ │ │ │ +
470 // The preconditioner might change x and b. So we have to
│ │ │ │ +
471 // copy the changes to the original vectors.
│ │ │ │ +
472 x = *lhs_->finest();
│ │ │ │ +
473 b = *rhs_->finest();
│ │ │ │ +
474 }
│ │ │ │ +
│ │ │ │ +
475 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
477 {
│ │ │ │ +
478 return matrices_->levels();
│ │ │ │ +
479 }
│ │ │ │ +
│ │ │ │ +
480 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
482 {
│ │ │ │ +
483 return matrices_->maxlevels();
│ │ │ │ +
484 }
│ │ │ │ +
│ │ │ │
485
│ │ │ │ -
486 rank = info->communicator().rank();
│ │ │ │ -
487 if(dunknowns <= criterion.coarsenTarget())
│ │ │ │ -
488 // No further coarsening needed
│ │ │ │ -
489 break;
│ │ │ │ -
490
│ │ │ │ - │ │ │ │ -
492 typedef typename GraphCreator::PropertiesGraph PropertiesGraph;
│ │ │ │ -
493 typedef typename GraphCreator::GraphTuple GraphTuple;
│ │ │ │ -
494
│ │ │ │ -
495 typedef typename PropertiesGraph::VertexDescriptor Vertex;
│ │ │ │ -
496
│ │ │ │ -
497 std::vector<bool> excluded(matrix->getmat().N(), false);
│ │ │ │ -
498
│ │ │ │ -
499 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, OverlapFlags());
│ │ │ │ -
500
│ │ │ │ -
501 AggregatesMap* aggregatesMap=new AggregatesMap(std::get<1>(graphs)->maxVertex()+1);
│ │ │ │ -
502
│ │ │ │ -
503 aggregatesMaps_.push_back(aggregatesMap);
│ │ │ │ -
504
│ │ │ │ -
505 Timer watch;
│ │ │ │ -
506 watch.reset();
│ │ │ │ -
507 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] =
│ │ │ │ -
508 aggregatesMap->buildAggregates(matrix->getmat(), *(std::get<1>(graphs)), criterion, level==0);
│ │ │ │ -
509
│ │ │ │ -
510 if(rank==0 && criterion.debugLevel()>2)
│ │ │ │ -
511 std::cout<<" Have built "<<noAggregates<<" aggregates totally ("<<isoAggregates<<" isolated aggregates, "<<
│ │ │ │ -
512 oneAggregates<<" aggregates of one vertex, and skipped "<<
│ │ │ │ -
513 skippedAggregates<<" aggregates)."<<std::endl;
│ │ │ │ -
514#ifdef TEST_AGGLO
│ │ │ │ -
515 {
│ │ │ │ -
516 // calculate size of local matrix in the distributed direction
│ │ │ │ -
517 int start, end, overlapStart, overlapEnd;
│ │ │ │ -
518 int procs=info->communicator().rank();
│ │ │ │ -
519 int n = UNKNOWNS/procs; // number of unknowns per process
│ │ │ │ -
520 int bigger = UNKNOWNS%procs; // number of process with n+1 unknows
│ │ │ │ -
521
│ │ │ │ -
522 // Compute owner region
│ │ │ │ -
523 if(rank<bigger) {
│ │ │ │ -
524 start = rank*(n+1);
│ │ │ │ -
525 end = (rank+1)*(n+1);
│ │ │ │ -
526 }else{
│ │ │ │ -
527 start = bigger + rank * n;
│ │ │ │ -
528 end = bigger + (rank + 1) * n;
│ │ │ │ -
529 }
│ │ │ │ -
530
│ │ │ │ -
531 // Compute overlap region
│ │ │ │ -
532 if(start>0)
│ │ │ │ -
533 overlapStart = start - 1;
│ │ │ │ -
534 else
│ │ │ │ -
535 overlapStart = start;
│ │ │ │ -
536
│ │ │ │ -
537 if(end<UNKNOWNS)
│ │ │ │ -
538 overlapEnd = end + 1;
│ │ │ │ -
539 else
│ │ │ │ -
540 overlapEnd = end;
│ │ │ │ -
541
│ │ │ │ -
542 assert((UNKNOWNS)*(overlapEnd-overlapStart)==aggregatesMap->noVertices());
│ │ │ │ -
543 for(int j=0; j< UNKNOWNS; ++j)
│ │ │ │ -
544 for(int i=0; i < UNKNOWNS; ++i)
│ │ │ │ -
545 {
│ │ │ │ -
546 if(i>=overlapStart && i<overlapEnd)
│ │ │ │ -
547 {
│ │ │ │ -
548 int no = (j/2)*((UNKNOWNS)/2)+i/2;
│ │ │ │ -
549 (*aggregatesMap)[j*(overlapEnd-overlapStart)+i-overlapStart]=no;
│ │ │ │ -
550 }
│ │ │ │ -
551 }
│ │ │ │ -
552 }
│ │ │ │ -
553#endif
│ │ │ │ -
554 if(criterion.debugLevel()>1 && info->communicator().rank()==0)
│ │ │ │ -
555 std::cout<<"aggregating finished."<<std::endl;
│ │ │ │ +
487 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
489 {
│ │ │ │ +
490 LevelContext levelContext;
│ │ │ │ +
491 // Init all iterators for the current level
│ │ │ │ +
492 initIteratorsWithFineLevel(levelContext);
│ │ │ │ +
493
│ │ │ │ +
494 assert(v.two_norm()==0);
│ │ │ │ +
495
│ │ │ │ +
496 level=0;
│ │ │ │ +
497 if(matrices_->maxlevels()==1){
│ │ │ │ +
498 // The coarse solver might modify the d!
│ │ │ │ +
499 Range b(d);
│ │ │ │ +
500 mgc(levelContext, v, b);
│ │ │ │ +
501 }else
│ │ │ │ +
502 mgc(levelContext, v, d);
│ │ │ │ +
503 if(postSteps_==0||matrices_->maxlevels()==1)
│ │ │ │ +
504 levelContext.pinfo->copyOwnerToAll(v, v);
│ │ │ │ +
505 }
│ │ │ │ +
│ │ │ │ +
506
│ │ │ │ +
507 template<class M, class X, class PI, class A>
│ │ │ │ +
508 void FastAMG<M,X,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
│ │ │ │ +
509 {
│ │ │ │ +
510 levelContext.matrix = matrices_->matrices().finest();
│ │ │ │ +
511 levelContext.pinfo = matrices_->parallelInformation().finest();
│ │ │ │ +
512 levelContext.redist =
│ │ │ │ +
513 matrices_->redistributeInformation().begin();
│ │ │ │ +
514 levelContext.aggregates = matrices_->aggregatesMaps().begin();
│ │ │ │ +
515 levelContext.lhs = lhs_->finest();
│ │ │ │ +
516 levelContext.residual = residual_->finest();
│ │ │ │ +
517 levelContext.rhs = rhs_->finest();
│ │ │ │ +
518 levelContext.level=0;
│ │ │ │ +
519 }
│ │ │ │ +
520
│ │ │ │ +
521 template<class M, class X, class PI, class A>
│ │ │ │ +
522 bool FastAMG<M,X,PI,A>
│ │ │ │ +
523 ::moveToCoarseLevel(LevelContext& levelContext)
│ │ │ │ +
524 {
│ │ │ │ +
525 bool processNextLevel=true;
│ │ │ │ +
526
│ │ │ │ +
527 if(levelContext.redist->isSetup()) {
│ │ │ │ +
528 throw "bla";
│ │ │ │ +
529 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.residual),
│ │ │ │ +
530 levelContext.residual.getRedistributed());
│ │ │ │ +
531 processNextLevel = levelContext.residual.getRedistributed().size()>0;
│ │ │ │ +
532 if(processNextLevel) {
│ │ │ │ +
533 //restrict defect to coarse level right hand side.
│ │ │ │ +
534 ++levelContext.pinfo;
│ │ │ │ +
535 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
536 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
│ │ │ │ +
537 static_cast<const Range&>(levelContext.residual.getRedistributed()),
│ │ │ │ +
538 *levelContext.pinfo);
│ │ │ │ +
539 }
│ │ │ │ +
540 }else{
│ │ │ │ +
541 //restrict defect to coarse level right hand side.
│ │ │ │ +
542 ++levelContext.rhs;
│ │ │ │ +
543 ++levelContext.pinfo;
│ │ │ │ +
544 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
545 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
│ │ │ │ +
546 static_cast<const Range&>(*levelContext.residual), *levelContext.pinfo);
│ │ │ │ +
547 }
│ │ │ │ +
548
│ │ │ │ +
549 if(processNextLevel) {
│ │ │ │ +
550 // prepare coarse system
│ │ │ │ +
551 ++levelContext.residual;
│ │ │ │ +
552 ++levelContext.lhs;
│ │ │ │ +
553 ++levelContext.matrix;
│ │ │ │ +
554 ++levelContext.level;
│ │ │ │ +
555 ++levelContext.redist;
│ │ │ │
556
│ │ │ │ -
557 BIGINT gnoAggregates=noAggregates;
│ │ │ │ -
558 gnoAggregates = info->communicator().sum(gnoAggregates);
│ │ │ │ -
559 double dgnoAggregates = gnoAggregates.todouble();
│ │ │ │ -
560#ifdef TEST_AGGLO
│ │ │ │ -
561 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);
│ │ │ │ -
562#endif
│ │ │ │ -
563
│ │ │ │ -
564 if(criterion.debugLevel()>2 && rank==0)
│ │ │ │ -
565 std::cout << "Building "<<dgnoAggregates<<" aggregates took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
566
│ │ │ │ -
567 if(dgnoAggregates==0 || dunknowns/dgnoAggregates<criterion.minCoarsenRate())
│ │ │ │ -
568 {
│ │ │ │ -
569 if(rank==0)
│ │ │ │ -
570 {
│ │ │ │ -
571 if(dgnoAggregates>0)
│ │ │ │ -
572 std::cerr << "Stopped coarsening because of rate breakdown "<<dunknowns<<"/"<<dgnoAggregates
│ │ │ │ -
573 <<"="<<dunknowns/dgnoAggregates<<"<"
│ │ │ │ -
574 <<criterion.minCoarsenRate()<<std::endl;
│ │ │ │ -
575 else
│ │ │ │ -
576 std::cerr<< "Could not build any aggregates. Probably no connected nodes."<<std::endl;
│ │ │ │ -
577 }
│ │ │ │ -
578 aggregatesMap->free();
│ │ │ │ -
579 delete aggregatesMap;
│ │ │ │ -
580 aggregatesMaps_.pop_back();
│ │ │ │ -
581
│ │ │ │ -
582 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator().size()>1) {
│ │ │ │ -
583 // coarse level matrix was already redistributed, but to more than 1 process
│ │ │ │ -
584 // Therefore need to delete the redistribution. Further down it will
│ │ │ │ -
585 // then be redistributed to 1 process
│ │ │ │ -
586 delete &(mlevel.getRedistributed().getmat());
│ │ │ │ -
587 mlevel.deleteRedistributed();
│ │ │ │ -
588 delete &(infoLevel.getRedistributed());
│ │ │ │ -
589 infoLevel.deleteRedistributed();
│ │ │ │ -
590 redistributes_.back().resetSetup();
│ │ │ │ -
591 }
│ │ │ │ -
592
│ │ │ │ -
593 break;
│ │ │ │ -
594 }
│ │ │ │ -
595 unknowns = noAggregates;
│ │ │ │ -
596 dunknowns = dgnoAggregates;
│ │ │ │ -
597
│ │ │ │ -
598 CommunicationArgs commargs(info->communicator(),info->category());
│ │ │ │ -
599 parallelInformation_.addCoarser(commargs);
│ │ │ │ -
600
│ │ │ │ -
601 ++infoLevel; // parallel information on coarse level
│ │ │ │ +
557 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ +
558 // next level is not the globally coarsest one
│ │ │ │ +
559 ++levelContext.aggregates;
│ │ │ │ +
560 }
│ │ │ │ +
561 // prepare the lhs on the next level
│ │ │ │ +
562 *levelContext.lhs=0;
│ │ │ │ +
563 *levelContext.residual=0;
│ │ │ │ +
564 }
│ │ │ │ +
565 return processNextLevel;
│ │ │ │ +
566 }
│ │ │ │ +
567
│ │ │ │ +
568 template<class M, class X, class PI, class A>
│ │ │ │ +
569 void FastAMG<M,X,PI,A>
│ │ │ │ +
570 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel, Domain& x)
│ │ │ │ +
571 {
│ │ │ │ +
572 if(processNextLevel) {
│ │ │ │ +
573 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ +
574 // previous level is not the globally coarsest one
│ │ │ │ +
575 --levelContext.aggregates;
│ │ │ │ +
576 }
│ │ │ │ +
577 --levelContext.redist;
│ │ │ │ +
578 --levelContext.level;
│ │ │ │ +
579 //prolongate and add the correction (update is in coarse left hand side)
│ │ │ │ +
580 --levelContext.matrix;
│ │ │ │ +
581 --levelContext.residual;
│ │ │ │ +
582
│ │ │ │ +
583 }
│ │ │ │ +
584
│ │ │ │ +
585 typename Hierarchy<Domain,A>::Iterator coarseLhs = levelContext.lhs--;
│ │ │ │ +
586 if(levelContext.redist->isSetup()) {
│ │ │ │ +
587
│ │ │ │ +
588 // Need to redistribute during prolongate
│ │ │ │ +
589 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
590 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
│ │ │ │ +
591 levelContext.lhs.getRedistributed(),
│ │ │ │ +
592 matrices_->getProlongationDampingFactor(),
│ │ │ │ +
593 *levelContext.pinfo, *levelContext.redist);
│ │ │ │ +
594 }else{
│ │ │ │ +
595 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
596 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
│ │ │ │ +
597 matrices_->getProlongationDampingFactor(), *levelContext.pinfo);
│ │ │ │ +
598
│ │ │ │ +
599 // printvector(std::cout, *lhs, "prolongated coarse grid correction", "lhs", 10, 10, 10);
│ │ │ │ +
600 }
│ │ │ │ +
601
│ │ │ │
602
│ │ │ │ -
603 typename PropertyMapTypeSelector<VertexVisitedTag,PropertiesGraph>::Type visitedMap =
│ │ │ │ -
604 get(VertexVisitedTag(), *(std::get<1>(graphs)));
│ │ │ │ -
605
│ │ │ │ -
606 watch.reset();
│ │ │ │ - │ │ │ │ -
608 ::coarsen(*info,
│ │ │ │ -
609 *(std::get<1>(graphs)),
│ │ │ │ -
610 visitedMap,
│ │ │ │ -
611 *aggregatesMap,
│ │ │ │ -
612 *infoLevel,
│ │ │ │ -
613 noAggregates);
│ │ │ │ -
614 GraphCreator::free(graphs);
│ │ │ │ -
615
│ │ │ │ -
616 if(criterion.debugLevel()>2) {
│ │ │ │ -
617 if(rank==0)
│ │ │ │ -
618 std::cout<<"Coarsening of index sets took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
619 }
│ │ │ │ +
603 if(processNextLevel) {
│ │ │ │ +
604 --levelContext.rhs;
│ │ │ │ +
605 }
│ │ │ │ +
606
│ │ │ │ +
607 }
│ │ │ │ +
608
│ │ │ │ +
609
│ │ │ │ +
610 template<class M, class X, class PI, class A>
│ │ │ │ +
611 void FastAMG<M,X,PI,A>
│ │ │ │ +
612 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b)
│ │ │ │ +
613 {
│ │ │ │ +
614 constexpr auto bl = blockLevel<typename M::matrix_type>();
│ │ │ │ +
615 GaussSeidelPresmoothDefect<bl>::apply(levelContext.matrix->getmat(),
│ │ │ │ +
616 x,
│ │ │ │ +
617 *levelContext.residual,
│ │ │ │ +
618 b);
│ │ │ │ +
619 }
│ │ │ │
620
│ │ │ │ -
621 watch.reset();
│ │ │ │ -
622
│ │ │ │ -
623 infoLevel->buildGlobalLookup(aggregates);
│ │ │ │ - │ │ │ │ -
625 *info,
│ │ │ │ -
626 infoLevel->globalLookup());
│ │ │ │ -
627
│ │ │ │ -
628
│ │ │ │ -
629 if(criterion.debugLevel()>2) {
│ │ │ │ -
630 if(rank==0)
│ │ │ │ -
631 std::cout<<"Communicating global aggregate numbers took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
632 }
│ │ │ │ -
633
│ │ │ │ -
634 watch.reset();
│ │ │ │ -
635 std::vector<bool>& visited=excluded;
│ │ │ │ +
621 template<class M, class X, class PI, class A>
│ │ │ │ +
622 void FastAMG<M,X,PI,A>
│ │ │ │ +
623 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b)
│ │ │ │ +
624 {
│ │ │ │ +
625 constexpr auto bl = blockLevel<typename M::matrix_type>();
│ │ │ │ +
626 GaussSeidelPostsmoothDefect<bl>
│ │ │ │ +
627 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b);
│ │ │ │ +
628 }
│ │ │ │ +
629
│ │ │ │ +
630
│ │ │ │ +
631 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
633 {
│ │ │ │ + │ │ │ │ +
635 }
│ │ │ │ +
│ │ │ │
636
│ │ │ │ -
637 typedef std::vector<bool>::iterator Iterator;
│ │ │ │ -
638 typedef IteratorPropertyMap<Iterator, IdentityMap> VisitedMap2;
│ │ │ │ -
639 Iterator end = visited.end();
│ │ │ │ -
640 for(Iterator iter= visited.begin(); iter != end; ++iter)
│ │ │ │ -
641 *iter=false;
│ │ │ │ -
642
│ │ │ │ -
643 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());
│ │ │ │ -
644
│ │ │ │ -
645 std::shared_ptr<typename MatrixOperator::matrix_type>
│ │ │ │ -
646 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2,
│ │ │ │ -
647 *info,
│ │ │ │ -
648 *aggregatesMap,
│ │ │ │ -
649 aggregates,
│ │ │ │ -
650 OverlapFlags()));
│ │ │ │ -
651 dverb<<"Building of sparsity pattern took "<<watch.elapsed()<<std::endl;
│ │ │ │ -
652 watch.reset();
│ │ │ │ -
653 info->freeGlobalLookup();
│ │ │ │ -
654
│ │ │ │ -
655 delete std::get<0>(graphs);
│ │ │ │ -
656 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, *infoLevel, OverlapFlags());
│ │ │ │ -
657
│ │ │ │ -
658 if(criterion.debugLevel()>2) {
│ │ │ │ -
659 if(rank==0)
│ │ │ │ -
660 std::cout<<"Calculation entries of Galerkin product took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
661 }
│ │ │ │ -
662
│ │ │ │ -
663 BIGINT nonzeros = countNonZeros(*coarseMatrix);
│ │ │ │ -
664 allnonzeros = allnonzeros + infoLevel->communicator().sum(nonzeros);
│ │ │ │ -
665 MatrixArgs args(coarseMatrix, *infoLevel);
│ │ │ │ -
666
│ │ │ │ -
667 matrices_.addCoarser(args);
│ │ │ │ -
668 redistributes_.push_back(RedistributeInfoType());
│ │ │ │ -
669 } // end level loop
│ │ │ │ +
637 template<class M, class X, class PI, class A>
│ │ │ │ +
638 void FastAMG<M,X,PI,A>::mgc(LevelContext& levelContext, Domain& v, const Range& b){
│ │ │ │ +
639
│ │ │ │ +
640 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
│ │ │ │ +
641 // Solve directly
│ │ │ │ + │ │ │ │ +
643 res.converged=true; // If we do not compute this flag will not get updated
│ │ │ │ +
644 if(levelContext.redist->isSetup()) {
│ │ │ │ +
645 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed());
│ │ │ │ +
646 if(levelContext.rhs.getRedistributed().size()>0) {
│ │ │ │ +
647 // We are still participating in the computation
│ │ │ │ +
648 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
│ │ │ │ +
649 levelContext.rhs.getRedistributed());
│ │ │ │ +
650 solver_->apply(levelContext.lhs.getRedistributed(), levelContext.rhs.getRedistributed(), res);
│ │ │ │ +
651 }
│ │ │ │ +
652 levelContext.redist->redistributeBackward(v, levelContext.lhs.getRedistributed());
│ │ │ │ +
653 levelContext.pinfo->copyOwnerToAll(v, v);
│ │ │ │ +
654 }else{
│ │ │ │ +
655 levelContext.pinfo->copyOwnerToAll(b, b);
│ │ │ │ +
656 solver_->apply(v, const_cast<Range&>(b), res);
│ │ │ │ +
657 }
│ │ │ │ +
658
│ │ │ │ +
659 // printvector(std::cout, *lhs, "coarse level update", "u", 10, 10, 10);
│ │ │ │ +
660 // printvector(std::cout, *rhs, "coarse level rhs", "rhs", 10, 10, 10);
│ │ │ │ +
661 if (!res.converged)
│ │ │ │ +
662 coarsesolverconverged = false;
│ │ │ │ +
663 }else{
│ │ │ │ +
664 // presmoothing
│ │ │ │ +
665 presmooth(levelContext, v, b);
│ │ │ │ +
666 // printvector(std::cout, *lhs, "update", "u", 10, 10, 10);
│ │ │ │ +
667 // printvector(std::cout, *residual, "post presmooth residual", "r", 10);
│ │ │ │ +
668#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
│ │ │ │ +
669 bool processNextLevel = moveToCoarseLevel(levelContext);
│ │ │ │
670
│ │ │ │ -
671
│ │ │ │ -
672 infoLevel->freeGlobalLookup();
│ │ │ │ -
673
│ │ │ │ -
674 built_=true;
│ │ │ │ -
675 AggregatesMap* aggregatesMap=new AggregatesMap(0);
│ │ │ │ -
676 aggregatesMaps_.push_back(aggregatesMap);
│ │ │ │ -
677
│ │ │ │ -
678 if(criterion.debugLevel()>0) {
│ │ │ │ -
679 if(level==criterion.maxLevel()) {
│ │ │ │ -
680 BIGINT unknownsLevel = mlevel->getmat().N();
│ │ │ │ -
681 unknownsLevel = infoLevel->communicator().sum(unknownsLevel);
│ │ │ │ -
682 double dunknownsLevel = unknownsLevel.todouble();
│ │ │ │ -
683 if(rank==0 && criterion.debugLevel()>1) {
│ │ │ │ -
684 std::cout<<"Level "<<level<<" has "<<dunknownsLevel<<" unknowns, "<<dunknownsLevel/infoLevel->communicator().size()
│ │ │ │ -
685 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
│ │ │ │ -
686 }
│ │ │ │ -
687 }
│ │ │ │ -
688 }
│ │ │ │ -
689
│ │ │ │ -
690 if(criterion.accumulate() && !redistributes_.back().isSetup() &&
│ │ │ │ -
691 infoLevel->communicator().size()>1) {
│ │ │ │ -
692#if HAVE_MPI && !HAVE_PARMETIS
│ │ │ │ -
693 if(criterion.accumulate()==successiveAccu &&
│ │ │ │ -
694 infoLevel->communicator().rank()==0)
│ │ │ │ -
695 std::cerr<<"Successive accumulation of data on coarse levels only works with ParMETIS installed."
│ │ │ │ -
696 <<" Fell back to accumulation to one domain on coarsest level"<<std::endl;
│ │ │ │ -
697#endif
│ │ │ │ -
698
│ │ │ │ -
699 // accumulate to fewer processors
│ │ │ │ -
700 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
│ │ │ │ -
701 std::shared_ptr<ParallelInformation> redistComm;
│ │ │ │ -
702 int nodomains = 1;
│ │ │ │ -
703
│ │ │ │ -
704 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
│ │ │ │ -
705 redistComm, redistributes_.back(), nodomains,criterion);
│ │ │ │ -
706 MatrixArgs args(redistMat, *redistComm);
│ │ │ │ -
707 BIGINT unknownsRedist = redistMat->N();
│ │ │ │ -
708 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
│ │ │ │ -
709
│ │ │ │ -
710 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {
│ │ │ │ -
711 double dunknownsRedist = unknownsRedist.todouble();
│ │ │ │ -
712 std::cout<<"Level "<<level<<" redistributed has "<<dunknownsRedist<<" unknowns, "<<dunknownsRedist/redistComm->communicator().size()
│ │ │ │ -
713 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
│ │ │ │ -
714 }
│ │ │ │ -
715 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
│ │ │ │ -
716 infoLevel.addRedistributed(redistComm);
│ │ │ │ -
717 infoLevel->freeGlobalLookup();
│ │ │ │ -
718 }
│ │ │ │ -
719
│ │ │ │ -
720 int levels = matrices_.levels();
│ │ │ │ -
721 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);
│ │ │ │ -
722 assert(matrices_.levels()==redistributes_.size());
│ │ │ │ -
723 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)
│ │ │ │ -
724 std::cout<<"operator complexity: "<<allnonzeros.todouble()/finenonzeros.todouble()<<std::endl;
│ │ │ │ -
725
│ │ │ │ -
726 }
│ │ │ │ -
│ │ │ │ -
727
│ │ │ │ -
728 template<class M, class IS, class A>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
731 {
│ │ │ │ -
732 return matrices_;
│ │ │ │ -
733 }
│ │ │ │ -
│ │ │ │ -
734
│ │ │ │ -
735 template<class M, class IS, class A>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
738 {
│ │ │ │ -
739 return parallelInformation_;
│ │ │ │ -
740 }
│ │ │ │ -
│ │ │ │ -
741
│ │ │ │ -
742 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ -
743 void MatrixHierarchy<M,IS,A>::getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const
│ │ │ │ -
744 {
│ │ │ │ -
745 int levels=aggregatesMaps().size();
│ │ │ │ -
746 int maxlevels=parallelInformation_.finest()->communicator().max(levels);
│ │ │ │ -
747 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();
│ │ │ │ -
748 // We need an auxiliary vector for the consecutive prolongation.
│ │ │ │ -
749 std::vector<std::size_t> tmp;
│ │ │ │ -
750 std::vector<std::size_t> *coarse, *fine;
│ │ │ │ -
751
│ │ │ │ -
752 // make sure the allocated space suffices.
│ │ │ │ -
753 tmp.reserve(size);
│ │ │ │ -
754 data.reserve(size);
│ │ │ │ -
755
│ │ │ │ -
756 // Correctly assign coarse and fine for the first prolongation such that
│ │ │ │ -
757 // we end up in data in the end.
│ │ │ │ -
758 if(levels%2==0) {
│ │ │ │ -
759 coarse=&tmp;
│ │ │ │ -
760 fine=&data;
│ │ │ │ -
761 }else{
│ │ │ │ -
762 coarse=&data;
│ │ │ │ -
763 fine=&tmp;
│ │ │ │ -
764 }
│ │ │ │ -
765
│ │ │ │ -
766 // Number the unknowns on the coarsest level consecutively for each process.
│ │ │ │ -
767 if(levels==maxlevels) {
│ │ │ │ -
768 const AggregatesMap& map = *(*(++aggregatesMaps().rbegin()));
│ │ │ │ -
769 std::size_t m=0;
│ │ │ │ -
770
│ │ │ │ -
771 for(typename AggregatesMap::const_iterator iter = map.begin(); iter != map.end(); ++iter)
│ │ │ │ -
772 if(*iter< AggregatesMap::ISOLATED)
│ │ │ │ -
773 m=std::max(*iter,m);
│ │ │ │ -
774
│ │ │ │ -
775 coarse->resize(m+1);
│ │ │ │ -
776 std::size_t i=0;
│ │ │ │ -
777 srand((unsigned)std::clock());
│ │ │ │ -
778 std::set<size_t> used;
│ │ │ │ -
779 for(typename std::vector<std::size_t>::iterator iter=coarse->begin(); iter != coarse->end();
│ │ │ │ -
780 ++iter, ++i)
│ │ │ │ -
781 {
│ │ │ │ -
782 std::pair<std::set<std::size_t>::iterator,bool> ibpair
│ │ │ │ -
783 = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0)))*coarse->size());
│ │ │ │ -
784
│ │ │ │ -
785 while(!ibpair.second)
│ │ │ │ -
786 ibpair = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0))*coarse->size()));
│ │ │ │ -
787 *iter=*(ibpair.first);
│ │ │ │ -
788 }
│ │ │ │ -
789 }
│ │ │ │ -
790
│ │ │ │ -
791 typename ParallelInformationHierarchy::Iterator pinfo = parallelInformation().coarsest();
│ │ │ │ -
792 --pinfo;
│ │ │ │ -
793
│ │ │ │ -
794 // Now consecutively project the numbers to the finest level.
│ │ │ │ -
795 for(typename AggregatesMapList::const_reverse_iterator aggregates=++aggregatesMaps().rbegin();
│ │ │ │ -
796 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {
│ │ │ │ -
797
│ │ │ │ -
798 fine->resize((*aggregates)->noVertices());
│ │ │ │ -
799 fine->assign(fine->size(), 0);
│ │ │ │ - │ │ │ │ -
801 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast<std::size_t>(1), *pinfo);
│ │ │ │ -
802 --pinfo;
│ │ │ │ -
803 std::swap(coarse, fine);
│ │ │ │ -
804 }
│ │ │ │ -
805
│ │ │ │ -
806 // Assertion to check that we really projected to data on the last step.
│ │ │ │ -
807 assert(coarse==&data);
│ │ │ │ -
808 }
│ │ │ │ -
│ │ │ │ -
809
│ │ │ │ -
810 template<class M, class IS, class A>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
813 {
│ │ │ │ -
814 return aggregatesMaps_;
│ │ │ │ -
815 }
│ │ │ │ -
│ │ │ │ -
816 template<class M, class IS, class A>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
819 {
│ │ │ │ -
820 return redistributes_;
│ │ │ │ -
821 }
│ │ │ │ -
│ │ │ │ -
822
│ │ │ │ -
823 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
825 {
│ │ │ │ -
826 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;
│ │ │ │ -
827 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
│ │ │ │ -
828 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
│ │ │ │ -
829
│ │ │ │ -
830 AggregatesMapIterator amap = aggregatesMaps_.rbegin();
│ │ │ │ -
831 InfoIterator info = parallelInformation_.coarsest();
│ │ │ │ -
832 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level != finest; --level, --info, ++amap) {
│ │ │ │ -
833 (*amap)->free();
│ │ │ │ -
834 delete *amap;
│ │ │ │ -
835 }
│ │ │ │ -
836 delete *amap;
│ │ │ │ -
837 }
│ │ │ │ -
│ │ │ │ -
838
│ │ │ │ -
839 template<class M, class IS, class A>
│ │ │ │ -
840 template<class V, class BA, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
842 {
│ │ │ │ -
843 assert(hierarchy.levels()==1);
│ │ │ │ -
844 typedef typename ParallelMatrixHierarchy::ConstIterator Iterator;
│ │ │ │ -
845 typedef typename RedistributeInfoList::const_iterator RIter;
│ │ │ │ -
846 RIter redist = redistributes_.begin();
│ │ │ │ -
847
│ │ │ │ -
848 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
│ │ │ │ -
849 int level=0;
│ │ │ │ -
850 if(redist->isSetup())
│ │ │ │ -
851 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
│ │ │ │ -
852 Dune::dvverb<<"Level "<<level<<" has "<<matrices_.finest()->getmat().N()<<" unknowns!"<<std::endl;
│ │ │ │ -
853
│ │ │ │ -
854 while(matrix != coarsest) {
│ │ │ │ -
855 ++matrix; ++level; ++redist;
│ │ │ │ -
856 Dune::dvverb<<"Level "<<level<<" has "<<matrix->getmat().N()<<" unknowns!"<<std::endl;
│ │ │ │ -
857
│ │ │ │ -
858 hierarchy.addCoarser(matrix->getmat().N());
│ │ │ │ -
859 if(redist->isSetup())
│ │ │ │ -
860 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
│ │ │ │ -
861
│ │ │ │ -
862 }
│ │ │ │ -
863
│ │ │ │ -
864 }
│ │ │ │ -
│ │ │ │ -
865
│ │ │ │ -
866 template<class M, class IS, class A>
│ │ │ │ -
867 template<class S, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
869 const typename SmootherTraits<S>::Arguments& sargs) const
│ │ │ │ -
870 {
│ │ │ │ -
871 assert(smoothers.levels()==0);
│ │ │ │ -
872 typedef typename ParallelMatrixHierarchy::ConstIterator MatrixIterator;
│ │ │ │ -
873 typedef typename ParallelInformationHierarchy::ConstIterator PinfoIterator;
│ │ │ │ -
874 typedef typename AggregatesMapList::const_iterator AggregatesIterator;
│ │ │ │ -
875
│ │ │ │ - │ │ │ │ -
877 cargs.setArgs(sargs);
│ │ │ │ -
878 PinfoIterator pinfo = parallelInformation_.finest();
│ │ │ │ -
879 AggregatesIterator aggregates = aggregatesMaps_.begin();
│ │ │ │ -
880 int level=0;
│ │ │ │ -
881 for(MatrixIterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
│ │ │ │ -
882 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {
│ │ │ │ -
883 cargs.setMatrix(matrix->getmat(), **aggregates);
│ │ │ │ -
884 cargs.setComm(*pinfo);
│ │ │ │ -
885 smoothers.addCoarser(cargs);
│ │ │ │ -
886 }
│ │ │ │ -
887 if(maxlevels()>levels()) {
│ │ │ │ -
888 // This is not the globally coarsest level and therefore smoothing is needed
│ │ │ │ -
889 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);
│ │ │ │ -
890 cargs.setComm(*pinfo);
│ │ │ │ -
891 smoothers.addCoarser(cargs);
│ │ │ │ -
892 ++level;
│ │ │ │ -
893 }
│ │ │ │ -
894 }
│ │ │ │ -
│ │ │ │ -
895
│ │ │ │ -
896 template<class M, class IS, class A>
│ │ │ │ -
897 template<class F>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
899 {
│ │ │ │ -
900 typedef typename AggregatesMapList::iterator AggregatesMapIterator;
│ │ │ │ -
901 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
│ │ │ │ -
902 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
│ │ │ │ -
903
│ │ │ │ -
904 AggregatesMapIterator amap = aggregatesMaps_.begin();
│ │ │ │ -
905 BaseGalerkinProduct productBuilder;
│ │ │ │ -
906 InfoIterator info = parallelInformation_.finest();
│ │ │ │ -
907 typename RedistributeInfoList::iterator riIter = redistributes_.begin();
│ │ │ │ -
908 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();
│ │ │ │ -
909 if(level.isRedistributed()) {
│ │ │ │ -
910 info->buildGlobalLookup(level->getmat().N());
│ │ │ │ -
911 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
│ │ │ │ -
912 const_cast<Matrix&>(level.getRedistributed().getmat()),
│ │ │ │ -
913 *info,info.getRedistributed(), *riIter);
│ │ │ │ -
914 info->freeGlobalLookup();
│ │ │ │ -
915 }
│ │ │ │ -
916
│ │ │ │ -
917 for(; level!=coarsest; ++amap) {
│ │ │ │ -
918 const Matrix& fine = (level.isRedistributed() ? level.getRedistributed() : *level).getmat();
│ │ │ │ -
919 ++level;
│ │ │ │ -
920 ++info;
│ │ │ │ -
921 ++riIter;
│ │ │ │ -
922 productBuilder.calculate(fine, *(*amap), const_cast<Matrix&>(level->getmat()), *info, copyFlags);
│ │ │ │ -
923 if(level.isRedistributed()) {
│ │ │ │ -
924 info->buildGlobalLookup(level->getmat().N());
│ │ │ │ -
925 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
│ │ │ │ -
926 const_cast<Matrix&>(level.getRedistributed().getmat()), *info,
│ │ │ │ -
927 info.getRedistributed(), *riIter);
│ │ │ │ -
928 info->freeGlobalLookup();
│ │ │ │ -
929 }
│ │ │ │ -
930 }
│ │ │ │ -
931 }
│ │ │ │ -
│ │ │ │ -
932
│ │ │ │ -
933 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
935 {
│ │ │ │ -
936 return matrices_.levels();
│ │ │ │ -
937 }
│ │ │ │ -
│ │ │ │ -
938
│ │ │ │ -
939 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
941 {
│ │ │ │ -
942 return maxlevels_;
│ │ │ │ -
943 }
│ │ │ │ -
│ │ │ │ -
944
│ │ │ │ -
945 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
947 {
│ │ │ │ -
948 return levels()==maxlevels() &&
│ │ │ │ -
949 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N()>0);
│ │ │ │ -
950 }
│ │ │ │ -
│ │ │ │ -
951
│ │ │ │ -
952 template<class M, class IS, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
954 {
│ │ │ │ -
955 return built_;
│ │ │ │ -
956 }
│ │ │ │ -
│ │ │ │ -
957
│ │ │ │ -
959 } // namespace Amg
│ │ │ │ -
960} // namespace Dune
│ │ │ │ -
961
│ │ │ │ -
962#endif // end DUNE_AMG_MATRIXHIERARCHY_HH
│ │ │ │ -
Some handy generic functions for ISTL matrices.
│ │ │ │ - │ │ │ │ -
Helper classes for the construction of classes without empty constructor.
│ │ │ │ -
Provides a class for building the index set and remote indices on the coarse level.
│ │ │ │ -
Prolongation and restriction for amg.
│ │ │ │ -
Classes for the generic construction and application of the smoothers.
│ │ │ │ -
Provides classes for the Coloring process of AMG.
│ │ │ │ -
Provides classes for building the matrix graph.
│ │ │ │ -
Provides a class for building the galerkin product based on a aggregation scheme.
│ │ │ │ -
Provides a classes representing the hierarchies in AMG.
│ │ │ │ - │ │ │ │ -
Provdes class for identifying aggregates globally.
│ │ │ │ -
Provides classes for initializing the link attributes of a matrix graph.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Functionality for redistributing a sparse matrix.
│ │ │ │ -
auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
Get the number of nonzero fields in the matrix.
Definition matrixutils.hh:119
│ │ │ │ -
const AggregatesMapList & aggregatesMaps() const
Get the hierarchy of the mappings of the nodes onto aggregates.
Definition matrixhierarchy.hh:812
│ │ │ │ -
bool isBuilt() const
Whether the hierarchy was built.
Definition matrixhierarchy.hh:953
│ │ │ │ -
bool hasCoarsest() const
Definition matrixhierarchy.hh:946
│ │ │ │ -
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition hierarchy.hh:322
│ │ │ │ -
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition matrixhierarchy.hh:934
│ │ │ │ -
void addCoarser(Arguments &args)
Add an element on a coarser level.
Definition hierarchy.hh:334
│ │ │ │ -
const RedistributeInfoList & redistributeInformation() const
Get the hierarchy of the information about redistributions,.
Definition matrixhierarchy.hh:818
│ │ │ │ -
const ParallelInformationHierarchy & parallelInformation() const
Get the hierarchy of the parallel data distribution information.
Definition matrixhierarchy.hh:737
│ │ │ │ -
bool repartitionAndDistributeMatrix(const M &origMatrix, std::shared_ptr< M > newMatrix, SequentialInformation &origComm, std::shared_ptr< SequentialInformation > &newComm, RedistributeInformation< SequentialInformation > &ri, int nparts, C1 &criterion)
Definition matrixhierarchy.hh:313
│ │ │ │ -
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ -
const ParallelMatrixHierarchy & matrices() const
Get the matrix hierarchy.
Definition matrixhierarchy.hh:730
│ │ │ │ -
std::size_t maxlevels() const
Get the max number of levels in the hierarchy of processors.
Definition matrixhierarchy.hh:940
│ │ │ │ -
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ -
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ -
void recalculateGalerkin(const F &copyFlags)
Recalculate the galerkin products.
Definition matrixhierarchy.hh:898
│ │ │ │ +
671 if(processNextLevel) {
│ │ │ │ +
672 // next level
│ │ │ │ +
673 for(std::size_t i=0; i<gamma_; i++)
│ │ │ │ +
674 mgc(levelContext, *levelContext.lhs, *levelContext.rhs);
│ │ │ │ +
675 }
│ │ │ │ +
676
│ │ │ │ +
677 moveToFineLevel(levelContext, processNextLevel, v);
│ │ │ │ +
678#else
│ │ │ │ +
679 *lhs=0;
│ │ │ │ +
680#endif
│ │ │ │ +
681
│ │ │ │ +
682 if(levelContext.matrix == matrices_->matrices().finest()) {
│ │ │ │ +
683 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
│ │ │ │ +
684 if(!coarsesolverconverged)
│ │ │ │ +
685 DUNE_THROW(MathError, "Coarse solver did not converge");
│ │ │ │ +
686 }
│ │ │ │ +
687
│ │ │ │ +
688 postsmooth(levelContext, v, b);
│ │ │ │ +
689 }
│ │ │ │ +
690 }
│ │ │ │ +
691
│ │ │ │ +
692
│ │ │ │ +
694 template<class M, class X, class PI, class A>
│ │ │ │ +
│ │ │ │ +
695 void FastAMG<M,X,PI,A>::post([[maybe_unused]] Domain& x)
│ │ │ │ +
696 {
│ │ │ │ +
697 lhs_=nullptr;
│ │ │ │ +
698 rhs_=nullptr;
│ │ │ │ +
699 residual_=nullptr;
│ │ │ │ +
700 }
│ │ │ │ +
│ │ │ │ +
701
│ │ │ │ +
702 template<class M, class X, class PI, class A>
│ │ │ │ +
703 template<class A1>
│ │ │ │ +
│ │ │ │ +
704 void FastAMG<M,X,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
│ │ │ │ +
705 {
│ │ │ │ +
706 matrices_->getCoarsestAggregatesOnFinest(cont);
│ │ │ │ +
707 }
│ │ │ │ +
│ │ │ │ +
708
│ │ │ │ +
709 } // end namespace Amg
│ │ │ │ +
710} // end namespace Dune
│ │ │ │ +
711
│ │ │ │ +
712#endif
│ │ │ │ +
Define base class for scalar product and norm.
│ │ │ │ +
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ +
Provides a classes representing the hierarchies in AMG.
│ │ │ │ +
Classes for the generic construction and application of the smoothers.
│ │ │ │ +
Prolongation and restriction for amg.
│ │ │ │ + │ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ +
Classes for using SuperLU with ISTL matrices.
│ │ │ │ +
Classes for using UMFPack with ISTL matrices.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │ +
Define general preconditioner interface.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices.
│ │ │ │
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ -
void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const
Coarsen the vector hierarchy according to the matrix hierarchy.
Definition matrixhierarchy.hh:841
│ │ │ │ -
const AggregateDescriptor * const_iterator
Definition aggregates.hh:723
│ │ │ │ -
MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr< ParallelInformation > pinfo=std::make_shared< ParallelInformation >())
Constructor.
Definition matrixhierarchy.hh:389
│ │ │ │ -
AccumulationMode
Identifiers for the different accumulation modes.
Definition parameters.hh:232
│ │ │ │ -
Iterator finest()
Get an iterator positioned at the finest level.
Definition hierarchy.hh:377
│ │ │ │ -
void build(const T &criterion)
Build the matrix hierarchy using aggregation.
Definition matrixhierarchy.hh:400
│ │ │ │ -
void free()
Free the allocated memory.
│ │ │ │ -
void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename SmootherTraits< S >::Arguments &args) const
Coarsen the smoother hierarchy according to the matrix hierarchy.
Definition matrixhierarchy.hh:868
│ │ │ │ -
void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
Build the dependency of the matrix graph.
│ │ │ │ -
std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
Build the aggregates.
│ │ │ │ -
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
Calculate the galerkin product.
│ │ │ │ -
void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const
Get the mapping of fine level unknowns to coarse level aggregates.
Definition matrixhierarchy.hh:743
│ │ │ │ -
~MatrixHierarchy()
Definition matrixhierarchy.hh:824
│ │ │ │ -
@ MAX_PROCESSES
Hard limit for the number of processes allowed.
Definition matrixhierarchy.hh:50
│ │ │ │ -
@ atOnceAccu
Accumulate data to one process at once.
Definition parameters.hh:244
│ │ │ │ -
@ successiveAccu
Successively accumulate to fewer processes.
Definition parameters.hh:248
│ │ │ │ +
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ +
int iterations
The numbe of iterations to perform.
Definition smoother.hh:47
│ │ │ │ +
OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
The iterator over the matrices.
Definition fastamg.hh:184
│ │ │ │ +
void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
Get the aggregate number of each unknown on the coarsest level.
Definition fastamg.hh:704
│ │ │ │ +
ParallelInformationHierarchy::Iterator pinfo
The iterator over the parallel information.
Definition fastamg.hh:188
│ │ │ │ +
void recalculateHierarchy()
Recalculate the matrix hierarchy.
Definition fastamg.hh:150
│ │ │ │ +
void post(Domain &x)
Clean up.
Definition fastamg.hh:695
│ │ │ │ +
std::size_t maxlevels()
Definition fastamg.hh:481
│ │ │ │ +
X Domain
The domain type.
Definition fastamg.hh:77
│ │ │ │ +
Hierarchy< Domain, A >::Iterator residual
The iterator over the residuals.
Definition fastamg.hh:204
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition fastamg.hh:123
│ │ │ │ +
MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
The operator hierarchy type.
Definition fastamg.hh:72
│ │ │ │ +
OperatorHierarchy::RedistributeInfoList::const_iterator redist
The iterator over the redistribution information.
Definition fastamg.hh:192
│ │ │ │ +
X Range
The range type.
Definition fastamg.hh:79
│ │ │ │ +
PI ParallelInformation
The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
Definition fastamg.hh:70
│ │ │ │ +
M Operator
The matrix operator type.
Definition fastamg.hh:63
│ │ │ │ +
std::size_t levels()
Definition fastamg.hh:476
│ │ │ │ +
InverseOperator< X, X > CoarseSolver
the type of the coarse solver.
Definition fastamg.hh:81
│ │ │ │ +
bool usesDirectCoarseLevelSolver() const
Check whether the coarse solver used is a direct solver.
Definition fastamg.hh:632
│ │ │ │ +
Hierarchy< Domain, A >::Iterator lhs
The iterator over the left hand side.
Definition fastamg.hh:200
│ │ │ │ +
Hierarchy< Range, A >::Iterator rhs
The iterator over the right hand sided.
Definition fastamg.hh:208
│ │ │ │ +
std::size_t level
The level index.
Definition fastamg.hh:212
│ │ │ │ +
void apply(Domain &v, const Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition fastamg.hh:488
│ │ │ │ +
OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
The parallal data distribution hierarchy type.
Definition fastamg.hh:74
│ │ │ │ +
void pre(Domain &x, Range &b)
Prepare the preconditioner.
Definition fastamg.hh:427
│ │ │ │ +
FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const Parameters &parms, bool symmetric=true)
Construct a new amg with a specific coarse solver.
Definition fastamg.hh:297
│ │ │ │ +
OperatorHierarchy::AggregatesMapList::const_iterator aggregates
The iterator over the aggregates maps.
Definition fastamg.hh:196
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
Definition matrixutils.hh:154
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition matrixredistribute.hh:757
│ │ │ │ -
bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
Definition repartition.hh:829
│ │ │ │ -
void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Redistribute a matrix according to given domain decompositions.
Definition matrixredistribute.hh:820
│ │ │ │ -
bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
execute a graph repartition for a giving graph and indexset.
Definition repartition.hh:1235
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │ -
Definition matrixredistribute.hh:22
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ -
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ -
Definition galerkin.hh:99
│ │ │ │ -
Definition galerkin.hh:118
│ │ │ │ -
Definition globalaggregates.hh:131
│ │ │ │ -
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ -
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ -
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:988
│ │ │ │ -
Definition graphcreator.hh:22
│ │ │ │ -
A hierarchy of containers (e.g. matrices or vectors)
Definition hierarchy.hh:40
│ │ │ │ -
LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ -
LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const MatrixOperator > ConstIterator
Type of the const iterator.
Definition hierarchy.hh:219
│ │ │ │ -
Definition indicescoarsener.hh:36
│ │ │ │ +
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ +
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ +
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ +
A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth.
Definition fastamg.hh:60
│ │ │ │ +
static void apply(const M &A, X &x, Y &d, const Y &b)
Definition fastamgsmoother.hh:19
│ │ │ │ + │ │ │ │ +
LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ +
Iterator over the levels in the hierarchy.
Definition hierarchy.hh:120
│ │ │ │
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ -
typename std::allocator_traits< Allocator >::template rebind_alloc< AggregatesMap * > AAllocator
Allocator for pointers.
Definition matrixhierarchy.hh:85
│ │ │ │ -
Dune::Amg::Hierarchy< ParallelInformation, Allocator > ParallelInformationHierarchy
The type of the parallel informarion hierarchy.
Definition matrixhierarchy.hh:82
│ │ │ │ -
std::list< AggregatesMap *, AAllocator > AggregatesMapList
The type of the aggregates maps list.
Definition matrixhierarchy.hh:88
│ │ │ │ -
PI ParallelInformation
The type of the index set.
Definition matrixhierarchy.hh:70
│ │ │ │ -
Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy
The type of the parallel matrix hierarchy.
Definition matrixhierarchy.hh:79
│ │ │ │ -
A Allocator
The allocator to use.
Definition matrixhierarchy.hh:73
│ │ │ │ -
RedistributeInformation< ParallelInformation > RedistributeInfoType
The type of the redistribute information.
Definition matrixhierarchy.hh:91
│ │ │ │ -
double getProlongationDampingFactor() const
Definition matrixhierarchy.hh:188
│ │ │ │ -
typename std::allocator_traits< Allocator >::template rebind_alloc< RedistributeInfoType > RILAllocator
Allocator for RedistributeInfoType.
Definition matrixhierarchy.hh:94
│ │ │ │ -
std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList
The type of the list of redistribute information.
Definition matrixhierarchy.hh:97
│ │ │ │ -
Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > AggregatesMap
The type of the aggregates map we use.
Definition matrixhierarchy.hh:76
│ │ │ │ -
MatrixOperator::matrix_type Matrix
The type of the matrix.
Definition matrixhierarchy.hh:67
│ │ │ │ -
M MatrixOperator
The type of the matrix operator.
Definition matrixhierarchy.hh:64
│ │ │ │ -
void operator()(const matrix_row &row)
Definition matrixhierarchy.hh:254
│ │ │ │ -
Matrix::row_type matrix_row
Definition matrixhierarchy.hh:245
│ │ │ │ -
size_type min
Definition matrixhierarchy.hh:261
│ │ │ │ - │ │ │ │ -
size_type max
Definition matrixhierarchy.hh:262
│ │ │ │ -
size_type sum
Definition matrixhierarchy.hh:263
│ │ │ │ -
Matrix::size_type size_type
Definition matrixhierarchy.hh:244
│ │ │ │ -
The criterion describing the stop criteria for the coarsening process.
Definition matrixhierarchy.hh:283
│ │ │ │ -
CoarsenCriterion(const Dune::Amg::Parameters &parms)
Definition matrixhierarchy.hh:306
│ │ │ │ -
T AggregationCriterion
The criterion for tagging connections as strong and nodes as isolated. This might be e....
Definition matrixhierarchy.hh:289
│ │ │ │ -
CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition matrixhierarchy.hh:301
│ │ │ │
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
Tag idnetifying the visited property of a vertex.
Definition properties.hh:29
│ │ │ │
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ -
Definition transfer.hh:32
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Sequential SSOR preconditioner.
Definition preconditioners.hh:141
│ │ │ │ +
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
Definition solvertype.hh:16
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1288 +1,825 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -matrixhierarchy.hh │ │ │ │ │ +fastamg.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH │ │ │ │ │ -6#define DUNE_AMG_MATRIXHIERARCHY_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_FASTAMG_HH │ │ │ │ │ +6#define DUNE_ISTL_FASTAMG_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ -11#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -12#include "_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ -13#include "_r_e_n_u_m_b_e_r_e_r_._h_h" │ │ │ │ │ -14#include "_g_r_a_p_h_c_r_e_a_t_o_r_._h_h" │ │ │ │ │ -15#include "_h_i_e_r_a_r_c_h_y_._h_h" │ │ │ │ │ -16#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -17#include │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_d_e_p_e_n_d_e_n_c_y_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_r_a_p_h_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_i_n_d_i_c_e_s_c_o_a_r_s_e_n_e_r_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_l_o_b_a_l_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ -27 │ │ │ │ │ -28namespace _D_u_n_e │ │ │ │ │ -29{ │ │ │ │ │ -30 namespace Amg │ │ │ │ │ -31 { │ │ │ │ │ -42 enum { │ │ │ │ │ -50 _M_A_X___P_R_O_C_E_S_S_E_S = 72000 │ │ │ │ │ -_5_1 }; │ │ │ │ │ -52 │ │ │ │ │ -59 template > │ │ │ │ │ -_6_0 class _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -61 { │ │ │ │ │ -62 public: │ │ │ │ │ -_6_4 typedef M _M_a_t_r_i_x_O_p_e_r_a_t_o_r; │ │ │ │ │ -65 │ │ │ │ │ -_6_7 typedef typename MatrixOperator::matrix_type _M_a_t_r_i_x; │ │ │ │ │ -68 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ +13#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22#include "_f_a_s_t_a_m_g_s_m_o_o_t_h_e_r_._h_h" │ │ │ │ │ +23 │ │ │ │ │ +32namespace _D_u_n_e │ │ │ │ │ +33{ │ │ │ │ │ +34 namespace Amg │ │ │ │ │ +35 { │ │ │ │ │ +58 template > │ │ │ │ │ +_5_9 class _F_a_s_t_A_M_G : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +60 { │ │ │ │ │ +61 public: │ │ │ │ │ +_6_3 typedef M _O_p_e_r_a_t_o_r; │ │ │ │ │ _7_0 typedef PI _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -71 │ │ │ │ │ -_7_3 typedef A _A_l_l_o_c_a_t_o_r; │ │ │ │ │ -74 │ │ │ │ │ -_7_6 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_>_:_: │ │ │ │ │ -_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r> _A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ -77 │ │ │ │ │ -_7_9 typedef _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_A_l_l_o_c_a_t_o_r_> │ │ │ │ │ -_P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -80 │ │ │ │ │ -_8_2 typedef _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_A_l_l_o_c_a_t_o_r_> │ │ │ │ │ +_7_2 typedef _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_> _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y; │ │ │ │ │ +_7_4 typedef typename _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -83 │ │ │ │ │ -_8_5 using _A_A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc; │ │ │ │ │ -86 │ │ │ │ │ -_8_8 typedef std::list _A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t; │ │ │ │ │ -89 │ │ │ │ │ -_9_1 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e; │ │ │ │ │ -92 │ │ │ │ │ -_9_4 using _R_I_L_A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc; │ │ │ │ │ -95 │ │ │ │ │ -_9_7 typedef std::list _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t; │ │ │ │ │ -98 │ │ │ │ │ -104 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y(std::shared_ptr fineMatrix, │ │ │ │ │ -105 std::shared_ptr pinfo = std:: │ │ │ │ │ -make_shared()); │ │ │ │ │ -106 │ │ │ │ │ -107 _~_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y(); │ │ │ │ │ -108 │ │ │ │ │ -114 template │ │ │ │ │ -115 void _b_u_i_l_d(const T& criterion); │ │ │ │ │ -116 │ │ │ │ │ -124 template │ │ │ │ │ -125 void _r_e_c_a_l_c_u_l_a_t_e_G_a_l_e_r_k_i_n(const F& copyFlags); │ │ │ │ │ -126 │ │ │ │ │ -131 template │ │ │ │ │ -132 void _c_o_a_r_s_e_n_V_e_c_t_o_r(_H_i_e_r_a_r_c_h_y<_B_l_o_c_k_V_e_c_t_o_r_<_V_,_B_A_>, TA>& hierarchy) const; │ │ │ │ │ -133 │ │ │ │ │ -139 template │ │ │ │ │ -140 void _c_o_a_r_s_e_n_S_m_o_o_t_h_e_r(_H_i_e_r_a_r_c_h_y_<_S_,_T_A_>& smoothers, │ │ │ │ │ -141 const typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_>_:_:_A_r_g_u_m_e_n_t_s& args) const; │ │ │ │ │ -142 │ │ │ │ │ -147 std::size_t _l_e_v_e_l_s() const; │ │ │ │ │ -148 │ │ │ │ │ -153 std::size_t _m_a_x_l_e_v_e_l_s() const; │ │ │ │ │ +75 │ │ │ │ │ +_7_7 typedef X _D_o_m_a_i_n; │ │ │ │ │ +_7_9 typedef X _R_a_n_g_e; │ │ │ │ │ +_8_1 typedef _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_X_> _C_o_a_r_s_e_S_o_l_v_e_r; │ │ │ │ │ +82 │ │ │ │ │ +90 _F_a_s_t_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& coarseSolver, │ │ │ │ │ +91 const _P_a_r_a_m_e_t_e_r_s& parms, │ │ │ │ │ +92 bool symmetric=true); │ │ │ │ │ +93 │ │ │ │ │ +105 template │ │ │ │ │ +106 _F_a_s_t_A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ +107 const _P_a_r_a_m_e_t_e_r_s& parms=_P_a_r_a_m_e_t_e_r_s(), │ │ │ │ │ +108 bool symmetric=true, │ │ │ │ │ +109 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ +110 │ │ │ │ │ +114 _F_a_s_t_A_M_G(const _F_a_s_t_A_M_G& amg); │ │ │ │ │ +115 │ │ │ │ │ +117 void _p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b); │ │ │ │ │ +118 │ │ │ │ │ +120 void _a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d); │ │ │ │ │ +121 │ │ │ │ │ +_1_2_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +124 { │ │ │ │ │ +125 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +126 } │ │ │ │ │ +127 │ │ │ │ │ +129 void _p_o_s_t(_D_o_m_a_i_n& x); │ │ │ │ │ +130 │ │ │ │ │ +135 template │ │ │ │ │ +136 void _g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont); │ │ │ │ │ +137 │ │ │ │ │ +138 std::size_t _l_e_v_e_l_s(); │ │ │ │ │ +139 │ │ │ │ │ +140 std::size_t _m_a_x_l_e_v_e_l_s(); │ │ │ │ │ +141 │ │ │ │ │ +_1_5_0 void _r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y() │ │ │ │ │ +151 { │ │ │ │ │ +152 matrices_->recalculateGalerkin(NegateSet()); │ │ │ │ │ +153 } │ │ │ │ │ 154 │ │ │ │ │ -155 bool _h_a_s_C_o_a_r_s_e_s_t() const; │ │ │ │ │ -156 │ │ │ │ │ -161 bool _i_s_B_u_i_l_t() const; │ │ │ │ │ -162 │ │ │ │ │ -167 const _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y& _m_a_t_r_i_c_e_s() const; │ │ │ │ │ -168 │ │ │ │ │ -173 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y& _p_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n() const; │ │ │ │ │ -174 │ │ │ │ │ -179 const _A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t& _a_g_g_r_e_g_a_t_e_s_M_a_p_s() const; │ │ │ │ │ -180 │ │ │ │ │ -186 const _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t& _r_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n() const; │ │ │ │ │ -187 │ │ │ │ │ -_1_8_8 double _g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r() const │ │ │ │ │ -189 { │ │ │ │ │ -190 return prolongDamp_; │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -203 void _g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_s_O_n_F_i_n_e_s_t(std::vector& data) const; │ │ │ │ │ -204 │ │ │ │ │ -205 private: │ │ │ │ │ -206 typedef typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_a_t_r_i_x_O_p_e_r_a_t_o_r_>_:_:_A_r_g_u_m_e_n_t_s MatrixArgs; │ │ │ │ │ -207 typedef typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -CommunicationArgs; │ │ │ │ │ -209 _A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t aggregatesMaps_; │ │ │ │ │ -211 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t redistributes_; │ │ │ │ │ -213 _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y matrices_; │ │ │ │ │ -215 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y parallelInformation_; │ │ │ │ │ -216 │ │ │ │ │ -218 bool built_; │ │ │ │ │ -219 │ │ │ │ │ -221 int maxlevels_; │ │ │ │ │ -222 │ │ │ │ │ -223 double prolongDamp_; │ │ │ │ │ -224 │ │ │ │ │ -228 template │ │ │ │ │ -229 struct MatrixStats │ │ │ │ │ -230 { │ │ │ │ │ -231 │ │ │ │ │ -235 static void stats([[maybe_unused]] const _M_a_t_r_i_x& matrix) │ │ │ │ │ -236 {} │ │ │ │ │ -237 }; │ │ │ │ │ -238 │ │ │ │ │ -239 template │ │ │ │ │ -240 struct MatrixStats<_M_a_t_r_i_x,true> │ │ │ │ │ -241 { │ │ │ │ │ -_2_4_2 struct calc │ │ │ │ │ -243 { │ │ │ │ │ -_2_4_4 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -_2_4_5 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _m_a_t_r_i_x___r_o_w; │ │ │ │ │ -246 │ │ │ │ │ -_2_4_7 _c_a_l_c() │ │ │ │ │ -248 { │ │ │ │ │ -249 min=std::numeric_limits::max(); │ │ │ │ │ -250 max=0; │ │ │ │ │ -251 sum=0; │ │ │ │ │ -252 } │ │ │ │ │ -253 │ │ │ │ │ -_2_5_4 void _o_p_e_r_a_t_o_r_(_)(const _m_a_t_r_i_x___r_o_w& row) │ │ │ │ │ -255 { │ │ │ │ │ -256 min=std::min(min, row.size()); │ │ │ │ │ -257 max=std::max(max, row.size()); │ │ │ │ │ -258 sum += row.size(); │ │ │ │ │ -259 } │ │ │ │ │ -260 │ │ │ │ │ -_2_6_1 _s_i_z_e___t_y_p_e _m_i_n; │ │ │ │ │ -_2_6_2 _s_i_z_e___t_y_p_e _m_a_x; │ │ │ │ │ -_2_6_3 _s_i_z_e___t_y_p_e _s_u_m; │ │ │ │ │ -264 }; │ │ │ │ │ -268 static void stats(const _M_a_t_r_i_x& matrix) │ │ │ │ │ -269 { │ │ │ │ │ -270 calc c= for_each(matrix.begin(), matrix.end(), calc()); │ │ │ │ │ -271 dinfo<<"Matrix row: min="< │ │ │ │ │ -_3_2_6 bool _r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(const M& origMatrix, │ │ │ │ │ -327 std::shared_ptr newMatrix, │ │ │ │ │ -328 C& origComm, │ │ │ │ │ -329 std::shared_ptr& newComm, │ │ │ │ │ -330 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri, │ │ │ │ │ -331 int nparts, C1& criterion) │ │ │ │ │ -332 { │ │ │ │ │ -333 Timer time; │ │ │ │ │ -334#ifdef AMG_REPART_ON_COMM_GRAPH │ │ │ │ │ -335 // Done not repartition the matrix graph, but a graph of the communication │ │ │ │ │ -scheme. │ │ │ │ │ -336 bool existentOnRedist=_D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(origMatrix, origComm, │ │ │ │ │ -nparts, newComm, │ │ │ │ │ -337 ri.getInterface(), │ │ │ │ │ -338 criterion.debugLevel()>1); │ │ │ │ │ -339 │ │ │ │ │ -340#else │ │ │ │ │ -341 typedef _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_> _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ -342 typedef _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h, │ │ │ │ │ -343 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -344 _E_d_g_e_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -345 IdentityMap, │ │ │ │ │ -346 IdentityMap> _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ -347 _M_a_t_r_i_x_G_r_a_p_h graph(origMatrix); │ │ │ │ │ -348 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h pgraph(graph); │ │ │ │ │ -349 _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(pgraph, origMatrix, criterion, false); │ │ │ │ │ -350 │ │ │ │ │ -351#ifdef DEBUG_REPART │ │ │ │ │ -352 if(origComm.communicator().rank()==0) │ │ │ │ │ -353 std::cout<<"Original matrix"<1); │ │ │ │ │ -360#endif // if else AMG_REPART │ │ │ │ │ -361 │ │ │ │ │ -362 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1) │ │ │ │ │ -363 std::cout<<"Repartitioning took "<indexSet(), │ │ │ │ │ -origComm.communicator()); │ │ │ │ │ -369#endif │ │ │ │ │ -370 │ │ │ │ │ -371 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(const_cast(origMatrix), *newMatrix, origComm, │ │ │ │ │ -*newComm, ri); │ │ │ │ │ -372 │ │ │ │ │ -373#ifdef DEBUG_REPART │ │ │ │ │ -374 if(origComm.communicator().rank()==0) │ │ │ │ │ -375 std::cout<<"Original matrix"<communicator().size()>0) │ │ │ │ │ -378 _p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x(*newMatrix, *newComm, std::cout); │ │ │ │ │ -379 origComm.communicator().barrier(); │ │ │ │ │ -380#endif │ │ │ │ │ -381 │ │ │ │ │ -382 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1) │ │ │ │ │ -383 std::cout<<"Redistributing matrix took "< │ │ │ │ │ -_3_8_9 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y(std::shared_ptr │ │ │ │ │ -fineMatrix, │ │ │ │ │ -390 std::shared_ptr pinfo) │ │ │ │ │ -391 : matrices_(fineMatrix), │ │ │ │ │ -392 parallelInformation_(pinfo) │ │ │ │ │ +159 bool _u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const; │ │ │ │ │ +160 │ │ │ │ │ +161 private: │ │ │ │ │ +168 template │ │ │ │ │ +169 void createHierarchies(C& criterion, │ │ │ │ │ +170 const std::shared_ptr& matrixptr, │ │ │ │ │ +171 const PI& pinfo); │ │ │ │ │ +172 │ │ │ │ │ +179 struct LevelContext │ │ │ │ │ +180 { │ │ │ │ │ +_1_8_4 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _m_a_t_r_i_x; │ │ │ │ │ +_1_8_8 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r _p_i_n_f_o; │ │ │ │ │ +_1_9_2 typename OperatorHierarchy::RedistributeInfoList::const_iterator _r_e_d_i_s_t; │ │ │ │ │ +_1_9_6 typename OperatorHierarchy::AggregatesMapList::const_iterator _a_g_g_r_e_g_a_t_e_s; │ │ │ │ │ +_2_0_0 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _l_h_s; │ │ │ │ │ +_2_0_4 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _r_e_s_i_d_u_a_l; │ │ │ │ │ +_2_0_8 typename _H_i_e_r_a_r_c_h_y_<_R_a_n_g_e_,_A_>_:_:_I_t_e_r_a_t_o_r _r_h_s; │ │ │ │ │ +_2_1_2 std::size_t _l_e_v_e_l; │ │ │ │ │ +213 }; │ │ │ │ │ +214 │ │ │ │ │ +216 void mgc(LevelContext& levelContext, _D_o_m_a_i_n& x, const _R_a_n_g_e& b); │ │ │ │ │ +217 │ │ │ │ │ +224 void presmooth(LevelContext& levelContext, _D_o_m_a_i_n& x, const _R_a_n_g_e& b); │ │ │ │ │ +225 │ │ │ │ │ +232 void postsmooth(LevelContext& levelContext, _D_o_m_a_i_n& x, const _R_a_n_g_e& b); │ │ │ │ │ +233 │ │ │ │ │ +240 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel, │ │ │ │ │ +241 _D_o_m_a_i_n& fineX); │ │ │ │ │ +242 │ │ │ │ │ +247 bool moveToCoarseLevel(LevelContext& levelContext); │ │ │ │ │ +248 │ │ │ │ │ +253 void initIteratorsWithFineLevel(LevelContext& levelContext); │ │ │ │ │ +254 │ │ │ │ │ +256 std::shared_ptr matrices_; │ │ │ │ │ +258 std::shared_ptr solver_; │ │ │ │ │ +260 std::shared_ptr> rhs_; │ │ │ │ │ +262 std::shared_ptr> lhs_; │ │ │ │ │ +264 std::shared_ptr> residual_; │ │ │ │ │ +265 │ │ │ │ │ +267 using _S_c_a_l_a_r_P_r_o_d_u_c_t = _D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>; │ │ │ │ │ +269 std::shared_ptr scalarProduct_; │ │ │ │ │ +271 std::size_t gamma_; │ │ │ │ │ +273 std::size_t preSteps_; │ │ │ │ │ +275 std::size_t postSteps_; │ │ │ │ │ +276 std::size_t level; │ │ │ │ │ +277 bool buildHierarchy_; │ │ │ │ │ +278 bool symmetric; │ │ │ │ │ +279 bool coarsesolverconverged; │ │ │ │ │ +280 typedef _S_e_q_S_S_O_R_<_t_y_p_e_n_a_m_e_ _M_:_:_m_a_t_r_i_x___t_y_p_e_,_X_,_X_> _S_m_o_o_t_h_e_r; │ │ │ │ │ +281 typedef std::shared_ptr SmootherPointer; │ │ │ │ │ +282 SmootherPointer coarseSmoother_; │ │ │ │ │ +284 std::size_t verbosity_; │ │ │ │ │ +285 }; │ │ │ │ │ +286 │ │ │ │ │ +287 template │ │ │ │ │ +_2_8_8 _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_F_a_s_t_A_M_G(const _F_a_s_t_A_M_G& amg) │ │ │ │ │ +289 : matrices_(amg.matrices_), solver_(amg.solver_), │ │ │ │ │ +290 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_), │ │ │ │ │ +291 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_), │ │ │ │ │ +292 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged), │ │ │ │ │ +293 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_) │ │ │ │ │ +294 {} │ │ │ │ │ +295 │ │ │ │ │ +296 template │ │ │ │ │ +_2_9_7 _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_F_a_s_t_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& │ │ │ │ │ +coarseSolver, │ │ │ │ │ +298 const _P_a_r_a_m_e_t_e_r_s& parms, bool symmetric_) │ │ │ │ │ +299 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver), │ │ │ │ │ +300 rhs_(), lhs_(), residual_(), scalarProduct_(), │ │ │ │ │ +301 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()), │ │ │ │ │ +302 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false), │ │ │ │ │ +303 symmetric(symmetric_), coarsesolverconverged(true), │ │ │ │ │ +304 coarseSmoother_(), verbosity_(parms.debugLevel()) │ │ │ │ │ +305 { │ │ │ │ │ +306 if(preSteps_>1||postSteps_>1) │ │ │ │ │ +307 { │ │ │ │ │ +308 std::cerr<<"WARNING only one step of smoothing is supported!"<isBuilt()); │ │ │ │ │ +312 static_assert(std::is_same::value, │ │ │ │ │ +313 "Currently only sequential runs are supported"); │ │ │ │ │ +314 } │ │ │ │ │ +315 template │ │ │ │ │ +316 template │ │ │ │ │ +_3_1_7 _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_F_a_s_t_A_M_G(const _O_p_e_r_a_t_o_r& matrix, │ │ │ │ │ +318 const C& criterion, │ │ │ │ │ +319 const _P_a_r_a_m_e_t_e_r_s& parms, │ │ │ │ │ +320 bool symmetric_, │ │ │ │ │ +321 const PI& pinfo) │ │ │ │ │ +322 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_ │ │ │ │ │ +(parms.getGamma()), │ │ │ │ │ +323 preSteps_(parms.getNoPreSmoothSteps()), postSteps_ │ │ │ │ │ +(parms.getNoPostSmoothSteps()), │ │ │ │ │ +324 buildHierarchy_(true), │ │ │ │ │ +325 symmetric(symmetric_), coarsesolverconverged(true), │ │ │ │ │ +326 coarseSmoother_(), verbosity_(criterion.debugLevel()) │ │ │ │ │ +327 { │ │ │ │ │ +328 if(preSteps_>1||postSteps_>1) │ │ │ │ │ +329 { │ │ │ │ │ +330 std::cerr<<"WARNING only one step of smoothing is supported!"<::value, │ │ │ │ │ +334 "Currently only sequential runs are supported"); │ │ │ │ │ +335 // TODO: reestablish compile time checks. │ │ │ │ │ +336 //static_assert(static_cast(PI::category)==static_cast(S:: │ │ │ │ │ +category), │ │ │ │ │ +337 // "Matrix and Solver must match in terms of category!"); │ │ │ │ │ +338 auto matrixptr = stackobject_to_shared_ptr(matrix); │ │ │ │ │ +339 createHierarchies(criterion, matrixptr, pinfo); │ │ │ │ │ +340 } │ │ │ │ │ +341 │ │ │ │ │ +342 template │ │ │ │ │ +343 template │ │ │ │ │ +344 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_c_r_e_a_t_e_H_i_e_r_a_r_c_h_i_e_s(C& criterion, │ │ │ │ │ +345 const std::shared_ptr& matrixptr, │ │ │ │ │ +346 const PI& pinfo) │ │ │ │ │ +347 { │ │ │ │ │ +348 Timer watch; │ │ │ │ │ +349 matrices_ = std::make_shared( │ │ │ │ │ +350 std::const_pointer_cast(matrixptr), │ │ │ │ │ +351 stackobject_to_shared_ptr(const_cast(pinfo))); │ │ │ │ │ +352 │ │ │ │ │ +353 matrices_->template build >(criterion); │ │ │ │ │ +354 │ │ │ │ │ +355 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator │ │ │ │ │ +().rank()==0) │ │ │ │ │ +356 std::cout<<"Building Hierarchy of "<maxlevels()<<" levels took │ │ │ │ │ +"<levels()==matrices_->maxlevels()) { │ │ │ │ │ +359 // We have the carsest level. Create the coarse Solver │ │ │ │ │ +360 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s SmootherArgs; │ │ │ │ │ +361 SmootherArgs sargs; │ │ │ │ │ +362 sargs._i_t_e_r_a_t_i_o_n_s = 1; │ │ │ │ │ +363 │ │ │ │ │ +364 typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s cargs; │ │ │ │ │ +365 cargs.setArgs(sargs); │ │ │ │ │ +366 if(matrices_->redistributeInformation().back().isSetup()) { │ │ │ │ │ +367 // Solve on the redistributed partitioning │ │ │ │ │ +368 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat │ │ │ │ │ +()); │ │ │ │ │ +369 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ +()); │ │ │ │ │ +370 }else{ │ │ │ │ │ +371 cargs.setMatrix(matrices_->matrices().coarsest()->getmat()); │ │ │ │ │ +372 cargs.setComm(*matrices_->parallelInformation().coarsest()); │ │ │ │ │ +373 } │ │ │ │ │ +374 │ │ │ │ │ +375 coarseSmoother_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_c_o_n_s_t_r_u_c_t(cargs); │ │ │ │ │ +376 scalarProduct_ = createScalarProduct(cargs.getComm(),category()); │ │ │ │ │ +377 │ │ │ │ │ +378#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +379#if HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +380#define DIRECTSOLVER UMFPack │ │ │ │ │ +381#else │ │ │ │ │ +382#define DIRECTSOLVER SuperLU │ │ │ │ │ +383#endif │ │ │ │ │ +384 // Use superlu if we are purely sequential or with only one processor on │ │ │ │ │ +the coarsest level. │ │ │ │ │ +385 if(std::is_same::value / │ │ │ │ │ +/ sequential mode │ │ │ │ │ +386 || matrices_->parallelInformation().coarsest()->communicator().size()==1 // │ │ │ │ │ +parallel mode and only one processor │ │ │ │ │ +387 || (matrices_->parallelInformation().coarsest().isRedistributed() │ │ │ │ │ +388 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ +().communicator().size()==1 │ │ │ │ │ +389 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ +().communicator().size()>0)) { // redistribute and 1 proc │ │ │ │ │ +390 if(verbosity_>0 && matrices_->parallelInformation().coarsest()- │ │ │ │ │ +>communicator().rank()==0) │ │ │ │ │ +391 std::cout<<"Using superlu"<parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ 393 { │ │ │ │ │ -394 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*fineMatrix) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -(*pinfo)) │ │ │ │ │ -395 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "MatrixOperator and ParallelInformation must belong │ │ │ │ │ -to the same category!"); │ │ │ │ │ -396 } │ │ │ │ │ -397 │ │ │ │ │ -398 template │ │ │ │ │ -399 template │ │ │ │ │ -_4_0_0 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_b_u_i_l_d(const T& criterion) │ │ │ │ │ -401 { │ │ │ │ │ -402 prolongDamp_ = criterion.getProlongationDampingFactor(); │ │ │ │ │ -403 typedef O OverlapFlags; │ │ │ │ │ -404 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r MatIterator; │ │ │ │ │ -405 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r PInfoIterator; │ │ │ │ │ -406 │ │ │ │ │ -407 static const int noints=(_D_u_n_e_:_:_A_m_g_:_:_M_A_X___P_R_O_C_E_S_S_E_S/4096>0) ? (_D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ -_M_A_X___P_R_O_C_E_S_S_E_S/4096) : 1; │ │ │ │ │ -408 │ │ │ │ │ -409 typedef bigunsignedint BIGINT; │ │ │ │ │ -410 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> productBuilder; │ │ │ │ │ -411 MatIterator mlevel = matrices_.finest(); │ │ │ │ │ -412 MatrixStats::stats(mlevel->getmat()); │ │ │ │ │ -413 │ │ │ │ │ -414 PInfoIterator infoLevel = parallelInformation_.finest(); │ │ │ │ │ -415 BIGINT finenonzeros=_c_o_u_n_t_N_o_n_Z_e_r_o_s(mlevel->getmat()); │ │ │ │ │ -416 finenonzeros = infoLevel->communicator().sum(finenonzeros); │ │ │ │ │ -417 BIGINT allnonzeros = finenonzeros; │ │ │ │ │ -418 │ │ │ │ │ -419 │ │ │ │ │ -420 int level = 0; │ │ │ │ │ -421 int rank = 0; │ │ │ │ │ -422 │ │ │ │ │ -423 BIGINT unknowns = mlevel->getmat().N(); │ │ │ │ │ +394 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ +395 // We are still participating on this level │ │ │ │ │ +396 solver_.reset(new DIRECTSOLVER(matrices_->matrices │ │ │ │ │ +().coarsest().getRedistributed().getmat(), false, false)); │ │ │ │ │ +397 else │ │ │ │ │ +398 solver_.reset(); │ │ │ │ │ +399 }else │ │ │ │ │ +400 solver_.reset(new DIRECTSOLVER(matrices_->matrices │ │ │ │ │ +().coarsest()->getmat(), false, false)); │ │ │ │ │ +401 }else │ │ │ │ │ +402#undef DIRECTSOLVER │ │ │ │ │ +403#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +404 { │ │ │ │ │ +405 if(matrices_->parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ +406 { │ │ │ │ │ +407 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ +408 // We are still participating on this level │ │ │ │ │ +409 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices │ │ │ │ │ +().coarsest().getRedistributed()), │ │ │ │ │ +410 *scalarProduct_, │ │ │ │ │ +411 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ +412 else │ │ │ │ │ +413 solver_.reset(); │ │ │ │ │ +414 }else │ │ │ │ │ +415 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices │ │ │ │ │ +().coarsest()), │ │ │ │ │ +416 *scalarProduct_, │ │ │ │ │ +417 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ +418 } │ │ │ │ │ +419 } │ │ │ │ │ +420 │ │ │ │ │ +421 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator │ │ │ │ │ +().rank()==0) │ │ │ │ │ +422 std::cout<<"Building Hierarchy of "<maxlevels()<<" levels took │ │ │ │ │ +"<communicator().sum(unknowns); │ │ │ │ │ -426 double dunknowns=unknowns.todouble(); │ │ │ │ │ -427 infoLevel->buildGlobalLookup(mlevel->getmat().N()); │ │ │ │ │ -428 redistributes_.push_back(_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e()); │ │ │ │ │ -429 │ │ │ │ │ -430 for(; level < criterion.maxLevel(); ++level, ++mlevel) { │ │ │ │ │ -431 assert(matrices_.levels()==redistributes_.size()); │ │ │ │ │ -432 rank = infoLevel->communicator().rank(); │ │ │ │ │ -433 if(rank==0 && criterion.debugLevel()>1) │ │ │ │ │ -434 std::cout<<"Level "<communicator().size() │ │ │ │ │ -435 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ -()<<")"<communicator().size())) │ │ │ │ │ -448 && infoLevel->communicator().size()>1 && │ │ │ │ │ -449 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget()) │ │ │ │ │ -450 { │ │ │ │ │ -451 // accumulate to fewer processors │ │ │ │ │ -452 std::shared_ptr redistMat = std::make_shared(); │ │ │ │ │ -453 std::shared_ptr redistComm; │ │ │ │ │ -454 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/ │ │ │ │ │ -(criterion.minAggregateSize() │ │ │ │ │ -455 *criterion.coarsenTarget())); │ │ │ │ │ -456 if( nodomains<=criterion.minAggregateSize()/2 || │ │ │ │ │ -457 dunknowns <= criterion.coarsenTarget() ) │ │ │ │ │ -458 nodomains=1; │ │ │ │ │ -459 │ │ │ │ │ -460 bool existentOnNextLevel = │ │ │ │ │ -461 _r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(mlevel->getmat(), redistMat, *infoLevel, │ │ │ │ │ -462 redistComm, redistributes_.back(), nodomains, │ │ │ │ │ -463 criterion); │ │ │ │ │ -464 BIGINT unknownsRedist = redistMat->N(); │ │ │ │ │ -465 unknownsRedist = infoLevel->communicator().sum(unknownsRedist); │ │ │ │ │ -466 dunknowns= unknownsRedist.todouble(); │ │ │ │ │ -467 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) │ │ │ │ │ -468 std::cout<<"Level "<communicator().size() │ │ │ │ │ -469 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ -()<<")"<_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -(args)); │ │ │ │ │ -472 assert(mlevel.isRedistributed()); │ │ │ │ │ -473 infoLevel.addRedistributed(redistComm); │ │ │ │ │ -474 infoLevel->freeGlobalLookup(); │ │ │ │ │ -475 │ │ │ │ │ -476 if(!existentOnNextLevel) │ │ │ │ │ -477 // We do not hold any data on the redistributed partitioning │ │ │ │ │ -478 break; │ │ │ │ │ -479 │ │ │ │ │ -480 // Work on the redistributed Matrix from now on │ │ │ │ │ -481 matrix = &(mlevel.getRedistributed()); │ │ │ │ │ -482 info = &(infoLevel.getRedistributed()); │ │ │ │ │ -483 info->buildGlobalLookup(matrix->getmat().N()); │ │ │ │ │ +425 │ │ │ │ │ +426 template │ │ │ │ │ +_4_2_7 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b) │ │ │ │ │ +428 { │ │ │ │ │ +429 Timer watch, watch1; │ │ │ │ │ +430 // Detect Matrix rows where all offdiagonal entries are │ │ │ │ │ +431 // zero and set x such that A_dd*x_d=b_d │ │ │ │ │ +432 // Thus users can be more careless when setting up their linear │ │ │ │ │ +433 // systems. │ │ │ │ │ +434 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ +435 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r RowIter; │ │ │ │ │ +436 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r ColIter; │ │ │ │ │ +437 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e Block; │ │ │ │ │ +438 Block zero; │ │ │ │ │ +439 zero=typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e(); │ │ │ │ │ +440 │ │ │ │ │ +441 const _M_a_t_r_i_x& _m_a_t=matrices_->matrices().finest()->getmat(); │ │ │ │ │ +442 for(RowIter row=_m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ +443 bool isDirichlet = true; │ │ │ │ │ +444 bool hasDiagonal = false; │ │ │ │ │ +445 ColIter diag; │ │ │ │ │ +446 for(ColIter _c_o_l=row->begin(); _c_o_l!=row->end(); ++_c_o_l) { │ │ │ │ │ +447 if(row.index()==_c_o_l.index()) { │ │ │ │ │ +448 diag = _c_o_l; │ │ │ │ │ +449 hasDiagonal = (*_c_o_l != zero); │ │ │ │ │ +450 }else{ │ │ │ │ │ +451 if(*_c_o_l!=zero) │ │ │ │ │ +452 isDirichlet = false; │ │ │ │ │ +453 } │ │ │ │ │ +454 } │ │ │ │ │ +455 if(isDirichlet && hasDiagonal) │ │ │ │ │ +456 diag->solve(x[row.index()], b[row.index()]); │ │ │ │ │ +457 } │ │ │ │ │ +458 if (verbosity_>0) │ │ │ │ │ +459 std::cout<<" Preprocessing Dirichlet took "<parallelInformation().coarsest()->copyOwnerToAll(x,x); │ │ │ │ │ +463 rhs_ = std::make_shared>(std::make_shared(b)); │ │ │ │ │ +464 lhs_ = std::make_shared>(std::make_shared(x)); │ │ │ │ │ +465 residual_ = std::make_shared>(std::make_shared │ │ │ │ │ +(x)); │ │ │ │ │ +466 matrices_->coarsenVector(*rhs_); │ │ │ │ │ +467 matrices_->coarsenVector(*lhs_); │ │ │ │ │ +468 matrices_->coarsenVector(*residual_); │ │ │ │ │ +469 │ │ │ │ │ +470 // The preconditioner might change x and b. So we have to │ │ │ │ │ +471 // copy the changes to the original vectors. │ │ │ │ │ +472 x = *lhs_->finest(); │ │ │ │ │ +473 b = *rhs_->finest(); │ │ │ │ │ +474 } │ │ │ │ │ +475 template │ │ │ │ │ +_4_7_6 std::size_t _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_l_e_v_e_l_s() │ │ │ │ │ +477 { │ │ │ │ │ +478 return matrices_->levels(); │ │ │ │ │ +479 } │ │ │ │ │ +480 template │ │ │ │ │ +_4_8_1 std::size_t _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_m_a_x_l_e_v_e_l_s() │ │ │ │ │ +482 { │ │ │ │ │ +483 return matrices_->maxlevels(); │ │ │ │ │ 484 } │ │ │ │ │ 485 │ │ │ │ │ -486 rank = info->communicator().rank(); │ │ │ │ │ -487 if(dunknowns <= criterion.coarsenTarget()) │ │ │ │ │ -488 // No further coarsening needed │ │ │ │ │ -489 break; │ │ │ │ │ -490 │ │ │ │ │ -491 typedef _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> │ │ │ │ │ -GraphCreator; │ │ │ │ │ -492 typedef typename GraphCreator::PropertiesGraph _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ -493 typedef typename GraphCreator::GraphTuple GraphTuple; │ │ │ │ │ -494 │ │ │ │ │ -495 typedef typename _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r Vertex; │ │ │ │ │ -496 │ │ │ │ │ -497 std::vector excluded(matrix->getmat().N(), false); │ │ │ │ │ -498 │ │ │ │ │ -499 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, │ │ │ │ │ -OverlapFlags()); │ │ │ │ │ -500 │ │ │ │ │ -501 _A_g_g_r_e_g_a_t_e_s_M_a_p* aggregatesMap=new _A_g_g_r_e_g_a_t_e_s_M_a_p(std::get<1>(graphs)- │ │ │ │ │ ->maxVertex()+1); │ │ │ │ │ -502 │ │ │ │ │ -503 aggregatesMaps_.push_back(aggregatesMap); │ │ │ │ │ -504 │ │ │ │ │ -505 Timer watch; │ │ │ │ │ -506 watch.reset(); │ │ │ │ │ -507 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] = │ │ │ │ │ -508 aggregatesMap->_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s(matrix->getmat(), *(std::get<1>(graphs)), │ │ │ │ │ -criterion, level==0); │ │ │ │ │ -509 │ │ │ │ │ -510 if(rank==0 && criterion.debugLevel()>2) │ │ │ │ │ -511 std::cout<<" Have built "<communicator().rank(); │ │ │ │ │ -519 int n = UNKNOWNS/procs; // number of unknowns per process │ │ │ │ │ -520 int bigger = UNKNOWNS%procs; // number of process with n+1 unknows │ │ │ │ │ -521 │ │ │ │ │ -522 // Compute owner region │ │ │ │ │ -523 if(rank0) │ │ │ │ │ -533 overlapStart = start - 1; │ │ │ │ │ -534 else │ │ │ │ │ -535 overlapStart = start; │ │ │ │ │ -536 │ │ │ │ │ -537 if(end_n_o_V_e_r_t_i_c_e_s()); │ │ │ │ │ -543 for(int j=0; j< UNKNOWNS; ++j) │ │ │ │ │ -544 for(int i=0; i < UNKNOWNS; ++i) │ │ │ │ │ -545 { │ │ │ │ │ -546 if(i>=overlapStart && i1 && info->communicator().rank()==0) │ │ │ │ │ -555 std::cout<<"aggregating finished."< │ │ │ │ │ +_4_8_8 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +489 { │ │ │ │ │ +490 LevelContext levelContext; │ │ │ │ │ +491 // Init all iterators for the current level │ │ │ │ │ +492 initIteratorsWithFineLevel(levelContext); │ │ │ │ │ +493 │ │ │ │ │ +494 assert(v.two_norm()==0); │ │ │ │ │ +495 │ │ │ │ │ +496 level=0; │ │ │ │ │ +497 if(matrices_->maxlevels()==1){ │ │ │ │ │ +498 // The coarse solver might modify the d! │ │ │ │ │ +499 _R_a_n_g_e b(d); │ │ │ │ │ +500 mgc(levelContext, v, b); │ │ │ │ │ +501 }else │ │ │ │ │ +502 mgc(levelContext, v, d); │ │ │ │ │ +503 if(postSteps_==0||matrices_->maxlevels()==1) │ │ │ │ │ +504 levelContext.pinfo->copyOwnerToAll(v, v); │ │ │ │ │ +505 } │ │ │ │ │ +506 │ │ │ │ │ +507 template │ │ │ │ │ +508 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_i_n_i_t_I_t_e_r_a_t_o_r_s_W_i_t_h_F_i_n_e_L_e_v_e_l(LevelContext& │ │ │ │ │ +levelContext) │ │ │ │ │ +509 { │ │ │ │ │ +510 levelContext.matrix = matrices_->matrices().finest(); │ │ │ │ │ +511 levelContext.pinfo = matrices_->parallelInformation().finest(); │ │ │ │ │ +512 levelContext.redist = │ │ │ │ │ +513 matrices_->redistributeInformation().begin(); │ │ │ │ │ +514 levelContext.aggregates = matrices_->aggregatesMaps().begin(); │ │ │ │ │ +515 levelContext.lhs = lhs_->finest(); │ │ │ │ │ +516 levelContext.residual = residual_->finest(); │ │ │ │ │ +517 levelContext.rhs = rhs_->finest(); │ │ │ │ │ +518 levelContext.level=0; │ │ │ │ │ +519 } │ │ │ │ │ +520 │ │ │ │ │ +521 template │ │ │ │ │ +522 bool FastAMG │ │ │ │ │ +523 ::moveToCoarseLevel(LevelContext& levelContext) │ │ │ │ │ +524 { │ │ │ │ │ +525 bool processNextLevel=true; │ │ │ │ │ +526 │ │ │ │ │ +527 if(levelContext.redist->isSetup()) { │ │ │ │ │ +528 throw "bla"; │ │ │ │ │ +529 levelContext.redist->redistribute(static_cast │ │ │ │ │ +(*levelContext.residual), │ │ │ │ │ +530 levelContext.residual.getRedistributed()); │ │ │ │ │ +531 processNextLevel = levelContext.residual.getRedistributed().size()>0; │ │ │ │ │ +532 if(processNextLevel) { │ │ │ │ │ +533 //restrict defect to coarse level right hand side. │ │ │ │ │ +534 ++levelContext.pinfo; │ │ │ │ │ +535 Transfer │ │ │ │ │ +536 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs, │ │ │ │ │ +537 static_cast(levelContext.residual.getRedistributed()), │ │ │ │ │ +538 *levelContext.pinfo); │ │ │ │ │ +539 } │ │ │ │ │ +540 }else{ │ │ │ │ │ +541 //restrict defect to coarse level right hand side. │ │ │ │ │ +542 ++levelContext.rhs; │ │ │ │ │ +543 ++levelContext.pinfo; │ │ │ │ │ +544 Transfer │ │ │ │ │ +545 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs, │ │ │ │ │ +546 static_cast(*levelContext.residual), *levelContext.pinfo); │ │ │ │ │ +547 } │ │ │ │ │ +548 │ │ │ │ │ +549 if(processNextLevel) { │ │ │ │ │ +550 // prepare coarse system │ │ │ │ │ +551 ++levelContext.residual; │ │ │ │ │ +552 ++levelContext.lhs; │ │ │ │ │ +553 ++levelContext.matrix; │ │ │ │ │ +554 ++levelContext.level; │ │ │ │ │ +555 ++levelContext.redist; │ │ │ │ │ 556 │ │ │ │ │ -557 BIGINT gnoAggregates=noAggregates; │ │ │ │ │ -558 gnoAggregates = info->communicator().sum(gnoAggregates); │ │ │ │ │ -559 double dgnoAggregates = gnoAggregates.todouble(); │ │ │ │ │ -560#ifdef TEST_AGGLO │ │ │ │ │ -561 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2); │ │ │ │ │ -562#endif │ │ │ │ │ -563 │ │ │ │ │ -564 if(criterion.debugLevel()>2 && rank==0) │ │ │ │ │ -565 std::cout << "Building "<0) │ │ │ │ │ -572 std::cerr << "Stopped coarsening because of rate breakdown "<_f_r_e_e(); │ │ │ │ │ -579 delete aggregatesMap; │ │ │ │ │ -580 aggregatesMaps_.pop_back(); │ │ │ │ │ -581 │ │ │ │ │ -582 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator │ │ │ │ │ -().size()>1) { │ │ │ │ │ -583 // coarse level matrix was already redistributed, but to more than 1 │ │ │ │ │ -process │ │ │ │ │ -584 // Therefore need to delete the redistribution. Further down it will │ │ │ │ │ -585 // then be redistributed to 1 process │ │ │ │ │ -586 delete &(mlevel.getRedistributed().getmat()); │ │ │ │ │ -587 mlevel.deleteRedistributed(); │ │ │ │ │ -588 delete &(infoLevel.getRedistributed()); │ │ │ │ │ -589 infoLevel.deleteRedistributed(); │ │ │ │ │ -590 redistributes_.back().resetSetup(); │ │ │ │ │ -591 } │ │ │ │ │ -592 │ │ │ │ │ -593 break; │ │ │ │ │ -594 } │ │ │ │ │ -595 unknowns = noAggregates; │ │ │ │ │ -596 dunknowns = dgnoAggregates; │ │ │ │ │ -597 │ │ │ │ │ -598 CommunicationArgs commargs(info->communicator(),info->category()); │ │ │ │ │ -599 parallelInformation_.addCoarser(commargs); │ │ │ │ │ -600 │ │ │ │ │ -601 ++infoLevel; // parallel information on coarse level │ │ │ │ │ +557 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ +>levels()maxlevels()) { │ │ │ │ │ +558 // next level is not the globally coarsest one │ │ │ │ │ +559 ++levelContext.aggregates; │ │ │ │ │ +560 } │ │ │ │ │ +561 // prepare the lhs on the next level │ │ │ │ │ +562 *levelContext.lhs=0; │ │ │ │ │ +563 *levelContext.residual=0; │ │ │ │ │ +564 } │ │ │ │ │ +565 return processNextLevel; │ │ │ │ │ +566 } │ │ │ │ │ +567 │ │ │ │ │ +568 template │ │ │ │ │ +569 void FastAMG │ │ │ │ │ +570 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel, │ │ │ │ │ +Domain& x) │ │ │ │ │ +571 { │ │ │ │ │ +572 if(processNextLevel) { │ │ │ │ │ +573 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ +>levels()maxlevels()) { │ │ │ │ │ +574 // previous level is not the globally coarsest one │ │ │ │ │ +575 --levelContext.aggregates; │ │ │ │ │ +576 } │ │ │ │ │ +577 --levelContext.redist; │ │ │ │ │ +578 --levelContext.level; │ │ │ │ │ +579 //prolongate and add the correction (update is in coarse left hand side) │ │ │ │ │ +580 --levelContext.matrix; │ │ │ │ │ +581 --levelContext.residual; │ │ │ │ │ +582 │ │ │ │ │ +583 } │ │ │ │ │ +584 │ │ │ │ │ +585 typename Hierarchy::Iterator coarseLhs = levelContext.lhs--; │ │ │ │ │ +586 if(levelContext.redist->isSetup()) { │ │ │ │ │ +587 │ │ │ │ │ +588 // Need to redistribute during prolongate │ │ │ │ │ +589 Transfer │ │ │ │ │ +590 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x, │ │ │ │ │ +591 levelContext.lhs.getRedistributed(), │ │ │ │ │ +592 matrices_->getProlongationDampingFactor(), │ │ │ │ │ +593 *levelContext.pinfo, *levelContext.redist); │ │ │ │ │ +594 }else{ │ │ │ │ │ +595 Transfer │ │ │ │ │ +596 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x, │ │ │ │ │ +597 matrices_->getProlongationDampingFactor(), *levelContext.pinfo); │ │ │ │ │ +598 │ │ │ │ │ +599 // printvector(std::cout, *lhs, "prolongated coarse grid correction", │ │ │ │ │ +"lhs", 10, 10, 10); │ │ │ │ │ +600 } │ │ │ │ │ +601 │ │ │ │ │ 602 │ │ │ │ │ -603 typename PropertyMapTypeSelector::Type │ │ │ │ │ -visitedMap = │ │ │ │ │ -604 _g_e_t(_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g(), *(std::get<1>(graphs))); │ │ │ │ │ -605 │ │ │ │ │ -606 watch.reset(); │ │ │ │ │ -607 int aggregates = _I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_O_v_e_r_l_a_p_F_l_a_g_s_> │ │ │ │ │ -608_ _:_:_c_o_a_r_s_e_n(*info, │ │ │ │ │ -609 *(std::get<1>(graphs)), │ │ │ │ │ -610 visitedMap, │ │ │ │ │ -611 *aggregatesMap, │ │ │ │ │ -612 *infoLevel, │ │ │ │ │ -613 noAggregates); │ │ │ │ │ -614 GraphCreator::free(graphs); │ │ │ │ │ -615 │ │ │ │ │ -616 if(criterion.debugLevel()>2) { │ │ │ │ │ -617 if(rank==0) │ │ │ │ │ -618 std::cout<<"Coarsening of index sets took "< │ │ │ │ │ +611 void FastAMG │ │ │ │ │ +612 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b) │ │ │ │ │ +613 { │ │ │ │ │ +614 constexpr auto bl = blockLevel(); │ │ │ │ │ +615 _G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_<_b_l_>_:_:_a_p_p_l_y(levelContext.matrix->getmat(), │ │ │ │ │ +616 x, │ │ │ │ │ +617 *levelContext.residual, │ │ │ │ │ +618 b); │ │ │ │ │ 619 } │ │ │ │ │ 620 │ │ │ │ │ -621 watch.reset(); │ │ │ │ │ -622 │ │ │ │ │ -623 infoLevel->buildGlobalLookup(aggregates); │ │ │ │ │ -624 _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_V_e_r_t_e_x_,_O_v_e_r_l_a_p_F_l_a_g_s_,_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_u_b_l_i_s_h │ │ │ │ │ -(*aggregatesMap, │ │ │ │ │ -625 *info, │ │ │ │ │ -626 infoLevel->globalLookup()); │ │ │ │ │ -627 │ │ │ │ │ -628 │ │ │ │ │ -629 if(criterion.debugLevel()>2) { │ │ │ │ │ -630 if(rank==0) │ │ │ │ │ -631 std::cout<<"Communicating global aggregate numbers took "<& visited=excluded; │ │ │ │ │ +621 template │ │ │ │ │ +622 void FastAMG │ │ │ │ │ +623 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b) │ │ │ │ │ +624 { │ │ │ │ │ +625 constexpr auto bl = blockLevel(); │ │ │ │ │ +626 GaussSeidelPostsmoothDefect │ │ │ │ │ +627 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b); │ │ │ │ │ +628 } │ │ │ │ │ +629 │ │ │ │ │ +630 │ │ │ │ │ +631 template │ │ │ │ │ +_6_3_2 bool _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const │ │ │ │ │ +633 { │ │ │ │ │ +634 return _I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _C_o_a_r_s_e_S_o_l_v_e_r_>_:_:_v_a_l_u_e; │ │ │ │ │ +635 } │ │ │ │ │ 636 │ │ │ │ │ -637 typedef std::vector::iterator Iterator; │ │ │ │ │ -638 typedef IteratorPropertyMap VisitedMap2; │ │ │ │ │ -639 Iterator end = visited.end(); │ │ │ │ │ -640 for(Iterator iter= visited.begin(); iter != end; ++iter) │ │ │ │ │ -641 *iter=false; │ │ │ │ │ -642 │ │ │ │ │ -643 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap()); │ │ │ │ │ -644 │ │ │ │ │ -645 std::shared_ptr │ │ │ │ │ -646 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2, │ │ │ │ │ -647 *info, │ │ │ │ │ -648 *aggregatesMap, │ │ │ │ │ -649 aggregates, │ │ │ │ │ -650 OverlapFlags())); │ │ │ │ │ -651 dverb<<"Building of sparsity pattern took "<freeGlobalLookup(); │ │ │ │ │ -654 │ │ │ │ │ -655 delete std::get<0>(graphs); │ │ │ │ │ -656 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, │ │ │ │ │ -*infoLevel, OverlapFlags()); │ │ │ │ │ -657 │ │ │ │ │ -658 if(criterion.debugLevel()>2) { │ │ │ │ │ -659 if(rank==0) │ │ │ │ │ -660 std::cout<<"Calculation entries of Galerkin product took "<communicator().sum(nonzeros); │ │ │ │ │ -665 MatrixArgs args(coarseMatrix, *infoLevel); │ │ │ │ │ -666 │ │ │ │ │ -667 matrices_.addCoarser(args); │ │ │ │ │ -668 redistributes_.push_back(_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e()); │ │ │ │ │ -669 } // end level loop │ │ │ │ │ +637 template │ │ │ │ │ +638 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_m_g_c(LevelContext& levelContext, Domain& v, const │ │ │ │ │ +Range& b){ │ │ │ │ │ +639 │ │ │ │ │ +640 if(levelContext.matrix == matrices_->matrices().coarsest() && levels │ │ │ │ │ +()==maxlevels()) { │ │ │ │ │ +641 // Solve directly │ │ │ │ │ +642 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ +643 res._c_o_n_v_e_r_g_e_d=true; // If we do not compute this flag will not get updated │ │ │ │ │ +644 if(levelContext.redist->isSetup()) { │ │ │ │ │ +645 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed()); │ │ │ │ │ +646 if(levelContext.rhs.getRedistributed().size()>0) { │ │ │ │ │ +647 // We are still participating in the computation │ │ │ │ │ +648 levelContext.pinfo.getRedistributed().copyOwnerToAll │ │ │ │ │ +(levelContext.rhs.getRedistributed(), │ │ │ │ │ +649 levelContext.rhs.getRedistributed()); │ │ │ │ │ +650 solver_->apply(levelContext.lhs.getRedistributed(), │ │ │ │ │ +levelContext.rhs.getRedistributed(), res); │ │ │ │ │ +651 } │ │ │ │ │ +652 levelContext.redist->redistributeBackward(v, │ │ │ │ │ +levelContext.lhs.getRedistributed()); │ │ │ │ │ +653 levelContext.pinfo->copyOwnerToAll(v, v); │ │ │ │ │ +654 }else{ │ │ │ │ │ +655 levelContext.pinfo->copyOwnerToAll(b, b); │ │ │ │ │ +656 solver_->apply(v, const_cast(b), res); │ │ │ │ │ +657 } │ │ │ │ │ +658 │ │ │ │ │ +659 // printvector(std::cout, *lhs, "coarse level update", "u", 10, 10, 10); │ │ │ │ │ +660 // printvector(std::cout, *rhs, "coarse level rhs", "rhs", 10, 10, 10); │ │ │ │ │ +661 if (!res._c_o_n_v_e_r_g_e_d) │ │ │ │ │ +662 coarsesolverconverged = false; │ │ │ │ │ +663 }else{ │ │ │ │ │ +664 // presmoothing │ │ │ │ │ +665 _p_r_e_s_m_o_o_t_h(levelContext, v, b); │ │ │ │ │ +666 // printvector(std::cout, *lhs, "update", "u", 10, 10, 10); │ │ │ │ │ +667 // printvector(std::cout, *residual, "post presmooth residual", "r", 10); │ │ │ │ │ +668#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION │ │ │ │ │ +669 bool processNextLevel = moveToCoarseLevel(levelContext); │ │ │ │ │ 670 │ │ │ │ │ -671 │ │ │ │ │ -672 infoLevel->freeGlobalLookup(); │ │ │ │ │ -673 │ │ │ │ │ -674 built_=true; │ │ │ │ │ -675 _A_g_g_r_e_g_a_t_e_s_M_a_p* aggregatesMap=new _A_g_g_r_e_g_a_t_e_s_M_a_p(0); │ │ │ │ │ -676 aggregatesMaps_.push_back(aggregatesMap); │ │ │ │ │ -677 │ │ │ │ │ -678 if(criterion.debugLevel()>0) { │ │ │ │ │ -679 if(level==criterion.maxLevel()) { │ │ │ │ │ -680 BIGINT unknownsLevel = mlevel->getmat().N(); │ │ │ │ │ -681 unknownsLevel = infoLevel->communicator().sum(unknownsLevel); │ │ │ │ │ -682 double dunknownsLevel = unknownsLevel.todouble(); │ │ │ │ │ -683 if(rank==0 && criterion.debugLevel()>1) { │ │ │ │ │ -684 std::cout<<"Level "<communicator().size() │ │ │ │ │ -685 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ -()<<")"<matrices().finest()) { │ │ │ │ │ +683 coarsesolverconverged = matrices_->parallelInformation().finest()- │ │ │ │ │ +>communicator().prod(coarsesolverconverged); │ │ │ │ │ +684 if(!coarsesolverconverged) │ │ │ │ │ +685 DUNE_THROW(MathError, "Coarse solver did not converge"); │ │ │ │ │ 686 } │ │ │ │ │ -687 } │ │ │ │ │ -688 } │ │ │ │ │ -689 │ │ │ │ │ -690 if(criterion.accumulate() && !redistributes_.back().isSetup() && │ │ │ │ │ -691 infoLevel->communicator().size()>1) { │ │ │ │ │ -692#if HAVE_MPI && !HAVE_PARMETIS │ │ │ │ │ -693 if(criterion.accumulate()==_s_u_c_c_e_s_s_i_v_e_A_c_c_u && │ │ │ │ │ -694 infoLevel->communicator().rank()==0) │ │ │ │ │ -695 std::cerr<<"Successive accumulation of data on coarse levels only works │ │ │ │ │ -with ParMETIS installed." │ │ │ │ │ -696 <<" Fell back to accumulation to one domain on coarsest level"< redistMat = std::make_shared(); │ │ │ │ │ -701 std::shared_ptr redistComm; │ │ │ │ │ -702 int nodomains = 1; │ │ │ │ │ -703 │ │ │ │ │ -704 _r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(mlevel->getmat(), redistMat, *infoLevel, │ │ │ │ │ -705 redistComm, redistributes_.back(), nodomains,criterion); │ │ │ │ │ -706 MatrixArgs args(redistMat, *redistComm); │ │ │ │ │ -707 BIGINT unknownsRedist = redistMat->N(); │ │ │ │ │ -708 unknownsRedist = infoLevel->communicator().sum(unknownsRedist); │ │ │ │ │ -709 │ │ │ │ │ -710 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) { │ │ │ │ │ -711 double dunknownsRedist = unknownsRedist.todouble(); │ │ │ │ │ -712 std::cout<<"Level "<communicator().size() │ │ │ │ │ -713 <<" unknowns per proc (procs="<communicator().size │ │ │ │ │ -()<<")"<_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -(args)); │ │ │ │ │ -716 infoLevel.addRedistributed(redistComm); │ │ │ │ │ -717 infoLevel->freeGlobalLookup(); │ │ │ │ │ -718 } │ │ │ │ │ -719 │ │ │ │ │ -720 int levels = matrices_.levels(); │ │ │ │ │ -721 maxlevels_ = parallelInformation_.finest()->communicator().max(levels); │ │ │ │ │ -722 assert(matrices_.levels()==redistributes_.size()); │ │ │ │ │ -723 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1) │ │ │ │ │ -724 std::cout<<"operator complexity: "< │ │ │ │ │ -729 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y& │ │ │ │ │ -_7_3_0 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_m_a_t_r_i_c_e_s() const │ │ │ │ │ -731 { │ │ │ │ │ -732 return matrices_; │ │ │ │ │ -733 } │ │ │ │ │ -734 │ │ │ │ │ -735 template │ │ │ │ │ -736 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y& │ │ │ │ │ -_7_3_7 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_p_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n() const │ │ │ │ │ -738 { │ │ │ │ │ -739 return parallelInformation_; │ │ │ │ │ -740 } │ │ │ │ │ -741 │ │ │ │ │ -742 template │ │ │ │ │ -_7_4_3 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_s_O_n_F_i_n_e_s_t(std:: │ │ │ │ │ -vector& data) const │ │ │ │ │ -744 { │ │ │ │ │ -745 int levels=aggregatesMaps().size(); │ │ │ │ │ -746 int maxlevels=parallelInformation_._f_i_n_e_s_t()->communicator().max(levels); │ │ │ │ │ -747 std::size_t size=(*(aggregatesMaps().begin()))->noVertices(); │ │ │ │ │ -748 // We need an auxiliary vector for the consecutive prolongation. │ │ │ │ │ -749 std::vector tmp; │ │ │ │ │ -750 std::vector *coarse, *fine; │ │ │ │ │ -751 │ │ │ │ │ -752 // make sure the allocated space suffices. │ │ │ │ │ -753 tmp.reserve(size); │ │ │ │ │ -754 data.reserve(size); │ │ │ │ │ -755 │ │ │ │ │ -756 // Correctly assign coarse and fine for the first prolongation such that │ │ │ │ │ -757 // we end up in data in the end. │ │ │ │ │ -758 if(levels%2==0) { │ │ │ │ │ -759 coarse=&tmp; │ │ │ │ │ -760 fine=&data; │ │ │ │ │ -761 }else{ │ │ │ │ │ -762 coarse=&data; │ │ │ │ │ -763 fine=&tmp; │ │ │ │ │ -764 } │ │ │ │ │ -765 │ │ │ │ │ -766 // Number the unknowns on the coarsest level consecutively for each │ │ │ │ │ -process. │ │ │ │ │ -767 if(levels==maxlevels) { │ │ │ │ │ -768 const _A_g_g_r_e_g_a_t_e_s_M_a_p& map = *(*(++aggregatesMaps().rbegin())); │ │ │ │ │ -769 std::size_t m=0; │ │ │ │ │ -770 │ │ │ │ │ -771 for(typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r iter = map._b_e_g_i_n(); iter != │ │ │ │ │ -map._e_n_d(); ++iter) │ │ │ │ │ -772 if(*iter< _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ -773 m=std::max(*iter,m); │ │ │ │ │ -774 │ │ │ │ │ -775 coarse->resize(m+1); │ │ │ │ │ -776 std::size_t i=0; │ │ │ │ │ -777 srand((unsigned)std::clock()); │ │ │ │ │ -778 std::set used; │ │ │ │ │ -779 for(typename std::vector::iterator iter=coarse->begin(); iter │ │ │ │ │ -!= coarse->end(); │ │ │ │ │ -780 ++iter, ++i) │ │ │ │ │ -781 { │ │ │ │ │ -782 std::pair::iterator,bool> ibpair │ │ │ │ │ -783 = used.insert(static_cast((((double)rand())/ │ │ │ │ │ -(RAND_MAX+1.0)))*coarse->size()); │ │ │ │ │ -784 │ │ │ │ │ -785 while(!ibpair.second) │ │ │ │ │ -786 ibpair = used.insert(static_cast((((double)rand())/ │ │ │ │ │ -(RAND_MAX+1.0))*coarse->size())); │ │ │ │ │ -787 *iter=*(ibpair.first); │ │ │ │ │ -788 } │ │ │ │ │ -789 } │ │ │ │ │ -790 │ │ │ │ │ -791 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r pinfo = parallelInformation │ │ │ │ │ -().coarsest(); │ │ │ │ │ -792 --pinfo; │ │ │ │ │ -793 │ │ │ │ │ -794 // Now consecutively project the numbers to the finest level. │ │ │ │ │ -795 for(typename AggregatesMapList::const_reverse_iterator │ │ │ │ │ -aggregates=++aggregatesMaps().rbegin(); │ │ │ │ │ -796 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) { │ │ │ │ │ -797 │ │ │ │ │ -798 fine->resize((*aggregates)->noVertices()); │ │ │ │ │ -799 fine->assign(fine->size(), 0); │ │ │ │ │ -800 _T_r_a_n_s_f_e_r_<_t_y_p_e_n_a_m_e_ _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r_,_ _s_t_d_:_:_v_e_c_t_o_r_<_s_t_d_:_: │ │ │ │ │ -_s_i_z_e___t_>, _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ -801 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast │ │ │ │ │ -(1), *pinfo); │ │ │ │ │ -802 --pinfo; │ │ │ │ │ -803 std::swap(coarse, fine); │ │ │ │ │ -804 } │ │ │ │ │ -805 │ │ │ │ │ -806 // Assertion to check that we really projected to data on the last step. │ │ │ │ │ -807 assert(coarse==&data); │ │ │ │ │ -808 } │ │ │ │ │ -809 │ │ │ │ │ -810 template │ │ │ │ │ -811 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t& │ │ │ │ │ -_8_1_2 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_a_g_g_r_e_g_a_t_e_s_M_a_p_s() const │ │ │ │ │ -813 { │ │ │ │ │ -814 return aggregatesMaps_; │ │ │ │ │ -815 } │ │ │ │ │ -816 template │ │ │ │ │ -817 const typename _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t& │ │ │ │ │ -_8_1_8 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_r_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n() const │ │ │ │ │ -819 { │ │ │ │ │ -820 return redistributes_; │ │ │ │ │ -821 } │ │ │ │ │ -822 │ │ │ │ │ -823 template │ │ │ │ │ -_8_2_4 _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_~_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y() │ │ │ │ │ -825 { │ │ │ │ │ -826 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator; │ │ │ │ │ -827 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -828 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r InfoIterator; │ │ │ │ │ -829 │ │ │ │ │ -830 AggregatesMapIterator amap = aggregatesMaps_.rbegin(); │ │ │ │ │ -831 InfoIterator info = parallelInformation_.coarsest(); │ │ │ │ │ -832 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level │ │ │ │ │ -!= finest; --level, --info, ++amap) { │ │ │ │ │ -833 (*amap)->free(); │ │ │ │ │ -834 delete *amap; │ │ │ │ │ -835 } │ │ │ │ │ -836 delete *amap; │ │ │ │ │ -837 } │ │ │ │ │ -838 │ │ │ │ │ -839 template │ │ │ │ │ -840 template │ │ │ │ │ -_8_4_1 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_c_o_a_r_s_e_n_V_e_c_t_o_r(_H_i_e_r_a_r_c_h_y<_B_l_o_c_k_V_e_c_t_o_r_<_V_,_B_A_>, │ │ │ │ │ -TA>& hierarchy) const │ │ │ │ │ -842 { │ │ │ │ │ -843 assert(hierarchy.levels()==1); │ │ │ │ │ -844 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -845 typedef typename RedistributeInfoList::const_iterator RIter; │ │ │ │ │ -846 RIter redist = redistributes_.begin(); │ │ │ │ │ -847 │ │ │ │ │ -848 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest(); │ │ │ │ │ -849 int level=0; │ │ │ │ │ -850 if(redist->isSetup()) │ │ │ │ │ -851 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N │ │ │ │ │ -()); │ │ │ │ │ -852 Dune::dvverb<<"Level "<getmat().N()<<" │ │ │ │ │ -unknowns!"<getmat().N()<<" │ │ │ │ │ -unknowns!"<getmat().N()); │ │ │ │ │ -859 if(redist->isSetup()) │ │ │ │ │ -860 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N │ │ │ │ │ -()); │ │ │ │ │ -861 │ │ │ │ │ -862 } │ │ │ │ │ -863 │ │ │ │ │ -864 } │ │ │ │ │ -865 │ │ │ │ │ -866 template │ │ │ │ │ -867 template │ │ │ │ │ -_8_6_8 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_c_o_a_r_s_e_n_S_m_o_o_t_h_e_r(_H_i_e_r_a_r_c_h_y_<_S_,_T_A_>& smoothers, │ │ │ │ │ -869 const typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_>_:_:_A_r_g_u_m_e_n_t_s& sargs) const │ │ │ │ │ -870 { │ │ │ │ │ -871 assert(smoothers._l_e_v_e_l_s()==0); │ │ │ │ │ -872 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r MatrixIterator; │ │ │ │ │ -873 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r PinfoIterator; │ │ │ │ │ -874 typedef typename AggregatesMapList::const_iterator AggregatesIterator; │ │ │ │ │ -875 │ │ │ │ │ -876 typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_>_:_:_A_r_g_u_m_e_n_t_s cargs; │ │ │ │ │ -877 cargs.setArgs(sargs); │ │ │ │ │ -878 PinfoIterator pinfo = parallelInformation_.finest(); │ │ │ │ │ -879 AggregatesIterator aggregates = aggregatesMaps_.begin(); │ │ │ │ │ -880 int level=0; │ │ │ │ │ -881 for(MatrixIterator matrix = matrices_.finest(), coarsest = │ │ │ │ │ -matrices_.coarsest(); │ │ │ │ │ -882 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) { │ │ │ │ │ -883 cargs.setMatrix(matrix->getmat(), **aggregates); │ │ │ │ │ -884 cargs.setComm(*pinfo); │ │ │ │ │ -885 smoothers._a_d_d_C_o_a_r_s_e_r(cargs); │ │ │ │ │ -886 } │ │ │ │ │ -887 if(maxlevels()>levels()) { │ │ │ │ │ -888 // This is not the globally coarsest level and therefore smoothing is │ │ │ │ │ -needed │ │ │ │ │ -889 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates); │ │ │ │ │ -890 cargs.setComm(*pinfo); │ │ │ │ │ -891 smoothers._a_d_d_C_o_a_r_s_e_r(cargs); │ │ │ │ │ -892 ++level; │ │ │ │ │ -893 } │ │ │ │ │ -894 } │ │ │ │ │ -895 │ │ │ │ │ -896 template │ │ │ │ │ -897 template │ │ │ │ │ -_8_9_8 void _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_r_e_c_a_l_c_u_l_a_t_e_G_a_l_e_r_k_i_n(const F& copyFlags) │ │ │ │ │ -899 { │ │ │ │ │ -900 typedef typename AggregatesMapList::iterator AggregatesMapIterator; │ │ │ │ │ -901 typedef typename _P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -902 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r InfoIterator; │ │ │ │ │ -903 │ │ │ │ │ -904 AggregatesMapIterator amap = aggregatesMaps_.begin(); │ │ │ │ │ -905 _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t productBuilder; │ │ │ │ │ -906 InfoIterator info = parallelInformation_.finest(); │ │ │ │ │ -907 typename RedistributeInfoList::iterator riIter = redistributes_.begin(); │ │ │ │ │ -908 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest(); │ │ │ │ │ -909 if(level.isRedistributed()) { │ │ │ │ │ -910 info->buildGlobalLookup(level->getmat().N()); │ │ │ │ │ -911 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(const_cast<_M_a_t_r_i_x&>(level->getmat()), │ │ │ │ │ -912 const_cast<_M_a_t_r_i_x&>(level.getRedistributed().getmat()), │ │ │ │ │ -913 *info,info.getRedistributed(), *riIter); │ │ │ │ │ -914 info->freeGlobalLookup(); │ │ │ │ │ -915 } │ │ │ │ │ -916 │ │ │ │ │ -917 for(; level!=coarsest; ++amap) { │ │ │ │ │ -918 const _M_a_t_r_i_x& fine = (level.isRedistributed() ? level.getRedistributed() : │ │ │ │ │ -*level).getmat(); │ │ │ │ │ -919 ++level; │ │ │ │ │ -920 ++info; │ │ │ │ │ -921 ++riIter; │ │ │ │ │ -922 productBuilder._c_a_l_c_u_l_a_t_e(fine, *(*amap), const_cast<_M_a_t_r_i_x&>(level->getmat │ │ │ │ │ -()), *info, copyFlags); │ │ │ │ │ -923 if(level.isRedistributed()) { │ │ │ │ │ -924 info->buildGlobalLookup(level->getmat().N()); │ │ │ │ │ -925 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(const_cast<_M_a_t_r_i_x&>(level->getmat()), │ │ │ │ │ -926 const_cast<_M_a_t_r_i_x&>(level.getRedistributed().getmat()), *info, │ │ │ │ │ -927 info.getRedistributed(), *riIter); │ │ │ │ │ -928 info->freeGlobalLookup(); │ │ │ │ │ -929 } │ │ │ │ │ -930 } │ │ │ │ │ -931 } │ │ │ │ │ -932 │ │ │ │ │ -933 template │ │ │ │ │ -_9_3_4 std::size_t _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_l_e_v_e_l_s() const │ │ │ │ │ -935 { │ │ │ │ │ -936 return matrices_.levels(); │ │ │ │ │ -937 } │ │ │ │ │ -938 │ │ │ │ │ -939 template │ │ │ │ │ -_9_4_0 std::size_t _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_m_a_x_l_e_v_e_l_s() const │ │ │ │ │ -941 { │ │ │ │ │ -942 return maxlevels_; │ │ │ │ │ -943 } │ │ │ │ │ -944 │ │ │ │ │ -945 template │ │ │ │ │ -_9_4_6 bool _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_h_a_s_C_o_a_r_s_e_s_t() const │ │ │ │ │ -947 { │ │ │ │ │ -948 return levels()==maxlevels() && │ │ │ │ │ -949 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N │ │ │ │ │ -()>0); │ │ │ │ │ -950 } │ │ │ │ │ -951 │ │ │ │ │ -952 template │ │ │ │ │ -_9_5_3 bool _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_I_S_,_A_>_:_:_i_s_B_u_i_l_t() const │ │ │ │ │ -954 { │ │ │ │ │ -955 return built_; │ │ │ │ │ -956 } │ │ │ │ │ -957 │ │ │ │ │ -959 } // namespace Amg │ │ │ │ │ -960} // namespace Dune │ │ │ │ │ -961 │ │ │ │ │ -962#endif // end DUNE_AMG_MATRIXHIERARCHY_HH │ │ │ │ │ -_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ -Some handy generic functions for ISTL matrices. │ │ │ │ │ -_r_e_n_u_m_b_e_r_e_r_._h_h │ │ │ │ │ -_c_o_n_s_t_r_u_c_t_i_o_n_._h_h │ │ │ │ │ -Helper classes for the construction of classes without empty constructor. │ │ │ │ │ -_i_n_d_i_c_e_s_c_o_a_r_s_e_n_e_r_._h_h │ │ │ │ │ -Provides a class for building the index set and remote indices on the coarse │ │ │ │ │ -level. │ │ │ │ │ -_t_r_a_n_s_f_e_r_._h_h │ │ │ │ │ -Prolongation and restriction for amg. │ │ │ │ │ +687 │ │ │ │ │ +688 _p_o_s_t_s_m_o_o_t_h(levelContext, v, b); │ │ │ │ │ +689 } │ │ │ │ │ +690 } │ │ │ │ │ +691 │ │ │ │ │ +692 │ │ │ │ │ +694 template │ │ │ │ │ +_6_9_5 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_p_o_s_t([[maybe_unused]] _D_o_m_a_i_n& x) │ │ │ │ │ +696 { │ │ │ │ │ +697 lhs_=nullptr; │ │ │ │ │ +698 rhs_=nullptr; │ │ │ │ │ +699 residual_=nullptr; │ │ │ │ │ +700 } │ │ │ │ │ +701 │ │ │ │ │ +702 template │ │ │ │ │ +703 template │ │ │ │ │ +_7_0_4 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont) │ │ │ │ │ +705 { │ │ │ │ │ +706 matrices_->getCoarsestAggregatesOnFinest(cont); │ │ │ │ │ +707 } │ │ │ │ │ +708 │ │ │ │ │ +709 } // end namespace Amg │ │ │ │ │ +710} // end namespace Dune │ │ │ │ │ +711 │ │ │ │ │ +712#endif │ │ │ │ │ +_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +_i_o_._h_h │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ +_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. │ │ │ │ │ _s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ Classes for the generic construction and application of the smoothers. │ │ │ │ │ -_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ -Provides classes for the Coloring process of AMG. │ │ │ │ │ -_g_r_a_p_h_._h_h │ │ │ │ │ -Provides classes for building the matrix graph. │ │ │ │ │ -_g_a_l_e_r_k_i_n_._h_h │ │ │ │ │ -Provides a class for building the galerkin product based on a aggregation │ │ │ │ │ -scheme. │ │ │ │ │ -_h_i_e_r_a_r_c_h_y_._h_h │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. │ │ │ │ │ -_g_r_a_p_h_c_r_e_a_t_o_r_._h_h │ │ │ │ │ -_g_l_o_b_a_l_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ -Provdes class for identifying aggregates globally. │ │ │ │ │ -_d_e_p_e_n_d_e_n_c_y_._h_h │ │ │ │ │ -Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h │ │ │ │ │ -Functionality for redistributing a sparse matrix. │ │ │ │ │ -_D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s │ │ │ │ │ -auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ -value > *sfinae=nullptr) │ │ │ │ │ -Get the number of nonzero fields in the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:119 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_a_g_g_r_e_g_a_t_e_s_M_a_p_s │ │ │ │ │ -const AggregatesMapList & aggregatesMaps() const │ │ │ │ │ -Get the hierarchy of the mappings of the nodes onto aggregates. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:812 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_i_s_B_u_i_l_t │ │ │ │ │ -bool isBuilt() const │ │ │ │ │ -Whether the hierarchy was built. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:953 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_h_a_s_C_o_a_r_s_e_s_t │ │ │ │ │ -bool hasCoarsest() const │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:946 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_l_e_v_e_l_s │ │ │ │ │ -std::size_t levels() const │ │ │ │ │ -Get the number of levels in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_l_e_v_e_l_s │ │ │ │ │ -std::size_t levels() const │ │ │ │ │ -Get the number of levels in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:934 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_C_o_a_r_s_e_r │ │ │ │ │ -void addCoarser(Arguments &args) │ │ │ │ │ -Add an element on a coarser level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:334 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_r_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -const RedistributeInfoList & redistributeInformation() const │ │ │ │ │ -Get the hierarchy of the information about redistributions,. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:818 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_p_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -const ParallelInformationHierarchy & parallelInformation() const │ │ │ │ │ -Get the hierarchy of the parallel data distribution information. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:737 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_r_e_p_a_r_t_i_t_i_o_n_A_n_d_D_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x │ │ │ │ │ -bool repartitionAndDistributeMatrix(const M &origMatrix, std::shared_ptr< M > │ │ │ │ │ -newMatrix, SequentialInformation &origComm, std::shared_ptr< │ │ │ │ │ -SequentialInformation > &newComm, RedistributeInformation< │ │ │ │ │ -SequentialInformation > &ri, int nparts, C1 &criterion) │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:313 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:725 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_m_a_t_r_i_c_e_s │ │ │ │ │ -const ParallelMatrixHierarchy & matrices() const │ │ │ │ │ -Get the matrix hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:730 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ -std::size_t maxlevels() const │ │ │ │ │ -Get the max number of levels in the hierarchy of processors. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:940 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ -static const V ISOLATED │ │ │ │ │ -Identifier of isolated vertices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:571 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_r_e_c_a_l_c_u_l_a_t_e_G_a_l_e_r_k_i_n │ │ │ │ │ -void recalculateGalerkin(const F ©Flags) │ │ │ │ │ -Recalculate the galerkin products. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:898 │ │ │ │ │ +_t_r_a_n_s_f_e_r_._h_h │ │ │ │ │ +Prolongation and restriction for amg. │ │ │ │ │ +_f_a_s_t_a_m_g_s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_s_u_p_e_r_l_u_._h_h │ │ │ │ │ +Classes for using SuperLU with ISTL matrices. │ │ │ │ │ +_u_m_f_p_a_c_k_._h_h │ │ │ │ │ +Classes for using UMFPack with ISTL matrices. │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h │ │ │ │ │ +void presmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ +Apply pre smoothing on the current level. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:406 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ const void * Arguments │ │ │ │ │ A type holding all the arguments needed to call the constructor. │ │ │ │ │ DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ -std::size_t noVertices() const │ │ │ │ │ -Get the number of vertices. │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ Construct an object with the specified arguments. │ │ │ │ │ DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_n_V_e_c_t_o_r │ │ │ │ │ -void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const │ │ │ │ │ -Coarsen the vector hierarchy according to the matrix hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:841 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -const AggregateDescriptor * const_iterator │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:723 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr< │ │ │ │ │ -ParallelInformation > pinfo=std::make_shared< ParallelInformation >()) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e │ │ │ │ │ -AccumulationMode │ │ │ │ │ -Identifiers for the different accumulation modes. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_f_i_n_e_s_t │ │ │ │ │ -Iterator finest() │ │ │ │ │ -Get an iterator positioned at the finest level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_b_u_i_l_d │ │ │ │ │ -void build(const T &criterion) │ │ │ │ │ -Build the matrix hierarchy using aggregation. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:400 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_f_r_e_e │ │ │ │ │ -void free() │ │ │ │ │ -Free the allocated memory. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_n_S_m_o_o_t_h_e_r │ │ │ │ │ -void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename │ │ │ │ │ -SmootherTraits< S >::Arguments &args) const │ │ │ │ │ -Coarsen the smoother hierarchy according to the matrix hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:868 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_b_u_i_l_d_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, │ │ │ │ │ -bool finestLevel) │ │ │ │ │ -Build the dependency of the matrix graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s │ │ │ │ │ -std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, │ │ │ │ │ -const C &criterion, bool finestLevel) │ │ │ │ │ -Build the aggregates. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_c_a_l_c_u_l_a_t_e │ │ │ │ │ -void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, │ │ │ │ │ -const I &pinfo, const O ©) │ │ │ │ │ -Calculate the galerkin product. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_s_O_n_F_i_n_e_s_t │ │ │ │ │ -void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const │ │ │ │ │ -Get the mapping of fine level unknowns to coarse level aggregates. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:743 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_~_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -~MatrixHierarchy() │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:824 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_A_X___P_R_O_C_E_S_S_E_S │ │ │ │ │ -@ MAX_PROCESSES │ │ │ │ │ -Hard limit for the number of processes allowed. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_a_t_O_n_c_e_A_c_c_u │ │ │ │ │ -@ atOnceAccu │ │ │ │ │ -Accumulate data to one process at once. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u │ │ │ │ │ -@ successiveAccu │ │ │ │ │ -Successively accumulate to fewer processes. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h │ │ │ │ │ +void postsmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ +Apply post smoothing on the current level. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:428 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ +int iterations │ │ │ │ │ +The numbe of iterations to perform. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_m_a_t_r_i_x │ │ │ │ │ +OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix │ │ │ │ │ +The iterator over the matrices. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s │ │ │ │ │ +void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont) │ │ │ │ │ +Get the aggregate number of each unknown on the coarsest level. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:704 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_p_i_n_f_o │ │ │ │ │ +ParallelInformationHierarchy::Iterator pinfo │ │ │ │ │ +The iterator over the parallel information. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y │ │ │ │ │ +void recalculateHierarchy() │ │ │ │ │ +Recalculate the matrix hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_p_o_s_t │ │ │ │ │ +void post(Domain &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ +std::size_t maxlevels() │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:481 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ +X Domain │ │ │ │ │ +The domain type. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_e_s_i_d_u_a_l │ │ │ │ │ +Hierarchy< Domain, A >::Iterator residual │ │ │ │ │ +The iterator over the residuals. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:204 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y │ │ │ │ │ +MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy │ │ │ │ │ +The operator hierarchy type. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_e_d_i_s_t │ │ │ │ │ +OperatorHierarchy::RedistributeInfoList::const_iterator redist │ │ │ │ │ +The iterator over the redistribution information. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ +X Range │ │ │ │ │ +The range type. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +PI ParallelInformation │ │ │ │ │ +The type of the parallel information. Either OwnerOverlapCommunication or │ │ │ │ │ +another type describing the... │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ +M Operator │ │ │ │ │ +The matrix operator type. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_l_e_v_e_l_s │ │ │ │ │ +std::size_t levels() │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:476 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_C_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ +InverseOperator< X, X > CoarseSolver │ │ │ │ │ +the type of the coarse solver. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r │ │ │ │ │ +bool usesDirectCoarseLevelSolver() const │ │ │ │ │ +Check whether the coarse solver used is a direct solver. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:632 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_h_s │ │ │ │ │ +Hierarchy< Domain, A >::Iterator lhs │ │ │ │ │ +The iterator over the left hand side. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:200 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_h_s │ │ │ │ │ +Hierarchy< Range, A >::Iterator rhs │ │ │ │ │ +The iterator over the right hand sided. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_e_v_e_l │ │ │ │ │ +std::size_t level │ │ │ │ │ +The level index. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:212 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_a_p_p_l_y │ │ │ │ │ +void apply(Domain &v, const Range &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:488 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ +OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy │ │ │ │ │ +The parallal data distribution hierarchy type. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_p_r_e │ │ │ │ │ +void pre(Domain &x, Range &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:427 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_F_a_s_t_A_M_G │ │ │ │ │ +FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const │ │ │ │ │ +Parameters &parms, bool symmetric=true) │ │ │ │ │ +Construct a new amg with a specific coarse solver. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_a_g_g_r_e_g_a_t_e_s │ │ │ │ │ +OperatorHierarchy::AggregatesMapList::const_iterator aggregates │ │ │ │ │ +The iterator over the aggregates maps. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:196 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x │ │ │ │ │ -void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s │ │ │ │ │ -void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ -&newComm, RedistributeInformation< C > &ri) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:757 │ │ │ │ │ -_D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ -bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< │ │ │ │ │ -T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ -&redistInf, bool verbose=false) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:829 │ │ │ │ │ -_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x │ │ │ │ │ -void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, │ │ │ │ │ -RedistributeInformation< C > &ri) │ │ │ │ │ -Redistribute a matrix according to given domain decompositions. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:820 │ │ │ │ │ -_D_u_n_e_:_:_g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ -bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, │ │ │ │ │ -T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ -&redistInf, bool verbose=false) │ │ │ │ │ -execute a graph repartition for a giving graph and indexset. │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:1235 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ _D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ A generic dynamic dense matrix. │ │ │ │ │ DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -Type for indices and sizes. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ -The type implementing a matrix row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -Class representing the properties of an ede in the matrix graph. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -Class representing a node in the matrix graph. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -The (undirected) graph of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Attaches properties to the edges and vertices of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:988 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ -A hierarchy of containers (e.g. matrices or vectors) │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator > │ │ │ │ │ -Iterator │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ +Export the type representing the underlying field. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::const_iterator ConstColIterator │ │ │ │ │ +Const iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +T block_type │ │ │ │ │ +Export the type representing the components. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G │ │ │ │ │ +A fast (sequential) algebraic multigrid based on agglomeration that saves │ │ │ │ │ +memory bandwidth. │ │ │ │ │ +DDeeffiinniittiioonn fastamg.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(const M &A, X &x, Y &d, const Y &b) │ │ │ │ │ +DDeeffiinniittiioonn fastamgsmoother.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation │ │ │ │ │ +> Iterator │ │ │ │ │ Type of the mutable iterator. │ │ │ │ │ DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _M_a_t_r_i_x_O_p_e_r_a_t_o_r_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const │ │ │ │ │ -MatrixOperator > ConstIterator │ │ │ │ │ -Type of the const iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_I_n_d_i_c_e_s_C_o_a_r_s_e_n_e_r │ │ │ │ │ -DDeeffiinniittiioonn indicescoarsener.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator over the levels in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:120 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ The hierarchies build by the coarsening process. │ │ │ │ │ DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_A_l_l_o_c_a_t_o_r │ │ │ │ │ -typename std::allocator_traits< Allocator >::template rebind_alloc< │ │ │ │ │ -AggregatesMap * > AAllocator │ │ │ │ │ -Allocator for pointers. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Dune::Amg::Hierarchy< ParallelInformation, Allocator > │ │ │ │ │ -ParallelInformationHierarchy │ │ │ │ │ -The type of the parallel informarion hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_L_i_s_t │ │ │ │ │ -std::list< AggregatesMap *, AAllocator > AggregatesMapList │ │ │ │ │ -The type of the aggregates maps list. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -PI ParallelInformation │ │ │ │ │ -The type of the index set. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy │ │ │ │ │ -The type of the parallel matrix hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ -A Allocator │ │ │ │ │ -The allocator to use. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_T_y_p_e │ │ │ │ │ -RedistributeInformation< ParallelInformation > RedistributeInfoType │ │ │ │ │ -The type of the redistribute information. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_g_e_t_P_r_o_l_o_n_g_a_t_i_o_n_D_a_m_p_i_n_g_F_a_c_t_o_r │ │ │ │ │ -double getProlongationDampingFactor() const │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_R_I_L_A_l_l_o_c_a_t_o_r │ │ │ │ │ -typename std::allocator_traits< Allocator >::template rebind_alloc< │ │ │ │ │ -RedistributeInfoType > RILAllocator │ │ │ │ │ -Allocator for RedistributeInfoType. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_L_i_s_t │ │ │ │ │ -std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList │ │ │ │ │ -The type of the list of redistribute information. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > │ │ │ │ │ -AggregatesMap │ │ │ │ │ -The type of the aggregates map we use. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x │ │ │ │ │ -MatrixOperator::matrix_type Matrix │ │ │ │ │ -The type of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_O_p_e_r_a_t_o_r │ │ │ │ │ -M MatrixOperator │ │ │ │ │ -The type of the matrix operator. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const matrix_row &row) │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_m_a_t_r_i_x___r_o_w │ │ │ │ │ -Matrix::row_type matrix_row │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_m_i_n │ │ │ │ │ -size_type min │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_c_a_l_c │ │ │ │ │ -calc() │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:247 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_m_a_x │ │ │ │ │ -size_type max │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_s_u_m │ │ │ │ │ -size_type sum │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_:_:_M_a_t_r_i_x_S_t_a_t_s_<_ _M_a_t_r_i_x_,_ _t_r_u_e_ _>_:_:_c_a_l_c_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -Matrix::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -The criterion describing the stop criteria for the coarsening process. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -CoarsenCriterion(const Dune::Amg::Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -T AggregationCriterion │ │ │ │ │ -The criterion for tagging connections as strong and nodes as isolated. This │ │ │ │ │ -might be e.... │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double │ │ │ │ │ -minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode │ │ │ │ │ -accumulate=successiveAccu) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:301 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ All parameters for AMG. │ │ │ │ │ DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ -Tag idnetifying the visited property of a vertex. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:29 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ The default class for the smoother arguments. │ │ │ │ │ DDeeffiinniittiioonn smoother.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r │ │ │ │ │ -DDeeffiinniittiioonn transfer.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R │ │ │ │ │ +Sequential SSOR preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Base class for scalar product and norm computation. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ +bool converged │ │ │ │ │ +True if convergence criterion has been met. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00101.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: smoother.hh File Reference │ │ │ │ +dune-istl: dependency.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,117 +73,60 @@ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Classes for the generic construction and application of the smoothers. │ │ │ │ +

Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ More...

│ │ │ │ -
#include <dune/istl/paamg/construction.hh>
│ │ │ │ -#include <dune/istl/paamg/aggregates.hh>
│ │ │ │ -#include <dune/istl/preconditioners.hh>
│ │ │ │ -#include <dune/istl/schwarz.hh>
│ │ │ │ -#include <dune/istl/novlpschwarz.hh>
│ │ │ │ +
#include <bitset>
│ │ │ │ +#include <ostream>
│ │ │ │ +#include "graph.hh"
│ │ │ │ +#include "properties.hh"
│ │ │ │ #include <dune/common/propertymap.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::DefaultSmootherArgs< T >
 The default class for the smoother arguments. More...
class  Dune::Amg::EdgeProperties
 Class representing the properties of an ede in the matrix graph. More...
 
struct  Dune::Amg::SmootherTraits< T >
 Traits class for getting the attribute class of a smoother. More...
class  Dune::Amg::VertexProperties
 Class representing a node in the matrix graph. More...
 
struct  Dune::Amg::SmootherTraits< Richardson< X, Y > >
class  Dune::Amg::PropertyGraphVertexPropertyMap< G, i >
 
struct  Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > >
 
struct  Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > >
 
class  Dune::Amg::DefaultConstructionArgs< T >
 Construction Arguments for the default smoothers. More...
 
struct  Dune::Amg::ConstructionArgs< T >
 
class  Dune::Amg::DefaultParallelConstructionArgs< T, C >
 
class  Dune::Amg::DefaultConstructionArgs< Richardson< X, Y > >
 
struct  Dune::Amg::ConstructionTraits< SeqSSOR< M, X, Y, l > >
 Policy for the construction of the SeqSSOR smoother. More...
 
struct  Dune::Amg::ConstructionTraits< SeqSOR< M, X, Y, l > >
 Policy for the construction of the SeqSOR smoother. More...
 
struct  Dune::Amg::ConstructionTraits< SeqJac< M, X, Y, l > >
 Policy for the construction of the SeqJac smoother. More...
 
struct  Dune::Amg::ConstructionTraits< Richardson< X, Y > >
 Policy for the construction of the Richardson smoother. More...
 
class  Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > >
 
struct  Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > >
 Policy for the construction of the SeqILU smoother. More...
 
struct  Dune::Amg::ConstructionTraits< ParSSOR< M, X, Y, C > >
 Policy for the construction of the ParSSOR smoother. More...
 
struct  Dune::Amg::ConstructionTraits< BlockPreconditioner< X, Y, C, T > >
 
struct  Dune::Amg::ConstructionTraits< NonoverlappingBlockPreconditioner< C, T > >
 
struct  Dune::Amg::SmootherApplier< T >
 Helper class for applying the smoothers. More...
 
struct  Dune::Amg::SmootherApplier< SeqSOR< M, X, Y, l > >
 
struct  Dune::Amg::SmootherApplier< BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > >
 
struct  Dune::Amg::SmootherApplier< NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > >
 
struct  Dune::Amg::SmootherApplier< SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > >
 
struct  Dune::Amg::SeqOverlappingSchwarzSmootherArgs< T >
 
struct  Dune::Amg::SmootherTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > >
 
class  Dune::Amg::ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > >
 
struct  Dune::Amg::ConstructionTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > >
struct  Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<typename LevelContext >
void Dune::Amg::presmooth (LevelContext &levelContext, size_t steps)
 Apply pre smoothing on the current level.
 
template<typename LevelContext >
void Dune::Amg::postsmooth (LevelContext &levelContext, size_t steps)
 Apply post smoothing on the current level.
 
template<typename G , typename EP , typename VM , typename EM >
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type Dune::get (const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
 
std::ostream & Dune::Amg::operator<< (std::ostream &os, const EdgeProperties &props)
 
std::ostream & Dune::Amg::operator<< (std::ostream &os, const VertexProperties &props)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Classes for the generic construction and application of the smoothers.

│ │ │ │ +

Provides classes for initializing the link attributes of a matrix graph.

│ │ │ │
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,110 +2,55 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ _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 │ │ │ │ │ -smoother.hh File Reference │ │ │ │ │ +dependency.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Classes for the generic construction and application of the smoothers. _M_o_r_e_._._. │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +#include "_p_r_o_p_e_r_t_i_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 │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_<_ _T_ _> │ │ │ │ │ -  The default class for the smoother arguments. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +  Class representing the properties of an ede in the matrix graph. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ │ -  Traits class for getting the attribute class of a smoother. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +  Class representing a node in the matrix graph. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _>_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_<_ _G_,_ _i_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _T_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_,_ _T_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _T_ _> │ │ │ │ │ -  Construction Arguments for the default smoothers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _T_,_ _C_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ -  Policy for the construction of the _S_e_q_S_S_O_R smoother. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ -  Policy for the construction of the _S_e_q_S_O_R smoother. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_J_a_c_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ -  Policy for the construction of the _S_e_q_J_a_c smoother. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _>_ _> │ │ │ │ │ -  Policy for the construction of the _R_i_c_h_a_r_d_s_o_n smoother. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _S_e_q_I_L_U_<_ _M_,_ _X_,_ _Y_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_I_L_U_<_ _M_,_ _X_,_ _Y_ _>_ _> │ │ │ │ │ -  Policy for the construction of the _S_e_q_I_L_U smoother. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _P_a_r_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _C_ _>_ _> │ │ │ │ │ -  Policy for the construction of the _P_a_r_S_S_O_R smoother. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _T_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_,_ _T │ │ │ │ │ - _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _T_ _> │ │ │ │ │ -  Helper class for applying the smoothers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_,_ _C_,_ _S_e_q_S_O_R_<_ _M_, │ │ │ │ │ - _X_,_ _Y_,_ _l_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_, │ │ │ │ │ - _S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ - _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _M_S_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_S_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_S_,_ _T_A_ _> │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_S_,_ _T_A │ │ │ │ │ - _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_P_r_o_p_e_r_t_y_M_a_p_T_y_p_e_S_e_l_e_c_t_o_r_<_ _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g_,_ _A_m_g_:_: │ │ │ │ │ + _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_ _E_P_,_ _V_M_,_ _E_M_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h (LevelContext &levelContext, size_t steps) │ │ │ │ │ -  Apply pre smoothing on the current level. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h (LevelContext &levelContext, size_t steps) │ │ │ │ │ -  Apply post smoothing on the current level. │ │ │ │ │ +template │ │ │ │ │ + PropertyMapTypeSelector< _A_m_g_:_: │ │ │ │ │ +_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g, _A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h< _D_u_n_e_:_:_g_e_t (const _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ + G, _A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, EP, VM, EM > &tag, _A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h< G, _A_m_g_:_: │ │ │ │ │ + >::Type  _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, EP, VM, EM > &graph) │ │ │ │ │ +  │ │ │ │ │ + std::ostream &  _D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream │ │ │ │ │ + &os, const _E_d_g_e_P_r_o_p_e_r_t_i_e_s &props) │ │ │ │ │ +  │ │ │ │ │ + std::ostream &  _D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream │ │ │ │ │ + &os, const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s &props) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Classes for the generic construction and application of the smoothers. │ │ │ │ │ +Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: smoother.hh Source File │ │ │ │ +dune-istl: dependency.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1126 +74,486 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
smoother.hh
│ │ │ │ +
dependency.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMGSMOOTHER_HH
│ │ │ │ -
6#define DUNE_AMGSMOOTHER_HH
│ │ │ │ +
5#ifndef DUNE_AMG_DEPENDENCY_HH
│ │ │ │ +
6#define DUNE_AMG_DEPENDENCY_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
11#include <dune/istl/schwarz.hh>
│ │ │ │ - │ │ │ │ -
13#include <dune/common/propertymap.hh>
│ │ │ │ -
14#include <dune/common/ftraits.hh>
│ │ │ │ +
8
│ │ │ │ +
9#include <bitset>
│ │ │ │ +
10#include <ostream>
│ │ │ │ +
11
│ │ │ │ +
12#include "graph.hh"
│ │ │ │ +
13#include "properties.hh"
│ │ │ │ +
14#include <dune/common/propertymap.hh>
│ │ │ │
15
│ │ │ │ -
16namespace Dune
│ │ │ │ -
17{
│ │ │ │ -
18 namespace Amg
│ │ │ │ -
19 {
│ │ │ │ -
20
│ │ │ │ -
36 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
38 {
│ │ │ │ -
42 typedef typename FieldTraits<T>::real_type RelaxationFactor;
│ │ │ │ -
43
│ │ │ │ - │ │ │ │ - │ │ │ │ -
52
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
58 {}
│ │ │ │ -
│ │ │ │ -
59 };
│ │ │ │ -
│ │ │ │ -
60
│ │ │ │ -
64 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
66 {
│ │ │ │ - │ │ │ │ -
68
│ │ │ │ -
69 };
│ │ │ │ -
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
19 namespace Amg
│ │ │ │ +
20 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
39 {
│ │ │ │ +
40 friend std::ostream& operator<<(std::ostream& os, const EdgeProperties& props);
│ │ │ │ +
41 public:
│ │ │ │ + │ │ │ │ +
44
│ │ │ │ +
45 private:
│ │ │ │ +
46
│ │ │ │ +
47 std::bitset<SIZE> flags_;
│ │ │ │ +
48 public:
│ │ │ │ + │ │ │ │ +
51
│ │ │ │ +
53 std::bitset<SIZE>::reference operator[](std::size_t v);
│ │ │ │ +
54
│ │ │ │ +
56 bool operator[](std::size_t v) const;
│ │ │ │ +
57
│ │ │ │ +
63 bool depends() const;
│ │ │ │ +
64
│ │ │ │ +
69 void setDepends();
│ │ │ │
70
│ │ │ │ -
71 template<class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
73 {
│ │ │ │ - │ │ │ │ +
74 void resetDepends();
│ │ │ │
75
│ │ │ │ -
76 };
│ │ │ │ -
│ │ │ │ -
77
│ │ │ │ -
78 template<class X, class Y, class C, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
80 : public SmootherTraits<T>
│ │ │ │ -
81 {};
│ │ │ │ -
│ │ │ │ -
82
│ │ │ │ -
83 template<class C, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
85 : public SmootherTraits<T>
│ │ │ │ -
86 {};
│ │ │ │ -
│ │ │ │ -
87
│ │ │ │ -
91 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
93 {
│ │ │ │ -
94 typedef typename T::matrix_type Matrix;
│ │ │ │ -
95
│ │ │ │ - │ │ │ │ +
80 bool influences() const;
│ │ │ │ +
81
│ │ │ │ +
85 void setInfluences();
│ │ │ │ +
86
│ │ │ │ +
90 void resetInfluences();
│ │ │ │ +
91
│ │ │ │ +
96 bool isOneWay() const;
│ │ │ │
97
│ │ │ │ - │ │ │ │ -
99
│ │ │ │ -
100 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
102 {}
│ │ │ │ -
│ │ │ │ +
102 bool isTwoWay() const;
│ │ │ │
103
│ │ │ │ -
│ │ │ │ -
104 void setMatrix(const Matrix& matrix)
│ │ │ │ -
105 {
│ │ │ │ -
106 matrix_=&matrix;
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
108 virtual void setMatrix(const Matrix& matrix, [[maybe_unused]] const AggregatesMap& amap)
│ │ │ │ -
109 {
│ │ │ │ -
110 setMatrix(matrix);
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
113
│ │ │ │ -
│ │ │ │ -
114 const Matrix& getMatrix() const
│ │ │ │ -
115 {
│ │ │ │ -
116 return *matrix_;
│ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
│ │ │ │ -
119 void setArgs(const SmootherArgs& args)
│ │ │ │ -
120 {
│ │ │ │ -
121 args_=&args;
│ │ │ │ -
122 }
│ │ │ │ -
│ │ │ │ -
123
│ │ │ │ -
124 template<class T1>
│ │ │ │ -
│ │ │ │ -
125 void setComm([[maybe_unused]] T1& comm)
│ │ │ │ -
126 {}
│ │ │ │ -
│ │ │ │ -
127
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129 {
│ │ │ │ -
130 return comm_;
│ │ │ │ -
131 }
│ │ │ │ -
│ │ │ │ -
132
│ │ │ │ -
│ │ │ │ -
133 const SmootherArgs getArgs() const
│ │ │ │ -
134 {
│ │ │ │ -
135 return *args_;
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
138 protected:
│ │ │ │ -
139 const Matrix* matrix_;
│ │ │ │ -
140 private:
│ │ │ │ -
141 const SmootherArgs* args_;
│ │ │ │ - │ │ │ │ -
143 };
│ │ │ │ -
│ │ │ │ +
108 bool isStrong() const;
│ │ │ │ +
109
│ │ │ │ +
113 void reset();
│ │ │ │ +
114
│ │ │ │ +
118 void printFlags() const;
│ │ │ │ +
119 };
│ │ │ │ +
│ │ │ │ +
120
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
127 friend std::ostream& operator<<(std::ostream& os, const VertexProperties& props);
│ │ │ │ +
128 public:
│ │ │ │ + │ │ │ │ +
130 private:
│ │ │ │ +
131
│ │ │ │ +
133 std::bitset<SIZE> flags_;
│ │ │ │ +
134
│ │ │ │ +
135 public:
│ │ │ │ + │ │ │ │ +
138
│ │ │ │ +
140 std::bitset<SIZE>::reference operator[](std::size_t v);
│ │ │ │ +
141
│ │ │ │ +
143 bool operator[](std::size_t v) const;
│ │ │ │
144
│ │ │ │ -
145 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
147 : public DefaultConstructionArgs<T>
│ │ │ │ -
148 {};
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
150 template<class T, class C=SequentialInformation>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
152 : public ConstructionArgs<T>
│ │ │ │ -
153 {
│ │ │ │ -
154 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 {}
│ │ │ │ -
│ │ │ │ +
151 void setIsolated();
│ │ │ │ +
152
│ │ │ │ +
156 bool isolated() const;
│ │ │ │
157
│ │ │ │ -
│ │ │ │ -
158 void setComm(const C& comm)
│ │ │ │ -
159 {
│ │ │ │ -
160 comm_ = &comm;
│ │ │ │ -
161 }
│ │ │ │ -
│ │ │ │ +
161 void resetIsolated();
│ │ │ │
162
│ │ │ │ -
│ │ │ │ -
163 const C& getComm() const
│ │ │ │ -
164 {
│ │ │ │ -
165 return *comm_;
│ │ │ │ -
166 }
│ │ │ │ -
│ │ │ │ -
167 private:
│ │ │ │ -
168 const C* comm_;
│ │ │ │ -
169 };
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
171
│ │ │ │ -
172 template<class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
174 {
│ │ │ │ -
175 typedef Richardson<X,Y> T;
│ │ │ │ -
176
│ │ │ │ - │ │ │ │ -
178
│ │ │ │ -
179 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
181 {}
│ │ │ │ -
│ │ │ │ +
166 void setVisited();
│ │ │ │ +
167
│ │ │ │ +
171 bool visited() const;
│ │ │ │ +
172
│ │ │ │ +
176 void resetVisited();
│ │ │ │ +
177
│ │ │ │ +
181 void setFront();
│ │ │ │
182
│ │ │ │ -
183 template <class... Args>
│ │ │ │ -
│ │ │ │ -
184 void setMatrix(const Args&...)
│ │ │ │ -
185 {}
│ │ │ │ -
│ │ │ │ -
186
│ │ │ │ -
│ │ │ │ -
187 void setArgs(const SmootherArgs& args)
│ │ │ │ -
188 {
│ │ │ │ -
189 args_=&args;
│ │ │ │ -
190 }
│ │ │ │ -
│ │ │ │ -
191
│ │ │ │ -
192 template<class T1>
│ │ │ │ -
│ │ │ │ -
193 void setComm([[maybe_unused]] T1& comm)
│ │ │ │ -
194 {}
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
197 {
│ │ │ │ -
198 return comm_;
│ │ │ │ -
199 }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ -
201 const SmootherArgs getArgs() const
│ │ │ │ -
202 {
│ │ │ │ -
203 return *args_;
│ │ │ │ -
204 }
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
206 private:
│ │ │ │ -
207 const SmootherArgs* args_;
│ │ │ │ - │ │ │ │ -
209 };
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
211
│ │ │ │ -
212
│ │ │ │ -
213 template<class T>
│ │ │ │ -
214 struct ConstructionTraits;
│ │ │ │ +
186 bool front() const;
│ │ │ │ +
187
│ │ │ │ +
191 void resetFront();
│ │ │ │ +
192
│ │ │ │ +
196 void setExcludedBorder();
│ │ │ │ +
197
│ │ │ │ +
202 bool excludedBorder() const;
│ │ │ │ +
203
│ │ │ │ +
207 void resetExcludedBorder();
│ │ │ │ +
208
│ │ │ │ +
212 void reset();
│ │ │ │ +
213
│ │ │ │ +
214 };
│ │ │ │ +
│ │ │ │
215
│ │ │ │ -
219 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
220 struct ConstructionTraits<SeqSSOR<M,X,Y,l> >
│ │ │ │ -
221 {
│ │ │ │ - │ │ │ │ -
223
│ │ │ │ -
│ │ │ │ -
224 static inline std::shared_ptr<SeqSSOR<M,X,Y,l>> construct(Arguments& args)
│ │ │ │ -
225 {
│ │ │ │ -
226 return std::make_shared<SeqSSOR<M,X,Y,l>>
│ │ │ │ -
227 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
│ │ │ │ -
228 }
│ │ │ │ -
│ │ │ │ -
229 };
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
231
│ │ │ │ -
235 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
236 struct ConstructionTraits<SeqSOR<M,X,Y,l> >
│ │ │ │ -
237 {
│ │ │ │ - │ │ │ │ +
216 template<typename G, std::size_t i>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
218 : public RAPropertyMapHelper<typename std::bitset<VertexProperties::SIZE>::reference,
│ │ │ │ +
219 PropertyGraphVertexPropertyMap<G,i> >
│ │ │ │ +
220 {
│ │ │ │ +
221 public:
│ │ │ │ +
222
│ │ │ │ +
223 typedef ReadWritePropertyMapTag Category;
│ │ │ │ +
224
│ │ │ │ +
225 enum {
│ │ │ │ +
227 index = i
│ │ │ │ +
228 };
│ │ │ │ +
229
│ │ │ │ +
233 typedef G Graph;
│ │ │ │ +
234
│ │ │ │ +
238 typedef std::bitset<VertexProperties::SIZE> BitSet;
│ │ │ │
239
│ │ │ │ -
│ │ │ │ -
240 static inline std::shared_ptr<SeqSOR<M,X,Y,l>> construct(Arguments& args)
│ │ │ │ -
241 {
│ │ │ │ -
242 return std::make_shared<SeqSOR<M,X,Y,l>>
│ │ │ │ -
243 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
│ │ │ │ -
244 }
│ │ │ │ -
│ │ │ │ -
245 };
│ │ │ │ -
│ │ │ │ -
246
│ │ │ │ -
247
│ │ │ │ -
251 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
252 struct ConstructionTraits<SeqJac<M,X,Y,l> >
│ │ │ │ -
253 {
│ │ │ │ - │ │ │ │ -
255
│ │ │ │ -
│ │ │ │ -
256 static inline std::shared_ptr<SeqJac<M,X,Y,l>> construct(Arguments& args)
│ │ │ │ -
257 {
│ │ │ │ -
258 return std::make_shared<SeqJac<M,X,Y,l>>
│ │ │ │ -
259 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
│ │ │ │ -
260 }
│ │ │ │ -
│ │ │ │ -
261 };
│ │ │ │ +
243 typedef typename BitSet::reference Reference;
│ │ │ │ +
244
│ │ │ │ +
248 typedef bool ValueType;
│ │ │ │ +
249
│ │ │ │ +
253 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
254
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
260 : graph_(&g)
│ │ │ │ +
261 {}
│ │ │ │
│ │ │ │
262
│ │ │ │ -
266 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
267 struct ConstructionTraits<Richardson<X,Y> >
│ │ │ │ -
268 {
│ │ │ │ - │ │ │ │ -
270
│ │ │ │ -
│ │ │ │ -
271 static inline std::shared_ptr<Richardson<X,Y>> construct(Arguments& args)
│ │ │ │ -
272 {
│ │ │ │ -
273 return std::make_shared<Richardson<X,Y>>
│ │ │ │ -
274 (args.getArgs().relaxationFactor);
│ │ │ │ -
275 }
│ │ │ │ -
│ │ │ │ -
276 };
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ -
278
│ │ │ │ -
279 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
281 : public DefaultConstructionArgs<SeqILU<M,X,Y> >
│ │ │ │ -
282 {
│ │ │ │ -
283 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
285 : n_(n)
│ │ │ │ -
286 {}
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
│ │ │ │ -
288 void setN(int n)
│ │ │ │ -
289 {
│ │ │ │ -
290 n_ = n;
│ │ │ │ -
291 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
267 : graph_(0)
│ │ │ │ +
268 {}
│ │ │ │
│ │ │ │ -
292
│ │ │ │ +
269
│ │ │ │ +
270
│ │ │ │ +
│ │ │ │ +
275 Reference operator[](const Vertex& vertex) const
│ │ │ │ +
276 {
│ │ │ │ +
277 return graph_->getVertexProperties(vertex)[index];
│ │ │ │ +
278 }
│ │ │ │ +
│ │ │ │ +
279 private:
│ │ │ │ +
280 Graph* graph_;
│ │ │ │ +
281 };
│ │ │ │ +
│ │ │ │ +
282
│ │ │ │ +
283 } // end namespace Amg
│ │ │ │ +
284
│ │ │ │ +
285 template<typename G, typename EP, typename VM, typename EM>
│ │ │ │ +
│ │ │ │ +
286 struct PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >
│ │ │ │ +
287 {
│ │ │ │ + │ │ │ │ +
289 };
│ │ │ │ +
│ │ │ │ +
290
│ │ │ │ +
291 template<typename G, typename EP, typename VM, typename EM>
│ │ │ │ +
292 typename PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >::Type
│ │ │ │
│ │ │ │ -
293 int getN()
│ │ │ │ -
294 {
│ │ │ │ -
295 return n_;
│ │ │ │ -
296 }
│ │ │ │ + │ │ │ │ +
294 {
│ │ │ │ + │ │ │ │ +
296 }
│ │ │ │
│ │ │ │
297
│ │ │ │ -
298 private:
│ │ │ │ -
299 int n_;
│ │ │ │ -
300 };
│ │ │ │ -
│ │ │ │ -
301
│ │ │ │ -
302
│ │ │ │ -
306 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
307 struct ConstructionTraits<SeqILU<M,X,Y> >
│ │ │ │ -
308 {
│ │ │ │ - │ │ │ │ -
310
│ │ │ │ -
│ │ │ │ -
311 static inline std::shared_ptr<SeqILU<M,X,Y>> construct(Arguments& args)
│ │ │ │ -
312 {
│ │ │ │ -
313 return std::make_shared<SeqILU<M,X,Y>>
│ │ │ │ -
314 (args.getMatrix(), args.getN(), args.getArgs().relaxationFactor);
│ │ │ │ -
315 }
│ │ │ │ -
│ │ │ │ -
316 };
│ │ │ │ -
│ │ │ │ -
317
│ │ │ │ -
321 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ -
322 struct ConstructionTraits<ParSSOR<M,X,Y,C> >
│ │ │ │ -
323 {
│ │ │ │ - │ │ │ │ -
325
│ │ │ │ -
│ │ │ │ -
326 static inline std::shared_ptr<ParSSOR<M,X,Y,C>> construct(Arguments& args)
│ │ │ │ -
327 {
│ │ │ │ -
328 return std::make_shared<ParSSOR<M,X,Y,C>>
│ │ │ │ -
329 (args.getMatrix(), args.getArgs().iterations,
│ │ │ │ -
330 args.getArgs().relaxationFactor, args.getComm());
│ │ │ │ -
331 }
│ │ │ │ -
│ │ │ │ -
332 };
│ │ │ │ -
│ │ │ │ -
333
│ │ │ │ -
334 template<class X, class Y, class C, class T>
│ │ │ │ -
│ │ │ │ -
335 struct ConstructionTraits<BlockPreconditioner<X,Y,C,T> >
│ │ │ │ -
336 {
│ │ │ │ - │ │ │ │ -
338 typedef ConstructionTraits<T> SeqConstructionTraits;
│ │ │ │ -
│ │ │ │ -
339 static inline std::shared_ptr<BlockPreconditioner<X,Y,C,T>> construct(Arguments& args)
│ │ │ │ -
340 {
│ │ │ │ -
341 auto seqPrec = SeqConstructionTraits::construct(args);
│ │ │ │ -
342 return std::make_shared<BlockPreconditioner<X,Y,C,T>> (seqPrec, args.getComm());
│ │ │ │ -
343 }
│ │ │ │ -
│ │ │ │ -
344 };
│ │ │ │ -
│ │ │ │ -
345
│ │ │ │ -
346 template<class C, class T>
│ │ │ │ -
│ │ │ │ -
347 struct ConstructionTraits<NonoverlappingBlockPreconditioner<C,T> >
│ │ │ │ -
348 {
│ │ │ │ - │ │ │ │ -
350 typedef ConstructionTraits<T> SeqConstructionTraits;
│ │ │ │ -
│ │ │ │ -
351 static inline std::shared_ptr<NonoverlappingBlockPreconditioner<C,T>> construct(Arguments& args)
│ │ │ │ -
352 {
│ │ │ │ -
353 auto seqPrec = SeqConstructionTraits::construct(args);
│ │ │ │ -
354 return std::make_shared<NonoverlappingBlockPreconditioner<C,T>> (seqPrec, args.getComm());
│ │ │ │ -
355 }
│ │ │ │ -
│ │ │ │ -
356 };
│ │ │ │ +
298 namespace Amg
│ │ │ │ +
299 {
│ │ │ │ +
│ │ │ │ +
300 inline std::ostream& operator<<(std::ostream& os, const EdgeProperties& props)
│ │ │ │ +
301 {
│ │ │ │ +
302 return os << props.flags_;
│ │ │ │ +
303 }
│ │ │ │ +
│ │ │ │ +
304
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
306 : flags_()
│ │ │ │ +
307 {}
│ │ │ │ +
│ │ │ │ +
308
│ │ │ │ +
309 inline std::bitset<EdgeProperties::SIZE>::reference
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
311 {
│ │ │ │ +
312 return flags_[v];
│ │ │ │ +
313 }
│ │ │ │ +
│ │ │ │ +
314
│ │ │ │ +
│ │ │ │ +
315 inline bool EdgeProperties::operator[](std::size_t i) const
│ │ │ │ +
316 {
│ │ │ │ +
317 return flags_[i];
│ │ │ │ +
318 }
│ │ │ │ +
│ │ │ │ +
319
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
321 {
│ │ │ │ +
322 flags_.reset();
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
326 {
│ │ │ │ +
327 // Set the INFLUENCE bit
│ │ │ │ +
328 //flags_ |= (1<<INFLUENCE);
│ │ │ │ +
329 flags_.set(INFLUENCE);
│ │ │ │ +
330 }
│ │ │ │ +
│ │ │ │ +
331
│ │ │ │ +
│ │ │ │ +
332 inline bool EdgeProperties::influences() const
│ │ │ │ +
333 {
│ │ │ │ +
334 // Test the INFLUENCE bit
│ │ │ │ +
335 return flags_.test(INFLUENCE);
│ │ │ │ +
336 }
│ │ │ │ +
│ │ │ │ +
337
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
339 {
│ │ │ │ +
340 // Set the first bit.
│ │ │ │ +
341 //flags_ |= (1<<DEPEND);
│ │ │ │ +
342 flags_.set(DEPEND);
│ │ │ │ +
343 }
│ │ │ │ +
│ │ │ │ +
344
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
346 {
│ │ │ │ +
347 // reset the first bit.
│ │ │ │ +
348 //flags_ &= ~(1<<DEPEND);
│ │ │ │ +
349 flags_.reset(DEPEND);
│ │ │ │ +
350 }
│ │ │ │ +
│ │ │ │ +
351
│ │ │ │ +
│ │ │ │ +
352 inline bool EdgeProperties::depends() const
│ │ │ │ +
353 {
│ │ │ │ +
354 // Return the first bit.
│ │ │ │ +
355 return flags_.test(DEPEND);
│ │ │ │ +
356 }
│ │ │ │
│ │ │ │
357
│ │ │ │ -
368 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
370 {
│ │ │ │ -
371 typedef T Smoother;
│ │ │ │ -
372 typedef typename Smoother::range_type Range;
│ │ │ │ -
373 typedef typename Smoother::domain_type Domain;
│ │ │ │ -
374
│ │ │ │ -
│ │ │ │ -
382 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ -
383 {
│ │ │ │ -
384 smoother.apply(v,d);
│ │ │ │ -
385 }
│ │ │ │ -
│ │ │ │ -
386
│ │ │ │ -
│ │ │ │ -
394 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ -
395 {
│ │ │ │ -
396 smoother.apply(v,d);
│ │ │ │ -
397 }
│ │ │ │ -
│ │ │ │ -
398 };
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
359 {
│ │ │ │ +
360 // reset the second bit.
│ │ │ │ +
361 flags_ &= ~(1<<INFLUENCE);
│ │ │ │ +
362 }
│ │ │ │ +
│ │ │ │ +
363
│ │ │ │ +
│ │ │ │ +
364 inline bool EdgeProperties::isOneWay() const
│ │ │ │ +
365 {
│ │ │ │ +
366 // Test whether only the first bit is set
│ │ │ │ +
367 //return isStrong() && !isTwoWay();
│ │ │ │ +
368 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==(1<<DEPEND);
│ │ │ │ +
369 }
│ │ │ │ +
│ │ │ │ +
370
│ │ │ │ +
│ │ │ │ +
371 inline bool EdgeProperties::isTwoWay() const
│ │ │ │ +
372 {
│ │ │ │ +
373 // Test whether the first and second bit is set
│ │ │ │ +
374 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==((1<<INFLUENCE)|(1<<DEPEND));
│ │ │ │ +
375 }
│ │ │ │ +
│ │ │ │ +
376
│ │ │ │ +
│ │ │ │ +
377 inline bool EdgeProperties::isStrong() const
│ │ │ │ +
378 {
│ │ │ │ +
379 // Test whether the first or second bit is set
│ │ │ │ +
380 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND))).to_ulong();
│ │ │ │ +
381 }
│ │ │ │ +
│ │ │ │ +
382
│ │ │ │ +
383
│ │ │ │ +
│ │ │ │ +
384 inline std::ostream& operator<<(std::ostream& os, const VertexProperties& props)
│ │ │ │ +
385 {
│ │ │ │ +
386 return os << props.flags_;
│ │ │ │ +
387 }
│ │ │ │ +
│ │ │ │ +
388
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
390 : flags_()
│ │ │ │ +
391 {}
│ │ │ │ +
│ │ │ │ +
392
│ │ │ │ +
393
│ │ │ │ +
394 inline std::bitset<VertexProperties::SIZE>::reference
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
396 {
│ │ │ │ +
397 return flags_[v];
│ │ │ │ +
398 }
│ │ │ │
│ │ │ │
399
│ │ │ │ -
405 template<typename LevelContext>
│ │ │ │ -
│ │ │ │ -
406 void presmooth(LevelContext& levelContext, size_t steps)
│ │ │ │ -
407 {
│ │ │ │ -
408 for(std::size_t i=0; i < steps; ++i) {
│ │ │ │ -
409 *levelContext.lhs=0;
│ │ │ │ - │ │ │ │ -
411 ::preSmooth(*levelContext.smoother, *levelContext.lhs,
│ │ │ │ -
412 *levelContext.rhs);
│ │ │ │ -
413 // Accumulate update
│ │ │ │ -
414 *levelContext.update += *levelContext.lhs;
│ │ │ │ -
415
│ │ │ │ -
416 // update defect
│ │ │ │ -
417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, *levelContext.rhs);
│ │ │ │ -
418 levelContext.pinfo->project(*levelContext.rhs);
│ │ │ │ -
419 }
│ │ │ │ -
420 }
│ │ │ │ -
│ │ │ │ -
421
│ │ │ │ -
427 template<typename LevelContext>
│ │ │ │ -
│ │ │ │ -
428 void postsmooth(LevelContext& levelContext, size_t steps)
│ │ │ │ -
429 {
│ │ │ │ -
430 for(std::size_t i=0; i < steps; ++i) {
│ │ │ │ -
431 // update defect
│ │ │ │ -
432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,
│ │ │ │ -
433 *levelContext.rhs);
│ │ │ │ -
434 *levelContext.lhs=0;
│ │ │ │ -
435 levelContext.pinfo->project(*levelContext.rhs);
│ │ │ │ - │ │ │ │ -
437 ::postSmooth(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs);
│ │ │ │ -
438 // Accumulate update
│ │ │ │ -
439 *levelContext.update += *levelContext.lhs;
│ │ │ │ -
440 }
│ │ │ │ -
441 }
│ │ │ │ -
│ │ │ │ -
442
│ │ │ │ -
443 template<class M, class X, class Y, int l>
│ │ │ │ -
│ │ │ │ -
444 struct SmootherApplier<SeqSOR<M,X,Y,l> >
│ │ │ │ -
445 {
│ │ │ │ - │ │ │ │ -
447 typedef typename Smoother::range_type Range;
│ │ │ │ - │ │ │ │ +
│ │ │ │ +
400 inline bool VertexProperties::operator[](std::size_t v) const
│ │ │ │ +
401 {
│ │ │ │ +
402 return flags_[v];
│ │ │ │ +
403 }
│ │ │ │ +
│ │ │ │ +
404
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
406 {
│ │ │ │ +
407 flags_.set(ISOLATED);
│ │ │ │ +
408 }
│ │ │ │ +
│ │ │ │ +
409
│ │ │ │ +
│ │ │ │ +
410 inline bool VertexProperties::isolated() const
│ │ │ │ +
411 {
│ │ │ │ +
412 return flags_.test(ISOLATED);
│ │ │ │ +
413 }
│ │ │ │ +
│ │ │ │ +
414
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
416 {
│ │ │ │ +
417 flags_.reset(ISOLATED);
│ │ │ │ +
418 }
│ │ │ │ +
│ │ │ │ +
419
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
421 {
│ │ │ │ +
422 flags_.set(VISITED);
│ │ │ │ +
423 }
│ │ │ │ +
│ │ │ │ +
424
│ │ │ │ +
│ │ │ │ +
425 inline bool VertexProperties::visited() const
│ │ │ │ +
426 {
│ │ │ │ +
427 return flags_.test(VISITED);
│ │ │ │ +
428 }
│ │ │ │ +
│ │ │ │ +
429
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
431 {
│ │ │ │ +
432 flags_.reset(VISITED);
│ │ │ │ +
433 }
│ │ │ │ +
│ │ │ │ +
434
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
436 {
│ │ │ │ +
437 flags_.set(FRONT);
│ │ │ │ +
438 }
│ │ │ │ +
│ │ │ │ +
439
│ │ │ │ +
│ │ │ │ +
440 inline bool VertexProperties::front() const
│ │ │ │ +
441 {
│ │ │ │ +
442 return flags_.test(FRONT);
│ │ │ │ +
443 }
│ │ │ │ +
│ │ │ │ +
444
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
446 {
│ │ │ │ +
447 flags_.reset(FRONT);
│ │ │ │ +
448 }
│ │ │ │ +
│ │ │ │
449
│ │ │ │
│ │ │ │ -
450 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ -
451 {
│ │ │ │ -
452 smoother.template apply<true>(v,d);
│ │ │ │ -
453 }
│ │ │ │ + │ │ │ │ +
451 {
│ │ │ │ +
452 flags_.set(BORDER);
│ │ │ │ +
453 }
│ │ │ │
│ │ │ │
454
│ │ │ │ -
455
│ │ │ │ -
│ │ │ │ -
456 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ -
457 {
│ │ │ │ -
458 smoother.template apply<false>(v,d);
│ │ │ │ -
459 }
│ │ │ │ -
│ │ │ │ -
460 };
│ │ │ │ -
│ │ │ │ -
461
│ │ │ │ -
462 template<class M, class X, class Y, class C, int l>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
464 {
│ │ │ │ - │ │ │ │ -
466 typedef typename Smoother::range_type Range;
│ │ │ │ - │ │ │ │ -
468
│ │ │ │ -
│ │ │ │ -
469 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ -
470 {
│ │ │ │ -
471 smoother.template apply<true>(v,d);
│ │ │ │ -
472 }
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
474
│ │ │ │ -
│ │ │ │ -
475 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ -
476 {
│ │ │ │ -
477 smoother.template apply<false>(v,d);
│ │ │ │ -
478 }
│ │ │ │ -
│ │ │ │ -
479 };
│ │ │ │ -
│ │ │ │ -
480
│ │ │ │ -
481 template<class M, class X, class Y, class C, int l>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
483 {
│ │ │ │ - │ │ │ │ -
485 typedef typename Smoother::range_type Range;
│ │ │ │ - │ │ │ │ -
487
│ │ │ │ -
│ │ │ │ -
488 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ -
489 {
│ │ │ │ -
490 smoother.template apply<true>(v,d);
│ │ │ │ -
491 }
│ │ │ │ -
│ │ │ │ -
492
│ │ │ │ -
493
│ │ │ │ -
│ │ │ │ -
494 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
│ │ │ │ -
495 {
│ │ │ │ -
496 smoother.template apply<false>(v,d);
│ │ │ │ -
497 }
│ │ │ │ -
│ │ │ │ -
498 };
│ │ │ │ -
│ │ │ │ -
499
│ │ │ │ -
500 } // end namespace Amg
│ │ │ │ -
501
│ │ │ │ -
502 // forward declarations
│ │ │ │ -
503 template<class M, class X, class MO, class MS, class A>
│ │ │ │ -
504 class SeqOverlappingSchwarz;
│ │ │ │ -
505
│ │ │ │ -
506 struct MultiplicativeSchwarzMode;
│ │ │ │ -
507
│ │ │ │ -
508 namespace Amg
│ │ │ │ -
509 {
│ │ │ │ -
510 template<class M, class X, class MS, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
512 MS,TA> >
│ │ │ │ -
513 {
│ │ │ │ - │ │ │ │ -
515 typedef typename Smoother::range_type Range;
│ │ │ │ - │ │ │ │ -
517
│ │ │ │ -
│ │ │ │ -
518 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ -
519 {
│ │ │ │ -
520 smoother.template apply<true>(v,d);
│ │ │ │ -
521 }
│ │ │ │ -
│ │ │ │ -
522
│ │ │ │ -
523
│ │ │ │ -
│ │ │ │ -
524 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
│ │ │ │ -
525 {
│ │ │ │ -
526 smoother.template apply<false>(v,d);
│ │ │ │ -
527
│ │ │ │ -
528 }
│ │ │ │ -
│ │ │ │ -
529 };
│ │ │ │ -
│ │ │ │ -
530
│ │ │ │ -
531 // template<class M, class X, class TM, class TA>
│ │ │ │ -
532 // class SeqOverlappingSchwarz;
│ │ │ │ -
533
│ │ │ │ -
534 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
536 : public DefaultSmootherArgs<T>
│ │ │ │ -
537 {
│ │ │ │ - │ │ │ │ -
539
│ │ │ │ - │ │ │ │ - │ │ │ │ -
542
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
544 bool onthefly_=false)
│ │ │ │ -
545 : overlap(overlap_), onthefly(onthefly_)
│ │ │ │ -
546 {}
│ │ │ │ -
│ │ │ │ -
547 };
│ │ │ │ -
│ │ │ │ -
548
│ │ │ │ -
549 template<class M, class X, class TM, class TS, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
551 {
│ │ │ │ - │ │ │ │ -
553 };
│ │ │ │ -
│ │ │ │ -
554
│ │ │ │ -
555 template<class M, class X, class TM, class TS, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
557 : public DefaultConstructionArgs<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
│ │ │ │ -
558 {
│ │ │ │ - │ │ │ │ -
560
│ │ │ │ -
561 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
566 typedef typename Vector::value_type Subdomain;
│ │ │ │ -
567
│ │ │ │ -
│ │ │ │ -
568 virtual void setMatrix(const M& matrix, const AggregatesMap& amap)
│ │ │ │ -
569 {
│ │ │ │ -
570 Father::setMatrix(matrix);
│ │ │ │ -
571
│ │ │ │ -
572 std::vector<bool> visited(amap.noVertices(), false);
│ │ │ │ -
573 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
│ │ │ │ -
574 VisitedMapType visitedMap(visited.begin());
│ │ │ │ -
575
│ │ │ │ -
576 MatrixGraph<const M> graph(matrix);
│ │ │ │ -
577
│ │ │ │ - │ │ │ │ -
579
│ │ │ │ -
580 switch(Father::getArgs().overlap) {
│ │ │ │ -
581 case SmootherArgs::vertex :
│ │ │ │ -
582 {
│ │ │ │ -
583 VertexAdder visitor(subdomains, amap);
│ │ │ │ -
584 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ -
585 }
│ │ │ │ -
586 break;
│ │ │ │ -
587 case SmootherArgs::pairwise :
│ │ │ │ -
588 {
│ │ │ │ -
589 createPairDomains(graph);
│ │ │ │ -
590 }
│ │ │ │ -
591 break;
│ │ │ │ -
592 case SmootherArgs::aggregate :
│ │ │ │ -
593 {
│ │ │ │ -
594 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
│ │ │ │ -
595 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ -
596 }
│ │ │ │ -
597 break;
│ │ │ │ -
598 case SmootherArgs::none :
│ │ │ │ -
599 NoneAdder visitor;
│ │ │ │ -
600 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ -
601 break;
│ │ │ │ -
602 default :
│ │ │ │ -
603 DUNE_THROW(NotImplemented, "This overlapping scheme is not supported!");
│ │ │ │ -
604 }
│ │ │ │ -
605 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
606 void setMatrix(const M& matrix)
│ │ │ │ -
607 {
│ │ │ │ -
608 Father::setMatrix(matrix);
│ │ │ │ -
609
│ │ │ │ -
610 /* Create aggregates map where each aggregate is just one vertex. */
│ │ │ │ -
611 AggregatesMap amap(matrix.N());
│ │ │ │ - │ │ │ │ -
613 for(typename AggregatesMap::iterator iter=amap.begin();
│ │ │ │ -
614 iter!=amap.end(); ++iter)
│ │ │ │ -
615 *iter=v++;
│ │ │ │ -
616
│ │ │ │ -
617 std::vector<bool> visited(amap.noVertices(), false);
│ │ │ │ -
618 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
│ │ │ │ -
619 VisitedMapType visitedMap(visited.begin());
│ │ │ │ -
620
│ │ │ │ -
621 MatrixGraph<const M> graph(matrix);
│ │ │ │ -
622
│ │ │ │ - │ │ │ │ -
624
│ │ │ │ -
625 switch(Father::getArgs().overlap) {
│ │ │ │ -
626 case SmootherArgs::vertex :
│ │ │ │ -
627 {
│ │ │ │ -
628 VertexAdder visitor(subdomains, amap);
│ │ │ │ -
629 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ -
630 }
│ │ │ │ -
631 break;
│ │ │ │ -
632 case SmootherArgs::aggregate :
│ │ │ │ -
633 {
│ │ │ │ -
634 DUNE_THROW(NotImplemented, "Aggregate overlap is not supported yet");
│ │ │ │ -
635 /*
│ │ │ │ -
636 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
│ │ │ │ -
637 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ -
638 */
│ │ │ │ -
639 }
│ │ │ │ -
640 break;
│ │ │ │ -
641 case SmootherArgs::pairwise :
│ │ │ │ -
642 {
│ │ │ │ -
643 createPairDomains(graph);
│ │ │ │ -
644 }
│ │ │ │ -
645 break;
│ │ │ │ -
646 case SmootherArgs::none :
│ │ │ │ -
647 NoneAdder visitor;
│ │ │ │ -
648 createSubdomains(matrix, graph, amap, visitor, visitedMap);
│ │ │ │ -
649
│ │ │ │ -
650 }
│ │ │ │ -
651 }
│ │ │ │ -
│ │ │ │ -
652
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
654 {
│ │ │ │ -
655 return subdomains;
│ │ │ │ -
656 }
│ │ │ │ -
│ │ │ │ -
657
│ │ │ │ -
658 private:
│ │ │ │ -
659 struct VertexAdder
│ │ │ │ -
660 {
│ │ │ │ -
│ │ │ │ -
661 VertexAdder(Vector& subdomains_, const AggregatesMap& aggregates_)
│ │ │ │ -
662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_)
│ │ │ │ -
663 {}
│ │ │ │ -
│ │ │ │ -
664 template<class T>
│ │ │ │ -
│ │ │ │ -
665 void operator()(const T& edge)
│ │ │ │ -
666 {
│ │ │ │ -
667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED)
│ │ │ │ -
668 subdomains[subdomain].insert(edge.target());
│ │ │ │ -
669 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
670 int setAggregate(const AggregateDescriptor& aggregate_)
│ │ │ │ -
671 {
│ │ │ │ -
672 subdomain=aggregate_;
│ │ │ │ -
673 max = std::max(subdomain, aggregate_);
│ │ │ │ -
674 return subdomain;
│ │ │ │ -
675 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
676 int noSubdomains() const
│ │ │ │ -
677 {
│ │ │ │ -
678 return max+1;
│ │ │ │ -
679 }
│ │ │ │ -
│ │ │ │ -
680 private:
│ │ │ │ -
681 Vector& subdomains;
│ │ │ │ - │ │ │ │ -
683 AggregateDescriptor subdomain;
│ │ │ │ -
684 const AggregatesMap& aggregates;
│ │ │ │ -
685 };
│ │ │ │ -
686 struct NoneAdder
│ │ │ │ -
687 {
│ │ │ │ -
688 template<class T>
│ │ │ │ -
│ │ │ │ -
689 void operator()(const T& edge)
│ │ │ │ -
690 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
691 int setAggregate(const AggregateDescriptor& aggregate_)
│ │ │ │ -
692 {
│ │ │ │ -
693 return -1;
│ │ │ │ -
694 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
695 int noSubdomains() const
│ │ │ │ -
696 {
│ │ │ │ -
697 return -1;
│ │ │ │ -
698 }
│ │ │ │ -
│ │ │ │ -
699 };
│ │ │ │ -
700
│ │ │ │ -
701 template<class VM>
│ │ │ │ -
702 struct AggregateAdder
│ │ │ │ -
703 {
│ │ │ │ -
│ │ │ │ -
704 AggregateAdder(Vector& subdomains_, const AggregatesMap& aggregates_,
│ │ │ │ -
705 const MatrixGraph<const M>& graph_, VM& visitedMap_)
│ │ │ │ -
706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_),
│ │ │ │ -
707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_)
│ │ │ │ -
708 {}
│ │ │ │ -
│ │ │ │ -
709 template<class T>
│ │ │ │ -
│ │ │ │ -
710 void operator()(const T& edge)
│ │ │ │ -
711 {
│ │ │ │ -
712 subdomains[subdomain].insert(edge.target());
│ │ │ │ -
713 // If we (the neighbouring vertex of the aggregate)
│ │ │ │ -
714 // are not isolated, add the aggregate we belong to
│ │ │ │ -
715 // to the same subdomain using the OneOverlapAdder
│ │ │ │ -
716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) {
│ │ │ │ -
717 assert(aggregates[edge.target()]!=aggregate);
│ │ │ │ -
718 typename AggregatesMap::VertexList vlist;
│ │ │ │ -
719 aggregates.template breadthFirstSearch<true,false>(edge.target(), aggregate,
│ │ │ │ -
720 graph, vlist, adder, adder,
│ │ │ │ -
721 visitedMap);
│ │ │ │ -
722 }
│ │ │ │ -
723 }
│ │ │ │ -
│ │ │ │ -
724
│ │ │ │ -
│ │ │ │ -
725 int setAggregate(const AggregateDescriptor& aggregate_)
│ │ │ │ -
726 {
│ │ │ │ -
727 adder.setAggregate(aggregate_);
│ │ │ │ -
728 aggregate=aggregate_;
│ │ │ │ -
729 return ++subdomain;
│ │ │ │ -
730 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
731 int noSubdomains() const
│ │ │ │ -
732 {
│ │ │ │ -
733 return subdomain+1;
│ │ │ │ -
734 }
│ │ │ │ -
│ │ │ │ -
735
│ │ │ │ -
736 private:
│ │ │ │ -
737 AggregateDescriptor aggregate;
│ │ │ │ -
738 Vector& subdomains;
│ │ │ │ -
739 int subdomain;
│ │ │ │ -
740 const AggregatesMap& aggregates;
│ │ │ │ -
741 VertexAdder adder;
│ │ │ │ -
742 const MatrixGraph<const M>& graph;
│ │ │ │ -
743 VM& visitedMap;
│ │ │ │ -
744 };
│ │ │ │ -
745
│ │ │ │ -
746 void createPairDomains(const MatrixGraph<const M>& graph)
│ │ │ │ -
747 {
│ │ │ │ -
748 typedef typename MatrixGraph<const M>::ConstVertexIterator VIter;
│ │ │ │ -
749 typedef typename MatrixGraph<const M>::ConstEdgeIterator EIter;
│ │ │ │ -
750 typedef typename M::size_type size_type;
│ │ │ │ -
751
│ │ │ │ -
752 std::set<std::pair<size_type,size_type> > pairs;
│ │ │ │ -
753 int total=0;
│ │ │ │ -
754 for(VIter v=graph.begin(), ve=graph.end(); ve != v; ++v)
│ │ │ │ -
755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e)
│ │ │ │ -
756 {
│ │ │ │ -
757 ++total;
│ │ │ │ -
758 if(e.source()<e.target())
│ │ │ │ -
759 pairs.insert(std::make_pair(e.source(),e.target()));
│ │ │ │ -
760 else
│ │ │ │ -
761 pairs.insert(std::make_pair(e.target(),e.source()));
│ │ │ │ -
762 }
│ │ │ │ -
763
│ │ │ │ -
764
│ │ │ │ -
765 subdomains.resize(pairs.size());
│ │ │ │ -
766 Dune::dinfo <<std::endl<< "Created "<<pairs.size()<<" ("<<total<<") pair domains"<<std::endl<<std::endl;
│ │ │ │ -
767 typedef typename std::set<std::pair<size_type,size_type> >::const_iterator SIter;
│ │ │ │ -
768 typename Vector::iterator subdomain=subdomains.begin();
│ │ │ │ -
769
│ │ │ │ -
770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s)
│ │ │ │ -
771 {
│ │ │ │ -
772 subdomain->insert(s->first);
│ │ │ │ -
773 subdomain->insert(s->second);
│ │ │ │ -
774 ++subdomain;
│ │ │ │ -
775 }
│ │ │ │ -
776 std::size_t minsize=10000;
│ │ │ │ -
777 std::size_t maxsize=0;
│ │ │ │ -
778 int sum=0;
│ │ │ │ -
779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
│ │ │ │ -
780 sum+=subdomains[i].size();
│ │ │ │ -
781 minsize=std::min(minsize, subdomains[i].size());
│ │ │ │ -
782 maxsize=std::max(maxsize, subdomains[i].size());
│ │ │ │ -
783 }
│ │ │ │ -
784 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
│ │ │ │ -
785 <<" no="<<subdomains.size()<<std::endl;
│ │ │ │ -
786 }
│ │ │ │ -
787
│ │ │ │ -
788 template<class Visitor>
│ │ │ │ -
789 void createSubdomains(const M& matrix, const MatrixGraph<const M>& graph,
│ │ │ │ -
790 const AggregatesMap& amap, Visitor& overlapVisitor,
│ │ │ │ -
791 IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap>& visitedMap )
│ │ │ │ -
792 {
│ │ │ │ -
793 // count number ag aggregates. We assume that the
│ │ │ │ -
794 // aggregates are numbered consecutively from 0 except
│ │ │ │ -
795 // for the isolated ones. All isolated vertices form
│ │ │ │ -
796 // one aggregate, here.
│ │ │ │ -
797 int isolated=0;
│ │ │ │ -
798 AggregateDescriptor maxAggregate=0;
│ │ │ │ -
799
│ │ │ │ -
800 for(std::size_t i=0; i < amap.noVertices(); ++i)
│ │ │ │ -
801 if(amap[i]==AggregatesMap::ISOLATED)
│ │ │ │ -
802 isolated++;
│ │ │ │ -
803 else
│ │ │ │ -
804 maxAggregate = std::max(maxAggregate, amap[i]);
│ │ │ │ -
805
│ │ │ │ -
806 subdomains.resize(maxAggregate+1+isolated);
│ │ │ │ -
807
│ │ │ │ -
808 // reset the subdomains
│ │ │ │ -
809 for(typename Vector::size_type i=0; i < subdomains.size(); ++i)
│ │ │ │ -
810 subdomains[i].clear();
│ │ │ │ -
811
│ │ │ │ -
812 // Create the subdomains from the aggregates mapping.
│ │ │ │ -
813 // For each aggregate we mark all entries and the
│ │ │ │ -
814 // neighbouring vertices as belonging to the same subdomain
│ │ │ │ -
815 VertexAdder aggregateVisitor(subdomains, amap);
│ │ │ │ -
816
│ │ │ │ -
817 for(VertexDescriptor i=0; i < amap.noVertices(); ++i)
│ │ │ │ -
818 if(!get(visitedMap, i)) {
│ │ │ │ -
819 AggregateDescriptor aggregate=amap[i];
│ │ │ │ -
820
│ │ │ │ -
821 if(amap[i]==AggregatesMap::ISOLATED) {
│ │ │ │ -
822 // isolated vertex gets its own aggregate
│ │ │ │ -
823 subdomains.push_back(Subdomain());
│ │ │ │ -
824 aggregate=subdomains.size()-1;
│ │ │ │ -
825 }
│ │ │ │ -
826 overlapVisitor.setAggregate(aggregate);
│ │ │ │ -
827 aggregateVisitor.setAggregate(aggregate);
│ │ │ │ -
828 subdomains[aggregate].insert(i);
│ │ │ │ -
829 typename AggregatesMap::VertexList vlist;
│ │ │ │ -
830 amap.template breadthFirstSearch<false,false>(i, aggregate, graph, vlist, aggregateVisitor,
│ │ │ │ -
831 overlapVisitor, visitedMap);
│ │ │ │ -
832 }
│ │ │ │ -
833
│ │ │ │ -
834 std::size_t minsize=10000;
│ │ │ │ -
835 std::size_t maxsize=0;
│ │ │ │ -
836 int sum=0;
│ │ │ │ -
837 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
│ │ │ │ -
838 sum+=subdomains[i].size();
│ │ │ │ -
839 minsize=std::min(minsize, subdomains[i].size());
│ │ │ │ -
840 maxsize=std::max(maxsize, subdomains[i].size());
│ │ │ │ -
841 }
│ │ │ │ -
842 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
│ │ │ │ -
843 <<" no="<<subdomains.size()<<" isolated="<<isolated<<std::endl;
│ │ │ │ -
844
│ │ │ │ -
845
│ │ │ │ -
846
│ │ │ │ -
847 }
│ │ │ │ -
848 Vector subdomains;
│ │ │ │ -
849 };
│ │ │ │ -
│ │ │ │ -
850
│ │ │ │ -
851
│ │ │ │ -
852 template<class M, class X, class TM, class TS, class TA>
│ │ │ │ -
│ │ │ │ -
853 struct ConstructionTraits<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
│ │ │ │ -
854 {
│ │ │ │ - │ │ │ │ -
856
│ │ │ │ -
│ │ │ │ -
857 static inline std::shared_ptr<SeqOverlappingSchwarz<M,X,TM,TS,TA>> construct(Arguments& args)
│ │ │ │ -
858 {
│ │ │ │ -
859 return std::make_shared<SeqOverlappingSchwarz<M,X,TM,TS,TA>>
│ │ │ │ -
860 (args.getMatrix(),
│ │ │ │ -
861 args.getSubDomains(),
│ │ │ │ - │ │ │ │ -
863 args.getArgs().onthefly);
│ │ │ │ -
864 }
│ │ │ │ -
│ │ │ │ -
865 };
│ │ │ │ -
│ │ │ │ -
866
│ │ │ │ -
867
│ │ │ │ -
868 } // namespace Amg
│ │ │ │ -
869} // namespace Dune
│ │ │ │ -
870
│ │ │ │ -
871
│ │ │ │ -
872
│ │ │ │ -
873#endif
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
Helper classes for the construction of classes without empty constructor.
│ │ │ │ -
Provides classes for the Coloring process of AMG.
│ │ │ │ -
DefaultSmootherArgs< typename X::field_type > Arguments
Definition smoother.hh:74
│ │ │ │ -
static void postSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:494
│ │ │ │ - │ │ │ │ -
static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
Definition smoother.hh:518
│ │ │ │ -
static std::shared_ptr< SeqJac< M, X, Y, l > > construct(Arguments &args)
Definition smoother.hh:256
│ │ │ │ -
ConstructionArgs< SeqILU< M, X, Y > > Arguments
Definition smoother.hh:309
│ │ │ │ -
const Matrix & getMatrix() const
Definition smoother.hh:114
│ │ │ │ - │ │ │ │ -
int setAggregate(const AggregateDescriptor &aggregate_)
Definition smoother.hh:691
│ │ │ │ -
DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
Definition smoother.hh:67
│ │ │ │ -
int setAggregate(const AggregateDescriptor &aggregate_)
Definition smoother.hh:670
│ │ │ │ -
ConstructionTraits< T > SeqConstructionTraits
Definition smoother.hh:350
│ │ │ │ -
void setArgs(const SmootherArgs &args)
Definition smoother.hh:119
│ │ │ │ -
ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments
Definition smoother.hh:855
│ │ │ │ -
NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother
Definition smoother.hh:484
│ │ │ │ -
static void postSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:456
│ │ │ │ -
AggregateAdder(Vector &subdomains_, const AggregatesMap &aggregates_, const MatrixGraph< const M > &graph_, VM &visitedMap_)
Definition smoother.hh:704
│ │ │ │ - │ │ │ │ -
void setComm(const C &comm)
Definition smoother.hh:158
│ │ │ │ -
DefaultConstructionArgs< Richardson< X, Y > > Arguments
Definition smoother.hh:269
│ │ │ │ -
virtual ~DefaultConstructionArgs()
Definition smoother.hh:180
│ │ │ │ -
SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments
Definition smoother.hh:552
│ │ │ │ - │ │ │ │ -
static void preSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:488
│ │ │ │ -
int getN()
Definition smoother.hh:293
│ │ │ │ - │ │ │ │ -
SeqSOR< M, X, Y, l > Smoother
Definition smoother.hh:446
│ │ │ │ - │ │ │ │ -
static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct(Arguments &args)
Definition smoother.hh:224
│ │ │ │ -
AggregatesMap::AggregateDescriptor AggregateDescriptor
Definition smoother.hh:564
│ │ │ │ -
bool onthefly
Definition smoother.hh:541
│ │ │ │ -
DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments
Definition smoother.hh:238
│ │ │ │ -
virtual void setMatrix(const M &matrix, const AggregatesMap &amap)
Definition smoother.hh:568
│ │ │ │ -
void setMatrix(const Args &...)
Definition smoother.hh:184
│ │ │ │ -
DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments
Definition smoother.hh:254
│ │ │ │ -
DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments
Definition smoother.hh:222
│ │ │ │ -
const SmootherArgs getArgs() const
Definition smoother.hh:133
│ │ │ │ -
VertexAdder(Vector &subdomains_, const AggregatesMap &aggregates_)
Definition smoother.hh:661
│ │ │ │ - │ │ │ │ -
SeqOverlappingSchwarz< M, X, TM, TS, TA >::subdomain_vector Vector
Definition smoother.hh:565
│ │ │ │ -
static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct(Arguments &args)
Definition smoother.hh:857
│ │ │ │ -
static void preSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:469
│ │ │ │ -
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ -
void setMatrix(const Matrix &matrix)
Definition smoother.hh:104
│ │ │ │ -
T Smoother
Definition smoother.hh:371
│ │ │ │ -
static void preSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:450
│ │ │ │ -
BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother
Definition smoother.hh:465
│ │ │ │ -
void setComm(T1 &comm)
Definition smoother.hh:193
│ │ │ │ - │ │ │ │ -
AggregateDescriptor * iterator
Definition aggregates.hh:735
│ │ │ │ -
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ - │ │ │ │ -
SeqOverlappingSchwarzSmootherArgs(Overlap overlap_=vertex, bool onthefly_=false)
Definition smoother.hh:543
│ │ │ │ -
DefaultParallelConstructionArgs< T, C > Arguments
Definition smoother.hh:337
│ │ │ │ -
DefaultParallelConstructionArgs< T, C > Arguments
Definition smoother.hh:349
│ │ │ │ -
const Matrix * matrix_
Definition smoother.hh:139
│ │ │ │ -
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ -
const SequentialInformation & getComm()
Definition smoother.hh:128
│ │ │ │ -
V AggregateDescriptor
The aggregate descriptor type.
Definition aggregates.hh:580
│ │ │ │ -
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ -
DefaultSmootherArgs()
Default constructor.
Definition smoother.hh:56
│ │ │ │ -
void setMatrix(const M &matrix)
Definition smoother.hh:606
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices.
│ │ │ │ - │ │ │ │ -
static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
apply post smoothing in forward direction
Definition smoother.hh:394
│ │ │ │ -
FieldTraits< T >::real_type RelaxationFactor
The type of the relaxation factor.
Definition smoother.hh:42
│ │ │ │ - │ │ │ │ -
Smoother::domain_type Domain
Definition smoother.hh:373
│ │ │ │ -
void setN(int n)
Definition smoother.hh:288
│ │ │ │ -
static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct(Arguments &args)
Definition smoother.hh:339
│ │ │ │ -
SLList< VertexDescriptor, Allocator > VertexList
The type of a single linked list of vertex descriptors.
Definition aggregates.hh:592
│ │ │ │ -
static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct(Arguments &args)
Definition smoother.hh:351
│ │ │ │ -
SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother
Definition smoother.hh:514
│ │ │ │ -
static std::shared_ptr< ParSSOR< M, X, Y, C > > construct(Arguments &args)
Definition smoother.hh:326
│ │ │ │ -
MatrixGraph< M >::VertexDescriptor VertexDescriptor
Definition smoother.hh:562
│ │ │ │ -
static std::shared_ptr< SeqILU< M, X, Y > > construct(Arguments &args)
Definition smoother.hh:311
│ │ │ │ - │ │ │ │ -
const SequentialInformation & getComm()
Definition smoother.hh:196
│ │ │ │ -
static std::shared_ptr< SeqSOR< M, X, Y, l > > construct(Arguments &args)
Definition smoother.hh:240
│ │ │ │ -
static std::shared_ptr< Richardson< X, Y > > construct(Arguments &args)
Definition smoother.hh:271
│ │ │ │ -
virtual void setMatrix(const Matrix &matrix, const AggregatesMap &amap)
Definition smoother.hh:108
│ │ │ │ - │ │ │ │ -
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ -
Dune::Amg::AggregatesMap< VertexDescriptor > AggregatesMap
Definition smoother.hh:563
│ │ │ │ -
const SmootherArgs getArgs() const
Definition smoother.hh:201
│ │ │ │ -
void setComm(T1 &comm)
Definition smoother.hh:125
│ │ │ │ -
static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
Definition smoother.hh:524
│ │ │ │ -
DefaultParallelConstructionArgs< M, C > Arguments
Definition smoother.hh:324
│ │ │ │ -
RelaxationFactor relaxationFactor
The relaxation factor to use.
Definition smoother.hh:51
│ │ │ │ -
virtual ~DefaultParallelConstructionArgs()
Definition smoother.hh:155
│ │ │ │ -
Smoother::domain_type Domain
Definition smoother.hh:448
│ │ │ │ -
int setAggregate(const AggregateDescriptor &aggregate_)
Definition smoother.hh:725
│ │ │ │ -
Smoother::range_type Range
Definition smoother.hh:447
│ │ │ │ -
const C & getComm() const
Definition smoother.hh:163
│ │ │ │ -
virtual ~DefaultConstructionArgs()
Definition smoother.hh:101
│ │ │ │ -
static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
apply pre smoothing in forward direction
Definition smoother.hh:382
│ │ │ │ -
static void postSmooth(Smoother &smoother, Domain &v, Range &d)
Definition smoother.hh:475
│ │ │ │ -
ConstructionTraits< T > SeqConstructionTraits
Definition smoother.hh:338
│ │ │ │ -
ConstructionArgs(int n=0)
Definition smoother.hh:284
│ │ │ │ - │ │ │ │ -
void setArgs(const SmootherArgs &args)
Definition smoother.hh:187
│ │ │ │ -
int iterations
The numbe of iterations to perform.
Definition smoother.hh:47
│ │ │ │ -
Smoother::range_type Range
Definition smoother.hh:372
│ │ │ │ -
Overlap overlap
Definition smoother.hh:540
│ │ │ │ - │ │ │ │ -
@ aggregate
Definition smoother.hh:538
│ │ │ │ - │ │ │ │ -
@ pairwise
Definition smoother.hh:538
│ │ │ │ - │ │ │ │ +
│ │ │ │ + │ │ │ │ +
456 {
│ │ │ │ +
457 return flags_.test(BORDER);
│ │ │ │ +
458 }
│ │ │ │ +
│ │ │ │ +
459
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
461 {
│ │ │ │ +
462 flags_.reset(BORDER);
│ │ │ │ +
463 }
│ │ │ │ +
│ │ │ │ +
464
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
466 {
│ │ │ │ +
467 flags_.reset();
│ │ │ │ +
468 }
│ │ │ │ +
│ │ │ │ +
469
│ │ │ │ +
471 }
│ │ │ │ +
472}
│ │ │ │ +
473#endif
│ │ │ │ +
Provides classes for handling internal properties in a graph.
│ │ │ │ +
Provides classes for building the matrix graph.
│ │ │ │ +
bool depends() const
Checks wether the vertex the edge points to depends on the vertex the edge starts.
Definition dependency.hh:352
│ │ │ │ +
void resetFront()
Resets the front node flag.
Definition dependency.hh:445
│ │ │ │ +
std::bitset< VertexProperties::SIZE > BitSet
The type of the bitset.
Definition dependency.hh:238
│ │ │ │ +
bool isolated() const
Checks wether the node is isolated.
Definition dependency.hh:410
│ │ │ │ +
bool ValueType
The value type.
Definition dependency.hh:248
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &os, const VertexProperties &props)
Definition dependency.hh:384
│ │ │ │ +
BitSet::reference Reference
The reference type.
Definition dependency.hh:243
│ │ │ │ +
bool isTwoWay() const
Checks wether the edge is two way. I.e. both the influence flag and the depends flag are that.
Definition dependency.hh:371
│ │ │ │ +
void setInfluences()
Marks the edge as one of which the start vertex by the end vertex.
Definition dependency.hh:325
│ │ │ │ +
VertexProperties()
Constructor.
Definition dependency.hh:389
│ │ │ │ +
void setDepends()
Marks the edge as one of which the end point depends on the starting point.
Definition dependency.hh:338
│ │ │ │ +
PropertyGraphVertexPropertyMap()
Default constructor.
Definition dependency.hh:266
│ │ │ │ +
PropertyGraphVertexPropertyMap(G &g)
Constructor.
Definition dependency.hh:259
│ │ │ │ +
G::VertexDescriptor Vertex
The vertex descriptor.
Definition dependency.hh:253
│ │ │ │ +
void resetExcludedBorder()
Marks the vertex as included in the aggregation.
Definition dependency.hh:460
│ │ │ │ +
void setFront()
Marks the node as belonging to the current clusters front.
Definition dependency.hh:435
│ │ │ │ +
void reset()
Reset all flags.
Definition dependency.hh:465
│ │ │ │ +
void setVisited()
Mark the node as already visited.
Definition dependency.hh:420
│ │ │ │ +
EdgeProperties()
Constructor.
Definition dependency.hh:305
│ │ │ │ +
void resetInfluences()
Resets the influence flag.
Definition dependency.hh:358
│ │ │ │ +
G Graph
The type of the graph with internal properties.
Definition dependency.hh:233
│ │ │ │ +
std::bitset< SIZE >::reference operator[](std::size_t v)
Access the bits directly.
Definition dependency.hh:395
│ │ │ │ +
void printFlags() const
Prints the attributes of the edge for debugging.
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props)
Definition dependency.hh:300
│ │ │ │ +
Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type
Definition dependency.hh:288
│ │ │ │ +
bool influences() const
Checks wether the start vertex is influenced by the end vertex.
Definition dependency.hh:332
│ │ │ │ +
void setIsolated()
Marks that node as being isolated.
Definition dependency.hh:405
│ │ │ │ +
bool excludedBorder() const
Tests whether the vertex is excluded from the aggregation.
Definition dependency.hh:455
│ │ │ │ +
void resetVisited()
Resets the visited flag.
Definition dependency.hh:430
│ │ │ │ +
bool visited() const
Checks wether the node is marked as visited.
Definition dependency.hh:425
│ │ │ │ +
Reference operator[](const Vertex &vertex) const
Get the properties associated to a vertex.
Definition dependency.hh:275
│ │ │ │ +
void reset()
Reset all flags.
Definition dependency.hh:320
│ │ │ │ +
void resetDepends()
Resets the depends flag.
Definition dependency.hh:345
│ │ │ │ +
ReadWritePropertyMapTag Category
Definition dependency.hh:223
│ │ │ │ +
void resetIsolated()
Resets the isolated flag.
Definition dependency.hh:415
│ │ │ │ +
std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
Definition aggregates.hh:113
│ │ │ │ +
bool isStrong() const
Checks wether the edge is strong. I.e. the influence or depends flag is set.
Definition dependency.hh:377
│ │ │ │ +
bool front() const
Checks wether the node is marked as a front node.
Definition dependency.hh:440
│ │ │ │ +
std::bitset< SIZE >::reference operator[](std::size_t v)
Access the bits directly.
Definition dependency.hh:310
│ │ │ │ +
void setExcludedBorder()
Marks the vertex as excluded from the aggregation.
Definition dependency.hh:450
│ │ │ │ +
bool isOneWay() const
Checks wether the edge is one way. I.e. either the influence or the depends flag but is set.
Definition dependency.hh:364
│ │ │ │ +
@ index
the index to access in the bitset.
Definition dependency.hh:227
│ │ │ │ +
@ VISITED
Definition dependency.hh:129
│ │ │ │ +
@ ISOLATED
Definition dependency.hh:129
│ │ │ │ +
@ SIZE
Definition dependency.hh:129
│ │ │ │ +
@ BORDER
Definition dependency.hh:129
│ │ │ │ +
@ FRONT
Definition dependency.hh:129
│ │ │ │ +
@ DEPEND
Definition dependency.hh:43
│ │ │ │ +
@ SIZE
Definition dependency.hh:43
│ │ │ │ +
@ INFLUENCE
Definition dependency.hh:43
│ │ │ │
Definition allocator.hh:11
│ │ │ │
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ -
X range_type
The range type of the preconditioner.
Definition overlappingschwarz.hh:770
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition overlappingschwarz.hh:765
│ │ │ │ -
std::vector< subdomain_type, typename std::allocator_traits< TA >::template rebind_alloc< subdomain_type > > subdomain_vector
The vector type containing the subdomain to row index mapping.
Definition overlappingschwarz.hh:797
│ │ │ │ -
Nonoverlapping parallel preconditioner.
Definition novlpschwarz.hh:276
│ │ │ │ -
P::range_type range_type
The range type of the preconditioner.
Definition novlpschwarz.hh:284
│ │ │ │ -
P::domain_type domain_type
The domain type of the preconditioner.
Definition novlpschwarz.hh:282
│ │ │ │ -
Tag that tells the Schwarz method to be multiplicative.
Definition overlappingschwarz.hh:126
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ -
VertexIterator end()
Get an iterator over the vertices.
│ │ │ │ -
M::size_type VertexDescriptor
The vertex descriptor.
Definition graph.hh:73
│ │ │ │ -
VertexIterator begin()
Get an iterator over the vertices.
│ │ │ │ -
Iterator over all edges starting from a vertex.
Definition graph.hh:95
│ │ │ │ -
The vertex iterator type of the graph.
Definition graph.hh:209
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ -
Traits class for getting the attribute class of a smoother.
Definition smoother.hh:66
│ │ │ │ -
Construction Arguments for the default smoothers.
Definition smoother.hh:93
│ │ │ │ -
Definition smoother.hh:148
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Helper class for applying the smoothers.
Definition smoother.hh:370
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Sequential SSOR preconditioner.
Definition preconditioners.hh:141
│ │ │ │ -
Sequential SOR preconditioner.
Definition preconditioners.hh:261
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:266
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:268
│ │ │ │ -
The sequential jacobian preconditioner.
Definition preconditioners.hh:412
│ │ │ │ -
Sequential ILU preconditioner.
Definition preconditioners.hh:532
│ │ │ │ -
Richardson preconditioner.
Definition preconditioners.hh:713
│ │ │ │ -
A parallel SSOR preconditioner.
Definition schwarz.hh:175
│ │ │ │ -
Block parallel preconditioner.
Definition schwarz.hh:278
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition schwarz.hh:285
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition schwarz.hh:290
│ │ │ │ +
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ +
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ +
Definition dependency.hh:220
│ │ │ │ +
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ +
Tag idnetifying the visited property of a vertex.
Definition properties.hh:29
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1343 +1,575 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -smoother.hh │ │ │ │ │ +dependency.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMGSMOOTHER_HH │ │ │ │ │ -6#define DUNE_AMGSMOOTHER_HH │ │ │ │ │ +5#ifndef DUNE_AMG_DEPENDENCY_HH │ │ │ │ │ +6#define DUNE_AMG_DEPENDENCY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ -9#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ -10#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include "_g_r_a_p_h_._h_h" │ │ │ │ │ +13#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ +14#include │ │ │ │ │ 15 │ │ │ │ │ -16namespace _D_u_n_e │ │ │ │ │ -17{ │ │ │ │ │ -18 namespace Amg │ │ │ │ │ -19 { │ │ │ │ │ -20 │ │ │ │ │ -36 template │ │ │ │ │ -_3_7 struct _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -38 { │ │ │ │ │ -_4_2 typedef typename FieldTraits::real_type _R_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r; │ │ │ │ │ -43 │ │ │ │ │ -_4_7 int _i_t_e_r_a_t_i_o_n_s; │ │ │ │ │ -_5_1 _R_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r _r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r; │ │ │ │ │ -52 │ │ │ │ │ -_5_6 _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s() │ │ │ │ │ -57 : _i_t_e_r_a_t_i_o_n_s(1), _r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r(1.0) │ │ │ │ │ -58 {} │ │ │ │ │ -59 }; │ │ │ │ │ -60 │ │ │ │ │ -64 template │ │ │ │ │ -_6_5 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s │ │ │ │ │ -66 { │ │ │ │ │ -_6_7 typedef _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _T_:_:_m_a_t_r_i_x___t_y_p_e_:_:_f_i_e_l_d___t_y_p_e_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -68 │ │ │ │ │ -69 }; │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +19 namespace Amg │ │ │ │ │ +20 { │ │ │ │ │ +_3_8 class _E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ +39 { │ │ │ │ │ +40 friend std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ +props); │ │ │ │ │ +41 public: │ │ │ │ │ +_4_3 enum {_I_N_F_L_U_E_N_C_E, _D_E_P_E_N_D, _S_I_Z_E}; │ │ │ │ │ +44 │ │ │ │ │ +45 private: │ │ │ │ │ +46 │ │ │ │ │ +47 std::bitset flags_; │ │ │ │ │ +48 public: │ │ │ │ │ +50 _E_d_g_e_P_r_o_p_e_r_t_i_e_s(); │ │ │ │ │ +51 │ │ │ │ │ +53 std::bitset::reference _o_p_e_r_a_t_o_r_[_](std::size_t v); │ │ │ │ │ +54 │ │ │ │ │ +56 bool _o_p_e_r_a_t_o_r_[_](std::size_t v) const; │ │ │ │ │ +57 │ │ │ │ │ +63 bool _d_e_p_e_n_d_s() const; │ │ │ │ │ +64 │ │ │ │ │ +69 void _s_e_t_D_e_p_e_n_d_s(); │ │ │ │ │ 70 │ │ │ │ │ -71 template │ │ │ │ │ -_7_2 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_R_i_c_h_a_r_d_s_o_n> │ │ │ │ │ -73 { │ │ │ │ │ -_7_4 typedef _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _X_:_:_f_i_e_l_d___t_y_p_e_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +74 void _r_e_s_e_t_D_e_p_e_n_d_s(); │ │ │ │ │ 75 │ │ │ │ │ -76 }; │ │ │ │ │ -77 │ │ │ │ │ -78 template │ │ │ │ │ -_7_9 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ -80 : public _S_m_o_o_t_h_e_r_T_r_a_i_t_s │ │ │ │ │ -81 {}; │ │ │ │ │ -82 │ │ │ │ │ -83 template │ │ │ │ │ -_8_4 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ -85 : public _S_m_o_o_t_h_e_r_T_r_a_i_t_s │ │ │ │ │ -86 {}; │ │ │ │ │ -87 │ │ │ │ │ -91 template │ │ │ │ │ -_9_2 class _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ -93 { │ │ │ │ │ -94 typedef typename T::matrix_type Matrix; │ │ │ │ │ -95 │ │ │ │ │ -96 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_T_>_:_:_A_r_g_u_m_e_n_t_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +80 bool _i_n_f_l_u_e_n_c_e_s() const; │ │ │ │ │ +81 │ │ │ │ │ +85 void _s_e_t_I_n_f_l_u_e_n_c_e_s(); │ │ │ │ │ +86 │ │ │ │ │ +90 void _r_e_s_e_t_I_n_f_l_u_e_n_c_e_s(); │ │ │ │ │ +91 │ │ │ │ │ +96 bool _i_s_O_n_e_W_a_y() const; │ │ │ │ │ 97 │ │ │ │ │ -98 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_>_:_: │ │ │ │ │ -_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r> _A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ -99 │ │ │ │ │ -100 public: │ │ │ │ │ -_1_0_1 virtual _~_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s() │ │ │ │ │ -102 {} │ │ │ │ │ +102 bool _i_s_T_w_o_W_a_y() const; │ │ │ │ │ 103 │ │ │ │ │ -_1_0_4 void _s_e_t_M_a_t_r_i_x(const Matrix& matrix) │ │ │ │ │ -105 { │ │ │ │ │ -106 _m_a_t_r_i_x__=&matrix; │ │ │ │ │ -107 } │ │ │ │ │ -_1_0_8 virtual void _s_e_t_M_a_t_r_i_x(const Matrix& matrix, [[maybe_unused]] const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_s_M_a_p& amap) │ │ │ │ │ -109 { │ │ │ │ │ -110 _s_e_t_M_a_t_r_i_x(matrix); │ │ │ │ │ -111 } │ │ │ │ │ -112 │ │ │ │ │ -113 │ │ │ │ │ -_1_1_4 const Matrix& _g_e_t_M_a_t_r_i_x() const │ │ │ │ │ -115 { │ │ │ │ │ -116 return *_m_a_t_r_i_x__; │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -_1_1_9 void _s_e_t_A_r_g_s(const _S_m_o_o_t_h_e_r_A_r_g_s& args) │ │ │ │ │ -120 { │ │ │ │ │ -121 args_=&args; │ │ │ │ │ -122 } │ │ │ │ │ -123 │ │ │ │ │ -124 template │ │ │ │ │ -_1_2_5 void _s_e_t_C_o_m_m([[maybe_unused]] T1& comm) │ │ │ │ │ -126 {} │ │ │ │ │ -127 │ │ │ │ │ -_1_2_8 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& _g_e_t_C_o_m_m() │ │ │ │ │ -129 { │ │ │ │ │ -130 return comm_; │ │ │ │ │ -131 } │ │ │ │ │ -132 │ │ │ │ │ -_1_3_3 const _S_m_o_o_t_h_e_r_A_r_g_s _g_e_t_A_r_g_s() const │ │ │ │ │ -134 { │ │ │ │ │ -135 return *args_; │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -138 protected: │ │ │ │ │ -_1_3_9 const Matrix* _m_a_t_r_i_x__; │ │ │ │ │ -140 private: │ │ │ │ │ -141 const _S_m_o_o_t_h_e_r_A_r_g_s* args_; │ │ │ │ │ -142 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n comm_; │ │ │ │ │ -143 }; │ │ │ │ │ +108 bool _i_s_S_t_r_o_n_g() const; │ │ │ │ │ +109 │ │ │ │ │ +113 void _r_e_s_e_t(); │ │ │ │ │ +114 │ │ │ │ │ +_1_1_8 void _p_r_i_n_t_F_l_a_g_s() const; │ │ │ │ │ +119 }; │ │ │ │ │ +120 │ │ │ │ │ +_1_2_6 class _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s { │ │ │ │ │ +127 friend std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ +props); │ │ │ │ │ +128 public: │ │ │ │ │ +_1_2_9 enum { _I_S_O_L_A_T_E_D, _V_I_S_I_T_E_D, _F_R_O_N_T, _B_O_R_D_E_R, _S_I_Z_E }; │ │ │ │ │ +130 private: │ │ │ │ │ +131 │ │ │ │ │ +133 std::bitset flags_; │ │ │ │ │ +134 │ │ │ │ │ +135 public: │ │ │ │ │ +137 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s(); │ │ │ │ │ +138 │ │ │ │ │ +140 std::bitset::reference _o_p_e_r_a_t_o_r_[_](std::size_t v); │ │ │ │ │ +141 │ │ │ │ │ +143 bool _o_p_e_r_a_t_o_r_[_](std::size_t v) const; │ │ │ │ │ 144 │ │ │ │ │ -145 template │ │ │ │ │ -_1_4_6 struct _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ -147 : public _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ -148 {}; │ │ │ │ │ -149 │ │ │ │ │ -150 template │ │ │ │ │ -_1_5_1 class _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ -152 : public _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s │ │ │ │ │ -153 { │ │ │ │ │ -154 public: │ │ │ │ │ -_1_5_5 virtual _~_D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s() │ │ │ │ │ -156 {} │ │ │ │ │ +151 void _s_e_t_I_s_o_l_a_t_e_d(); │ │ │ │ │ +152 │ │ │ │ │ +156 bool _i_s_o_l_a_t_e_d() const; │ │ │ │ │ 157 │ │ │ │ │ -_1_5_8 void _s_e_t_C_o_m_m(const C& comm) │ │ │ │ │ -159 { │ │ │ │ │ -160 comm_ = &comm; │ │ │ │ │ -161 } │ │ │ │ │ +161 void _r_e_s_e_t_I_s_o_l_a_t_e_d(); │ │ │ │ │ 162 │ │ │ │ │ -_1_6_3 const C& _g_e_t_C_o_m_m() const │ │ │ │ │ -164 { │ │ │ │ │ -165 return *comm_; │ │ │ │ │ -166 } │ │ │ │ │ -167 private: │ │ │ │ │ -168 const C* comm_; │ │ │ │ │ -169 }; │ │ │ │ │ -170 │ │ │ │ │ -171 │ │ │ │ │ -172 template │ │ │ │ │ -_1_7_3 class _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s<_R_i_c_h_a_r_d_s_o_n> │ │ │ │ │ -174 { │ │ │ │ │ -175 typedef _R_i_c_h_a_r_d_s_o_n_<_X_,_Y_> _T; │ │ │ │ │ -176 │ │ │ │ │ -177 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_T_>_:_:_A_r_g_u_m_e_n_t_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ -178 │ │ │ │ │ -179 public: │ │ │ │ │ -_1_8_0 virtual _~_D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s() │ │ │ │ │ -181 {} │ │ │ │ │ +166 void _s_e_t_V_i_s_i_t_e_d(); │ │ │ │ │ +167 │ │ │ │ │ +171 bool _v_i_s_i_t_e_d() const; │ │ │ │ │ +172 │ │ │ │ │ +176 void _r_e_s_e_t_V_i_s_i_t_e_d(); │ │ │ │ │ +177 │ │ │ │ │ +181 void _s_e_t_F_r_o_n_t(); │ │ │ │ │ 182 │ │ │ │ │ -183 template │ │ │ │ │ -_1_8_4 void _s_e_t_M_a_t_r_i_x(const Args&...) │ │ │ │ │ -185 {} │ │ │ │ │ -186 │ │ │ │ │ -_1_8_7 void _s_e_t_A_r_g_s(const _S_m_o_o_t_h_e_r_A_r_g_s& args) │ │ │ │ │ -188 { │ │ │ │ │ -189 args_=&args; │ │ │ │ │ -190 } │ │ │ │ │ -191 │ │ │ │ │ -192 template │ │ │ │ │ -_1_9_3 void _s_e_t_C_o_m_m([[maybe_unused]] T1& comm) │ │ │ │ │ -194 {} │ │ │ │ │ -195 │ │ │ │ │ -_1_9_6 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& _g_e_t_C_o_m_m() │ │ │ │ │ -197 { │ │ │ │ │ -198 return comm_; │ │ │ │ │ -199 } │ │ │ │ │ -200 │ │ │ │ │ -_2_0_1 const _S_m_o_o_t_h_e_r_A_r_g_s _g_e_t_A_r_g_s() const │ │ │ │ │ -202 { │ │ │ │ │ -203 return *args_; │ │ │ │ │ -204 } │ │ │ │ │ -205 │ │ │ │ │ -206 private: │ │ │ │ │ -207 const SmootherArgs* args_; │ │ │ │ │ -208 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n comm_; │ │ │ │ │ -209 }; │ │ │ │ │ -210 │ │ │ │ │ -211 │ │ │ │ │ -212 │ │ │ │ │ -213 template │ │ │ │ │ -214 struct ConstructionTraits; │ │ │ │ │ +186 bool _f_r_o_n_t() const; │ │ │ │ │ +187 │ │ │ │ │ +191 void _r_e_s_e_t_F_r_o_n_t(); │ │ │ │ │ +192 │ │ │ │ │ +196 void _s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r(); │ │ │ │ │ +197 │ │ │ │ │ +202 bool _e_x_c_l_u_d_e_d_B_o_r_d_e_r() const; │ │ │ │ │ +203 │ │ │ │ │ +207 void _r_e_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r(); │ │ │ │ │ +208 │ │ │ │ │ +212 void _r_e_s_e_t(); │ │ │ │ │ +213 │ │ │ │ │ +214 }; │ │ │ │ │ 215 │ │ │ │ │ -219 template │ │ │ │ │ -_2_2_0 struct ConstructionTraits<_S_e_q_S_S_O_R > │ │ │ │ │ -221 { │ │ │ │ │ -_2_2_2 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_S_S_O_R_<_M_,_X_,_Y_,_l_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -223 │ │ │ │ │ -_2_2_4 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -225 { │ │ │ │ │ -226 return std::make_shared> │ │ │ │ │ -227 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, args._g_e_t_A_r_g_s │ │ │ │ │ -()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ -228 } │ │ │ │ │ -229 }; │ │ │ │ │ -230 │ │ │ │ │ -231 │ │ │ │ │ -235 template │ │ │ │ │ -_2_3_6 struct ConstructionTraits<_S_e_q_S_O_R > │ │ │ │ │ -237 { │ │ │ │ │ -_2_3_8 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +216 template │ │ │ │ │ +_2_1_7 class _P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ +218 : public RAPropertyMapHelper:: │ │ │ │ │ +reference, │ │ │ │ │ +219 PropertyGraphVertexPropertyMap > │ │ │ │ │ +220 { │ │ │ │ │ +221 public: │ │ │ │ │ +222 │ │ │ │ │ +_2_2_3 typedef ReadWritePropertyMapTag _C_a_t_e_g_o_r_y; │ │ │ │ │ +224 │ │ │ │ │ +225 enum { │ │ │ │ │ +227 _i_n_d_e_x = i │ │ │ │ │ +_2_2_8 }; │ │ │ │ │ +229 │ │ │ │ │ +_2_3_3 typedef G _G_r_a_p_h; │ │ │ │ │ +234 │ │ │ │ │ +_2_3_8 typedef std::bitset _B_i_t_S_e_t; │ │ │ │ │ 239 │ │ │ │ │ -_2_4_0 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -241 { │ │ │ │ │ -242 return std::make_shared> │ │ │ │ │ -243 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, args._g_e_t_A_r_g_s │ │ │ │ │ -()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ -244 } │ │ │ │ │ -245 }; │ │ │ │ │ -246 │ │ │ │ │ -247 │ │ │ │ │ -251 template │ │ │ │ │ -_2_5_2 struct ConstructionTraits<_S_e_q_J_a_c > │ │ │ │ │ -253 { │ │ │ │ │ -_2_5_4 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_J_a_c_<_M_,_X_,_Y_,_l_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -255 │ │ │ │ │ -_2_5_6 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -257 { │ │ │ │ │ -258 return std::make_shared> │ │ │ │ │ -259 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, args._g_e_t_A_r_g_s │ │ │ │ │ -()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ -260 } │ │ │ │ │ -261 }; │ │ │ │ │ +_2_4_3 typedef typename BitSet::reference _R_e_f_e_r_e_n_c_e; │ │ │ │ │ +244 │ │ │ │ │ +_2_4_8 typedef bool _V_a_l_u_e_T_y_p_e; │ │ │ │ │ +249 │ │ │ │ │ +_2_5_3 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ +254 │ │ │ │ │ +_2_5_9 _P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p(G& g) │ │ │ │ │ +260 : graph_(&g) │ │ │ │ │ +261 {} │ │ │ │ │ 262 │ │ │ │ │ -266 template │ │ │ │ │ -_2_6_7 struct ConstructionTraits<_R_i_c_h_a_r_d_s_o_n > │ │ │ │ │ -268 { │ │ │ │ │ -_2_6_9 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_R_i_c_h_a_r_d_s_o_n_<_X_,_Y_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ +_2_6_6 _P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p() │ │ │ │ │ +267 : graph_(0) │ │ │ │ │ +268 {} │ │ │ │ │ +269 │ │ │ │ │ 270 │ │ │ │ │ -_2_7_1 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -272 { │ │ │ │ │ -273 return std::make_shared> │ │ │ │ │ -274 (args._g_e_t_A_r_g_s()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ -275 } │ │ │ │ │ -276 }; │ │ │ │ │ -277 │ │ │ │ │ -278 │ │ │ │ │ -279 template │ │ │ │ │ -_2_8_0 class _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s<_S_e_q_I_L_U > │ │ │ │ │ -281 : public _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s > │ │ │ │ │ -282 { │ │ │ │ │ -283 public: │ │ │ │ │ -_2_8_4 _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s(int n=0) │ │ │ │ │ -285 : n_(n) │ │ │ │ │ -286 {} │ │ │ │ │ -287 │ │ │ │ │ -_2_8_8 void _s_e_t_N(int n) │ │ │ │ │ -289 { │ │ │ │ │ -290 n_ = n; │ │ │ │ │ -291 } │ │ │ │ │ -292 │ │ │ │ │ -_2_9_3 int _g_e_t_N() │ │ │ │ │ +_2_7_5 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](const _V_e_r_t_e_x& vertex) const │ │ │ │ │ +276 { │ │ │ │ │ +277 return graph_->getVertexProperties(vertex)[_i_n_d_e_x]; │ │ │ │ │ +278 } │ │ │ │ │ +279 private: │ │ │ │ │ +280 _G_r_a_p_h* graph_; │ │ │ │ │ +281 }; │ │ │ │ │ +282 │ │ │ │ │ +283 } // end namespace Amg │ │ │ │ │ +284 │ │ │ │ │ +285 template │ │ │ │ │ +_2_8_6 struct PropertyMapTypeSelector > │ │ │ │ │ +287 { │ │ │ │ │ +_2_8_8 typedef _A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_<_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_G_,_A_m_g_:_: │ │ │ │ │ +_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_E_P_,_V_M_,_E_M_>, Amg::VertexProperties::VISITED> _T_y_p_e; │ │ │ │ │ +289 }; │ │ │ │ │ +290 │ │ │ │ │ +291 template │ │ │ │ │ +292 typename PropertyMapTypeSelector >::Type │ │ │ │ │ +_2_9_3 _g_e_t([[maybe_unused]] const _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g& tag, _A_m_g_:_: │ │ │ │ │ +_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_G_,_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_E_P_,_V_M_,_E_M_>& graph) │ │ │ │ │ 294 { │ │ │ │ │ -295 return n_; │ │ │ │ │ +295 return _A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_<_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_G_,_A_m_g_:_: │ │ │ │ │ +_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_E_P_,_V_M_,_E_M_>, _A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_V_I_S_I_T_E_D>(graph); │ │ │ │ │ 296 } │ │ │ │ │ 297 │ │ │ │ │ -298 private: │ │ │ │ │ -299 int n_; │ │ │ │ │ -300 }; │ │ │ │ │ -301 │ │ │ │ │ -302 │ │ │ │ │ -306 template │ │ │ │ │ -_3_0_7 struct ConstructionTraits<_S_e_q_I_L_U > │ │ │ │ │ -308 { │ │ │ │ │ -_3_0_9 typedef _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_I_L_U_<_M_,_X_,_Y_> > _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -310 │ │ │ │ │ -_3_1_1 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -312 { │ │ │ │ │ -313 return std::make_shared> │ │ │ │ │ -314 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_N(), args._g_e_t_A_r_g_s()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r); │ │ │ │ │ -315 } │ │ │ │ │ -316 }; │ │ │ │ │ -317 │ │ │ │ │ -321 template │ │ │ │ │ -_3_2_2 struct ConstructionTraits<_P_a_r_S_S_O_R > │ │ │ │ │ -323 { │ │ │ │ │ -_3_2_4 typedef _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_M_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -325 │ │ │ │ │ -_3_2_6 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -327 { │ │ │ │ │ -328 return std::make_shared> │ │ │ │ │ -329 (args._g_e_t_M_a_t_r_i_x(), args._g_e_t_A_r_g_s()._i_t_e_r_a_t_i_o_n_s, │ │ │ │ │ -330 args._g_e_t_A_r_g_s()._r_e_l_a_x_a_t_i_o_n_F_a_c_t_o_r, args._g_e_t_C_o_m_m()); │ │ │ │ │ -331 } │ │ │ │ │ -332 }; │ │ │ │ │ -333 │ │ │ │ │ -334 template │ │ │ │ │ -_3_3_5 struct ConstructionTraits<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ -336 { │ │ │ │ │ -_3_3_7 typedef _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_T_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -_3_3_8 typedef ConstructionTraits _S_e_q_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s; │ │ │ │ │ -_3_3_9 static inline std::shared_ptr> _c_o_n_s_t_r_u_c_t │ │ │ │ │ -(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -340 { │ │ │ │ │ -341 auto seqPrec = SeqConstructionTraits::construct(args); │ │ │ │ │ -342 return std::make_shared> (seqPrec, │ │ │ │ │ -args._g_e_t_C_o_m_m()); │ │ │ │ │ +298 namespace Amg │ │ │ │ │ +299 { │ │ │ │ │ +_3_0_0 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ +props) │ │ │ │ │ +301 { │ │ │ │ │ +302 return os << props.flags_; │ │ │ │ │ +303 } │ │ │ │ │ +304 │ │ │ │ │ +_3_0_5 inline _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s() │ │ │ │ │ +306 : flags_() │ │ │ │ │ +307 {} │ │ │ │ │ +308 │ │ │ │ │ +309 inline std::bitset::reference │ │ │ │ │ +_3_1_0 _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t v) │ │ │ │ │ +311 { │ │ │ │ │ +312 return flags_[v]; │ │ │ │ │ +313 } │ │ │ │ │ +314 │ │ │ │ │ +_3_1_5 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t i) const │ │ │ │ │ +316 { │ │ │ │ │ +317 return flags_[i]; │ │ │ │ │ +318 } │ │ │ │ │ +319 │ │ │ │ │ +_3_2_0 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t() │ │ │ │ │ +321 { │ │ │ │ │ +322 flags_.reset(); │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +_3_2_5 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_I_n_f_l_u_e_n_c_e_s() │ │ │ │ │ +326 { │ │ │ │ │ +327 // Set the INFLUENCE bit │ │ │ │ │ +328 //flags_ |= (1< │ │ │ │ │ -_3_4_7 struct ConstructionTraits<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > │ │ │ │ │ -348 { │ │ │ │ │ -_3_4_9 typedef _D_e_f_a_u_l_t_P_a_r_a_l_l_e_l_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_T_,_C_> _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -_3_5_0 typedef ConstructionTraits _S_e_q_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s; │ │ │ │ │ -_3_5_1 static inline std::shared_ptr> │ │ │ │ │ -_c_o_n_s_t_r_u_c_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -352 { │ │ │ │ │ -353 auto seqPrec = SeqConstructionTraits::construct(args); │ │ │ │ │ -354 return std::make_shared> (seqPrec, │ │ │ │ │ -args._g_e_t_C_o_m_m()); │ │ │ │ │ -355 } │ │ │ │ │ -356 }; │ │ │ │ │ +344 │ │ │ │ │ +_3_4_5 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_D_e_p_e_n_d_s() │ │ │ │ │ +346 { │ │ │ │ │ +347 // reset the first bit. │ │ │ │ │ +348 //flags_ &= ~(1< │ │ │ │ │ -_3_6_9 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r │ │ │ │ │ -370 { │ │ │ │ │ -_3_7_1 typedef T _S_m_o_o_t_h_e_r; │ │ │ │ │ -_3_7_2 typedef typename Smoother::range_type _R_a_n_g_e; │ │ │ │ │ -_3_7_3 typedef typename Smoother::domain_type _D_o_m_a_i_n; │ │ │ │ │ -374 │ │ │ │ │ -_3_8_2 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -383 { │ │ │ │ │ -384 smoother.apply(v,d); │ │ │ │ │ -385 } │ │ │ │ │ -386 │ │ │ │ │ -_3_9_4 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -395 { │ │ │ │ │ -396 smoother.apply(v,d); │ │ │ │ │ -397 } │ │ │ │ │ -398 }; │ │ │ │ │ +_3_5_8 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_I_n_f_l_u_e_n_c_e_s() │ │ │ │ │ +359 { │ │ │ │ │ +360 // reset the second bit. │ │ │ │ │ +361 flags_ &= ~(1<<_I_N_F_L_U_E_N_C_E); │ │ │ │ │ +362 } │ │ │ │ │ +363 │ │ │ │ │ +_3_6_4 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_O_n_e_W_a_y() const │ │ │ │ │ +365 { │ │ │ │ │ +366 // Test whether only the first bit is set │ │ │ │ │ +367 //return isStrong() && !isTwoWay(); │ │ │ │ │ +368 return ((flags_) & std::bitset((1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D)))== │ │ │ │ │ +(1<<_D_E_P_E_N_D); │ │ │ │ │ +369 } │ │ │ │ │ +370 │ │ │ │ │ +_3_7_1 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_T_w_o_W_a_y() const │ │ │ │ │ +372 { │ │ │ │ │ +373 // Test whether the first and second bit is set │ │ │ │ │ +374 return ((flags_) & std::bitset((1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D)))==( │ │ │ │ │ +(1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D)); │ │ │ │ │ +375 } │ │ │ │ │ +376 │ │ │ │ │ +_3_7_7 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_S_t_r_o_n_g() const │ │ │ │ │ +378 { │ │ │ │ │ +379 // Test whether the first or second bit is set │ │ │ │ │ +380 return ((flags_) & std::bitset((1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D))).to_ulong │ │ │ │ │ +(); │ │ │ │ │ +381 } │ │ │ │ │ +382 │ │ │ │ │ +383 │ │ │ │ │ +_3_8_4 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ +props) │ │ │ │ │ +385 { │ │ │ │ │ +386 return os << props.flags_; │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +_3_8_9 inline _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s() │ │ │ │ │ +390 : flags_() │ │ │ │ │ +391 {} │ │ │ │ │ +392 │ │ │ │ │ +393 │ │ │ │ │ +394 inline std::bitset::reference │ │ │ │ │ +_3_9_5 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t v) │ │ │ │ │ +396 { │ │ │ │ │ +397 return flags_[v]; │ │ │ │ │ +398 } │ │ │ │ │ 399 │ │ │ │ │ -405 template │ │ │ │ │ -_4_0_6 void _p_r_e_s_m_o_o_t_h(LevelContext& levelContext, size_t steps) │ │ │ │ │ -407 { │ │ │ │ │ -408 for(std::size_t i=0; i < steps; ++i) { │ │ │ │ │ -409 *levelContext.lhs=0; │ │ │ │ │ -410 _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_t_y_p_e_n_a_m_e_ _L_e_v_e_l_C_o_n_t_e_x_t_:_:_S_m_o_o_t_h_e_r_T_y_p_e_> │ │ │ │ │ -411_ _:_:_p_r_e_S_m_o_o_t_h(*levelContext.smoother, *levelContext.lhs, │ │ │ │ │ -412 *levelContext.rhs); │ │ │ │ │ -413 // Accumulate update │ │ │ │ │ -414 *levelContext.update += *levelContext.lhs; │ │ │ │ │ -415 │ │ │ │ │ -416 // update defect │ │ │ │ │ -417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, │ │ │ │ │ -*levelContext.rhs); │ │ │ │ │ -418 levelContext.pinfo->project(*levelContext.rhs); │ │ │ │ │ -419 } │ │ │ │ │ -420 } │ │ │ │ │ -421 │ │ │ │ │ -427 template │ │ │ │ │ -_4_2_8 void _p_o_s_t_s_m_o_o_t_h(LevelContext& levelContext, size_t steps) │ │ │ │ │ -429 { │ │ │ │ │ -430 for(std::size_t i=0; i < steps; ++i) { │ │ │ │ │ -431 // update defect │ │ │ │ │ -432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, │ │ │ │ │ -433 *levelContext.rhs); │ │ │ │ │ -434 *levelContext.lhs=0; │ │ │ │ │ -435 levelContext.pinfo->project(*levelContext.rhs); │ │ │ │ │ -436 _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r_<_t_y_p_e_n_a_m_e_ _L_e_v_e_l_C_o_n_t_e_x_t_:_:_S_m_o_o_t_h_e_r_T_y_p_e_> │ │ │ │ │ -437_ _:_:_p_o_s_t_S_m_o_o_t_h(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs); │ │ │ │ │ -438 // Accumulate update │ │ │ │ │ -439 *levelContext.update += *levelContext.lhs; │ │ │ │ │ -440 } │ │ │ │ │ -441 } │ │ │ │ │ -442 │ │ │ │ │ -443 template │ │ │ │ │ -_4_4_4 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_S_e_q_S_O_R > │ │ │ │ │ -445 { │ │ │ │ │ -_4_4_6 typedef _S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> _S_m_o_o_t_h_e_r; │ │ │ │ │ -_4_4_7 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ -_4_4_8 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ +_4_0_0 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t v) const │ │ │ │ │ +401 { │ │ │ │ │ +402 return flags_[v]; │ │ │ │ │ +403 } │ │ │ │ │ +404 │ │ │ │ │ +_4_0_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_I_s_o_l_a_t_e_d() │ │ │ │ │ +406 { │ │ │ │ │ +407 flags_.set(_I_S_O_L_A_T_E_D); │ │ │ │ │ +408 } │ │ │ │ │ +409 │ │ │ │ │ +_4_1_0 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_i_s_o_l_a_t_e_d() const │ │ │ │ │ +411 { │ │ │ │ │ +412 return flags_.test(_I_S_O_L_A_T_E_D); │ │ │ │ │ +413 } │ │ │ │ │ +414 │ │ │ │ │ +_4_1_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_I_s_o_l_a_t_e_d() │ │ │ │ │ +416 { │ │ │ │ │ +417 flags_.reset(_I_S_O_L_A_T_E_D); │ │ │ │ │ +418 } │ │ │ │ │ +419 │ │ │ │ │ +_4_2_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_V_i_s_i_t_e_d() │ │ │ │ │ +421 { │ │ │ │ │ +422 flags_.set(_V_I_S_I_T_E_D); │ │ │ │ │ +423 } │ │ │ │ │ +424 │ │ │ │ │ +_4_2_5 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_v_i_s_i_t_e_d() const │ │ │ │ │ +426 { │ │ │ │ │ +427 return flags_.test(_V_I_S_I_T_E_D); │ │ │ │ │ +428 } │ │ │ │ │ +429 │ │ │ │ │ +_4_3_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_V_i_s_i_t_e_d() │ │ │ │ │ +431 { │ │ │ │ │ +432 flags_.reset(_V_I_S_I_T_E_D); │ │ │ │ │ +433 } │ │ │ │ │ +434 │ │ │ │ │ +_4_3_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_F_r_o_n_t() │ │ │ │ │ +436 { │ │ │ │ │ +437 flags_.set(_F_R_O_N_T); │ │ │ │ │ +438 } │ │ │ │ │ +439 │ │ │ │ │ +_4_4_0 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_f_r_o_n_t() const │ │ │ │ │ +441 { │ │ │ │ │ +442 return flags_.test(_F_R_O_N_T); │ │ │ │ │ +443 } │ │ │ │ │ +444 │ │ │ │ │ +_4_4_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_F_r_o_n_t() │ │ │ │ │ +446 { │ │ │ │ │ +447 flags_.reset(_F_R_O_N_T); │ │ │ │ │ +448 } │ │ │ │ │ 449 │ │ │ │ │ -_4_5_0 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ +_4_5_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r() │ │ │ │ │ 451 { │ │ │ │ │ -452 smoother.template apply(v,d); │ │ │ │ │ +452 flags_.set(_B_O_R_D_E_R); │ │ │ │ │ 453 } │ │ │ │ │ 454 │ │ │ │ │ -455 │ │ │ │ │ -_4_5_6 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ -457 { │ │ │ │ │ -458 smoother.template apply(v,d); │ │ │ │ │ -459 } │ │ │ │ │ -460 }; │ │ │ │ │ -461 │ │ │ │ │ -462 template │ │ │ │ │ -_4_6_3 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r > > │ │ │ │ │ -464 { │ │ │ │ │ -_4_6_5 typedef _B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_,_C_,_S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> > _S_m_o_o_t_h_e_r; │ │ │ │ │ -_4_6_6 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ -_4_6_7 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ -468 │ │ │ │ │ -_4_6_9 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ -470 { │ │ │ │ │ -471 smoother.template apply(v,d); │ │ │ │ │ -472 } │ │ │ │ │ -473 │ │ │ │ │ -474 │ │ │ │ │ -_4_7_5 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ -476 { │ │ │ │ │ -477 smoother.template apply(v,d); │ │ │ │ │ -478 } │ │ │ │ │ -479 }; │ │ │ │ │ -480 │ │ │ │ │ -481 template │ │ │ │ │ -_4_8_2 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -> > │ │ │ │ │ -483 { │ │ │ │ │ -_4_8_4 typedef _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_C_,_S_e_q_S_O_R_<_M_,_X_,_Y_,_l_> > _S_m_o_o_t_h_e_r; │ │ │ │ │ -_4_8_5 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ -_4_8_6 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ -487 │ │ │ │ │ -_4_8_8 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ -489 { │ │ │ │ │ -490 smoother.template apply(v,d); │ │ │ │ │ -491 } │ │ │ │ │ -492 │ │ │ │ │ -493 │ │ │ │ │ -_4_9_4 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, _R_a_n_g_e& d) │ │ │ │ │ -495 { │ │ │ │ │ -496 smoother.template apply(v,d); │ │ │ │ │ -497 } │ │ │ │ │ -498 }; │ │ │ │ │ -499 │ │ │ │ │ -500 } // end namespace Amg │ │ │ │ │ -501 │ │ │ │ │ -502 // forward declarations │ │ │ │ │ -503 template │ │ │ │ │ -504 class SeqOverlappingSchwarz; │ │ │ │ │ -505 │ │ │ │ │ -506 struct MultiplicativeSchwarzMode; │ │ │ │ │ -507 │ │ │ │ │ -508 namespace Amg │ │ │ │ │ -509 { │ │ │ │ │ -510 template │ │ │ │ │ -_5_1_1 struct _S_m_o_o_t_h_e_r_A_p_p_l_i_e_r<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z > │ │ │ │ │ -513 { │ │ │ │ │ -_5_1_4 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_M_S_,_T_A_> │ │ │ │ │ -_S_m_o_o_t_h_e_r; │ │ │ │ │ -_5_1_5 typedef typename _S_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _R_a_n_g_e; │ │ │ │ │ -_5_1_6 typedef typename _S_m_o_o_t_h_e_r_:_:_d_o_m_a_i_n___t_y_p_e _D_o_m_a_i_n; │ │ │ │ │ -517 │ │ │ │ │ -_5_1_8 static void _p_r_e_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -519 { │ │ │ │ │ -520 smoother.template apply(v,d); │ │ │ │ │ -521 } │ │ │ │ │ -522 │ │ │ │ │ -523 │ │ │ │ │ -_5_2_4 static void _p_o_s_t_S_m_o_o_t_h(_S_m_o_o_t_h_e_r& smoother, _D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -525 { │ │ │ │ │ -526 smoother.template apply(v,d); │ │ │ │ │ -527 │ │ │ │ │ -528 } │ │ │ │ │ -529 }; │ │ │ │ │ -530 │ │ │ │ │ -531 // template │ │ │ │ │ -532 // class SeqOverlappingSchwarz; │ │ │ │ │ -533 │ │ │ │ │ -534 template │ │ │ │ │ -_5_3_5 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -536 : public _D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -537 { │ │ │ │ │ -_5_3_8 enum _O_v_e_r_l_a_p {_v_e_r_t_e_x, _a_g_g_r_e_g_a_t_e, _p_a_i_r_w_i_s_e, _n_o_n_e}; │ │ │ │ │ -539 │ │ │ │ │ -_5_4_0 _O_v_e_r_l_a_p _o_v_e_r_l_a_p; │ │ │ │ │ -_5_4_1 bool _o_n_t_h_e_f_l_y; │ │ │ │ │ -542 │ │ │ │ │ -_5_4_3 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s(_O_v_e_r_l_a_p overlap_=_v_e_r_t_e_x, │ │ │ │ │ -544 bool onthefly_=false) │ │ │ │ │ -545 : _o_v_e_r_l_a_p(overlap_), _o_n_t_h_e_f_l_y(onthefly_) │ │ │ │ │ -546 {} │ │ │ │ │ -547 }; │ │ │ │ │ -548 │ │ │ │ │ -549 template │ │ │ │ │ -_5_5_0 struct _S_m_o_o_t_h_e_r_T_r_a_i_t_s<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z > │ │ │ │ │ -551 { │ │ │ │ │ -_5_5_2 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _M_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ -_A_r_g_u_m_e_n_t_s; │ │ │ │ │ -553 }; │ │ │ │ │ -554 │ │ │ │ │ -555 template │ │ │ │ │ -_5_5_6 class _C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z > │ │ │ │ │ -557 : public _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s > │ │ │ │ │ -558 { │ │ │ │ │ -559 typedef _D_e_f_a_u_l_t_C_o_n_s_t_r_u_c_t_i_o_n_A_r_g_s_<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_S_,_T_A_> > │ │ │ │ │ -_F_a_t_h_e_r; │ │ │ │ │ -560 │ │ │ │ │ -561 public: │ │ │ │ │ -_5_6_2 typedef typename _M_a_t_r_i_x_G_r_a_p_h_<_M_>_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -_5_6_3 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_> _A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ -_5_6_4 typedef typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -_5_6_5 typedef typename _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_S_,_T_A_>_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ -_V_e_c_t_o_r; │ │ │ │ │ -_5_6_6 typedef typename Vector::value_type _S_u_b_d_o_m_a_i_n; │ │ │ │ │ -567 │ │ │ │ │ -_5_6_8 virtual void _s_e_t_M_a_t_r_i_x(const M& matrix, const _A_g_g_r_e_g_a_t_e_s_M_a_p& amap) │ │ │ │ │ -569 { │ │ │ │ │ -570 Father::setMatrix(matrix); │ │ │ │ │ -571 │ │ │ │ │ -572 std::vector visited(amap._n_o_V_e_r_t_i_c_e_s(), false); │ │ │ │ │ -573 typedef IteratorPropertyMap::iterator,IdentityMap> │ │ │ │ │ -VisitedMapType; │ │ │ │ │ -574 VisitedMapType visitedMap(visited.begin()); │ │ │ │ │ -575 │ │ │ │ │ -576 _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_> graph(matrix); │ │ │ │ │ -577 │ │ │ │ │ -578 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _M_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ -_S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ -579 │ │ │ │ │ -580 switch(Father::getArgs().overlap) { │ │ │ │ │ -581 case SmootherArgs::vertex : │ │ │ │ │ -582 { │ │ │ │ │ -583 VertexAdder visitor(subdomains, amap); │ │ │ │ │ -584 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ -585 } │ │ │ │ │ -586 break; │ │ │ │ │ -587 case SmootherArgs::pairwise : │ │ │ │ │ -588 { │ │ │ │ │ -589 createPairDomains(graph); │ │ │ │ │ -590 } │ │ │ │ │ -591 break; │ │ │ │ │ -592 case SmootherArgs::aggregate : │ │ │ │ │ -593 { │ │ │ │ │ -594 AggregateAdder visitor(subdomains, amap, graph, │ │ │ │ │ -visitedMap); │ │ │ │ │ -595 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ -596 } │ │ │ │ │ -597 break; │ │ │ │ │ -598 case SmootherArgs::none : │ │ │ │ │ -599 NoneAdder visitor; │ │ │ │ │ -600 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ -601 break; │ │ │ │ │ -602 default : │ │ │ │ │ -603 DUNE_THROW(NotImplemented, "This overlapping scheme is not supported!"); │ │ │ │ │ -604 } │ │ │ │ │ -605 } │ │ │ │ │ -_6_0_6 void _s_e_t_M_a_t_r_i_x(const M& matrix) │ │ │ │ │ -607 { │ │ │ │ │ -608 Father::setMatrix(matrix); │ │ │ │ │ -609 │ │ │ │ │ -610 /* Create aggregates map where each aggregate is just one vertex. */ │ │ │ │ │ -611 _A_g_g_r_e_g_a_t_e_s_M_a_p amap(matrix.N()); │ │ │ │ │ -612 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r v=0; │ │ │ │ │ -613 for(typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_i_t_e_r_a_t_o_r iter=amap._b_e_g_i_n(); │ │ │ │ │ -614 iter!=amap._e_n_d(); ++iter) │ │ │ │ │ -615 *iter=v++; │ │ │ │ │ -616 │ │ │ │ │ -617 std::vector visited(amap._n_o_V_e_r_t_i_c_e_s(), false); │ │ │ │ │ -618 typedef IteratorPropertyMap::iterator,IdentityMap> │ │ │ │ │ -VisitedMapType; │ │ │ │ │ -619 VisitedMapType visitedMap(visited.begin()); │ │ │ │ │ -620 │ │ │ │ │ -621 _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_> graph(matrix); │ │ │ │ │ -622 │ │ │ │ │ -623 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_S_m_o_o_t_h_e_r_A_r_g_s_<_t_y_p_e_n_a_m_e_ _M_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ -_S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ -624 │ │ │ │ │ -625 switch(Father::getArgs().overlap) { │ │ │ │ │ -626 case SmootherArgs::vertex : │ │ │ │ │ -627 { │ │ │ │ │ -628 VertexAdder visitor(subdomains, amap); │ │ │ │ │ -629 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ -630 } │ │ │ │ │ -631 break; │ │ │ │ │ -632 case SmootherArgs::aggregate : │ │ │ │ │ -633 { │ │ │ │ │ -634 DUNE_THROW(NotImplemented, "Aggregate overlap is not supported yet"); │ │ │ │ │ -635 /* │ │ │ │ │ -636 AggregateAdder visitor(subdomains, amap, graph, │ │ │ │ │ -visitedMap); │ │ │ │ │ -637 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ -638 */ │ │ │ │ │ -639 } │ │ │ │ │ -640 break; │ │ │ │ │ -641 case SmootherArgs::pairwise : │ │ │ │ │ -642 { │ │ │ │ │ -643 createPairDomains(graph); │ │ │ │ │ -644 } │ │ │ │ │ -645 break; │ │ │ │ │ -646 case SmootherArgs::none : │ │ │ │ │ -647 NoneAdder visitor; │ │ │ │ │ -648 createSubdomains(matrix, graph, amap, visitor, visitedMap); │ │ │ │ │ -649 │ │ │ │ │ -650 } │ │ │ │ │ -651 } │ │ │ │ │ -652 │ │ │ │ │ -_6_5_3 const _V_e_c_t_o_r& _g_e_t_S_u_b_D_o_m_a_i_n_s() │ │ │ │ │ -654 { │ │ │ │ │ -655 return subdomains; │ │ │ │ │ -656 } │ │ │ │ │ -657 │ │ │ │ │ -658 private: │ │ │ │ │ -659 struct VertexAdder │ │ │ │ │ -660 { │ │ │ │ │ -_6_6_1 _V_e_r_t_e_x_A_d_d_e_r(_V_e_c_t_o_r& subdomains_, const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates_) │ │ │ │ │ -662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_) │ │ │ │ │ -663 {} │ │ │ │ │ -664 template │ │ │ │ │ -_6_6_5 void _o_p_e_r_a_t_o_r_(_)(const T& edge) │ │ │ │ │ -666 { │ │ │ │ │ -667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) │ │ │ │ │ -668 subdomains[subdomain].insert(edge.target()); │ │ │ │ │ -669 } │ │ │ │ │ -_6_7_0 int _s_e_t_A_g_g_r_e_g_a_t_e(const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate_) │ │ │ │ │ -671 { │ │ │ │ │ -672 subdomain=aggregate_; │ │ │ │ │ -673 max = std::max(subdomain, aggregate_); │ │ │ │ │ -674 return subdomain; │ │ │ │ │ -675 } │ │ │ │ │ -_6_7_6 int _n_o_S_u_b_d_o_m_a_i_n_s() const │ │ │ │ │ -677 { │ │ │ │ │ -678 return max+1; │ │ │ │ │ -679 } │ │ │ │ │ -680 private: │ │ │ │ │ -681 _V_e_c_t_o_r& subdomains; │ │ │ │ │ -682 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r max; │ │ │ │ │ -683 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r subdomain; │ │ │ │ │ -684 const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates; │ │ │ │ │ -685 }; │ │ │ │ │ -686 struct NoneAdder │ │ │ │ │ -687 { │ │ │ │ │ -688 template │ │ │ │ │ -_6_8_9 void _o_p_e_r_a_t_o_r_(_)(const T& edge) │ │ │ │ │ -690 {} │ │ │ │ │ -_6_9_1 int _s_e_t_A_g_g_r_e_g_a_t_e(const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate_) │ │ │ │ │ -692 { │ │ │ │ │ -693 return -1; │ │ │ │ │ -694 } │ │ │ │ │ -_6_9_5 int _n_o_S_u_b_d_o_m_a_i_n_s() const │ │ │ │ │ -696 { │ │ │ │ │ -697 return -1; │ │ │ │ │ -698 } │ │ │ │ │ -699 }; │ │ │ │ │ -700 │ │ │ │ │ -701 template │ │ │ │ │ -702 struct AggregateAdder │ │ │ │ │ -703 { │ │ │ │ │ -_7_0_4 _A_g_g_r_e_g_a_t_e_A_d_d_e_r(_V_e_c_t_o_r& subdomains_, const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates_, │ │ │ │ │ -705 const _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>& graph_, VM& visitedMap_) │ │ │ │ │ -706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_), │ │ │ │ │ -707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_) │ │ │ │ │ -708 {} │ │ │ │ │ -709 template │ │ │ │ │ -_7_1_0 void _o_p_e_r_a_t_o_r_(_)(const T& edge) │ │ │ │ │ -711 { │ │ │ │ │ -712 subdomains[subdomain].insert(edge.target()); │ │ │ │ │ -713 // If we (the neighbouring vertex of the aggregate) │ │ │ │ │ -714 // are not isolated, add the aggregate we belong to │ │ │ │ │ -715 // to the same subdomain using the OneOverlapAdder │ │ │ │ │ -716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) { │ │ │ │ │ -717 assert(aggregates[edge.target()]!=aggregate); │ │ │ │ │ -718 typename _A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x_L_i_s_t vlist; │ │ │ │ │ -719 aggregates.template breadthFirstSearch(edge.target(), │ │ │ │ │ -aggregate, │ │ │ │ │ -720 graph, vlist, adder, adder, │ │ │ │ │ -721 visitedMap); │ │ │ │ │ -722 } │ │ │ │ │ -723 } │ │ │ │ │ -724 │ │ │ │ │ -_7_2_5 int _s_e_t_A_g_g_r_e_g_a_t_e(const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate_) │ │ │ │ │ -726 { │ │ │ │ │ -727 adder.setAggregate(aggregate_); │ │ │ │ │ -728 aggregate=aggregate_; │ │ │ │ │ -729 return ++subdomain; │ │ │ │ │ -730 } │ │ │ │ │ -_7_3_1 int _n_o_S_u_b_d_o_m_a_i_n_s() const │ │ │ │ │ -732 { │ │ │ │ │ -733 return subdomain+1; │ │ │ │ │ -734 } │ │ │ │ │ -735 │ │ │ │ │ -736 private: │ │ │ │ │ -737 _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r aggregate; │ │ │ │ │ -738 _V_e_c_t_o_r& subdomains; │ │ │ │ │ -739 int subdomain; │ │ │ │ │ -740 const _A_g_g_r_e_g_a_t_e_s_M_a_p& aggregates; │ │ │ │ │ -741 VertexAdder adder; │ │ │ │ │ -742 const _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>& graph; │ │ │ │ │ -743 VM& visitedMap; │ │ │ │ │ -744 }; │ │ │ │ │ -745 │ │ │ │ │ -746 void createPairDomains(const _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>& graph) │ │ │ │ │ -747 { │ │ │ │ │ -748 typedef typename _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r VIter; │ │ │ │ │ -749 typedef typename _M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_>_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r EIter; │ │ │ │ │ -750 typedef typename M::size_type size_type; │ │ │ │ │ -751 │ │ │ │ │ -752 std::set > pairs; │ │ │ │ │ -753 int total=0; │ │ │ │ │ -754 for(VIter v=graph._b_e_g_i_n(), ve=graph._e_n_d(); ve != v; ++v) │ │ │ │ │ -755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e) │ │ │ │ │ -756 { │ │ │ │ │ -757 ++total; │ │ │ │ │ -758 if(e.source() >::const_iterator │ │ │ │ │ -SIter; │ │ │ │ │ -768 typename Vector::iterator subdomain=subdomains.begin(); │ │ │ │ │ -769 │ │ │ │ │ -770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s) │ │ │ │ │ -771 { │ │ │ │ │ -772 subdomain->insert(s->first); │ │ │ │ │ -773 subdomain->insert(s->second); │ │ │ │ │ -774 ++subdomain; │ │ │ │ │ -775 } │ │ │ │ │ -776 std::size_t minsize=10000; │ │ │ │ │ -777 std::size_t maxsize=0; │ │ │ │ │ -778 int sum=0; │ │ │ │ │ -779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) { │ │ │ │ │ -780 sum+=subdomains[i].size(); │ │ │ │ │ -781 minsize=std::min(minsize, subdomains[i].size()); │ │ │ │ │ -782 maxsize=std::max(maxsize, subdomains[i].size()); │ │ │ │ │ -783 } │ │ │ │ │ -784 Dune::dinfo<<"Subdomain size: min="< │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: fastamgsmoother.hh File Reference │ │ │ │ +dune-istl: renumberer.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,35 +71,40 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
fastamgsmoother.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
renumberer.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ +
#include "aggregates.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::GaussSeidelPresmoothDefect< level >
 
struct  Dune::Amg::GaussSeidelPostsmoothDefect< level >
class  Dune::Amg::AggregateRenumberer< G >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class G , class I , class V >
void Dune::Amg::renumberAggregates (const G &graph, I index, I endIndex, V &visitedMap, AggregatesMap< typename G::VertexDescriptor > &aggregates)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,23 +1,26 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -fastamgsmoother.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 │ │ │ │ │ +renumberer.hh File Reference │ │ │ │ │ +#include "_a_g_g_r_e_g_a_t_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 │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_<_ _l_e_v_e_l_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t_<_ _l_e_v_e_l_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_ _G_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_A_m_g_:_:_r_e_n_u_m_b_e_r_A_g_g_r_e_g_a_t_e_s (const G &graph, I index, I endIndex, V │ │ │ │ │ + &visitedMap, _A_g_g_r_e_g_a_t_e_s_M_a_p< typename G::VertexDescriptor > &aggregates) │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: fastamgsmoother.hh Source File │ │ │ │ +dune-istl: renumberer.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,127 +74,118 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
fastamgsmoother.hh
│ │ │ │ +
renumberer.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH
│ │ │ │ -
6#define DUNE_ISTL_FASTAMGSMOOTHER_HH
│ │ │ │ +
5#ifndef DUNE_AMG_RENUMBERER_HH
│ │ │ │ +
6#define DUNE_AMG_RENUMBERER_HH
│ │ │ │
7
│ │ │ │ -
8#include <cstddef>
│ │ │ │ +
8#include "aggregates.hh"
│ │ │ │
9
│ │ │ │
10namespace Dune
│ │ │ │
11{
│ │ │ │
12 namespace Amg
│ │ │ │
13 {
│ │ │ │ -
14
│ │ │ │ -
15 template<std::size_t level>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18 template<typename M, typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
19 static void apply(const M& A, X& x, Y& d,
│ │ │ │ -
20 const Y& b)
│ │ │ │ -
21 {
│ │ │ │ -
22 typedef typename M::ConstRowIterator RowIterator;
│ │ │ │ -
23 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ -
24
│ │ │ │ -
25 typename Y::iterator dIter=d.begin();
│ │ │ │ -
26 typename Y::const_iterator bIter=b.begin();
│ │ │ │ -
27 typename X::iterator xIter=x.begin();
│ │ │ │ -
28
│ │ │ │ -
29 for(RowIterator row=A.begin(), end=A.end(); row != end;
│ │ │ │ -
30 ++row, ++dIter, ++xIter, ++bIter)
│ │ │ │ -
31 {
│ │ │ │ -
32 ColIterator col=(*row).begin();
│ │ │ │ -
33 *dIter = *bIter;
│ │ │ │ -
34
│ │ │ │ -
35 for (; col.index()<row.index(); ++col)
│ │ │ │ -
36 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ -
37 assert(row.index()==col.index());
│ │ │ │ -
38 ColIterator diag=col; // upper diagonal matrix not needed as x was 0 before.
│ │ │ │ -
39
│ │ │ │ -
40 // Not recursive yet. Just solve with the diagonal
│ │ │ │ -
41 diag->solve(*xIter,*dIter);
│ │ │ │ -
42 *dIter=0; //as r=v
│ │ │ │ +
14 template<class G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
16 {
│ │ │ │ +
17 public:
│ │ │ │ +
19 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ +
26
│ │ │ │ +
28 operator Vertex() const;
│ │ │ │ +
29
│ │ │ │ +
30 void operator()(const typename G::ConstEdgeIterator& edge);
│ │ │ │ +
31
│ │ │ │ +
32 void operator++();
│ │ │ │ +
33
│ │ │ │ +
34 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
37 };
│ │ │ │ +
│ │ │ │ +
38
│ │ │ │ +
39 template<class G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
41 : number_(0), aggregates_(aggregates)
│ │ │ │ +
42 {}
│ │ │ │ +
│ │ │ │
43
│ │ │ │ -
44 // Update residual for the symmetric case
│ │ │ │ -
45 for(col=(*row).begin(); col.index()<row.index(); ++col)
│ │ │ │ -
46 col->mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
│ │ │ │ -
47 }
│ │ │ │ -
48 }
│ │ │ │ -
│ │ │ │ -
49 };
│ │ │ │ -
│ │ │ │ -
50
│ │ │ │ -
51 template<std::size_t level>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
53
│ │ │ │ -
54 template<typename M, typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
55 static void apply(const M& A, X& x, Y& d,
│ │ │ │ -
56 const Y& b)
│ │ │ │ -
57 {
│ │ │ │ -
58 typedef typename M::ConstRowIterator RowIterator;
│ │ │ │ -
59 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ -
60 typedef typename Y::block_type YBlock;
│ │ │ │ +
44 template<class G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
46 {
│ │ │ │ +
47 return number_;
│ │ │ │ +
48 }
│ │ │ │ +
│ │ │ │ +
49
│ │ │ │ +
50 template<class G>
│ │ │ │ +
│ │ │ │ +
51 void AggregateRenumberer<G>::operator()(const typename G::ConstEdgeIterator& edge)
│ │ │ │ +
52 {
│ │ │ │ +
53 aggregates_[edge.target()]=number_;
│ │ │ │ +
54 }
│ │ │ │ +
│ │ │ │ +
55
│ │ │ │ +
56 template<class G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
58 {
│ │ │ │ +
59 ++number_;
│ │ │ │ +
60 }
│ │ │ │ +
│ │ │ │
61
│ │ │ │ -
62 typename Y::iterator dIter=d.beforeEnd();
│ │ │ │ -
63 typename X::iterator xIter=x.beforeEnd();
│ │ │ │ -
64 typename Y::const_iterator bIter=b.beforeEnd();
│ │ │ │ -
65
│ │ │ │ -
66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end;
│ │ │ │ -
67 --row, --dIter, --xIter, --bIter)
│ │ │ │ -
68 {
│ │ │ │ -
69 ColIterator endCol=(*row).beforeBegin();
│ │ │ │ -
70 ColIterator col=(*row).beforeEnd();
│ │ │ │ -
71 *dIter = *bIter;
│ │ │ │ -
72
│ │ │ │ -
73 for (; col.index()>row.index(); --col)
│ │ │ │ -
74 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j
│ │ │ │ -
75 assert(row.index()==col.index());
│ │ │ │ -
76 ColIterator diag=col;
│ │ │ │ -
77 YBlock v=*dIter;
│ │ │ │ -
78 // upper diagonal matrix
│ │ │ │ -
79 for (--col; col!=endCol; --col)
│ │ │ │ -
80 (*col).mmv(x[col.index()],v); // v -= sum_{j<i} a_ij * xold_j
│ │ │ │ -
81
│ │ │ │ -
82 // Not recursive yet. Just solve with the diagonal
│ │ │ │ -
83 diag->solve(*xIter,v);
│ │ │ │ -
84
│ │ │ │ -
85 *dIter-=v;
│ │ │ │ -
86
│ │ │ │ -
87 // Update residual for the symmetric case
│ │ │ │ -
88 // Skip residual computation as it is not needed.
│ │ │ │ -
89 //for(col=(*row).begin();col.index()<row.index(); ++col)
│ │ │ │ -
90 //col.mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
│ │ │ │ -
91 }
│ │ │ │ -
92 }
│ │ │ │ -
│ │ │ │ -
93 };
│ │ │ │ -
│ │ │ │ -
94 } // end namespace Amg
│ │ │ │ -
95} // end namespace Dune
│ │ │ │ -
96#endif
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
62 template<class G, class I, class V>
│ │ │ │ +
│ │ │ │ +
63 void renumberAggregates(const G& graph, I index, I endIndex, V& visitedMap,
│ │ │ │ + │ │ │ │ +
65 {
│ │ │ │ +
66 AggregateRenumberer<G> renumberer(aggregates);
│ │ │ │ +
67
│ │ │ │ +
68 for(I index1=index; index1 != endIndex; ++index1)
│ │ │ │ +
69 if(aggregates[index1.index()]!=AggregatesMap<typename G::VertexDescriptor>::ISOLATED &&
│ │ │ │ +
70 !get(visitedMap, index1.index())) {
│ │ │ │ +
71
│ │ │ │ +
72 aggregates.template breadthFirstSearch<false>(index1.index(), aggregates[index1.index()],
│ │ │ │ +
73 graph, renumberer, visitedMap);
│ │ │ │ +
74 aggregates[index1.index()] = renumberer;
│ │ │ │ +
75 ++renumberer;
│ │ │ │ +
76 }
│ │ │ │ +
77 for(; index != endIndex; ++index)
│ │ │ │ +
78 put(visitedMap, index.index(), false);
│ │ │ │ +
79 }
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
81 } // namespace AMG
│ │ │ │ +
82} // namespace Dune
│ │ │ │ +
83#endif
│ │ │ │ +
Provides classes for the Coloring process of AMG.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Definition fastamgsmoother.hh:16
│ │ │ │ -
static void apply(const M &A, X &x, Y &d, const Y &b)
Definition fastamgsmoother.hh:19
│ │ │ │ -
Definition fastamgsmoother.hh:52
│ │ │ │ -
static void apply(const M &A, X &x, Y &d, const Y &b)
Definition fastamgsmoother.hh:55
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap, AggregatesMap< typename G::VertexDescriptor > &aggregates)
Definition renumberer.hh:63
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
Definition renumberer.hh:16
│ │ │ │ +
void operator++()
Definition renumberer.hh:57
│ │ │ │ +
G::VertexDescriptor Vertex
The vertex type.
Definition renumberer.hh:19
│ │ │ │ +
void operator()(const typename G::ConstEdgeIterator &edge)
Definition renumberer.hh:51
│ │ │ │ +
AggregatesMap< Vertex > & aggregates_
Definition renumberer.hh:36
│ │ │ │ +
AggregateRenumberer(AggregatesMap< Vertex > &aggregates)
Constructor.
Definition renumberer.hh:40
│ │ │ │ +
Vertex number_
Definition renumberer.hh:35
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,123 +1,131 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -fastamgsmoother.hh │ │ │ │ │ +renumberer.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH │ │ │ │ │ -6#define DUNE_ISTL_FASTAMGSMOOTHER_HH │ │ │ │ │ +5#ifndef DUNE_AMG_RENUMBERER_HH │ │ │ │ │ +6#define DUNE_AMG_RENUMBERER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ 9 │ │ │ │ │ 10namespace _D_u_n_e │ │ │ │ │ 11{ │ │ │ │ │ 12 namespace Amg │ │ │ │ │ 13 { │ │ │ │ │ -14 │ │ │ │ │ -15 template │ │ │ │ │ -_1_6 struct _G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t { │ │ │ │ │ -17 │ │ │ │ │ -18 template │ │ │ │ │ -_1_9 static void _a_p_p_l_y(const M& A, X& x, Y& d, │ │ │ │ │ -20 const Y& b) │ │ │ │ │ -21 { │ │ │ │ │ -22 typedef typename M::ConstRowIterator RowIterator; │ │ │ │ │ -23 typedef typename M::ConstColIterator ColIterator; │ │ │ │ │ -24 │ │ │ │ │ -25 typename Y::iterator dIter=d.begin(); │ │ │ │ │ -26 typename Y::const_iterator bIter=b.begin(); │ │ │ │ │ -27 typename X::iterator xIter=x.begin(); │ │ │ │ │ -28 │ │ │ │ │ -29 for(RowIterator row=A.begin(), end=A.end(); row != end; │ │ │ │ │ -30 ++row, ++dIter, ++xIter, ++bIter) │ │ │ │ │ -31 { │ │ │ │ │ -32 ColIterator _c_o_l=(*row).begin(); │ │ │ │ │ -33 *dIter = *bIter; │ │ │ │ │ -34 │ │ │ │ │ -35 for (; _c_o_l.index()solve(*xIter,*dIter); │ │ │ │ │ -42 *dIter=0; //as r=v │ │ │ │ │ +14 template │ │ │ │ │ +_1_5 class _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ +16 { │ │ │ │ │ +17 public: │ │ │ │ │ +_1_9 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ +20 │ │ │ │ │ +25 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates); │ │ │ │ │ +26 │ │ │ │ │ +28 operator _V_e_r_t_e_x() const; │ │ │ │ │ +29 │ │ │ │ │ +30 void _o_p_e_r_a_t_o_r_(_)(const typename G::ConstEdgeIterator& edge); │ │ │ │ │ +31 │ │ │ │ │ +32 void _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +33 │ │ │ │ │ +34 protected: │ │ │ │ │ +_3_5 _V_e_r_t_e_x _n_u_m_b_e_r__; │ │ │ │ │ +_3_6 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& _a_g_g_r_e_g_a_t_e_s__; │ │ │ │ │ +37 }; │ │ │ │ │ +38 │ │ │ │ │ +39 template │ │ │ │ │ +_4_0 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& │ │ │ │ │ +aggregates) │ │ │ │ │ +41 : number_(0), aggregates_(aggregates) │ │ │ │ │ +42 {} │ │ │ │ │ 43 │ │ │ │ │ -44 // Update residual for the symmetric case │ │ │ │ │ -45 for(_c_o_l=(*row).begin(); _c_o_l.index()mmv(*xIter, d[_c_o_l.index()]); //d_j-=A_ij x_i │ │ │ │ │ -47 } │ │ │ │ │ +44 template │ │ │ │ │ +_4_5 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r _V_e_r_t_e_x() const │ │ │ │ │ +46 { │ │ │ │ │ +47 return number_; │ │ │ │ │ 48 } │ │ │ │ │ -49 }; │ │ │ │ │ -50 │ │ │ │ │ -51 template │ │ │ │ │ -_5_2 struct _G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t { │ │ │ │ │ -53 │ │ │ │ │ -54 template │ │ │ │ │ -_5_5 static void _a_p_p_l_y(const M& A, X& x, Y& d, │ │ │ │ │ -56 const Y& b) │ │ │ │ │ -57 { │ │ │ │ │ -58 typedef typename M::ConstRowIterator RowIterator; │ │ │ │ │ -59 typedef typename M::ConstColIterator ColIterator; │ │ │ │ │ -60 typedef typename Y::block_type YBlock; │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +_5_1 void _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r_(_)(const typename G::ConstEdgeIterator& │ │ │ │ │ +edge) │ │ │ │ │ +52 { │ │ │ │ │ +53 aggregates_[edge.target()]=number_; │ │ │ │ │ +54 } │ │ │ │ │ +55 │ │ │ │ │ +56 template │ │ │ │ │ +_5_7 void _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_>_:_:_o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +58 { │ │ │ │ │ +59 ++number_; │ │ │ │ │ +60 } │ │ │ │ │ 61 │ │ │ │ │ -62 typename Y::iterator dIter=d.beforeEnd(); │ │ │ │ │ -63 typename X::iterator xIter=x.beforeEnd(); │ │ │ │ │ -64 typename Y::const_iterator bIter=b.beforeEnd(); │ │ │ │ │ -65 │ │ │ │ │ -66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end; │ │ │ │ │ -67 --row, --dIter, --xIter, --bIter) │ │ │ │ │ -68 { │ │ │ │ │ -69 ColIterator endCol=(*row).beforeBegin(); │ │ │ │ │ -70 ColIterator _c_o_l=(*row).beforeEnd(); │ │ │ │ │ -71 *dIter = *bIter; │ │ │ │ │ -72 │ │ │ │ │ -73 for (; _c_o_l.index()>row.index(); --_c_o_l) │ │ │ │ │ -74 (*col).mmv(x[_c_o_l.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j │ │ │ │ │ -75 assert(row.index()==_c_o_l.index()); │ │ │ │ │ -76 ColIterator diag=_c_o_l; │ │ │ │ │ -77 YBlock v=*dIter; │ │ │ │ │ -78 // upper diagonal matrix │ │ │ │ │ -79 for (--_c_o_l; _c_o_l!=endCol; --_c_o_l) │ │ │ │ │ -80 (*col).mmv(x[_c_o_l.index()],v); // v -= sum_{jsolve(*xIter,v); │ │ │ │ │ -84 │ │ │ │ │ -85 *dIter-=v; │ │ │ │ │ -86 │ │ │ │ │ -87 // Update residual for the symmetric case │ │ │ │ │ -88 // Skip residual computation as it is not needed. │ │ │ │ │ -89 //for(col=(*row).begin();col.index() │ │ │ │ │ +_6_3 void _r_e_n_u_m_b_e_r_A_g_g_r_e_g_a_t_e_s(const G& graph, I index, I endIndex, V& visitedMap, │ │ │ │ │ +64 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates) │ │ │ │ │ +65 { │ │ │ │ │ +66 _A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_<_G_> renumberer(aggregates); │ │ │ │ │ +67 │ │ │ │ │ +68 for(I index1=index; index1 != endIndex; ++index1) │ │ │ │ │ +69 if(aggregates[index1.index()]!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_: │ │ │ │ │ +_I_S_O_L_A_T_E_D && │ │ │ │ │ +70 !_g_e_t(visitedMap, index1.index())) { │ │ │ │ │ +71 │ │ │ │ │ +72 aggregates.template breadthFirstSearch(index1.index(), aggregates │ │ │ │ │ +[index1.index()], │ │ │ │ │ +73 graph, renumberer, visitedMap); │ │ │ │ │ +74 aggregates[index1.index()] = renumberer; │ │ │ │ │ +75 ++renumberer; │ │ │ │ │ +76 } │ │ │ │ │ +77 for(; index != endIndex; ++index) │ │ │ │ │ +78 put(visitedMap, index.index(), false); │ │ │ │ │ +79 } │ │ │ │ │ +80 │ │ │ │ │ +81 } // namespace AMG │ │ │ │ │ +82} // namespace Dune │ │ │ │ │ +83#endif │ │ │ │ │ +_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ +Provides classes for the Coloring process of AMG. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t │ │ │ │ │ -DDeeffiinniittiioonn fastamgsmoother.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(const M &A, X &x, Y &d, const Y &b) │ │ │ │ │ -DDeeffiinniittiioonn fastamgsmoother.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t │ │ │ │ │ -DDeeffiinniittiioonn fastamgsmoother.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(const M &A, X &x, Y &d, const Y &b) │ │ │ │ │ -DDeeffiinniittiioonn fastamgsmoother.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_r_e_n_u_m_b_e_r_A_g_g_r_e_g_a_t_e_s │ │ │ │ │ +void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap, │ │ │ │ │ +AggregatesMap< typename G::VertexDescriptor > &aggregates) │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +void operator++() │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_V_e_r_t_e_x │ │ │ │ │ +G::VertexDescriptor Vertex │ │ │ │ │ +The vertex type. │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const typename G::ConstEdgeIterator &edge) │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_a_g_g_r_e_g_a_t_e_s__ │ │ │ │ │ +AggregatesMap< Vertex > & aggregates_ │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r │ │ │ │ │ +AggregateRenumberer(AggregatesMap< Vertex > &aggregates) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_R_e_n_u_m_b_e_r_e_r_:_:_n_u_m_b_e_r__ │ │ │ │ │ +Vertex number_ │ │ │ │ │ +DDeeffiinniittiioonn renumberer.hh:35 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00107.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: aggregates.hh File Reference │ │ │ │ +dune-istl: galerkin.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,110 +71,67 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides classes for the Coloring process of AMG. │ │ │ │ +

Provides a class for building the galerkin product based on a aggregation scheme. │ │ │ │ More...

│ │ │ │ -
#include "parameters.hh"
│ │ │ │ -#include "graph.hh"
│ │ │ │ -#include "properties.hh"
│ │ │ │ -#include "combinedfunctor.hh"
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ +
#include "aggregates.hh"
│ │ │ │ +#include "pinfo.hh"
│ │ │ │ #include <dune/common/poolallocator.hh>
│ │ │ │ -#include <dune/common/sllist.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <utility>
│ │ │ │ +#include <dune/common/enumset.hh>
│ │ │ │ #include <set>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <complex>
│ │ │ │ #include <limits>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <tuple>
│ │ │ │ +#include <algorithm>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::AggregationCriterion< T >
 Base class of all aggregation criterions. More...
 
class  Dune::Amg::SymmetricMatrixDependency< M, N >
 Dependency policy for symmetric matrices. More...
 
class  Dune::Amg::Dependency< M, N >
 Dependency policy for symmetric matrices. More...
struct  Dune::Amg::OverlapVertex< T >
 
class  Dune::Amg::SymmetricDependency< M, N >
 Dependency policy for symmetric matrices. More...
class  Dune::Amg::SparsityBuilder< M >
 Functor for building the sparsity pattern of the matrix using examineConnectivity. More...
 
class  Dune::Amg::Diagonal< N >
 Norm that uses only the [N][N] entry of the block to determine couplings. More...
class  Dune::Amg::BaseGalerkinProduct
 
class  Dune::Amg::FirstDiagonal
 Norm that uses only the [0][0] entry of the block to determine couplings. More...
class  Dune::Amg::GalerkinProduct< T >
 
struct  Dune::Amg::RowSum
 Functor using the row sum (infinity) norm to determine strong couplings. More...
class  Dune::Amg::GalerkinProduct< SequentialInformation >
 
struct  Dune::Amg::FrobeniusNorm
struct  Dune::Amg::BaseConnectivityConstructor
 
struct  Dune::Amg::AlwaysOneNorm
class  Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder< G, S, V >
 Visitor for identifying connected aggregates during a breadthFirstSearch. More...
 
class  Dune::Amg::SymmetricCriterion< M, Norm >
 Criterion taking advantage of symmetric matrices. More...
struct  Dune::Amg::ConnectivityConstructor< G, T >
 
class  Dune::Amg::UnSymmetricCriterion< M, Norm >
 Criterion suitable for unsymmetric matrices. More...
struct  Dune::Amg::ConnectivityConstructor< G, SequentialInformation >
 
class  Dune::Amg::AggregatesMap< V >
 Class providing information about the mapping of the vertices onto aggregates. More...
struct  Dune::Amg::DirichletBoundarySetter< T >
 
class  Dune::Amg::AggregatesMap< V >::DummyEdgeVisitor
 A Dummy visitor that does nothing for each visited edge. More...
 
class  Dune::Amg::Aggregate< G, S >
 A class for temporarily storing the vertices of an aggregate in. More...
 
class  Dune::Amg::Aggregator< G >
 Class for building the aggregates. More...
struct  Dune::Amg::DirichletBoundarySetter< SequentialInformation >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class T >
std::ostream & Dune::Amg::operator<< (std::ostream &os, const AggregationCriterion< T > &criterion)
 
template<class G , class C >
void Dune::Amg::buildDependency (G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
 Build the dependency of the matrix graph.
 
template<class V >
void Dune::Amg::printAggregates2d (const AggregatesMap< V > &aggregates, int n, int m, std::ostream &os)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides classes for the Coloring process of AMG.

│ │ │ │ +

Provides a class for building the galerkin product based on a aggregation scheme.

│ │ │ │
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,104 +1,60 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_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 │ │ │ │ │ -aggregates.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +galerkin.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides classes for the Coloring process of AMG. _M_o_r_e_._._. │ │ │ │ │ -#include "_p_a_r_a_m_e_t_e_r_s_._h_h" │ │ │ │ │ -#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ -#include "_c_o_m_b_i_n_e_d_f_u_n_c_t_o_r_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Provides a class for building the galerkin product based on a aggregation │ │ │ │ │ +scheme. _M_o_r_e_._._. │ │ │ │ │ +#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +#include "_p_i_n_f_o_._h_h" │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#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_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_<_ _T_ _> │ │ │ │ │ -  Base class of all aggregation criterions. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_ _M_,_ _N_ _> │ │ │ │ │ -  _D_e_p_e_n_d_e_n_c_y policy for symmetric matrices. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_<_ _M_,_ _N_ _> │ │ │ │ │ -  _D_e_p_e_n_d_e_n_c_y policy for symmetric matrices. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_ _M_,_ _N_ _> │ │ │ │ │ -  _D_e_p_e_n_d_e_n_c_y policy for symmetric matrices. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_ _M_ _> │ │ │ │ │ +  Functor for building the sparsity pattern of the matrix using │ │ │ │ │ + examineConnectivity. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_<_ _N_ _> │ │ │ │ │ -  Norm that uses only the [N][N] entry of the block to determine │ │ │ │ │ - couplings. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_F_i_r_s_t_D_i_a_g_o_n_a_l │ │ │ │ │ -  Norm that uses only the [0][0] entry of the block to determine │ │ │ │ │ - couplings. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m │ │ │ │ │ -  Functor using the row sum (infinity) norm to determine strong │ │ │ │ │ - couplings. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_ _G_,_ _S_,_ _V_ _> │ │ │ │ │ +  Visitor for identifying connected aggregates during a │ │ │ │ │ + breadthFirstSearch. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_ _M_,_ _N_o_r_m_ _> │ │ │ │ │ -  Criterion taking advantage of symmetric matrices. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_ _G_,_ _T_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_ _M_,_ _N_o_r_m_ _> │ │ │ │ │ -  Criterion suitable for unsymmetric matrices. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_ _G_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _V_ _> │ │ │ │ │ -  Class providing information about the mapping of the vertices onto │ │ │ │ │ - aggregates. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _V_ _>_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ -  A Dummy visitor that does nothing for each visited edge. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_<_ _G_,_ _S_ _> │ │ │ │ │ -  A class for temporarily storing the vertices of an aggregate in. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_<_ _G_ _> │ │ │ │ │ -  Class for building the aggregates. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &os, const │ │ │ │ │ - _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n< T > &criterion) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_A_m_g_:_:_b_u_i_l_d_D_e_p_e_n_d_e_n_c_y (G &graph, const typename C::Matrix │ │ │ │ │ - &matrix, C criterion, bool finestLevel) │ │ │ │ │ -  Build the dependency of the matrix graph. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_A_m_g_:_:_p_r_i_n_t_A_g_g_r_e_g_a_t_e_s_2_d (const _A_g_g_r_e_g_a_t_e_s_M_a_p< V > │ │ │ │ │ - &aggregates, int n, int m, std::ostream &os) │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides classes for the Coloring process of AMG. │ │ │ │ │ +Provides a class for building the galerkin product based on a aggregation │ │ │ │ │ +scheme. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: aggregates.hh Source File │ │ │ │ +dune-istl: galerkin.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,2255 +74,738 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
aggregates.hh
│ │ │ │ +
galerkin.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_AGGREGATES_HH
│ │ │ │ -
6#define DUNE_AMG_AGGREGATES_HH
│ │ │ │ +
5#ifndef DUNE_GALERKIN_HH
│ │ │ │ +
6#define DUNE_GALERKIN_HH
│ │ │ │
7
│ │ │ │ -
8
│ │ │ │ -
9#include "parameters.hh"
│ │ │ │ -
10#include "graph.hh"
│ │ │ │ -
11#include "properties.hh"
│ │ │ │ -
12#include "combinedfunctor.hh"
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/timer.hh>
│ │ │ │ -
15#include <dune/common/stdstreams.hh>
│ │ │ │ -
16#include <dune/common/poolallocator.hh>
│ │ │ │ -
17#include <dune/common/sllist.hh>
│ │ │ │ -
18#include <dune/common/ftraits.hh>
│ │ │ │ -
19#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -
20
│ │ │ │ -
21#include <utility>
│ │ │ │ -
22#include <set>
│ │ │ │ -
23#include <algorithm>
│ │ │ │ -
24#include <complex>
│ │ │ │ -
25#include <limits>
│ │ │ │ -
26#include <ostream>
│ │ │ │ -
27#include <tuple>
│ │ │ │ -
28
│ │ │ │ -
29namespace Dune
│ │ │ │ -
30{
│ │ │ │ -
31 namespace Amg
│ │ │ │ -
32 {
│ │ │ │ -
33
│ │ │ │ -
47 template<class T>
│ │ │ │ -
│ │ │ │ -
48 class AggregationCriterion : public T
│ │ │ │ -
49 {
│ │ │ │ -
50
│ │ │ │ -
51 public:
│ │ │ │ - │ │ │ │ +
8#include "aggregates.hh"
│ │ │ │ +
9#include "pinfo.hh"
│ │ │ │ +
10#include <dune/common/poolallocator.hh>
│ │ │ │ +
11#include <dune/common/enumset.hh>
│ │ │ │ +
12#include <set>
│ │ │ │ +
13#include <limits>
│ │ │ │ +
14#include <algorithm>
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
18 namespace Amg
│ │ │ │ +
19 {
│ │ │ │ +
31 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
33 {
│ │ │ │ +
37 typedef T Aggregate;
│ │ │ │ +
38
│ │ │ │ +
42 typedef T Vertex;
│ │ │ │ +
43
│ │ │ │ + │ │ │ │ +
48
│ │ │ │ + │ │ │ │ +
53 };
│ │ │ │ +
│ │ │ │ +
54
│ │ │ │ +
55
│ │ │ │
56
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
67 : T()
│ │ │ │ -
68 {}
│ │ │ │ -
│ │ │ │ -
69
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
71 : T(parms)
│ │ │ │ -
72 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
82 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
│ │ │ │ -
83 {
│ │ │ │ -
84 this->setMaxDistance(diameter-1);
│ │ │ │ -
85 std::size_t csize=1;
│ │ │ │ -
86
│ │ │ │ -
87 for(; dim>0; dim--) {
│ │ │ │ -
88 csize*=diameter;
│ │ │ │ -
89 this->setMaxDistance(this->maxDistance()+diameter-1);
│ │ │ │ -
90 }
│ │ │ │ -
91 this->setMinAggregateSize(csize);
│ │ │ │ -
92 this->setMaxAggregateSize(static_cast<std::size_t>(csize*1.5));
│ │ │ │ -
93 }
│ │ │ │ -
│ │ │ │ -
94
│ │ │ │ -
│ │ │ │ -
105 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
│ │ │ │ -
106 {
│ │ │ │ -
107 setDefaultValuesIsotropic(dim, diameter);
│ │ │ │ -
108 this->setMaxDistance(this->maxDistance()+dim-1);
│ │ │ │ -
109 }
│ │ │ │ -
│ │ │ │ -
110 };
│ │ │ │ -
│ │ │ │ -
111
│ │ │ │ -
112 template<class T>
│ │ │ │ -
│ │ │ │ -
113 std::ostream& operator<<(std::ostream& os, const AggregationCriterion<T>& criterion)
│ │ │ │ -
114 {
│ │ │ │ -
115 os<<"{ maxdistance="<<criterion.maxDistance()<<" minAggregateSize="
│ │ │ │ -
116 <<criterion.minAggregateSize()<< " maxAggregateSize="<<criterion.maxAggregateSize()
│ │ │ │ -
117 <<" connectivity="<<criterion.maxConnectivity()<<" debugLevel="<<criterion.debugLevel()<<"}";
│ │ │ │ -
118 return os;
│ │ │ │ -
119 }
│ │ │ │ -
│ │ │ │ -
120
│ │ │ │ -
132 template<class M, class N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
134 {
│ │ │ │ -
135 public:
│ │ │ │ -
139 typedef M Matrix;
│ │ │ │ -
140
│ │ │ │ -
144 typedef N Norm;
│ │ │ │ -
145
│ │ │ │ -
149 typedef typename Matrix::row_type Row;
│ │ │ │ -
150
│ │ │ │ - │ │ │ │ -
155
│ │ │ │ -
156 void init(const Matrix* matrix);
│ │ │ │ -
157
│ │ │ │ -
158 void initRow(const Row& row, int index);
│ │ │ │ -
159
│ │ │ │ -
160 void examine(const ColIter& col);
│ │ │ │ -
161
│ │ │ │ -
162 template<class G>
│ │ │ │ -
163 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
│ │ │ │ -
164
│ │ │ │ -
165 bool isIsolated();
│ │ │ │ -
166
│ │ │ │ -
167
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
169 : Parameters(parms)
│ │ │ │ -
170 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
172 : Parameters()
│ │ │ │ -
173 {}
│ │ │ │ -
│ │ │ │ -
174
│ │ │ │ -
175 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
180 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
185 int row_;
│ │ │ │ - │ │ │ │ -
188 std::vector<real_type> vals_;
│ │ │ │ -
189 typename std::vector<real_type>::iterator valIter_;
│ │ │ │ -
190
│ │ │ │ -
191 };
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
193
│ │ │ │ -
194 template<class M, class N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
196 {
│ │ │ │ -
197 matrix_ = matrix;
│ │ │ │ -
198 }
│ │ │ │ +
61 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
63 {
│ │ │ │ +
64 public:
│ │ │ │ +
70 SparsityBuilder(M& matrix);
│ │ │ │ +
71
│ │ │ │ +
72 void insert(const typename M::size_type& index);
│ │ │ │ +
73
│ │ │ │ +
74 void operator++();
│ │ │ │ +
75
│ │ │ │ +
76 std::size_t minRowSize();
│ │ │ │ +
77
│ │ │ │ +
78 std::size_t maxRowSize();
│ │ │ │ +
79
│ │ │ │ +
80 std::size_t sumRowSize();
│ │ │ │ +
│ │ │ │ +
81 std::size_t index()
│ │ │ │ +
82 {
│ │ │ │ +
83 return row_.index();
│ │ │ │ +
84 }
│ │ │ │ +
│ │ │ │ +
85 private:
│ │ │ │ +
87 typename M::CreateIterator row_;
│ │ │ │ +
89 std::size_t minRowSize_;
│ │ │ │ +
91 std::size_t maxRowSize_;
│ │ │ │ +
92 std::size_t sumRowSize_;
│ │ │ │ +
93#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
94 bool diagonalInserted;
│ │ │ │ +
95#endif
│ │ │ │ +
96 };
│ │ │ │ +
│ │ │ │ +
97
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
99 {
│ │ │ │ +
100 public:
│ │ │ │ +
109 template<class M, class V, class I, class O>
│ │ │ │ +
110 void calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
│ │ │ │ +
111 const I& pinfo, const O& copy);
│ │ │ │ +
112
│ │ │ │ +
113 };
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │ +
115 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 : public BaseGalerkinProduct
│ │ │ │ +
118 {
│ │ │ │ +
119 public:
│ │ │ │ + │ │ │ │ +
121
│ │ │ │ +
131 template<class G, class V, class Set>
│ │ │ │ +
132 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
│ │ │ │ +
133 const ParallelInformation& pinfo,
│ │ │ │ + │ │ │ │ +
135 const typename G::Matrix::size_type& size,
│ │ │ │ +
136 const Set& copy);
│ │ │ │ +
137 private:
│ │ │ │ +
138
│ │ │ │ +
145 template<class G, class I, class Set>
│ │ │ │ + │ │ │ │ +
147 buildOverlapVertices(const G& graph, const I& pinfo,
│ │ │ │ + │ │ │ │ +
149 const Set& overlap,
│ │ │ │ +
150 std::size_t& overlapCount);
│ │ │ │ +
151
│ │ │ │ +
152 template<class A>
│ │ │ │ +
153 struct OVLess
│ │ │ │ +
154 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 {
│ │ │ │ +
157 return *o1.aggregate < *o2.aggregate;
│ │ │ │ +
158 }
│ │ │ │
│ │ │ │ -
199
│ │ │ │ -
200 template<class M, class N>
│ │ │ │ -
│ │ │ │ -
201 inline void SymmetricMatrixDependency<M,N>::initRow(const Row& row, int index)
│ │ │ │ -
202 {
│ │ │ │ -
203 using std::min;
│ │ │ │ -
204 vals_.assign(row.size(), 0.0);
│ │ │ │ -
205 assert(vals_.size()==row.size());
│ │ │ │ -
206 valIter_=vals_.begin();
│ │ │ │ -
207
│ │ │ │ -
208 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
│ │ │ │ -
209 diagonal_=norm_(row[index]);
│ │ │ │ -
210 row_ = index;
│ │ │ │ -
211 }
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213 template<class M, class N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
215 {
│ │ │ │ -
216 using std::max;
│ │ │ │ -
217 // skip positive offdiagonals if norm preserves sign of them.
│ │ │ │ -
218 real_type eij = norm_(*col);
│ │ │ │ -
219 if(!N::is_sign_preserving || eij<0) // || eji<0)
│ │ │ │ -
220 {
│ │ │ │ -
221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](col.index())[col.index()]);
│ │ │ │ -
222 maxValue_ = max(maxValue_, *valIter_);
│ │ │ │ -
223 }else
│ │ │ │ -
224 *valIter_ =0;
│ │ │ │ -
225 ++valIter_;
│ │ │ │ -
226 }
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
228 template<class M, class N>
│ │ │ │ -
229 template<class G>
│ │ │ │ -
│ │ │ │ -
230 inline void SymmetricMatrixDependency<M,N>::examine(G&, const typename G::EdgeIterator& edge, const ColIter&)
│ │ │ │ -
231 {
│ │ │ │ -
232 if(*valIter_ > alpha() * maxValue_) {
│ │ │ │ -
233 edge.properties().setDepends();
│ │ │ │ -
234 edge.properties().setInfluences();
│ │ │ │ -
235 }
│ │ │ │ -
236 ++valIter_;
│ │ │ │ -
237 }
│ │ │ │ -
│ │ │ │ -
238
│ │ │ │ -
239 template<class M, class N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
241 {
│ │ │ │ -
242 if(diagonal_==0)
│ │ │ │ -
243 DUNE_THROW(Dune::ISTLError, "No diagonal entry for row "<<row_<<".");
│ │ │ │ -
244 valIter_=vals_.begin();
│ │ │ │ -
245 return maxValue_ < beta();
│ │ │ │ -
246 }
│ │ │ │ +
159 };
│ │ │ │ +
160 };
│ │ │ │
│ │ │ │ +
161
│ │ │ │ +
162 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
164 : public BaseGalerkinProduct
│ │ │ │ +
165 {
│ │ │ │ +
166 public:
│ │ │ │ +
176 template<class G, class V, class Set>
│ │ │ │ +
177 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
│ │ │ │ +
178 const SequentialInformation& pinfo,
│ │ │ │ + │ │ │ │ +
180 const typename G::Matrix::size_type& size,
│ │ │ │ +
181 const Set& copy);
│ │ │ │ +
182 };
│ │ │ │ +
│ │ │ │ +
183
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
185 {
│ │ │ │ +
186 template<class R, class G, class V>
│ │ │ │ +
187 static void constructOverlapConnectivity(R& row, G& graph, V& visitedMap,
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
191
│ │ │ │ +
195 template<class R, class G, class V>
│ │ │ │ +
196 static void constructNonOverlapConnectivity(R& row, G& graph, V& visitedMap,
│ │ │ │ + │ │ │ │ +
198 const typename G::VertexDescriptor& seed);
│ │ │ │ +
199
│ │ │ │ +
200
│ │ │ │ +
204 template<class G, class S, class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
206 {
│ │ │ │ +
207 public:
│ │ │ │ +
211 typedef G Graph;
│ │ │ │ +
215 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
│ │ │ │ +
216
│ │ │ │ +
220 typedef S Set;
│ │ │ │ +
221
│ │ │ │ +
225 typedef V VisitedMap;
│ │ │ │ +
226
│ │ │ │ +
230 typedef typename Graph::VertexDescriptor Vertex;
│ │ │ │ +
231
│ │ │ │ +
239 ConnectedBuilder(const AggregatesMap<Vertex>& aggregates, Graph& graph,
│ │ │ │ +
240 VisitedMap& visitedMap, Set& connected);
│ │ │ │ +
241
│ │ │ │ +
246 void operator()(const ConstEdgeIterator& edge);
│ │ │ │
247
│ │ │ │ -
251 template<class M, class N>
│ │ │ │ -
│ │ │ │ -
252 class Dependency : public Parameters
│ │ │ │ -
253 {
│ │ │ │ -
254 public:
│ │ │ │ -
258 typedef M Matrix;
│ │ │ │ -
259
│ │ │ │ -
263 typedef N Norm;
│ │ │ │ -
264
│ │ │ │ -
268 typedef typename Matrix::row_type Row;
│ │ │ │ -
269
│ │ │ │ - │ │ │ │ -
274
│ │ │ │ -
275 void init(const Matrix* matrix);
│ │ │ │ -
276
│ │ │ │ -
277 void initRow(const Row& row, int index);
│ │ │ │ -
278
│ │ │ │ -
279 void examine(const ColIter& col);
│ │ │ │ -
280
│ │ │ │ -
281 template<class G>
│ │ │ │ -
282 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
│ │ │ │ -
283
│ │ │ │ - │ │ │ │ -
285
│ │ │ │ -
│ │ │ │ -
286 Dependency(const Parameters& parms)
│ │ │ │ -
287 : Parameters(parms)
│ │ │ │ -
288 {}
│ │ │ │ -
│ │ │ │ +
248 private:
│ │ │ │ +
252 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ +
253
│ │ │ │ +
254 Graph& graph_;
│ │ │ │ +
255
│ │ │ │ +
259 VisitedMap& visitedMap_;
│ │ │ │ +
260
│ │ │ │ +
264 Set& connected_;
│ │ │ │ +
265 };
│ │ │ │ +
│ │ │ │ +
266
│ │ │ │ +
267 };
│ │ │ │ +
│ │ │ │ +
268
│ │ │ │ +
269 template<class G, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
271 {
│ │ │ │ +
272 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
273
│ │ │ │ +
274 template<class V, class O, class R>
│ │ │ │ +
275 static void examine(G& graph,
│ │ │ │ +
276 V& visitedMap,
│ │ │ │ +
277 const T& pinfo,
│ │ │ │ +
278 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
279 const O& overlap,
│ │ │ │ +
280 const OverlapVertex<Vertex>* overlapVertices,
│ │ │ │ +
281 const OverlapVertex<Vertex>* overlapEnd,
│ │ │ │ +
282 R& row);
│ │ │ │ +
283 };
│ │ │ │ +
│ │ │ │ +
284
│ │ │ │ +
285 template<class G>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
287 {
│ │ │ │ +
288 typedef typename G::VertexDescriptor Vertex;
│ │ │ │
289
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
291 : Parameters()
│ │ │ │ -
292 {}
│ │ │ │ -
│ │ │ │ -
293
│ │ │ │ -
294 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
299 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
304 int row_;
│ │ │ │ - │ │ │ │ -
307 };
│ │ │ │ -
│ │ │ │ -
308
│ │ │ │ -
312 template<class M, class N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
314 {
│ │ │ │ -
315 public:
│ │ │ │ -
319 typedef M Matrix;
│ │ │ │ -
320
│ │ │ │ -
324 typedef N Norm;
│ │ │ │ -
325
│ │ │ │ -
329 typedef typename Matrix::row_type Row;
│ │ │ │ -
330
│ │ │ │ - │ │ │ │ -
335
│ │ │ │ -
336 void init(const Matrix* matrix);
│ │ │ │ -
337
│ │ │ │ -
338 void initRow(const Row& row, int index);
│ │ │ │ -
339
│ │ │ │ -
340 void examine(const ColIter& col);
│ │ │ │ -
341
│ │ │ │ -
342 template<class G>
│ │ │ │ -
343 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
│ │ │ │ -
344
│ │ │ │ - │ │ │ │ -
346
│ │ │ │ -
347
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
349 : Parameters(parms)
│ │ │ │ -
350 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
352 : Parameters()
│ │ │ │ -
353 {}
│ │ │ │ -
│ │ │ │ -
354
│ │ │ │ -
355 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
360 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
365 int row_;
│ │ │ │ - │ │ │ │ -
368 private:
│ │ │ │ -
369 void initRow(const Row& row, int index, const std::true_type&);
│ │ │ │ -
370 void initRow(const Row& row, int index, const std::false_type&);
│ │ │ │ -
371 };
│ │ │ │ -
│ │ │ │ -
372
│ │ │ │ -
377 template<int N>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
379 {
│ │ │ │ -
380 public:
│ │ │ │ -
381 enum { /* @brief We preserve the sign.*/
│ │ │ │ -
382 is_sign_preserving = true
│ │ │ │ -
383 };
│ │ │ │ +
290 template<class V, class R>
│ │ │ │ +
291 static void examine(G& graph,
│ │ │ │ +
292 V& visitedMap,
│ │ │ │ +
293 const SequentialInformation& pinfo,
│ │ │ │ +
294 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
295 R& row);
│ │ │ │ +
296 };
│ │ │ │ +
│ │ │ │ +
297
│ │ │ │ +
298 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
300 {
│ │ │ │ +
301 template<class M, class O>
│ │ │ │ +
302 static void set(M& coarse, const T& pinfo, const O& copy);
│ │ │ │ +
303 };
│ │ │ │ +
│ │ │ │ +
304
│ │ │ │ +
305 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
307 {
│ │ │ │ +
308 template<class M, class O>
│ │ │ │ +
309 static void set(M& coarse, const SequentialInformation& pinfo, const O& copy);
│ │ │ │ +
310 };
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
312 template<class R, class G, class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
315 const typename G::VertexDescriptor& seed)
│ │ │ │ +
316 {
│ │ │ │ +
317 assert(row.index()==aggregates[seed]);
│ │ │ │ +
318 row.insert(aggregates[seed]);
│ │ │ │ +
319 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
│ │ │ │ +
320 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
321 typedef std::allocator<Vertex> Allocator;
│ │ │ │ +
322 typedef SLList<Vertex,Allocator> VertexList;
│ │ │ │ +
323 typedef typename AggregatesMap<Vertex>::DummyEdgeVisitor DummyVisitor;
│ │ │ │ +
324 VertexList vlist;
│ │ │ │ +
325 DummyVisitor dummy;
│ │ │ │ +
326 aggregates.template breadthFirstSearch<true,false>(seed,aggregates[seed], graph, vlist, dummy,
│ │ │ │ +
327 conBuilder, visitedMap);
│ │ │ │ +
328 }
│ │ │ │ +
│ │ │ │ +
329
│ │ │ │ +
330 template<class R, class G, class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
335 {
│ │ │ │ +
336 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
│ │ │ │ +
337 const typename G::VertexDescriptor aggregate=*seed->aggregate;
│ │ │ │ +
338
│ │ │ │ +
339 if (row.index()==*seed->aggregate) {
│ │ │ │ +
340 while(seed != overlapEnd && aggregate == *seed->aggregate) {
│ │ │ │ +
341 row.insert(*seed->aggregate);
│ │ │ │ +
342 // Walk over all neighbours and add them to the connected array.
│ │ │ │ +
343 visitNeighbours(graph, seed->vertex, conBuilder);
│ │ │ │ +
344 // Mark vertex as visited
│ │ │ │ +
345 put(visitedMap, seed->vertex, true);
│ │ │ │ +
346 ++seed;
│ │ │ │ +
347 }
│ │ │ │ +
348 }
│ │ │ │ +
349 }
│ │ │ │ +
│ │ │ │ +
350
│ │ │ │ +
351 template<class G, class S, class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
353 Graph& graph, VisitedMap& visitedMap,
│ │ │ │ +
354 Set& connected)
│ │ │ │ +
355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap), connected_(connected)
│ │ │ │ +
356 {}
│ │ │ │ +
│ │ │ │ +
357
│ │ │ │ +
358 template<class G, class S, class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
360 {
│ │ │ │ +
361 const Vertex& vertex = aggregates_[edge.target()];
│ │ │ │ + │ │ │ │ + │ │ │ │ +
364 connected_.insert(vertex);
│ │ │ │ +
365 }
│ │ │ │ +
│ │ │ │ +
366
│ │ │ │ +
367 template<class T>
│ │ │ │ +
368 template<class G, class I, class Set>
│ │ │ │ + │ │ │ │ +
370 GalerkinProduct<T>::buildOverlapVertices(const G& graph, const I& pinfo,
│ │ │ │ + │ │ │ │ +
372 const Set& overlap,
│ │ │ │ +
373 std::size_t& overlapCount)
│ │ │ │ +
374 {
│ │ │ │ +
375 // count the overlap vertices.
│ │ │ │ +
376 typedef typename G::ConstVertexIterator ConstIterator;
│ │ │ │ +
377 typedef typename I::GlobalLookupIndexSet GlobalLookup;
│ │ │ │ +
378 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ +
379
│ │ │ │ +
380 const ConstIterator end = graph.end();
│ │ │ │ +
381 overlapCount = 0;
│ │ │ │ +
382
│ │ │ │ +
383 const GlobalLookup& lookup=pinfo.globalLookup();
│ │ │ │
384
│ │ │ │ -
389 template<class M>
│ │ │ │ -
│ │ │ │ -
390 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m,
│ │ │ │ -
391 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr) const
│ │ │ │ -
392 {
│ │ │ │ -
393 typedef typename M::field_type field_type;
│ │ │ │ -
394 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ -
395 static_assert( std::is_convertible<field_type, real_type >::value,
│ │ │ │ -
396 "use of diagonal norm in AMG not implemented for complex field_type");
│ │ │ │ -
397 return m[N][N];
│ │ │ │ -
398 // possible implementation for complex types: return signed_abs(m[N][N]);
│ │ │ │ -
399 }
│ │ │ │ -
│ │ │ │ -
400
│ │ │ │ -
405 template<class M>
│ │ │ │ -
│ │ │ │ -
406 auto operator()(const M& m,
│ │ │ │ -
407 typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr) const
│ │ │ │ -
408 {
│ │ │ │ -
409 typedef typename FieldTraits<M>::real_type real_type;
│ │ │ │ -
410 static_assert( std::is_convertible<M, real_type >::value,
│ │ │ │ -
411 "use of diagonal norm in AMG not implemented for complex field_type");
│ │ │ │ -
412 return m;
│ │ │ │ -
413 // possible implementation for complex types: return signed_abs(m[N][N]);
│ │ │ │ -
414 }
│ │ │ │ -
│ │ │ │ -
415
│ │ │ │ -
416 private:
│ │ │ │ +
385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
│ │ │ │ +
386 const IndexPair* pair = lookup.pair(*vertex);
│ │ │ │ +
387
│ │ │ │ +
388 if(pair!=0 && overlap.contains(pair->local().attribute()))
│ │ │ │ +
389 ++overlapCount;
│ │ │ │ +
390 }
│ │ │ │ +
391 // Allocate space
│ │ │ │ +
392 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ +
393
│ │ │ │ +
394 OverlapVertex<Vertex>* overlapVertices = new OverlapVertex<Vertex>[overlapCount=0 ? 1 : overlapCount];
│ │ │ │ +
395 if(overlapCount==0)
│ │ │ │ +
396 return overlapVertices;
│ │ │ │ +
397
│ │ │ │ +
398 // Initialize them
│ │ │ │ +
399 overlapCount=0;
│ │ │ │ +
400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
│ │ │ │ +
401 const IndexPair* pair = lookup.pair(*vertex);
│ │ │ │ +
402
│ │ │ │ +
403 if(pair!=0 && overlap.contains(pair->local().attribute())) {
│ │ │ │ +
404 overlapVertices[overlapCount].aggregate = &aggregates[pair->local()];
│ │ │ │ +
405 overlapVertices[overlapCount].vertex = pair->local();
│ │ │ │ +
406 ++overlapCount;
│ │ │ │ +
407 }
│ │ │ │ +
408 }
│ │ │ │ +
409
│ │ │ │ +
410 dverb << overlapCount<<" overlap vertices"<<std::endl;
│ │ │ │ +
411
│ │ │ │ +
412 std::sort(overlapVertices, overlapVertices+overlapCount, OVLess<Vertex>());
│ │ │ │ +
413 // due to the sorting the isolated aggregates (to be skipped) are at the end.
│ │ │ │ +
414
│ │ │ │ +
415 return overlapVertices;
│ │ │ │ +
416 }
│ │ │ │
417
│ │ │ │ -
419 template<typename T>
│ │ │ │ -
420 static T signed_abs(const T & v)
│ │ │ │ -
421 {
│ │ │ │ -
422 return v;
│ │ │ │ -
423 }
│ │ │ │ -
424
│ │ │ │ -
426 template<typename T>
│ │ │ │ -
427 static T signed_abs(const std::complex<T> & v)
│ │ │ │ -
428 {
│ │ │ │ -
429 // return sign * abs_value
│ │ │ │ -
430 // in case of complex numbers this extends to using the csgn function to determine the sign
│ │ │ │ -
431 return csgn(v) * std::abs(v);
│ │ │ │ -
432 }
│ │ │ │ +
418 template<class G, class T>
│ │ │ │ +
419 template<class V, class O, class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
421 V& visitedMap,
│ │ │ │ +
422 const T& pinfo,
│ │ │ │ +
423 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
424 const O& overlap,
│ │ │ │ +
425 const OverlapVertex<Vertex>* overlapVertices,
│ │ │ │ +
426 const OverlapVertex<Vertex>* overlapEnd,
│ │ │ │ +
427 R& row)
│ │ │ │ +
428 {
│ │ │ │ +
429 typedef typename T::GlobalLookupIndexSet GlobalLookup;
│ │ │ │ +
430 const GlobalLookup& lookup = pinfo.globalLookup();
│ │ │ │ +
431
│ │ │ │ +
432 typedef typename G::VertexIterator VertexIterator;
│ │ │ │
433
│ │ │ │ -
435 template<typename T>
│ │ │ │ -
436 static T csgn(const T & v)
│ │ │ │ -
437 {
│ │ │ │ -
438 return (T(0) < v) - (v < T(0));
│ │ │ │ -
439 }
│ │ │ │ -
440
│ │ │ │ -
442 template<typename T>
│ │ │ │ -
443 static T csgn(std::complex<T> a)
│ │ │ │ -
444 {
│ │ │ │ -
445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag());
│ │ │ │ -
446 }
│ │ │ │ -
447
│ │ │ │ -
448 };
│ │ │ │ -
│ │ │ │ -
449
│ │ │ │ -
│ │ │ │ -
454 class FirstDiagonal : public Diagonal<0>
│ │ │ │ -
455 {};
│ │ │ │ -
│ │ │ │ -
456
│ │ │ │ -
│ │ │ │ -
462 struct RowSum
│ │ │ │ -
463 {
│ │ │ │ -
464
│ │ │ │ -
465 enum { /* @brief We preserve the sign.*/
│ │ │ │ -
466 is_sign_preserving = false
│ │ │ │ -
467 };
│ │ │ │ -
472 template<class M>
│ │ │ │ -
│ │ │ │ -
473 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
│ │ │ │ -
474 {
│ │ │ │ -
475 return m.infinity_norm();
│ │ │ │ -
476 }
│ │ │ │ -
│ │ │ │ -
477 };
│ │ │ │ -
│ │ │ │ -
478
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
480 {
│ │ │ │ -
481
│ │ │ │ -
482 enum { /* @brief We preserve the sign.*/
│ │ │ │ -
483 is_sign_preserving = false
│ │ │ │ -
484 };
│ │ │ │ -
489 template<class M>
│ │ │ │ -
│ │ │ │ -
490 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
│ │ │ │ -
491 {
│ │ │ │ -
492 return m.frobenius_norm();
│ │ │ │ -
493 }
│ │ │ │ -
│ │ │ │ -
494 };
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
496 {
│ │ │ │ -
497
│ │ │ │ -
498 enum { /* @brief We preserve the sign.*/
│ │ │ │ -
499 is_sign_preserving = false
│ │ │ │ -
500 };
│ │ │ │ -
505 template<class M>
│ │ │ │ -
│ │ │ │ -
506 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
│ │ │ │ -
507 {
│ │ │ │ -
508 return 1;
│ │ │ │ -
509 }
│ │ │ │ -
│ │ │ │ -
510 };
│ │ │ │ -
│ │ │ │ -
517 template<class M, class Norm>
│ │ │ │ -
│ │ │ │ -
518 class SymmetricCriterion : public AggregationCriterion<SymmetricDependency<M,Norm> >
│ │ │ │ -
519 {
│ │ │ │ -
520 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
523 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
525 {}
│ │ │ │ -
│ │ │ │ -
526 };
│ │ │ │ -
│ │ │ │ -
527
│ │ │ │ -
528
│ │ │ │ -
537 template<class M, class Norm>
│ │ │ │ -
│ │ │ │ -
538 class UnSymmetricCriterion : public AggregationCriterion<Dependency<M,Norm> >
│ │ │ │ -
539 {
│ │ │ │ -
540 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
543 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
545 {}
│ │ │ │ -
│ │ │ │ -
546 };
│ │ │ │ -
│ │ │ │ -
547 // forward declaration
│ │ │ │ -
548 template<class G> class Aggregator;
│ │ │ │ -
549
│ │ │ │ +
434 VertexIterator vend=graph.end();
│ │ │ │ +
435
│ │ │ │ +
436#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
437 std::set<Vertex> examined;
│ │ │ │ +
438#endif
│ │ │ │ +
439
│ │ │ │ +
440 // The aggregates owned by the process have lower local indices
│ │ │ │ +
441 // then those not owned. We process them in the first pass.
│ │ │ │ +
442 // They represent the rows 0, 1, ..., n of the coarse matrix
│ │ │ │ +
443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex)
│ │ │ │ +
444 if(!get(visitedMap, *vertex)) {
│ │ │ │ +
445 // In the first pass we only process owner nodes
│ │ │ │ +
446 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ +
447 const IndexPair* pair = lookup.pair(*vertex);
│ │ │ │ +
448 if(pair==0 || !overlap.contains(pair->local().attribute())) {
│ │ │ │ +
449#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
450 assert(examined.find(aggregates[*vertex])==examined.end());
│ │ │ │ +
451 examined.insert(aggregates[*vertex]);
│ │ │ │ +
452#endif
│ │ │ │ +
453 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
│ │ │ │ +
454
│ │ │ │ +
455 // only needed for ALU
│ │ │ │ +
456 // (ghosts with same global id as owners on the same process)
│ │ │ │ +
457 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping)) {
│ │ │ │ +
458 if(overlapVertices != overlapEnd) {
│ │ │ │ +
459 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
│ │ │ │ +
460 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
│ │ │ │ +
461 }
│ │ │ │ +
462 else{
│ │ │ │ +
463 ++overlapVertices;
│ │ │ │ +
464 }
│ │ │ │ +
465 }
│ │ │ │ +
466 }
│ │ │ │ +
467 ++row;
│ │ │ │ +
468 }
│ │ │ │ +
469 }
│ │ │ │ +
470
│ │ │ │ +
471 dvverb<<"constructed "<<row.index()<<" non-overlapping rows"<<std::endl;
│ │ │ │ +
472
│ │ │ │ +
473 // Now come the aggregates not owned by use.
│ │ │ │ +
474 // They represent the rows n+1, ..., N
│ │ │ │ +
475 while(overlapVertices != overlapEnd)
│ │ │ │ +
476 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
│ │ │ │ +
477
│ │ │ │ +
478#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
479 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ +
480 const IndexPair* pair = lookup.pair(overlapVertices->vertex);
│ │ │ │ +
481 assert(pair!=0 && overlap.contains(pair->local().attribute()));
│ │ │ │ +
482 assert(examined.find(aggregates[overlapVertices->vertex])==examined.end());
│ │ │ │ +
483 examined.insert(aggregates[overlapVertices->vertex]);
│ │ │ │ +
484#endif
│ │ │ │ +
485 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
│ │ │ │ +
486 ++row;
│ │ │ │ +
487 }else{
│ │ │ │ +
488 ++overlapVertices;
│ │ │ │ +
489 }
│ │ │ │ +
490 }
│ │ │ │ +
│ │ │ │ +
491
│ │ │ │ +
492 template<class G>
│ │ │ │ +
493 template<class V, class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
495 V& visitedMap,
│ │ │ │ +
496 [[maybe_unused]] const SequentialInformation& pinfo,
│ │ │ │ +
497 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
498 R& row)
│ │ │ │ +
499 {
│ │ │ │ +
500 typedef typename G::VertexIterator VertexIterator;
│ │ │ │ +
501
│ │ │ │ +
502 VertexIterator vend=graph.end();
│ │ │ │ +
503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) {
│ │ │ │ +
504 if(!get(visitedMap, *vertex)) {
│ │ │ │ +
505 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
│ │ │ │ +
506 ++row;
│ │ │ │ +
507 }
│ │ │ │ +
508 }
│ │ │ │ +
509
│ │ │ │ +
510 }
│ │ │ │ +
│ │ │ │ +
511
│ │ │ │ +
512 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
514 : row_(matrix.createbegin()),
│ │ │ │ +
515 minRowSize_(std::numeric_limits<std::size_t>::max()),
│ │ │ │ +
516 maxRowSize_(0), sumRowSize_(0)
│ │ │ │ +
517 {
│ │ │ │ +
518#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
519 diagonalInserted = false;
│ │ │ │ +
520#endif
│ │ │ │ +
521 }
│ │ │ │ +
│ │ │ │ +
522 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
524 {
│ │ │ │ +
525 return maxRowSize_;
│ │ │ │ +
526 }
│ │ │ │ +
│ │ │ │ +
527 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
529 {
│ │ │ │ +
530 return minRowSize_;
│ │ │ │ +
531 }
│ │ │ │ +
│ │ │ │ +
532
│ │ │ │ +
533 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
535 {
│ │ │ │ +
536 return sumRowSize_;
│ │ │ │ +
537 }
│ │ │ │ +
│ │ │ │ +
538 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
540 {
│ │ │ │ +
541 sumRowSize_ += row_.size();
│ │ │ │ +
542 minRowSize_=std::min(minRowSize_, row_.size());
│ │ │ │ +
543 maxRowSize_=std::max(maxRowSize_, row_.size());
│ │ │ │ +
544 ++row_;
│ │ │ │ +
545#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
546 assert(diagonalInserted);
│ │ │ │ +
547 diagonalInserted = false;
│ │ │ │ +
548#endif
│ │ │ │ +
549 }
│ │ │ │ +
│ │ │ │
550
│ │ │ │ -
558 template<class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
560 {
│ │ │ │ -
561 public:
│ │ │ │ -
562
│ │ │ │ -
566 static const V UNAGGREGATED;
│ │ │ │ -
567
│ │ │ │ -
571 static const V ISOLATED;
│ │ │ │ - │ │ │ │ -
576
│ │ │ │ - │ │ │ │ -
581
│ │ │ │ -
586 typedef PoolAllocator<VertexDescriptor,100> Allocator;
│ │ │ │ -
587
│ │ │ │ -
592 typedef SLList<VertexDescriptor,Allocator> VertexList;
│ │ │ │ +
551 template<class M>
│ │ │ │ +
│ │ │ │ +
552 void SparsityBuilder<M>::insert(const typename M::size_type& index)
│ │ │ │ +
553 {
│ │ │ │ +
554 row_.insert(index);
│ │ │ │ +
555#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
556 diagonalInserted = diagonalInserted || row_.index()==index;
│ │ │ │ +
557#endif
│ │ │ │ +
558 }
│ │ │ │ +
│ │ │ │ +
559
│ │ │ │ +
560 template<class T>
│ │ │ │ +
561 template<class G, class V, class Set>
│ │ │ │ +
562 typename G::MutableMatrix*
│ │ │ │ +
│ │ │ │ +
563 GalerkinProduct<T>::build(G& fineGraph, V& visitedMap,
│ │ │ │ +
564 const ParallelInformation& pinfo,
│ │ │ │ + │ │ │ │ +
566 const typename G::Matrix::size_type& size,
│ │ │ │ +
567 const Set& overlap)
│ │ │ │ +
568 {
│ │ │ │ + │ │ │ │ +
570
│ │ │ │ +
571 std::size_t count;
│ │ │ │ +
572
│ │ │ │ +
573 const OverlapVertex* overlapVertices = buildOverlapVertices(fineGraph,
│ │ │ │ +
574 pinfo,
│ │ │ │ +
575 aggregates,
│ │ │ │ +
576 overlap,
│ │ │ │ +
577 count);
│ │ │ │ +
578 typedef typename G::MutableMatrix M;
│ │ │ │ +
579 M* coarseMatrix = new M(size, size, M::row_wise);
│ │ │ │ +
580
│ │ │ │ +
581 // Reset the visited flags of all vertices.
│ │ │ │ +
582 // As the isolated nodes will be skipped we simply mark them as visited
│ │ │ │ +
583
│ │ │ │ +
584 typedef typename G::VertexIterator Vertex;
│ │ │ │ +
585 Vertex vend = fineGraph.end();
│ │ │ │ +
586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
│ │ │ │ + │ │ │ │ +
588 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
│ │ │ │ +
589 }
│ │ │ │ +
590
│ │ │ │ +
591 typedef typename G::MutableMatrix M;
│ │ │ │ +
592 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
│ │ │ │
593
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
598 {
│ │ │ │ -
599 public:
│ │ │ │ -
600 template<class EdgeIterator>
│ │ │ │ -
│ │ │ │ -
601 void operator()([[maybe_unused]] const EdgeIterator& edge) const
│ │ │ │ -
602 {}
│ │ │ │ -
│ │ │ │ -
603 };
│ │ │ │ -
│ │ │ │ +
594 ConnectivityConstructor<G,T>::examine(fineGraph, visitedMap, pinfo,
│ │ │ │ +
595 aggregates, overlap,
│ │ │ │ +
596 overlapVertices,
│ │ │ │ +
597 overlapVertices+count,
│ │ │ │ +
598 sparsityBuilder);
│ │ │ │ +
599
│ │ │ │ +
600 dinfo<<pinfo.communicator().rank()<<": Matrix ("<<coarseMatrix->N()<<"x"<<coarseMatrix->M()<<" row: min="<<sparsityBuilder.minRowSize()<<" max="
│ │ │ │ +
601 <<sparsityBuilder.maxRowSize()<<" avg="
│ │ │ │ +
602 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()
│ │ │ │ +
603 <<std::endl;
│ │ │ │
604
│ │ │ │ -
605
│ │ │ │ - │ │ │ │ -
610
│ │ │ │ - │ │ │ │ -
617
│ │ │ │ - │ │ │ │ -
622
│ │ │ │ -
634 template<class M, class G, class C>
│ │ │ │ -
635 std::tuple<int,int,int,int> buildAggregates(const M& matrix, G& graph, const C& criterion,
│ │ │ │ -
636 bool finestLevel);
│ │ │ │ -
637
│ │ │ │ -
655 template<bool reset, class G, class F, class VM>
│ │ │ │ -
656 std::size_t breadthFirstSearch(const VertexDescriptor& start,
│ │ │ │ -
657 const AggregateDescriptor& aggregate,
│ │ │ │ -
658 const G& graph,
│ │ │ │ -
659 F& aggregateVisitor,
│ │ │ │ -
660 VM& visitedMap) const;
│ │ │ │ -
661
│ │ │ │ -
685 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
│ │ │ │ -
686 std::size_t breadthFirstSearch(const VertexDescriptor& start,
│ │ │ │ -
687 const AggregateDescriptor& aggregate,
│ │ │ │ -
688 const G& graph, L& visited, F1& aggregateVisitor,
│ │ │ │ -
689 F2& nonAggregateVisitor,
│ │ │ │ -
690 VM& visitedMap) const;
│ │ │ │ -
691
│ │ │ │ -
697 void allocate(std::size_t noVertices);
│ │ │ │ -
698
│ │ │ │ -
702 std::size_t noVertices() const;
│ │ │ │ +
605 delete[] overlapVertices;
│ │ │ │ +
606
│ │ │ │ +
607 return coarseMatrix;
│ │ │ │ +
608 }
│ │ │ │ +
│ │ │ │ +
609
│ │ │ │ +
610 template<class G, class V, class Set>
│ │ │ │ +
611 typename G::MutableMatrix*
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
613 const SequentialInformation& pinfo,
│ │ │ │ + │ │ │ │ +
615 const typename G::Matrix::size_type& size,
│ │ │ │ +
616 [[maybe_unused]] const Set& overlap)
│ │ │ │ +
617 {
│ │ │ │ +
618 typedef typename G::MutableMatrix M;
│ │ │ │ +
619 M* coarseMatrix = new M(size, size, M::row_wise);
│ │ │ │ +
620
│ │ │ │ +
621 // Reset the visited flags of all vertices.
│ │ │ │ +
622 // As the isolated nodes will be skipped we simply mark them as visited
│ │ │ │ +
623
│ │ │ │ +
624 typedef typename G::VertexIterator Vertex;
│ │ │ │ +
625 Vertex vend = fineGraph.end();
│ │ │ │ +
626 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
│ │ │ │ + │ │ │ │ +
628 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
│ │ │ │ +
629 }
│ │ │ │ +
630
│ │ │ │ +
631 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
│ │ │ │ +
632
│ │ │ │ + │ │ │ │ +
634 aggregates, sparsityBuilder);
│ │ │ │ +
635 dinfo<<"Matrix row: min="<<sparsityBuilder.minRowSize()<<" max="
│ │ │ │ +
636 <<sparsityBuilder.maxRowSize()<<" average="
│ │ │ │ +
637 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()<<std::endl;
│ │ │ │ +
638 return coarseMatrix;
│ │ │ │ +
639 }
│ │ │ │ +
│ │ │ │ +
640
│ │ │ │ +
641 template<class M, class V, class P, class O>
│ │ │ │ +
│ │ │ │ +
642 void BaseGalerkinProduct::calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
│ │ │ │ +
643 const P& pinfo, [[maybe_unused]] const O& copy)
│ │ │ │ +
644 {
│ │ │ │ +
645 coarse = static_cast<typename M::field_type>(0);
│ │ │ │ +
646
│ │ │ │ +
647 typedef typename M::ConstIterator RowIterator;
│ │ │ │ +
648 RowIterator endRow = fine.end();
│ │ │ │ +
649
│ │ │ │ +
650 for(RowIterator row = fine.begin(); row != endRow; ++row)
│ │ │ │ +
651 if(aggregates[row.index()] != AggregatesMap<V>::ISOLATED) {
│ │ │ │ +
652 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
│ │ │ │ +
653 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ +
654 ColIterator endCol = row->end();
│ │ │ │ +
655
│ │ │ │ +
656 for(ColIterator col = row->begin(); col != endCol; ++col)
│ │ │ │ +
657 if(aggregates[col.index()] != AggregatesMap<V>::ISOLATED) {
│ │ │ │ +
658 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
│ │ │ │ +
659 coarse[aggregates[row.index()]][aggregates[col.index()]]+=*col;
│ │ │ │ +
660 }
│ │ │ │ +
661 }
│ │ │ │ +
662
│ │ │ │ +
663 // get the right diagonal matrix values on copy lines from owner processes
│ │ │ │ +
664 typedef typename M::block_type BlockType;
│ │ │ │ +
665 std::vector<BlockType> rowsize(coarse.N(),BlockType(0));
│ │ │ │ +
666 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
│ │ │ │ +
667 rowsize[row.index()]=coarse[row.index()][row.index()];
│ │ │ │ +
668 pinfo.copyOwnerToAll(rowsize,rowsize);
│ │ │ │ +
669 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
│ │ │ │ +
670 coarse[row.index()][row.index()] = rowsize[row.index()];
│ │ │ │ +
671
│ │ │ │ +
672 // don't set dirichlet boundaries for copy lines to make novlp case work,
│ │ │ │ +
673 // the preconditioner yields slightly different results now.
│ │ │ │ +
674
│ │ │ │ +
675 // Set the dirichlet border
│ │ │ │ +
676 //DirichletBoundarySetter<P>::template set<M>(coarse, pinfo, copy);
│ │ │ │ +
677
│ │ │ │ +
678 }
│ │ │ │ +
│ │ │ │ +
679
│ │ │ │ +
680 template<class T>
│ │ │ │ +
681 template<class M, class O>
│ │ │ │ +
│ │ │ │ +
682 void DirichletBoundarySetter<T>::set(M& coarse, const T& pinfo, const O& copy)
│ │ │ │ +
683 {
│ │ │ │ +
684 typedef typename T::ParallelIndexSet::const_iterator ConstIterator;
│ │ │ │ +
685 ConstIterator end = pinfo.indexSet().end();
│ │ │ │ +
686 typedef typename M::block_type Block;
│ │ │ │ +
687 Block identity=Block(0.0);
│ │ │ │ +
688 for(typename Block::RowIterator b=identity.begin(); b != identity.end(); ++b)
│ │ │ │ +
689 b->operator[](b.index())=1.0;
│ │ │ │ +
690
│ │ │ │ +
691 for(ConstIterator index = pinfo.indexSet().begin();
│ │ │ │ +
692 index != end; ++index) {
│ │ │ │ +
693 if(copy.contains(index->local().attribute())) {
│ │ │ │ +
694 typedef typename M::ColIterator ColIterator;
│ │ │ │ +
695 typedef typename M::row_type Row;
│ │ │ │ +
696 Row row = coarse[index->local()];
│ │ │ │ +
697 ColIterator cend = row.find(index->local());
│ │ │ │ +
698 ColIterator col = row.begin();
│ │ │ │ +
699 for(; col != cend; ++col)
│ │ │ │ +
700 *col = 0;
│ │ │ │ +
701
│ │ │ │ +
702 cend = row.end();
│ │ │ │
703
│ │ │ │ -
707 void free();
│ │ │ │ -
708
│ │ │ │ - │ │ │ │ -
715
│ │ │ │ - │ │ │ │ -
722
│ │ │ │ - │ │ │ │ -
724
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
726 {
│ │ │ │ -
727 return aggregates_;
│ │ │ │ -
728 }
│ │ │ │ -
│ │ │ │ -
729
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
731 {
│ │ │ │ -
732 return aggregates_+noVertices();
│ │ │ │ -
733 }
│ │ │ │ -
│ │ │ │ -
734
│ │ │ │ - │ │ │ │ -
736
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
738 {
│ │ │ │ -
739 return aggregates_;
│ │ │ │ -
740 }
│ │ │ │ -
│ │ │ │ -
741
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
743 {
│ │ │ │ -
744 return aggregates_+noVertices();
│ │ │ │ -
745 }
│ │ │ │ -
│ │ │ │ -
746 private:
│ │ │ │ -
748 AggregatesMap(const AggregatesMap<V>&) = delete;
│ │ │ │ -
750 AggregatesMap<V>& operator=(const AggregatesMap<V>&) = delete;
│ │ │ │ -
751
│ │ │ │ -
755 AggregateDescriptor* aggregates_;
│ │ │ │ -
756
│ │ │ │ -
760 std::size_t noVertices_;
│ │ │ │ -
761 };
│ │ │ │ -
│ │ │ │ -
762
│ │ │ │ -
766 template<class G, class C>
│ │ │ │ -
767 void buildDependency(G& graph,
│ │ │ │ -
768 const typename C::Matrix& matrix,
│ │ │ │ -
769 C criterion,
│ │ │ │ -
770 bool finestLevel);
│ │ │ │ -
771
│ │ │ │ -
776 template<class G, class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
778 {
│ │ │ │ -
779
│ │ │ │ -
780 public:
│ │ │ │ -
781
│ │ │ │ -
782 /***
│ │ │ │ -
783 * @brief The type of the matrix graph we work with.
│ │ │ │ -
784 */
│ │ │ │ -
785 typedef G MatrixGraph;
│ │ │ │ - │ │ │ │ -
790
│ │ │ │ -
795 typedef PoolAllocator<Vertex,100> Allocator;
│ │ │ │ -
796
│ │ │ │ -
801 typedef S VertexSet;
│ │ │ │ -
802
│ │ │ │ -
804 typedef typename VertexSet::const_iterator const_iterator;
│ │ │ │ -
805
│ │ │ │ -
809 typedef std::size_t* SphereMap;
│ │ │ │ -
810
│ │ │ │ - │ │ │ │ -
820 VertexSet& connectivity, std::vector<Vertex>& front_);
│ │ │ │ -
821
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
823 {
│ │ │ │ -
824 --id_;
│ │ │ │ -
825 }
│ │ │ │ -
│ │ │ │ -
826
│ │ │ │ -
833 void reconstruct(const Vertex& vertex);
│ │ │ │ -
834
│ │ │ │ -
838 void seed(const Vertex& vertex);
│ │ │ │ -
839
│ │ │ │ -
843 void add(const Vertex& vertex);
│ │ │ │ -
844
│ │ │ │ -
845 void add(std::vector<Vertex>& vertex);
│ │ │ │ -
849 void clear();
│ │ │ │ -
850
│ │ │ │ -
854 typename VertexSet::size_type size();
│ │ │ │ -
858 typename VertexSet::size_type connectSize();
│ │ │ │ -
859
│ │ │ │ -
863 int id();
│ │ │ │ -
864
│ │ │ │ - │ │ │ │ -
867
│ │ │ │ - │ │ │ │ -
870
│ │ │ │ -
871 private:
│ │ │ │ -
875 VertexSet vertices_;
│ │ │ │ -
876
│ │ │ │ -
881 int id_;
│ │ │ │ -
882
│ │ │ │ -
886 MatrixGraph& graph_;
│ │ │ │ -
887
│ │ │ │ -
891 AggregatesMap<Vertex>& aggregates_;
│ │ │ │ -
892
│ │ │ │ -
896 VertexSet& connected_;
│ │ │ │ -
897
│ │ │ │ -
901 std::vector<Vertex>& front_;
│ │ │ │ -
902 };
│ │ │ │ -
│ │ │ │ -
903
│ │ │ │ -
907 template<class G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
909 {
│ │ │ │ -
910 public:
│ │ │ │ -
911
│ │ │ │ -
915 typedef G MatrixGraph;
│ │ │ │ -
916
│ │ │ │ - │ │ │ │ -
921
│ │ │ │ - │ │ │ │ -
924
│ │ │ │ - │ │ │ │ -
929
│ │ │ │ - │ │ │ │ -
934
│ │ │ │ -
951 template<class M, class C>
│ │ │ │ -
952 std::tuple<int,int,int,int> build(const M& m, G& graph,
│ │ │ │ -
953 AggregatesMap<Vertex>& aggregates, const C& c,
│ │ │ │ -
954 bool finestLevel);
│ │ │ │ -
955 private:
│ │ │ │ -
960 typedef PoolAllocator<Vertex,100> Allocator;
│ │ │ │ -
961
│ │ │ │ -
965 typedef SLList<Vertex,Allocator> VertexList;
│ │ │ │ -
966
│ │ │ │ -
970 typedef std::set<Vertex,std::less<Vertex>,Allocator> VertexSet;
│ │ │ │ -
971
│ │ │ │ -
975 typedef std::size_t* SphereMap;
│ │ │ │ -
976
│ │ │ │ -
980 MatrixGraph* graph_;
│ │ │ │ -
981
│ │ │ │ - │ │ │ │ -
986
│ │ │ │ -
990 std::vector<Vertex> front_;
│ │ │ │ -
991
│ │ │ │ -
995 VertexSet connected_;
│ │ │ │ -
996
│ │ │ │ -
1000 int size_;
│ │ │ │ -
1001
│ │ │ │ -
1005 class Stack
│ │ │ │ -
1006 {
│ │ │ │ -
1007 public:
│ │ │ │ -
1008 static const Vertex NullEntry;
│ │ │ │ -
1009
│ │ │ │ -
1010 Stack(const MatrixGraph& graph,
│ │ │ │ -
1011 const Aggregator<G>& aggregatesBuilder,
│ │ │ │ -
1012 const AggregatesMap<Vertex>& aggregates);
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1015 private:
│ │ │ │ -
1016 enum { N = 1300000 };
│ │ │ │ -
1017
│ │ │ │ -
1019 const MatrixGraph& graph_;
│ │ │ │ -
1021 const Aggregator<G>& aggregatesBuilder_;
│ │ │ │ -
1023 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ -
1025 int size_;
│ │ │ │ -
1026 Vertex maxSize_;
│ │ │ │ -
1028 typename MatrixGraph::ConstVertexIterator begin_;
│ │ │ │ - │ │ │ │ -
1030
│ │ │ │ -
1032 Vertex* vals_;
│ │ │ │ -
1033
│ │ │ │ -
1034 };
│ │ │ │ -
1035
│ │ │ │ -
1036 friend class Stack;
│ │ │ │ -
1037
│ │ │ │ -
1048 template<class V>
│ │ │ │ -
1049 void visitAggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ -
1050 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
1051 V& visitor) const;
│ │ │ │ -
1052
│ │ │ │ -
1057 template<class V>
│ │ │ │ -
1058 class AggregateVisitor
│ │ │ │ -
1059 {
│ │ │ │ -
1060 public:
│ │ │ │ -
1064 typedef V Visitor;
│ │ │ │ - │ │ │ │ -
1073 Visitor& visitor);
│ │ │ │ -
1074
│ │ │ │ -
1081 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1082
│ │ │ │ -
1083 private:
│ │ │ │ -
1085 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ -
1087 AggregateDescriptor aggregate_;
│ │ │ │ -
1089 Visitor* visitor_;
│ │ │ │ -
1090 };
│ │ │ │ -
1091
│ │ │ │ -
1095 class Counter
│ │ │ │ -
1096 {
│ │ │ │ -
1097 public:
│ │ │ │ - │ │ │ │ -
1101 int value();
│ │ │ │ -
1102
│ │ │ │ -
1103 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1108
│ │ │ │ -
1109 private:
│ │ │ │ -
1110 int count_;
│ │ │ │ -
1111 };
│ │ │ │ -
1112
│ │ │ │ -
1113
│ │ │ │ -
1118 class FrontNeighbourCounter : public Counter
│ │ │ │ -
1119 {
│ │ │ │ -
1120 public:
│ │ │ │ - │ │ │ │ -
1126
│ │ │ │ -
1127 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1128
│ │ │ │ -
1129 private:
│ │ │ │ -
1130 const MatrixGraph& graph_;
│ │ │ │ -
1131 };
│ │ │ │ -
1132
│ │ │ │ -
1137 int noFrontNeighbours(const Vertex& vertex) const;
│ │ │ │ -
1138
│ │ │ │ -
1142 class TwoWayCounter : public Counter
│ │ │ │ -
1143 {
│ │ │ │ -
1144 public:
│ │ │ │ -
1145 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1146 };
│ │ │ │ -
1147
│ │ │ │ -
1159 int twoWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
│ │ │ │ -
1160 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1161
│ │ │ │ -
1165 class OneWayCounter : public Counter
│ │ │ │ -
1166 {
│ │ │ │ -
1167 public:
│ │ │ │ -
1168 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1169 };
│ │ │ │ -
1170
│ │ │ │ -
1182 int oneWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
│ │ │ │ -
1183 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1184
│ │ │ │ -
1191 class ConnectivityCounter : public Counter
│ │ │ │ -
1192 {
│ │ │ │ -
1193 public:
│ │ │ │ -
1200 ConnectivityCounter(const VertexSet& connected, const AggregatesMap<Vertex>& aggregates);
│ │ │ │ -
1201
│ │ │ │ -
1202 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1203
│ │ │ │ -
1204 private:
│ │ │ │ -
1206 const VertexSet& connected_;
│ │ │ │ -
1208 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ -
1209
│ │ │ │ -
1210 };
│ │ │ │ -
1211
│ │ │ │ -
1223 double connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1231 bool connected(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ -
1232 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1233
│ │ │ │ -
1241 bool connected(const Vertex& vertex, const SLList<AggregateDescriptor>& aggregateList,
│ │ │ │ -
1242 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1243
│ │ │ │ -
1251 class DependencyCounter : public Counter
│ │ │ │ -
1252 {
│ │ │ │ -
1253 public:
│ │ │ │ - │ │ │ │ -
1258
│ │ │ │ -
1259 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1260 };
│ │ │ │ -
1261
│ │ │ │ -
1268 class FrontMarker
│ │ │ │ -
1269 {
│ │ │ │ -
1270 public:
│ │ │ │ -
1277 FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph);
│ │ │ │ -
1278
│ │ │ │ -
1279 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
│ │ │ │ -
1280
│ │ │ │ -
1281 private:
│ │ │ │ -
1283 std::vector<Vertex>& front_;
│ │ │ │ -
1285 MatrixGraph& graph_;
│ │ │ │ -
1286 };
│ │ │ │ -
1287
│ │ │ │ -
1291 void unmarkFront();
│ │ │ │ -
1292
│ │ │ │ -
1307 int unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1308
│ │ │ │ -
1322 std::pair<int,int> neighbours(const Vertex& vertex,
│ │ │ │ -
1323 const AggregateDescriptor& aggregate,
│ │ │ │ -
1324 const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1341 int aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1342
│ │ │ │ -
1350 bool admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1351
│ │ │ │ -
1359 std::size_t distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates);
│ │ │ │ -
1360
│ │ │ │ -
1369 Vertex mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
│ │ │ │ -
1370
│ │ │ │ -
1379 void nonisoNeighbourAggregate(const Vertex& vertex,
│ │ │ │ -
1380 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
1381 SLList<Vertex>& neighbours) const;
│ │ │ │ -
1382
│ │ │ │ -
1390 template<class C>
│ │ │ │ -
1391 void growAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
│ │ │ │ -
1392 template<class C>
│ │ │ │ -
1393 void growIsolatedAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
│ │ │ │ -
1394 };
│ │ │ │ -
│ │ │ │ -
1395
│ │ │ │ -
1396#ifndef DOXYGEN
│ │ │ │ -
1397
│ │ │ │ -
1398 template<class M, class N>
│ │ │ │ -
1399 inline void SymmetricDependency<M,N>::init(const Matrix* matrix)
│ │ │ │ -
1400 {
│ │ │ │ -
1401 matrix_ = matrix;
│ │ │ │ -
1402 }
│ │ │ │ -
1403
│ │ │ │ -
1404 template<class M, class N>
│ │ │ │ -
1405 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index)
│ │ │ │ -
1406 {
│ │ │ │ -
1407 initRow(row, index, std::is_convertible<field_type, real_type>());
│ │ │ │ -
1408 }
│ │ │ │ -
1409
│ │ │ │ -
1410 template<class M, class N>
│ │ │ │ -
1411 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index, const std::false_type&)
│ │ │ │ -
1412 {
│ │ │ │ -
1413 DUNE_THROW(InvalidStateException, "field_type needs to convertible to real_type");
│ │ │ │ -
1414 }
│ │ │ │ -
1415
│ │ │ │ -
1416 template<class M, class N>
│ │ │ │ -
1417 inline void SymmetricDependency<M,N>::initRow([[maybe_unused]] const Row& row, int index, const std::true_type&)
│ │ │ │ -
1418 {
│ │ │ │ -
1419 using std::min;
│ │ │ │ -
1420 maxValue_ = min(- std::numeric_limits<typename Matrix::field_type>::max(), std::numeric_limits<typename Matrix::field_type>::min());
│ │ │ │ -
1421 row_ = index;
│ │ │ │ -
1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
│ │ │ │ -
1423 }
│ │ │ │ -
1424
│ │ │ │ -
1425 template<class M, class N>
│ │ │ │ -
1426 inline void SymmetricDependency<M,N>::examine(const ColIter& col)
│ │ │ │ -
1427 {
│ │ │ │ -
1428 using std::max;
│ │ │ │ -
1429 real_type eij = norm_(*col);
│ │ │ │ -
1430 typename Matrix::ConstColIterator opposite_entry =
│ │ │ │ -
1431 matrix_->operator[](col.index()).find(row_);
│ │ │ │ -
1432 if ( opposite_entry == matrix_->operator[](col.index()).end() )
│ │ │ │ -
1433 {
│ │ │ │ -
1434 // Consider this a weak connection we disregard.
│ │ │ │ -
1435 return;
│ │ │ │ -
1436 }
│ │ │ │ -
1437 real_type eji = norm_(*opposite_entry);
│ │ │ │ -
1438
│ │ │ │ -
1439 // skip positive offdiagonals if norm preserves sign of them.
│ │ │ │ -
1440 if(!N::is_sign_preserving || eij<0 || eji<0)
│ │ │ │ -
1441 maxValue_ = max(maxValue_,
│ │ │ │ -
1442 eij /diagonal_ * eji/
│ │ │ │ -
1443 norm_(matrix_->operator[](col.index())[col.index()]));
│ │ │ │ -
1444 }
│ │ │ │ -
1445
│ │ │ │ -
1446 template<class M, class N>
│ │ │ │ -
1447 template<class G>
│ │ │ │ -
1448 inline void SymmetricDependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
│ │ │ │ -
1449 {
│ │ │ │ -
1450 real_type eij = norm_(*col);
│ │ │ │ -
1451 typename Matrix::ConstColIterator opposite_entry =
│ │ │ │ -
1452 matrix_->operator[](col.index()).find(row_);
│ │ │ │ -
1453
│ │ │ │ -
1454 if ( opposite_entry == matrix_->operator[](col.index()).end() )
│ │ │ │ -
1455 {
│ │ │ │ -
1456 // Consider this as a weak connection we disregard.
│ │ │ │ -
1457 return;
│ │ │ │ -
1458 }
│ │ │ │ -
1459 real_type eji = norm_(*opposite_entry);
│ │ │ │ -
1460 // skip positve offdiagonals if norm preserves sign of them.
│ │ │ │ -
1461 if(!N::is_sign_preserving || (eij<0 || eji<0))
│ │ │ │ -
1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) *
│ │ │ │ -
1463 eij/ diagonal_ > alpha() * maxValue_) {
│ │ │ │ -
1464 edge.properties().setDepends();
│ │ │ │ -
1465 edge.properties().setInfluences();
│ │ │ │ -
1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), edge.source());
│ │ │ │ -
1467 other.setInfluences();
│ │ │ │ -
1468 other.setDepends();
│ │ │ │ -
1469 }
│ │ │ │ -
1470 }
│ │ │ │ -
1471
│ │ │ │ -
1472 template<class M, class N>
│ │ │ │ - │ │ │ │ -
1474 {
│ │ │ │ -
1475 return maxValue_ < beta();
│ │ │ │ -
1476 }
│ │ │ │ -
1477
│ │ │ │ -
1478
│ │ │ │ -
1479 template<class M, class N>
│ │ │ │ -
1480 inline void Dependency<M,N>::init(const Matrix* matrix)
│ │ │ │ -
1481 {
│ │ │ │ -
1482 matrix_ = matrix;
│ │ │ │ -
1483 }
│ │ │ │ -
1484
│ │ │ │ -
1485 template<class M, class N>
│ │ │ │ -
1486 inline void Dependency<M,N>::initRow([[maybe_unused]] const Row& row, int index)
│ │ │ │ -
1487 {
│ │ │ │ -
1488 using std::min;
│ │ │ │ -
1489 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
│ │ │ │ -
1490 row_ = index;
│ │ │ │ -
1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
│ │ │ │ -
1492 }
│ │ │ │ -
1493
│ │ │ │ -
1494 template<class M, class N>
│ │ │ │ -
1495 inline void Dependency<M,N>::examine(const ColIter& col)
│ │ │ │ -
1496 {
│ │ │ │ -
1497 using std::max;
│ │ │ │ -
1498 maxValue_ = max(maxValue_, -norm_(*col));
│ │ │ │ -
1499 }
│ │ │ │ -
1500
│ │ │ │ -
1501 template<class M, class N>
│ │ │ │ -
1502 template<class G>
│ │ │ │ -
1503 inline void Dependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
│ │ │ │ -
1504 {
│ │ │ │ -
1505 if(-norm_(*col) >= maxValue_ * alpha()) {
│ │ │ │ -
1506 edge.properties().setDepends();
│ │ │ │ -
1507 typedef typename G::EdgeDescriptor ED;
│ │ │ │ -
1508 ED e= graph.findEdge(edge.target(), edge.source());
│ │ │ │ -
1509 if(e!=std::numeric_limits<ED>::max())
│ │ │ │ -
1510 {
│ │ │ │ -
1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e);
│ │ │ │ -
1512 other.setInfluences();
│ │ │ │ -
1513 }
│ │ │ │ -
1514 }
│ │ │ │ -
1515 }
│ │ │ │ -
1516
│ │ │ │ -
1517 template<class M, class N>
│ │ │ │ -
1518 inline bool Dependency<M,N>::isIsolated()
│ │ │ │ -
1519 {
│ │ │ │ -
1520 return maxValue_ < beta() * diagonal_;
│ │ │ │ -
1521 }
│ │ │ │ -
1522
│ │ │ │ -
1523 template<class G,class S>
│ │ │ │ -
1524 Aggregate<G,S>::Aggregate(MatrixGraph& graph, AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
1525 VertexSet& connected, std::vector<Vertex>& front)
│ │ │ │ -
1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates),
│ │ │ │ -
1527 connected_(connected), front_(front)
│ │ │ │ -
1528 {}
│ │ │ │ -
1529
│ │ │ │ -
1530 template<class G,class S>
│ │ │ │ -
1531 void Aggregate<G,S>::reconstruct(const Vertex& vertex)
│ │ │ │ -
1532 {
│ │ │ │ -
1533 /*
│ │ │ │ -
1534 vertices_.push_back(vertex);
│ │ │ │ -
1535 typedef typename VertexList::const_iterator iterator;
│ │ │ │ -
1536 iterator begin = vertices_.begin();
│ │ │ │ -
1537 iterator end = vertices_.end();*/
│ │ │ │ -
1538 throw "Not yet implemented";
│ │ │ │ -
1539
│ │ │ │ -
1540 // while(begin!=end){
│ │ │ │ -
1541 //for();
│ │ │ │ -
1542 // }
│ │ │ │ -
1543
│ │ │ │ -
1544 }
│ │ │ │ -
1545
│ │ │ │ -
1546 template<class G,class S>
│ │ │ │ -
1547 inline void Aggregate<G,S>::seed(const Vertex& vertex)
│ │ │ │ -
1548 {
│ │ │ │ -
1549 dvverb<<"Connected cleared"<<std::endl;
│ │ │ │ -
1550 connected_.clear();
│ │ │ │ -
1551 vertices_.clear();
│ │ │ │ -
1552 connected_.insert(vertex);
│ │ │ │ -
1553 dvverb << " Inserting "<<vertex<<" size="<<connected_.size();
│ │ │ │ -
1554 ++id_ ;
│ │ │ │ -
1555 add(vertex);
│ │ │ │ -
1556 }
│ │ │ │ -
1557
│ │ │ │ -
1558
│ │ │ │ -
1559 template<class G,class S>
│ │ │ │ -
1560 inline void Aggregate<G,S>::add(const Vertex& vertex)
│ │ │ │ -
1561 {
│ │ │ │ -
1562 vertices_.insert(vertex);
│ │ │ │ -
1563 aggregates_[vertex]=id_;
│ │ │ │ -
1564 if(front_.size())
│ │ │ │ -
1565 front_.erase(std::lower_bound(front_.begin(), front_.end(), vertex));
│ │ │ │ -
1566
│ │ │ │ -
1567
│ │ │ │ -
1568 typedef typename MatrixGraph::ConstEdgeIterator iterator;
│ │ │ │ -
1569 const iterator end = graph_.endEdges(vertex);
│ │ │ │ -
1570 for(iterator edge = graph_.beginEdges(vertex); edge != end; ++edge) {
│ │ │ │ -
1571 dvverb << " Inserting "<<aggregates_[edge.target()];
│ │ │ │ -
1572 connected_.insert(aggregates_[edge.target()]);
│ │ │ │ -
1573 dvverb <<" size="<<connected_.size();
│ │ │ │ -
1574 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
│ │ │ │ -
1575 !graph_.getVertexProperties(edge.target()).front())
│ │ │ │ -
1576 {
│ │ │ │ -
1577 front_.push_back(edge.target());
│ │ │ │ -
1578 graph_.getVertexProperties(edge.target()).setFront();
│ │ │ │ -
1579 }
│ │ │ │ -
1580 }
│ │ │ │ -
1581 dvverb <<std::endl;
│ │ │ │ -
1582 std::sort(front_.begin(), front_.end());
│ │ │ │ -
1583 }
│ │ │ │ -
1584
│ │ │ │ -
1585 template<class G,class S>
│ │ │ │ -
1586 inline void Aggregate<G,S>::add(std::vector<Vertex>& vertices)
│ │ │ │ -
1587 {
│ │ │ │ -
1588#ifndef NDEBUG
│ │ │ │ -
1589 std::size_t oldsize = vertices_.size();
│ │ │ │ -
1590#endif
│ │ │ │ -
1591 typedef typename std::vector<Vertex>::iterator Iterator;
│ │ │ │ -
1592
│ │ │ │ -
1593 typedef typename VertexSet::iterator SIterator;
│ │ │ │ -
1594
│ │ │ │ -
1595 SIterator pos=vertices_.begin();
│ │ │ │ -
1596 std::vector<Vertex> newFront;
│ │ │ │ -
1597 newFront.reserve(front_.capacity());
│ │ │ │ -
1598
│ │ │ │ -
1599 std::set_difference(front_.begin(), front_.end(), vertices.begin(), vertices.end(),
│ │ │ │ -
1600 std::back_inserter(newFront));
│ │ │ │ -
1601 front_=newFront;
│ │ │ │ -
1602
│ │ │ │ -
1603 for(Iterator vertex=vertices.begin(); vertex != vertices.end(); ++vertex)
│ │ │ │ -
1604 {
│ │ │ │ -
1605 pos=vertices_.insert(pos,*vertex);
│ │ │ │ -
1606 vertices_.insert(*vertex);
│ │ │ │ -
1607 graph_.getVertexProperties(*vertex).resetFront(); // Not a front node any more.
│ │ │ │ -
1608 aggregates_[*vertex]=id_;
│ │ │ │ -
1609
│ │ │ │ -
1610 typedef typename MatrixGraph::ConstEdgeIterator iterator;
│ │ │ │ -
1611 const iterator end = graph_.endEdges(*vertex);
│ │ │ │ -
1612 for(iterator edge = graph_.beginEdges(*vertex); edge != end; ++edge) {
│ │ │ │ -
1613 dvverb << " Inserting "<<aggregates_[edge.target()];
│ │ │ │ -
1614 connected_.insert(aggregates_[edge.target()]);
│ │ │ │ -
1615 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
│ │ │ │ -
1616 !graph_.getVertexProperties(edge.target()).front())
│ │ │ │ -
1617 {
│ │ │ │ -
1618 front_.push_back(edge.target());
│ │ │ │ -
1619 graph_.getVertexProperties(edge.target()).setFront();
│ │ │ │ -
1620 }
│ │ │ │ -
1621 dvverb <<" size="<<connected_.size();
│ │ │ │ -
1622 }
│ │ │ │ -
1623 dvverb <<std::endl;
│ │ │ │ -
1624 }
│ │ │ │ -
1625 std::sort(front_.begin(), front_.end());
│ │ │ │ -
1626 assert(oldsize+vertices.size()==vertices_.size());
│ │ │ │ -
1627 }
│ │ │ │ -
1628 template<class G,class S>
│ │ │ │ -
1629 inline void Aggregate<G,S>::clear()
│ │ │ │ -
1630 {
│ │ │ │ -
1631 vertices_.clear();
│ │ │ │ -
1632 connected_.clear();
│ │ │ │ -
1633 id_=-1;
│ │ │ │ -
1634 }
│ │ │ │ -
1635
│ │ │ │ -
1636 template<class G,class S>
│ │ │ │ -
1637 inline typename Aggregate<G,S>::VertexSet::size_type
│ │ │ │ - │ │ │ │ -
1639 {
│ │ │ │ -
1640 return vertices_.size();
│ │ │ │ -
1641 }
│ │ │ │ -
1642
│ │ │ │ -
1643 template<class G,class S>
│ │ │ │ -
1644 inline typename Aggregate<G,S>::VertexSet::size_type
│ │ │ │ - │ │ │ │ -
1646 {
│ │ │ │ -
1647 return connected_.size();
│ │ │ │ -
1648 }
│ │ │ │ -
1649
│ │ │ │ -
1650 template<class G,class S>
│ │ │ │ -
1651 inline int Aggregate<G,S>::id()
│ │ │ │ -
1652 {
│ │ │ │ -
1653 return id_;
│ │ │ │ -
1654 }
│ │ │ │ -
1655
│ │ │ │ -
1656 template<class G,class S>
│ │ │ │ - │ │ │ │ -
1658 {
│ │ │ │ -
1659 return vertices_.begin();
│ │ │ │ -
1660 }
│ │ │ │ -
1661
│ │ │ │ -
1662 template<class G,class S>
│ │ │ │ - │ │ │ │ -
1664 {
│ │ │ │ -
1665 return vertices_.end();
│ │ │ │ -
1666 }
│ │ │ │ -
1667
│ │ │ │ -
1668 template<class V>
│ │ │ │ -
1669 const V AggregatesMap<V>::UNAGGREGATED = std::numeric_limits<V>::max();
│ │ │ │ -
1670
│ │ │ │ -
1671 template<class V>
│ │ │ │ -
1672 const V AggregatesMap<V>::ISOLATED = std::numeric_limits<V>::max()-1;
│ │ │ │ -
1673
│ │ │ │ -
1674 template<class V>
│ │ │ │ - │ │ │ │ -
1676 : aggregates_(0)
│ │ │ │ -
1677 {}
│ │ │ │ -
1678
│ │ │ │ -
1679 template<class V>
│ │ │ │ - │ │ │ │ -
1681 {
│ │ │ │ -
1682 if(aggregates_!=0)
│ │ │ │ -
1683 delete[] aggregates_;
│ │ │ │ -
1684 }
│ │ │ │ -
1685
│ │ │ │ -
1686
│ │ │ │ -
1687 template<class V>
│ │ │ │ -
1688 inline AggregatesMap<V>::AggregatesMap(std::size_t noVertices)
│ │ │ │ -
1689 {
│ │ │ │ -
1690 allocate(noVertices);
│ │ │ │ -
1691 }
│ │ │ │ -
1692
│ │ │ │ -
1693 template<class V>
│ │ │ │ -
1694 inline std::size_t AggregatesMap<V>::noVertices() const
│ │ │ │ -
1695 {
│ │ │ │ -
1696 return noVertices_;
│ │ │ │ -
1697 }
│ │ │ │ -
1698
│ │ │ │ -
1699 template<class V>
│ │ │ │ -
1700 inline void AggregatesMap<V>::allocate(std::size_t noVertices)
│ │ │ │ -
1701 {
│ │ │ │ -
1702 aggregates_ = new AggregateDescriptor[noVertices];
│ │ │ │ -
1703 noVertices_ = noVertices;
│ │ │ │ -
1704
│ │ │ │ -
1705 for(std::size_t i=0; i < noVertices; i++)
│ │ │ │ -
1706 aggregates_[i]=UNAGGREGATED;
│ │ │ │ -
1707 }
│ │ │ │ -
1708
│ │ │ │ -
1709 template<class V>
│ │ │ │ -
1710 inline void AggregatesMap<V>::free()
│ │ │ │ -
1711 {
│ │ │ │ -
1712 assert(aggregates_ != 0);
│ │ │ │ -
1713 delete[] aggregates_;
│ │ │ │ -
1714 aggregates_=0;
│ │ │ │ -
1715 }
│ │ │ │ -
1716
│ │ │ │ -
1717 template<class V>
│ │ │ │ - │ │ │ │ -
1719 AggregatesMap<V>::operator[](const VertexDescriptor& v)
│ │ │ │ -
1720 {
│ │ │ │ -
1721 return aggregates_[v];
│ │ │ │ -
1722 }
│ │ │ │ -
1723
│ │ │ │ -
1724 template<class V>
│ │ │ │ -
1725 inline const typename AggregatesMap<V>::AggregateDescriptor&
│ │ │ │ -
1726 AggregatesMap<V>::operator[](const VertexDescriptor& v) const
│ │ │ │ -
1727 {
│ │ │ │ -
1728 return aggregates_[v];
│ │ │ │ -
1729 }
│ │ │ │ -
1730
│ │ │ │ -
1731 template<class V>
│ │ │ │ -
1732 template<bool reset, class G, class F,class VM>
│ │ │ │ -
1733 inline std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
│ │ │ │ -
1734 const AggregateDescriptor& aggregate,
│ │ │ │ -
1735 const G& graph, F& aggregateVisitor,
│ │ │ │ -
1736 VM& visitedMap) const
│ │ │ │ -
1737 {
│ │ │ │ -
1738 VertexList vlist;
│ │ │ │ -
1739
│ │ │ │ -
1740 DummyEdgeVisitor dummy;
│ │ │ │ -
1741 return breadthFirstSearch<true,reset>(start, aggregate, graph, vlist, aggregateVisitor, dummy, visitedMap);
│ │ │ │ -
1742 }
│ │ │ │ -
1743
│ │ │ │ -
1744 template<class V>
│ │ │ │ -
1745 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
│ │ │ │ -
1746 std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
│ │ │ │ -
1747 const AggregateDescriptor& aggregate,
│ │ │ │ -
1748 const G& graph,
│ │ │ │ -
1749 L& visited,
│ │ │ │ -
1750 F1& aggregateVisitor,
│ │ │ │ -
1751 F2& nonAggregateVisitor,
│ │ │ │ -
1752 VM& visitedMap) const
│ │ │ │ -
1753 {
│ │ │ │ -
1754 typedef typename L::const_iterator ListIterator;
│ │ │ │ -
1755 int visitedSpheres = 0;
│ │ │ │ -
1756
│ │ │ │ -
1757 visited.push_back(start);
│ │ │ │ -
1758 put(visitedMap, start, true);
│ │ │ │ -
1759
│ │ │ │ -
1760 ListIterator current = visited.begin();
│ │ │ │ -
1761 ListIterator end = visited.end();
│ │ │ │ -
1762 std::size_t i=0, size=visited.size();
│ │ │ │ -
1763
│ │ │ │ -
1764 // visit the neighbours of all vertices of the
│ │ │ │ -
1765 // current sphere.
│ │ │ │ -
1766 while(current != end) {
│ │ │ │ -
1767
│ │ │ │ -
1768 for(; i<size; ++current, ++i) {
│ │ │ │ -
1769 typedef typename G::ConstEdgeIterator EdgeIterator;
│ │ │ │ -
1770 const EdgeIterator endEdge = graph.endEdges(*current);
│ │ │ │ -
1771
│ │ │ │ -
1772 for(EdgeIterator edge = graph.beginEdges(*current);
│ │ │ │ -
1773 edge != endEdge; ++edge) {
│ │ │ │ -
1774
│ │ │ │ -
1775 if(aggregates_[edge.target()]==aggregate) {
│ │ │ │ -
1776 if(!get(visitedMap, edge.target())) {
│ │ │ │ -
1777 put(visitedMap, edge.target(), true);
│ │ │ │ -
1778 visited.push_back(edge.target());
│ │ │ │ -
1779 aggregateVisitor(edge);
│ │ │ │ -
1780 }
│ │ │ │ -
1781 }else
│ │ │ │ -
1782 nonAggregateVisitor(edge);
│ │ │ │ -
1783 }
│ │ │ │ -
1784 }
│ │ │ │ -
1785 end = visited.end();
│ │ │ │ -
1786 size = visited.size();
│ │ │ │ -
1787 if(current != end)
│ │ │ │ -
1788 visitedSpheres++;
│ │ │ │ -
1789 }
│ │ │ │ -
1790
│ │ │ │ -
1791 if(reset)
│ │ │ │ -
1792 for(current = visited.begin(); current != end; ++current)
│ │ │ │ -
1793 put(visitedMap, *current, false);
│ │ │ │ -
1794
│ │ │ │ -
1795
│ │ │ │ -
1796 if(remove)
│ │ │ │ -
1797 visited.clear();
│ │ │ │ -
1798
│ │ │ │ -
1799 return visitedSpheres;
│ │ │ │ -
1800 }
│ │ │ │ -
1801
│ │ │ │ -
1802 template<class G>
│ │ │ │ - │ │ │ │ -
1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1)
│ │ │ │ -
1805 {}
│ │ │ │ -
1806
│ │ │ │ -
1807 template<class G>
│ │ │ │ - │ │ │ │ -
1809 {
│ │ │ │ -
1810 size_=-1;
│ │ │ │ -
1811 }
│ │ │ │ -
1812
│ │ │ │ -
1813 template<class G, class C>
│ │ │ │ -
1814 void buildDependency(G& graph,
│ │ │ │ -
1815 const typename C::Matrix& matrix,
│ │ │ │ -
1816 C criterion, bool firstlevel)
│ │ │ │ -
1817 {
│ │ │ │ -
1818 // assert(graph.isBuilt());
│ │ │ │ -
1819 typedef typename C::Matrix Matrix;
│ │ │ │ -
1820 typedef typename G::VertexIterator VertexIterator;
│ │ │ │ -
1821
│ │ │ │ -
1822 criterion.init(&matrix);
│ │ │ │ -
1823
│ │ │ │ -
1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end(); ++vertex) {
│ │ │ │ -
1825 typedef typename Matrix::row_type Row;
│ │ │ │ -
1826
│ │ │ │ -
1827 const Row& row = matrix[*vertex];
│ │ │ │ -
1828
│ │ │ │ -
1829 // Tell the criterion what row we will examine now
│ │ │ │ -
1830 // This might for example be used for calculating the
│ │ │ │ -
1831 // maximum offdiagonal value
│ │ │ │ -
1832 criterion.initRow(row, *vertex);
│ │ │ │ -
1833
│ │ │ │ -
1834 // On a first path all columns are examined. After this
│ │ │ │ -
1835 // the calculator should know whether the vertex is isolated.
│ │ │ │ -
1836 typedef typename Matrix::ConstColIterator ColIterator;
│ │ │ │ -
1837 ColIterator end = row.end();
│ │ │ │ -
1838 typename FieldTraits<typename Matrix::field_type>::real_type absoffdiag=0.;
│ │ │ │ -
1839
│ │ │ │ -
1840 using std::max;
│ │ │ │ -
1841 if(firstlevel) {
│ │ │ │ -
1842 for(ColIterator col = row.begin(); col != end; ++col)
│ │ │ │ -
1843 if(col.index()!=*vertex) {
│ │ │ │ -
1844 criterion.examine(col);
│ │ │ │ -
1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm());
│ │ │ │ -
1846 }
│ │ │ │ -
1847
│ │ │ │ -
1848 if(absoffdiag==0)
│ │ │ │ -
1849 vertex.properties().setExcludedBorder();
│ │ │ │ -
1850 }
│ │ │ │ -
1851 else
│ │ │ │ -
1852 for(ColIterator col = row.begin(); col != end; ++col)
│ │ │ │ -
1853 if(col.index()!=*vertex)
│ │ │ │ -
1854 criterion.examine(col);
│ │ │ │ -
1855
│ │ │ │ -
1856 // reset the vertex properties
│ │ │ │ -
1857 //vertex.properties().reset();
│ │ │ │ -
1858
│ │ │ │ -
1859 // Check whether the vertex is isolated.
│ │ │ │ -
1860 if(criterion.isIsolated()) {
│ │ │ │ -
1861 //std::cout<<"ISOLATED: "<<*vertex<<std::endl;
│ │ │ │ -
1862 vertex.properties().setIsolated();
│ │ │ │ -
1863 }else{
│ │ │ │ -
1864 // Examine all the edges beginning at this vertex.
│ │ │ │ -
1865 auto eEnd = vertex.end();
│ │ │ │ -
1866 auto col = matrix[*vertex].begin();
│ │ │ │ -
1867
│ │ │ │ -
1868 for(auto edge = vertex.begin(); edge!= eEnd; ++edge, ++col) {
│ │ │ │ -
1869 // Move to the right column.
│ │ │ │ -
1870 while(col.index()!=edge.target())
│ │ │ │ -
1871 ++col;
│ │ │ │ -
1872 criterion.examine(graph, edge, col);
│ │ │ │ -
1873 }
│ │ │ │ -
1874 }
│ │ │ │ -
1875
│ │ │ │ -
1876 }
│ │ │ │ -
1877 }
│ │ │ │ -
1878
│ │ │ │ -
1879
│ │ │ │ -
1880 template<class G>
│ │ │ │ -
1881 template<class V>
│ │ │ │ -
1882 inline Aggregator<G>::AggregateVisitor<V>::AggregateVisitor(const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
1883 const AggregateDescriptor& aggregate, V& visitor)
│ │ │ │ -
1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor)
│ │ │ │ -
1885 {}
│ │ │ │ -
1886
│ │ │ │ -
1887 template<class G>
│ │ │ │ -
1888 template<class V>
│ │ │ │ - │ │ │ │ -
1890 {
│ │ │ │ -
1891 if(aggregates_[edge.target()]==aggregate_)
│ │ │ │ -
1892 visitor_->operator()(edge);
│ │ │ │ -
1893 }
│ │ │ │ -
1894
│ │ │ │ -
1895 template<class G>
│ │ │ │ -
1896 template<class V>
│ │ │ │ -
1897 inline void Aggregator<G>::visitAggregateNeighbours(const Vertex& vertex,
│ │ │ │ -
1898 const AggregateDescriptor& aggregate,
│ │ │ │ -
1899 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
1900 V& visitor) const
│ │ │ │ -
1901 {
│ │ │ │ -
1902 // Only evaluates for edge pointing to the aggregate
│ │ │ │ -
1903 AggregateVisitor<V> v(aggregates, aggregate, visitor);
│ │ │ │ -
1904 visitNeighbours(*graph_, vertex, v);
│ │ │ │ -
1905 }
│ │ │ │ -
1906
│ │ │ │ -
1907
│ │ │ │ -
1908 template<class G>
│ │ │ │ - │ │ │ │ -
1910 : count_(0)
│ │ │ │ -
1911 {}
│ │ │ │ -
1912
│ │ │ │ -
1913 template<class G>
│ │ │ │ - │ │ │ │ -
1915 {
│ │ │ │ -
1916 ++count_;
│ │ │ │ -
1917 }
│ │ │ │ -
1918
│ │ │ │ -
1919 template<class G>
│ │ │ │ - │ │ │ │ -
1921 {
│ │ │ │ -
1922 --count_;
│ │ │ │ -
1923 }
│ │ │ │ -
1924 template<class G>
│ │ │ │ - │ │ │ │ -
1926 {
│ │ │ │ -
1927 return count_;
│ │ │ │ -
1928 }
│ │ │ │ -
1929
│ │ │ │ -
1930 template<class G>
│ │ │ │ - │ │ │ │ -
1932 {
│ │ │ │ -
1933 if(edge.properties().isTwoWay())
│ │ │ │ - │ │ │ │ -
1935 }
│ │ │ │ -
1936
│ │ │ │ -
1937 template<class G>
│ │ │ │ -
1938 int Aggregator<G>::twoWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ -
1939 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
1940 {
│ │ │ │ -
1941 TwoWayCounter counter;
│ │ │ │ -
1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
│ │ │ │ -
1943 return counter.value();
│ │ │ │ -
1944 }
│ │ │ │ -
1945
│ │ │ │ -
1946 template<class G>
│ │ │ │ -
1947 int Aggregator<G>::oneWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
│ │ │ │ -
1948 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
1949 {
│ │ │ │ -
1950 OneWayCounter counter;
│ │ │ │ -
1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
│ │ │ │ -
1952 return counter.value();
│ │ │ │ -
1953 }
│ │ │ │ -
1954
│ │ │ │ -
1955 template<class G>
│ │ │ │ - │ │ │ │ -
1957 {
│ │ │ │ -
1958 if(edge.properties().isOneWay())
│ │ │ │ - │ │ │ │ -
1960 }
│ │ │ │ -
1961
│ │ │ │ -
1962 template<class G>
│ │ │ │ -
1963 inline Aggregator<G>::ConnectivityCounter::ConnectivityCounter(const VertexSet& connected,
│ │ │ │ -
1964 const AggregatesMap<Vertex>& aggregates)
│ │ │ │ -
1965 : Counter(), connected_(connected), aggregates_(aggregates)
│ │ │ │ -
1966 {}
│ │ │ │ -
1967
│ │ │ │ -
1968
│ │ │ │ -
1969 template<class G>
│ │ │ │ - │ │ │ │ -
1971 {
│ │ │ │ -
1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() || aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED)
│ │ │ │ -
1973 // Would be a new connection
│ │ │ │ - │ │ │ │ -
1975 else{
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1978 }
│ │ │ │ -
1979 }
│ │ │ │ -
1980
│ │ │ │ -
1981 template<class G>
│ │ │ │ -
1982 inline double Aggregator<G>::connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
1983 {
│ │ │ │ -
1984 ConnectivityCounter counter(connected_, aggregates);
│ │ │ │ -
1985 double noNeighbours=visitNeighbours(*graph_, vertex, counter);
│ │ │ │ -
1986 return (double)counter.value()/noNeighbours;
│ │ │ │ -
1987 }
│ │ │ │ -
1988
│ │ │ │ -
1989 template<class G>
│ │ │ │ - │ │ │ │ -
1991 : Counter()
│ │ │ │ -
1992 {}
│ │ │ │ -
1993
│ │ │ │ -
1994 template<class G>
│ │ │ │ - │ │ │ │ -
1996 {
│ │ │ │ -
1997 if(edge.properties().depends())
│ │ │ │ - │ │ │ │ -
1999 if(edge.properties().influences())
│ │ │ │ - │ │ │ │ -
2001 }
│ │ │ │ -
2002
│ │ │ │ -
2003 template<class G>
│ │ │ │ -
2004 int Aggregator<G>::unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2005 {
│ │ │ │ -
2006 return aggregateNeighbours(vertex, AggregatesMap<Vertex>::UNAGGREGATED, aggregates);
│ │ │ │ -
2007 }
│ │ │ │ -
2008
│ │ │ │ -
2009 template<class G>
│ │ │ │ -
2010 std::pair<int,int> Aggregator<G>::neighbours(const Vertex& vertex,
│ │ │ │ -
2011 const AggregateDescriptor& aggregate,
│ │ │ │ -
2012 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2013 {
│ │ │ │ -
2014 DependencyCounter unused, aggregated;
│ │ │ │ -
2015 typedef AggregateVisitor<DependencyCounter> CounterT;
│ │ │ │ -
2016 typedef std::tuple<CounterT,CounterT> CounterTuple;
│ │ │ │ -
2017 CombinedFunctor<CounterTuple> visitors(CounterTuple(CounterT(aggregates, AggregatesMap<Vertex>::UNAGGREGATED, unused), CounterT(aggregates, aggregate, aggregated)));
│ │ │ │ -
2018 visitNeighbours(*graph_, vertex, visitors);
│ │ │ │ -
2019 return std::make_pair(unused.value(), aggregated.value());
│ │ │ │ -
2020 }
│ │ │ │ -
2021
│ │ │ │ -
2022
│ │ │ │ -
2023 template<class G>
│ │ │ │ -
2024 int Aggregator<G>::aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2025 {
│ │ │ │ -
2026 DependencyCounter counter;
│ │ │ │ -
2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
│ │ │ │ -
2028 return counter.value();
│ │ │ │ -
2029 }
│ │ │ │ -
2030
│ │ │ │ -
2031 template<class G>
│ │ │ │ -
2032 std::size_t Aggregator<G>::distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates)
│ │ │ │ -
2033 {
│ │ │ │ -
2034 return 0;
│ │ │ │ -
2035 typename PropertyMapTypeSelector<VertexVisitedTag,G>::Type visitedMap = get(VertexVisitedTag(), *graph_);
│ │ │ │ -
2036 VertexList vlist;
│ │ │ │ -
2037 typename AggregatesMap<Vertex>::DummyEdgeVisitor dummy;
│ │ │ │ -
2038 return aggregates.template breadthFirstSearch<true,true>(vertex,
│ │ │ │ -
2039 aggregate_->id(), *graph_,
│ │ │ │ -
2040 vlist, dummy, dummy, visitedMap);
│ │ │ │ -
2041 }
│ │ │ │ -
2042
│ │ │ │ -
2043 template<class G>
│ │ │ │ -
2044 inline Aggregator<G>::FrontMarker::FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph)
│ │ │ │ -
2045 : front_(front), graph_(graph)
│ │ │ │ -
2046 {}
│ │ │ │ -
2047
│ │ │ │ -
2048 template<class G>
│ │ │ │ - │ │ │ │ -
2050 {
│ │ │ │ -
2051 Vertex target = edge.target();
│ │ │ │ -
2052
│ │ │ │ -
2053 if(!graph_.getVertexProperties(target).front()) {
│ │ │ │ -
2054 front_.push_back(target);
│ │ │ │ -
2055 graph_.getVertexProperties(target).setFront();
│ │ │ │ -
2056 }
│ │ │ │ -
2057 }
│ │ │ │ -
2058
│ │ │ │ -
2059 template<class G>
│ │ │ │ -
2060 inline bool Aggregator<G>::admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2061 {
│ │ │ │ -
2062 // Todo
│ │ │ │ -
2063 Dune::dvverb<<" Admissible not yet implemented!"<<std::endl;
│ │ │ │ -
2064 return true;
│ │ │ │ -
2065 //Situation 1: front node depends on two nodes. Then these
│ │ │ │ -
2066 // have to be strongly connected to each other
│ │ │ │ -
2067
│ │ │ │ -
2068 // Iterate over all all neighbours of front node
│ │ │ │ -
2069 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
│ │ │ │ -
2070 Iterator vend = graph_->endEdges(vertex);
│ │ │ │ -
2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
│ │ │ │ -
2072 // if(edge.properties().depends() && !edge.properties().influences()
│ │ │ │ -
2073 if(edge.properties().isStrong()
│ │ │ │ -
2074 && aggregates[edge.target()]==aggregate)
│ │ │ │ -
2075 {
│ │ │ │ -
2076 // Search for another link to the aggregate
│ │ │ │ -
2077 Iterator edge1 = edge;
│ │ │ │ -
2078 for(++edge1; edge1 != vend; ++edge1) {
│ │ │ │ -
2079 //if(edge1.properties().depends() && !edge1.properties().influences()
│ │ │ │ -
2080 if(edge1.properties().isStrong()
│ │ │ │ -
2081 && aggregates[edge.target()]==aggregate)
│ │ │ │ -
2082 {
│ │ │ │ -
2083 //Search for an edge connecting the two vertices that is
│ │ │ │ -
2084 //strong
│ │ │ │ -
2085 bool found=false;
│ │ │ │ -
2086 Iterator v2end = graph_->endEdges(edge.target());
│ │ │ │ -
2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end; ++edge2) {
│ │ │ │ -
2088 if(edge2.target()==edge1.target() &&
│ │ │ │ -
2089 edge2.properties().isStrong()) {
│ │ │ │ -
2090 found =true;
│ │ │ │ -
2091 break;
│ │ │ │ -
2092 }
│ │ │ │ -
2093 }
│ │ │ │ -
2094 if(found)
│ │ │ │ -
2095 {
│ │ │ │ -
2096 return true;
│ │ │ │ -
2097 }
│ │ │ │ -
2098 }
│ │ │ │ -
2099 }
│ │ │ │ -
2100 }
│ │ │ │ -
2101 }
│ │ │ │ -
2102
│ │ │ │ -
2103 // Situation 2: cluster node depends on front node and other cluster node
│ │ │ │ -
2105 vend = graph_->endEdges(vertex);
│ │ │ │ -
2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
│ │ │ │ -
2107 //if(!edge.properties().depends() && edge.properties().influences()
│ │ │ │ -
2108 if(edge.properties().isStrong()
│ │ │ │ -
2109 && aggregates[edge.target()]==aggregate)
│ │ │ │ -
2110 {
│ │ │ │ -
2111 // Search for a link from target that stays within the aggregate
│ │ │ │ -
2112 Iterator v1end = graph_->endEdges(edge.target());
│ │ │ │ -
2113
│ │ │ │ -
2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end; ++edge1) {
│ │ │ │ -
2115 //if(edge1.properties().depends() && !edge1.properties().influences()
│ │ │ │ -
2116 if(edge1.properties().isStrong()
│ │ │ │ -
2117 && aggregates[edge1.target()]==aggregate)
│ │ │ │ -
2118 {
│ │ │ │ -
2119 bool found=false;
│ │ │ │ -
2120 // Check if front node is also connected to this one
│ │ │ │ -
2121 Iterator v2end = graph_->endEdges(vertex);
│ │ │ │ -
2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2) {
│ │ │ │ -
2123 if(edge2.target()==edge1.target()) {
│ │ │ │ -
2124 if(edge2.properties().isStrong())
│ │ │ │ -
2125 found=true;
│ │ │ │ -
2126 break;
│ │ │ │ -
2127 }
│ │ │ │ -
2128 }
│ │ │ │ -
2129 if(found)
│ │ │ │ -
2130 {
│ │ │ │ -
2131 return true;
│ │ │ │ -
2132 }
│ │ │ │ -
2133 }
│ │ │ │ -
2134 }
│ │ │ │ -
2135 }
│ │ │ │ -
2136 }
│ │ │ │ -
2137 return false;
│ │ │ │ -
2138 }
│ │ │ │ -
2139
│ │ │ │ -
2140 template<class G>
│ │ │ │ -
2141 void Aggregator<G>::unmarkFront()
│ │ │ │ -
2142 {
│ │ │ │ -
2143 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ -
2144
│ │ │ │ -
2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex)
│ │ │ │ -
2146 graph_->getVertexProperties(*vertex).resetFront();
│ │ │ │ -
2147
│ │ │ │ -
2148 front_.clear();
│ │ │ │ -
2149 }
│ │ │ │ -
2150
│ │ │ │ -
2151 template<class G>
│ │ │ │ -
2152 inline void
│ │ │ │ -
2153 Aggregator<G>::nonisoNeighbourAggregate(const Vertex& vertex,
│ │ │ │ -
2154 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
2155 SLList<Vertex>& neighbours) const
│ │ │ │ -
2156 {
│ │ │ │ -
2157 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
│ │ │ │ -
2158 Iterator end=graph_->beginEdges(vertex);
│ │ │ │ -
2159 neighbours.clear();
│ │ │ │ -
2160
│ │ │ │ -
2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge)
│ │ │ │ -
2162 {
│ │ │ │ -
2163 if(aggregates[edge.target()]!=AggregatesMap<Vertex>::UNAGGREGATED && graph_->getVertexProperties(edge.target()).isolated())
│ │ │ │ -
2164 neighbours.push_back(aggregates[edge.target()]);
│ │ │ │ -
2165 }
│ │ │ │ -
2166 }
│ │ │ │ -
2167
│ │ │ │ -
2168 template<class G>
│ │ │ │ -
2169 inline typename G::VertexDescriptor Aggregator<G>::mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2170 {
│ │ │ │ -
2171 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
│ │ │ │ -
2172
│ │ │ │ -
2173 Iterator end = graph_->endEdges(vertex);
│ │ │ │ -
2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) {
│ │ │ │ -
2175 if(aggregates[edge.target()] != AggregatesMap<Vertex>::UNAGGREGATED &&
│ │ │ │ -
2176 graph_->getVertexProperties(edge.target()).isolated() == graph_->getVertexProperties(edge.source()).isolated()) {
│ │ │ │ -
2177 if( graph_->getVertexProperties(vertex).isolated() ||
│ │ │ │ -
2178 ((edge.properties().depends() || edge.properties().influences())
│ │ │ │ -
2179 && admissible(vertex, aggregates[edge.target()], aggregates)))
│ │ │ │ -
2180 return edge.target();
│ │ │ │ -
2181 }
│ │ │ │ -
2182 }
│ │ │ │ -
2183 return AggregatesMap<Vertex>::UNAGGREGATED;
│ │ │ │ -
2184 }
│ │ │ │ -
2185
│ │ │ │ -
2186 template<class G>
│ │ │ │ - │ │ │ │ -
2188 : Counter(), graph_(graph)
│ │ │ │ -
2189 {}
│ │ │ │ -
2190
│ │ │ │ -
2191 template<class G>
│ │ │ │ - │ │ │ │ -
2193 {
│ │ │ │ -
2194 if(graph_.getVertexProperties(edge.target()).front())
│ │ │ │ - │ │ │ │ -
2196 }
│ │ │ │ -
2197
│ │ │ │ -
2198 template<class G>
│ │ │ │ -
2199 int Aggregator<G>::noFrontNeighbours(const Vertex& vertex) const
│ │ │ │ -
2200 {
│ │ │ │ -
2201 FrontNeighbourCounter counter(*graph_);
│ │ │ │ -
2202 visitNeighbours(*graph_, vertex, counter);
│ │ │ │ -
2203 return counter.value();
│ │ │ │ -
2204 }
│ │ │ │ -
2205 template<class G>
│ │ │ │ -
2206 inline bool Aggregator<G>::connected(const Vertex& vertex,
│ │ │ │ -
2207 const AggregateDescriptor& aggregate,
│ │ │ │ -
2208 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2209 {
│ │ │ │ -
2210 typedef typename G::ConstEdgeIterator iterator;
│ │ │ │ -
2211 const iterator end = graph_->endEdges(vertex);
│ │ │ │ -
2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge)
│ │ │ │ -
2213 if(aggregates[edge.target()]==aggregate)
│ │ │ │ -
2214 return true;
│ │ │ │ -
2215 return false;
│ │ │ │ -
2216 }
│ │ │ │ -
2217 template<class G>
│ │ │ │ -
2218 inline bool Aggregator<G>::connected(const Vertex& vertex,
│ │ │ │ -
2219 const SLList<AggregateDescriptor>& aggregateList,
│ │ │ │ -
2220 const AggregatesMap<Vertex>& aggregates) const
│ │ │ │ -
2221 {
│ │ │ │ -
2222 typedef typename SLList<AggregateDescriptor>::const_iterator Iter;
│ │ │ │ -
2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i)
│ │ │ │ -
2224 if(connected(vertex, *i, aggregates))
│ │ │ │ -
2225 return true;
│ │ │ │ -
2226 return false;
│ │ │ │ -
2227 }
│ │ │ │ -
2228
│ │ │ │ -
2229 template<class G>
│ │ │ │ -
2230 template<class C>
│ │ │ │ -
2231 void Aggregator<G>::growIsolatedAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
│ │ │ │ -
2232 {
│ │ │ │ -
2233 SLList<Vertex> connectedAggregates;
│ │ │ │ -
2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates);
│ │ │ │ -
2235
│ │ │ │ -
2236 while(aggregate_->size()< c.minAggregateSize() && aggregate_->connectSize() < c.maxConnectivity()) {
│ │ │ │ -
2237 double maxCon=-1;
│ │ │ │ -
2238 std::size_t maxFrontNeighbours=0;
│ │ │ │ -
2239
│ │ │ │ -
2240 Vertex candidate=AggregatesMap<Vertex>::UNAGGREGATED;
│ │ │ │ -
2241
│ │ │ │ -
2242 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ -
2243
│ │ │ │ -
2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
│ │ │ │ -
2245 if(distance(*vertex, aggregates)>c.maxDistance())
│ │ │ │ -
2246 continue; // distance of proposes aggregate too big
│ │ │ │ -
2247
│ │ │ │ -
2248 if(connectedAggregates.size()>0) {
│ │ │ │ -
2249 // there is already a neighbour cluster
│ │ │ │ -
2250 // front node must be connected to same neighbour cluster
│ │ │ │ -
2251
│ │ │ │ -
2252 if(!connected(*vertex, connectedAggregates, aggregates))
│ │ │ │ -
2253 continue;
│ │ │ │ -
2254 }
│ │ │ │ -
2255
│ │ │ │ -
2256 double con = connectivity(*vertex, aggregates);
│ │ │ │ -
2257
│ │ │ │ -
2258 if(con == maxCon) {
│ │ │ │ -
2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2260
│ │ │ │ -
2261 if(frontNeighbours >= maxFrontNeighbours) {
│ │ │ │ -
2262 maxFrontNeighbours = frontNeighbours;
│ │ │ │ -
2263 candidate = *vertex;
│ │ │ │ -
2264 }
│ │ │ │ -
2265 }else if(con > maxCon) {
│ │ │ │ -
2266 maxCon = con;
│ │ │ │ -
2267 maxFrontNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2268 candidate = *vertex;
│ │ │ │ -
2269 }
│ │ │ │ -
2270 }
│ │ │ │ -
2271
│ │ │ │ -
2272 if(candidate==AggregatesMap<Vertex>::UNAGGREGATED)
│ │ │ │ -
2273 break;
│ │ │ │ -
2274
│ │ │ │ -
2275 aggregate_->add(candidate);
│ │ │ │ -
2276 }
│ │ │ │ -
2277 }
│ │ │ │ -
2278
│ │ │ │ -
2279 template<class G>
│ │ │ │ -
2280 template<class C>
│ │ │ │ -
2281 void Aggregator<G>::growAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
│ │ │ │ -
2282 {
│ │ │ │ -
2283 using std::min;
│ │ │ │ -
2284
│ │ │ │ -
2285 std::size_t distance_ =0;
│ │ │ │ -
2286 while(aggregate_->size() < c.minAggregateSize()&& distance_<c.maxDistance()) {
│ │ │ │ -
2287 int maxTwoCons=0, maxOneCons=0, maxNeighbours=-1;
│ │ │ │ -
2288 double maxCon=-1;
│ │ │ │ -
2289
│ │ │ │ -
2290 std::vector<Vertex> candidates;
│ │ │ │ -
2291 candidates.reserve(30);
│ │ │ │ -
2292
│ │ │ │ -
2293 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ -
2294
│ │ │ │ -
2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
│ │ │ │ -
2296 // Only nonisolated nodes are considered
│ │ │ │ -
2297 if(graph_->getVertexProperties(*vertex).isolated())
│ │ │ │ -
2298 continue;
│ │ │ │ -
2299
│ │ │ │ -
2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->id(), aggregates);
│ │ │ │ -
2301
│ │ │ │ -
2302 /* The case of two way connections. */
│ │ │ │ -
2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) {
│ │ │ │ -
2304 double con = connectivity(*vertex, aggregates);
│ │ │ │ -
2305
│ │ │ │ -
2306 if(con == maxCon) {
│ │ │ │ -
2307 int neighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2308
│ │ │ │ -
2309 if(neighbours > maxNeighbours) {
│ │ │ │ -
2310 maxNeighbours = neighbours;
│ │ │ │ -
2311 candidates.clear();
│ │ │ │ -
2312 candidates.push_back(*vertex);
│ │ │ │ -
2313 }else{
│ │ │ │ -
2314 candidates.push_back(*vertex);
│ │ │ │ -
2315 }
│ │ │ │ -
2316 }else if( con > maxCon) {
│ │ │ │ -
2317 maxCon = con;
│ │ │ │ -
2318 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2319 candidates.clear();
│ │ │ │ -
2320 candidates.push_back(*vertex);
│ │ │ │ -
2321 }
│ │ │ │ -
2322 }else if(twoWayCons > maxTwoCons) {
│ │ │ │ -
2323 maxTwoCons = twoWayCons;
│ │ │ │ -
2324 maxCon = connectivity(*vertex, aggregates);
│ │ │ │ -
2325 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2326 candidates.clear();
│ │ │ │ -
2327 candidates.push_back(*vertex);
│ │ │ │ -
2328
│ │ │ │ -
2329 // two way connections precede
│ │ │ │ -
2330 maxOneCons = std::numeric_limits<int>::max();
│ │ │ │ -
2331 }
│ │ │ │ -
2332
│ │ │ │ -
2333 if(twoWayCons > 0)
│ │ │ │ -
2334 {
│ │ │ │ -
2335 continue; // THis is a two-way node, skip tests for one way nodes
│ │ │ │ -
2336 }
│ │ │ │ -
2337
│ │ │ │ -
2338 /* The one way case */
│ │ │ │ -
2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->id(), aggregates);
│ │ │ │ -
2340
│ │ │ │ -
2341 if(oneWayCons==0)
│ │ │ │ -
2342 continue; // No strong connections, skip the tests.
│ │ │ │ -
2343
│ │ │ │ -
2344 if(!admissible(*vertex, aggregate_->id(), aggregates))
│ │ │ │ -
2345 continue;
│ │ │ │ -
2346
│ │ │ │ -
2347 if( maxOneCons == oneWayCons && oneWayCons > 0) {
│ │ │ │ -
2348 double con = connectivity(*vertex, aggregates);
│ │ │ │ -
2349
│ │ │ │ -
2350 if(con == maxCon) {
│ │ │ │ -
2351 int neighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2352
│ │ │ │ -
2353 if(neighbours > maxNeighbours) {
│ │ │ │ -
2354 maxNeighbours = neighbours;
│ │ │ │ -
2355 candidates.clear();
│ │ │ │ -
2356 candidates.push_back(*vertex);
│ │ │ │ -
2357 }else{
│ │ │ │ -
2358 if(neighbours==maxNeighbours)
│ │ │ │ -
2359 {
│ │ │ │ -
2360 candidates.push_back(*vertex);
│ │ │ │ -
2361 }
│ │ │ │ -
2362 }
│ │ │ │ -
2363 }else if( con > maxCon) {
│ │ │ │ -
2364 maxCon = con;
│ │ │ │ -
2365 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2366 candidates.clear();
│ │ │ │ -
2367 candidates.push_back(*vertex);
│ │ │ │ -
2368 }
│ │ │ │ -
2369 }else if(oneWayCons > maxOneCons) {
│ │ │ │ -
2370 maxOneCons = oneWayCons;
│ │ │ │ -
2371 maxCon = connectivity(*vertex, aggregates);
│ │ │ │ -
2372 maxNeighbours = noFrontNeighbours(*vertex);
│ │ │ │ -
2373 candidates.clear();
│ │ │ │ -
2374 candidates.push_back(*vertex);
│ │ │ │ -
2375 }
│ │ │ │ -
2376 }
│ │ │ │ -
2377
│ │ │ │ -
2378
│ │ │ │ -
2379 if(!candidates.size())
│ │ │ │ -
2380 break; // No more candidates found
│ │ │ │ -
2381 distance_=distance(seed, aggregates);
│ │ │ │ -
2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
│ │ │ │ -
2383 aggregate_->size()));
│ │ │ │ -
2384 aggregate_->add(candidates);
│ │ │ │ -
2385 }
│ │ │ │ -
2386 }
│ │ │ │ -
2387
│ │ │ │ -
2388 template<typename V>
│ │ │ │ -
2389 template<typename M, typename G, typename C>
│ │ │ │ -
2390 std::tuple<int,int,int,int> AggregatesMap<V>::buildAggregates(const M& matrix, G& graph, const C& criterion,
│ │ │ │ -
2391 bool finestLevel)
│ │ │ │ -
2392 {
│ │ │ │ -
2393 Aggregator<G> aggregator;
│ │ │ │ -
2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel);
│ │ │ │ -
2395 }
│ │ │ │ -
2396
│ │ │ │ -
2397 template<class G>
│ │ │ │ -
2398 template<class M, class C>
│ │ │ │ -
2399 std::tuple<int,int,int,int> Aggregator<G>::build(const M& m, G& graph, AggregatesMap<Vertex>& aggregates, const C& c,
│ │ │ │ -
2400 bool finestLevel)
│ │ │ │ -
2401 {
│ │ │ │ -
2402 using std::max;
│ │ │ │ -
2403 using std::min;
│ │ │ │ -
2404 // Stack for fast vertex access
│ │ │ │ -
2405 Stack stack_(graph, *this, aggregates);
│ │ │ │ -
2406
│ │ │ │ -
2407 graph_ = &graph;
│ │ │ │ -
2408
│ │ │ │ -
2409 aggregate_ = new Aggregate<G,VertexSet>(graph, aggregates, connected_, front_);
│ │ │ │ -
2410
│ │ │ │ -
2411 Timer watch;
│ │ │ │ -
2412 watch.reset();
│ │ │ │ -
2413
│ │ │ │ -
2414 buildDependency(graph, m, c, finestLevel);
│ │ │ │ -
2415
│ │ │ │ -
2416 dverb<<"Build dependency took "<< watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
2417 int noAggregates, conAggregates, isoAggregates, oneAggregates;
│ │ │ │ -
2418 std::size_t maxA=0, minA=1000000, avg=0;
│ │ │ │ -
2419 int skippedAggregates;
│ │ │ │ -
2420 noAggregates = conAggregates = isoAggregates = oneAggregates =
│ │ │ │ -
2421 skippedAggregates = 0;
│ │ │ │ -
2422
│ │ │ │ -
2423 while(true) {
│ │ │ │ -
2424 Vertex seed = stack_.pop();
│ │ │ │ -
2425
│ │ │ │ -
2426 if(seed == Stack::NullEntry)
│ │ │ │ -
2427 // No more unaggregated vertices. We are finished!
│ │ │ │ -
2428 break;
│ │ │ │ -
2429
│ │ │ │ -
2430 // Debugging output
│ │ │ │ -
2431 if((noAggregates+1)%10000 == 0)
│ │ │ │ -
2432 Dune::dverb<<"c";
│ │ │ │ -
2433 unmarkFront();
│ │ │ │ -
2434
│ │ │ │ -
2435 if(graph.getVertexProperties(seed).excludedBorder()) {
│ │ │ │ -
2436 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
│ │ │ │ -
2437 ++skippedAggregates;
│ │ │ │ -
2438 continue;
│ │ │ │ -
2439 }
│ │ │ │ -
2440
│ │ │ │ -
2441 if(graph.getVertexProperties(seed).isolated()) {
│ │ │ │ -
2442 if(c.skipIsolated()) {
│ │ │ │ -
2443 // isolated vertices are not aggregated but skipped on the coarser levels.
│ │ │ │ -
2444 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
│ │ │ │ -
2445 ++skippedAggregates;
│ │ │ │ -
2446 // skip rest as no agglomeration is done.
│ │ │ │ -
2447 continue;
│ │ │ │ -
2448 }else{
│ │ │ │ -
2449 aggregate_->seed(seed);
│ │ │ │ -
2450 growIsolatedAggregate(seed, aggregates, c);
│ │ │ │ -
2451 }
│ │ │ │ -
2452 }else{
│ │ │ │ -
2453 aggregate_->seed(seed);
│ │ │ │ -
2454 growAggregate(seed, aggregates, c);
│ │ │ │ -
2455 }
│ │ │ │ -
2456
│ │ │ │ -
2457 /* The rounding step. */
│ │ │ │ -
2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->size() < c.maxAggregateSize()) {
│ │ │ │ -
2459
│ │ │ │ -
2460 std::vector<Vertex> candidates;
│ │ │ │ -
2461 candidates.reserve(30);
│ │ │ │ -
2462
│ │ │ │ -
2463 typedef typename std::vector<Vertex>::const_iterator Iterator;
│ │ │ │ -
2464
│ │ │ │ -
2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
│ │ │ │ -
2466
│ │ │ │ -
2467 if(graph.getVertexProperties(*vertex).isolated())
│ │ │ │ -
2468 continue; // No isolated nodes here
│ │ │ │ -
2469
│ │ │ │ -
2470 if(twoWayConnections( *vertex, aggregate_->id(), aggregates) == 0 &&
│ │ │ │ -
2471 (oneWayConnections( *vertex, aggregate_->id(), aggregates) == 0 ||
│ │ │ │ -
2472 !admissible( *vertex, aggregate_->id(), aggregates) ))
│ │ │ │ -
2473 continue;
│ │ │ │ -
2474
│ │ │ │ -
2475 std::pair<int,int> neighbourPair=neighbours(*vertex, aggregate_->id(),
│ │ │ │ -
2476 aggregates);
│ │ │ │ -
2477
│ │ │ │ -
2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <= unusedNeighbours(*vertex, aggregates))
│ │ │ │ -
2479 // continue;
│ │ │ │ -
2480
│ │ │ │ -
2481 if(neighbourPair.first >= neighbourPair.second)
│ │ │ │ -
2482 continue;
│ │ │ │ -
2483
│ │ │ │ -
2484 if(distance(*vertex, aggregates) > c.maxDistance())
│ │ │ │ -
2485 continue; // Distance too far
│ │ │ │ -
2486 candidates.push_back(*vertex);
│ │ │ │ -
2487 break;
│ │ │ │ -
2488 }
│ │ │ │ -
2489
│ │ │ │ -
2490 if(!candidates.size()) break; // no more candidates found.
│ │ │ │ -
2491
│ │ │ │ -
2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
│ │ │ │ -
2493 aggregate_->size()));
│ │ │ │ -
2494 aggregate_->add(candidates);
│ │ │ │ -
2495
│ │ │ │ -
2496 }
│ │ │ │ -
2497
│ │ │ │ -
2498 // try to merge aggregates consisting of only one nonisolated vertex with other aggregates
│ │ │ │ -
2499 if(aggregate_->size()==1 && c.maxAggregateSize()>1) {
│ │ │ │ -
2500 if(!graph.getVertexProperties(seed).isolated()) {
│ │ │ │ -
2501 Vertex mergedNeighbour = mergeNeighbour(seed, aggregates);
│ │ │ │ -
2502
│ │ │ │ -
2503 if(mergedNeighbour != AggregatesMap<Vertex>::UNAGGREGATED) {
│ │ │ │ -
2504 // assign vertex to the neighbouring cluster
│ │ │ │ -
2505 aggregates[seed] = aggregates[mergedNeighbour];
│ │ │ │ -
2506 aggregate_->invalidate();
│ │ │ │ -
2507 }else{
│ │ │ │ -
2508 ++avg;
│ │ │ │ -
2509 minA=min(minA,static_cast<std::size_t>(1));
│ │ │ │ -
2510 maxA=max(maxA,static_cast<std::size_t>(1));
│ │ │ │ -
2511 ++oneAggregates;
│ │ │ │ -
2512 ++conAggregates;
│ │ │ │ -
2513 }
│ │ │ │ -
2514 }else{
│ │ │ │ -
2515 ++avg;
│ │ │ │ -
2516 minA=min(minA,static_cast<std::size_t>(1));
│ │ │ │ -
2517 maxA=max(maxA,static_cast<std::size_t>(1));
│ │ │ │ -
2518 ++oneAggregates;
│ │ │ │ -
2519 ++isoAggregates;
│ │ │ │ -
2520 }
│ │ │ │ -
2521 ++avg;
│ │ │ │ -
2522 }else{
│ │ │ │ -
2523 avg+=aggregate_->size();
│ │ │ │ -
2524 minA=min(minA,aggregate_->size());
│ │ │ │ -
2525 maxA=max(maxA,aggregate_->size());
│ │ │ │ -
2526 if(graph.getVertexProperties(seed).isolated())
│ │ │ │ -
2527 ++isoAggregates;
│ │ │ │ -
2528 else
│ │ │ │ -
2529 ++conAggregates;
│ │ │ │ -
2530 }
│ │ │ │ -
2531
│ │ │ │ -
2532 }
│ │ │ │ -
2533
│ │ │ │ -
2534 Dune::dinfo<<"connected aggregates: "<<conAggregates;
│ │ │ │ -
2535 Dune::dinfo<<" isolated aggregates: "<<isoAggregates;
│ │ │ │ -
2536 if(conAggregates+isoAggregates>0)
│ │ │ │ -
2537 Dune::dinfo<<" one node aggregates: "<<oneAggregates<<" min size="
│ │ │ │ -
2538 <<minA<<" max size="<<maxA
│ │ │ │ -
2539 <<" avg="<<avg/(conAggregates+isoAggregates)<<std::endl;
│ │ │ │ -
2540
│ │ │ │ -
2541 delete aggregate_;
│ │ │ │ -
2542 return std::make_tuple(conAggregates+isoAggregates,isoAggregates,
│ │ │ │ -
2543 oneAggregates,skippedAggregates);
│ │ │ │ -
2544 }
│ │ │ │ -
2545
│ │ │ │ -
2546
│ │ │ │ -
2547 template<class G>
│ │ │ │ -
2548 Aggregator<G>::Stack::Stack(const MatrixGraph& graph, const Aggregator<G>& aggregatesBuilder,
│ │ │ │ -
2549 const AggregatesMap<Vertex>& aggregates)
│ │ │ │ -
2550 : graph_(graph), aggregatesBuilder_(aggregatesBuilder), aggregates_(aggregates), begin_(graph.begin()), end_(graph.end())
│ │ │ │ -
2551 {
│ │ │ │ -
2552 //vals_ = new Vertex[N];
│ │ │ │ -
2553 }
│ │ │ │ -
2554
│ │ │ │ -
2555 template<class G>
│ │ │ │ - │ │ │ │ -
2557 {
│ │ │ │ -
2558 //Dune::dverb << "Max stack size was "<<maxSize_<<" filled="<<filled_<<std::endl;
│ │ │ │ -
2559 //delete[] vals_;
│ │ │ │ -
2560 }
│ │ │ │ -
2561
│ │ │ │ -
2562 template<class G>
│ │ │ │ - │ │ │ │ -
2564 = std::numeric_limits<typename G::VertexDescriptor>::max();
│ │ │ │ -
2565
│ │ │ │ -
2566 template<class G>
│ │ │ │ -
2567 inline typename G::VertexDescriptor Aggregator<G>::Stack::pop()
│ │ │ │ -
2568 {
│ │ │ │ -
2569 for(; begin_!=end_ && aggregates_[*begin_] != AggregatesMap<Vertex>::UNAGGREGATED; ++begin_) ;
│ │ │ │ -
2570
│ │ │ │ -
2571 if(begin_!=end_)
│ │ │ │ -
2572 {
│ │ │ │ -
2573 typename G::VertexDescriptor current=*begin_;
│ │ │ │ -
2574 ++begin_;
│ │ │ │ -
2575 return current;
│ │ │ │ -
2576 }else
│ │ │ │ -
2577 return NullEntry;
│ │ │ │ -
2578 }
│ │ │ │ -
2579
│ │ │ │ -
2580#endif // DOXYGEN
│ │ │ │ -
2581
│ │ │ │ -
2582 template<class V>
│ │ │ │ -
│ │ │ │ -
2583 void printAggregates2d(const AggregatesMap<V>& aggregates, int n, int m, std::ostream& os)
│ │ │ │ -
2584 {
│ │ │ │ -
2585 using std::max;
│ │ │ │ -
2586
│ │ │ │ -
2587 std::ios_base::fmtflags oldOpts=os.flags();
│ │ │ │ -
2588
│ │ │ │ -
2589 os.setf(std::ios_base::right, std::ios_base::adjustfield);
│ │ │ │ -
2590
│ │ │ │ -
2591 V maxVal=0;
│ │ │ │ -
2592 int width=1;
│ │ │ │ -
2593
│ │ │ │ -
2594 for(int i=0; i< n*m; i++)
│ │ │ │ -
2595 maxVal=max(maxVal, aggregates[i]);
│ │ │ │ -
2596
│ │ │ │ -
2597 for(int i=10; i < 1000000; i*=10)
│ │ │ │ -
2598 if(maxVal/i>0)
│ │ │ │ -
2599 width++;
│ │ │ │ -
2600 else
│ │ │ │ -
2601 break;
│ │ │ │ -
2602
│ │ │ │ -
2603 for(int j=0, entry=0; j < m; j++) {
│ │ │ │ -
2604 for(int i=0; i<n; i++, entry++) {
│ │ │ │ -
2605 os.width(width);
│ │ │ │ -
2606 os<<aggregates[entry]<<" ";
│ │ │ │ -
2607 }
│ │ │ │ -
2608
│ │ │ │ -
2609 os<<std::endl;
│ │ │ │ -
2610 }
│ │ │ │ -
2611 os<<std::endl;
│ │ │ │ -
2612 os.flags(oldOpts);
│ │ │ │ -
2613 }
│ │ │ │ -
│ │ │ │ -
2614
│ │ │ │ -
2615
│ │ │ │ -
2616 } // namespace Amg
│ │ │ │ -
2617
│ │ │ │ -
2618} // namespace Dune
│ │ │ │ -
2619
│ │ │ │ -
2620
│ │ │ │ -
2621#endif
│ │ │ │ -
Parameter classes for customizing AMG.
│ │ │ │ - │ │ │ │ -
Provides classes for building the matrix graph.
│ │ │ │ -
Provides classes for handling internal properties in a graph.
│ │ │ │ +
704 assert(col != cend); // There should be a diagonal entry
│ │ │ │ +
705 *col = identity;
│ │ │ │ +
706
│ │ │ │ +
707 for(++col; col != cend; ++col)
│ │ │ │ +
708 *col = 0;
│ │ │ │ +
709 }
│ │ │ │ +
710 }
│ │ │ │ +
711 }
│ │ │ │ +
│ │ │ │ +
712
│ │ │ │ +
713 template<class M, class O>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
715 const SequentialInformation& pinfo,
│ │ │ │ +
716 const O& overlap)
│ │ │ │ +
717 {}
│ │ │ │ +
│ │ │ │ +
718
│ │ │ │ +
719 } // namespace Amg
│ │ │ │ +
720} // namespace Dune
│ │ │ │ +
721#endif
│ │ │ │ + │ │ │ │ +
Provides classes for the Coloring process of AMG.
│ │ │ │
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix::ConstColIterator ColIter
Constant column iterator of the matrix.
Definition aggregates.hh:273
│ │ │ │ -
std::vector< real_type >::iterator valIter_
Definition aggregates.hh:189
│ │ │ │ -
Matrix::ConstColIterator ColIter
Constant column iterator of the matrix.
Definition aggregates.hh:154
│ │ │ │ -
std::size_t breadthFirstSearch(const VertexDescriptor &start, const AggregateDescriptor &aggregate, const G &graph, L &visited, F1 &aggregateVisitor, F2 &nonAggregateVisitor, VM &visitedMap) const
Breadth first search within an aggregate.
│ │ │ │ -
PoolAllocator< VertexDescriptor, 100 > Allocator
The allocator we use for our lists and the set.
Definition aggregates.hh:586
│ │ │ │ -
iterator begin()
Definition aggregates.hh:737
│ │ │ │ -
int id()
Get the id identifying the aggregate.
│ │ │ │ -
Norm norm_
The functor for calculating the norm.
Definition aggregates.hh:302
│ │ │ │ -
MatrixGraph::VertexDescriptor Vertex
The vertex identifier.
Definition aggregates.hh:920
│ │ │ │ -
AggregationCriterion()
Constructor.
Definition aggregates.hh:66
│ │ │ │ -
const Matrix * matrix_
The matrix we work on.
Definition aggregates.hh:357
│ │ │ │ -
auto operator()(const M &m, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr) const
Compute the norm of a scalar.
Definition aggregates.hh:406
│ │ │ │ -
void initRow(const Row &row, int index)
│ │ │ │ -
SymmetricMatrixDependency(const Parameters &parms)
Definition aggregates.hh:168
│ │ │ │ -
M Matrix
The matrix type we build the dependency of.
Definition aggregates.hh:258
│ │ │ │ - │ │ │ │ -
G MatrixGraph
The matrix graph type used.
Definition aggregates.hh:915
│ │ │ │ -
Norm norm_
The functor for calculating the norm.
Definition aggregates.hh:363
│ │ │ │ -
void operator()(const EdgeIterator &edge) const
Definition aggregates.hh:601
│ │ │ │ -
SymmetricCriterion()
Definition aggregates.hh:524
│ │ │ │ -
Dependency()
Definition aggregates.hh:290
│ │ │ │ -
void examine(const ColIter &col)
│ │ │ │ -
M Matrix
The matrix type we build the dependency of.
Definition aggregates.hh:319
│ │ │ │ -
real_type diagonal_
The norm of the current diagonal.
Definition aggregates.hh:187
│ │ │ │ -
N Norm
The norm to use for examining the matrix entries.
Definition aggregates.hh:263
│ │ │ │ -
iterator end()
Definition aggregates.hh:742
│ │ │ │ -
UnSymmetricCriterion(const Parameters &parms)
Definition aggregates.hh:541
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ -
void initRow(const Row &row, int index)
Definition aggregates.hh:201
│ │ │ │ - │ │ │ │ -
static const Vertex NullEntry
Definition aggregates.hh:1008
│ │ │ │ -
void examine(const ColIter &col)
Definition aggregates.hh:214
│ │ │ │ -
Dependency(const Parameters &parms)
Definition aggregates.hh:286
│ │ │ │ -
int row_
index of the currently evaluated row.
Definition aggregates.hh:185
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ -
std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap< Vertex > &aggregates, const C &c, bool finestLevel)
Build the aggregates.
│ │ │ │ -
FrontNeighbourCounter(const MatrixGraph &front)
Constructor.
│ │ │ │ -
Matrix::row_type Row
Constant Row iterator of the matrix.
Definition aggregates.hh:329
│ │ │ │ -
const Matrix * matrix_
The matrix we work on.
Definition aggregates.hh:296
│ │ │ │ -
const AggregateDescriptor & operator[](const VertexDescriptor &v) const
Get the aggregate a vertex belongs to.
│ │ │ │ -
void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
│ │ │ │ -
AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const AggregateDescriptor &aggregate, Visitor &visitor)
Constructor.
│ │ │ │ -
Matrix::ConstColIterator ColIter
Constant column iterator of the matrix.
Definition aggregates.hh:334
│ │ │ │ -
~AggregatesMap()
Destructor.
│ │ │ │ -
Matrix::field_type field_type
The current max value.
Definition aggregates.hh:179
│ │ │ │ -
void decrement()
Decrement counter.
│ │ │ │ -
Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet &connectivity, std::vector< Vertex > &front_)
Constructor.
│ │ │ │ -
V Visitor
The type of the adapted visitor.
Definition aggregates.hh:1064
│ │ │ │ -
std::size_t * SphereMap
Type of the mapping of aggregate members onto distance spheres.
Definition aggregates.hh:809
│ │ │ │ -
AggregationCriterion(const Parameters &parms)
Definition aggregates.hh:70
│ │ │ │ -
Matrix::row_type Row
Constant Row iterator of the matrix.
Definition aggregates.hh:268
│ │ │ │ -
VertexSet::size_type connectSize()
Get tne number of connections to other aggregates.
│ │ │ │ -
std::vector< real_type > vals_
Definition aggregates.hh:188
│ │ │ │ -
N Norm
The norm to use for examining the matrix entries.
Definition aggregates.hh:324
│ │ │ │ -
void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m, std::ostream &os)
Definition aggregates.hh:2583
│ │ │ │ -
void invalidate()
Definition aggregates.hh:822
│ │ │ │ -
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ -
real_type maxValue_
Definition aggregates.hh:181
│ │ │ │ -
Norm norm_
The functor for calculating the norm.
Definition aggregates.hh:183
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ -
VertexSet::const_iterator const_iterator
Const iterator over a vertex list.
Definition aggregates.hh:804
│ │ │ │ -
SymmetricCriterion(const Parameters &parms)
Definition aggregates.hh:521
│ │ │ │ -
MatrixGraph::VertexDescriptor AggregateDescriptor
The type of the aggregate descriptor.
Definition aggregates.hh:923
│ │ │ │ -
real_type maxValue_
Definition aggregates.hh:361
│ │ │ │ -
void init(const Matrix *matrix)
Definition aggregates.hh:195
│ │ │ │ -
real_type diagonal_
The norm of the current diagonal.
Definition aggregates.hh:367
│ │ │ │ -
AggregateDescriptor * iterator
Definition aggregates.hh:735
│ │ │ │ -
SymmetricDependency(const Parameters &parms)
Definition aggregates.hh:348
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
Definition aggregates.hh:360
│ │ │ │ -
~Aggregator()
Destructor.
│ │ │ │ -
void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
│ │ │ │ -
void add(const Vertex &vertex)
Add a vertex to the aggregate.
│ │ │ │ -
T DependencyPolicy
The policy for calculating the dependency graph.
Definition aggregates.hh:55
│ │ │ │ -
void add(std::vector< Vertex > &vertex)
│ │ │ │ -
void examine(const ColIter &col)
│ │ │ │ -
Aggregator()
Constructor.
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
Examine an edge.
│ │ │ │ -
FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph)
Constructor.
│ │ │ │ -
FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
compute the norm of a matrix.
Definition aggregates.hh:506
│ │ │ │ -
void init(const Matrix *matrix)
│ │ │ │ +
bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2)
Definition galerkin.hh:155
│ │ │ │ +
static void constructNonOverlapConnectivity(R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed)
Construct the connectivity of an aggregate in the overlap.
Definition galerkin.hh:313
│ │ │ │ +
G Graph
The type of the graph.
Definition galerkin.hh:211
│ │ │ │ +
void operator++()
Definition galerkin.hh:539
│ │ │ │ +
void operator()(const ConstEdgeIterator &edge)
Process an edge pointing to another aggregate.
Definition galerkin.hh:359
│ │ │ │ +
void insert(const typename M::size_type &index)
Definition galerkin.hh:552
│ │ │ │ +
static void constructOverlapConnectivity(R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const OverlapVertex< typename G::VertexDescriptor > *&seed, const OverlapVertex< typename G::VertexDescriptor > *overlapEnd)
Definition galerkin.hh:331
│ │ │ │ +
G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation &pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::Matrix::size_type &size, const Set &copy)
Calculates the coarse matrix via a Galerkin product.
Definition galerkin.hh:563
│ │ │ │ +
std::size_t index()
Definition galerkin.hh:81
│ │ │ │ +
T ParallelInformation
Definition galerkin.hh:120
│ │ │ │ +
G::VertexDescriptor Vertex
Definition galerkin.hh:272
│ │ │ │ +
T Aggregate
The aggregate descriptor.
Definition galerkin.hh:37
│ │ │ │ +
SparsityBuilder(M &matrix)
Constructor.
Definition galerkin.hh:513
│ │ │ │ +
ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph, VisitedMap &visitedMap, Set &connected)
Constructor.
Definition galerkin.hh:352
│ │ │ │ +
Graph::ConstEdgeIterator ConstEdgeIterator
The constant edge iterator.
Definition galerkin.hh:215
│ │ │ │ +
T Vertex
The vertex descriptor.
Definition galerkin.hh:42
│ │ │ │ +
G::VertexDescriptor Vertex
Definition galerkin.hh:288
│ │ │ │ +
static void examine(G &graph, V &visitedMap, const T &pinfo, const AggregatesMap< Vertex > &aggregates, const O &overlap, const OverlapVertex< Vertex > *overlapVertices, const OverlapVertex< Vertex > *overlapEnd, R &row)
Definition galerkin.hh:420
│ │ │ │ +
V VisitedMap
The type of the map for marking vertices as visited.
Definition galerkin.hh:225
│ │ │ │
int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
Visit all neighbour vertices of a vertex in a graph.
│ │ │ │ -
void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an isotropic problem.
Definition aggregates.hh:82
│ │ │ │ -
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ -
V AggregateDescriptor
The aggregate descriptor type.
Definition aggregates.hh:580
│ │ │ │ -
static const V ISOLATED
Identifier of isolated vertices.
Definition aggregates.hh:571
│ │ │ │ -
int row_
index of the currently evaluated row.
Definition aggregates.hh:365
│ │ │ │ -
SymmetricMatrixDependency()
Definition aggregates.hh:171
│ │ │ │ - │ │ │ │ - │ │ │ │ -
real_type diagonal_
The norm of the current diagonal.
Definition aggregates.hh:306
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices.
│ │ │ │ -
void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
Sets reasonable default values for an aisotropic problem.
Definition aggregates.hh:105
│ │ │ │ -
AggregatesMap(std::size_t noVertices)
Constructs with allocating memory.
│ │ │ │ -
Matrix::field_type field_type
The current max value.
Definition aggregates.hh:359
│ │ │ │ -
AggregateDescriptor & operator[](const VertexDescriptor &v)
Get the aggregate a vertex belongs to.
│ │ │ │ -
AggregatesMap()
Constructs without allocating memory.
│ │ │ │ -
int value()
Access the current count.
│ │ │ │ -
SLList< VertexDescriptor, Allocator > VertexList
The type of a single linked list of vertex descriptors.
Definition aggregates.hh:592
│ │ │ │ - │ │ │ │ -
ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex > &aggregates)
Constructor.
│ │ │ │ -
VertexSet::size_type size()
Get the size of the aggregate.
│ │ │ │ -
const_iterator end() const
get an iterator over the vertices of the aggregate.
│ │ │ │ -
void init(const Matrix *matrix)
│ │ │ │ -
UnSymmetricCriterion()
Definition aggregates.hh:544
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ -
const AggregateDescriptor * const_iterator
Definition aggregates.hh:723
│ │ │ │ -
int row_
index of the currently evaluated row.
Definition aggregates.hh:304
│ │ │ │ -
Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const AggregatesMap< Vertex > &aggregates)
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
Definition aggregates.hh:180
│ │ │ │ -
void initRow(const Row &row, int index)
│ │ │ │ -
M Matrix
The matrix type we build the dependency of.
Definition aggregates.hh:139
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
Definition aggregates.hh:299
│ │ │ │ -
const Matrix * matrix_
The matrix we work on.
Definition aggregates.hh:177
│ │ │ │ -
S VertexSet
The type of a single linked list of vertex descriptors.
Definition aggregates.hh:801
│ │ │ │ -
FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
compute the norm of a matrix.
Definition aggregates.hh:490
│ │ │ │ -
static const V UNAGGREGATED
Identifier of not yet aggregated vertices.
Definition aggregates.hh:566
│ │ │ │ -
std::size_t breadthFirstSearch(const VertexDescriptor &start, const AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM &visitedMap) const
Breadth first search within an aggregate.
│ │ │ │ -
Matrix::field_type field_type
The current max value.
Definition aggregates.hh:298
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ -
std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
Definition aggregates.hh:113
│ │ │ │ -
bool isIsolated()
Definition aggregates.hh:240
│ │ │ │ -
void allocate(std::size_t noVertices)
Allocate memory for holding the information.
│ │ │ │ -
N Norm
The norm to use for examining the matrix entries.
Definition aggregates.hh:144
│ │ │ │ -
FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
compute the norm of a matrix.
Definition aggregates.hh:473
│ │ │ │ -
void reconstruct(const Vertex &vertex)
Reconstruct the aggregat from an seed node.
│ │ │ │ -
const_iterator begin() const
get an iterator over the vertices of the aggregate.
│ │ │ │ -
FieldTraits< typenameM::field_type >::real_type operator()(const M &m, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr) const
compute the norm of a matrix.
Definition aggregates.hh:390
│ │ │ │ -
MatrixGraph::VertexDescriptor Vertex
The vertex descriptor type.
Definition aggregates.hh:789
│ │ │ │ -
void seed(const Vertex &vertex)
Initialize the aggregate with one vertex.
│ │ │ │ - │ │ │ │ -
SymmetricDependency()
Definition aggregates.hh:351
│ │ │ │ -
void clear()
Clear the aggregate.
│ │ │ │ -
void free()
Free the allocated memory.
│ │ │ │ -
void increment()
Increment counter.
│ │ │ │ -
void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
Build the dependency of the matrix graph.
│ │ │ │ -
V VertexDescriptor
The vertex descriptor type.
Definition aggregates.hh:575
│ │ │ │ -
real_type maxValue_
Definition aggregates.hh:300
│ │ │ │ -
std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
Build the aggregates.
│ │ │ │ -
Matrix::row_type Row
Constant Row iterator of the matrix.
Definition aggregates.hh:149
│ │ │ │ -
PoolAllocator< Vertex, 100 > Allocator
The allocator we use for our lists and the set.
Definition aggregates.hh:795
│ │ │ │ -
G MatrixGraph
Definition aggregates.hh:785
│ │ │ │ -
void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
│ │ │ │ -
@ is_sign_preserving
Definition aggregates.hh:483
│ │ │ │ -
@ is_sign_preserving
Definition aggregates.hh:382
│ │ │ │ -
@ is_sign_preserving
Definition aggregates.hh:499
│ │ │ │ -
@ is_sign_preserving
Definition aggregates.hh:466
│ │ │ │ +
S Set
The type of the connected set.
Definition galerkin.hh:220
│ │ │ │ +
Aggregate * aggregate
The aggregate the vertex belongs to.
Definition galerkin.hh:47
│ │ │ │ +
std::size_t sumRowSize()
Definition galerkin.hh:534
│ │ │ │ +
Vertex vertex
The vertex descriptor.
Definition galerkin.hh:52
│ │ │ │ +
std::size_t minRowSize()
Definition galerkin.hh:528
│ │ │ │ +
static void set(M &coarse, const T &pinfo, const O &copy)
Definition galerkin.hh:682
│ │ │ │ +
Graph::VertexDescriptor Vertex
The vertex descriptor of the graph.
Definition galerkin.hh:230
│ │ │ │ +
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
Calculate the galerkin product.
│ │ │ │ +
std::size_t maxRowSize()
Definition galerkin.hh:523
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ -
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │ -
Base class of all aggregation criterions.
Definition aggregates.hh:49
│ │ │ │ -
Dependency policy for symmetric matrices.
Definition aggregates.hh:134
│ │ │ │ -
Dependency policy for symmetric matrices.
Definition aggregates.hh:253
│ │ │ │ -
Dependency policy for symmetric matrices.
Definition aggregates.hh:314
│ │ │ │ -
Norm that uses only the [N][N] entry of the block to determine couplings.
Definition aggregates.hh:379
│ │ │ │ -
Norm that uses only the [0][0] entry of the block to determine couplings.
Definition aggregates.hh:455
│ │ │ │ -
Functor using the row sum (infinity) norm to determine strong couplings.
Definition aggregates.hh:463
│ │ │ │ -
Definition aggregates.hh:480
│ │ │ │ -
Definition aggregates.hh:496
│ │ │ │ -
Criterion taking advantage of symmetric matrices.
Definition aggregates.hh:519
│ │ │ │ -
Criterion suitable for unsymmetric matrices.
Definition aggregates.hh:539
│ │ │ │ -
Class for building the aggregates.
Definition aggregates.hh:909
│ │ │ │
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │
A Dummy visitor that does nothing for each visited edge.
Definition aggregates.hh:598
│ │ │ │ -
A class for temporarily storing the vertices of an aggregate in.
Definition aggregates.hh:778
│ │ │ │ -
M::size_type VertexDescriptor
The vertex descriptor.
Definition graph.hh:73
│ │ │ │ -
EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
The constant edge iterator type.
Definition graph.hh:298
│ │ │ │ -
Iterator over all edges starting from a vertex.
Definition graph.hh:95
│ │ │ │ -
The vertex iterator type of the graph.
Definition graph.hh:209
│ │ │ │ -
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ +
Definition galerkin.hh:33
│ │ │ │ +
Functor for building the sparsity pattern of the matrix using examineConnectivity.
Definition galerkin.hh:63
│ │ │ │ +
Definition galerkin.hh:99
│ │ │ │ +
Definition galerkin.hh:118
│ │ │ │ +
Definition galerkin.hh:185
│ │ │ │ +
Visitor for identifying connected aggregates during a breadthFirstSearch.
Definition galerkin.hh:206
│ │ │ │ +
Definition galerkin.hh:271
│ │ │ │ +
Definition galerkin.hh:300
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,2654 +1,816 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -aggregates.hh │ │ │ │ │ +galerkin.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_AGGREGATES_HH │ │ │ │ │ -6#define DUNE_AMG_AGGREGATES_HH │ │ │ │ │ +5#ifndef DUNE_GALERKIN_HH │ │ │ │ │ +6#define DUNE_GALERKIN_HH │ │ │ │ │ 7 │ │ │ │ │ -8 │ │ │ │ │ -9#include "_p_a_r_a_m_e_t_e_r_s_._h_h" │ │ │ │ │ -10#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -11#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ -12#include "_c_o_m_b_i_n_e_d_f_u_n_c_t_o_r_._h_h" │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20 │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ -24#include │ │ │ │ │ -25#include │ │ │ │ │ -26#include │ │ │ │ │ -27#include │ │ │ │ │ -28 │ │ │ │ │ -29namespace _D_u_n_e │ │ │ │ │ -30{ │ │ │ │ │ -31 namespace Amg │ │ │ │ │ -32 { │ │ │ │ │ -33 │ │ │ │ │ -47 template │ │ │ │ │ -_4_8 class _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n : public T │ │ │ │ │ -49 { │ │ │ │ │ -50 │ │ │ │ │ -51 public: │ │ │ │ │ -_5_5 typedef T _D_e_p_e_n_d_e_n_c_y_P_o_l_i_c_y; │ │ │ │ │ +8#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ +9#include "_p_i_n_f_o_._h_h" │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e │ │ │ │ │ +17{ │ │ │ │ │ +18 namespace Amg │ │ │ │ │ +19 { │ │ │ │ │ +31 template │ │ │ │ │ +_3_2 struct _O_v_e_r_l_a_p_V_e_r_t_e_x │ │ │ │ │ +33 { │ │ │ │ │ +_3_7 typedef T _A_g_g_r_e_g_a_t_e; │ │ │ │ │ +38 │ │ │ │ │ +_4_2 typedef T _V_e_r_t_e_x; │ │ │ │ │ +43 │ │ │ │ │ +_4_7 _A_g_g_r_e_g_a_t_e* _a_g_g_r_e_g_a_t_e; │ │ │ │ │ +48 │ │ │ │ │ +_5_2 _V_e_r_t_e_x _v_e_r_t_e_x; │ │ │ │ │ +53 }; │ │ │ │ │ +54 │ │ │ │ │ +55 │ │ │ │ │ 56 │ │ │ │ │ -_6_6 _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n() │ │ │ │ │ -67 : T() │ │ │ │ │ -68 {} │ │ │ │ │ -69 │ │ │ │ │ -_7_0 _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -71 : T(parms) │ │ │ │ │ -72 {} │ │ │ │ │ -_8_2 void _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ -83 { │ │ │ │ │ -84 this->setMaxDistance(diameter-1); │ │ │ │ │ -85 std::size_t csize=1; │ │ │ │ │ -86 │ │ │ │ │ -87 for(; dim>0; dim--) { │ │ │ │ │ -88 csize*=diameter; │ │ │ │ │ -89 this->setMaxDistance(this->maxDistance()+diameter-1); │ │ │ │ │ -90 } │ │ │ │ │ -91 this->setMinAggregateSize(csize); │ │ │ │ │ -92 this->setMaxAggregateSize(static_cast(csize*1.5)); │ │ │ │ │ -93 } │ │ │ │ │ -94 │ │ │ │ │ -_1_0_5 void _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c(std::size_t dim,std::size_t diameter=2) │ │ │ │ │ -106 { │ │ │ │ │ -107 _s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c(dim, diameter); │ │ │ │ │ -108 this->setMaxDistance(this->maxDistance()+dim-1); │ │ │ │ │ -109 } │ │ │ │ │ -110 }; │ │ │ │ │ -111 │ │ │ │ │ -112 template │ │ │ │ │ -_1_1_3 std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_<_T_>& │ │ │ │ │ -criterion) │ │ │ │ │ -114 { │ │ │ │ │ -115 os<<"{ maxdistance="< │ │ │ │ │ -_1_3_3 class _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y : public _D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -134 { │ │ │ │ │ -135 public: │ │ │ │ │ -_1_3_9 typedef M _M_a_t_r_i_x; │ │ │ │ │ -140 │ │ │ │ │ -_1_4_4 typedef N _N_o_r_m; │ │ │ │ │ -145 │ │ │ │ │ -_1_4_9 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _R_o_w; │ │ │ │ │ -150 │ │ │ │ │ -_1_5_4 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r; │ │ │ │ │ -155 │ │ │ │ │ -156 void _i_n_i_t(const _M_a_t_r_i_x* matrix); │ │ │ │ │ -157 │ │ │ │ │ -158 void _i_n_i_t_R_o_w(const _R_o_w& row, int index); │ │ │ │ │ -159 │ │ │ │ │ -160 void _e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l); │ │ │ │ │ +61 template │ │ │ │ │ +_6_2 class _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r │ │ │ │ │ +63 { │ │ │ │ │ +64 public: │ │ │ │ │ +70 _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r(M& matrix); │ │ │ │ │ +71 │ │ │ │ │ +72 void _i_n_s_e_r_t(const typename M::size_type& _i_n_d_e_x); │ │ │ │ │ +73 │ │ │ │ │ +74 void _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +75 │ │ │ │ │ +76 std::size_t _m_i_n_R_o_w_S_i_z_e(); │ │ │ │ │ +77 │ │ │ │ │ +78 std::size_t _m_a_x_R_o_w_S_i_z_e(); │ │ │ │ │ +79 │ │ │ │ │ +80 std::size_t _s_u_m_R_o_w_S_i_z_e(); │ │ │ │ │ +_8_1 std::size_t _i_n_d_e_x() │ │ │ │ │ +82 { │ │ │ │ │ +83 return row_.index(); │ │ │ │ │ +84 } │ │ │ │ │ +85 private: │ │ │ │ │ +87 typename M::CreateIterator row_; │ │ │ │ │ +89 std::size_t minRowSize_; │ │ │ │ │ +91 std::size_t maxRowSize_; │ │ │ │ │ +92 std::size_t sumRowSize_; │ │ │ │ │ +93#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +94 bool diagonalInserted; │ │ │ │ │ +95#endif │ │ │ │ │ +96 }; │ │ │ │ │ +97 │ │ │ │ │ +_9_8 class _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +99 { │ │ │ │ │ +100 public: │ │ │ │ │ +109 template │ │ │ │ │ +_1_1_0 void _c_a_l_c_u_l_a_t_e(const M& fine, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>& aggregates, M& │ │ │ │ │ +coarse, │ │ │ │ │ +111 const I& pinfo, const O& copy); │ │ │ │ │ +112 │ │ │ │ │ +113 }; │ │ │ │ │ +114 │ │ │ │ │ +115 template │ │ │ │ │ +_1_1_6 class _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +117 : public _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +118 { │ │ │ │ │ +119 public: │ │ │ │ │ +_1_2_0 typedef T _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +121 │ │ │ │ │ +131 template │ │ │ │ │ +132 typename G::MutableMatrix* _b_u_i_l_d(G& fineGraph, V& visitedMap, │ │ │ │ │ +133 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +134 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +135 const typename G::Matrix::size_type& size, │ │ │ │ │ +136 const Set& copy); │ │ │ │ │ +137 private: │ │ │ │ │ +138 │ │ │ │ │ +145 template │ │ │ │ │ +146 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* │ │ │ │ │ +147 buildOverlapVertices(const G& graph, const I& pinfo, │ │ │ │ │ +148 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +149 const Set& overlap, │ │ │ │ │ +150 std::size_t& overlapCount); │ │ │ │ │ +151 │ │ │ │ │ +152 template │ │ │ │ │ +153 struct OVLess │ │ │ │ │ +154 { │ │ │ │ │ +_1_5_5 bool _o_p_e_r_a_t_o_r_(_)(const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_A_>& o1, const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_A_>& o2) │ │ │ │ │ +156 { │ │ │ │ │ +157 return *o1._a_g_g_r_e_g_a_t_e < *o2._a_g_g_r_e_g_a_t_e; │ │ │ │ │ +158 } │ │ │ │ │ +159 }; │ │ │ │ │ +160 }; │ │ │ │ │ 161 │ │ │ │ │ -162 template │ │ │ │ │ -163 void _e_x_a_m_i_n_e(G& graph, const typename G::EdgeIterator& edge, const _C_o_l_I_t_e_r& │ │ │ │ │ -_c_o_l); │ │ │ │ │ -164 │ │ │ │ │ -165 bool _i_s_I_s_o_l_a_t_e_d(); │ │ │ │ │ -166 │ │ │ │ │ -167 │ │ │ │ │ -_1_6_8 _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -169 : _P_a_r_a_m_e_t_e_r_s(parms) │ │ │ │ │ -170 {} │ │ │ │ │ -_1_7_1 _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y() │ │ │ │ │ -172 : _P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ -173 {} │ │ │ │ │ -174 │ │ │ │ │ -175 protected: │ │ │ │ │ -_1_7_7 const _M_a_t_r_i_x* _m_a_t_r_i_x__; │ │ │ │ │ -_1_7_9 typedef typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_8_0 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -_1_8_1 _r_e_a_l___t_y_p_e _m_a_x_V_a_l_u_e__; │ │ │ │ │ -_1_8_3 _N_o_r_m _n_o_r_m__; │ │ │ │ │ -_1_8_5 int _r_o_w__; │ │ │ │ │ -_1_8_7 _r_e_a_l___t_y_p_e _d_i_a_g_o_n_a_l__; │ │ │ │ │ -_1_8_8 std::vector _v_a_l_s__; │ │ │ │ │ -_1_8_9 typename std::vector::iterator _v_a_l_I_t_e_r__; │ │ │ │ │ -190 │ │ │ │ │ -191 }; │ │ │ │ │ -192 │ │ │ │ │ -193 │ │ │ │ │ -194 template │ │ │ │ │ -_1_9_5 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t(const _M_a_t_r_i_x* matrix) │ │ │ │ │ -196 { │ │ │ │ │ -197 matrix_ = matrix; │ │ │ │ │ -198 } │ │ │ │ │ +162 template<> │ │ │ │ │ +_1_6_3 class _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ +164 : public _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +165 { │ │ │ │ │ +166 public: │ │ │ │ │ +176 template │ │ │ │ │ +177 typename G::MutableMatrix* _b_u_i_l_d(G& fineGraph, V& visitedMap, │ │ │ │ │ +178 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +179 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +180 const typename G::Matrix::size_type& size, │ │ │ │ │ +181 const Set& copy); │ │ │ │ │ +182 }; │ │ │ │ │ +183 │ │ │ │ │ +_1_8_4 struct _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ +185 { │ │ │ │ │ +186 template │ │ │ │ │ +187 static void _c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, G& graph, V& visitedMap, │ │ │ │ │ +188 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +189 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>*& seed, │ │ │ │ │ +190 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* overlapEnd); │ │ │ │ │ +191 │ │ │ │ │ +195 template │ │ │ │ │ +196 static void _c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, G& graph, V& │ │ │ │ │ +visitedMap, │ │ │ │ │ +197 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +198 const typename G::VertexDescriptor& seed); │ │ │ │ │ 199 │ │ │ │ │ -200 template │ │ │ │ │ -_2_0_1 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w(const _R_o_w& row, int │ │ │ │ │ -index) │ │ │ │ │ -202 { │ │ │ │ │ -203 using std::min; │ │ │ │ │ -204 vals_.assign(row.size(), 0.0); │ │ │ │ │ -205 assert(vals_.size()==row.size()); │ │ │ │ │ -206 valIter_=vals_.begin(); │ │ │ │ │ -207 │ │ │ │ │ -208 maxValue_ = min(- std::numeric_limits::max(), std:: │ │ │ │ │ -numeric_limits::min()); │ │ │ │ │ -209 diagonal_=norm_(row[index]); │ │ │ │ │ -210 row_ = index; │ │ │ │ │ -211 } │ │ │ │ │ -212 │ │ │ │ │ -213 template │ │ │ │ │ -_2_1_4 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l) │ │ │ │ │ -215 { │ │ │ │ │ -216 using std::max; │ │ │ │ │ -217 // skip positive offdiagonals if norm preserves sign of them. │ │ │ │ │ -218 _r_e_a_l___t_y_p_e eij = norm_(*_c_o_l); │ │ │ │ │ -219 if(!N::is_sign_preserving || eij<0) // || eji<0) │ │ │ │ │ -220 { │ │ │ │ │ -221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](_c_o_l.index()) │ │ │ │ │ -[_c_o_l.index()]); │ │ │ │ │ -222 maxValue_ = max(maxValue_, *valIter_); │ │ │ │ │ -223 }else │ │ │ │ │ -224 *valIter_ =0; │ │ │ │ │ -225 ++valIter_; │ │ │ │ │ -226 } │ │ │ │ │ -227 │ │ │ │ │ -228 template │ │ │ │ │ -229 template │ │ │ │ │ -_2_3_0 inline void _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(G&, const typename G:: │ │ │ │ │ -EdgeIterator& edge, const _C_o_l_I_t_e_r&) │ │ │ │ │ -231 { │ │ │ │ │ -232 if(*valIter_ > alpha() * maxValue_) { │ │ │ │ │ -233 edge.properties().setDepends(); │ │ │ │ │ -234 edge.properties().setInfluences(); │ │ │ │ │ -235 } │ │ │ │ │ -236 ++valIter_; │ │ │ │ │ -237 } │ │ │ │ │ -238 │ │ │ │ │ -239 template │ │ │ │ │ -_2_4_0 inline bool _S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_s_I_s_o_l_a_t_e_d() │ │ │ │ │ -241 { │ │ │ │ │ -242 if(diagonal_==0) │ │ │ │ │ -243 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r, "No diagonal entry for row "< │ │ │ │ │ +_2_0_5 class _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ +206 { │ │ │ │ │ +207 public: │ │ │ │ │ +_2_1_1 typedef G _G_r_a_p_h; │ │ │ │ │ +_2_1_5 typedef typename Graph::ConstEdgeIterator _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +216 │ │ │ │ │ +_2_2_0 typedef S _S_e_t; │ │ │ │ │ +221 │ │ │ │ │ +_2_2_5 typedef V _V_i_s_i_t_e_d_M_a_p; │ │ │ │ │ +226 │ │ │ │ │ +_2_3_0 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ +231 │ │ │ │ │ +239 _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _G_r_a_p_h& graph, │ │ │ │ │ +240 _V_i_s_i_t_e_d_M_a_p& visitedMap, _S_e_t& connected); │ │ │ │ │ +241 │ │ │ │ │ +246 void _o_p_e_r_a_t_o_r_(_)(const _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ 247 │ │ │ │ │ -251 template │ │ │ │ │ -_2_5_2 class _D_e_p_e_n_d_e_n_c_y : public _P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -253 { │ │ │ │ │ -254 public: │ │ │ │ │ -_2_5_8 typedef M _M_a_t_r_i_x; │ │ │ │ │ -259 │ │ │ │ │ -_2_6_3 typedef N _N_o_r_m; │ │ │ │ │ -264 │ │ │ │ │ -_2_6_8 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _R_o_w; │ │ │ │ │ -269 │ │ │ │ │ -_2_7_3 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r; │ │ │ │ │ -274 │ │ │ │ │ -_2_7_5 void _i_n_i_t(const _M_a_t_r_i_x* matrix); │ │ │ │ │ -276 │ │ │ │ │ -_2_7_7 void _i_n_i_t_R_o_w(const _R_o_w& row, int index); │ │ │ │ │ -278 │ │ │ │ │ -_2_7_9 void _e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l); │ │ │ │ │ -280 │ │ │ │ │ -281 template │ │ │ │ │ -_2_8_2 void _e_x_a_m_i_n_e(G& graph, const typename G::EdgeIterator& edge, const _C_o_l_I_t_e_r& │ │ │ │ │ -_c_o_l); │ │ │ │ │ -283 │ │ │ │ │ -_2_8_4 bool _i_s_I_s_o_l_a_t_e_d(); │ │ │ │ │ -285 │ │ │ │ │ -_2_8_6 _D_e_p_e_n_d_e_n_c_y(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -287 : _P_a_r_a_m_e_t_e_r_s(parms) │ │ │ │ │ -288 {} │ │ │ │ │ +248 private: │ │ │ │ │ +252 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ +253 │ │ │ │ │ +254 _G_r_a_p_h& graph_; │ │ │ │ │ +255 │ │ │ │ │ +259 _V_i_s_i_t_e_d_M_a_p& visitedMap_; │ │ │ │ │ +260 │ │ │ │ │ +264 _S_e_t& connected_; │ │ │ │ │ +265 }; │ │ │ │ │ +266 │ │ │ │ │ +267 }; │ │ │ │ │ +268 │ │ │ │ │ +269 template │ │ │ │ │ +_2_7_0 struct _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r : public _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ +271 { │ │ │ │ │ +_2_7_2 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ +273 │ │ │ │ │ +274 template │ │ │ │ │ +275 static void _e_x_a_m_i_n_e(G& graph, │ │ │ │ │ +276 V& visitedMap, │ │ │ │ │ +277 const T& pinfo, │ │ │ │ │ +278 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +279 const O& overlap, │ │ │ │ │ +280 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapVertices, │ │ │ │ │ +281 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapEnd, │ │ │ │ │ +282 R& row); │ │ │ │ │ +283 }; │ │ │ │ │ +284 │ │ │ │ │ +285 template │ │ │ │ │ +_2_8_6 struct _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r : public │ │ │ │ │ +_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ +287 { │ │ │ │ │ +_2_8_8 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ 289 │ │ │ │ │ -_2_9_0 _D_e_p_e_n_d_e_n_c_y() │ │ │ │ │ -291 : _P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ -292 {} │ │ │ │ │ -293 │ │ │ │ │ -294 protected: │ │ │ │ │ -_2_9_6 const _M_a_t_r_i_x* _m_a_t_r_i_x__; │ │ │ │ │ -_2_9_8 typedef typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_9_9 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -_3_0_0 _r_e_a_l___t_y_p_e _m_a_x_V_a_l_u_e__; │ │ │ │ │ -_3_0_2 _N_o_r_m _n_o_r_m__; │ │ │ │ │ -_3_0_4 int _r_o_w__; │ │ │ │ │ -_3_0_6 _r_e_a_l___t_y_p_e _d_i_a_g_o_n_a_l__; │ │ │ │ │ -307 }; │ │ │ │ │ -308 │ │ │ │ │ -312 template │ │ │ │ │ -_3_1_3 class _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y : public _P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -314 { │ │ │ │ │ -315 public: │ │ │ │ │ -_3_1_9 typedef M _M_a_t_r_i_x; │ │ │ │ │ -320 │ │ │ │ │ -_3_2_4 typedef N _N_o_r_m; │ │ │ │ │ -325 │ │ │ │ │ -_3_2_9 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e _R_o_w; │ │ │ │ │ -330 │ │ │ │ │ -_3_3_4 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r _C_o_l_I_t_e_r; │ │ │ │ │ -335 │ │ │ │ │ -_3_3_6 void _i_n_i_t(const _M_a_t_r_i_x* matrix); │ │ │ │ │ -337 │ │ │ │ │ -_3_3_8 void _i_n_i_t_R_o_w(const _R_o_w& row, int index); │ │ │ │ │ -339 │ │ │ │ │ -_3_4_0 void _e_x_a_m_i_n_e(const _C_o_l_I_t_e_r& _c_o_l); │ │ │ │ │ -341 │ │ │ │ │ -342 template │ │ │ │ │ -_3_4_3 void _e_x_a_m_i_n_e(G& graph, const typename G::EdgeIterator& edge, const _C_o_l_I_t_e_r& │ │ │ │ │ -_c_o_l); │ │ │ │ │ -344 │ │ │ │ │ -_3_4_5 bool _i_s_I_s_o_l_a_t_e_d(); │ │ │ │ │ -346 │ │ │ │ │ -347 │ │ │ │ │ -_3_4_8 _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -349 : _P_a_r_a_m_e_t_e_r_s(parms) │ │ │ │ │ -350 {} │ │ │ │ │ -_3_5_1 _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y() │ │ │ │ │ -352 : _P_a_r_a_m_e_t_e_r_s() │ │ │ │ │ -353 {} │ │ │ │ │ -354 │ │ │ │ │ -355 protected: │ │ │ │ │ -_3_5_7 const _M_a_t_r_i_x* _m_a_t_r_i_x__; │ │ │ │ │ -_3_5_9 typedef typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_3_6_0 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -_3_6_1 _r_e_a_l___t_y_p_e _m_a_x_V_a_l_u_e__; │ │ │ │ │ -_3_6_3 _N_o_r_m _n_o_r_m__; │ │ │ │ │ -_3_6_5 int _r_o_w__; │ │ │ │ │ -_3_6_7 _r_e_a_l___t_y_p_e _d_i_a_g_o_n_a_l__; │ │ │ │ │ -368 private: │ │ │ │ │ -369 void _i_n_i_t_R_o_w(const _R_o_w& row, int index, const std::true_type&); │ │ │ │ │ -370 void _i_n_i_t_R_o_w(const _R_o_w& row, int index, const std::false_type&); │ │ │ │ │ -371 }; │ │ │ │ │ -372 │ │ │ │ │ -377 template │ │ │ │ │ -_3_7_8 class _D_i_a_g_o_n_a_l │ │ │ │ │ -379 { │ │ │ │ │ -380 public: │ │ │ │ │ -381 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ -382 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = true │ │ │ │ │ -_3_8_3 }; │ │ │ │ │ +290 template │ │ │ │ │ +291 static void _e_x_a_m_i_n_e(G& graph, │ │ │ │ │ +292 V& visitedMap, │ │ │ │ │ +293 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +294 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +295 R& row); │ │ │ │ │ +296 }; │ │ │ │ │ +297 │ │ │ │ │ +298 template │ │ │ │ │ +_2_9_9 struct _D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r │ │ │ │ │ +300 { │ │ │ │ │ +301 template │ │ │ │ │ +302 static void _s_e_t(M& coarse, const T& pinfo, const O& copy); │ │ │ │ │ +303 }; │ │ │ │ │ +304 │ │ │ │ │ +305 template<> │ │ │ │ │ +_3_0_6 struct _D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ +307 { │ │ │ │ │ +308 template │ │ │ │ │ +309 static void _s_e_t(M& coarse, const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, const O& │ │ │ │ │ +copy); │ │ │ │ │ +310 }; │ │ │ │ │ +311 │ │ │ │ │ +312 template │ │ │ │ │ +_3_1_3 void _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, │ │ │ │ │ +G& graph, V& visitedMap, │ │ │ │ │ +314 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +315 const typename G::VertexDescriptor& seed) │ │ │ │ │ +316 { │ │ │ │ │ +317 assert(row.index()==aggregates[seed]); │ │ │ │ │ +318 row.insert(aggregates[seed]); │ │ │ │ │ +319 _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_R_,_V_> conBuilder(aggregates, graph, visitedMap, row); │ │ │ │ │ +320 typedef typename G::VertexDescriptor Vertex; │ │ │ │ │ +321 typedef std::allocator Allocator; │ │ │ │ │ +322 typedef SLList VertexList; │ │ │ │ │ +323 typedef typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r DummyVisitor; │ │ │ │ │ +324 VertexList vlist; │ │ │ │ │ +325 DummyVisitor dummy; │ │ │ │ │ +326 aggregates.template breadthFirstSearch(seed,aggregates[seed], │ │ │ │ │ +graph, vlist, dummy, │ │ │ │ │ +327 conBuilder, visitedMap); │ │ │ │ │ +328 } │ │ │ │ │ +329 │ │ │ │ │ +330 template │ │ │ │ │ +_3_3_1 void _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, G& │ │ │ │ │ +graph, V& visitedMap, │ │ │ │ │ +332 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +333 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>*& seed, │ │ │ │ │ +334 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* overlapEnd) │ │ │ │ │ +335 { │ │ │ │ │ +336 _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_R_,_V_> conBuilder(aggregates, graph, visitedMap, row); │ │ │ │ │ +337 const typename G::VertexDescriptor aggregate=*seed->_a_g_g_r_e_g_a_t_e; │ │ │ │ │ +338 │ │ │ │ │ +339 if (row.index()==*seed->_a_g_g_r_e_g_a_t_e) { │ │ │ │ │ +340 while(seed != overlapEnd && aggregate == *seed->_a_g_g_r_e_g_a_t_e) { │ │ │ │ │ +341 row.insert(*seed->_a_g_g_r_e_g_a_t_e); │ │ │ │ │ +342 // Walk over all neighbours and add them to the connected array. │ │ │ │ │ +343 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(graph, seed->_v_e_r_t_e_x, conBuilder); │ │ │ │ │ +344 // Mark vertex as visited │ │ │ │ │ +345 put(visitedMap, seed->_v_e_r_t_e_x, true); │ │ │ │ │ +346 ++seed; │ │ │ │ │ +347 } │ │ │ │ │ +348 } │ │ │ │ │ +349 } │ │ │ │ │ +350 │ │ │ │ │ +351 template │ │ │ │ │ +_3_5_2 _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_S_,_V_>_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ +(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +353 _G_r_a_p_h& graph, _V_i_s_i_t_e_d_M_a_p& visitedMap, │ │ │ │ │ +354 _S_e_t& connected) │ │ │ │ │ +355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap), │ │ │ │ │ +connected_(connected) │ │ │ │ │ +356 {} │ │ │ │ │ +357 │ │ │ │ │ +358 template │ │ │ │ │ +_3_5_9 void _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_S_,_V_>_:_:_o_p_e_r_a_t_o_r_(_)(const │ │ │ │ │ +_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ +360 { │ │ │ │ │ +361 const _V_e_r_t_e_x& vertex = aggregates_[edge.target()]; │ │ │ │ │ +362 assert(vertex!= _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_U_N_A_G_G_R_E_G_A_T_E_D); │ │ │ │ │ +363 if(vertex!= _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ +364 connected_.insert(vertex); │ │ │ │ │ +365 } │ │ │ │ │ +366 │ │ │ │ │ +367 template │ │ │ │ │ +368 template │ │ │ │ │ +369 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* │ │ │ │ │ +370 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_T_>_:_:_b_u_i_l_d_O_v_e_r_l_a_p_V_e_r_t_i_c_e_s(const G& graph, const I& pinfo, │ │ │ │ │ +371 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +372 const Set& overlap, │ │ │ │ │ +373 std::size_t& overlapCount) │ │ │ │ │ +374 { │ │ │ │ │ +375 // count the overlap vertices. │ │ │ │ │ +376 typedef typename G::ConstVertexIterator ConstIterator; │ │ │ │ │ +377 typedef typename I::GlobalLookupIndexSet GlobalLookup; │ │ │ │ │ +378 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ +379 │ │ │ │ │ +380 const ConstIterator end = graph.end(); │ │ │ │ │ +381 overlapCount = 0; │ │ │ │ │ +382 │ │ │ │ │ +383 const GlobalLookup& lookup=pinfo.globalLookup(); │ │ │ │ │ 384 │ │ │ │ │ -389 template │ │ │ │ │ -_3_9_0 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ -m, │ │ │ │ │ -391 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ -sfinae = nullptr) const │ │ │ │ │ -392 { │ │ │ │ │ -393 typedef typename M::field_type field_type; │ │ │ │ │ -394 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ -395 static_assert( std::is_convertible::value, │ │ │ │ │ -396 "use of diagonal norm in AMG not implemented for complex field_type"); │ │ │ │ │ -397 return m[N][N]; │ │ │ │ │ -398 // possible implementation for complex types: return signed_abs(m[N][N]); │ │ │ │ │ -399 } │ │ │ │ │ -400 │ │ │ │ │ -405 template │ │ │ │ │ -_4_0_6 auto _o_p_e_r_a_t_o_r_(_)(const M& m, │ │ │ │ │ -407 typename std::enable_if_t::value>* sfinae = nullptr) │ │ │ │ │ -const │ │ │ │ │ -408 { │ │ │ │ │ -409 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ -410 static_assert( std::is_convertible::value, │ │ │ │ │ -411 "use of diagonal norm in AMG not implemented for complex field_type"); │ │ │ │ │ -412 return m; │ │ │ │ │ -413 // possible implementation for complex types: return signed_abs(m[N][N]); │ │ │ │ │ -414 } │ │ │ │ │ -415 │ │ │ │ │ -416 private: │ │ │ │ │ +385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) { │ │ │ │ │ +386 const IndexPair* pair = lookup.pair(*vertex); │ │ │ │ │ +387 │ │ │ │ │ +388 if(pair!=0 && overlap.contains(pair->local().attribute())) │ │ │ │ │ +389 ++overlapCount; │ │ │ │ │ +390 } │ │ │ │ │ +391 // Allocate space │ │ │ │ │ +392 typedef typename G::VertexDescriptor Vertex; │ │ │ │ │ +393 │ │ │ │ │ +394 _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapVertices = new _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_> │ │ │ │ │ +[overlapCount=0 ? 1 : overlapCount]; │ │ │ │ │ +395 if(overlapCount==0) │ │ │ │ │ +396 return overlapVertices; │ │ │ │ │ +397 │ │ │ │ │ +398 // Initialize them │ │ │ │ │ +399 overlapCount=0; │ │ │ │ │ +400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) { │ │ │ │ │ +401 const IndexPair* pair = lookup.pair(*vertex); │ │ │ │ │ +402 │ │ │ │ │ +403 if(pair!=0 && overlap.contains(pair->local().attribute())) { │ │ │ │ │ +404 overlapVertices[overlapCount]._a_g_g_r_e_g_a_t_e = &aggregates[pair->local()]; │ │ │ │ │ +405 overlapVertices[overlapCount]._v_e_r_t_e_x = pair->local(); │ │ │ │ │ +406 ++overlapCount; │ │ │ │ │ +407 } │ │ │ │ │ +408 } │ │ │ │ │ +409 │ │ │ │ │ +410 dverb << overlapCount<<" overlap vertices"<()); │ │ │ │ │ +413 // due to the sorting the isolated aggregates (to be skipped) are at the │ │ │ │ │ +end. │ │ │ │ │ +414 │ │ │ │ │ +415 return overlapVertices; │ │ │ │ │ +416 } │ │ │ │ │ 417 │ │ │ │ │ -419 template │ │ │ │ │ -420 static T signed_abs(const T & v) │ │ │ │ │ -421 { │ │ │ │ │ -422 return v; │ │ │ │ │ -423 } │ │ │ │ │ -424 │ │ │ │ │ -426 template │ │ │ │ │ -427 static T signed_abs(const std::complex & v) │ │ │ │ │ +418 template │ │ │ │ │ +419 template │ │ │ │ │ +_4_2_0 void _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_G_,_T_>_:_:_e_x_a_m_i_n_e(G& graph, │ │ │ │ │ +421 V& visitedMap, │ │ │ │ │ +422 const T& pinfo, │ │ │ │ │ +423 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +424 const O& overlap, │ │ │ │ │ +425 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapVertices, │ │ │ │ │ +426 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapEnd, │ │ │ │ │ +427 R& row) │ │ │ │ │ 428 { │ │ │ │ │ -429 // return sign * abs_value │ │ │ │ │ -430 // in case of complex numbers this extends to using the csgn function to │ │ │ │ │ -determine the sign │ │ │ │ │ -431 return csgn(v) * std::abs(v); │ │ │ │ │ -432 } │ │ │ │ │ +429 typedef typename T::GlobalLookupIndexSet GlobalLookup; │ │ │ │ │ +430 const GlobalLookup& lookup = pinfo.globalLookup(); │ │ │ │ │ +431 │ │ │ │ │ +432 typedef typename G::VertexIterator VertexIterator; │ │ │ │ │ 433 │ │ │ │ │ -435 template │ │ │ │ │ -436 static T csgn(const T & v) │ │ │ │ │ -437 { │ │ │ │ │ -438 return (T(0) < v) - (v < T(0)); │ │ │ │ │ -439 } │ │ │ │ │ -440 │ │ │ │ │ -442 template │ │ │ │ │ -443 static T csgn(std::complex a) │ │ │ │ │ -444 { │ │ │ │ │ -445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag()); │ │ │ │ │ -446 } │ │ │ │ │ -447 │ │ │ │ │ -448 }; │ │ │ │ │ -449 │ │ │ │ │ -_4_5_4 class _F_i_r_s_t_D_i_a_g_o_n_a_l : public _D_i_a_g_o_n_a_l<0> │ │ │ │ │ -455 {}; │ │ │ │ │ -456 │ │ │ │ │ -_4_6_2 struct _R_o_w_S_u_m │ │ │ │ │ -463 { │ │ │ │ │ -464 │ │ │ │ │ -465 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ -466 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = false │ │ │ │ │ -_4_6_7 }; │ │ │ │ │ -472 template │ │ │ │ │ -_4_7_3 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ -m) const │ │ │ │ │ -474 { │ │ │ │ │ -475 return m.infinity_norm(); │ │ │ │ │ -476 } │ │ │ │ │ -477 }; │ │ │ │ │ -478 │ │ │ │ │ -_4_7_9 struct _F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ -480 { │ │ │ │ │ -481 │ │ │ │ │ -482 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ -483 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = false │ │ │ │ │ -_4_8_4 }; │ │ │ │ │ -489 template │ │ │ │ │ -_4_9_0 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ -m) const │ │ │ │ │ -491 { │ │ │ │ │ -492 return m.frobenius_norm(); │ │ │ │ │ -493 } │ │ │ │ │ -494 }; │ │ │ │ │ -_4_9_5 struct _A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ -496 { │ │ │ │ │ -497 │ │ │ │ │ -498 enum { /* @brief We preserve the sign.*/ │ │ │ │ │ -499 _i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g = false │ │ │ │ │ -_5_0_0 }; │ │ │ │ │ -505 template │ │ │ │ │ -_5_0_6 typename FieldTraits::real_type _o_p_e_r_a_t_o_r_(_)(const M& │ │ │ │ │ -m) const │ │ │ │ │ -507 { │ │ │ │ │ -508 return 1; │ │ │ │ │ -509 } │ │ │ │ │ -510 }; │ │ │ │ │ -517 template │ │ │ │ │ -_5_1_8 class _S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n : public │ │ │ │ │ -_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n > │ │ │ │ │ -519 { │ │ │ │ │ -520 public: │ │ │ │ │ -_5_2_1 _S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -522 : _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n<_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y >(parms) │ │ │ │ │ -523 {} │ │ │ │ │ -_5_2_4 _S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n() │ │ │ │ │ -525 {} │ │ │ │ │ -526 }; │ │ │ │ │ -527 │ │ │ │ │ -528 │ │ │ │ │ -537 template │ │ │ │ │ -_5_3_8 class _U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n : public _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -> │ │ │ │ │ -539 { │ │ │ │ │ -540 public: │ │ │ │ │ -_5_4_1 _U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n(const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -542 : _A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n<_D_e_p_e_n_d_e_n_c_y >(parms) │ │ │ │ │ -543 {} │ │ │ │ │ -_5_4_4 _U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n() │ │ │ │ │ -545 {} │ │ │ │ │ -546 }; │ │ │ │ │ -547 // forward declaration │ │ │ │ │ -548 template class Aggregator; │ │ │ │ │ -549 │ │ │ │ │ +434 VertexIterator vend=graph.end(); │ │ │ │ │ +435 │ │ │ │ │ +436#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +437 std::set examined; │ │ │ │ │ +438#endif │ │ │ │ │ +439 │ │ │ │ │ +440 // The aggregates owned by the process have lower local indices │ │ │ │ │ +441 // then those not owned. We process them in the first pass. │ │ │ │ │ +442 // They represent the rows 0, 1, ..., n of the coarse matrix │ │ │ │ │ +443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) │ │ │ │ │ +444 if(!_g_e_t(visitedMap, *vertex)) { │ │ │ │ │ +445 // In the first pass we only process owner nodes │ │ │ │ │ +446 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ +447 const IndexPair* pair = lookup.pair(*vertex); │ │ │ │ │ +448 if(pair==0 || !overlap.contains(pair->local().attribute())) { │ │ │ │ │ +449#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +450 assert(examined.find(aggregates[*vertex])==examined.end()); │ │ │ │ │ +451 examined.insert(aggregates[*vertex]); │ │ │ │ │ +452#endif │ │ │ │ │ +453 _c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ +*vertex); │ │ │ │ │ +454 │ │ │ │ │ +455 // only needed for ALU │ │ │ │ │ +456 // (ghosts with same global id as owners on the same process) │ │ │ │ │ +457 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(pinfo) == static_cast(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ +_n_o_n_o_v_e_r_l_a_p_p_i_n_g)) { │ │ │ │ │ +458 if(overlapVertices != overlapEnd) { │ │ │ │ │ +459 if(*overlapVertices->_a_g_g_r_e_g_a_t_e!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) { │ │ │ │ │ +460 _c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ +overlapVertices, overlapEnd); │ │ │ │ │ +461 } │ │ │ │ │ +462 else{ │ │ │ │ │ +463 ++overlapVertices; │ │ │ │ │ +464 } │ │ │ │ │ +465 } │ │ │ │ │ +466 } │ │ │ │ │ +467 ++row; │ │ │ │ │ +468 } │ │ │ │ │ +469 } │ │ │ │ │ +470 │ │ │ │ │ +471 dvverb<<"constructed "<_a_g_g_r_e_g_a_t_e!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) { │ │ │ │ │ +477 │ │ │ │ │ +478#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +479 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ +480 const IndexPair* pair = lookup.pair(overlapVertices->_v_e_r_t_e_x); │ │ │ │ │ +481 assert(pair!=0 && overlap.contains(pair->local().attribute())); │ │ │ │ │ +482 assert(examined.find(aggregates[overlapVertices->_v_e_r_t_e_x])==examined.end()); │ │ │ │ │ +483 examined.insert(aggregates[overlapVertices->_v_e_r_t_e_x]); │ │ │ │ │ +484#endif │ │ │ │ │ +485 _c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ +overlapVertices, overlapEnd); │ │ │ │ │ +486 ++row; │ │ │ │ │ +487 }else{ │ │ │ │ │ +488 ++overlapVertices; │ │ │ │ │ +489 } │ │ │ │ │ +490 } │ │ │ │ │ +491 │ │ │ │ │ +492 template │ │ │ │ │ +493 template │ │ │ │ │ +_4_9_4 void _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_G_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_e_x_a_m_i_n_e(G& graph, │ │ │ │ │ +495 V& visitedMap, │ │ │ │ │ +496 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +497 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +498 R& row) │ │ │ │ │ +499 { │ │ │ │ │ +500 typedef typename G::VertexIterator VertexIterator; │ │ │ │ │ +501 │ │ │ │ │ +502 VertexIterator vend=graph.end(); │ │ │ │ │ +503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ +504 if(!_g_e_t(visitedMap, *vertex)) { │ │ │ │ │ +505 _c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ +*vertex); │ │ │ │ │ +506 ++row; │ │ │ │ │ +507 } │ │ │ │ │ +508 } │ │ │ │ │ +509 │ │ │ │ │ +510 } │ │ │ │ │ +511 │ │ │ │ │ +512 template │ │ │ │ │ +_5_1_3 _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r(M& matrix) │ │ │ │ │ +514 : row_(matrix.createbegin()), │ │ │ │ │ +515 minRowSize_(_s_t_d::numeric_limits<_s_t_d::size_t>::max()), │ │ │ │ │ +516 maxRowSize_(0), sumRowSize_(0) │ │ │ │ │ +517 { │ │ │ │ │ +518#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +519 diagonalInserted = false; │ │ │ │ │ +520#endif │ │ │ │ │ +521 } │ │ │ │ │ +522 template │ │ │ │ │ +_5_2_3 std::size_t _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_m_a_x_R_o_w_S_i_z_e() │ │ │ │ │ +524 { │ │ │ │ │ +525 return maxRowSize_; │ │ │ │ │ +526 } │ │ │ │ │ +527 template │ │ │ │ │ +_5_2_8 std::size_t _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_m_i_n_R_o_w_S_i_z_e() │ │ │ │ │ +529 { │ │ │ │ │ +530 return minRowSize_; │ │ │ │ │ +531 } │ │ │ │ │ +532 │ │ │ │ │ +533 template │ │ │ │ │ +_5_3_4 std::size_t _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_s_u_m_R_o_w_S_i_z_e() │ │ │ │ │ +535 { │ │ │ │ │ +536 return sumRowSize_; │ │ │ │ │ +537 } │ │ │ │ │ +538 template │ │ │ │ │ +_5_3_9 void _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +540 { │ │ │ │ │ +541 sumRowSize_ += row_.size(); │ │ │ │ │ +542 minRowSize_=std::min(minRowSize_, row_.size()); │ │ │ │ │ +543 maxRowSize_=std::max(maxRowSize_, row_.size()); │ │ │ │ │ +544 ++row_; │ │ │ │ │ +545#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +546 assert(diagonalInserted); │ │ │ │ │ +547 diagonalInserted = false; │ │ │ │ │ +548#endif │ │ │ │ │ +549 } │ │ │ │ │ 550 │ │ │ │ │ -558 template │ │ │ │ │ -_5_5_9 class _A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -560 { │ │ │ │ │ -561 public: │ │ │ │ │ -562 │ │ │ │ │ -_5_6_6 static const V _U_N_A_G_G_R_E_G_A_T_E_D; │ │ │ │ │ -567 │ │ │ │ │ -_5_7_1 static const V _I_S_O_L_A_T_E_D; │ │ │ │ │ -_5_7_5 typedef V _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -576 │ │ │ │ │ -_5_8_0 typedef V _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -581 │ │ │ │ │ -_5_8_6 typedef PoolAllocator _A_l_l_o_c_a_t_o_r; │ │ │ │ │ -587 │ │ │ │ │ -_5_9_2 typedef SLList _V_e_r_t_e_x_L_i_s_t; │ │ │ │ │ +551 template │ │ │ │ │ +_5_5_2 void _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_i_n_s_e_r_t(const typename M::size_type& index) │ │ │ │ │ +553 { │ │ │ │ │ +554 row_.insert(index); │ │ │ │ │ +555#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +556 diagonalInserted = diagonalInserted || row_.index()==index; │ │ │ │ │ +557#endif │ │ │ │ │ +558 } │ │ │ │ │ +559 │ │ │ │ │ +560 template │ │ │ │ │ +561 template │ │ │ │ │ +562 typename G::MutableMatrix* │ │ │ │ │ +_5_6_3 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_T_>_:_:_b_u_i_l_d(G& fineGraph, V& visitedMap, │ │ │ │ │ +564 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +565 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ +566 const typename G::Matrix::size_type& size, │ │ │ │ │ +567 const Set& overlap) │ │ │ │ │ +568 { │ │ │ │ │ +569 typedef _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_> _O_v_e_r_l_a_p_V_e_r_t_e_x; │ │ │ │ │ +570 │ │ │ │ │ +571 std::size_t count; │ │ │ │ │ +572 │ │ │ │ │ +573 const _O_v_e_r_l_a_p_V_e_r_t_e_x* overlapVertices = buildOverlapVertices(fineGraph, │ │ │ │ │ +574 pinfo, │ │ │ │ │ +575 aggregates, │ │ │ │ │ +576 overlap, │ │ │ │ │ +577 count); │ │ │ │ │ +578 typedef typename G::MutableMatrix M; │ │ │ │ │ +579 M* coarseMatrix = new M(size, size, M::row_wise); │ │ │ │ │ +580 │ │ │ │ │ +581 // Reset the visited flags of all vertices. │ │ │ │ │ +582 // As the isolated nodes will be skipped we simply mark them as visited │ │ │ │ │ +583 │ │ │ │ │ +584 typedef typename G::VertexIterator Vertex; │ │ │ │ │ +585 Vertex vend = fineGraph.end(); │ │ │ │ │ +586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ +587 assert(aggregates[*vertex] != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_: │ │ │ │ │ +_U_N_A_G_G_R_E_G_A_T_E_D); │ │ │ │ │ +588 put(visitedMap, *vertex, aggregates[*vertex]==_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_: │ │ │ │ │ +_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_:_I_S_O_L_A_T_E_D); │ │ │ │ │ +589 } │ │ │ │ │ +590 │ │ │ │ │ +591 typedef typename G::MutableMatrix M; │ │ │ │ │ +592 _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_> sparsityBuilder(*coarseMatrix); │ │ │ │ │ 593 │ │ │ │ │ -_5_9_7 class _D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ -598 { │ │ │ │ │ -599 public: │ │ │ │ │ -600 template │ │ │ │ │ -_6_0_1 void _o_p_e_r_a_t_o_r_(_)([[maybe_unused]] const EdgeIterator& edge) const │ │ │ │ │ -602 {} │ │ │ │ │ -603 }; │ │ │ │ │ +594 _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_G_,_T_>_:_:_e_x_a_m_i_n_e(fineGraph, visitedMap, pinfo, │ │ │ │ │ +595 aggregates, overlap, │ │ │ │ │ +596 overlapVertices, │ │ │ │ │ +597 overlapVertices+count, │ │ │ │ │ +598 sparsityBuilder); │ │ │ │ │ +599 │ │ │ │ │ +600 dinfo<N │ │ │ │ │ +()<<"x"<M()<<" row: min="< │ │ │ │ │ -1417 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w([[maybe_unused]] const Row& │ │ │ │ │ -row, int index, const std::true_type&) │ │ │ │ │ -1418 { │ │ │ │ │ -1419 using std::min; │ │ │ │ │ -1420 maxValue_ = min(- std::numeric_limits::max(), │ │ │ │ │ -std::numeric_limits::min()); │ │ │ │ │ -1421 row_ = index; │ │ │ │ │ -1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]); │ │ │ │ │ -1423 } │ │ │ │ │ -1424 │ │ │ │ │ -1425 template │ │ │ │ │ -1426 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(const ColIter& _c_o_l) │ │ │ │ │ -1427 { │ │ │ │ │ -1428 using std::max; │ │ │ │ │ -1429 real_type eij = norm_(*_c_o_l); │ │ │ │ │ -1430 typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r opposite_entry = │ │ │ │ │ -1431 matrix_->operator[](_c_o_l.index()).find(row_); │ │ │ │ │ -1432 if ( opposite_entry == matrix_->operator[](_c_o_l.index()).end() ) │ │ │ │ │ -1433 { │ │ │ │ │ -1434 // Consider this a weak connection we disregard. │ │ │ │ │ -1435 return; │ │ │ │ │ -1436 } │ │ │ │ │ -1437 real_type eji = norm_(*opposite_entry); │ │ │ │ │ -1438 │ │ │ │ │ -1439 // skip positive offdiagonals if norm preserves sign of them. │ │ │ │ │ -1440 if(!N::is_sign_preserving || eij<0 || eji<0) │ │ │ │ │ -1441 maxValue_ = max(maxValue_, │ │ │ │ │ -1442 eij /diagonal_ * eji/ │ │ │ │ │ -1443 norm_(matrix_->operator[](_c_o_l.index())[_c_o_l.index()])); │ │ │ │ │ -1444 } │ │ │ │ │ -1445 │ │ │ │ │ -1446 template │ │ │ │ │ -1447 template │ │ │ │ │ -1448 inline void _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(G& graph, const typename G:: │ │ │ │ │ -EdgeIterator& edge, const ColIter& _c_o_l) │ │ │ │ │ -1449 { │ │ │ │ │ -1450 real_type eij = norm_(*_c_o_l); │ │ │ │ │ -1451 typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r opposite_entry = │ │ │ │ │ -1452 matrix_->operator[](_c_o_l.index()).find(row_); │ │ │ │ │ -1453 │ │ │ │ │ -1454 if ( opposite_entry == matrix_->operator[](_c_o_l.index()).end() ) │ │ │ │ │ -1455 { │ │ │ │ │ -1456 // Consider this as a weak connection we disregard. │ │ │ │ │ -1457 return; │ │ │ │ │ -1458 } │ │ │ │ │ -1459 real_type eji = norm_(*opposite_entry); │ │ │ │ │ -1460 // skip positve offdiagonals if norm preserves sign of them. │ │ │ │ │ -1461 if(!N::is_sign_preserving || (eij<0 || eji<0)) │ │ │ │ │ -1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) * │ │ │ │ │ -1463 eij/ diagonal_ > alpha() * maxValue_) { │ │ │ │ │ -1464 edge.properties().setDepends(); │ │ │ │ │ -1465 edge.properties().setInfluences(); │ │ │ │ │ -1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), │ │ │ │ │ -edge.source()); │ │ │ │ │ -1467 other.setInfluences(); │ │ │ │ │ -1468 other.setDepends(); │ │ │ │ │ -1469 } │ │ │ │ │ -1470 } │ │ │ │ │ -1471 │ │ │ │ │ -1472 template │ │ │ │ │ -1473 inline bool _S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_s_I_s_o_l_a_t_e_d() │ │ │ │ │ -1474 { │ │ │ │ │ -1475 return maxValue_ < beta(); │ │ │ │ │ -1476 } │ │ │ │ │ -1477 │ │ │ │ │ -1478 │ │ │ │ │ -1479 template │ │ │ │ │ -1480 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t(const Matrix* matrix) │ │ │ │ │ -1481 { │ │ │ │ │ -1482 matrix_ = matrix; │ │ │ │ │ -1483 } │ │ │ │ │ -1484 │ │ │ │ │ -1485 template │ │ │ │ │ -1486 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_n_i_t_R_o_w([[maybe_unused]] const Row& row, int │ │ │ │ │ -index) │ │ │ │ │ -1487 { │ │ │ │ │ -1488 using std::min; │ │ │ │ │ -1489 maxValue_ = min(- std::numeric_limits::max(), std:: │ │ │ │ │ -numeric_limits::min()); │ │ │ │ │ -1490 row_ = index; │ │ │ │ │ -1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]); │ │ │ │ │ -1492 } │ │ │ │ │ -1493 │ │ │ │ │ -1494 template │ │ │ │ │ -1495 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(const ColIter& _c_o_l) │ │ │ │ │ -1496 { │ │ │ │ │ -1497 using std::max; │ │ │ │ │ -1498 maxValue_ = max(maxValue_, -norm_(*_c_o_l)); │ │ │ │ │ -1499 } │ │ │ │ │ -1500 │ │ │ │ │ -1501 template │ │ │ │ │ -1502 template │ │ │ │ │ -1503 inline void _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_e_x_a_m_i_n_e(G& graph, const typename G:: │ │ │ │ │ -EdgeIterator& edge, const ColIter& _c_o_l) │ │ │ │ │ -1504 { │ │ │ │ │ -1505 if(-norm_(*_c_o_l) >= maxValue_ * alpha()) { │ │ │ │ │ -1506 edge.properties().setDepends(); │ │ │ │ │ -1507 typedef typename G::EdgeDescriptor ED; │ │ │ │ │ -1508 ED e= graph.findEdge(edge.target(), edge.source()); │ │ │ │ │ -1509 if(e!=std::numeric_limits::max()) │ │ │ │ │ -1510 { │ │ │ │ │ -1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e); │ │ │ │ │ -1512 other.setInfluences(); │ │ │ │ │ -1513 } │ │ │ │ │ -1514 } │ │ │ │ │ -1515 } │ │ │ │ │ -1516 │ │ │ │ │ -1517 template │ │ │ │ │ -1518 inline bool _D_e_p_e_n_d_e_n_c_y_<_M_,_N_>_:_:_i_s_I_s_o_l_a_t_e_d() │ │ │ │ │ -1519 { │ │ │ │ │ -1520 return maxValue_ < beta() * diagonal_; │ │ │ │ │ -1521 } │ │ │ │ │ -1522 │ │ │ │ │ -1523 template │ │ │ │ │ -1524 _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_A_g_g_r_e_g_a_t_e(MatrixGraph& graph, AggregatesMap& │ │ │ │ │ -aggregates, │ │ │ │ │ -1525 VertexSet& connected, std::vector& front) │ │ │ │ │ -1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates), │ │ │ │ │ -1527 connected_(connected), front_(front) │ │ │ │ │ -1528 {} │ │ │ │ │ -1529 │ │ │ │ │ -1530 template │ │ │ │ │ -1531 void _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_r_e_c_o_n_s_t_r_u_c_t(const _V_e_r_t_e_x& vertex) │ │ │ │ │ -1532 { │ │ │ │ │ -1533 /* │ │ │ │ │ -1534 vertices_.push_back(vertex); │ │ │ │ │ -1535 typedef typename VertexList::const_iterator iterator; │ │ │ │ │ -1536 iterator begin = vertices_.begin(); │ │ │ │ │ -1537 iterator end = vertices_.end();*/ │ │ │ │ │ -1538 throw "Not yet implemented"; │ │ │ │ │ -1539 │ │ │ │ │ -1540 // while(begin!=end){ │ │ │ │ │ -1541 //for(); │ │ │ │ │ -1542 // } │ │ │ │ │ -1543 │ │ │ │ │ -1544 } │ │ │ │ │ -1545 │ │ │ │ │ -1546 template │ │ │ │ │ -1547 inline void _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_s_e_e_d(const _V_e_r_t_e_x& vertex) │ │ │ │ │ -1548 { │ │ │ │ │ -1549 dvverb<<"Connected cleared"<::UNAGGREGATED && │ │ │ │ │ -1616 !graph_.getVertexProperties(edge.target()).front()) │ │ │ │ │ -1617 { │ │ │ │ │ -1618 front_.push_back(edge.target()); │ │ │ │ │ -1619 graph_.getVertexProperties(edge.target()).setFront(); │ │ │ │ │ -1620 } │ │ │ │ │ -1621 dvverb <<" size="< │ │ │ │ │ -1629 inline void _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_l_e_a_r() │ │ │ │ │ -1630 { │ │ │ │ │ -1631 vertices_.clear(); │ │ │ │ │ -1632 connected_.clear(); │ │ │ │ │ -1633 id_=-1; │ │ │ │ │ -1634 } │ │ │ │ │ -1635 │ │ │ │ │ -1636 template │ │ │ │ │ -1637 inline typename Aggregate::VertexSet::size_type │ │ │ │ │ -1638 _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_s_i_z_e() │ │ │ │ │ -1639 { │ │ │ │ │ -1640 return vertices_.size(); │ │ │ │ │ -1641 } │ │ │ │ │ -1642 │ │ │ │ │ -1643 template │ │ │ │ │ -1644 inline typename Aggregate::VertexSet::size_type │ │ │ │ │ -1645 _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_o_n_n_e_c_t_S_i_z_e() │ │ │ │ │ -1646 { │ │ │ │ │ -1647 return connected_.size(); │ │ │ │ │ -1648 } │ │ │ │ │ -1649 │ │ │ │ │ -1650 template │ │ │ │ │ -1651 inline int _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_i_d() │ │ │ │ │ -1652 { │ │ │ │ │ -1653 return id_; │ │ │ │ │ -1654 } │ │ │ │ │ -1655 │ │ │ │ │ -1656 template │ │ │ │ │ -1657 inline typename _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_b_e_g_i_n() │ │ │ │ │ -const │ │ │ │ │ -1658 { │ │ │ │ │ -1659 return vertices_.begin(); │ │ │ │ │ -1660 } │ │ │ │ │ -1661 │ │ │ │ │ -1662 template │ │ │ │ │ -1663 inline typename _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r _A_g_g_r_e_g_a_t_e_<_G_,_S_>_:_:_e_n_d() const │ │ │ │ │ -1664 { │ │ │ │ │ -1665 return vertices_.end(); │ │ │ │ │ -1666 } │ │ │ │ │ -1667 │ │ │ │ │ -1668 template │ │ │ │ │ -1669 const V _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_U_N_A_G_G_R_E_G_A_T_E_D = std::numeric_limits::max(); │ │ │ │ │ -1670 │ │ │ │ │ -1671 template │ │ │ │ │ -1672 const V _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_I_S_O_L_A_T_E_D = std::numeric_limits::max()-1; │ │ │ │ │ -1673 │ │ │ │ │ -1674 template │ │ │ │ │ -1675 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p() │ │ │ │ │ -1676 : aggregates_(0) │ │ │ │ │ -1677 {} │ │ │ │ │ -1678 │ │ │ │ │ -1679 template │ │ │ │ │ -1680 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_~_A_g_g_r_e_g_a_t_e_s_M_a_p() │ │ │ │ │ -1681 { │ │ │ │ │ -1682 if(aggregates_!=0) │ │ │ │ │ -1683 delete[] aggregates_; │ │ │ │ │ -1684 } │ │ │ │ │ -1685 │ │ │ │ │ -1686 │ │ │ │ │ -1687 template │ │ │ │ │ -1688 inline _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p(std::size_t noVertices) │ │ │ │ │ -1689 { │ │ │ │ │ -1690 allocate(noVertices); │ │ │ │ │ -1691 } │ │ │ │ │ -1692 │ │ │ │ │ -1693 template │ │ │ │ │ -1694 inline std::size_t _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_n_o_V_e_r_t_i_c_e_s() const │ │ │ │ │ -1695 { │ │ │ │ │ -1696 return noVertices_; │ │ │ │ │ -1697 } │ │ │ │ │ -1698 │ │ │ │ │ -1699 template │ │ │ │ │ -1700 inline void _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_a_l_l_o_c_a_t_e(std::size_t noVertices) │ │ │ │ │ -1701 { │ │ │ │ │ -1702 aggregates_ = new _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r[noVertices]; │ │ │ │ │ -1703 noVertices_ = noVertices; │ │ │ │ │ -1704 │ │ │ │ │ -1705 for(std::size_t i=0; i < noVertices; i++) │ │ │ │ │ -1706 aggregates_[i]=UNAGGREGATED; │ │ │ │ │ -1707 } │ │ │ │ │ -1708 │ │ │ │ │ -1709 template │ │ │ │ │ -1710 inline void _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_f_r_e_e() │ │ │ │ │ -1711 { │ │ │ │ │ -1712 assert(aggregates_ != 0); │ │ │ │ │ -1713 delete[] aggregates_; │ │ │ │ │ -1714 aggregates_=0; │ │ │ │ │ -1715 } │ │ │ │ │ -1716 │ │ │ │ │ -1717 template │ │ │ │ │ -1718 inline typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ -1719 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_o_p_e_r_a_t_o_r_[_](const VertexDescriptor& v) │ │ │ │ │ -1720 { │ │ │ │ │ -1721 return aggregates_[v]; │ │ │ │ │ -1722 } │ │ │ │ │ -1723 │ │ │ │ │ -1724 template │ │ │ │ │ -1725 inline const typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ -1726 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_o_p_e_r_a_t_o_r_[_](const VertexDescriptor& v) const │ │ │ │ │ -1727 { │ │ │ │ │ -1728 return aggregates_[v]; │ │ │ │ │ -1729 } │ │ │ │ │ -1730 │ │ │ │ │ -1731 template │ │ │ │ │ -1732 template │ │ │ │ │ -1733 inline std::size_t _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h(const V& start, │ │ │ │ │ -1734 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -1735 const G& graph, F& aggregateVisitor, │ │ │ │ │ -1736 VM& visitedMap) const │ │ │ │ │ -1737 { │ │ │ │ │ -1738 VertexList vlist; │ │ │ │ │ -1739 │ │ │ │ │ -1740 DummyEdgeVisitor dummy; │ │ │ │ │ -1741 return breadthFirstSearch(start, aggregate, graph, vlist, │ │ │ │ │ -aggregateVisitor, dummy, visitedMap); │ │ │ │ │ -1742 } │ │ │ │ │ -1743 │ │ │ │ │ -1744 template │ │ │ │ │ -1745 template │ │ │ │ │ -1746 std::size_t _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h(const V& start, │ │ │ │ │ -1747 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -1748 const G& graph, │ │ │ │ │ -1749 L& visited, │ │ │ │ │ -1750 F1& aggregateVisitor, │ │ │ │ │ -1751 F2& nonAggregateVisitor, │ │ │ │ │ -1752 VM& visitedMap) const │ │ │ │ │ -1753 { │ │ │ │ │ -1754 typedef typename L::const_iterator ListIterator; │ │ │ │ │ -1755 int visitedSpheres = 0; │ │ │ │ │ -1756 │ │ │ │ │ -1757 visited.push_back(start); │ │ │ │ │ -1758 put(visitedMap, start, true); │ │ │ │ │ -1759 │ │ │ │ │ -1760 ListIterator current = visited.begin(); │ │ │ │ │ -1761 ListIterator end = visited.end(); │ │ │ │ │ -1762 std::size_t i=0, size=visited.size(); │ │ │ │ │ -1763 │ │ │ │ │ -1764 // visit the neighbours of all vertices of the │ │ │ │ │ -1765 // current sphere. │ │ │ │ │ -1766 while(current != end) { │ │ │ │ │ -1767 │ │ │ │ │ -1768 for(; i │ │ │ │ │ -1803 _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_A_g_g_r_e_g_a_t_o_r() │ │ │ │ │ -1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1) │ │ │ │ │ -1805 {} │ │ │ │ │ -1806 │ │ │ │ │ -1807 template │ │ │ │ │ -1808 _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_~_A_g_g_r_e_g_a_t_o_r() │ │ │ │ │ -1809 { │ │ │ │ │ -1810 size_=-1; │ │ │ │ │ -1811 } │ │ │ │ │ -1812 │ │ │ │ │ -1813 template │ │ │ │ │ -1814 void _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(G& graph, │ │ │ │ │ -1815 const typename C::Matrix& matrix, │ │ │ │ │ -1816 C criterion, bool firstlevel) │ │ │ │ │ -1817 { │ │ │ │ │ -1818 // assert(graph.isBuilt()); │ │ │ │ │ -1819 typedef typename C::Matrix Matrix; │ │ │ │ │ -1820 typedef typename G::VertexIterator VertexIterator; │ │ │ │ │ -1821 │ │ │ │ │ -1822 criterion.init(&matrix); │ │ │ │ │ -1823 │ │ │ │ │ -1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end(); │ │ │ │ │ -++vertex) { │ │ │ │ │ -1825 typedef typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e Row; │ │ │ │ │ -1826 │ │ │ │ │ -1827 const Row& row = matrix[*vertex]; │ │ │ │ │ -1828 │ │ │ │ │ -1829 // Tell the criterion what row we will examine now │ │ │ │ │ -1830 // This might for example be used for calculating the │ │ │ │ │ -1831 // maximum offdiagonal value │ │ │ │ │ -1832 criterion.initRow(row, *vertex); │ │ │ │ │ -1833 │ │ │ │ │ -1834 // On a first path all columns are examined. After this │ │ │ │ │ -1835 // the calculator should know whether the vertex is isolated. │ │ │ │ │ -1836 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r ColIterator; │ │ │ │ │ -1837 ColIterator end = row.end(); │ │ │ │ │ -1838 typename FieldTraits::real_type │ │ │ │ │ -absoffdiag=0.; │ │ │ │ │ -1839 │ │ │ │ │ -1840 using std::max; │ │ │ │ │ -1841 if(firstlevel) { │ │ │ │ │ -1842 for(ColIterator _c_o_l = row.begin(); _c_o_l != end; ++_c_o_l) │ │ │ │ │ -1843 if(_c_o_l.index()!=*vertex) { │ │ │ │ │ -1844 criterion.examine(_c_o_l); │ │ │ │ │ -1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm()); │ │ │ │ │ -1846 } │ │ │ │ │ -1847 │ │ │ │ │ -1848 if(absoffdiag==0) │ │ │ │ │ -1849 vertex.properties().setExcludedBorder(); │ │ │ │ │ -1850 } │ │ │ │ │ -1851 else │ │ │ │ │ -1852 for(ColIterator _c_o_l = row.begin(); _c_o_l != end; ++_c_o_l) │ │ │ │ │ -1853 if(_c_o_l.index()!=*vertex) │ │ │ │ │ -1854 criterion.examine(_c_o_l); │ │ │ │ │ -1855 │ │ │ │ │ -1856 // reset the vertex properties │ │ │ │ │ -1857 //vertex.properties().reset(); │ │ │ │ │ -1858 │ │ │ │ │ -1859 // Check whether the vertex is isolated. │ │ │ │ │ -1860 if(criterion.isIsolated()) { │ │ │ │ │ -1861 //std::cout<<"ISOLATED: "<<*vertex< │ │ │ │ │ -1881 template │ │ │ │ │ -1882 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_<_V_>_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r(const │ │ │ │ │ -AggregatesMap& aggregates, │ │ │ │ │ -1883 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, V& visitor) │ │ │ │ │ -1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor) │ │ │ │ │ -1885 {} │ │ │ │ │ -1886 │ │ │ │ │ -1887 template │ │ │ │ │ -1888 template │ │ │ │ │ -1889 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_<_V_>_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -1890 { │ │ │ │ │ -1891 if(aggregates_[edge.target()]==aggregate_) │ │ │ │ │ -1892 visitor_->operator()(edge); │ │ │ │ │ -1893 } │ │ │ │ │ -1894 │ │ │ │ │ -1895 template │ │ │ │ │ -1896 template │ │ │ │ │ -1897 inline void Aggregator::visitAggregateNeighbours(const _V_e_r_t_e_x& vertex, │ │ │ │ │ -1898 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -1899 const AggregatesMap& aggregates, │ │ │ │ │ -1900 V& visitor) const │ │ │ │ │ -1901 { │ │ │ │ │ -1902 // Only evaluates for edge pointing to the aggregate │ │ │ │ │ -1903 AggregateVisitor v(aggregates, aggregate, visitor); │ │ │ │ │ -1904 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, v); │ │ │ │ │ -1905 } │ │ │ │ │ -1906 │ │ │ │ │ -1907 │ │ │ │ │ -1908 template │ │ │ │ │ -1909 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_C_o_u_n_t_e_r() │ │ │ │ │ -1910 : count_(0) │ │ │ │ │ -1911 {} │ │ │ │ │ -1912 │ │ │ │ │ -1913 template │ │ │ │ │ -1914 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t() │ │ │ │ │ -1915 { │ │ │ │ │ -1916 ++count_; │ │ │ │ │ -1917 } │ │ │ │ │ -1918 │ │ │ │ │ -1919 template │ │ │ │ │ -1920 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_d_e_c_r_e_m_e_n_t() │ │ │ │ │ -1921 { │ │ │ │ │ -1922 --count_; │ │ │ │ │ -1923 } │ │ │ │ │ -1924 template │ │ │ │ │ -1925 inline int _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_u_n_t_e_r_:_:_v_a_l_u_e() │ │ │ │ │ -1926 { │ │ │ │ │ -1927 return count_; │ │ │ │ │ -1928 } │ │ │ │ │ -1929 │ │ │ │ │ -1930 template │ │ │ │ │ -1931 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_T_w_o_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -1932 { │ │ │ │ │ -1933 if(edge.properties().isTwoWay()) │ │ │ │ │ -1934 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -1935 } │ │ │ │ │ -1936 │ │ │ │ │ -1937 template │ │ │ │ │ -1938 int Aggregator::twoWayConnections(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -1939 const AggregatesMap& aggregates) const │ │ │ │ │ -1940 { │ │ │ │ │ -1941 TwoWayCounter counter; │ │ │ │ │ -1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter); │ │ │ │ │ -1943 return counter.value(); │ │ │ │ │ -1944 } │ │ │ │ │ -1945 │ │ │ │ │ -1946 template │ │ │ │ │ -1947 int Aggregator::oneWayConnections(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -1948 const AggregatesMap& aggregates) const │ │ │ │ │ -1949 { │ │ │ │ │ -1950 OneWayCounter counter; │ │ │ │ │ -1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter); │ │ │ │ │ -1952 return counter.value(); │ │ │ │ │ -1953 } │ │ │ │ │ -1954 │ │ │ │ │ -1955 template │ │ │ │ │ -1956 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_O_n_e_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -1957 { │ │ │ │ │ -1958 if(edge.properties().isOneWay()) │ │ │ │ │ -1959 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -1960 } │ │ │ │ │ -1961 │ │ │ │ │ -1962 template │ │ │ │ │ -1963 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r(const │ │ │ │ │ -VertexSet& connected, │ │ │ │ │ -1964 const AggregatesMap& aggregates) │ │ │ │ │ -1965 : Counter(), connected_(connected), aggregates_(aggregates) │ │ │ │ │ -1966 {} │ │ │ │ │ -1967 │ │ │ │ │ -1968 │ │ │ │ │ -1969 template │ │ │ │ │ -1970 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -1971 { │ │ │ │ │ -1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() || │ │ │ │ │ -aggregates_[edge.target()]==AggregatesMap::UNAGGREGATED) │ │ │ │ │ -1973 // Would be a new connection │ │ │ │ │ -1974 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -1975 else{ │ │ │ │ │ -1976 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -1977 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -1978 } │ │ │ │ │ -1979 } │ │ │ │ │ -1980 │ │ │ │ │ -1981 template │ │ │ │ │ -1982 inline double Aggregator::connectivity(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -AggregatesMap& aggregates) const │ │ │ │ │ -1983 { │ │ │ │ │ -1984 ConnectivityCounter counter(connected_, aggregates); │ │ │ │ │ -1985 double noNeighbours=_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, counter); │ │ │ │ │ -1986 return (double)counter.value()/noNeighbours; │ │ │ │ │ -1987 } │ │ │ │ │ -1988 │ │ │ │ │ -1989 template │ │ │ │ │ -1990 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r() │ │ │ │ │ -1991 : Counter() │ │ │ │ │ -1992 {} │ │ │ │ │ -1993 │ │ │ │ │ -1994 template │ │ │ │ │ -1995 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -1996 { │ │ │ │ │ -1997 if(edge.properties().depends()) │ │ │ │ │ -1998 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -1999 if(edge.properties().influences()) │ │ │ │ │ -2000 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -2001 } │ │ │ │ │ -2002 │ │ │ │ │ -2003 template │ │ │ │ │ -2004 int Aggregator::unusedNeighbours(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -AggregatesMap& aggregates) const │ │ │ │ │ -2005 { │ │ │ │ │ -2006 return aggregateNeighbours(vertex, AggregatesMap::UNAGGREGATED, │ │ │ │ │ -aggregates); │ │ │ │ │ -2007 } │ │ │ │ │ -2008 │ │ │ │ │ -2009 template │ │ │ │ │ -2010 std::pair Aggregator::neighbours(const _V_e_r_t_e_x& vertex, │ │ │ │ │ -2011 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -2012 const AggregatesMap& aggregates) const │ │ │ │ │ -2013 { │ │ │ │ │ -2014 DependencyCounter unused, aggregated; │ │ │ │ │ -2015 typedef AggregateVisitor CounterT; │ │ │ │ │ -2016 typedef std::tuple CounterTuple; │ │ │ │ │ -2017 CombinedFunctor visitors(CounterTuple(CounterT(aggregates, │ │ │ │ │ -AggregatesMap::UNAGGREGATED, unused), CounterT(aggregates, aggregate, │ │ │ │ │ -aggregated))); │ │ │ │ │ -2018 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, visitors); │ │ │ │ │ -2019 return std::make_pair(unused.value(), aggregated.value()); │ │ │ │ │ -2020 } │ │ │ │ │ -2021 │ │ │ │ │ -2022 │ │ │ │ │ -2023 template │ │ │ │ │ -2024 int Aggregator::aggregateNeighbours(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, const AggregatesMap& aggregates) const │ │ │ │ │ -2025 { │ │ │ │ │ -2026 DependencyCounter counter; │ │ │ │ │ -2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter); │ │ │ │ │ -2028 return counter.value(); │ │ │ │ │ -2029 } │ │ │ │ │ -2030 │ │ │ │ │ -2031 template │ │ │ │ │ -2032 std::size_t Aggregator::distance(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -AggregatesMap& aggregates) │ │ │ │ │ -2033 { │ │ │ │ │ -2034 return 0; │ │ │ │ │ -2035 typename PropertyMapTypeSelector::Type visitedMap = │ │ │ │ │ -_g_e_t(VertexVisitedTag(), *graph_); │ │ │ │ │ -2036 VertexList vlist; │ │ │ │ │ -2037 typename AggregatesMap::DummyEdgeVisitor dummy; │ │ │ │ │ -2038 return aggregates.template breadthFirstSearch(vertex, │ │ │ │ │ -2039 aggregate_->_i_d(), *graph_, │ │ │ │ │ -2040 vlist, dummy, dummy, visitedMap); │ │ │ │ │ -2041 } │ │ │ │ │ -2042 │ │ │ │ │ -2043 template │ │ │ │ │ -2044 inline _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_F_r_o_n_t_M_a_r_k_e_r(std::vector& front, │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h& graph) │ │ │ │ │ -2045 : front_(front), graph_(graph) │ │ │ │ │ -2046 {} │ │ │ │ │ -2047 │ │ │ │ │ -2048 template │ │ │ │ │ -2049 inline void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -2050 { │ │ │ │ │ -2051 _V_e_r_t_e_x target = edge.target(); │ │ │ │ │ -2052 │ │ │ │ │ -2053 if(!graph_.getVertexProperties(target).front()) { │ │ │ │ │ -2054 front_.push_back(target); │ │ │ │ │ -2055 graph_.getVertexProperties(target).setFront(); │ │ │ │ │ -2056 } │ │ │ │ │ -2057 } │ │ │ │ │ -2058 │ │ │ │ │ -2059 template │ │ │ │ │ -2060 inline bool Aggregator::admissible(const _V_e_r_t_e_x& vertex, const │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, const AggregatesMap& aggregates) const │ │ │ │ │ -2061 { │ │ │ │ │ -2062 // Todo │ │ │ │ │ -2063 Dune::dvverb<<" Admissible not yet implemented!"<endEdges(vertex); │ │ │ │ │ -2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) { │ │ │ │ │ -2072 // if(edge.properties().depends() && !edge.properties().influences() │ │ │ │ │ -2073 if(edge.properties().isStrong() │ │ │ │ │ -2074 && aggregates[edge.target()]==aggregate) │ │ │ │ │ -2075 { │ │ │ │ │ -2076 // Search for another link to the aggregate │ │ │ │ │ -2077 Iterator edge1 = edge; │ │ │ │ │ -2078 for(++edge1; edge1 != vend; ++edge1) { │ │ │ │ │ -2079 //if(edge1.properties().depends() && !edge1.properties().influences() │ │ │ │ │ -2080 if(edge1.properties().isStrong() │ │ │ │ │ -2081 && aggregates[edge.target()]==aggregate) │ │ │ │ │ -2082 { │ │ │ │ │ -2083 //Search for an edge connecting the two vertices that is │ │ │ │ │ -2084 //strong │ │ │ │ │ -2085 bool found=false; │ │ │ │ │ -2086 Iterator v2end = graph_->endEdges(edge.target()); │ │ │ │ │ -2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end; │ │ │ │ │ -++edge2) { │ │ │ │ │ -2088 if(edge2.target()==edge1.target() && │ │ │ │ │ -2089 edge2.properties().isStrong()) { │ │ │ │ │ -2090 found =true; │ │ │ │ │ -2091 break; │ │ │ │ │ -2092 } │ │ │ │ │ -2093 } │ │ │ │ │ -2094 if(found) │ │ │ │ │ -2095 { │ │ │ │ │ -2096 return true; │ │ │ │ │ -2097 } │ │ │ │ │ -2098 } │ │ │ │ │ -2099 } │ │ │ │ │ -2100 } │ │ │ │ │ -2101 } │ │ │ │ │ -2102 │ │ │ │ │ -2103 // Situation 2: cluster node depends on front node and other cluster node │ │ │ │ │ -2105 vend = graph_->endEdges(vertex); │ │ │ │ │ -2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) { │ │ │ │ │ -2107 //if(!edge.properties().depends() && edge.properties().influences() │ │ │ │ │ -2108 if(edge.properties().isStrong() │ │ │ │ │ -2109 && aggregates[edge.target()]==aggregate) │ │ │ │ │ -2110 { │ │ │ │ │ -2111 // Search for a link from target that stays within the aggregate │ │ │ │ │ -2112 Iterator v1end = graph_->endEdges(edge.target()); │ │ │ │ │ -2113 │ │ │ │ │ -2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end; │ │ │ │ │ -++edge1) { │ │ │ │ │ -2115 //if(edge1.properties().depends() && !edge1.properties().influences() │ │ │ │ │ -2116 if(edge1.properties().isStrong() │ │ │ │ │ -2117 && aggregates[edge1.target()]==aggregate) │ │ │ │ │ -2118 { │ │ │ │ │ -2119 bool found=false; │ │ │ │ │ -2120 // Check if front node is also connected to this one │ │ │ │ │ -2121 Iterator v2end = graph_->endEdges(vertex); │ │ │ │ │ -2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2) │ │ │ │ │ -{ │ │ │ │ │ -2123 if(edge2.target()==edge1.target()) { │ │ │ │ │ -2124 if(edge2.properties().isStrong()) │ │ │ │ │ -2125 found=true; │ │ │ │ │ -2126 break; │ │ │ │ │ -2127 } │ │ │ │ │ -2128 } │ │ │ │ │ -2129 if(found) │ │ │ │ │ -2130 { │ │ │ │ │ -2131 return true; │ │ │ │ │ -2132 } │ │ │ │ │ -2133 } │ │ │ │ │ -2134 } │ │ │ │ │ -2135 } │ │ │ │ │ -2136 } │ │ │ │ │ -2137 return false; │ │ │ │ │ -2138 } │ │ │ │ │ -2139 │ │ │ │ │ -2140 template │ │ │ │ │ -2141 void Aggregator::unmarkFront() │ │ │ │ │ -2142 { │ │ │ │ │ -2143 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ -2144 │ │ │ │ │ -2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex) │ │ │ │ │ -2146 graph_->getVertexProperties(*vertex).resetFront(); │ │ │ │ │ -2147 │ │ │ │ │ -2148 front_.clear(); │ │ │ │ │ -2149 } │ │ │ │ │ -2150 │ │ │ │ │ -2151 template │ │ │ │ │ -2152 inline void │ │ │ │ │ -2153 Aggregator::nonisoNeighbourAggregate(const _V_e_r_t_e_x& vertex, │ │ │ │ │ -2154 const AggregatesMap& aggregates, │ │ │ │ │ -2155 SLList& neighbours) const │ │ │ │ │ -2156 { │ │ │ │ │ -2157 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -2158 Iterator end=graph_->beginEdges(vertex); │ │ │ │ │ -2159 neighbours.clear(); │ │ │ │ │ -2160 │ │ │ │ │ -2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge) │ │ │ │ │ -2162 { │ │ │ │ │ -2163 if(aggregates[edge.target()]!=AggregatesMap::UNAGGREGATED && │ │ │ │ │ -graph_->getVertexProperties(edge.target()).isolated()) │ │ │ │ │ -2164 neighbours.push_back(aggregates[edge.target()]); │ │ │ │ │ -2165 } │ │ │ │ │ -2166 } │ │ │ │ │ -2167 │ │ │ │ │ -2168 template │ │ │ │ │ -2169 inline typename G::VertexDescriptor Aggregator::mergeNeighbour(const │ │ │ │ │ -_V_e_r_t_e_x& vertex, const AggregatesMap& aggregates) const │ │ │ │ │ -2170 { │ │ │ │ │ -2171 typedef typename _M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -2172 │ │ │ │ │ -2173 Iterator end = graph_->endEdges(vertex); │ │ │ │ │ -2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) { │ │ │ │ │ -2175 if(aggregates[edge.target()] != AggregatesMap::UNAGGREGATED && │ │ │ │ │ -2176 graph_->getVertexProperties(edge.target()).isolated() == graph_- │ │ │ │ │ ->getVertexProperties(edge.source()).isolated()) { │ │ │ │ │ -2177 if( graph_->getVertexProperties(vertex).isolated() || │ │ │ │ │ -2178 ((edge.properties().depends() || edge.properties().influences()) │ │ │ │ │ -2179 && admissible(vertex, aggregates[edge.target()], aggregates))) │ │ │ │ │ -2180 return edge.target(); │ │ │ │ │ -2181 } │ │ │ │ │ -2182 } │ │ │ │ │ -2183 return AggregatesMap::UNAGGREGATED; │ │ │ │ │ -2184 } │ │ │ │ │ -2185 │ │ │ │ │ -2186 template │ │ │ │ │ -2187 _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r(const │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h& graph) │ │ │ │ │ -2188 : Counter(), graph_(graph) │ │ │ │ │ -2189 {} │ │ │ │ │ -2190 │ │ │ │ │ -2191 template │ │ │ │ │ -2192 void _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_)(const typename │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -2193 { │ │ │ │ │ -2194 if(graph_.getVertexProperties(edge.target()).front()) │ │ │ │ │ -2195 _C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -2196 } │ │ │ │ │ -2197 │ │ │ │ │ -2198 template │ │ │ │ │ -2199 int Aggregator::noFrontNeighbours(const _V_e_r_t_e_x& vertex) const │ │ │ │ │ -2200 { │ │ │ │ │ -2201 FrontNeighbourCounter counter(*graph_); │ │ │ │ │ -2202 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(*graph_, vertex, counter); │ │ │ │ │ -2203 return counter.value(); │ │ │ │ │ -2204 } │ │ │ │ │ -2205 template │ │ │ │ │ -2206 inline bool Aggregator::connected(const _V_e_r_t_e_x& vertex, │ │ │ │ │ -2207 const _A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r& aggregate, │ │ │ │ │ -2208 const AggregatesMap& aggregates) const │ │ │ │ │ -2209 { │ │ │ │ │ -2210 typedef typename G::ConstEdgeIterator iterator; │ │ │ │ │ -2211 const iterator end = graph_->endEdges(vertex); │ │ │ │ │ -2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) │ │ │ │ │ -2213 if(aggregates[edge.target()]==aggregate) │ │ │ │ │ -2214 return true; │ │ │ │ │ -2215 return false; │ │ │ │ │ -2216 } │ │ │ │ │ -2217 template │ │ │ │ │ -2218 inline bool Aggregator::connected(const _V_e_r_t_e_x& vertex, │ │ │ │ │ -2219 const SLList& aggregateList, │ │ │ │ │ -2220 const AggregatesMap& aggregates) const │ │ │ │ │ -2221 { │ │ │ │ │ -2222 typedef typename SLList::const_iterator Iter; │ │ │ │ │ -2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i) │ │ │ │ │ -2224 if(connected(vertex, *i, aggregates)) │ │ │ │ │ -2225 return true; │ │ │ │ │ -2226 return false; │ │ │ │ │ -2227 } │ │ │ │ │ -2228 │ │ │ │ │ -2229 template │ │ │ │ │ -2230 template │ │ │ │ │ -2231 void Aggregator::growIsolatedAggregate(const _V_e_r_t_e_x& seed, const │ │ │ │ │ -AggregatesMap& aggregates, const C& c) │ │ │ │ │ -2232 { │ │ │ │ │ -2233 SLList connectedAggregates; │ │ │ │ │ -2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates); │ │ │ │ │ -2235 │ │ │ │ │ -2236 while(aggregate_->_s_i_z_e()< c.minAggregateSize() && aggregate_->_c_o_n_n_e_c_t_S_i_z_e │ │ │ │ │ -() < c.maxConnectivity()) { │ │ │ │ │ -2237 double maxCon=-1; │ │ │ │ │ -2238 std::size_t maxFrontNeighbours=0; │ │ │ │ │ -2239 │ │ │ │ │ -2240 _V_e_r_t_e_x candidate=AggregatesMap::UNAGGREGATED; │ │ │ │ │ -2241 │ │ │ │ │ -2242 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ -2243 │ │ │ │ │ -2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) { │ │ │ │ │ -2245 if(distance(*vertex, aggregates)>c.maxDistance()) │ │ │ │ │ -2246 continue; // distance of proposes aggregate too big │ │ │ │ │ -2247 │ │ │ │ │ -2248 if(connectedAggregates.size()>0) { │ │ │ │ │ -2249 // there is already a neighbour cluster │ │ │ │ │ -2250 // front node must be connected to same neighbour cluster │ │ │ │ │ -2251 │ │ │ │ │ -2252 if(!connected(*vertex, connectedAggregates, aggregates)) │ │ │ │ │ -2253 continue; │ │ │ │ │ -2254 } │ │ │ │ │ -2255 │ │ │ │ │ -2256 double con = connectivity(*vertex, aggregates); │ │ │ │ │ -2257 │ │ │ │ │ -2258 if(con == maxCon) { │ │ │ │ │ -2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2260 │ │ │ │ │ -2261 if(frontNeighbours >= maxFrontNeighbours) { │ │ │ │ │ -2262 maxFrontNeighbours = frontNeighbours; │ │ │ │ │ -2263 candidate = *vertex; │ │ │ │ │ -2264 } │ │ │ │ │ -2265 }else if(con > maxCon) { │ │ │ │ │ -2266 maxCon = con; │ │ │ │ │ -2267 maxFrontNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2268 candidate = *vertex; │ │ │ │ │ -2269 } │ │ │ │ │ -2270 } │ │ │ │ │ -2271 │ │ │ │ │ -2272 if(candidate==AggregatesMap::UNAGGREGATED) │ │ │ │ │ -2273 break; │ │ │ │ │ -2274 │ │ │ │ │ -2275 aggregate_->_a_d_d(candidate); │ │ │ │ │ -2276 } │ │ │ │ │ -2277 } │ │ │ │ │ -2278 │ │ │ │ │ -2279 template │ │ │ │ │ -2280 template │ │ │ │ │ -2281 void Aggregator::growAggregate(const _V_e_r_t_e_x& seed, const │ │ │ │ │ -AggregatesMap& aggregates, const C& c) │ │ │ │ │ -2282 { │ │ │ │ │ -2283 using std::min; │ │ │ │ │ -2284 │ │ │ │ │ -2285 std::size_t distance_ =0; │ │ │ │ │ -2286 while(aggregate_->_s_i_z_e() < c.minAggregateSize()&& distance_ candidates; │ │ │ │ │ -2291 candidates.reserve(30); │ │ │ │ │ -2292 │ │ │ │ │ -2293 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ -2294 │ │ │ │ │ -2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) { │ │ │ │ │ -2296 // Only nonisolated nodes are considered │ │ │ │ │ -2297 if(graph_->getVertexProperties(*vertex).isolated()) │ │ │ │ │ -2298 continue; │ │ │ │ │ -2299 │ │ │ │ │ -2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->_i_d(), aggregates); │ │ │ │ │ -2301 │ │ │ │ │ -2302 /* The case of two way connections. */ │ │ │ │ │ -2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) { │ │ │ │ │ -2304 double con = connectivity(*vertex, aggregates); │ │ │ │ │ -2305 │ │ │ │ │ -2306 if(con == maxCon) { │ │ │ │ │ -2307 int neighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2308 │ │ │ │ │ -2309 if(neighbours > maxNeighbours) { │ │ │ │ │ -2310 maxNeighbours = neighbours; │ │ │ │ │ -2311 candidates.clear(); │ │ │ │ │ -2312 candidates.push_back(*vertex); │ │ │ │ │ -2313 }else{ │ │ │ │ │ -2314 candidates.push_back(*vertex); │ │ │ │ │ -2315 } │ │ │ │ │ -2316 }else if( con > maxCon) { │ │ │ │ │ -2317 maxCon = con; │ │ │ │ │ -2318 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2319 candidates.clear(); │ │ │ │ │ -2320 candidates.push_back(*vertex); │ │ │ │ │ -2321 } │ │ │ │ │ -2322 }else if(twoWayCons > maxTwoCons) { │ │ │ │ │ -2323 maxTwoCons = twoWayCons; │ │ │ │ │ -2324 maxCon = connectivity(*vertex, aggregates); │ │ │ │ │ -2325 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2326 candidates.clear(); │ │ │ │ │ -2327 candidates.push_back(*vertex); │ │ │ │ │ -2328 │ │ │ │ │ -2329 // two way connections precede │ │ │ │ │ -2330 maxOneCons = std::numeric_limits::max(); │ │ │ │ │ -2331 } │ │ │ │ │ -2332 │ │ │ │ │ -2333 if(twoWayCons > 0) │ │ │ │ │ -2334 { │ │ │ │ │ -2335 continue; // THis is a two-way node, skip tests for one way nodes │ │ │ │ │ -2336 } │ │ │ │ │ -2337 │ │ │ │ │ -2338 /* The one way case */ │ │ │ │ │ -2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->_i_d(), aggregates); │ │ │ │ │ -2340 │ │ │ │ │ -2341 if(oneWayCons==0) │ │ │ │ │ -2342 continue; // No strong connections, skip the tests. │ │ │ │ │ -2343 │ │ │ │ │ -2344 if(!admissible(*vertex, aggregate_->_i_d(), aggregates)) │ │ │ │ │ -2345 continue; │ │ │ │ │ -2346 │ │ │ │ │ -2347 if( maxOneCons == oneWayCons && oneWayCons > 0) { │ │ │ │ │ -2348 double con = connectivity(*vertex, aggregates); │ │ │ │ │ -2349 │ │ │ │ │ -2350 if(con == maxCon) { │ │ │ │ │ -2351 int neighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2352 │ │ │ │ │ -2353 if(neighbours > maxNeighbours) { │ │ │ │ │ -2354 maxNeighbours = neighbours; │ │ │ │ │ -2355 candidates.clear(); │ │ │ │ │ -2356 candidates.push_back(*vertex); │ │ │ │ │ -2357 }else{ │ │ │ │ │ -2358 if(neighbours==maxNeighbours) │ │ │ │ │ -2359 { │ │ │ │ │ -2360 candidates.push_back(*vertex); │ │ │ │ │ -2361 } │ │ │ │ │ -2362 } │ │ │ │ │ -2363 }else if( con > maxCon) { │ │ │ │ │ -2364 maxCon = con; │ │ │ │ │ -2365 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2366 candidates.clear(); │ │ │ │ │ -2367 candidates.push_back(*vertex); │ │ │ │ │ -2368 } │ │ │ │ │ -2369 }else if(oneWayCons > maxOneCons) { │ │ │ │ │ -2370 maxOneCons = oneWayCons; │ │ │ │ │ -2371 maxCon = connectivity(*vertex, aggregates); │ │ │ │ │ -2372 maxNeighbours = noFrontNeighbours(*vertex); │ │ │ │ │ -2373 candidates.clear(); │ │ │ │ │ -2374 candidates.push_back(*vertex); │ │ │ │ │ -2375 } │ │ │ │ │ -2376 } │ │ │ │ │ -2377 │ │ │ │ │ -2378 │ │ │ │ │ -2379 if(!candidates.size()) │ │ │ │ │ -2380 break; // No more candidates found │ │ │ │ │ -2381 distance_=distance(seed, aggregates); │ │ │ │ │ -2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()- │ │ │ │ │ -2383 aggregate_->_s_i_z_e())); │ │ │ │ │ -2384 aggregate_->_a_d_d(candidates); │ │ │ │ │ -2385 } │ │ │ │ │ -2386 } │ │ │ │ │ -2387 │ │ │ │ │ -2388 template │ │ │ │ │ -2389 template │ │ │ │ │ -2390 std::tuple _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>_:_:_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s(const M& │ │ │ │ │ -matrix, G& graph, const C& criterion, │ │ │ │ │ -2391 bool finestLevel) │ │ │ │ │ -2392 { │ │ │ │ │ -2393 Aggregator aggregator; │ │ │ │ │ -2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel); │ │ │ │ │ -2395 } │ │ │ │ │ -2396 │ │ │ │ │ -2397 template │ │ │ │ │ -2398 template │ │ │ │ │ -2399 std::tuple _A_g_g_r_e_g_a_t_o_r_<_G_>_:_:_b_u_i_l_d(const M& m, G& graph, │ │ │ │ │ -AggregatesMap& aggregates, const C& c, │ │ │ │ │ -2400 bool finestLevel) │ │ │ │ │ -2401 { │ │ │ │ │ -2402 using std::max; │ │ │ │ │ -2403 using std::min; │ │ │ │ │ -2404 // Stack for fast vertex access │ │ │ │ │ -2405 Stack stack_(graph, *this, aggregates); │ │ │ │ │ -2406 │ │ │ │ │ -2407 graph_ = &graph; │ │ │ │ │ -2408 │ │ │ │ │ -2409 aggregate_ = new Aggregate(graph, aggregates, connected_, │ │ │ │ │ -front_); │ │ │ │ │ -2410 │ │ │ │ │ -2411 Timer watch; │ │ │ │ │ -2412 watch.reset(); │ │ │ │ │ -2413 │ │ │ │ │ -2414 _b_u_i_l_d_D_e_p_e_n_d_e_n_c_y(graph, m, c, finestLevel); │ │ │ │ │ -2415 │ │ │ │ │ -2416 dverb<<"Build dependency took "<< watch.elapsed()<<" seconds."<::ISOLATED; │ │ │ │ │ -2437 ++skippedAggregates; │ │ │ │ │ -2438 continue; │ │ │ │ │ -2439 } │ │ │ │ │ -2440 │ │ │ │ │ -2441 if(graph.getVertexProperties(seed).isolated()) { │ │ │ │ │ -2442 if(c.skipIsolated()) { │ │ │ │ │ -2443 // isolated vertices are not aggregated but skipped on the coarser levels. │ │ │ │ │ -2444 aggregates[seed]=AggregatesMap::ISOLATED; │ │ │ │ │ -2445 ++skippedAggregates; │ │ │ │ │ -2446 // skip rest as no agglomeration is done. │ │ │ │ │ -2447 continue; │ │ │ │ │ -2448 }else{ │ │ │ │ │ -2449 aggregate_->_s_e_e_d(seed); │ │ │ │ │ -2450 growIsolatedAggregate(seed, aggregates, c); │ │ │ │ │ -2451 } │ │ │ │ │ -2452 }else{ │ │ │ │ │ -2453 aggregate_->_s_e_e_d(seed); │ │ │ │ │ -2454 growAggregate(seed, aggregates, c); │ │ │ │ │ -2455 } │ │ │ │ │ -2456 │ │ │ │ │ -2457 /* The rounding step. */ │ │ │ │ │ -2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->_s_i_z_e() │ │ │ │ │ -< c.maxAggregateSize()) { │ │ │ │ │ -2459 │ │ │ │ │ -2460 std::vector candidates; │ │ │ │ │ -2461 candidates.reserve(30); │ │ │ │ │ -2462 │ │ │ │ │ -2463 typedef typename std::vector::const_iterator Iterator; │ │ │ │ │ -2464 │ │ │ │ │ -2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) { │ │ │ │ │ -2466 │ │ │ │ │ -2467 if(graph.getVertexProperties(*vertex).isolated()) │ │ │ │ │ -2468 continue; // No isolated nodes here │ │ │ │ │ -2469 │ │ │ │ │ -2470 if(twoWayConnections( *vertex, aggregate_->_i_d(), aggregates) == 0 && │ │ │ │ │ -2471 (oneWayConnections( *vertex, aggregate_->_i_d(), aggregates) == 0 || │ │ │ │ │ -2472 !admissible( *vertex, aggregate_->_i_d(), aggregates) )) │ │ │ │ │ -2473 continue; │ │ │ │ │ -2474 │ │ │ │ │ -2475 std::pair neighbourPair=neighbours(*vertex, aggregate_->_i_d(), │ │ │ │ │ -2476 aggregates); │ │ │ │ │ -2477 │ │ │ │ │ -2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <= │ │ │ │ │ -unusedNeighbours(*vertex, aggregates)) │ │ │ │ │ -2479 // continue; │ │ │ │ │ -2480 │ │ │ │ │ -2481 if(neighbourPair.first >= neighbourPair.second) │ │ │ │ │ -2482 continue; │ │ │ │ │ -2483 │ │ │ │ │ -2484 if(distance(*vertex, aggregates) > c.maxDistance()) │ │ │ │ │ -2485 continue; // Distance too far │ │ │ │ │ -2486 candidates.push_back(*vertex); │ │ │ │ │ -2487 break; │ │ │ │ │ -2488 } │ │ │ │ │ -2489 │ │ │ │ │ -2490 if(!candidates.size()) break; // no more candidates found. │ │ │ │ │ -2491 │ │ │ │ │ -2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()- │ │ │ │ │ -2493 aggregate_->_s_i_z_e())); │ │ │ │ │ -2494 aggregate_->_a_d_d(candidates); │ │ │ │ │ -2495 │ │ │ │ │ -2496 } │ │ │ │ │ -2497 │ │ │ │ │ -2498 // try to merge aggregates consisting of only one nonisolated vertex with │ │ │ │ │ -other aggregates │ │ │ │ │ -2499 if(aggregate_->_s_i_z_e()==1 && c.maxAggregateSize()>1) { │ │ │ │ │ -2500 if(!graph.getVertexProperties(seed).isolated()) { │ │ │ │ │ -2501 _V_e_r_t_e_x mergedNeighbour = mergeNeighbour(seed, aggregates); │ │ │ │ │ -2502 │ │ │ │ │ -2503 if(mergedNeighbour != AggregatesMap::UNAGGREGATED) { │ │ │ │ │ -2504 // assign vertex to the neighbouring cluster │ │ │ │ │ -2505 aggregates[seed] = aggregates[mergedNeighbour]; │ │ │ │ │ -2506 aggregate_->_i_n_v_a_l_i_d_a_t_e(); │ │ │ │ │ -2507 }else{ │ │ │ │ │ -2508 ++avg; │ │ │ │ │ -2509 minA=min(minA,static_cast(1)); │ │ │ │ │ -2510 maxA=max(maxA,static_cast(1)); │ │ │ │ │ -2511 ++oneAggregates; │ │ │ │ │ -2512 ++conAggregates; │ │ │ │ │ -2513 } │ │ │ │ │ -2514 }else{ │ │ │ │ │ -2515 ++avg; │ │ │ │ │ -2516 minA=min(minA,static_cast(1)); │ │ │ │ │ -2517 maxA=max(maxA,static_cast(1)); │ │ │ │ │ -2518 ++oneAggregates; │ │ │ │ │ -2519 ++isoAggregates; │ │ │ │ │ -2520 } │ │ │ │ │ -2521 ++avg; │ │ │ │ │ -2522 }else{ │ │ │ │ │ -2523 avg+=aggregate_->_s_i_z_e(); │ │ │ │ │ -2524 minA=min(minA,aggregate_->_s_i_z_e()); │ │ │ │ │ -2525 maxA=max(maxA,aggregate_->_s_i_z_e()); │ │ │ │ │ -2526 if(graph.getVertexProperties(seed).isolated()) │ │ │ │ │ -2527 ++isoAggregates; │ │ │ │ │ -2528 else │ │ │ │ │ -2529 ++conAggregates; │ │ │ │ │ -2530 } │ │ │ │ │ -2531 │ │ │ │ │ -2532 } │ │ │ │ │ -2533 │ │ │ │ │ -2534 Dune::dinfo<<"connected aggregates: "<0) │ │ │ │ │ -2537 Dune::dinfo<<" one node aggregates: "< │ │ │ │ │ +_7_1_4 void _D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_s_e_t(M& coarse, │ │ │ │ │ +715 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ +716 const O& overlap) │ │ │ │ │ +717 {} │ │ │ │ │ +718 │ │ │ │ │ +719 } // namespace Amg │ │ │ │ │ +720} // namespace Dune │ │ │ │ │ +721#endif │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ +Provides classes for the Coloring process of AMG. │ │ │ │ │ _c_o_l │ │ │ │ │ Col col │ │ │ │ │ DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_C_o_l_I_t_e_r │ │ │ │ │ -Matrix::ConstColIterator ColIter │ │ │ │ │ -Constant column iterator of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:273 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_v_a_l_I_t_e_r__ │ │ │ │ │ -std::vector< real_type >::iterator valIter_ │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_C_o_l_I_t_e_r │ │ │ │ │ -Matrix::ConstColIterator ColIter │ │ │ │ │ -Constant column iterator of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h │ │ │ │ │ -std::size_t breadthFirstSearch(const VertexDescriptor &start, const │ │ │ │ │ -AggregateDescriptor &aggregate, const G &graph, L &visited, F1 │ │ │ │ │ -&aggregateVisitor, F2 &nonAggregateVisitor, VM &visitedMap) const │ │ │ │ │ -Breadth first search within an aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ -PoolAllocator< VertexDescriptor, 100 > Allocator │ │ │ │ │ -The allocator we use for our lists and the set. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:586 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:737 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_i_d │ │ │ │ │ -int id() │ │ │ │ │ -Get the id identifying the aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_n_o_r_m__ │ │ │ │ │ -Norm norm_ │ │ │ │ │ -The functor for calculating the norm. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:302 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_V_e_r_t_e_x │ │ │ │ │ -MatrixGraph::VertexDescriptor Vertex │ │ │ │ │ -The vertex identifier. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:920 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -AggregationCriterion() │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_O_V_L_e_s_s_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2) │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ +static void constructNonOverlapConnectivity(R &row, G &graph, V &visitedMap, │ │ │ │ │ +const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename │ │ │ │ │ +G::VertexDescriptor &seed) │ │ │ │ │ +Construct the connectivity of an aggregate in the overlap. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_G_r_a_p_h │ │ │ │ │ +G Graph │ │ │ │ │ +The type of the graph. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +void operator++() │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const ConstEdgeIterator &edge) │ │ │ │ │ +Process an edge pointing to another aggregate. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_i_n_s_e_r_t │ │ │ │ │ +void insert(const typename M::size_type &index) │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:552 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ +static void constructOverlapConnectivity(R &row, G &graph, V &visitedMap, const │ │ │ │ │ +AggregatesMap< typename G::VertexDescriptor > &aggregates, const OverlapVertex< │ │ │ │ │ +typename G::VertexDescriptor > *&seed, const OverlapVertex< typename G:: │ │ │ │ │ +VertexDescriptor > *overlapEnd) │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:331 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_b_u_i_l_d │ │ │ │ │ +G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation │ │ │ │ │ +&pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const │ │ │ │ │ +typename G::Matrix::size_type &size, const Set ©) │ │ │ │ │ +Calculates the coarse matrix via a Galerkin product. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:563 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_i_n_d_e_x │ │ │ │ │ +std::size_t index() │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +T ParallelInformation │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_V_e_r_t_e_x │ │ │ │ │ +G::VertexDescriptor Vertex │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:272 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_A_g_g_r_e_g_a_t_e │ │ │ │ │ +T Aggregate │ │ │ │ │ +The aggregate descriptor. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r │ │ │ │ │ +SparsityBuilder(M &matrix) │ │ │ │ │ Constructor. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_m_a_t_r_i_x__ │ │ │ │ │ -const Matrix * matrix_ │ │ │ │ │ -The matrix we work on. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:357 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -auto operator()(const M &m, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ -value > *sfinae=nullptr) const │ │ │ │ │ -Compute the norm of a scalar. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t_R_o_w │ │ │ │ │ -void initRow(const Row &row, int index) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -SymmetricMatrixDependency(const Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_M_a_t_r_i_x │ │ │ │ │ -M Matrix │ │ │ │ │ -The matrix type we build the dependency of. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:258 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_C_o_u_n_t_e_r │ │ │ │ │ -Counter() │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:513 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ +ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph, │ │ │ │ │ +VisitedMap &visitedMap, Set &connected) │ │ │ │ │ Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -G MatrixGraph │ │ │ │ │ -The matrix graph type used. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:915 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_n_o_r_m__ │ │ │ │ │ -Norm norm_ │ │ │ │ │ -The functor for calculating the norm. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:363 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const EdgeIterator &edge) const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:601 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -SymmetricCriterion() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:524 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -Dependency() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ -void examine(const ColIter &col) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_M_a_t_r_i_x │ │ │ │ │ -M Matrix │ │ │ │ │ -The matrix type we build the dependency of. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_d_i_a_g_o_n_a_l__ │ │ │ │ │ -real_type diagonal_ │ │ │ │ │ -The norm of the current diagonal. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:187 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_N_o_r_m │ │ │ │ │ -N Norm │ │ │ │ │ -The norm to use for examining the matrix entries. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ -iterator end() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:742 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -UnSymmetricCriterion(const Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_T_w_o_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t_R_o_w │ │ │ │ │ -void initRow(const Row &row, int index) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:201 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_i_s_I_s_o_l_a_t_e_d │ │ │ │ │ -bool isIsolated() │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_N_u_l_l_E_n_t_r_y │ │ │ │ │ -static const Vertex NullEntry │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:1008 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ -void examine(const ColIter &col) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -Dependency(const Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_r_o_w__ │ │ │ │ │ -int row_ │ │ │ │ │ -index of the currently evaluated row. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_b_u_i_l_d │ │ │ │ │ -std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap< │ │ │ │ │ -Vertex > &aggregates, const C &c, bool finestLevel) │ │ │ │ │ -Build the aggregates. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r │ │ │ │ │ -FrontNeighbourCounter(const MatrixGraph &front) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_R_o_w │ │ │ │ │ -Matrix::row_type Row │ │ │ │ │ -Constant Row iterator of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_m_a_t_r_i_x__ │ │ │ │ │ -const Matrix * matrix_ │ │ │ │ │ -The matrix we work on. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const AggregateDescriptor & operator[](const VertexDescriptor &v) const │ │ │ │ │ -Get the aggregate a vertex belongs to. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ -void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter │ │ │ │ │ -&col) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r │ │ │ │ │ -AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const │ │ │ │ │ -AggregateDescriptor &aggregate, Visitor &visitor) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_C_o_l_I_t_e_r │ │ │ │ │ -Matrix::ConstColIterator ColIter │ │ │ │ │ -Constant column iterator of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:334 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_~_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -~AggregatesMap() │ │ │ │ │ -Destructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -Matrix::field_type field_type │ │ │ │ │ -The current max value. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -Decrement counter. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_A_g_g_r_e_g_a_t_e │ │ │ │ │ -Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet │ │ │ │ │ -&connectivity, std::vector< Vertex > &front_) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_:_:_V_i_s_i_t_o_r │ │ │ │ │ -V Visitor │ │ │ │ │ -The type of the adapted visitor. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:1064 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_S_p_h_e_r_e_M_a_p │ │ │ │ │ -std::size_t * SphereMap │ │ │ │ │ -Type of the mapping of aggregate members onto distance spheres. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:809 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -AggregationCriterion(const Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_R_o_w │ │ │ │ │ -Matrix::row_type Row │ │ │ │ │ -Constant Row iterator of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_c_o_n_n_e_c_t_S_i_z_e │ │ │ │ │ -VertexSet::size_type connectSize() │ │ │ │ │ -Get tne number of connections to other aggregates. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_v_a_l_s__ │ │ │ │ │ -std::vector< real_type > vals_ │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_N_o_r_m │ │ │ │ │ -N Norm │ │ │ │ │ -The norm to use for examining the matrix entries. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:324 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_r_i_n_t_A_g_g_r_e_g_a_t_e_s_2_d │ │ │ │ │ -void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m, │ │ │ │ │ -std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:2583 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_i_n_v_a_l_i_d_a_t_e │ │ │ │ │ -void invalidate() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:822 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:725 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_m_a_x_V_a_l_u_e__ │ │ │ │ │ -real_type maxValue_ │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_n_o_r_m__ │ │ │ │ │ -Norm norm_ │ │ │ │ │ -The functor for calculating the norm. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -VertexSet::const_iterator const_iterator │ │ │ │ │ -Const iterator over a vertex list. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:804 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -SymmetricCriterion(const Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:521 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -MatrixGraph::VertexDescriptor AggregateDescriptor │ │ │ │ │ -The type of the aggregate descriptor. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:923 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_m_a_x_V_a_l_u_e__ │ │ │ │ │ -real_type maxValue_ │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:361 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t │ │ │ │ │ -void init(const Matrix *matrix) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:195 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_d_i_a_g_o_n_a_l__ │ │ │ │ │ -real_type diagonal_ │ │ │ │ │ -The norm of the current diagonal. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:367 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -AggregateDescriptor * iterator │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:735 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -SymmetricDependency(const Parameters &parms) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:348 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_~_A_g_g_r_e_g_a_t_o_r │ │ │ │ │ -~Aggregator() │ │ │ │ │ -Destructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ -void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter │ │ │ │ │ -&col) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_a_d_d │ │ │ │ │ -void add(const Vertex &vertex) │ │ │ │ │ -Add a vertex to the aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_D_e_p_e_n_d_e_n_c_y_P_o_l_i_c_y │ │ │ │ │ -T DependencyPolicy │ │ │ │ │ -The policy for calculating the dependency graph. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_a_d_d │ │ │ │ │ -void add(std::vector< Vertex > &vertex) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_e_x_a_m_i_n_e │ │ │ │ │ -void examine(const ColIter &col) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_o_r │ │ │ │ │ -Aggregator() │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_A_g_g_r_e_g_a_t_e_V_i_s_i_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -Examine an edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_M_a_r_k_e_r_:_:_F_r_o_n_t_M_a_r_k_e_r │ │ │ │ │ -FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const │ │ │ │ │ -compute the norm of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:506 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t │ │ │ │ │ -void init(const Matrix *matrix) │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:352 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Graph::ConstEdgeIterator ConstEdgeIterator │ │ │ │ │ +The constant edge iterator. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_V_e_r_t_e_x │ │ │ │ │ +T Vertex │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_ _G_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ +G::VertexDescriptor Vertex │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:288 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_e_x_a_m_i_n_e │ │ │ │ │ +static void examine(G &graph, V &visitedMap, const T &pinfo, const │ │ │ │ │ +AggregatesMap< Vertex > &aggregates, const O &overlap, const OverlapVertex< │ │ │ │ │ +Vertex > *overlapVertices, const OverlapVertex< Vertex > *overlapEnd, R &row) │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:420 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_V_i_s_i_t_e_d_M_a_p │ │ │ │ │ +V VisitedMap │ │ │ │ │ +The type of the map for marking vertices as visited. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:225 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, │ │ │ │ │ V &visitor) │ │ │ │ │ Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_I_s_o_t_r_o_p_i_c │ │ │ │ │ -void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ -Sets reasonable default values for an isotropic problem. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -V AggregateDescriptor │ │ │ │ │ -The aggregate descriptor type. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:580 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ -static const V ISOLATED │ │ │ │ │ -Identifier of isolated vertices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:571 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_r_o_w__ │ │ │ │ │ -int row_ │ │ │ │ │ -index of the currently evaluated row. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -SymmetricMatrixDependency() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r │ │ │ │ │ -DependencyCounter() │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_p_o_p │ │ │ │ │ -Vertex pop() │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_d_i_a_g_o_n_a_l__ │ │ │ │ │ -real_type diagonal_ │ │ │ │ │ -The norm of the current diagonal. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ -std::size_t noVertices() const │ │ │ │ │ -Get the number of vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n_:_:_s_e_t_D_e_f_a_u_l_t_V_a_l_u_e_s_A_n_i_s_o_t_r_o_p_i_c │ │ │ │ │ -void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2) │ │ │ │ │ -Sets reasonable default values for an aisotropic problem. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -AggregatesMap(std::size_t noVertices) │ │ │ │ │ -Constructs with allocating memory. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -Matrix::field_type field_type │ │ │ │ │ -The current max value. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -AggregateDescriptor & operator[](const VertexDescriptor &v) │ │ │ │ │ -Get the aggregate a vertex belongs to. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -AggregatesMap() │ │ │ │ │ -Constructs without allocating memory. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_v_a_l_u_e │ │ │ │ │ -int value() │ │ │ │ │ -Access the current count. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x_L_i_s_t │ │ │ │ │ -SLList< VertexDescriptor, Allocator > VertexList │ │ │ │ │ -The type of a single linked list of vertex descriptors. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:592 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_~_S_t_a_c_k │ │ │ │ │ -~Stack() │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_u_n_t_e_r │ │ │ │ │ -ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex > │ │ │ │ │ -&aggregates) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_s_i_z_e │ │ │ │ │ -VertexSet::size_type size() │ │ │ │ │ -Get the size of the aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -get an iterator over the vertices of the aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t │ │ │ │ │ -void init(const Matrix *matrix) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -UnSymmetricCriterion() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:544 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_F_r_o_n_t_N_e_i_g_h_b_o_u_r_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -const AggregateDescriptor * const_iterator │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:723 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_r_o_w__ │ │ │ │ │ -int row_ │ │ │ │ │ -index of the currently evaluated row. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_S_t_a_c_k_:_:_S_t_a_c_k │ │ │ │ │ -Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const │ │ │ │ │ -AggregatesMap< Vertex > &aggregates) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_i_n_i_t_R_o_w │ │ │ │ │ -void initRow(const Row &row, int index) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_M_a_t_r_i_x │ │ │ │ │ -M Matrix │ │ │ │ │ -The matrix type we build the dependency of. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:139 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_m_a_t_r_i_x__ │ │ │ │ │ -const Matrix * matrix_ │ │ │ │ │ -The matrix we work on. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:177 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_V_e_r_t_e_x_S_e_t │ │ │ │ │ -S VertexSet │ │ │ │ │ -The type of a single linked list of vertex descriptors. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:801 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const │ │ │ │ │ -compute the norm of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:490 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_U_N_A_G_G_R_E_G_A_T_E_D │ │ │ │ │ -static const V UNAGGREGATED │ │ │ │ │ -Identifier of not yet aggregated vertices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:566 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_r_e_a_d_t_h_F_i_r_s_t_S_e_a_r_c_h │ │ │ │ │ -std::size_t breadthFirstSearch(const VertexDescriptor &start, const │ │ │ │ │ -AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM │ │ │ │ │ -&visitedMap) const │ │ │ │ │ -Breadth first search within an aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -Matrix::field_type field_type │ │ │ │ │ -The current max value. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:298 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_O_n_e_W_a_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > │ │ │ │ │ -&criterion) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_i_s_I_s_o_l_a_t_e_d │ │ │ │ │ -bool isIsolated() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:240 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ -void allocate(std::size_t noVertices) │ │ │ │ │ -Allocate memory for holding the information. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_N_o_r_m │ │ │ │ │ -N Norm │ │ │ │ │ -The norm to use for examining the matrix entries. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const │ │ │ │ │ -compute the norm of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:473 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_r_e_c_o_n_s_t_r_u_c_t │ │ │ │ │ -void reconstruct(const Vertex &vertex) │ │ │ │ │ -Reconstruct the aggregat from an seed node. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -get an iterator over the vertices of the aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -FieldTraits< typenameM::field_type >::real_type operator()(const M &m, typename │ │ │ │ │ -std::enable_if_t::value > *sfinae=nullptr) const │ │ │ │ │ -compute the norm of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:390 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_V_e_r_t_e_x │ │ │ │ │ -MatrixGraph::VertexDescriptor Vertex │ │ │ │ │ -The vertex descriptor type. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:789 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_s_e_e_d │ │ │ │ │ -void seed(const Vertex &vertex) │ │ │ │ │ -Initialize the aggregate with one vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_i_s_I_s_o_l_a_t_e_d │ │ │ │ │ -bool isIsolated() │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -SymmetricDependency() │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:351 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Clear the aggregate. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_f_r_e_e │ │ │ │ │ -void free() │ │ │ │ │ -Free the allocated memory. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_C_o_u_n_t_e_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Increment counter. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_b_u_i_l_d_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, │ │ │ │ │ -bool finestLevel) │ │ │ │ │ -Build the dependency of the matrix graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -V VertexDescriptor │ │ │ │ │ -The vertex descriptor type. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:575 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y_:_:_m_a_x_V_a_l_u_e__ │ │ │ │ │ -real_type maxValue_ │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_u_i_l_d_A_g_g_r_e_g_a_t_e_s │ │ │ │ │ -std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, │ │ │ │ │ -const C &criterion, bool finestLevel) │ │ │ │ │ -Build the aggregates. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y_:_:_R_o_w │ │ │ │ │ -Matrix::row_type Row │ │ │ │ │ -Constant Row iterator of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ -PoolAllocator< Vertex, 100 > Allocator │ │ │ │ │ -The allocator we use for our lists and the set. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:795 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -G MatrixGraph │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:785 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r_:_:_D_e_p_e_n_d_e_n_c_y_C_o_u_n_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const typename MatrixGraph::ConstEdgeIterator &edge) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ -@ is_sign_preserving │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:483 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ -@ is_sign_preserving │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:382 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ -@ is_sign_preserving │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m_:_:_i_s___s_i_g_n___p_r_e_s_e_r_v_i_n_g │ │ │ │ │ -@ is_sign_preserving │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_S_e_t │ │ │ │ │ +S Set │ │ │ │ │ +The type of the connected set. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:220 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_a_g_g_r_e_g_a_t_e │ │ │ │ │ +Aggregate * aggregate │ │ │ │ │ +The aggregate the vertex belongs to. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_s_u_m_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t sumRowSize() │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:534 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_v_e_r_t_e_x │ │ │ │ │ +Vertex vertex │ │ │ │ │ +The vertex descriptor. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_m_i_n_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t minRowSize() │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:528 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_:_:_s_e_t │ │ │ │ │ +static void set(M &coarse, const T &pinfo, const O ©) │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:682 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_V_e_r_t_e_x │ │ │ │ │ +Graph::VertexDescriptor Vertex │ │ │ │ │ +The vertex descriptor of the graph. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_c_a_l_c_u_l_a_t_e │ │ │ │ │ +void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, │ │ │ │ │ +const I &pinfo, const O ©) │ │ │ │ │ +Calculate the galerkin product. │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_m_a_x_R_o_w_S_i_z_e │ │ │ │ │ +std::size_t maxRowSize() │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:523 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ _D_u_n_e_:_:_g_e_t │ │ │ │ │ PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ -Export the type representing the underlying field. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::const_iterator ConstColIterator │ │ │ │ │ -Const iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ -The type implementing a matrix row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -Base class of all aggregation criterions. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_M_a_t_r_i_x_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -Dependency policy for symmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -Dependency policy for symmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:253 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_D_e_p_e_n_d_e_n_c_y │ │ │ │ │ -Dependency policy for symmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l │ │ │ │ │ -Norm that uses only the [N][N] entry of the block to determine couplings. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_i_r_s_t_D_i_a_g_o_n_a_l │ │ │ │ │ -Norm that uses only the [0][0] entry of the block to determine couplings. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:455 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m │ │ │ │ │ -Functor using the row sum (infinity) norm to determine strong couplings. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:463 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:480 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:496 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -Criterion taking advantage of symmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:519 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -Criterion suitable for unsymmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_o_r │ │ │ │ │ -Class for building the aggregates. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:909 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ A Dummy visitor that does nothing for each visited edge. │ │ │ │ │ DDeeffiinniittiioonn aggregates.hh:598 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e │ │ │ │ │ -A class for temporarily storing the vertices of an aggregate in. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:778 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -M::size_type VertexDescriptor │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator │ │ │ │ │ -The constant edge iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:298 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -Iterator over all edges starting from a vertex. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -The vertex iterator type of the graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:209 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -All parameters for AMG. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r │ │ │ │ │ +Functor for building the sparsity pattern of the matrix using │ │ │ │ │ +examineConnectivity. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ +Visitor for identifying connected aggregates during a breadthFirstSearch. │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn galerkin.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ +@ nonoverlapping │ │ │ │ │ +Category for non-overlapping solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ +Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ +newly introduced virtu... │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00110.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: graph.hh File Reference │ │ │ │ +dune-istl: transfer.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,94 +71,49 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Provides classes for building the matrix graph. │ │ │ │ +

Prolongation and restriction for amg. │ │ │ │ More...

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include <dune/istl/istlexception.hh>
│ │ │ │ -#include <dune/common/propertymap.hh>
│ │ │ │ +
#include <dune/istl/bvector.hh>
│ │ │ │ +#include <dune/istl/matrixredistribute.hh>
│ │ │ │ +#include <dune/istl/paamg/pinfo.hh>
│ │ │ │ +#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ +#include <dune/istl/paamg/aggregates.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::MatrixGraph< M >
 The (undirected) graph of a matrix. More...
class  Dune::Amg::Transfer< V1, V2, T >
 
class  Dune::Amg::MatrixGraph< M >::EdgeIteratorT< C >
 Iterator over all edges starting from a vertex. More...
class  Dune::Amg::Transfer< V, V1, SequentialInformation >
 
class  Dune::Amg::MatrixGraph< M >::VertexIteratorT< C >
 The vertex iterator type of the graph. More...
 
class  Dune::Amg::SubGraph< G, T >
 A subgraph of a graph. More...
 
class  Dune::Amg::SubGraph< G, T >::EdgeIndexMap
 An index map for mapping the edges to indices. More...
 
class  Dune::Amg::SubGraph< G, T >::EdgeIterator
 The edge iterator of the graph. More...
 
class  Dune::Amg::SubGraph< G, T >::VertexIterator
 The vertex iterator of the graph. More...
 
class  Dune::Amg::VertexPropertiesGraph< G, VP, VM >
 Attaches properties to the vertices of a graph. More...
 
class  Dune::Amg::VertexPropertiesGraph< G, VP, VM >::VertexIteratorT< C >
 
class  Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >
 Attaches properties to the edges and vertices of a graph. More...
 
class  Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::EdgeIteratorT< C >
 
class  Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::VertexIteratorT< C >
 
class  Dune::Amg::GraphVertexPropertiesSelector< G >
 Wrapper to access the internal edge properties of a graph via operator[]() More...
 
class  Dune::Amg::GraphEdgePropertiesSelector< G >
 Wrapper to access the internal vertex properties of a graph via operator[]() More...
class  Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class G , class V >
int Dune::Amg::visitNeighbours (const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
 Visit all neighbour vertices of a vertex in a graph.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides classes for building the matrix graph.

│ │ │ │ +

Prolongation and restriction for amg.

│ │ │ │
Author
Markus Blatt
│ │ │ │ -

During the coarsening process in AMG the matrix graph together with the dependencies, what connections in the graph are considered strong or weak, what vertices are isolated, etc., have to build. This information will be contained in the MatrixGraph class.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,85 +1,37 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_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 │ │ │ │ │ -graph.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +transfer.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides classes for building the matrix graph. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -#include │ │ │ │ │ +Prolongation and restriction for amg. _M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_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_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_ _M_ _> │ │ │ │ │ -  The (undirected) graph of a matrix. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_1_,_ _V_2_,_ _T_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_ _M_ _>_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ -  Iterator over all edges starting from a vertex. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_ _M_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ -  The vertex iterator type of the graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _> │ │ │ │ │ -  A subgraph of a graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _>_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -  An index map for mapping the edges to indices. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _>_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -  The edge iterator of the graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_<_ _G_,_ _T_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -  The vertex iterator of the graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _V_M_ _> │ │ │ │ │ -  Attaches properties to the vertices of a graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _V_M_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _E_P_,_ _V_M_,_ _E_M_ _> │ │ │ │ │ -  Attaches properties to the edges and vertices of a graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _E_P_,_ _V_M_,_ _E_M_ _>_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _V_P_,_ _E_P_,_ _V_M_,_ _E_M_ _>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_ _C_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_<_ _G_ _> │ │ │ │ │ -  Wrapper to access the internal edge properties of a graph via _o_p_e_r_a_t_o_r │ │ │ │ │ - _[_]_(_) _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_<_ _G_ _> │ │ │ │ │ -  Wrapper to access the internal vertex properties of a graph via │ │ │ │ │ - _o_p_e_r_a_t_o_r_[_]_(_) _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -int  _D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s (const G &graph, const typename G:: │ │ │ │ │ - VertexDescriptor &vertex, V &visitor) │ │ │ │ │ -  Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides classes for building the matrix graph. │ │ │ │ │ +Prolongation and restriction for amg. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ -During the coarsening process in AMG the matrix graph together with the │ │ │ │ │ -dependencies, what connections in the graph are considered strong or weak, what │ │ │ │ │ -vertices are isolated, etc., have to build. This information will be contained │ │ │ │ │ -in the MatrixGraph class. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: graph.hh Source File │ │ │ │ +dune-istl: transfer.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1821 +74,246 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
graph.hh
│ │ │ │ +
transfer.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_GRAPH_HH
│ │ │ │ -
6#define DUNE_AMG_GRAPH_HH
│ │ │ │ +
5#ifndef DUNE_AMGTRANSFER_HH
│ │ │ │ +
6#define DUNE_AMGTRANSFER_HH
│ │ │ │
7
│ │ │ │ -
8#include <cstddef>
│ │ │ │ -
9#include <algorithm>
│ │ │ │ -
10#include <vector>
│ │ │ │ -
11#include <cassert>
│ │ │ │ -
12#include <limits>
│ │ │ │ -
13#include <dune/common/typetraits.hh>
│ │ │ │ -
14#include <dune/common/iteratorfacades.hh>
│ │ │ │ - │ │ │ │ -
16#include <dune/common/propertymap.hh>
│ │ │ │ -
17
│ │ │ │ -
18namespace Dune
│ │ │ │ -
19{
│ │ │ │ -
20 namespace Amg
│ │ │ │ -
21 {
│ │ │ │ -
49 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
51 {
│ │ │ │ -
52 public:
│ │ │ │ -
56 typedef M Matrix;
│ │ │ │ -
57
│ │ │ │ -
61 typedef typename std::remove_const<M>::type MutableMatrix;
│ │ │ │ -
62
│ │ │ │ -
66 typedef typename M::block_type Weight;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
13#include <dune/common/exceptions.hh>
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune
│ │ │ │ +
16{
│ │ │ │ +
17 namespace Amg
│ │ │ │ +
18 {
│ │ │ │ +
19
│ │ │ │ +
30 template<class V1, class V2, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
32 {
│ │ │ │ +
33
│ │ │ │ +
34 public:
│ │ │ │ +
35 typedef V1 Vertex;
│ │ │ │ +
36 typedef V2 Vector;
│ │ │ │ +
37
│ │ │ │ +
38 template<typename T1, typename R>
│ │ │ │ +
39 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ +
40 Vector& fineRedist,T1 damp, R& redistributor=R());
│ │ │ │ +
41
│ │ │ │ +
42 template<typename T1, typename R>
│ │ │ │ +
43 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ +
44 T1 damp);
│ │ │ │ +
45
│ │ │ │ +
46 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
│ │ │ │ +
47 T& comm);
│ │ │ │ +
48 };
│ │ │ │ +
│ │ │ │ +
49
│ │ │ │ +
50 template<class V,class V1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
52 {
│ │ │ │ +
53 public:
│ │ │ │ +
54 typedef V Vertex;
│ │ │ │ +
55 typedef V1 Vector;
│ │ │ │ + │ │ │ │ +
57 template<typename T1>
│ │ │ │ +
58 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ +
59 Vector& fineRedist, T1 damp,
│ │ │ │ + │ │ │ │ +
61 const Redist& redist=Redist());
│ │ │ │ +
62 template<typename T1>
│ │ │ │ +
63 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ +
64 T1 damp,
│ │ │ │ + │ │ │ │ +
66
│ │ │ │
67
│ │ │ │ -
73 typedef typename M::size_type VertexDescriptor;
│ │ │ │ -
74
│ │ │ │ -
80 typedef std::ptrdiff_t EdgeDescriptor;
│ │ │ │ -
81
│ │ │ │ -
82 enum {
│ │ │ │ -
83 /*
│ │ │ │ -
84 * @brief Whether Matrix is mutable.
│ │ │ │ -
85 */
│ │ │ │ -
86 mutableMatrix = std::is_same<M, typename std::remove_const<M>::type>::value
│ │ │ │ -
87 };
│ │ │ │ +
68 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
│ │ │ │ +
69 const SequentialInformation& comm);
│ │ │ │ +
70 };
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
72#if HAVE_MPI
│ │ │ │ +
73
│ │ │ │ +
74 template<class V,class V1, class T1, class T2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
76 {
│ │ │ │ +
77 public:
│ │ │ │ +
78 typedef V Vertex;
│ │ │ │ +
79 typedef V1 Vector;
│ │ │ │ + │ │ │ │ +
81 template<typename T3>
│ │ │ │ +
82 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ +
83 Vector& fineRedist, T3 damp, OwnerOverlapCopyCommunication<T1,T2>& comm,
│ │ │ │ +
84 const Redist& redist);
│ │ │ │ +
85 template<typename T3>
│ │ │ │ +
86 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
│ │ │ │ + │ │ │ │
88
│ │ │ │ -
89
│ │ │ │ -
93 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
95 {
│ │ │ │ -
96
│ │ │ │ -
97 public:
│ │ │ │ -
101 typedef typename std::remove_const<C>::type MutableContainer;
│ │ │ │ -
105 typedef const typename std::remove_const<C>::type ConstContainer;
│ │ │ │ -
106
│ │ │ │ -
107 friend class EdgeIteratorT<MutableContainer>;
│ │ │ │ -
108 friend class EdgeIteratorT<ConstContainer>;
│ │ │ │ -
109
│ │ │ │ -
110 enum {
│ │ │ │ -
112 isMutable = std::is_same<C, MutableContainer>::value
│ │ │ │ -
113 };
│ │ │ │ -
114
│ │ │ │ -
118 typedef typename std::conditional<isMutable && C::mutableMatrix,typename Matrix::row_type::Iterator,
│ │ │ │ -
119 typename Matrix::row_type::ConstIterator>::type
│ │ │ │ - │ │ │ │ -
121
│ │ │ │ -
125 typedef typename std::conditional<isMutable && C::mutableMatrix,typename M::block_type,
│ │ │ │ -
126 const typename M::block_type>::type
│ │ │ │ - │ │ │ │ -
128
│ │ │ │ - │ │ │ │ -
137 const ColIterator& end, const EdgeDescriptor& edge);
│ │ │ │ -
138
│ │ │ │ - │ │ │ │ -
146
│ │ │ │ -
151 template<class C1>
│ │ │ │ - │ │ │ │ -
153
│ │ │ │ -
154 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
│ │ │ │ -
155 typename M::block_type, const typename M::block_type>::type
│ │ │ │ - │ │ │ │ -
157
│ │ │ │ - │ │ │ │ -
162
│ │ │ │ - │ │ │ │ +
89 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
│ │ │ │ + │ │ │ │ +
91 };
│ │ │ │ +
│ │ │ │ +
92
│ │ │ │ +
93#endif
│ │ │ │ +
94
│ │ │ │ +
95 template<class V, class V1>
│ │ │ │ +
96 template<typename T>
│ │ │ │ +
97 inline void
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
99 Vector& coarse, Vector& fine,
│ │ │ │ +
100 [[maybe_unused]] Vector& fineRedist,
│ │ │ │ +
101 T damp,
│ │ │ │ +
102 [[maybe_unused]] const SequentialInformation& comm,
│ │ │ │ +
103 [[maybe_unused]] const Redist& redist)
│ │ │ │ +
104 {
│ │ │ │ +
105 prolongateVector(aggregates, coarse, fine, damp);
│ │ │ │ +
106 }
│ │ │ │ +
│ │ │ │ +
107 template<class V, class V1>
│ │ │ │ +
108 template<typename T>
│ │ │ │ +
109 inline void
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
111 Vector& coarse, Vector& fine,
│ │ │ │ +
112 T damp,
│ │ │ │ +
113 [[maybe_unused]] const SequentialInformation& comm)
│ │ │ │ +
114 {
│ │ │ │ +
115 typedef typename Vector::iterator Iterator;
│ │ │ │ +
116
│ │ │ │ +
117 Iterator end = coarse.end();
│ │ │ │ +
118 Iterator begin= coarse.begin();
│ │ │ │ +
119 for(; begin!=end; ++begin)
│ │ │ │ +
120 *begin*=damp;
│ │ │ │ +
121 end=fine.end();
│ │ │ │ +
122 begin=fine.begin();
│ │ │ │ +
123
│ │ │ │ +
124 for(Iterator block=begin; block != end; ++block) {
│ │ │ │ +
125 std::ptrdiff_t index=block-begin;
│ │ │ │ +
126 const Vertex& vertex = aggregates[index];
│ │ │ │ + │ │ │ │ +
128 *block += coarse[aggregates[index]];
│ │ │ │ +
129 }
│ │ │ │ +
130 }
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
132 template<class V, class V1>
│ │ │ │ +
133 inline void
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
135 Vector& coarse,
│ │ │ │ +
136 const Vector& fine,
│ │ │ │ +
137 [[maybe_unused]] const SequentialInformation& comm)
│ │ │ │ +
138 {
│ │ │ │ +
139 // Set coarse vector to zero
│ │ │ │ +
140 coarse=0;
│ │ │ │ +
141
│ │ │ │ +
142 typedef typename Vector::const_iterator Iterator;
│ │ │ │ +
143 Iterator end = fine.end();
│ │ │ │ +
144 Iterator begin=fine.begin();
│ │ │ │ +
145
│ │ │ │ +
146 for(Iterator block=begin; block != end; ++block) {
│ │ │ │ +
147 const Vertex& vertex = aggregates[block-begin];
│ │ │ │ + │ │ │ │ +
149 coarse[vertex] += *block;
│ │ │ │ +
150 }
│ │ │ │ +
151 }
│ │ │ │ +
│ │ │ │ +
152
│ │ │ │ +
153#if HAVE_MPI
│ │ │ │ +
154 template<class V, class V1, class T1, class T2>
│ │ │ │ +
155 template<typename T3>
│ │ │ │ +
│ │ │ │ +
156 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::prolongateVector(const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
157 Vector& coarse, Vector& fine,
│ │ │ │ +
158 Vector& fineRedist, T3 damp,
│ │ │ │ + │ │ │ │ +
160 const Redist& redist)
│ │ │ │ +
161 {
│ │ │ │ +
162 if(fineRedist.size()>0)
│ │ │ │ +
163 // we operated on the coarse level
│ │ │ │ +
164 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fineRedist, damp);
│ │ │ │
165
│ │ │ │ -
167 bool operator!=(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
│ │ │ │ -
168
│ │ │ │ -
170 bool operator!=(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
│ │ │ │ -
171
│ │ │ │ -
173 bool operator==(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
│ │ │ │ -
174
│ │ │ │ -
176 bool operator==(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
│ │ │ │ -
177
│ │ │ │ - │ │ │ │ -
180
│ │ │ │ - │ │ │ │ -
183
│ │ │ │ -
185 const EdgeDescriptor& operator*() const;
│ │ │ │ -
186
│ │ │ │ - │ │ │ │ -
189
│ │ │ │ -
190 private:
│ │ │ │ -
192 VertexDescriptor source_;
│ │ │ │ -
194 ColIterator block_;
│ │ │ │ -
195 /***
│ │ │ │ -
196 * @brief The column iterator positioned at the end of the row
│ │ │ │ -
197 * of vertex source_
│ │ │ │ -
198 */
│ │ │ │ -
199 ColIterator blockEnd_;
│ │ │ │ -
201 EdgeDescriptor edge_;
│ │ │ │ -
202 };
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
207 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
209 {
│ │ │ │ -
210 public:
│ │ │ │ -
214 typedef typename std::remove_const<C>::type MutableContainer;
│ │ │ │ -
218 typedef const typename std::remove_const<C>::type ConstContainer;
│ │ │ │ -
219
│ │ │ │ -
220 friend class VertexIteratorT<MutableContainer>;
│ │ │ │ -
221 friend class VertexIteratorT<ConstContainer>;
│ │ │ │ -
222
│ │ │ │ -
223 enum {
│ │ │ │ -
225 isMutable = std::is_same<C, MutableContainer>::value
│ │ │ │ -
226 };
│ │ │ │ -
227
│ │ │ │ -
233 explicit VertexIteratorT(C* graph, const VertexDescriptor& current);
│ │ │ │ -
234
│ │ │ │ -
242 explicit VertexIteratorT(const VertexDescriptor& current);
│ │ │ │ -
243
│ │ │ │ - │ │ │ │ -
245
│ │ │ │ - │ │ │ │ -
251
│ │ │ │ - │ │ │ │ -
254
│ │ │ │ - │ │ │ │ -
257
│ │ │ │ - │ │ │ │ -
260
│ │ │ │ - │ │ │ │ -
263
│ │ │ │ -
264 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
│ │ │ │ -
265 typename M::block_type, const typename M::block_type>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
269
│ │ │ │ - │ │ │ │ -
275
│ │ │ │ - │ │ │ │ -
282
│ │ │ │ - │ │ │ │ -
289
│ │ │ │ -
290 private:
│ │ │ │ -
291 C* graph_;
│ │ │ │ -
292 VertexDescriptor current_;
│ │ │ │ -
293 };
│ │ │ │ -
│ │ │ │ -
294
│ │ │ │ - │ │ │ │ -
299
│ │ │ │ - │ │ │ │ -
304
│ │ │ │ - │ │ │ │ -
309
│ │ │ │ - │ │ │ │ -
314
│ │ │ │ - │ │ │ │ -
320
│ │ │ │ - │ │ │ │ -
325
│ │ │ │ - │ │ │ │ -
331
│ │ │ │ - │ │ │ │ -
337
│ │ │ │ - │ │ │ │ -
343
│ │ │ │ - │ │ │ │ -
349
│ │ │ │ - │ │ │ │ -
357
│ │ │ │ - │ │ │ │ -
365
│ │ │ │ -
366
│ │ │ │ - │ │ │ │ -
374
│ │ │ │ - │ │ │ │ -
382
│ │ │ │ - │ │ │ │ -
388
│ │ │ │ -
393 const Matrix& matrix() const;
│ │ │ │ -
394
│ │ │ │ -
398 std::size_t noVertices() const;
│ │ │ │ -
399
│ │ │ │ - │ │ │ │ -
407
│ │ │ │ -
411 std::size_t noEdges() const;
│ │ │ │ -
412
│ │ │ │ - │ │ │ │ -
420 const VertexDescriptor& target) const;
│ │ │ │ -
421
│ │ │ │ -
422 private:
│ │ │ │ -
424 Matrix& matrix_;
│ │ │ │ -
426 EdgeDescriptor* start_;
│ │ │ │ -
428 MatrixGraph(const MatrixGraph&);
│ │ │ │ -
429
│ │ │ │ -
430 };
│ │ │ │ -
│ │ │ │ -
431
│ │ │ │ -
441 template<class G, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
443 {
│ │ │ │ -
444 public:
│ │ │ │ -
448 typedef G Graph;
│ │ │ │ -
449
│ │ │ │ -
454 typedef T Excluded;
│ │ │ │ -
455
│ │ │ │ -
459 typedef typename Graph::VertexDescriptor VertexDescriptor;
│ │ │ │ -
460
│ │ │ │ - │ │ │ │ -
462
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
470 {
│ │ │ │ -
471 public:
│ │ │ │ -
472 typedef ReadablePropertyMapTag Category;
│ │ │ │ -
473
│ │ │ │ -
│ │ │ │ -
474 EdgeIndexMap(const EdgeDescriptor& firstEdge)
│ │ │ │ -
475 : firstEdge_(firstEdge)
│ │ │ │ -
476 {}
│ │ │ │ -
│ │ │ │ -
477
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
480 : firstEdge_(emap.firstEdge_)
│ │ │ │ -
481 {}
│ │ │ │ -
│ │ │ │ -
482
│ │ │ │ -
│ │ │ │ -
483 std::size_t operator[](const EdgeDescriptor& edge) const
│ │ │ │ -
484 {
│ │ │ │ -
485 return edge-firstEdge_;
│ │ │ │ -
486 }
│ │ │ │ -
│ │ │ │ -
487 private:
│ │ │ │ -
489 EdgeDescriptor firstEdge_;
│ │ │ │ - │ │ │ │ -
492 {}
│ │ │ │ -
493 };
│ │ │ │ -
│ │ │ │ -
494
│ │ │ │ - │ │ │ │ -
500
│ │ │ │ -
│ │ │ │ -
504 class EdgeIterator : public RandomAccessIteratorFacade<EdgeIterator,const EdgeDescriptor>
│ │ │ │ -
505 {
│ │ │ │ -
506 public:
│ │ │ │ -
512 explicit EdgeIterator(const VertexDescriptor& source, const EdgeDescriptor& edge);
│ │ │ │ -
513
│ │ │ │ -
521 explicit EdgeIterator(const EdgeDescriptor& edge);
│ │ │ │ -
522
│ │ │ │ -
524 bool equals(const EdgeIterator& other) const;
│ │ │ │ -
525
│ │ │ │ - │ │ │ │ -
528
│ │ │ │ - │ │ │ │ -
531
│ │ │ │ -
532 EdgeIterator& advance(std::ptrdiff_t n);
│ │ │ │ -
533
│ │ │ │ - │ │ │ │ -
536
│ │ │ │ -
538 const VertexDescriptor& target() const;
│ │ │ │ -
539
│ │ │ │ -
541 const VertexDescriptor& source() const;
│ │ │ │ -
542
│ │ │ │ -
543 std::ptrdiff_t distanceTo(const EdgeIterator& other) const;
│ │ │ │ -
544
│ │ │ │ -
545 private:
│ │ │ │ -
547 VertexDescriptor source_;
│ │ │ │ -
552 EdgeDescriptor edge_;
│ │ │ │ -
553 };
│ │ │ │ -
│ │ │ │ -
554
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
559 : public ForwardIteratorFacade<VertexIterator,const VertexDescriptor>
│ │ │ │ -
560 {
│ │ │ │ -
561 public:
│ │ │ │ -
568 explicit VertexIterator(const SubGraph<G,T>* graph, const VertexDescriptor& current,
│ │ │ │ -
569 const VertexDescriptor& end);
│ │ │ │ -
570
│ │ │ │ -
571
│ │ │ │ -
578 explicit VertexIterator(const VertexDescriptor& current);
│ │ │ │ -
579
│ │ │ │ - │ │ │ │ -
582
│ │ │ │ -
584 bool equals(const VertexIterator& other) const;
│ │ │ │ -
585
│ │ │ │ - │ │ │ │ -
591
│ │ │ │ - │ │ │ │ -
598
│ │ │ │ - │ │ │ │ -
605
│ │ │ │ -
606 private:
│ │ │ │ -
608 const SubGraph<Graph,T>* graph_;
│ │ │ │ -
610 VertexDescriptor current_;
│ │ │ │ -
612 VertexDescriptor end_;
│ │ │ │ -
613 };
│ │ │ │ -
│ │ │ │ -
614
│ │ │ │ - │ │ │ │ -
619
│ │ │ │ - │ │ │ │ -
624
│ │ │ │ - │ │ │ │ -
630
│ │ │ │ - │ │ │ │ -
636
│ │ │ │ - │ │ │ │ -
644
│ │ │ │ - │ │ │ │ -
652
│ │ │ │ -
656 std::size_t noVertices() const;
│ │ │ │ -
657
│ │ │ │ - │ │ │ │ -
665
│ │ │ │ -
669 std::size_t noEdges() const;
│ │ │ │ - │ │ │ │ -
677 const VertexDescriptor& target) const;
│ │ │ │ -
685 SubGraph(const Graph& graph, const T& excluded);
│ │ │ │ -
686
│ │ │ │ - │ │ │ │ -
691
│ │ │ │ -
692 private:
│ │ │ │ -
694 const T& excluded_;
│ │ │ │ -
696 std::size_t noVertices_;
│ │ │ │ -
698 VertexDescriptor endVertex_;
│ │ │ │ -
700 int noEdges_;
│ │ │ │ -
705 VertexDescriptor maxVertex_;
│ │ │ │ -
707 VertexDescriptor* edges_;
│ │ │ │ -
709 std::ptrdiff_t* start_;
│ │ │ │ -
711 std::ptrdiff_t* end_;
│ │ │ │ -
713 SubGraph(const SubGraph&)
│ │ │ │ -
714 {}
│ │ │ │ -
715 };
│ │ │ │ -
│ │ │ │ -
716
│ │ │ │ -
717
│ │ │ │ -
721 template<class G, class VP, class VM=IdentityMap>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
723 {
│ │ │ │ -
724 public:
│ │ │ │ -
728 typedef G Graph;
│ │ │ │ -
729
│ │ │ │ -
733 typedef typename Graph::VertexDescriptor VertexDescriptor;
│ │ │ │ -
734
│ │ │ │ -
738 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
│ │ │ │ -
739
│ │ │ │ - │ │ │ │ -
744
│ │ │ │ -
756 typedef VM VertexMap;
│ │ │ │ -
757
│ │ │ │ -
761 typedef typename Graph::EdgeIterator EdgeIterator;
│ │ │ │ -
762
│ │ │ │ -
766 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
│ │ │ │ -
767
│ │ │ │ - │ │ │ │ -
774
│ │ │ │ - │ │ │ │ -
781
│ │ │ │ - │ │ │ │ -
788
│ │ │ │ - │ │ │ │ -
795
│ │ │ │ -
796
│ │ │ │ -
797 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
799 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
800 C>::value,
│ │ │ │ -
801 typename Graph::VertexIterator,
│ │ │ │ -
802 typename Graph::ConstVertexIterator>::type
│ │ │ │ -
803 {
│ │ │ │ -
804 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
│ │ │ │ -
805 friend class VertexIteratorT<typename std::remove_const<C>::type>;
│ │ │ │ -
806 public:
│ │ │ │ -
810 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
811 C>::value,
│ │ │ │ -
812 typename Graph::VertexIterator,
│ │ │ │ -
813 typename Graph::ConstVertexIterator>::type
│ │ │ │ - │ │ │ │ -
815
│ │ │ │ -
819 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
820 C>::value,
│ │ │ │ -
821 typename Graph::EdgeIterator,
│ │ │ │ -
822 typename Graph::ConstEdgeIterator>::type
│ │ │ │ - │ │ │ │ -
824
│ │ │ │ -
830 explicit VertexIteratorT(const Father& iter,
│ │ │ │ -
831 C* graph);
│ │ │ │ -
832
│ │ │ │ -
833
│ │ │ │ -
841 explicit VertexIteratorT(const Father& iter);
│ │ │ │ -
842
│ │ │ │ -
847 template<class C1>
│ │ │ │ -
848 VertexIteratorT(const VertexIteratorT<C1>& other);
│ │ │ │ -
849
│ │ │ │ -
853 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ -
854 VertexProperties&,
│ │ │ │ -
855 const VertexProperties&>::type
│ │ │ │ -
856 properties() const;
│ │ │ │ -
857
│ │ │ │ - │ │ │ │ -
864
│ │ │ │ - │ │ │ │ -
871
│ │ │ │ -
872 private:
│ │ │ │ -
876 C* graph_;
│ │ │ │ -
877 };
│ │ │ │ -
│ │ │ │ -
878
│ │ │ │ -
882 typedef VertexIteratorT<VertexPropertiesGraph<Graph,
│ │ │ │ -
883 VertexProperties,VM> > VertexIterator;
│ │ │ │ -
884
│ │ │ │ -
888 typedef VertexIteratorT<const VertexPropertiesGraph<Graph,
│ │ │ │ -
889 VertexProperties,VM> > ConstVertexIterator;
│ │ │ │ -
890
│ │ │ │ - │ │ │ │ -
896
│ │ │ │ - │ │ │ │ -
902
│ │ │ │ - │ │ │ │ -
908
│ │ │ │ - │ │ │ │ -
914
│ │ │ │ -
920 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
│ │ │ │ -
921
│ │ │ │ -
927 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
│ │ │ │ -
928
│ │ │ │ -
933 const Graph& graph() const;
│ │ │ │ -
934
│ │ │ │ -
938 std::size_t noVertices() const;
│ │ │ │ -
939
│ │ │ │ -
943 std::size_t noEdges() const;
│ │ │ │ -
944
│ │ │ │ - │ │ │ │ -
952
│ │ │ │ -
958 VertexPropertiesGraph(Graph& graph, const VertexMap vmap=VertexMap());
│ │ │ │ -
959
│ │ │ │ -
960 private:
│ │ │ │ -
961 VertexPropertiesGraph(const VertexPropertiesGraph&)
│ │ │ │ -
962 {}
│ │ │ │ -
963
│ │ │ │ -
965 Graph& graph_;
│ │ │ │ -
967 VertexMap vmap_;
│ │ │ │ -
969 std::vector<VertexProperties> vertexProperties_;
│ │ │ │ -
970
│ │ │ │ -
971 };
│ │ │ │ -
│ │ │ │ -
972
│ │ │ │ -
976 template<class G, class VP, class EP, class VM=IdentityMap, class EM=IdentityMap>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
978 {
│ │ │ │ -
979 public:
│ │ │ │ -
983 typedef G Graph;
│ │ │ │ -
984
│ │ │ │ -
988 typedef typename Graph::VertexDescriptor VertexDescriptor;
│ │ │ │ -
989
│ │ │ │ -
993 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
│ │ │ │ -
994
│ │ │ │ - │ │ │ │ -
999
│ │ │ │ -
1011 typedef VM VertexMap;
│ │ │ │ -
1012
│ │ │ │ -
1016 typedef EP EdgeProperties;
│ │ │ │ -
1017
│ │ │ │ -
1018
│ │ │ │ -
1030 typedef EM EdgeMap;
│ │ │ │ -
1031
│ │ │ │ -
1032 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1034 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
1035 C>::value,
│ │ │ │ -
1036 typename Graph::EdgeIterator,
│ │ │ │ -
1037 typename Graph::ConstEdgeIterator>::type
│ │ │ │ -
1038 {
│ │ │ │ -
1039
│ │ │ │ -
1040 friend class EdgeIteratorT<const typename std::remove_const<C>::type>;
│ │ │ │ -
1041 friend class EdgeIteratorT<typename std::remove_const<C>::type>;
│ │ │ │ -
1042 public:
│ │ │ │ -
1046 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
1047 C>::value,
│ │ │ │ -
1048 typename Graph::EdgeIterator,
│ │ │ │ -
1049 typename Graph::ConstEdgeIterator>::type
│ │ │ │ - │ │ │ │ -
1051
│ │ │ │ -
1057 explicit EdgeIteratorT(const Father& iter,
│ │ │ │ -
1058 C* graph);
│ │ │ │ -
1059
│ │ │ │ -
1067 explicit EdgeIteratorT(const Father& iter);
│ │ │ │ -
1068
│ │ │ │ -
1073 template<class C1>
│ │ │ │ -
1074 EdgeIteratorT(const EdgeIteratorT<C1>& other);
│ │ │ │ -
1075
│ │ │ │ -
1079 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ -
1080 EdgeProperties&,
│ │ │ │ -
1081 const EdgeProperties&>::type
│ │ │ │ -
1082 properties() const;
│ │ │ │ -
1083
│ │ │ │ -
1084 private:
│ │ │ │ -
1088 C* graph_;
│ │ │ │ -
1089 };
│ │ │ │ -
│ │ │ │ -
1090
│ │ │ │ -
1094 typedef EdgeIteratorT<PropertiesGraph<Graph,
│ │ │ │ -
1095 VertexProperties,
│ │ │ │ -
1096 EdgeProperties,VM,EM> > EdgeIterator;
│ │ │ │ -
1097
│ │ │ │ -
1101 typedef EdgeIteratorT<const PropertiesGraph<Graph,
│ │ │ │ -
1102 VertexProperties,
│ │ │ │ -
1103 EdgeProperties,VM,EM> > ConstEdgeIterator;
│ │ │ │ -
1104
│ │ │ │ -
1110 EdgeIterator beginEdges(const VertexDescriptor& source);
│ │ │ │ -
1111
│ │ │ │ -
1117 EdgeIterator endEdges(const VertexDescriptor& source);
│ │ │ │ -
1118
│ │ │ │ -
1124 ConstEdgeIterator beginEdges(const VertexDescriptor& source) const;
│ │ │ │ -
1125
│ │ │ │ -
1131 ConstEdgeIterator endEdges(const VertexDescriptor& source) const;
│ │ │ │ -
1132
│ │ │ │ -
1133
│ │ │ │ -
1134 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1136 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
1137 C>::value,
│ │ │ │ -
1138 typename Graph::VertexIterator,
│ │ │ │ -
1139 typename Graph::ConstVertexIterator>::type
│ │ │ │ -
1140 {
│ │ │ │ -
1141 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
│ │ │ │ -
1142 friend class VertexIteratorT<typename std::remove_const<C>::type>;
│ │ │ │ -
1143 public:
│ │ │ │ -
1147 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
1148 C>::value,
│ │ │ │ -
1149 typename Graph::VertexIterator,
│ │ │ │ -
1150 typename Graph::ConstVertexIterator>::type
│ │ │ │ - │ │ │ │ -
1152
│ │ │ │ -
1158 explicit VertexIteratorT(const Father& iter,
│ │ │ │ -
1159 C* graph);
│ │ │ │ -
1160
│ │ │ │ -
1161
│ │ │ │ -
1169 explicit VertexIteratorT(const Father& iter);
│ │ │ │ -
1170
│ │ │ │ -
1175 template<class C1>
│ │ │ │ -
1176 VertexIteratorT(const VertexIteratorT<C1>& other);
│ │ │ │ -
1177
│ │ │ │ -
1181 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ -
1182 VertexProperties&,
│ │ │ │ -
1183 const VertexProperties&>::type
│ │ │ │ -
1184 properties() const;
│ │ │ │ -
1185
│ │ │ │ -
1191 EdgeIteratorT<C> begin() const;
│ │ │ │ -
1192
│ │ │ │ -
1198 EdgeIteratorT<C> end() const;
│ │ │ │ -
1199
│ │ │ │ -
1200 private:
│ │ │ │ -
1204 C* graph_;
│ │ │ │ -
1205 };
│ │ │ │ -
│ │ │ │ -
1206
│ │ │ │ -
1210 typedef VertexIteratorT<PropertiesGraph<Graph,
│ │ │ │ -
1211 VertexProperties,
│ │ │ │ -
1212 EdgeProperties,VM,EM> > VertexIterator;
│ │ │ │ -
1213
│ │ │ │ -
1217 typedef VertexIteratorT<const PropertiesGraph<Graph,
│ │ │ │ -
1218 VertexProperties,
│ │ │ │ -
1219 EdgeProperties,VM,EM> > ConstVertexIterator;
│ │ │ │ -
1220
│ │ │ │ - │ │ │ │ -
1226
│ │ │ │ - │ │ │ │ -
1232
│ │ │ │ -
1237 ConstVertexIterator begin() const;
│ │ │ │ -
1238
│ │ │ │ - │ │ │ │ -
1244
│ │ │ │ -
1250 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
│ │ │ │ -
1251
│ │ │ │ -
1257 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
│ │ │ │ -
1258
│ │ │ │ -
│ │ │ │ -
1265 EdgeDescriptor findEdge(const VertexDescriptor& source,
│ │ │ │ -
1266 const VertexDescriptor& target)
│ │ │ │ -
1267 {
│ │ │ │ -
1268 return graph_.findEdge(source,target);
│ │ │ │ -
1269 }
│ │ │ │ -
│ │ │ │ -
1270
│ │ │ │ - │ │ │ │ -
1277
│ │ │ │ -
1278
│ │ │ │ - │ │ │ │ -
1285
│ │ │ │ - │ │ │ │ -
1293 const VertexDescriptor& target);
│ │ │ │ -
1294
│ │ │ │ - │ │ │ │ -
1302 const VertexDescriptor& target) const;
│ │ │ │ -
1303
│ │ │ │ -
1308 const Graph& graph() const;
│ │ │ │ -
1309
│ │ │ │ -
1313 std::size_t noVertices() const;
│ │ │ │ -
1314
│ │ │ │ -
1318 std::size_t noEdges() const;
│ │ │ │ -
1319
│ │ │ │ - │ │ │ │ -
1327
│ │ │ │ - │ │ │ │ -
1335 const EdgeMap& emap=EdgeMap());
│ │ │ │ -
1336
│ │ │ │ -
1337 private:
│ │ │ │ - │ │ │ │ -
1339 {}
│ │ │ │ -
1340
│ │ │ │ -
1342 Graph& graph_;
│ │ │ │ -
1345 VertexMap vmap_;
│ │ │ │ -
1346 std::vector<VertexProperties> vertexProperties_;
│ │ │ │ -
1348 EdgeMap emap_;
│ │ │ │ -
1350 std::vector<EdgeProperties> edgeProperties_;
│ │ │ │ -
1351
│ │ │ │ -
1352 };
│ │ │ │ -
│ │ │ │ -
1353
│ │ │ │ -
1354
│ │ │ │ -
1359 template<typename G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1361 {
│ │ │ │ -
1362 public:
│ │ │ │ -
1366 typedef G Graph;
│ │ │ │ -
1370 typedef typename G::VertexProperties VertexProperties;
│ │ │ │ -
1374 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
1375
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1381 : graph_(g)
│ │ │ │ -
1382 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1387 : graph_(0)
│ │ │ │ -
1388 {}
│ │ │ │ -
│ │ │ │ -
1389
│ │ │ │ -
1390
│ │ │ │ -
│ │ │ │ -
1395 VertexProperties& operator[](const Vertex& vertex) const
│ │ │ │ -
1396 {
│ │ │ │ -
1397 return graph_->getVertexProperties(vertex);
│ │ │ │ -
1398 }
│ │ │ │ -
│ │ │ │ -
1399 private:
│ │ │ │ -
1400 Graph* graph_;
│ │ │ │ -
1401 };
│ │ │ │ -
│ │ │ │ -
1402
│ │ │ │ -
1407 template<typename G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1409 {
│ │ │ │ -
1410 public:
│ │ │ │ -
1414 typedef G Graph;
│ │ │ │ -
1418 typedef typename G::EdgeProperties EdgeProperties;
│ │ │ │ -
1422 typedef typename G::EdgeDescriptor Edge;
│ │ │ │ -
1423
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1429 : graph_(g)
│ │ │ │ -
1430 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1435 : graph_(0)
│ │ │ │ -
1436 {}
│ │ │ │ -
│ │ │ │ -
1437
│ │ │ │ -
│ │ │ │ -
1442 EdgeProperties& operator[](const Edge& edge) const
│ │ │ │ -
1443 {
│ │ │ │ -
1444 return graph_->getEdgeProperties(edge);
│ │ │ │ -
1445 }
│ │ │ │ -
│ │ │ │ -
1446 private:
│ │ │ │ -
1447 Graph* graph_;
│ │ │ │ -
1448 };
│ │ │ │ -
│ │ │ │ -
1449
│ │ │ │ -
1450
│ │ │ │ -
1461 template<class G, class V>
│ │ │ │ -
1462 int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
│ │ │ │ -
1463 V& visitor);
│ │ │ │ -
1464
│ │ │ │ -
1465#ifndef DOXYGEN
│ │ │ │ -
1466
│ │ │ │ -
1467 template<class M>
│ │ │ │ - │ │ │ │ -
1469 : matrix_(matrix)
│ │ │ │ -
1470 {
│ │ │ │ -
1471 if(matrix_.N()!=matrix_.M())
│ │ │ │ -
1472 DUNE_THROW(ISTLError, "Matrix has to have as many columns as rows!");
│ │ │ │ -
1473
│ │ │ │ -
1474 start_ = new EdgeDescriptor[matrix_.N()+1];
│ │ │ │ -
1475
│ │ │ │ -
1476 typedef typename M::ConstIterator Iterator;
│ │ │ │ -
1477 start_[matrix_.begin().index()] = 0;
│ │ │ │ -
1478
│ │ │ │ -
1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row)
│ │ │ │ -
1480 start_[row.index()+1] = start_[row.index()] + row->size();
│ │ │ │ -
1481 }
│ │ │ │ -
1482
│ │ │ │ -
1483 template<class M>
│ │ │ │ -
1484 MatrixGraph<M>::~MatrixGraph()
│ │ │ │ -
1485 {
│ │ │ │ -
1486 delete[] start_;
│ │ │ │ -
1487 }
│ │ │ │ -
1488
│ │ │ │ -
1489 template<class M>
│ │ │ │ -
1490 inline std::size_t MatrixGraph<M>::noEdges() const
│ │ │ │ -
1491 {
│ │ │ │ -
1492 return start_[matrix_.N()];
│ │ │ │ -
1493 }
│ │ │ │ -
1494
│ │ │ │ -
1495 template<class M>
│ │ │ │ -
1496 inline std::size_t MatrixGraph<M>::noVertices() const
│ │ │ │ -
1497 {
│ │ │ │ -
1498 return matrix_.N();
│ │ │ │ -
1499 }
│ │ │ │ -
1500
│ │ │ │ -
1501 template<class M>
│ │ │ │ -
1502 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::maxVertex() const
│ │ │ │ -
1503 {
│ │ │ │ -
1504 return matrix_.N()-1;
│ │ │ │ -
1505 }
│ │ │ │ -
1506
│ │ │ │ -
1507 template<class M>
│ │ │ │ -
1508 typename MatrixGraph<M>::EdgeDescriptor
│ │ │ │ -
1509 MatrixGraph<M>::findEdge(const VertexDescriptor& source,
│ │ │ │ -
1510 const VertexDescriptor& target) const
│ │ │ │ -
1511 {
│ │ │ │ -
1512 typename M::ConstColIterator found =matrix_[source].find(target);
│ │ │ │ -
1513 if(found == matrix_[source].end())
│ │ │ │ -
1514 return std::numeric_limits<EdgeDescriptor>::max();
│ │ │ │ -
1515 std::size_t offset = found.offset();
│ │ │ │ -
1516 if(target>source)
│ │ │ │ -
1517 offset--;
│ │ │ │ -
1518
│ │ │ │ -
1519 assert(offset<noEdges());
│ │ │ │ -
1520
│ │ │ │ -
1521 return start_[source]+offset;
│ │ │ │ -
1522 }
│ │ │ │ -
1523
│ │ │ │ -
1524
│ │ │ │ -
1525 template<class M>
│ │ │ │ -
1526 inline M& MatrixGraph<M>::matrix()
│ │ │ │ -
1527 {
│ │ │ │ -
1528 return matrix_;
│ │ │ │ -
1529 }
│ │ │ │ -
1530
│ │ │ │ -
1531 template<class M>
│ │ │ │ -
1532 inline const M& MatrixGraph<M>::matrix() const
│ │ │ │ -
1533 {
│ │ │ │ -
1534 return matrix_;
│ │ │ │ -
1535 }
│ │ │ │ -
1536
│ │ │ │ -
1537 template<class M>
│ │ │ │ -
1538 template<class C>
│ │ │ │ -
1539 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const VertexDescriptor& source, const ColIterator& block,
│ │ │ │ -
1540 const ColIterator& end, const EdgeDescriptor& edge)
│ │ │ │ -
1541 : source_(source), block_(block), blockEnd_(end), edge_(edge)
│ │ │ │ -
1542 {
│ │ │ │ -
1543 if(block_!=blockEnd_ && block_.index() == source_) {
│ │ │ │ -
1544 // This is the edge from the diagonal to the diagonal. Skip it.
│ │ │ │ -
1545 ++block_;
│ │ │ │ -
1546 }
│ │ │ │ -
1547 }
│ │ │ │ -
1548
│ │ │ │ -
1549 template<class M>
│ │ │ │ -
1550 template<class C>
│ │ │ │ -
1551 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const ColIterator& block)
│ │ │ │ -
1552 : block_(block)
│ │ │ │ -
1553 {}
│ │ │ │ -
1554
│ │ │ │ -
1555 template<class M>
│ │ │ │ -
1556 template<class C>
│ │ │ │ -
1557 template<class C1>
│ │ │ │ -
1558 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
│ │ │ │ -
1559 : source_(other.source_), block_(other.block_), blockEnd_(other.blockEnd_), edge_(other.edge_)
│ │ │ │ -
1560 {}
│ │ │ │ -
1561
│ │ │ │ -
1562
│ │ │ │ -
1563 template<class M>
│ │ │ │ -
1564 template<class C>
│ │ │ │ -
1565 inline typename MatrixGraph<M>::template EdgeIteratorT<C>::WeightType&
│ │ │ │ -
1566 MatrixGraph<M>::EdgeIteratorT<C>::weight() const
│ │ │ │ -
1567 {
│ │ │ │ -
1568 return *block_;
│ │ │ │ -
1569 }
│ │ │ │ -
1570
│ │ │ │ -
1571 template<class M>
│ │ │ │ -
1572 template<class C>
│ │ │ │ -
1573 inline typename MatrixGraph<M>::template EdgeIteratorT<C>& MatrixGraph<M>::EdgeIteratorT<C>::operator++()
│ │ │ │ -
1574 {
│ │ │ │ -
1575 ++block_;
│ │ │ │ -
1576 ++edge_;
│ │ │ │ -
1577
│ │ │ │ -
1578 if(block_!=blockEnd_ && block_.index() == source_) {
│ │ │ │ -
1579 // This is the edge from the diagonal to the diagonal. Skip it.
│ │ │ │ -
1580 ++block_;
│ │ │ │ -
1581 }
│ │ │ │ -
1582
│ │ │ │ -
1583 return *this;
│ │ │ │ -
1584 }
│ │ │ │ -
1585
│ │ │ │ -
1586 template<class M>
│ │ │ │ -
1587 template<class C>
│ │ │ │ -
1588 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
│ │ │ │ -
1589 {
│ │ │ │ -
1590 return block_!=other.block_;
│ │ │ │ -
1591 }
│ │ │ │ -
1592
│ │ │ │ -
1593 template<class M>
│ │ │ │ -
1594 template<class C>
│ │ │ │ -
1595 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
│ │ │ │ -
1596 {
│ │ │ │ -
1597 return block_!=other.block_;
│ │ │ │ -
1598 }
│ │ │ │ -
1599
│ │ │ │ -
1600 template<class M>
│ │ │ │ -
1601 template<class C>
│ │ │ │ -
1602 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
│ │ │ │ -
1603 {
│ │ │ │ -
1604 return block_==other.block_;
│ │ │ │ -
1605 }
│ │ │ │ -
1606
│ │ │ │ -
1607 template<class M>
│ │ │ │ -
1608 template<class C>
│ │ │ │ -
1609 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
│ │ │ │ -
1610 {
│ │ │ │ -
1611 return block_==other.block_;
│ │ │ │ -
1612 }
│ │ │ │ -
1613
│ │ │ │ -
1614 template<class M>
│ │ │ │ -
1615 template<class C>
│ │ │ │ -
1616 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::target() const
│ │ │ │ -
1617 {
│ │ │ │ -
1618 return block_.index();
│ │ │ │ -
1619 }
│ │ │ │ -
1620
│ │ │ │ -
1621 template<class M>
│ │ │ │ -
1622 template<class C>
│ │ │ │ -
1623 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::source() const
│ │ │ │ -
1624 {
│ │ │ │ -
1625 return source_;
│ │ │ │ -
1626 }
│ │ │ │ -
1627
│ │ │ │ -
1628 template<class M>
│ │ │ │ -
1629 template<class C>
│ │ │ │ -
1630 inline const typename MatrixGraph<M>::EdgeDescriptor& MatrixGraph<M>::EdgeIteratorT<C>::operator*() const
│ │ │ │ -
1631 {
│ │ │ │ -
1632 return edge_;
│ │ │ │ -
1633 }
│ │ │ │ -
1634
│ │ │ │ -
1635 template<class M>
│ │ │ │ -
1636 template<class C>
│ │ │ │ -
1637 inline const typename MatrixGraph<M>::EdgeDescriptor* MatrixGraph<M>::EdgeIteratorT<C>::operator->() const
│ │ │ │ -
1638 {
│ │ │ │ -
1639 return &edge_;
│ │ │ │ -
1640 }
│ │ │ │ -
1641
│ │ │ │ -
1642 template<class M>
│ │ │ │ -
1643 template<class C>
│ │ │ │ -
1644 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(C* graph,
│ │ │ │ -
1645 const VertexDescriptor& current)
│ │ │ │ -
1646 : graph_(graph), current_(current)
│ │ │ │ -
1647 {}
│ │ │ │ -
1648
│ │ │ │ -
1649
│ │ │ │ -
1650 template<class M>
│ │ │ │ -
1651 template<class C>
│ │ │ │ -
1652 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexDescriptor& current)
│ │ │ │ -
1653 : current_(current)
│ │ │ │ -
1654 {}
│ │ │ │ -
1655
│ │ │ │ -
1656 template<class M>
│ │ │ │ -
1657 template<class C>
│ │ │ │ -
1658 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexIteratorT<MutableContainer>& other)
│ │ │ │ -
1659 : graph_(other.graph_), current_(other.current_)
│ │ │ │ -
1660 {}
│ │ │ │ -
1661
│ │ │ │ -
1662 template<class M>
│ │ │ │ -
1663 template<class C>
│ │ │ │ -
1664 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<MutableContainer>& other) const
│ │ │ │ -
1665 {
│ │ │ │ -
1666 return current_ != other.current_;
│ │ │ │ -
1667 }
│ │ │ │ -
1668
│ │ │ │ -
1669 template<class M>
│ │ │ │ -
1670 template<class C>
│ │ │ │ -
1671 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<ConstContainer>& other) const
│ │ │ │ -
1672 {
│ │ │ │ -
1673 return current_ != other.current_;
│ │ │ │ -
1674 }
│ │ │ │ -
1675
│ │ │ │ -
1676
│ │ │ │ -
1677 template<class M>
│ │ │ │ -
1678 template<class C>
│ │ │ │ -
1679 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<MutableContainer>& other) const
│ │ │ │ -
1680 {
│ │ │ │ -
1681 return current_ == other.current_;
│ │ │ │ -
1682 }
│ │ │ │ -
1683
│ │ │ │ -
1684 template<class M>
│ │ │ │ -
1685 template<class C>
│ │ │ │ -
1686 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<ConstContainer>& other) const
│ │ │ │ -
1687 {
│ │ │ │ -
1688 return current_ == other.current_;
│ │ │ │ -
1689 }
│ │ │ │ -
1690
│ │ │ │ -
1691 template<class M>
│ │ │ │ -
1692 template<class C>
│ │ │ │ -
1693 inline typename MatrixGraph<M>::template VertexIteratorT<C>& MatrixGraph<M>::VertexIteratorT<C>::operator++()
│ │ │ │ -
1694 {
│ │ │ │ -
1695 ++current_;
│ │ │ │ -
1696 return *this;
│ │ │ │ -
1697 }
│ │ │ │ -
1698
│ │ │ │ -
1699 template<class M>
│ │ │ │ -
1700 template<class C>
│ │ │ │ -
1701 inline typename MatrixGraph<M>::template VertexIteratorT<C>::WeightType&
│ │ │ │ -
1702 MatrixGraph<M>::VertexIteratorT<C>::weight() const
│ │ │ │ -
1703 {
│ │ │ │ -
1704 return graph_->matrix()[current_][current_];
│ │ │ │ -
1705 }
│ │ │ │ -
1706
│ │ │ │ -
1707 template<class M>
│ │ │ │ -
1708 template<class C>
│ │ │ │ -
1709 inline const typename MatrixGraph<M>::VertexDescriptor&
│ │ │ │ -
1710 MatrixGraph<M>::VertexIteratorT<C>::operator*() const
│ │ │ │ -
1711 {
│ │ │ │ -
1712 return current_;
│ │ │ │ -
1713 }
│ │ │ │ -
1714
│ │ │ │ -
1715 template<class M>
│ │ │ │ -
1716 template<class C>
│ │ │ │ -
1717 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
│ │ │ │ -
1718 MatrixGraph<M>::VertexIteratorT<C>::begin() const
│ │ │ │ -
1719 {
│ │ │ │ -
1720 return graph_->beginEdges(current_);
│ │ │ │ -
1721 }
│ │ │ │ -
1722
│ │ │ │ -
1723 template<class M>
│ │ │ │ -
1724 template<class C>
│ │ │ │ -
1725 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
│ │ │ │ -
1726 MatrixGraph<M>::VertexIteratorT<C>::end() const
│ │ │ │ -
1727 {
│ │ │ │ -
1728 return graph_->endEdges(current_);
│ │ │ │ -
1729 }
│ │ │ │ -
1730
│ │ │ │ -
1731 template<class M>
│ │ │ │ -
1732 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
│ │ │ │ -
1733 MatrixGraph<M>::begin()
│ │ │ │ -
1734 {
│ │ │ │ -
1735 return VertexIterator(this,0);
│ │ │ │ -
1736 }
│ │ │ │ -
1737
│ │ │ │ -
1738 template<class M>
│ │ │ │ -
1739 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
│ │ │ │ -
1740 MatrixGraph<M>::end()
│ │ │ │ -
1741 {
│ │ │ │ -
1742 return VertexIterator(matrix_.N());
│ │ │ │ -
1743 }
│ │ │ │ -
1744
│ │ │ │ -
1745
│ │ │ │ -
1746 template<class M>
│ │ │ │ -
1747 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
│ │ │ │ -
1748 MatrixGraph<M>::begin() const
│ │ │ │ -
1749 {
│ │ │ │ -
1750 return ConstVertexIterator(this, 0);
│ │ │ │ -
1751 }
│ │ │ │ -
1752
│ │ │ │ -
1753 template<class M>
│ │ │ │ -
1754 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
│ │ │ │ -
1755 MatrixGraph<M>::end() const
│ │ │ │ -
1756 {
│ │ │ │ -
1757 return ConstVertexIterator(matrix_.N());
│ │ │ │ -
1758 }
│ │ │ │ -
1759
│ │ │ │ -
1760 template<class M>
│ │ │ │ -
1761 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
│ │ │ │ -
1762 MatrixGraph<M>::beginEdges(const VertexDescriptor& source)
│ │ │ │ -
1763 {
│ │ │ │ -
1764 return EdgeIterator(source, matrix_.operator[](source).begin(),
│ │ │ │ -
1765 matrix_.operator[](source).end(), start_[source]);
│ │ │ │ -
1766 }
│ │ │ │ -
1767
│ │ │ │ -
1768 template<class M>
│ │ │ │ -
1769 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
│ │ │ │ -
1770 MatrixGraph<M>::endEdges(const VertexDescriptor& source)
│ │ │ │ -
1771 {
│ │ │ │ -
1772 return EdgeIterator(matrix_.operator[](source).end());
│ │ │ │ -
1773 }
│ │ │ │ -
1774
│ │ │ │ -
1775
│ │ │ │ -
1776 template<class M>
│ │ │ │ -
1777 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
│ │ │ │ -
1778 MatrixGraph<M>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ -
1779 {
│ │ │ │ -
1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(),
│ │ │ │ -
1781 matrix_.operator[](source).end(), start_[source]);
│ │ │ │ -
1782 }
│ │ │ │ -
1783
│ │ │ │ -
1784 template<class M>
│ │ │ │ -
1785 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
│ │ │ │ -
1786 MatrixGraph<M>::endEdges(const VertexDescriptor& source) const
│ │ │ │ -
1787 {
│ │ │ │ -
1788 return ConstEdgeIterator(matrix_.operator[](source).end());
│ │ │ │ -
1789 }
│ │ │ │ -
1790
│ │ │ │ -
1791
│ │ │ │ -
1792 template<class G, class T>
│ │ │ │ -
1793 SubGraph<G,T>::EdgeIterator::EdgeIterator(const VertexDescriptor& source,
│ │ │ │ -
1794 const EdgeDescriptor& edge)
│ │ │ │ -
1795 : source_(source), edge_(edge)
│ │ │ │ -
1796 {}
│ │ │ │ -
1797
│ │ │ │ -
1798
│ │ │ │ -
1799 template<class G, class T>
│ │ │ │ -
1800 SubGraph<G,T>::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge)
│ │ │ │ -
1801 : edge_(edge)
│ │ │ │ -
1802 {}
│ │ │ │ -
1803
│ │ │ │ -
1804 template<class G, class T>
│ │ │ │ -
1805 typename SubGraph<G,T>::EdgeIndexMap SubGraph<G,T>::getEdgeIndexMap()
│ │ │ │ -
1806 {
│ │ │ │ -
1807 return EdgeIndexMap(edges_);
│ │ │ │ -
1808 }
│ │ │ │ -
1809
│ │ │ │ -
1810 template<class G, class T>
│ │ │ │ -
1811 inline bool SubGraph<G,T>::EdgeIterator::equals(const EdgeIterator & other) const
│ │ │ │ -
1812 {
│ │ │ │ -
1813 return other.edge_==edge_;
│ │ │ │ -
1814 }
│ │ │ │ -
1815
│ │ │ │ -
1816 template<class G, class T>
│ │ │ │ -
1817 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::increment()
│ │ │ │ -
1818 {
│ │ │ │ -
1819 ++edge_;
│ │ │ │ -
1820 return *this;
│ │ │ │ -
1821 }
│ │ │ │ -
1822
│ │ │ │ -
1823 template<class G, class T>
│ │ │ │ -
1824 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::decrement()
│ │ │ │ -
1825 {
│ │ │ │ -
1826 --edge_;
│ │ │ │ -
1827 return *this;
│ │ │ │ -
1828 }
│ │ │ │ -
1829
│ │ │ │ -
1830 template<class G, class T>
│ │ │ │ -
1831 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::advance(std::ptrdiff_t n)
│ │ │ │ -
1832 {
│ │ │ │ -
1833 edge_+=n;
│ │ │ │ -
1834 return *this;
│ │ │ │ -
1835 }
│ │ │ │ -
1836 template<class G, class T>
│ │ │ │ -
1837 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::source() const
│ │ │ │ -
1838 {
│ │ │ │ -
1839 return source_;
│ │ │ │ -
1840 }
│ │ │ │ -
1841
│ │ │ │ -
1842 template<class G, class T>
│ │ │ │ -
1843 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::target() const
│ │ │ │ -
1844 {
│ │ │ │ -
1845 return *edge_;
│ │ │ │ -
1846 }
│ │ │ │ -
1847
│ │ │ │ -
1848
│ │ │ │ -
1849 template<class G, class T>
│ │ │ │ -
1850 inline const typename SubGraph<G,T>::EdgeDescriptor& SubGraph<G,T>::EdgeIterator::dereference() const
│ │ │ │ -
1851 {
│ │ │ │ -
1852 return edge_;
│ │ │ │ -
1853 }
│ │ │ │ -
1854
│ │ │ │ -
1855 template<class G, class T>
│ │ │ │ -
1856 inline std::ptrdiff_t SubGraph<G,T>::EdgeIterator::distanceTo(const EdgeIterator & other) const
│ │ │ │ -
1857 {
│ │ │ │ -
1858 return other.edge_-edge_;
│ │ │ │ -
1859 }
│ │ │ │ -
1860
│ │ │ │ -
1861 template<class G, class T>
│ │ │ │ -
1862 SubGraph<G,T>::VertexIterator::VertexIterator(const SubGraph<G,T>* graph,
│ │ │ │ -
1863 const VertexDescriptor& current,
│ │ │ │ -
1864 const VertexDescriptor& end)
│ │ │ │ -
1865 : graph_(graph), current_(current), end_(end)
│ │ │ │ -
1866 {
│ │ │ │ -
1867 // Skip excluded vertices
│ │ │ │ -
1868 typedef typename T::const_iterator Iterator;
│ │ │ │ -
1869
│ │ │ │ -
1870 for(Iterator vertex = graph_->excluded_.begin();
│ │ │ │ -
1871 current_ != end_ && *vertex;
│ │ │ │ -
1872 ++vertex)
│ │ │ │ -
1873 ++current_;
│ │ │ │ -
1874 assert(current_ == end_ || !graph_->excluded_[current_]);
│ │ │ │ -
1875 }
│ │ │ │ -
1876
│ │ │ │ -
1877 template<class G, class T>
│ │ │ │ -
1878 SubGraph<G,T>::VertexIterator::VertexIterator(const VertexDescriptor& current)
│ │ │ │ -
1879 : current_(current)
│ │ │ │ -
1880 {}
│ │ │ │ -
1881
│ │ │ │ -
1882 template<class G, class T>
│ │ │ │ -
1883 inline typename SubGraph<G,T>::VertexIterator& SubGraph<G,T>::VertexIterator::increment()
│ │ │ │ -
1884 {
│ │ │ │ -
1885 ++current_;
│ │ │ │ -
1886 //Skip excluded vertices
│ │ │ │ -
1887 while(current_ != end_ && graph_->excluded_[current_])
│ │ │ │ -
1888 ++current_;
│ │ │ │ -
1889
│ │ │ │ -
1890 assert(current_ == end_ || !graph_->excluded_[current_]);
│ │ │ │ -
1891 return *this;
│ │ │ │ -
1892 }
│ │ │ │ -
1893
│ │ │ │ -
1894 template<class G, class T>
│ │ │ │ -
1895 inline bool SubGraph<G,T>::VertexIterator::equals(const VertexIterator & other) const
│ │ │ │ -
1896 {
│ │ │ │ -
1897 return current_==other.current_;
│ │ │ │ -
1898 }
│ │ │ │ -
1899
│ │ │ │ -
1900 template<class G, class T>
│ │ │ │ -
1901 inline const typename G::VertexDescriptor& SubGraph<G,T>::VertexIterator::dereference() const
│ │ │ │ -
1902 {
│ │ │ │ -
1903 return current_;
│ │ │ │ -
1904 }
│ │ │ │ -
1905
│ │ │ │ -
1906 template<class G, class T>
│ │ │ │ -
1907 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::begin() const
│ │ │ │ -
1908 {
│ │ │ │ -
1909 return graph_->beginEdges(current_);
│ │ │ │ -
1910 }
│ │ │ │ -
1911
│ │ │ │ -
1912 template<class G, class T>
│ │ │ │ -
1913 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::end() const
│ │ │ │ -
1914 {
│ │ │ │ -
1915 return graph_->endEdges(current_);
│ │ │ │ -
1916 }
│ │ │ │ -
1917
│ │ │ │ -
1918 template<class G, class T>
│ │ │ │ -
1919 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::begin() const
│ │ │ │ -
1920 {
│ │ │ │ -
1921 return VertexIterator(this, 0, endVertex_);
│ │ │ │ -
1922 }
│ │ │ │ -
1923
│ │ │ │ -
1924
│ │ │ │ -
1925 template<class G, class T>
│ │ │ │ -
1926 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::end() const
│ │ │ │ -
1927 {
│ │ │ │ -
1928 return VertexIterator(endVertex_);
│ │ │ │ -
1929 }
│ │ │ │ -
1930
│ │ │ │ -
1931
│ │ │ │ -
1932 template<class G, class T>
│ │ │ │ -
1933 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ -
1934 {
│ │ │ │ -
1935 return EdgeIterator(source, edges_+start_[source]);
│ │ │ │ -
1936 }
│ │ │ │ -
1937
│ │ │ │ -
1938 template<class G, class T>
│ │ │ │ -
1939 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::endEdges(const VertexDescriptor& source) const
│ │ │ │ -
1940 {
│ │ │ │ -
1941 return EdgeIterator(edges_+end_[source]);
│ │ │ │ -
1942 }
│ │ │ │ -
1943
│ │ │ │ -
1944 template<class G, class T>
│ │ │ │ -
1945 std::size_t SubGraph<G,T>::noVertices() const
│ │ │ │ -
1946 {
│ │ │ │ -
1947 return noVertices_;
│ │ │ │ -
1948 }
│ │ │ │ -
1949
│ │ │ │ -
1950 template<class G, class T>
│ │ │ │ -
1951 inline typename SubGraph<G,T>::VertexDescriptor SubGraph<G,T>::maxVertex() const
│ │ │ │ -
1952 {
│ │ │ │ -
1953 return maxVertex_;
│ │ │ │ -
1954 }
│ │ │ │ -
1955
│ │ │ │ -
1956 template<class G, class T>
│ │ │ │ -
1957 inline std::size_t SubGraph<G,T>::noEdges() const
│ │ │ │ -
1958 {
│ │ │ │ -
1959 return noEdges_;
│ │ │ │ -
1960 }
│ │ │ │ -
1961
│ │ │ │ -
1962 template<class G, class T>
│ │ │ │ -
1963 inline typename SubGraph<G,T>::EdgeDescriptor SubGraph<G,T>::findEdge(const VertexDescriptor& source,
│ │ │ │ -
1964 const VertexDescriptor& target) const
│ │ │ │ -
1965 {
│ │ │ │ -
1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source], edges_+end_[source], target);
│ │ │ │ -
1967 if(edge==edges_+end_[source] || *edge!=target)
│ │ │ │ -
1968 return std::numeric_limits<EdgeDescriptor>::max();
│ │ │ │ -
1969
│ │ │ │ -
1970 return edge;
│ │ │ │ -
1971 }
│ │ │ │ -
1972
│ │ │ │ -
1973 template<class G, class T>
│ │ │ │ -
1974 SubGraph<G,T>::~SubGraph()
│ │ │ │ -
1975 {
│ │ │ │ -
1976 delete[] edges_;
│ │ │ │ -
1977 delete[] end_;
│ │ │ │ -
1978 delete[] start_;
│ │ │ │ -
1979 }
│ │ │ │ -
1980
│ │ │ │ -
1981 template<class G, class T>
│ │ │ │ -
1982 SubGraph<G,T>::SubGraph(const G& graph, const T& excluded)
│ │ │ │ -
1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_(graph.maxVertex())
│ │ │ │ -
1984 {
│ │ │ │ -
1985 start_ = new std::ptrdiff_t[graph.noVertices()];
│ │ │ │ -
1986 end_ = new std::ptrdiff_t[graph.noVertices()];
│ │ │ │ -
1987 edges_ = new VertexDescriptor[graph.noEdges()];
│ │ │ │ -
1988
│ │ │ │ -
1989 VertexDescriptor* edge=edges_;
│ │ │ │ -
1990
│ │ │ │ -
1991 // Cater for the case that there are no vertices.
│ │ │ │ -
1992 // Otherwise endVertex_ will get 1 below.
│ │ │ │ -
1993 if ( graph.noVertices() == 0)
│ │ │ │ -
1994 return;
│ │ │ │ -
1995
│ │ │ │ -
1996 typedef typename Graph::ConstVertexIterator Iterator;
│ │ │ │ -
1997 Iterator endVertex=graph.end();
│ │ │ │ -
1998
│ │ │ │ -
1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex)
│ │ │ │ -
2000 if(excluded_[*vertex])
│ │ │ │ -
2001 start_[*vertex]=end_[*vertex]=-1;
│ │ │ │ -
2002 else{
│ │ │ │ -
2003 ++noVertices_;
│ │ │ │ -
2004 endVertex_ = std::max(*vertex, endVertex_);
│ │ │ │ -
2005
│ │ │ │ -
2006 start_[*vertex] = edge-edges_;
│ │ │ │ -
2007
│ │ │ │ -
2008 auto endEdge = vertex.end();
│ │ │ │ -
2009
│ │ │ │ -
2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter)
│ │ │ │ -
2011 if(!excluded[iter.target()]) {
│ │ │ │ -
2012 *edge = iter.target();
│ │ │ │ -
2013 ++edge;
│ │ │ │ -
2014 }
│ │ │ │ -
2015
│ │ │ │ -
2016 end_[*vertex] = edge - edges_;
│ │ │ │ -
2017
│ │ │ │ -
2018 // Sort the edges
│ │ │ │ -
2019 std::sort(edges_+start_[*vertex], edge);
│ │ │ │ -
2020 }
│ │ │ │ -
2021 noEdges_ = edge-edges_;
│ │ │ │ -
2022 ++endVertex_;
│ │ │ │ -
2023 }
│ │ │ │ -
2024
│ │ │ │ -
2025 template<class G, class V, class VM>
│ │ │ │ -
2026 inline std::size_t VertexPropertiesGraph<G,V,VM>::noEdges() const
│ │ │ │ -
2027 {
│ │ │ │ -
2028 return graph_.noEdges();
│ │ │ │ -
2029 }
│ │ │ │ -
2030
│ │ │ │ -
2031 template<class G, class V, class VM>
│ │ │ │ -
2032 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
│ │ │ │ -
2033 VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source)
│ │ │ │ -
2034 {
│ │ │ │ -
2035 return graph_.beginEdges(source);
│ │ │ │ -
2036 }
│ │ │ │ -
2037
│ │ │ │ -
2038 template<class G, class V, class VM>
│ │ │ │ -
2039 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
│ │ │ │ -
2040 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source)
│ │ │ │ -
2041 {
│ │ │ │ -
2042 return graph_.endEdges(source);
│ │ │ │ -
2043 }
│ │ │ │ -
2044
│ │ │ │ -
2045 template<class G, class V, class VM>
│ │ │ │ -
2046 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
│ │ │ │ -
2047 inline VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ -
2048 {
│ │ │ │ -
2049 return graph_.beginEdges(source);
│ │ │ │ -
2050 }
│ │ │ │ -
2051
│ │ │ │ -
2052 template<class G, class V, class VM>
│ │ │ │ -
2053 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
│ │ │ │ -
2054 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source) const
│ │ │ │ -
2055 {
│ │ │ │ -
2056 return graph_.endEdges(source);
│ │ │ │ -
2057 }
│ │ │ │ -
2058
│ │ │ │ -
2059 template<class G, class V, class VM>
│ │ │ │ -
2060 template<class C>
│ │ │ │ -
2061 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
│ │ │ │ -
2062 ::VertexIteratorT(const Father& iter,
│ │ │ │ -
2063 C* graph)
│ │ │ │ -
2064 : Father(iter), graph_(graph)
│ │ │ │ -
2065 {}
│ │ │ │ -
2066
│ │ │ │ -
2067 template<class G, class V, class VM>
│ │ │ │ -
2068 template<class C>
│ │ │ │ -
2069 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
│ │ │ │ -
2070 ::VertexIteratorT(const Father& iter)
│ │ │ │ -
2071 : Father(iter)
│ │ │ │ -
2072 {}
│ │ │ │ -
2073
│ │ │ │ -
2074 template<class G, class V, class VM>
│ │ │ │ -
2075 template<class C>
│ │ │ │ -
2076 template<class C1>
│ │ │ │ -
2077 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
│ │ │ │ -
2078 ::VertexIteratorT(const VertexIteratorT<C1>& other)
│ │ │ │ -
2079 : Father(other), graph_(other.graph_)
│ │ │ │ -
2080 {}
│ │ │ │ -
2081
│ │ │ │ -
2082 template<class G, class V, class VM>
│ │ │ │ -
2083 template<class C>
│ │ │ │ -
2084 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ -
2085 V&, const V&>::type
│ │ │ │ -
2086 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::properties() const
│ │ │ │ -
2087 {
│ │ │ │ -
2088 return graph_->getVertexProperties(Father::operator*());
│ │ │ │ -
2089 }
│ │ │ │ -
2090
│ │ │ │ -
2091 template<class G, class V, class VM>
│ │ │ │ -
2092 template<class C>
│ │ │ │ -
2093 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
2094 C>::value,
│ │ │ │ -
2095 typename G::EdgeIterator,
│ │ │ │ -
2096 typename G::ConstEdgeIterator>::type
│ │ │ │ -
2097 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::begin() const
│ │ │ │ -
2098 {
│ │ │ │ -
2099 return graph_->beginEdges(Father::operator*());
│ │ │ │ -
2100 }
│ │ │ │ -
2101
│ │ │ │ -
2102 template<class G, class V, class VM>
│ │ │ │ -
2103 template<class C>
│ │ │ │ -
2104 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
│ │ │ │ -
2105 C>::value,
│ │ │ │ -
2106 typename G::EdgeIterator,
│ │ │ │ -
2107 typename G::ConstEdgeIterator>::type
│ │ │ │ -
2108 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::end() const
│ │ │ │ -
2109 {
│ │ │ │ -
2110 return graph_->endEdges(Father::operator*());
│ │ │ │ -
2111 }
│ │ │ │ -
2112
│ │ │ │ -
2113 template<class G, class V, class VM>
│ │ │ │ -
2114 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::begin()
│ │ │ │ -
2115 {
│ │ │ │ -
2116 return VertexIterator(graph_.begin(), this);
│ │ │ │ -
2117 }
│ │ │ │ -
2118
│ │ │ │ -
2119 template<class G, class V, class VM>
│ │ │ │ -
2120 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::end()
│ │ │ │ -
2121 {
│ │ │ │ -
2122 return VertexIterator(graph_.end());
│ │ │ │ -
2123 }
│ │ │ │ -
2124
│ │ │ │ -
2125
│ │ │ │ -
2126 template<class G, class V, class VM>
│ │ │ │ -
2127 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::begin() const
│ │ │ │ -
2128 {
│ │ │ │ -
2129 return ConstVertexIterator(graph_.begin(), this);
│ │ │ │ -
2130 }
│ │ │ │ -
2131
│ │ │ │ -
2132 template<class G, class V, class VM>
│ │ │ │ -
2133 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::end() const
│ │ │ │ -
2134 {
│ │ │ │ -
2135 return ConstVertexIterator(graph_.end());
│ │ │ │ -
2136 }
│ │ │ │ -
2137
│ │ │ │ -
2138 template<class G, class V, class VM>
│ │ │ │ -
2139 inline V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex)
│ │ │ │ -
2140 {
│ │ │ │ -
2141 return vertexProperties_[vmap_[vertex]];
│ │ │ │ -
2142 }
│ │ │ │ -
2143
│ │ │ │ -
2144 template<class G, class V, class VM>
│ │ │ │ -
2145 inline const V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex) const
│ │ │ │ -
2146 {
│ │ │ │ -
2147 return vertexProperties_[vmap_[vertex]];
│ │ │ │ -
2148 }
│ │ │ │ -
2149
│ │ │ │ -
2150 template<class G, class V, class VM>
│ │ │ │ -
2151 inline const G& VertexPropertiesGraph<G,V,VM>::graph() const
│ │ │ │ -
2152 {
│ │ │ │ -
2153 return graph_;
│ │ │ │ -
2154 }
│ │ │ │ -
2155
│ │ │ │ -
2156 template<class G, class V, class VM>
│ │ │ │ -
2157 inline std::size_t VertexPropertiesGraph<G,V,VM>::noVertices() const
│ │ │ │ -
2158 {
│ │ │ │ -
2159 return graph_.noVertices();
│ │ │ │ -
2160 }
│ │ │ │ -
2161
│ │ │ │ -
2162
│ │ │ │ -
2163 template<class G, class V, class VM>
│ │ │ │ -
2164 inline typename VertexPropertiesGraph<G,V,VM>::VertexDescriptor VertexPropertiesGraph<G,V,VM>::maxVertex() const
│ │ │ │ -
2165 {
│ │ │ │ -
2166 return graph_.maxVertex();
│ │ │ │ -
2167 }
│ │ │ │ -
2168
│ │ │ │ -
2169 template<class G, class V, class VM>
│ │ │ │ -
2170 VertexPropertiesGraph<G,V,VM>::VertexPropertiesGraph(Graph& graph, const VM vmap)
│ │ │ │ -
2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V())
│ │ │ │ -
2172 {}
│ │ │ │ -
2173
│ │ │ │ -
2174 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2175 template<class C>
│ │ │ │ -
2176 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter,
│ │ │ │ -
2177 C* graph)
│ │ │ │ -
2178 : Father(iter), graph_(graph)
│ │ │ │ -
2179 {}
│ │ │ │ -
2180
│ │ │ │ -
2181 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2182 template<class C>
│ │ │ │ -
2183 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter)
│ │ │ │ -
2184 : Father(iter)
│ │ │ │ -
2185 {}
│ │ │ │ -
2186
│ │ │ │ -
2187 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2188 template<class C>
│ │ │ │ -
2189 template<class C1>
│ │ │ │ -
2190 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
│ │ │ │ -
2191 : Father(other), graph_(other.graph_)
│ │ │ │ -
2192 {}
│ │ │ │ -
2193
│ │ │ │ -
2194
│ │ │ │ -
2195 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2196 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noEdges() const
│ │ │ │ -
2197 {
│ │ │ │ -
2198 return graph_.noEdges();
│ │ │ │ -
2199 }
│ │ │ │ -
2200
│ │ │ │ -
2201 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2202 template<class C>
│ │ │ │ -
2203 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,E&,const E&>::type
│ │ │ │ -
2204 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::properties() const
│ │ │ │ -
2205 {
│ │ │ │ -
2206 return graph_->getEdgeProperties(Father::operator*());
│ │ │ │ -
2207 }
│ │ │ │ -
2208
│ │ │ │ -
2209 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2210 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
│ │ │ │ -
2211 PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source)
│ │ │ │ -
2212 {
│ │ │ │ -
2213 return EdgeIterator(graph_.beginEdges(source), this);
│ │ │ │ -
2214 }
│ │ │ │ -
2215
│ │ │ │ -
2216 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2217 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
│ │ │ │ -
2218 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source)
│ │ │ │ -
2219 {
│ │ │ │ -
2220 return EdgeIterator(graph_.endEdges(source));
│ │ │ │ -
2221 }
│ │ │ │ -
2222
│ │ │ │ -
2223 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2224 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
│ │ │ │ -
2225 inline PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source) const
│ │ │ │ -
2226 {
│ │ │ │ -
2227 return ConstEdgeIterator(graph_.beginEdges(source), this);
│ │ │ │ -
2228 }
│ │ │ │ -
2229
│ │ │ │ -
2230 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2231 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
│ │ │ │ -
2232 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source) const
│ │ │ │ -
2233 {
│ │ │ │ -
2234 return ConstEdgeIterator(graph_.endEdges(source));
│ │ │ │ -
2235 }
│ │ │ │ -
2236
│ │ │ │ -
2237 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2238 template<class C>
│ │ │ │ -
2239 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
│ │ │ │ -
2240 ::VertexIteratorT(const Father& iter,
│ │ │ │ -
2241 C* graph)
│ │ │ │ -
2242 : Father(iter), graph_(graph)
│ │ │ │ -
2243 {}
│ │ │ │ -
2244
│ │ │ │ -
2245 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2246 template<class C>
│ │ │ │ -
2247 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
│ │ │ │ -
2248 ::VertexIteratorT(const Father& iter)
│ │ │ │ -
2249 : Father(iter)
│ │ │ │ -
2250 {}
│ │ │ │ -
2251
│ │ │ │ -
2252 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2253 template<class C>
│ │ │ │ -
2254 template<class C1>
│ │ │ │ -
2255 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
│ │ │ │ -
2256 ::VertexIteratorT(const VertexIteratorT<C1>& other)
│ │ │ │ -
2257 : Father(other), graph_(other.graph_)
│ │ │ │ -
2258 {}
│ │ │ │ -
2259
│ │ │ │ -
2260 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2261 template<class C>
│ │ │ │ -
2262 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
│ │ │ │ -
2263 V&, const V&>::type
│ │ │ │ -
2264 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::properties() const
│ │ │ │ -
2265 {
│ │ │ │ -
2266 return graph_->getVertexProperties(Father::operator*());
│ │ │ │ -
2267 }
│ │ │ │ -
2268
│ │ │ │ -
2269 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2270 template<class C>
│ │ │ │ -
2271 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
│ │ │ │ -
2272 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::begin() const
│ │ │ │ -
2273 {
│ │ │ │ -
2274 return graph_->beginEdges(Father::operator*());
│ │ │ │ -
2275 }
│ │ │ │ -
2276
│ │ │ │ -
2277 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2278 template<class C>
│ │ │ │ -
2279 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
│ │ │ │ -
2280 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::end() const
│ │ │ │ -
2281 {
│ │ │ │ -
2282 return graph_->endEdges(Father::operator*());
│ │ │ │ -
2283 }
│ │ │ │ -
2284
│ │ │ │ -
2285 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2286 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::begin()
│ │ │ │ -
2287 {
│ │ │ │ -
2288 return VertexIterator(graph_.begin(), this);
│ │ │ │ -
2289 }
│ │ │ │ -
2290
│ │ │ │ -
2291 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2292 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::end()
│ │ │ │ -
2293 {
│ │ │ │ -
2294 return VertexIterator(graph_.end());
│ │ │ │ -
2295 }
│ │ │ │ -
2296
│ │ │ │ -
2297
│ │ │ │ -
2298 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2299 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::begin() const
│ │ │ │ -
2300 {
│ │ │ │ -
2301 return ConstVertexIterator(graph_.begin(), this);
│ │ │ │ -
2302 }
│ │ │ │ -
2303
│ │ │ │ -
2304 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2305 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::end() const
│ │ │ │ -
2306 {
│ │ │ │ -
2307 return ConstVertexIterator(graph_.end());
│ │ │ │ -
2308 }
│ │ │ │ -
2309
│ │ │ │ -
2310 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2311 inline V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex)
│ │ │ │ -
2312 {
│ │ │ │ -
2313 return vertexProperties_[vmap_[vertex]];
│ │ │ │ -
2314 }
│ │ │ │ -
2315
│ │ │ │ -
2316 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2317 inline const V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex) const
│ │ │ │ -
2318 {
│ │ │ │ -
2319 return vertexProperties_[vmap_[vertex]];
│ │ │ │ -
2320 }
│ │ │ │ -
2321
│ │ │ │ -
2322 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2323 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge)
│ │ │ │ -
2324 {
│ │ │ │ -
2325 return edgeProperties_[emap_[edge]];
│ │ │ │ -
2326 }
│ │ │ │ -
2327
│ │ │ │ -
2328 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2329 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge) const
│ │ │ │ -
2330 {
│ │ │ │ -
2331 return edgeProperties_[emap_[edge]];
│ │ │ │ -
2332 }
│ │ │ │ -
2333
│ │ │ │ -
2334 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2335 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
│ │ │ │ -
2336 const VertexDescriptor& target)
│ │ │ │ -
2337 {
│ │ │ │ -
2338 return getEdgeProperties(graph_.findEdge(source,target));
│ │ │ │ -
2339 }
│ │ │ │ -
2340
│ │ │ │ -
2341 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2342 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
│ │ │ │ -
2343 const VertexDescriptor& target) const
│ │ │ │ -
2344 {
│ │ │ │ -
2345 return getEdgeProperties(graph_.findEdge(source,target));
│ │ │ │ -
2346 }
│ │ │ │ -
2347
│ │ │ │ -
2348 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2349 inline const G& PropertiesGraph<G,V,E,VM,EM>::graph() const
│ │ │ │ -
2350 {
│ │ │ │ -
2351 return graph_;
│ │ │ │ -
2352 }
│ │ │ │ -
2353
│ │ │ │ -
2354 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2355 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noVertices() const
│ │ │ │ -
2356 {
│ │ │ │ -
2357 return graph_.noVertices();
│ │ │ │ -
2358 }
│ │ │ │ -
2359
│ │ │ │ -
2360
│ │ │ │ -
2361 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2362 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexDescriptor PropertiesGraph<G,V,E,VM,EM>::maxVertex() const
│ │ │ │ -
2363 {
│ │ │ │ -
2364 return graph_.maxVertex();
│ │ │ │ -
2365 }
│ │ │ │ -
2366
│ │ │ │ -
2367 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
2368 PropertiesGraph<G,V,E,VM,EM>::PropertiesGraph(Graph& graph, const VM& vmap, const EM& emap)
│ │ │ │ -
2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V()),
│ │ │ │ -
2370 emap_(emap), edgeProperties_(graph_.noEdges(), E())
│ │ │ │ -
2371 {}
│ │ │ │ -
2372
│ │ │ │ -
2373 template<class G, class V>
│ │ │ │ -
2374 inline int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
│ │ │ │ -
2375 V& visitor)
│ │ │ │ -
2376 {
│ │ │ │ -
2377 typedef typename G::ConstEdgeIterator iterator;
│ │ │ │ -
2378 const iterator end = graph.endEdges(vertex);
│ │ │ │ -
2379 int noNeighbours=0;
│ │ │ │ -
2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge, ++noNeighbours)
│ │ │ │ -
2381 visitor(edge);
│ │ │ │ -
2382 return noNeighbours;
│ │ │ │ -
2383 }
│ │ │ │ -
2384
│ │ │ │ -
2385#endif // DOXYGEN
│ │ │ │ -
2386
│ │ │ │ -
2388 }
│ │ │ │ -
2389}
│ │ │ │ -
2390#endif
│ │ │ │ - │ │ │ │ -
int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
Visit all neighbour vertices of a vertex in a graph.
│ │ │ │ -
STL namespace.
│ │ │ │ +
166 // TODO This could be accomplished with one communication, too!
│ │ │ │ +
167 redist.redistributeBackward(fine, fineRedist);
│ │ │ │ +
168 comm.copyOwnerToAll(fine,fine);
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
171 template<class V, class V1, class T1, class T2>
│ │ │ │ +
172 template<typename T3>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
174 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
175 Vector& coarse, Vector& fine, T3 damp,
│ │ │ │ +
176 [[maybe_unused]] OwnerOverlapCopyCommunication<T1,T2>& comm)
│ │ │ │ +
177 {
│ │ │ │ +
178 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fine, damp);
│ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
180 template<class V, class V1, class T1, class T2>
│ │ │ │ +
│ │ │ │ +
181 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::restrictVector(const AggregatesMap<Vertex>& aggregates,
│ │ │ │ +
182 Vector& coarse, const Vector& fine,
│ │ │ │ + │ │ │ │ +
184 {
│ │ │ │ + │ │ │ │ +
186 // We need this here to avoid it in the smoothers on the coarse level.
│ │ │ │ +
187 // There (in the preconditioner d is const.
│ │ │ │ +
188 comm.project(coarse);
│ │ │ │ +
189 }
│ │ │ │ +
│ │ │ │ +
190#endif
│ │ │ │ +
192 } // namspace Amg
│ │ │ │ +
193} // namspace Dune
│ │ │ │ +
194#endif
│ │ │ │ +
Functionality for redistributing a sparse matrix.
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ + │ │ │ │ +
Provides classes for the Coloring process of AMG.
│ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ -
MatrixGraph(Matrix &matrix)
Constructor.
│ │ │ │ -
VertexIterator end()
Get an iterator over the vertices.
│ │ │ │ -
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ -
M Matrix
The type of the matrix we are a graph for.
Definition graph.hh:56
│ │ │ │ -
ConstVertexIterator begin() const
Get an iterator over the vertices.
│ │ │ │ -
VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator
The constant vertex iterator type.
Definition graph.hh:308
│ │ │ │ -
~MatrixGraph()
Destructor.
│ │ │ │ -
std::ptrdiff_t EdgeDescriptor
The edge descriptor.
Definition graph.hh:80
│ │ │ │ -
ConstEdgeIterator endEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ -
M::size_type VertexDescriptor
The vertex descriptor.
Definition graph.hh:73
│ │ │ │ -
const Matrix & matrix() const
Get the underlying matrix.
│ │ │ │ -
@ mutableMatrix
Definition graph.hh:86
│ │ │ │ -
ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ -
ConstVertexIterator end() const
Get an iterator over the vertices.
│ │ │ │ -
EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
The constant edge iterator type.
Definition graph.hh:298
│ │ │ │ -
EdgeIterator beginEdges(const VertexDescriptor &source)
Get an iterator over the edges starting at a vertex.
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ -
EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
Find the descriptor of an edge.
│ │ │ │ -
M::block_type Weight
The type of the weights.
Definition graph.hh:66
│ │ │ │ -
std::remove_const< M >::type MutableMatrix
The mutable type of the matrix we are a graph for.
Definition graph.hh:61
│ │ │ │ -
EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator
The mutable edge iterator type.
Definition graph.hh:303
│ │ │ │ -
VertexIteratorT< MatrixGraph< Matrix > > VertexIterator
The mutable vertex iterator type.
Definition graph.hh:313
│ │ │ │ -
EdgeIterator endEdges(const VertexDescriptor &source)
Get an iterator over the edges starting at a vertex.
│ │ │ │ -
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ -
Matrix & matrix()
Get the underlying matrix.
│ │ │ │ -
VertexIterator begin()
Get an iterator over the vertices.
│ │ │ │ -
Iterator over all edges starting from a vertex.
Definition graph.hh:95
│ │ │ │ -
std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::type WeightType
Definition graph.hh:156
│ │ │ │ -
EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const ColIterator &end, const EdgeDescriptor &edge)
Constructor.
│ │ │ │ -
@ isMutable
whether C is mutable.
Definition graph.hh:112
│ │ │ │ -
VertexDescriptor target() const
The index of the target vertex of the current edge.
│ │ │ │ -
EdgeIteratorT< C > & operator++()
preincrement operator.
│ │ │ │ -
bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
Inequality operator.
│ │ │ │ -
bool operator==(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
Equality operator.
│ │ │ │ -
EdgeIteratorT(const EdgeIteratorT< C1 > &other)
Copy Constructor.
│ │ │ │ -
bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
Inequality operator.
│ │ │ │ -
WeightType & weight() const
Access the edge weight.
│ │ │ │ -
VertexDescriptor source() const
The index of the source vertex of the current edge.
│ │ │ │ -
std::conditional< isMutable &&C::mutableMatrix, typenameMatrix::row_type::Iterator, typenameMatrix::row_type::ConstIterator >::type ColIterator
The column iterator of the matrix we use.
Definition graph.hh:120
│ │ │ │ -
const std::remove_const< C >::type ConstContainer
The constant type of the container type.
Definition graph.hh:105
│ │ │ │ -
bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
Equality operator.
│ │ │ │ -
EdgeIteratorT(const ColIterator &block)
Constructor for the end iterator.
│ │ │ │ -
std::conditional< isMutable &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::type Weight
The matrix block type we use as weights.
Definition graph.hh:127
│ │ │ │ -
const EdgeDescriptor & operator*() const
Get the edge descriptor.
│ │ │ │ -
const EdgeDescriptor * operator->() const
Get the edge descriptor.
│ │ │ │ -
std::remove_const< C >::type MutableContainer
The mutable type of the container type.
Definition graph.hh:101
│ │ │ │ -
The vertex iterator type of the graph.
Definition graph.hh:209
│ │ │ │ -
EdgeIteratorT< C > begin() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ -
const VertexDescriptor & operator*() const
Get the descriptor of the current vertex.
│ │ │ │ -
WeightType & weight() const
Access the weight of the vertex.
│ │ │ │ -
VertexIteratorT(C *graph, const VertexDescriptor &current)
Constructor.
│ │ │ │ -
std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::type WeightType
Definition graph.hh:266
│ │ │ │ -
VertexIteratorT(const VertexIteratorT< MutableContainer > &other)
│ │ │ │ -
std::remove_const< C >::type MutableContainer
The mutable type of the container type.
Definition graph.hh:214
│ │ │ │ -
bool operator!=(const VertexIteratorT< MutableContainer > &other) const
Inequality operator.
│ │ │ │ -
@ isMutable
whether C is mutable.
Definition graph.hh:225
│ │ │ │ -
bool operator==(const VertexIteratorT< MutableContainer > &other) const
Equality operator.
│ │ │ │ -
const std::remove_const< C >::type ConstContainer
The constant type of the container type.
Definition graph.hh:218
│ │ │ │ -
VertexIteratorT< C > & operator++()
Move to the next vertex.
│ │ │ │ -
EdgeIteratorT< C > end() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ -
bool operator==(const VertexIteratorT< ConstContainer > &other) const
Equality operator.
│ │ │ │ -
bool operator!=(const VertexIteratorT< ConstContainer > &other) const
Inequality operator.
│ │ │ │ -
VertexIteratorT(const VertexDescriptor &current)
Constructor for the end iterator.
│ │ │ │ -
A subgraph of a graph.
Definition graph.hh:443
│ │ │ │ -
EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
Find the descriptor of an edge.
│ │ │ │ -
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ -
EdgeIndexMap getEdgeIndexMap()
Get an edge index map for the graph.
│ │ │ │ -
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ -
ConstEdgeIterator endEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ -
ConstVertexIterator end() const
Get an iterator over the vertices.
│ │ │ │ -
ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
Get an iterator over the edges starting at a vertex.
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ -
T Excluded
Random access container providing information about which vertices are excluded.
Definition graph.hh:454
│ │ │ │ -
~SubGraph()
Destructor.
│ │ │ │ -
EdgeIterator ConstEdgeIterator
The constant edge iterator type.
Definition graph.hh:618
│ │ │ │ -
G Graph
The type of the graph we are a sub graph for.
Definition graph.hh:448
│ │ │ │ -
VertexIterator ConstVertexIterator
The constant vertex iterator type.
Definition graph.hh:623
│ │ │ │ -
SubGraph(const Graph &graph, const T &excluded)
Constructor.
│ │ │ │ -
ConstVertexIterator begin() const
Get an iterator over the vertices.
│ │ │ │ -
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:459
│ │ │ │ -
VertexDescriptor * EdgeDescriptor
Definition graph.hh:461
│ │ │ │ -
An index map for mapping the edges to indices.
Definition graph.hh:470
│ │ │ │ -
EdgeIndexMap(const EdgeIndexMap &emap)
Protect copy construction.
Definition graph.hh:479
│ │ │ │ -
ReadablePropertyMapTag Category
Definition graph.hh:472
│ │ │ │ -
EdgeIndexMap(const EdgeDescriptor &firstEdge)
Definition graph.hh:474
│ │ │ │ -
std::size_t operator[](const EdgeDescriptor &edge) const
Definition graph.hh:483
│ │ │ │ -
The edge iterator of the graph.
Definition graph.hh:505
│ │ │ │ -
const EdgeDescriptor & dereference() const
The descriptor of the current edge.
│ │ │ │ -
EdgeIterator(const EdgeDescriptor &edge)
Constructor for the end iterator.
│ │ │ │ -
bool equals(const EdgeIterator &other) const
Equality operator.
│ │ │ │ -
EdgeIterator & advance(std::ptrdiff_t n)
│ │ │ │ -
EdgeIterator & increment()
Preincrement operator.
│ │ │ │ -
const VertexDescriptor & target() const
The index of the target vertex of the current edge.
│ │ │ │ -
const VertexDescriptor & source() const
The index of the source vertex of the current edge.
│ │ │ │ -
EdgeIterator & decrement()
Preincrement operator.
│ │ │ │ -
std::ptrdiff_t distanceTo(const EdgeIterator &other) const
│ │ │ │ -
EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge)
Constructor.
│ │ │ │ -
The vertex iterator of the graph.
Definition graph.hh:560
│ │ │ │ -
VertexIterator(const VertexDescriptor &current)
Constructor for end iterator.
│ │ │ │ -
VertexIterator & increment()
Preincrement operator.
│ │ │ │ -
EdgeIterator begin() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ -
bool equals(const VertexIterator &other) const
Equality iterator.
│ │ │ │ -
VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor &current, const VertexDescriptor &end)
Constructor.
│ │ │ │ -
EdgeIterator end() const
Get an iterator over all edges starting at the current vertex.
│ │ │ │ -
const VertexDescriptor & dereference() const
Get the descriptor of the current vertex.
│ │ │ │ -
Attaches properties to the vertices of a graph.
Definition graph.hh:723
│ │ │ │ -
const Graph & graph() const
Get the graph the properties are attached to.
│ │ │ │ -
Graph::ConstEdgeIterator ConstEdgeIterator
The type of the constant edge iterator.
Definition graph.hh:766
│ │ │ │ -
VertexProperties & getVertexProperties(const VertexDescriptor &vertex)
Get the properties associated with a vertex.
│ │ │ │ -
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ -
Graph::EdgeDescriptor EdgeDescriptor
The edge descritor.
Definition graph.hh:738
│ │ │ │ -
ConstEdgeIterator endEdges(const VertexDescriptor &source) const
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ -
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:733
│ │ │ │ -
G Graph
The graph we attach properties to.
Definition graph.hh:728
│ │ │ │ -
VM VertexMap
The type of the map for converting the VertexDescriptor to std::size_t.
Definition graph.hh:756
│ │ │ │ -
EdgeIterator endEdges(const VertexDescriptor &source)
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ -
EdgeIterator beginEdges(const VertexDescriptor &source)
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ -
VP VertexProperties
The type of the properties of the vertices.
Definition graph.hh:743
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ -
ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
Get the mutable edge iterator over edges starting at a vertex.
│ │ │ │ -
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ -
Graph::EdgeIterator EdgeIterator
The type of the mutable edge iterator.
Definition graph.hh:761
│ │ │ │ - │ │ │ │ -
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type EdgeIterator
The class of the edge iterator.
Definition graph.hh:823
│ │ │ │ -
std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value, VertexProperties &, constVertexProperties & >::type properties() const
Get the properties of the current Vertex.
│ │ │ │ -
EdgeIterator end() const
Get an iterator over the edges starting from the current vertex.
│ │ │ │ -
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::type Father
The father class.
Definition graph.hh:814
│ │ │ │ -
EdgeIterator begin() const
Get an iterator over the edges starting from the current vertex.
│ │ │ │ -
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ -
std::size_t noVertices() const
Get the number of vertices in the graph.
│ │ │ │ -
Graph::EdgeDescriptor EdgeDescriptor
The edge descritor.
Definition graph.hh:993
│ │ │ │ -
const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target) const
Get the properties associated with a edge.
│ │ │ │ -
const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const
Get the properties associated with a edge.
│ │ │ │ -
const Graph & graph() const
Get the graph the properties are attached to.
│ │ │ │ -
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ -
G Graph
The graph we attach properties to.
Definition graph.hh:983
│ │ │ │ -
EM EdgeMap
The type of the map for converting the EdgeDescriptor to std::size_t.
Definition graph.hh:1030
│ │ │ │ -
VM VertexMap
The type of the map for converting the VertexDescriptor to std::size_t.
Definition graph.hh:1011
│ │ │ │ -
VP VertexProperties
The type of the properties of the vertices.
Definition graph.hh:998
│ │ │ │ -
std::size_t noEdges() const
Get the number of edges in the graph.
│ │ │ │ -
EP EdgeProperties
The type of the properties of the edges;.
Definition graph.hh:1016
│ │ │ │ -
EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target)
Get the properties associated with a edge.
│ │ │ │ -
EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge)
Get the properties associated with a edge.
│ │ │ │ -
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition graph.hh:988
│ │ │ │ -
PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap &emap=EdgeMap())
Constructor.
│ │ │ │ - │ │ │ │ -
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type Father
The father class.
Definition graph.hh:1050
│ │ │ │ - │ │ │ │ -
std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::type Father
The father class.
Definition graph.hh:1151
│ │ │ │ -
Wrapper to access the internal edge properties of a graph via operator[]()
Definition graph.hh:1361
│ │ │ │ -
GraphVertexPropertiesSelector(G &g)
Constructor.
Definition graph.hh:1380
│ │ │ │ -
VertexProperties & operator[](const Vertex &vertex) const
Get the properties associated to a vertex.
Definition graph.hh:1395
│ │ │ │ -
G Graph
The type of the graph with internal properties.
Definition graph.hh:1366
│ │ │ │ -
G::VertexProperties VertexProperties
The type of the vertex properties.
Definition graph.hh:1370
│ │ │ │ -
GraphVertexPropertiesSelector()
Default constructor.
Definition graph.hh:1386
│ │ │ │ -
G::VertexDescriptor Vertex
The vertex descriptor.
Definition graph.hh:1374
│ │ │ │ -
Wrapper to access the internal vertex properties of a graph via operator[]()
Definition graph.hh:1409
│ │ │ │ -
EdgeProperties & operator[](const Edge &edge) const
Get the properties associated to a vertex.
Definition graph.hh:1442
│ │ │ │ -
G::EdgeProperties EdgeProperties
The type of the vertex properties.
Definition graph.hh:1418
│ │ │ │ -
G::EdgeDescriptor Edge
The edge descriptor.
Definition graph.hh:1422
│ │ │ │ -
GraphEdgePropertiesSelector()
Default constructor.
Definition graph.hh:1434
│ │ │ │ -
G Graph
The type of the graph with internal properties.
Definition graph.hh:1414
│ │ │ │ -
GraphEdgePropertiesSelector(G &g)
Constructor.
Definition graph.hh:1428
│ │ │ │ +
Definition matrixredistribute.hh:22
│ │ │ │ +
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:32
│ │ │ │ +
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ +
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition owneroverlapcopy.hh:538
│ │ │ │ +
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │ +
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ +
Definition pinfo.hh:28
│ │ │ │ +
Definition transfer.hh:32
│ │ │ │ +
static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, const Vector &fine, T &comm)
│ │ │ │ +
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp)
│ │ │ │ +
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())
│ │ │ │ +
V1 Vertex
Definition transfer.hh:35
│ │ │ │ +
V2 Vector
Definition transfer.hh:36
│ │ │ │ +
RedistributeInformation< SequentialInformation > Redist
Definition transfer.hh:56
│ │ │ │ + │ │ │ │ + │ │ │ │ +
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation &comm=SequentialInformation(), const Redist &redist=Redist())
│ │ │ │ +
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp, const SequentialInformation &comm=SequentialInformation())
│ │ │ │ + │ │ │ │ +
RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist
Definition transfer.hh:80
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,2286 +1,294 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -graph.hh │ │ │ │ │ +transfer.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_GRAPH_HH │ │ │ │ │ -6#define DUNE_AMG_GRAPH_HH │ │ │ │ │ +5#ifndef DUNE_AMGTRANSFER_HH │ │ │ │ │ +6#define DUNE_AMGTRANSFER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18namespace _D_u_n_e │ │ │ │ │ -19{ │ │ │ │ │ -20 namespace Amg │ │ │ │ │ -21 { │ │ │ │ │ -49 template │ │ │ │ │ -_5_0 class _M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -51 { │ │ │ │ │ -52 public: │ │ │ │ │ -_5_6 typedef M _M_a_t_r_i_x; │ │ │ │ │ -57 │ │ │ │ │ -_6_1 typedef typename std::remove_const::type _M_u_t_a_b_l_e_M_a_t_r_i_x; │ │ │ │ │ -62 │ │ │ │ │ -_6_6 typedef typename M::block_type _W_e_i_g_h_t; │ │ │ │ │ +8#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +9#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_a_g_g_r_e_g_a_t_e_s_._h_h> │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e │ │ │ │ │ +16{ │ │ │ │ │ +17 namespace Amg │ │ │ │ │ +18 { │ │ │ │ │ +19 │ │ │ │ │ +30 template │ │ │ │ │ +_3_1 class _T_r_a_n_s_f_e_r │ │ │ │ │ +32 { │ │ │ │ │ +33 │ │ │ │ │ +34 public: │ │ │ │ │ +_3_5 typedef V1 _V_e_r_t_e_x; │ │ │ │ │ +_3_6 typedef V2 _V_e_c_t_o_r; │ │ │ │ │ +37 │ │ │ │ │ +38 template │ │ │ │ │ +_3_9 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +40 _V_e_c_t_o_r& fineRedist,T1 damp, R& redistributor=R()); │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +44 T1 damp); │ │ │ │ │ +45 │ │ │ │ │ +_4_6 static void _r_e_s_t_r_i_c_t_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _V_e_c_t_o_r& │ │ │ │ │ +coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ +47 T& comm); │ │ │ │ │ +48 }; │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +_5_1 class _T_r_a_n_s_f_e_r │ │ │ │ │ +52 { │ │ │ │ │ +53 public: │ │ │ │ │ +_5_4 typedef V _V_e_r_t_e_x; │ │ │ │ │ +_5_5 typedef V1 _V_e_c_t_o_r; │ │ │ │ │ +_5_6 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_> _R_e_d_i_s_t; │ │ │ │ │ +57 template │ │ │ │ │ +_5_8 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +59 _V_e_c_t_o_r& fineRedist, T1 damp, │ │ │ │ │ +60 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm=_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n(), │ │ │ │ │ +61 const _R_e_d_i_s_t& redist=_R_e_d_i_s_t()); │ │ │ │ │ +62 template │ │ │ │ │ +_6_3 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +64 T1 damp, │ │ │ │ │ +65 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm=_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ +66 │ │ │ │ │ 67 │ │ │ │ │ -_7_3 typedef typename M::size_type _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -74 │ │ │ │ │ -_8_0 typedef std::ptrdiff_t _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -81 │ │ │ │ │ -82 enum { │ │ │ │ │ -83 /* │ │ │ │ │ -84 * @brief Whether Matrix is mutable. │ │ │ │ │ -85 */ │ │ │ │ │ -86 _m_u_t_a_b_l_e_M_a_t_r_i_x = std::is_same::type>::value │ │ │ │ │ -_8_7 }; │ │ │ │ │ +68 static void _r_e_s_t_r_i_c_t_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _V_e_c_t_o_r& │ │ │ │ │ +coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ +69 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm); │ │ │ │ │ +70 }; │ │ │ │ │ +71 │ │ │ │ │ +72#if HAVE_MPI │ │ │ │ │ +73 │ │ │ │ │ +74 template │ │ │ │ │ +_7_5 class _T_r_a_n_s_f_e_r > │ │ │ │ │ +76 { │ │ │ │ │ +77 public: │ │ │ │ │ +_7_8 typedef V _V_e_r_t_e_x; │ │ │ │ │ +_7_9 typedef V1 _V_e_c_t_o_r; │ │ │ │ │ +_8_0 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> > │ │ │ │ │ +_R_e_d_i_s_t; │ │ │ │ │ +81 template │ │ │ │ │ +82 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +83 _V_e_c_t_o_r& fineRedist, T3 damp, _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm, │ │ │ │ │ +84 const _R_e_d_i_s_t& redist); │ │ │ │ │ +85 template │ │ │ │ │ +86 static void _p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +_V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +87 T3 damp, _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm); │ │ │ │ │ 88 │ │ │ │ │ -89 │ │ │ │ │ -93 template │ │ │ │ │ -_9_4 class _E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -95 { │ │ │ │ │ -96 │ │ │ │ │ -97 public: │ │ │ │ │ -_1_0_1 typedef typename std::remove_const::type _M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r; │ │ │ │ │ -_1_0_5 typedef const typename std::remove_const::type _C_o_n_s_t_C_o_n_t_a_i_n_e_r; │ │ │ │ │ -106 │ │ │ │ │ -107 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ -108 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T<_C_o_n_s_t_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ -109 │ │ │ │ │ -110 enum { │ │ │ │ │ -112 _i_s_M_u_t_a_b_l_e = std::is_same::value │ │ │ │ │ -_1_1_3 }; │ │ │ │ │ -114 │ │ │ │ │ -118 typedef typename std::conditional<_i_s_M_u_t_a_b_l_e && C::mutableMatrix,typename │ │ │ │ │ -Matrix::row_type::Iterator, │ │ │ │ │ -119 typename Matrix::row_type::ConstIterator>::type │ │ │ │ │ -_1_2_0 _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -121 │ │ │ │ │ -125 typedef typename std::conditional<_i_s_M_u_t_a_b_l_e && C::mutableMatrix,typename │ │ │ │ │ -M::block_type, │ │ │ │ │ -126 const typename M::block_type>::type │ │ │ │ │ -_1_2_7 _W_e_i_g_h_t; │ │ │ │ │ -128 │ │ │ │ │ -_1_3_6 _E_d_g_e_I_t_e_r_a_t_o_r_T(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _s_o_u_r_c_e, const _C_o_l_I_t_e_r_a_t_o_r& block, │ │ │ │ │ -137 const _C_o_l_I_t_e_r_a_t_o_r& _e_n_d, const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge); │ │ │ │ │ -138 │ │ │ │ │ -_1_4_5 _E_d_g_e_I_t_e_r_a_t_o_r_T(const _C_o_l_I_t_e_r_a_t_o_r& block); │ │ │ │ │ -146 │ │ │ │ │ -151 template │ │ │ │ │ -_1_5_2 _E_d_g_e_I_t_e_r_a_t_o_r_T(const _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_1_>& other); │ │ │ │ │ -153 │ │ │ │ │ -154 typedef typename std::conditional::type>::value && C::mutableMatrix, │ │ │ │ │ -155 typename M::block_type, const typename M::block_type>::type │ │ │ │ │ -_1_5_6 _W_e_i_g_h_t_T_y_p_e; │ │ │ │ │ -157 │ │ │ │ │ -_1_6_1 _W_e_i_g_h_t_T_y_p_e& _w_e_i_g_h_t() const; │ │ │ │ │ -162 │ │ │ │ │ -_1_6_4 _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_>& _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +89 static void _r_e_s_t_r_i_c_t_V_e_c_t_o_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _V_e_c_t_o_r& │ │ │ │ │ +coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ +90 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm); │ │ │ │ │ +91 }; │ │ │ │ │ +92 │ │ │ │ │ +93#endif │ │ │ │ │ +94 │ │ │ │ │ +95 template │ │ │ │ │ +96 template │ │ │ │ │ +97 inline void │ │ │ │ │ +_9_8 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +99 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +100 [[maybe_unused]] _V_e_c_t_o_r& fineRedist, │ │ │ │ │ +101 T damp, │ │ │ │ │ +102 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm, │ │ │ │ │ +103 [[maybe_unused]] const _R_e_d_i_s_t& redist) │ │ │ │ │ +104 { │ │ │ │ │ +105 prolongateVector(aggregates, coarse, fine, damp); │ │ │ │ │ +106 } │ │ │ │ │ +107 template │ │ │ │ │ +108 template │ │ │ │ │ +109 inline void │ │ │ │ │ +_1_1_0 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +111 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +112 T damp, │ │ │ │ │ +113 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm) │ │ │ │ │ +114 { │ │ │ │ │ +115 typedef typename Vector::iterator Iterator; │ │ │ │ │ +116 │ │ │ │ │ +117 Iterator end = coarse.end(); │ │ │ │ │ +118 Iterator begin= coarse.begin(); │ │ │ │ │ +119 for(; begin!=end; ++begin) │ │ │ │ │ +120 *begin*=damp; │ │ │ │ │ +121 end=fine.end(); │ │ │ │ │ +122 begin=fine.begin(); │ │ │ │ │ +123 │ │ │ │ │ +124 for(Iterator block=begin; block != end; ++block) { │ │ │ │ │ +125 std::ptrdiff_t index=block-begin; │ │ │ │ │ +126 const _V_e_r_t_e_x& vertex = aggregates[index]; │ │ │ │ │ +127 if(vertex != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ +128 *block += coarse[aggregates[index]]; │ │ │ │ │ +129 } │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +132 template │ │ │ │ │ +133 inline void │ │ │ │ │ +_1_3_4 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_r_e_s_t_r_i_c_t_V_e_c_t_o_r(const │ │ │ │ │ +_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +135 _V_e_c_t_o_r& coarse, │ │ │ │ │ +136 const _V_e_c_t_o_r& fine, │ │ │ │ │ +137 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& comm) │ │ │ │ │ +138 { │ │ │ │ │ +139 // Set coarse vector to zero │ │ │ │ │ +140 coarse=0; │ │ │ │ │ +141 │ │ │ │ │ +142 typedef typename Vector::const_iterator Iterator; │ │ │ │ │ +143 Iterator end = fine._e_n_d(); │ │ │ │ │ +144 Iterator begin=fine.begin(); │ │ │ │ │ +145 │ │ │ │ │ +146 for(Iterator block=begin; block != end; ++block) { │ │ │ │ │ +147 const _V_e_r_t_e_x& vertex = aggregates[block-begin]; │ │ │ │ │ +148 if(vertex != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ +149 coarse[vertex] += *block; │ │ │ │ │ +150 } │ │ │ │ │ +151 } │ │ │ │ │ +152 │ │ │ │ │ +153#if HAVE_MPI │ │ │ │ │ +154 template │ │ │ │ │ +155 template │ │ │ │ │ +_1_5_6 inline void _T_r_a_n_s_f_e_r_<_V_,_V_1_,_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> >:: │ │ │ │ │ +prolongateVector(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +157 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, │ │ │ │ │ +158 _V_e_c_t_o_r& fineRedist, T3 damp, │ │ │ │ │ +159 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm, │ │ │ │ │ +160 const _R_e_d_i_s_t& redist) │ │ │ │ │ +161 { │ │ │ │ │ +162 if(fineRedist.size()>0) │ │ │ │ │ +163 // we operated on the coarse level │ │ │ │ │ +164 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(aggregates, coarse, │ │ │ │ │ +fineRedist, damp); │ │ │ │ │ 165 │ │ │ │ │ -_1_6_7 bool _o_p_e_r_a_t_o_r_!_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T::type>& │ │ │ │ │ -other) const; │ │ │ │ │ -168 │ │ │ │ │ -_1_7_0 bool _o_p_e_r_a_t_o_r_!_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T:: │ │ │ │ │ -type>& other) const; │ │ │ │ │ -171 │ │ │ │ │ -_1_7_3 bool _o_p_e_r_a_t_o_r_=_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T::type>& │ │ │ │ │ -other) const; │ │ │ │ │ -174 │ │ │ │ │ -_1_7_6 bool _o_p_e_r_a_t_o_r_=_=(const _E_d_g_e_I_t_e_r_a_t_o_r_T:: │ │ │ │ │ -type>& other) const; │ │ │ │ │ -177 │ │ │ │ │ -_1_7_9 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _t_a_r_g_e_t() const; │ │ │ │ │ -180 │ │ │ │ │ -_1_8_2 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _s_o_u_r_c_e() const; │ │ │ │ │ -183 │ │ │ │ │ -_1_8_5 const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& _o_p_e_r_a_t_o_r_*() const; │ │ │ │ │ -186 │ │ │ │ │ -_1_8_8 const _E_d_g_e_D_e_s_c_r_i_p_t_o_r* _o_p_e_r_a_t_o_r_-_>() const; │ │ │ │ │ -189 │ │ │ │ │ -190 private: │ │ │ │ │ -192 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r source_; │ │ │ │ │ -194 _C_o_l_I_t_e_r_a_t_o_r block_; │ │ │ │ │ -195 /*** │ │ │ │ │ -196 * @brief The column iterator positioned at the end of the row │ │ │ │ │ -197 * of vertex source_ │ │ │ │ │ -198 */ │ │ │ │ │ -199 _C_o_l_I_t_e_r_a_t_o_r blockEnd_; │ │ │ │ │ -201 _E_d_g_e_D_e_s_c_r_i_p_t_o_r edge_; │ │ │ │ │ -202 }; │ │ │ │ │ -203 │ │ │ │ │ -207 template │ │ │ │ │ -_2_0_8 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -209 { │ │ │ │ │ -210 public: │ │ │ │ │ -_2_1_4 typedef typename std::remove_const::type _M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r; │ │ │ │ │ -_2_1_8 typedef const typename std::remove_const::type _C_o_n_s_t_C_o_n_t_a_i_n_e_r; │ │ │ │ │ -219 │ │ │ │ │ -220 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ -221 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T<_C_o_n_s_t_C_o_n_t_a_i_n_e_r>; │ │ │ │ │ -222 │ │ │ │ │ -223 enum { │ │ │ │ │ -225 _i_s_M_u_t_a_b_l_e = std::is_same::value │ │ │ │ │ -_2_2_6 }; │ │ │ │ │ -227 │ │ │ │ │ -_2_3_3 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(C* graph, const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& current); │ │ │ │ │ -234 │ │ │ │ │ -_2_4_2 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& current); │ │ │ │ │ -243 │ │ │ │ │ -_2_4_4 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r_>& other); │ │ │ │ │ -245 │ │ │ │ │ -_2_5_0 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_C_>& _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -251 │ │ │ │ │ -_2_5_3 bool _o_p_e_r_a_t_o_r_!_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_C_o_n_s_t_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ -254 │ │ │ │ │ -_2_5_6 bool _o_p_e_r_a_t_o_r_=_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_C_o_n_s_t_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ -257 │ │ │ │ │ -_2_5_9 bool _o_p_e_r_a_t_o_r_!_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ -260 │ │ │ │ │ -_2_6_2 bool _o_p_e_r_a_t_o_r_=_=(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r_>& other) const; │ │ │ │ │ -263 │ │ │ │ │ -264 typedef typename std::conditional::type>::value && C::mutableMatrix, │ │ │ │ │ -265 typename M::block_type, const typename M::block_type>::type │ │ │ │ │ -_2_6_6 _W_e_i_g_h_t_T_y_p_e; │ │ │ │ │ -_2_6_8 _W_e_i_g_h_t_T_y_p_e& _w_e_i_g_h_t() const; │ │ │ │ │ -269 │ │ │ │ │ -_2_7_4 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _o_p_e_r_a_t_o_r_*() const; │ │ │ │ │ -275 │ │ │ │ │ -_2_8_1 _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_> _b_e_g_i_n() const; │ │ │ │ │ -282 │ │ │ │ │ -_2_8_8 _E_d_g_e_I_t_e_r_a_t_o_r_T_<_C_> _e_n_d() const; │ │ │ │ │ -289 │ │ │ │ │ -290 private: │ │ │ │ │ -291 C* graph_; │ │ │ │ │ -292 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r current_; │ │ │ │ │ -293 }; │ │ │ │ │ -294 │ │ │ │ │ -_2_9_8 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T_<_c_o_n_s_t_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -299 │ │ │ │ │ -_3_0_3 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T_<_M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -304 │ │ │ │ │ -_3_0_8 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_c_o_n_s_t_ _M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -309 │ │ │ │ │ -_3_1_3 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_<_M_a_t_r_i_x_G_r_a_p_h_<_M_a_t_r_i_x_> > _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -314 │ │ │ │ │ -_3_1_9 _M_a_t_r_i_x_G_r_a_p_h(_M_a_t_r_i_x& _m_a_t_r_i_x); │ │ │ │ │ -320 │ │ │ │ │ -_3_2_4 _~_M_a_t_r_i_x_G_r_a_p_h(); │ │ │ │ │ -325 │ │ │ │ │ -_3_3_0 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ -331 │ │ │ │ │ -_3_3_6 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ -337 │ │ │ │ │ -_3_4_2 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -343 │ │ │ │ │ -_3_4_8 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -349 │ │ │ │ │ -_3_5_6 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source); │ │ │ │ │ -357 │ │ │ │ │ -_3_6_4 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source); │ │ │ │ │ -365 │ │ │ │ │ -366 │ │ │ │ │ -_3_7_3 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ -374 │ │ │ │ │ -_3_8_1 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ -382 │ │ │ │ │ -_3_8_7 _M_a_t_r_i_x& _m_a_t_r_i_x(); │ │ │ │ │ -388 │ │ │ │ │ -_3_9_3 const _M_a_t_r_i_x& _m_a_t_r_i_x() const; │ │ │ │ │ -394 │ │ │ │ │ -_3_9_8 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ -399 │ │ │ │ │ -_4_0_6 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ -407 │ │ │ │ │ -_4_1_1 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ -412 │ │ │ │ │ -_4_1_9 _E_d_g_e_D_e_s_c_r_i_p_t_o_r _f_i_n_d_E_d_g_e(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ -420 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target) const; │ │ │ │ │ -421 │ │ │ │ │ -422 private: │ │ │ │ │ -424 _M_a_t_r_i_x& matrix_; │ │ │ │ │ -426 _E_d_g_e_D_e_s_c_r_i_p_t_o_r* start_; │ │ │ │ │ -428 _M_a_t_r_i_x_G_r_a_p_h(const _M_a_t_r_i_x_G_r_a_p_h&); │ │ │ │ │ -429 │ │ │ │ │ -430 }; │ │ │ │ │ -431 │ │ │ │ │ -441 template │ │ │ │ │ -_4_4_2 class _S_u_b_G_r_a_p_h │ │ │ │ │ -443 { │ │ │ │ │ -444 public: │ │ │ │ │ -_4_4_8 typedef G _G_r_a_p_h; │ │ │ │ │ -449 │ │ │ │ │ -_4_5_4 typedef T _E_x_c_l_u_d_e_d; │ │ │ │ │ -455 │ │ │ │ │ -_4_5_9 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -460 │ │ │ │ │ -_4_6_1 typedef _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r* _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -462 │ │ │ │ │ -_4_6_9 class _E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -470 { │ │ │ │ │ -471 public: │ │ │ │ │ -_4_7_2 typedef ReadablePropertyMapTag _C_a_t_e_g_o_r_y; │ │ │ │ │ -473 │ │ │ │ │ -_4_7_4 _E_d_g_e_I_n_d_e_x_M_a_p(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& firstEdge) │ │ │ │ │ -475 : firstEdge_(firstEdge) │ │ │ │ │ -476 {} │ │ │ │ │ -477 │ │ │ │ │ -_4_7_9 _E_d_g_e_I_n_d_e_x_M_a_p(const _E_d_g_e_I_n_d_e_x_M_a_p& emap) │ │ │ │ │ -480 : firstEdge_(emap.firstEdge_) │ │ │ │ │ -481 {} │ │ │ │ │ -482 │ │ │ │ │ -_4_8_3 std::size_t _o_p_e_r_a_t_o_r_[_](const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge) const │ │ │ │ │ -484 { │ │ │ │ │ -485 return edge-firstEdge_; │ │ │ │ │ -486 } │ │ │ │ │ -487 private: │ │ │ │ │ -489 _E_d_g_e_D_e_s_c_r_i_p_t_o_r firstEdge_; │ │ │ │ │ -491 _E_d_g_e_I_n_d_e_x_M_a_p() │ │ │ │ │ -492 {} │ │ │ │ │ -493 }; │ │ │ │ │ -494 │ │ │ │ │ -_4_9_9 _E_d_g_e_I_n_d_e_x_M_a_p _g_e_t_E_d_g_e_I_n_d_e_x_M_a_p(); │ │ │ │ │ -500 │ │ │ │ │ -_5_0_4 class _E_d_g_e_I_t_e_r_a_t_o_r : public RandomAccessIteratorFacade │ │ │ │ │ -505 { │ │ │ │ │ -506 public: │ │ │ │ │ -_5_1_2 explicit _E_d_g_e_I_t_e_r_a_t_o_r(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _s_o_u_r_c_e, const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ -edge); │ │ │ │ │ -513 │ │ │ │ │ -_5_2_1 explicit _E_d_g_e_I_t_e_r_a_t_o_r(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge); │ │ │ │ │ -522 │ │ │ │ │ -_5_2_4 bool _e_q_u_a_l_s(const _E_d_g_e_I_t_e_r_a_t_o_r& other) const; │ │ │ │ │ -525 │ │ │ │ │ -_5_2_7 _E_d_g_e_I_t_e_r_a_t_o_r& _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -528 │ │ │ │ │ -_5_3_0 _E_d_g_e_I_t_e_r_a_t_o_r& _d_e_c_r_e_m_e_n_t(); │ │ │ │ │ -531 │ │ │ │ │ -_5_3_2 _E_d_g_e_I_t_e_r_a_t_o_r& _a_d_v_a_n_c_e(std::ptrdiff_t n); │ │ │ │ │ -533 │ │ │ │ │ -_5_3_5 const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& _d_e_r_e_f_e_r_e_n_c_e() const; │ │ │ │ │ -536 │ │ │ │ │ -_5_3_8 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _t_a_r_g_e_t() const; │ │ │ │ │ -539 │ │ │ │ │ -_5_4_1 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _s_o_u_r_c_e() const; │ │ │ │ │ -542 │ │ │ │ │ -_5_4_3 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _E_d_g_e_I_t_e_r_a_t_o_r& other) const; │ │ │ │ │ -544 │ │ │ │ │ -545 private: │ │ │ │ │ -547 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r source_; │ │ │ │ │ -552 _E_d_g_e_D_e_s_c_r_i_p_t_o_r edge_; │ │ │ │ │ -553 }; │ │ │ │ │ -554 │ │ │ │ │ -_5_5_8 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -559 : public ForwardIteratorFacade │ │ │ │ │ -560 { │ │ │ │ │ -561 public: │ │ │ │ │ -_5_6_8 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r(const _S_u_b_G_r_a_p_h_<_G_,_T_>* graph, const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& │ │ │ │ │ -current, │ │ │ │ │ -569 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _e_n_d); │ │ │ │ │ -570 │ │ │ │ │ -571 │ │ │ │ │ -_5_7_8 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& current); │ │ │ │ │ -579 │ │ │ │ │ -_5_8_1 _V_e_r_t_e_x_I_t_e_r_a_t_o_r& _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -582 │ │ │ │ │ -_5_8_4 bool _e_q_u_a_l_s(const _V_e_r_t_e_x_I_t_e_r_a_t_o_r& other) const; │ │ │ │ │ -585 │ │ │ │ │ -_5_9_0 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& _d_e_r_e_f_e_r_e_n_c_e() const; │ │ │ │ │ -591 │ │ │ │ │ -_5_9_7 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -598 │ │ │ │ │ -_6_0_4 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -605 │ │ │ │ │ -606 private: │ │ │ │ │ -608 const _S_u_b_G_r_a_p_h_<_G_r_a_p_h_,_T_>* graph_; │ │ │ │ │ -610 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r current_; │ │ │ │ │ -612 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r end_; │ │ │ │ │ -613 }; │ │ │ │ │ -614 │ │ │ │ │ -_6_1_8 typedef _E_d_g_e_I_t_e_r_a_t_o_r _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -619 │ │ │ │ │ -_6_2_3 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -624 │ │ │ │ │ -_6_2_9 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -630 │ │ │ │ │ -_6_3_5 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -636 │ │ │ │ │ -_6_4_3 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ -644 │ │ │ │ │ -_6_5_1 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ -652 │ │ │ │ │ -_6_5_6 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ -657 │ │ │ │ │ -_6_6_4 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ -665 │ │ │ │ │ -_6_6_9 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ -_6_7_6 _E_d_g_e_D_e_s_c_r_i_p_t_o_r _f_i_n_d_E_d_g_e(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ -677 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target) const; │ │ │ │ │ -_6_8_5 _S_u_b_G_r_a_p_h(const _G_r_a_p_h& graph, const T& excluded); │ │ │ │ │ -686 │ │ │ │ │ -_6_9_0 _~_S_u_b_G_r_a_p_h(); │ │ │ │ │ -691 │ │ │ │ │ -692 private: │ │ │ │ │ -694 const T& excluded_; │ │ │ │ │ -696 std::size_t noVertices_; │ │ │ │ │ -698 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r endVertex_; │ │ │ │ │ -700 int noEdges_; │ │ │ │ │ -705 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r maxVertex_; │ │ │ │ │ -707 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r* edges_; │ │ │ │ │ -709 std::ptrdiff_t* start_; │ │ │ │ │ -711 std::ptrdiff_t* end_; │ │ │ │ │ -713 _S_u_b_G_r_a_p_h(const _S_u_b_G_r_a_p_h&) │ │ │ │ │ -714 {} │ │ │ │ │ -715 }; │ │ │ │ │ -716 │ │ │ │ │ -717 │ │ │ │ │ -721 template │ │ │ │ │ -_7_2_2 class _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -723 { │ │ │ │ │ -724 public: │ │ │ │ │ -_7_2_8 typedef G _G_r_a_p_h; │ │ │ │ │ -729 │ │ │ │ │ -_7_3_3 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -734 │ │ │ │ │ -_7_3_8 typedef typename Graph::EdgeDescriptor _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -739 │ │ │ │ │ -_7_4_3 typedef VP _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ -744 │ │ │ │ │ -_7_5_6 typedef VM _V_e_r_t_e_x_M_a_p; │ │ │ │ │ -757 │ │ │ │ │ -_7_6_1 typedef typename Graph::EdgeIterator _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -762 │ │ │ │ │ -_7_6_6 typedef typename Graph::ConstEdgeIterator _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -767 │ │ │ │ │ -_7_7_3 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source); │ │ │ │ │ -774 │ │ │ │ │ -_7_8_0 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source); │ │ │ │ │ -781 │ │ │ │ │ -_7_8_7 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ -788 │ │ │ │ │ -_7_9_4 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r _e_n_d_E_d_g_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source) const; │ │ │ │ │ -795 │ │ │ │ │ -796 │ │ │ │ │ -797 template │ │ │ │ │ -_7_9_8 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -799 : public std::conditional::type, │ │ │ │ │ -800 C>::value, │ │ │ │ │ -801 typename Graph::VertexIterator, │ │ │ │ │ -802 typename Graph::ConstVertexIterator>::type │ │ │ │ │ -803 { │ │ │ │ │ -804 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ -805 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ -806 public: │ │ │ │ │ -810 typedef typename std::conditional::type, │ │ │ │ │ -811 C>::value, │ │ │ │ │ -812 typename Graph::VertexIterator, │ │ │ │ │ -813 typename Graph::ConstVertexIterator>::type │ │ │ │ │ -_8_1_4 _F_a_t_h_e_r; │ │ │ │ │ -815 │ │ │ │ │ -819 typedef typename std::conditional::type, │ │ │ │ │ -820 C>::value, │ │ │ │ │ -821 typename Graph::EdgeIterator, │ │ │ │ │ -822 typename Graph::ConstEdgeIterator>::type │ │ │ │ │ -_8_2_3 _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -824 │ │ │ │ │ -_8_3_0 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter, │ │ │ │ │ -831 C* graph); │ │ │ │ │ -832 │ │ │ │ │ -833 │ │ │ │ │ -_8_4_1 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter); │ │ │ │ │ -842 │ │ │ │ │ -847 template │ │ │ │ │ -_8_4_8 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const VertexIteratorT& other); │ │ │ │ │ -849 │ │ │ │ │ -853 typename std::conditional:: │ │ │ │ │ -type>::value, │ │ │ │ │ -854 VertexProperties&, │ │ │ │ │ -855 const VertexProperties&>::type │ │ │ │ │ -_8_5_6 _p_r_o_p_e_r_t_i_e_s() const; │ │ │ │ │ -857 │ │ │ │ │ -_8_6_3 _E_d_g_e_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -864 │ │ │ │ │ -_8_7_0 _E_d_g_e_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -871 │ │ │ │ │ -872 private: │ │ │ │ │ -876 C* graph_; │ │ │ │ │ -877 }; │ │ │ │ │ -878 │ │ │ │ │ -882 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -884 │ │ │ │ │ -888 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -890 │ │ │ │ │ -_8_9_5 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n(); │ │ │ │ │ -896 │ │ │ │ │ -_9_0_1 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d(); │ │ │ │ │ -902 │ │ │ │ │ -_9_0_7 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _b_e_g_i_n() const; │ │ │ │ │ -908 │ │ │ │ │ -_9_1_3 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r _e_n_d() const; │ │ │ │ │ -914 │ │ │ │ │ -_9_2_0 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& _g_e_t_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s(const VertexDescriptor& vertex); │ │ │ │ │ -921 │ │ │ │ │ -_9_2_7 const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& _g_e_t_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s(const VertexDescriptor& vertex) │ │ │ │ │ -const; │ │ │ │ │ -928 │ │ │ │ │ -_9_3_3 const _G_r_a_p_h& _g_r_a_p_h() const; │ │ │ │ │ -934 │ │ │ │ │ -_9_3_8 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ -939 │ │ │ │ │ -_9_4_3 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ -944 │ │ │ │ │ -_9_5_1 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ -952 │ │ │ │ │ -_9_5_8 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(Graph& graph, const VertexMap vmap=VertexMap()); │ │ │ │ │ -959 │ │ │ │ │ -960 private: │ │ │ │ │ -961 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(const VertexPropertiesGraph&) │ │ │ │ │ -962 {} │ │ │ │ │ -963 │ │ │ │ │ -965 _G_r_a_p_h& graph_; │ │ │ │ │ -967 _V_e_r_t_e_x_M_a_p vmap_; │ │ │ │ │ -_9_6_9 std::vector vertexProperties_; │ │ │ │ │ -970 │ │ │ │ │ -971 }; │ │ │ │ │ -972 │ │ │ │ │ -976 template │ │ │ │ │ -_9_7_7 class _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -978 { │ │ │ │ │ -979 public: │ │ │ │ │ -_9_8_3 typedef G _G_r_a_p_h; │ │ │ │ │ -984 │ │ │ │ │ -_9_8_8 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -989 │ │ │ │ │ -_9_9_3 typedef typename Graph::EdgeDescriptor _E_d_g_e_D_e_s_c_r_i_p_t_o_r; │ │ │ │ │ -994 │ │ │ │ │ -_9_9_8 typedef VP _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ -999 │ │ │ │ │ -_1_0_1_1 typedef VM _V_e_r_t_e_x_M_a_p; │ │ │ │ │ -1012 │ │ │ │ │ -_1_0_1_6 typedef EP _E_d_g_e_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ -1017 │ │ │ │ │ -1018 │ │ │ │ │ -_1_0_3_0 typedef EM _E_d_g_e_M_a_p; │ │ │ │ │ -1031 │ │ │ │ │ -1032 template │ │ │ │ │ -_1_0_3_3 class _E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -1034 : public std::conditional:: │ │ │ │ │ -type, │ │ │ │ │ -1035 C>::value, │ │ │ │ │ -1036 typename Graph::EdgeIterator, │ │ │ │ │ -1037 typename Graph::ConstEdgeIterator>::type │ │ │ │ │ -1038 { │ │ │ │ │ -1039 │ │ │ │ │ -1040 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ -1041 friend class _E_d_g_e_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ -1042 public: │ │ │ │ │ -1046 typedef typename std::conditional::type, │ │ │ │ │ -1047 C>::value, │ │ │ │ │ -1048 typename Graph::EdgeIterator, │ │ │ │ │ -1049 typename Graph::ConstEdgeIterator>::type │ │ │ │ │ -_1_0_5_0 _F_a_t_h_e_r; │ │ │ │ │ -1051 │ │ │ │ │ -_1_0_5_7 explicit _E_d_g_e_I_t_e_r_a_t_o_r_T(const Father& iter, │ │ │ │ │ -1058 C* graph); │ │ │ │ │ -1059 │ │ │ │ │ -_1_0_6_7 explicit _E_d_g_e_I_t_e_r_a_t_o_r_T(const Father& iter); │ │ │ │ │ -1068 │ │ │ │ │ -1073 template │ │ │ │ │ -_1_0_7_4 _E_d_g_e_I_t_e_r_a_t_o_r_T(const EdgeIteratorT& other); │ │ │ │ │ -1075 │ │ │ │ │ -1079 typename std::conditional:: │ │ │ │ │ -type>::value, │ │ │ │ │ -1080 EdgeProperties&, │ │ │ │ │ -1081 const EdgeProperties&>::type │ │ │ │ │ -_1_0_8_2 properties() const; │ │ │ │ │ -1083 │ │ │ │ │ -1084 private: │ │ │ │ │ -_1_0_8_8 C* graph_; │ │ │ │ │ -1089 }; │ │ │ │ │ -1090 │ │ │ │ │ -1094 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T > _E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -1097 │ │ │ │ │ -1101 typedef _E_d_g_e_I_t_e_r_a_t_o_r_T > _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -1104 │ │ │ │ │ -_1_1_1_0 _E_d_g_e_I_t_e_r_a_t_o_r beginEdges(const VertexDescriptor& source); │ │ │ │ │ -1111 │ │ │ │ │ -_1_1_1_7 _E_d_g_e_I_t_e_r_a_t_o_r endEdges(const VertexDescriptor& source); │ │ │ │ │ -1118 │ │ │ │ │ -_1_1_2_4 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r beginEdges(const VertexDescriptor& source) const; │ │ │ │ │ -1125 │ │ │ │ │ -_1_1_3_1 _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r endEdges(const VertexDescriptor& source) const; │ │ │ │ │ -1132 │ │ │ │ │ -1133 │ │ │ │ │ -1134 template │ │ │ │ │ -_1_1_3_5 class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -1136 : public std::conditional:: │ │ │ │ │ -type, │ │ │ │ │ -1137 C>::value, │ │ │ │ │ -1138 typename Graph::VertexIterator, │ │ │ │ │ -1139 typename Graph::ConstVertexIterator>::type │ │ │ │ │ -1140 { │ │ │ │ │ -1141 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ -1142 friend class _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T::type>; │ │ │ │ │ -1143 public: │ │ │ │ │ -1147 typedef typename std::conditional::type, │ │ │ │ │ -1148 C>::value, │ │ │ │ │ -1149 typename Graph::VertexIterator, │ │ │ │ │ -1150 typename Graph::ConstVertexIterator>::type │ │ │ │ │ -_1_1_5_1 _F_a_t_h_e_r; │ │ │ │ │ -1152 │ │ │ │ │ -_1_1_5_8 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter, │ │ │ │ │ -1159 C* graph); │ │ │ │ │ -1160 │ │ │ │ │ -1161 │ │ │ │ │ -_1_1_6_9 explicit _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const Father& iter); │ │ │ │ │ -1170 │ │ │ │ │ -1175 template │ │ │ │ │ -_1_1_7_6 _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T(const VertexIteratorT& other); │ │ │ │ │ -1177 │ │ │ │ │ -1181 typename std::conditional:: │ │ │ │ │ -type>::value, │ │ │ │ │ -1182 VertexProperties&, │ │ │ │ │ -1183 const VertexProperties&>::type │ │ │ │ │ -_1_1_8_4 properties() const; │ │ │ │ │ -1185 │ │ │ │ │ -_1_1_9_1 _E_d_g_e_I_t_e_r_a_t_o_r_T begin() const; │ │ │ │ │ -1192 │ │ │ │ │ -_1_1_9_8 _E_d_g_e_I_t_e_r_a_t_o_r_T end() const; │ │ │ │ │ -1199 │ │ │ │ │ -1200 private: │ │ │ │ │ -1204 C* graph_; │ │ │ │ │ -1205 }; │ │ │ │ │ -1206 │ │ │ │ │ -1210 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -1213 │ │ │ │ │ -1217 typedef _V_e_r_t_e_x_I_t_e_r_a_t_o_r_T > _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -1220 │ │ │ │ │ -_1_2_2_5 _V_e_r_t_e_x_I_t_e_r_a_t_o_r begin(); │ │ │ │ │ -1226 │ │ │ │ │ -_1_2_3_1 _V_e_r_t_e_x_I_t_e_r_a_t_o_r end(); │ │ │ │ │ -1232 │ │ │ │ │ -_1_2_3_7 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r begin() const; │ │ │ │ │ -1238 │ │ │ │ │ -_1_2_4_3 _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r end() const; │ │ │ │ │ -1244 │ │ │ │ │ -_1_2_5_0 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& getVertexProperties(const VertexDescriptor& vertex); │ │ │ │ │ -1251 │ │ │ │ │ -_1_2_5_7 const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& getVertexProperties(const VertexDescriptor& │ │ │ │ │ -vertex) const; │ │ │ │ │ -1258 │ │ │ │ │ -_1_2_6_5 _E_d_g_e_D_e_s_c_r_i_p_t_o_r findEdge(const VertexDescriptor& source, │ │ │ │ │ -1266 const VertexDescriptor& target) │ │ │ │ │ -1267 { │ │ │ │ │ -1268 return graph_.findEdge(source,target); │ │ │ │ │ -1269 } │ │ │ │ │ -1270 │ │ │ │ │ -_1_2_7_6 _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge); │ │ │ │ │ -1277 │ │ │ │ │ -1278 │ │ │ │ │ -_1_2_8_4 const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _E_d_g_e_D_e_s_c_r_i_p_t_o_r& edge) const; │ │ │ │ │ -1285 │ │ │ │ │ -_1_2_9_2 _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ -1293 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target); │ │ │ │ │ -1294 │ │ │ │ │ -_1_3_0_1 const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s(const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& source, │ │ │ │ │ -1302 const _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r& target) const; │ │ │ │ │ -1303 │ │ │ │ │ -_1_3_0_8 const _G_r_a_p_h& _g_r_a_p_h() const; │ │ │ │ │ -1309 │ │ │ │ │ -_1_3_1_3 std::size_t _n_o_V_e_r_t_i_c_e_s() const; │ │ │ │ │ -1314 │ │ │ │ │ -_1_3_1_8 std::size_t _n_o_E_d_g_e_s() const; │ │ │ │ │ -1319 │ │ │ │ │ -_1_3_2_6 _V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r _m_a_x_V_e_r_t_e_x() const; │ │ │ │ │ -1327 │ │ │ │ │ -_1_3_3_4 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(_G_r_a_p_h& graph, const _V_e_r_t_e_x_M_a_p& vmap=_V_e_r_t_e_x_M_a_p(), │ │ │ │ │ -1335 const _E_d_g_e_M_a_p& emap=_E_d_g_e_M_a_p()); │ │ │ │ │ -1336 │ │ │ │ │ -1337 private: │ │ │ │ │ -1338 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(const _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h&) │ │ │ │ │ -1339 {} │ │ │ │ │ -1340 │ │ │ │ │ -1342 Graph& graph_; │ │ │ │ │ -1345 VertexMap vmap_; │ │ │ │ │ -1346 std::vector vertexProperties_; │ │ │ │ │ -1348 EdgeMap emap_; │ │ │ │ │ -_1_3_5_0 std::vector edgeProperties_; │ │ │ │ │ -1351 │ │ │ │ │ -1352 }; │ │ │ │ │ -1353 │ │ │ │ │ -1354 │ │ │ │ │ -1359 template │ │ │ │ │ -_1_3_6_0 class _G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -1361 { │ │ │ │ │ -1362 public: │ │ │ │ │ -_1_3_6_6 typedef G _G_r_a_p_h; │ │ │ │ │ -_1_3_7_0 typedef typename G::VertexProperties _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ -_1_3_7_4 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ -1375 │ │ │ │ │ -_1_3_8_0 _G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r(G& g) │ │ │ │ │ -1381 : graph_(g) │ │ │ │ │ -1382 {} │ │ │ │ │ -_1_3_8_6 _G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r() │ │ │ │ │ -1387 : graph_(0) │ │ │ │ │ -1388 {} │ │ │ │ │ -1389 │ │ │ │ │ -1390 │ │ │ │ │ -_1_3_9_5 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& _o_p_e_r_a_t_o_r_[_](const _V_e_r_t_e_x& vertex) const │ │ │ │ │ -1396 { │ │ │ │ │ -1397 return graph_->getVertexProperties(vertex); │ │ │ │ │ -1398 } │ │ │ │ │ -1399 private: │ │ │ │ │ -1400 Graph* graph_; │ │ │ │ │ -1401 }; │ │ │ │ │ -1402 │ │ │ │ │ -1407 template │ │ │ │ │ -_1_4_0_8 class _G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -1409 { │ │ │ │ │ -1410 public: │ │ │ │ │ -_1_4_1_4 typedef G _G_r_a_p_h; │ │ │ │ │ -_1_4_1_8 typedef typename G::EdgeProperties _E_d_g_e_P_r_o_p_e_r_t_i_e_s; │ │ │ │ │ -_1_4_2_2 typedef typename G::EdgeDescriptor _E_d_g_e; │ │ │ │ │ -1423 │ │ │ │ │ -_1_4_2_8 _G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r(G& g) │ │ │ │ │ -1429 : graph_(g) │ │ │ │ │ -1430 {} │ │ │ │ │ -_1_4_3_4 _G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r() │ │ │ │ │ -1435 : graph_(0) │ │ │ │ │ -1436 {} │ │ │ │ │ -1437 │ │ │ │ │ -_1_4_4_2 _E_d_g_e_P_r_o_p_e_r_t_i_e_s& _o_p_e_r_a_t_o_r_[_](const _E_d_g_e& edge) const │ │ │ │ │ -1443 { │ │ │ │ │ -1444 return graph_->getEdgeProperties(edge); │ │ │ │ │ -1445 } │ │ │ │ │ -1446 private: │ │ │ │ │ -1447 Graph* graph_; │ │ │ │ │ -1448 }; │ │ │ │ │ -1449 │ │ │ │ │ -1450 │ │ │ │ │ -1461 template │ │ │ │ │ -_1_4_6_2 int _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(const G& graph, const typename G::VertexDescriptor& │ │ │ │ │ -vertex, │ │ │ │ │ -1463 V& visitor); │ │ │ │ │ -1464 │ │ │ │ │ -1465#ifndef DOXYGEN │ │ │ │ │ -1466 │ │ │ │ │ -1467 template │ │ │ │ │ -1468 _M_a_t_r_i_x_G_r_a_p_h_<_M_>_:_:_M_a_t_r_i_x_G_r_a_p_h(M& matrix) │ │ │ │ │ -1469 : matrix_(matrix) │ │ │ │ │ -1470 { │ │ │ │ │ -1471 if(matrix_.N()!=matrix_.M()) │ │ │ │ │ -1472 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Matrix has to have as many columns as rows!"); │ │ │ │ │ -1473 │ │ │ │ │ -1474 start_ = new EdgeDescriptor[matrix_.N()+1]; │ │ │ │ │ -1475 │ │ │ │ │ -1476 typedef typename M::ConstIterator Iterator; │ │ │ │ │ -1477 start_[matrix_.begin().index()] = 0; │ │ │ │ │ -1478 │ │ │ │ │ -1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row) │ │ │ │ │ -1480 start_[row.index()+1] = start_[row.index()] + row->size(); │ │ │ │ │ -1481 } │ │ │ │ │ -1482 │ │ │ │ │ -1483 template │ │ │ │ │ -1484 MatrixGraph::~MatrixGraph() │ │ │ │ │ -1485 { │ │ │ │ │ -1486 delete[] start_; │ │ │ │ │ -1487 } │ │ │ │ │ -1488 │ │ │ │ │ -1489 template │ │ │ │ │ -1490 inline std::size_t MatrixGraph::noEdges() const │ │ │ │ │ -1491 { │ │ │ │ │ -1492 return start_[matrix_.N()]; │ │ │ │ │ -1493 } │ │ │ │ │ -1494 │ │ │ │ │ -1495 template │ │ │ │ │ -1496 inline std::size_t MatrixGraph::noVertices() const │ │ │ │ │ -1497 { │ │ │ │ │ -1498 return matrix_.N(); │ │ │ │ │ -1499 } │ │ │ │ │ -1500 │ │ │ │ │ -1501 template │ │ │ │ │ -1502 inline typename MatrixGraph::VertexDescriptor MatrixGraph::maxVertex │ │ │ │ │ -() const │ │ │ │ │ -1503 { │ │ │ │ │ -1504 return matrix_.N()-1; │ │ │ │ │ -1505 } │ │ │ │ │ -1506 │ │ │ │ │ -1507 template │ │ │ │ │ -1508 typename MatrixGraph::EdgeDescriptor │ │ │ │ │ -1509 MatrixGraph::findEdge(const VertexDescriptor& source, │ │ │ │ │ -1510 const VertexDescriptor& target) const │ │ │ │ │ -1511 { │ │ │ │ │ -1512 typename M::ConstColIterator found =matrix_[source].find(target); │ │ │ │ │ -1513 if(found == matrix_[source].end()) │ │ │ │ │ -1514 return std::numeric_limits::max(); │ │ │ │ │ -1515 std::size_t offset = found.offset(); │ │ │ │ │ -1516 if(target>source) │ │ │ │ │ -1517 offset--; │ │ │ │ │ -1518 │ │ │ │ │ -1519 assert(offset │ │ │ │ │ -1526 inline M& MatrixGraph::matrix() │ │ │ │ │ -1527 { │ │ │ │ │ -1528 return matrix_; │ │ │ │ │ -1529 } │ │ │ │ │ -1530 │ │ │ │ │ -1531 template │ │ │ │ │ -1532 inline const M& MatrixGraph::matrix() const │ │ │ │ │ -1533 { │ │ │ │ │ -1534 return matrix_; │ │ │ │ │ -1535 } │ │ │ │ │ -1536 │ │ │ │ │ -1537 template │ │ │ │ │ -1538 template │ │ │ │ │ -1539 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const VertexDescriptor& │ │ │ │ │ -source, const ColIterator& block, │ │ │ │ │ -1540 const ColIterator& end, const EdgeDescriptor& edge) │ │ │ │ │ -1541 : source_(source), block_(block), blockEnd_(end), edge_(edge) │ │ │ │ │ -1542 { │ │ │ │ │ -1543 if(block_!=blockEnd_ && block_.index() == source_) { │ │ │ │ │ -1544 // This is the edge from the diagonal to the diagonal. Skip it. │ │ │ │ │ -1545 ++block_; │ │ │ │ │ -1546 } │ │ │ │ │ -1547 } │ │ │ │ │ -1548 │ │ │ │ │ -1549 template │ │ │ │ │ -1550 template │ │ │ │ │ -1551 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const ColIterator& block) │ │ │ │ │ -1552 : block_(block) │ │ │ │ │ -1553 {} │ │ │ │ │ -1554 │ │ │ │ │ -1555 template │ │ │ │ │ -1556 template │ │ │ │ │ -1557 template │ │ │ │ │ -1558 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const EdgeIteratorT& │ │ │ │ │ -other) │ │ │ │ │ -1559 : source_(other.source_), block_(other.block_), blockEnd_ │ │ │ │ │ -(other.blockEnd_), edge_(other.edge_) │ │ │ │ │ -1560 {} │ │ │ │ │ -1561 │ │ │ │ │ -1562 │ │ │ │ │ -1563 template │ │ │ │ │ -1564 template │ │ │ │ │ -1565 inline typename MatrixGraph::template EdgeIteratorT::WeightType& │ │ │ │ │ -1566 MatrixGraph::EdgeIteratorT::weight() const │ │ │ │ │ -1567 { │ │ │ │ │ -1568 return *block_; │ │ │ │ │ -1569 } │ │ │ │ │ -1570 │ │ │ │ │ -1571 template │ │ │ │ │ -1572 template │ │ │ │ │ -1573 inline typename MatrixGraph::template EdgeIteratorT& │ │ │ │ │ -MatrixGraph::EdgeIteratorT::operator++() │ │ │ │ │ -1574 { │ │ │ │ │ -1575 ++block_; │ │ │ │ │ -1576 ++edge_; │ │ │ │ │ -1577 │ │ │ │ │ -1578 if(block_!=blockEnd_ && block_.index() == source_) { │ │ │ │ │ -1579 // This is the edge from the diagonal to the diagonal. Skip it. │ │ │ │ │ -1580 ++block_; │ │ │ │ │ -1581 } │ │ │ │ │ -1582 │ │ │ │ │ -1583 return *this; │ │ │ │ │ -1584 } │ │ │ │ │ -1585 │ │ │ │ │ -1586 template │ │ │ │ │ -1587 template │ │ │ │ │ -1588 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename │ │ │ │ │ -MatrixGraph::template EdgeIteratorT::type>& │ │ │ │ │ -other) const │ │ │ │ │ -1589 { │ │ │ │ │ -1590 return block_!=other.block_; │ │ │ │ │ -1591 } │ │ │ │ │ -1592 │ │ │ │ │ -1593 template │ │ │ │ │ -1594 template │ │ │ │ │ -1595 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename │ │ │ │ │ -MatrixGraph::template EdgeIteratorT:: │ │ │ │ │ -type>& other) const │ │ │ │ │ -1596 { │ │ │ │ │ -1597 return block_!=other.block_; │ │ │ │ │ -1598 } │ │ │ │ │ -1599 │ │ │ │ │ -1600 template │ │ │ │ │ -1601 template │ │ │ │ │ -1602 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename │ │ │ │ │ -MatrixGraph::template EdgeIteratorT::type>& │ │ │ │ │ -other) const │ │ │ │ │ -1603 { │ │ │ │ │ -1604 return block_==other.block_; │ │ │ │ │ -1605 } │ │ │ │ │ -1606 │ │ │ │ │ -1607 template │ │ │ │ │ -1608 template │ │ │ │ │ -1609 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename │ │ │ │ │ -MatrixGraph::template EdgeIteratorT:: │ │ │ │ │ -type>& other) const │ │ │ │ │ -1610 { │ │ │ │ │ -1611 return block_==other.block_; │ │ │ │ │ -1612 } │ │ │ │ │ -1613 │ │ │ │ │ -1614 template │ │ │ │ │ -1615 template │ │ │ │ │ -1616 inline typename MatrixGraph::VertexDescriptor MatrixGraph:: │ │ │ │ │ -EdgeIteratorT::target() const │ │ │ │ │ -1617 { │ │ │ │ │ -1618 return block_.index(); │ │ │ │ │ -1619 } │ │ │ │ │ -1620 │ │ │ │ │ -1621 template │ │ │ │ │ -1622 template │ │ │ │ │ -1623 inline typename MatrixGraph::VertexDescriptor MatrixGraph:: │ │ │ │ │ -EdgeIteratorT::source() const │ │ │ │ │ -1624 { │ │ │ │ │ -1625 return source_; │ │ │ │ │ -1626 } │ │ │ │ │ -1627 │ │ │ │ │ -1628 template │ │ │ │ │ -1629 template │ │ │ │ │ -1630 inline const typename MatrixGraph::EdgeDescriptor& MatrixGraph:: │ │ │ │ │ -EdgeIteratorT::operator*() const │ │ │ │ │ -1631 { │ │ │ │ │ -1632 return edge_; │ │ │ │ │ -1633 } │ │ │ │ │ -1634 │ │ │ │ │ -1635 template │ │ │ │ │ -1636 template │ │ │ │ │ -1637 inline const typename MatrixGraph::EdgeDescriptor* MatrixGraph:: │ │ │ │ │ -EdgeIteratorT::operator->() const │ │ │ │ │ -1638 { │ │ │ │ │ -1639 return &edge_; │ │ │ │ │ -1640 } │ │ │ │ │ -1641 │ │ │ │ │ -1642 template │ │ │ │ │ -1643 template │ │ │ │ │ -1644 MatrixGraph::VertexIteratorT::VertexIteratorT(C* graph, │ │ │ │ │ -1645 const VertexDescriptor& current) │ │ │ │ │ -1646 : graph_(graph), current_(current) │ │ │ │ │ -1647 {} │ │ │ │ │ -1648 │ │ │ │ │ -1649 │ │ │ │ │ -1650 template │ │ │ │ │ -1651 template │ │ │ │ │ -1652 MatrixGraph::VertexIteratorT::VertexIteratorT(const │ │ │ │ │ -VertexDescriptor& current) │ │ │ │ │ -1653 : current_(current) │ │ │ │ │ -1654 {} │ │ │ │ │ -1655 │ │ │ │ │ -1656 template │ │ │ │ │ -1657 template │ │ │ │ │ -1658 MatrixGraph::VertexIteratorT::VertexIteratorT(const │ │ │ │ │ -VertexIteratorT& other) │ │ │ │ │ -1659 : graph_(other.graph_), current_(other.current_) │ │ │ │ │ -1660 {} │ │ │ │ │ -1661 │ │ │ │ │ -1662 template │ │ │ │ │ -1663 template │ │ │ │ │ -1664 inline bool MatrixGraph::VertexIteratorT::operator!=(const │ │ │ │ │ -VertexIteratorT& other) const │ │ │ │ │ -1665 { │ │ │ │ │ -1666 return current_ != other.current_; │ │ │ │ │ -1667 } │ │ │ │ │ -1668 │ │ │ │ │ -1669 template │ │ │ │ │ -1670 template │ │ │ │ │ -1671 inline bool MatrixGraph::VertexIteratorT::operator!=(const │ │ │ │ │ -VertexIteratorT& other) const │ │ │ │ │ -1672 { │ │ │ │ │ -1673 return current_ != other.current_; │ │ │ │ │ -1674 } │ │ │ │ │ -1675 │ │ │ │ │ -1676 │ │ │ │ │ -1677 template │ │ │ │ │ -1678 template │ │ │ │ │ -1679 inline bool MatrixGraph::VertexIteratorT::operator==(const │ │ │ │ │ -VertexIteratorT& other) const │ │ │ │ │ -1680 { │ │ │ │ │ -1681 return current_ == other.current_; │ │ │ │ │ -1682 } │ │ │ │ │ -1683 │ │ │ │ │ -1684 template │ │ │ │ │ -1685 template │ │ │ │ │ -1686 inline bool MatrixGraph::VertexIteratorT::operator==(const │ │ │ │ │ -VertexIteratorT& other) const │ │ │ │ │ -1687 { │ │ │ │ │ -1688 return current_ == other.current_; │ │ │ │ │ -1689 } │ │ │ │ │ -1690 │ │ │ │ │ -1691 template │ │ │ │ │ -1692 template │ │ │ │ │ -1693 inline typename MatrixGraph::template VertexIteratorT& │ │ │ │ │ -MatrixGraph::VertexIteratorT::operator++() │ │ │ │ │ -1694 { │ │ │ │ │ -1695 ++current_; │ │ │ │ │ -1696 return *this; │ │ │ │ │ -1697 } │ │ │ │ │ -1698 │ │ │ │ │ -1699 template │ │ │ │ │ -1700 template │ │ │ │ │ -1701 inline typename MatrixGraph::template VertexIteratorT::WeightType& │ │ │ │ │ -1702 MatrixGraph::VertexIteratorT::weight() const │ │ │ │ │ -1703 { │ │ │ │ │ -1704 return graph_->matrix()[current_][current_]; │ │ │ │ │ -1705 } │ │ │ │ │ -1706 │ │ │ │ │ -1707 template │ │ │ │ │ -1708 template │ │ │ │ │ -1709 inline const typename MatrixGraph::VertexDescriptor& │ │ │ │ │ -1710 MatrixGraph::VertexIteratorT::operator*() const │ │ │ │ │ -1711 { │ │ │ │ │ -1712 return current_; │ │ │ │ │ -1713 } │ │ │ │ │ -1714 │ │ │ │ │ -1715 template │ │ │ │ │ -1716 template │ │ │ │ │ -1717 inline typename MatrixGraph::template EdgeIteratorT │ │ │ │ │ -1718 MatrixGraph::VertexIteratorT::begin() const │ │ │ │ │ -1719 { │ │ │ │ │ -1720 return graph_->beginEdges(current_); │ │ │ │ │ -1721 } │ │ │ │ │ -1722 │ │ │ │ │ -1723 template │ │ │ │ │ -1724 template │ │ │ │ │ -1725 inline typename MatrixGraph::template EdgeIteratorT │ │ │ │ │ -1726 MatrixGraph::VertexIteratorT::end() const │ │ │ │ │ -1727 { │ │ │ │ │ -1728 return graph_->endEdges(current_); │ │ │ │ │ -1729 } │ │ │ │ │ -1730 │ │ │ │ │ -1731 template │ │ │ │ │ -1732 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ -1733 MatrixGraph::begin() │ │ │ │ │ -1734 { │ │ │ │ │ -1735 return VertexIterator(this,0); │ │ │ │ │ -1736 } │ │ │ │ │ -1737 │ │ │ │ │ -1738 template │ │ │ │ │ -1739 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ -1740 MatrixGraph::end() │ │ │ │ │ -1741 { │ │ │ │ │ -1742 return VertexIterator(matrix_.N()); │ │ │ │ │ -1743 } │ │ │ │ │ -1744 │ │ │ │ │ -1745 │ │ │ │ │ -1746 template │ │ │ │ │ -1747 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ -1748 MatrixGraph::begin() const │ │ │ │ │ -1749 { │ │ │ │ │ -1750 return ConstVertexIterator(this, 0); │ │ │ │ │ -1751 } │ │ │ │ │ -1752 │ │ │ │ │ -1753 template │ │ │ │ │ -1754 inline typename MatrixGraph::template VertexIteratorT > │ │ │ │ │ -1755 MatrixGraph::end() const │ │ │ │ │ -1756 { │ │ │ │ │ -1757 return ConstVertexIterator(matrix_.N()); │ │ │ │ │ -1758 } │ │ │ │ │ -1759 │ │ │ │ │ -1760 template │ │ │ │ │ -1761 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ -1762 MatrixGraph::beginEdges(const VertexDescriptor& source) │ │ │ │ │ -1763 { │ │ │ │ │ -1764 return EdgeIterator(source, matrix_.operator[](source).begin(), │ │ │ │ │ -1765 matrix_.operator[](source).end(), start_[source]); │ │ │ │ │ -1766 } │ │ │ │ │ -1767 │ │ │ │ │ -1768 template │ │ │ │ │ -1769 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ -1770 MatrixGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ -1771 { │ │ │ │ │ -1772 return EdgeIterator(matrix_.operator[](source).end()); │ │ │ │ │ -1773 } │ │ │ │ │ -1774 │ │ │ │ │ -1775 │ │ │ │ │ -1776 template │ │ │ │ │ -1777 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ -1778 MatrixGraph::beginEdges(const VertexDescriptor& source) const │ │ │ │ │ -1779 { │ │ │ │ │ -1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(), │ │ │ │ │ -1781 matrix_.operator[](source).end(), start_[source]); │ │ │ │ │ -1782 } │ │ │ │ │ -1783 │ │ │ │ │ -1784 template │ │ │ │ │ -1785 inline typename MatrixGraph::template EdgeIteratorT > │ │ │ │ │ -1786 MatrixGraph::endEdges(const VertexDescriptor& source) const │ │ │ │ │ -1787 { │ │ │ │ │ -1788 return ConstEdgeIterator(matrix_.operator[](source).end()); │ │ │ │ │ -1789 } │ │ │ │ │ -1790 │ │ │ │ │ -1791 │ │ │ │ │ -1792 template │ │ │ │ │ -1793 SubGraph::EdgeIterator::EdgeIterator(const VertexDescriptor& source, │ │ │ │ │ -1794 const EdgeDescriptor& edge) │ │ │ │ │ -1795 : source_(source), edge_(edge) │ │ │ │ │ -1796 {} │ │ │ │ │ -1797 │ │ │ │ │ -1798 │ │ │ │ │ -1799 template │ │ │ │ │ -1800 SubGraph::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge) │ │ │ │ │ -1801 : edge_(edge) │ │ │ │ │ -1802 {} │ │ │ │ │ -1803 │ │ │ │ │ -1804 template │ │ │ │ │ -1805 typename SubGraph::EdgeIndexMap SubGraph::getEdgeIndexMap() │ │ │ │ │ -1806 { │ │ │ │ │ -1807 return EdgeIndexMap(edges_); │ │ │ │ │ -1808 } │ │ │ │ │ -1809 │ │ │ │ │ -1810 template │ │ │ │ │ -1811 inline bool SubGraph::EdgeIterator::equals(const EdgeIterator & │ │ │ │ │ -other) const │ │ │ │ │ -1812 { │ │ │ │ │ -1813 return other.edge_==edge_; │ │ │ │ │ -1814 } │ │ │ │ │ -1815 │ │ │ │ │ -1816 template │ │ │ │ │ -1817 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator:: │ │ │ │ │ -increment() │ │ │ │ │ -1818 { │ │ │ │ │ -1819 ++edge_; │ │ │ │ │ -1820 return *this; │ │ │ │ │ -1821 } │ │ │ │ │ -1822 │ │ │ │ │ -1823 template │ │ │ │ │ -1824 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator:: │ │ │ │ │ -decrement() │ │ │ │ │ -1825 { │ │ │ │ │ -1826 --edge_; │ │ │ │ │ -1827 return *this; │ │ │ │ │ -1828 } │ │ │ │ │ -1829 │ │ │ │ │ -1830 template │ │ │ │ │ -1831 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator:: │ │ │ │ │ -advance(std::ptrdiff_t n) │ │ │ │ │ -1832 { │ │ │ │ │ -1833 edge_+=n; │ │ │ │ │ -1834 return *this; │ │ │ │ │ -1835 } │ │ │ │ │ -1836 template │ │ │ │ │ -1837 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator:: │ │ │ │ │ -source() const │ │ │ │ │ -1838 { │ │ │ │ │ -1839 return source_; │ │ │ │ │ -1840 } │ │ │ │ │ -1841 │ │ │ │ │ -1842 template │ │ │ │ │ -1843 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator:: │ │ │ │ │ -target() const │ │ │ │ │ -1844 { │ │ │ │ │ -1845 return *edge_; │ │ │ │ │ -1846 } │ │ │ │ │ -1847 │ │ │ │ │ -1848 │ │ │ │ │ -1849 template │ │ │ │ │ -1850 inline const typename SubGraph::EdgeDescriptor& SubGraph:: │ │ │ │ │ -EdgeIterator::dereference() const │ │ │ │ │ -1851 { │ │ │ │ │ -1852 return edge_; │ │ │ │ │ -1853 } │ │ │ │ │ -1854 │ │ │ │ │ -1855 template │ │ │ │ │ -1856 inline std::ptrdiff_t SubGraph::EdgeIterator::distanceTo(const │ │ │ │ │ -EdgeIterator & other) const │ │ │ │ │ -1857 { │ │ │ │ │ -1858 return other.edge_-edge_; │ │ │ │ │ -1859 } │ │ │ │ │ -1860 │ │ │ │ │ -1861 template │ │ │ │ │ -1862 SubGraph::VertexIterator::VertexIterator(const SubGraph* graph, │ │ │ │ │ -1863 const VertexDescriptor& current, │ │ │ │ │ -1864 const VertexDescriptor& end) │ │ │ │ │ -1865 : graph_(graph), current_(current), end_(end) │ │ │ │ │ -1866 { │ │ │ │ │ -1867 // Skip excluded vertices │ │ │ │ │ -1868 typedef typename T::const_iterator Iterator; │ │ │ │ │ -1869 │ │ │ │ │ -1870 for(Iterator vertex = graph_->excluded_.begin(); │ │ │ │ │ -1871 current_ != end_ && *vertex; │ │ │ │ │ -1872 ++vertex) │ │ │ │ │ -1873 ++current_; │ │ │ │ │ -1874 assert(current_ == end_ || !graph_->excluded_[current_]); │ │ │ │ │ -1875 } │ │ │ │ │ -1876 │ │ │ │ │ -1877 template │ │ │ │ │ -1878 SubGraph::VertexIterator::VertexIterator(const VertexDescriptor& │ │ │ │ │ -current) │ │ │ │ │ -1879 : current_(current) │ │ │ │ │ -1880 {} │ │ │ │ │ -1881 │ │ │ │ │ -1882 template │ │ │ │ │ -1883 inline typename SubGraph::VertexIterator& SubGraph:: │ │ │ │ │ -VertexIterator::increment() │ │ │ │ │ -1884 { │ │ │ │ │ -1885 ++current_; │ │ │ │ │ -1886 //Skip excluded vertices │ │ │ │ │ -1887 while(current_ != end_ && graph_->excluded_[current_]) │ │ │ │ │ -1888 ++current_; │ │ │ │ │ -1889 │ │ │ │ │ -1890 assert(current_ == end_ || !graph_->excluded_[current_]); │ │ │ │ │ -1891 return *this; │ │ │ │ │ -1892 } │ │ │ │ │ -1893 │ │ │ │ │ -1894 template │ │ │ │ │ -1895 inline bool SubGraph::VertexIterator::equals(const VertexIterator & │ │ │ │ │ -other) const │ │ │ │ │ -1896 { │ │ │ │ │ -1897 return current_==other.current_; │ │ │ │ │ -1898 } │ │ │ │ │ -1899 │ │ │ │ │ -1900 template │ │ │ │ │ -1901 inline const typename G::VertexDescriptor& SubGraph::VertexIterator:: │ │ │ │ │ -dereference() const │ │ │ │ │ -1902 { │ │ │ │ │ -1903 return current_; │ │ │ │ │ -1904 } │ │ │ │ │ -1905 │ │ │ │ │ -1906 template │ │ │ │ │ -1907 inline typename SubGraph::EdgeIterator SubGraph:: │ │ │ │ │ -VertexIterator::begin() const │ │ │ │ │ -1908 { │ │ │ │ │ -1909 return graph_->beginEdges(current_); │ │ │ │ │ -1910 } │ │ │ │ │ -1911 │ │ │ │ │ -1912 template │ │ │ │ │ -1913 inline typename SubGraph::EdgeIterator SubGraph:: │ │ │ │ │ -VertexIterator::end() const │ │ │ │ │ -1914 { │ │ │ │ │ -1915 return graph_->endEdges(current_); │ │ │ │ │ -1916 } │ │ │ │ │ -1917 │ │ │ │ │ -1918 template │ │ │ │ │ -1919 inline typename SubGraph::VertexIterator SubGraph::begin() const │ │ │ │ │ -1920 { │ │ │ │ │ -1921 return VertexIterator(this, 0, endVertex_); │ │ │ │ │ -1922 } │ │ │ │ │ -1923 │ │ │ │ │ -1924 │ │ │ │ │ -1925 template │ │ │ │ │ -1926 inline typename SubGraph::VertexIterator SubGraph::end() const │ │ │ │ │ -1927 { │ │ │ │ │ -1928 return VertexIterator(endVertex_); │ │ │ │ │ -1929 } │ │ │ │ │ -1930 │ │ │ │ │ -1931 │ │ │ │ │ -1932 template │ │ │ │ │ -1933 inline typename SubGraph::EdgeIterator SubGraph::beginEdges │ │ │ │ │ -(const VertexDescriptor& source) const │ │ │ │ │ -1934 { │ │ │ │ │ -1935 return EdgeIterator(source, edges_+start_[source]); │ │ │ │ │ -1936 } │ │ │ │ │ -1937 │ │ │ │ │ -1938 template │ │ │ │ │ -1939 inline typename SubGraph::EdgeIterator SubGraph::endEdges(const │ │ │ │ │ -VertexDescriptor& source) const │ │ │ │ │ -1940 { │ │ │ │ │ -1941 return EdgeIterator(edges_+end_[source]); │ │ │ │ │ -1942 } │ │ │ │ │ -1943 │ │ │ │ │ -1944 template │ │ │ │ │ -1945 std::size_t SubGraph::noVertices() const │ │ │ │ │ -1946 { │ │ │ │ │ -1947 return noVertices_; │ │ │ │ │ -1948 } │ │ │ │ │ -1949 │ │ │ │ │ -1950 template │ │ │ │ │ -1951 inline typename SubGraph::VertexDescriptor SubGraph::maxVertex() │ │ │ │ │ -const │ │ │ │ │ -1952 { │ │ │ │ │ -1953 return maxVertex_; │ │ │ │ │ -1954 } │ │ │ │ │ -1955 │ │ │ │ │ -1956 template │ │ │ │ │ -1957 inline std::size_t SubGraph::noEdges() const │ │ │ │ │ -1958 { │ │ │ │ │ -1959 return noEdges_; │ │ │ │ │ -1960 } │ │ │ │ │ -1961 │ │ │ │ │ -1962 template │ │ │ │ │ -1963 inline typename SubGraph::EdgeDescriptor SubGraph::findEdge │ │ │ │ │ -(const VertexDescriptor& source, │ │ │ │ │ -1964 const VertexDescriptor& target) const │ │ │ │ │ -1965 { │ │ │ │ │ -1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source], │ │ │ │ │ -edges_+end_[source], target); │ │ │ │ │ -1967 if(edge==edges_+end_[source] || *edge!=target) │ │ │ │ │ -1968 return std::numeric_limits::max(); │ │ │ │ │ -1969 │ │ │ │ │ -1970 return edge; │ │ │ │ │ -1971 } │ │ │ │ │ -1972 │ │ │ │ │ -1973 template │ │ │ │ │ -1974 SubGraph::~SubGraph() │ │ │ │ │ -1975 { │ │ │ │ │ -1976 delete[] edges_; │ │ │ │ │ -1977 delete[] end_; │ │ │ │ │ -1978 delete[] start_; │ │ │ │ │ -1979 } │ │ │ │ │ -1980 │ │ │ │ │ -1981 template │ │ │ │ │ -1982 SubGraph::SubGraph(const G& graph, const T& excluded) │ │ │ │ │ -1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_ │ │ │ │ │ -(graph.maxVertex()) │ │ │ │ │ -1984 { │ │ │ │ │ -1985 start_ = new std::ptrdiff_t[graph.noVertices()]; │ │ │ │ │ -1986 end_ = new std::ptrdiff_t[graph.noVertices()]; │ │ │ │ │ -1987 edges_ = new VertexDescriptor[graph.noEdges()]; │ │ │ │ │ -1988 │ │ │ │ │ -1989 VertexDescriptor* edge=edges_; │ │ │ │ │ -1990 │ │ │ │ │ -1991 // Cater for the case that there are no vertices. │ │ │ │ │ -1992 // Otherwise endVertex_ will get 1 below. │ │ │ │ │ -1993 if ( graph.noVertices() == 0) │ │ │ │ │ -1994 return; │ │ │ │ │ -1995 │ │ │ │ │ -1996 typedef typename Graph::ConstVertexIterator Iterator; │ │ │ │ │ -1997 Iterator endVertex=graph.end(); │ │ │ │ │ -1998 │ │ │ │ │ -1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex) │ │ │ │ │ -2000 if(excluded_[*vertex]) │ │ │ │ │ -2001 start_[*vertex]=end_[*vertex]=-1; │ │ │ │ │ -2002 else{ │ │ │ │ │ -2003 ++noVertices_; │ │ │ │ │ -2004 endVertex_ = std::max(*vertex, endVertex_); │ │ │ │ │ -2005 │ │ │ │ │ -2006 start_[*vertex] = edge-edges_; │ │ │ │ │ -2007 │ │ │ │ │ -2008 auto endEdge = vertex.end(); │ │ │ │ │ -2009 │ │ │ │ │ -2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter) │ │ │ │ │ -2011 if(!excluded[iter.target()]) { │ │ │ │ │ -2012 *edge = iter.target(); │ │ │ │ │ -2013 ++edge; │ │ │ │ │ -2014 } │ │ │ │ │ -2015 │ │ │ │ │ -2016 end_[*vertex] = edge - edges_; │ │ │ │ │ -2017 │ │ │ │ │ -2018 // Sort the edges │ │ │ │ │ -2019 std::sort(edges_+start_[*vertex], edge); │ │ │ │ │ -2020 } │ │ │ │ │ -2021 noEdges_ = edge-edges_; │ │ │ │ │ -2022 ++endVertex_; │ │ │ │ │ -2023 } │ │ │ │ │ -2024 │ │ │ │ │ -2025 template │ │ │ │ │ -2026 inline std::size_t VertexPropertiesGraph::noEdges() const │ │ │ │ │ -2027 { │ │ │ │ │ -2028 return graph_.noEdges(); │ │ │ │ │ -2029 } │ │ │ │ │ -2030 │ │ │ │ │ -2031 template │ │ │ │ │ -2032 inline typename VertexPropertiesGraph::EdgeIterator │ │ │ │ │ -2033 VertexPropertiesGraph::beginEdges(const VertexDescriptor& source) │ │ │ │ │ -2034 { │ │ │ │ │ -2035 return graph_.beginEdges(source); │ │ │ │ │ -2036 } │ │ │ │ │ -2037 │ │ │ │ │ -2038 template │ │ │ │ │ -2039 inline typename VertexPropertiesGraph::EdgeIterator │ │ │ │ │ -2040 VertexPropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ -2041 { │ │ │ │ │ -2042 return graph_.endEdges(source); │ │ │ │ │ -2043 } │ │ │ │ │ -2044 │ │ │ │ │ -2045 template │ │ │ │ │ -2046 typename VertexPropertiesGraph::ConstEdgeIterator │ │ │ │ │ -2047 inline VertexPropertiesGraph::beginEdges(const VertexDescriptor& │ │ │ │ │ -source) const │ │ │ │ │ -2048 { │ │ │ │ │ -2049 return graph_.beginEdges(source); │ │ │ │ │ -2050 } │ │ │ │ │ -2051 │ │ │ │ │ -2052 template │ │ │ │ │ -2053 typename VertexPropertiesGraph::ConstEdgeIterator │ │ │ │ │ -2054 VertexPropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ -const │ │ │ │ │ -2055 { │ │ │ │ │ -2056 return graph_.endEdges(source); │ │ │ │ │ -2057 } │ │ │ │ │ -2058 │ │ │ │ │ -2059 template │ │ │ │ │ -2060 template │ │ │ │ │ -2061 VertexPropertiesGraph::VertexIteratorT │ │ │ │ │ -2062 ::VertexIteratorT(const Father& iter, │ │ │ │ │ -2063 C* graph) │ │ │ │ │ -2064 : Father(iter), graph_(graph) │ │ │ │ │ -2065 {} │ │ │ │ │ -2066 │ │ │ │ │ -2067 template │ │ │ │ │ -2068 template │ │ │ │ │ -2069 VertexPropertiesGraph::VertexIteratorT │ │ │ │ │ -2070 ::VertexIteratorT(const Father& iter) │ │ │ │ │ -2071 : Father(iter) │ │ │ │ │ -2072 {} │ │ │ │ │ -2073 │ │ │ │ │ -2074 template │ │ │ │ │ -2075 template │ │ │ │ │ -2076 template │ │ │ │ │ -2077 VertexPropertiesGraph::VertexIteratorT │ │ │ │ │ -2078 ::VertexIteratorT(const VertexIteratorT& other) │ │ │ │ │ -2079 : Father(other), graph_(other.graph_) │ │ │ │ │ -2080 {} │ │ │ │ │ -2081 │ │ │ │ │ -2082 template │ │ │ │ │ -2083 template │ │ │ │ │ -2084 typename std::conditional:: │ │ │ │ │ -type>::value, │ │ │ │ │ -2085 V&, const V&>::type │ │ │ │ │ -2086 inline VertexPropertiesGraph::VertexIteratorT::properties() │ │ │ │ │ -const │ │ │ │ │ -2087 { │ │ │ │ │ -2088 return graph_->getVertexProperties(Father::operator*()); │ │ │ │ │ -2089 } │ │ │ │ │ -2090 │ │ │ │ │ -2091 template │ │ │ │ │ -2092 template │ │ │ │ │ -2093 typename std::conditional:: │ │ │ │ │ -type, │ │ │ │ │ -2094 C>::value, │ │ │ │ │ -2095 typename G::EdgeIterator, │ │ │ │ │ -2096 typename G::ConstEdgeIterator>::type │ │ │ │ │ -2097 inline VertexPropertiesGraph::VertexIteratorT::begin() const │ │ │ │ │ -2098 { │ │ │ │ │ -2099 return graph_->beginEdges(Father::operator*()); │ │ │ │ │ -2100 } │ │ │ │ │ -2101 │ │ │ │ │ -2102 template │ │ │ │ │ -2103 template │ │ │ │ │ -2104 typename std::conditional:: │ │ │ │ │ -type, │ │ │ │ │ -2105 C>::value, │ │ │ │ │ -2106 typename G::EdgeIterator, │ │ │ │ │ -2107 typename G::ConstEdgeIterator>::type │ │ │ │ │ -2108 inline VertexPropertiesGraph::VertexIteratorT::end() const │ │ │ │ │ -2109 { │ │ │ │ │ -2110 return graph_->endEdges(Father::operator*()); │ │ │ │ │ -2111 } │ │ │ │ │ -2112 │ │ │ │ │ -2113 template │ │ │ │ │ -2114 inline typename VertexPropertiesGraph::VertexIterator │ │ │ │ │ -VertexPropertiesGraph::begin() │ │ │ │ │ -2115 { │ │ │ │ │ -2116 return VertexIterator(graph_.begin(), this); │ │ │ │ │ -2117 } │ │ │ │ │ -2118 │ │ │ │ │ -2119 template │ │ │ │ │ -2120 inline typename VertexPropertiesGraph::VertexIterator │ │ │ │ │ -VertexPropertiesGraph::end() │ │ │ │ │ -2121 { │ │ │ │ │ -2122 return VertexIterator(graph_.end()); │ │ │ │ │ -2123 } │ │ │ │ │ -2124 │ │ │ │ │ -2125 │ │ │ │ │ -2126 template │ │ │ │ │ -2127 inline typename VertexPropertiesGraph::ConstVertexIterator │ │ │ │ │ -VertexPropertiesGraph::begin() const │ │ │ │ │ -2128 { │ │ │ │ │ -2129 return ConstVertexIterator(graph_.begin(), this); │ │ │ │ │ -2130 } │ │ │ │ │ -2131 │ │ │ │ │ -2132 template │ │ │ │ │ -2133 inline typename VertexPropertiesGraph::ConstVertexIterator │ │ │ │ │ -VertexPropertiesGraph::end() const │ │ │ │ │ -2134 { │ │ │ │ │ -2135 return ConstVertexIterator(graph_.end()); │ │ │ │ │ -2136 } │ │ │ │ │ -2137 │ │ │ │ │ -2138 template │ │ │ │ │ -2139 inline V& VertexPropertiesGraph::getVertexProperties(const │ │ │ │ │ -VertexDescriptor& vertex) │ │ │ │ │ -2140 { │ │ │ │ │ -2141 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ -2142 } │ │ │ │ │ -2143 │ │ │ │ │ -2144 template │ │ │ │ │ -2145 inline const V& VertexPropertiesGraph::getVertexProperties(const │ │ │ │ │ -VertexDescriptor& vertex) const │ │ │ │ │ -2146 { │ │ │ │ │ -2147 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ -2148 } │ │ │ │ │ -2149 │ │ │ │ │ -2150 template │ │ │ │ │ -2151 inline const G& VertexPropertiesGraph::graph() const │ │ │ │ │ -2152 { │ │ │ │ │ -2153 return graph_; │ │ │ │ │ -2154 } │ │ │ │ │ -2155 │ │ │ │ │ -2156 template │ │ │ │ │ -2157 inline std::size_t VertexPropertiesGraph::noVertices() const │ │ │ │ │ -2158 { │ │ │ │ │ -2159 return graph_.noVertices(); │ │ │ │ │ -2160 } │ │ │ │ │ -2161 │ │ │ │ │ -2162 │ │ │ │ │ -2163 template │ │ │ │ │ -2164 inline typename VertexPropertiesGraph::VertexDescriptor │ │ │ │ │ -VertexPropertiesGraph::maxVertex() const │ │ │ │ │ -2165 { │ │ │ │ │ -2166 return graph_.maxVertex(); │ │ │ │ │ -2167 } │ │ │ │ │ -2168 │ │ │ │ │ -2169 template │ │ │ │ │ -2170 VertexPropertiesGraph::VertexPropertiesGraph(Graph& graph, const │ │ │ │ │ -VM vmap) │ │ │ │ │ -2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex │ │ │ │ │ -()+1], V()) │ │ │ │ │ -2172 {} │ │ │ │ │ -2173 │ │ │ │ │ -2174 template │ │ │ │ │ -2175 template │ │ │ │ │ -2176 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const │ │ │ │ │ -Father& iter, │ │ │ │ │ -2177 C* graph) │ │ │ │ │ -2178 : Father(iter), graph_(graph) │ │ │ │ │ -2179 {} │ │ │ │ │ -2180 │ │ │ │ │ -2181 template │ │ │ │ │ -2182 template │ │ │ │ │ -2183 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const │ │ │ │ │ -Father& iter) │ │ │ │ │ -2184 : Father(iter) │ │ │ │ │ -2185 {} │ │ │ │ │ -2186 │ │ │ │ │ -2187 template │ │ │ │ │ -2188 template │ │ │ │ │ -2189 template │ │ │ │ │ -2190 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const │ │ │ │ │ -EdgeIteratorT& other) │ │ │ │ │ -2191 : Father(other), graph_(other.graph_) │ │ │ │ │ -2192 {} │ │ │ │ │ -2193 │ │ │ │ │ -2194 │ │ │ │ │ -2195 template │ │ │ │ │ -2196 inline std::size_t PropertiesGraph::noEdges() const │ │ │ │ │ -2197 { │ │ │ │ │ -2198 return graph_.noEdges(); │ │ │ │ │ -2199 } │ │ │ │ │ -2200 │ │ │ │ │ -2201 template │ │ │ │ │ -2202 template │ │ │ │ │ -2203 inline typename std::conditional::type>::value,E&,const E&>::type │ │ │ │ │ -2204 PropertiesGraph::EdgeIteratorT::properties() const │ │ │ │ │ -2205 { │ │ │ │ │ -2206 return graph_->getEdgeProperties(Father::operator*()); │ │ │ │ │ -2207 } │ │ │ │ │ -2208 │ │ │ │ │ -2209 template │ │ │ │ │ -2210 inline typename PropertiesGraph::EdgeIterator │ │ │ │ │ -2211 PropertiesGraph::beginEdges(const VertexDescriptor& source) │ │ │ │ │ -2212 { │ │ │ │ │ -2213 return EdgeIterator(graph_.beginEdges(source), this); │ │ │ │ │ -2214 } │ │ │ │ │ -2215 │ │ │ │ │ -2216 template │ │ │ │ │ -2217 inline typename PropertiesGraph::EdgeIterator │ │ │ │ │ -2218 PropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ -2219 { │ │ │ │ │ -2220 return EdgeIterator(graph_.endEdges(source)); │ │ │ │ │ -2221 } │ │ │ │ │ -2222 │ │ │ │ │ -2223 template │ │ │ │ │ -2224 typename PropertiesGraph::ConstEdgeIterator │ │ │ │ │ -2225 inline PropertiesGraph::beginEdges(const VertexDescriptor& │ │ │ │ │ -source) const │ │ │ │ │ -2226 { │ │ │ │ │ -2227 return ConstEdgeIterator(graph_.beginEdges(source), this); │ │ │ │ │ -2228 } │ │ │ │ │ -2229 │ │ │ │ │ -2230 template │ │ │ │ │ -2231 typename PropertiesGraph::ConstEdgeIterator │ │ │ │ │ -2232 PropertiesGraph::endEdges(const VertexDescriptor& source) │ │ │ │ │ -const │ │ │ │ │ -2233 { │ │ │ │ │ -2234 return ConstEdgeIterator(graph_.endEdges(source)); │ │ │ │ │ -2235 } │ │ │ │ │ -2236 │ │ │ │ │ -2237 template │ │ │ │ │ -2238 template │ │ │ │ │ -2239 PropertiesGraph::VertexIteratorT │ │ │ │ │ -2240 ::VertexIteratorT(const Father& iter, │ │ │ │ │ -2241 C* graph) │ │ │ │ │ -2242 : Father(iter), graph_(graph) │ │ │ │ │ -2243 {} │ │ │ │ │ -2244 │ │ │ │ │ -2245 template │ │ │ │ │ -2246 template │ │ │ │ │ -2247 PropertiesGraph::VertexIteratorT │ │ │ │ │ -2248 ::VertexIteratorT(const Father& iter) │ │ │ │ │ -2249 : Father(iter) │ │ │ │ │ -2250 {} │ │ │ │ │ -2251 │ │ │ │ │ -2252 template │ │ │ │ │ -2253 template │ │ │ │ │ -2254 template │ │ │ │ │ -2255 PropertiesGraph::VertexIteratorT │ │ │ │ │ -2256 ::VertexIteratorT(const VertexIteratorT& other) │ │ │ │ │ -2257 : Father(other), graph_(other.graph_) │ │ │ │ │ -2258 {} │ │ │ │ │ -2259 │ │ │ │ │ -2260 template │ │ │ │ │ -2261 template │ │ │ │ │ -2262 inline typename std::conditional::type>::value, │ │ │ │ │ -2263 V&, const V&>::type │ │ │ │ │ -2264 PropertiesGraph::VertexIteratorT::properties() const │ │ │ │ │ -2265 { │ │ │ │ │ -2266 return graph_->getVertexProperties(Father::operator*()); │ │ │ │ │ -2267 } │ │ │ │ │ -2268 │ │ │ │ │ -2269 template │ │ │ │ │ -2270 template │ │ │ │ │ -2271 inline typename PropertiesGraph::template EdgeIteratorT │ │ │ │ │ -2272 PropertiesGraph::VertexIteratorT::begin() const │ │ │ │ │ -2273 { │ │ │ │ │ -2274 return graph_->beginEdges(Father::operator*()); │ │ │ │ │ -2275 } │ │ │ │ │ -2276 │ │ │ │ │ -2277 template │ │ │ │ │ -2278 template │ │ │ │ │ -2279 inline typename PropertiesGraph::template EdgeIteratorT │ │ │ │ │ -2280 PropertiesGraph::VertexIteratorT::end() const │ │ │ │ │ -2281 { │ │ │ │ │ -2282 return graph_->endEdges(Father::operator*()); │ │ │ │ │ -2283 } │ │ │ │ │ -2284 │ │ │ │ │ -2285 template │ │ │ │ │ -2286 inline typename PropertiesGraph::VertexIterator │ │ │ │ │ -PropertiesGraph::begin() │ │ │ │ │ -2287 { │ │ │ │ │ -2288 return VertexIterator(graph_.begin(), this); │ │ │ │ │ -2289 } │ │ │ │ │ -2290 │ │ │ │ │ -2291 template │ │ │ │ │ -2292 inline typename PropertiesGraph::VertexIterator │ │ │ │ │ -PropertiesGraph::end() │ │ │ │ │ -2293 { │ │ │ │ │ -2294 return VertexIterator(graph_.end()); │ │ │ │ │ -2295 } │ │ │ │ │ -2296 │ │ │ │ │ -2297 │ │ │ │ │ -2298 template │ │ │ │ │ -2299 inline typename PropertiesGraph::ConstVertexIterator │ │ │ │ │ -PropertiesGraph::begin() const │ │ │ │ │ -2300 { │ │ │ │ │ -2301 return ConstVertexIterator(graph_.begin(), this); │ │ │ │ │ -2302 } │ │ │ │ │ -2303 │ │ │ │ │ -2304 template │ │ │ │ │ -2305 inline typename PropertiesGraph::ConstVertexIterator │ │ │ │ │ -PropertiesGraph::end() const │ │ │ │ │ -2306 { │ │ │ │ │ -2307 return ConstVertexIterator(graph_.end()); │ │ │ │ │ -2308 } │ │ │ │ │ -2309 │ │ │ │ │ -2310 template │ │ │ │ │ -2311 inline V& PropertiesGraph::getVertexProperties(const │ │ │ │ │ -VertexDescriptor& vertex) │ │ │ │ │ -2312 { │ │ │ │ │ -2313 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ -2314 } │ │ │ │ │ -2315 │ │ │ │ │ -2316 template │ │ │ │ │ -2317 inline const V& PropertiesGraph::getVertexProperties(const │ │ │ │ │ -VertexDescriptor& vertex) const │ │ │ │ │ -2318 { │ │ │ │ │ -2319 return vertexProperties_[vmap_[vertex]]; │ │ │ │ │ -2320 } │ │ │ │ │ -2321 │ │ │ │ │ -2322 template │ │ │ │ │ -2323 inline E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ -EdgeDescriptor& edge) │ │ │ │ │ -2324 { │ │ │ │ │ -2325 return edgeProperties_[emap_[edge]]; │ │ │ │ │ -2326 } │ │ │ │ │ -2327 │ │ │ │ │ -2328 template │ │ │ │ │ -2329 inline const E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ -EdgeDescriptor& edge) const │ │ │ │ │ -2330 { │ │ │ │ │ -2331 return edgeProperties_[emap_[edge]]; │ │ │ │ │ -2332 } │ │ │ │ │ -2333 │ │ │ │ │ -2334 template │ │ │ │ │ -2335 inline E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ -VertexDescriptor& source, │ │ │ │ │ -2336 const VertexDescriptor& target) │ │ │ │ │ -2337 { │ │ │ │ │ -2338 return getEdgeProperties(graph_.findEdge(source,target)); │ │ │ │ │ -2339 } │ │ │ │ │ -2340 │ │ │ │ │ -2341 template │ │ │ │ │ -2342 inline const E& PropertiesGraph::getEdgeProperties(const │ │ │ │ │ -VertexDescriptor& source, │ │ │ │ │ -2343 const VertexDescriptor& target) const │ │ │ │ │ -2344 { │ │ │ │ │ -2345 return getEdgeProperties(graph_.findEdge(source,target)); │ │ │ │ │ -2346 } │ │ │ │ │ -2347 │ │ │ │ │ -2348 template │ │ │ │ │ -2349 inline const G& PropertiesGraph::graph() const │ │ │ │ │ -2350 { │ │ │ │ │ -2351 return graph_; │ │ │ │ │ -2352 } │ │ │ │ │ -2353 │ │ │ │ │ -2354 template │ │ │ │ │ -2355 inline std::size_t PropertiesGraph::noVertices() const │ │ │ │ │ -2356 { │ │ │ │ │ -2357 return graph_.noVertices(); │ │ │ │ │ -2358 } │ │ │ │ │ -2359 │ │ │ │ │ -2360 │ │ │ │ │ -2361 template │ │ │ │ │ -2362 inline typename PropertiesGraph::VertexDescriptor │ │ │ │ │ -PropertiesGraph::maxVertex() const │ │ │ │ │ -2363 { │ │ │ │ │ -2364 return graph_.maxVertex(); │ │ │ │ │ -2365 } │ │ │ │ │ -2366 │ │ │ │ │ -2367 template │ │ │ │ │ -2368 PropertiesGraph::PropertiesGraph(Graph& graph, const VM& │ │ │ │ │ -vmap, const EM& emap) │ │ │ │ │ -2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex │ │ │ │ │ -()+1], V()), │ │ │ │ │ -2370 emap_(emap), edgeProperties_(graph_.noEdges(), E()) │ │ │ │ │ -2371 {} │ │ │ │ │ -2372 │ │ │ │ │ -2373 template │ │ │ │ │ -2374 inline int _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(const G& graph, const typename G:: │ │ │ │ │ -VertexDescriptor& vertex, │ │ │ │ │ -2375 V& visitor) │ │ │ │ │ -2376 { │ │ │ │ │ -2377 typedef typename G::ConstEdgeIterator iterator; │ │ │ │ │ -2378 const iterator end = graph.endEdges(vertex); │ │ │ │ │ -2379 int noNeighbours=0; │ │ │ │ │ -2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge, │ │ │ │ │ -++noNeighbours) │ │ │ │ │ -2381 visitor(edge); │ │ │ │ │ -2382 return noNeighbours; │ │ │ │ │ -2383 } │ │ │ │ │ -2384 │ │ │ │ │ -2385#endif // DOXYGEN │ │ │ │ │ -2386 │ │ │ │ │ -2388 } │ │ │ │ │ -2389} │ │ │ │ │ -2390#endif │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ -int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, │ │ │ │ │ -V &visitor) │ │ │ │ │ -Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +166 // TODO This could be accomplished with one communication, too! │ │ │ │ │ +167 redist._r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(fine, fineRedist); │ │ │ │ │ +168 comm._c_o_p_y_O_w_n_e_r_T_o_A_l_l(fine,fine); │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +171 template │ │ │ │ │ +172 template │ │ │ │ │ +_1_7_3 inline void _T_r_a_n_s_f_e_r_<_V_,_V_1_,_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> >:: │ │ │ │ │ +prolongateVector( │ │ │ │ │ +174 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +175 _V_e_c_t_o_r& coarse, _V_e_c_t_o_r& fine, T3 damp, │ │ │ │ │ +176 [[maybe_unused]] _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm) │ │ │ │ │ +177 { │ │ │ │ │ +178 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r(aggregates, coarse, │ │ │ │ │ +fine, damp); │ │ │ │ │ +179 } │ │ │ │ │ +180 template │ │ │ │ │ +_1_8_1 inline void _T_r_a_n_s_f_e_r_<_V_,_V_1_,_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> >:: │ │ │ │ │ +restrictVector(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ +182 _V_e_c_t_o_r& coarse, const _V_e_c_t_o_r& fine, │ │ │ │ │ +183 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& comm) │ │ │ │ │ +184 { │ │ │ │ │ +185 _T_r_a_n_s_f_e_r_<_V_,_V_1_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_r_e_s_t_r_i_c_t_V_e_c_t_o_r(aggregates, coarse, │ │ │ │ │ +fine, _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ +186 // We need this here to avoid it in the smoothers on the coarse level. │ │ │ │ │ +187 // There (in the preconditioner d is const. │ │ │ │ │ +188 comm._p_r_o_j_e_c_t(coarse); │ │ │ │ │ +189 } │ │ │ │ │ +190#endif │ │ │ │ │ +192 } // namspace Amg │ │ │ │ │ +193} // namspace Dune │ │ │ │ │ +194#endif │ │ │ │ │ +_m_a_t_r_i_x_r_e_d_i_s_t_r_i_b_u_t_e_._h_h │ │ │ │ │ +Functionality for redistributing a sparse matrix. │ │ │ │ │ +_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_p_i_n_f_o_._h_h │ │ │ │ │ +_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ +Provides classes for the Coloring process of AMG. │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -The (undirected) graph of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -MatrixGraph(Matrix &matrix) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d │ │ │ │ │ -VertexIterator end() │ │ │ │ │ -Get an iterator over the vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ -VertexDescriptor maxVertex() const │ │ │ │ │ -Get the maximal vertex descriptor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_M_a_t_r_i_x │ │ │ │ │ -M Matrix │ │ │ │ │ -The type of the matrix we are a graph for. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n │ │ │ │ │ -ConstVertexIterator begin() const │ │ │ │ │ -Get an iterator over the vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator │ │ │ │ │ -The constant vertex iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:308 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_~_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -~MatrixGraph() │ │ │ │ │ -Destructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -std::ptrdiff_t EdgeDescriptor │ │ │ │ │ -The edge descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ -ConstEdgeIterator endEdges(const VertexDescriptor &source) const │ │ │ │ │ -Get an iterator over the edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -M::size_type VertexDescriptor │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_a_t_r_i_x │ │ │ │ │ -const Matrix & matrix() const │ │ │ │ │ -Get the underlying matrix. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_u_t_a_b_l_e_M_a_t_r_i_x │ │ │ │ │ -@ mutableMatrix │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ -ConstEdgeIterator beginEdges(const VertexDescriptor &source) const │ │ │ │ │ -Get an iterator over the edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d │ │ │ │ │ -ConstVertexIterator end() const │ │ │ │ │ -Get an iterator over the vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator │ │ │ │ │ -The constant edge iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:298 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ -EdgeIterator beginEdges(const VertexDescriptor &source) │ │ │ │ │ -Get an iterator over the edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ -std::size_t noVertices() const │ │ │ │ │ -Get the number of vertices in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_f_i_n_d_E_d_g_e │ │ │ │ │ -EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor │ │ │ │ │ -&target) const │ │ │ │ │ -Find the descriptor of an edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_W_e_i_g_h_t │ │ │ │ │ -M::block_type Weight │ │ │ │ │ -The type of the weights. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_M_u_t_a_b_l_e_M_a_t_r_i_x │ │ │ │ │ -std::remove_const< M >::type MutableMatrix │ │ │ │ │ -The mutable type of the matrix we are a graph for. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator │ │ │ │ │ -The mutable edge iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -VertexIteratorT< MatrixGraph< Matrix > > VertexIterator │ │ │ │ │ -The mutable vertex iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:313 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ -EdgeIterator endEdges(const VertexDescriptor &source) │ │ │ │ │ -Get an iterator over the edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ -std::size_t noEdges() const │ │ │ │ │ -Get the number of edges in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_m_a_t_r_i_x │ │ │ │ │ -Matrix & matrix() │ │ │ │ │ -Get the underlying matrix. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_b_e_g_i_n │ │ │ │ │ -VertexIterator begin() │ │ │ │ │ -Get an iterator over the vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -Iterator over all edges starting from a vertex. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_W_e_i_g_h_t_T_y_p_e │ │ │ │ │ -std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >:: │ │ │ │ │ -value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >:: │ │ │ │ │ -type WeightType │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const │ │ │ │ │ -ColIterator &end, const EdgeDescriptor &edge) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_i_s_M_u_t_a_b_l_e │ │ │ │ │ -@ isMutable │ │ │ │ │ -whether C is mutable. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_t_a_r_g_e_t │ │ │ │ │ -VertexDescriptor target() const │ │ │ │ │ -The index of the target vertex of the current edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -EdgeIteratorT< C > & operator++() │ │ │ │ │ -preincrement operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >:: │ │ │ │ │ -type > &other) const │ │ │ │ │ -Inequality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const EdgeIteratorT< const typename std::remove_const< C >:: │ │ │ │ │ -type > &other) const │ │ │ │ │ -Equality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -EdgeIteratorT(const EdgeIteratorT< C1 > &other) │ │ │ │ │ -Copy Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type > │ │ │ │ │ -&other) const │ │ │ │ │ -Inequality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_w_e_i_g_h_t │ │ │ │ │ -WeightType & weight() const │ │ │ │ │ -Access the edge weight. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_s_o_u_r_c_e │ │ │ │ │ -VertexDescriptor source() const │ │ │ │ │ -The index of the source vertex of the current edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -std::conditional< isMutable &&C::mutableMatrix, typenameMatrix::row_type:: │ │ │ │ │ -Iterator, typenameMatrix::row_type::ConstIterator >::type ColIterator │ │ │ │ │ -The column iterator of the matrix we use. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_C_o_n_s_t_C_o_n_t_a_i_n_e_r │ │ │ │ │ -const std::remove_const< C >::type ConstContainer │ │ │ │ │ -The constant type of the container type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type > │ │ │ │ │ -&other) const │ │ │ │ │ -Equality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -EdgeIteratorT(const ColIterator &block) │ │ │ │ │ -Constructor for the end iterator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_W_e_i_g_h_t │ │ │ │ │ -std::conditional< isMutable &&C::mutableMatrix, typenameM::block_type, │ │ │ │ │ -consttypenameM::block_type >::type Weight │ │ │ │ │ -The matrix block type we use as weights. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -const EdgeDescriptor & operator*() const │ │ │ │ │ -Get the edge descriptor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ -const EdgeDescriptor * operator->() const │ │ │ │ │ -Get the edge descriptor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ │ -std::remove_const< C >::type MutableContainer │ │ │ │ │ -The mutable type of the container type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -The vertex iterator type of the graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:209 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_b_e_g_i_n │ │ │ │ │ -EdgeIteratorT< C > begin() const │ │ │ │ │ -Get an iterator over all edges starting at the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -const VertexDescriptor & operator*() const │ │ │ │ │ -Get the descriptor of the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_w_e_i_g_h_t │ │ │ │ │ -WeightType & weight() const │ │ │ │ │ -Access the weight of the vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -VertexIteratorT(C *graph, const VertexDescriptor ¤t) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_W_e_i_g_h_t_T_y_p_e │ │ │ │ │ -std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >:: │ │ │ │ │ -value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >:: │ │ │ │ │ -type WeightType │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -VertexIteratorT(const VertexIteratorT< MutableContainer > &other) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_M_u_t_a_b_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ │ -std::remove_const< C >::type MutableContainer │ │ │ │ │ -The mutable type of the container type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const VertexIteratorT< MutableContainer > &other) const │ │ │ │ │ -Inequality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_i_s_M_u_t_a_b_l_e │ │ │ │ │ -@ isMutable │ │ │ │ │ -whether C is mutable. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const VertexIteratorT< MutableContainer > &other) const │ │ │ │ │ -Equality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_C_o_n_s_t_C_o_n_t_a_i_n_e_r │ │ │ │ │ -const std::remove_const< C >::type ConstContainer │ │ │ │ │ -The constant type of the container type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:218 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -VertexIteratorT< C > & operator++() │ │ │ │ │ -Move to the next vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_e_n_d │ │ │ │ │ -EdgeIteratorT< C > end() const │ │ │ │ │ -Get an iterator over all edges starting at the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const VertexIteratorT< ConstContainer > &other) const │ │ │ │ │ -Equality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const VertexIteratorT< ConstContainer > &other) const │ │ │ │ │ -Inequality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -VertexIteratorT(const VertexDescriptor ¤t) │ │ │ │ │ -Constructor for the end iterator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ -A subgraph of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:443 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_f_i_n_d_E_d_g_e │ │ │ │ │ -EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor │ │ │ │ │ -&target) const │ │ │ │ │ -Find the descriptor of an edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ -VertexDescriptor maxVertex() const │ │ │ │ │ -Get the maximal vertex descriptor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_g_e_t_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -EdgeIndexMap getEdgeIndexMap() │ │ │ │ │ -Get an edge index map for the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ -std::size_t noEdges() const │ │ │ │ │ -Get the number of edges in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ -ConstEdgeIterator endEdges(const VertexDescriptor &source) const │ │ │ │ │ -Get an iterator over the edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_e_n_d │ │ │ │ │ -ConstVertexIterator end() const │ │ │ │ │ -Get an iterator over the vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ -ConstEdgeIterator beginEdges(const VertexDescriptor &source) const │ │ │ │ │ -Get an iterator over the edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ -std::size_t noVertices() const │ │ │ │ │ -Get the number of vertices in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_x_c_l_u_d_e_d │ │ │ │ │ -T Excluded │ │ │ │ │ -Random access container providing information about which vertices are │ │ │ │ │ -excluded. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:454 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_~_S_u_b_G_r_a_p_h │ │ │ │ │ -~SubGraph() │ │ │ │ │ -Destructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -EdgeIterator ConstEdgeIterator │ │ │ │ │ -The constant edge iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:618 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The type of the graph we are a sub graph for. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:448 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -VertexIterator ConstVertexIterator │ │ │ │ │ -The constant vertex iterator type. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:623 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ -SubGraph(const Graph &graph, const T &excluded) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_b_e_g_i_n │ │ │ │ │ -ConstVertexIterator begin() const │ │ │ │ │ -Get an iterator over the vertices. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:459 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -VertexDescriptor * EdgeDescriptor │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -An index map for mapping the edges to indices. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:470 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -EdgeIndexMap(const EdgeIndexMap &emap) │ │ │ │ │ -Protect copy construction. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:479 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -ReadablePropertyMapTag Category │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:472 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -EdgeIndexMap(const EdgeDescriptor &firstEdge) │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:474 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -std::size_t operator[](const EdgeDescriptor &edge) const │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:483 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -The edge iterator of the graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -const EdgeDescriptor & dereference() const │ │ │ │ │ -The descriptor of the current edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -EdgeIterator(const EdgeDescriptor &edge) │ │ │ │ │ -Constructor for the end iterator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const EdgeIterator &other) const │ │ │ │ │ -Equality operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ -EdgeIterator & advance(std::ptrdiff_t n) │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -EdgeIterator & increment() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_t_a_r_g_e_t │ │ │ │ │ -const VertexDescriptor & target() const │ │ │ │ │ -The index of the target vertex of the current edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_s_o_u_r_c_e │ │ │ │ │ -const VertexDescriptor & source() const │ │ │ │ │ -The index of the source vertex of the current edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -EdgeIterator & decrement() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -std::ptrdiff_t distanceTo(const EdgeIterator &other) const │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -The vertex iterator of the graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -VertexIterator(const VertexDescriptor ¤t) │ │ │ │ │ -Constructor for end iterator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -VertexIterator & increment() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -EdgeIterator begin() const │ │ │ │ │ -Get an iterator over all edges starting at the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const VertexIterator &other) const │ │ │ │ │ -Equality iterator. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor ¤t, │ │ │ │ │ -const VertexDescriptor &end) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_e_n_d │ │ │ │ │ -EdgeIterator end() const │ │ │ │ │ -Get an iterator over all edges starting at the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -const VertexDescriptor & dereference() const │ │ │ │ │ -Get the descriptor of the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Attaches properties to the vertices of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:723 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_r_a_p_h │ │ │ │ │ -const Graph & graph() const │ │ │ │ │ -Get the graph the properties are attached to. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Graph::ConstEdgeIterator ConstEdgeIterator │ │ │ │ │ -The type of the constant edge iterator. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:766 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -VertexProperties & getVertexProperties(const VertexDescriptor &vertex) │ │ │ │ │ -Get the properties associated with a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ -std::size_t noEdges() const │ │ │ │ │ -Get the number of edges in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -Graph::EdgeDescriptor EdgeDescriptor │ │ │ │ │ -The edge descritor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:738 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ -ConstEdgeIterator endEdges(const VertexDescriptor &source) const │ │ │ │ │ -Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:733 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The graph we attach properties to. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:728 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_M_a_p │ │ │ │ │ -VM VertexMap │ │ │ │ │ -The type of the map for converting the VertexDescriptor to std::size_t. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:756 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_e_n_d_E_d_g_e_s │ │ │ │ │ -EdgeIterator endEdges(const VertexDescriptor &source) │ │ │ │ │ -Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ -EdgeIterator beginEdges(const VertexDescriptor &source) │ │ │ │ │ -Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -VP VertexProperties │ │ │ │ │ -The type of the properties of the vertices. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:743 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ -std::size_t noVertices() const │ │ │ │ │ -Get the number of vertices in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_b_e_g_i_n_E_d_g_e_s │ │ │ │ │ -ConstEdgeIterator beginEdges(const VertexDescriptor &source) const │ │ │ │ │ -Get the mutable edge iterator over edges starting at a vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ -VertexDescriptor maxVertex() const │ │ │ │ │ -Get the maximal vertex descriptor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Graph::EdgeIterator EdgeIterator │ │ │ │ │ -The type of the mutable edge iterator. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:761 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:803 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ -value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type │ │ │ │ │ -EdgeIterator │ │ │ │ │ -The class of the edge iterator. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:823 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_p_r_o_p_e_r_t_i_e_s │ │ │ │ │ -std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >:: │ │ │ │ │ -value, VertexProperties &, constVertexProperties & >::type properties() const │ │ │ │ │ -Get the properties of the current Vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_e_n_d │ │ │ │ │ -EdgeIterator end() const │ │ │ │ │ -Get an iterator over the edges starting from the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_F_a_t_h_e_r │ │ │ │ │ -std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ -value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >:: │ │ │ │ │ -type Father │ │ │ │ │ -The father class. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:814 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_b_e_g_i_n │ │ │ │ │ -EdgeIterator begin() const │ │ │ │ │ -Get an iterator over the edges starting from the current vertex. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Attaches properties to the edges and vertices of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_V_e_r_t_i_c_e_s │ │ │ │ │ -std::size_t noVertices() const │ │ │ │ │ -Get the number of vertices in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -Graph::EdgeDescriptor EdgeDescriptor │ │ │ │ │ -The edge descritor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:993 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const │ │ │ │ │ -VertexDescriptor &target) const │ │ │ │ │ -Get the properties associated with a edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const │ │ │ │ │ -Get the properties associated with a edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_r_a_p_h │ │ │ │ │ -const Graph & graph() const │ │ │ │ │ -Get the graph the properties are attached to. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_m_a_x_V_e_r_t_e_x │ │ │ │ │ -VertexDescriptor maxVertex() const │ │ │ │ │ -Get the maximal vertex descriptor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The graph we attach properties to. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:983 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_M_a_p │ │ │ │ │ -EM EdgeMap │ │ │ │ │ -The type of the map for converting the EdgeDescriptor to std::size_t. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1030 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_M_a_p │ │ │ │ │ -VM VertexMap │ │ │ │ │ -The type of the map for converting the VertexDescriptor to std::size_t. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1011 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -VP VertexProperties │ │ │ │ │ -The type of the properties of the vertices. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:998 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_n_o_E_d_g_e_s │ │ │ │ │ -std::size_t noEdges() const │ │ │ │ │ -Get the number of edges in the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -EP EdgeProperties │ │ │ │ │ -The type of the properties of the edges;. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1016 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const │ │ │ │ │ -VertexDescriptor &target) │ │ │ │ │ -Get the properties associated with a edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_g_e_t_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) │ │ │ │ │ -Get the properties associated with a edge. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -Graph::VertexDescriptor VertexDescriptor │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:988 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap │ │ │ │ │ -&emap=EdgeMap()) │ │ │ │ │ -Constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1038 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_E_d_g_e_I_t_e_r_a_t_o_r_T_:_:_F_a_t_h_e_r │ │ │ │ │ -std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ -value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type │ │ │ │ │ -Father │ │ │ │ │ -The father class. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1050 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1140 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_T_:_:_F_a_t_h_e_r │ │ │ │ │ -std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >:: │ │ │ │ │ -value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >:: │ │ │ │ │ -type Father │ │ │ │ │ -The father class. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1151 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -Wrapper to access the internal edge properties of a graph via operator[]() │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1361 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -GraphVertexPropertiesSelector(G &g) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1380 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -VertexProperties & operator[](const Vertex &vertex) const │ │ │ │ │ -Get the properties associated to a vertex. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1395 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The type of the graph with internal properties. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1366 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -G::VertexProperties VertexProperties │ │ │ │ │ -The type of the vertex properties. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1370 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -GraphVertexPropertiesSelector() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1386 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_V_e_r_t_e_x │ │ │ │ │ -G::VertexDescriptor Vertex │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1374 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -Wrapper to access the internal vertex properties of a graph via operator[]() │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1409 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -EdgeProperties & operator[](const Edge &edge) const │ │ │ │ │ -Get the properties associated to a vertex. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1442 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -G::EdgeProperties EdgeProperties │ │ │ │ │ -The type of the vertex properties. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1418 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_E_d_g_e │ │ │ │ │ -G::EdgeDescriptor Edge │ │ │ │ │ -The edge descriptor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1422 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -GraphEdgePropertiesSelector() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1434 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The type of the graph with internal properties. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1414 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r_:_:_G_r_a_p_h_E_d_g_e_P_r_o_p_e_r_t_i_e_s_S_e_l_e_c_t_o_r │ │ │ │ │ -GraphEdgePropertiesSelector(G &g) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:1428 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ +void redistributeBackward(D &from, const D &to) const │ │ │ │ │ +DDeeffiinniittiioonn matrixredistribute.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_p_r_o_j_e_c_t │ │ │ │ │ +void project(T1 &x) const │ │ │ │ │ +Set vector to zero at copy dofs. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:538 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ +void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ +Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_:_:_r_e_s_t_r_i_c_t_V_e_c_t_o_r │ │ │ │ │ +static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector │ │ │ │ │ +&coarse, const Vector &fine, T &comm) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r │ │ │ │ │ +static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector │ │ │ │ │ +&coarse, Vector &fine, T1 damp) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r │ │ │ │ │ +static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector │ │ │ │ │ +&coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R()) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_:_:_V_e_r_t_e_x │ │ │ │ │ +V1 Vertex │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_:_:_V_e_c_t_o_r │ │ │ │ │ +V2 Vector │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_R_e_d_i_s_t │ │ │ │ │ +RedistributeInformation< SequentialInformation > Redist │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ +V Vertex │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_V_e_c_t_o_r │ │ │ │ │ +V1 Vector │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r │ │ │ │ │ +static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector │ │ │ │ │ +&coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation │ │ │ │ │ +&comm=SequentialInformation(), const Redist &redist=Redist()) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_p_r_o_l_o_n_g_a_t_e_V_e_c_t_o_r │ │ │ │ │ +static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector │ │ │ │ │ +&coarse, Vector &fine, T1 damp, const SequentialInformation │ │ │ │ │ +&comm=SequentialInformation()) │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ +V Vertex │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_:_R_e_d_i_s_t │ │ │ │ │ +RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_T_r_a_n_s_f_e_r_<_ _V_,_ _V_1_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _>_ _>_:_:_V_e_c_t_o_r │ │ │ │ │ +V1 Vector │ │ │ │ │ +DDeeffiinniittiioonn transfer.hh:79 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00113.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: galerkin.hh File Reference │ │ │ │ +dune-istl: amg.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,67 +71,72 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides a class for building the galerkin product based on a aggregation scheme. │ │ │ │ +

The AMG preconditioner. │ │ │ │ More...

│ │ │ │ -
#include "aggregates.hh"
│ │ │ │ -#include "pinfo.hh"
│ │ │ │ -#include <dune/common/poolallocator.hh>
│ │ │ │ -#include <dune/common/enumset.hh>
│ │ │ │ -#include <set>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <algorithm>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <sstream>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/istl/paamg/smoother.hh>
│ │ │ │ +#include <dune/istl/paamg/transfer.hh>
│ │ │ │ +#include <dune/istl/paamg/matrixhierarchy.hh>
│ │ │ │ +#include <dune/istl/solvers.hh>
│ │ │ │ +#include <dune/istl/scalarproducts.hh>
│ │ │ │ +#include <dune/istl/superlu.hh>
│ │ │ │ +#include <dune/istl/umfpack.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include <dune/common/parametertree.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::OverlapVertex< T >
class  Dune::Amg::AMG< M, X, S, PI, A >
 Parallel algebraic multigrid based on agglomeration. More...
 
class  Dune::Amg::SparsityBuilder< M >
 Functor for building the sparsity pattern of the matrix using examineConnectivity. More...
struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >
 
class  Dune::Amg::BaseGalerkinProduct
struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, SolverType >
 
class  Dune::Amg::GalerkinProduct< T >
struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, superlu >
 
class  Dune::Amg::GalerkinProduct< SequentialInformation >
struct  Dune::AMGCreator
 
struct  Dune::Amg::BaseConnectivityConstructor
struct  Dune::AMGCreator::isValidBlockType< class >
 
class  Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder< G, S, V >
 Visitor for identifying connected aggregates during a breadthFirstSearch. More...
 
struct  Dune::Amg::ConnectivityConstructor< G, T >
 
struct  Dune::Amg::ConnectivityConstructor< G, SequentialInformation >
 
struct  Dune::Amg::DirichletBoundarySetter< T >
 
struct  Dune::Amg::DirichletBoundarySetter< SequentialInformation >
struct  Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

 Dune::DUNE_REGISTER_PRECONDITIONER ("amg", AMGCreator())
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides a class for building the galerkin product based on a aggregation scheme.

│ │ │ │ +

The AMG preconditioner.

│ │ │ │
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,60 +1,60 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -galerkin.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 │ │ │ │ │ +amg.hh File Reference │ │ │ │ │ _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ » _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides a class for building the galerkin product based on a aggregation │ │ │ │ │ -scheme. _M_o_r_e_._._. │ │ │ │ │ -#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ -#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +The AMG preconditioner. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#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_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_<_ _T_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_A_m_g_:_:_A_M_G_<_ _M_,_ _X_,_ _S_,_ _P_I_,_ _A_ _> │ │ │ │ │ +  Parallel algebraic multigrid based on agglomeration. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_ _M_ _> │ │ │ │ │ -  Functor for building the sparsity pattern of the matrix using │ │ │ │ │ - examineConnectivity. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_<_ _M_a_t_r_i_x_,_ _V_e_c_t_o_r_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_<_ _M_a_t_r_i_x_,_ _V_e_c_t_o_r_ _>_:_:_S_o_l_v_e_r_<_ _M_, │ │ │ │ │ + _S_o_l_v_e_r_T_y_p_e_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_ _T_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_<_ _M_a_t_r_i_x_,_ _V_e_c_t_o_r_ _>_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u │ │ │ │ │ + _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ +struct   _D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e_<_ _c_l_a_s_s_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_ _G_,_ _S_,_ _V_ _> │ │ │ │ │ -  Visitor for identifying connected aggregates during a │ │ │ │ │ - breadthFirstSearch. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_ _G_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_ _G_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_<_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("amg", _A_M_G_C_r_e_a_t_o_r()) │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides a class for building the galerkin product based on a aggregation │ │ │ │ │ -scheme. │ │ │ │ │ +The AMG preconditioner. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: galerkin.hh Source File │ │ │ │ +dune-istl: amg.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,738 +74,1278 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
galerkin.hh
│ │ │ │ +
amg.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_GALERKIN_HH
│ │ │ │ -
6#define DUNE_GALERKIN_HH
│ │ │ │ +
5#ifndef DUNE_AMG_AMG_HH
│ │ │ │ +
6#define DUNE_AMG_AMG_HH
│ │ │ │
7
│ │ │ │ -
8#include "aggregates.hh"
│ │ │ │ -
9#include "pinfo.hh"
│ │ │ │ -
10#include <dune/common/poolallocator.hh>
│ │ │ │ -
11#include <dune/common/enumset.hh>
│ │ │ │ -
12#include <set>
│ │ │ │ -
13#include <limits>
│ │ │ │ -
14#include <algorithm>
│ │ │ │ -
15
│ │ │ │ -
16namespace Dune
│ │ │ │ -
17{
│ │ │ │ -
18 namespace Amg
│ │ │ │ -
19 {
│ │ │ │ -
31 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
33 {
│ │ │ │ -
37 typedef T Aggregate;
│ │ │ │ -
38
│ │ │ │ -
42 typedef T Vertex;
│ │ │ │ -
43
│ │ │ │ - │ │ │ │ +
8#include <memory>
│ │ │ │ +
9#include <sstream>
│ │ │ │ +
10#include <dune/common/exceptions.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
14#include <dune/istl/solvers.hh>
│ │ │ │ + │ │ │ │ +
16#include <dune/istl/superlu.hh>
│ │ │ │ +
17#include <dune/istl/umfpack.hh>
│ │ │ │ + │ │ │ │ +
19#include <dune/common/typetraits.hh>
│ │ │ │ +
20#include <dune/common/exceptions.hh>
│ │ │ │ +
21#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
22#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
23#include <dune/common/parametertree.hh>
│ │ │ │ +
24
│ │ │ │ +
25namespace Dune
│ │ │ │ +
26{
│ │ │ │ +
27 namespace Amg
│ │ │ │ +
28 {
│ │ │ │ +
46 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ +
47 class KAMG;
│ │ │ │
48
│ │ │ │ - │ │ │ │ -
53 };
│ │ │ │ -
│ │ │ │ -
54
│ │ │ │ -
55
│ │ │ │ -
56
│ │ │ │ -
61 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
63 {
│ │ │ │ -
64 public:
│ │ │ │ -
70 SparsityBuilder(M& matrix);
│ │ │ │ -
71
│ │ │ │ -
72 void insert(const typename M::size_type& index);
│ │ │ │ -
73
│ │ │ │ -
74 void operator++();
│ │ │ │ -
75
│ │ │ │ -
76 std::size_t minRowSize();
│ │ │ │ -
77
│ │ │ │ -
78 std::size_t maxRowSize();
│ │ │ │ -
79
│ │ │ │ -
80 std::size_t sumRowSize();
│ │ │ │ -
│ │ │ │ -
81 std::size_t index()
│ │ │ │ -
82 {
│ │ │ │ -
83 return row_.index();
│ │ │ │ -
84 }
│ │ │ │ -
│ │ │ │ -
85 private:
│ │ │ │ -
87 typename M::CreateIterator row_;
│ │ │ │ -
89 std::size_t minRowSize_;
│ │ │ │ -
91 std::size_t maxRowSize_;
│ │ │ │ -
92 std::size_t sumRowSize_;
│ │ │ │ -
93#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
94 bool diagonalInserted;
│ │ │ │ -
95#endif
│ │ │ │ -
96 };
│ │ │ │ -
│ │ │ │ -
97
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
99 {
│ │ │ │ -
100 public:
│ │ │ │ -
109 template<class M, class V, class I, class O>
│ │ │ │ -
110 void calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
│ │ │ │ -
111 const I& pinfo, const O& copy);
│ │ │ │ -
112
│ │ │ │ -
113 };
│ │ │ │ -
│ │ │ │ -
114
│ │ │ │ -
115 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 : public BaseGalerkinProduct
│ │ │ │ -
118 {
│ │ │ │ -
119 public:
│ │ │ │ - │ │ │ │ -
121
│ │ │ │ -
131 template<class G, class V, class Set>
│ │ │ │ -
132 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
│ │ │ │ -
133 const ParallelInformation& pinfo,
│ │ │ │ - │ │ │ │ -
135 const typename G::Matrix::size_type& size,
│ │ │ │ -
136 const Set& copy);
│ │ │ │ -
137 private:
│ │ │ │ -
138
│ │ │ │ -
145 template<class G, class I, class Set>
│ │ │ │ - │ │ │ │ -
147 buildOverlapVertices(const G& graph, const I& pinfo,
│ │ │ │ - │ │ │ │ -
149 const Set& overlap,
│ │ │ │ -
150 std::size_t& overlapCount);
│ │ │ │ -
151
│ │ │ │ -
152 template<class A>
│ │ │ │ -
153 struct OVLess
│ │ │ │ -
154 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 {
│ │ │ │ -
157 return *o1.aggregate < *o2.aggregate;
│ │ │ │ -
158 }
│ │ │ │ -
│ │ │ │ -
159 };
│ │ │ │ -
160 };
│ │ │ │ -
│ │ │ │ -
161
│ │ │ │ -
162 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
164 : public BaseGalerkinProduct
│ │ │ │ -
165 {
│ │ │ │ -
166 public:
│ │ │ │ -
176 template<class G, class V, class Set>
│ │ │ │ -
177 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
│ │ │ │ -
178 const SequentialInformation& pinfo,
│ │ │ │ - │ │ │ │ -
180 const typename G::Matrix::size_type& size,
│ │ │ │ -
181 const Set& copy);
│ │ │ │ -
182 };
│ │ │ │ -
│ │ │ │ -
183
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
185 {
│ │ │ │ -
186 template<class R, class G, class V>
│ │ │ │ -
187 static void constructOverlapConnectivity(R& row, G& graph, V& visitedMap,
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
191
│ │ │ │ -
195 template<class R, class G, class V>
│ │ │ │ -
196 static void constructNonOverlapConnectivity(R& row, G& graph, V& visitedMap,
│ │ │ │ - │ │ │ │ -
198 const typename G::VertexDescriptor& seed);
│ │ │ │ -
199
│ │ │ │ -
200
│ │ │ │ -
204 template<class G, class S, class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
206 {
│ │ │ │ -
207 public:
│ │ │ │ -
211 typedef G Graph;
│ │ │ │ -
215 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
│ │ │ │ -
216
│ │ │ │ -
220 typedef S Set;
│ │ │ │ -
221
│ │ │ │ -
225 typedef V VisitedMap;
│ │ │ │ -
226
│ │ │ │ -
230 typedef typename Graph::VertexDescriptor Vertex;
│ │ │ │ +
49 template<class T>
│ │ │ │ +
50 class KAmgTwoGrid;
│ │ │ │ +
51
│ │ │ │ +
62 template<class M, class X, class S, class PI=SequentialInformation,
│ │ │ │ +
63 class A=std::allocator<X> >
│ │ │ │ +
│ │ │ │ +
64 class AMG : public Preconditioner<X,X>
│ │ │ │ +
65 {
│ │ │ │ +
66 template<class M1, class X1, class S1, class P1, class K1, class A1>
│ │ │ │ +
67 friend class KAMG;
│ │ │ │ +
68
│ │ │ │ +
69 friend class KAmgTwoGrid<AMG>;
│ │ │ │ +
70
│ │ │ │ +
71 public:
│ │ │ │ +
73 typedef M Operator;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
85
│ │ │ │ +
87 typedef X Domain;
│ │ │ │ +
89 typedef X Range;
│ │ │ │ + │ │ │ │ +
97 typedef S Smoother;
│ │ │ │ +
98
│ │ │ │ + │ │ │ │ +
101
│ │ │ │ +
│ │ │ │ +
111 AMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
│ │ │ │ +
112 const SmootherArgs& smootherArgs, const Parameters& parms);
│ │ │ │ +
113
│ │ │ │ +
125 template<class C>
│ │ │ │ +
│ │ │ │ +
126 AMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ +
127 const SmootherArgs& smootherArgs=SmootherArgs(),
│ │ │ │ + │ │ │ │ +
129
│ │ │ │ +
│ │ │ │ +
180 AMG(std::shared_ptr<const Operator> fineOperator, const ParameterTree& configuration, const ParallelInformation& pinfo=ParallelInformation());
│ │ │ │ +
181
│ │ │ │ +
│ │ │ │ +
185 AMG(const AMG& amg);
│ │ │ │ +
186
│ │ │ │ +
│ │ │ │ +
188 void pre(Domain& x, Range& b);
│ │ │ │ +
189
│ │ │ │ +
│ │ │ │ +
191 void apply(Domain& v, const Range& d);
│ │ │ │ +
192
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
195 {
│ │ │ │ +
196 return category_;
│ │ │ │ +
197 }
│ │ │ │ +
│ │ │ │ +
198
│ │ │ │ +
│ │ │ │ +
200 void post(Domain& x);
│ │ │ │ +
201
│ │ │ │ +
206 template<class A1>
│ │ │ │ +
│ │ │ │ +
207 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
│ │ │ │ +
208
│ │ │ │ +
│ │ │ │ +
209 std::size_t levels();
│ │ │ │ +
210
│ │ │ │ +
│ │ │ │ +
211 std::size_t maxlevels();
│ │ │ │ +
212
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
222 {
│ │ │ │ +
223 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
│ │ │ │ +
224 }
│ │ │ │ +
│ │ │ │ +
225
│ │ │ │ +
│ │ │ │ + │ │ │ │
231
│ │ │ │ -
239 ConnectedBuilder(const AggregatesMap<Vertex>& aggregates, Graph& graph,
│ │ │ │ -
240 VisitedMap& visitedMap, Set& connected);
│ │ │ │ -
241
│ │ │ │ -
246 void operator()(const ConstEdgeIterator& edge);
│ │ │ │ -
247
│ │ │ │ -
248 private:
│ │ │ │ -
252 const AggregatesMap<Vertex>& aggregates_;
│ │ │ │ -
253
│ │ │ │ -
254 Graph& graph_;
│ │ │ │ -
255
│ │ │ │ -
259 VisitedMap& visitedMap_;
│ │ │ │ -
260
│ │ │ │ -
264 Set& connected_;
│ │ │ │ -
265 };
│ │ │ │ -
│ │ │ │ -
266
│ │ │ │ -
267 };
│ │ │ │ -
│ │ │ │ -
268
│ │ │ │ -
269 template<class G, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
271 {
│ │ │ │ -
272 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
273
│ │ │ │ -
274 template<class V, class O, class R>
│ │ │ │ -
275 static void examine(G& graph,
│ │ │ │ -
276 V& visitedMap,
│ │ │ │ -
277 const T& pinfo,
│ │ │ │ -
278 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
279 const O& overlap,
│ │ │ │ -
280 const OverlapVertex<Vertex>* overlapVertices,
│ │ │ │ -
281 const OverlapVertex<Vertex>* overlapEnd,
│ │ │ │ -
282 R& row);
│ │ │ │ -
283 };
│ │ │ │ -
│ │ │ │ -
284
│ │ │ │ -
285 template<class G>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
287 {
│ │ │ │ -
288 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
289
│ │ │ │ -
290 template<class V, class R>
│ │ │ │ -
291 static void examine(G& graph,
│ │ │ │ -
292 V& visitedMap,
│ │ │ │ -
293 const SequentialInformation& pinfo,
│ │ │ │ -
294 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
295 R& row);
│ │ │ │ -
296 };
│ │ │ │ -
│ │ │ │ -
297
│ │ │ │ -
298 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
300 {
│ │ │ │ -
301 template<class M, class O>
│ │ │ │ -
302 static void set(M& coarse, const T& pinfo, const O& copy);
│ │ │ │ -
303 };
│ │ │ │ -
│ │ │ │ -
304
│ │ │ │ -
305 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
307 {
│ │ │ │ -
308 template<class M, class O>
│ │ │ │ -
309 static void set(M& coarse, const SequentialInformation& pinfo, const O& copy);
│ │ │ │ -
310 };
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
312 template<class R, class G, class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
315 const typename G::VertexDescriptor& seed)
│ │ │ │ -
316 {
│ │ │ │ -
317 assert(row.index()==aggregates[seed]);
│ │ │ │ -
318 row.insert(aggregates[seed]);
│ │ │ │ -
319 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
│ │ │ │ -
320 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
321 typedef std::allocator<Vertex> Allocator;
│ │ │ │ -
322 typedef SLList<Vertex,Allocator> VertexList;
│ │ │ │ -
323 typedef typename AggregatesMap<Vertex>::DummyEdgeVisitor DummyVisitor;
│ │ │ │ -
324 VertexList vlist;
│ │ │ │ -
325 DummyVisitor dummy;
│ │ │ │ -
326 aggregates.template breadthFirstSearch<true,false>(seed,aggregates[seed], graph, vlist, dummy,
│ │ │ │ -
327 conBuilder, visitedMap);
│ │ │ │ -
328 }
│ │ │ │ -
│ │ │ │ -
329
│ │ │ │ -
330 template<class R, class G, class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
335 {
│ │ │ │ -
336 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
│ │ │ │ -
337 const typename G::VertexDescriptor aggregate=*seed->aggregate;
│ │ │ │ -
338
│ │ │ │ -
339 if (row.index()==*seed->aggregate) {
│ │ │ │ -
340 while(seed != overlapEnd && aggregate == *seed->aggregate) {
│ │ │ │ -
341 row.insert(*seed->aggregate);
│ │ │ │ -
342 // Walk over all neighbours and add them to the connected array.
│ │ │ │ -
343 visitNeighbours(graph, seed->vertex, conBuilder);
│ │ │ │ -
344 // Mark vertex as visited
│ │ │ │ -
345 put(visitedMap, seed->vertex, true);
│ │ │ │ -
346 ++seed;
│ │ │ │ -
347 }
│ │ │ │ -
348 }
│ │ │ │ -
349 }
│ │ │ │ -
│ │ │ │ -
350
│ │ │ │ -
351 template<class G, class S, class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
353 Graph& graph, VisitedMap& visitedMap,
│ │ │ │ -
354 Set& connected)
│ │ │ │ -
355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap), connected_(connected)
│ │ │ │ -
356 {}
│ │ │ │ -
│ │ │ │ -
357
│ │ │ │ -
358 template<class G, class S, class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
360 {
│ │ │ │ -
361 const Vertex& vertex = aggregates_[edge.target()];
│ │ │ │ - │ │ │ │ - │ │ │ │ -
364 connected_.insert(vertex);
│ │ │ │ -
365 }
│ │ │ │ -
│ │ │ │ -
366
│ │ │ │ -
367 template<class T>
│ │ │ │ -
368 template<class G, class I, class Set>
│ │ │ │ - │ │ │ │ -
370 GalerkinProduct<T>::buildOverlapVertices(const G& graph, const I& pinfo,
│ │ │ │ - │ │ │ │ -
372 const Set& overlap,
│ │ │ │ -
373 std::size_t& overlapCount)
│ │ │ │ -
374 {
│ │ │ │ -
375 // count the overlap vertices.
│ │ │ │ -
376 typedef typename G::ConstVertexIterator ConstIterator;
│ │ │ │ -
377 typedef typename I::GlobalLookupIndexSet GlobalLookup;
│ │ │ │ -
378 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ -
379
│ │ │ │ -
380 const ConstIterator end = graph.end();
│ │ │ │ -
381 overlapCount = 0;
│ │ │ │ -
382
│ │ │ │ -
383 const GlobalLookup& lookup=pinfo.globalLookup();
│ │ │ │ -
384
│ │ │ │ -
385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
│ │ │ │ -
386 const IndexPair* pair = lookup.pair(*vertex);
│ │ │ │ -
387
│ │ │ │ -
388 if(pair!=0 && overlap.contains(pair->local().attribute()))
│ │ │ │ -
389 ++overlapCount;
│ │ │ │ -
390 }
│ │ │ │ -
391 // Allocate space
│ │ │ │ -
392 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
393
│ │ │ │ -
394 OverlapVertex<Vertex>* overlapVertices = new OverlapVertex<Vertex>[overlapCount=0 ? 1 : overlapCount];
│ │ │ │ -
395 if(overlapCount==0)
│ │ │ │ -
396 return overlapVertices;
│ │ │ │ -
397
│ │ │ │ -
398 // Initialize them
│ │ │ │ -
399 overlapCount=0;
│ │ │ │ -
400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
│ │ │ │ -
401 const IndexPair* pair = lookup.pair(*vertex);
│ │ │ │ -
402
│ │ │ │ -
403 if(pair!=0 && overlap.contains(pair->local().attribute())) {
│ │ │ │ -
404 overlapVertices[overlapCount].aggregate = &aggregates[pair->local()];
│ │ │ │ -
405 overlapVertices[overlapCount].vertex = pair->local();
│ │ │ │ -
406 ++overlapCount;
│ │ │ │ -
407 }
│ │ │ │ -
408 }
│ │ │ │ -
409
│ │ │ │ -
410 dverb << overlapCount<<" overlap vertices"<<std::endl;
│ │ │ │ -
411
│ │ │ │ -
412 std::sort(overlapVertices, overlapVertices+overlapCount, OVLess<Vertex>());
│ │ │ │ -
413 // due to the sorting the isolated aggregates (to be skipped) are at the end.
│ │ │ │ -
414
│ │ │ │ -
415 return overlapVertices;
│ │ │ │ -
416 }
│ │ │ │ -
417
│ │ │ │ -
418 template<class G, class T>
│ │ │ │ -
419 template<class V, class O, class R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
421 V& visitedMap,
│ │ │ │ -
422 const T& pinfo,
│ │ │ │ -
423 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
424 const O& overlap,
│ │ │ │ -
425 const OverlapVertex<Vertex>* overlapVertices,
│ │ │ │ -
426 const OverlapVertex<Vertex>* overlapEnd,
│ │ │ │ -
427 R& row)
│ │ │ │ -
428 {
│ │ │ │ -
429 typedef typename T::GlobalLookupIndexSet GlobalLookup;
│ │ │ │ -
430 const GlobalLookup& lookup = pinfo.globalLookup();
│ │ │ │ -
431
│ │ │ │ -
432 typedef typename G::VertexIterator VertexIterator;
│ │ │ │ -
433
│ │ │ │ -
434 VertexIterator vend=graph.end();
│ │ │ │ -
435
│ │ │ │ -
436#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
437 std::set<Vertex> examined;
│ │ │ │ -
438#endif
│ │ │ │ -
439
│ │ │ │ -
440 // The aggregates owned by the process have lower local indices
│ │ │ │ -
441 // then those not owned. We process them in the first pass.
│ │ │ │ -
442 // They represent the rows 0, 1, ..., n of the coarse matrix
│ │ │ │ -
443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex)
│ │ │ │ -
444 if(!get(visitedMap, *vertex)) {
│ │ │ │ -
445 // In the first pass we only process owner nodes
│ │ │ │ -
446 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ -
447 const IndexPair* pair = lookup.pair(*vertex);
│ │ │ │ -
448 if(pair==0 || !overlap.contains(pair->local().attribute())) {
│ │ │ │ -
449#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
450 assert(examined.find(aggregates[*vertex])==examined.end());
│ │ │ │ -
451 examined.insert(aggregates[*vertex]);
│ │ │ │ -
452#endif
│ │ │ │ -
453 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
│ │ │ │ -
454
│ │ │ │ -
455 // only needed for ALU
│ │ │ │ -
456 // (ghosts with same global id as owners on the same process)
│ │ │ │ -
457 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping)) {
│ │ │ │ -
458 if(overlapVertices != overlapEnd) {
│ │ │ │ -
459 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
│ │ │ │ -
460 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
│ │ │ │ -
461 }
│ │ │ │ -
462 else{
│ │ │ │ -
463 ++overlapVertices;
│ │ │ │ -
464 }
│ │ │ │ -
465 }
│ │ │ │ -
466 }
│ │ │ │ -
467 ++row;
│ │ │ │ -
468 }
│ │ │ │ -
469 }
│ │ │ │ -
470
│ │ │ │ -
471 dvverb<<"constructed "<<row.index()<<" non-overlapping rows"<<std::endl;
│ │ │ │ -
472
│ │ │ │ -
473 // Now come the aggregates not owned by use.
│ │ │ │ -
474 // They represent the rows n+1, ..., N
│ │ │ │ -
475 while(overlapVertices != overlapEnd)
│ │ │ │ -
476 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
│ │ │ │ -
477
│ │ │ │ -
478#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
479 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ -
480 const IndexPair* pair = lookup.pair(overlapVertices->vertex);
│ │ │ │ -
481 assert(pair!=0 && overlap.contains(pair->local().attribute()));
│ │ │ │ -
482 assert(examined.find(aggregates[overlapVertices->vertex])==examined.end());
│ │ │ │ -
483 examined.insert(aggregates[overlapVertices->vertex]);
│ │ │ │ -
484#endif
│ │ │ │ -
485 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
│ │ │ │ -
486 ++row;
│ │ │ │ -
487 }else{
│ │ │ │ -
488 ++overlapVertices;
│ │ │ │ -
489 }
│ │ │ │ -
490 }
│ │ │ │ -
│ │ │ │ -
491
│ │ │ │ -
492 template<class G>
│ │ │ │ -
493 template<class V, class R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
495 V& visitedMap,
│ │ │ │ -
496 [[maybe_unused]] const SequentialInformation& pinfo,
│ │ │ │ -
497 const AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
498 R& row)
│ │ │ │ -
499 {
│ │ │ │ -
500 typedef typename G::VertexIterator VertexIterator;
│ │ │ │ -
501
│ │ │ │ -
502 VertexIterator vend=graph.end();
│ │ │ │ -
503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) {
│ │ │ │ -
504 if(!get(visitedMap, *vertex)) {
│ │ │ │ -
505 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
│ │ │ │ -
506 ++row;
│ │ │ │ -
507 }
│ │ │ │ -
508 }
│ │ │ │ -
509
│ │ │ │ -
510 }
│ │ │ │ -
│ │ │ │ -
511
│ │ │ │ -
512 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
514 : row_(matrix.createbegin()),
│ │ │ │ -
515 minRowSize_(std::numeric_limits<std::size_t>::max()),
│ │ │ │ -
516 maxRowSize_(0), sumRowSize_(0)
│ │ │ │ -
517 {
│ │ │ │ -
518#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
519 diagonalInserted = false;
│ │ │ │ -
520#endif
│ │ │ │ -
521 }
│ │ │ │ -
│ │ │ │ -
522 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
524 {
│ │ │ │ -
525 return maxRowSize_;
│ │ │ │ -
526 }
│ │ │ │ -
│ │ │ │ -
527 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
529 {
│ │ │ │ -
530 return minRowSize_;
│ │ │ │ -
531 }
│ │ │ │ -
│ │ │ │ -
532
│ │ │ │ -
533 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
535 {
│ │ │ │ -
536 return sumRowSize_;
│ │ │ │ -
537 }
│ │ │ │ -
│ │ │ │ -
538 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
540 {
│ │ │ │ -
541 sumRowSize_ += row_.size();
│ │ │ │ -
542 minRowSize_=std::min(minRowSize_, row_.size());
│ │ │ │ -
543 maxRowSize_=std::max(maxRowSize_, row_.size());
│ │ │ │ -
544 ++row_;
│ │ │ │ -
545#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
546 assert(diagonalInserted);
│ │ │ │ -
547 diagonalInserted = false;
│ │ │ │ -
548#endif
│ │ │ │ -
549 }
│ │ │ │ -
│ │ │ │ -
550
│ │ │ │ -
551 template<class M>
│ │ │ │ -
│ │ │ │ -
552 void SparsityBuilder<M>::insert(const typename M::size_type& index)
│ │ │ │ -
553 {
│ │ │ │ -
554 row_.insert(index);
│ │ │ │ -
555#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
556 diagonalInserted = diagonalInserted || row_.index()==index;
│ │ │ │ -
557#endif
│ │ │ │ -
558 }
│ │ │ │ -
│ │ │ │ -
559
│ │ │ │ -
560 template<class T>
│ │ │ │ -
561 template<class G, class V, class Set>
│ │ │ │ -
562 typename G::MutableMatrix*
│ │ │ │ -
│ │ │ │ -
563 GalerkinProduct<T>::build(G& fineGraph, V& visitedMap,
│ │ │ │ -
564 const ParallelInformation& pinfo,
│ │ │ │ - │ │ │ │ -
566 const typename G::Matrix::size_type& size,
│ │ │ │ -
567 const Set& overlap)
│ │ │ │ -
568 {
│ │ │ │ - │ │ │ │ -
570
│ │ │ │ -
571 std::size_t count;
│ │ │ │ -
572
│ │ │ │ -
573 const OverlapVertex* overlapVertices = buildOverlapVertices(fineGraph,
│ │ │ │ -
574 pinfo,
│ │ │ │ -
575 aggregates,
│ │ │ │ -
576 overlap,
│ │ │ │ -
577 count);
│ │ │ │ -
578 typedef typename G::MutableMatrix M;
│ │ │ │ -
579 M* coarseMatrix = new M(size, size, M::row_wise);
│ │ │ │ -
580
│ │ │ │ -
581 // Reset the visited flags of all vertices.
│ │ │ │ -
582 // As the isolated nodes will be skipped we simply mark them as visited
│ │ │ │ -
583
│ │ │ │ -
584 typedef typename G::VertexIterator Vertex;
│ │ │ │ -
585 Vertex vend = fineGraph.end();
│ │ │ │ -
586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
│ │ │ │ - │ │ │ │ -
588 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
│ │ │ │ -
589 }
│ │ │ │ +
232 private:
│ │ │ │ +
233 /*
│ │ │ │ +
234 * @brief Helper function to create hierarchies with parameter tree.
│ │ │ │ +
235 *
│ │ │ │ +
236 * Will create the coarsen criterion with the norm and create the
│ │ │ │ +
237 * Hierarchies
│ │ │ │ +
238 * \tparam Norm Type of the norm to use.
│ │ │ │ +
239 */
│ │ │ │ +
240 template<class Norm>
│ │ │ │ +
241 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
│ │ │ │ +
242 const PI& pinfo, const Norm&,
│ │ │ │ +
243 const ParameterTree& configuration,
│ │ │ │ +
244 std::true_type compiles = std::true_type());
│ │ │ │ +
245 template<class Norm>
│ │ │ │ +
246 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
│ │ │ │ +
247 const PI& pinfo, const Norm&,
│ │ │ │ +
248 const ParameterTree& configuration,
│ │ │ │ +
249 std::false_type);
│ │ │ │ +
254 template<class C>
│ │ │ │ +
255 void createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr,
│ │ │ │ +
256 const PI& pinfo, const ParameterTree& configuration);
│ │ │ │ +
263 template<class C>
│ │ │ │ +
264 void createHierarchies(C& criterion,
│ │ │ │ +
265 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ +
266 const PI& pinfo);
│ │ │ │ +
273 struct LevelContext
│ │ │ │ +
274 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
283 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
│ │ │ │ + │ │ │ │ +
291 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
│ │ │ │ +
295 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
311 std::size_t level;
│ │ │ │ +
312 };
│ │ │ │ +
313
│ │ │ │ +
314
│ │ │ │ +
319 void mgc(LevelContext& levelContext);
│ │ │ │ +
320
│ │ │ │ +
321 void additiveMgc();
│ │ │ │ +
322
│ │ │ │ +
329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel);
│ │ │ │ +
330
│ │ │ │ +
335 bool moveToCoarseLevel(LevelContext& levelContext);
│ │ │ │ +
336
│ │ │ │ +
341 void initIteratorsWithFineLevel(LevelContext& levelContext);
│ │ │ │ +
342
│ │ │ │ +
344 std::shared_ptr<OperatorHierarchy> matrices_;
│ │ │ │ +
346 SmootherArgs smootherArgs_;
│ │ │ │ +
348 std::shared_ptr<Hierarchy<Smoother,A> > smoothers_;
│ │ │ │ +
350 std::shared_ptr<CoarseSolver> solver_;
│ │ │ │ +
352 std::shared_ptr<Hierarchy<Range,A>> rhs_;
│ │ │ │ +
354 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
│ │ │ │ +
356 std::shared_ptr<Hierarchy<Domain,A>> update_;
│ │ │ │ + │ │ │ │ +
360 std::shared_ptr<ScalarProduct> scalarProduct_;
│ │ │ │ +
362 std::size_t gamma_;
│ │ │ │ +
364 std::size_t preSteps_;
│ │ │ │ +
366 std::size_t postSteps_;
│ │ │ │ +
367 bool buildHierarchy_;
│ │ │ │ +
368 bool additive;
│ │ │ │ +
369 bool coarsesolverconverged;
│ │ │ │ +
370 std::shared_ptr<Smoother> coarseSmoother_;
│ │ │ │ +
372 SolverCategory::Category category_;
│ │ │ │ +
374 std::size_t verbosity_;
│ │ │ │ +
375
│ │ │ │ +
376 struct ToLower
│ │ │ │ +
377 {
│ │ │ │ +
│ │ │ │ +
378 std::string operator()(const std::string& str)
│ │ │ │ +
379 {
│ │ │ │ +
380 std::stringstream retval;
│ │ │ │ +
381 std::ostream_iterator<char> out(retval);
│ │ │ │ +
382 std::transform(str.begin(), str.end(), out,
│ │ │ │ +
383 [](char c){
│ │ │ │ +
384 return std::tolower(c, std::locale::classic());
│ │ │ │ +
385 });
│ │ │ │ +
386 return retval.str();
│ │ │ │ +
387 }
│ │ │ │ +
│ │ │ │ +
388 };
│ │ │ │ +
389 };
│ │ │ │ +
390
│ │ │ │ +
391 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ +
392 inline AMG<M,X,S,PI,A>::AMG(const AMG& amg)
│ │ │ │ +
393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_),
│ │ │ │ +
394 smoothers_(amg.smoothers_), solver_(amg.solver_),
│ │ │ │ +
395 rhs_(), lhs_(), update_(),
│ │ │ │ +
396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_),
│ │ │ │ +
397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
│ │ │ │ +
398 buildHierarchy_(amg.buildHierarchy_),
│ │ │ │ +
399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged),
│ │ │ │ +
400 coarseSmoother_(amg.coarseSmoother_),
│ │ │ │ +
401 category_(amg.category_),
│ │ │ │ +
402 verbosity_(amg.verbosity_)
│ │ │ │ +
403 {}
│ │ │ │ +
│ │ │ │ +
404
│ │ │ │ +
405 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
407 const SmootherArgs& smootherArgs,
│ │ │ │ +
408 const Parameters& parms)
│ │ │ │ +
409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_(smootherArgs),
│ │ │ │ +
410 smoothers_(new Hierarchy<Smoother,A>), solver_(&coarseSolver),
│ │ │ │ +
411 rhs_(), lhs_(), update_(), scalarProduct_(0),
│ │ │ │ +
412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
│ │ │ │ +
413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
│ │ │ │ +
414 additive(parms.getAdditive()), coarsesolverconverged(true),
│ │ │ │ +
415 coarseSmoother_(),
│ │ │ │ +
416// #warning should category be retrieved from matrices?
│ │ │ │ +
417 category_(SolverCategory::category(*smoothers_->coarsest())),
│ │ │ │ +
418 verbosity_(parms.debugLevel())
│ │ │ │ +
419 {
│ │ │ │ +
420 assert(matrices_->isBuilt());
│ │ │ │ +
421
│ │ │ │ +
422 // build the necessary smoother hierarchies
│ │ │ │ +
423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
│ │ │ │ +
424 }
│ │ │ │ +
│ │ │ │ +
425
│ │ │ │ +
426 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
427 template<class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
429 const C& criterion,
│ │ │ │ +
430 const SmootherArgs& smootherArgs,
│ │ │ │ +
431 const PI& pinfo)
│ │ │ │ +
432 : smootherArgs_(smootherArgs),
│ │ │ │ +
433 smoothers_(new Hierarchy<Smoother,A>), solver_(),
│ │ │ │ +
434 rhs_(), lhs_(), update_(), scalarProduct_(),
│ │ │ │ +
435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()),
│ │ │ │ +
436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true),
│ │ │ │ +
437 additive(criterion.getAdditive()), coarsesolverconverged(true),
│ │ │ │ +
438 coarseSmoother_(),
│ │ │ │ +
439 category_(SolverCategory::category(pinfo)),
│ │ │ │ +
440 verbosity_(criterion.debugLevel())
│ │ │ │ +
441 {
│ │ │ │ + │ │ │ │ +
443 DUNE_THROW(InvalidSolverCategory, "Matrix and Communication must have the same SolverCategory!");
│ │ │ │ +
444 // TODO: reestablish compile time checks.
│ │ │ │ +
445 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
│ │ │ │ +
446 // "Matrix and Solver must match in terms of category!");
│ │ │ │ +
447 auto matrixptr = stackobject_to_shared_ptr(matrix);
│ │ │ │ +
448 createHierarchies(criterion, matrixptr, pinfo);
│ │ │ │ +
449 }
│ │ │ │ +
│ │ │ │ +
450
│ │ │ │ +
451 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ +
452 AMG<M,X,S,PI,A>::AMG(std::shared_ptr<const Operator> matrixptr,
│ │ │ │ +
453 const ParameterTree& configuration,
│ │ │ │ +
454 const ParallelInformation& pinfo) :
│ │ │ │ +
455 smoothers_(new Hierarchy<Smoother,A>),
│ │ │ │ +
456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_(true),
│ │ │ │ +
457 coarsesolverconverged(true), coarseSmoother_(),
│ │ │ │ +
458 category_(SolverCategory::category(pinfo))
│ │ │ │ +
459 {
│ │ │ │ +
460
│ │ │ │ +
461 if (configuration.hasKey ("smootherIterations"))
│ │ │ │ +
462 smootherArgs_.iterations = configuration.get<int>("smootherIterations");
│ │ │ │ +
463
│ │ │ │ +
464 if (configuration.hasKey ("smootherRelaxation"))
│ │ │ │ +
465 smootherArgs_.relaxationFactor = configuration.get<typename SmootherArgs::RelaxationFactor>("smootherRelaxation");
│ │ │ │ +
466
│ │ │ │ +
467 auto normName = ToLower()(configuration.get("strengthMeasure", "diagonal"));
│ │ │ │ +
468 auto index = configuration.get<int>("diagonalRowIndex", 0);
│ │ │ │ +
469
│ │ │ │ +
470 if ( normName == "diagonal")
│ │ │ │ +
471 {
│ │ │ │ +
472 using field_type = typename M::field_type;
│ │ │ │ +
473 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
474 std::is_convertible<field_type, real_type> compiles;
│ │ │ │ +
475
│ │ │ │ +
476 switch (index)
│ │ │ │ +
477 {
│ │ │ │ +
478 case 0:
│ │ │ │ +
479 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<0>(), configuration, compiles);
│ │ │ │ +
480 break;
│ │ │ │ +
481 case 1:
│ │ │ │ +
482 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<1>(), configuration, compiles);
│ │ │ │ +
483 break;
│ │ │ │ +
484 case 2:
│ │ │ │ +
485 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<2>(), configuration, compiles);
│ │ │ │ +
486 break;
│ │ │ │ +
487 case 3:
│ │ │ │ +
488 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<3>(), configuration, compiles);
│ │ │ │ +
489 break;
│ │ │ │ +
490 case 4:
│ │ │ │ +
491 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<4>(), configuration, compiles);
│ │ │ │ +
492 break;
│ │ │ │ +
493 default:
│ │ │ │ +
494 DUNE_THROW(InvalidStateException, "Currently strengthIndex>4 is not supported.");
│ │ │ │ +
495 }
│ │ │ │ +
496 }
│ │ │ │ +
497 else if (normName == "rowsum")
│ │ │ │ +
498 createCriterionAndHierarchies(matrixptr, pinfo, RowSum(), configuration);
│ │ │ │ +
499 else if (normName == "frobenius")
│ │ │ │ +
500 createCriterionAndHierarchies(matrixptr, pinfo, FrobeniusNorm(), configuration);
│ │ │ │ +
501 else if (normName == "one")
│ │ │ │ +
502 createCriterionAndHierarchies(matrixptr, pinfo, AlwaysOneNorm(), configuration);
│ │ │ │ +
503 else
│ │ │ │ +
504 DUNE_THROW(Dune::NotImplemented, "Wrong config file: strengthMeasure "<<normName<<" is not supported by AMG");
│ │ │ │ +
505 }
│ │ │ │ +
│ │ │ │ +
506
│ │ │ │ +
507 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
508 template<class Norm>
│ │ │ │ +
509 void AMG<M,X,S,PI,A>::createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const Norm&, const ParameterTree& configuration, std::false_type)
│ │ │ │ +
510 {
│ │ │ │ +
511 DUNE_THROW(InvalidStateException, "Strength of connection measure does not support this type ("
│ │ │ │ +
512 << className<typename M::field_type>() << ") as it is lacking a conversion to"
│ │ │ │ +
513 << className<typename FieldTraits<typename M::field_type>::real_type>() << ".");
│ │ │ │ +
514 }
│ │ │ │ +
515
│ │ │ │ +
516 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
517 template<class Norm>
│ │ │ │ +
518 void AMG<M,X,S,PI,A>::createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const Norm&, const ParameterTree& configuration, std::true_type)
│ │ │ │ +
519 {
│ │ │ │ +
520 if (configuration.get<bool>("criterionSymmetric", true))
│ │ │ │ +
521 {
│ │ │ │ +
522 using Criterion = Dune::Amg::CoarsenCriterion<
│ │ │ │ + │ │ │ │ +
524 Criterion criterion;
│ │ │ │ +
525 createHierarchies(criterion, matrixptr, pinfo, configuration);
│ │ │ │ +
526 }
│ │ │ │ +
527 else
│ │ │ │ +
528 {
│ │ │ │ +
529 using Criterion = Dune::Amg::CoarsenCriterion<
│ │ │ │ + │ │ │ │ +
531 Criterion criterion;
│ │ │ │ +
532 createHierarchies(criterion, matrixptr, pinfo, configuration);
│ │ │ │ +
533 }
│ │ │ │ +
534 }
│ │ │ │ +
535
│ │ │ │ +
536 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
537 template<class C>
│ │ │ │ +
538 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const ParameterTree& configuration)
│ │ │ │ +
539 {
│ │ │ │ +
540 if (configuration.hasKey ("maxLevel"))
│ │ │ │ +
541 criterion.setMaxLevel(configuration.get<int>("maxLevel"));
│ │ │ │ +
542
│ │ │ │ +
543 if (configuration.hasKey ("minCoarseningRate"))
│ │ │ │ +
544 criterion.setMinCoarsenRate(configuration.get<int>("minCoarseningRate"));
│ │ │ │ +
545
│ │ │ │ +
546 if (configuration.hasKey ("coarsenTarget"))
│ │ │ │ +
547 criterion.setCoarsenTarget (configuration.get<int>("coarsenTarget"));
│ │ │ │ +
548
│ │ │ │ +
549 if (configuration.hasKey ("accumulationMode"))
│ │ │ │ +
550 {
│ │ │ │ +
551 std::string mode = ToLower()(configuration.get<std::string>("accumulationMode"));
│ │ │ │ +
552 if ( mode == "none")
│ │ │ │ +
553 criterion.setAccumulate(AccumulationMode::noAccu);
│ │ │ │ +
554 else if ( mode == "atonce" )
│ │ │ │ +
555 criterion.setAccumulate(AccumulationMode::atOnceAccu);
│ │ │ │ +
556 else if ( mode == "successive")
│ │ │ │ +
557 criterion.setCoarsenTarget (AccumulationMode::successiveAccu);
│ │ │ │ +
558 else
│ │ │ │ +
559 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
│ │ │ │ +
560 << mode <<".");
│ │ │ │ +
561 }
│ │ │ │ +
562
│ │ │ │ +
563 if (configuration.hasKey ("prolongationDampingFactor"))
│ │ │ │ +
564 criterion.setProlongationDampingFactor (configuration.get<double>("prolongationDampingFactor"));
│ │ │ │ +
565
│ │ │ │ +
566 if (configuration.hasKey("defaultAggregationSizeMode"))
│ │ │ │ +
567 {
│ │ │ │ +
568 auto mode = ToLower()(configuration.get<std::string>("defaultAggregationSizeMode"));
│ │ │ │ +
569 auto dim = configuration.get<std::size_t>("defaultAggregationDimension");
│ │ │ │ +
570 std::size_t maxDistance = 2;
│ │ │ │ +
571 if (configuration.hasKey("MaxAggregateDistance"))
│ │ │ │ +
572 maxDistance = configuration.get<std::size_t>("maxAggregateDistance");
│ │ │ │ +
573 if (mode == "isotropic")
│ │ │ │ +
574 criterion.setDefaultValuesIsotropic(dim, maxDistance);
│ │ │ │ +
575 else if(mode == "anisotropic")
│ │ │ │ +
576 criterion.setDefaultValuesAnisotropic(dim, maxDistance);
│ │ │ │ +
577 else
│ │ │ │ +
578 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
│ │ │ │ +
579 << mode <<".");
│ │ │ │ +
580 }
│ │ │ │ +
581
│ │ │ │ +
582 if (configuration.hasKey("maxAggregateDistance"))
│ │ │ │ +
583 criterion.setMaxDistance(configuration.get<std::size_t>("maxAggregateDistance"));
│ │ │ │ +
584
│ │ │ │ +
585 if (configuration.hasKey("minAggregateSize"))
│ │ │ │ +
586 criterion.setMinAggregateSize(configuration.get<std::size_t>("minAggregateSize"));
│ │ │ │ +
587
│ │ │ │ +
588 if (configuration.hasKey("maxAggregateSize"))
│ │ │ │ +
589 criterion.setMaxAggregateSize(configuration.get<std::size_t>("maxAggregateSize"));
│ │ │ │
590
│ │ │ │ -
591 typedef typename G::MutableMatrix M;
│ │ │ │ -
592 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
│ │ │ │ +
591 if (configuration.hasKey("maxAggregateConnectivity"))
│ │ │ │ +
592 criterion.setMaxConnectivity(configuration.get<std::size_t>("maxAggregateConnectivity"));
│ │ │ │
593
│ │ │ │ -
594 ConnectivityConstructor<G,T>::examine(fineGraph, visitedMap, pinfo,
│ │ │ │ -
595 aggregates, overlap,
│ │ │ │ -
596 overlapVertices,
│ │ │ │ -
597 overlapVertices+count,
│ │ │ │ -
598 sparsityBuilder);
│ │ │ │ +
594 if (configuration.hasKey ("alpha"))
│ │ │ │ +
595 criterion.setAlpha (configuration.get<double> ("alpha"));
│ │ │ │ +
596
│ │ │ │ +
597 if (configuration.hasKey ("beta"))
│ │ │ │ +
598 criterion.setBeta (configuration.get<double> ("beta"));
│ │ │ │
599
│ │ │ │ -
600 dinfo<<pinfo.communicator().rank()<<": Matrix ("<<coarseMatrix->N()<<"x"<<coarseMatrix->M()<<" row: min="<<sparsityBuilder.minRowSize()<<" max="
│ │ │ │ -
601 <<sparsityBuilder.maxRowSize()<<" avg="
│ │ │ │ -
602 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()
│ │ │ │ -
603 <<std::endl;
│ │ │ │ -
604
│ │ │ │ -
605 delete[] overlapVertices;
│ │ │ │ -
606
│ │ │ │ -
607 return coarseMatrix;
│ │ │ │ -
608 }
│ │ │ │ -
│ │ │ │ -
609
│ │ │ │ -
610 template<class G, class V, class Set>
│ │ │ │ -
611 typename G::MutableMatrix*
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
613 const SequentialInformation& pinfo,
│ │ │ │ - │ │ │ │ -
615 const typename G::Matrix::size_type& size,
│ │ │ │ -
616 [[maybe_unused]] const Set& overlap)
│ │ │ │ -
617 {
│ │ │ │ -
618 typedef typename G::MutableMatrix M;
│ │ │ │ -
619 M* coarseMatrix = new M(size, size, M::row_wise);
│ │ │ │ -
620
│ │ │ │ -
621 // Reset the visited flags of all vertices.
│ │ │ │ -
622 // As the isolated nodes will be skipped we simply mark them as visited
│ │ │ │ -
623
│ │ │ │ -
624 typedef typename G::VertexIterator Vertex;
│ │ │ │ -
625 Vertex vend = fineGraph.end();
│ │ │ │ -
626 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
│ │ │ │ - │ │ │ │ -
628 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
│ │ │ │ -
629 }
│ │ │ │ -
630
│ │ │ │ -
631 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
│ │ │ │ -
632
│ │ │ │ - │ │ │ │ -
634 aggregates, sparsityBuilder);
│ │ │ │ -
635 dinfo<<"Matrix row: min="<<sparsityBuilder.minRowSize()<<" max="
│ │ │ │ -
636 <<sparsityBuilder.maxRowSize()<<" average="
│ │ │ │ -
637 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()<<std::endl;
│ │ │ │ -
638 return coarseMatrix;
│ │ │ │ -
639 }
│ │ │ │ -
│ │ │ │ -
640
│ │ │ │ -
641 template<class M, class V, class P, class O>
│ │ │ │ -
│ │ │ │ -
642 void BaseGalerkinProduct::calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
│ │ │ │ -
643 const P& pinfo, [[maybe_unused]] const O& copy)
│ │ │ │ -
644 {
│ │ │ │ -
645 coarse = static_cast<typename M::field_type>(0);
│ │ │ │ -
646
│ │ │ │ -
647 typedef typename M::ConstIterator RowIterator;
│ │ │ │ -
648 RowIterator endRow = fine.end();
│ │ │ │ -
649
│ │ │ │ -
650 for(RowIterator row = fine.begin(); row != endRow; ++row)
│ │ │ │ -
651 if(aggregates[row.index()] != AggregatesMap<V>::ISOLATED) {
│ │ │ │ -
652 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
│ │ │ │ -
653 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ -
654 ColIterator endCol = row->end();
│ │ │ │ -
655
│ │ │ │ -
656 for(ColIterator col = row->begin(); col != endCol; ++col)
│ │ │ │ -
657 if(aggregates[col.index()] != AggregatesMap<V>::ISOLATED) {
│ │ │ │ -
658 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
│ │ │ │ -
659 coarse[aggregates[row.index()]][aggregates[col.index()]]+=*col;
│ │ │ │ -
660 }
│ │ │ │ -
661 }
│ │ │ │ -
662
│ │ │ │ -
663 // get the right diagonal matrix values on copy lines from owner processes
│ │ │ │ -
664 typedef typename M::block_type BlockType;
│ │ │ │ -
665 std::vector<BlockType> rowsize(coarse.N(),BlockType(0));
│ │ │ │ -
666 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
│ │ │ │ -
667 rowsize[row.index()]=coarse[row.index()][row.index()];
│ │ │ │ -
668 pinfo.copyOwnerToAll(rowsize,rowsize);
│ │ │ │ -
669 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
│ │ │ │ -
670 coarse[row.index()][row.index()] = rowsize[row.index()];
│ │ │ │ -
671
│ │ │ │ -
672 // don't set dirichlet boundaries for copy lines to make novlp case work,
│ │ │ │ -
673 // the preconditioner yields slightly different results now.
│ │ │ │ -
674
│ │ │ │ -
675 // Set the dirichlet border
│ │ │ │ -
676 //DirichletBoundarySetter<P>::template set<M>(coarse, pinfo, copy);
│ │ │ │ -
677
│ │ │ │ -
678 }
│ │ │ │ -
│ │ │ │ -
679
│ │ │ │ -
680 template<class T>
│ │ │ │ -
681 template<class M, class O>
│ │ │ │ -
│ │ │ │ -
682 void DirichletBoundarySetter<T>::set(M& coarse, const T& pinfo, const O& copy)
│ │ │ │ -
683 {
│ │ │ │ -
684 typedef typename T::ParallelIndexSet::const_iterator ConstIterator;
│ │ │ │ -
685 ConstIterator end = pinfo.indexSet().end();
│ │ │ │ -
686 typedef typename M::block_type Block;
│ │ │ │ -
687 Block identity=Block(0.0);
│ │ │ │ -
688 for(typename Block::RowIterator b=identity.begin(); b != identity.end(); ++b)
│ │ │ │ -
689 b->operator[](b.index())=1.0;
│ │ │ │ -
690
│ │ │ │ -
691 for(ConstIterator index = pinfo.indexSet().begin();
│ │ │ │ -
692 index != end; ++index) {
│ │ │ │ -
693 if(copy.contains(index->local().attribute())) {
│ │ │ │ -
694 typedef typename M::ColIterator ColIterator;
│ │ │ │ -
695 typedef typename M::row_type Row;
│ │ │ │ -
696 Row row = coarse[index->local()];
│ │ │ │ -
697 ColIterator cend = row.find(index->local());
│ │ │ │ -
698 ColIterator col = row.begin();
│ │ │ │ -
699 for(; col != cend; ++col)
│ │ │ │ -
700 *col = 0;
│ │ │ │ -
701
│ │ │ │ -
702 cend = row.end();
│ │ │ │ -
703
│ │ │ │ -
704 assert(col != cend); // There should be a diagonal entry
│ │ │ │ -
705 *col = identity;
│ │ │ │ -
706
│ │ │ │ -
707 for(++col; col != cend; ++col)
│ │ │ │ -
708 *col = 0;
│ │ │ │ -
709 }
│ │ │ │ -
710 }
│ │ │ │ -
711 }
│ │ │ │ -
│ │ │ │ -
712
│ │ │ │ -
713 template<class M, class O>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
715 const SequentialInformation& pinfo,
│ │ │ │ -
716 const O& overlap)
│ │ │ │ -
717 {}
│ │ │ │ -
│ │ │ │ -
718
│ │ │ │ -
719 } // namespace Amg
│ │ │ │ -
720} // namespace Dune
│ │ │ │ -
721#endif
│ │ │ │ -
Provides classes for the Coloring process of AMG.
│ │ │ │ - │ │ │ │ +
600 if (configuration.hasKey ("gamma"))
│ │ │ │ +
601 criterion.setGamma (configuration.get<std::size_t> ("gamma"));
│ │ │ │ +
602 gamma_ = criterion.getGamma();
│ │ │ │ +
603
│ │ │ │ +
604 if (configuration.hasKey ("additive"))
│ │ │ │ +
605 criterion.setAdditive (configuration.get<bool>("additive"));
│ │ │ │ +
606 additive = criterion.getAdditive();
│ │ │ │ +
607
│ │ │ │ +
608 if (configuration.hasKey ("preSteps"))
│ │ │ │ +
609 criterion.setNoPreSmoothSteps (configuration.get<std::size_t> ("preSteps"));
│ │ │ │ +
610 preSteps_ = criterion.getNoPreSmoothSteps ();
│ │ │ │ +
611
│ │ │ │ +
612 if (configuration.hasKey ("postSteps"))
│ │ │ │ +
613 criterion.setNoPostSmoothSteps (configuration.get<std::size_t> ("postSteps"));
│ │ │ │ +
614 postSteps_ = criterion.getNoPostSmoothSteps ();
│ │ │ │ +
615
│ │ │ │ +
616 verbosity_ = configuration.get("verbosity", 0);
│ │ │ │ +
617 criterion.setDebugLevel (verbosity_);
│ │ │ │ +
618
│ │ │ │ +
619 createHierarchies(criterion, matrixptr, pinfo);
│ │ │ │ +
620 }
│ │ │ │ +
621
│ │ │ │ +
622 template <class Matrix,
│ │ │ │ +
623 class Vector>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
625 {
│ │ │ │ +
626 typedef typename Matrix :: field_type field_type;
│ │ │ │ + │ │ │ │ +
628
│ │ │ │ +
629 static constexpr SolverType solver =
│ │ │ │ +
630#if DISABLE_AMG_DIRECTSOLVER
│ │ │ │ +
631 none;
│ │ │ │ +
632#elif HAVE_SUITESPARSE_UMFPACK
│ │ │ │ + │ │ │ │ +
634#elif HAVE_SUPERLU
│ │ │ │ +
635 superlu ;
│ │ │ │ +
636#else
│ │ │ │ +
637 none;
│ │ │ │ +
638#endif
│ │ │ │ +
639
│ │ │ │ +
640 template <class M, SolverType>
│ │ │ │ +
│ │ │ │ +
641 struct Solver
│ │ │ │ +
642 {
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
644 static type* create(const M& mat, bool verbose, bool reusevector )
│ │ │ │ +
645 {
│ │ │ │ +
646 DUNE_THROW(NotImplemented,"DirectSolver not selected");
│ │ │ │ +
647 return nullptr;
│ │ │ │ +
648 }
│ │ │ │ +
│ │ │ │ +
649 static std::string name () { return "None"; }
│ │ │ │ +
650 };
│ │ │ │ +
│ │ │ │ +
651#if HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
652 template <class M>
│ │ │ │ +
653 struct Solver< M, umfpack >
│ │ │ │ +
654 {
│ │ │ │ +
655 typedef UMFPack< M > type;
│ │ │ │ +
656 static type* create(const M& mat, bool verbose, bool reusevector )
│ │ │ │ +
657 {
│ │ │ │ +
658 return new type(mat, verbose, reusevector );
│ │ │ │ +
659 }
│ │ │ │ +
660 static std::string name () { return "UMFPack"; }
│ │ │ │ +
661 };
│ │ │ │ +
662#endif
│ │ │ │ +
663#if HAVE_SUPERLU
│ │ │ │ +
664 template <class M>
│ │ │ │ +
│ │ │ │ +
665 struct Solver< M, superlu >
│ │ │ │ +
666 {
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
668 static type* create(const M& mat, bool verbose, bool reusevector )
│ │ │ │ +
669 {
│ │ │ │ +
670 return new type(mat, verbose, reusevector );
│ │ │ │ +
671 }
│ │ │ │ +
│ │ │ │ +
672 static std::string name () { return "SuperLU"; }
│ │ │ │ +
673 };
│ │ │ │ +
│ │ │ │ +
674#endif
│ │ │ │ +
675
│ │ │ │ +
676 // define direct solver type to be used
│ │ │ │ + │ │ │ │ +
678 typedef typename SelectedSolver :: type DirectSolver;
│ │ │ │ +
679 static constexpr bool isDirectSolver = solver != none;
│ │ │ │ +
680 static std::string name() { return SelectedSolver :: name (); }
│ │ │ │ +
│ │ │ │ +
681 static DirectSolver* create(const Matrix& mat, bool verbose, bool reusevector )
│ │ │ │ +
682 {
│ │ │ │ +
683 return SelectedSolver :: create( mat, verbose, reusevector );
│ │ │ │ +
684 }
│ │ │ │ +
│ │ │ │ +
685 };
│ │ │ │ +
│ │ │ │ +
686
│ │ │ │ +
687 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
688 template<class C>
│ │ │ │ +
689 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion,
│ │ │ │ +
690 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ +
691 const PI& pinfo)
│ │ │ │ +
692 {
│ │ │ │ +
693 Timer watch;
│ │ │ │ +
694 matrices_ = std::make_shared<OperatorHierarchy>(
│ │ │ │ +
695 std::const_pointer_cast<Operator>(matrixptr),
│ │ │ │ +
696 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
│ │ │ │ +
697
│ │ │ │ +
698 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
│ │ │ │ +
699
│ │ │ │ +
700 // build the necessary smoother hierarchies
│ │ │ │ +
701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
│ │ │ │ +
702
│ │ │ │ +
703 // test whether we should solve on the coarse level. That is the case if we
│ │ │ │ +
704 // have that level and if there was a redistribution on this level then our
│ │ │ │ +
705 // communicator has to be valid (size()>0) as the smoother might try to communicate
│ │ │ │ +
706 // in the constructor.
│ │ │ │ +
707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()
│ │ │ │ +
708 && ( ! matrices_->redistributeInformation().back().isSetup() ||
│ │ │ │ +
709 matrices_->parallelInformation().coarsest().getRedistributed().communicator().size() ) )
│ │ │ │ +
710 {
│ │ │ │ +
711 // We have the carsest level. Create the coarse Solver
│ │ │ │ +
712 SmootherArgs sargs(smootherArgs_);
│ │ │ │ +
713 sargs.iterations = 1;
│ │ │ │ +
714
│ │ │ │ + │ │ │ │ +
716 cargs.setArgs(sargs);
│ │ │ │ +
717 if(matrices_->redistributeInformation().back().isSetup()) {
│ │ │ │ +
718 // Solve on the redistributed partitioning
│ │ │ │ +
719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
│ │ │ │ +
720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
│ │ │ │ +
721 }else{
│ │ │ │ +
722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
│ │ │ │ +
723 cargs.setComm(*matrices_->parallelInformation().coarsest());
│ │ │ │ +
724 }
│ │ │ │ +
725
│ │ │ │ +
726 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
│ │ │ │ +
727 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
│ │ │ │ +
728
│ │ │ │ +
729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector;
│ │ │ │ +
730
│ │ │ │ +
731 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
│ │ │ │ +
732 if( SolverSelector::isDirectSolver &&
│ │ │ │ +
733 (std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
│ │ │ │ +
734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
│ │ │ │ +
735 || (matrices_->parallelInformation().coarsest().isRedistributed()
│ │ │ │ +
736 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
│ │ │ │ +
737 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0) )
│ │ │ │ +
738 )
│ │ │ │ +
739 { // redistribute and 1 proc
│ │ │ │ +
740 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ +
741 {
│ │ │ │ +
742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ +
743 {
│ │ │ │ +
744 // We are still participating on this level
│ │ │ │ +
745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
│ │ │ │ +
746 }
│ │ │ │ +
747 else
│ │ │ │ +
748 solver_.reset();
│ │ │ │ +
749 }
│ │ │ │ +
750 else
│ │ │ │ +
751 {
│ │ │ │ +
752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()->getmat(), false, false));
│ │ │ │ +
753 }
│ │ │ │ +
754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
│ │ │ │ +
755 std::cout<< "Using a direct coarse solver (" << SolverSelector::name() << ")" << std::endl;
│ │ │ │ +
756 }
│ │ │ │ +
757 else
│ │ │ │ +
758 {
│ │ │ │ +
759 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ +
760 {
│ │ │ │ +
761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ +
762 // We are still participating on this level
│ │ │ │ +
763
│ │ │ │ +
764 // we have to allocate these types using the rebound allocator
│ │ │ │ +
765 // in order to ensure that we fulfill the alignment requirements
│ │ │ │ +
766 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
│ │ │ │ +
767 *scalarProduct_,
│ │ │ │ +
768 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ +
769 else
│ │ │ │ +
770 solver_.reset();
│ │ │ │ +
771 }else
│ │ │ │ +
772 {
│ │ │ │ +
773 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
│ │ │ │ +
774 *scalarProduct_,
│ │ │ │ +
775 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ +
776 // // we have to allocate these types using the rebound allocator
│ │ │ │ +
777 // // in order to ensure that we fulfill the alignment requirements
│ │ │ │ +
778 // using Alloc = typename std::allocator_traits<A>::template rebind_alloc<BiCGSTABSolver<X>>;
│ │ │ │ +
779 // Alloc alloc;
│ │ │ │ +
780 // auto p = alloc.allocate(1);
│ │ │ │ +
781 // std::allocator_traits<Alloc>::construct(alloc, p,
│ │ │ │ +
782 // const_cast<M&>(*matrices_->matrices().coarsest()),
│ │ │ │ +
783 // *scalarProduct_,
│ │ │ │ +
784 // *coarseSmoother_, 1E-2, 1000, 0);
│ │ │ │ +
785 // solver_.reset(p,[](BiCGSTABSolver<X>* p){
│ │ │ │ +
786 // Alloc alloc;
│ │ │ │ +
787 // std::allocator_traits<Alloc>::destroy(alloc, p);
│ │ │ │ +
788 // alloc.deallocate(p,1);
│ │ │ │ +
789 // });
│ │ │ │ +
790 }
│ │ │ │ +
791 }
│ │ │ │ +
792 }
│ │ │ │ +
793
│ │ │ │ +
794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
│ │ │ │ +
795 std::cout<<"Building hierarchy of "<<matrices_->maxlevels()<<" levels "
│ │ │ │ +
796 <<"(including coarse solver) took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ +
797 }
│ │ │ │ +
798
│ │ │ │ +
799
│ │ │ │ +
800 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
802 {
│ │ │ │ +
803 // Detect Matrix rows where all offdiagonal entries are
│ │ │ │ +
804 // zero and set x such that A_dd*x_d=b_d
│ │ │ │ +
805 // Thus users can be more careless when setting up their linear
│ │ │ │ +
806 // systems.
│ │ │ │ +
807 typedef typename M::matrix_type Matrix;
│ │ │ │ +
808 typedef typename Matrix::ConstRowIterator RowIter;
│ │ │ │ +
809 typedef typename Matrix::ConstColIterator ColIter;
│ │ │ │ +
810 typedef typename Matrix::block_type Block;
│ │ │ │ +
811 Block zero;
│ │ │ │ +
812 zero=typename Matrix::field_type();
│ │ │ │ +
813
│ │ │ │ +
814 const Matrix& mat=matrices_->matrices().finest()->getmat();
│ │ │ │ +
815 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ +
816 bool isDirichlet = true;
│ │ │ │ +
817 bool hasDiagonal = false;
│ │ │ │ +
818 Block diagonal{};
│ │ │ │ +
819 for(ColIter col=row->begin(); col!=row->end(); ++col) {
│ │ │ │ +
820 if(row.index()==col.index()) {
│ │ │ │ +
821 diagonal = *col;
│ │ │ │ +
822 hasDiagonal = true;
│ │ │ │ +
823 }else{
│ │ │ │ +
824 if(*col!=zero)
│ │ │ │ +
825 isDirichlet = false;
│ │ │ │ +
826 }
│ │ │ │ +
827 }
│ │ │ │ +
828 if(isDirichlet && hasDiagonal)
│ │ │ │ +
829 {
│ │ │ │ +
830 auto&& xEntry = Impl::asVector(x[row.index()]);
│ │ │ │ +
831 auto&& bEntry = Impl::asVector(b[row.index()]);
│ │ │ │ +
832 Impl::asMatrix(diagonal).solve(xEntry, bEntry);
│ │ │ │ +
833 }
│ │ │ │ +
834 }
│ │ │ │ +
835
│ │ │ │ +
836 if(smoothers_->levels()>0)
│ │ │ │ +
837 smoothers_->finest()->pre(x,b);
│ │ │ │ +
838 else
│ │ │ │ +
839 // No smoother to make x consistent! Do it by hand
│ │ │ │ +
840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
│ │ │ │ +
841 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
│ │ │ │ +
842 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ +
843 update_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ +
844 matrices_->coarsenVector(*rhs_);
│ │ │ │ +
845 matrices_->coarsenVector(*lhs_);
│ │ │ │ +
846 matrices_->coarsenVector(*update_);
│ │ │ │ +
847
│ │ │ │ +
848 // Preprocess all smoothers
│ │ │ │ +
849 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
│ │ │ │ +
850 typedef typename Hierarchy<Range,A>::Iterator RIterator;
│ │ │ │ +
851 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
│ │ │ │ +
852 Iterator coarsest = smoothers_->coarsest();
│ │ │ │ +
853 Iterator smoother = smoothers_->finest();
│ │ │ │ +
854 RIterator rhs = rhs_->finest();
│ │ │ │ +
855 DIterator lhs = lhs_->finest();
│ │ │ │ +
856 if(smoothers_->levels()>1) {
│ │ │ │ +
857
│ │ │ │ +
858 assert(lhs_->levels()==rhs_->levels());
│ │ │ │ +
859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels()==matrices_->maxlevels());
│ │ │ │ +
860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels()<matrices_->maxlevels());
│ │ │ │ +
861
│ │ │ │ +
862 if(smoother!=coarsest)
│ │ │ │ +
863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs, ++rhs)
│ │ │ │ +
864 smoother->pre(*lhs,*rhs);
│ │ │ │ +
865 smoother->pre(*lhs,*rhs);
│ │ │ │ +
866 }
│ │ │ │ +
867
│ │ │ │ +
868
│ │ │ │ +
869 // The preconditioner might change x and b. So we have to
│ │ │ │ +
870 // copy the changes to the original vectors.
│ │ │ │ +
871 x = *lhs_->finest();
│ │ │ │ +
872 b = *rhs_->finest();
│ │ │ │ +
873
│ │ │ │ +
874 }
│ │ │ │ +
│ │ │ │ +
875 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
877 {
│ │ │ │ +
878 return matrices_->levels();
│ │ │ │ +
879 }
│ │ │ │ +
│ │ │ │ +
880 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
882 {
│ │ │ │ +
883 return matrices_->maxlevels();
│ │ │ │ +
884 }
│ │ │ │ +
│ │ │ │ +
885
│ │ │ │ +
887 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
889 {
│ │ │ │ +
890 LevelContext levelContext;
│ │ │ │ +
891
│ │ │ │ +
892 if(additive) {
│ │ │ │ +
893 *(rhs_->finest())=d;
│ │ │ │ +
894 additiveMgc();
│ │ │ │ +
895 v=*lhs_->finest();
│ │ │ │ +
896 }else{
│ │ │ │ +
897 // Init all iterators for the current level
│ │ │ │ +
898 initIteratorsWithFineLevel(levelContext);
│ │ │ │ +
899
│ │ │ │ +
900
│ │ │ │ +
901 *levelContext.lhs = v;
│ │ │ │ +
902 *levelContext.rhs = d;
│ │ │ │ +
903 *levelContext.update=0;
│ │ │ │ +
904 levelContext.level=0;
│ │ │ │ +
905
│ │ │ │ +
906 mgc(levelContext);
│ │ │ │ +
907
│ │ │ │ +
908 if(postSteps_==0||matrices_->maxlevels()==1)
│ │ │ │ +
909 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
│ │ │ │ +
910
│ │ │ │ +
911 v=*levelContext.update;
│ │ │ │ +
912 }
│ │ │ │ +
913
│ │ │ │ +
914 }
│ │ │ │ +
│ │ │ │ +
915
│ │ │ │ +
916 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
917 void AMG<M,X,S,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
│ │ │ │ +
918 {
│ │ │ │ +
919 levelContext.smoother = smoothers_->finest();
│ │ │ │ +
920 levelContext.matrix = matrices_->matrices().finest();
│ │ │ │ +
921 levelContext.pinfo = matrices_->parallelInformation().finest();
│ │ │ │ +
922 levelContext.redist =
│ │ │ │ +
923 matrices_->redistributeInformation().begin();
│ │ │ │ +
924 levelContext.aggregates = matrices_->aggregatesMaps().begin();
│ │ │ │ +
925 levelContext.lhs = lhs_->finest();
│ │ │ │ +
926 levelContext.update = update_->finest();
│ │ │ │ +
927 levelContext.rhs = rhs_->finest();
│ │ │ │ +
928 }
│ │ │ │ +
929
│ │ │ │ +
930 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
931 bool AMG<M,X,S,PI,A>
│ │ │ │ +
932 ::moveToCoarseLevel(LevelContext& levelContext)
│ │ │ │ +
933 {
│ │ │ │ +
934
│ │ │ │ +
935 bool processNextLevel=true;
│ │ │ │ +
936
│ │ │ │ +
937 if(levelContext.redist->isSetup()) {
│ │ │ │ +
938 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.rhs),
│ │ │ │ +
939 levelContext.rhs.getRedistributed());
│ │ │ │ +
940 processNextLevel = levelContext.rhs.getRedistributed().size()>0;
│ │ │ │ +
941 if(processNextLevel) {
│ │ │ │ +
942 //restrict defect to coarse level right hand side.
│ │ │ │ +
943 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
│ │ │ │ +
944 ++levelContext.pinfo;
│ │ │ │ +
945 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
│ │ │ │ +
947 static_cast<const Range&>(fineRhs.getRedistributed()),
│ │ │ │ +
948 *levelContext.pinfo);
│ │ │ │ +
949 }
│ │ │ │ +
950 }else{
│ │ │ │ +
951 //restrict defect to coarse level right hand side.
│ │ │ │ +
952 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
│ │ │ │ +
953 ++levelContext.pinfo;
│ │ │ │ +
954 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
955 ::restrictVector(*(*levelContext.aggregates),
│ │ │ │ +
956 *levelContext.rhs, static_cast<const Range&>(*fineRhs),
│ │ │ │ +
957 *levelContext.pinfo);
│ │ │ │ +
958 }
│ │ │ │ +
959
│ │ │ │ +
960 if(processNextLevel) {
│ │ │ │ +
961 // prepare coarse system
│ │ │ │ +
962 ++levelContext.lhs;
│ │ │ │ +
963 ++levelContext.update;
│ │ │ │ +
964 ++levelContext.matrix;
│ │ │ │ +
965 ++levelContext.level;
│ │ │ │ +
966 ++levelContext.redist;
│ │ │ │ +
967
│ │ │ │ +
968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ +
969 // next level is not the globally coarsest one
│ │ │ │ +
970 ++levelContext.smoother;
│ │ │ │ +
971 ++levelContext.aggregates;
│ │ │ │ +
972 }
│ │ │ │ +
973 // prepare the update on the next level
│ │ │ │ +
974 *levelContext.update=0;
│ │ │ │ +
975 }
│ │ │ │ +
976 return processNextLevel;
│ │ │ │ +
977 }
│ │ │ │ +
978
│ │ │ │ +
979 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
980 void AMG<M,X,S,PI,A>
│ │ │ │ +
981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel)
│ │ │ │ +
982 {
│ │ │ │ +
983 if(processNextLevel) {
│ │ │ │ +
984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ +
985 // previous level is not the globally coarsest one
│ │ │ │ +
986 --levelContext.smoother;
│ │ │ │ +
987 --levelContext.aggregates;
│ │ │ │ +
988 }
│ │ │ │ +
989 --levelContext.redist;
│ │ │ │ +
990 --levelContext.level;
│ │ │ │ +
991 //prolongate and add the correction (update is in coarse left hand side)
│ │ │ │ +
992 --levelContext.matrix;
│ │ │ │ +
993
│ │ │ │ +
994 //typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--;
│ │ │ │ +
995 --levelContext.lhs;
│ │ │ │ +
996 --levelContext.pinfo;
│ │ │ │ +
997 }
│ │ │ │ +
998 if(levelContext.redist->isSetup()) {
│ │ │ │ +
999 // Need to redistribute during prolongateVector
│ │ │ │ +
1000 levelContext.lhs.getRedistributed()=0;
│ │ │ │ +
1001 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
│ │ │ │ +
1003 levelContext.lhs.getRedistributed(),
│ │ │ │ +
1004 matrices_->getProlongationDampingFactor(),
│ │ │ │ +
1005 *levelContext.pinfo, *levelContext.redist);
│ │ │ │ +
1006 }else{
│ │ │ │ +
1007 *levelContext.lhs=0;
│ │ │ │ +
1008 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
│ │ │ │ +
1010 matrices_->getProlongationDampingFactor(),
│ │ │ │ +
1011 *levelContext.pinfo);
│ │ │ │ +
1012 }
│ │ │ │ +
1013
│ │ │ │ +
1014
│ │ │ │ +
1015 if(processNextLevel) {
│ │ │ │ +
1016 --levelContext.update;
│ │ │ │ +
1017 --levelContext.rhs;
│ │ │ │ +
1018 }
│ │ │ │ +
1019
│ │ │ │ +
1020 *levelContext.update += *levelContext.lhs;
│ │ │ │ +
1021 }
│ │ │ │ +
1022
│ │ │ │ +
1023 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1025 {
│ │ │ │ + │ │ │ │ +
1027 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
1028
│ │ │ │ +
1029 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
1030 void AMG<M,X,S,PI,A>::mgc(LevelContext& levelContext){
│ │ │ │ +
1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
│ │ │ │ +
1032 // Solve directly
│ │ │ │ + │ │ │ │ +
1034 res.converged=true; // If we do not compute this flag will not get updated
│ │ │ │ +
1035 if(levelContext.redist->isSetup()) {
│ │ │ │ +
1036 levelContext.redist->redistribute(*levelContext.rhs, levelContext.rhs.getRedistributed());
│ │ │ │ +
1037 if(levelContext.rhs.getRedistributed().size()>0) {
│ │ │ │ +
1038 // We are still participating in the computation
│ │ │ │ +
1039 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
│ │ │ │ +
1040 levelContext.rhs.getRedistributed());
│ │ │ │ +
1041 solver_->apply(levelContext.update.getRedistributed(),
│ │ │ │ +
1042 levelContext.rhs.getRedistributed(), res);
│ │ │ │ +
1043 }
│ │ │ │ +
1044 levelContext.redist->redistributeBackward(*levelContext.update, levelContext.update.getRedistributed());
│ │ │ │ +
1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
│ │ │ │ +
1046 }else{
│ │ │ │ +
1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs);
│ │ │ │ +
1048 solver_->apply(*levelContext.update, *levelContext.rhs, res);
│ │ │ │ +
1049 }
│ │ │ │ +
1050
│ │ │ │ +
1051 if (!res.converged)
│ │ │ │ +
1052 coarsesolverconverged = false;
│ │ │ │ +
1053 }else{
│ │ │ │ +
1054 // presmoothing
│ │ │ │ +
1055 presmooth(levelContext, preSteps_);
│ │ │ │ +
1056
│ │ │ │ +
1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
│ │ │ │ +
1058 bool processNextLevel = moveToCoarseLevel(levelContext);
│ │ │ │ +
1059
│ │ │ │ +
1060 if(processNextLevel) {
│ │ │ │ +
1061 // next level
│ │ │ │ +
1062 for(std::size_t i=0; i<gamma_; i++){
│ │ │ │ +
1063 mgc(levelContext);
│ │ │ │ +
1064 if (levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels())
│ │ │ │ +
1065 break;
│ │ │ │ +
1066 if(i+1 < gamma_){
│ │ │ │ +
1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs, *levelContext.rhs);
│ │ │ │ +
1068 }
│ │ │ │ +
1069 }
│ │ │ │ +
1070 }
│ │ │ │ +
1071
│ │ │ │ +
1072 moveToFineLevel(levelContext, processNextLevel);
│ │ │ │ +
1073#else
│ │ │ │ +
1074 *lhs=0;
│ │ │ │ +
1075#endif
│ │ │ │ +
1076
│ │ │ │ +
1077 if(levelContext.matrix == matrices_->matrices().finest()) {
│ │ │ │ +
1078 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
│ │ │ │ +
1079 if(!coarsesolverconverged)
│ │ │ │ +
1080 DUNE_THROW(MathError, "Coarse solver did not converge");
│ │ │ │ +
1081 }
│ │ │ │ +
1082 // postsmoothing
│ │ │ │ +
1083 postsmooth(levelContext, postSteps_);
│ │ │ │ +
1084
│ │ │ │ +
1085 }
│ │ │ │ +
1086 }
│ │ │ │ +
1087
│ │ │ │ +
1088 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
1089 void AMG<M,X,S,PI,A>::additiveMgc(){
│ │ │ │ +
1090
│ │ │ │ +
1091 // restrict residual to all levels
│ │ │ │ +
1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_->parallelInformation().finest();
│ │ │ │ +
1093 typename Hierarchy<Range,A>::Iterator rhs=rhs_->finest();
│ │ │ │ +
1094 typename Hierarchy<Domain,A>::Iterator lhs = lhs_->finest();
│ │ │ │ +
1095 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates=matrices_->aggregatesMaps().begin();
│ │ │ │ +
1096
│ │ │ │ +
1097 for(typename Hierarchy<Range,A>::Iterator fineRhs=rhs++; fineRhs != rhs_->coarsest(); fineRhs=rhs++, ++aggregates) {
│ │ │ │ +
1098 ++pinfo;
│ │ │ │ +
1099 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
1100 ::restrictVector(*(*aggregates), *rhs, static_cast<const Range&>(*fineRhs), *pinfo);
│ │ │ │ +
1101 }
│ │ │ │ +
1102
│ │ │ │ +
1103 // pinfo is invalid, set to coarsest level
│ │ │ │ +
1104 //pinfo = matrices_->parallelInformation().coarsest
│ │ │ │ +
1105 // calculate correction for all levels
│ │ │ │ +
1106 lhs = lhs_->finest();
│ │ │ │ +
1107 typename Hierarchy<Smoother,A>::Iterator smoother = smoothers_->finest();
│ │ │ │ +
1108
│ │ │ │ +
1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother) {
│ │ │ │ +
1110 // presmoothing
│ │ │ │ +
1111 *lhs=0;
│ │ │ │ +
1112 smoother->apply(*lhs, *rhs);
│ │ │ │ +
1113 }
│ │ │ │ +
1114
│ │ │ │ +
1115 // Coarse level solve
│ │ │ │ +
1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
│ │ │ │ +
1117 InverseOperatorResult res;
│ │ │ │ +
1118 pinfo->copyOwnerToAll(*rhs, *rhs);
│ │ │ │ +
1119 solver_->apply(*lhs, *rhs, res);
│ │ │ │ +
1120
│ │ │ │ +
1121 if(!res.converged)
│ │ │ │ +
1122 DUNE_THROW(MathError, "Coarse solver did not converge");
│ │ │ │ +
1123#else
│ │ │ │ +
1124 *lhs=0;
│ │ │ │ +
1125#endif
│ │ │ │ +
1126 // Prologate and add up corrections from all levels
│ │ │ │ +
1127 --pinfo;
│ │ │ │ +
1128 --aggregates;
│ │ │ │ +
1129
│ │ │ │ +
1130 for(typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--; coarseLhs != lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) {
│ │ │ │ +
1131 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ +
1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo);
│ │ │ │ +
1133 }
│ │ │ │ +
1134 }
│ │ │ │ +
1135
│ │ │ │ +
1136
│ │ │ │ +
1138 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
│ │ │ │ +
1139 void AMG<M,X,S,PI,A>::post([[maybe_unused]] Domain& x)
│ │ │ │ +
1140 {
│ │ │ │ +
1141 // Postprocess all smoothers
│ │ │ │ +
1142 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
│ │ │ │ +
1143 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
│ │ │ │ +
1144 Iterator coarsest = smoothers_->coarsest();
│ │ │ │ +
1145 Iterator smoother = smoothers_->finest();
│ │ │ │ +
1146 DIterator lhs = lhs_->finest();
│ │ │ │ +
1147 if(smoothers_->levels()>0) {
│ │ │ │ +
1148 if(smoother != coarsest || matrices_->levels()<matrices_->maxlevels())
│ │ │ │ +
1149 smoother->post(*lhs);
│ │ │ │ +
1150 if(smoother!=coarsest)
│ │ │ │ +
1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs)
│ │ │ │ +
1152 smoother->post(*lhs);
│ │ │ │ +
1153 smoother->post(*lhs);
│ │ │ │ +
1154 }
│ │ │ │ +
1155 lhs_ = nullptr;
│ │ │ │ +
1156 update_ = nullptr;
│ │ │ │ +
1157 rhs_ = nullptr;
│ │ │ │ +
1158 }
│ │ │ │ +
│ │ │ │ +
1159
│ │ │ │ +
1160 template<class M, class X, class S, class PI, class A>
│ │ │ │ +
1161 template<class A1>
│ │ │ │ +
│ │ │ │ +
1162 void AMG<M,X,S,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
│ │ │ │ +
1163 {
│ │ │ │ +
1164 matrices_->getCoarsestAggregatesOnFinest(cont);
│ │ │ │ +
1165 }
│ │ │ │ +
│ │ │ │ +
1166
│ │ │ │ +
1167 } // end namespace Amg
│ │ │ │ +
1168
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1170 template<class> struct isValidBlockType : std::false_type{};
│ │ │ │ +
1171 template<class T, int n, int m> struct isValidBlockType<FieldMatrix<T,n,m>> : std::true_type{};
│ │ │ │ +
1172
│ │ │ │ +
1173 template<class OP>
│ │ │ │ +
1174 std::shared_ptr<Dune::Preconditioner<typename OP::element_type::domain_type, typename OP::element_type::range_type> >
│ │ │ │ +
│ │ │ │ +
1175 makeAMG(const OP& op, const std::string& smoother, const Dune::ParameterTree& config) const
│ │ │ │ +
1176 {
│ │ │ │ +
1177 DUNE_THROW(Dune::Exception, "Operator type not supported by AMG");
│ │ │ │ +
1178 }
│ │ │ │ +
│ │ │ │ +
1179
│ │ │ │ +
1180 template<class M, class X, class Y>
│ │ │ │ +
1181 std::shared_ptr<Dune::Preconditioner<X,Y> >
│ │ │ │ +
│ │ │ │ +
1182 makeAMG(const std::shared_ptr<MatrixAdapter<M,X,Y>>& op, const std::string& smoother,
│ │ │ │ +
1183 const Dune::ParameterTree& config) const
│ │ │ │ +
1184 {
│ │ │ │ +
1185 using OP = MatrixAdapter<M,X,Y>;
│ │ │ │ +
1186
│ │ │ │ +
1187 if(smoother == "ssor")
│ │ │ │ +
1188 return std::make_shared<Amg::AMG<OP, X, SeqSSOR<M,X,Y>>>(op, config);
│ │ │ │ +
1189 if(smoother == "sor")
│ │ │ │ +
1190 return std::make_shared<Amg::AMG<OP, X, SeqSOR<M,X,Y>>>(op, config);
│ │ │ │ +
1191 if(smoother == "jac")
│ │ │ │ +
1192 return std::make_shared<Amg::AMG<OP, X, SeqJac<M,X,Y>>>(op, config);
│ │ │ │ +
1193 if(smoother == "gs")
│ │ │ │ +
1194 return std::make_shared<Amg::AMG<OP, X, SeqGS<M,X,Y>>>(op, config);
│ │ │ │ +
1195 if(smoother == "ilu")
│ │ │ │ +
1196 return std::make_shared<Amg::AMG<OP, X, SeqILU<M,X,Y>>>(op, config);
│ │ │ │ +
1197 else
│ │ │ │ +
1198 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
│ │ │ │ +
1199 }
│ │ │ │ +
│ │ │ │ +
1200
│ │ │ │ +
1201 template<class M, class X, class Y, class C>
│ │ │ │ +
1202 std::shared_ptr<Dune::Preconditioner<X,Y> >
│ │ │ │ +
│ │ │ │ +
1203 makeAMG(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
│ │ │ │ +
1204 const Dune::ParameterTree& config) const
│ │ │ │ +
1205 {
│ │ │ │ + │ │ │ │ +
1207
│ │ │ │ +
1208 auto cop = std::static_pointer_cast<const OP>(op);
│ │ │ │ +
1209
│ │ │ │ +
1210 if(smoother == "ssor")
│ │ │ │ +
1211 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ +
1212 if(smoother == "sor")
│ │ │ │ +
1213 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ +
1214 if(smoother == "jac")
│ │ │ │ +
1215 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqJac<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ +
1216 if(smoother == "gs")
│ │ │ │ +
1217 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqGS<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ +
1218 if(smoother == "ilu")
│ │ │ │ +
1219 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqILU<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ +
1220 else
│ │ │ │ +
1221 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
│ │ │ │ +
1222 }
│ │ │ │ +
│ │ │ │ +
1223
│ │ │ │ +
1224 template<class M, class X, class Y, class C>
│ │ │ │ +
1225 std::shared_ptr<Dune::Preconditioner<X,Y> >
│ │ │ │ +
│ │ │ │ +
1226 makeAMG(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
│ │ │ │ +
1227 const Dune::ParameterTree& config) const
│ │ │ │ +
1228 {
│ │ │ │ + │ │ │ │ +
1230
│ │ │ │ +
1231 if(smoother == "ssor")
│ │ │ │ +
1232 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ +
1233 if(smoother == "sor")
│ │ │ │ +
1234 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ +
1235 if(smoother == "jac")
│ │ │ │ +
1236 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqJac<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ +
1237 if(smoother == "gs")
│ │ │ │ +
1238 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqGS<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ +
1239 if(smoother == "ilu")
│ │ │ │ +
1240 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqILU<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ +
1241 else
│ │ │ │ +
1242 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
│ │ │ │ +
1243 }
│ │ │ │ +
│ │ │ │ +
1244
│ │ │ │ +
1245 template<typename TL, typename OP>
│ │ │ │ +
1246 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
1247 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
│ │ │ │ +
1248 operator() (TL tl, const std::shared_ptr<OP>& op, const Dune::ParameterTree& config,
│ │ │ │ + │ │ │ │ +
1250 {
│ │ │ │ +
1251 using field_type = typename OP::matrix_type::field_type;
│ │ │ │ +
1252 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
1253 if (!std::is_convertible<field_type, real_type>())
│ │ │ │ +
1254 DUNE_THROW(UnsupportedType, "AMG needs field_type(" <<
│ │ │ │ +
1255 className<field_type>() <<
│ │ │ │ +
1256 ") to be convertible to its real_type (" <<
│ │ │ │ +
1257 className<real_type>() <<
│ │ │ │ +
1258 ").");
│ │ │ │ +
1259 using D = typename Dune::TypeListElement<1, decltype(tl)>::type;
│ │ │ │ +
1260 using R = typename Dune::TypeListElement<2, decltype(tl)>::type;
│ │ │ │ +
1261 std::shared_ptr<Preconditioner<D,R>> amg;
│ │ │ │ +
1262 std::string smoother = config.get("smoother", "ssor");
│ │ │ │ +
1263 return makeAMG(op, smoother, config);
│ │ │ │ +
1264 }
│ │ │ │ +
│ │ │ │ +
1265
│ │ │ │ +
1266 template<typename TL, typename OP>
│ │ │ │ +
1267 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
1268 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
│ │ │ │ +
1269 operator() (TL /*tl*/, const std::shared_ptr<OP>& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ + │ │ │ │ +
1271 {
│ │ │ │ +
1272 DUNE_THROW(UnsupportedType, "AMG needs a FieldMatrix as Matrix block_type");
│ │ │ │ +
1273 }
│ │ │ │ +
│ │ │ │ +
1274 };
│ │ │ │ +
│ │ │ │ +
1275
│ │ │ │ + │ │ │ │ +
1277} // end namespace Dune
│ │ │ │ +
1278
│ │ │ │ +
1279#endif
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
Define base class for scalar product and norm.
│ │ │ │ +
#define DUNE_REGISTER_PRECONDITIONER(name,...)
Definition solverregistry.hh:16
│ │ │ │ +
Provides a classes representing the hierarchies in AMG.
│ │ │ │ +
Classes for the generic construction and application of the smoothers.
│ │ │ │ +
Prolongation and restriction for amg.
│ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ +
Classes for using SuperLU with ISTL matrices.
│ │ │ │ +
Classes for using UMFPack with ISTL matrices.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2)
Definition galerkin.hh:155
│ │ │ │ -
static void constructNonOverlapConnectivity(R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed)
Construct the connectivity of an aggregate in the overlap.
Definition galerkin.hh:313
│ │ │ │ -
G Graph
The type of the graph.
Definition galerkin.hh:211
│ │ │ │ -
void operator++()
Definition galerkin.hh:539
│ │ │ │ -
void operator()(const ConstEdgeIterator &edge)
Process an edge pointing to another aggregate.
Definition galerkin.hh:359
│ │ │ │ -
void insert(const typename M::size_type &index)
Definition galerkin.hh:552
│ │ │ │ -
static void constructOverlapConnectivity(R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const OverlapVertex< typename G::VertexDescriptor > *&seed, const OverlapVertex< typename G::VertexDescriptor > *overlapEnd)
Definition galerkin.hh:331
│ │ │ │ -
G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation &pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::Matrix::size_type &size, const Set &copy)
Calculates the coarse matrix via a Galerkin product.
Definition galerkin.hh:563
│ │ │ │ -
std::size_t index()
Definition galerkin.hh:81
│ │ │ │ -
T ParallelInformation
Definition galerkin.hh:120
│ │ │ │ -
G::VertexDescriptor Vertex
Definition galerkin.hh:272
│ │ │ │ -
T Aggregate
The aggregate descriptor.
Definition galerkin.hh:37
│ │ │ │ -
SparsityBuilder(M &matrix)
Constructor.
Definition galerkin.hh:513
│ │ │ │ -
ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph, VisitedMap &visitedMap, Set &connected)
Constructor.
Definition galerkin.hh:352
│ │ │ │ -
Graph::ConstEdgeIterator ConstEdgeIterator
The constant edge iterator.
Definition galerkin.hh:215
│ │ │ │ -
T Vertex
The vertex descriptor.
Definition galerkin.hh:42
│ │ │ │ -
G::VertexDescriptor Vertex
Definition galerkin.hh:288
│ │ │ │ -
static void examine(G &graph, V &visitedMap, const T &pinfo, const AggregatesMap< Vertex > &aggregates, const O &overlap, const OverlapVertex< Vertex > *overlapVertices, const OverlapVertex< Vertex > *overlapEnd, R &row)
Definition galerkin.hh:420
│ │ │ │ -
V VisitedMap
The type of the map for marking vertices as visited.
Definition galerkin.hh:225
│ │ │ │ -
int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
Visit all neighbour vertices of a vertex in a graph.
│ │ │ │ -
S Set
The type of the connected set.
Definition galerkin.hh:220
│ │ │ │ -
Aggregate * aggregate
The aggregate the vertex belongs to.
Definition galerkin.hh:47
│ │ │ │ -
std::size_t sumRowSize()
Definition galerkin.hh:534
│ │ │ │ -
Vertex vertex
The vertex descriptor.
Definition galerkin.hh:52
│ │ │ │ -
std::size_t minRowSize()
Definition galerkin.hh:528
│ │ │ │ -
static void set(M &coarse, const T &pinfo, const O &copy)
Definition galerkin.hh:682
│ │ │ │ -
Graph::VertexDescriptor Vertex
The vertex descriptor of the graph.
Definition galerkin.hh:230
│ │ │ │ -
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
Calculate the galerkin product.
│ │ │ │ -
std::size_t maxRowSize()
Definition galerkin.hh:523
│ │ │ │ -
STL namespace.
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
AMG(const AMG &amg)
Copy constructor.
Definition amg.hh:392
│ │ │ │ +
void pre(Domain &x, Range &b)
Prepare the preconditioner.
Definition amg.hh:801
│ │ │ │ +
static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector)
Definition amg.hh:681
│ │ │ │ +
static std::string name()
Definition amg.hh:680
│ │ │ │ +
Hierarchy< Domain, A >::Iterator update
The iterator over the updates.
Definition amg.hh:303
│ │ │ │ +
Hierarchy< Range, A >::Iterator rhs
The iterator over the right hand sided.
Definition amg.hh:307
│ │ │ │ +
static std::string name()
Definition amg.hh:672
│ │ │ │ +
bool usesDirectCoarseLevelSolver() const
Check whether the coarse solver used is a direct solver.
Definition amg.hh:1024
│ │ │ │ +
X Domain
The domain type.
Definition amg.hh:87
│ │ │ │ +
static type * create(const M &mat, bool verbose, bool reusevector)
Definition amg.hh:644
│ │ │ │ +
AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs &smootherArgs, const Parameters &parms)
Construct a new amg with a specific coarse solver.
Definition amg.hh:406
│ │ │ │ +
AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree &configuration, const ParallelInformation &pinfo=ParallelInformation())
Constructor an AMG via ParameterTree.
Definition amg.hh:452
│ │ │ │ +
ParallelInformationHierarchy::Iterator pinfo
The iterator over the parallel information.
Definition amg.hh:287
│ │ │ │ +
SolverType
Definition amg.hh:627
│ │ │ │ +
OperatorHierarchy::AggregatesMapList::const_iterator aggregates
The iterator over the aggregates maps.
Definition amg.hh:295
│ │ │ │ +
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition amg.hh:100
│ │ │ │ +
Solver< Matrix, solver > SelectedSolver
Definition amg.hh:677
│ │ │ │ +
std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< MatrixAdapter< M, X, Y > > &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1182
│ │ │ │ +
std::string operator()(const std::string &str)
Definition amg.hh:378
│ │ │ │ +
std::shared_ptr< Dune::Preconditioner< typename OP::element_type::domain_type, typename OP::element_type::range_type > > makeAMG(const OP &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1175
│ │ │ │ +
S Smoother
The type of the smoother.
Definition amg.hh:97
│ │ │ │ +
static std::string name()
Definition amg.hh:649
│ │ │ │ +
Hierarchy< Smoother, A >::Iterator smoother
The iterator over the smoothers.
Definition amg.hh:279
│ │ │ │ +
M Operator
The matrix operator type.
Definition amg.hh:73
│ │ │ │ +
OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
The iterator over the matrices.
Definition amg.hh:283
│ │ │ │ + │ │ │ │ +
static type * create(const M &mat, bool verbose, bool reusevector)
Definition amg.hh:668
│ │ │ │ +
OperatorHierarchy::RedistributeInfoList::const_iterator redist
The iterator over the redistribution information.
Definition amg.hh:291
│ │ │ │ +
X Range
The range type.
Definition amg.hh:89
│ │ │ │ +
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ +
void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
Get the aggregate number of each unknown on the coarsest level.
Definition amg.hh:1162
│ │ │ │ +
std::size_t levels()
Definition amg.hh:876
│ │ │ │ +
InverseOperator< Vector, Vector > type
Definition amg.hh:643
│ │ │ │ +
std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1203
│ │ │ │ +
Hierarchy< Domain, A >::Iterator lhs
The iterator over the left hand side.
Definition amg.hh:299
│ │ │ │ +
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ +
static constexpr SolverType solver
Definition amg.hh:629
│ │ │ │ +
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ +
static constexpr bool isDirectSolver
Definition amg.hh:679
│ │ │ │ +
void recalculateHierarchy()
Recalculate the matrix hierarchy.
Definition amg.hh:221
│ │ │ │ +
Matrix::field_type field_type
Definition amg.hh:626
│ │ │ │ +
SelectedSolver::type DirectSolver
Definition amg.hh:678
│ │ │ │ +
std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL tl, const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std::enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value, int >=0) const
Definition amg.hh:1248
│ │ │ │ +
OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
The parallal data distribution hierarchy type.
Definition amg.hh:84
│ │ │ │ +
InverseOperator< X, X > CoarseSolver
the type of the coarse solver.
Definition amg.hh:91
│ │ │ │ +
void post(Domain &x)
Clean up.
Definition amg.hh:1139
│ │ │ │ +
std::size_t maxlevels()
Definition amg.hh:881
│ │ │ │ +
std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1226
│ │ │ │ +
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ +
std::size_t level
The level index.
Definition amg.hh:311
│ │ │ │ +
AMG(const Operator &fineOperator, const C &criterion, const SmootherArgs &smootherArgs=SmootherArgs(), const ParallelInformation &pinfo=ParallelInformation())
Construct an AMG with an inexact coarse solver based on the smoother.
Definition amg.hh:428
│ │ │ │ +
void apply(Domain &v, const Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition amg.hh:888
│ │ │ │ +
Smoother SmootherType
Definition amg.hh:275
│ │ │ │ +
MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
The operator hierarchy type.
Definition amg.hh:82
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition amg.hh:194
│ │ │ │ +
PI ParallelInformation
The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
Definition amg.hh:80
│ │ │ │ +
@ none
Definition amg.hh:627
│ │ │ │ +
@ umfpack
Definition amg.hh:627
│ │ │ │ +
@ superlu
Definition amg.hh:627
│ │ │ │ +
@ atOnceAccu
Accumulate data to one process at once.
Definition parameters.hh:244
│ │ │ │ +
@ noAccu
No data accumulution.
Definition parameters.hh:238
│ │ │ │ +
@ successiveAccu
Successively accumulate to fewer processes.
Definition parameters.hh:248
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
A Dummy visitor that does nothing for each visited edge.
Definition aggregates.hh:598
│ │ │ │ -
Definition galerkin.hh:33
│ │ │ │ -
Functor for building the sparsity pattern of the matrix using examineConnectivity.
Definition galerkin.hh:63
│ │ │ │ -
Definition galerkin.hh:99
│ │ │ │ -
Definition galerkin.hh:118
│ │ │ │ -
Definition galerkin.hh:185
│ │ │ │ -
Visitor for identifying connected aggregates during a breadthFirstSearch.
Definition galerkin.hh:206
│ │ │ │ -
Definition galerkin.hh:271
│ │ │ │ -
Definition galerkin.hh:300
│ │ │ │ +
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ +
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ +
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │ +
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │ +
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ +
Norm that uses only the [N][N] entry of the block to determine couplings.
Definition aggregates.hh:379
│ │ │ │ +
Functor using the row sum (infinity) norm to determine strong couplings.
Definition aggregates.hh:463
│ │ │ │ +
Definition aggregates.hh:480
│ │ │ │ +
Definition aggregates.hh:496
│ │ │ │ +
Criterion taking advantage of symmetric matrices.
Definition aggregates.hh:519
│ │ │ │ +
Criterion suitable for unsymmetric matrices.
Definition aggregates.hh:539
│ │ │ │ +
an algebraic multigrid method using a Krylov-cycle.
Definition kamg.hh:140
│ │ │ │ +
Two grid operator for AMG with Krylov cycle.
Definition kamg.hh:33
│ │ │ │ +
Parallel algebraic multigrid based on agglomeration.
Definition amg.hh:65
│ │ │ │ +
Definition amg.hh:625
│ │ │ │ + │ │ │ │ +
Definition amg.hh:1169
│ │ │ │ + │ │ │ │ +
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ + │ │ │ │ +
LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ +
Iterator over the levels in the hierarchy.
Definition hierarchy.hh:120
│ │ │ │ +
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ +
The criterion describing the stop criteria for the coarsening process.
Definition matrixhierarchy.hh:283
│ │ │ │ +
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │
Definition pinfo.hh:28
│ │ │ │ -
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ +
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioner.hh:39
│ │ │ │ +
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ +
Definition solvercategory.hh:54
│ │ │ │ +
Definition solverregistry.hh:77
│ │ │ │ +
Definition solvertype.hh:16
│ │ │ │ +
SuperLu Solver.
Definition superlu.hh:271
│ │ │ │ +
Definition umfpack.hh:49
│ │ │ │ +
The UMFPack direct sparse solver.
Definition umfpack.hh:335
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,816 +1,1597 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -galerkin.hh │ │ │ │ │ +amg.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_GALERKIN_HH │ │ │ │ │ -6#define DUNE_GALERKIN_HH │ │ │ │ │ +5#ifndef DUNE_AMG_AMG_HH │ │ │ │ │ +6#define DUNE_AMG_AMG_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ -9#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e │ │ │ │ │ -17{ │ │ │ │ │ -18 namespace Amg │ │ │ │ │ -19 { │ │ │ │ │ -31 template │ │ │ │ │ -_3_2 struct _O_v_e_r_l_a_p_V_e_r_t_e_x │ │ │ │ │ -33 { │ │ │ │ │ -_3_7 typedef T _A_g_g_r_e_g_a_t_e; │ │ │ │ │ -38 │ │ │ │ │ -_4_2 typedef T _V_e_r_t_e_x; │ │ │ │ │ -43 │ │ │ │ │ -_4_7 _A_g_g_r_e_g_a_t_e* _a_g_g_r_e_g_a_t_e; │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ +13#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23#include │ │ │ │ │ +24 │ │ │ │ │ +25namespace _D_u_n_e │ │ │ │ │ +26{ │ │ │ │ │ +27 namespace Amg │ │ │ │ │ +28 { │ │ │ │ │ +46 template │ │ │ │ │ +47 class KAMG; │ │ │ │ │ 48 │ │ │ │ │ -_5_2 _V_e_r_t_e_x _v_e_r_t_e_x; │ │ │ │ │ -53 }; │ │ │ │ │ -54 │ │ │ │ │ -55 │ │ │ │ │ -56 │ │ │ │ │ -61 template │ │ │ │ │ -_6_2 class _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r │ │ │ │ │ -63 { │ │ │ │ │ -64 public: │ │ │ │ │ -70 _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r(M& matrix); │ │ │ │ │ -71 │ │ │ │ │ -72 void _i_n_s_e_r_t(const typename M::size_type& _i_n_d_e_x); │ │ │ │ │ -73 │ │ │ │ │ -74 void _o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -75 │ │ │ │ │ -76 std::size_t _m_i_n_R_o_w_S_i_z_e(); │ │ │ │ │ -77 │ │ │ │ │ -78 std::size_t _m_a_x_R_o_w_S_i_z_e(); │ │ │ │ │ -79 │ │ │ │ │ -80 std::size_t _s_u_m_R_o_w_S_i_z_e(); │ │ │ │ │ -_8_1 std::size_t _i_n_d_e_x() │ │ │ │ │ -82 { │ │ │ │ │ -83 return row_.index(); │ │ │ │ │ -84 } │ │ │ │ │ -85 private: │ │ │ │ │ -87 typename M::CreateIterator row_; │ │ │ │ │ -89 std::size_t minRowSize_; │ │ │ │ │ -91 std::size_t maxRowSize_; │ │ │ │ │ -92 std::size_t sumRowSize_; │ │ │ │ │ -93#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -94 bool diagonalInserted; │ │ │ │ │ -95#endif │ │ │ │ │ -96 }; │ │ │ │ │ -97 │ │ │ │ │ -_9_8 class _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -99 { │ │ │ │ │ -100 public: │ │ │ │ │ -109 template │ │ │ │ │ -_1_1_0 void _c_a_l_c_u_l_a_t_e(const M& fine, const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_>& aggregates, M& │ │ │ │ │ -coarse, │ │ │ │ │ -111 const I& pinfo, const O& copy); │ │ │ │ │ -112 │ │ │ │ │ -113 }; │ │ │ │ │ -114 │ │ │ │ │ -115 template │ │ │ │ │ -_1_1_6 class _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -117 : public _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -118 { │ │ │ │ │ -119 public: │ │ │ │ │ -_1_2_0 typedef T _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -121 │ │ │ │ │ -131 template │ │ │ │ │ -132 typename G::MutableMatrix* _b_u_i_l_d(G& fineGraph, V& visitedMap, │ │ │ │ │ -133 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -134 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -135 const typename G::Matrix::size_type& size, │ │ │ │ │ -136 const Set& copy); │ │ │ │ │ -137 private: │ │ │ │ │ -138 │ │ │ │ │ -145 template │ │ │ │ │ -146 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* │ │ │ │ │ -147 buildOverlapVertices(const G& graph, const I& pinfo, │ │ │ │ │ -148 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -149 const Set& overlap, │ │ │ │ │ -150 std::size_t& overlapCount); │ │ │ │ │ -151 │ │ │ │ │ -152 template │ │ │ │ │ -153 struct OVLess │ │ │ │ │ -154 { │ │ │ │ │ -_1_5_5 bool _o_p_e_r_a_t_o_r_(_)(const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_A_>& o1, const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_A_>& o2) │ │ │ │ │ -156 { │ │ │ │ │ -157 return *o1._a_g_g_r_e_g_a_t_e < *o2._a_g_g_r_e_g_a_t_e; │ │ │ │ │ -158 } │ │ │ │ │ -159 }; │ │ │ │ │ -160 }; │ │ │ │ │ -161 │ │ │ │ │ -162 template<> │ │ │ │ │ -_1_6_3 class _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ -164 : public _B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -165 { │ │ │ │ │ -166 public: │ │ │ │ │ -176 template │ │ │ │ │ -177 typename G::MutableMatrix* _b_u_i_l_d(G& fineGraph, V& visitedMap, │ │ │ │ │ -178 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -179 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -180 const typename G::Matrix::size_type& size, │ │ │ │ │ -181 const Set& copy); │ │ │ │ │ -182 }; │ │ │ │ │ -183 │ │ │ │ │ -_1_8_4 struct _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ -185 { │ │ │ │ │ -186 template │ │ │ │ │ -187 static void _c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, G& graph, V& visitedMap, │ │ │ │ │ -188 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -189 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>*& seed, │ │ │ │ │ -190 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* overlapEnd); │ │ │ │ │ -191 │ │ │ │ │ -195 template │ │ │ │ │ -196 static void _c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, G& graph, V& │ │ │ │ │ -visitedMap, │ │ │ │ │ -197 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -198 const typename G::VertexDescriptor& seed); │ │ │ │ │ -199 │ │ │ │ │ -200 │ │ │ │ │ -204 template │ │ │ │ │ -_2_0_5 class _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ -206 { │ │ │ │ │ -207 public: │ │ │ │ │ -_2_1_1 typedef G _G_r_a_p_h; │ │ │ │ │ -_2_1_5 typedef typename Graph::ConstEdgeIterator _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -216 │ │ │ │ │ -_2_2_0 typedef S _S_e_t; │ │ │ │ │ -221 │ │ │ │ │ -_2_2_5 typedef V _V_i_s_i_t_e_d_M_a_p; │ │ │ │ │ -226 │ │ │ │ │ -_2_3_0 typedef typename Graph::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ +49 template │ │ │ │ │ +50 class KAmgTwoGrid; │ │ │ │ │ +51 │ │ │ │ │ +62 template > │ │ │ │ │ +_6_4 class _A_M_G : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +65 { │ │ │ │ │ +66 template │ │ │ │ │ +_6_7 friend class _K_A_M_G; │ │ │ │ │ +68 │ │ │ │ │ +69 friend class _K_A_m_g_T_w_o_G_r_i_d<_A_M_G>; │ │ │ │ │ +70 │ │ │ │ │ +71 public: │ │ │ │ │ +_7_3 typedef M _O_p_e_r_a_t_o_r; │ │ │ │ │ +_8_0 typedef PI _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ +_8_2 typedef _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_> _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y; │ │ │ │ │ +_8_4 typedef typename _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ +85 │ │ │ │ │ +_8_7 typedef X _D_o_m_a_i_n; │ │ │ │ │ +_8_9 typedef X _R_a_n_g_e; │ │ │ │ │ +_9_1 typedef _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_X_> _C_o_a_r_s_e_S_o_l_v_e_r; │ │ │ │ │ +_9_7 typedef S _S_m_o_o_t_h_e_r; │ │ │ │ │ +98 │ │ │ │ │ +_1_0_0 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ +101 │ │ │ │ │ +_1_1_1 _A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& coarseSolver, │ │ │ │ │ +112 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, const _P_a_r_a_m_e_t_e_r_s& parms); │ │ │ │ │ +113 │ │ │ │ │ +125 template │ │ │ │ │ +_1_2_6 _A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ +127 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs=_S_m_o_o_t_h_e_r_A_r_g_s(), │ │ │ │ │ +128 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ +129 │ │ │ │ │ +_1_8_0 _A_M_G(std::shared_ptr fineOperator, const ParameterTree& │ │ │ │ │ +configuration, const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ +181 │ │ │ │ │ +_1_8_5 _A_M_G(const _A_M_G& amg); │ │ │ │ │ +186 │ │ │ │ │ +_1_8_8 void _p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b); │ │ │ │ │ +189 │ │ │ │ │ +_1_9_1 void _a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d); │ │ │ │ │ +192 │ │ │ │ │ +_1_9_4 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +195 { │ │ │ │ │ +196 return category_; │ │ │ │ │ +197 } │ │ │ │ │ +198 │ │ │ │ │ +_2_0_0 void _p_o_s_t(_D_o_m_a_i_n& x); │ │ │ │ │ +201 │ │ │ │ │ +206 template │ │ │ │ │ +_2_0_7 void _g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont); │ │ │ │ │ +208 │ │ │ │ │ +_2_0_9 std::size_t _l_e_v_e_l_s(); │ │ │ │ │ +210 │ │ │ │ │ +_2_1_1 std::size_t _m_a_x_l_e_v_e_l_s(); │ │ │ │ │ +212 │ │ │ │ │ +_2_2_1 void _r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y() │ │ │ │ │ +222 { │ │ │ │ │ +223 matrices_->recalculateGalerkin(NegateSet()); │ │ │ │ │ +224 } │ │ │ │ │ +225 │ │ │ │ │ +_2_3_0 bool _u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const; │ │ │ │ │ 231 │ │ │ │ │ -239 _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, _G_r_a_p_h& graph, │ │ │ │ │ -240 _V_i_s_i_t_e_d_M_a_p& visitedMap, _S_e_t& connected); │ │ │ │ │ -241 │ │ │ │ │ -246 void _o_p_e_r_a_t_o_r_(_)(const _C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge); │ │ │ │ │ -247 │ │ │ │ │ -248 private: │ │ │ │ │ -252 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ -253 │ │ │ │ │ -254 _G_r_a_p_h& graph_; │ │ │ │ │ -255 │ │ │ │ │ -259 _V_i_s_i_t_e_d_M_a_p& visitedMap_; │ │ │ │ │ -260 │ │ │ │ │ -264 _S_e_t& connected_; │ │ │ │ │ -265 }; │ │ │ │ │ -266 │ │ │ │ │ -267 }; │ │ │ │ │ -268 │ │ │ │ │ -269 template │ │ │ │ │ -_2_7_0 struct _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r : public _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ -271 { │ │ │ │ │ -_2_7_2 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ -273 │ │ │ │ │ -274 template │ │ │ │ │ -275 static void _e_x_a_m_i_n_e(G& graph, │ │ │ │ │ -276 V& visitedMap, │ │ │ │ │ -277 const T& pinfo, │ │ │ │ │ -278 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -279 const O& overlap, │ │ │ │ │ -280 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapVertices, │ │ │ │ │ -281 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapEnd, │ │ │ │ │ -282 R& row); │ │ │ │ │ -283 }; │ │ │ │ │ -284 │ │ │ │ │ -285 template │ │ │ │ │ -_2_8_6 struct _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r : public │ │ │ │ │ -_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ -287 { │ │ │ │ │ -_2_8_8 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ -289 │ │ │ │ │ -290 template │ │ │ │ │ -291 static void _e_x_a_m_i_n_e(G& graph, │ │ │ │ │ -292 V& visitedMap, │ │ │ │ │ -293 const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -294 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -295 R& row); │ │ │ │ │ -296 }; │ │ │ │ │ -297 │ │ │ │ │ -298 template │ │ │ │ │ -_2_9_9 struct _D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r │ │ │ │ │ -300 { │ │ │ │ │ -301 template │ │ │ │ │ -302 static void _s_e_t(M& coarse, const T& pinfo, const O& copy); │ │ │ │ │ -303 }; │ │ │ │ │ -304 │ │ │ │ │ -305 template<> │ │ │ │ │ -_3_0_6 struct _D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r<_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n> │ │ │ │ │ -307 { │ │ │ │ │ -308 template │ │ │ │ │ -309 static void _s_e_t(M& coarse, const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, const O& │ │ │ │ │ -copy); │ │ │ │ │ -310 }; │ │ │ │ │ -311 │ │ │ │ │ -312 template │ │ │ │ │ -_3_1_3 void _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, │ │ │ │ │ -G& graph, V& visitedMap, │ │ │ │ │ -314 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -315 const typename G::VertexDescriptor& seed) │ │ │ │ │ -316 { │ │ │ │ │ -317 assert(row.index()==aggregates[seed]); │ │ │ │ │ -318 row.insert(aggregates[seed]); │ │ │ │ │ -319 _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_R_,_V_> conBuilder(aggregates, graph, visitedMap, row); │ │ │ │ │ -320 typedef typename G::VertexDescriptor Vertex; │ │ │ │ │ -321 typedef std::allocator Allocator; │ │ │ │ │ -322 typedef SLList VertexList; │ │ │ │ │ -323 typedef typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r DummyVisitor; │ │ │ │ │ -324 VertexList vlist; │ │ │ │ │ -325 DummyVisitor dummy; │ │ │ │ │ -326 aggregates.template breadthFirstSearch(seed,aggregates[seed], │ │ │ │ │ -graph, vlist, dummy, │ │ │ │ │ -327 conBuilder, visitedMap); │ │ │ │ │ -328 } │ │ │ │ │ -329 │ │ │ │ │ -330 template │ │ │ │ │ -_3_3_1 void _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(R& row, G& │ │ │ │ │ -graph, V& visitedMap, │ │ │ │ │ -332 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -333 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>*& seed, │ │ │ │ │ -334 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* overlapEnd) │ │ │ │ │ -335 { │ │ │ │ │ -336 _C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_R_,_V_> conBuilder(aggregates, graph, visitedMap, row); │ │ │ │ │ -337 const typename G::VertexDescriptor aggregate=*seed->_a_g_g_r_e_g_a_t_e; │ │ │ │ │ -338 │ │ │ │ │ -339 if (row.index()==*seed->_a_g_g_r_e_g_a_t_e) { │ │ │ │ │ -340 while(seed != overlapEnd && aggregate == *seed->_a_g_g_r_e_g_a_t_e) { │ │ │ │ │ -341 row.insert(*seed->_a_g_g_r_e_g_a_t_e); │ │ │ │ │ -342 // Walk over all neighbours and add them to the connected array. │ │ │ │ │ -343 _v_i_s_i_t_N_e_i_g_h_b_o_u_r_s(graph, seed->_v_e_r_t_e_x, conBuilder); │ │ │ │ │ -344 // Mark vertex as visited │ │ │ │ │ -345 put(visitedMap, seed->_v_e_r_t_e_x, true); │ │ │ │ │ -346 ++seed; │ │ │ │ │ -347 } │ │ │ │ │ -348 } │ │ │ │ │ -349 } │ │ │ │ │ -350 │ │ │ │ │ -351 template │ │ │ │ │ -_3_5_2 _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_S_,_V_>_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ -(const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -353 _G_r_a_p_h& graph, _V_i_s_i_t_e_d_M_a_p& visitedMap, │ │ │ │ │ -354 _S_e_t& connected) │ │ │ │ │ -355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap), │ │ │ │ │ -connected_(connected) │ │ │ │ │ -356 {} │ │ │ │ │ -357 │ │ │ │ │ -358 template │ │ │ │ │ -_3_5_9 void _B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_<_G_,_S_,_V_>_:_:_o_p_e_r_a_t_o_r_(_)(const │ │ │ │ │ -_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r& edge) │ │ │ │ │ -360 { │ │ │ │ │ -361 const _V_e_r_t_e_x& vertex = aggregates_[edge.target()]; │ │ │ │ │ -362 assert(vertex!= _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_U_N_A_G_G_R_E_G_A_T_E_D); │ │ │ │ │ -363 if(vertex!= _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) │ │ │ │ │ -364 connected_.insert(vertex); │ │ │ │ │ -365 } │ │ │ │ │ -366 │ │ │ │ │ -367 template │ │ │ │ │ -368 template │ │ │ │ │ -369 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>* │ │ │ │ │ -370 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_T_>_:_:_b_u_i_l_d_O_v_e_r_l_a_p_V_e_r_t_i_c_e_s(const G& graph, const I& pinfo, │ │ │ │ │ -371 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -372 const Set& overlap, │ │ │ │ │ -373 std::size_t& overlapCount) │ │ │ │ │ -374 { │ │ │ │ │ -375 // count the overlap vertices. │ │ │ │ │ -376 typedef typename G::ConstVertexIterator ConstIterator; │ │ │ │ │ -377 typedef typename I::GlobalLookupIndexSet GlobalLookup; │ │ │ │ │ -378 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ -379 │ │ │ │ │ -380 const ConstIterator end = graph.end(); │ │ │ │ │ -381 overlapCount = 0; │ │ │ │ │ -382 │ │ │ │ │ -383 const GlobalLookup& lookup=pinfo.globalLookup(); │ │ │ │ │ -384 │ │ │ │ │ -385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) { │ │ │ │ │ -386 const IndexPair* pair = lookup.pair(*vertex); │ │ │ │ │ -387 │ │ │ │ │ -388 if(pair!=0 && overlap.contains(pair->local().attribute())) │ │ │ │ │ -389 ++overlapCount; │ │ │ │ │ -390 } │ │ │ │ │ -391 // Allocate space │ │ │ │ │ -392 typedef typename G::VertexDescriptor Vertex; │ │ │ │ │ -393 │ │ │ │ │ -394 _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapVertices = new _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_> │ │ │ │ │ -[overlapCount=0 ? 1 : overlapCount]; │ │ │ │ │ -395 if(overlapCount==0) │ │ │ │ │ -396 return overlapVertices; │ │ │ │ │ -397 │ │ │ │ │ -398 // Initialize them │ │ │ │ │ -399 overlapCount=0; │ │ │ │ │ -400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) { │ │ │ │ │ -401 const IndexPair* pair = lookup.pair(*vertex); │ │ │ │ │ -402 │ │ │ │ │ -403 if(pair!=0 && overlap.contains(pair->local().attribute())) { │ │ │ │ │ -404 overlapVertices[overlapCount]._a_g_g_r_e_g_a_t_e = &aggregates[pair->local()]; │ │ │ │ │ -405 overlapVertices[overlapCount]._v_e_r_t_e_x = pair->local(); │ │ │ │ │ -406 ++overlapCount; │ │ │ │ │ -407 } │ │ │ │ │ -408 } │ │ │ │ │ -409 │ │ │ │ │ -410 dverb << overlapCount<<" overlap vertices"<()); │ │ │ │ │ -413 // due to the sorting the isolated aggregates (to be skipped) are at the │ │ │ │ │ -end. │ │ │ │ │ -414 │ │ │ │ │ -415 return overlapVertices; │ │ │ │ │ -416 } │ │ │ │ │ -417 │ │ │ │ │ -418 template │ │ │ │ │ -419 template │ │ │ │ │ -_4_2_0 void _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_G_,_T_>_:_:_e_x_a_m_i_n_e(G& graph, │ │ │ │ │ -421 V& visitedMap, │ │ │ │ │ -422 const T& pinfo, │ │ │ │ │ -423 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -424 const O& overlap, │ │ │ │ │ -425 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapVertices, │ │ │ │ │ -426 const _O_v_e_r_l_a_p_V_e_r_t_e_x_<_V_e_r_t_e_x_>* overlapEnd, │ │ │ │ │ -427 R& row) │ │ │ │ │ -428 { │ │ │ │ │ -429 typedef typename T::GlobalLookupIndexSet GlobalLookup; │ │ │ │ │ -430 const GlobalLookup& lookup = pinfo.globalLookup(); │ │ │ │ │ -431 │ │ │ │ │ -432 typedef typename G::VertexIterator VertexIterator; │ │ │ │ │ -433 │ │ │ │ │ -434 VertexIterator vend=graph.end(); │ │ │ │ │ -435 │ │ │ │ │ -436#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -437 std::set examined; │ │ │ │ │ -438#endif │ │ │ │ │ -439 │ │ │ │ │ -440 // The aggregates owned by the process have lower local indices │ │ │ │ │ -441 // then those not owned. We process them in the first pass. │ │ │ │ │ -442 // They represent the rows 0, 1, ..., n of the coarse matrix │ │ │ │ │ -443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) │ │ │ │ │ -444 if(!_g_e_t(visitedMap, *vertex)) { │ │ │ │ │ -445 // In the first pass we only process owner nodes │ │ │ │ │ -446 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ -447 const IndexPair* pair = lookup.pair(*vertex); │ │ │ │ │ -448 if(pair==0 || !overlap.contains(pair->local().attribute())) { │ │ │ │ │ -449#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -450 assert(examined.find(aggregates[*vertex])==examined.end()); │ │ │ │ │ -451 examined.insert(aggregates[*vertex]); │ │ │ │ │ -452#endif │ │ │ │ │ -453 _c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ -*vertex); │ │ │ │ │ -454 │ │ │ │ │ -455 // only needed for ALU │ │ │ │ │ -456 // (ghosts with same global id as owners on the same process) │ │ │ │ │ -457 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(pinfo) == static_cast(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ -_n_o_n_o_v_e_r_l_a_p_p_i_n_g)) { │ │ │ │ │ -458 if(overlapVertices != overlapEnd) { │ │ │ │ │ -459 if(*overlapVertices->_a_g_g_r_e_g_a_t_e!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) { │ │ │ │ │ -460 _c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ -overlapVertices, overlapEnd); │ │ │ │ │ -461 } │ │ │ │ │ -462 else{ │ │ │ │ │ -463 ++overlapVertices; │ │ │ │ │ -464 } │ │ │ │ │ -465 } │ │ │ │ │ -466 } │ │ │ │ │ -467 ++row; │ │ │ │ │ -468 } │ │ │ │ │ -469 } │ │ │ │ │ -470 │ │ │ │ │ -471 dvverb<<"constructed "<_a_g_g_r_e_g_a_t_e!=_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) { │ │ │ │ │ -477 │ │ │ │ │ -478#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -479 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ -480 const IndexPair* pair = lookup.pair(overlapVertices->_v_e_r_t_e_x); │ │ │ │ │ -481 assert(pair!=0 && overlap.contains(pair->local().attribute())); │ │ │ │ │ -482 assert(examined.find(aggregates[overlapVertices->_v_e_r_t_e_x])==examined.end()); │ │ │ │ │ -483 examined.insert(aggregates[overlapVertices->_v_e_r_t_e_x]); │ │ │ │ │ -484#endif │ │ │ │ │ -485 _c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ -overlapVertices, overlapEnd); │ │ │ │ │ -486 ++row; │ │ │ │ │ -487 }else{ │ │ │ │ │ -488 ++overlapVertices; │ │ │ │ │ -489 } │ │ │ │ │ -490 } │ │ │ │ │ -491 │ │ │ │ │ -492 template │ │ │ │ │ -493 template │ │ │ │ │ -_4_9_4 void _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_G_,_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>_:_:_e_x_a_m_i_n_e(G& graph, │ │ │ │ │ -495 V& visitedMap, │ │ │ │ │ -496 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -497 const _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -498 R& row) │ │ │ │ │ -499 { │ │ │ │ │ -500 typedef typename G::VertexIterator VertexIterator; │ │ │ │ │ -501 │ │ │ │ │ -502 VertexIterator vend=graph.end(); │ │ │ │ │ -503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ -504 if(!_g_e_t(visitedMap, *vertex)) { │ │ │ │ │ -505 _c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y(row, graph, visitedMap, aggregates, │ │ │ │ │ -*vertex); │ │ │ │ │ -506 ++row; │ │ │ │ │ -507 } │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -510 } │ │ │ │ │ -511 │ │ │ │ │ -512 template │ │ │ │ │ -_5_1_3 _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r(M& matrix) │ │ │ │ │ -514 : row_(matrix.createbegin()), │ │ │ │ │ -515 minRowSize_(_s_t_d::numeric_limits<_s_t_d::size_t>::max()), │ │ │ │ │ -516 maxRowSize_(0), sumRowSize_(0) │ │ │ │ │ -517 { │ │ │ │ │ -518#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -519 diagonalInserted = false; │ │ │ │ │ -520#endif │ │ │ │ │ -521 } │ │ │ │ │ -522 template │ │ │ │ │ -_5_2_3 std::size_t _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_m_a_x_R_o_w_S_i_z_e() │ │ │ │ │ -524 { │ │ │ │ │ -525 return maxRowSize_; │ │ │ │ │ +232 private: │ │ │ │ │ +233 /* │ │ │ │ │ +234 * @brief Helper function to create hierarchies with parameter tree. │ │ │ │ │ +235 * │ │ │ │ │ +236 * Will create the coarsen criterion with the norm and create the │ │ │ │ │ +237 * Hierarchies │ │ │ │ │ +238 * \tparam Norm Type of the norm to use. │ │ │ │ │ +239 */ │ │ │ │ │ +240 template │ │ │ │ │ +241 void createCriterionAndHierarchies(std::shared_ptr │ │ │ │ │ +matrixptr, │ │ │ │ │ +242 const PI& pinfo, const Norm&, │ │ │ │ │ +243 const ParameterTree& configuration, │ │ │ │ │ +244 std::true_type compiles = std::true_type()); │ │ │ │ │ +245 template │ │ │ │ │ +246 void createCriterionAndHierarchies(std::shared_ptr │ │ │ │ │ +matrixptr, │ │ │ │ │ +247 const PI& pinfo, const Norm&, │ │ │ │ │ +248 const ParameterTree& configuration, │ │ │ │ │ +249 std::false_type); │ │ │ │ │ +254 template │ │ │ │ │ +255 void createHierarchies(C& criterion, std::shared_ptr │ │ │ │ │ +matrixptr, │ │ │ │ │ +256 const PI& pinfo, const ParameterTree& configuration); │ │ │ │ │ +263 template │ │ │ │ │ +264 void createHierarchies(C& criterion, │ │ │ │ │ +265 const std::shared_ptr& matrixptr, │ │ │ │ │ +266 const PI& pinfo); │ │ │ │ │ +273 struct LevelContext │ │ │ │ │ +274 { │ │ │ │ │ +_2_7_5 typedef _S_m_o_o_t_h_e_r _S_m_o_o_t_h_e_r_T_y_p_e; │ │ │ │ │ +_2_7_9 typename _H_i_e_r_a_r_c_h_y_<_S_m_o_o_t_h_e_r_,_A_>_:_:_I_t_e_r_a_t_o_r _s_m_o_o_t_h_e_r; │ │ │ │ │ +_2_8_3 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _m_a_t_r_i_x; │ │ │ │ │ +_2_8_7 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r _p_i_n_f_o; │ │ │ │ │ +_2_9_1 typename OperatorHierarchy::RedistributeInfoList::const_iterator _r_e_d_i_s_t; │ │ │ │ │ +_2_9_5 typename OperatorHierarchy::AggregatesMapList::const_iterator _a_g_g_r_e_g_a_t_e_s; │ │ │ │ │ +_2_9_9 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _l_h_s; │ │ │ │ │ +_3_0_3 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _u_p_d_a_t_e; │ │ │ │ │ +_3_0_7 typename _H_i_e_r_a_r_c_h_y_<_R_a_n_g_e_,_A_>_:_:_I_t_e_r_a_t_o_r _r_h_s; │ │ │ │ │ +_3_1_1 std::size_t _l_e_v_e_l; │ │ │ │ │ +312 }; │ │ │ │ │ +313 │ │ │ │ │ +314 │ │ │ │ │ +319 void mgc(LevelContext& levelContext); │ │ │ │ │ +320 │ │ │ │ │ +321 void additiveMgc(); │ │ │ │ │ +322 │ │ │ │ │ +329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel); │ │ │ │ │ +330 │ │ │ │ │ +335 bool moveToCoarseLevel(LevelContext& levelContext); │ │ │ │ │ +336 │ │ │ │ │ +341 void initIteratorsWithFineLevel(LevelContext& levelContext); │ │ │ │ │ +342 │ │ │ │ │ +344 std::shared_ptr matrices_; │ │ │ │ │ +346 _S_m_o_o_t_h_e_r_A_r_g_s smootherArgs_; │ │ │ │ │ +348 std::shared_ptr > smoothers_; │ │ │ │ │ +350 std::shared_ptr solver_; │ │ │ │ │ +352 std::shared_ptr> rhs_; │ │ │ │ │ +354 std::shared_ptr> lhs_; │ │ │ │ │ +356 std::shared_ptr> update_; │ │ │ │ │ +358 using _S_c_a_l_a_r_P_r_o_d_u_c_t = _D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>; │ │ │ │ │ +360 std::shared_ptr scalarProduct_; │ │ │ │ │ +362 std::size_t gamma_; │ │ │ │ │ +364 std::size_t preSteps_; │ │ │ │ │ +366 std::size_t postSteps_; │ │ │ │ │ +367 bool buildHierarchy_; │ │ │ │ │ +368 bool additive; │ │ │ │ │ +369 bool coarsesolverconverged; │ │ │ │ │ +370 std::shared_ptr coarseSmoother_; │ │ │ │ │ +372 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category_; │ │ │ │ │ +374 std::size_t verbosity_; │ │ │ │ │ +375 │ │ │ │ │ +376 struct ToLower │ │ │ │ │ +377 { │ │ │ │ │ +_3_7_8 std::string _o_p_e_r_a_t_o_r_(_)(const std::string& str) │ │ │ │ │ +379 { │ │ │ │ │ +380 std::stringstream retval; │ │ │ │ │ +381 std::ostream_iterator out(retval); │ │ │ │ │ +382 std::transform(str.begin(), str.end(), out, │ │ │ │ │ +383 [](char c){ │ │ │ │ │ +384 return std::tolower(c, std::locale::classic()); │ │ │ │ │ +385 }); │ │ │ │ │ +386 return retval.str(); │ │ │ │ │ +387 } │ │ │ │ │ +388 }; │ │ │ │ │ +389 }; │ │ │ │ │ +390 │ │ │ │ │ +391 template │ │ │ │ │ +_3_9_2 inline _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(const _A_M_G& amg) │ │ │ │ │ +393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_), │ │ │ │ │ +394 smoothers_(amg.smoothers_), solver_(amg.solver_), │ │ │ │ │ +395 rhs_(), lhs_(), update_(), │ │ │ │ │ +396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_), │ │ │ │ │ +397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_), │ │ │ │ │ +398 buildHierarchy_(amg.buildHierarchy_), │ │ │ │ │ +399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged), │ │ │ │ │ +400 coarseSmoother_(amg.coarseSmoother_), │ │ │ │ │ +401 category_(amg.category_), │ │ │ │ │ +402 verbosity_(amg.verbosity_) │ │ │ │ │ +403 {} │ │ │ │ │ +404 │ │ │ │ │ +405 template │ │ │ │ │ +_4_0_6 _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& │ │ │ │ │ +coarseSolver, │ │ │ │ │ +407 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, │ │ │ │ │ +408 const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ +409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_ │ │ │ │ │ +(smootherArgs), │ │ │ │ │ +410 smoothers_(new _H_i_e_r_a_r_c_h_y<_S_m_o_o_t_h_e_r,A>), solver_(&coarseSolver), │ │ │ │ │ +411 rhs_(), lhs_(), update_(), scalarProduct_(0), │ │ │ │ │ +412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()), │ │ │ │ │ +413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false), │ │ │ │ │ +414 additive(parms.getAdditive()), coarsesolverconverged(true), │ │ │ │ │ +415 coarseSmoother_(), │ │ │ │ │ +416// #warning should category be retrieved from matrices? │ │ │ │ │ +417 category_(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::category(*smoothers_->coarsest())), │ │ │ │ │ +418 verbosity_(parms.debugLevel()) │ │ │ │ │ +419 { │ │ │ │ │ +420 assert(matrices_->isBuilt()); │ │ │ │ │ +421 │ │ │ │ │ +422 // build the necessary smoother hierarchies │ │ │ │ │ +423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_); │ │ │ │ │ +424 } │ │ │ │ │ +425 │ │ │ │ │ +426 template │ │ │ │ │ +427 template │ │ │ │ │ +_4_2_8 _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(const _O_p_e_r_a_t_o_r& matrix, │ │ │ │ │ +429 const C& criterion, │ │ │ │ │ +430 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, │ │ │ │ │ +431 const PI& pinfo) │ │ │ │ │ +432 : smootherArgs_(smootherArgs), │ │ │ │ │ +433 smoothers_(new _H_i_e_r_a_r_c_h_y<_S_m_o_o_t_h_e_r,A>), solver_(), │ │ │ │ │ +434 rhs_(), lhs_(), update_(), scalarProduct_(), │ │ │ │ │ +435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()), │ │ │ │ │ +436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true), │ │ │ │ │ +437 additive(criterion.getAdditive()), coarsesolverconverged(true), │ │ │ │ │ +438 coarseSmoother_(), │ │ │ │ │ +439 category_(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::category(pinfo)), │ │ │ │ │ +440 verbosity_(criterion.debugLevel()) │ │ │ │ │ +441 { │ │ │ │ │ +442 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(matrix) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(pinfo)) │ │ │ │ │ +443 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "Matrix and Communication must have the │ │ │ │ │ +same SolverCategory!"); │ │ │ │ │ +444 // TODO: reestablish compile time checks. │ │ │ │ │ +445 //static_assert(static_cast(PI::category)==static_cast(S:: │ │ │ │ │ +category), │ │ │ │ │ +446 // "Matrix and Solver must match in terms of category!"); │ │ │ │ │ +447 auto matrixptr = stackobject_to_shared_ptr(matrix); │ │ │ │ │ +448 createHierarchies(criterion, matrixptr, pinfo); │ │ │ │ │ +449 } │ │ │ │ │ +450 │ │ │ │ │ +451 template │ │ │ │ │ +_4_5_2 _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(std::shared_ptr matrixptr, │ │ │ │ │ +453 const ParameterTree& configuration, │ │ │ │ │ +454 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo) : │ │ │ │ │ +455 smoothers_(new _H_i_e_r_a_r_c_h_y<_S_m_o_o_t_h_e_r,A>), │ │ │ │ │ +456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_ │ │ │ │ │ +(true), │ │ │ │ │ +457 coarsesolverconverged(true), coarseSmoother_(), │ │ │ │ │ +458 category_(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::category(pinfo)) │ │ │ │ │ +459 { │ │ │ │ │ +460 │ │ │ │ │ +461 if (configuration.hasKey ("smootherIterations")) │ │ │ │ │ +462 smootherArgs_.iterations = configuration.get("smootherIterations"); │ │ │ │ │ +463 │ │ │ │ │ +464 if (configuration.hasKey ("smootherRelaxation")) │ │ │ │ │ +465 smootherArgs_.relaxationFactor = configuration.get("smootherRelaxation"); │ │ │ │ │ +466 │ │ │ │ │ +467 auto normName = ToLower()(configuration.get("strengthMeasure", │ │ │ │ │ +"diagonal")); │ │ │ │ │ +468 auto index = configuration.get("diagonalRowIndex", 0); │ │ │ │ │ +469 │ │ │ │ │ +470 if ( normName == "diagonal") │ │ │ │ │ +471 { │ │ │ │ │ +472 using _f_i_e_l_d___t_y_p_e = typename M::field_type; │ │ │ │ │ +473 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +474 std::is_convertible compiles; │ │ │ │ │ +475 │ │ │ │ │ +476 switch (index) │ │ │ │ │ +477 { │ │ │ │ │ +478 case 0: │ │ │ │ │ +479 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_0_>(), │ │ │ │ │ +configuration, compiles); │ │ │ │ │ +480 break; │ │ │ │ │ +481 case 1: │ │ │ │ │ +482 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_1_>(), │ │ │ │ │ +configuration, compiles); │ │ │ │ │ +483 break; │ │ │ │ │ +484 case 2: │ │ │ │ │ +485 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_2_>(), │ │ │ │ │ +configuration, compiles); │ │ │ │ │ +486 break; │ │ │ │ │ +487 case 3: │ │ │ │ │ +488 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_3_>(), │ │ │ │ │ +configuration, compiles); │ │ │ │ │ +489 break; │ │ │ │ │ +490 case 4: │ │ │ │ │ +491 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_4_>(), │ │ │ │ │ +configuration, compiles); │ │ │ │ │ +492 break; │ │ │ │ │ +493 default: │ │ │ │ │ +494 DUNE_THROW(InvalidStateException, "Currently strengthIndex>4 is not │ │ │ │ │ +supported."); │ │ │ │ │ +495 } │ │ │ │ │ +496 } │ │ │ │ │ +497 else if (normName == "rowsum") │ │ │ │ │ +498 createCriterionAndHierarchies(matrixptr, pinfo, _R_o_w_S_u_m(), configuration); │ │ │ │ │ +499 else if (normName == "frobenius") │ │ │ │ │ +500 createCriterionAndHierarchies(matrixptr, pinfo, _F_r_o_b_e_n_i_u_s_N_o_r_m(), │ │ │ │ │ +configuration); │ │ │ │ │ +501 else if (normName == "one") │ │ │ │ │ +502 createCriterionAndHierarchies(matrixptr, pinfo, _A_l_w_a_y_s_O_n_e_N_o_r_m(), │ │ │ │ │ +configuration); │ │ │ │ │ +503 else │ │ │ │ │ +504 DUNE_THROW(Dune::NotImplemented, "Wrong config file: strengthMeasure │ │ │ │ │ +"< │ │ │ │ │ +508 template │ │ │ │ │ +509 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_c_r_e_a_t_e_C_r_i_t_e_r_i_o_n_A_n_d_H_i_e_r_a_r_c_h_i_e_s(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree& │ │ │ │ │ +configuration, std::false_type) │ │ │ │ │ +510 { │ │ │ │ │ +511 DUNE_THROW(InvalidStateException, "Strength of connection measure does not │ │ │ │ │ +support this type (" │ │ │ │ │ +512 << className() << ") as it is lacking a conversion │ │ │ │ │ +to" │ │ │ │ │ +513 << className::real_type>() << │ │ │ │ │ +"."); │ │ │ │ │ +514 } │ │ │ │ │ +515 │ │ │ │ │ +516 template │ │ │ │ │ +517 template │ │ │ │ │ +518 void AMG::createCriterionAndHierarchies(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree& │ │ │ │ │ +configuration, std::true_type) │ │ │ │ │ +519 { │ │ │ │ │ +520 if (configuration.get("criterionSymmetric", true)) │ │ │ │ │ +521 { │ │ │ │ │ +522 using Criterion = _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n< │ │ │ │ │ +523 _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_t_y_p_e_n_a_m_e_ _M_:_:_m_a_t_r_i_x___t_y_p_e_,_N_o_r_m_> >; │ │ │ │ │ +524 Criterion criterion; │ │ │ │ │ +525 createHierarchies(criterion, matrixptr, pinfo, configuration); │ │ │ │ │ 526 } │ │ │ │ │ -527 template │ │ │ │ │ -_5_2_8 std::size_t _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_m_i_n_R_o_w_S_i_z_e() │ │ │ │ │ -529 { │ │ │ │ │ -530 return minRowSize_; │ │ │ │ │ -531 } │ │ │ │ │ -532 │ │ │ │ │ -533 template │ │ │ │ │ -_5_3_4 std::size_t _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_s_u_m_R_o_w_S_i_z_e() │ │ │ │ │ -535 { │ │ │ │ │ -536 return sumRowSize_; │ │ │ │ │ -537 } │ │ │ │ │ -538 template │ │ │ │ │ -_5_3_9 void _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -540 { │ │ │ │ │ -541 sumRowSize_ += row_.size(); │ │ │ │ │ -542 minRowSize_=std::min(minRowSize_, row_.size()); │ │ │ │ │ -543 maxRowSize_=std::max(maxRowSize_, row_.size()); │ │ │ │ │ -544 ++row_; │ │ │ │ │ -545#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -546 assert(diagonalInserted); │ │ │ │ │ -547 diagonalInserted = false; │ │ │ │ │ -548#endif │ │ │ │ │ -549 } │ │ │ │ │ -550 │ │ │ │ │ -551 template │ │ │ │ │ -_5_5_2 void _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_>_:_:_i_n_s_e_r_t(const typename M::size_type& index) │ │ │ │ │ -553 { │ │ │ │ │ -554 row_.insert(index); │ │ │ │ │ -555#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -556 diagonalInserted = diagonalInserted || row_.index()==index; │ │ │ │ │ -557#endif │ │ │ │ │ -558 } │ │ │ │ │ -559 │ │ │ │ │ -560 template │ │ │ │ │ -561 template │ │ │ │ │ -562 typename G::MutableMatrix* │ │ │ │ │ -_5_6_3 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_T_>_:_:_b_u_i_l_d(G& fineGraph, V& visitedMap, │ │ │ │ │ -564 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -565 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>& aggregates, │ │ │ │ │ -566 const typename G::Matrix::size_type& size, │ │ │ │ │ -567 const Set& overlap) │ │ │ │ │ -568 { │ │ │ │ │ -569 typedef _O_v_e_r_l_a_p_V_e_r_t_e_x_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_> _O_v_e_r_l_a_p_V_e_r_t_e_x; │ │ │ │ │ -570 │ │ │ │ │ -571 std::size_t count; │ │ │ │ │ -572 │ │ │ │ │ -573 const _O_v_e_r_l_a_p_V_e_r_t_e_x* overlapVertices = buildOverlapVertices(fineGraph, │ │ │ │ │ -574 pinfo, │ │ │ │ │ -575 aggregates, │ │ │ │ │ -576 overlap, │ │ │ │ │ -577 count); │ │ │ │ │ -578 typedef typename G::MutableMatrix M; │ │ │ │ │ -579 M* coarseMatrix = new M(size, size, M::row_wise); │ │ │ │ │ -580 │ │ │ │ │ -581 // Reset the visited flags of all vertices. │ │ │ │ │ -582 // As the isolated nodes will be skipped we simply mark them as visited │ │ │ │ │ -583 │ │ │ │ │ -584 typedef typename G::VertexIterator Vertex; │ │ │ │ │ -585 Vertex vend = fineGraph.end(); │ │ │ │ │ -586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ -587 assert(aggregates[*vertex] != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_:_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_: │ │ │ │ │ -_U_N_A_G_G_R_E_G_A_T_E_D); │ │ │ │ │ -588 put(visitedMap, *vertex, aggregates[*vertex]==_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _G_:_: │ │ │ │ │ -_V_e_r_t_e_x_D_e_s_c_r_i_p_t_o_r_>_:_:_I_S_O_L_A_T_E_D); │ │ │ │ │ -589 } │ │ │ │ │ +527 else │ │ │ │ │ +528 { │ │ │ │ │ +529 using Criterion = _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n< │ │ │ │ │ +530 _D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_t_y_p_e_n_a_m_e_ _M_:_:_m_a_t_r_i_x___t_y_p_e_,_N_o_r_m_> >; │ │ │ │ │ +531 Criterion criterion; │ │ │ │ │ +532 createHierarchies(criterion, matrixptr, pinfo, configuration); │ │ │ │ │ +533 } │ │ │ │ │ +534 } │ │ │ │ │ +535 │ │ │ │ │ +536 template │ │ │ │ │ +537 template │ │ │ │ │ +538 void AMG::createHierarchies(C& criterion, std::shared_ptr matrixptr, const PI& pinfo, const ParameterTree& configuration) │ │ │ │ │ +539 { │ │ │ │ │ +540 if (configuration.hasKey ("maxLevel")) │ │ │ │ │ +541 criterion.setMaxLevel(configuration.get("maxLevel")); │ │ │ │ │ +542 │ │ │ │ │ +543 if (configuration.hasKey ("minCoarseningRate")) │ │ │ │ │ +544 criterion.setMinCoarsenRate(configuration.get("minCoarseningRate")); │ │ │ │ │ +545 │ │ │ │ │ +546 if (configuration.hasKey ("coarsenTarget")) │ │ │ │ │ +547 criterion.setCoarsenTarget (configuration.get("coarsenTarget")); │ │ │ │ │ +548 │ │ │ │ │ +549 if (configuration.hasKey ("accumulationMode")) │ │ │ │ │ +550 { │ │ │ │ │ +551 std::string mode = ToLower()(configuration.get │ │ │ │ │ +("accumulationMode")); │ │ │ │ │ +552 if ( mode == "none") │ │ │ │ │ +553 criterion.setAccumulate(_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e_:_:_n_o_A_c_c_u); │ │ │ │ │ +554 else if ( mode == "atonce" ) │ │ │ │ │ +555 criterion.setAccumulate(_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e_:_:_a_t_O_n_c_e_A_c_c_u); │ │ │ │ │ +556 else if ( mode == "successive") │ │ │ │ │ +557 criterion.setCoarsenTarget (_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u); │ │ │ │ │ +558 else │ │ │ │ │ +559 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode │ │ │ │ │ +does not allow value " │ │ │ │ │ +560 << mode <<"."); │ │ │ │ │ +561 } │ │ │ │ │ +562 │ │ │ │ │ +563 if (configuration.hasKey ("prolongationDampingFactor")) │ │ │ │ │ +564 criterion.setProlongationDampingFactor (configuration.get │ │ │ │ │ +("prolongationDampingFactor")); │ │ │ │ │ +565 │ │ │ │ │ +566 if (configuration.hasKey("defaultAggregationSizeMode")) │ │ │ │ │ +567 { │ │ │ │ │ +568 auto mode = ToLower()(configuration.get │ │ │ │ │ +("defaultAggregationSizeMode")); │ │ │ │ │ +569 auto dim = configuration.get("defaultAggregationDimension"); │ │ │ │ │ +570 std::size_t maxDistance = 2; │ │ │ │ │ +571 if (configuration.hasKey("MaxAggregateDistance")) │ │ │ │ │ +572 maxDistance = configuration.get("maxAggregateDistance"); │ │ │ │ │ +573 if (mode == "isotropic") │ │ │ │ │ +574 criterion.setDefaultValuesIsotropic(dim, maxDistance); │ │ │ │ │ +575 else if(mode == "anisotropic") │ │ │ │ │ +576 criterion.setDefaultValuesAnisotropic(dim, maxDistance); │ │ │ │ │ +577 else │ │ │ │ │ +578 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode │ │ │ │ │ +does not allow value " │ │ │ │ │ +579 << mode <<"."); │ │ │ │ │ +580 } │ │ │ │ │ +581 │ │ │ │ │ +582 if (configuration.hasKey("maxAggregateDistance")) │ │ │ │ │ +583 criterion.setMaxDistance(configuration.get │ │ │ │ │ +("maxAggregateDistance")); │ │ │ │ │ +584 │ │ │ │ │ +585 if (configuration.hasKey("minAggregateSize")) │ │ │ │ │ +586 criterion.setMinAggregateSize(configuration.get │ │ │ │ │ +("minAggregateSize")); │ │ │ │ │ +587 │ │ │ │ │ +588 if (configuration.hasKey("maxAggregateSize")) │ │ │ │ │ +589 criterion.setMaxAggregateSize(configuration.get │ │ │ │ │ +("maxAggregateSize")); │ │ │ │ │ 590 │ │ │ │ │ -591 typedef typename G::MutableMatrix M; │ │ │ │ │ -592 _S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_<_M_> sparsityBuilder(*coarseMatrix); │ │ │ │ │ +591 if (configuration.hasKey("maxAggregateConnectivity")) │ │ │ │ │ +592 criterion.setMaxConnectivity(configuration.get │ │ │ │ │ +("maxAggregateConnectivity")); │ │ │ │ │ 593 │ │ │ │ │ -594 _C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_G_,_T_>_:_:_e_x_a_m_i_n_e(fineGraph, visitedMap, pinfo, │ │ │ │ │ -595 aggregates, overlap, │ │ │ │ │ -596 overlapVertices, │ │ │ │ │ -597 overlapVertices+count, │ │ │ │ │ -598 sparsityBuilder); │ │ │ │ │ +594 if (configuration.hasKey ("alpha")) │ │ │ │ │ +595 criterion.setAlpha (configuration.get ("alpha")); │ │ │ │ │ +596 │ │ │ │ │ +597 if (configuration.hasKey ("beta")) │ │ │ │ │ +598 criterion.setBeta (configuration.get ("beta")); │ │ │ │ │ 599 │ │ │ │ │ -600 dinfo<N │ │ │ │ │ -()<<"x"<M()<<" row: min="< ("gamma")); │ │ │ │ │ +602 gamma_ = criterion.getGamma(); │ │ │ │ │ +603 │ │ │ │ │ +604 if (configuration.hasKey ("additive")) │ │ │ │ │ +605 criterion.setAdditive (configuration.get("additive")); │ │ │ │ │ +606 additive = criterion.getAdditive(); │ │ │ │ │ +607 │ │ │ │ │ +608 if (configuration.hasKey ("preSteps")) │ │ │ │ │ +609 criterion.setNoPreSmoothSteps (configuration.get │ │ │ │ │ +("preSteps")); │ │ │ │ │ +610 preSteps_ = criterion.getNoPreSmoothSteps (); │ │ │ │ │ +611 │ │ │ │ │ +612 if (configuration.hasKey ("postSteps")) │ │ │ │ │ +613 criterion.setNoPostSmoothSteps (configuration.get │ │ │ │ │ +("postSteps")); │ │ │ │ │ +614 postSteps_ = criterion.getNoPostSmoothSteps (); │ │ │ │ │ +615 │ │ │ │ │ +616 verbosity_ = configuration.get("verbosity", 0); │ │ │ │ │ +617 criterion.setDebugLevel (verbosity_); │ │ │ │ │ +618 │ │ │ │ │ +619 createHierarchies(criterion, matrixptr, pinfo); │ │ │ │ │ +620 } │ │ │ │ │ +621 │ │ │ │ │ +622 template │ │ │ │ │ +_6_2_4 struct _D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ +625 { │ │ │ │ │ +_6_2_6 typedef typename Matrix :: field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_6_2_7 enum _S_o_l_v_e_r_T_y_p_e { _u_m_f_p_a_c_k, _s_u_p_e_r_l_u, _n_o_n_e }; │ │ │ │ │ +628 │ │ │ │ │ +_6_2_9 static constexpr _S_o_l_v_e_r_T_y_p_e _s_o_l_v_e_r = │ │ │ │ │ +630#if DISABLE_AMG_DIRECTSOLVER │ │ │ │ │ +631 _n_o_n_e; │ │ │ │ │ +632#elif HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +633 _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _f_i_e_l_d___t_y_p_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _> :: valid ? _u_m_f_p_a_c_k : │ │ │ │ │ +_n_o_n_e ; │ │ │ │ │ +634#elif HAVE_SUPERLU │ │ │ │ │ +635 _s_u_p_e_r_l_u ; │ │ │ │ │ +636#else │ │ │ │ │ +637 _n_o_n_e; │ │ │ │ │ +638#endif │ │ │ │ │ +639 │ │ │ │ │ +640 template │ │ │ │ │ +_6_4_1 struct _S_o_l_v_e_r │ │ │ │ │ +642 { │ │ │ │ │ +_6_4_3 typedef _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_V_e_c_t_o_r_,_V_e_c_t_o_r_> _t_y_p_e; │ │ │ │ │ +_6_4_4 static _t_y_p_e* _c_r_e_a_t_e(const M& _m_a_t, bool verbose, bool reusevector ) │ │ │ │ │ +645 { │ │ │ │ │ +646 DUNE_THROW(NotImplemented,"DirectSolver not selected"); │ │ │ │ │ +647 return nullptr; │ │ │ │ │ +648 } │ │ │ │ │ +_6_4_9 static std::string _n_a_m_e () { return "None"; } │ │ │ │ │ +650 }; │ │ │ │ │ +651#if HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +652 template │ │ │ │ │ +653 struct Solver< M, _u_m_f_p_a_c_k > │ │ │ │ │ +654 { │ │ │ │ │ +655 typedef _U_M_F_P_a_c_k_<_ _M_ _> _t_y_p_e; │ │ │ │ │ +656 static _t_y_p_e* _c_r_e_a_t_e(const M& _m_a_t, bool verbose, bool reusevector ) │ │ │ │ │ +657 { │ │ │ │ │ +658 return new _t_y_p_e(_m_a_t, verbose, reusevector ); │ │ │ │ │ +659 } │ │ │ │ │ +660 static std::string _n_a_m_e () { return "UMFPack"; } │ │ │ │ │ +661 }; │ │ │ │ │ +662#endif │ │ │ │ │ +663#if HAVE_SUPERLU │ │ │ │ │ +664 template │ │ │ │ │ +_6_6_5 struct _S_o_l_v_e_r< M, _s_u_p_e_r_l_u > │ │ │ │ │ +666 { │ │ │ │ │ +_6_6_7 typedef _S_u_p_e_r_L_U_<_ _M_ _> _t_y_p_e; │ │ │ │ │ +_6_6_8 static _t_y_p_e* _c_r_e_a_t_e(const M& _m_a_t, bool verbose, bool reusevector ) │ │ │ │ │ +669 { │ │ │ │ │ +670 return new _t_y_p_e(_m_a_t, verbose, reusevector ); │ │ │ │ │ +671 } │ │ │ │ │ +_6_7_2 static std::string _n_a_m_e () { return "SuperLU"; } │ │ │ │ │ +673 }; │ │ │ │ │ +674#endif │ │ │ │ │ +675 │ │ │ │ │ +676 // define direct solver type to be used │ │ │ │ │ +_6_7_7 typedef _S_o_l_v_e_r_<_ _M_a_t_r_i_x_,_ _s_o_l_v_e_r_ _> _S_e_l_e_c_t_e_d_S_o_l_v_e_r ; │ │ │ │ │ +_6_7_8 typedef typename SelectedSolver :: type _D_i_r_e_c_t_S_o_l_v_e_r; │ │ │ │ │ +_6_7_9 static constexpr bool _i_s_D_i_r_e_c_t_S_o_l_v_e_r = _s_o_l_v_e_r != _n_o_n_e; │ │ │ │ │ +_6_8_0 static std::string _n_a_m_e() { return SelectedSolver :: name (); } │ │ │ │ │ +_6_8_1 static _D_i_r_e_c_t_S_o_l_v_e_r* _c_r_e_a_t_e(const _M_a_t_r_i_x& _m_a_t, bool verbose, bool │ │ │ │ │ +reusevector ) │ │ │ │ │ +682 { │ │ │ │ │ +683 return SelectedSolver :: create( _m_a_t, verbose, reusevector ); │ │ │ │ │ +684 } │ │ │ │ │ +685 }; │ │ │ │ │ +686 │ │ │ │ │ +687 template │ │ │ │ │ +688 template │ │ │ │ │ +689 void AMG::createHierarchies(C& criterion, │ │ │ │ │ +690 const std::shared_ptr& matrixptr, │ │ │ │ │ +691 const PI& pinfo) │ │ │ │ │ +692 { │ │ │ │ │ +693 Timer watch; │ │ │ │ │ +694 matrices_ = std::make_shared( │ │ │ │ │ +695 std::const_pointer_cast(matrixptr), │ │ │ │ │ +696 stackobject_to_shared_ptr(const_cast(pinfo))); │ │ │ │ │ +697 │ │ │ │ │ +698 matrices_->template build >(criterion); │ │ │ │ │ +699 │ │ │ │ │ +700 // build the necessary smoother hierarchies │ │ │ │ │ +701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_); │ │ │ │ │ +702 │ │ │ │ │ +703 // test whether we should solve on the coarse level. That is the case if we │ │ │ │ │ +704 // have that level and if there was a redistribution on this level then our │ │ │ │ │ +705 // communicator has to be valid (size()>0) as the smoother might try to │ │ │ │ │ +communicate │ │ │ │ │ +706 // in the constructor. │ │ │ │ │ +707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels() │ │ │ │ │ +708 && ( ! matrices_->redistributeInformation().back().isSetup() || │ │ │ │ │ +709 matrices_->parallelInformation().coarsest().getRedistributed().communicator │ │ │ │ │ +().size() ) ) │ │ │ │ │ +710 { │ │ │ │ │ +711 // We have the carsest level. Create the coarse Solver │ │ │ │ │ +712 SmootherArgs sargs(smootherArgs_); │ │ │ │ │ +713 sargs.iterations = 1; │ │ │ │ │ +714 │ │ │ │ │ +715 typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s cargs; │ │ │ │ │ +716 cargs.setArgs(sargs); │ │ │ │ │ +717 if(matrices_->redistributeInformation().back().isSetup()) { │ │ │ │ │ +718 // Solve on the redistributed partitioning │ │ │ │ │ +719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat │ │ │ │ │ +()); │ │ │ │ │ +720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ +()); │ │ │ │ │ +721 }else{ │ │ │ │ │ +722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat()); │ │ │ │ │ +723 cargs.setComm(*matrices_->parallelInformation().coarsest()); │ │ │ │ │ +724 } │ │ │ │ │ +725 │ │ │ │ │ +726 coarseSmoother_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_c_o_n_s_t_r_u_c_t(cargs); │ │ │ │ │ +727 scalarProduct_ = createScalarProduct(cargs.getComm(),category()); │ │ │ │ │ +728 │ │ │ │ │ +729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector; │ │ │ │ │ +730 │ │ │ │ │ +731 // Use superlu if we are purely sequential or with only one processor on │ │ │ │ │ +the coarsest level. │ │ │ │ │ +732 if( SolverSelector::isDirectSolver && │ │ │ │ │ +733 (std::is_same::value / │ │ │ │ │ +/ sequential mode │ │ │ │ │ +734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 // │ │ │ │ │ +parallel mode and only one processor │ │ │ │ │ +735 || (matrices_->parallelInformation().coarsest().isRedistributed() │ │ │ │ │ +736 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ +().communicator().size()==1 │ │ │ │ │ +737 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ +().communicator().size()>0) ) │ │ │ │ │ +738 ) │ │ │ │ │ +739 { // redistribute and 1 proc │ │ │ │ │ +740 if(matrices_->parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ +741 { │ │ │ │ │ +742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ +743 { │ │ │ │ │ +744 // We are still participating on this level │ │ │ │ │ +745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest │ │ │ │ │ +().getRedistributed().getmat(), false, false)); │ │ │ │ │ +746 } │ │ │ │ │ +747 else │ │ │ │ │ +748 solver_.reset(); │ │ │ │ │ +749 } │ │ │ │ │ +750 else │ │ │ │ │ +751 { │ │ │ │ │ +752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()- │ │ │ │ │ +>getmat(), false, false)); │ │ │ │ │ +753 } │ │ │ │ │ +754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()- │ │ │ │ │ +>communicator().rank()==0) │ │ │ │ │ +755 std::cout<< "Using a direct coarse solver (" << SolverSelector::name() << │ │ │ │ │ +")" << std::endl; │ │ │ │ │ +756 } │ │ │ │ │ +757 else │ │ │ │ │ +758 { │ │ │ │ │ +759 if(matrices_->parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ +760 { │ │ │ │ │ +761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ +762 // We are still participating on this level │ │ │ │ │ +763 │ │ │ │ │ +764 // we have to allocate these types using the rebound allocator │ │ │ │ │ +765 // in order to ensure that we fulfill the alignment requirements │ │ │ │ │ +766 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices │ │ │ │ │ +().coarsest().getRedistributed()), │ │ │ │ │ +767 *scalarProduct_, │ │ │ │ │ +768 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ +769 else │ │ │ │ │ +770 solver_.reset(); │ │ │ │ │ +771 }else │ │ │ │ │ +772 { │ │ │ │ │ +773 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices │ │ │ │ │ +().coarsest()), │ │ │ │ │ +774 *scalarProduct_, │ │ │ │ │ +775 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ +776 // // we have to allocate these types using the rebound allocator │ │ │ │ │ +777 // // in order to ensure that we fulfill the alignment requirements │ │ │ │ │ +778 // using Alloc = typename std::allocator_traits::template │ │ │ │ │ +rebind_alloc>; │ │ │ │ │ +779 // Alloc alloc; │ │ │ │ │ +780 // auto p = alloc.allocate(1); │ │ │ │ │ +781 // std::allocator_traits::construct(alloc, p, │ │ │ │ │ +782 // const_cast(*matrices_->matrices().coarsest()), │ │ │ │ │ +783 // *scalarProduct_, │ │ │ │ │ +784 // *coarseSmoother_, 1E-2, 1000, 0); │ │ │ │ │ +785 // solver_.reset(p,[](BiCGSTABSolver* p){ │ │ │ │ │ +786 // Alloc alloc; │ │ │ │ │ +787 // std::allocator_traits::destroy(alloc, p); │ │ │ │ │ +788 // alloc.deallocate(p,1); │ │ │ │ │ +789 // }); │ │ │ │ │ +790 } │ │ │ │ │ +791 } │ │ │ │ │ +792 } │ │ │ │ │ +793 │ │ │ │ │ +794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator │ │ │ │ │ +().rank()==0) │ │ │ │ │ +795 std::cout<<"Building hierarchy of "<maxlevels()<<" levels " │ │ │ │ │ +796 <<"(including coarse solver) took "< │ │ │ │ │ +_8_0_1 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b) │ │ │ │ │ +802 { │ │ │ │ │ +803 // Detect Matrix rows where all offdiagonal entries are │ │ │ │ │ +804 // zero and set x such that A_dd*x_d=b_d │ │ │ │ │ +805 // Thus users can be more careless when setting up their linear │ │ │ │ │ +806 // systems. │ │ │ │ │ +807 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ +808 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r RowIter; │ │ │ │ │ +809 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r ColIter; │ │ │ │ │ +810 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e Block; │ │ │ │ │ +811 Block zero; │ │ │ │ │ +812 zero=typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e(); │ │ │ │ │ +813 │ │ │ │ │ +814 const _M_a_t_r_i_x& _m_a_t=matrices_->matrices().finest()->getmat(); │ │ │ │ │ +815 for(RowIter row=_m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ +816 bool isDirichlet = true; │ │ │ │ │ +817 bool hasDiagonal = false; │ │ │ │ │ +818 Block diagonal{}; │ │ │ │ │ +819 for(ColIter _c_o_l=row->begin(); _c_o_l!=row->end(); ++_c_o_l) { │ │ │ │ │ +820 if(row.index()==_c_o_l.index()) { │ │ │ │ │ +821 diagonal = *_c_o_l; │ │ │ │ │ +822 hasDiagonal = true; │ │ │ │ │ +823 }else{ │ │ │ │ │ +824 if(*_c_o_l!=zero) │ │ │ │ │ +825 isDirichlet = false; │ │ │ │ │ +826 } │ │ │ │ │ +827 } │ │ │ │ │ +828 if(isDirichlet && hasDiagonal) │ │ │ │ │ +829 { │ │ │ │ │ +830 auto&& xEntry = Impl::asVector(x[row.index()]); │ │ │ │ │ +831 auto&& bEntry = Impl::asVector(b[row.index()]); │ │ │ │ │ +832 Impl::asMatrix(diagonal).solve(xEntry, bEntry); │ │ │ │ │ +833 } │ │ │ │ │ +834 } │ │ │ │ │ +835 │ │ │ │ │ +836 if(smoothers_->levels()>0) │ │ │ │ │ +837 smoothers_->finest()->pre(x,b); │ │ │ │ │ +838 else │ │ │ │ │ +839 // No smoother to make x consistent! Do it by hand │ │ │ │ │ +840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x); │ │ │ │ │ +841 rhs_ = std::make_shared>(std::make_shared(b)); │ │ │ │ │ +842 lhs_ = std::make_shared>(std::make_shared(x)); │ │ │ │ │ +843 update_ = std::make_shared>(std::make_shared │ │ │ │ │ +(x)); │ │ │ │ │ +844 matrices_->coarsenVector(*rhs_); │ │ │ │ │ +845 matrices_->coarsenVector(*lhs_); │ │ │ │ │ +846 matrices_->coarsenVector(*update_); │ │ │ │ │ +847 │ │ │ │ │ +848 // Preprocess all smoothers │ │ │ │ │ +849 typedef typename _H_i_e_r_a_r_c_h_y_<_S_m_o_o_t_h_e_r_,_A_>_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +850 typedef typename _H_i_e_r_a_r_c_h_y_<_R_a_n_g_e_,_A_>_:_:_I_t_e_r_a_t_o_r RIterator; │ │ │ │ │ +851 typedef typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r DIterator; │ │ │ │ │ +852 Iterator coarsest = smoothers_->coarsest(); │ │ │ │ │ +853 Iterator smoother = smoothers_->finest(); │ │ │ │ │ +854 RIterator rhs = rhs_->finest(); │ │ │ │ │ +855 DIterator lhs = lhs_->finest(); │ │ │ │ │ +856 if(smoothers_->levels()>1) { │ │ │ │ │ +857 │ │ │ │ │ +858 assert(lhs_->levels()==rhs_->levels()); │ │ │ │ │ +859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels │ │ │ │ │ +()==matrices_->maxlevels()); │ │ │ │ │ +860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels │ │ │ │ │ +()maxlevels()); │ │ │ │ │ +861 │ │ │ │ │ +862 if(smoother!=coarsest) │ │ │ │ │ +863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs, │ │ │ │ │ +++rhs) │ │ │ │ │ +864 smoother->pre(*lhs,*rhs); │ │ │ │ │ +865 smoother->pre(*lhs,*rhs); │ │ │ │ │ +866 } │ │ │ │ │ +867 │ │ │ │ │ +868 │ │ │ │ │ +869 // The preconditioner might change x and b. So we have to │ │ │ │ │ +870 // copy the changes to the original vectors. │ │ │ │ │ +871 x = *lhs_->finest(); │ │ │ │ │ +872 b = *rhs_->finest(); │ │ │ │ │ +873 │ │ │ │ │ +874 } │ │ │ │ │ +875 template │ │ │ │ │ +_8_7_6 std::size_t _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_l_e_v_e_l_s() │ │ │ │ │ +877 { │ │ │ │ │ +878 return matrices_->levels(); │ │ │ │ │ +879 } │ │ │ │ │ +880 template │ │ │ │ │ +_8_8_1 std::size_t _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_m_a_x_l_e_v_e_l_s() │ │ │ │ │ +882 { │ │ │ │ │ +883 return matrices_->maxlevels(); │ │ │ │ │ +884 } │ │ │ │ │ +885 │ │ │ │ │ +887 template │ │ │ │ │ +_8_8_8 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ +889 { │ │ │ │ │ +890 LevelContext levelContext; │ │ │ │ │ +891 │ │ │ │ │ +892 if(additive) { │ │ │ │ │ +893 *(rhs_->finest())=d; │ │ │ │ │ +894 additiveMgc(); │ │ │ │ │ +895 v=*lhs_->finest(); │ │ │ │ │ +896 }else{ │ │ │ │ │ +897 // Init all iterators for the current level │ │ │ │ │ +898 initIteratorsWithFineLevel(levelContext); │ │ │ │ │ +899 │ │ │ │ │ +900 │ │ │ │ │ +901 *levelContext.lhs = v; │ │ │ │ │ +902 *levelContext.rhs = d; │ │ │ │ │ +903 *levelContext.update=0; │ │ │ │ │ +904 levelContext.level=0; │ │ │ │ │ +905 │ │ │ │ │ +906 mgc(levelContext); │ │ │ │ │ +907 │ │ │ │ │ +908 if(postSteps_==0||matrices_->maxlevels()==1) │ │ │ │ │ +909 levelContext.pinfo->copyOwnerToAll(*levelContext.update, │ │ │ │ │ +*levelContext.update); │ │ │ │ │ +910 │ │ │ │ │ +911 v=*levelContext.update; │ │ │ │ │ +912 } │ │ │ │ │ +913 │ │ │ │ │ +914 } │ │ │ │ │ +915 │ │ │ │ │ +916 template │ │ │ │ │ +917 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_i_n_i_t_I_t_e_r_a_t_o_r_s_W_i_t_h_F_i_n_e_L_e_v_e_l(LevelContext& │ │ │ │ │ +levelContext) │ │ │ │ │ +918 { │ │ │ │ │ +919 levelContext.smoother = smoothers_->finest(); │ │ │ │ │ +920 levelContext.matrix = matrices_->matrices().finest(); │ │ │ │ │ +921 levelContext.pinfo = matrices_->parallelInformation().finest(); │ │ │ │ │ +922 levelContext.redist = │ │ │ │ │ +923 matrices_->redistributeInformation().begin(); │ │ │ │ │ +924 levelContext.aggregates = matrices_->aggregatesMaps().begin(); │ │ │ │ │ +925 levelContext.lhs = lhs_->finest(); │ │ │ │ │ +926 levelContext.update = update_->finest(); │ │ │ │ │ +927 levelContext.rhs = rhs_->finest(); │ │ │ │ │ +928 } │ │ │ │ │ +929 │ │ │ │ │ +930 template │ │ │ │ │ +931 bool AMG │ │ │ │ │ +932 ::moveToCoarseLevel(LevelContext& levelContext) │ │ │ │ │ +933 { │ │ │ │ │ +934 │ │ │ │ │ +935 bool processNextLevel=true; │ │ │ │ │ +936 │ │ │ │ │ +937 if(levelContext.redist->isSetup()) { │ │ │ │ │ +938 levelContext.redist->redistribute(static_cast │ │ │ │ │ +(*levelContext.rhs), │ │ │ │ │ +939 levelContext.rhs.getRedistributed()); │ │ │ │ │ +940 processNextLevel = levelContext.rhs.getRedistributed().size()>0; │ │ │ │ │ +941 if(processNextLevel) { │ │ │ │ │ +942 //restrict defect to coarse level right hand side. │ │ │ │ │ +943 typename Hierarchy::Iterator fineRhs = levelContext.rhs++; │ │ │ │ │ +944 ++levelContext.pinfo; │ │ │ │ │ +945 Transfer │ │ │ │ │ +946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs, │ │ │ │ │ +947 static_cast(fineRhs.getRedistributed()), │ │ │ │ │ +948 *levelContext.pinfo); │ │ │ │ │ +949 } │ │ │ │ │ +950 }else{ │ │ │ │ │ +951 //restrict defect to coarse level right hand side. │ │ │ │ │ +952 typename Hierarchy::Iterator fineRhs = levelContext.rhs++; │ │ │ │ │ +953 ++levelContext.pinfo; │ │ │ │ │ +954 Transfer │ │ │ │ │ +955 ::restrictVector(*(*levelContext.aggregates), │ │ │ │ │ +956 *levelContext.rhs, static_cast(*fineRhs), │ │ │ │ │ +957 *levelContext.pinfo); │ │ │ │ │ +958 } │ │ │ │ │ +959 │ │ │ │ │ +960 if(processNextLevel) { │ │ │ │ │ +961 // prepare coarse system │ │ │ │ │ +962 ++levelContext.lhs; │ │ │ │ │ +963 ++levelContext.update; │ │ │ │ │ +964 ++levelContext.matrix; │ │ │ │ │ +965 ++levelContext.level; │ │ │ │ │ +966 ++levelContext.redist; │ │ │ │ │ +967 │ │ │ │ │ +968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ +>levels()maxlevels()) { │ │ │ │ │ +969 // next level is not the globally coarsest one │ │ │ │ │ +970 ++levelContext.smoother; │ │ │ │ │ +971 ++levelContext.aggregates; │ │ │ │ │ +972 } │ │ │ │ │ +973 // prepare the update on the next level │ │ │ │ │ +974 *levelContext.update=0; │ │ │ │ │ +975 } │ │ │ │ │ +976 return processNextLevel; │ │ │ │ │ +977 } │ │ │ │ │ +978 │ │ │ │ │ +979 template │ │ │ │ │ +980 void AMG │ │ │ │ │ +981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel) │ │ │ │ │ +982 { │ │ │ │ │ +983 if(processNextLevel) { │ │ │ │ │ +984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ +>levels()maxlevels()) { │ │ │ │ │ +985 // previous level is not the globally coarsest one │ │ │ │ │ +986 --levelContext.smoother; │ │ │ │ │ +987 --levelContext.aggregates; │ │ │ │ │ +988 } │ │ │ │ │ +989 --levelContext.redist; │ │ │ │ │ +990 --levelContext.level; │ │ │ │ │ +991 //prolongate and add the correction (update is in coarse left hand side) │ │ │ │ │ +992 --levelContext.matrix; │ │ │ │ │ +993 │ │ │ │ │ +994 //typename Hierarchy::Iterator coarseLhs = lhs--; │ │ │ │ │ +995 --levelContext.lhs; │ │ │ │ │ +996 --levelContext.pinfo; │ │ │ │ │ +997 } │ │ │ │ │ +998 if(levelContext.redist->isSetup()) { │ │ │ │ │ +999 // Need to redistribute during prolongateVector │ │ │ │ │ +1000 levelContext.lhs.getRedistributed()=0; │ │ │ │ │ +1001 Transfer │ │ │ │ │ +1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, │ │ │ │ │ +*levelContext.lhs, │ │ │ │ │ +1003 levelContext.lhs.getRedistributed(), │ │ │ │ │ +1004 matrices_->getProlongationDampingFactor(), │ │ │ │ │ +1005 *levelContext.pinfo, *levelContext.redist); │ │ │ │ │ +1006 }else{ │ │ │ │ │ +1007 *levelContext.lhs=0; │ │ │ │ │ +1008 Transfer │ │ │ │ │ +1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, │ │ │ │ │ +*levelContext.lhs, │ │ │ │ │ +1010 matrices_->getProlongationDampingFactor(), │ │ │ │ │ +1011 *levelContext.pinfo); │ │ │ │ │ +1012 } │ │ │ │ │ +1013 │ │ │ │ │ +1014 │ │ │ │ │ +1015 if(processNextLevel) { │ │ │ │ │ +1016 --levelContext.update; │ │ │ │ │ +1017 --levelContext.rhs; │ │ │ │ │ +1018 } │ │ │ │ │ +1019 │ │ │ │ │ +1020 *levelContext.update += *levelContext.lhs; │ │ │ │ │ +1021 } │ │ │ │ │ +1022 │ │ │ │ │ +1023 template │ │ │ │ │ +_1_0_2_4 bool _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const │ │ │ │ │ +1025 { │ │ │ │ │ +1026 return _I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _C_o_a_r_s_e_S_o_l_v_e_r_>_:_:_v_a_l_u_e; │ │ │ │ │ +1027 } │ │ │ │ │ +1028 │ │ │ │ │ +1029 template │ │ │ │ │ +1030 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_m_g_c(LevelContext& levelContext){ │ │ │ │ │ +1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels │ │ │ │ │ +()==maxlevels()) { │ │ │ │ │ +1032 // Solve directly │ │ │ │ │ +1033 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ +1034 res._c_o_n_v_e_r_g_e_d=true; // If we do not compute this flag will not get updated │ │ │ │ │ +1035 if(levelContext.redist->isSetup()) { │ │ │ │ │ +1036 levelContext.redist->redistribute(*levelContext.rhs, │ │ │ │ │ +levelContext.rhs.getRedistributed()); │ │ │ │ │ +1037 if(levelContext.rhs.getRedistributed().size()>0) { │ │ │ │ │ +1038 // We are still participating in the computation │ │ │ │ │ +1039 levelContext.pinfo.getRedistributed().copyOwnerToAll │ │ │ │ │ +(levelContext.rhs.getRedistributed(), │ │ │ │ │ +1040 levelContext.rhs.getRedistributed()); │ │ │ │ │ +1041 solver_->apply(levelContext.update.getRedistributed(), │ │ │ │ │ +1042 levelContext.rhs.getRedistributed(), res); │ │ │ │ │ +1043 } │ │ │ │ │ +1044 levelContext.redist->redistributeBackward(*levelContext.update, │ │ │ │ │ +levelContext.update.getRedistributed()); │ │ │ │ │ +1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update, │ │ │ │ │ +*levelContext.update); │ │ │ │ │ +1046 }else{ │ │ │ │ │ +1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs); │ │ │ │ │ +1048 solver_->apply(*levelContext.update, *levelContext.rhs, res); │ │ │ │ │ +1049 } │ │ │ │ │ +1050 │ │ │ │ │ +1051 if (!res._c_o_n_v_e_r_g_e_d) │ │ │ │ │ +1052 coarsesolverconverged = false; │ │ │ │ │ +1053 }else{ │ │ │ │ │ +1054 // presmoothing │ │ │ │ │ +1055 _p_r_e_s_m_o_o_t_h(levelContext, preSteps_); │ │ │ │ │ +1056 │ │ │ │ │ +1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION │ │ │ │ │ +1058 bool processNextLevel = moveToCoarseLevel(levelContext); │ │ │ │ │ +1059 │ │ │ │ │ +1060 if(processNextLevel) { │ │ │ │ │ +1061 // next level │ │ │ │ │ +1062 for(std::size_t i=0; imatrices().coarsest() && levels │ │ │ │ │ +()==maxlevels()) │ │ │ │ │ +1065 break; │ │ │ │ │ +1066 if(i+1 < gamma_){ │ │ │ │ │ +1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs, │ │ │ │ │ +*levelContext.rhs); │ │ │ │ │ +1068 } │ │ │ │ │ +1069 } │ │ │ │ │ +1070 } │ │ │ │ │ +1071 │ │ │ │ │ +1072 moveToFineLevel(levelContext, processNextLevel); │ │ │ │ │ +1073#else │ │ │ │ │ +1074 *lhs=0; │ │ │ │ │ +1075#endif │ │ │ │ │ +1076 │ │ │ │ │ +1077 if(levelContext.matrix == matrices_->matrices().finest()) { │ │ │ │ │ +1078 coarsesolverconverged = matrices_->parallelInformation().finest()- │ │ │ │ │ +>communicator().prod(coarsesolverconverged); │ │ │ │ │ +1079 if(!coarsesolverconverged) │ │ │ │ │ +1080 DUNE_THROW(MathError, "Coarse solver did not converge"); │ │ │ │ │ +1081 } │ │ │ │ │ +1082 // postsmoothing │ │ │ │ │ +1083 _p_o_s_t_s_m_o_o_t_h(levelContext, postSteps_); │ │ │ │ │ +1084 │ │ │ │ │ +1085 } │ │ │ │ │ +1086 } │ │ │ │ │ +1087 │ │ │ │ │ +1088 template │ │ │ │ │ +1089 void AMG::additiveMgc(){ │ │ │ │ │ +1090 │ │ │ │ │ +1091 // restrict residual to all levels │ │ │ │ │ +1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_- │ │ │ │ │ +>parallelInformation().finest(); │ │ │ │ │ +1093 typename Hierarchy::Iterator rhs=rhs_->finest(); │ │ │ │ │ +1094 typename Hierarchy::Iterator lhs = lhs_->finest(); │ │ │ │ │ +1095 typename OperatorHierarchy::AggregatesMapList::const_iterator │ │ │ │ │ +aggregates=matrices_->aggregatesMaps().begin(); │ │ │ │ │ +1096 │ │ │ │ │ +1097 for(typename Hierarchy::Iterator fineRhs=rhs++; fineRhs != rhs_- │ │ │ │ │ +>coarsest(); fineRhs=rhs++, ++aggregates) { │ │ │ │ │ +1098 ++pinfo; │ │ │ │ │ +1099 Transfer │ │ │ │ │ +1100 ::restrictVector(*(*aggregates), *rhs, static_cast │ │ │ │ │ +(*fineRhs), *pinfo); │ │ │ │ │ +1101 } │ │ │ │ │ +1102 │ │ │ │ │ +1103 // pinfo is invalid, set to coarsest level │ │ │ │ │ +1104 //pinfo = matrices_->parallelInformation().coarsest │ │ │ │ │ +1105 // calculate correction for all levels │ │ │ │ │ +1106 lhs = lhs_->finest(); │ │ │ │ │ +1107 typename Hierarchy::Iterator smoother = smoothers_->finest(); │ │ │ │ │ +1108 │ │ │ │ │ +1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother) │ │ │ │ │ +{ │ │ │ │ │ +1110 // presmoothing │ │ │ │ │ +1111 *lhs=0; │ │ │ │ │ +1112 smoother->apply(*lhs, *rhs); │ │ │ │ │ +1113 } │ │ │ │ │ +1114 │ │ │ │ │ +1115 // Coarse level solve │ │ │ │ │ +1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION │ │ │ │ │ +1117 InverseOperatorResult res; │ │ │ │ │ +1118 pinfo->copyOwnerToAll(*rhs, *rhs); │ │ │ │ │ +1119 solver_->apply(*lhs, *rhs, res); │ │ │ │ │ +1120 │ │ │ │ │ +1121 if(!res.converged) │ │ │ │ │ +1122 DUNE_THROW(MathError, "Coarse solver did not converge"); │ │ │ │ │ +1123#else │ │ │ │ │ +1124 *lhs=0; │ │ │ │ │ +1125#endif │ │ │ │ │ +1126 // Prologate and add up corrections from all levels │ │ │ │ │ +1127 --pinfo; │ │ │ │ │ +1128 --aggregates; │ │ │ │ │ +1129 │ │ │ │ │ +1130 for(typename Hierarchy::Iterator coarseLhs = lhs--; coarseLhs != │ │ │ │ │ +lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) { │ │ │ │ │ +1131 Transfer │ │ │ │ │ +1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo); │ │ │ │ │ +1133 } │ │ │ │ │ +1134 } │ │ │ │ │ +1135 │ │ │ │ │ +1136 │ │ │ │ │ +1138 template │ │ │ │ │ +_1_1_3_9 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_p_o_s_t([[maybe_unused]] _D_o_m_a_i_n& x) │ │ │ │ │ +1140 { │ │ │ │ │ +1141 // Postprocess all smoothers │ │ │ │ │ +1142 typedef typename _H_i_e_r_a_r_c_h_y_<_S_m_o_o_t_h_e_r_,_A_>_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ +1143 typedef typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r DIterator; │ │ │ │ │ +1144 Iterator coarsest = smoothers_->coarsest(); │ │ │ │ │ +1145 Iterator smoother = smoothers_->finest(); │ │ │ │ │ +1146 DIterator lhs = lhs_->finest(); │ │ │ │ │ +1147 if(smoothers_->levels()>0) { │ │ │ │ │ +1148 if(smoother != coarsest || matrices_->levels()maxlevels()) │ │ │ │ │ +1149 smoother->post(*lhs); │ │ │ │ │ +1150 if(smoother!=coarsest) │ │ │ │ │ +1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs) │ │ │ │ │ +1152 smoother->post(*lhs); │ │ │ │ │ +1153 smoother->post(*lhs); │ │ │ │ │ +1154 } │ │ │ │ │ +1155 lhs_ = nullptr; │ │ │ │ │ +1156 update_ = nullptr; │ │ │ │ │ +1157 rhs_ = nullptr; │ │ │ │ │ +1158 } │ │ │ │ │ +1159 │ │ │ │ │ +1160 template │ │ │ │ │ +1161 template │ │ │ │ │ +_1_1_6_2 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont) │ │ │ │ │ +1163 { │ │ │ │ │ +1164 matrices_->getCoarsestAggregatesOnFinest(cont); │ │ │ │ │ +1165 } │ │ │ │ │ +1166 │ │ │ │ │ +1167 } // end namespace Amg │ │ │ │ │ +1168 │ │ │ │ │ +_1_1_6_9 struct _A_M_G_C_r_e_a_t_o_r{ │ │ │ │ │ +_1_1_7_0 template struct _i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e : std::false_type{}; │ │ │ │ │ +_1_1_7_1 template struct │ │ │ │ │ +_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e<_F_i_e_l_d_M_a_t_r_i_x> : std::true_type{}; │ │ │ │ │ +1172 │ │ │ │ │ +1173 template │ │ │ │ │ +1174 std::shared_ptr > │ │ │ │ │ +_1_1_7_5 _m_a_k_e_A_M_G(const OP& op, const std::string& smoother, const Dune:: │ │ │ │ │ +ParameterTree& config) const │ │ │ │ │ +1176 { │ │ │ │ │ +1177 DUNE_THROW(Dune::Exception, "Operator type not supported by AMG"); │ │ │ │ │ +1178 } │ │ │ │ │ +1179 │ │ │ │ │ +1180 template │ │ │ │ │ +1181 std::shared_ptr > │ │ │ │ │ +_1_1_8_2 _m_a_k_e_A_M_G(const std::shared_ptr<_M_a_t_r_i_x_A_d_a_p_t_e_r_<_M_,_X_,_Y_>>& op, const std:: │ │ │ │ │ +string& smoother, │ │ │ │ │ +1183 const Dune::ParameterTree& config) const │ │ │ │ │ +1184 { │ │ │ │ │ +1185 using OP = _M_a_t_r_i_x_A_d_a_p_t_e_r_<_M_,_X_,_Y_>; │ │ │ │ │ +1186 │ │ │ │ │ +1187 if(smoother == "ssor") │ │ │ │ │ +1188 return std::make_shared>>(op, config); │ │ │ │ │ +1189 if(smoother == "sor") │ │ │ │ │ +1190 return std::make_shared>>(op, config); │ │ │ │ │ +1191 if(smoother == "jac") │ │ │ │ │ +1192 return std::make_shared>>(op, config); │ │ │ │ │ +1193 if(smoother == "gs") │ │ │ │ │ +1194 return std::make_shared>>(op, config); │ │ │ │ │ +1195 if(smoother == "ilu") │ │ │ │ │ +1196 return std::make_shared>>(op, config); │ │ │ │ │ +1197 else │ │ │ │ │ +1198 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG"); │ │ │ │ │ +1199 } │ │ │ │ │ +1200 │ │ │ │ │ +1201 template │ │ │ │ │ +1202 std::shared_ptr > │ │ │ │ │ +_1_2_0_3 _m_a_k_e_A_M_G(const std::shared_ptr<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>>& op, │ │ │ │ │ +const std::string& smoother, │ │ │ │ │ +1204 const Dune::ParameterTree& config) const │ │ │ │ │ +1205 { │ │ │ │ │ +1206 using OP = _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>; │ │ │ │ │ +1207 │ │ │ │ │ +1208 auto cop = std::static_pointer_cast(op); │ │ │ │ │ +1209 │ │ │ │ │ +1210 if(smoother == "ssor") │ │ │ │ │ +1211 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ +()); │ │ │ │ │ +1212 if(smoother == "sor") │ │ │ │ │ +1213 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ +()); │ │ │ │ │ +1214 if(smoother == "jac") │ │ │ │ │ +1215 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ +()); │ │ │ │ │ +1216 if(smoother == "gs") │ │ │ │ │ +1217 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ +()); │ │ │ │ │ +1218 if(smoother == "ilu") │ │ │ │ │ +1219 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ +()); │ │ │ │ │ +1220 else │ │ │ │ │ +1221 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG"); │ │ │ │ │ +1222 } │ │ │ │ │ +1223 │ │ │ │ │ +1224 template │ │ │ │ │ +1225 std::shared_ptr > │ │ │ │ │ +_1_2_2_6 _m_a_k_e_A_M_G(const std::shared_ptr<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>>& op, │ │ │ │ │ +const std::string& smoother, │ │ │ │ │ +1227 const Dune::ParameterTree& config) const │ │ │ │ │ +1228 { │ │ │ │ │ +1229 using OP = _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>; │ │ │ │ │ +1230 │ │ │ │ │ +1231 if(smoother == "ssor") │ │ │ │ │ +1232 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ +>getCommunication()); │ │ │ │ │ +1233 if(smoother == "sor") │ │ │ │ │ +1234 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ +>getCommunication()); │ │ │ │ │ +1235 if(smoother == "jac") │ │ │ │ │ +1236 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ +>getCommunication()); │ │ │ │ │ +1237 if(smoother == "gs") │ │ │ │ │ +1238 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ +>getCommunication()); │ │ │ │ │ +1239 if(smoother == "ilu") │ │ │ │ │ +1240 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ +>getCommunication()); │ │ │ │ │ +1241 else │ │ │ │ │ +1242 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG"); │ │ │ │ │ +1243 } │ │ │ │ │ +1244 │ │ │ │ │ +1245 template │ │ │ │ │ +1246 std::shared_ptr::type, │ │ │ │ │ +1247 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +_1_2_4_8 _o_p_e_r_a_t_o_r_(_)_ (TL tl, const std::shared_ptr& op, const Dune:: │ │ │ │ │ +ParameterTree& config, │ │ │ │ │ +1249 std::enable_if_t<_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e_<_t_y_p_e_n_a_m_e_ _O_P_:_:_m_a_t_r_i_x___t_y_p_e_:_:_b_l_o_c_k___t_y_p_e_>_:_: │ │ │ │ │ +_v_a_l_u_e,int> = 0) const │ │ │ │ │ +1250 { │ │ │ │ │ +1251 using field_type = typename OP::matrix_type::field_type; │ │ │ │ │ +1252 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1253 if (!std::is_convertible()) │ │ │ │ │ +1254 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, "AMG needs field_type(" << │ │ │ │ │ +1255 className() << │ │ │ │ │ +1256 ") to be convertible to its real_type (" << │ │ │ │ │ +1257 className() << │ │ │ │ │ +1258 ")."); │ │ │ │ │ +1259 using D = typename Dune::TypeListElement<1, decltype(tl)>::type; │ │ │ │ │ +1260 using R = typename Dune::TypeListElement<2, decltype(tl)>::type; │ │ │ │ │ +1261 std::shared_ptr> amg; │ │ │ │ │ +1262 std::string smoother = config.get("smoother", "ssor"); │ │ │ │ │ +1263 return _m_a_k_e_A_M_G(op, smoother, config); │ │ │ │ │ +1264 } │ │ │ │ │ +1265 │ │ │ │ │ +1266 template │ │ │ │ │ +1267 std::shared_ptr::type, │ │ │ │ │ +1268 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +_1_2_6_9 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const std::shared_ptr& /*mat*/, const Dune:: │ │ │ │ │ +ParameterTree& /*config*/, │ │ │ │ │ +1270 std::enable_if_t_:_: │ │ │ │ │ +_v_a_l_u_e,int> = 0) const │ │ │ │ │ +1271 { │ │ │ │ │ +1272 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, "AMG needs a FieldMatrix as Matrix │ │ │ │ │ +block_type"); │ │ │ │ │ +1273 } │ │ │ │ │ +1274 }; │ │ │ │ │ +1275 │ │ │ │ │ +_1_2_7_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("amg", _A_M_G_C_r_e_a_t_o_r()); │ │ │ │ │ +1277} // end namespace Dune │ │ │ │ │ +1278 │ │ │ │ │ +1279#endif │ │ │ │ │ +_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R │ │ │ │ │ +#define DUNE_REGISTER_PRECONDITIONER(name,...) │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:16 │ │ │ │ │ +_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h │ │ │ │ │ +Provides a classes representing the hierarchies in AMG. │ │ │ │ │ +_s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ +Classes for the generic construction and application of the smoothers. │ │ │ │ │ +_t_r_a_n_s_f_e_r_._h_h │ │ │ │ │ +Prolongation and restriction for amg. │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_s_u_p_e_r_l_u_._h_h │ │ │ │ │ +Classes for using SuperLU with ISTL matrices. │ │ │ │ │ +_u_m_f_p_a_c_k_._h_h │ │ │ │ │ +Classes for using UMFPack with ISTL matrices. │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ _c_o_l │ │ │ │ │ Col col │ │ │ │ │ DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_O_V_L_e_s_s_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2) │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_N_o_n_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ -static void constructNonOverlapConnectivity(R &row, G &graph, V &visitedMap, │ │ │ │ │ -const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename │ │ │ │ │ -G::VertexDescriptor &seed) │ │ │ │ │ -Construct the connectivity of an aggregate in the overlap. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:313 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The type of the graph. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -void operator++() │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const ConstEdgeIterator &edge) │ │ │ │ │ -Process an edge pointing to another aggregate. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_i_n_s_e_r_t │ │ │ │ │ -void insert(const typename M::size_type &index) │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:552 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_c_o_n_s_t_r_u_c_t_O_v_e_r_l_a_p_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ │ -static void constructOverlapConnectivity(R &row, G &graph, V &visitedMap, const │ │ │ │ │ -AggregatesMap< typename G::VertexDescriptor > &aggregates, const OverlapVertex< │ │ │ │ │ -typename G::VertexDescriptor > *&seed, const OverlapVertex< typename G:: │ │ │ │ │ -VertexDescriptor > *overlapEnd) │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:331 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_b_u_i_l_d │ │ │ │ │ -G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation │ │ │ │ │ -&pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const │ │ │ │ │ -typename G::Matrix::size_type &size, const Set ©) │ │ │ │ │ -Calculates the coarse matrix via a Galerkin product. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:563 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_i_n_d_e_x │ │ │ │ │ -std::size_t index() │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -T ParallelInformation │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_V_e_r_t_e_x │ │ │ │ │ -G::VertexDescriptor Vertex │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:272 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_A_g_g_r_e_g_a_t_e │ │ │ │ │ -T Aggregate │ │ │ │ │ -The aggregate descriptor. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r │ │ │ │ │ -SparsityBuilder(M &matrix) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:513 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ -ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph, │ │ │ │ │ -VisitedMap &visitedMap, Set &connected) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:352 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Graph::ConstEdgeIterator ConstEdgeIterator │ │ │ │ │ -The constant edge iterator. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_V_e_r_t_e_x │ │ │ │ │ -T Vertex │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_<_ _G_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ -G::VertexDescriptor Vertex │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:288 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_e_x_a_m_i_n_e │ │ │ │ │ -static void examine(G &graph, V &visitedMap, const T &pinfo, const │ │ │ │ │ -AggregatesMap< Vertex > &aggregates, const O &overlap, const OverlapVertex< │ │ │ │ │ -Vertex > *overlapVertices, const OverlapVertex< Vertex > *overlapEnd, R &row) │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:420 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_V_i_s_i_t_e_d_M_a_p │ │ │ │ │ -V VisitedMap │ │ │ │ │ -The type of the map for marking vertices as visited. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_v_i_s_i_t_N_e_i_g_h_b_o_u_r_s │ │ │ │ │ -int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, │ │ │ │ │ -V &visitor) │ │ │ │ │ -Visit all neighbour vertices of a vertex in a graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_S_e_t │ │ │ │ │ -S Set │ │ │ │ │ -The type of the connected set. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_a_g_g_r_e_g_a_t_e │ │ │ │ │ -Aggregate * aggregate │ │ │ │ │ -The aggregate the vertex belongs to. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_s_u_m_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t sumRowSize() │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:534 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x_:_:_v_e_r_t_e_x │ │ │ │ │ -Vertex vertex │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_m_i_n_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t minRowSize() │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:528 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r_:_:_s_e_t │ │ │ │ │ -static void set(M &coarse, const T &pinfo, const O ©) │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:682 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r_:_:_V_e_r_t_e_x │ │ │ │ │ -Graph::VertexDescriptor Vertex │ │ │ │ │ -The vertex descriptor of the graph. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_:_:_c_a_l_c_u_l_a_t_e │ │ │ │ │ -void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, │ │ │ │ │ -const I &pinfo, const O ©) │ │ │ │ │ -Calculate the galerkin product. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r_:_:_m_a_x_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t maxRowSize() │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:523 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ +AMG(const AMG &amg) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:392 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_p_r_e │ │ │ │ │ +void pre(Domain &x, Range &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:801 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_c_r_e_a_t_e │ │ │ │ │ +static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector) │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:681 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_n_a_m_e │ │ │ │ │ +static std::string name() │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:680 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_u_p_d_a_t_e │ │ │ │ │ +Hierarchy< Domain, A >::Iterator update │ │ │ │ │ +The iterator over the updates. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_h_s │ │ │ │ │ +Hierarchy< Range, A >::Iterator rhs │ │ │ │ │ +The iterator over the right hand sided. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u_ _>_:_:_n_a_m_e │ │ │ │ │ +static std::string name() │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:672 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r │ │ │ │ │ +bool usesDirectCoarseLevelSolver() const │ │ │ │ │ +Check whether the coarse solver used is a direct solver. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1024 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ +X Domain │ │ │ │ │ +The domain type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_:_:_c_r_e_a_t_e │ │ │ │ │ +static type * create(const M &mat, bool verbose, bool reusevector) │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:644 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ +AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs │ │ │ │ │ +&smootherArgs, const Parameters &parms) │ │ │ │ │ +Construct a new amg with a specific coarse solver. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:406 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ +AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree │ │ │ │ │ +&configuration, const ParallelInformation &pinfo=ParallelInformation()) │ │ │ │ │ +Constructor an AMG via ParameterTree. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:452 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_p_i_n_f_o │ │ │ │ │ +ParallelInformationHierarchy::Iterator pinfo │ │ │ │ │ +The iterator over the parallel information. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:287 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_T_y_p_e │ │ │ │ │ +SolverType │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_a_g_g_r_e_g_a_t_e_s │ │ │ │ │ +OperatorHierarchy::AggregatesMapList::const_iterator aggregates │ │ │ │ │ +The iterator over the aggregates maps. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:295 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +SmootherTraits< Smoother >::Arguments SmootherArgs │ │ │ │ │ +The argument type for the construction of the smoother. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_e_l_e_c_t_e_d_S_o_l_v_e_r │ │ │ │ │ +Solver< Matrix, solver > SelectedSolver │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:677 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ +std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< │ │ │ │ │ +MatrixAdapter< M, X, Y > > &op, const std::string &smoother, const Dune:: │ │ │ │ │ +ParameterTree &config) const │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1182 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_T_o_L_o_w_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +std::string operator()(const std::string &str) │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:378 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ +std::shared_ptr< Dune::Preconditioner< typename OP::element_type::domain_type, │ │ │ │ │ +typename OP::element_type::range_type > > makeAMG(const OP &op, const std:: │ │ │ │ │ +string &smoother, const Dune::ParameterTree &config) const │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1175 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_S_m_o_o_t_h_e_r │ │ │ │ │ +S Smoother │ │ │ │ │ +The type of the smoother. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_:_:_n_a_m_e │ │ │ │ │ +static std::string name() │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:649 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_s_m_o_o_t_h_e_r │ │ │ │ │ +Hierarchy< Smoother, A >::Iterator smoother │ │ │ │ │ +The iterator over the smoothers. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ +M Operator │ │ │ │ │ +The matrix operator type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_m_a_t_r_i_x │ │ │ │ │ +OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix │ │ │ │ │ +The iterator over the matrices. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u_ _>_:_:_t_y_p_e │ │ │ │ │ +SuperLU< M > type │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:667 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u_ _>_:_:_c_r_e_a_t_e │ │ │ │ │ +static type * create(const M &mat, bool verbose, bool reusevector) │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:668 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_e_d_i_s_t │ │ │ │ │ +OperatorHierarchy::RedistributeInfoList::const_iterator redist │ │ │ │ │ +The iterator over the redistribution information. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:291 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ +X Range │ │ │ │ │ +The range type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h │ │ │ │ │ +void presmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ +Apply pre smoothing on the current level. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:406 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s │ │ │ │ │ +void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont) │ │ │ │ │ +Get the aggregate number of each unknown on the coarsest level. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1162 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_l_e_v_e_l_s │ │ │ │ │ +std::size_t levels() │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:876 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_:_:_t_y_p_e │ │ │ │ │ +InverseOperator< Vector, Vector > type │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:643 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ +std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< │ │ │ │ │ +OverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, │ │ │ │ │ +const Dune::ParameterTree &config) const │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1203 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_h_s │ │ │ │ │ +Hierarchy< Domain, A >::Iterator lhs │ │ │ │ │ +The iterator over the left hand side. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ +const void * Arguments │ │ │ │ │ +A type holding all the arguments needed to call the constructor. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_s_o_l_v_e_r │ │ │ │ │ +static constexpr SolverType solver │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:629 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ +static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ +Construct an object with the specified arguments. │ │ │ │ │ +DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_i_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +static constexpr bool isDirectSolver │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:679 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y │ │ │ │ │ +void recalculateHierarchy() │ │ │ │ │ +Recalculate the matrix hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +Matrix::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:626 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +SelectedSolver::type DirectSolver │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:678 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL │ │ │ │ │ +>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL tl, │ │ │ │ │ +const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std:: │ │ │ │ │ +enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value, │ │ │ │ │ +int >=0) const │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1248 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ +OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy │ │ │ │ │ +The parallal data distribution hierarchy type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_C_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ +InverseOperator< X, X > CoarseSolver │ │ │ │ │ +the type of the coarse solver. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_p_o_s_t │ │ │ │ │ +void post(Domain &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1139 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ +std::size_t maxlevels() │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:881 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ +std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< │ │ │ │ │ +NonoverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, │ │ │ │ │ +const Dune::ParameterTree &config) const │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1226 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h │ │ │ │ │ +void postsmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ +Apply post smoothing on the current level. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:428 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_e_v_e_l │ │ │ │ │ +std::size_t level │ │ │ │ │ +The level index. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ +AMG(const Operator &fineOperator, const C &criterion, const SmootherArgs │ │ │ │ │ +&smootherArgs=SmootherArgs(), const ParallelInformation │ │ │ │ │ +&pinfo=ParallelInformation()) │ │ │ │ │ +Construct an AMG with an inexact coarse solver based on the smoother. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:428 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_a_p_p_l_y │ │ │ │ │ +void apply(Domain &v, const Range &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:888 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_S_m_o_o_t_h_e_r_T_y_p_e │ │ │ │ │ +Smoother SmootherType │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y │ │ │ │ │ +MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy │ │ │ │ │ +The operator hierarchy type. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +PI ParallelInformation │ │ │ │ │ +The type of the parallel information. Either OwnerOverlapCommunication or │ │ │ │ │ +another type describing the... │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_n_o_n_e │ │ │ │ │ +@ none │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_u_m_f_p_a_c_k │ │ │ │ │ +@ umfpack │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_s_u_p_e_r_l_u │ │ │ │ │ +@ superlu │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_a_t_O_n_c_e_A_c_c_u │ │ │ │ │ +@ atOnceAccu │ │ │ │ │ +Accumulate data to one process at once. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_n_o_A_c_c_u │ │ │ │ │ +@ noAccu │ │ │ │ │ +No data accumulution. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:238 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u │ │ │ │ │ +@ successiveAccu │ │ │ │ │ +Successively accumulate to fewer processes. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:248 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_D_u_m_m_y_E_d_g_e_V_i_s_i_t_o_r │ │ │ │ │ -A Dummy visitor that does nothing for each visited edge. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:598 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_O_v_e_r_l_a_p_V_e_r_t_e_x │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_p_a_r_s_i_t_y_B_u_i_l_d_e_r │ │ │ │ │ -Functor for building the sparsity pattern of the matrix using │ │ │ │ │ -examineConnectivity. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_l_e_r_k_i_n_P_r_o_d_u_c_t │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_B_a_s_e_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r_:_:_C_o_n_n_e_c_t_e_d_B_u_i_l_d_e_r │ │ │ │ │ -Visitor for identifying connected aggregates during a breadthFirstSearch. │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_n_e_c_t_i_v_i_t_y_C_o_n_s_t_r_u_c_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_i_c_h_l_e_t_B_o_u_n_d_a_r_y_S_e_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn galerkin.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ +Export the type representing the underlying field. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::const_iterator ConstColIterator │ │ │ │ │ +Const iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +T block_type │ │ │ │ │ +Export the type representing the components. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +A nonoverlapping operator with communication object. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ +Adapter to turn a matrix into a linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l │ │ │ │ │ +Norm that uses only the [N][N] entry of the block to determine couplings. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m │ │ │ │ │ +Functor using the row sum (infinity) norm to determine strong couplings. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:463 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:480 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:496 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +Criterion taking advantage of symmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:519 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ +Criterion suitable for unsymmetric matrices. │ │ │ │ │ +DDeeffiinniittiioonn aggregates.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G │ │ │ │ │ +an algebraic multigrid method using a Krylov-cycle. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ +Two grid operator for AMG with Krylov cycle. │ │ │ │ │ +DDeeffiinniittiioonn kamg.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_A_M_G │ │ │ │ │ +Parallel algebraic multigrid based on agglomeration. │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:625 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:642 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1169 │ │ │ │ │ +_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn amg.hh:1170 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +An overlapping Schwarz operator. │ │ │ │ │ +DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation │ │ │ │ │ +> Iterator │ │ │ │ │ +Type of the mutable iterator. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator over the levels in the hierarchy. │ │ │ │ │ +DDeeffiinniittiioonn hierarchy.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ +The hierarchies build by the coarsening process. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ +The criterion describing the stop criteria for the coarsening process. │ │ │ │ │ +DDeeffiinniittiioonn matrixhierarchy.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +All parameters for AMG. │ │ │ │ │ +DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ nonoverlapping │ │ │ │ │ -Category for non-overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ +The default class for the smoother arguments. │ │ │ │ │ +DDeeffiinniittiioonn smoother.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _X_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Base class for scalar product and norm computation. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ +bool converged │ │ │ │ │ +True if convergence criterion has been met. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +Categories for the solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ _D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ newly introduced virtu... │ │ │ │ │ DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U │ │ │ │ │ +SuperLu Solver. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k │ │ │ │ │ +The UMFPack direct sparse solver. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:335 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00116.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: hierarchy.hh File Reference │ │ │ │ +dune-istl: fastamgsmoother.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,49 +72,35 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ - │ │ │ │ +
fastamgsmoother.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Provides a classes representing the hierarchies in AMG. │ │ │ │ -More...

│ │ │ │ -
#include <list>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ -#include <dune/common/bigunsignedint.hh>
│ │ │ │ -#include <dune/istl/paamg/construction.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::Hierarchy< T, A >
 A hierarchy of containers (e.g. matrices or vectors) More...
struct  Dune::Amg::GaussSeidelPresmoothDefect< level >
 
class  Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 >
 Iterator over the levels in the hierarchy. More...
struct  Dune::Amg::GaussSeidelPostsmoothDefect< level >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Provides a classes representing the hierarchies in AMG.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,37 +2,22 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -hierarchy.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ +fastamgsmoother.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_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _T_,_ _A_ _> │ │ │ │ │ -  A hierarchy of containers (e.g. matrices or vectors) _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_<_ _l_e_v_e_l_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _T_,_ _A_ _>_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_<_ _C_,_ _T_1_ _> │ │ │ │ │ -  Iterator over the levels in the hierarchy. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t_<_ _l_e_v_e_l_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: hierarchy.hh Source File │ │ │ │ +dune-istl: fastamgsmoother.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,419 +74,127 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hierarchy.hh
│ │ │ │ +
fastamgsmoother.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMGHIERARCHY_HH
│ │ │ │ -
6#define DUNE_AMGHIERARCHY_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH
│ │ │ │ +
6#define DUNE_ISTL_FASTAMGSMOOTHER_HH
│ │ │ │
7
│ │ │ │ -
8#include <list>
│ │ │ │ -
9#include <memory>
│ │ │ │ -
10#include <limits>
│ │ │ │ -
11#include <dune/common/stdstreams.hh>
│ │ │ │ -
12#include <dune/common/timer.hh>
│ │ │ │ -
13#include <dune/common/bigunsignedint.hh>
│ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16namespace Dune
│ │ │ │ -
17{
│ │ │ │ -
18 namespace Amg
│ │ │ │ -
19 {
│ │ │ │ -
38 template<typename T, typename A=std::allocator<T> >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
40 {
│ │ │ │ -
41 public:
│ │ │ │ -
45 typedef T MemberType;
│ │ │ │ -
46
│ │ │ │ -
47 template<typename T1, typename T2>
│ │ │ │ -
48 class LevelIterator;
│ │ │ │ -
49
│ │ │ │ -
50 private:
│ │ │ │ -
54 struct Element
│ │ │ │ -
55 {
│ │ │ │ -
56 friend class LevelIterator<Hierarchy<T,A>, T>;
│ │ │ │ -
57 friend class LevelIterator<const Hierarchy<T,A>, const T>;
│ │ │ │ -
58
│ │ │ │ -
60 std::weak_ptr<Element> coarser_;
│ │ │ │ +
8#include <cstddef>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune
│ │ │ │ +
11{
│ │ │ │ +
12 namespace Amg
│ │ │ │ +
13 {
│ │ │ │ +
14
│ │ │ │ +
15 template<std::size_t level>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
17
│ │ │ │ +
18 template<typename M, typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
19 static void apply(const M& A, X& x, Y& d,
│ │ │ │ +
20 const Y& b)
│ │ │ │ +
21 {
│ │ │ │ +
22 typedef typename M::ConstRowIterator RowIterator;
│ │ │ │ +
23 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ +
24
│ │ │ │ +
25 typename Y::iterator dIter=d.begin();
│ │ │ │ +
26 typename Y::const_iterator bIter=b.begin();
│ │ │ │ +
27 typename X::iterator xIter=x.begin();
│ │ │ │ +
28
│ │ │ │ +
29 for(RowIterator row=A.begin(), end=A.end(); row != end;
│ │ │ │ +
30 ++row, ++dIter, ++xIter, ++bIter)
│ │ │ │ +
31 {
│ │ │ │ +
32 ColIterator col=(*row).begin();
│ │ │ │ +
33 *dIter = *bIter;
│ │ │ │ +
34
│ │ │ │ +
35 for (; col.index()<row.index(); ++col)
│ │ │ │ +
36 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ +
37 assert(row.index()==col.index());
│ │ │ │ +
38 ColIterator diag=col; // upper diagonal matrix not needed as x was 0 before.
│ │ │ │ +
39
│ │ │ │ +
40 // Not recursive yet. Just solve with the diagonal
│ │ │ │ +
41 diag->solve(*xIter,*dIter);
│ │ │ │ +
42 *dIter=0; //as r=v
│ │ │ │ +
43
│ │ │ │ +
44 // Update residual for the symmetric case
│ │ │ │ +
45 for(col=(*row).begin(); col.index()<row.index(); ++col)
│ │ │ │ +
46 col->mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
│ │ │ │ +
47 }
│ │ │ │ +
48 }
│ │ │ │ +
│ │ │ │ +
49 };
│ │ │ │ +
│ │ │ │ +
50
│ │ │ │ +
51 template<std::size_t level>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
53
│ │ │ │ +
54 template<typename M, typename X, typename Y>
│ │ │ │ +
│ │ │ │ +
55 static void apply(const M& A, X& x, Y& d,
│ │ │ │ +
56 const Y& b)
│ │ │ │ +
57 {
│ │ │ │ +
58 typedef typename M::ConstRowIterator RowIterator;
│ │ │ │ +
59 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ +
60 typedef typename Y::block_type YBlock;
│ │ │ │
61
│ │ │ │ -
63 std::shared_ptr<Element> finer_;
│ │ │ │ -
64
│ │ │ │ -
66 std::shared_ptr<MemberType> element_;
│ │ │ │ -
67
│ │ │ │ -
69 std::shared_ptr<MemberType> redistributed_;
│ │ │ │ -
70 };
│ │ │ │ -
71 public:
│ │ │ │ +
62 typename Y::iterator dIter=d.beforeEnd();
│ │ │ │ +
63 typename X::iterator xIter=x.beforeEnd();
│ │ │ │ +
64 typename Y::const_iterator bIter=b.beforeEnd();
│ │ │ │ +
65
│ │ │ │ +
66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end;
│ │ │ │ +
67 --row, --dIter, --xIter, --bIter)
│ │ │ │ +
68 {
│ │ │ │ +
69 ColIterator endCol=(*row).beforeBegin();
│ │ │ │ +
70 ColIterator col=(*row).beforeEnd();
│ │ │ │ +
71 *dIter = *bIter;
│ │ │ │
72
│ │ │ │ -
76 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
│ │ │ │ -
77
│ │ │ │ - │ │ │ │ -
79
│ │ │ │ -
│ │ │ │ -
84 Hierarchy(const std::shared_ptr<MemberType> & first);
│ │ │ │ -
85
│ │ │ │ -
│ │ │ │ -
89 Hierarchy() : levels_(0)
│ │ │ │ -
90 {}
│ │ │ │ -
│ │ │ │ -
91
│ │ │ │ -
│ │ │ │ -
95 Hierarchy(const Hierarchy& other);
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
102
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
104
│ │ │ │ -
│ │ │ │ -
109 void addFiner(Arguments& args);
│ │ │ │ -
110
│ │ │ │ -
117 template<class C, class T1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
119 : public BidirectionalIteratorFacade<LevelIterator<C,T1>,T1,T1&>
│ │ │ │ -
120 {
│ │ │ │ -
121 friend class LevelIterator<typename std::remove_const<C>::type,
│ │ │ │ -
122 typename std::remove_const<T1>::type >;
│ │ │ │ -
123 friend class LevelIterator<const typename std::remove_const<C>::type,
│ │ │ │ -
124 const typename std::remove_const<T1>::type >;
│ │ │ │ -
125
│ │ │ │ -
126 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129 {}
│ │ │ │ -
│ │ │ │ -
130
│ │ │ │ -
│ │ │ │ -
131 LevelIterator(std::shared_ptr<Element> element)
│ │ │ │ -
132 : element_(element)
│ │ │ │ -
133 {}
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ -
136 LevelIterator(const LevelIterator<typename std::remove_const<C>::type,
│ │ │ │ -
137 typename std::remove_const<T1>::type>& other)
│ │ │ │ -
138 : element_(other.element_)
│ │ │ │ -
139 {}
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
│ │ │ │ -
142 LevelIterator(const LevelIterator<const typename std::remove_const<C>::type,
│ │ │ │ -
143 const typename std::remove_const<T1>::type>& other)
│ │ │ │ -
144 : element_(other.element_)
│ │ │ │ -
145 {}
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
│ │ │ │ -
150 bool equals(const LevelIterator<typename std::remove_const<C>::type,
│ │ │ │ -
151 typename std::remove_const<T1>::type>& other) const
│ │ │ │ -
152 {
│ │ │ │ -
153 return element_ == other.element_;
│ │ │ │ -
154 }
│ │ │ │ -
│ │ │ │ -
155
│ │ │ │ -
│ │ │ │ -
159 bool equals(const LevelIterator<const typename std::remove_const<C>::type,
│ │ │ │ -
160 const typename std::remove_const<T1>::type>& other) const
│ │ │ │ -
161 {
│ │ │ │ -
162 return element_ == other.element_;
│ │ │ │ -
163 }
│ │ │ │ -
│ │ │ │ -
164
│ │ │ │ -
│ │ │ │ -
166 T1& dereference() const
│ │ │ │ -
167 {
│ │ │ │ -
168 return *(element_->element_);
│ │ │ │ -
169 }
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
173 {
│ │ │ │ -
174 element_ = element_->coarser_.lock();
│ │ │ │ -
175 }
│ │ │ │ -
│ │ │ │ -
176
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
179 {
│ │ │ │ -
180 element_ = element_->finer_;
│ │ │ │ -
181 }
│ │ │ │ -
│ │ │ │ -
182
│ │ │ │ -
│ │ │ │ -
187 bool isRedistributed() const
│ │ │ │ -
188 {
│ │ │ │ -
189 return (bool)element_->redistributed_;
│ │ │ │ -
190 }
│ │ │ │ -
│ │ │ │ -
191
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
197 {
│ │ │ │ -
198 assert(element_->redistributed_);
│ │ │ │ -
199 return *element_->redistributed_;
│ │ │ │ -
200 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
201 void addRedistributed(std::shared_ptr<T1> t)
│ │ │ │ -
202 {
│ │ │ │ -
203 element_->redistributed_ = t;
│ │ │ │ -
204 }
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
207 {
│ │ │ │ -
208 element_->redistributed_ = nullptr;
│ │ │ │ -
209 }
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
211 private:
│ │ │ │ -
212 std::shared_ptr<Element> element_;
│ │ │ │ -
213 };
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ - │ │ │ │ -
217
│ │ │ │ - │ │ │ │ -
220
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
226
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
232
│ │ │ │ -
233
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
239
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
245
│ │ │ │ -
│ │ │ │ -
250 std::size_t levels() const;
│ │ │ │ -
251
│ │ │ │ -
252 private:
│ │ │ │ -
258 std::shared_ptr<MemberType> originalFinest_;
│ │ │ │ -
260 std::shared_ptr<Element> finest_;
│ │ │ │ -
262 std::shared_ptr<Element> coarsest_;
│ │ │ │ -
264 Allocator allocator_;
│ │ │ │ -
266 int levels_;
│ │ │ │ -
267 };
│ │ │ │ -
268
│ │ │ │ -
269 template<class T, class A>
│ │ │ │ -
│ │ │ │ -
270 Hierarchy<T,A>::Hierarchy(const std::shared_ptr<MemberType> & first)
│ │ │ │ -
271 : originalFinest_(first)
│ │ │ │ -
272 {
│ │ │ │ -
273 finest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
274 finest_->element_ = originalFinest_;
│ │ │ │ -
275 coarsest_ = finest_;
│ │ │ │ -
276 levels_ = 1;
│ │ │ │ -
277 }
│ │ │ │ -
│ │ │ │ -
278
│ │ │ │ -
280 //TODO: do we actually want to support this? This might be very expensive?!
│ │ │ │ -
281 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
283 : allocator_(other.allocator_),
│ │ │ │ -
284 levels_(other.levels_)
│ │ │ │ -
285 {
│ │ │ │ -
286 if(!other.finest_)
│ │ │ │ -
287 {
│ │ │ │ -
288 finest_=coarsest_=nullptr;
│ │ │ │ -
289 return;
│ │ │ │ -
290 }
│ │ │ │ -
291 finest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
292 std::shared_ptr<Element> finer_;
│ │ │ │ -
293 std::shared_ptr<Element> current_ = finest_;
│ │ │ │ -
294 std::weak_ptr<Element> otherWeak_ = other.finest_;
│ │ │ │ -
295
│ │ │ │ -
296 while(! otherWeak_.expired())
│ │ │ │ -
297 {
│ │ │ │ -
298 // create shared_ptr from weak_ptr, we just checked that this is safe
│ │ │ │ -
299 std::shared_ptr<Element> otherCurrent_ = std::shared_ptr<Element>(otherWeak_);
│ │ │ │ -
300 // clone current level
│ │ │ │ -
301 //TODO: should we use the allocator?
│ │ │ │ -
302 current_->element_ =
│ │ │ │ -
303 std::make_shared<MemberType>(*(otherCurrent_->element_));
│ │ │ │ -
304 current_->finer_=finer_;
│ │ │ │ -
305 if(otherCurrent_->redistributed_)
│ │ │ │ -
306 current_->redistributed_ =
│ │ │ │ -
307 std::make_shared<MemberType>(*(otherCurrent_->redistributed_));
│ │ │ │ -
308 finer_=current_;
│ │ │ │ -
309 if(not otherCurrent_->coarser_.expired())
│ │ │ │ -
310 {
│ │ │ │ -
311 auto c = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
312 current_->coarser_ = c;
│ │ │ │ -
313 current_ = c;
│ │ │ │ -
314 }
│ │ │ │ -
315 // go to coarser level
│ │ │ │ -
316 otherWeak_ = otherCurrent_->coarser_;
│ │ │ │ -
317 }
│ │ │ │ -
318 coarsest_=current_;
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
321 template<class T, class A>
│ │ │ │ -
│ │ │ │ -
322 std::size_t Hierarchy<T,A>::levels() const
│ │ │ │ -
323 {
│ │ │ │ -
324 return levels_;
│ │ │ │ -
325 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
326
│ │ │ │ -
327 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
329 {
│ │ │ │ -
330 coarsest_->redistributed_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ -
331 }
│ │ │ │ -
│ │ │ │ -
332
│ │ │ │ -
333 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
335 {
│ │ │ │ -
336 if(!coarsest_) {
│ │ │ │ -
337 // we have no levels at all...
│ │ │ │ -
338 assert(!finest_);
│ │ │ │ -
339 // allocate into the shared_ptr
│ │ │ │ -
340 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ -
341 coarsest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
342 coarsest_->element_ = originalFinest_;
│ │ │ │ -
343 finest_ = coarsest_;
│ │ │ │ -
344 }else{
│ │ │ │ -
345 auto old_coarsest = coarsest_;
│ │ │ │ -
346 coarsest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
347 coarsest_->finer_ = old_coarsest;
│ │ │ │ -
348 coarsest_->element_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ -
349 old_coarsest->coarser_ = coarsest_;
│ │ │ │ -
350 }
│ │ │ │ -
351 ++levels_;
│ │ │ │ -
352 }
│ │ │ │ -
│ │ │ │ -
353
│ │ │ │ -
354
│ │ │ │ -
355 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
357 {
│ │ │ │ -
358 //TODO: wouldn't it be better to do this in the constructor?'
│ │ │ │ -
359 if(!finest_) {
│ │ │ │ -
360 // we have no levels at all...
│ │ │ │ -
361 assert(!coarsest_);
│ │ │ │ -
362 // allocate into the shared_ptr
│ │ │ │ -
363 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
│ │ │ │ -
364 finest_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
365 finest_->element = originalFinest_;
│ │ │ │ -
366 coarsest_ = finest_;
│ │ │ │ -
367 }else{
│ │ │ │ -
368 finest_->finer_ = std::allocate_shared<Element>(allocator_);
│ │ │ │ -
369 finest_->finer_->coarser_ = finest_;
│ │ │ │ -
370 finest_ = finest_->finer_;
│ │ │ │ -
371 finest_->element = ConstructionTraits<T>::construct(args);
│ │ │ │ -
372 }
│ │ │ │ -
373 ++levels_;
│ │ │ │ -
374 }
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
376 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
378 {
│ │ │ │ -
379 return Iterator(finest_);
│ │ │ │ -
380 }
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
382 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
384 {
│ │ │ │ -
385 return Iterator(coarsest_);
│ │ │ │ -
386 }
│ │ │ │ -
│ │ │ │ -
387
│ │ │ │ -
388 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
390 {
│ │ │ │ -
391 return ConstIterator(finest_);
│ │ │ │ -
392 }
│ │ │ │ -
│ │ │ │ -
393
│ │ │ │ -
394 template<class T, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
396 {
│ │ │ │ -
397 return ConstIterator(coarsest_);
│ │ │ │ -
398 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
400 } // namespace Amg
│ │ │ │ -
401} // namespace Dune
│ │ │ │ -
402
│ │ │ │ -
403#endif
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
Helper classes for the construction of classes without empty constructor.
│ │ │ │ -
Hierarchy(const Hierarchy &other)
Copy constructor (deep copy!).
Definition hierarchy.hh:282
│ │ │ │ -
void addRedistributedOnCoarsest(Arguments &args)
Definition hierarchy.hh:328
│ │ │ │ -
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition hierarchy.hh:322
│ │ │ │ -
ConstIterator coarsest() const
Get an iterator positioned at the coarsest level.
Definition hierarchy.hh:395
│ │ │ │ -
void addCoarser(Arguments &args)
Add an element on a coarser level.
Definition hierarchy.hh:334
│ │ │ │ -
void addFiner(Arguments &args)
Add an element on a finer level.
Definition hierarchy.hh:356
│ │ │ │ -
Hierarchy(const std::shared_ptr< MemberType > &first)
Construct a new hierarchy.
Definition hierarchy.hh:270
│ │ │ │ -
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ -
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ -
Iterator coarsest()
Get an iterator positioned at the coarsest level.
Definition hierarchy.hh:383
│ │ │ │ -
ConstIterator finest() const
Get an iterator positioned at the finest level.
Definition hierarchy.hh:389
│ │ │ │ -
Iterator finest()
Get an iterator positioned at the finest level.
Definition hierarchy.hh:377
│ │ │ │ -
STL namespace.
│ │ │ │ +
73 for (; col.index()>row.index(); --col)
│ │ │ │ +
74 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j
│ │ │ │ +
75 assert(row.index()==col.index());
│ │ │ │ +
76 ColIterator diag=col;
│ │ │ │ +
77 YBlock v=*dIter;
│ │ │ │ +
78 // upper diagonal matrix
│ │ │ │ +
79 for (--col; col!=endCol; --col)
│ │ │ │ +
80 (*col).mmv(x[col.index()],v); // v -= sum_{j<i} a_ij * xold_j
│ │ │ │ +
81
│ │ │ │ +
82 // Not recursive yet. Just solve with the diagonal
│ │ │ │ +
83 diag->solve(*xIter,v);
│ │ │ │ +
84
│ │ │ │ +
85 *dIter-=v;
│ │ │ │ +
86
│ │ │ │ +
87 // Update residual for the symmetric case
│ │ │ │ +
88 // Skip residual computation as it is not needed.
│ │ │ │ +
89 //for(col=(*row).begin();col.index()<row.index(); ++col)
│ │ │ │ +
90 //col.mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
│ │ │ │ +
91 }
│ │ │ │ +
92 }
│ │ │ │ +
│ │ │ │ +
93 };
│ │ │ │ +
│ │ │ │ +
94 } // end namespace Amg
│ │ │ │ +
95} // end namespace Dune
│ │ │ │ +
96#endif
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A hierarchy of containers (e.g. matrices or vectors)
Definition hierarchy.hh:40
│ │ │ │ -
T MemberType
The type of the container we store.
Definition hierarchy.hh:45
│ │ │ │ -
LevelIterator< Hierarchy< T, A >, T > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ -
LevelIterator< const Hierarchy< T, A >, const T > ConstIterator
Type of the const iterator.
Definition hierarchy.hh:219
│ │ │ │ -
ConstructionTraits< T >::Arguments Arguments
Definition hierarchy.hh:78
│ │ │ │ -
Hierarchy()
Construct an empty hierarchy.
Definition hierarchy.hh:89
│ │ │ │ -
typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
The allocator to use for the list elements.
Definition hierarchy.hh:76
│ │ │ │ -
Iterator over the levels in the hierarchy.
Definition hierarchy.hh:120
│ │ │ │ -
LevelIterator(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other)
Copy constructor.
Definition hierarchy.hh:136
│ │ │ │ -
void addRedistributed(std::shared_ptr< T1 > t)
Definition hierarchy.hh:201
│ │ │ │ -
T1 & dereference() const
Dereference the iterator.
Definition hierarchy.hh:166
│ │ │ │ -
bool equals(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other) const
Equality check.
Definition hierarchy.hh:150
│ │ │ │ -
bool isRedistributed() const
Check whether there was a redistribution at the current level.
Definition hierarchy.hh:187
│ │ │ │ -
bool equals(const LevelIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T1 >::type > &other) const
Equality check.
Definition hierarchy.hh:159
│ │ │ │ -
void increment()
Move to the next coarser level.
Definition hierarchy.hh:172
│ │ │ │ -
LevelIterator(const LevelIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T1 >::type > &other)
Copy constructor.
Definition hierarchy.hh:142
│ │ │ │ -
void deleteRedistributed()
Definition hierarchy.hh:206
│ │ │ │ -
void decrement()
Move to the next fine level.
Definition hierarchy.hh:178
│ │ │ │ -
LevelIterator(std::shared_ptr< Element > element)
Definition hierarchy.hh:131
│ │ │ │ -
T1 & getRedistributed() const
Get the redistributed container.
Definition hierarchy.hh:196
│ │ │ │ +
Definition fastamgsmoother.hh:16
│ │ │ │ +
static void apply(const M &A, X &x, Y &d, const Y &b)
Definition fastamgsmoother.hh:19
│ │ │ │ +
Definition fastamgsmoother.hh:52
│ │ │ │ +
static void apply(const M &A, X &x, Y &d, const Y &b)
Definition fastamgsmoother.hh:55
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,442 +1,123 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ * _p_a_a_m_g │ │ │ │ │ -hierarchy.hh │ │ │ │ │ +fastamgsmoother.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMGHIERARCHY_HH │ │ │ │ │ -6#define DUNE_AMGHIERARCHY_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH │ │ │ │ │ +6#define DUNE_ISTL_FASTAMGSMOOTHER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_c_o_n_s_t_r_u_c_t_i_o_n_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e │ │ │ │ │ -17{ │ │ │ │ │ -18 namespace Amg │ │ │ │ │ -19 { │ │ │ │ │ -38 template > │ │ │ │ │ -_3_9 class _H_i_e_r_a_r_c_h_y │ │ │ │ │ -40 { │ │ │ │ │ -41 public: │ │ │ │ │ -_4_5 typedef T _M_e_m_b_e_r_T_y_p_e; │ │ │ │ │ -46 │ │ │ │ │ -47 template │ │ │ │ │ -48 class _L_e_v_e_l_I_t_e_r_a_t_o_r; │ │ │ │ │ -49 │ │ │ │ │ -50 private: │ │ │ │ │ -54 struct Element │ │ │ │ │ -55 { │ │ │ │ │ -56 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r<_H_i_e_r_a_r_c_h_y, T>; │ │ │ │ │ -57 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r, const T>; │ │ │ │ │ -58 │ │ │ │ │ -60 std::weak_ptr coarser_; │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e │ │ │ │ │ +11{ │ │ │ │ │ +12 namespace Amg │ │ │ │ │ +13 { │ │ │ │ │ +14 │ │ │ │ │ +15 template │ │ │ │ │ +_1_6 struct _G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t { │ │ │ │ │ +17 │ │ │ │ │ +18 template │ │ │ │ │ +_1_9 static void _a_p_p_l_y(const M& A, X& x, Y& d, │ │ │ │ │ +20 const Y& b) │ │ │ │ │ +21 { │ │ │ │ │ +22 typedef typename M::ConstRowIterator RowIterator; │ │ │ │ │ +23 typedef typename M::ConstColIterator ColIterator; │ │ │ │ │ +24 │ │ │ │ │ +25 typename Y::iterator dIter=d.begin(); │ │ │ │ │ +26 typename Y::const_iterator bIter=b.begin(); │ │ │ │ │ +27 typename X::iterator xIter=x.begin(); │ │ │ │ │ +28 │ │ │ │ │ +29 for(RowIterator row=A.begin(), end=A.end(); row != end; │ │ │ │ │ +30 ++row, ++dIter, ++xIter, ++bIter) │ │ │ │ │ +31 { │ │ │ │ │ +32 ColIterator _c_o_l=(*row).begin(); │ │ │ │ │ +33 *dIter = *bIter; │ │ │ │ │ +34 │ │ │ │ │ +35 for (; _c_o_l.index()solve(*xIter,*dIter); │ │ │ │ │ +42 *dIter=0; //as r=v │ │ │ │ │ +43 │ │ │ │ │ +44 // Update residual for the symmetric case │ │ │ │ │ +45 for(_c_o_l=(*row).begin(); _c_o_l.index()mmv(*xIter, d[_c_o_l.index()]); //d_j-=A_ij x_i │ │ │ │ │ +47 } │ │ │ │ │ +48 } │ │ │ │ │ +49 }; │ │ │ │ │ +50 │ │ │ │ │ +51 template │ │ │ │ │ +_5_2 struct _G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t { │ │ │ │ │ +53 │ │ │ │ │ +54 template │ │ │ │ │ +_5_5 static void _a_p_p_l_y(const M& A, X& x, Y& d, │ │ │ │ │ +56 const Y& b) │ │ │ │ │ +57 { │ │ │ │ │ +58 typedef typename M::ConstRowIterator RowIterator; │ │ │ │ │ +59 typedef typename M::ConstColIterator ColIterator; │ │ │ │ │ +60 typedef typename Y::block_type YBlock; │ │ │ │ │ 61 │ │ │ │ │ -63 std::shared_ptr finer_; │ │ │ │ │ -64 │ │ │ │ │ -66 std::shared_ptr element_; │ │ │ │ │ -67 │ │ │ │ │ -_6_9 std::shared_ptr redistributed_; │ │ │ │ │ -70 }; │ │ │ │ │ -71 public: │ │ │ │ │ +62 typename Y::iterator dIter=d.beforeEnd(); │ │ │ │ │ +63 typename X::iterator xIter=x.beforeEnd(); │ │ │ │ │ +64 typename Y::const_iterator bIter=b.beforeEnd(); │ │ │ │ │ +65 │ │ │ │ │ +66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end; │ │ │ │ │ +67 --row, --dIter, --xIter, --bIter) │ │ │ │ │ +68 { │ │ │ │ │ +69 ColIterator endCol=(*row).beforeBegin(); │ │ │ │ │ +70 ColIterator _c_o_l=(*row).beforeEnd(); │ │ │ │ │ +71 *dIter = *bIter; │ │ │ │ │ 72 │ │ │ │ │ -_7_6 using _A_l_l_o_c_a_t_o_r = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc; │ │ │ │ │ -77 │ │ │ │ │ -_7_8 typedef typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_T_>_:_:_A_r_g_u_m_e_n_t_s _A_r_g_u_m_e_n_t_s; │ │ │ │ │ -79 │ │ │ │ │ -_8_4 _H_i_e_r_a_r_c_h_y(const std::shared_ptr & first); │ │ │ │ │ -85 │ │ │ │ │ -_8_9 _H_i_e_r_a_r_c_h_y() : levels_(0) │ │ │ │ │ -90 {} │ │ │ │ │ -91 │ │ │ │ │ -_9_5 _H_i_e_r_a_r_c_h_y(const _H_i_e_r_a_r_c_h_y& other); │ │ │ │ │ -96 │ │ │ │ │ -_1_0_1 void _a_d_d_C_o_a_r_s_e_r(_A_r_g_u_m_e_n_t_s& args); │ │ │ │ │ -102 │ │ │ │ │ -_1_0_3 void _a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d_O_n_C_o_a_r_s_e_s_t(_A_r_g_u_m_e_n_t_s& args); │ │ │ │ │ -104 │ │ │ │ │ -_1_0_9 void _a_d_d_F_i_n_e_r(_A_r_g_u_m_e_n_t_s& args); │ │ │ │ │ -110 │ │ │ │ │ -117 template │ │ │ │ │ -_1_1_8 class _L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -119 : public BidirectionalIteratorFacade,T1,T1&> │ │ │ │ │ -120 { │ │ │ │ │ -121 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -122 typename std::remove_const::type >; │ │ │ │ │ -123 friend class _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -124 const typename std::remove_const::type >; │ │ │ │ │ -125 │ │ │ │ │ -126 public: │ │ │ │ │ -_1_2_8 _L_e_v_e_l_I_t_e_r_a_t_o_r() │ │ │ │ │ -129 {} │ │ │ │ │ -130 │ │ │ │ │ -_1_3_1 _L_e_v_e_l_I_t_e_r_a_t_o_r(std::shared_ptr element) │ │ │ │ │ -132 : element_(element) │ │ │ │ │ -133 {} │ │ │ │ │ -134 │ │ │ │ │ -_1_3_6 _L_e_v_e_l_I_t_e_r_a_t_o_r(const _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -137 typename std::remove_const::type>& other) │ │ │ │ │ -138 : element_(other.element_) │ │ │ │ │ -139 {} │ │ │ │ │ -140 │ │ │ │ │ -_1_4_2 _L_e_v_e_l_I_t_e_r_a_t_o_r(const _L_e_v_e_l_I_t_e_r_a_t_o_r:: │ │ │ │ │ -type, │ │ │ │ │ -143 const typename std::remove_const::type>& other) │ │ │ │ │ -144 : element_(other.element_) │ │ │ │ │ -145 {} │ │ │ │ │ -146 │ │ │ │ │ -_1_5_0 bool _e_q_u_a_l_s(const _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -151 typename std::remove_const::type>& other) const │ │ │ │ │ -152 { │ │ │ │ │ -153 return element_ == other.element_; │ │ │ │ │ -154 } │ │ │ │ │ -155 │ │ │ │ │ -_1_5_9 bool _e_q_u_a_l_s(const _L_e_v_e_l_I_t_e_r_a_t_o_r::type, │ │ │ │ │ -160 const typename std::remove_const::type>& other) const │ │ │ │ │ -161 { │ │ │ │ │ -162 return element_ == other.element_; │ │ │ │ │ -163 } │ │ │ │ │ -164 │ │ │ │ │ -_1_6_6 T1& _d_e_r_e_f_e_r_e_n_c_e() const │ │ │ │ │ -167 { │ │ │ │ │ -168 return *(element_->element_); │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -_1_7_2 void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -173 { │ │ │ │ │ -174 element_ = element_->coarser_.lock(); │ │ │ │ │ -175 } │ │ │ │ │ -176 │ │ │ │ │ -_1_7_8 void _d_e_c_r_e_m_e_n_t() │ │ │ │ │ -179 { │ │ │ │ │ -180 element_ = element_->finer_; │ │ │ │ │ -181 } │ │ │ │ │ -182 │ │ │ │ │ -_1_8_7 bool _i_s_R_e_d_i_s_t_r_i_b_u_t_e_d() const │ │ │ │ │ -188 { │ │ │ │ │ -189 return (bool)element_->redistributed_; │ │ │ │ │ -190 } │ │ │ │ │ -191 │ │ │ │ │ -_1_9_6 T1& _g_e_t_R_e_d_i_s_t_r_i_b_u_t_e_d() const │ │ │ │ │ -197 { │ │ │ │ │ -198 assert(element_->redistributed_); │ │ │ │ │ -199 return *element_->redistributed_; │ │ │ │ │ -200 } │ │ │ │ │ -_2_0_1 void _a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d(std::shared_ptr t) │ │ │ │ │ -202 { │ │ │ │ │ -203 element_->redistributed_ = t; │ │ │ │ │ -204 } │ │ │ │ │ -205 │ │ │ │ │ -_2_0_6 void _d_e_l_e_t_e_R_e_d_i_s_t_r_i_b_u_t_e_d() │ │ │ │ │ -207 { │ │ │ │ │ -208 element_->redistributed_ = nullptr; │ │ │ │ │ -209 } │ │ │ │ │ -210 │ │ │ │ │ -211 private: │ │ │ │ │ -212 std::shared_ptr element_; │ │ │ │ │ -213 }; │ │ │ │ │ -214 │ │ │ │ │ -_2_1_6 typedef _L_e_v_e_l_I_t_e_r_a_t_o_r_<_H_i_e_r_a_r_c_h_y_<_T_,_A_>,T> _I_t_e_r_a_t_o_r; │ │ │ │ │ -217 │ │ │ │ │ -_2_1_9 typedef _L_e_v_e_l_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _H_i_e_r_a_r_c_h_y_<_T_,_A_>, const T> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -220 │ │ │ │ │ -_2_2_5 _I_t_e_r_a_t_o_r _f_i_n_e_s_t(); │ │ │ │ │ -226 │ │ │ │ │ -_2_3_1 _I_t_e_r_a_t_o_r _c_o_a_r_s_e_s_t(); │ │ │ │ │ -232 │ │ │ │ │ -233 │ │ │ │ │ -_2_3_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_e_s_t() const; │ │ │ │ │ -239 │ │ │ │ │ -_2_4_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _c_o_a_r_s_e_s_t() const; │ │ │ │ │ -245 │ │ │ │ │ -_2_5_0 std::size_t _l_e_v_e_l_s() const; │ │ │ │ │ -251 │ │ │ │ │ -252 private: │ │ │ │ │ -258 std::shared_ptr originalFinest_; │ │ │ │ │ -260 std::shared_ptr finest_; │ │ │ │ │ -262 std::shared_ptr coarsest_; │ │ │ │ │ -264 _A_l_l_o_c_a_t_o_r allocator_; │ │ │ │ │ -266 int levels_; │ │ │ │ │ -267 }; │ │ │ │ │ -268 │ │ │ │ │ -269 template │ │ │ │ │ -_2_7_0 _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_H_i_e_r_a_r_c_h_y(const std::shared_ptr & first) │ │ │ │ │ -271 : originalFinest_(first) │ │ │ │ │ -272 { │ │ │ │ │ -273 finest_ = std::allocate_shared(allocator_); │ │ │ │ │ -274 finest_->element_ = originalFinest_; │ │ │ │ │ -275 coarsest_ = finest_; │ │ │ │ │ -276 levels_ = 1; │ │ │ │ │ -277 } │ │ │ │ │ -278 │ │ │ │ │ -280 //TODO: do we actually want to support this? This might be very expensive?! │ │ │ │ │ -281 template │ │ │ │ │ -_2_8_2 _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_H_i_e_r_a_r_c_h_y(const _H_i_e_r_a_r_c_h_y& other) │ │ │ │ │ -283 : allocator_(other.allocator_), │ │ │ │ │ -284 levels_(other.levels_) │ │ │ │ │ -285 { │ │ │ │ │ -286 if(!other.finest_) │ │ │ │ │ -287 { │ │ │ │ │ -288 finest_=coarsest_=nullptr; │ │ │ │ │ -289 return; │ │ │ │ │ -290 } │ │ │ │ │ -291 finest_ = std::allocate_shared(allocator_); │ │ │ │ │ -292 std::shared_ptr finer_; │ │ │ │ │ -293 std::shared_ptr current_ = finest_; │ │ │ │ │ -294 std::weak_ptr otherWeak_ = other.finest_; │ │ │ │ │ -295 │ │ │ │ │ -296 while(! otherWeak_.expired()) │ │ │ │ │ -297 { │ │ │ │ │ -298 // create shared_ptr from weak_ptr, we just checked that this is safe │ │ │ │ │ -299 std::shared_ptr otherCurrent_ = std::shared_ptr │ │ │ │ │ -(otherWeak_); │ │ │ │ │ -300 // clone current level │ │ │ │ │ -301 //TODO: should we use the allocator? │ │ │ │ │ -302 current_->element_ = │ │ │ │ │ -303 std::make_shared(*(otherCurrent_->element_)); │ │ │ │ │ -304 current_->finer_=finer_; │ │ │ │ │ -305 if(otherCurrent_->redistributed_) │ │ │ │ │ -306 current_->redistributed_ = │ │ │ │ │ -307 std::make_shared(*(otherCurrent_->redistributed_)); │ │ │ │ │ -308 finer_=current_; │ │ │ │ │ -309 if(not otherCurrent_->coarser_.expired()) │ │ │ │ │ -310 { │ │ │ │ │ -311 auto c = std::allocate_shared(allocator_); │ │ │ │ │ -312 current_->coarser_ = c; │ │ │ │ │ -313 current_ = c; │ │ │ │ │ -314 } │ │ │ │ │ -315 // go to coarser level │ │ │ │ │ -316 otherWeak_ = otherCurrent_->coarser_; │ │ │ │ │ -317 } │ │ │ │ │ -318 coarsest_=current_; │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -321 template │ │ │ │ │ -_3_2_2 std::size_t _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_l_e_v_e_l_s() const │ │ │ │ │ -323 { │ │ │ │ │ -324 return levels_; │ │ │ │ │ -325 } │ │ │ │ │ -326 │ │ │ │ │ -327 template │ │ │ │ │ -_3_2_8 void _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d_O_n_C_o_a_r_s_e_s_t(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -329 { │ │ │ │ │ -330 coarsest_->redistributed_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -(args); │ │ │ │ │ -331 } │ │ │ │ │ -332 │ │ │ │ │ -333 template │ │ │ │ │ -_3_3_4 void _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_a_d_d_C_o_a_r_s_e_r(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -335 { │ │ │ │ │ -336 if(!coarsest_) { │ │ │ │ │ -337 // we have no levels at all... │ │ │ │ │ -338 assert(!finest_); │ │ │ │ │ -339 // allocate into the shared_ptr │ │ │ │ │ -340 originalFinest_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ -341 coarsest_ = std::allocate_shared(allocator_); │ │ │ │ │ -342 coarsest_->element_ = originalFinest_; │ │ │ │ │ -343 finest_ = coarsest_; │ │ │ │ │ -344 }else{ │ │ │ │ │ -345 auto old_coarsest = coarsest_; │ │ │ │ │ -346 coarsest_ = std::allocate_shared(allocator_); │ │ │ │ │ -347 coarsest_->finer_ = old_coarsest; │ │ │ │ │ -348 coarsest_->element_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ -349 old_coarsest->coarser_ = coarsest_; │ │ │ │ │ -350 } │ │ │ │ │ -351 ++levels_; │ │ │ │ │ -352 } │ │ │ │ │ -353 │ │ │ │ │ -354 │ │ │ │ │ -355 template │ │ │ │ │ -_3_5_6 void _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_a_d_d_F_i_n_e_r(_A_r_g_u_m_e_n_t_s& args) │ │ │ │ │ -357 { │ │ │ │ │ -358 //TODO: wouldn't it be better to do this in the constructor?' │ │ │ │ │ -359 if(!finest_) { │ │ │ │ │ -360 // we have no levels at all... │ │ │ │ │ -361 assert(!coarsest_); │ │ │ │ │ -362 // allocate into the shared_ptr │ │ │ │ │ -363 originalFinest_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_M_e_m_b_e_r_T_y_p_e_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ -364 finest_ = std::allocate_shared(allocator_); │ │ │ │ │ -365 finest_->element = originalFinest_; │ │ │ │ │ -366 coarsest_ = finest_; │ │ │ │ │ -367 }else{ │ │ │ │ │ -368 finest_->finer_ = std::allocate_shared(allocator_); │ │ │ │ │ -369 finest_->finer_->coarser_ = finest_; │ │ │ │ │ -370 finest_ = finest_->finer_; │ │ │ │ │ -371 finest_->element = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_T_>_:_:_c_o_n_s_t_r_u_c_t(args); │ │ │ │ │ -372 } │ │ │ │ │ -373 ++levels_; │ │ │ │ │ -374 } │ │ │ │ │ -375 │ │ │ │ │ -376 template │ │ │ │ │ -_3_7_7 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_f_i_n_e_s_t() │ │ │ │ │ -378 { │ │ │ │ │ -379 return _I_t_e_r_a_t_o_r(finest_); │ │ │ │ │ -380 } │ │ │ │ │ -381 │ │ │ │ │ -382 template │ │ │ │ │ -_3_8_3 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_c_o_a_r_s_e_s_t() │ │ │ │ │ -384 { │ │ │ │ │ -385 return _I_t_e_r_a_t_o_r(coarsest_); │ │ │ │ │ -386 } │ │ │ │ │ -387 │ │ │ │ │ -388 template │ │ │ │ │ -_3_8_9 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_f_i_n_e_s_t() const │ │ │ │ │ -390 { │ │ │ │ │ -391 return _C_o_n_s_t_I_t_e_r_a_t_o_r(finest_); │ │ │ │ │ -392 } │ │ │ │ │ -393 │ │ │ │ │ -394 template │ │ │ │ │ -_3_9_5 typename _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r _H_i_e_r_a_r_c_h_y_<_T_,_A_>_:_:_c_o_a_r_s_e_s_t() const │ │ │ │ │ -396 { │ │ │ │ │ -397 return _C_o_n_s_t_I_t_e_r_a_t_o_r(coarsest_); │ │ │ │ │ -398 } │ │ │ │ │ -400 } // namespace Amg │ │ │ │ │ -401} // namespace Dune │ │ │ │ │ -402 │ │ │ │ │ -403#endif │ │ │ │ │ -_c_o_n_s_t_r_u_c_t_i_o_n_._h_h │ │ │ │ │ -Helper classes for the construction of classes without empty constructor. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Hierarchy(const Hierarchy &other) │ │ │ │ │ -Copy constructor (deep copy!). │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d_O_n_C_o_a_r_s_e_s_t │ │ │ │ │ -void addRedistributedOnCoarsest(Arguments &args) │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:328 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_l_e_v_e_l_s │ │ │ │ │ -std::size_t levels() const │ │ │ │ │ -Get the number of levels in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_s_t │ │ │ │ │ -ConstIterator coarsest() const │ │ │ │ │ -Get an iterator positioned at the coarsest level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_C_o_a_r_s_e_r │ │ │ │ │ -void addCoarser(Arguments &args) │ │ │ │ │ -Add an element on a coarser level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:334 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_a_d_d_F_i_n_e_r │ │ │ │ │ -void addFiner(Arguments &args) │ │ │ │ │ -Add an element on a finer level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:356 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Hierarchy(const std::shared_ptr< MemberType > &first) │ │ │ │ │ -Construct a new hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:270 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const void * Arguments │ │ │ │ │ -A type holding all the arguments needed to call the constructor. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ -Construct an object with the specified arguments. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_c_o_a_r_s_e_s_t │ │ │ │ │ -Iterator coarsest() │ │ │ │ │ -Get an iterator positioned at the coarsest level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:383 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_f_i_n_e_s_t │ │ │ │ │ -ConstIterator finest() const │ │ │ │ │ -Get an iterator positioned at the finest level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_f_i_n_e_s_t │ │ │ │ │ -Iterator finest() │ │ │ │ │ -Get an iterator positioned at the finest level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:377 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +73 for (; _c_o_l.index()>row.index(); --_c_o_l) │ │ │ │ │ +74 (*col).mmv(x[_c_o_l.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j │ │ │ │ │ +75 assert(row.index()==_c_o_l.index()); │ │ │ │ │ +76 ColIterator diag=_c_o_l; │ │ │ │ │ +77 YBlock v=*dIter; │ │ │ │ │ +78 // upper diagonal matrix │ │ │ │ │ +79 for (--_c_o_l; _c_o_l!=endCol; --_c_o_l) │ │ │ │ │ +80 (*col).mmv(x[_c_o_l.index()],v); // v -= sum_{jsolve(*xIter,v); │ │ │ │ │ +84 │ │ │ │ │ +85 *dIter-=v; │ │ │ │ │ +86 │ │ │ │ │ +87 // Update residual for the symmetric case │ │ │ │ │ +88 // Skip residual computation as it is not needed. │ │ │ │ │ +89 //for(col=(*row).begin();col.index(), T > Iterator │ │ │ │ │ -Type of the mutable iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator< const Hierarchy< T, A >, const T > ConstIterator │ │ │ │ │ -Type of the const iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -ConstructionTraits< T >::Arguments Arguments │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Hierarchy() │ │ │ │ │ -Construct an empty hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_A_l_l_o_c_a_t_o_r │ │ │ │ │ -typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator │ │ │ │ │ -The allocator to use for the list elements. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator over the levels in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator(const LevelIterator< typename std::remove_const< C >::type, │ │ │ │ │ -typename std::remove_const< T1 >::type > &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_a_d_d_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ -void addRedistributed(std::shared_ptr< T1 > t) │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:201 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -T1 & dereference() const │ │ │ │ │ -Dereference the iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:166 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const LevelIterator< typename std::remove_const< C >::type, │ │ │ │ │ -typename std::remove_const< T1 >::type > &other) const │ │ │ │ │ -Equality check. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_i_s_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ -bool isRedistributed() const │ │ │ │ │ -Check whether there was a redistribution at the current level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:187 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const LevelIterator< const typename std::remove_const< C >::type, │ │ │ │ │ -const typename std::remove_const< T1 >::type > &other) const │ │ │ │ │ -Equality check. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -Move to the next coarser level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator(const LevelIterator< const typename std::remove_const< C >::type, │ │ │ │ │ -const typename std::remove_const< T1 >::type > &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_d_e_l_e_t_e_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ -void deleteRedistributed() │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -Move to the next fine level. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator(std::shared_ptr< Element > element) │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r_:_:_g_e_t_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ -T1 & getRedistributed() const │ │ │ │ │ -Get the redistributed container. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t │ │ │ │ │ +DDeeffiinniittiioonn fastamgsmoother.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(const M &A, X &x, Y &d, const Y &b) │ │ │ │ │ +DDeeffiinniittiioonn fastamgsmoother.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t │ │ │ │ │ +DDeeffiinniittiioonn fastamgsmoother.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_o_s_t_s_m_o_o_t_h_D_e_f_e_c_t_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(const M &A, X &x, Y &d, const Y &b) │ │ │ │ │ +DDeeffiinniittiioonn fastamgsmoother.hh:55 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00119.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: pinfo.hh File Reference │ │ │ │ +dune-istl: gsetc.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,47 +65,202 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
pinfo.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Enumerations | │ │ │ │ +Functions
│ │ │ │ +
gsetc.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/parallel/communication.hh>
│ │ │ │ -#include <dune/common/enumset.hh>
│ │ │ │ -#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ -#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -#include <dune/common/parallel/interface.hh>
│ │ │ │ -#include <dune/common/parallel/communicator.hh>
│ │ │ │ -#include <dune/istl/solvercategory.hh>
│ │ │ │ + │ │ │ │ +

Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way. │ │ │ │ +More...

│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <iomanip>
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include "multitypeblockvector.hh"
│ │ │ │ +#include "multitypeblockmatrix.hh"
│ │ │ │ +#include "istlexception.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::SequentialInformation
struct  Dune::BL< l >
 compile-time parameter for block recursion depth More...
 
struct  Dune::algmeta_btsolve< I, diag, relax >
 
struct  Dune::algmeta_btsolve< 0, withdiag, withrelax >
 
struct  Dune::algmeta_btsolve< 0, withdiag, norelax >
 
struct  Dune::algmeta_btsolve< 0, nodiag, withrelax >
 
struct  Dune::algmeta_btsolve< 0, nodiag, norelax >
 
struct  Dune::algmeta_bdsolve< I, relax >
 
struct  Dune::algmeta_bdsolve< 0, withrelax >
 
struct  Dune::algmeta_bdsolve< 0, norelax >
 
struct  Dune::algmeta_itsteps< I, M >
 
struct  Dune::algmeta_itsteps< 0, M >
 
struct  Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Enumerations

enum  Dune::WithDiagType { Dune::withdiag =1 │ │ │ │ +, Dune::nodiag =0 │ │ │ │ + }
 
enum  Dune::WithRelaxType { Dune::withrelax =1 │ │ │ │ +, Dune::norelax =0 │ │ │ │ + }
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class M , class X , class Y >
void Dune::bltsolve (const M &A, X &v, const Y &d)
 block lower triangular solve
 
template<class M , class X , class Y , class K >
void Dune::bltsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed block lower triangular solve
 
template<class M , class X , class Y >
void Dune::ubltsolve (const M &A, X &v, const Y &d)
 unit block lower triangular solve
 
template<class M , class X , class Y , class K >
void Dune::ubltsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed unit block lower triangular solve
 
template<class M , class X , class Y >
void Dune::butsolve (const M &A, X &v, const Y &d)
 block upper triangular solve
 
template<class M , class X , class Y , class K >
void Dune::butsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed block upper triangular solve
 
template<class M , class X , class Y >
void Dune::ubutsolve (const M &A, X &v, const Y &d)
 unit block upper triangular solve
 
template<class M , class X , class Y , class K >
void Dune::ubutsolve (const M &A, X &v, const Y &d, const K &w)
 relaxed unit block upper triangular solve
 
template<class M , class X , class Y , int l>
void Dune::bltsolve (const M &A, X &v, const Y &d, BL< l >)
 block lower triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::bltsolve (const M &A, X &v, const Y &d, const K &w, BL< l >)
 relaxed block lower triangular solve
 
template<class M , class X , class Y , int l>
void Dune::ubltsolve (const M &A, X &v, const Y &d, BL< l >)
 unit block lower triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::ubltsolve (const M &A, X &v, const Y &d, const K &w, BL< l >)
 relaxed unit block lower triangular solve
 
template<class M , class X , class Y , int l>
void Dune::butsolve (const M &A, X &v, const Y &d, BL< l > bl)
 block upper triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::butsolve (const M &A, X &v, const Y &d, const K &w, BL< l > bl)
 relaxed block upper triangular solve
 
template<class M , class X , class Y , int l>
void Dune::ubutsolve (const M &A, X &v, const Y &d, BL< l > bl)
 unit block upper triangular solve
 
template<class M , class X , class Y , class K , int l>
void Dune::ubutsolve (const M &A, X &v, const Y &d, const K &w, BL< l > bl)
 relaxed unit block upper triangular solve
 
template<class M , class X , class Y >
void Dune::bdsolve (const M &A, X &v, const Y &d)
 block diagonal solve, no relaxation
 
template<class M , class X , class Y , class K >
void Dune::bdsolve (const M &A, X &v, const Y &d, const K &w)
 block diagonal solve, with relaxation
 
template<class M , class X , class Y , int l>
void Dune::bdsolve (const M &A, X &v, const Y &d, BL< l >)
 block diagonal solve, no relaxation
 
template<class M , class X , class Y , class K , int l>
void Dune::bdsolve (const M &A, X &v, const Y &d, const K &w, BL< l >)
 block diagonal solve, with relaxation
 
template<class M , class X , class Y , class K >
void Dune::dbgs (const M &A, X &x, const Y &b, const K &w)
 GS step.
 
template<class M , class X , class Y , class K , int l>
void Dune::dbgs (const M &A, X &x, const Y &b, const K &w, BL< l >)
 GS step.
 
template<class M , class X , class Y , class K >
void Dune::bsorf (const M &A, X &x, const Y &b, const K &w)
 SOR step.
 
template<class M , class X , class Y , class K , int l>
void Dune::bsorf (const M &A, X &x, const Y &b, const K &w, BL< l >)
 SOR step.
 
template<class M , class X , class Y , class K >
void Dune::bsorb (const M &A, X &x, const Y &b, const K &w)
 SSOR step.
 
template<class M , class X , class Y , class K , int l>
void Dune::bsorb (const M &A, X &x, const Y &b, const K &w, BL< l >)
 Backward SOR step.
 
template<class M , class X , class Y , class K >
void Dune::dbjac (const M &A, X &x, const Y &b, const K &w)
 Jacobi step.
 
template<class M , class X , class Y , class K , int l>
void Dune::dbjac (const M &A, X &x, const Y &b, const K &w, BL< l >)
 Jacobi step.
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,28 +1,173 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -pinfo.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +gsetc.hh File Reference │ │ │ │ │ +Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ +generic way. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_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_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ +struct   _D_u_n_e_:_:_B_L_<_ _l_ _> │ │ │ │ │ +  compile-time parameter for block recursion depth _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _I_,_ _d_i_a_g_,_ _r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _n_o_r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _n_o_r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _I_,_ _r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _w_i_t_h_r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _n_o_r_e_l_a_x_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_, │ │ │ │ │ + _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   _D_u_n_e_:_:_W_i_t_h_D_i_a_g_T_y_p_e { _D_u_n_e_:_:_w_i_t_h_d_i_a_g =1 , _D_u_n_e_:_:_n_o_d_i_a_g =0 } │ │ │ │ │ +  │ │ │ │ │ +enum   _D_u_n_e_:_:_W_i_t_h_R_e_l_a_x_T_y_p_e { _D_u_n_e_:_:_w_i_t_h_r_e_l_a_x =1 , _D_u_n_e_:_:_n_o_r_e_l_a_x =0 } │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ +  block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +  relaxed block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ +  unit block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +  relaxed unit block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ +  block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +  relaxed block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ +  unit block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +  relaxed unit block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l >) │ │ │ │ │ +  block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l >) │ │ │ │ │ +  relaxed block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l >) │ │ │ │ │ +  unit block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_l_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l >) │ │ │ │ │ +  relaxed unit block lower triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l > bl) │ │ │ │ │ +  block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l > bl) │ │ │ │ │ +  relaxed block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l > bl) │ │ │ │ │ +  unit block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_u_b_u_t_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l > bl) │ │ │ │ │ +  relaxed unit block upper triangular solve │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ +  block diagonal solve, no relaxation │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +  block diagonal solve, with relaxation │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d, _B_L< l >) │ │ │ │ │ +  block diagonal solve, no relaxation │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_d_s_o_l_v_e (const M &A, X &v, const Y &d, const K &w, _B_L< l >) │ │ │ │ │ +  block diagonal solve, with relaxation │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_d_b_g_s (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +  GS step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_d_b_g_s (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ +  GS step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_s_o_r_f (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +  SOR step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_s_o_r_f (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ +  SOR step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_s_o_r_b (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +  SSOR step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_b_s_o_r_b (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ +  Backward SOR step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_d_b_j_a_c (const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +  Jacobi step. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_d_b_j_a_c (const M &A, X &x, const Y &b, const K &w, _B_L< l >) │ │ │ │ │ +  Jacobi step. │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ +generic way. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: pinfo.hh Source File │ │ │ │ +dune-istl: gsetc.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,174 +70,839 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
pinfo.hh
│ │ │ │ +
gsetc.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_PINFO_HH
│ │ │ │ -
6#define DUNE_AMG_PINFO_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_GSETC_HH
│ │ │ │ +
6#define DUNE_ISTL_GSETC_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/parallel/communication.hh>
│ │ │ │ -
9#include <dune/common/enumset.hh>
│ │ │ │ -
10
│ │ │ │ -
11#if HAVE_MPI
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -
14#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ -
15#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -
16#include <dune/common/parallel/interface.hh>
│ │ │ │ -
17#include <dune/common/parallel/communicator.hh>
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <complex>
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <iomanip>
│ │ │ │ +
12#include <string>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/hybridutilities.hh>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │
18
│ │ │ │ -
19#endif
│ │ │ │ +
19#include "istlexception.hh"
│ │ │ │
20
│ │ │ │ - │ │ │ │ -
22namespace Dune
│ │ │ │ -
23{
│ │ │ │ -
24 namespace Amg
│ │ │ │ -
25 {
│ │ │ │ -
26
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
28 {
│ │ │ │ -
29 public:
│ │ │ │ -
30 typedef Communication<void*> MPICommunicator;
│ │ │ │ -
31 typedef EmptySet<int> CopyFlags;
│ │ │ │ -
32 typedef AllSet<int> OwnerSet;
│ │ │ │ -
33
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
36 }
│ │ │ │ -
│ │ │ │ -
37
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
39 {
│ │ │ │ -
40 return comm_;
│ │ │ │ -
41 }
│ │ │ │ -
│ │ │ │ +
21
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28
│ │ │ │ +
39 //============================================================
│ │ │ │ +
40 // parameter types
│ │ │ │ +
41 //============================================================
│ │ │ │
42
│ │ │ │ -
│ │ │ │ -
43 int procs() const
│ │ │ │ -
44 {
│ │ │ │ -
45 return 1;
│ │ │ │ -
46 }
│ │ │ │ -
│ │ │ │ -
47
│ │ │ │ -
48 template<typename T>
│ │ │ │ -
│ │ │ │ -
49 T globalSum(const T& t) const
│ │ │ │ -
50 {
│ │ │ │ -
51 return t;
│ │ │ │ -
52 }
│ │ │ │ +
44 template<int l>
│ │ │ │ +
│ │ │ │ +
45 struct BL {
│ │ │ │ +
46 enum {recursion_level = l};
│ │ │ │ +
47 };
│ │ │ │ +
│ │ │ │ +
48
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
51 nodiag=0
│ │ │ │ +
52 };
│ │ │ │
│ │ │ │
53
│ │ │ │ - │ │ │ │ -
55
│ │ │ │ -
56 void buildGlobalLookup(std::size_t){}
│ │ │ │ -
57
│ │ │ │ - │ │ │ │ -
59
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 {
│ │ │ │ -
62 return gli;
│ │ │ │ -
63 }
│ │ │ │ -
│ │ │ │ -
64
│ │ │ │ -
65 template<class V>
│ │ │ │ -
│ │ │ │ -
66 void copyOwnerToAll([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const
│ │ │ │ -
67 {}
│ │ │ │ -
│ │ │ │ -
68
│ │ │ │ -
69 template<class V>
│ │ │ │ -
│ │ │ │ -
70 void project([[maybe_unused]] V& v) const
│ │ │ │ -
71 {}
│ │ │ │ -
│ │ │ │ -
72
│ │ │ │ -
73 template<class T1, class T2>
│ │ │ │ -
│ │ │ │ -
74 void dot (const T1&, const T1&, T2&) const
│ │ │ │ -
75 {
│ │ │ │ -
76 // This function should never be called
│ │ │ │ -
77 std::abort();
│ │ │ │ -
78 }
│ │ │ │ -
│ │ │ │ -
79
│ │ │ │ -
80 template<class T1>
│ │ │ │ -
│ │ │ │ -
81 typename FieldTraits<typename T1::field_type>::real_type norm (const T1&) const
│ │ │ │ -
82 {
│ │ │ │ -
83 // This function should never be called
│ │ │ │ -
84 std::abort();
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
87 template<class T>
│ │ │ │ -
│ │ │ │ -
88 SequentialInformation(const Communication<T>&)
│ │ │ │ -
89 {}
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
92 {}
│ │ │ │ -
│ │ │ │ -
93
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
95 {}
│ │ │ │ -
│ │ │ │ -
96 private:
│ │ │ │ -
97 MPICommunicator comm_;
│ │ │ │ - │ │ │ │ -
99 };
│ │ │ │ -
│ │ │ │ -
100
│ │ │ │ -
101
│ │ │ │ -
102 } // namespace Amg
│ │ │ │ -
103} //namespace Dune
│ │ │ │ -
104#endif
│ │ │ │ - │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
56 norelax=0
│ │ │ │ +
57 };
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
59 //============================================================
│ │ │ │ +
60 // generic triangular solves
│ │ │ │ +
61 // consider block decomposition A = L + D + U
│ │ │ │ +
62 // we can invert L, L+D, U, U+D
│ │ │ │ +
63 // we can apply relaxation or not
│ │ │ │ +
64 // we can recurse over a fixed number of levels
│ │ │ │ +
65 //============================================================
│ │ │ │ +
66
│ │ │ │ +
67 // template meta program for triangular solves
│ │ │ │ +
68 template<int I, WithDiagType diag, WithRelaxType relax>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
70 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
71 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
72 {
│ │ │ │ +
73 // iterator types
│ │ │ │ +
74 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
75 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
76 typedef typename Y::block_type bblock;
│ │ │ │ +
77
│ │ │ │ +
78 // local solve at each block and immediate update
│ │ │ │ +
79 rowiterator endi=A.end();
│ │ │ │ +
80 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
81 {
│ │ │ │ +
82 bblock rhs(d[i.index()]);
│ │ │ │ +
83 coliterator j;
│ │ │ │ +
84 for (j=(*i).begin(); j.index()<i.index(); ++j)
│ │ │ │ +
85 (*j).mmv(v[j.index()],rhs);
│ │ │ │ +
86 algmeta_btsolve<I-1,diag,relax>::bltsolve(*j,v[i.index()],rhs,w);
│ │ │ │ +
87 }
│ │ │ │ +
88 }
│ │ │ │ +
│ │ │ │ +
89 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
90 static void butsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
91 {
│ │ │ │ +
92 // iterator types
│ │ │ │ +
93 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
94 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
95 typedef typename Y::block_type bblock;
│ │ │ │ +
96
│ │ │ │ +
97 // local solve at each block and immediate update
│ │ │ │ +
98 rowiterator rendi=A.beforeBegin();
│ │ │ │ +
99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
│ │ │ │ +
100 {
│ │ │ │ +
101 bblock rhs(d[i.index()]);
│ │ │ │ +
102 coliterator j;
│ │ │ │ +
103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
│ │ │ │ +
104 (*j).mmv(v[j.index()],rhs);
│ │ │ │ +
105 algmeta_btsolve<I-1,diag,relax>::butsolve(*j,v[i.index()],rhs,w);
│ │ │ │ +
106 }
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
108 };
│ │ │ │ +
│ │ │ │ +
109
│ │ │ │ +
110 // recursion end ...
│ │ │ │ +
111 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
113 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
114 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
115 {
│ │ │ │ +
116 A.solve(v,d);
│ │ │ │ +
117 v *= w;
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
120 static void butsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
121 {
│ │ │ │ +
122 A.solve(v,d);
│ │ │ │ +
123 v *= w;
│ │ │ │ +
124 }
│ │ │ │ +
│ │ │ │ +
125 };
│ │ │ │ +
│ │ │ │ +
126 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
128 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
129 static void bltsolve (const M& A, X& v, const Y& d, const K& /*w*/)
│ │ │ │ +
130 {
│ │ │ │ +
131 A.solve(v,d);
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
134 static void butsolve (const M& A, X& v, const Y& d, const K& /*w*/)
│ │ │ │ +
135 {
│ │ │ │ +
136 A.solve(v,d);
│ │ │ │ +
137 }
│ │ │ │ +
│ │ │ │ +
138 };
│ │ │ │ +
│ │ │ │ +
139 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
142 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& w)
│ │ │ │ +
143 {
│ │ │ │ +
144 v = d;
│ │ │ │ +
145 v *= w;
│ │ │ │ +
146 }
│ │ │ │ +
│ │ │ │ +
147 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
148 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& w)
│ │ │ │ +
149 {
│ │ │ │ +
150 v = d;
│ │ │ │ +
151 v *= w;
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153 };
│ │ │ │ +
│ │ │ │ +
154 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
157 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
│ │ │ │ +
158 {
│ │ │ │ +
159 v = d;
│ │ │ │ +
160 }
│ │ │ │ +
│ │ │ │ +
161 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
162 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
│ │ │ │ +
163 {
│ │ │ │ +
164 v = d;
│ │ │ │ +
165 }
│ │ │ │ +
│ │ │ │ +
166 };
│ │ │ │ +
│ │ │ │ +
167
│ │ │ │ +
168
│ │ │ │ +
169 // user calls
│ │ │ │ +
170
│ │ │ │ +
171 // default block recursion level = 1
│ │ │ │ +
172
│ │ │ │ +
174 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
175 void bltsolve (const M& A, X& v, const Y& d)
│ │ │ │ +
176 {
│ │ │ │ +
177 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
181 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
182 void bltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
183 {
│ │ │ │ + │ │ │ │ +
185 }
│ │ │ │ +
│ │ │ │ +
187 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
188 void ubltsolve (const M& A, X& v, const Y& d)
│ │ │ │ +
189 {
│ │ │ │ +
190 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
192 }
│ │ │ │ +
│ │ │ │ +
194 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
195 void ubltsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
196 {
│ │ │ │ + │ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │ +
199
│ │ │ │ +
201 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
202 void butsolve (const M& A, X& v, const Y& d)
│ │ │ │ +
203 {
│ │ │ │ +
204 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
206 }
│ │ │ │ +
│ │ │ │ +
208 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
209 void butsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
210 {
│ │ │ │ + │ │ │ │ +
212 }
│ │ │ │ +
│ │ │ │ +
214 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
215 void ubutsolve (const M& A, X& v, const Y& d)
│ │ │ │ +
216 {
│ │ │ │ +
217 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
219 }
│ │ │ │ +
│ │ │ │ +
221 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
222 void ubutsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
223 {
│ │ │ │ + │ │ │ │ +
225 }
│ │ │ │ +
│ │ │ │ +
226
│ │ │ │ +
227 // general block recursion level >= 0
│ │ │ │ +
228
│ │ │ │ +
230 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
231 void bltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
│ │ │ │ +
232 {
│ │ │ │ +
233 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
237 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
238 void bltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
│ │ │ │ +
239 {
│ │ │ │ + │ │ │ │ +
241 }
│ │ │ │ +
│ │ │ │ +
243 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
244 void ubltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
│ │ │ │ +
245 {
│ │ │ │ +
246 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
248 }
│ │ │ │ +
│ │ │ │ +
250 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
251 void ubltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
│ │ │ │ +
252 {
│ │ │ │ + │ │ │ │ +
254 }
│ │ │ │ +
│ │ │ │ +
255
│ │ │ │ +
257 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
258 void butsolve (const M& A, X& v, const Y& d, BL<l> bl)
│ │ │ │ +
259 {
│ │ │ │ +
260 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
262 }
│ │ │ │ +
│ │ │ │ +
264 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
265 void butsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
│ │ │ │ +
266 {
│ │ │ │ + │ │ │ │ +
268 }
│ │ │ │ +
│ │ │ │ +
270 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
271 void ubutsolve (const M& A, X& v, const Y& d, BL<l> bl)
│ │ │ │ +
272 {
│ │ │ │ +
273 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
275 }
│ │ │ │ +
│ │ │ │ +
277 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
278 void ubutsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
│ │ │ │ +
279 {
│ │ │ │ + │ │ │ │ +
281 }
│ │ │ │ +
│ │ │ │ +
282
│ │ │ │ +
283
│ │ │ │ +
284
│ │ │ │ +
285 //============================================================
│ │ │ │ +
286 // generic block diagonal solves
│ │ │ │ +
287 // consider block decomposition A = L + D + U
│ │ │ │ +
288 // we can apply relaxation or not
│ │ │ │ +
289 // we can recurse over a fixed number of levels
│ │ │ │ +
290 //============================================================
│ │ │ │ +
291
│ │ │ │ +
292 // template meta program for diagonal solves
│ │ │ │ +
293 template<int I, WithRelaxType relax>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
295 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
296 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
297 {
│ │ │ │ +
298 // iterator types
│ │ │ │ +
299 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
300 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
301
│ │ │ │ +
302 // local solve at each block and immediate update
│ │ │ │ +
303 rowiterator rendi=A.beforeBegin();
│ │ │ │ +
304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
│ │ │ │ +
305 {
│ │ │ │ +
306 coliterator ii=(*i).find(i.index());
│ │ │ │ +
307 algmeta_bdsolve<I-1,relax>::bdsolve(*ii,v[i.index()],d[i.index()],w);
│ │ │ │ +
308 }
│ │ │ │ +
309 }
│ │ │ │ +
│ │ │ │ +
310 };
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
312 // recursion end ...
│ │ │ │ +
313 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
315 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
316 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
317 {
│ │ │ │ +
318 A.solve(v,d);
│ │ │ │ +
319 v *= w;
│ │ │ │ +
320 }
│ │ │ │ +
│ │ │ │ +
321 };
│ │ │ │ +
│ │ │ │ +
322 template<>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
324 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
325 static void bdsolve (const M& A, X& v, const Y& d, const K& /*w*/)
│ │ │ │ +
326 {
│ │ │ │ +
327 A.solve(v,d);
│ │ │ │ +
328 }
│ │ │ │ +
│ │ │ │ +
329 };
│ │ │ │ +
│ │ │ │ +
330
│ │ │ │ +
331 // user calls
│ │ │ │ +
332
│ │ │ │ +
333 // default block recursion level = 1
│ │ │ │ +
334
│ │ │ │ +
336 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
337 void bdsolve (const M& A, X& v, const Y& d)
│ │ │ │ +
338 {
│ │ │ │ +
339 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
341 }
│ │ │ │ +
│ │ │ │ +
343 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
344 void bdsolve (const M& A, X& v, const Y& d, const K& w)
│ │ │ │ +
345 {
│ │ │ │ + │ │ │ │ +
347 }
│ │ │ │ +
│ │ │ │ +
348
│ │ │ │ +
349 // general block recursion level >= 0
│ │ │ │ +
350
│ │ │ │ +
352 template<class M, class X, class Y, int l>
│ │ │ │ +
│ │ │ │ +
353 void bdsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
│ │ │ │ +
354 {
│ │ │ │ +
355 typename X::field_type w=1;
│ │ │ │ + │ │ │ │ +
357 }
│ │ │ │ +
│ │ │ │ +
359 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
360 void bdsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
│ │ │ │ +
361 {
│ │ │ │ + │ │ │ │ +
363 }
│ │ │ │ +
│ │ │ │ +
364
│ │ │ │ +
365
│ │ │ │ +
366 //============================================================
│ │ │ │ +
367 // generic steps of iteration methods
│ │ │ │ +
368 // Jacobi, Gauss-Seidel, SOR, SSOR
│ │ │ │ +
369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i)
│ │ │ │ +
370 // we can recurse over a fixed number of levels
│ │ │ │ +
371 //============================================================
│ │ │ │ +
372
│ │ │ │ +
373 // template meta program for iterative solver steps
│ │ │ │ +
374 template<int I, typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
376
│ │ │ │ +
377 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
378 static void dbgs (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
379 {
│ │ │ │ +
380 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
381 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
382 typedef typename Y::block_type bblock;
│ │ │ │ +
383 bblock rhs;
│ │ │ │ +
384
│ │ │ │ +
385 X xold(x); // remember old x
│ │ │ │ +
386
│ │ │ │ +
387 rowiterator endi=A.end();
│ │ │ │ +
388 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
389 {
│ │ │ │ +
390 rhs = b[i.index()]; // rhs = b_i
│ │ │ │ +
391 coliterator endj=(*i).end();
│ │ │ │ +
392 coliterator j=(*i).begin();
│ │ │ │ +
393 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ +
394 {
│ │ │ │ +
395 for (; j.index()<i.index(); ++j)
│ │ │ │ +
396 rhs -= (*j) * x[j.index()];
│ │ │ │ +
397 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
│ │ │ │ +
398 for (; j != endj; ++j)
│ │ │ │ +
399 rhs -= (*j) * x[j.index()];
│ │ │ │ +
400 x[i.index()] = rhs / (*diag);
│ │ │ │ +
401 }
│ │ │ │ +
402 else
│ │ │ │ +
403 {
│ │ │ │ +
404 for (; j.index()<i.index(); ++j) // iterate over a_ij with j < i
│ │ │ │ +
405 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ +
406 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
│ │ │ │ +
407 for (; j != endj; ++j) // iterate over a_ij with j > i
│ │ │ │ +
408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j
│ │ │ │ +
409 algmeta_itsteps<I-1,typename M::block_type>::dbgs(*diag,x[i.index()],rhs,w); // if I==1: xnew_i = rhs/a_ii
│ │ │ │ +
410 }
│ │ │ │ +
411 }
│ │ │ │ +
412 // next two lines: xnew_i = w / a_ii * (b_i - sum_{j<i} a_ij * xnew_j - sum_{j>=i} a_ij * xold_j) + (1-w)*xold;
│ │ │ │ +
413 x *= w;
│ │ │ │ +
414 x.axpy(K(1)-w,xold);
│ │ │ │ +
415 }
│ │ │ │ +
│ │ │ │ +
416
│ │ │ │ +
417 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
418 static void bsorf (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
419 {
│ │ │ │ +
420 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
421 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
422 typedef typename Y::block_type bblock;
│ │ │ │ +
423 typedef typename X::block_type xblock;
│ │ │ │ +
424 bblock rhs;
│ │ │ │ +
425 xblock v;
│ │ │ │ +
426
│ │ │ │ +
427 // Initialize nested data structure if there are entries
│ │ │ │ +
428 if(A.begin()!=A.end())
│ │ │ │ +
429 v=x[0];
│ │ │ │ +
430
│ │ │ │ +
431 rowiterator endi=A.end();
│ │ │ │ +
432 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
433 {
│ │ │ │ +
434 rhs = b[i.index()]; // rhs = b_i
│ │ │ │ +
435 coliterator endj=(*i).end(); // iterate over a_ij with j < i
│ │ │ │ +
436 coliterator j=(*i).begin();
│ │ │ │ +
437 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ +
438 {
│ │ │ │ +
439 for (; j.index()<i.index(); ++j)
│ │ │ │ +
440 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ +
441 coliterator diag=j; // *diag = a_ii
│ │ │ │ +
442 for (; j!=endj; ++j)
│ │ │ │ +
443 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ +
444 v = rhs / (*diag);
│ │ │ │ +
445 x[i.index()] += w*v; // x_i = w / a_ii * (b_i - sum_{j<i} a_ij * xnew_j - sum_{j>=i} a_ij * xold_j)
│ │ │ │ +
446 }
│ │ │ │ +
447 else
│ │ │ │ +
448 {
│ │ │ │ +
449 for (; j.index()<i.index(); ++j)
│ │ │ │ +
450 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ +
451 coliterator diag=j; // *diag = a_ii
│ │ │ │ +
452 for (; j!=endj; ++j)
│ │ │ │ +
453 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
│ │ │ │ +
454 algmeta_itsteps<I-1,typename M::block_type>::bsorf(*diag,v,rhs,w); // if blocksize I==1: v = rhs/a_ii
│ │ │ │ +
455 x[i.index()].axpy(w,v); // x_i = w / a_ii * (b_i - sum_{j<i} a_ij * xnew_j - sum_{j>=i} a_ij * xold_j)
│ │ │ │ +
456 }
│ │ │ │ +
457 }
│ │ │ │ +
458 }
│ │ │ │ +
│ │ │ │ +
459
│ │ │ │ +
460 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
461 static void bsorb (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
462 {
│ │ │ │ +
463 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
464 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
465 typedef typename Y::block_type bblock;
│ │ │ │ +
466 typedef typename X::block_type xblock;
│ │ │ │ +
467 bblock rhs;
│ │ │ │ +
468 xblock v;
│ │ │ │ +
469
│ │ │ │ +
470 // Initialize nested data structure if there are entries
│ │ │ │ +
471 if(A.begin()!=A.end())
│ │ │ │ +
472 v=x[0];
│ │ │ │ +
473
│ │ │ │ +
474 rowiterator endi=A.beforeBegin();
│ │ │ │ +
475 for (rowiterator i=A.beforeEnd(); i!=endi; --i)
│ │ │ │ +
476 {
│ │ │ │ +
477 rhs = b[i.index()];
│ │ │ │ +
478 coliterator endj=(*i).end();
│ │ │ │ +
479 coliterator j=(*i).begin();
│ │ │ │ +
480 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ +
481 {
│ │ │ │ +
482 for (; j.index()<i.index(); ++j)
│ │ │ │ +
483 rhs -= (*j) * x[j.index()];
│ │ │ │ +
484 coliterator diag=j;
│ │ │ │ +
485 for (; j!=endj; ++j)
│ │ │ │ +
486 rhs -= (*j) * x[j.index()];
│ │ │ │ +
487 v = rhs / (*diag);
│ │ │ │ +
488 x[i.index()] += w*v;
│ │ │ │ +
489 }
│ │ │ │ +
490 else
│ │ │ │ +
491 {
│ │ │ │ +
492 for (; j.index()<i.index(); ++j)
│ │ │ │ +
493 j->mmv(x[j.index()],rhs);
│ │ │ │ +
494 coliterator diag=j;
│ │ │ │ +
495 for (; j!=endj; ++j)
│ │ │ │ +
496 j->mmv(x[j.index()],rhs);
│ │ │ │ + │ │ │ │ +
498 x[i.index()].axpy(w,v);
│ │ │ │ +
499 }
│ │ │ │ +
500 }
│ │ │ │ +
501 }
│ │ │ │ +
│ │ │ │ +
502
│ │ │ │ +
503 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
504 static void dbjac (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
505 {
│ │ │ │ +
506 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
507 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
508 typedef typename Y::block_type bblock;
│ │ │ │ +
509 bblock rhs;
│ │ │ │ +
510
│ │ │ │ +
511 X v(x); // allocate with same size
│ │ │ │ +
512
│ │ │ │ +
513 rowiterator endi=A.end();
│ │ │ │ +
514 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
515 {
│ │ │ │ +
516 rhs = b[i.index()];
│ │ │ │ +
517 coliterator endj=(*i).end();
│ │ │ │ +
518 coliterator j=(*i).begin();
│ │ │ │ +
519 if constexpr (IsNumber<typename M::block_type>())
│ │ │ │ +
520 {
│ │ │ │ +
521 for (; j.index()<i.index(); ++j)
│ │ │ │ +
522 rhs -= (*j) * x[j.index()];
│ │ │ │ +
523 coliterator diag=j;
│ │ │ │ +
524 for (; j!=endj; ++j)
│ │ │ │ +
525 rhs -= (*j) * x[j.index()];
│ │ │ │ +
526 v[i.index()] = rhs / (*diag);
│ │ │ │ +
527 }
│ │ │ │ +
528 else
│ │ │ │ +
529 {
│ │ │ │ +
530 for (; j.index()<i.index(); ++j)
│ │ │ │ +
531 j->mmv(x[j.index()],rhs);
│ │ │ │ +
532 coliterator diag=j;
│ │ │ │ +
533 for (; j!=endj; ++j)
│ │ │ │ +
534 j->mmv(x[j.index()],rhs);
│ │ │ │ + │ │ │ │ +
536 }
│ │ │ │ +
537 }
│ │ │ │ +
538 x.axpy(w,v);
│ │ │ │ +
539 }
│ │ │ │ +
│ │ │ │ +
540 };
│ │ │ │ +
│ │ │ │ +
541 // end of recursion
│ │ │ │ +
542 template<typename M>
│ │ │ │ +
│ │ │ │ +
543 struct algmeta_itsteps<0,M> {
│ │ │ │ +
544 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
545 static void dbgs (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ +
546 {
│ │ │ │ +
547 A.solve(x,b);
│ │ │ │ +
548 }
│ │ │ │ +
│ │ │ │ +
549 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
550 static void bsorf (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ +
551 {
│ │ │ │ +
552 A.solve(x,b);
│ │ │ │ +
553 }
│ │ │ │ +
│ │ │ │ +
554 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
555 static void bsorb (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ +
556 {
│ │ │ │ +
557 A.solve(x,b);
│ │ │ │ +
558 }
│ │ │ │ +
│ │ │ │ +
559 template<class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
560 static void dbjac (const M& A, X& x, const Y& b, const K& /*w*/)
│ │ │ │ +
561 {
│ │ │ │ +
562 A.solve(x,b);
│ │ │ │ +
563 }
│ │ │ │ +
│ │ │ │ +
564 };
│ │ │ │ +
│ │ │ │ +
565
│ │ │ │ +
566 template<int I, typename T1, typename... MultiTypeMatrixArgs>
│ │ │ │ +
│ │ │ │ +
567 struct algmeta_itsteps<I,MultiTypeBlockMatrix<T1, MultiTypeMatrixArgs...>> {
│ │ │ │ +
568 template<
│ │ │ │ +
569 typename... MultiTypeVectorArgs,
│ │ │ │ +
570 class K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
574 const K& w)
│ │ │ │ +
575 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
578 }
│ │ │ │ +
│ │ │ │ +
579
│ │ │ │ +
580 template<
│ │ │ │ +
581 typename... MultiTypeVectorArgs,
│ │ │ │ +
582 class K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
586 const K& w)
│ │ │ │ +
587 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
590 }
│ │ │ │ +
│ │ │ │ +
591
│ │ │ │ +
592 template<
│ │ │ │ +
593 typename... MultiTypeVectorArgs,
│ │ │ │ +
594 class K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
598 const K& w)
│ │ │ │ +
599 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
602 }
│ │ │ │ +
│ │ │ │ +
603
│ │ │ │ +
604 template<
│ │ │ │ +
605 typename... MultiTypeVectorArgs,
│ │ │ │ +
606 class K
│ │ │ │ +
607 >
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
611 const K& w)
│ │ │ │ +
612 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
615 }
│ │ │ │ +
│ │ │ │ +
616 };
│ │ │ │ +
│ │ │ │ +
617
│ │ │ │ +
618 // user calls
│ │ │ │ +
619
│ │ │ │ +
621 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
622 void dbgs (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
623 {
│ │ │ │ + │ │ │ │ +
625 }
│ │ │ │ +
│ │ │ │ +
627 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
628 void dbgs (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ +
629 {
│ │ │ │ + │ │ │ │ +
631 }
│ │ │ │ +
│ │ │ │ +
633 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
634 void bsorf (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
635 {
│ │ │ │ + │ │ │ │ +
637 }
│ │ │ │ +
│ │ │ │ +
639 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
640 void bsorf (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ +
641 {
│ │ │ │ + │ │ │ │ +
643 }
│ │ │ │ +
│ │ │ │ +
645 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
646 void bsorb (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
647 {
│ │ │ │ + │ │ │ │ +
649 }
│ │ │ │ +
│ │ │ │ +
651 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
652 void bsorb (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ +
653 {
│ │ │ │ + │ │ │ │ +
655 }
│ │ │ │ +
│ │ │ │ +
657 template<class M, class X, class Y, class K>
│ │ │ │ +
│ │ │ │ +
658 void dbjac (const M& A, X& x, const Y& b, const K& w)
│ │ │ │ +
659 {
│ │ │ │ + │ │ │ │ +
661 }
│ │ │ │ +
│ │ │ │ +
663 template<class M, class X, class Y, class K, int l>
│ │ │ │ +
│ │ │ │ +
664 void dbjac (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
│ │ │ │ +
665 {
│ │ │ │ + │ │ │ │ +
667 }
│ │ │ │ +
│ │ │ │ +
668
│ │ │ │ +
669
│ │ │ │ +
672} // end namespace
│ │ │ │ +
673
│ │ │ │ +
674#endif
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:568
│ │ │ │ +
static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:484
│ │ │ │ +
static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:540
│ │ │ │ +
static constexpr size_type N()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:64
│ │ │ │ +
static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:513
│ │ │ │ +
void bltsolve(const M &A, X &v, const Y &d)
block lower triangular solve
Definition gsetc.hh:175
│ │ │ │ +
WithDiagType
Definition gsetc.hh:49
│ │ │ │ +
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:646
│ │ │ │ +
void ubltsolve(const M &A, X &v, const Y &d)
unit block lower triangular solve
Definition gsetc.hh:188
│ │ │ │ +
void dbjac(const M &A, X &x, const Y &b, const K &w)
Jacobi step.
Definition gsetc.hh:658
│ │ │ │ +
void dbgs(const M &A, X &x, const Y &b, const K &w)
GS step.
Definition gsetc.hh:622
│ │ │ │ +
WithRelaxType
Definition gsetc.hh:54
│ │ │ │ +
void bdsolve(const M &A, X &v, const Y &d)
block diagonal solve, no relaxation
Definition gsetc.hh:337
│ │ │ │ +
void butsolve(const M &A, X &v, const Y &d)
block upper triangular solve
Definition gsetc.hh:202
│ │ │ │ +
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:634
│ │ │ │ +
void ubutsolve(const M &A, X &v, const Y &d)
unit block upper triangular solve
Definition gsetc.hh:215
│ │ │ │ +
@ nodiag
Definition gsetc.hh:51
│ │ │ │ +
@ withdiag
Definition gsetc.hh:50
│ │ │ │ +
@ norelax
Definition gsetc.hh:56
│ │ │ │ +
@ withrelax
Definition gsetc.hh:55
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
SequentialInformation()
Definition pinfo.hh:91
│ │ │ │ -
T globalSum(const T &t) const
Definition pinfo.hh:49
│ │ │ │ -
void dot(const T1 &, const T1 &, T2 &) const
Definition pinfo.hh:74
│ │ │ │ -
EmptySet< int > CopyFlags
Definition pinfo.hh:31
│ │ │ │ -
AllSet< int > OwnerSet
Definition pinfo.hh:32
│ │ │ │ -
void copyOwnerToAll(V &v, V &v1) const
Definition pinfo.hh:66
│ │ │ │ -
MPICommunicator communicator() const
Definition pinfo.hh:38
│ │ │ │ -
void buildGlobalLookup(std::size_t)
Definition pinfo.hh:56
│ │ │ │ -
FieldTraits< typenameT1::field_type >::real_type norm(const T1 &) const
Definition pinfo.hh:81
│ │ │ │ -
void project(V &v) const
Definition pinfo.hh:70
│ │ │ │ -
Communication< void * > MPICommunicator
Definition pinfo.hh:30
│ │ │ │ -
SequentialInformation(const Communication< T > &)
Definition pinfo.hh:88
│ │ │ │ -
const GlobalLookupIndexSet & globalLookup() const
Definition pinfo.hh:60
│ │ │ │ -
SequentialInformation(const SequentialInformation &)
Definition pinfo.hh:94
│ │ │ │ -
void freeGlobalLookup()
Definition pinfo.hh:58
│ │ │ │ -
int GlobalLookupIndexSet
Definition pinfo.hh:54
│ │ │ │ -
SolverCategory::Category category() const
Definition pinfo.hh:34
│ │ │ │ -
int procs() const
Definition pinfo.hh:43
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
A Vector class to support different block types.
Definition multitypeblockvector.hh:59
│ │ │ │ +
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
│ │ │ │ +
compile-time parameter for block recursion depth
Definition gsetc.hh:45
│ │ │ │ +
@ recursion_level
Definition gsetc.hh:46
│ │ │ │ +
Definition gsetc.hh:69
│ │ │ │ +
static void butsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:90
│ │ │ │ +
static void bltsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:71
│ │ │ │ +
static void bltsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:114
│ │ │ │ +
static void butsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:120
│ │ │ │ +
static void bltsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:129
│ │ │ │ +
static void butsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:134
│ │ │ │ +
static void bltsolve(const M &, X &v, const Y &d, const K &w)
Definition gsetc.hh:142
│ │ │ │ +
static void butsolve(const M &, X &v, const Y &d, const K &w)
Definition gsetc.hh:148
│ │ │ │ +
static void bltsolve(const M &, X &v, const Y &d, const K &)
Definition gsetc.hh:157
│ │ │ │ +
static void butsolve(const M &, X &v, const Y &d, const K &)
Definition gsetc.hh:162
│ │ │ │ +
Definition gsetc.hh:294
│ │ │ │ +
static void bdsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:296
│ │ │ │ +
static void bdsolve(const M &A, X &v, const Y &d, const K &w)
Definition gsetc.hh:316
│ │ │ │ +
static void bdsolve(const M &A, X &v, const Y &d, const K &)
Definition gsetc.hh:325
│ │ │ │ +
Definition gsetc.hh:375
│ │ │ │ +
static void bsorb(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:461
│ │ │ │ +
static void bsorf(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:418
│ │ │ │ +
static void dbjac(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:504
│ │ │ │ +
static void dbgs(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:378
│ │ │ │ +
static void dbgs(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:545
│ │ │ │ +
static void dbjac(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:560
│ │ │ │ +
static void bsorf(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:550
│ │ │ │ +
static void bsorb(const M &A, X &x, const Y &b, const K &)
Definition gsetc.hh:555
│ │ │ │ +
static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:571
│ │ │ │ +
static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:608
│ │ │ │ +
static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:583
│ │ │ │ +
static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
Definition gsetc.hh:595
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,183 +1,832 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -pinfo.hh │ │ │ │ │ +gsetc.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_PINFO_HH │ │ │ │ │ -6#define DUNE_AMG_PINFO_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_GSETC_HH │ │ │ │ │ +6#define DUNE_ISTL_GSETC_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#if HAVE_MPI │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_v_e_c_t_o_r_._h_h" │ │ │ │ │ +17#include "_m_u_l_t_i_t_y_p_e_b_l_o_c_k_m_a_t_r_i_x_._h_h" │ │ │ │ │ 18 │ │ │ │ │ -19#endif │ │ │ │ │ +19#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ 20 │ │ │ │ │ -21#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ -22namespace _D_u_n_e │ │ │ │ │ -23{ │ │ │ │ │ -24 namespace Amg │ │ │ │ │ -25 { │ │ │ │ │ -26 │ │ │ │ │ -_2_7 class _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -28 { │ │ │ │ │ -29 public: │ │ │ │ │ -_3_0 typedef Communication _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ -_3_1 typedef EmptySet _C_o_p_y_F_l_a_g_s; │ │ │ │ │ -_3_2 typedef AllSet _O_w_n_e_r_S_e_t; │ │ │ │ │ -33 │ │ │ │ │ -_3_4 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y () const { │ │ │ │ │ -35 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -36 } │ │ │ │ │ -37 │ │ │ │ │ -_3_8 _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r _c_o_m_m_u_n_i_c_a_t_o_r() const │ │ │ │ │ -39 { │ │ │ │ │ -40 return comm_; │ │ │ │ │ -41 } │ │ │ │ │ +21 │ │ │ │ │ +27namespace _D_u_n_e { │ │ │ │ │ +28 │ │ │ │ │ +39 //============================================================ │ │ │ │ │ +40 // parameter types │ │ │ │ │ +41 //============================================================ │ │ │ │ │ 42 │ │ │ │ │ -_4_3 int _p_r_o_c_s() const │ │ │ │ │ -44 { │ │ │ │ │ -45 return 1; │ │ │ │ │ -46 } │ │ │ │ │ -47 │ │ │ │ │ -48 template │ │ │ │ │ -_4_9 T _g_l_o_b_a_l_S_u_m(const T& t) const │ │ │ │ │ -50 { │ │ │ │ │ -51 return t; │ │ │ │ │ -52 } │ │ │ │ │ +44 template │ │ │ │ │ +_4_5 struct _B_L { │ │ │ │ │ +_4_6 enum {_r_e_c_u_r_s_i_o_n___l_e_v_e_l = l}; │ │ │ │ │ +47 }; │ │ │ │ │ +48 │ │ │ │ │ +_4_9 enum _W_i_t_h_D_i_a_g_T_y_p_e { │ │ │ │ │ +_5_0 _w_i_t_h_d_i_a_g=1, │ │ │ │ │ +51 _n_o_d_i_a_g=0 │ │ │ │ │ +_5_2 }; │ │ │ │ │ 53 │ │ │ │ │ -_5_4 typedef int _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ -55 │ │ │ │ │ -_5_6 void _b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(std::size_t){} │ │ │ │ │ -57 │ │ │ │ │ -_5_8 void _f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p(){} │ │ │ │ │ -59 │ │ │ │ │ -_6_0 const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& _g_l_o_b_a_l_L_o_o_k_u_p() const │ │ │ │ │ -61 { │ │ │ │ │ -62 return gli; │ │ │ │ │ -63 } │ │ │ │ │ -64 │ │ │ │ │ -65 template │ │ │ │ │ -_6_6 void _c_o_p_y_O_w_n_e_r_T_o_A_l_l([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const │ │ │ │ │ -67 {} │ │ │ │ │ -68 │ │ │ │ │ -69 template │ │ │ │ │ -_7_0 void _p_r_o_j_e_c_t([[maybe_unused]] V& v) const │ │ │ │ │ -71 {} │ │ │ │ │ -72 │ │ │ │ │ -73 template │ │ │ │ │ -_7_4 void _d_o_t (const T1&, const T1&, T2&) const │ │ │ │ │ -75 { │ │ │ │ │ -76 // This function should never be called │ │ │ │ │ -77 std::abort(); │ │ │ │ │ -78 } │ │ │ │ │ -79 │ │ │ │ │ -80 template │ │ │ │ │ -_8_1 typename FieldTraits::real_type _n_o_r_m (const T1&) │ │ │ │ │ -const │ │ │ │ │ -82 { │ │ │ │ │ -83 // This function should never be called │ │ │ │ │ -84 std::abort(); │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -87 template │ │ │ │ │ -_8_8 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n(const Communication&) │ │ │ │ │ -89 {} │ │ │ │ │ -90 │ │ │ │ │ -_9_1 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n() │ │ │ │ │ -92 {} │ │ │ │ │ -93 │ │ │ │ │ -_9_4 _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n(const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n&) │ │ │ │ │ -95 {} │ │ │ │ │ -96 private: │ │ │ │ │ -97 _M_P_I_C_o_m_m_u_n_i_c_a_t_o_r comm_; │ │ │ │ │ -98 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t gli; │ │ │ │ │ -99 }; │ │ │ │ │ -100 │ │ │ │ │ -101 │ │ │ │ │ -102 } // namespace Amg │ │ │ │ │ -103} //namespace Dune │ │ │ │ │ -104#endif │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +_5_4 enum _W_i_t_h_R_e_l_a_x_T_y_p_e { │ │ │ │ │ +_5_5 _w_i_t_h_r_e_l_a_x=1, │ │ │ │ │ +56 _n_o_r_e_l_a_x=0 │ │ │ │ │ +_5_7 }; │ │ │ │ │ +58 │ │ │ │ │ +59 //============================================================ │ │ │ │ │ +60 // generic triangular solves │ │ │ │ │ +61 // consider block decomposition A = L + D + U │ │ │ │ │ +62 // we can invert L, L+D, U, U+D │ │ │ │ │ +63 // we can apply relaxation or not │ │ │ │ │ +64 // we can recurse over a fixed number of levels │ │ │ │ │ +65 //============================================================ │ │ │ │ │ +66 │ │ │ │ │ +67 // template meta program for triangular solves │ │ │ │ │ +68 template │ │ │ │ │ +_6_9 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e { │ │ │ │ │ +70 template │ │ │ │ │ +_7_1 static void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +72 { │ │ │ │ │ +73 // iterator types │ │ │ │ │ +74 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +75 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +76 typedef typename Y::block_type bblock; │ │ │ │ │ +77 │ │ │ │ │ +78 // local solve at each block and immediate update │ │ │ │ │ +79 rowiterator endi=A.end(); │ │ │ │ │ +80 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +81 { │ │ │ │ │ +82 bblock rhs(d[i.index()]); │ │ │ │ │ +83 coliterator j; │ │ │ │ │ +84 for (j=(*i).begin(); j.index()_:_:_b_l_t_s_o_l_v_e(*j,v[i.index()],rhs,w); │ │ │ │ │ +87 } │ │ │ │ │ +88 } │ │ │ │ │ +89 template │ │ │ │ │ +_9_0 static void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +91 { │ │ │ │ │ +92 // iterator types │ │ │ │ │ +93 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +94 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +95 typedef typename Y::block_type bblock; │ │ │ │ │ +96 │ │ │ │ │ +97 // local solve at each block and immediate update │ │ │ │ │ +98 rowiterator rendi=A.beforeBegin(); │ │ │ │ │ +99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i) │ │ │ │ │ +100 { │ │ │ │ │ +101 bblock rhs(d[i.index()]); │ │ │ │ │ +102 coliterator j; │ │ │ │ │ +103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j) │ │ │ │ │ +104 (*j).mmv(v[j.index()],rhs); │ │ │ │ │ +105 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_I_-_1_,_d_i_a_g_,_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(*j,v[i.index()],rhs,w); │ │ │ │ │ +106 } │ │ │ │ │ +107 } │ │ │ │ │ +108 }; │ │ │ │ │ +109 │ │ │ │ │ +110 // recursion end ... │ │ │ │ │ +111 template<> │ │ │ │ │ +_1_1_2 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_w_i_t_h_d_i_a_g,_w_i_t_h_r_e_l_a_x> { │ │ │ │ │ +113 template │ │ │ │ │ +_1_1_4 static void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +115 { │ │ │ │ │ +116 A.solve(v,d); │ │ │ │ │ +117 v *= w; │ │ │ │ │ +118 } │ │ │ │ │ +119 template │ │ │ │ │ +_1_2_0 static void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +121 { │ │ │ │ │ +122 A.solve(v,d); │ │ │ │ │ +123 v *= w; │ │ │ │ │ +124 } │ │ │ │ │ +125 }; │ │ │ │ │ +126 template<> │ │ │ │ │ +_1_2_7 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_w_i_t_h_d_i_a_g,_n_o_r_e_l_a_x> { │ │ │ │ │ +128 template │ │ │ │ │ +_1_2_9 static void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ +130 { │ │ │ │ │ +131 A.solve(v,d); │ │ │ │ │ +132 } │ │ │ │ │ +133 template │ │ │ │ │ +_1_3_4 static void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ +135 { │ │ │ │ │ +136 A.solve(v,d); │ │ │ │ │ +137 } │ │ │ │ │ +138 }; │ │ │ │ │ +139 template<> │ │ │ │ │ +_1_4_0 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_n_o_d_i_a_g,_w_i_t_h_r_e_l_a_x> { │ │ │ │ │ +141 template │ │ │ │ │ +_1_4_2 static void _b_l_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& w) │ │ │ │ │ +143 { │ │ │ │ │ +144 v = d; │ │ │ │ │ +145 v *= w; │ │ │ │ │ +146 } │ │ │ │ │ +147 template │ │ │ │ │ +_1_4_8 static void _b_u_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& w) │ │ │ │ │ +149 { │ │ │ │ │ +150 v = d; │ │ │ │ │ +151 v *= w; │ │ │ │ │ +152 } │ │ │ │ │ +153 }; │ │ │ │ │ +154 template<> │ │ │ │ │ +_1_5_5 struct _a_l_g_m_e_t_a___b_t_s_o_l_v_e<0,_n_o_d_i_a_g,_n_o_r_e_l_a_x> { │ │ │ │ │ +156 template │ │ │ │ │ +_1_5_7 static void _b_l_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ +158 { │ │ │ │ │ +159 v = d; │ │ │ │ │ +160 } │ │ │ │ │ +161 template │ │ │ │ │ +_1_6_2 static void _b_u_t_s_o_l_v_e (const M& /*A*/, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ +163 { │ │ │ │ │ +164 v = d; │ │ │ │ │ +165 } │ │ │ │ │ +166 }; │ │ │ │ │ +167 │ │ │ │ │ +168 │ │ │ │ │ +169 // user calls │ │ │ │ │ +170 │ │ │ │ │ +171 // default block recursion level = 1 │ │ │ │ │ +172 │ │ │ │ │ +174 template │ │ │ │ │ +_1_7_5 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ +176 { │ │ │ │ │ +177 typename X::field_type w=1; │ │ │ │ │ +178 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +179 } │ │ │ │ │ +181 template │ │ │ │ │ +_1_8_2 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +183 { │ │ │ │ │ +184 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +185 } │ │ │ │ │ +187 template │ │ │ │ │ +_1_8_8 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ +189 { │ │ │ │ │ +190 typename X::field_type w=1; │ │ │ │ │ +191 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +192 } │ │ │ │ │ +194 template │ │ │ │ │ +_1_9_5 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +196 { │ │ │ │ │ +197 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +198 } │ │ │ │ │ +199 │ │ │ │ │ +201 template │ │ │ │ │ +_2_0_2 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ +203 { │ │ │ │ │ +204 typename X::field_type w=1; │ │ │ │ │ +205 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +206 } │ │ │ │ │ +208 template │ │ │ │ │ +_2_0_9 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +210 { │ │ │ │ │ +211 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +212 } │ │ │ │ │ +214 template │ │ │ │ │ +_2_1_5 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ +216 { │ │ │ │ │ +217 typename X::field_type w=1; │ │ │ │ │ +218 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +219 } │ │ │ │ │ +221 template │ │ │ │ │ +_2_2_2 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +223 { │ │ │ │ │ +224 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_1_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +225 } │ │ │ │ │ +226 │ │ │ │ │ +227 // general block recursion level >= 0 │ │ │ │ │ +228 │ │ │ │ │ +230 template │ │ │ │ │ +_2_3_1 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> /*bl*/) │ │ │ │ │ +232 { │ │ │ │ │ +233 typename X::field_type w=1; │ │ │ │ │ +234 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +235 } │ │ │ │ │ +237 template │ │ │ │ │ +_2_3_8 void _b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +239 { │ │ │ │ │ +240 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +241 } │ │ │ │ │ +243 template │ │ │ │ │ +_2_4_4 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> /*bl*/) │ │ │ │ │ +245 { │ │ │ │ │ +246 typename X::field_type w=1; │ │ │ │ │ +247 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +248 } │ │ │ │ │ +250 template │ │ │ │ │ +_2_5_1 void _u_b_l_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +252 { │ │ │ │ │ +253 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_l_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +254 } │ │ │ │ │ +255 │ │ │ │ │ +257 template │ │ │ │ │ +_2_5_8 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> bl) │ │ │ │ │ +259 { │ │ │ │ │ +260 typename X::field_type w=1; │ │ │ │ │ +261 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +262 } │ │ │ │ │ +264 template │ │ │ │ │ +_2_6_5 void _b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> bl) │ │ │ │ │ +266 { │ │ │ │ │ +267 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_w_i_t_h_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +268 } │ │ │ │ │ +270 template │ │ │ │ │ +_2_7_1 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> bl) │ │ │ │ │ +272 { │ │ │ │ │ +273 typename X::field_type w=1; │ │ │ │ │ +274 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_n_o_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +275 } │ │ │ │ │ +277 template │ │ │ │ │ +_2_7_8 void _u_b_u_t_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> bl) │ │ │ │ │ +279 { │ │ │ │ │ +280 _a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_l_,_n_o_d_i_a_g_,_w_i_t_h_r_e_l_a_x_>_:_:_b_u_t_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +281 } │ │ │ │ │ +282 │ │ │ │ │ +283 │ │ │ │ │ +284 │ │ │ │ │ +285 //============================================================ │ │ │ │ │ +286 // generic block diagonal solves │ │ │ │ │ +287 // consider block decomposition A = L + D + U │ │ │ │ │ +288 // we can apply relaxation or not │ │ │ │ │ +289 // we can recurse over a fixed number of levels │ │ │ │ │ +290 //============================================================ │ │ │ │ │ +291 │ │ │ │ │ +292 // template meta program for diagonal solves │ │ │ │ │ +293 template │ │ │ │ │ +_2_9_4 struct _a_l_g_m_e_t_a___b_d_s_o_l_v_e { │ │ │ │ │ +295 template │ │ │ │ │ +_2_9_6 static void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +297 { │ │ │ │ │ +298 // iterator types │ │ │ │ │ +299 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +300 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +301 │ │ │ │ │ +302 // local solve at each block and immediate update │ │ │ │ │ +303 rowiterator rendi=A.beforeBegin(); │ │ │ │ │ +304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i) │ │ │ │ │ +305 { │ │ │ │ │ +306 coliterator ii=(*i).find(i.index()); │ │ │ │ │ +307 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_I_-_1_,_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(*ii,v[i.index()],d[i.index()],w); │ │ │ │ │ +308 } │ │ │ │ │ +309 } │ │ │ │ │ +310 }; │ │ │ │ │ +311 │ │ │ │ │ +312 // recursion end ... │ │ │ │ │ +313 template<> │ │ │ │ │ +_3_1_4 struct _a_l_g_m_e_t_a___b_d_s_o_l_v_e<0,_w_i_t_h_r_e_l_a_x> { │ │ │ │ │ +315 template │ │ │ │ │ +_3_1_6 static void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +317 { │ │ │ │ │ +318 A.solve(v,d); │ │ │ │ │ +319 v *= w; │ │ │ │ │ +320 } │ │ │ │ │ +321 }; │ │ │ │ │ +322 template<> │ │ │ │ │ +_3_2_3 struct _a_l_g_m_e_t_a___b_d_s_o_l_v_e<0,_n_o_r_e_l_a_x> { │ │ │ │ │ +324 template │ │ │ │ │ +_3_2_5 static void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& /*w*/) │ │ │ │ │ +326 { │ │ │ │ │ +327 A.solve(v,d); │ │ │ │ │ +328 } │ │ │ │ │ +329 }; │ │ │ │ │ +330 │ │ │ │ │ +331 // user calls │ │ │ │ │ +332 │ │ │ │ │ +333 // default block recursion level = 1 │ │ │ │ │ +334 │ │ │ │ │ +336 template │ │ │ │ │ +_3_3_7 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ +338 { │ │ │ │ │ +339 typename X::field_type w=1; │ │ │ │ │ +340 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_1_,_n_o_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +341 } │ │ │ │ │ +343 template │ │ │ │ │ +_3_4_4 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w) │ │ │ │ │ +345 { │ │ │ │ │ +346 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_1_,_w_i_t_h_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +347 } │ │ │ │ │ +348 │ │ │ │ │ +349 // general block recursion level >= 0 │ │ │ │ │ +350 │ │ │ │ │ +352 template │ │ │ │ │ +_3_5_3 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, _B_L_<_l_> /*bl*/) │ │ │ │ │ +354 { │ │ │ │ │ +355 typename X::field_type w=1; │ │ │ │ │ +356 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_l_,_n_o_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +357 } │ │ │ │ │ +359 template │ │ │ │ │ +_3_6_0 void _b_d_s_o_l_v_e (const M& A, X& v, const Y& d, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +361 { │ │ │ │ │ +362 _a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_l_,_w_i_t_h_r_e_l_a_x_>_:_:_b_d_s_o_l_v_e(A,v,d,w); │ │ │ │ │ +363 } │ │ │ │ │ +364 │ │ │ │ │ +365 │ │ │ │ │ +366 //============================================================ │ │ │ │ │ +367 // generic steps of iteration methods │ │ │ │ │ +368 // Jacobi, Gauss-Seidel, SOR, SSOR │ │ │ │ │ +369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i) │ │ │ │ │ +370 // we can recurse over a fixed number of levels │ │ │ │ │ +371 //============================================================ │ │ │ │ │ +372 │ │ │ │ │ +373 // template meta program for iterative solver steps │ │ │ │ │ +374 template │ │ │ │ │ +_3_7_5 struct _a_l_g_m_e_t_a___i_t_s_t_e_p_s { │ │ │ │ │ +376 │ │ │ │ │ +377 template │ │ │ │ │ +_3_7_8 static void _d_b_g_s (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +379 { │ │ │ │ │ +380 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +381 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +382 typedef typename Y::block_type bblock; │ │ │ │ │ +383 bblock rhs; │ │ │ │ │ +384 │ │ │ │ │ +385 X xold(x); // remember old x │ │ │ │ │ +386 │ │ │ │ │ +387 rowiterator endi=A.end(); │ │ │ │ │ +388 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +389 { │ │ │ │ │ +390 rhs = b[i.index()]; // rhs = b_i │ │ │ │ │ +391 coliterator endj=(*i).end(); │ │ │ │ │ +392 coliterator j=(*i).begin(); │ │ │ │ │ +393 if constexpr (IsNumber()) │ │ │ │ │ +394 { │ │ │ │ │ +395 for (; j.index() i │ │ │ │ │ +408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j │ │ │ │ │ +409 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_t_y_p_e_n_a_m_e_ _M_:_:_b_l_o_c_k___t_y_p_e_>_:_:_d_b_g_s(*diag,x[i.index │ │ │ │ │ +()],rhs,w); // if I==1: xnew_i = rhs/a_ii │ │ │ │ │ +410 } │ │ │ │ │ +411 } │ │ │ │ │ +412 // next two lines: xnew_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j) + (1-w)*xold; │ │ │ │ │ +413 x *= w; │ │ │ │ │ +414 x.axpy(K(1)-w,xold); │ │ │ │ │ +415 } │ │ │ │ │ +416 │ │ │ │ │ +417 template │ │ │ │ │ +_4_1_8 static void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +419 { │ │ │ │ │ +420 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +421 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +422 typedef typename Y::block_type bblock; │ │ │ │ │ +423 typedef typename X::block_type xblock; │ │ │ │ │ +424 bblock rhs; │ │ │ │ │ +425 xblock v; │ │ │ │ │ +426 │ │ │ │ │ +427 // Initialize nested data structure if there are entries │ │ │ │ │ +428 if(A.begin()!=A.end()) │ │ │ │ │ +429 v=x[0]; │ │ │ │ │ +430 │ │ │ │ │ +431 rowiterator endi=A.end(); │ │ │ │ │ +432 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +433 { │ │ │ │ │ +434 rhs = b[i.index()]; // rhs = b_i │ │ │ │ │ +435 coliterator endj=(*i).end(); // iterate over a_ij with j < i │ │ │ │ │ +436 coliterator j=(*i).begin(); │ │ │ │ │ +437 if constexpr (IsNumber()) │ │ │ │ │ +438 { │ │ │ │ │ +439 for (; j.index()=i} a_ij * xold_j) │ │ │ │ │ +446 } │ │ │ │ │ +447 else │ │ │ │ │ +448 { │ │ │ │ │ +449 for (; j.index()_:_:_b_s_o_r_f(*diag,v,rhs,w); // if │ │ │ │ │ +blocksize I==1: v = rhs/a_ii │ │ │ │ │ +455 x[i.index()].axpy(w,v); // x_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j) │ │ │ │ │ +456 } │ │ │ │ │ +457 } │ │ │ │ │ +458 } │ │ │ │ │ +459 │ │ │ │ │ +460 template │ │ │ │ │ +_4_6_1 static void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +462 { │ │ │ │ │ +463 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +464 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +465 typedef typename Y::block_type bblock; │ │ │ │ │ +466 typedef typename X::block_type xblock; │ │ │ │ │ +467 bblock rhs; │ │ │ │ │ +468 xblock v; │ │ │ │ │ +469 │ │ │ │ │ +470 // Initialize nested data structure if there are entries │ │ │ │ │ +471 if(A.begin()!=A.end()) │ │ │ │ │ +472 v=x[0]; │ │ │ │ │ +473 │ │ │ │ │ +474 rowiterator endi=A.beforeBegin(); │ │ │ │ │ +475 for (rowiterator i=A.beforeEnd(); i!=endi; --i) │ │ │ │ │ +476 { │ │ │ │ │ +477 rhs = b[i.index()]; │ │ │ │ │ +478 coliterator endj=(*i).end(); │ │ │ │ │ +479 coliterator j=(*i).begin(); │ │ │ │ │ +480 if constexpr (IsNumber()) │ │ │ │ │ +481 { │ │ │ │ │ +482 for (; j.index()mmv(x[j.index()],rhs); │ │ │ │ │ +494 coliterator diag=j; │ │ │ │ │ +495 for (; j!=endj; ++j) │ │ │ │ │ +496 j->mmv(x[j.index()],rhs); │ │ │ │ │ +497 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_t_y_p_e_n_a_m_e_ _M_:_:_b_l_o_c_k___t_y_p_e_>_:_:_b_s_o_r_b(*diag,v,rhs,w); │ │ │ │ │ +498 x[i.index()].axpy(w,v); │ │ │ │ │ +499 } │ │ │ │ │ +500 } │ │ │ │ │ +501 } │ │ │ │ │ +502 │ │ │ │ │ +503 template │ │ │ │ │ +_5_0_4 static void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +505 { │ │ │ │ │ +506 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +507 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +508 typedef typename Y::block_type bblock; │ │ │ │ │ +509 bblock rhs; │ │ │ │ │ +510 │ │ │ │ │ +511 X v(x); // allocate with same size │ │ │ │ │ +512 │ │ │ │ │ +513 rowiterator endi=A.end(); │ │ │ │ │ +514 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +515 { │ │ │ │ │ +516 rhs = b[i.index()]; │ │ │ │ │ +517 coliterator endj=(*i).end(); │ │ │ │ │ +518 coliterator j=(*i).begin(); │ │ │ │ │ +519 if constexpr (IsNumber()) │ │ │ │ │ +520 { │ │ │ │ │ +521 for (; j.index()mmv(x[j.index()],rhs); │ │ │ │ │ +532 coliterator diag=j; │ │ │ │ │ +533 for (; j!=endj; ++j) │ │ │ │ │ +534 j->mmv(x[j.index()],rhs); │ │ │ │ │ +535 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_t_y_p_e_n_a_m_e_ _M_:_:_b_l_o_c_k___t_y_p_e_>_:_:_d_b_j_a_c(*diag,v[i.index │ │ │ │ │ +()],rhs,w); │ │ │ │ │ +536 } │ │ │ │ │ +537 } │ │ │ │ │ +538 x.axpy(w,v); │ │ │ │ │ +539 } │ │ │ │ │ +540 }; │ │ │ │ │ +541 // end of recursion │ │ │ │ │ +542 template │ │ │ │ │ +_5_4_3 struct _a_l_g_m_e_t_a___i_t_s_t_e_p_s<0,M> { │ │ │ │ │ +544 template │ │ │ │ │ +_5_4_5 static void _d_b_g_s (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ +546 { │ │ │ │ │ +547 A.solve(x,b); │ │ │ │ │ +548 } │ │ │ │ │ +549 template │ │ │ │ │ +_5_5_0 static void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ +551 { │ │ │ │ │ +552 A.solve(x,b); │ │ │ │ │ +553 } │ │ │ │ │ +554 template │ │ │ │ │ +_5_5_5 static void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ +556 { │ │ │ │ │ +557 A.solve(x,b); │ │ │ │ │ +558 } │ │ │ │ │ +559 template │ │ │ │ │ +_5_6_0 static void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& /*w*/) │ │ │ │ │ +561 { │ │ │ │ │ +562 A.solve(x,b); │ │ │ │ │ +563 } │ │ │ │ │ +564 }; │ │ │ │ │ +565 │ │ │ │ │ +566 template │ │ │ │ │ +_5_6_7 struct _a_l_g_m_e_t_a___i_t_s_t_e_p_s> │ │ │ │ │ +{ │ │ │ │ │ +568 template< │ │ │ │ │ +569 typename... MultiTypeVectorArgs, │ │ │ │ │ +570 class K> │ │ │ │ │ +_5_7_1 static void _d_b_g_s (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ +A, │ │ │ │ │ +572 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ +573 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ +574 const K& w) │ │ │ │ │ +575 { │ │ │ │ │ +576 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ +577 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_0_,_N_>_:_:_d_b_g_s(A, x, b, w); │ │ │ │ │ +578 } │ │ │ │ │ +579 │ │ │ │ │ +580 template< │ │ │ │ │ +581 typename... MultiTypeVectorArgs, │ │ │ │ │ +582 class K> │ │ │ │ │ +_5_8_3 static void _b_s_o_r_f (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ +A, │ │ │ │ │ +584 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ +585 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ +586 const K& w) │ │ │ │ │ +587 { │ │ │ │ │ +588 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ +589 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_0_,_N_>_:_:_b_s_o_r_f(A, x, b, w); │ │ │ │ │ +590 } │ │ │ │ │ +591 │ │ │ │ │ +592 template< │ │ │ │ │ +593 typename... MultiTypeVectorArgs, │ │ │ │ │ +594 class K> │ │ │ │ │ +_5_9_5 static void _b_s_o_r_b (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ +A, │ │ │ │ │ +596 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ +597 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ +598 const K& w) │ │ │ │ │ +599 { │ │ │ │ │ +600 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ +601 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_N_-_1_,_N_>_:_:_b_s_o_r_b(A, x, b, w); │ │ │ │ │ +602 } │ │ │ │ │ +603 │ │ │ │ │ +604 template< │ │ │ │ │ +605 typename... MultiTypeVectorArgs, │ │ │ │ │ +606 class K │ │ │ │ │ +607 > │ │ │ │ │ +_6_0_8 static void _d_b_j_a_c (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>& │ │ │ │ │ +A, │ │ │ │ │ +609 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& x, │ │ │ │ │ +610 const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_M_u_l_t_i_T_y_p_e_V_e_c_t_o_r_A_r_g_s_._._._>& b, │ │ │ │ │ +611 const K& w) │ │ │ │ │ +612 { │ │ │ │ │ +613 static const int N = _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._>_:_:_N(); │ │ │ │ │ +614 _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_0_,_N_>_:_:_d_b_j_a_c(A, x, b, w); │ │ │ │ │ +615 } │ │ │ │ │ +616 }; │ │ │ │ │ +617 │ │ │ │ │ +618 // user calls │ │ │ │ │ +619 │ │ │ │ │ +621 template │ │ │ │ │ +_6_2_2 void _d_b_g_s (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +623 { │ │ │ │ │ +624 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_d_b_g_s(A,x,b,w); │ │ │ │ │ +625 } │ │ │ │ │ +627 template │ │ │ │ │ +_6_2_8 void _d_b_g_s (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +629 { │ │ │ │ │ +630 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_M_>_:_:_d_b_g_s(A,x,b,w); │ │ │ │ │ +631 } │ │ │ │ │ +633 template │ │ │ │ │ +_6_3_4 void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +635 { │ │ │ │ │ +636 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_b_s_o_r_f(A,x,b,w); │ │ │ │ │ +637 } │ │ │ │ │ +639 template │ │ │ │ │ +_6_4_0 void _b_s_o_r_f (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +641 { │ │ │ │ │ +642 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_M_>_:_:_b_s_o_r_f(A,x,b,w); │ │ │ │ │ +643 } │ │ │ │ │ +645 template │ │ │ │ │ +_6_4_6 void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +647 { │ │ │ │ │ +648 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_b_s_o_r_b(A,x,b,w); │ │ │ │ │ +649 } │ │ │ │ │ +651 template │ │ │ │ │ +_6_5_2 void _b_s_o_r_b (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +653 { │ │ │ │ │ +654 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_t_y_p_e_n_a_m_e_ _s_t_d_:_:_r_e_m_o_v_e___c_v_<_M_>_:_:_t_y_p_e>_:_:_b_s_o_r_b(A,x,b,w); │ │ │ │ │ +655 } │ │ │ │ │ +657 template │ │ │ │ │ +_6_5_8 void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& w) │ │ │ │ │ +659 { │ │ │ │ │ +660 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_1_,_M_>_:_:_d_b_j_a_c(A,x,b,w); │ │ │ │ │ +661 } │ │ │ │ │ +663 template │ │ │ │ │ +_6_6_4 void _d_b_j_a_c (const M& A, X& x, const Y& b, const K& w, _B_L_<_l_> /*bl*/) │ │ │ │ │ +665 { │ │ │ │ │ +666 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_l_,_M_>_:_:_d_b_j_a_c(A,x,b,w); │ │ │ │ │ +667 } │ │ │ │ │ +668 │ │ │ │ │ +669 │ │ │ │ │ +672} // end namespace │ │ │ │ │ +673 │ │ │ │ │ +674#endif │ │ │ │ │ +_m_u_l_t_i_t_y_p_e_b_l_o_c_k_m_a_t_r_i_x_._h_h │ │ │ │ │ +_m_u_l_t_i_t_y_p_e_b_l_o_c_k_v_e_c_t_o_r_._h_h │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:484 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:540 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_N │ │ │ │ │ +static constexpr size_type N() │ │ │ │ │ +Return the number of matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:513 │ │ │ │ │ +_D_u_n_e_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ +void bltsolve(const M &A, X &v, const Y &d) │ │ │ │ │ +block lower triangular solve │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_W_i_t_h_D_i_a_g_T_y_p_e │ │ │ │ │ +WithDiagType │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_b_s_o_r_b │ │ │ │ │ +void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +SSOR step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:646 │ │ │ │ │ +_D_u_n_e_:_:_u_b_l_t_s_o_l_v_e │ │ │ │ │ +void ubltsolve(const M &A, X &v, const Y &d) │ │ │ │ │ +unit block lower triangular solve │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_d_b_j_a_c │ │ │ │ │ +void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +Jacobi step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:658 │ │ │ │ │ +_D_u_n_e_:_:_d_b_g_s │ │ │ │ │ +void dbgs(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +GS step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:622 │ │ │ │ │ +_D_u_n_e_:_:_W_i_t_h_R_e_l_a_x_T_y_p_e │ │ │ │ │ +WithRelaxType │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_b_d_s_o_l_v_e │ │ │ │ │ +void bdsolve(const M &A, X &v, const Y &d) │ │ │ │ │ +block diagonal solve, no relaxation │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:337 │ │ │ │ │ +_D_u_n_e_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ +void butsolve(const M &A, X &v, const Y &d) │ │ │ │ │ +block upper triangular solve │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_b_s_o_r_f │ │ │ │ │ +void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +SOR step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:634 │ │ │ │ │ +_D_u_n_e_:_:_u_b_u_t_s_o_l_v_e │ │ │ │ │ +void ubutsolve(const M &A, X &v, const Y &d) │ │ │ │ │ +unit block upper triangular solve │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_n_o_d_i_a_g │ │ │ │ │ +@ nodiag │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_w_i_t_h_d_i_a_g │ │ │ │ │ +@ withdiag │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_n_o_r_e_l_a_x │ │ │ │ │ +@ norelax │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_w_i_t_h_r_e_l_a_x │ │ │ │ │ +@ withrelax │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:55 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -SequentialInformation() │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_g_l_o_b_a_l_S_u_m │ │ │ │ │ -T globalSum(const T &t) const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_d_o_t │ │ │ │ │ -void dot(const T1 &, const T1 &, T2 &) const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_C_o_p_y_F_l_a_g_s │ │ │ │ │ -EmptySet< int > CopyFlags │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -AllSet< int > OwnerSet │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ -void copyOwnerToAll(V &v, V &v1) const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -MPICommunicator communicator() const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void buildGlobalLookup(std::size_t) │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_n_o_r_m │ │ │ │ │ -FieldTraits< typenameT1::field_type >::real_type norm(const T1 &) const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_p_r_o_j_e_c_t │ │ │ │ │ -void project(V &v) const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_M_P_I_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -Communication< void * > MPICommunicator │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -SequentialInformation(const Communication< T > &) │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_g_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -const GlobalLookupIndexSet & globalLookup() const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -SequentialInformation(const SequentialInformation &) │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void freeGlobalLookup() │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -int GlobalLookupIndexSet │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -SolverCategory::Category category() const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_p_r_o_c_s │ │ │ │ │ -int procs() const │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A Vector class to support different block types. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockvector.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ +A Matrix class to support different block types. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_B_L │ │ │ │ │ +compile-time parameter for block recursion depth │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_B_L_:_:_r_e_c_u_r_s_i_o_n___l_e_v_e_l │ │ │ │ │ +@ recursion_level │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ +static void butsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ +static void bltsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ +static void bltsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ +static void butsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ +static void bltsolve(const M &A, X &v, const Y &d, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _w_i_t_h_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ +static void butsolve(const M &A, X &v, const Y &d, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ +static void bltsolve(const M &, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ +static void butsolve(const M &, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:148 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_l_t_s_o_l_v_e │ │ │ │ │ +static void bltsolve(const M &, X &v, const Y &d, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_t_s_o_l_v_e_<_ _0_,_ _n_o_d_i_a_g_,_ _n_o_r_e_l_a_x_ _>_:_:_b_u_t_s_o_l_v_e │ │ │ │ │ +static void butsolve(const M &, X &v, const Y &d, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:294 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_:_:_b_d_s_o_l_v_e │ │ │ │ │ +static void bdsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _w_i_t_h_r_e_l_a_x_ _>_:_:_b_d_s_o_l_v_e │ │ │ │ │ +static void bdsolve(const M &A, X &v, const Y &d, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:316 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___b_d_s_o_l_v_e_<_ _0_,_ _n_o_r_e_l_a_x_ _>_:_:_b_d_s_o_l_v_e │ │ │ │ │ +static void bdsolve(const M &A, X &v, const Y &d, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:325 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:375 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:418 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:378 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:545 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:550 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _0_,_ _M_ _>_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const M &A, X &x, const Y &b, const K &) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:555 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ +_>_:_:_d_b_g_s │ │ │ │ │ +static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ +MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ +MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:571 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ +_>_:_:_d_b_j_a_c │ │ │ │ │ +static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ +MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ +MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:608 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ +_>_:_:_b_s_o_r_f │ │ │ │ │ +static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ +MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ +MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:583 │ │ │ │ │ +_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_ _I_,_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _M_u_l_t_i_T_y_p_e_M_a_t_r_i_x_A_r_g_s_._._._ _> │ │ │ │ │ +_>_:_:_b_s_o_r_b │ │ │ │ │ +static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, │ │ │ │ │ +MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< │ │ │ │ │ +MultiTypeVectorArgs... > &b, const K &w) │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:595 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00122.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: fastamg.hh File Reference │ │ │ │ +dune-istl: solvertype.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,81 +65,44 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros
│ │ │ │ -
fastamg.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
solvertype.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

A fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers. │ │ │ │ +

Templates characterizing the type of a solver. │ │ │ │ More...

│ │ │ │ -
#include <memory>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/istl/paamg/smoother.hh>
│ │ │ │ -#include <dune/istl/paamg/transfer.hh>
│ │ │ │ -#include <dune/istl/paamg/matrixhierarchy.hh>
│ │ │ │ -#include <dune/istl/solvers.hh>
│ │ │ │ -#include <dune/istl/scalarproducts.hh>
│ │ │ │ -#include <dune/istl/superlu.hh>
│ │ │ │ -#include <dune/istl/umfpack.hh>
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ -#include <dune/istl/io.hh>
│ │ │ │ -#include <dune/istl/preconditioners.hh>
│ │ │ │ -#include "fastamgsmoother.hh"
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::FastAMG< M, X, PI, A >
 A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth. More...
struct  Dune::IsDirectSolver< Solver >
 
struct  Dune::StoresColumnCompressed< Solver >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Macros

#define DIRECTSOLVER   SuperLU
 
│ │ │ │

Detailed Description

│ │ │ │ -

A fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DIRECTSOLVER

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DIRECTSOLVER   SuperLU
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Templates characterizing the type of a solver.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,51 +1,22 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -fastamg.hh File Reference │ │ │ │ │ -A fast AMG method, that currently only allows only Gauss-Seidel smoothing and │ │ │ │ │ -is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep │ │ │ │ │ -with the defect calculation to reduce memory transfers. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -#include "_f_a_s_t_a_m_g_s_m_o_o_t_h_e_r_._h_h" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +solvertype.hh File Reference │ │ │ │ │ +Templates characterizing the type of a solver. _M_o_r_e_._._. │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_<_ _M_,_ _X_,_ _P_I_,_ _A_ _> │ │ │ │ │ -  A fast (sequential) algebraic multigrid based on agglomeration that │ │ │ │ │ - saves memory bandwidth. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _S_o_l_v_e_r_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _S_o_l_v_e_r_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_I_R_E_C_T_S_O_L_V_E_R   SuperLU │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -A fast AMG method, that currently only allows only Gauss-Seidel smoothing and │ │ │ │ │ -is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep │ │ │ │ │ -with the defect calculation to reduce memory transfers. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDIIRREECCTTSSOOLLVVEERR ********** │ │ │ │ │ -#define DIRECTSOLVER   SuperLU │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: fastamg.hh Source File │ │ │ │ +dune-istl: solvertype.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,666 +70,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
fastamg.hh
│ │ │ │ +
solvertype.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_FASTAMG_HH
│ │ │ │ -
6#define DUNE_ISTL_FASTAMG_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_SOLVERTYPE_HH
│ │ │ │ +
6#define DUNE_ISTL_SOLVERTYPE_HH
│ │ │ │
7
│ │ │ │ -
8#include <memory>
│ │ │ │ -
9#include <dune/common/exceptions.hh>
│ │ │ │ -
10#include <dune/common/typetraits.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
14#include <dune/istl/solvers.hh>
│ │ │ │ - │ │ │ │ -
16#include <dune/istl/superlu.hh>
│ │ │ │ -
17#include <dune/istl/umfpack.hh>
│ │ │ │ - │ │ │ │ -
19#include <dune/istl/io.hh>
│ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
22#include "fastamgsmoother.hh"
│ │ │ │ -
23
│ │ │ │ -
32namespace Dune
│ │ │ │ -
33{
│ │ │ │ -
34 namespace Amg
│ │ │ │ -
35 {
│ │ │ │ -
58 template<class M, class X, class PI=SequentialInformation, class A=std::allocator<X> >
│ │ │ │ -
│ │ │ │ -
59 class FastAMG : public Preconditioner<X,X>
│ │ │ │ -
60 {
│ │ │ │ -
61 public:
│ │ │ │ -
63 typedef M Operator;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
75
│ │ │ │ -
77 typedef X Domain;
│ │ │ │ -
79 typedef X Range;
│ │ │ │ - │ │ │ │ -
82
│ │ │ │ -
90 FastAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
│ │ │ │ -
91 const Parameters& parms,
│ │ │ │ -
92 bool symmetric=true);
│ │ │ │ -
93
│ │ │ │ -
105 template<class C>
│ │ │ │ -
106 FastAMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ -
107 const Parameters& parms=Parameters(),
│ │ │ │ -
108 bool symmetric=true,
│ │ │ │ - │ │ │ │ -
110
│ │ │ │ -
114 FastAMG(const FastAMG& amg);
│ │ │ │ -
115
│ │ │ │ -
117 void pre(Domain& x, Range& b);
│ │ │ │ -
118
│ │ │ │ -
120 void apply(Domain& v, const Range& d);
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
124 {
│ │ │ │ - │ │ │ │ -
126 }
│ │ │ │ +
12namespace Dune
│ │ │ │ +
13{
│ │ │ │ +
14 template<typename Solver>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
16 {
│ │ │ │ +
17 enum
│ │ │ │ +
18 {
│ │ │ │ +
24 value =false
│ │ │ │ +
25 };
│ │ │ │ +
26 };
│ │ │ │ +
│ │ │ │ +
27
│ │ │ │ +
28 template<typename Solver>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
30 {
│ │ │ │ +
31 enum
│ │ │ │ +
32 {
│ │ │ │ +
36 value = false
│ │ │ │ +
37 };
│ │ │ │ +
38 };
│ │ │ │
│ │ │ │ -
127
│ │ │ │ -
129 void post(Domain& x);
│ │ │ │ -
130
│ │ │ │ -
135 template<class A1>
│ │ │ │ -
136 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
│ │ │ │ -
137
│ │ │ │ -
138 std::size_t levels();
│ │ │ │ -
139
│ │ │ │ -
140 std::size_t maxlevels();
│ │ │ │ -
141
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
151 {
│ │ │ │ -
152 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
│ │ │ │ -
153 }
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
159 bool usesDirectCoarseLevelSolver() const;
│ │ │ │ -
160
│ │ │ │ -
161 private:
│ │ │ │ -
168 template<class C>
│ │ │ │ -
169 void createHierarchies(C& criterion,
│ │ │ │ -
170 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ -
171 const PI& pinfo);
│ │ │ │ -
172
│ │ │ │ -
179 struct LevelContext
│ │ │ │ -
180 {
│ │ │ │ -
184 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
│ │ │ │ - │ │ │ │ -
192 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
│ │ │ │ -
196 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
212 std::size_t level;
│ │ │ │ -
213 };
│ │ │ │ -
214
│ │ │ │ -
216 void mgc(LevelContext& levelContext, Domain& x, const Range& b);
│ │ │ │ -
217
│ │ │ │ -
224 void presmooth(LevelContext& levelContext, Domain& x, const Range& b);
│ │ │ │ -
225
│ │ │ │ -
232 void postsmooth(LevelContext& levelContext, Domain& x, const Range& b);
│ │ │ │ -
233
│ │ │ │ -
240 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel,
│ │ │ │ -
241 Domain& fineX);
│ │ │ │ -
242
│ │ │ │ -
247 bool moveToCoarseLevel(LevelContext& levelContext);
│ │ │ │ -
248
│ │ │ │ -
253 void initIteratorsWithFineLevel(LevelContext& levelContext);
│ │ │ │ -
254
│ │ │ │ -
256 std::shared_ptr<OperatorHierarchy> matrices_;
│ │ │ │ -
258 std::shared_ptr<CoarseSolver> solver_;
│ │ │ │ -
260 std::shared_ptr<Hierarchy<Range,A>> rhs_;
│ │ │ │ -
262 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
│ │ │ │ -
264 std::shared_ptr<Hierarchy<Domain,A>> residual_;
│ │ │ │ -
265
│ │ │ │ - │ │ │ │ -
269 std::shared_ptr<ScalarProduct> scalarProduct_;
│ │ │ │ -
271 std::size_t gamma_;
│ │ │ │ -
273 std::size_t preSteps_;
│ │ │ │ -
275 std::size_t postSteps_;
│ │ │ │ -
276 std::size_t level;
│ │ │ │ -
277 bool buildHierarchy_;
│ │ │ │ -
278 bool symmetric;
│ │ │ │ -
279 bool coarsesolverconverged;
│ │ │ │ - │ │ │ │ -
281 typedef std::shared_ptr<Smoother> SmootherPointer;
│ │ │ │ -
282 SmootherPointer coarseSmoother_;
│ │ │ │ -
284 std::size_t verbosity_;
│ │ │ │ -
285 };
│ │ │ │ -
│ │ │ │ -
286
│ │ │ │ -
287 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
289 : matrices_(amg.matrices_), solver_(amg.solver_),
│ │ │ │ -
290 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_),
│ │ │ │ -
291 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
│ │ │ │ -
292 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged),
│ │ │ │ -
293 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_)
│ │ │ │ -
294 {}
│ │ │ │ -
│ │ │ │ -
295
│ │ │ │ -
296 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
298 const Parameters& parms, bool symmetric_)
│ │ │ │ -
299 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver),
│ │ │ │ -
300 rhs_(), lhs_(), residual_(), scalarProduct_(),
│ │ │ │ -
301 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
│ │ │ │ -
302 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
│ │ │ │ -
303 symmetric(symmetric_), coarsesolverconverged(true),
│ │ │ │ -
304 coarseSmoother_(), verbosity_(parms.debugLevel())
│ │ │ │ -
305 {
│ │ │ │ -
306 if(preSteps_>1||postSteps_>1)
│ │ │ │ -
307 {
│ │ │ │ -
308 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
│ │ │ │ -
309 preSteps_=postSteps_=0;
│ │ │ │ -
310 }
│ │ │ │ -
311 assert(matrices_->isBuilt());
│ │ │ │ -
312 static_assert(std::is_same<PI,SequentialInformation>::value,
│ │ │ │ -
313 "Currently only sequential runs are supported");
│ │ │ │ -
314 }
│ │ │ │ -
│ │ │ │ -
315 template<class M, class X, class PI, class A>
│ │ │ │ -
316 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
318 const C& criterion,
│ │ │ │ -
319 const Parameters& parms,
│ │ │ │ -
320 bool symmetric_,
│ │ │ │ -
321 const PI& pinfo)
│ │ │ │ -
322 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_(parms.getGamma()),
│ │ │ │ -
323 preSteps_(parms.getNoPreSmoothSteps()), postSteps_(parms.getNoPostSmoothSteps()),
│ │ │ │ -
324 buildHierarchy_(true),
│ │ │ │ -
325 symmetric(symmetric_), coarsesolverconverged(true),
│ │ │ │ -
326 coarseSmoother_(), verbosity_(criterion.debugLevel())
│ │ │ │ -
327 {
│ │ │ │ -
328 if(preSteps_>1||postSteps_>1)
│ │ │ │ -
329 {
│ │ │ │ -
330 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
│ │ │ │ -
331 preSteps_=postSteps_=1;
│ │ │ │ -
332 }
│ │ │ │ -
333 static_assert(std::is_same<PI,SequentialInformation>::value,
│ │ │ │ -
334 "Currently only sequential runs are supported");
│ │ │ │ -
335 // TODO: reestablish compile time checks.
│ │ │ │ -
336 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
│ │ │ │ -
337 // "Matrix and Solver must match in terms of category!");
│ │ │ │ -
338 auto matrixptr = stackobject_to_shared_ptr(matrix);
│ │ │ │ -
339 createHierarchies(criterion, matrixptr, pinfo);
│ │ │ │ -
340 }
│ │ │ │ -
│ │ │ │ -
341
│ │ │ │ -
342 template<class M, class X, class PI, class A>
│ │ │ │ -
343 template<class C>
│ │ │ │ -
344 void FastAMG<M,X,PI,A>::createHierarchies(C& criterion,
│ │ │ │ -
345 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ -
346 const PI& pinfo)
│ │ │ │ -
347 {
│ │ │ │ -
348 Timer watch;
│ │ │ │ -
349 matrices_ = std::make_shared<OperatorHierarchy>(
│ │ │ │ -
350 std::const_pointer_cast<Operator>(matrixptr),
│ │ │ │ -
351 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
│ │ │ │ -
352
│ │ │ │ -
353 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
│ │ │ │ -
354
│ │ │ │ -
355 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
│ │ │ │ -
356 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
357
│ │ │ │ -
358 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()) {
│ │ │ │ -
359 // We have the carsest level. Create the coarse Solver
│ │ │ │ -
360 typedef typename SmootherTraits<Smoother>::Arguments SmootherArgs;
│ │ │ │ -
361 SmootherArgs sargs;
│ │ │ │ -
362 sargs.iterations = 1;
│ │ │ │ -
363
│ │ │ │ - │ │ │ │ -
365 cargs.setArgs(sargs);
│ │ │ │ -
366 if(matrices_->redistributeInformation().back().isSetup()) {
│ │ │ │ -
367 // Solve on the redistributed partitioning
│ │ │ │ -
368 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
│ │ │ │ -
369 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
│ │ │ │ -
370 }else{
│ │ │ │ -
371 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
│ │ │ │ -
372 cargs.setComm(*matrices_->parallelInformation().coarsest());
│ │ │ │ -
373 }
│ │ │ │ -
374
│ │ │ │ -
375 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
│ │ │ │ -
376 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
│ │ │ │ -
377
│ │ │ │ -
378#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
379#if HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
380#define DIRECTSOLVER UMFPack
│ │ │ │ -
381#else
│ │ │ │ -
382#define DIRECTSOLVER SuperLU
│ │ │ │ -
383#endif
│ │ │ │ -
384 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
│ │ │ │ -
385 if(std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
│ │ │ │ -
386 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
│ │ │ │ -
387 || (matrices_->parallelInformation().coarsest().isRedistributed()
│ │ │ │ -
388 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
│ │ │ │ -
389 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0)) { // redistribute and 1 proc
│ │ │ │ -
390 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
│ │ │ │ -
391 std::cout<<"Using superlu"<<std::endl;
│ │ │ │ -
392 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ -
393 {
│ │ │ │ -
394 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ -
395 // We are still participating on this level
│ │ │ │ -
396 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
│ │ │ │ -
397 else
│ │ │ │ -
398 solver_.reset();
│ │ │ │ -
399 }else
│ │ │ │ -
400 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest()->getmat(), false, false));
│ │ │ │ -
401 }else
│ │ │ │ -
402#undef DIRECTSOLVER
│ │ │ │ -
403#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
404 {
│ │ │ │ -
405 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ -
406 {
│ │ │ │ -
407 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ -
408 // We are still participating on this level
│ │ │ │ -
409 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
│ │ │ │ -
410 *scalarProduct_,
│ │ │ │ -
411 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ -
412 else
│ │ │ │ -
413 solver_.reset();
│ │ │ │ -
414 }else
│ │ │ │ -
415 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
│ │ │ │ -
416 *scalarProduct_,
│ │ │ │ -
417 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ -
418 }
│ │ │ │ -
419 }
│ │ │ │ -
420
│ │ │ │ -
421 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
│ │ │ │ -
422 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
423 }
│ │ │ │ -
424
│ │ │ │ -
425
│ │ │ │ -
426 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
428 {
│ │ │ │ -
429 Timer watch, watch1;
│ │ │ │ -
430 // Detect Matrix rows where all offdiagonal entries are
│ │ │ │ -
431 // zero and set x such that A_dd*x_d=b_d
│ │ │ │ -
432 // Thus users can be more careless when setting up their linear
│ │ │ │ -
433 // systems.
│ │ │ │ -
434 typedef typename M::matrix_type Matrix;
│ │ │ │ -
435 typedef typename Matrix::ConstRowIterator RowIter;
│ │ │ │ -
436 typedef typename Matrix::ConstColIterator ColIter;
│ │ │ │ -
437 typedef typename Matrix::block_type Block;
│ │ │ │ -
438 Block zero;
│ │ │ │ -
439 zero=typename Matrix::field_type();
│ │ │ │ -
440
│ │ │ │ -
441 const Matrix& mat=matrices_->matrices().finest()->getmat();
│ │ │ │ -
442 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ -
443 bool isDirichlet = true;
│ │ │ │ -
444 bool hasDiagonal = false;
│ │ │ │ -
445 ColIter diag;
│ │ │ │ -
446 for(ColIter col=row->begin(); col!=row->end(); ++col) {
│ │ │ │ -
447 if(row.index()==col.index()) {
│ │ │ │ -
448 diag = col;
│ │ │ │ -
449 hasDiagonal = (*col != zero);
│ │ │ │ -
450 }else{
│ │ │ │ -
451 if(*col!=zero)
│ │ │ │ -
452 isDirichlet = false;
│ │ │ │ -
453 }
│ │ │ │ -
454 }
│ │ │ │ -
455 if(isDirichlet && hasDiagonal)
│ │ │ │ -
456 diag->solve(x[row.index()], b[row.index()]);
│ │ │ │ -
457 }
│ │ │ │ -
458 if (verbosity_>0)
│ │ │ │ -
459 std::cout<<" Preprocessing Dirichlet took "<<watch1.elapsed()<<std::endl;
│ │ │ │ -
460 watch1.reset();
│ │ │ │ -
461 // No smoother to make x consistent! Do it by hand
│ │ │ │ -
462 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
│ │ │ │ -
463 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
│ │ │ │ -
464 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ -
465 residual_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ -
466 matrices_->coarsenVector(*rhs_);
│ │ │ │ -
467 matrices_->coarsenVector(*lhs_);
│ │ │ │ -
468 matrices_->coarsenVector(*residual_);
│ │ │ │ -
469
│ │ │ │ -
470 // The preconditioner might change x and b. So we have to
│ │ │ │ -
471 // copy the changes to the original vectors.
│ │ │ │ -
472 x = *lhs_->finest();
│ │ │ │ -
473 b = *rhs_->finest();
│ │ │ │ -
474 }
│ │ │ │ -
│ │ │ │ -
475 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
477 {
│ │ │ │ -
478 return matrices_->levels();
│ │ │ │ -
479 }
│ │ │ │ -
│ │ │ │ -
480 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
482 {
│ │ │ │ -
483 return matrices_->maxlevels();
│ │ │ │ -
484 }
│ │ │ │ -
│ │ │ │ -
485
│ │ │ │ -
487 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
489 {
│ │ │ │ -
490 LevelContext levelContext;
│ │ │ │ -
491 // Init all iterators for the current level
│ │ │ │ -
492 initIteratorsWithFineLevel(levelContext);
│ │ │ │ -
493
│ │ │ │ -
494 assert(v.two_norm()==0);
│ │ │ │ -
495
│ │ │ │ -
496 level=0;
│ │ │ │ -
497 if(matrices_->maxlevels()==1){
│ │ │ │ -
498 // The coarse solver might modify the d!
│ │ │ │ -
499 Range b(d);
│ │ │ │ -
500 mgc(levelContext, v, b);
│ │ │ │ -
501 }else
│ │ │ │ -
502 mgc(levelContext, v, d);
│ │ │ │ -
503 if(postSteps_==0||matrices_->maxlevels()==1)
│ │ │ │ -
504 levelContext.pinfo->copyOwnerToAll(v, v);
│ │ │ │ -
505 }
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
507 template<class M, class X, class PI, class A>
│ │ │ │ -
508 void FastAMG<M,X,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
│ │ │ │ -
509 {
│ │ │ │ -
510 levelContext.matrix = matrices_->matrices().finest();
│ │ │ │ -
511 levelContext.pinfo = matrices_->parallelInformation().finest();
│ │ │ │ -
512 levelContext.redist =
│ │ │ │ -
513 matrices_->redistributeInformation().begin();
│ │ │ │ -
514 levelContext.aggregates = matrices_->aggregatesMaps().begin();
│ │ │ │ -
515 levelContext.lhs = lhs_->finest();
│ │ │ │ -
516 levelContext.residual = residual_->finest();
│ │ │ │ -
517 levelContext.rhs = rhs_->finest();
│ │ │ │ -
518 levelContext.level=0;
│ │ │ │ -
519 }
│ │ │ │ -
520
│ │ │ │ -
521 template<class M, class X, class PI, class A>
│ │ │ │ -
522 bool FastAMG<M,X,PI,A>
│ │ │ │ -
523 ::moveToCoarseLevel(LevelContext& levelContext)
│ │ │ │ -
524 {
│ │ │ │ -
525 bool processNextLevel=true;
│ │ │ │ -
526
│ │ │ │ -
527 if(levelContext.redist->isSetup()) {
│ │ │ │ -
528 throw "bla";
│ │ │ │ -
529 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.residual),
│ │ │ │ -
530 levelContext.residual.getRedistributed());
│ │ │ │ -
531 processNextLevel = levelContext.residual.getRedistributed().size()>0;
│ │ │ │ -
532 if(processNextLevel) {
│ │ │ │ -
533 //restrict defect to coarse level right hand side.
│ │ │ │ -
534 ++levelContext.pinfo;
│ │ │ │ -
535 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
536 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
│ │ │ │ -
537 static_cast<const Range&>(levelContext.residual.getRedistributed()),
│ │ │ │ -
538 *levelContext.pinfo);
│ │ │ │ -
539 }
│ │ │ │ -
540 }else{
│ │ │ │ -
541 //restrict defect to coarse level right hand side.
│ │ │ │ -
542 ++levelContext.rhs;
│ │ │ │ -
543 ++levelContext.pinfo;
│ │ │ │ -
544 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
545 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
│ │ │ │ -
546 static_cast<const Range&>(*levelContext.residual), *levelContext.pinfo);
│ │ │ │ -
547 }
│ │ │ │ -
548
│ │ │ │ -
549 if(processNextLevel) {
│ │ │ │ -
550 // prepare coarse system
│ │ │ │ -
551 ++levelContext.residual;
│ │ │ │ -
552 ++levelContext.lhs;
│ │ │ │ -
553 ++levelContext.matrix;
│ │ │ │ -
554 ++levelContext.level;
│ │ │ │ -
555 ++levelContext.redist;
│ │ │ │ -
556
│ │ │ │ -
557 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ -
558 // next level is not the globally coarsest one
│ │ │ │ -
559 ++levelContext.aggregates;
│ │ │ │ -
560 }
│ │ │ │ -
561 // prepare the lhs on the next level
│ │ │ │ -
562 *levelContext.lhs=0;
│ │ │ │ -
563 *levelContext.residual=0;
│ │ │ │ -
564 }
│ │ │ │ -
565 return processNextLevel;
│ │ │ │ -
566 }
│ │ │ │ -
567
│ │ │ │ -
568 template<class M, class X, class PI, class A>
│ │ │ │ -
569 void FastAMG<M,X,PI,A>
│ │ │ │ -
570 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel, Domain& x)
│ │ │ │ -
571 {
│ │ │ │ -
572 if(processNextLevel) {
│ │ │ │ -
573 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ -
574 // previous level is not the globally coarsest one
│ │ │ │ -
575 --levelContext.aggregates;
│ │ │ │ -
576 }
│ │ │ │ -
577 --levelContext.redist;
│ │ │ │ -
578 --levelContext.level;
│ │ │ │ -
579 //prolongate and add the correction (update is in coarse left hand side)
│ │ │ │ -
580 --levelContext.matrix;
│ │ │ │ -
581 --levelContext.residual;
│ │ │ │ -
582
│ │ │ │ -
583 }
│ │ │ │ -
584
│ │ │ │ -
585 typename Hierarchy<Domain,A>::Iterator coarseLhs = levelContext.lhs--;
│ │ │ │ -
586 if(levelContext.redist->isSetup()) {
│ │ │ │ -
587
│ │ │ │ -
588 // Need to redistribute during prolongate
│ │ │ │ -
589 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
590 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
│ │ │ │ -
591 levelContext.lhs.getRedistributed(),
│ │ │ │ -
592 matrices_->getProlongationDampingFactor(),
│ │ │ │ -
593 *levelContext.pinfo, *levelContext.redist);
│ │ │ │ -
594 }else{
│ │ │ │ -
595 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
596 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
│ │ │ │ -
597 matrices_->getProlongationDampingFactor(), *levelContext.pinfo);
│ │ │ │ -
598
│ │ │ │ -
599 // printvector(std::cout, *lhs, "prolongated coarse grid correction", "lhs", 10, 10, 10);
│ │ │ │ -
600 }
│ │ │ │ -
601
│ │ │ │ -
602
│ │ │ │ -
603 if(processNextLevel) {
│ │ │ │ -
604 --levelContext.rhs;
│ │ │ │ -
605 }
│ │ │ │ -
606
│ │ │ │ -
607 }
│ │ │ │ -
608
│ │ │ │ -
609
│ │ │ │ -
610 template<class M, class X, class PI, class A>
│ │ │ │ -
611 void FastAMG<M,X,PI,A>
│ │ │ │ -
612 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b)
│ │ │ │ -
613 {
│ │ │ │ -
614 constexpr auto bl = blockLevel<typename M::matrix_type>();
│ │ │ │ -
615 GaussSeidelPresmoothDefect<bl>::apply(levelContext.matrix->getmat(),
│ │ │ │ -
616 x,
│ │ │ │ -
617 *levelContext.residual,
│ │ │ │ -
618 b);
│ │ │ │ -
619 }
│ │ │ │ -
620
│ │ │ │ -
621 template<class M, class X, class PI, class A>
│ │ │ │ -
622 void FastAMG<M,X,PI,A>
│ │ │ │ -
623 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b)
│ │ │ │ -
624 {
│ │ │ │ -
625 constexpr auto bl = blockLevel<typename M::matrix_type>();
│ │ │ │ -
626 GaussSeidelPostsmoothDefect<bl>
│ │ │ │ -
627 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b);
│ │ │ │ -
628 }
│ │ │ │ -
629
│ │ │ │ -
630
│ │ │ │ -
631 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
633 {
│ │ │ │ - │ │ │ │ -
635 }
│ │ │ │ -
│ │ │ │ -
636
│ │ │ │ -
637 template<class M, class X, class PI, class A>
│ │ │ │ -
638 void FastAMG<M,X,PI,A>::mgc(LevelContext& levelContext, Domain& v, const Range& b){
│ │ │ │ -
639
│ │ │ │ -
640 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
│ │ │ │ -
641 // Solve directly
│ │ │ │ - │ │ │ │ -
643 res.converged=true; // If we do not compute this flag will not get updated
│ │ │ │ -
644 if(levelContext.redist->isSetup()) {
│ │ │ │ -
645 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed());
│ │ │ │ -
646 if(levelContext.rhs.getRedistributed().size()>0) {
│ │ │ │ -
647 // We are still participating in the computation
│ │ │ │ -
648 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
│ │ │ │ -
649 levelContext.rhs.getRedistributed());
│ │ │ │ -
650 solver_->apply(levelContext.lhs.getRedistributed(), levelContext.rhs.getRedistributed(), res);
│ │ │ │ -
651 }
│ │ │ │ -
652 levelContext.redist->redistributeBackward(v, levelContext.lhs.getRedistributed());
│ │ │ │ -
653 levelContext.pinfo->copyOwnerToAll(v, v);
│ │ │ │ -
654 }else{
│ │ │ │ -
655 levelContext.pinfo->copyOwnerToAll(b, b);
│ │ │ │ -
656 solver_->apply(v, const_cast<Range&>(b), res);
│ │ │ │ -
657 }
│ │ │ │ -
658
│ │ │ │ -
659 // printvector(std::cout, *lhs, "coarse level update", "u", 10, 10, 10);
│ │ │ │ -
660 // printvector(std::cout, *rhs, "coarse level rhs", "rhs", 10, 10, 10);
│ │ │ │ -
661 if (!res.converged)
│ │ │ │ -
662 coarsesolverconverged = false;
│ │ │ │ -
663 }else{
│ │ │ │ -
664 // presmoothing
│ │ │ │ -
665 presmooth(levelContext, v, b);
│ │ │ │ -
666 // printvector(std::cout, *lhs, "update", "u", 10, 10, 10);
│ │ │ │ -
667 // printvector(std::cout, *residual, "post presmooth residual", "r", 10);
│ │ │ │ -
668#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
│ │ │ │ -
669 bool processNextLevel = moveToCoarseLevel(levelContext);
│ │ │ │ -
670
│ │ │ │ -
671 if(processNextLevel) {
│ │ │ │ -
672 // next level
│ │ │ │ -
673 for(std::size_t i=0; i<gamma_; i++)
│ │ │ │ -
674 mgc(levelContext, *levelContext.lhs, *levelContext.rhs);
│ │ │ │ -
675 }
│ │ │ │ -
676
│ │ │ │ -
677 moveToFineLevel(levelContext, processNextLevel, v);
│ │ │ │ -
678#else
│ │ │ │ -
679 *lhs=0;
│ │ │ │ -
680#endif
│ │ │ │ -
681
│ │ │ │ -
682 if(levelContext.matrix == matrices_->matrices().finest()) {
│ │ │ │ -
683 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
│ │ │ │ -
684 if(!coarsesolverconverged)
│ │ │ │ -
685 DUNE_THROW(MathError, "Coarse solver did not converge");
│ │ │ │ -
686 }
│ │ │ │ -
687
│ │ │ │ -
688 postsmooth(levelContext, v, b);
│ │ │ │ -
689 }
│ │ │ │ -
690 }
│ │ │ │ -
691
│ │ │ │ -
692
│ │ │ │ -
694 template<class M, class X, class PI, class A>
│ │ │ │ -
│ │ │ │ -
695 void FastAMG<M,X,PI,A>::post([[maybe_unused]] Domain& x)
│ │ │ │ -
696 {
│ │ │ │ -
697 lhs_=nullptr;
│ │ │ │ -
698 rhs_=nullptr;
│ │ │ │ -
699 residual_=nullptr;
│ │ │ │ -
700 }
│ │ │ │ -
│ │ │ │ -
701
│ │ │ │ -
702 template<class M, class X, class PI, class A>
│ │ │ │ -
703 template<class A1>
│ │ │ │ -
│ │ │ │ -
704 void FastAMG<M,X,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
│ │ │ │ -
705 {
│ │ │ │ -
706 matrices_->getCoarsestAggregatesOnFinest(cont);
│ │ │ │ -
707 }
│ │ │ │ -
│ │ │ │ -
708
│ │ │ │ -
709 } // end namespace Amg
│ │ │ │ -
710} // end namespace Dune
│ │ │ │ -
711
│ │ │ │ -
712#endif
│ │ │ │ -
Classes for using SuperLU with ISTL matrices.
│ │ │ │ -
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
Define base class for scalar product and norm.
│ │ │ │ -
Classes for using UMFPack with ISTL matrices.
│ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ -
Prolongation and restriction for amg.
│ │ │ │ -
Provides a classes representing the hierarchies in AMG.
│ │ │ │ -
Classes for the generic construction and application of the smoothers.
│ │ │ │ - │ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ -
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ -
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ -
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ -
int iterations
The numbe of iterations to perform.
Definition smoother.hh:47
│ │ │ │ -
OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
The iterator over the matrices.
Definition fastamg.hh:184
│ │ │ │ -
void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
Get the aggregate number of each unknown on the coarsest level.
Definition fastamg.hh:704
│ │ │ │ -
ParallelInformationHierarchy::Iterator pinfo
The iterator over the parallel information.
Definition fastamg.hh:188
│ │ │ │ -
void recalculateHierarchy()
Recalculate the matrix hierarchy.
Definition fastamg.hh:150
│ │ │ │ -
void post(Domain &x)
Clean up.
Definition fastamg.hh:695
│ │ │ │ -
std::size_t maxlevels()
Definition fastamg.hh:481
│ │ │ │ -
X Domain
The domain type.
Definition fastamg.hh:77
│ │ │ │ -
Hierarchy< Domain, A >::Iterator residual
The iterator over the residuals.
Definition fastamg.hh:204
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition fastamg.hh:123
│ │ │ │ -
MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
The operator hierarchy type.
Definition fastamg.hh:72
│ │ │ │ -
OperatorHierarchy::RedistributeInfoList::const_iterator redist
The iterator over the redistribution information.
Definition fastamg.hh:192
│ │ │ │ -
X Range
The range type.
Definition fastamg.hh:79
│ │ │ │ -
PI ParallelInformation
The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
Definition fastamg.hh:70
│ │ │ │ -
M Operator
The matrix operator type.
Definition fastamg.hh:63
│ │ │ │ -
std::size_t levels()
Definition fastamg.hh:476
│ │ │ │ -
InverseOperator< X, X > CoarseSolver
the type of the coarse solver.
Definition fastamg.hh:81
│ │ │ │ -
bool usesDirectCoarseLevelSolver() const
Check whether the coarse solver used is a direct solver.
Definition fastamg.hh:632
│ │ │ │ -
Hierarchy< Domain, A >::Iterator lhs
The iterator over the left hand side.
Definition fastamg.hh:200
│ │ │ │ -
Hierarchy< Range, A >::Iterator rhs
The iterator over the right hand sided.
Definition fastamg.hh:208
│ │ │ │ -
std::size_t level
The level index.
Definition fastamg.hh:212
│ │ │ │ -
void apply(Domain &v, const Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition fastamg.hh:488
│ │ │ │ -
OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
The parallal data distribution hierarchy type.
Definition fastamg.hh:74
│ │ │ │ -
void pre(Domain &x, Range &b)
Prepare the preconditioner.
Definition fastamg.hh:427
│ │ │ │ -
FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const Parameters &parms, bool symmetric=true)
Construct a new amg with a specific coarse solver.
Definition fastamg.hh:297
│ │ │ │ -
OperatorHierarchy::AggregatesMapList::const_iterator aggregates
The iterator over the aggregates maps.
Definition fastamg.hh:196
│ │ │ │ +
39} // end namespace Dune
│ │ │ │ +
40#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ -
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ -
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ -
A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth.
Definition fastamg.hh:60
│ │ │ │ -
static void apply(const M &A, X &x, Y &d, const Y &b)
Definition fastamgsmoother.hh:19
│ │ │ │ - │ │ │ │ -
LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ -
Iterator over the levels in the hierarchy.
Definition hierarchy.hh:120
│ │ │ │ -
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ -
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ -
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Sequential SSOR preconditioner.
Definition preconditioners.hh:141
│ │ │ │ -
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
Definition solvertype.hh:16
│ │ │ │ +
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
│ │ │ │ +
Definition solvertype.hh:30
│ │ │ │ +
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,825 +1,53 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -fastamg.hh │ │ │ │ │ +solvertype.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_FASTAMG_HH │ │ │ │ │ -6#define DUNE_ISTL_FASTAMG_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_SOLVERTYPE_HH │ │ │ │ │ +6#define DUNE_ISTL_SOLVERTYPE_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22#include "_f_a_s_t_a_m_g_s_m_o_o_t_h_e_r_._h_h" │ │ │ │ │ -23 │ │ │ │ │ -32namespace _D_u_n_e │ │ │ │ │ -33{ │ │ │ │ │ -34 namespace Amg │ │ │ │ │ -35 { │ │ │ │ │ -58 template > │ │ │ │ │ -_5_9 class _F_a_s_t_A_M_G : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -60 { │ │ │ │ │ -61 public: │ │ │ │ │ -_6_3 typedef M _O_p_e_r_a_t_o_r; │ │ │ │ │ -_7_0 typedef PI _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -_7_2 typedef _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_> _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -_7_4 typedef typename _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -75 │ │ │ │ │ -_7_7 typedef X _D_o_m_a_i_n; │ │ │ │ │ -_7_9 typedef X _R_a_n_g_e; │ │ │ │ │ -_8_1 typedef _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_X_> _C_o_a_r_s_e_S_o_l_v_e_r; │ │ │ │ │ -82 │ │ │ │ │ -90 _F_a_s_t_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& coarseSolver, │ │ │ │ │ -91 const _P_a_r_a_m_e_t_e_r_s& parms, │ │ │ │ │ -92 bool symmetric=true); │ │ │ │ │ -93 │ │ │ │ │ -105 template │ │ │ │ │ -106 _F_a_s_t_A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ -107 const _P_a_r_a_m_e_t_e_r_s& parms=_P_a_r_a_m_e_t_e_r_s(), │ │ │ │ │ -108 bool symmetric=true, │ │ │ │ │ -109 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ -110 │ │ │ │ │ -114 _F_a_s_t_A_M_G(const _F_a_s_t_A_M_G& amg); │ │ │ │ │ -115 │ │ │ │ │ -117 void _p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b); │ │ │ │ │ -118 │ │ │ │ │ -120 void _a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d); │ │ │ │ │ -121 │ │ │ │ │ -_1_2_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -124 { │ │ │ │ │ -125 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -126 } │ │ │ │ │ -127 │ │ │ │ │ -129 void _p_o_s_t(_D_o_m_a_i_n& x); │ │ │ │ │ -130 │ │ │ │ │ -135 template │ │ │ │ │ -136 void _g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont); │ │ │ │ │ -137 │ │ │ │ │ -138 std::size_t _l_e_v_e_l_s(); │ │ │ │ │ -139 │ │ │ │ │ -140 std::size_t _m_a_x_l_e_v_e_l_s(); │ │ │ │ │ -141 │ │ │ │ │ -_1_5_0 void _r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y() │ │ │ │ │ -151 { │ │ │ │ │ -152 matrices_->recalculateGalerkin(NegateSet()); │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -159 bool _u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const; │ │ │ │ │ -160 │ │ │ │ │ -161 private: │ │ │ │ │ -168 template │ │ │ │ │ -169 void createHierarchies(C& criterion, │ │ │ │ │ -170 const std::shared_ptr& matrixptr, │ │ │ │ │ -171 const PI& pinfo); │ │ │ │ │ -172 │ │ │ │ │ -179 struct LevelContext │ │ │ │ │ -180 { │ │ │ │ │ -_1_8_4 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _m_a_t_r_i_x; │ │ │ │ │ -_1_8_8 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r _p_i_n_f_o; │ │ │ │ │ -_1_9_2 typename OperatorHierarchy::RedistributeInfoList::const_iterator _r_e_d_i_s_t; │ │ │ │ │ -_1_9_6 typename OperatorHierarchy::AggregatesMapList::const_iterator _a_g_g_r_e_g_a_t_e_s; │ │ │ │ │ -_2_0_0 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _l_h_s; │ │ │ │ │ -_2_0_4 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _r_e_s_i_d_u_a_l; │ │ │ │ │ -_2_0_8 typename _H_i_e_r_a_r_c_h_y_<_R_a_n_g_e_,_A_>_:_:_I_t_e_r_a_t_o_r _r_h_s; │ │ │ │ │ -_2_1_2 std::size_t _l_e_v_e_l; │ │ │ │ │ -213 }; │ │ │ │ │ -214 │ │ │ │ │ -216 void mgc(LevelContext& levelContext, _D_o_m_a_i_n& x, const _R_a_n_g_e& b); │ │ │ │ │ -217 │ │ │ │ │ -224 void presmooth(LevelContext& levelContext, _D_o_m_a_i_n& x, const _R_a_n_g_e& b); │ │ │ │ │ -225 │ │ │ │ │ -232 void postsmooth(LevelContext& levelContext, _D_o_m_a_i_n& x, const _R_a_n_g_e& b); │ │ │ │ │ -233 │ │ │ │ │ -240 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel, │ │ │ │ │ -241 _D_o_m_a_i_n& fineX); │ │ │ │ │ -242 │ │ │ │ │ -247 bool moveToCoarseLevel(LevelContext& levelContext); │ │ │ │ │ -248 │ │ │ │ │ -253 void initIteratorsWithFineLevel(LevelContext& levelContext); │ │ │ │ │ -254 │ │ │ │ │ -256 std::shared_ptr matrices_; │ │ │ │ │ -258 std::shared_ptr solver_; │ │ │ │ │ -260 std::shared_ptr> rhs_; │ │ │ │ │ -262 std::shared_ptr> lhs_; │ │ │ │ │ -264 std::shared_ptr> residual_; │ │ │ │ │ -265 │ │ │ │ │ -267 using _S_c_a_l_a_r_P_r_o_d_u_c_t = _D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>; │ │ │ │ │ -269 std::shared_ptr scalarProduct_; │ │ │ │ │ -271 std::size_t gamma_; │ │ │ │ │ -273 std::size_t preSteps_; │ │ │ │ │ -275 std::size_t postSteps_; │ │ │ │ │ -276 std::size_t level; │ │ │ │ │ -277 bool buildHierarchy_; │ │ │ │ │ -278 bool symmetric; │ │ │ │ │ -279 bool coarsesolverconverged; │ │ │ │ │ -280 typedef _S_e_q_S_S_O_R_<_t_y_p_e_n_a_m_e_ _M_:_:_m_a_t_r_i_x___t_y_p_e_,_X_,_X_> _S_m_o_o_t_h_e_r; │ │ │ │ │ -281 typedef std::shared_ptr SmootherPointer; │ │ │ │ │ -282 SmootherPointer coarseSmoother_; │ │ │ │ │ -284 std::size_t verbosity_; │ │ │ │ │ -285 }; │ │ │ │ │ -286 │ │ │ │ │ -287 template │ │ │ │ │ -_2_8_8 _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_F_a_s_t_A_M_G(const _F_a_s_t_A_M_G& amg) │ │ │ │ │ -289 : matrices_(amg.matrices_), solver_(amg.solver_), │ │ │ │ │ -290 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_), │ │ │ │ │ -291 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_), │ │ │ │ │ -292 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged), │ │ │ │ │ -293 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_) │ │ │ │ │ -294 {} │ │ │ │ │ -295 │ │ │ │ │ -296 template │ │ │ │ │ -_2_9_7 _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_F_a_s_t_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& │ │ │ │ │ -coarseSolver, │ │ │ │ │ -298 const _P_a_r_a_m_e_t_e_r_s& parms, bool symmetric_) │ │ │ │ │ -299 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver), │ │ │ │ │ -300 rhs_(), lhs_(), residual_(), scalarProduct_(), │ │ │ │ │ -301 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()), │ │ │ │ │ -302 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false), │ │ │ │ │ -303 symmetric(symmetric_), coarsesolverconverged(true), │ │ │ │ │ -304 coarseSmoother_(), verbosity_(parms.debugLevel()) │ │ │ │ │ -305 { │ │ │ │ │ -306 if(preSteps_>1||postSteps_>1) │ │ │ │ │ -307 { │ │ │ │ │ -308 std::cerr<<"WARNING only one step of smoothing is supported!"<isBuilt()); │ │ │ │ │ -312 static_assert(std::is_same::value, │ │ │ │ │ -313 "Currently only sequential runs are supported"); │ │ │ │ │ -314 } │ │ │ │ │ -315 template │ │ │ │ │ -316 template │ │ │ │ │ -_3_1_7 _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_F_a_s_t_A_M_G(const _O_p_e_r_a_t_o_r& matrix, │ │ │ │ │ -318 const C& criterion, │ │ │ │ │ -319 const _P_a_r_a_m_e_t_e_r_s& parms, │ │ │ │ │ -320 bool symmetric_, │ │ │ │ │ -321 const PI& pinfo) │ │ │ │ │ -322 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_ │ │ │ │ │ -(parms.getGamma()), │ │ │ │ │ -323 preSteps_(parms.getNoPreSmoothSteps()), postSteps_ │ │ │ │ │ -(parms.getNoPostSmoothSteps()), │ │ │ │ │ -324 buildHierarchy_(true), │ │ │ │ │ -325 symmetric(symmetric_), coarsesolverconverged(true), │ │ │ │ │ -326 coarseSmoother_(), verbosity_(criterion.debugLevel()) │ │ │ │ │ -327 { │ │ │ │ │ -328 if(preSteps_>1||postSteps_>1) │ │ │ │ │ -329 { │ │ │ │ │ -330 std::cerr<<"WARNING only one step of smoothing is supported!"<::value, │ │ │ │ │ -334 "Currently only sequential runs are supported"); │ │ │ │ │ -335 // TODO: reestablish compile time checks. │ │ │ │ │ -336 //static_assert(static_cast(PI::category)==static_cast(S:: │ │ │ │ │ -category), │ │ │ │ │ -337 // "Matrix and Solver must match in terms of category!"); │ │ │ │ │ -338 auto matrixptr = stackobject_to_shared_ptr(matrix); │ │ │ │ │ -339 createHierarchies(criterion, matrixptr, pinfo); │ │ │ │ │ -340 } │ │ │ │ │ -341 │ │ │ │ │ -342 template │ │ │ │ │ -343 template │ │ │ │ │ -344 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_c_r_e_a_t_e_H_i_e_r_a_r_c_h_i_e_s(C& criterion, │ │ │ │ │ -345 const std::shared_ptr& matrixptr, │ │ │ │ │ -346 const PI& pinfo) │ │ │ │ │ -347 { │ │ │ │ │ -348 Timer watch; │ │ │ │ │ -349 matrices_ = std::make_shared( │ │ │ │ │ -350 std::const_pointer_cast(matrixptr), │ │ │ │ │ -351 stackobject_to_shared_ptr(const_cast(pinfo))); │ │ │ │ │ -352 │ │ │ │ │ -353 matrices_->template build >(criterion); │ │ │ │ │ -354 │ │ │ │ │ -355 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator │ │ │ │ │ -().rank()==0) │ │ │ │ │ -356 std::cout<<"Building Hierarchy of "<maxlevels()<<" levels took │ │ │ │ │ -"<levels()==matrices_->maxlevels()) { │ │ │ │ │ -359 // We have the carsest level. Create the coarse Solver │ │ │ │ │ -360 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s SmootherArgs; │ │ │ │ │ -361 SmootherArgs sargs; │ │ │ │ │ -362 sargs._i_t_e_r_a_t_i_o_n_s = 1; │ │ │ │ │ -363 │ │ │ │ │ -364 typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s cargs; │ │ │ │ │ -365 cargs.setArgs(sargs); │ │ │ │ │ -366 if(matrices_->redistributeInformation().back().isSetup()) { │ │ │ │ │ -367 // Solve on the redistributed partitioning │ │ │ │ │ -368 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat │ │ │ │ │ -()); │ │ │ │ │ -369 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ -()); │ │ │ │ │ -370 }else{ │ │ │ │ │ -371 cargs.setMatrix(matrices_->matrices().coarsest()->getmat()); │ │ │ │ │ -372 cargs.setComm(*matrices_->parallelInformation().coarsest()); │ │ │ │ │ -373 } │ │ │ │ │ -374 │ │ │ │ │ -375 coarseSmoother_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_c_o_n_s_t_r_u_c_t(cargs); │ │ │ │ │ -376 scalarProduct_ = createScalarProduct(cargs.getComm(),category()); │ │ │ │ │ -377 │ │ │ │ │ -378#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -379#if HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -380#define DIRECTSOLVER UMFPack │ │ │ │ │ -381#else │ │ │ │ │ -382#define DIRECTSOLVER SuperLU │ │ │ │ │ -383#endif │ │ │ │ │ -384 // Use superlu if we are purely sequential or with only one processor on │ │ │ │ │ -the coarsest level. │ │ │ │ │ -385 if(std::is_same::value / │ │ │ │ │ -/ sequential mode │ │ │ │ │ -386 || matrices_->parallelInformation().coarsest()->communicator().size()==1 // │ │ │ │ │ -parallel mode and only one processor │ │ │ │ │ -387 || (matrices_->parallelInformation().coarsest().isRedistributed() │ │ │ │ │ -388 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ -().communicator().size()==1 │ │ │ │ │ -389 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ -().communicator().size()>0)) { // redistribute and 1 proc │ │ │ │ │ -390 if(verbosity_>0 && matrices_->parallelInformation().coarsest()- │ │ │ │ │ ->communicator().rank()==0) │ │ │ │ │ -391 std::cout<<"Using superlu"<parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ -393 { │ │ │ │ │ -394 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ -395 // We are still participating on this level │ │ │ │ │ -396 solver_.reset(new DIRECTSOLVER(matrices_->matrices │ │ │ │ │ -().coarsest().getRedistributed().getmat(), false, false)); │ │ │ │ │ -397 else │ │ │ │ │ -398 solver_.reset(); │ │ │ │ │ -399 }else │ │ │ │ │ -400 solver_.reset(new DIRECTSOLVER(matrices_->matrices │ │ │ │ │ -().coarsest()->getmat(), false, false)); │ │ │ │ │ -401 }else │ │ │ │ │ -402#undef DIRECTSOLVER │ │ │ │ │ -403#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -404 { │ │ │ │ │ -405 if(matrices_->parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ -406 { │ │ │ │ │ -407 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ -408 // We are still participating on this level │ │ │ │ │ -409 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices │ │ │ │ │ -().coarsest().getRedistributed()), │ │ │ │ │ -410 *scalarProduct_, │ │ │ │ │ -411 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ -412 else │ │ │ │ │ -413 solver_.reset(); │ │ │ │ │ -414 }else │ │ │ │ │ -415 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices │ │ │ │ │ -().coarsest()), │ │ │ │ │ -416 *scalarProduct_, │ │ │ │ │ -417 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ -418 } │ │ │ │ │ -419 } │ │ │ │ │ -420 │ │ │ │ │ -421 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator │ │ │ │ │ -().rank()==0) │ │ │ │ │ -422 std::cout<<"Building Hierarchy of "<maxlevels()<<" levels took │ │ │ │ │ -"< │ │ │ │ │ -_4_2_7 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b) │ │ │ │ │ -428 { │ │ │ │ │ -429 Timer watch, watch1; │ │ │ │ │ -430 // Detect Matrix rows where all offdiagonal entries are │ │ │ │ │ -431 // zero and set x such that A_dd*x_d=b_d │ │ │ │ │ -432 // Thus users can be more careless when setting up their linear │ │ │ │ │ -433 // systems. │ │ │ │ │ -434 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ -435 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r RowIter; │ │ │ │ │ -436 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r ColIter; │ │ │ │ │ -437 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e Block; │ │ │ │ │ -438 Block zero; │ │ │ │ │ -439 zero=typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e(); │ │ │ │ │ -440 │ │ │ │ │ -441 const _M_a_t_r_i_x& _m_a_t=matrices_->matrices().finest()->getmat(); │ │ │ │ │ -442 for(RowIter row=_m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ -443 bool isDirichlet = true; │ │ │ │ │ -444 bool hasDiagonal = false; │ │ │ │ │ -445 ColIter diag; │ │ │ │ │ -446 for(ColIter _c_o_l=row->begin(); _c_o_l!=row->end(); ++_c_o_l) { │ │ │ │ │ -447 if(row.index()==_c_o_l.index()) { │ │ │ │ │ -448 diag = _c_o_l; │ │ │ │ │ -449 hasDiagonal = (*_c_o_l != zero); │ │ │ │ │ -450 }else{ │ │ │ │ │ -451 if(*_c_o_l!=zero) │ │ │ │ │ -452 isDirichlet = false; │ │ │ │ │ -453 } │ │ │ │ │ -454 } │ │ │ │ │ -455 if(isDirichlet && hasDiagonal) │ │ │ │ │ -456 diag->solve(x[row.index()], b[row.index()]); │ │ │ │ │ -457 } │ │ │ │ │ -458 if (verbosity_>0) │ │ │ │ │ -459 std::cout<<" Preprocessing Dirichlet took "<parallelInformation().coarsest()->copyOwnerToAll(x,x); │ │ │ │ │ -463 rhs_ = std::make_shared>(std::make_shared(b)); │ │ │ │ │ -464 lhs_ = std::make_shared>(std::make_shared(x)); │ │ │ │ │ -465 residual_ = std::make_shared>(std::make_shared │ │ │ │ │ -(x)); │ │ │ │ │ -466 matrices_->coarsenVector(*rhs_); │ │ │ │ │ -467 matrices_->coarsenVector(*lhs_); │ │ │ │ │ -468 matrices_->coarsenVector(*residual_); │ │ │ │ │ -469 │ │ │ │ │ -470 // The preconditioner might change x and b. So we have to │ │ │ │ │ -471 // copy the changes to the original vectors. │ │ │ │ │ -472 x = *lhs_->finest(); │ │ │ │ │ -473 b = *rhs_->finest(); │ │ │ │ │ -474 } │ │ │ │ │ -475 template │ │ │ │ │ -_4_7_6 std::size_t _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_l_e_v_e_l_s() │ │ │ │ │ -477 { │ │ │ │ │ -478 return matrices_->levels(); │ │ │ │ │ -479 } │ │ │ │ │ -480 template │ │ │ │ │ -_4_8_1 std::size_t _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_m_a_x_l_e_v_e_l_s() │ │ │ │ │ -482 { │ │ │ │ │ -483 return matrices_->maxlevels(); │ │ │ │ │ -484 } │ │ │ │ │ -485 │ │ │ │ │ -487 template │ │ │ │ │ -_4_8_8 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -489 { │ │ │ │ │ -490 LevelContext levelContext; │ │ │ │ │ -491 // Init all iterators for the current level │ │ │ │ │ -492 initIteratorsWithFineLevel(levelContext); │ │ │ │ │ -493 │ │ │ │ │ -494 assert(v.two_norm()==0); │ │ │ │ │ -495 │ │ │ │ │ -496 level=0; │ │ │ │ │ -497 if(matrices_->maxlevels()==1){ │ │ │ │ │ -498 // The coarse solver might modify the d! │ │ │ │ │ -499 _R_a_n_g_e b(d); │ │ │ │ │ -500 mgc(levelContext, v, b); │ │ │ │ │ -501 }else │ │ │ │ │ -502 mgc(levelContext, v, d); │ │ │ │ │ -503 if(postSteps_==0||matrices_->maxlevels()==1) │ │ │ │ │ -504 levelContext.pinfo->copyOwnerToAll(v, v); │ │ │ │ │ -505 } │ │ │ │ │ -506 │ │ │ │ │ -507 template │ │ │ │ │ -508 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_i_n_i_t_I_t_e_r_a_t_o_r_s_W_i_t_h_F_i_n_e_L_e_v_e_l(LevelContext& │ │ │ │ │ -levelContext) │ │ │ │ │ -509 { │ │ │ │ │ -510 levelContext.matrix = matrices_->matrices().finest(); │ │ │ │ │ -511 levelContext.pinfo = matrices_->parallelInformation().finest(); │ │ │ │ │ -512 levelContext.redist = │ │ │ │ │ -513 matrices_->redistributeInformation().begin(); │ │ │ │ │ -514 levelContext.aggregates = matrices_->aggregatesMaps().begin(); │ │ │ │ │ -515 levelContext.lhs = lhs_->finest(); │ │ │ │ │ -516 levelContext.residual = residual_->finest(); │ │ │ │ │ -517 levelContext.rhs = rhs_->finest(); │ │ │ │ │ -518 levelContext.level=0; │ │ │ │ │ -519 } │ │ │ │ │ -520 │ │ │ │ │ -521 template │ │ │ │ │ -522 bool FastAMG │ │ │ │ │ -523 ::moveToCoarseLevel(LevelContext& levelContext) │ │ │ │ │ -524 { │ │ │ │ │ -525 bool processNextLevel=true; │ │ │ │ │ -526 │ │ │ │ │ -527 if(levelContext.redist->isSetup()) { │ │ │ │ │ -528 throw "bla"; │ │ │ │ │ -529 levelContext.redist->redistribute(static_cast │ │ │ │ │ -(*levelContext.residual), │ │ │ │ │ -530 levelContext.residual.getRedistributed()); │ │ │ │ │ -531 processNextLevel = levelContext.residual.getRedistributed().size()>0; │ │ │ │ │ -532 if(processNextLevel) { │ │ │ │ │ -533 //restrict defect to coarse level right hand side. │ │ │ │ │ -534 ++levelContext.pinfo; │ │ │ │ │ -535 Transfer │ │ │ │ │ -536 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs, │ │ │ │ │ -537 static_cast(levelContext.residual.getRedistributed()), │ │ │ │ │ -538 *levelContext.pinfo); │ │ │ │ │ -539 } │ │ │ │ │ -540 }else{ │ │ │ │ │ -541 //restrict defect to coarse level right hand side. │ │ │ │ │ -542 ++levelContext.rhs; │ │ │ │ │ -543 ++levelContext.pinfo; │ │ │ │ │ -544 Transfer │ │ │ │ │ -545 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs, │ │ │ │ │ -546 static_cast(*levelContext.residual), *levelContext.pinfo); │ │ │ │ │ -547 } │ │ │ │ │ -548 │ │ │ │ │ -549 if(processNextLevel) { │ │ │ │ │ -550 // prepare coarse system │ │ │ │ │ -551 ++levelContext.residual; │ │ │ │ │ -552 ++levelContext.lhs; │ │ │ │ │ -553 ++levelContext.matrix; │ │ │ │ │ -554 ++levelContext.level; │ │ │ │ │ -555 ++levelContext.redist; │ │ │ │ │ -556 │ │ │ │ │ -557 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ ->levels()maxlevels()) { │ │ │ │ │ -558 // next level is not the globally coarsest one │ │ │ │ │ -559 ++levelContext.aggregates; │ │ │ │ │ -560 } │ │ │ │ │ -561 // prepare the lhs on the next level │ │ │ │ │ -562 *levelContext.lhs=0; │ │ │ │ │ -563 *levelContext.residual=0; │ │ │ │ │ -564 } │ │ │ │ │ -565 return processNextLevel; │ │ │ │ │ -566 } │ │ │ │ │ -567 │ │ │ │ │ -568 template │ │ │ │ │ -569 void FastAMG │ │ │ │ │ -570 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel, │ │ │ │ │ -Domain& x) │ │ │ │ │ -571 { │ │ │ │ │ -572 if(processNextLevel) { │ │ │ │ │ -573 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ ->levels()maxlevels()) { │ │ │ │ │ -574 // previous level is not the globally coarsest one │ │ │ │ │ -575 --levelContext.aggregates; │ │ │ │ │ -576 } │ │ │ │ │ -577 --levelContext.redist; │ │ │ │ │ -578 --levelContext.level; │ │ │ │ │ -579 //prolongate and add the correction (update is in coarse left hand side) │ │ │ │ │ -580 --levelContext.matrix; │ │ │ │ │ -581 --levelContext.residual; │ │ │ │ │ -582 │ │ │ │ │ -583 } │ │ │ │ │ -584 │ │ │ │ │ -585 typename Hierarchy::Iterator coarseLhs = levelContext.lhs--; │ │ │ │ │ -586 if(levelContext.redist->isSetup()) { │ │ │ │ │ -587 │ │ │ │ │ -588 // Need to redistribute during prolongate │ │ │ │ │ -589 Transfer │ │ │ │ │ -590 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x, │ │ │ │ │ -591 levelContext.lhs.getRedistributed(), │ │ │ │ │ -592 matrices_->getProlongationDampingFactor(), │ │ │ │ │ -593 *levelContext.pinfo, *levelContext.redist); │ │ │ │ │ -594 }else{ │ │ │ │ │ -595 Transfer │ │ │ │ │ -596 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x, │ │ │ │ │ -597 matrices_->getProlongationDampingFactor(), *levelContext.pinfo); │ │ │ │ │ -598 │ │ │ │ │ -599 // printvector(std::cout, *lhs, "prolongated coarse grid correction", │ │ │ │ │ -"lhs", 10, 10, 10); │ │ │ │ │ -600 } │ │ │ │ │ -601 │ │ │ │ │ -602 │ │ │ │ │ -603 if(processNextLevel) { │ │ │ │ │ -604 --levelContext.rhs; │ │ │ │ │ -605 } │ │ │ │ │ -606 │ │ │ │ │ -607 } │ │ │ │ │ -608 │ │ │ │ │ -609 │ │ │ │ │ -610 template │ │ │ │ │ -611 void FastAMG │ │ │ │ │ -612 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b) │ │ │ │ │ -613 { │ │ │ │ │ -614 constexpr auto bl = blockLevel(); │ │ │ │ │ -615 _G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_<_b_l_>_:_:_a_p_p_l_y(levelContext.matrix->getmat(), │ │ │ │ │ -616 x, │ │ │ │ │ -617 *levelContext.residual, │ │ │ │ │ -618 b); │ │ │ │ │ -619 } │ │ │ │ │ -620 │ │ │ │ │ -621 template │ │ │ │ │ -622 void FastAMG │ │ │ │ │ -623 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b) │ │ │ │ │ -624 { │ │ │ │ │ -625 constexpr auto bl = blockLevel(); │ │ │ │ │ -626 GaussSeidelPostsmoothDefect │ │ │ │ │ -627 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b); │ │ │ │ │ -628 } │ │ │ │ │ -629 │ │ │ │ │ -630 │ │ │ │ │ -631 template │ │ │ │ │ -_6_3_2 bool _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const │ │ │ │ │ -633 { │ │ │ │ │ -634 return _I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _C_o_a_r_s_e_S_o_l_v_e_r_>_:_:_v_a_l_u_e; │ │ │ │ │ -635 } │ │ │ │ │ -636 │ │ │ │ │ -637 template │ │ │ │ │ -638 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_m_g_c(LevelContext& levelContext, Domain& v, const │ │ │ │ │ -Range& b){ │ │ │ │ │ -639 │ │ │ │ │ -640 if(levelContext.matrix == matrices_->matrices().coarsest() && levels │ │ │ │ │ -()==maxlevels()) { │ │ │ │ │ -641 // Solve directly │ │ │ │ │ -642 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ -643 res._c_o_n_v_e_r_g_e_d=true; // If we do not compute this flag will not get updated │ │ │ │ │ -644 if(levelContext.redist->isSetup()) { │ │ │ │ │ -645 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed()); │ │ │ │ │ -646 if(levelContext.rhs.getRedistributed().size()>0) { │ │ │ │ │ -647 // We are still participating in the computation │ │ │ │ │ -648 levelContext.pinfo.getRedistributed().copyOwnerToAll │ │ │ │ │ -(levelContext.rhs.getRedistributed(), │ │ │ │ │ -649 levelContext.rhs.getRedistributed()); │ │ │ │ │ -650 solver_->apply(levelContext.lhs.getRedistributed(), │ │ │ │ │ -levelContext.rhs.getRedistributed(), res); │ │ │ │ │ -651 } │ │ │ │ │ -652 levelContext.redist->redistributeBackward(v, │ │ │ │ │ -levelContext.lhs.getRedistributed()); │ │ │ │ │ -653 levelContext.pinfo->copyOwnerToAll(v, v); │ │ │ │ │ -654 }else{ │ │ │ │ │ -655 levelContext.pinfo->copyOwnerToAll(b, b); │ │ │ │ │ -656 solver_->apply(v, const_cast(b), res); │ │ │ │ │ -657 } │ │ │ │ │ -658 │ │ │ │ │ -659 // printvector(std::cout, *lhs, "coarse level update", "u", 10, 10, 10); │ │ │ │ │ -660 // printvector(std::cout, *rhs, "coarse level rhs", "rhs", 10, 10, 10); │ │ │ │ │ -661 if (!res._c_o_n_v_e_r_g_e_d) │ │ │ │ │ -662 coarsesolverconverged = false; │ │ │ │ │ -663 }else{ │ │ │ │ │ -664 // presmoothing │ │ │ │ │ -665 _p_r_e_s_m_o_o_t_h(levelContext, v, b); │ │ │ │ │ -666 // printvector(std::cout, *lhs, "update", "u", 10, 10, 10); │ │ │ │ │ -667 // printvector(std::cout, *residual, "post presmooth residual", "r", 10); │ │ │ │ │ -668#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION │ │ │ │ │ -669 bool processNextLevel = moveToCoarseLevel(levelContext); │ │ │ │ │ -670 │ │ │ │ │ -671 if(processNextLevel) { │ │ │ │ │ -672 // next level │ │ │ │ │ -673 for(std::size_t i=0; imatrices().finest()) { │ │ │ │ │ -683 coarsesolverconverged = matrices_->parallelInformation().finest()- │ │ │ │ │ ->communicator().prod(coarsesolverconverged); │ │ │ │ │ -684 if(!coarsesolverconverged) │ │ │ │ │ -685 DUNE_THROW(MathError, "Coarse solver did not converge"); │ │ │ │ │ -686 } │ │ │ │ │ -687 │ │ │ │ │ -688 _p_o_s_t_s_m_o_o_t_h(levelContext, v, b); │ │ │ │ │ -689 } │ │ │ │ │ -690 } │ │ │ │ │ -691 │ │ │ │ │ -692 │ │ │ │ │ -694 template │ │ │ │ │ -_6_9_5 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_p_o_s_t([[maybe_unused]] _D_o_m_a_i_n& x) │ │ │ │ │ -696 { │ │ │ │ │ -697 lhs_=nullptr; │ │ │ │ │ -698 rhs_=nullptr; │ │ │ │ │ -699 residual_=nullptr; │ │ │ │ │ -700 } │ │ │ │ │ -701 │ │ │ │ │ -702 template │ │ │ │ │ -703 template │ │ │ │ │ -_7_0_4 void _F_a_s_t_A_M_G_<_M_,_X_,_P_I_,_A_>_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont) │ │ │ │ │ -705 { │ │ │ │ │ -706 matrices_->getCoarsestAggregatesOnFinest(cont); │ │ │ │ │ -707 } │ │ │ │ │ -708 │ │ │ │ │ -709 } // end namespace Amg │ │ │ │ │ -710} // end namespace Dune │ │ │ │ │ -711 │ │ │ │ │ -712#endif │ │ │ │ │ -_s_u_p_e_r_l_u_._h_h │ │ │ │ │ -Classes for using SuperLU with ISTL matrices. │ │ │ │ │ -_i_o_._h_h │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ -_u_m_f_p_a_c_k_._h_h │ │ │ │ │ -Classes for using UMFPack with ISTL matrices. │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_t_r_a_n_s_f_e_r_._h_h │ │ │ │ │ -Prolongation and restriction for amg. │ │ │ │ │ -_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. │ │ │ │ │ -_s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ -Classes for the generic construction and application of the smoothers. │ │ │ │ │ -_f_a_s_t_a_m_g_s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h │ │ │ │ │ -void presmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ -Apply pre smoothing on the current level. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const void * Arguments │ │ │ │ │ -A type holding all the arguments needed to call the constructor. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ -Construct an object with the specified arguments. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h │ │ │ │ │ -void postsmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ -Apply post smoothing on the current level. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:428 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -int iterations │ │ │ │ │ -The numbe of iterations to perform. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_m_a_t_r_i_x │ │ │ │ │ -OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix │ │ │ │ │ -The iterator over the matrices. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s │ │ │ │ │ -void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont) │ │ │ │ │ -Get the aggregate number of each unknown on the coarsest level. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:704 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_p_i_n_f_o │ │ │ │ │ -ParallelInformationHierarchy::Iterator pinfo │ │ │ │ │ -The iterator over the parallel information. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y │ │ │ │ │ -void recalculateHierarchy() │ │ │ │ │ -Recalculate the matrix hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_p_o_s_t │ │ │ │ │ -void post(Domain &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ -std::size_t maxlevels() │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ -X Domain │ │ │ │ │ -The domain type. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_e_s_i_d_u_a_l │ │ │ │ │ -Hierarchy< Domain, A >::Iterator residual │ │ │ │ │ -The iterator over the residuals. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:204 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y │ │ │ │ │ -MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy │ │ │ │ │ -The operator hierarchy type. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_e_d_i_s_t │ │ │ │ │ -OperatorHierarchy::RedistributeInfoList::const_iterator redist │ │ │ │ │ -The iterator over the redistribution information. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ -X Range │ │ │ │ │ -The range type. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -PI ParallelInformation │ │ │ │ │ -The type of the parallel information. Either OwnerOverlapCommunication or │ │ │ │ │ -another type describing the... │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ -M Operator │ │ │ │ │ -The matrix operator type. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_l_e_v_e_l_s │ │ │ │ │ -std::size_t levels() │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:476 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_C_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ -InverseOperator< X, X > CoarseSolver │ │ │ │ │ -the type of the coarse solver. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r │ │ │ │ │ -bool usesDirectCoarseLevelSolver() const │ │ │ │ │ -Check whether the coarse solver used is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:632 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_h_s │ │ │ │ │ -Hierarchy< Domain, A >::Iterator lhs │ │ │ │ │ -The iterator over the left hand side. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:200 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_h_s │ │ │ │ │ -Hierarchy< Range, A >::Iterator rhs │ │ │ │ │ -The iterator over the right hand sided. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_e_v_e_l │ │ │ │ │ -std::size_t level │ │ │ │ │ -The level index. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_a_p_p_l_y │ │ │ │ │ -void apply(Domain &v, const Range &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy │ │ │ │ │ -The parallal data distribution hierarchy type. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_p_r_e │ │ │ │ │ -void pre(Domain &x, Range &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:427 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_F_a_s_t_A_M_G │ │ │ │ │ -FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const │ │ │ │ │ -Parameters &parms, bool symmetric=true) │ │ │ │ │ -Construct a new amg with a specific coarse solver. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_a_g_g_r_e_g_a_t_e_s │ │ │ │ │ -OperatorHierarchy::AggregatesMapList::const_iterator aggregates │ │ │ │ │ -The iterator over the aggregates maps. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:196 │ │ │ │ │ +12namespace _D_u_n_e │ │ │ │ │ +13{ │ │ │ │ │ +14 template │ │ │ │ │ +_1_5 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +16 { │ │ │ │ │ +17 enum │ │ │ │ │ +18 { │ │ │ │ │ +24 _v_a_l_u_e =false │ │ │ │ │ +_2_5 }; │ │ │ │ │ +26 }; │ │ │ │ │ +27 │ │ │ │ │ +28 template │ │ │ │ │ +_2_9 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ +30 { │ │ │ │ │ +31 enum │ │ │ │ │ +32 { │ │ │ │ │ +36 _v_a_l_u_e = false │ │ │ │ │ +_3_7 }; │ │ │ │ │ +38 }; │ │ │ │ │ +39} // end namespace Dune │ │ │ │ │ +40#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ -Export the type representing the underlying field. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::const_iterator ConstColIterator │ │ │ │ │ -Const iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -T block_type │ │ │ │ │ -Export the type representing the components. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_a_s_t_A_M_G │ │ │ │ │ -A fast (sequential) algebraic multigrid based on agglomeration that saves │ │ │ │ │ -memory bandwidth. │ │ │ │ │ -DDeeffiinniittiioonn fastamg.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_a_u_s_s_S_e_i_d_e_l_P_r_e_s_m_o_o_t_h_D_e_f_e_c_t_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(const M &A, X &x, Y &d, const Y &b) │ │ │ │ │ -DDeeffiinniittiioonn fastamgsmoother.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation │ │ │ │ │ -> Iterator │ │ │ │ │ -Type of the mutable iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator over the levels in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -The hierarchies build by the coarsening process. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -All parameters for AMG. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -The default class for the smoother arguments. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_S_O_R │ │ │ │ │ -Sequential SSOR preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioners.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Base class for scalar product and norm computation. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ +@ value │ │ │ │ │ +Whether this is a direct solver. │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ +@ value │ │ │ │ │ +whether the solver internally uses column compressed storage │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00125.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: graphcreator.hh File Reference │ │ │ │ +dune-istl: vbvector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,47 +65,58 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
graphcreator.hh File Reference
│ │ │ │ +
vbvector.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include "graph.hh"
│ │ │ │ -#include "dependency.hh"
│ │ │ │ -#include "pinfo.hh"
│ │ │ │ -#include <dune/istl/operators.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ + │ │ │ │ +

??? │ │ │ │ +More...

│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <iterator>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::PropertiesGraphCreator< M, PI >
class  Dune::VariableBlockVector< B, A >
 A Vector of blocks with different blocksizes. More...
 
class  Dune::VariableBlockVector< B, A >::CreateIterator
 Iterator class for sequential creation of blocks. More...
 
struct  Dune::Amg::PropertiesGraphCreator< M, SequentialInformation >
class  Dune::VariableBlockVector< B, A >::RealIterator< T, R >
 Iterator class for sequential access. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

???

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,28 +1,36 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -graphcreator.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -#include "_d_e_p_e_n_d_e_n_c_y_._h_h" │ │ │ │ │ -#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +vbvector.hh File Reference │ │ │ │ │ +??? _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _P_I_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _> │ │ │ │ │ +  A Vector of blocks with different blocksizes. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +  Iterator class for sequential creation of blocks. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_:_:_R_e_a_l_I_t_e_r_a_t_o_r_<_ _T_,_ _R_ _> │ │ │ │ │ +  Iterator class for sequential access. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +??? │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: graphcreator.hh Source File │ │ │ │ +dune-istl: vbvector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,156 +70,857 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
graphcreator.hh
│ │ │ │ +
vbvector.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_GRAPHCREATOR_HH
│ │ │ │ -
6#define DUNE_AMG_GRAPHCREATOR_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_VBVECTOR_HH
│ │ │ │ +
6#define DUNE_ISTL_VBVECTOR_HH
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ -
9
│ │ │ │ -
10#include "graph.hh"
│ │ │ │ -
11#include "dependency.hh"
│ │ │ │ -
12#include "pinfo.hh"
│ │ │ │ - │ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16namespace Dune
│ │ │ │ -
17{
│ │ │ │ -
18 namespace Amg
│ │ │ │ -
19 {
│ │ │ │ -
20 template<class M, class PI>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
22 {
│ │ │ │ -
23 typedef typename M::matrix_type Matrix;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
26 std::vector<bool> > SubGraph;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
30 IdentityMap,
│ │ │ │ - │ │ │ │ - │ │ │ │ -
33
│ │ │ │ -
34 typedef std::tuple<MatrixGraph*,PropertiesGraph*,SubGraph*> GraphTuple;
│ │ │ │ -
35
│ │ │ │ -
36 template<class OF, class T>
│ │ │ │ -
│ │ │ │ -
37 static GraphTuple create(const M& matrix, T& excluded,
│ │ │ │ -
38 PI& pinfo, const OF& of)
│ │ │ │ -
39 {
│ │ │ │ -
40 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
│ │ │ │ -
41 typedef typename PI::ParallelIndexSet ParallelIndexSet;
│ │ │ │ -
42 typedef typename ParallelIndexSet::const_iterator IndexIterator;
│ │ │ │ -
43 IndexIterator iend = pinfo.indexSet().end();
│ │ │ │ -
44
│ │ │ │ -
45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)
│ │ │ │ -
46 excluded[index->local()] = of.contains(index->local().attribute());
│ │ │ │ -
47
│ │ │ │ -
48 SubGraph* sg= new SubGraph(*mg, excluded);
│ │ │ │ -
49 PropertiesGraph* pg = new PropertiesGraph(*sg, IdentityMap(), sg->getEdgeIndexMap());
│ │ │ │ -
50 return GraphTuple(mg,pg,sg);
│ │ │ │ -
51 }
│ │ │ │ -
│ │ │ │ -
52
│ │ │ │ -
│ │ │ │ -
53 static void free(GraphTuple& graphs)
│ │ │ │ -
54 {
│ │ │ │ -
55 delete std::get<2>(graphs);
│ │ │ │ -
56 delete std::get<1>(graphs);
│ │ │ │ -
57 }
│ │ │ │ -
│ │ │ │ -
58 };
│ │ │ │ -
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <complex>
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <iterator>
│ │ │ │ +
12#include <memory>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
15#include "istlexception.hh"
│ │ │ │ +
16#include "bvector.hh"
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ +
19
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25
│ │ │ │ +
41 template<class B, class A=std::allocator<B> >
│ │ │ │ +
│ │ │ │ +
42 class VariableBlockVector : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ +
43 // this derivation gives us all the blas level 1 and norms
│ │ │ │ +
44 // on the large array. However, access operators have to be
│ │ │ │ +
45 // overwritten.
│ │ │ │ +
46 {
│ │ │ │ +
47 // just a shorthand
│ │ │ │ +
48 typedef Imp::BlockVectorWindow<B,A> window_type;
│ │ │ │ +
49
│ │ │ │ +
50 public:
│ │ │ │ +
51
│ │ │ │ +
52 //===== type definitions and constants
│ │ │ │ +
53
│ │ │ │ +
55 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
56
│ │ │ │ +
58 typedef A allocator_type;
│ │ │ │
59
│ │ │ │ -
60 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
62 {
│ │ │ │ -
63 typedef typename M::matrix_type Matrix;
│ │ │ │ -
64
│ │ │ │ - │ │ │ │ -
66
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
70 IdentityMap,
│ │ │ │ -
71 IdentityMap> PropertiesGraph;
│ │ │ │ -
72
│ │ │ │ -
73 typedef std::tuple<MatrixGraph*,PropertiesGraph*> GraphTuple;
│ │ │ │ +
64 typedef window_type& reference;
│ │ │ │ +
65
│ │ │ │ +
70 typedef const window_type& const_reference;
│ │ │ │ +
71
│ │ │ │ +
73 typedef typename A::size_type size_type;
│ │ │ │
74
│ │ │ │ -
75 template<class OF, class T>
│ │ │ │ -
│ │ │ │ -
76 static GraphTuple create([[maybe_unused]] const M& matrix,
│ │ │ │ -
77 [[maybe_unused]] T& excluded,
│ │ │ │ -
78 [[maybe_unused]] const SequentialInformation& pinfo,
│ │ │ │ -
79 const OF&)
│ │ │ │ -
80 {
│ │ │ │ -
81 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
│ │ │ │ -
82 PropertiesGraph* pg = new PropertiesGraph(*mg, IdentityMap(), IdentityMap());
│ │ │ │ -
83 return GraphTuple(mg,pg);
│ │ │ │ -
84 }
│ │ │ │ -
│ │ │ │ + │ │ │ │ +
81
│ │ │ │ + │ │ │ │
85
│ │ │ │ -
│ │ │ │ -
86 static void free(GraphTuple& graphs)
│ │ │ │ -
87 {
│ │ │ │ -
88 delete std::get<1>(graphs);
│ │ │ │ -
89 }
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
91 };
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
93 } //namespace Amg
│ │ │ │ -
94} // namespace Dune
│ │ │ │ -
95#endif
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Provides classes for building the matrix graph.
│ │ │ │ - │ │ │ │ -
Provides classes for initializing the link attributes of a matrix graph.
│ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
89 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
90 static constexpr auto blocklevel = blockLevel<B>()+2;
│ │ │ │ +
91
│ │ │ │ +
92 //===== constructors and such
│ │ │ │ +
93
│ │ │ │ +
│ │ │ │ +
97 VariableBlockVector () : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ +
98 {
│ │ │ │ +
99 // nothing is known ...
│ │ │ │ +
100 nblocks = 0;
│ │ │ │ +
101 block = nullptr;
│ │ │ │ +
102 initialized = false;
│ │ │ │ +
103 }
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
│ │ │ │ +
108 explicit VariableBlockVector (size_type _nblocks) : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ +
109 {
│ │ │ │ +
110 // we can allocate the windows now
│ │ │ │ +
111 nblocks = _nblocks;
│ │ │ │ +
112 if (nblocks>0)
│ │ │ │ +
113 {
│ │ │ │ +
114 block = windowAllocator_.allocate(nblocks);
│ │ │ │ +
115 new (block) window_type[nblocks];
│ │ │ │ +
116 }
│ │ │ │ +
117 else
│ │ │ │ +
118 {
│ │ │ │ +
119 nblocks = 0;
│ │ │ │ +
120 block = nullptr;
│ │ │ │ +
121 }
│ │ │ │ +
122
│ │ │ │ +
123 // Note: memory in base class still not allocated
│ │ │ │ +
124 // the vector not usable
│ │ │ │ +
125 initialized = false;
│ │ │ │ +
126 }
│ │ │ │ +
│ │ │ │ +
127
│ │ │ │ +
│ │ │ │ +
134 VariableBlockVector (size_type _nblocks, size_type m) : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ +
135 {
│ │ │ │ +
136 // and we can allocate the big array in the base class
│ │ │ │ +
137 this->n = _nblocks*m;
│ │ │ │ +
138 if (this->n>0)
│ │ │ │ +
139 {
│ │ │ │ +
140 this->p = allocator_.allocate(this->n);
│ │ │ │ +
141 new (this->p)B[this->n];
│ │ │ │ +
142 }
│ │ │ │ +
143 else
│ │ │ │ +
144 {
│ │ │ │ +
145 this->n = 0;
│ │ │ │ +
146 this->p = nullptr;
│ │ │ │ +
147 }
│ │ │ │ +
148
│ │ │ │ +
149 // we can allocate the windows now
│ │ │ │ +
150 nblocks = _nblocks;
│ │ │ │ +
151 if (nblocks>0)
│ │ │ │ +
152 {
│ │ │ │ +
153 // allocate and construct the windows
│ │ │ │ +
154 block = windowAllocator_.allocate(nblocks);
│ │ │ │ +
155 new (block) window_type[nblocks];
│ │ │ │ +
156
│ │ │ │ +
157 // set the windows into the big array
│ │ │ │ +
158 for (size_type i=0; i<nblocks; ++i)
│ │ │ │ +
159 block[i].set(m,this->p+(i*m));
│ │ │ │ +
160 }
│ │ │ │ +
161 else
│ │ │ │ +
162 {
│ │ │ │ +
163 nblocks = 0;
│ │ │ │ +
164 block = nullptr;
│ │ │ │ +
165 }
│ │ │ │ +
166
│ │ │ │ +
167 // and the vector is usable
│ │ │ │ +
168 initialized = true;
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
173 {
│ │ │ │ +
174 // allocate the big array in the base class
│ │ │ │ +
175 this->n = a.n;
│ │ │ │ +
176 if (this->n>0)
│ │ │ │ +
177 {
│ │ │ │ +
178 // allocate and construct objects
│ │ │ │ +
179 this->p = allocator_.allocate(this->n);
│ │ │ │ +
180 new (this->p)B[this->n];
│ │ │ │ +
181
│ │ │ │ +
182 // copy data
│ │ │ │ +
183 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ +
184 }
│ │ │ │ +
185 else
│ │ │ │ +
186 {
│ │ │ │ +
187 this->n = 0;
│ │ │ │ +
188 this->p = nullptr;
│ │ │ │ +
189 }
│ │ │ │ +
190
│ │ │ │ +
191 // we can allocate the windows now
│ │ │ │ +
192 nblocks = a.nblocks;
│ │ │ │ +
193 if (nblocks>0)
│ │ │ │ +
194 {
│ │ │ │ +
195 // alloc
│ │ │ │ +
196 block = windowAllocator_.allocate(nblocks);
│ │ │ │ +
197 new (block) window_type[nblocks];
│ │ │ │ +
198
│ │ │ │ +
199 // and we must set the windows
│ │ │ │ +
200 block[0].set(a.block[0].getsize(),this->p); // first block
│ │ │ │ +
201 for (size_type i=1; i<nblocks; ++i) // and the rest
│ │ │ │ +
202 block[i].set(a.block[i].getsize(),block[i-1].getptr()+block[i-1].getsize());
│ │ │ │ +
203 }
│ │ │ │ +
204 else
│ │ │ │ +
205 {
│ │ │ │ +
206 nblocks = 0;
│ │ │ │ +
207 block = nullptr;
│ │ │ │ +
208 }
│ │ │ │ +
209
│ │ │ │ +
210 // and we have a usable vector
│ │ │ │ +
211 initialized = true;
│ │ │ │ +
212 }
│ │ │ │ +
│ │ │ │ +
213
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
216 {
│ │ │ │ +
217 if (this->n>0) {
│ │ │ │ +
218 size_type i=this->n;
│ │ │ │ +
219 while (i)
│ │ │ │ +
220 this->p[--i].~B();
│ │ │ │ +
221 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
222 }
│ │ │ │ +
223 if (nblocks>0) {
│ │ │ │ +
224 size_type i=nblocks;
│ │ │ │ +
225 while (i)
│ │ │ │ +
226 block[--i].~window_type();
│ │ │ │ +
227 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ +
228 }
│ │ │ │ +
229
│ │ │ │ +
230 }
│ │ │ │ +
│ │ │ │ +
231
│ │ │ │ +
232
│ │ │ │ +
│ │ │ │ +
234 void resize (size_type _nblocks)
│ │ │ │ +
235 {
│ │ │ │ +
236 // deconstruct objects and deallocate memory if necessary
│ │ │ │ +
237 if (this->n>0) {
│ │ │ │ +
238 size_type i=this->n;
│ │ │ │ +
239 while (i)
│ │ │ │ +
240 this->p[--i].~B();
│ │ │ │ +
241 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
242 }
│ │ │ │ +
243 if (nblocks>0) {
│ │ │ │ +
244 size_type i=nblocks;
│ │ │ │ +
245 while (i)
│ │ │ │ +
246 block[--i].~window_type();
│ │ │ │ +
247 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ +
248 }
│ │ │ │ +
249 this->n = 0;
│ │ │ │ +
250 this->p = nullptr;
│ │ │ │ +
251
│ │ │ │ +
252 // we can allocate the windows now
│ │ │ │ +
253 nblocks = _nblocks;
│ │ │ │ +
254 if (nblocks>0)
│ │ │ │ +
255 {
│ │ │ │ +
256 block = windowAllocator_.allocate(nblocks);
│ │ │ │ +
257 new (block) window_type[nblocks];
│ │ │ │ +
258 }
│ │ │ │ +
259 else
│ │ │ │ +
260 {
│ │ │ │ +
261 nblocks = 0;
│ │ │ │ +
262 block = nullptr;
│ │ │ │ +
263 }
│ │ │ │ +
264
│ │ │ │ +
265 // and the vector not fully usable
│ │ │ │ +
266 initialized = false;
│ │ │ │ +
267 }
│ │ │ │ +
│ │ │ │ +
268
│ │ │ │ +
│ │ │ │ +
270 void resize (size_type _nblocks, size_type m)
│ │ │ │ +
271 {
│ │ │ │ +
272 // deconstruct objects and deallocate memory if necessary
│ │ │ │ +
273 if (this->n>0) {
│ │ │ │ +
274 size_type i=this->n;
│ │ │ │ +
275 while (i)
│ │ │ │ +
276 this->p[--i].~B();
│ │ │ │ +
277 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
278 }
│ │ │ │ +
279 if (nblocks>0) {
│ │ │ │ +
280 size_type i=nblocks;
│ │ │ │ +
281 while (i)
│ │ │ │ +
282 block[--i].~window_type();
│ │ │ │ +
283 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ +
284 }
│ │ │ │ +
285
│ │ │ │ +
286 // and we can allocate the big array in the base class
│ │ │ │ +
287 this->n = _nblocks*m;
│ │ │ │ +
288 if (this->n>0)
│ │ │ │ +
289 {
│ │ │ │ +
290 this->p = allocator_.allocate(this->n);
│ │ │ │ +
291 new (this->p)B[this->n];
│ │ │ │ +
292 }
│ │ │ │ +
293 else
│ │ │ │ +
294 {
│ │ │ │ +
295 this->n = 0;
│ │ │ │ +
296 this->p = nullptr;
│ │ │ │ +
297 }
│ │ │ │ +
298
│ │ │ │ +
299 // we can allocate the windows now
│ │ │ │ +
300 nblocks = _nblocks;
│ │ │ │ +
301 if (nblocks>0)
│ │ │ │ +
302 {
│ │ │ │ +
303 // allocate and construct objects
│ │ │ │ +
304 block = windowAllocator_.allocate(nblocks);
│ │ │ │ +
305 new (block) window_type[nblocks];
│ │ │ │ +
306
│ │ │ │ +
307 // set the windows into the big array
│ │ │ │ +
308 for (size_type i=0; i<nblocks; ++i)
│ │ │ │ +
309 block[i].set(m,this->p+(i*m));
│ │ │ │ +
310 }
│ │ │ │ +
311 else
│ │ │ │ +
312 {
│ │ │ │ +
313 nblocks = 0;
│ │ │ │ +
314 block = nullptr;
│ │ │ │ +
315 }
│ │ │ │ +
316
│ │ │ │ +
317 // and the vector is usable
│ │ │ │ +
318 initialized = true;
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
323 {
│ │ │ │ +
324 if (&a!=this) // check if this and a are different objects
│ │ │ │ +
325 {
│ │ │ │ +
326 // reallocate arrays if necessary
│ │ │ │ +
327 // Note: still the block sizes may vary !
│ │ │ │ +
328 if (this->n!=a.n || nblocks!=a.nblocks)
│ │ │ │ +
329 {
│ │ │ │ +
330 // deconstruct objects and deallocate memory if necessary
│ │ │ │ +
331 if (this->n>0) {
│ │ │ │ +
332 size_type i=this->n;
│ │ │ │ +
333 while (i)
│ │ │ │ +
334 this->p[--i].~B();
│ │ │ │ +
335 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
336 }
│ │ │ │ +
337 if (nblocks>0) {
│ │ │ │ +
338 size_type i=nblocks;
│ │ │ │ +
339 while (i)
│ │ │ │ +
340 block[--i].~window_type();
│ │ │ │ +
341 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ +
342 }
│ │ │ │ +
343
│ │ │ │ +
344 // allocate the big array in the base class
│ │ │ │ +
345 this->n = a.n;
│ │ │ │ +
346 if (this->n>0)
│ │ │ │ +
347 {
│ │ │ │ +
348 // allocate and construct objects
│ │ │ │ +
349 this->p = allocator_.allocate(this->n);
│ │ │ │ +
350 new (this->p)B[this->n];
│ │ │ │ +
351 }
│ │ │ │ +
352 else
│ │ │ │ +
353 {
│ │ │ │ +
354 this->n = 0;
│ │ │ │ +
355 this->p = nullptr;
│ │ │ │ +
356 }
│ │ │ │ +
357
│ │ │ │ +
358 // we can allocate the windows now
│ │ │ │ +
359 nblocks = a.nblocks;
│ │ │ │ +
360 if (nblocks>0)
│ │ │ │ +
361 {
│ │ │ │ +
362 // alloc
│ │ │ │ +
363 block = windowAllocator_.allocate(nblocks);
│ │ │ │ +
364 new (block) window_type[nblocks];
│ │ │ │ +
365 }
│ │ │ │ +
366 else
│ │ │ │ +
367 {
│ │ │ │ +
368 nblocks = 0;
│ │ │ │ +
369 block = nullptr;
│ │ │ │ +
370 }
│ │ │ │ +
371 }
│ │ │ │ +
372
│ │ │ │ +
373 // copy block structure, might be different although
│ │ │ │ +
374 // sizes are the same !
│ │ │ │ +
375 if (nblocks>0)
│ │ │ │ +
376 {
│ │ │ │ +
377 block[0].set(a.block[0].getsize(),this->p); // first block
│ │ │ │ +
378 for (size_type i=1; i<nblocks; ++i) // and the rest
│ │ │ │ +
379 block[i].set(a.block[i].getsize(),block[i-1].getptr()+block[i-1].getsize());
│ │ │ │ +
380 }
│ │ │ │ +
381
│ │ │ │ +
382 // and copy the data
│ │ │ │ +
383 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ +
384 }
│ │ │ │ +
385
│ │ │ │ +
386 // and we have a usable vector
│ │ │ │ +
387 initialized = true;
│ │ │ │ +
388
│ │ │ │ +
389 return *this; // Gebe Referenz zurueck damit a=b=c; klappt
│ │ │ │ +
390 }
│ │ │ │ +
│ │ │ │ +
391
│ │ │ │ +
392
│ │ │ │ +
393 //===== assignment from scalar
│ │ │ │ +
394
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
397 {
│ │ │ │ +
398 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ +
399 return *this;
│ │ │ │ +
400 }
│ │ │ │ +
│ │ │ │ +
401
│ │ │ │ +
402
│ │ │ │ +
403 //===== the creation interface
│ │ │ │ +
404
│ │ │ │ +
405 class CreateIterator;
│ │ │ │ +
406
│ │ │ │ +
407#ifndef DOXYGEN
│ │ │ │ +
408
│ │ │ │ +
409 // The window_type does not hand out a reference to its size,
│ │ │ │ +
410 // so in order to provide a valid iterator, we need a workaround
│ │ │ │ +
411 // to make assignment possible. This proxy enables just that by
│ │ │ │ +
412 // implicitly converting to the stored size for read access and
│ │ │ │ +
413 // tunneling assignment to the accessor method of the window.
│ │ │ │ +
414 struct SizeProxy
│ │ │ │ +
415 {
│ │ │ │ +
416
│ │ │ │ +
417 operator size_type() const
│ │ │ │ +
418 {
│ │ │ │ +
419 return target->getsize();
│ │ │ │ +
420 }
│ │ │ │ +
421
│ │ │ │ +
422 SizeProxy& operator=(size_type size)
│ │ │ │ +
423 {
│ │ │ │ +
424 target->setsize(size);
│ │ │ │ +
425 return *this;
│ │ │ │ +
426 }
│ │ │ │ +
427
│ │ │ │ +
428 private:
│ │ │ │ +
429
│ │ │ │ +
430 friend class CreateIterator;
│ │ │ │ +
431
│ │ │ │ +
432 SizeProxy(window_type& t)
│ │ │ │ +
433 : target(&t)
│ │ │ │ +
434 {}
│ │ │ │ +
435
│ │ │ │ +
436 window_type* target;
│ │ │ │ +
437 };
│ │ │ │ +
438
│ │ │ │ +
439#endif // DOXYGEN
│ │ │ │ +
440
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
443 {
│ │ │ │ +
444 public:
│ │ │ │ +
446 using iterator_category = std::output_iterator_tag;
│ │ │ │ +
447
│ │ │ │ + │ │ │ │ +
450
│ │ │ │ +
457 using difference_type = void;
│ │ │ │ +
458
│ │ │ │ + │ │ │ │ +
461
│ │ │ │ +
463 using reference = SizeProxy;
│ │ │ │ +
464
│ │ │ │ +
│ │ │ │ +
466 CreateIterator (VariableBlockVector& _v, int _i, bool _isEnd) :
│ │ │ │ +
467 v(_v),
│ │ │ │ +
468 i(_i),
│ │ │ │ +
469 isEnd(_isEnd) {}
│ │ │ │ +
│ │ │ │ +
470
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
472 // When the iterator gets destructed, we allocate the memory
│ │ │ │ +
473 // for the VariableBlockVector if
│ │ │ │ +
474 // 1. the current iterator was not created as enditerator
│ │ │ │ +
475 // 2. we're at the last block
│ │ │ │ +
476 // 3. the vector hasn't been initialized earlier
│ │ │ │ +
477 if (not isEnd && i==v.nblocks && not v.initialized)
│ │ │ │ +
478 v.allocate();
│ │ │ │ +
479 }
│ │ │ │ +
│ │ │ │ +
480
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
483 {
│ │ │ │ +
484 // go to next block
│ │ │ │ +
485 ++i;
│ │ │ │ +
486
│ │ │ │ +
487 return *this;
│ │ │ │ +
488 }
│ │ │ │ +
│ │ │ │ +
489
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
492 {
│ │ │ │ +
493 CreateIterator tmp(*this);
│ │ │ │ +
494 this->operator++();
│ │ │ │ +
495 return tmp;
│ │ │ │ +
496 }
│ │ │ │ +
│ │ │ │ +
497
│ │ │ │ +
│ │ │ │ +
499 bool operator!= (const CreateIterator& it) const
│ │ │ │ +
500 {
│ │ │ │ +
501 return (i!=it.i) || (&v!=&it.v);
│ │ │ │ +
502 }
│ │ │ │ +
│ │ │ │ +
503
│ │ │ │ +
│ │ │ │ +
505 bool operator== (const CreateIterator& it) const
│ │ │ │ +
506 {
│ │ │ │ +
507 return (i==it.i) && (&v==&it.v);
│ │ │ │ +
508 }
│ │ │ │ +
│ │ │ │ +
509
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
512 {
│ │ │ │ +
513 return i;
│ │ │ │ +
514 }
│ │ │ │ +
│ │ │ │ +
515
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
518 {
│ │ │ │ +
519 v.block[i].setsize(_k);
│ │ │ │ +
520 }
│ │ │ │ +
│ │ │ │ +
521
│ │ │ │ +
523#ifdef DOXYGEN
│ │ │ │ +
524 size_type&
│ │ │ │ +
525#else
│ │ │ │ +
526 SizeProxy
│ │ │ │ +
527#endif
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
529 {
│ │ │ │ +
530 return {v.block[i]};
│ │ │ │ +
531 }
│ │ │ │ +
│ │ │ │ +
532
│ │ │ │ +
533 private:
│ │ │ │ +
534 VariableBlockVector& v; // my vector
│ │ │ │ +
535 size_type i; // current block to be defined
│ │ │ │ +
536 const bool isEnd; // flag if this object was created as the end iterator.
│ │ │ │ +
537 };
│ │ │ │ +
│ │ │ │ +
538
│ │ │ │ +
539 // CreateIterator wants to set all the arrays ...
│ │ │ │ +
540 friend class CreateIterator;
│ │ │ │ +
541
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
544 {
│ │ │ │ +
545#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
546 if (initialized) DUNE_THROW(ISTLError,"no CreateIterator in initialized state");
│ │ │ │ +
547#endif
│ │ │ │ +
548 return CreateIterator(*this,0, false);
│ │ │ │ +
549 }
│ │ │ │ +
│ │ │ │ +
550
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
553 {
│ │ │ │ +
554 return CreateIterator(*this,nblocks, true);
│ │ │ │ +
555 }
│ │ │ │ +
│ │ │ │ +
556
│ │ │ │ +
557
│ │ │ │ +
558 //===== access to components
│ │ │ │ +
559 // has to be overwritten from base class because it must
│ │ │ │ +
560 // return access to the windows
│ │ │ │ +
561
│ │ │ │ +
│ │ │ │ +
563 window_type& operator[] (size_type i)
│ │ │ │ +
564 {
│ │ │ │ +
565#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
566 if (i>=nblocks) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
567#endif
│ │ │ │ +
568 return block[i];
│ │ │ │ +
569 }
│ │ │ │ +
│ │ │ │ +
570
│ │ │ │ +
│ │ │ │ +
572 const window_type& operator[] (size_type i) const
│ │ │ │ +
573 {
│ │ │ │ +
574#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
575 if (i<0 || i>=nblocks) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
576#endif
│ │ │ │ +
577 return block[i];
│ │ │ │ +
578 }
│ │ │ │ +
│ │ │ │ +
579
│ │ │ │ +
581 template <class T, class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
583 : public RandomAccessIteratorFacade<RealIterator<T,R>, T, R>
│ │ │ │ +
584 {
│ │ │ │ +
585 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
588 {
│ │ │ │ +
589 p = nullptr;
│ │ │ │ +
590 i = 0;
│ │ │ │ +
591 }
│ │ │ │ +
│ │ │ │ +
592
│ │ │ │ +
│ │ │ │ +
594 RealIterator (window_type* _p, size_type _i)
│ │ │ │ +
595 : p(_p), i(_i)
│ │ │ │ +
596 {}
│ │ │ │ +
│ │ │ │ +
597
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
600 {
│ │ │ │ +
601 ++i;
│ │ │ │ +
602 }
│ │ │ │ +
│ │ │ │ +
603
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
606 {
│ │ │ │ +
607 --i;
│ │ │ │ +
608 }
│ │ │ │ +
│ │ │ │ +
609
│ │ │ │ +
│ │ │ │ +
611 bool equals (const RealIterator& it) const
│ │ │ │ +
612 {
│ │ │ │ +
613 return (p+i)==(it.p+it.i);
│ │ │ │ +
614 }
│ │ │ │ +
│ │ │ │ +
615
│ │ │ │ +
│ │ │ │ +
617 window_type& dereference () const
│ │ │ │ +
618 {
│ │ │ │ +
619 return p[i];
│ │ │ │ +
620 }
│ │ │ │ +
│ │ │ │ +
621
│ │ │ │ +
│ │ │ │ +
622 void advance(std::ptrdiff_t d)
│ │ │ │ +
623 {
│ │ │ │ +
624 i+=d;
│ │ │ │ +
625 }
│ │ │ │ +
│ │ │ │ +
626
│ │ │ │ +
│ │ │ │ +
627 std::ptrdiff_t distanceTo(const RealIterator& o) const
│ │ │ │ +
628 {
│ │ │ │ +
629 return o.i-i;
│ │ │ │ +
630 }
│ │ │ │ +
│ │ │ │ +
631
│ │ │ │ +
632 // Needed for operator[] of the iterator
│ │ │ │ +
│ │ │ │ +
633 window_type& elementAt (std::ptrdiff_t offset) const
│ │ │ │ +
634 {
│ │ │ │ +
635 return p[i+offset];
│ │ │ │ +
636 }
│ │ │ │ +
│ │ │ │ +
637
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
640 {
│ │ │ │ +
641 return i;
│ │ │ │ +
642 }
│ │ │ │ +
│ │ │ │ +
643
│ │ │ │ +
644 private:
│ │ │ │ +
645 window_type* p;
│ │ │ │ +
646 size_type i;
│ │ │ │ +
647 };
│ │ │ │ +
│ │ │ │ +
648
│ │ │ │ + │ │ │ │ +
650
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
653 {
│ │ │ │ +
654 return Iterator(block,0);
│ │ │ │ +
655 }
│ │ │ │ +
│ │ │ │ +
656
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
659 {
│ │ │ │ +
660 return Iterator(block,nblocks);
│ │ │ │ +
661 }
│ │ │ │ +
│ │ │ │ +
662
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
666 {
│ │ │ │ +
667 return Iterator(block,nblocks-1);
│ │ │ │ +
668 }
│ │ │ │ +
│ │ │ │ +
669
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
673 {
│ │ │ │ +
674 return Iterator(block,-1);
│ │ │ │ +
675 }
│ │ │ │ +
│ │ │ │ +
676
│ │ │ │ + │ │ │ │ +
679
│ │ │ │ + │ │ │ │ +
682
│ │ │ │ + │ │ │ │ +
685
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
688 {
│ │ │ │ +
689 return ConstIterator(block,0);
│ │ │ │ +
690 }
│ │ │ │ +
│ │ │ │ +
691
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
694 {
│ │ │ │ +
695 return ConstIterator(block,nblocks);
│ │ │ │ +
696 }
│ │ │ │ +
│ │ │ │ +
697
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
701 {
│ │ │ │ +
702 return ConstIterator(block,nblocks-1);
│ │ │ │ +
703 }
│ │ │ │ +
│ │ │ │ +
704
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
707 {
│ │ │ │ +
708 return ConstIterator(block,-1);
│ │ │ │ +
709 }
│ │ │ │ +
│ │ │ │ +
710
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
713 {
│ │ │ │ +
714 return Iterator(block,std::min(i,nblocks));
│ │ │ │ +
715 }
│ │ │ │ +
│ │ │ │ +
716
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
719 {
│ │ │ │ +
720 return ConstIterator(block,std::min(i,nblocks));
│ │ │ │ +
721 }
│ │ │ │ +
│ │ │ │ +
722
│ │ │ │ +
723 //===== sizes
│ │ │ │ +
724
│ │ │ │ +
│ │ │ │ +
726 size_type N () const
│ │ │ │ +
727 {
│ │ │ │ +
728 return nblocks;
│ │ │ │ +
729 }
│ │ │ │ +
│ │ │ │ +
730
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
736 {
│ │ │ │ +
737 return nblocks;
│ │ │ │ +
738 }
│ │ │ │ +
│ │ │ │ +
739
│ │ │ │ +
740
│ │ │ │ +
741 private:
│ │ │ │ +
742
│ │ │ │ +
743 void allocate() {
│ │ │ │ +
744 if (this->initialized)
│ │ │ │ +
745 DUNE_THROW(ISTLError, "Attempt to re-allocate already initialized VariableBlockVector");
│ │ │ │ +
746
│ │ │ │ +
747 // calculate space needed:
│ │ │ │ +
748 this->n=0;
│ │ │ │ +
749 for(size_type i = 0; i < nblocks; i++) {
│ │ │ │ +
750 this->n += block[i].size();
│ │ │ │ +
751 }
│ │ │ │ +
752
│ │ │ │ +
753 // now we can allocate the big array in the base class of v
│ │ │ │ +
754 if (this->n>0)
│ │ │ │ +
755 {
│ │ │ │ +
756 // allocate and construct objects
│ │ │ │ +
757 this->p = allocator_.allocate(this->n);
│ │ │ │ +
758 new (this->p)B[this->n];
│ │ │ │ +
759 }
│ │ │ │ +
760 else
│ │ │ │ +
761 {
│ │ │ │ +
762 this->p = nullptr;
│ │ │ │ +
763 }
│ │ │ │ +
764
│ │ │ │ +
765 // and we set the window pointers
│ │ │ │ +
766 this->block[0].setptr(this->p); // pointer to first block
│ │ │ │ +
767 for (size_type j=1; j<nblocks; ++j) // and the rest
│ │ │ │ +
768 block[j].setptr(block[j-1].getptr()+block[j-1].getsize());
│ │ │ │ +
769
│ │ │ │ +
770 // and the vector is ready
│ │ │ │ +
771 this->initialized = true;
│ │ │ │ +
772 }
│ │ │ │ +
773
│ │ │ │ +
774 size_type nblocks; // number of blocks in vector
│ │ │ │ +
775 window_type* block; // array of blocks pointing to the array in the base class
│ │ │ │ +
776 bool initialized; // true if vector has been initialized
│ │ │ │ +
777
│ │ │ │ +
778 A allocator_;
│ │ │ │ +
779
│ │ │ │ +
780 typename std::allocator_traits<A>::template rebind_alloc<window_type> windowAllocator_;
│ │ │ │ +
781 };
│ │ │ │ +
│ │ │ │ +
782
│ │ │ │ +
783
│ │ │ │ +
784
│ │ │ │ +
787} // end namespace
│ │ │ │ +
788
│ │ │ │ +
789#endif
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ -
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ -
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ -
A subgraph of a graph.
Definition graph.hh:443
│ │ │ │ -
EdgeIndexMap getEdgeIndexMap()
Get an edge index map for the graph.
│ │ │ │ -
An index map for mapping the edges to indices.
Definition graph.hh:470
│ │ │ │ -
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ -
Definition graphcreator.hh:22
│ │ │ │ -
Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph
Definition graphcreator.hh:26
│ │ │ │ -
Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties, IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph
Definition graphcreator.hh:32
│ │ │ │ -
M::matrix_type Matrix
Definition graphcreator.hh:23
│ │ │ │ -
static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of)
Definition graphcreator.hh:37
│ │ │ │ -
static void free(GraphTuple &graphs)
Definition graphcreator.hh:53
│ │ │ │ -
Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
Definition graphcreator.hh:24
│ │ │ │ -
std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple
Definition graphcreator.hh:34
│ │ │ │ -
Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
Definition graphcreator.hh:65
│ │ │ │ -
M::matrix_type Matrix
Definition graphcreator.hh:63
│ │ │ │ -
Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties, IdentityMap, IdentityMap > PropertiesGraph
Definition graphcreator.hh:71
│ │ │ │ -
std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple
Definition graphcreator.hh:73
│ │ │ │ -
static GraphTuple create(const M &matrix, T &excluded, const SequentialInformation &pinfo, const OF &)
Definition graphcreator.hh:76
│ │ │ │ -
static void free(GraphTuple &graphs)
Definition graphcreator.hh:86
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
A Vector of blocks with different blocksizes.
Definition vbvector.hh:46
│ │ │ │ +
RealIterator< value_type, window_type & > Iterator
Definition vbvector.hh:649
│ │ │ │ +
VariableBlockVector()
Definition vbvector.hh:97
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition vbvector.hh:55
│ │ │ │ +
A allocator_type
export the allocator type
Definition vbvector.hh:58
│ │ │ │ +
VariableBlockVector(size_type _nblocks, size_type m)
Definition vbvector.hh:134
│ │ │ │ +
size_type size() const
Definition vbvector.hh:735
│ │ │ │ +
size_type N() const
number of blocks in the vector (are of variable size here)
Definition vbvector.hh:726
│ │ │ │ +
VariableBlockVector(const VariableBlockVector &a)
copy constructor, has copy semantics
Definition vbvector.hh:172
│ │ │ │ +
VariableBlockVector(size_type _nblocks)
Definition vbvector.hh:108
│ │ │ │ +
~VariableBlockVector()
free dynamic memory
Definition vbvector.hh:215
│ │ │ │ +
window_type & operator[](size_type i)
random access to blocks
Definition vbvector.hh:563
│ │ │ │ +
CreateIterator createend()
get create iterator pointing to one after the last block
Definition vbvector.hh:552
│ │ │ │ +
Iterator beforeBegin() const
Definition vbvector.hh:672
│ │ │ │ +
CreateIterator createbegin()
get initial create iterator
Definition vbvector.hh:543
│ │ │ │ +
VariableBlockVector & operator=(const VariableBlockVector &a)
assignment
Definition vbvector.hh:322
│ │ │ │ +
static constexpr auto blocklevel
Definition vbvector.hh:90
│ │ │ │ +
ConstIterator rend() const
end ConstIterator
Definition vbvector.hh:706
│ │ │ │ +
A::size_type size_type
The size type for the index access.
Definition vbvector.hh:73
│ │ │ │ +
ConstIterator find(size_type i) const
random access returning iterator (end if not contained)
Definition vbvector.hh:718
│ │ │ │ +
ConstIterator beforeEnd() const
Definition vbvector.hh:700
│ │ │ │ +
Iterator find(size_type i)
random access returning iterator (end if not contained)
Definition vbvector.hh:712
│ │ │ │ +
const window_type & const_reference
Export type used for const references to container entries.
Definition vbvector.hh:70
│ │ │ │ +
RealIterator< const value_type, const window_type & > ConstIterator
Const iterator.
Definition vbvector.hh:681
│ │ │ │ +
Iterator end()
end Iterator
Definition vbvector.hh:658
│ │ │ │ +
ConstIterator begin() const
begin ConstIterator
Definition vbvector.hh:687
│ │ │ │ +
BlockVector< B, A > value_type
Type of the elements of the outer vector, i.e., dynamic vectors of B.
Definition vbvector.hh:80
│ │ │ │ +
ConstIterator end() const
end ConstIterator
Definition vbvector.hh:693
│ │ │ │ +
BlockVector< B, A > block_type
Same as value_type, here for historical reasons.
Definition vbvector.hh:84
│ │ │ │ +
void resize(size_type _nblocks, size_type m)
same effect as constructor with same argument
Definition vbvector.hh:270
│ │ │ │ +
window_type & reference
Export type used for references to container entries.
Definition vbvector.hh:64
│ │ │ │ +
void resize(size_type _nblocks)
same effect as constructor with same argument
Definition vbvector.hh:234
│ │ │ │ +
Iterator beforeEnd()
Definition vbvector.hh:665
│ │ │ │ +
Iterator begin()
begin Iterator
Definition vbvector.hh:652
│ │ │ │ +
Iterator class for sequential creation of blocks.
Definition vbvector.hh:443
│ │ │ │ +
bool operator==(const CreateIterator &it) const
equality
Definition vbvector.hh:505
│ │ │ │ +
size_type index() const
dereferencing
Definition vbvector.hh:511
│ │ │ │ +
SizeProxy reference
reference type
Definition vbvector.hh:463
│ │ │ │ +
size_type * pointer
pointer type
Definition vbvector.hh:460
│ │ │ │ +
bool operator!=(const CreateIterator &it) const
inequality
Definition vbvector.hh:499
│ │ │ │ +
~CreateIterator()
Definition vbvector.hh:471
│ │ │ │ +
size_type value_type
value type
Definition vbvector.hh:449
│ │ │ │ +
CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd)
constructor
Definition vbvector.hh:466
│ │ │ │ +
void setblocksize(size_type _k)
set size of current block
Definition vbvector.hh:517
│ │ │ │ +
size_type & operator*()
Access size of current block.
Definition vbvector.hh:528
│ │ │ │ +
std::output_iterator_tag iterator_category
iterator category
Definition vbvector.hh:446
│ │ │ │ +
CreateIterator & operator++()
prefix increment
Definition vbvector.hh:482
│ │ │ │ +
void difference_type
difference type (unused)
Definition vbvector.hh:457
│ │ │ │ +
Iterator class for sequential access.
Definition vbvector.hh:584
│ │ │ │ +
RealIterator(window_type *_p, size_type _i)
constructor
Definition vbvector.hh:594
│ │ │ │ +
bool equals(const RealIterator &it) const
equality
Definition vbvector.hh:611
│ │ │ │ +
size_type index() const
Return the index of the entry this iterator is pointing to.
Definition vbvector.hh:639
│ │ │ │ +
window_type & elementAt(std::ptrdiff_t offset) const
Definition vbvector.hh:633
│ │ │ │ +
void decrement()
prefix decrement
Definition vbvector.hh:605
│ │ │ │ +
void advance(std::ptrdiff_t d)
Definition vbvector.hh:622
│ │ │ │ +
void increment()
prefix increment
Definition vbvector.hh:599
│ │ │ │ +
RealIterator()
constructor, no arguments
Definition vbvector.hh:587
│ │ │ │ +
std::ptrdiff_t distanceTo(const RealIterator &o) const
Definition vbvector.hh:627
│ │ │ │ +
window_type & dereference() const
dereferencing
Definition vbvector.hh:617
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,188 +1,930 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -graphcreator.hh │ │ │ │ │ +vbvector.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_GRAPHCREATOR_HH │ │ │ │ │ -6#define DUNE_AMG_GRAPHCREATOR_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_VBVECTOR_HH │ │ │ │ │ +6#define DUNE_ISTL_VBVECTOR_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -11#include "_d_e_p_e_n_d_e_n_c_y_._h_h" │ │ │ │ │ -12#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -13#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e │ │ │ │ │ -17{ │ │ │ │ │ -18 namespace Amg │ │ │ │ │ -19 { │ │ │ │ │ -20 template │ │ │ │ │ -_2_1 struct _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ -22 { │ │ │ │ │ -_2_3 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ -_2_4 typedef _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_a_t_r_i_x_> _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ -25 typedef _D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h, │ │ │ │ │ -_2_6 std::vector > _S_u_b_G_r_a_p_h; │ │ │ │ │ -27 typedef _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_S_u_b_G_r_a_p_h, │ │ │ │ │ -28 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -29 _E_d_g_e_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -30 IdentityMap, │ │ │ │ │ -31 typename _S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p> │ │ │ │ │ -_3_2 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ -33 │ │ │ │ │ -_3_4 typedef std::tuple _G_r_a_p_h_T_u_p_l_e; │ │ │ │ │ -35 │ │ │ │ │ -36 template │ │ │ │ │ -_3_7 static _G_r_a_p_h_T_u_p_l_e _c_r_e_a_t_e(const M& matrix, T& excluded, │ │ │ │ │ -38 PI& pinfo, const OF& of) │ │ │ │ │ -39 { │ │ │ │ │ -40 _M_a_t_r_i_x_G_r_a_p_h* mg = new _M_a_t_r_i_x_G_r_a_p_h(matrix.getmat()); │ │ │ │ │ -41 typedef typename PI::ParallelIndexSet ParallelIndexSet; │ │ │ │ │ -42 typedef typename ParallelIndexSet::const_iterator IndexIterator; │ │ │ │ │ -43 IndexIterator iend = pinfo.indexSet().end(); │ │ │ │ │ -44 │ │ │ │ │ -45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index) │ │ │ │ │ -46 excluded[index->local()] = of.contains(index->local().attribute()); │ │ │ │ │ -47 │ │ │ │ │ -48 _S_u_b_G_r_a_p_h* sg= new _S_u_b_G_r_a_p_h(*mg, excluded); │ │ │ │ │ -49 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h* pg = new _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(*sg, IdentityMap(), sg- │ │ │ │ │ ->_g_e_t_E_d_g_e_I_n_d_e_x_M_a_p()); │ │ │ │ │ -50 return _G_r_a_p_h_T_u_p_l_e(mg,pg,sg); │ │ │ │ │ -51 } │ │ │ │ │ -52 │ │ │ │ │ -_5_3 static void _f_r_e_e(_G_r_a_p_h_T_u_p_l_e& graphs) │ │ │ │ │ -54 { │ │ │ │ │ -55 delete std::get<2>(graphs); │ │ │ │ │ -56 delete std::get<1>(graphs); │ │ │ │ │ -57 } │ │ │ │ │ -58 }; │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +16#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +19 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25 │ │ │ │ │ +41 template > │ │ │ │ │ +_4_2 class _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r : public Imp::block_vector_unmanaged │ │ │ │ │ +43 // this derivation gives us all the blas level 1 and norms │ │ │ │ │ +44 // on the large array. However, access operators have to be │ │ │ │ │ +45 // overwritten. │ │ │ │ │ +46 { │ │ │ │ │ +47 // just a shorthand │ │ │ │ │ +48 typedef Imp::BlockVectorWindow window_type; │ │ │ │ │ +49 │ │ │ │ │ +50 public: │ │ │ │ │ +51 │ │ │ │ │ +52 //===== type definitions and constants │ │ │ │ │ +53 │ │ │ │ │ +_5_5 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +56 │ │ │ │ │ +_5_8 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ 59 │ │ │ │ │ -60 template │ │ │ │ │ -_6_1 struct _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ -62 { │ │ │ │ │ -_6_3 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ -64 │ │ │ │ │ -_6_5 typedef _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _M_a_t_r_i_x_> _M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ -66 │ │ │ │ │ -67 typedef _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h, │ │ │ │ │ -68 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -69 _E_d_g_e_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -70 IdentityMap, │ │ │ │ │ -_7_1 IdentityMap> _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ -72 │ │ │ │ │ -_7_3 typedef std::tuple _G_r_a_p_h_T_u_p_l_e; │ │ │ │ │ +_6_4 typedef window_type& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ +65 │ │ │ │ │ +_7_0 typedef const window_type& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +71 │ │ │ │ │ +_7_3 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ 74 │ │ │ │ │ -75 template │ │ │ │ │ -_7_6 static _G_r_a_p_h_T_u_p_l_e _c_r_e_a_t_e([[maybe_unused]] const M& matrix, │ │ │ │ │ -77 [[maybe_unused]] T& excluded, │ │ │ │ │ -78 [[maybe_unused]] const _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -79 const OF&) │ │ │ │ │ -80 { │ │ │ │ │ -81 _M_a_t_r_i_x_G_r_a_p_h* mg = new _M_a_t_r_i_x_G_r_a_p_h(matrix.getmat()); │ │ │ │ │ -82 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h* pg = new _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h(*mg, IdentityMap(), IdentityMap │ │ │ │ │ -()); │ │ │ │ │ -83 return _G_r_a_p_h_T_u_p_l_e(mg,pg); │ │ │ │ │ -84 } │ │ │ │ │ +_8_0 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +81 │ │ │ │ │ +_8_4 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _b_l_o_c_k___t_y_p_e; │ │ │ │ │ 85 │ │ │ │ │ -_8_6 static void _f_r_e_e(_G_r_a_p_h_T_u_p_l_e& graphs) │ │ │ │ │ -87 { │ │ │ │ │ -88 delete std::get<1>(graphs); │ │ │ │ │ -89 } │ │ │ │ │ -90 │ │ │ │ │ -91 }; │ │ │ │ │ -92 │ │ │ │ │ -93 } //namespace Amg │ │ │ │ │ -94} // namespace Dune │ │ │ │ │ -95#endif │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_g_r_a_p_h_._h_h │ │ │ │ │ -Provides classes for building the matrix graph. │ │ │ │ │ -_p_i_n_f_o_._h_h │ │ │ │ │ -_d_e_p_e_n_d_e_n_c_y_._h_h │ │ │ │ │ -Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ +89 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]] │ │ │ │ │ +_9_0 static constexpr auto _b_l_o_c_k_l_e_v_e_l = blockLevel()+2; │ │ │ │ │ +91 │ │ │ │ │ +92 //===== constructors and such │ │ │ │ │ +93 │ │ │ │ │ +_9_7 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r () : Imp::block_vector_unmanaged() │ │ │ │ │ +98 { │ │ │ │ │ +99 // nothing is known ... │ │ │ │ │ +100 nblocks = 0; │ │ │ │ │ +101 block = nullptr; │ │ │ │ │ +102 initialized = false; │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +_1_0_8 explicit _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _nblocks) : Imp:: │ │ │ │ │ +block_vector_unmanaged() │ │ │ │ │ +109 { │ │ │ │ │ +110 // we can allocate the windows now │ │ │ │ │ +111 nblocks = _nblocks; │ │ │ │ │ +112 if (nblocks>0) │ │ │ │ │ +113 { │ │ │ │ │ +114 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ +115 new (block) window_type[nblocks]; │ │ │ │ │ +116 } │ │ │ │ │ +117 else │ │ │ │ │ +118 { │ │ │ │ │ +119 nblocks = 0; │ │ │ │ │ +120 block = nullptr; │ │ │ │ │ +121 } │ │ │ │ │ +122 │ │ │ │ │ +123 // Note: memory in base class still not allocated │ │ │ │ │ +124 // the vector not usable │ │ │ │ │ +125 initialized = false; │ │ │ │ │ +126 } │ │ │ │ │ +127 │ │ │ │ │ +_1_3_4 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _nblocks, _s_i_z_e___t_y_p_e m) : Imp:: │ │ │ │ │ +block_vector_unmanaged() │ │ │ │ │ +135 { │ │ │ │ │ +136 // and we can allocate the big array in the base class │ │ │ │ │ +137 this->n = _nblocks*m; │ │ │ │ │ +138 if (this->n>0) │ │ │ │ │ +139 { │ │ │ │ │ +140 this->p = allocator_.allocate(this->n); │ │ │ │ │ +141 new (this->p)B[this->n]; │ │ │ │ │ +142 } │ │ │ │ │ +143 else │ │ │ │ │ +144 { │ │ │ │ │ +145 this->n = 0; │ │ │ │ │ +146 this->p = nullptr; │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +149 // we can allocate the windows now │ │ │ │ │ +150 nblocks = _nblocks; │ │ │ │ │ +151 if (nblocks>0) │ │ │ │ │ +152 { │ │ │ │ │ +153 // allocate and construct the windows │ │ │ │ │ +154 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ +155 new (block) window_type[nblocks]; │ │ │ │ │ +156 │ │ │ │ │ +157 // set the windows into the big array │ │ │ │ │ +158 for (_s_i_z_e___t_y_p_e i=0; ip+(i*m)); │ │ │ │ │ +160 } │ │ │ │ │ +161 else │ │ │ │ │ +162 { │ │ │ │ │ +163 nblocks = 0; │ │ │ │ │ +164 block = nullptr; │ │ │ │ │ +165 } │ │ │ │ │ +166 │ │ │ │ │ +167 // and the vector is usable │ │ │ │ │ +168 initialized = true; │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +_1_7_2 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r (const _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& a) │ │ │ │ │ +173 { │ │ │ │ │ +174 // allocate the big array in the base class │ │ │ │ │ +175 this->n = a.n; │ │ │ │ │ +176 if (this->n>0) │ │ │ │ │ +177 { │ │ │ │ │ +178 // allocate and construct objects │ │ │ │ │ +179 this->p = allocator_.allocate(this->n); │ │ │ │ │ +180 new (this->p)B[this->n]; │ │ │ │ │ +181 │ │ │ │ │ +182 // copy data │ │ │ │ │ +183 for (_s_i_z_e___t_y_p_e i=0; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ +184 } │ │ │ │ │ +185 else │ │ │ │ │ +186 { │ │ │ │ │ +187 this->n = 0; │ │ │ │ │ +188 this->p = nullptr; │ │ │ │ │ +189 } │ │ │ │ │ +190 │ │ │ │ │ +191 // we can allocate the windows now │ │ │ │ │ +192 nblocks = a.nblocks; │ │ │ │ │ +193 if (nblocks>0) │ │ │ │ │ +194 { │ │ │ │ │ +195 // alloc │ │ │ │ │ +196 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ +197 new (block) window_type[nblocks]; │ │ │ │ │ +198 │ │ │ │ │ +199 // and we must set the windows │ │ │ │ │ +200 block[0].set(a.block[0].getsize(),this->p); // first block │ │ │ │ │ +201 for (_s_i_z_e___t_y_p_e i=1; in>0) { │ │ │ │ │ +218 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +219 while (i) │ │ │ │ │ +220 this->p[--i].~B(); │ │ │ │ │ +221 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +222 } │ │ │ │ │ +223 if (nblocks>0) { │ │ │ │ │ +224 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ +225 while (i) │ │ │ │ │ +226 block[--i].~window_type(); │ │ │ │ │ +227 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ +228 } │ │ │ │ │ +229 │ │ │ │ │ +230 } │ │ │ │ │ +231 │ │ │ │ │ +232 │ │ │ │ │ +_2_3_4 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e _nblocks) │ │ │ │ │ +235 { │ │ │ │ │ +236 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ +237 if (this->n>0) { │ │ │ │ │ +238 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +239 while (i) │ │ │ │ │ +240 this->p[--i].~B(); │ │ │ │ │ +241 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +242 } │ │ │ │ │ +243 if (nblocks>0) { │ │ │ │ │ +244 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ +245 while (i) │ │ │ │ │ +246 block[--i].~window_type(); │ │ │ │ │ +247 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ +248 } │ │ │ │ │ +249 this->n = 0; │ │ │ │ │ +250 this->p = nullptr; │ │ │ │ │ +251 │ │ │ │ │ +252 // we can allocate the windows now │ │ │ │ │ +253 nblocks = _nblocks; │ │ │ │ │ +254 if (nblocks>0) │ │ │ │ │ +255 { │ │ │ │ │ +256 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ +257 new (block) window_type[nblocks]; │ │ │ │ │ +258 } │ │ │ │ │ +259 else │ │ │ │ │ +260 { │ │ │ │ │ +261 nblocks = 0; │ │ │ │ │ +262 block = nullptr; │ │ │ │ │ +263 } │ │ │ │ │ +264 │ │ │ │ │ +265 // and the vector not fully usable │ │ │ │ │ +266 initialized = false; │ │ │ │ │ +267 } │ │ │ │ │ +268 │ │ │ │ │ +_2_7_0 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e _nblocks, _s_i_z_e___t_y_p_e m) │ │ │ │ │ +271 { │ │ │ │ │ +272 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ +273 if (this->n>0) { │ │ │ │ │ +274 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +275 while (i) │ │ │ │ │ +276 this->p[--i].~B(); │ │ │ │ │ +277 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +278 } │ │ │ │ │ +279 if (nblocks>0) { │ │ │ │ │ +280 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ +281 while (i) │ │ │ │ │ +282 block[--i].~window_type(); │ │ │ │ │ +283 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ +284 } │ │ │ │ │ +285 │ │ │ │ │ +286 // and we can allocate the big array in the base class │ │ │ │ │ +287 this->n = _nblocks*m; │ │ │ │ │ +288 if (this->n>0) │ │ │ │ │ +289 { │ │ │ │ │ +290 this->p = allocator_.allocate(this->n); │ │ │ │ │ +291 new (this->p)B[this->n]; │ │ │ │ │ +292 } │ │ │ │ │ +293 else │ │ │ │ │ +294 { │ │ │ │ │ +295 this->n = 0; │ │ │ │ │ +296 this->p = nullptr; │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +299 // we can allocate the windows now │ │ │ │ │ +300 nblocks = _nblocks; │ │ │ │ │ +301 if (nblocks>0) │ │ │ │ │ +302 { │ │ │ │ │ +303 // allocate and construct objects │ │ │ │ │ +304 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ +305 new (block) window_type[nblocks]; │ │ │ │ │ +306 │ │ │ │ │ +307 // set the windows into the big array │ │ │ │ │ +308 for (_s_i_z_e___t_y_p_e i=0; ip+(i*m)); │ │ │ │ │ +310 } │ │ │ │ │ +311 else │ │ │ │ │ +312 { │ │ │ │ │ +313 nblocks = 0; │ │ │ │ │ +314 block = nullptr; │ │ │ │ │ +315 } │ │ │ │ │ +316 │ │ │ │ │ +317 // and the vector is usable │ │ │ │ │ +318 initialized = true; │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +_3_2_2 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& a) │ │ │ │ │ +323 { │ │ │ │ │ +324 if (&a!=this) // check if this and a are different objects │ │ │ │ │ +325 { │ │ │ │ │ +326 // reallocate arrays if necessary │ │ │ │ │ +327 // Note: still the block sizes may vary ! │ │ │ │ │ +328 if (this->n!=a.n || nblocks!=a.nblocks) │ │ │ │ │ +329 { │ │ │ │ │ +330 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ +331 if (this->n>0) { │ │ │ │ │ +332 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +333 while (i) │ │ │ │ │ +334 this->p[--i].~B(); │ │ │ │ │ +335 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +336 } │ │ │ │ │ +337 if (nblocks>0) { │ │ │ │ │ +338 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ +339 while (i) │ │ │ │ │ +340 block[--i].~window_type(); │ │ │ │ │ +341 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ +342 } │ │ │ │ │ +343 │ │ │ │ │ +344 // allocate the big array in the base class │ │ │ │ │ +345 this->n = a.n; │ │ │ │ │ +346 if (this->n>0) │ │ │ │ │ +347 { │ │ │ │ │ +348 // allocate and construct objects │ │ │ │ │ +349 this->p = allocator_.allocate(this->n); │ │ │ │ │ +350 new (this->p)B[this->n]; │ │ │ │ │ +351 } │ │ │ │ │ +352 else │ │ │ │ │ +353 { │ │ │ │ │ +354 this->n = 0; │ │ │ │ │ +355 this->p = nullptr; │ │ │ │ │ +356 } │ │ │ │ │ +357 │ │ │ │ │ +358 // we can allocate the windows now │ │ │ │ │ +359 nblocks = a.nblocks; │ │ │ │ │ +360 if (nblocks>0) │ │ │ │ │ +361 { │ │ │ │ │ +362 // alloc │ │ │ │ │ +363 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ +364 new (block) window_type[nblocks]; │ │ │ │ │ +365 } │ │ │ │ │ +366 else │ │ │ │ │ +367 { │ │ │ │ │ +368 nblocks = 0; │ │ │ │ │ +369 block = nullptr; │ │ │ │ │ +370 } │ │ │ │ │ +371 } │ │ │ │ │ +372 │ │ │ │ │ +373 // copy block structure, might be different although │ │ │ │ │ +374 // sizes are the same ! │ │ │ │ │ +375 if (nblocks>0) │ │ │ │ │ +376 { │ │ │ │ │ +377 block[0].set(a.block[0].getsize(),this->p); // first block │ │ │ │ │ +378 for (_s_i_z_e___t_y_p_e i=1; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ +384 } │ │ │ │ │ +385 │ │ │ │ │ +386 // and we have a usable vector │ │ │ │ │ +387 initialized = true; │ │ │ │ │ +388 │ │ │ │ │ +389 return *this; // Gebe Referenz zurueck damit a=b=c; klappt │ │ │ │ │ +390 } │ │ │ │ │ +391 │ │ │ │ │ +392 │ │ │ │ │ +393 //===== assignment from scalar │ │ │ │ │ +394 │ │ │ │ │ +_3_9_6 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +397 { │ │ │ │ │ +398 (static_cast&>(*this)) = k; │ │ │ │ │ +399 return *this; │ │ │ │ │ +400 } │ │ │ │ │ +401 │ │ │ │ │ +402 │ │ │ │ │ +403 //===== the creation interface │ │ │ │ │ +404 │ │ │ │ │ +405 class CreateIterator; │ │ │ │ │ +406 │ │ │ │ │ +407#ifndef DOXYGEN │ │ │ │ │ +408 │ │ │ │ │ +409 // The window_type does not hand out a reference to its size, │ │ │ │ │ +410 // so in order to provide a valid iterator, we need a workaround │ │ │ │ │ +411 // to make assignment possible. This proxy enables just that by │ │ │ │ │ +412 // implicitly converting to the stored size for read access and │ │ │ │ │ +413 // tunneling assignment to the accessor method of the window. │ │ │ │ │ +414 struct SizeProxy │ │ │ │ │ +415 { │ │ │ │ │ +416 │ │ │ │ │ +417 operator size_type() const │ │ │ │ │ +418 { │ │ │ │ │ +419 return target->getsize(); │ │ │ │ │ +420 } │ │ │ │ │ +421 │ │ │ │ │ +422 SizeProxy& operator=(size_type size) │ │ │ │ │ +423 { │ │ │ │ │ +424 target->setsize(size); │ │ │ │ │ +425 return *this; │ │ │ │ │ +426 } │ │ │ │ │ +427 │ │ │ │ │ +428 private: │ │ │ │ │ +429 │ │ │ │ │ +430 friend class CreateIterator; │ │ │ │ │ +431 │ │ │ │ │ +432 SizeProxy(window_type& t) │ │ │ │ │ +433 : target(&t) │ │ │ │ │ +434 {} │ │ │ │ │ +435 │ │ │ │ │ +436 window_type* target; │ │ │ │ │ +437 }; │ │ │ │ │ +438 │ │ │ │ │ +439#endif // DOXYGEN │ │ │ │ │ +440 │ │ │ │ │ +_4_4_2 class _C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +443 { │ │ │ │ │ +444 public: │ │ │ │ │ +_4_4_6 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::output_iterator_tag; │ │ │ │ │ +447 │ │ │ │ │ +_4_4_9 using _v_a_l_u_e___t_y_p_e = _s_i_z_e___t_y_p_e; │ │ │ │ │ +450 │ │ │ │ │ +_4_5_7 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = void; │ │ │ │ │ +458 │ │ │ │ │ +_4_6_0 using _p_o_i_n_t_e_r = _s_i_z_e___t_y_p_e*; │ │ │ │ │ +461 │ │ │ │ │ +_4_6_3 using _r_e_f_e_r_e_n_c_e = SizeProxy; │ │ │ │ │ +464 │ │ │ │ │ +_4_6_6 _C_r_e_a_t_e_I_t_e_r_a_t_o_r (_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& _v, int _i, bool _isEnd) : │ │ │ │ │ +467 v(_v), │ │ │ │ │ +468 i(_i), │ │ │ │ │ +469 isEnd(_isEnd) {} │ │ │ │ │ +470 │ │ │ │ │ +_4_7_1 _~_C_r_e_a_t_e_I_t_e_r_a_t_o_r() { │ │ │ │ │ +472 // When the iterator gets destructed, we allocate the memory │ │ │ │ │ +473 // for the VariableBlockVector if │ │ │ │ │ +474 // 1. the current iterator was not created as enditerator │ │ │ │ │ +475 // 2. we're at the last block │ │ │ │ │ +476 // 3. the vector hasn't been initialized earlier │ │ │ │ │ +477 if (not isEnd && i==v.nblocks && not v.initialized) │ │ │ │ │ +478 v.allocate(); │ │ │ │ │ +479 } │ │ │ │ │ +480 │ │ │ │ │ +_4_8_2 _C_r_e_a_t_e_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +483 { │ │ │ │ │ +484 // go to next block │ │ │ │ │ +485 ++i; │ │ │ │ │ +486 │ │ │ │ │ +487 return *this; │ │ │ │ │ +488 } │ │ │ │ │ +489 │ │ │ │ │ +_4_9_1 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_+_+_ (int) │ │ │ │ │ +492 { │ │ │ │ │ +493 _C_r_e_a_t_e_I_t_e_r_a_t_o_r tmp(*this); │ │ │ │ │ +494 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ +495 return tmp; │ │ │ │ │ +496 } │ │ │ │ │ +497 │ │ │ │ │ +_4_9_9 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +500 { │ │ │ │ │ +501 return (i!=it.i) || (&v!=&it.v); │ │ │ │ │ +502 } │ │ │ │ │ +503 │ │ │ │ │ +_5_0_5 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +506 { │ │ │ │ │ +507 return (i==it.i) && (&v==&it.v); │ │ │ │ │ +508 } │ │ │ │ │ +509 │ │ │ │ │ +_5_1_1 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ +512 { │ │ │ │ │ +513 return i; │ │ │ │ │ +514 } │ │ │ │ │ +515 │ │ │ │ │ +_5_1_7 void _s_e_t_b_l_o_c_k_s_i_z_e (_s_i_z_e___t_y_p_e _k) │ │ │ │ │ +518 { │ │ │ │ │ +519 v.block[i].setsize(_k); │ │ │ │ │ +520 } │ │ │ │ │ +521 │ │ │ │ │ +523#ifdef DOXYGEN │ │ │ │ │ +524 _s_i_z_e___t_y_p_e& │ │ │ │ │ +525#else │ │ │ │ │ +526 SizeProxy │ │ │ │ │ +527#endif │ │ │ │ │ +_5_2_8 _o_p_e_r_a_t_o_r_*() │ │ │ │ │ +529 { │ │ │ │ │ +530 return {v.block[i]}; │ │ │ │ │ +531 } │ │ │ │ │ +532 │ │ │ │ │ +533 private: │ │ │ │ │ +534 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& v; // my vector │ │ │ │ │ +535 _s_i_z_e___t_y_p_e i; // current block to be defined │ │ │ │ │ +536 const bool isEnd; // flag if this object was created as the end iterator. │ │ │ │ │ +537 }; │ │ │ │ │ +538 │ │ │ │ │ +539 // CreateIterator wants to set all the arrays ... │ │ │ │ │ +_5_4_0 friend class _C_r_e_a_t_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +541 │ │ │ │ │ +_5_4_3 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_b_e_g_i_n () │ │ │ │ │ +544 { │ │ │ │ │ +545#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +546 if (initialized) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"no CreateIterator in initialized │ │ │ │ │ +state"); │ │ │ │ │ +547#endif │ │ │ │ │ +548 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,0, false); │ │ │ │ │ +549 } │ │ │ │ │ +550 │ │ │ │ │ +_5_5_2 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_e_n_d () │ │ │ │ │ +553 { │ │ │ │ │ +554 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,nblocks, true); │ │ │ │ │ +555 } │ │ │ │ │ +556 │ │ │ │ │ +557 │ │ │ │ │ +558 //===== access to components │ │ │ │ │ +559 // has to be overwritten from base class because it must │ │ │ │ │ +560 // return access to the windows │ │ │ │ │ +561 │ │ │ │ │ +_5_6_3 window_type& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +564 { │ │ │ │ │ +565#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +566 if (i>=nblocks) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ +567#endif │ │ │ │ │ +568 return block[i]; │ │ │ │ │ +569 } │ │ │ │ │ +570 │ │ │ │ │ +_5_7_2 const window_type& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +573 { │ │ │ │ │ +574#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +575 if (i<0 || i>=nblocks) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ +576#endif │ │ │ │ │ +577 return block[i]; │ │ │ │ │ +578 } │ │ │ │ │ +579 │ │ │ │ │ +581 template │ │ │ │ │ +_5_8_2 class _R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ +583 : public RandomAccessIteratorFacade, T, R> │ │ │ │ │ +584 { │ │ │ │ │ +585 public: │ │ │ │ │ +_5_8_7 _R_e_a_l_I_t_e_r_a_t_o_r () │ │ │ │ │ +588 { │ │ │ │ │ +589 p = nullptr; │ │ │ │ │ +590 i = 0; │ │ │ │ │ +591 } │ │ │ │ │ +592 │ │ │ │ │ +_5_9_4 _R_e_a_l_I_t_e_r_a_t_o_r (window_type* _p, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ +595 : p(_p), i(_i) │ │ │ │ │ +596 {} │ │ │ │ │ +597 │ │ │ │ │ +_5_9_9 void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +600 { │ │ │ │ │ +601 ++i; │ │ │ │ │ +602 } │ │ │ │ │ +603 │ │ │ │ │ +_6_0_5 void _d_e_c_r_e_m_e_n_t() │ │ │ │ │ +606 { │ │ │ │ │ +607 --i; │ │ │ │ │ +608 } │ │ │ │ │ +609 │ │ │ │ │ +_6_1_1 bool _e_q_u_a_l_s (const _R_e_a_l_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +612 { │ │ │ │ │ +613 return (p+i)==(it.p+it.i); │ │ │ │ │ +614 } │ │ │ │ │ +615 │ │ │ │ │ +_6_1_7 window_type& _d_e_r_e_f_e_r_e_n_c_e () const │ │ │ │ │ +618 { │ │ │ │ │ +619 return p[i]; │ │ │ │ │ +620 } │ │ │ │ │ +621 │ │ │ │ │ +_6_2_2 void _a_d_v_a_n_c_e(std::ptrdiff_t d) │ │ │ │ │ +623 { │ │ │ │ │ +624 i+=d; │ │ │ │ │ +625 } │ │ │ │ │ +626 │ │ │ │ │ +_6_2_7 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _R_e_a_l_I_t_e_r_a_t_o_r& o) const │ │ │ │ │ +628 { │ │ │ │ │ +629 return o.i-i; │ │ │ │ │ +630 } │ │ │ │ │ +631 │ │ │ │ │ +632 // Needed for operator[] of the iterator │ │ │ │ │ +_6_3_3 window_type& _e_l_e_m_e_n_t_A_t (std::ptrdiff_t offset) const │ │ │ │ │ +634 { │ │ │ │ │ +635 return p[i+offset]; │ │ │ │ │ +636 } │ │ │ │ │ +637 │ │ │ │ │ +_6_3_9 _s_i_z_e___t_y_p_e _i_n_d_e_x() const │ │ │ │ │ +640 { │ │ │ │ │ +641 return i; │ │ │ │ │ +642 } │ │ │ │ │ +643 │ │ │ │ │ +644 private: │ │ │ │ │ +645 window_type* p; │ │ │ │ │ +646 _s_i_z_e___t_y_p_e i; │ │ │ │ │ +647 }; │ │ │ │ │ +648 │ │ │ │ │ +_6_4_9 using _I_t_e_r_a_t_o_r = _R_e_a_l_I_t_e_r_a_t_o_r_<_v_a_l_u_e___t_y_p_e_,_w_i_n_d_o_w___t_y_p_e_&_>; │ │ │ │ │ +650 │ │ │ │ │ +_6_5_2 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ +653 { │ │ │ │ │ +654 return _I_t_e_r_a_t_o_r(block,0); │ │ │ │ │ +655 } │ │ │ │ │ +656 │ │ │ │ │ +_6_5_8 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ +659 { │ │ │ │ │ +660 return _I_t_e_r_a_t_o_r(block,nblocks); │ │ │ │ │ +661 } │ │ │ │ │ +662 │ │ │ │ │ +_6_6_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ +666 { │ │ │ │ │ +667 return _I_t_e_r_a_t_o_r(block,nblocks-1); │ │ │ │ │ +668 } │ │ │ │ │ +669 │ │ │ │ │ +_6_7_2 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ +673 { │ │ │ │ │ +674 return _I_t_e_r_a_t_o_r(block,-1); │ │ │ │ │ +675 } │ │ │ │ │ +676 │ │ │ │ │ +_6_7_8 using _i_t_e_r_a_t_o_r = _I_t_e_r_a_t_o_r; │ │ │ │ │ +679 │ │ │ │ │ +_6_8_1 using _C_o_n_s_t_I_t_e_r_a_t_o_r = _R_e_a_l_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _v_a_l_u_e___t_y_p_e_,_ _c_o_n_s_t_ _w_i_n_d_o_w___t_y_p_e_&_>; │ │ │ │ │ +682 │ │ │ │ │ +_6_8_4 using _c_o_n_s_t___i_t_e_r_a_t_o_r = _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +685 │ │ │ │ │ +_6_8_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ +688 { │ │ │ │ │ +689 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,0); │ │ │ │ │ +690 } │ │ │ │ │ +691 │ │ │ │ │ +_6_9_3 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ +694 { │ │ │ │ │ +695 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,nblocks); │ │ │ │ │ +696 } │ │ │ │ │ +697 │ │ │ │ │ +_7_0_0 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ +701 { │ │ │ │ │ +702 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,nblocks-1); │ │ │ │ │ +703 } │ │ │ │ │ +704 │ │ │ │ │ +_7_0_6 _C_o_n_s_t_I_t_e_r_a_t_o_r _r_e_n_d () const │ │ │ │ │ +707 { │ │ │ │ │ +708 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,-1); │ │ │ │ │ +709 } │ │ │ │ │ +710 │ │ │ │ │ +_7_1_2 _I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +713 { │ │ │ │ │ +714 return _I_t_e_r_a_t_o_r(block,std::min(i,nblocks)); │ │ │ │ │ +715 } │ │ │ │ │ +716 │ │ │ │ │ +_7_1_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +719 { │ │ │ │ │ +720 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,std::min(i,nblocks)); │ │ │ │ │ +721 } │ │ │ │ │ +722 │ │ │ │ │ +723 //===== sizes │ │ │ │ │ +724 │ │ │ │ │ +_7_2_6 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ +727 { │ │ │ │ │ +728 return nblocks; │ │ │ │ │ +729 } │ │ │ │ │ +730 │ │ │ │ │ +_7_3_5 _s_i_z_e___t_y_p_e _s_i_z_e () const │ │ │ │ │ +736 { │ │ │ │ │ +737 return nblocks; │ │ │ │ │ +738 } │ │ │ │ │ +739 │ │ │ │ │ +740 │ │ │ │ │ +741 private: │ │ │ │ │ +742 │ │ │ │ │ +743 void allocate() { │ │ │ │ │ +744 if (this->initialized) │ │ │ │ │ +745 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Attempt to re-allocate already initialized │ │ │ │ │ +VariableBlockVector"); │ │ │ │ │ +746 │ │ │ │ │ +747 // calculate space needed: │ │ │ │ │ +748 this->n=0; │ │ │ │ │ +749 for(_s_i_z_e___t_y_p_e i = 0; i < nblocks; i++) { │ │ │ │ │ +750 this->n += block[i].size(); │ │ │ │ │ +751 } │ │ │ │ │ +752 │ │ │ │ │ +753 // now we can allocate the big array in the base class of v │ │ │ │ │ +754 if (this->n>0) │ │ │ │ │ +755 { │ │ │ │ │ +756 // allocate and construct objects │ │ │ │ │ +757 this->p = allocator_.allocate(this->n); │ │ │ │ │ +758 new (this->p)B[this->n]; │ │ │ │ │ +759 } │ │ │ │ │ +760 else │ │ │ │ │ +761 { │ │ │ │ │ +762 this->p = nullptr; │ │ │ │ │ +763 } │ │ │ │ │ +764 │ │ │ │ │ +765 // and we set the window pointers │ │ │ │ │ +766 this->block[0].setptr(this->p); // pointer to first block │ │ │ │ │ +767 for (_s_i_z_e___t_y_p_e j=1; jinitialized = true; │ │ │ │ │ +772 } │ │ │ │ │ +773 │ │ │ │ │ +774 _s_i_z_e___t_y_p_e nblocks; // number of blocks in vector │ │ │ │ │ +775 window_type* block; // array of blocks pointing to the array in the base │ │ │ │ │ +class │ │ │ │ │ +776 bool initialized; // true if vector has been initialized │ │ │ │ │ +777 │ │ │ │ │ +778 A allocator_; │ │ │ │ │ +779 │ │ │ │ │ +780 typename std::allocator_traits::template rebind_alloc │ │ │ │ │ +windowAllocator_; │ │ │ │ │ +781 }; │ │ │ │ │ +782 │ │ │ │ │ +783 │ │ │ │ │ +784 │ │ │ │ │ +787} // end namespace │ │ │ │ │ +788 │ │ │ │ │ +789#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -Class representing the properties of an ede in the matrix graph. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -Class representing a node in the matrix graph. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -The (undirected) graph of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ -A subgraph of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:443 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_g_e_t_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -EdgeIndexMap getEdgeIndexMap() │ │ │ │ │ -Get an edge index map for the graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_u_b_G_r_a_p_h_:_:_E_d_g_e_I_n_d_e_x_M_a_p │ │ │ │ │ -An index map for mapping the edges to indices. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:470 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Attaches properties to the edges and vertices of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_S_u_b_G_r_a_p_h │ │ │ │ │ -Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:26 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties, │ │ │ │ │ -IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_M_a_t_r_i_x │ │ │ │ │ -M::matrix_type Matrix │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e │ │ │ │ │ -static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of) │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_f_r_e_e │ │ │ │ │ -static void free(GraphTuple &graphs) │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -Dune::Amg::MatrixGraph< const Matrix > MatrixGraph │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_:_:_G_r_a_p_h_T_u_p_l_e │ │ │ │ │ -std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -Dune::Amg::MatrixGraph< const Matrix > MatrixGraph │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -M::matrix_type Matrix │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties, │ │ │ │ │ -IdentityMap, IdentityMap > PropertiesGraph │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_G_r_a_p_h_T_u_p_l_e │ │ │ │ │ -std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_c_r_e_a_t_e │ │ │ │ │ -static GraphTuple create(const M &matrix, T &excluded, const │ │ │ │ │ -SequentialInformation &pinfo, const OF &) │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_C_r_e_a_t_o_r_<_ _M_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_f_r_e_e │ │ │ │ │ -static void free(GraphTuple &graphs) │ │ │ │ │ -DDeeffiinniittiioonn graphcreator.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A Vector of blocks with different blocksizes. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +RealIterator< value_type, window_type & > Iterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:649 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +VariableBlockVector() │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +A allocator_type │ │ │ │ │ +export the allocator type │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +VariableBlockVector(size_type _nblocks, size_type m) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:735 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of blocks in the vector (are of variable size here) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:726 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +VariableBlockVector(const VariableBlockVector &a) │ │ │ │ │ +copy constructor, has copy semantics │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +VariableBlockVector(size_type _nblocks) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_~_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +~VariableBlockVector() │ │ │ │ │ +free dynamic memory │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +window_type & operator[](size_type i) │ │ │ │ │ +random access to blocks │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:563 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ +CreateIterator createend() │ │ │ │ │ +get create iterator pointing to one after the last block │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:552 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +Iterator beforeBegin() const │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:672 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ +CreateIterator createbegin() │ │ │ │ │ +get initial create iterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:543 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +VariableBlockVector & operator=(const VariableBlockVector &a) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr auto blocklevel │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_n_d │ │ │ │ │ +ConstIterator rend() const │ │ │ │ │ +end ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:706 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The size type for the index access. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_n_d │ │ │ │ │ +ConstIterator find(size_type i) const │ │ │ │ │ +random access returning iterator (end if not contained) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:718 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:700 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_n_d │ │ │ │ │ +Iterator find(size_type i) │ │ │ │ │ +random access returning iterator (end if not contained) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:712 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +const window_type & const_reference │ │ │ │ │ +Export type used for const references to container entries. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +RealIterator< const value_type, const window_type & > ConstIterator │ │ │ │ │ +Const iterator. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:681 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ +Iterator end() │ │ │ │ │ +end Iterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:658 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +ConstIterator begin() const │ │ │ │ │ +begin ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:687 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +BlockVector< B, A > value_type │ │ │ │ │ +Type of the elements of the outer vector, i.e., dynamic vectors of B. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ +ConstIterator end() const │ │ │ │ │ +end ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:693 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +BlockVector< B, A > block_type │ │ │ │ │ +Same as value_type, here for historical reasons. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type _nblocks, size_type m) │ │ │ │ │ +same effect as constructor with same argument │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +window_type & reference │ │ │ │ │ +Export type used for references to container entries. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type _nblocks) │ │ │ │ │ +same effect as constructor with same argument │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:234 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +Iterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:665 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +Iterator begin() │ │ │ │ │ +begin Iterator │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:652 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator class for sequential creation of blocks. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:443 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const CreateIterator &it) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:505 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +size_type index() const │ │ │ │ │ +dereferencing │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:511 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +SizeProxy reference │ │ │ │ │ +reference type │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:463 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_p_o_i_n_t_e_r │ │ │ │ │ +size_type * pointer │ │ │ │ │ +pointer type │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:460 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const CreateIterator &it) const │ │ │ │ │ +inequality │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:499 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_~_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +~CreateIterator() │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:471 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +size_type value_type │ │ │ │ │ +value type │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_s_e_t_b_l_o_c_k_s_i_z_e │ │ │ │ │ +void setblocksize(size_type _k) │ │ │ │ │ +set size of current block │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:517 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +size_type & operator*() │ │ │ │ │ +Access size of current block. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:528 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y │ │ │ │ │ +std::output_iterator_tag iterator_category │ │ │ │ │ +iterator category │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:446 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +CreateIterator & operator++() │ │ │ │ │ +prefix increment │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:482 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ +void difference_type │ │ │ │ │ +difference type (unused) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:457 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:584 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ +RealIterator(window_type *_p, size_type _i) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:594 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const RealIterator &it) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:611 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +size_type index() const │ │ │ │ │ +Return the index of the entry this iterator is pointing to. │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:639 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ +window_type & elementAt(std::ptrdiff_t offset) const │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:633 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +void decrement() │ │ │ │ │ +prefix decrement │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:605 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ +void advance(std::ptrdiff_t d) │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:622 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +prefix increment │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:599 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ +RealIterator() │ │ │ │ │ +constructor, no arguments │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:587 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +std::ptrdiff_t distanceTo(const RealIterator &o) const │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +window_type & dereference() const │ │ │ │ │ +dereferencing │ │ │ │ │ +DDeeffiinniittiioonn vbvector.hh:617 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00128.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: twolevelmethod.hh File Reference │ │ │ │ +dune-istl: solvercategory.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,59 +65,41 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ - │ │ │ │ +
solvercategory.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Algebraic twolevel methods. │ │ │ │ -More...

│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <dune/istl/operators.hh>
│ │ │ │ -#include "amg.hh"
│ │ │ │ -#include "galerkin.hh"
│ │ │ │ -#include <dune/istl/solver.hh>
│ │ │ │ +
#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::LevelTransferPolicy< FO, CO >
 Abstract base class for transfer between levels and creation of the coarse level system. More...
 
class  Dune::Amg::AggregationLevelTransferPolicy< O, C >
 A LeveTransferPolicy that used aggregation to construct the coarse level system. More...
struct  Dune::SolverCategory
 Categories for the solvers. More...
 
class  Dune::Amg::OneStepAMGCoarseSolverPolicy< O, S, C >
 A policy class for solving the coarse level system using one step of AMG. More...
 
class  Dune::Amg::TwoLevelMethod< FO, CSP, S >
class  Dune::InvalidSolverCategory
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Algebraic twolevel methods.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,21 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -twolevelmethod.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Algebraic twolevel methods. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -#include "_a_m_g_._h_h" │ │ │ │ │ -#include "_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ +solvercategory.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_:_:_A_m_g_:_:_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y_<_ _F_O_,_ _C_O_ _> │ │ │ │ │ -  Abstract base class for transfer between levels and creation of the │ │ │ │ │ - coarse level system. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +  Categories for the solvers. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_i_o_n_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y_<_ _O_,_ _C_ _> │ │ │ │ │ -  A LeveTransferPolicy that used aggregation to construct the coarse │ │ │ │ │ - level system. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_O_n_e_S_t_e_p_A_M_G_C_o_a_r_s_e_S_o_l_v_e_r_P_o_l_i_c_y_<_ _O_,_ _S_,_ _C_ _> │ │ │ │ │ -  A policy class for solving the coarse level system using one step of │ │ │ │ │ - _A_M_G. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_T_w_o_L_e_v_e_l_M_e_t_h_o_d_<_ _F_O_,_ _C_S_P_,_ _S_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Algebraic twolevel methods. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: twolevelmethod.hh Source File │ │ │ │ +dune-istl: solvercategory.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,482 +70,81 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
twolevelmethod.hh
│ │ │ │ +
solvercategory.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH
│ │ │ │ -
6#define DUNE_ISTL_TWOLEVELMETHOD_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH
│ │ │ │ +
6#define DUNE_ISTL_SOLVERCATEGORY_HH
│ │ │ │
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ +
8#include <dune/common/exceptions.hh>
│ │ │ │
9
│ │ │ │ - │ │ │ │ -
11#include"amg.hh"
│ │ │ │ -
12#include"galerkin.hh"
│ │ │ │ -
13#include<dune/istl/solver.hh>
│ │ │ │ -
14
│ │ │ │ -
22namespace Dune
│ │ │ │ -
23{
│ │ │ │ -
24namespace Amg
│ │ │ │ -
25{
│ │ │ │ -
26
│ │ │ │ -
36template<class FO, class CO>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
38{
│ │ │ │ -
39public:
│ │ │ │ -
44 typedef FO FineOperatorType;
│ │ │ │ -
48 typedef typename FineOperatorType::range_type FineRangeType;
│ │ │ │ -
52 typedef typename FineOperatorType::domain_type FineDomainType;
│ │ │ │ - │ │ │ │ -
61 typedef typename CoarseOperatorType::range_type CoarseRangeType;
│ │ │ │ -
65 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
│ │ │ │ -
│ │ │ │ -
70 std::shared_ptr<CoarseOperatorType>& getCoarseLevelOperator()
│ │ │ │ -
71 {
│ │ │ │ -
72 return operator_;
│ │ │ │ -
73 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
79 {
│ │ │ │ -
80 return rhs_;
│ │ │ │ -
81 }
│ │ │ │ -
│ │ │ │ -
82
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
88 {
│ │ │ │ -
89 return lhs_;
│ │ │ │ -
90 }
│ │ │ │ -
│ │ │ │ -
100 virtual void moveToCoarseLevel(const FineRangeType& fineRhs)=0;
│ │ │ │ -
110 virtual void moveToFineLevel(FineDomainType& fineLhs)=0;
│ │ │ │ -
118 virtual void createCoarseLevelSystem(const FineOperatorType& fineOperator)=0;
│ │ │ │ -
119
│ │ │ │ -
121 virtual LevelTransferPolicy* clone() const =0;
│ │ │ │ -
122
│ │ │ │ - │ │ │ │ -
125
│ │ │ │ -
126 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
132 std::shared_ptr<CoarseOperatorType> operator_;
│ │ │ │ -
133};
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
140template<class O, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
142 : public LevelTransferPolicy<O,O>
│ │ │ │ -
143{
│ │ │ │ - │ │ │ │ -
145public:
│ │ │ │ - │ │ │ │ -
147 typedef C Criterion;
│ │ │ │ - │ │ │ │ -
149
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
151 : criterion_(crit)
│ │ │ │ -
152 {}
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
│ │ │ │ -
154 void createCoarseLevelSystem(const O& fineOperator)
│ │ │ │ -
155 {
│ │ │ │ -
156 prolongDamp_ = criterion_.getProlongationDampingFactor();
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
160 Dune::Amg::EdgeProperties,Dune::IdentityMap,Dune::IdentityMap> PropertiesGraph;
│ │ │ │ -
161 MatrixGraph mg(fineOperator.getmat());
│ │ │ │ -
162 PropertiesGraph pg(mg,Dune::IdentityMap(),Dune::IdentityMap());
│ │ │ │ -
163 typedef NegateSet<typename ParallelInformation::OwnerSet> OverlapFlags;
│ │ │ │ -
164
│ │ │ │ -
165 aggregatesMap_ = std::make_shared<AggregatesMap>(pg.maxVertex()+1);
│ │ │ │ -
166
│ │ │ │ -
167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
│ │ │ │ -
168
│ │ │ │ -
169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
│ │ │ │ -
170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, true);
│ │ │ │ -
171 std::cout<<"no aggregates="<<noAggregates<<" iso="<<isoAggregates<<" one="<<oneAggregates<<" skipped="<<skippedAggregates<<std::endl;
│ │ │ │ -
172 // misuse coarsener to renumber aggregates
│ │ │ │ - │ │ │ │ -
174 typedef std::vector<bool>::iterator Iterator;
│ │ │ │ -
175 typedef Dune::IteratorPropertyMap<Iterator, Dune::IdentityMap> VisitedMap;
│ │ │ │ -
176 std::vector<bool> excluded(fineOperator.getmat().N(), false);
│ │ │ │ -
177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());
│ │ │ │ - │ │ │ │ -
179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,
│ │ │ │ -
180 *aggregatesMap_, pinfo,
│ │ │ │ -
181 noAggregates);
│ │ │ │ -
182 std::vector<bool>& visited=excluded;
│ │ │ │ -
183
│ │ │ │ -
184 typedef std::vector<bool>::iterator Iterator;
│ │ │ │ -
185
│ │ │ │ -
186 for(Iterator iter= visited.begin(), end=visited.end();
│ │ │ │ -
187 iter != end; ++iter)
│ │ │ │ -
188 *iter=false;
│ │ │ │ -
189 matrix_.reset(productBuilder.build(mg, vm,
│ │ │ │ - │ │ │ │ -
191 *aggregatesMap_,
│ │ │ │ -
192 aggregates,
│ │ │ │ -
193 OverlapFlags()));
│ │ │ │ -
194 productBuilder.calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
│ │ │ │ -
195 this->lhs_.resize(this->matrix_->M());
│ │ │ │ -
196 this->rhs_.resize(this->matrix_->N());
│ │ │ │ -
197 this->operator_ = std::make_shared<O>(*matrix_);
│ │ │ │ -
198 }
│ │ │ │ -
│ │ │ │ -
199
│ │ │ │ -
│ │ │ │ -
200 void moveToCoarseLevel(const typename FatherType::FineRangeType& fineRhs)
│ │ │ │ -
201 {
│ │ │ │ - │ │ │ │ -
203 ::restrictVector(*aggregatesMap_, this->rhs_, fineRhs, ParallelInformation());
│ │ │ │ -
204 this->lhs_=0;
│ │ │ │ -
205 }
│ │ │ │ -
│ │ │ │ -
206
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
208 {
│ │ │ │ - │ │ │ │ -
210 ::prolongateVector(*aggregatesMap_, this->lhs_, fineLhs,
│ │ │ │ -
211 prolongDamp_, ParallelInformation());
│ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
213
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
215 {
│ │ │ │ -
216 return new AggregationLevelTransferPolicy(*this);
│ │ │ │ -
217 }
│ │ │ │ -
│ │ │ │ -
218
│ │ │ │ -
219private:
│ │ │ │ -
220 typename O::matrix_type::field_type prolongDamp_;
│ │ │ │ -
221 std::shared_ptr<AggregatesMap> aggregatesMap_;
│ │ │ │ -
222 Criterion criterion_;
│ │ │ │ -
223 std::shared_ptr<typename O::matrix_type> matrix_;
│ │ │ │ -
224};
│ │ │ │ -
│ │ │ │ -
225
│ │ │ │ -
232template<class O, class S, class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
234{
│ │ │ │ -
235public:
│ │ │ │ -
237 typedef O Operator;
│ │ │ │ -
239 typedef typename O::range_type X;
│ │ │ │ -
241 typedef C Criterion;
│ │ │ │ -
243 typedef S Smoother;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
254 : smootherArgs_(args), criterion_(c)
│ │ │ │ -
255 {}
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
258 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
│ │ │ │ -
259 criterion_(other.criterion_)
│ │ │ │ -
260 {}
│ │ │ │ -
│ │ │ │ -
261private:
│ │ │ │ -
268 struct AMGInverseOperator : public InverseOperator<X,X>
│ │ │ │ -
269 {
│ │ │ │ -
270 AMGInverseOperator(const typename AMGType::Operator& op,
│ │ │ │ -
271 const Criterion& crit,
│ │ │ │ -
272 const typename AMGType::SmootherArgs& args)
│ │ │ │ -
273 : amg_(op, crit,args), first_(true)
│ │ │ │ -
274 {}
│ │ │ │ -
275
│ │ │ │ -
276 void apply(X& x, X& b, [[maybe_unused]] double reduction, [[maybe_unused]] InverseOperatorResult& res)
│ │ │ │ -
277 {
│ │ │ │ -
278 if(first_)
│ │ │ │ -
279 {
│ │ │ │ -
280 amg_.pre(x,b);
│ │ │ │ -
281 first_=false;
│ │ │ │ -
282 x_=x;
│ │ │ │ -
283 }
│ │ │ │ -
284 amg_.apply(x,b);
│ │ │ │ -
285 }
│ │ │ │ -
286
│ │ │ │ -
287 void apply(X& x, X& b, InverseOperatorResult& res)
│ │ │ │ -
288 {
│ │ │ │ -
289 return apply(x,b,1e-8,res);
│ │ │ │ -
290 }
│ │ │ │ -
291
│ │ │ │ -
293 virtual SolverCategory::Category category() const
│ │ │ │ -
294 {
│ │ │ │ -
295 return amg_.category();
│ │ │ │ -
296 }
│ │ │ │ -
297
│ │ │ │ -
298 ~AMGInverseOperator()
│ │ │ │ -
299 {
│ │ │ │ -
300 if(!first_)
│ │ │ │ -
301 amg_.post(x_);
│ │ │ │ -
302 }
│ │ │ │ -
303 AMGInverseOperator(const AMGInverseOperator& other)
│ │ │ │ -
304 : x_(other.x_), amg_(other.amg_), first_(other.first_)
│ │ │ │ -
305 {
│ │ │ │ -
306 }
│ │ │ │ -
307 private:
│ │ │ │ -
308 X x_;
│ │ │ │ -
309 AMGType amg_;
│ │ │ │ -
310 bool first_;
│ │ │ │ -
311 };
│ │ │ │ -
312
│ │ │ │ -
313public:
│ │ │ │ -
315 typedef AMGInverseOperator CoarseLevelSolver;
│ │ │ │ -
316
│ │ │ │ -
324 template<class P>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
326 {
│ │ │ │ -
327 coarseOperator_=transferPolicy.getCoarseLevelOperator();
│ │ │ │ -
328 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,
│ │ │ │ -
329 criterion_,
│ │ │ │ -
330 smootherArgs_);
│ │ │ │ -
331
│ │ │ │ -
332 return inv; //std::shared_ptr<InverseOperator<X,X> >(inv);
│ │ │ │ -
333
│ │ │ │ -
334 }
│ │ │ │ -
│ │ │ │ -
335
│ │ │ │ -
336private:
│ │ │ │ -
338 std::shared_ptr<Operator> coarseOperator_;
│ │ │ │ -
340 SmootherArgs smootherArgs_;
│ │ │ │ -
342 Criterion criterion_;
│ │ │ │ -
343};
│ │ │ │ -
│ │ │ │ -
344
│ │ │ │ -
350template<class FO, class CSP, class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
352 public Preconditioner<typename FO::domain_type, typename FO::range_type>
│ │ │ │ -
353{
│ │ │ │ -
354public:
│ │ │ │ - │ │ │ │ -
358 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver;
│ │ │ │ - │ │ │ │ -
367 typedef typename FineOperatorType::range_type FineRangeType;
│ │ │ │ -
371 typedef typename FineOperatorType::domain_type FineDomainType;
│ │ │ │ -
376 typedef typename CSP::Operator CoarseOperatorType;
│ │ │ │ -
380 typedef typename CoarseOperatorType::range_type CoarseRangeType;
│ │ │ │ -
384 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
│ │ │ │ -
388 typedef S SmootherType;
│ │ │ │ -
389
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
405 std::shared_ptr<SmootherType> smoother,
│ │ │ │ - │ │ │ │ -
407 CoarseOperatorType>& policy,
│ │ │ │ -
408 CoarseLevelSolverPolicy& coarsePolicy,
│ │ │ │ -
409 std::size_t preSteps=1, std::size_t postSteps=1)
│ │ │ │ -
410 : operator_(&op), smoother_(smoother),
│ │ │ │ -
411 preSteps_(preSteps), postSteps_(postSteps)
│ │ │ │ -
412 {
│ │ │ │ -
413 policy_ = policy.clone();
│ │ │ │ -
414 policy_->createCoarseLevelSystem(*operator_);
│ │ │ │ -
415 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
│ │ │ │ -
416 }
│ │ │ │ -
│ │ │ │ -
417
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
419 : operator_(other.operator_), coarseSolver_(new CoarseLevelSolver(*other.coarseSolver_)),
│ │ │ │ -
420 smoother_(other.smoother_), policy_(other.policy_->clone()),
│ │ │ │ -
421 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
│ │ │ │ -
422 {}
│ │ │ │ -
│ │ │ │ -
423
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
425 {
│ │ │ │ -
426 // Each instance has its own policy.
│ │ │ │ -
427 delete policy_;
│ │ │ │ -
428 delete coarseSolver_;
│ │ │ │ -
429 }
│ │ │ │ -
│ │ │ │ -
430
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
432 {
│ │ │ │ -
433 smoother_->pre(x,b);
│ │ │ │ -
434 }
│ │ │ │ -
│ │ │ │ -
435
│ │ │ │ -
│ │ │ │ -
436 void post([[maybe_unused]] FineDomainType& x)
│ │ │ │ -
437 {}
│ │ │ │ -
│ │ │ │ -
438
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
440 {
│ │ │ │ -
441 FineDomainType u(v);
│ │ │ │ -
442 FineRangeType rhs(d);
│ │ │ │ -
443 LevelContext context;
│ │ │ │ - │ │ │ │ -
445 context.pinfo=&info;
│ │ │ │ -
446 context.lhs=&u;
│ │ │ │ -
447 context.update=&v;
│ │ │ │ -
448 context.smoother=smoother_;
│ │ │ │ -
449 context.rhs=&rhs;
│ │ │ │ -
450 context.matrix=operator_;
│ │ │ │ -
451 // Presmoothing
│ │ │ │ -
452 presmooth(context, preSteps_);
│ │ │ │ -
453 //Coarse grid correction
│ │ │ │ -
454 policy_->moveToCoarseLevel(*context.rhs);
│ │ │ │ - │ │ │ │ -
456 coarseSolver_->apply(policy_->getCoarseLevelLhs(), policy_->getCoarseLevelRhs(), res);
│ │ │ │ -
457 *context.lhs=0;
│ │ │ │ -
458 policy_->moveToFineLevel(*context.lhs);
│ │ │ │ -
459 *context.update += *context.lhs;
│ │ │ │ -
460 // Postsmoothing
│ │ │ │ -
461 postsmooth(context, postSteps_);
│ │ │ │ -
462
│ │ │ │ -
463 }
│ │ │ │ -
│ │ │ │ -
464
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
467 {
│ │ │ │ - │ │ │ │ -
469 }
│ │ │ │ -
│ │ │ │ -
470
│ │ │ │ -
471private:
│ │ │ │ -
475 struct LevelContext
│ │ │ │ -
476 {
│ │ │ │ -
478 typedef S SmootherType;
│ │ │ │ -
480 std::shared_ptr<SmootherType> smoother;
│ │ │ │ -
482 FineDomainType* lhs;
│ │ │ │ -
483 /*
│ │ │ │ -
484 * @brief The right hand side holding the current residual.
│ │ │ │ -
485 *
│ │ │ │ -
486 * This is passed to the smoother as the right hand side.
│ │ │ │ -
487 */
│ │ │ │ -
488 FineRangeType* rhs;
│ │ │ │ -
494 FineDomainType* update;
│ │ │ │ - │ │ │ │ -
502 const FineOperatorType* matrix;
│ │ │ │ -
503 };
│ │ │ │ -
504 const FineOperatorType* operator_;
│ │ │ │ -
506 CoarseLevelSolver* coarseSolver_;
│ │ │ │ -
508 std::shared_ptr<S> smoother_;
│ │ │ │ -
510 LevelTransferPolicy<FO,typename CSP::Operator>* policy_;
│ │ │ │ -
512 std::size_t preSteps_;
│ │ │ │ -
514 std::size_t postSteps_;
│ │ │ │ -
515};
│ │ │ │ -
│ │ │ │ -
516}// end namespace Amg
│ │ │ │ -
517}// end namespace Dune
│ │ │ │ -
518
│ │ │ │ -
520#endif
│ │ │ │ -
Provides a class for building the galerkin product based on a aggregation scheme.
│ │ │ │ -
The AMG preconditioner.
│ │ │ │ -
Define general, extensible interface for inverse operators.
│ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ -
G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation &pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::Matrix::size_type &size, const Set &copy)
Calculates the coarse matrix via a Galerkin product.
Definition galerkin.hh:563
│ │ │ │ -
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition amg.hh:100
│ │ │ │ -
Operator Operator
The matrix operator type.
Definition amg.hh:73
│ │ │ │ -
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ -
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ -
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
Calculate the galerkin product.
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
22 {
│ │ │ │ +
│ │ │ │ +
23 enum Category {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
30 };
│ │ │ │ +
│ │ │ │ +
31
│ │ │ │ +
33 template<typename OP>
│ │ │ │ +
│ │ │ │ +
34 static Category category(const OP& op, decltype(op.category())* = nullptr)
│ │ │ │ +
35 {
│ │ │ │ +
36 return op.category();
│ │ │ │ +
37 }
│ │ │ │ +
│ │ │ │ +
38
│ │ │ │ +
39#ifndef DOXYGEN
│ │ │ │ +
40 // template<typename OP>
│ │ │ │ +
41 // static Category category(const OP& op, decltype(op.getSolverCategory())* = nullptr)
│ │ │ │ +
42 // {
│ │ │ │ +
43 // return op.getSolverCategory();
│ │ │ │ +
44 // }
│ │ │ │ +
45
│ │ │ │ +
46 template<typename OP>
│ │ │ │ +
47 static Category category(const OP& op, decltype(op.category)* = nullptr)
│ │ │ │ +
48 {
│ │ │ │ +
49 return OP::category;
│ │ │ │ +
50 }
│ │ │ │ +
51#endif
│ │ │ │ +
52 };
│ │ │ │ +
│ │ │ │ +
53
│ │ │ │ +
54 class InvalidSolverCategory : public InvalidStateException{};
│ │ │ │ +
55
│ │ │ │ +
58} // end namespace
│ │ │ │ +
59
│ │ │ │ +
60#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
Parallel algebraic multigrid based on agglomeration.
Definition amg.hh:65
│ │ │ │ -
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ -
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ -
Definition galerkin.hh:118
│ │ │ │ -
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ -
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ -
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
│ │ │ │ -
Definition indicescoarsener.hh:36
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │ -
Definition transfer.hh:32
│ │ │ │ -
Abstract base class for transfer between levels and creation of the coarse level system.
Definition twolevelmethod.hh:38
│ │ │ │ -
CO CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:57
│ │ │ │ -
virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0
Transfers the data to the coarse level.
│ │ │ │ -
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition twolevelmethod.hh:48
│ │ │ │ -
virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0
Algebraically creates the coarse level system.
│ │ │ │ -
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition twolevelmethod.hh:61
│ │ │ │ -
virtual ~LevelTransferPolicy()
Destructor.
Definition twolevelmethod.hh:124
│ │ │ │ -
CoarseDomainType lhs_
The coarse level lhs.
Definition twolevelmethod.hh:130
│ │ │ │ -
virtual LevelTransferPolicy * clone() const =0
Clone the current object.
│ │ │ │ -
CoarseDomainType & getCoarseLevelLhs()
Get the coarse level left hand side.
Definition twolevelmethod.hh:87
│ │ │ │ -
std::shared_ptr< CoarseOperatorType > operator_
the coarse level linear operator.
Definition twolevelmethod.hh:132
│ │ │ │ -
CoarseRangeType rhs_
The coarse level rhs.
Definition twolevelmethod.hh:128
│ │ │ │ -
virtual void moveToFineLevel(FineDomainType &fineLhs)=0
Updates the fine level linear system after the correction of the coarse levels system.
│ │ │ │ -
std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
Get the coarse level operator.
Definition twolevelmethod.hh:70
│ │ │ │ -
CoarseRangeType & getCoarseLevelRhs()
Get the coarse level right hand side.
Definition twolevelmethod.hh:78
│ │ │ │ -
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:44
│ │ │ │ -
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition twolevelmethod.hh:65
│ │ │ │ -
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition twolevelmethod.hh:52
│ │ │ │ -
A LeveTransferPolicy that used aggregation to construct the coarse level system.
Definition twolevelmethod.hh:143
│ │ │ │ -
C Criterion
Definition twolevelmethod.hh:147
│ │ │ │ -
AggregationLevelTransferPolicy(const Criterion &crit)
Definition twolevelmethod.hh:150
│ │ │ │ -
AggregationLevelTransferPolicy * clone() const
Clone the current object.
Definition twolevelmethod.hh:214
│ │ │ │ -
void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
Updates the fine level linear system after the correction of the coarse levels system.
Definition twolevelmethod.hh:207
│ │ │ │ -
void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)
Definition twolevelmethod.hh:200
│ │ │ │ -
SequentialInformation ParallelInformation
Definition twolevelmethod.hh:148
│ │ │ │ -
LevelTransferPolicy< O, O > FatherType
Definition twolevelmethod.hh:146
│ │ │ │ -
void createCoarseLevelSystem(const O &fineOperator)
Algebraically creates the coarse level system.
Definition twolevelmethod.hh:154
│ │ │ │ -
A policy class for solving the coarse level system using one step of AMG.
Definition twolevelmethod.hh:234
│ │ │ │ -
OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
Constructs the coarse solver policy.
Definition twolevelmethod.hh:253
│ │ │ │ -
AMGInverseOperator CoarseLevelSolver
The type of solver constructed for the coarse level.
Definition twolevelmethod.hh:315
│ │ │ │ -
OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
Copy constructor.
Definition twolevelmethod.hh:257
│ │ │ │ -
O::range_type X
The type of the range and domain of the operator.
Definition twolevelmethod.hh:239
│ │ │ │ -
C Criterion
The type of the crition used for the aggregation within AMG.
Definition twolevelmethod.hh:241
│ │ │ │ -
Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
The type of the arguments used for constructing the smoother.
Definition twolevelmethod.hh:245
│ │ │ │ -
O Operator
The type of the linear operator used.
Definition twolevelmethod.hh:237
│ │ │ │ -
AMG< Operator, X, Smoother > AMGType
The type of the AMG construct on the coarse level.
Definition twolevelmethod.hh:247
│ │ │ │ -
CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
Constructs a coarse level solver.
Definition twolevelmethod.hh:325
│ │ │ │ -
S Smoother
The type of the smoother used in AMG.
Definition twolevelmethod.hh:243
│ │ │ │ -
Definition twolevelmethod.hh:353
│ │ │ │ -
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition twolevelmethod.hh:380
│ │ │ │ -
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition twolevelmethod.hh:371
│ │ │ │ -
TwoLevelMethod(const TwoLevelMethod &other)
Definition twolevelmethod.hh:418
│ │ │ │ -
void pre(FineDomainType &x, FineRangeType &b)
Definition twolevelmethod.hh:431
│ │ │ │ -
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:363
│ │ │ │ -
CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
The type of the coarse level solver.
Definition twolevelmethod.hh:358
│ │ │ │ -
void apply(FineDomainType &v, const FineRangeType &d)
Definition twolevelmethod.hh:439
│ │ │ │ -
CSP CoarseLevelSolverPolicy
The type of the policy for constructing the coarse level solver.
Definition twolevelmethod.hh:356
│ │ │ │ -
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition twolevelmethod.hh:384
│ │ │ │ -
TwoLevelMethod(const FineOperatorType &op, std::shared_ptr< SmootherType > smoother, const LevelTransferPolicy< FineOperatorType, CoarseOperatorType > &policy, CoarseLevelSolverPolicy &coarsePolicy, std::size_t preSteps=1, std::size_t postSteps=1)
Constructs a two level method.
Definition twolevelmethod.hh:404
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition twolevelmethod.hh:466
│ │ │ │ -
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition twolevelmethod.hh:367
│ │ │ │ -
~TwoLevelMethod()
Definition twolevelmethod.hh:424
│ │ │ │ -
CSP::Operator CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition twolevelmethod.hh:376
│ │ │ │ -
void post(FineDomainType &x)
Definition twolevelmethod.hh:436
│ │ │ │ -
S SmootherType
The type of the fine level smoother.
Definition twolevelmethod.hh:388
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
virtual void apply(X &x, X &b, InverseOperatorResult &res)=0
Apply inverse operator,.
│ │ │ │ +
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │
Category
Definition solvercategory.hh:23
│ │ │ │
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ +
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ +
Definition solvercategory.hh:54
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,663 +1,85 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -twolevelmethod.hh │ │ │ │ │ +solvercategory.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH │ │ │ │ │ -6#define DUNE_ISTL_TWOLEVELMETHOD_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH │ │ │ │ │ +6#define DUNE_ISTL_SOLVERCATEGORY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#include │ │ │ │ │ 9 │ │ │ │ │ -10#include<_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -11#include"_a_m_g_._h_h" │ │ │ │ │ -12#include"_g_a_l_e_r_k_i_n_._h_h" │ │ │ │ │ -13#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ -14 │ │ │ │ │ -22namespace _D_u_n_e │ │ │ │ │ -23{ │ │ │ │ │ -24namespace Amg │ │ │ │ │ -25{ │ │ │ │ │ -26 │ │ │ │ │ -36template │ │ │ │ │ -_3_7class _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y │ │ │ │ │ -38{ │ │ │ │ │ -39public: │ │ │ │ │ -_4_4 typedef FO _F_i_n_e_O_p_e_r_a_t_o_r_T_y_p_e; │ │ │ │ │ -_4_8 typedef typename FineOperatorType::range_type _F_i_n_e_R_a_n_g_e_T_y_p_e; │ │ │ │ │ -_5_2 typedef typename FineOperatorType::domain_type _F_i_n_e_D_o_m_a_i_n_T_y_p_e; │ │ │ │ │ -_5_7 typedef CO _C_o_a_r_s_e_O_p_e_r_a_t_o_r_T_y_p_e; │ │ │ │ │ -_6_1 typedef typename CoarseOperatorType::range_type _C_o_a_r_s_e_R_a_n_g_e_T_y_p_e; │ │ │ │ │ -_6_5 typedef typename CoarseOperatorType::domain_type _C_o_a_r_s_e_D_o_m_a_i_n_T_y_p_e; │ │ │ │ │ -_7_0 std::shared_ptr& _g_e_t_C_o_a_r_s_e_L_e_v_e_l_O_p_e_r_a_t_o_r() │ │ │ │ │ -71 { │ │ │ │ │ -72 return _o_p_e_r_a_t_o_r__; │ │ │ │ │ -73 } │ │ │ │ │ -_7_8 _C_o_a_r_s_e_R_a_n_g_e_T_y_p_e& _g_e_t_C_o_a_r_s_e_L_e_v_e_l_R_h_s() │ │ │ │ │ -79 { │ │ │ │ │ -80 return _r_h_s__; │ │ │ │ │ -81 } │ │ │ │ │ -82 │ │ │ │ │ -_8_7 _C_o_a_r_s_e_D_o_m_a_i_n_T_y_p_e& _g_e_t_C_o_a_r_s_e_L_e_v_e_l_L_h_s() │ │ │ │ │ -88 { │ │ │ │ │ -89 return _l_h_s__; │ │ │ │ │ -90 } │ │ │ │ │ -_1_0_0 virtual void _m_o_v_e_T_o_C_o_a_r_s_e_L_e_v_e_l(const _F_i_n_e_R_a_n_g_e_T_y_p_e& fineRhs)=0; │ │ │ │ │ -_1_1_0 virtual void _m_o_v_e_T_o_F_i_n_e_L_e_v_e_l(_F_i_n_e_D_o_m_a_i_n_T_y_p_e& fineLhs)=0; │ │ │ │ │ -_1_1_8 virtual void _c_r_e_a_t_e_C_o_a_r_s_e_L_e_v_e_l_S_y_s_t_e_m(const _F_i_n_e_O_p_e_r_a_t_o_r_T_y_p_e& │ │ │ │ │ -fineOperator)=0; │ │ │ │ │ -119 │ │ │ │ │ -_1_2_1 virtual _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y* _c_l_o_n_e() const =0; │ │ │ │ │ -122 │ │ │ │ │ -_1_2_4 virtual _~_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y(){} │ │ │ │ │ -125 │ │ │ │ │ -126 protected: │ │ │ │ │ -_1_2_8 _C_o_a_r_s_e_R_a_n_g_e_T_y_p_e _r_h_s__; │ │ │ │ │ -_1_3_0 _C_o_a_r_s_e_D_o_m_a_i_n_T_y_p_e _l_h_s__; │ │ │ │ │ -_1_3_2 std::shared_ptr _o_p_e_r_a_t_o_r__; │ │ │ │ │ -133}; │ │ │ │ │ -134 │ │ │ │ │ -140template │ │ │ │ │ -_1_4_1class _A_g_g_r_e_g_a_t_i_o_n_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y │ │ │ │ │ -142 : public _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y │ │ │ │ │ -143{ │ │ │ │ │ -144 typedef _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_t_y_p_e_n_a_m_e_ _O_:_:_m_a_t_r_i_x___t_y_p_e_:_:_s_i_z_e___t_y_p_e_> │ │ │ │ │ -_A_g_g_r_e_g_a_t_e_s_M_a_p; │ │ │ │ │ -145public: │ │ │ │ │ -_1_4_6 typedef _L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y_<_O_,_O_> _F_a_t_h_e_r_T_y_p_e; │ │ │ │ │ -_1_4_7 typedef C _C_r_i_t_e_r_i_o_n; │ │ │ │ │ -_1_4_8 typedef _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -149 │ │ │ │ │ -_1_5_0 _A_g_g_r_e_g_a_t_i_o_n_L_e_v_e_l_T_r_a_n_s_f_e_r_P_o_l_i_c_y(const _C_r_i_t_e_r_i_o_n& crit) │ │ │ │ │ -151 : criterion_(crit) │ │ │ │ │ -152 {} │ │ │ │ │ -153 │ │ │ │ │ -_1_5_4 void _c_r_e_a_t_e_C_o_a_r_s_e_L_e_v_e_l_S_y_s_t_e_m(const O& fineOperator) │ │ │ │ │ -155 { │ │ │ │ │ -156 prolongDamp_ = criterion_.getProlongationDampingFactor(); │ │ │ │ │ -157 _G_a_l_e_r_k_i_n_P_r_o_d_u_c_t_<_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_> productBuilder; │ │ │ │ │ -158 typedef typename _D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h_<_c_o_n_s_t_ _t_y_p_e_n_a_m_e_ _O_:_:_m_a_t_r_i_x___t_y_p_e_> │ │ │ │ │ -_M_a_t_r_i_x_G_r_a_p_h; │ │ │ │ │ -159 typedef typename _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h<_M_a_t_r_i_x_G_r_a_p_h,_D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ -_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, │ │ │ │ │ -160 _D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s,Dune::IdentityMap,Dune::IdentityMap> │ │ │ │ │ -_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h; │ │ │ │ │ -161 _M_a_t_r_i_x_G_r_a_p_h mg(fineOperator.getmat()); │ │ │ │ │ -162 _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h pg(mg,Dune::IdentityMap(),Dune::IdentityMap()); │ │ │ │ │ -163 typedef NegateSet OverlapFlags; │ │ │ │ │ -164 │ │ │ │ │ -165 aggregatesMap_ = std::make_shared(pg._m_a_x_V_e_r_t_e_x()+1); │ │ │ │ │ -166 │ │ │ │ │ -167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates; │ │ │ │ │ -168 │ │ │ │ │ -169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) = │ │ │ │ │ -170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, │ │ │ │ │ -true); │ │ │ │ │ -171 std::cout<<"no aggregates="< │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: properties.hh File Reference │ │ │ │ +dune-istl: bvector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,50 +65,71 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
bvector.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides classes for handling internal properties in a graph. │ │ │ │ +

This file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time. │ │ │ │ More...

│ │ │ │ -
#include <dune/common/propertymap.hh>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/dotproduct.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/promotiontraits.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │ +#include "basearray.hh"
│ │ │ │ +#include "istlexception.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Amg::VertexVisitedTag
 Tag idnetifying the visited property of a vertex. More...
class  Dune::BlockVector< B, A >
 A vector of blocks with memory management. More...
 
class  Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >
 A property map that extracts one property out of a bundle using operator[]() More...
struct  Dune::FieldTraits< BlockVector< B, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class K , class A >
std::ostream & Dune::operator<< (std::ostream &s, const BlockVector< K, A > &v)
 Send BlockVector to an output stream.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides classes for handling internal properties in a graph.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

This file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,33 +1,49 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -properties.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides classes for handling internal properties in a graph. _M_o_r_e_._._. │ │ │ │ │ -#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 │ │ │ │ │ +bvector.hh File Reference │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of components can be given at run-time. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +#include "_b_a_s_e_a_r_r_a_y_._h_h" │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_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 │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ -  Tag idnetifying the visited property of a vertex. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _> │ │ │ │ │ +  A vector of blocks with memory management. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_<_ _C_,_ _K_,_ _i_,_ _T_,_ _R_ _> │ │ │ │ │ -  A property map that extracts one property out of a bundle using │ │ │ │ │ - _o_p_e_r_a_t_o_r_[_]_(_) _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _B_l_o_c_k_V_e_c_t_o_r< K, A > │ │ │ │ │ + &v) │ │ │ │ │ +  Send _B_l_o_c_k_V_e_c_t_o_r to an output stream. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides classes for handling internal properties in a graph. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of components can be given at run-time. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: properties.hh Source File │ │ │ │ +dune-istl: bvector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,99 +70,965 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
properties.hh
│ │ │ │ +
bvector.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH
│ │ │ │ -
6#define DUNE_ISTL_AMG_PROPERTIES_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/propertymap.hh>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune
│ │ │ │ -
11{
│ │ │ │ -
12
│ │ │ │ -
13 namespace Amg
│ │ │ │ -
14 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
29 {};
│ │ │ │ -
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_ISTL_BVECTOR_HH
│ │ │ │ +
7#define DUNE_ISTL_BVECTOR_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <cmath>
│ │ │ │ +
11#include <complex>
│ │ │ │ +
12#include <initializer_list>
│ │ │ │ +
13#include <limits>
│ │ │ │ +
14#include <memory>
│ │ │ │ +
15#include <utility>
│ │ │ │ +
16#include <vector>
│ │ │ │ +
17
│ │ │ │ +
18#include <dune/common/dotproduct.hh>
│ │ │ │ +
19#include <dune/common/ftraits.hh>
│ │ │ │ +
20#include <dune/common/fmatrix.hh>
│ │ │ │ +
21#include <dune/common/fvector.hh>
│ │ │ │ +
22#include <dune/common/promotiontraits.hh>
│ │ │ │ +
23#include <dune/common/typetraits.hh>
│ │ │ │ +
24#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
25
│ │ │ │ + │ │ │ │ +
27
│ │ │ │ +
28#include "basearray.hh"
│ │ │ │ +
29#include "istlexception.hh"
│ │ │ │
30
│ │ │ │ -
31
│ │ │ │ -
38 template<typename C, typename K, std::size_t i,typename T=typename C::ValueType,
│ │ │ │ -
39 typename R = typename C::Reference>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
41 : public RAPropertyMapHelper<R,
│ │ │ │ -
42 RandomAccessBundledPropertyMap<C,K,i,T,R> >
│ │ │ │ -
43 {
│ │ │ │ -
44 public:
│ │ │ │ -
46 typedef C Container;
│ │ │ │ -
47
│ │ │ │ -
49 typedef R Reference;
│ │ │ │ +
38namespace Dune {
│ │ │ │ +
39
│ │ │ │ +
41namespace Imp {
│ │ │ │ +
42
│ │ │ │ +
48 template <class B, bool isNumber>
│ │ │ │ +
49 class BlockTraitsImp;
│ │ │ │
50
│ │ │ │ -
52 typedef K Key;
│ │ │ │ -
53
│ │ │ │ -
57 typedef LvaluePropertyMapTag Category;
│ │ │ │ -
58
│ │ │ │ -
59 enum {
│ │ │ │ -
61 index = i
│ │ │ │ -
62 };
│ │ │ │ -
63
│ │ │ │ -
│ │ │ │ -
69 Reference operator[](const Key& key) const
│ │ │ │ -
70 {
│ │ │ │ -
71 return container_[key][index];
│ │ │ │ -
72 }
│ │ │ │ -
│ │ │ │ -
73
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
79 : container_(&container)
│ │ │ │ -
80 {}
│ │ │ │ -
│ │ │ │ -
81
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
84 : container_(0)
│ │ │ │ -
85 {}
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
87 private:
│ │ │ │ -
89 Container* container_;
│ │ │ │ -
90 };
│ │ │ │ -
│ │ │ │ -
91 }
│ │ │ │ -
92}
│ │ │ │ +
51 template <class B>
│ │ │ │ +
52 class BlockTraitsImp<B,true>
│ │ │ │ +
53 {
│ │ │ │ +
54 public:
│ │ │ │ +
55 using field_type = B;
│ │ │ │ +
56 };
│ │ │ │ +
57
│ │ │ │ +
58 template <class B>
│ │ │ │ +
59 class BlockTraitsImp<B,false>
│ │ │ │ +
60 {
│ │ │ │ +
61 public:
│ │ │ │ +
62 using field_type = typename B::field_type;
│ │ │ │ +
63 };
│ │ │ │ +
64
│ │ │ │ +
67 template <class B>
│ │ │ │ +
68 using BlockTraits = BlockTraitsImp<B,IsNumber<B>::value>;
│ │ │ │ +
69
│ │ │ │ +
83 template<class B, class A=std::allocator<B> >
│ │ │ │ +
84 class block_vector_unmanaged : public base_array_unmanaged<B,A>
│ │ │ │ +
85 {
│ │ │ │ +
86 public:
│ │ │ │ +
87
│ │ │ │ +
88 //===== type definitions and constants
│ │ │ │ +
89 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
90
│ │ │ │ +
92 typedef B block_type;
│ │ │ │
93
│ │ │ │ -
94#endif
│ │ │ │ -
Reference operator[](const Key &key) const
Get the property for a key.
Definition properties.hh:69
│ │ │ │ -
RandomAccessBundledPropertyMap()
The default constructor.
Definition properties.hh:83
│ │ │ │ -
R Reference
The reference type of the container.
Definition properties.hh:49
│ │ │ │ -
RandomAccessBundledPropertyMap(Container &container)
Constructor.
Definition properties.hh:78
│ │ │ │ -
K Key
The key of the property map.
Definition properties.hh:52
│ │ │ │ -
LvaluePropertyMapTag Category
The category of the property map.
Definition properties.hh:57
│ │ │ │ -
C Container
The container that holds the properties.
Definition properties.hh:46
│ │ │ │ -
@ index
The index of the property in the bundle.
Definition properties.hh:61
│ │ │ │ +
95 typedef A allocator_type;
│ │ │ │ +
96
│ │ │ │ +
98 typedef typename A::size_type size_type;
│ │ │ │ +
99
│ │ │ │ +
101 typedef typename base_array_unmanaged<B,A>::iterator Iterator;
│ │ │ │ +
102
│ │ │ │ +
104 typedef typename base_array_unmanaged<B,A>::const_iterator ConstIterator;
│ │ │ │ +
105
│ │ │ │ +
107 typedef B value_type;
│ │ │ │ +
108
│ │ │ │ +
110 typedef B& reference;
│ │ │ │ +
111
│ │ │ │ +
113 typedef const B& const_reference;
│ │ │ │ +
114
│ │ │ │ +
115 //===== assignment from scalar
│ │ │ │ +
117
│ │ │ │ +
118 block_vector_unmanaged& operator= (const field_type& k)
│ │ │ │ +
119 {
│ │ │ │ +
120 for (size_type i=0; i<this->n; i++)
│ │ │ │ +
121 (*this)[i] = k;
│ │ │ │ +
122 return *this;
│ │ │ │ +
123 }
│ │ │ │ +
124
│ │ │ │ +
125 //===== vector space arithmetic
│ │ │ │ +
127 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y)
│ │ │ │ +
128 {
│ │ │ │ +
129#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
130 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
131#endif
│ │ │ │ +
132 for (size_type i=0; i<this->n; ++i) (*this)[i] += y[i];
│ │ │ │ +
133 return *this;
│ │ │ │ +
134 }
│ │ │ │ +
135
│ │ │ │ +
137 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y)
│ │ │ │ +
138 {
│ │ │ │ +
139#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
140 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
141#endif
│ │ │ │ +
142 for (size_type i=0; i<this->n; ++i) (*this)[i] -= y[i];
│ │ │ │ +
143 return *this;
│ │ │ │ +
144 }
│ │ │ │ +
145
│ │ │ │ +
147 block_vector_unmanaged& operator*= (const field_type& k)
│ │ │ │ +
148 {
│ │ │ │ +
149 for (size_type i=0; i<this->n; ++i) (*this)[i] *= k;
│ │ │ │ +
150 return *this;
│ │ │ │ +
151 }
│ │ │ │ +
152
│ │ │ │ +
154 block_vector_unmanaged& operator/= (const field_type& k)
│ │ │ │ +
155 {
│ │ │ │ +
156 for (size_type i=0; i<this->n; ++i) (*this)[i] /= k;
│ │ │ │ +
157 return *this;
│ │ │ │ +
158 }
│ │ │ │ +
159
│ │ │ │ +
161 block_vector_unmanaged& axpy (const field_type& a, const block_vector_unmanaged& y)
│ │ │ │ +
162 {
│ │ │ │ +
163#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
164 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
165#endif
│ │ │ │ +
166 for (size_type i=0; i<this->n; ++i)
│ │ │ │ +
167 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i]));
│ │ │ │ +
168
│ │ │ │ +
169 return *this;
│ │ │ │ +
170 }
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
180 template<class OtherB, class OtherA>
│ │ │ │ +
181 auto operator* (const block_vector_unmanaged<OtherB,OtherA>& y) const
│ │ │ │ +
182 {
│ │ │ │ +
183 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
│ │ │ │ +
184 PromotedType sum(0);
│ │ │ │ +
185#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
186 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
187#endif
│ │ │ │ +
188 for (size_type i=0; i<this->n; ++i) {
│ │ │ │ +
189 sum += PromotedType(((*this)[i])*y[i]);
│ │ │ │ +
190 }
│ │ │ │ +
191 return sum;
│ │ │ │ +
192 }
│ │ │ │ +
193
│ │ │ │ +
201 template<class OtherB, class OtherA>
│ │ │ │ +
202 auto dot(const block_vector_unmanaged<OtherB,OtherA>& y) const
│ │ │ │ +
203 {
│ │ │ │ +
204 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
│ │ │ │ +
205 PromotedType sum(0);
│ │ │ │ +
206#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
207 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
208#endif
│ │ │ │ +
209
│ │ │ │ +
210 for (size_type i=0; i<this->n; ++i)
│ │ │ │ +
211 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i]));
│ │ │ │ +
212
│ │ │ │ +
213 return sum;
│ │ │ │ +
214 }
│ │ │ │ +
215
│ │ │ │ +
216 //===== norms
│ │ │ │ +
217
│ │ │ │ +
219 typename FieldTraits<field_type>::real_type one_norm () const
│ │ │ │ +
220 {
│ │ │ │ +
221 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
222 for (size_type i=0; i<this->n; ++i)
│ │ │ │ +
223 sum += Impl::asVector((*this)[i]).one_norm();
│ │ │ │ +
224 return sum;
│ │ │ │ +
225 }
│ │ │ │ +
226
│ │ │ │ +
228 typename FieldTraits<field_type>::real_type one_norm_real () const
│ │ │ │ +
229 {
│ │ │ │ +
230 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
231 for (size_type i=0; i<this->n; ++i)
│ │ │ │ +
232 sum += Impl::asVector((*this)[i]).one_norm_real();
│ │ │ │ +
233 return sum;
│ │ │ │ +
234 }
│ │ │ │ +
235
│ │ │ │ +
237 typename FieldTraits<field_type>::real_type two_norm () const
│ │ │ │ +
238 {
│ │ │ │ +
239 using std::sqrt;
│ │ │ │ +
240 return sqrt(two_norm2());
│ │ │ │ +
241 }
│ │ │ │ +
242
│ │ │ │ +
244 typename FieldTraits<field_type>::real_type two_norm2 () const
│ │ │ │ +
245 {
│ │ │ │ +
246 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
247 for (size_type i=0; i<this->n; ++i)
│ │ │ │ +
248 sum += Impl::asVector((*this)[i]).two_norm2();
│ │ │ │ +
249 return sum;
│ │ │ │ +
250 }
│ │ │ │ +
251
│ │ │ │ +
253 template <typename ft = field_type,
│ │ │ │ +
254 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
255 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
256 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
257 using std::max;
│ │ │ │ +
258
│ │ │ │ +
259 real_type norm = 0;
│ │ │ │ +
260 for (auto const &xi : *this) {
│ │ │ │ +
261 real_type const a = Impl::asVector(xi).infinity_norm();
│ │ │ │ +
262 norm = max(a, norm);
│ │ │ │ +
263 }
│ │ │ │ +
264 return norm;
│ │ │ │ +
265 }
│ │ │ │ +
266
│ │ │ │ +
268 template <typename ft = field_type,
│ │ │ │ +
269 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
270 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
271 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
272 using std::max;
│ │ │ │ +
273
│ │ │ │ +
274 real_type norm = 0;
│ │ │ │ +
275 for (auto const &xi : *this) {
│ │ │ │ +
276 real_type const a = Impl::asVector(xi).infinity_norm_real();
│ │ │ │ +
277 norm = max(a, norm);
│ │ │ │ +
278 }
│ │ │ │ +
279 return norm;
│ │ │ │ +
280 }
│ │ │ │ +
281
│ │ │ │ +
283 template <typename ft = field_type,
│ │ │ │ +
284 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
285 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
286 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
287 using std::max;
│ │ │ │ +
288 using std::abs;
│ │ │ │ +
289
│ │ │ │ +
290 real_type norm = 0;
│ │ │ │ +
291 real_type isNaN = 1;
│ │ │ │ +
292
│ │ │ │ +
293 for (auto const &xi : *this) {
│ │ │ │ +
294 real_type const a = Impl::asVector(xi).infinity_norm();
│ │ │ │ +
295 norm = max(a, norm);
│ │ │ │ +
296 isNaN += a;
│ │ │ │ +
297 }
│ │ │ │ +
298 return norm * (isNaN / isNaN);
│ │ │ │ +
299 }
│ │ │ │ +
300
│ │ │ │ +
302 template <typename ft = field_type,
│ │ │ │ +
303 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
304 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
305 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
306 using std::max;
│ │ │ │ +
307
│ │ │ │ +
308 real_type norm = 0;
│ │ │ │ +
309 real_type isNaN = 1;
│ │ │ │ +
310
│ │ │ │ +
311 for (auto const &xi : *this) {
│ │ │ │ +
312 real_type const a = Impl::asVector(xi).infinity_norm_real();
│ │ │ │ +
313 norm = max(a, norm);
│ │ │ │ +
314 isNaN += a;
│ │ │ │ +
315 }
│ │ │ │ +
316
│ │ │ │ +
317 return norm * (isNaN / isNaN);
│ │ │ │ +
318 }
│ │ │ │ +
319
│ │ │ │ +
320 //===== sizes
│ │ │ │ +
321
│ │ │ │ +
323 size_type N () const
│ │ │ │ +
324 {
│ │ │ │ +
325 return this->n;
│ │ │ │ +
326 }
│ │ │ │ +
327
│ │ │ │ +
329 size_type dim () const
│ │ │ │ +
330 {
│ │ │ │ +
331 size_type d=0;
│ │ │ │ +
332
│ │ │ │ +
333 for (size_type i=0; i<this->n; i++)
│ │ │ │ +
334 d += Impl::asVector((*this)[i]).dim();
│ │ │ │ +
335
│ │ │ │ +
336 return d;
│ │ │ │ +
337 }
│ │ │ │ +
338
│ │ │ │ +
339 protected:
│ │ │ │ +
341 block_vector_unmanaged () : base_array_unmanaged<B,A>()
│ │ │ │ +
342 { }
│ │ │ │ +
343 };
│ │ │ │ +
344
│ │ │ │ +
346
│ │ │ │ +
351 template<class F>
│ │ │ │ +
352 class ScopeGuard {
│ │ │ │ +
353 F cleanupFunc_;
│ │ │ │ +
354 public:
│ │ │ │ +
355 ScopeGuard(F cleanupFunc) : cleanupFunc_(std::move(cleanupFunc)) {}
│ │ │ │ +
356 ScopeGuard(const ScopeGuard &) = delete;
│ │ │ │ +
357 ScopeGuard(ScopeGuard &&) = delete;
│ │ │ │ +
358 ScopeGuard &operator=(ScopeGuard) = delete;
│ │ │ │ +
359 ~ScopeGuard() { cleanupFunc_(); }
│ │ │ │ +
360 };
│ │ │ │ +
361
│ │ │ │ +
363
│ │ │ │ +
372 template<class F>
│ │ │ │ +
373 ScopeGuard<F> makeScopeGuard(F cleanupFunc)
│ │ │ │ +
374 {
│ │ │ │ +
375 return { std::move(cleanupFunc) };
│ │ │ │ +
376 }
│ │ │ │ +
377
│ │ │ │ +
378} // end namespace Imp
│ │ │ │ +
393 template<class B, class A=std::allocator<B> >
│ │ │ │ +
│ │ │ │ +
394 class BlockVector : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ +
395 {
│ │ │ │ +
396 public:
│ │ │ │ +
397
│ │ │ │ +
398 //===== type definitions and constants
│ │ │ │ +
399
│ │ │ │ +
401 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
402
│ │ │ │ +
404 typedef B block_type;
│ │ │ │ +
405
│ │ │ │ +
407 typedef A allocator_type;
│ │ │ │ +
408
│ │ │ │ +
410 typedef typename A::size_type size_type;
│ │ │ │ +
411
│ │ │ │ +
413 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
414 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ +
415
│ │ │ │ +
417 typedef typename Imp::block_vector_unmanaged<B,A>::Iterator Iterator;
│ │ │ │ +
418
│ │ │ │ +
420 typedef typename Imp::block_vector_unmanaged<B,A>::ConstIterator ConstIterator;
│ │ │ │ +
421
│ │ │ │ +
422 //===== constructors and such
│ │ │ │ +
423
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
426 {
│ │ │ │ +
427 syncBaseArray();
│ │ │ │ +
428 }
│ │ │ │ +
│ │ │ │ +
429
│ │ │ │ +
│ │ │ │ +
431 explicit BlockVector (size_type _n) : storage_(_n)
│ │ │ │ +
432 {
│ │ │ │ +
433 syncBaseArray();
│ │ │ │ +
434 }
│ │ │ │ +
│ │ │ │ +
435
│ │ │ │ +
│ │ │ │ +
437 BlockVector (std::initializer_list<B> const &l) : storage_(l)
│ │ │ │ +
438 {
│ │ │ │ +
439 syncBaseArray();
│ │ │ │ +
440 }
│ │ │ │ +
│ │ │ │ +
441
│ │ │ │ +
442
│ │ │ │ +
454 template<typename S>
│ │ │ │ +
│ │ │ │ +
455 BlockVector (size_type _n, S _capacity)
│ │ │ │ +
456 {
│ │ │ │ +
457 static_assert(std::numeric_limits<S>::is_integer,
│ │ │ │ +
458 "capacity must be an unsigned integral type (be aware, that this constructor does not set the default value!)" );
│ │ │ │ +
459 if((size_type)_capacity > _n)
│ │ │ │ +
460 storage_.reserve(_capacity);
│ │ │ │ +
461 storage_.resize(_n);
│ │ │ │ +
462 syncBaseArray();
│ │ │ │ +
463 }
│ │ │ │ +
│ │ │ │ +
464
│ │ │ │ +
465
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
476 {
│ │ │ │ +
477 [[maybe_unused]] const auto &guard =
│ │ │ │ +
478 Imp::makeScopeGuard([this]{ syncBaseArray(); });
│ │ │ │ +
479 storage_.reserve(capacity);
│ │ │ │ +
480 }
│ │ │ │ +
│ │ │ │ +
481
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
489 {
│ │ │ │ +
490 return storage_.capacity();
│ │ │ │ +
491 }
│ │ │ │ +
│ │ │ │ +
492
│ │ │ │ +
│ │ │ │ +
503 void resize(size_type size)
│ │ │ │ +
504 {
│ │ │ │ +
505 [[maybe_unused]] const auto &guard =
│ │ │ │ +
506 Imp::makeScopeGuard([this]{ syncBaseArray(); });
│ │ │ │ +
507 storage_.resize(size);
│ │ │ │ +
508 }
│ │ │ │ +
│ │ │ │ +
509
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
512 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
│ │ │ │ +
513 {
│ │ │ │ +
514 storage_ = a.storage_;
│ │ │ │ +
515 syncBaseArray();
│ │ │ │ +
516 }
│ │ │ │ +
│ │ │ │ +
517
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
520 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
│ │ │ │ +
521 {
│ │ │ │ +
522 swap(a);
│ │ │ │ +
523 }
│ │ │ │ +
│ │ │ │ +
524
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
527 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
│ │ │ │ +
528 {
│ │ │ │ +
529 [[maybe_unused]] const auto &guard =
│ │ │ │ +
530 Imp::makeScopeGuard([this]{ syncBaseArray(); });
│ │ │ │ +
531 storage_ = a.storage_;
│ │ │ │ +
532 return *this;
│ │ │ │ +
533 }
│ │ │ │ +
│ │ │ │ +
534
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
537 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
│ │ │ │ +
538 {
│ │ │ │ +
539 swap(a);
│ │ │ │ +
540 return *this;
│ │ │ │ +
541 }
│ │ │ │ +
│ │ │ │ +
542
│ │ │ │ +
│ │ │ │ +
544 void swap(BlockVector &other)
│ │ │ │ +
545 noexcept(noexcept(
│ │ │ │ +
546 std::declval<BlockVector&>().storage_.swap(other.storage_)))
│ │ │ │ +
547 {
│ │ │ │ +
548 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{
│ │ │ │ +
549 syncBaseArray();
│ │ │ │ +
550 other.syncBaseArray();
│ │ │ │ +
551 });
│ │ │ │ +
552 storage_.swap(other.storage_);
│ │ │ │ +
553 }
│ │ │ │ +
│ │ │ │ +
554
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
557 {
│ │ │ │ +
558 // forward to operator= in base class
│ │ │ │ +
559 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ +
560 return *this;
│ │ │ │ +
561 }
│ │ │ │ +
│ │ │ │ +
562
│ │ │ │ +
563 private:
│ │ │ │ +
564 void syncBaseArray() noexcept
│ │ │ │ +
565 {
│ │ │ │ +
566 this->p = storage_.data();
│ │ │ │ +
567 this->n = storage_.size();
│ │ │ │ +
568 }
│ │ │ │ +
569
│ │ │ │ +
570 std::vector<B, A> storage_;
│ │ │ │ +
571 };
│ │ │ │ +
│ │ │ │ +
572
│ │ │ │ +
578 template<class B, class A>
│ │ │ │ +
│ │ │ │ +
579 struct FieldTraits< BlockVector<B, A> >
│ │ │ │ +
580 {
│ │ │ │ +
581 typedef typename FieldTraits<B>::field_type field_type;
│ │ │ │ +
582 typedef typename FieldTraits<B>::real_type real_type;
│ │ │ │ +
583 };
│ │ │ │ +
│ │ │ │ +
589 template<class K, class A>
│ │ │ │ +
│ │ │ │ +
590 std::ostream& operator<< (std::ostream& s, const BlockVector<K, A>& v)
│ │ │ │ +
591 {
│ │ │ │ +
592 typedef typename BlockVector<K, A>::size_type size_type;
│ │ │ │ +
593
│ │ │ │ +
594 for (size_type i=0; i<v.size(); i++)
│ │ │ │ +
595 s << v[i] << std::endl;
│ │ │ │ +
596
│ │ │ │ +
597 return s;
│ │ │ │ +
598 }
│ │ │ │ +
│ │ │ │ +
599
│ │ │ │ +
601namespace Imp {
│ │ │ │ +
602
│ │ │ │ +
621#ifndef DOXYGEN
│ │ │ │ +
622 template<class B, class A>
│ │ │ │ +
623#else
│ │ │ │ +
624 template<class B, class A=std::allocator<B> >
│ │ │ │ +
625#endif
│ │ │ │ +
626 class BlockVectorWindow : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ +
627 {
│ │ │ │ +
628 public:
│ │ │ │ +
629
│ │ │ │ +
630 //===== type definitions and constants
│ │ │ │ +
631
│ │ │ │ +
633 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
634
│ │ │ │ +
636 typedef B block_type;
│ │ │ │ +
637
│ │ │ │ +
639 typedef A allocator_type;
│ │ │ │ +
640
│ │ │ │ +
642 typedef typename A::size_type size_type;
│ │ │ │ +
643
│ │ │ │ +
645 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
646 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ +
647
│ │ │ │ +
649 typedef typename Imp::block_vector_unmanaged<B,A>::Iterator Iterator;
│ │ │ │ +
650
│ │ │ │ +
652 typedef typename Imp::block_vector_unmanaged<B,A>::ConstIterator ConstIterator;
│ │ │ │ +
653
│ │ │ │ +
654
│ │ │ │ +
655 //===== constructors and such
│ │ │ │ +
657 BlockVectorWindow () : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ +
658 { }
│ │ │ │ +
659
│ │ │ │ +
661 BlockVectorWindow (B* _p, size_type _n)
│ │ │ │ +
662 {
│ │ │ │ +
663 this->n = _n;
│ │ │ │ +
664 this->p = _p;
│ │ │ │ +
665 }
│ │ │ │ +
666
│ │ │ │ +
668 BlockVectorWindow (const BlockVectorWindow& a)
│ │ │ │ +
669 {
│ │ │ │ +
670 this->n = a.n;
│ │ │ │ +
671 this->p = a.p;
│ │ │ │ +
672 }
│ │ │ │ +
673
│ │ │ │ +
675 BlockVectorWindow& operator= (const BlockVectorWindow& a)
│ │ │ │ +
676 {
│ │ │ │ +
677 // check correct size
│ │ │ │ +
678#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
679 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
680#endif
│ │ │ │ +
681
│ │ │ │ +
682 if (&a!=this) // check if this and a are different objects
│ │ │ │ +
683 {
│ │ │ │ +
684 // copy data
│ │ │ │ +
685 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ +
686 }
│ │ │ │ +
687 return *this;
│ │ │ │ +
688 }
│ │ │ │ +
689
│ │ │ │ +
691 BlockVectorWindow& operator= (const field_type& k)
│ │ │ │ +
692 {
│ │ │ │ +
693 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ +
694 return *this;
│ │ │ │ +
695 }
│ │ │ │ +
696
│ │ │ │ +
698 operator BlockVector<B, A>() const {
│ │ │ │ +
699 auto bv = BlockVector<B, A>(this->n);
│ │ │ │ +
700
│ │ │ │ +
701 std::copy(this->begin(), this->end(), bv.begin());
│ │ │ │ +
702
│ │ │ │ +
703 return bv;
│ │ │ │ +
704 }
│ │ │ │ +
705
│ │ │ │ +
706 //===== window manipulation methods
│ │ │ │ +
707
│ │ │ │ +
709 void set (size_type _n, B* _p)
│ │ │ │ +
710 {
│ │ │ │ +
711 this->n = _n;
│ │ │ │ +
712 this->p = _p;
│ │ │ │ +
713 }
│ │ │ │ +
714
│ │ │ │ +
716 void setsize (size_type _n)
│ │ │ │ +
717 {
│ │ │ │ +
718 this->n = _n;
│ │ │ │ +
719 }
│ │ │ │ +
720
│ │ │ │ +
722 void setptr (B* _p)
│ │ │ │ +
723 {
│ │ │ │ +
724 this->p = _p;
│ │ │ │ +
725 }
│ │ │ │ +
726
│ │ │ │ +
728 B* getptr ()
│ │ │ │ +
729 {
│ │ │ │ +
730 return this->p;
│ │ │ │ +
731 }
│ │ │ │ +
732
│ │ │ │ +
734 size_type getsize () const
│ │ │ │ +
735 {
│ │ │ │ +
736 return this->n;
│ │ │ │ +
737 }
│ │ │ │ +
738 };
│ │ │ │ +
739
│ │ │ │ +
740
│ │ │ │ +
741
│ │ │ │ +
752 template<class B, class A=std::allocator<B> >
│ │ │ │ +
753 class compressed_block_vector_unmanaged : public compressed_base_array_unmanaged<B,A>
│ │ │ │ +
754 {
│ │ │ │ +
755 public:
│ │ │ │ +
756
│ │ │ │ +
757 //===== type definitions and constants
│ │ │ │ +
758
│ │ │ │ +
760 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
761
│ │ │ │ +
763 typedef B block_type;
│ │ │ │ +
764
│ │ │ │ +
766 typedef A allocator_type;
│ │ │ │ +
767
│ │ │ │ +
769 typedef typename compressed_base_array_unmanaged<B,A>::iterator Iterator;
│ │ │ │ +
770
│ │ │ │ +
772 typedef typename compressed_base_array_unmanaged<B,A>::const_iterator ConstIterator;
│ │ │ │ +
773
│ │ │ │ +
775 typedef typename A::size_type size_type;
│ │ │ │ +
776
│ │ │ │ +
777 //===== assignment from scalar
│ │ │ │ +
778
│ │ │ │ +
779 compressed_block_vector_unmanaged& operator= (const field_type& k)
│ │ │ │ +
780 {
│ │ │ │ +
781 for (size_type i=0; i<this->n; i++)
│ │ │ │ +
782 (this->p)[i] = k;
│ │ │ │ +
783 return *this;
│ │ │ │ +
784 }
│ │ │ │ +
785
│ │ │ │ +
786
│ │ │ │ +
787 //===== vector space arithmetic
│ │ │ │ +
788
│ │ │ │ +
790 template<class V>
│ │ │ │ +
791 compressed_block_vector_unmanaged& operator+= (const V& y)
│ │ │ │ +
792 {
│ │ │ │ +
793#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
794 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ +
795#endif
│ │ │ │ +
796 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) += y.p[i];
│ │ │ │ +
797 return *this;
│ │ │ │ +
798 }
│ │ │ │ +
799
│ │ │ │ +
801 template<class V>
│ │ │ │ +
802 compressed_block_vector_unmanaged& operator-= (const V& y)
│ │ │ │ +
803 {
│ │ │ │ +
804#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
805 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ +
806#endif
│ │ │ │ +
807 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) -= y.p[i];
│ │ │ │ +
808 return *this;
│ │ │ │ +
809 }
│ │ │ │ +
810
│ │ │ │ +
812 template<class V>
│ │ │ │ +
813 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y)
│ │ │ │ +
814 {
│ │ │ │ +
815#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
816 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ +
817#endif
│ │ │ │ +
818 for (size_type i=0; i<y.n; ++i)
│ │ │ │ +
819 Impl::asVector((*this)[y.j[i]]).axpy(a,Impl::asVector(y.p[i]));
│ │ │ │ +
820 return *this;
│ │ │ │ +
821 }
│ │ │ │ +
822
│ │ │ │ +
824 compressed_block_vector_unmanaged& operator*= (const field_type& k)
│ │ │ │ +
825 {
│ │ │ │ +
826 for (size_type i=0; i<this->n; ++i) (this->p)[i] *= k;
│ │ │ │ +
827 return *this;
│ │ │ │ +
828 }
│ │ │ │ +
829
│ │ │ │ +
831 compressed_block_vector_unmanaged& operator/= (const field_type& k)
│ │ │ │ +
832 {
│ │ │ │ +
833 for (size_type i=0; i<this->n; ++i) (this->p)[i] /= k;
│ │ │ │ +
834 return *this;
│ │ │ │ +
835 }
│ │ │ │ +
836
│ │ │ │ +
837
│ │ │ │ +
838 //===== Euclidean scalar product
│ │ │ │ +
839
│ │ │ │ +
841 field_type operator* (const compressed_block_vector_unmanaged& y) const
│ │ │ │ +
842 {
│ │ │ │ +
843#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
844 if (!includesindexset(y) || !y.includesindexset(*this) )
│ │ │ │ +
845 DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ +
846#endif
│ │ │ │ +
847 field_type sum=0;
│ │ │ │ +
848 for (size_type i=0; i<this->n; ++i)
│ │ │ │ +
849 sum += (this->p)[i] * y[(this->j)[i]];
│ │ │ │ +
850 return sum;
│ │ │ │ +
851 }
│ │ │ │ +
852
│ │ │ │ +
853
│ │ │ │ +
854 //===== norms
│ │ │ │ +
855
│ │ │ │ +
857 typename FieldTraits<field_type>::real_type one_norm () const
│ │ │ │ +
858 {
│ │ │ │ +
859 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
860 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm();
│ │ │ │ +
861 return sum;
│ │ │ │ +
862 }
│ │ │ │ +
863
│ │ │ │ +
865 typename FieldTraits<field_type>::real_type one_norm_real () const
│ │ │ │ +
866 {
│ │ │ │ +
867 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
868 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm_real();
│ │ │ │ +
869 return sum;
│ │ │ │ +
870 }
│ │ │ │ +
871
│ │ │ │ +
873 typename FieldTraits<field_type>::real_type two_norm () const
│ │ │ │ +
874 {
│ │ │ │ +
875 using std::sqrt;
│ │ │ │ +
876 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
877 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
│ │ │ │ +
878 return sqrt(sum);
│ │ │ │ +
879 }
│ │ │ │ +
880
│ │ │ │ +
882 typename FieldTraits<field_type>::real_type two_norm2 () const
│ │ │ │ +
883 {
│ │ │ │ +
884 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
885 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
│ │ │ │ +
886 return sum;
│ │ │ │ +
887 }
│ │ │ │ +
888
│ │ │ │ +
890 template <typename ft = field_type,
│ │ │ │ +
891 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
892 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
893 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
894 using std::max;
│ │ │ │ +
895
│ │ │ │ +
896 real_type norm = 0;
│ │ │ │ +
897 for (auto const &x : *this) {
│ │ │ │ +
898 real_type const a = x.infinity_norm();
│ │ │ │ +
899 norm = max(a, norm);
│ │ │ │ +
900 }
│ │ │ │ +
901 return norm;
│ │ │ │ +
902 }
│ │ │ │ +
903
│ │ │ │ +
905 template <typename ft = field_type,
│ │ │ │ +
906 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
907 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
908 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
909 using std::max;
│ │ │ │ +
910
│ │ │ │ +
911 real_type norm = 0;
│ │ │ │ +
912 for (auto const &x : *this) {
│ │ │ │ +
913 real_type const a = x.infinity_norm_real();
│ │ │ │ +
914 norm = max(a, norm);
│ │ │ │ +
915 }
│ │ │ │ +
916 return norm;
│ │ │ │ +
917 }
│ │ │ │ +
918
│ │ │ │ +
920 template <typename ft = field_type,
│ │ │ │ +
921 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
922 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
923 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
924 using std::max;
│ │ │ │ +
925
│ │ │ │ +
926 real_type norm = 0;
│ │ │ │ +
927 real_type isNaN = 1;
│ │ │ │ +
928 for (auto const &x : *this) {
│ │ │ │ +
929 real_type const a = x.infinity_norm();
│ │ │ │ +
930 norm = max(a, norm);
│ │ │ │ +
931 isNaN += a;
│ │ │ │ +
932 }
│ │ │ │ +
933 return norm * (isNaN / isNaN);
│ │ │ │ +
934 }
│ │ │ │ +
935
│ │ │ │ +
937 template <typename ft = field_type,
│ │ │ │ +
938 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
939 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
940 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
941 using std::max;
│ │ │ │ +
942
│ │ │ │ +
943 real_type norm = 0;
│ │ │ │ +
944 real_type isNaN = 1;
│ │ │ │ +
945 for (auto const &x : *this) {
│ │ │ │ +
946 real_type const a = x.infinity_norm_real();
│ │ │ │ +
947 norm = max(a, norm);
│ │ │ │ +
948 isNaN += a;
│ │ │ │ +
949 }
│ │ │ │ +
950 return norm * (isNaN / isNaN);
│ │ │ │ +
951 }
│ │ │ │ +
952
│ │ │ │ +
953 //===== sizes
│ │ │ │ +
954
│ │ │ │ +
956 size_type N () const
│ │ │ │ +
957 {
│ │ │ │ +
958 return this->n;
│ │ │ │ +
959 }
│ │ │ │ +
960
│ │ │ │ +
962 size_type dim () const
│ │ │ │ +
963 {
│ │ │ │ +
964 size_type d=0;
│ │ │ │ +
965 for (size_type i=0; i<this->n; i++)
│ │ │ │ +
966 d += (this->p)[i].dim();
│ │ │ │ +
967 return d;
│ │ │ │ +
968 }
│ │ │ │ +
969
│ │ │ │ +
970 protected:
│ │ │ │ +
972 compressed_block_vector_unmanaged () : compressed_base_array_unmanaged<B,A>()
│ │ │ │ +
973 { }
│ │ │ │ +
974
│ │ │ │ +
976 template<class V>
│ │ │ │ +
977 bool includesindexset (const V& y)
│ │ │ │ +
978 {
│ │ │ │ +
979 typename V::ConstIterator e=this->end();
│ │ │ │ +
980 for (size_type i=0; i<y.n; i++)
│ │ │ │ +
981 if (this->find(y.j[i])==e)
│ │ │ │ +
982 return false;
│ │ │ │ +
983 return true;
│ │ │ │ +
984 }
│ │ │ │ +
985 };
│ │ │ │ +
986
│ │ │ │ +
987
│ │ │ │ +
1006 template<class B, class A=std::allocator<B> >
│ │ │ │ +
1007 class CompressedBlockVectorWindow : public compressed_block_vector_unmanaged<B,A>
│ │ │ │ +
1008 {
│ │ │ │ +
1009 public:
│ │ │ │ +
1010
│ │ │ │ +
1011 //===== type definitions and constants
│ │ │ │ +
1012
│ │ │ │ +
1014 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
1015
│ │ │ │ +
1017 typedef B block_type;
│ │ │ │ +
1018
│ │ │ │ +
1020 typedef A allocator_type;
│ │ │ │ +
1021
│ │ │ │ +
1023 typedef typename A::size_type size_type;
│ │ │ │ +
1024
│ │ │ │ +
1026 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
1027 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ +
1028
│ │ │ │ +
1030 typedef typename compressed_block_vector_unmanaged<B,A>::Iterator Iterator;
│ │ │ │ +
1031
│ │ │ │ +
1033 typedef typename compressed_block_vector_unmanaged<B,A>::ConstIterator ConstIterator;
│ │ │ │ +
1034
│ │ │ │ +
1035
│ │ │ │ +
1036 //===== constructors and such
│ │ │ │ +
1038 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged<B,A>()
│ │ │ │ +
1039 { }
│ │ │ │ +
1040
│ │ │ │ +
1042 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n)
│ │ │ │ +
1043 {
│ │ │ │ +
1044 this->n = _n;
│ │ │ │ +
1045 this->p = _p;
│ │ │ │ +
1046 this->j = _j;
│ │ │ │ +
1047 }
│ │ │ │ +
1048
│ │ │ │ +
1050 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a)
│ │ │ │ +
1051 {
│ │ │ │ +
1052 this->n = a.n;
│ │ │ │ +
1053 this->p = a.p;
│ │ │ │ +
1054 this->j = a.j;
│ │ │ │ +
1055 }
│ │ │ │ +
1056
│ │ │ │ +
1058 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow& a)
│ │ │ │ +
1059 {
│ │ │ │ +
1060 // check correct size
│ │ │ │ +
1061#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1062 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ +
1063#endif
│ │ │ │ +
1064
│ │ │ │ +
1065 if (&a!=this) // check if this and a are different objects
│ │ │ │ +
1066 {
│ │ │ │ +
1067 // copy data
│ │ │ │ +
1068 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ +
1069 for (size_type i=0; i<this->n; i++) this->j[i]=a.j[i];
│ │ │ │ +
1070 }
│ │ │ │ +
1071 return *this;
│ │ │ │ +
1072 }
│ │ │ │ +
1073
│ │ │ │ +
1075 CompressedBlockVectorWindow& operator= (const field_type& k)
│ │ │ │ +
1076 {
│ │ │ │ +
1077 (static_cast<compressed_block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ +
1078 return *this;
│ │ │ │ +
1079 }
│ │ │ │ +
1080
│ │ │ │ +
1081
│ │ │ │ +
1082 //===== window manipulation methods
│ │ │ │ +
1083
│ │ │ │ +
1085 void set (size_type _n, B* _p, size_type* _j)
│ │ │ │ +
1086 {
│ │ │ │ +
1087 this->n = _n;
│ │ │ │ +
1088 this->p = _p;
│ │ │ │ +
1089 this->j = _j;
│ │ │ │ +
1090 }
│ │ │ │ +
1091
│ │ │ │ +
1093 void setsize (size_type _n)
│ │ │ │ +
1094 {
│ │ │ │ +
1095 this->n = _n;
│ │ │ │ +
1096 }
│ │ │ │ +
1097
│ │ │ │ +
1099 void setptr (B* _p)
│ │ │ │ +
1100 {
│ │ │ │ +
1101 this->p = _p;
│ │ │ │ +
1102 }
│ │ │ │ +
1103
│ │ │ │ +
1105 void setindexptr (size_type* _j)
│ │ │ │ +
1106 {
│ │ │ │ +
1107 this->j = _j;
│ │ │ │ +
1108 }
│ │ │ │ +
1109
│ │ │ │ +
1111 B* getptr ()
│ │ │ │ +
1112 {
│ │ │ │ +
1113 return this->p;
│ │ │ │ +
1114 }
│ │ │ │ +
1115
│ │ │ │ +
1117 size_type* getindexptr ()
│ │ │ │ +
1118 {
│ │ │ │ +
1119 return this->j;
│ │ │ │ +
1120 }
│ │ │ │ +
1121
│ │ │ │ +
1123 const B* getptr () const
│ │ │ │ +
1124 {
│ │ │ │ +
1125 return this->p;
│ │ │ │ +
1126 }
│ │ │ │ +
1127
│ │ │ │ +
1129 const size_type* getindexptr () const
│ │ │ │ +
1130 {
│ │ │ │ +
1131 return this->j;
│ │ │ │ +
1132 }
│ │ │ │ +
1134 size_type getsize () const
│ │ │ │ +
1135 {
│ │ │ │ +
1136 return this->n;
│ │ │ │ +
1137 }
│ │ │ │ +
1138 };
│ │ │ │ +
1139
│ │ │ │ +
1140} // end namespace 'Imp'
│ │ │ │ +
1141
│ │ │ │ +
1142
│ │ │ │ +
1144 template<typename B, typename A>
│ │ │ │ +
1145 struct AutonomousValueType<Imp::BlockVectorWindow<B,A>>
│ │ │ │ +
1146 {
│ │ │ │ +
1147 using type = BlockVector<B, A>;
│ │ │ │ +
1148 };
│ │ │ │ +
1149
│ │ │ │ +
1150
│ │ │ │ +
1151} // end namespace 'Dune'
│ │ │ │ +
1152
│ │ │ │ +
1153#endif
│ │ │ │ + │ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
Implements several basic array containers.
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Tag idnetifying the visited property of a vertex.
Definition properties.hh:29
│ │ │ │ -
A property map that extracts one property out of a bundle using operator[]()
Definition properties.hh:43
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
Send BlockVector to an output stream.
Definition bvector.hh:590
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
BlockVector()
makes empty vector
Definition bvector.hh:425
│ │ │ │ +
void reserve(size_type capacity)
Reserve space.
Definition bvector.hh:475
│ │ │ │ +
BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector >().swap(a)))
move constructor
Definition bvector.hh:519
│ │ │ │ +
BlockVector(size_type _n)
make vector with _n components
Definition bvector.hh:431
│ │ │ │ +
void resize(size_type size)
Resize the vector.
Definition bvector.hh:503
│ │ │ │ +
Imp::block_vector_unmanaged< B, A >::Iterator Iterator
make iterators available as types
Definition bvector.hh:417
│ │ │ │ +
static constexpr unsigned int blocklevel
increment block level counter
Definition bvector.hh:414
│ │ │ │ +
BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
copy constructor
Definition bvector.hh:511
│ │ │ │ +
A allocator_type
export the allocator type
Definition bvector.hh:407
│ │ │ │ +
BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
assignment
Definition bvector.hh:526
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ +
A::size_type size_type
The type for the index access.
Definition bvector.hh:410
│ │ │ │ +
BlockVector(std::initializer_list< B > const &l)
Construct from a std::initializer_list.
Definition bvector.hh:437
│ │ │ │ +
size_type capacity() const
Get the capacity of the vector.
Definition bvector.hh:488
│ │ │ │ +
BlockVector(size_type _n, S _capacity)
Make vector with _n components but preallocating capacity components.
Definition bvector.hh:455
│ │ │ │ +
B block_type
export the type representing the components
Definition bvector.hh:404
│ │ │ │ +
void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & >().storage_.swap(other.storage_)))
swap operation
Definition bvector.hh:544
│ │ │ │ +
Imp::block_vector_unmanaged< B, A >::ConstIterator ConstIterator
make iterators available as types
Definition bvector.hh:420
│ │ │ │ +
FieldTraits< B >::real_type real_type
Definition bvector.hh:582
│ │ │ │ +
FieldTraits< B >::field_type field_type
Definition bvector.hh:581
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,110 +1,1010 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -properties.hh │ │ │ │ │ +bvector.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH │ │ │ │ │ -6#define DUNE_ISTL_AMG_PROPERTIES_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10namespace _D_u_n_e │ │ │ │ │ -11{ │ │ │ │ │ -12 │ │ │ │ │ -13 namespace Amg │ │ │ │ │ -14 { │ │ │ │ │ -_2_8 struct _V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ -29 {}; │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_ISTL_BVECTOR_HH │ │ │ │ │ +7#define DUNE_ISTL_BVECTOR_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23#include │ │ │ │ │ +24#include │ │ │ │ │ +25 │ │ │ │ │ +26#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +27 │ │ │ │ │ +28#include "_b_a_s_e_a_r_r_a_y_._h_h" │ │ │ │ │ +29#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ 30 │ │ │ │ │ -31 │ │ │ │ │ -38 template │ │ │ │ │ -_4_0 class _R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -41 : public RAPropertyMapHelper > │ │ │ │ │ -43 { │ │ │ │ │ -44 public: │ │ │ │ │ -_4_6 typedef C _C_o_n_t_a_i_n_e_r; │ │ │ │ │ -47 │ │ │ │ │ -_4_9 typedef R _R_e_f_e_r_e_n_c_e; │ │ │ │ │ +38namespace _D_u_n_e { │ │ │ │ │ +39 │ │ │ │ │ +41namespace Imp { │ │ │ │ │ +42 │ │ │ │ │ +48 template │ │ │ │ │ +49 class BlockTraitsImp; │ │ │ │ │ 50 │ │ │ │ │ -_5_2 typedef K _K_e_y; │ │ │ │ │ -53 │ │ │ │ │ -_5_7 typedef LvaluePropertyMapTag _C_a_t_e_g_o_r_y; │ │ │ │ │ -58 │ │ │ │ │ -59 enum { │ │ │ │ │ -61 _i_n_d_e_x = i │ │ │ │ │ -_6_2 }; │ │ │ │ │ -63 │ │ │ │ │ -_6_9 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](const _K_e_y& key) const │ │ │ │ │ -70 { │ │ │ │ │ -71 return container_[key][_i_n_d_e_x]; │ │ │ │ │ -72 } │ │ │ │ │ -73 │ │ │ │ │ -_7_8 _R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p(_C_o_n_t_a_i_n_e_r& container) │ │ │ │ │ -79 : container_(&container) │ │ │ │ │ -80 {} │ │ │ │ │ -81 │ │ │ │ │ -_8_3 _R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p() │ │ │ │ │ -84 : container_(0) │ │ │ │ │ -85 {} │ │ │ │ │ -86 │ │ │ │ │ -87 private: │ │ │ │ │ -89 _C_o_n_t_a_i_n_e_r* container_; │ │ │ │ │ -90 }; │ │ │ │ │ -91 } │ │ │ │ │ -92} │ │ │ │ │ +51 template │ │ │ │ │ +52 class BlockTraitsImp │ │ │ │ │ +53 { │ │ │ │ │ +54 public: │ │ │ │ │ +55 using field_type = B; │ │ │ │ │ +56 }; │ │ │ │ │ +57 │ │ │ │ │ +58 template │ │ │ │ │ +59 class BlockTraitsImp │ │ │ │ │ +60 { │ │ │ │ │ +61 public: │ │ │ │ │ +62 using field_type = typename B::field_type; │ │ │ │ │ +63 }; │ │ │ │ │ +64 │ │ │ │ │ +67 template │ │ │ │ │ +68 using BlockTraits = BlockTraitsImp::value>; │ │ │ │ │ +69 │ │ │ │ │ +83 template > │ │ │ │ │ +84 class block_vector_unmanaged : public base_array_unmanaged │ │ │ │ │ +85 { │ │ │ │ │ +86 public: │ │ │ │ │ +87 │ │ │ │ │ +88 //===== type definitions and constants │ │ │ │ │ +89 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ +90 │ │ │ │ │ +92 typedef B block_type; │ │ │ │ │ 93 │ │ │ │ │ -94#endif │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -Reference operator[](const Key &key) const │ │ │ │ │ -Get the property for a key. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -RandomAccessBundledPropertyMap() │ │ │ │ │ -The default constructor. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ -R Reference │ │ │ │ │ -The reference type of the container. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -RandomAccessBundledPropertyMap(Container &container) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_K_e_y │ │ │ │ │ -K Key │ │ │ │ │ -The key of the property map. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -LvaluePropertyMapTag Category │ │ │ │ │ -The category of the property map. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ -C Container │ │ │ │ │ -The container that holds the properties. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p_:_:_i_n_d_e_x │ │ │ │ │ -@ index │ │ │ │ │ -The index of the property in the bundle. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:61 │ │ │ │ │ +95 typedef A allocator_type; │ │ │ │ │ +96 │ │ │ │ │ +98 typedef typename A::size_type size_type; │ │ │ │ │ +99 │ │ │ │ │ +101 typedef typename base_array_unmanaged::iterator Iterator; │ │ │ │ │ +102 │ │ │ │ │ +104 typedef typename base_array_unmanaged::const_iterator ConstIterator; │ │ │ │ │ +105 │ │ │ │ │ +107 typedef B value_type; │ │ │ │ │ +108 │ │ │ │ │ +110 typedef B& reference; │ │ │ │ │ +111 │ │ │ │ │ +113 typedef const B& const_reference; │ │ │ │ │ +114 │ │ │ │ │ +115 //===== assignment from scalar │ │ │ │ │ +117 │ │ │ │ │ +118 block_vector_unmanaged& operator= (const field_type& k) │ │ │ │ │ +119 { │ │ │ │ │ +120 for (size_type i=0; in; i++) │ │ │ │ │ +121 (*this)[i] = k; │ │ │ │ │ +122 return *this; │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +125 //===== vector space arithmetic │ │ │ │ │ +127 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y) │ │ │ │ │ +128 { │ │ │ │ │ +129#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +130 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +131#endif │ │ │ │ │ +132 for (size_type i=0; in; ++i) (*this)[i] += y[i]; │ │ │ │ │ +133 return *this; │ │ │ │ │ +134 } │ │ │ │ │ +135 │ │ │ │ │ +137 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y) │ │ │ │ │ +138 { │ │ │ │ │ +139#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +140 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +141#endif │ │ │ │ │ +142 for (size_type i=0; in; ++i) (*this)[i] -= y[i]; │ │ │ │ │ +143 return *this; │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ +147 block_vector_unmanaged& operator*= (const field_type& k) │ │ │ │ │ +148 { │ │ │ │ │ +149 for (size_type i=0; in; ++i) (*this)[i] *= k; │ │ │ │ │ +150 return *this; │ │ │ │ │ +151 } │ │ │ │ │ +152 │ │ │ │ │ +154 block_vector_unmanaged& operator/= (const field_type& k) │ │ │ │ │ +155 { │ │ │ │ │ +156 for (size_type i=0; in; ++i) (*this)[i] /= k; │ │ │ │ │ +157 return *this; │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +161 block_vector_unmanaged& axpy (const field_type& a, const │ │ │ │ │ +block_vector_unmanaged& y) │ │ │ │ │ +162 { │ │ │ │ │ +163#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +164 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +165#endif │ │ │ │ │ +166 for (size_type i=0; in; ++i) │ │ │ │ │ +167 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i])); │ │ │ │ │ +168 │ │ │ │ │ +169 return *this; │ │ │ │ │ +170 } │ │ │ │ │ +171 │ │ │ │ │ +172 │ │ │ │ │ +180 template │ │ │ │ │ +181 auto operator* (const block_vector_unmanaged& y) const │ │ │ │ │ +182 { │ │ │ │ │ +183 typedef typename PromotionTraits:: │ │ │ │ │ +field_type>::PromotedType PromotedType; │ │ │ │ │ +184 PromotedType sum(0); │ │ │ │ │ +185#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +186 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +187#endif │ │ │ │ │ +188 for (size_type i=0; in; ++i) { │ │ │ │ │ +189 sum += PromotedType(((*this)[i])*y[i]); │ │ │ │ │ +190 } │ │ │ │ │ +191 return sum; │ │ │ │ │ +192 } │ │ │ │ │ +193 │ │ │ │ │ +201 template │ │ │ │ │ +202 auto dot(const block_vector_unmanaged& y) const │ │ │ │ │ +203 { │ │ │ │ │ +204 typedef typename PromotionTraits:: │ │ │ │ │ +field_type>::PromotedType PromotedType; │ │ │ │ │ +205 PromotedType sum(0); │ │ │ │ │ +206#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +207 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +208#endif │ │ │ │ │ +209 │ │ │ │ │ +210 for (size_type i=0; in; ++i) │ │ │ │ │ +211 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i])); │ │ │ │ │ +212 │ │ │ │ │ +213 return sum; │ │ │ │ │ +214 } │ │ │ │ │ +215 │ │ │ │ │ +216 //===== norms │ │ │ │ │ +217 │ │ │ │ │ +219 typename FieldTraits::real_type one_norm () const │ │ │ │ │ +220 { │ │ │ │ │ +221 typename FieldTraits::real_type sum=0; │ │ │ │ │ +222 for (size_type i=0; in; ++i) │ │ │ │ │ +223 sum += Impl::asVector((*this)[i]).one_norm(); │ │ │ │ │ +224 return sum; │ │ │ │ │ +225 } │ │ │ │ │ +226 │ │ │ │ │ +228 typename FieldTraits::real_type one_norm_real () const │ │ │ │ │ +229 { │ │ │ │ │ +230 typename FieldTraits::real_type sum=0; │ │ │ │ │ +231 for (size_type i=0; in; ++i) │ │ │ │ │ +232 sum += Impl::asVector((*this)[i]).one_norm_real(); │ │ │ │ │ +233 return sum; │ │ │ │ │ +234 } │ │ │ │ │ +235 │ │ │ │ │ +237 typename FieldTraits::real_type two_norm () const │ │ │ │ │ +238 { │ │ │ │ │ +239 using std::sqrt; │ │ │ │ │ +240 return sqrt(two_norm2()); │ │ │ │ │ +241 } │ │ │ │ │ +242 │ │ │ │ │ +244 typename FieldTraits::real_type two_norm2 () const │ │ │ │ │ +245 { │ │ │ │ │ +246 typename FieldTraits::real_type sum=0; │ │ │ │ │ +247 for (size_type i=0; in; ++i) │ │ │ │ │ +248 sum += Impl::asVector((*this)[i]).two_norm2(); │ │ │ │ │ +249 return sum; │ │ │ │ │ +250 } │ │ │ │ │ +251 │ │ │ │ │ +253 template ::value, int>::type = 0> │ │ │ │ │ +255 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ +256 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +257 using std::max; │ │ │ │ │ +258 │ │ │ │ │ +259 real_type norm = 0; │ │ │ │ │ +260 for (auto const &xi : *this) { │ │ │ │ │ +261 real_type const a = Impl::asVector(xi).infinity_norm(); │ │ │ │ │ +262 norm = max(a, norm); │ │ │ │ │ +263 } │ │ │ │ │ +264 return norm; │ │ │ │ │ +265 } │ │ │ │ │ +266 │ │ │ │ │ +268 template ::value, int>::type = 0> │ │ │ │ │ +270 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ +271 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +272 using std::max; │ │ │ │ │ +273 │ │ │ │ │ +274 real_type norm = 0; │ │ │ │ │ +275 for (auto const &xi : *this) { │ │ │ │ │ +276 real_type const a = Impl::asVector(xi).infinity_norm_real(); │ │ │ │ │ +277 norm = max(a, norm); │ │ │ │ │ +278 } │ │ │ │ │ +279 return norm; │ │ │ │ │ +280 } │ │ │ │ │ +281 │ │ │ │ │ +283 template ::value, int>::type = 0> │ │ │ │ │ +285 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ +286 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +287 using std::max; │ │ │ │ │ +288 using std::abs; │ │ │ │ │ +289 │ │ │ │ │ +290 real_type norm = 0; │ │ │ │ │ +291 real_type isNaN = 1; │ │ │ │ │ +292 │ │ │ │ │ +293 for (auto const &xi : *this) { │ │ │ │ │ +294 real_type const a = Impl::asVector(xi).infinity_norm(); │ │ │ │ │ +295 norm = max(a, norm); │ │ │ │ │ +296 isNaN += a; │ │ │ │ │ +297 } │ │ │ │ │ +298 return norm * (isNaN / isNaN); │ │ │ │ │ +299 } │ │ │ │ │ +300 │ │ │ │ │ +302 template ::value, int>::type = 0> │ │ │ │ │ +304 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ +305 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +306 using std::max; │ │ │ │ │ +307 │ │ │ │ │ +308 real_type norm = 0; │ │ │ │ │ +309 real_type isNaN = 1; │ │ │ │ │ +310 │ │ │ │ │ +311 for (auto const &xi : *this) { │ │ │ │ │ +312 real_type const a = Impl::asVector(xi).infinity_norm_real(); │ │ │ │ │ +313 norm = max(a, norm); │ │ │ │ │ +314 isNaN += a; │ │ │ │ │ +315 } │ │ │ │ │ +316 │ │ │ │ │ +317 return norm * (isNaN / isNaN); │ │ │ │ │ +318 } │ │ │ │ │ +319 │ │ │ │ │ +320 //===== sizes │ │ │ │ │ +321 │ │ │ │ │ +323 size_type N () const │ │ │ │ │ +324 { │ │ │ │ │ +325 return this->n; │ │ │ │ │ +326 } │ │ │ │ │ +327 │ │ │ │ │ +329 size_type dim () const │ │ │ │ │ +330 { │ │ │ │ │ +331 size_type d=0; │ │ │ │ │ +332 │ │ │ │ │ +333 for (size_type i=0; in; i++) │ │ │ │ │ +334 d += Impl::asVector((*this)[i]).dim(); │ │ │ │ │ +335 │ │ │ │ │ +336 return d; │ │ │ │ │ +337 } │ │ │ │ │ +338 │ │ │ │ │ +339 protected: │ │ │ │ │ +341 block_vector_unmanaged () : base_array_unmanaged() │ │ │ │ │ +342 { } │ │ │ │ │ +343 }; │ │ │ │ │ +344 │ │ │ │ │ +346 │ │ │ │ │ +351 template │ │ │ │ │ +352 class ScopeGuard { │ │ │ │ │ +353 F cleanupFunc_; │ │ │ │ │ +354 public: │ │ │ │ │ +355 ScopeGuard(F cleanupFunc) : cleanupFunc_(_s_t_d::move(cleanupFunc)) {} │ │ │ │ │ +356 ScopeGuard(const ScopeGuard &) = delete; │ │ │ │ │ +357 ScopeGuard(ScopeGuard &&) = delete; │ │ │ │ │ +358 ScopeGuard &operator=(ScopeGuard) = delete; │ │ │ │ │ +359 ~ScopeGuard() { cleanupFunc_(); } │ │ │ │ │ +360 }; │ │ │ │ │ +361 │ │ │ │ │ +363 │ │ │ │ │ +372 template │ │ │ │ │ +373 ScopeGuard makeScopeGuard(F cleanupFunc) │ │ │ │ │ +374 { │ │ │ │ │ +375 return { std::move(cleanupFunc) }; │ │ │ │ │ +376 } │ │ │ │ │ +377 │ │ │ │ │ +378} // end namespace Imp │ │ │ │ │ +393 template > │ │ │ │ │ +_3_9_4 class _B_l_o_c_k_V_e_c_t_o_r : public Imp::block_vector_unmanaged │ │ │ │ │ +395 { │ │ │ │ │ +396 public: │ │ │ │ │ +397 │ │ │ │ │ +398 //===== type definitions and constants │ │ │ │ │ +399 │ │ │ │ │ +_4_0_1 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +402 │ │ │ │ │ +_4_0_4 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +405 │ │ │ │ │ +_4_0_7 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +408 │ │ │ │ │ +_4_1_0 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +411 │ │ │ │ │ +413 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ +2.8.")]] │ │ │ │ │ +_4_1_4 static constexpr unsigned int _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ +415 │ │ │ │ │ +_4_1_7 typedef typename Imp::block_vector_unmanaged::Iterator _I_t_e_r_a_t_o_r; │ │ │ │ │ +418 │ │ │ │ │ +_4_2_0 typedef typename Imp::block_vector_unmanaged::ConstIterator │ │ │ │ │ +_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +421 │ │ │ │ │ +422 //===== constructors and such │ │ │ │ │ +423 │ │ │ │ │ +_4_2_5 _B_l_o_c_k_V_e_c_t_o_r () │ │ │ │ │ +426 { │ │ │ │ │ +427 syncBaseArray(); │ │ │ │ │ +428 } │ │ │ │ │ +429 │ │ │ │ │ +_4_3_1 explicit _B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _n) : storage_(_n) │ │ │ │ │ +432 { │ │ │ │ │ +433 syncBaseArray(); │ │ │ │ │ +434 } │ │ │ │ │ +435 │ │ │ │ │ +_4_3_7 _B_l_o_c_k_V_e_c_t_o_r (std::initializer_list const &l) : storage_(l) │ │ │ │ │ +438 { │ │ │ │ │ +439 syncBaseArray(); │ │ │ │ │ +440 } │ │ │ │ │ +441 │ │ │ │ │ +442 │ │ │ │ │ +454 template │ │ │ │ │ +_4_5_5 _B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _n, S _capacity) │ │ │ │ │ +456 { │ │ │ │ │ +457 static_assert(std::numeric_limits::is_integer, │ │ │ │ │ +458 "capacity must be an unsigned integral type (be aware, that this │ │ │ │ │ +constructor does not set the default value!)" ); │ │ │ │ │ +459 if((_s_i_z_e___t_y_p_e)_capacity > _n) │ │ │ │ │ +460 storage_.reserve(_capacity); │ │ │ │ │ +461 storage_.resize(_n); │ │ │ │ │ +462 syncBaseArray(); │ │ │ │ │ +463 } │ │ │ │ │ +464 │ │ │ │ │ +465 │ │ │ │ │ +_4_7_5 void _r_e_s_e_r_v_e(_s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y) │ │ │ │ │ +476 { │ │ │ │ │ +477 [[maybe_unused]] const auto &guard = │ │ │ │ │ +478 Imp::makeScopeGuard([this]{ syncBaseArray(); }); │ │ │ │ │ +479 storage_.reserve(_c_a_p_a_c_i_t_y); │ │ │ │ │ +480 } │ │ │ │ │ +481 │ │ │ │ │ +_4_8_8 _s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y() const │ │ │ │ │ +489 { │ │ │ │ │ +490 return storage_.capacity(); │ │ │ │ │ +491 } │ │ │ │ │ +492 │ │ │ │ │ +_5_0_3 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e size) │ │ │ │ │ +504 { │ │ │ │ │ +505 [[maybe_unused]] const auto &guard = │ │ │ │ │ +506 Imp::makeScopeGuard([this]{ syncBaseArray(); }); │ │ │ │ │ +507 storage_.resize(size); │ │ │ │ │ +508 } │ │ │ │ │ +509 │ │ │ │ │ +_5_1_1 _B_l_o_c_k_V_e_c_t_o_r(const _B_l_o_c_k_V_e_c_t_o_r &a) │ │ │ │ │ +512 noexcept(noexcept(std::declval().storage_ = a.storage_)) │ │ │ │ │ +513 { │ │ │ │ │ +514 storage_ = a.storage_; │ │ │ │ │ +515 syncBaseArray(); │ │ │ │ │ +516 } │ │ │ │ │ +517 │ │ │ │ │ +_5_1_9 _B_l_o_c_k_V_e_c_t_o_r(_B_l_o_c_k_V_e_c_t_o_r &&a) │ │ │ │ │ +520 noexcept(noexcept(std::declval().swap(a))) │ │ │ │ │ +521 { │ │ │ │ │ +522 _s_w_a_p(a); │ │ │ │ │ +523 } │ │ │ │ │ +524 │ │ │ │ │ +_5_2_6 _B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _B_l_o_c_k_V_e_c_t_o_r& a) │ │ │ │ │ +527 noexcept(noexcept(std::declval().storage_ = a.storage_)) │ │ │ │ │ +528 { │ │ │ │ │ +529 [[maybe_unused]] const auto &guard = │ │ │ │ │ +530 Imp::makeScopeGuard([this]{ syncBaseArray(); }); │ │ │ │ │ +531 storage_ = a.storage_; │ │ │ │ │ +532 return *this; │ │ │ │ │ +533 } │ │ │ │ │ +534 │ │ │ │ │ +_5_3_6 _B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (_B_l_o_c_k_V_e_c_t_o_r&& a) │ │ │ │ │ +537 noexcept(noexcept(std::declval().swap(a))) │ │ │ │ │ +538 { │ │ │ │ │ +539 _s_w_a_p(a); │ │ │ │ │ +540 return *this; │ │ │ │ │ +541 } │ │ │ │ │ +542 │ │ │ │ │ +_5_4_4 void _s_w_a_p(_B_l_o_c_k_V_e_c_t_o_r &other) │ │ │ │ │ +545 noexcept(noexcept( │ │ │ │ │ +546 std::declval().storage_.swap(other.storage_))) │ │ │ │ │ +547 { │ │ │ │ │ +548 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{ │ │ │ │ │ +549 syncBaseArray(); │ │ │ │ │ +550 other.syncBaseArray(); │ │ │ │ │ +551 }); │ │ │ │ │ +552 storage_.swap(other.storage_); │ │ │ │ │ +553 } │ │ │ │ │ +554 │ │ │ │ │ +_5_5_6 _B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +557 { │ │ │ │ │ +558 // forward to operator= in base class │ │ │ │ │ +559 (static_cast&>(*this)) = k; │ │ │ │ │ +560 return *this; │ │ │ │ │ +561 } │ │ │ │ │ +562 │ │ │ │ │ +563 private: │ │ │ │ │ +564 void syncBaseArray() noexcept │ │ │ │ │ +565 { │ │ │ │ │ +566 this->p = storage_.data(); │ │ │ │ │ +567 this->n = storage_.size(); │ │ │ │ │ +568 } │ │ │ │ │ +569 │ │ │ │ │ +570 std::vector storage_; │ │ │ │ │ +571 }; │ │ │ │ │ +572 │ │ │ │ │ +578 template │ │ │ │ │ +_5_7_9 struct FieldTraits< _B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ +580 { │ │ │ │ │ +_5_8_1 typedef typename FieldTraits::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_5_8_2 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +583 }; │ │ │ │ │ +589 template │ │ │ │ │ +_5_9_0 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _B_l_o_c_k_V_e_c_t_o_r_<_K_,_ _A_>& v) │ │ │ │ │ +591 { │ │ │ │ │ +592 typedef typename _B_l_o_c_k_V_e_c_t_o_r_<_K_,_ _A_>_:_:_s_i_z_e___t_y_p_e size_type; │ │ │ │ │ +593 │ │ │ │ │ +594 for (size_type i=0; i │ │ │ │ │ +623#else │ │ │ │ │ +624 template > │ │ │ │ │ +625#endif │ │ │ │ │ +626 class BlockVectorWindow : public Imp::block_vector_unmanaged │ │ │ │ │ +627 { │ │ │ │ │ +628 public: │ │ │ │ │ +629 │ │ │ │ │ +630 //===== type definitions and constants │ │ │ │ │ +631 │ │ │ │ │ +633 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ +634 │ │ │ │ │ +636 typedef B block_type; │ │ │ │ │ +637 │ │ │ │ │ +639 typedef A allocator_type; │ │ │ │ │ +640 │ │ │ │ │ +642 typedef typename A::size_type size_type; │ │ │ │ │ +643 │ │ │ │ │ +645 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ +2.8.")]] │ │ │ │ │ +646 static constexpr unsigned int blocklevel = blockLevel()+1; │ │ │ │ │ +647 │ │ │ │ │ +649 typedef typename Imp::block_vector_unmanaged::Iterator Iterator; │ │ │ │ │ +650 │ │ │ │ │ +652 typedef typename Imp::block_vector_unmanaged::ConstIterator │ │ │ │ │ +ConstIterator; │ │ │ │ │ +653 │ │ │ │ │ +654 │ │ │ │ │ +655 //===== constructors and such │ │ │ │ │ +657 BlockVectorWindow () : Imp::block_vector_unmanaged() │ │ │ │ │ +658 { } │ │ │ │ │ +659 │ │ │ │ │ +661 BlockVectorWindow (B* _p, size_type _n) │ │ │ │ │ +662 { │ │ │ │ │ +663 this->n = _n; │ │ │ │ │ +664 this->p = _p; │ │ │ │ │ +665 } │ │ │ │ │ +666 │ │ │ │ │ +668 BlockVectorWindow (const BlockVectorWindow& a) │ │ │ │ │ +669 { │ │ │ │ │ +670 this->n = a.n; │ │ │ │ │ +671 this->p = a.p; │ │ │ │ │ +672 } │ │ │ │ │ +673 │ │ │ │ │ +675 BlockVectorWindow& operator= (const BlockVectorWindow& a) │ │ │ │ │ +676 { │ │ │ │ │ +677 // check correct size │ │ │ │ │ +678#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +679 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +680#endif │ │ │ │ │ +681 │ │ │ │ │ +682 if (&a!=this) // check if this and a are different objects │ │ │ │ │ +683 { │ │ │ │ │ +684 // copy data │ │ │ │ │ +685 for (size_type i=0; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ +686 } │ │ │ │ │ +687 return *this; │ │ │ │ │ +688 } │ │ │ │ │ +689 │ │ │ │ │ +691 BlockVectorWindow& operator= (const field_type& k) │ │ │ │ │ +692 { │ │ │ │ │ +693 (static_cast&>(*this)) = k; │ │ │ │ │ +694 return *this; │ │ │ │ │ +695 } │ │ │ │ │ +696 │ │ │ │ │ +698 operator BlockVector() const { │ │ │ │ │ +699 auto bv = BlockVector(this->n); │ │ │ │ │ +700 │ │ │ │ │ +701 std::copy(this->begin(), this->end(), bv.begin()); │ │ │ │ │ +702 │ │ │ │ │ +703 return bv; │ │ │ │ │ +704 } │ │ │ │ │ +705 │ │ │ │ │ +706 //===== window manipulation methods │ │ │ │ │ +707 │ │ │ │ │ +709 void set (size_type _n, B* _p) │ │ │ │ │ +710 { │ │ │ │ │ +711 this->n = _n; │ │ │ │ │ +712 this->p = _p; │ │ │ │ │ +713 } │ │ │ │ │ +714 │ │ │ │ │ +716 void setsize (size_type _n) │ │ │ │ │ +717 { │ │ │ │ │ +718 this->n = _n; │ │ │ │ │ +719 } │ │ │ │ │ +720 │ │ │ │ │ +722 void setptr (B* _p) │ │ │ │ │ +723 { │ │ │ │ │ +724 this->p = _p; │ │ │ │ │ +725 } │ │ │ │ │ +726 │ │ │ │ │ +728 B* getptr () │ │ │ │ │ +729 { │ │ │ │ │ +730 return this->p; │ │ │ │ │ +731 } │ │ │ │ │ +732 │ │ │ │ │ +734 size_type getsize () const │ │ │ │ │ +735 { │ │ │ │ │ +736 return this->n; │ │ │ │ │ +737 } │ │ │ │ │ +738 }; │ │ │ │ │ +739 │ │ │ │ │ +740 │ │ │ │ │ +741 │ │ │ │ │ +752 template > │ │ │ │ │ +753 class compressed_block_vector_unmanaged : public │ │ │ │ │ +compressed_base_array_unmanaged │ │ │ │ │ +754 { │ │ │ │ │ +755 public: │ │ │ │ │ +756 │ │ │ │ │ +757 //===== type definitions and constants │ │ │ │ │ +758 │ │ │ │ │ +760 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ +761 │ │ │ │ │ +763 typedef B block_type; │ │ │ │ │ +764 │ │ │ │ │ +766 typedef A allocator_type; │ │ │ │ │ +767 │ │ │ │ │ +769 typedef typename compressed_base_array_unmanaged::iterator Iterator; │ │ │ │ │ +770 │ │ │ │ │ +772 typedef typename compressed_base_array_unmanaged::const_iterator │ │ │ │ │ +ConstIterator; │ │ │ │ │ +773 │ │ │ │ │ +775 typedef typename A::size_type size_type; │ │ │ │ │ +776 │ │ │ │ │ +777 //===== assignment from scalar │ │ │ │ │ +778 │ │ │ │ │ +779 compressed_block_vector_unmanaged& operator= (const field_type& k) │ │ │ │ │ +780 { │ │ │ │ │ +781 for (size_type i=0; in; i++) │ │ │ │ │ +782 (this->p)[i] = k; │ │ │ │ │ +783 return *this; │ │ │ │ │ +784 } │ │ │ │ │ +785 │ │ │ │ │ +786 │ │ │ │ │ +787 //===== vector space arithmetic │ │ │ │ │ +788 │ │ │ │ │ +790 template │ │ │ │ │ +791 compressed_block_vector_unmanaged& operator+= (const V& y) │ │ │ │ │ +792 { │ │ │ │ │ +793#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +794 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ +795#endif │ │ │ │ │ +796 for (size_type i=0; ioperator[](y.j[i]) += y.p[i]; │ │ │ │ │ +797 return *this; │ │ │ │ │ +798 } │ │ │ │ │ +799 │ │ │ │ │ +801 template │ │ │ │ │ +802 compressed_block_vector_unmanaged& operator-= (const V& y) │ │ │ │ │ +803 { │ │ │ │ │ +804#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +805 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ +806#endif │ │ │ │ │ +807 for (size_type i=0; ioperator[](y.j[i]) -= y.p[i]; │ │ │ │ │ +808 return *this; │ │ │ │ │ +809 } │ │ │ │ │ +810 │ │ │ │ │ +812 template │ │ │ │ │ +813 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y) │ │ │ │ │ +814 { │ │ │ │ │ +815#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +816 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ +817#endif │ │ │ │ │ +818 for (size_type i=0; in; ++i) (this->p)[i] *= k; │ │ │ │ │ +827 return *this; │ │ │ │ │ +828 } │ │ │ │ │ +829 │ │ │ │ │ +831 compressed_block_vector_unmanaged& operator/= (const field_type& k) │ │ │ │ │ +832 { │ │ │ │ │ +833 for (size_type i=0; in; ++i) (this->p)[i] /= k; │ │ │ │ │ +834 return *this; │ │ │ │ │ +835 } │ │ │ │ │ +836 │ │ │ │ │ +837 │ │ │ │ │ +838 //===== Euclidean scalar product │ │ │ │ │ +839 │ │ │ │ │ +841 field_type operator* (const compressed_block_vector_unmanaged& y) const │ │ │ │ │ +842 { │ │ │ │ │ +843#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +844 if (!includesindexset(y) || !y.includesindexset(*this) ) │ │ │ │ │ +845 DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ +846#endif │ │ │ │ │ +847 field_type sum=0; │ │ │ │ │ +848 for (size_type i=0; in; ++i) │ │ │ │ │ +849 sum += (this->p)[i] * y[(this->j)[i]]; │ │ │ │ │ +850 return sum; │ │ │ │ │ +851 } │ │ │ │ │ +852 │ │ │ │ │ +853 │ │ │ │ │ +854 //===== norms │ │ │ │ │ +855 │ │ │ │ │ +857 typename FieldTraits::real_type one_norm () const │ │ │ │ │ +858 { │ │ │ │ │ +859 typename FieldTraits::real_type sum=0; │ │ │ │ │ +860 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm(); │ │ │ │ │ +861 return sum; │ │ │ │ │ +862 } │ │ │ │ │ +863 │ │ │ │ │ +865 typename FieldTraits::real_type one_norm_real () const │ │ │ │ │ +866 { │ │ │ │ │ +867 typename FieldTraits::real_type sum=0; │ │ │ │ │ +868 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm_real(); │ │ │ │ │ +869 return sum; │ │ │ │ │ +870 } │ │ │ │ │ +871 │ │ │ │ │ +873 typename FieldTraits::real_type two_norm () const │ │ │ │ │ +874 { │ │ │ │ │ +875 using std::sqrt; │ │ │ │ │ +876 typename FieldTraits::real_type sum=0; │ │ │ │ │ +877 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2(); │ │ │ │ │ +878 return sqrt(sum); │ │ │ │ │ +879 } │ │ │ │ │ +880 │ │ │ │ │ +882 typename FieldTraits::real_type two_norm2 () const │ │ │ │ │ +883 { │ │ │ │ │ +884 typename FieldTraits::real_type sum=0; │ │ │ │ │ +885 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2(); │ │ │ │ │ +886 return sum; │ │ │ │ │ +887 } │ │ │ │ │ +888 │ │ │ │ │ +890 template ::value, int>::type = 0> │ │ │ │ │ +892 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ +893 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +894 using std::max; │ │ │ │ │ +895 │ │ │ │ │ +896 real_type norm = 0; │ │ │ │ │ +897 for (auto const &x : *this) { │ │ │ │ │ +898 real_type const a = x.infinity_norm(); │ │ │ │ │ +899 norm = max(a, norm); │ │ │ │ │ +900 } │ │ │ │ │ +901 return norm; │ │ │ │ │ +902 } │ │ │ │ │ +903 │ │ │ │ │ +905 template ::value, int>::type = 0> │ │ │ │ │ +907 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ +908 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +909 using std::max; │ │ │ │ │ +910 │ │ │ │ │ +911 real_type norm = 0; │ │ │ │ │ +912 for (auto const &x : *this) { │ │ │ │ │ +913 real_type const a = x.infinity_norm_real(); │ │ │ │ │ +914 norm = max(a, norm); │ │ │ │ │ +915 } │ │ │ │ │ +916 return norm; │ │ │ │ │ +917 } │ │ │ │ │ +918 │ │ │ │ │ +920 template ::value, int>::type = 0> │ │ │ │ │ +922 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ +923 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +924 using std::max; │ │ │ │ │ +925 │ │ │ │ │ +926 real_type norm = 0; │ │ │ │ │ +927 real_type isNaN = 1; │ │ │ │ │ +928 for (auto const &x : *this) { │ │ │ │ │ +929 real_type const a = x.infinity_norm(); │ │ │ │ │ +930 norm = max(a, norm); │ │ │ │ │ +931 isNaN += a; │ │ │ │ │ +932 } │ │ │ │ │ +933 return norm * (isNaN / isNaN); │ │ │ │ │ +934 } │ │ │ │ │ +935 │ │ │ │ │ +937 template ::value, int>::type = 0> │ │ │ │ │ +939 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ +940 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +941 using std::max; │ │ │ │ │ +942 │ │ │ │ │ +943 real_type norm = 0; │ │ │ │ │ +944 real_type isNaN = 1; │ │ │ │ │ +945 for (auto const &x : *this) { │ │ │ │ │ +946 real_type const a = x.infinity_norm_real(); │ │ │ │ │ +947 norm = max(a, norm); │ │ │ │ │ +948 isNaN += a; │ │ │ │ │ +949 } │ │ │ │ │ +950 return norm * (isNaN / isNaN); │ │ │ │ │ +951 } │ │ │ │ │ +952 │ │ │ │ │ +953 //===== sizes │ │ │ │ │ +954 │ │ │ │ │ +956 size_type N () const │ │ │ │ │ +957 { │ │ │ │ │ +958 return this->n; │ │ │ │ │ +959 } │ │ │ │ │ +960 │ │ │ │ │ +962 size_type dim () const │ │ │ │ │ +963 { │ │ │ │ │ +964 size_type d=0; │ │ │ │ │ +965 for (size_type i=0; in; i++) │ │ │ │ │ +966 d += (this->p)[i].dim(); │ │ │ │ │ +967 return d; │ │ │ │ │ +968 } │ │ │ │ │ +969 │ │ │ │ │ +970 protected: │ │ │ │ │ +972 compressed_block_vector_unmanaged () : compressed_base_array_unmanaged │ │ │ │ │ +() │ │ │ │ │ +973 { } │ │ │ │ │ +974 │ │ │ │ │ +976 template │ │ │ │ │ +977 bool includesindexset (const V& y) │ │ │ │ │ +978 { │ │ │ │ │ +979 typename V::ConstIterator e=this->end(); │ │ │ │ │ +980 for (size_type i=0; ifind(y.j[i])==e) │ │ │ │ │ +982 return false; │ │ │ │ │ +983 return true; │ │ │ │ │ +984 } │ │ │ │ │ +985 }; │ │ │ │ │ +986 │ │ │ │ │ +987 │ │ │ │ │ +1006 template > │ │ │ │ │ +1007 class CompressedBlockVectorWindow : public │ │ │ │ │ +compressed_block_vector_unmanaged │ │ │ │ │ +1008 { │ │ │ │ │ +1009 public: │ │ │ │ │ +1010 │ │ │ │ │ +1011 //===== type definitions and constants │ │ │ │ │ +1012 │ │ │ │ │ +1014 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ +1015 │ │ │ │ │ +1017 typedef B block_type; │ │ │ │ │ +1018 │ │ │ │ │ +1020 typedef A allocator_type; │ │ │ │ │ +1021 │ │ │ │ │ +1023 typedef typename A::size_type size_type; │ │ │ │ │ +1024 │ │ │ │ │ +1026 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ +2.8.")]] │ │ │ │ │ +1027 static constexpr unsigned int blocklevel = blockLevel()+1; │ │ │ │ │ +1028 │ │ │ │ │ +1030 typedef typename compressed_block_vector_unmanaged::Iterator │ │ │ │ │ +Iterator; │ │ │ │ │ +1031 │ │ │ │ │ +1033 typedef typename compressed_block_vector_unmanaged::ConstIterator │ │ │ │ │ +ConstIterator; │ │ │ │ │ +1034 │ │ │ │ │ +1035 │ │ │ │ │ +1036 //===== constructors and such │ │ │ │ │ +1038 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged() │ │ │ │ │ +1039 { } │ │ │ │ │ +1040 │ │ │ │ │ +1042 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n) │ │ │ │ │ +1043 { │ │ │ │ │ +1044 this->n = _n; │ │ │ │ │ +1045 this->p = _p; │ │ │ │ │ +1046 this->j = _j; │ │ │ │ │ +1047 } │ │ │ │ │ +1048 │ │ │ │ │ +1050 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a) │ │ │ │ │ +1051 { │ │ │ │ │ +1052 this->n = a.n; │ │ │ │ │ +1053 this->p = a.p; │ │ │ │ │ +1054 this->j = a.j; │ │ │ │ │ +1055 } │ │ │ │ │ +1056 │ │ │ │ │ +1058 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow& │ │ │ │ │ +a) │ │ │ │ │ +1059 { │ │ │ │ │ +1060 // check correct size │ │ │ │ │ +1061#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1062 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ +1063#endif │ │ │ │ │ +1064 │ │ │ │ │ +1065 if (&a!=this) // check if this and a are different objects │ │ │ │ │ +1066 { │ │ │ │ │ +1067 // copy data │ │ │ │ │ +1068 for (size_type i=0; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ +1069 for (size_type i=0; in; i++) this->j[i]=a.j[i]; │ │ │ │ │ +1070 } │ │ │ │ │ +1071 return *this; │ │ │ │ │ +1072 } │ │ │ │ │ +1073 │ │ │ │ │ +1075 CompressedBlockVectorWindow& operator= (const field_type& k) │ │ │ │ │ +1076 { │ │ │ │ │ +1077 (static_cast&>(*this)) = k; │ │ │ │ │ +1078 return *this; │ │ │ │ │ +1079 } │ │ │ │ │ +1080 │ │ │ │ │ +1081 │ │ │ │ │ +1082 //===== window manipulation methods │ │ │ │ │ +1083 │ │ │ │ │ +1085 void set (size_type _n, B* _p, size_type* _j) │ │ │ │ │ +1086 { │ │ │ │ │ +1087 this->n = _n; │ │ │ │ │ +1088 this->p = _p; │ │ │ │ │ +1089 this->j = _j; │ │ │ │ │ +1090 } │ │ │ │ │ +1091 │ │ │ │ │ +1093 void setsize (size_type _n) │ │ │ │ │ +1094 { │ │ │ │ │ +1095 this->n = _n; │ │ │ │ │ +1096 } │ │ │ │ │ +1097 │ │ │ │ │ +1099 void setptr (B* _p) │ │ │ │ │ +1100 { │ │ │ │ │ +1101 this->p = _p; │ │ │ │ │ +1102 } │ │ │ │ │ +1103 │ │ │ │ │ +1105 void setindexptr (size_type* _j) │ │ │ │ │ +1106 { │ │ │ │ │ +1107 this->j = _j; │ │ │ │ │ +1108 } │ │ │ │ │ +1109 │ │ │ │ │ +1111 B* getptr () │ │ │ │ │ +1112 { │ │ │ │ │ +1113 return this->p; │ │ │ │ │ +1114 } │ │ │ │ │ +1115 │ │ │ │ │ +1117 size_type* getindexptr () │ │ │ │ │ +1118 { │ │ │ │ │ +1119 return this->j; │ │ │ │ │ +1120 } │ │ │ │ │ +1121 │ │ │ │ │ +1123 const B* getptr () const │ │ │ │ │ +1124 { │ │ │ │ │ +1125 return this->p; │ │ │ │ │ +1126 } │ │ │ │ │ +1127 │ │ │ │ │ +1129 const size_type* getindexptr () const │ │ │ │ │ +1130 { │ │ │ │ │ +1131 return this->j; │ │ │ │ │ +1132 } │ │ │ │ │ +1134 size_type getsize () const │ │ │ │ │ +1135 { │ │ │ │ │ +1136 return this->n; │ │ │ │ │ +1137 } │ │ │ │ │ +1138 }; │ │ │ │ │ +1139 │ │ │ │ │ +1140} // end namespace 'Imp' │ │ │ │ │ +1141 │ │ │ │ │ +1142 │ │ │ │ │ +1144 template │ │ │ │ │ +1145 struct AutonomousValueType> │ │ │ │ │ +1146 { │ │ │ │ │ +1147 using type = BlockVector; │ │ │ │ │ +1148 }; │ │ │ │ │ +1149 │ │ │ │ │ +1150 │ │ │ │ │ +1151} // end namespace 'Dune' │ │ │ │ │ +1152 │ │ │ │ │ +1153#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ +_b_a_s_e_a_r_r_a_y_._h_h │ │ │ │ │ +Implements several basic array containers. │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ -Tag idnetifying the visited property of a vertex. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_a_n_d_o_m_A_c_c_e_s_s_B_u_n_d_l_e_d_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -A property map that extracts one property out of a bundle using operator[]() │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v) │ │ │ │ │ +Send BlockVector to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:590 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +BlockVector() │ │ │ │ │ +makes empty vector │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:425 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_e_r_v_e │ │ │ │ │ +void reserve(size_type capacity) │ │ │ │ │ +Reserve space. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:475 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector > │ │ │ │ │ +().swap(a))) │ │ │ │ │ +move constructor │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:519 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +BlockVector(size_type _n) │ │ │ │ │ +make vector with _n components │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:431 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type size) │ │ │ │ │ +Resize the vector. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:503 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +Imp::block_vector_unmanaged< B, A >::Iterator Iterator │ │ │ │ │ +make iterators available as types │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:417 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr unsigned int blocklevel │ │ │ │ │ +increment block level counter │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:414 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector > │ │ │ │ │ +().storage_=a.storage_)) │ │ │ │ │ +copy constructor │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:511 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +A allocator_type │ │ │ │ │ +export the allocator type │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:407 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval< │ │ │ │ │ +BlockVector >().storage_=a.storage_)) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +BlockVector(std::initializer_list< B > const &l) │ │ │ │ │ +Construct from a std::initializer_list. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:437 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ +size_type capacity() const │ │ │ │ │ +Get the capacity of the vector. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:488 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +BlockVector(size_type _n, S _capacity) │ │ │ │ │ +Make vector with _n components but preallocating capacity components. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:455 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +B block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_s_w_a_p │ │ │ │ │ +void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & > │ │ │ │ │ +().storage_.swap(other.storage_))) │ │ │ │ │ +swap operation │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:544 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Imp::block_vector_unmanaged< B, A >::ConstIterator ConstIterator │ │ │ │ │ +make iterators available as types │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:420 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< B >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:582 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< B >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:581 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00134.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: globalaggregates.hh File Reference │ │ │ │ +dune-istl: registry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,61 +65,94 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Macros
│ │ │ │ +
registry.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Provdes class for identifying aggregates globally. │ │ │ │ -More...

│ │ │ │ -
#include "aggregates.hh"
│ │ │ │ -#include "pinfo.hh"
│ │ │ │ -#include <dune/common/parallel/indexset.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <string>
│ │ │ │ +#include <utility>
│ │ │ │ +#include "counter.hh"
│ │ │ │ +#include <dune/common/typelist.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/parameterizedobject.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::Amg::GlobalAggregatesMap< T, TI >
 
class  Dune::Amg::GlobalAggregatesMap< T, TI >::Proxy
 
struct  Dune::Amg::AggregatesGatherScatter< T, TI >
 
struct  Dune::Amg::AggregatesPublisher< T, O, I >
 
struct  Dune::Amg::AggregatesPublisher< T, O, OwnerOverlapCopyCommunication< T1, T2 > >
 Utility class for publishing the aggregate number of the DOFs in the overlap to other processors and convert them to local indices. More...
 
struct  Dune::Amg::AggregatesPublisher< T, O, SequentialInformation >
 
struct  Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Macros

#define DUNE_REGISTRY_PUT(Tag, id, ...)
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Provdes class for identifying aggregates globally.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_REGISTRY_PUT

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_REGISTRY_PUT( Tag,
 id,
 ... 
)
│ │ │ │ +
│ │ │ │ +Value:
namespace { \
│ │ │ │ +
template<> \
│ │ │ │ +
struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \
│ │ │ │ +
{ \
│ │ │ │ +
static auto getCreator() \
│ │ │ │ +
{ \
│ │ │ │ +
return __VA_ARGS__; \
│ │ │ │ +
} \
│ │ │ │ +
static std::string name() { return id; } \
│ │ │ │ +
}; \
│ │ │ │ +
} \
│ │ │ │ +
DUNE_INC_COUNTER(Tag)
│ │ │ │ +
#define DUNE_GET_COUNTER(Tag)
Definition counter.hh:17
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,45 +1,49 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -globalaggregates.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provdes class for identifying aggregates globally. _M_o_r_e_._._. │ │ │ │ │ -#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ -#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -#include │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ +registry.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_c_o_u_n_t_e_r_._h_h" │ │ │ │ │ +#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_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_:_:_P_r_o_x_y │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_,_ _T_I_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _I_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_< │ │ │ │ │ - _T_1_,_ _T_2_ _>_ _> │ │ │ │ │ -  Utility class for publishing the aggregate number of the DOFs in the │ │ │ │ │ - overlap to other processors and convert them to local indices. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___R_E_G_I_S_T_R_Y___P_U_T(Tag, id, ...) │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provdes class for identifying aggregates globally. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__RREEGGIISSTTRRYY__PPUUTT ********** │ │ │ │ │ +#define DUNE_REGISTRY_PUT (   Tag, │ │ │ │ │ +   id, │ │ │ │ │ +   ......  │ │ │ │ │ + ) │ │ │ │ │ +VVaalluuee:: │ │ │ │ │ +namespace { \ │ │ │ │ │ +template<> \ │ │ │ │ │ +struct Registry \ │ │ │ │ │ +{ \ │ │ │ │ │ +static auto getCreator() \ │ │ │ │ │ +{ \ │ │ │ │ │ +return __VA_ARGS__; \ │ │ │ │ │ +} \ │ │ │ │ │ +static std::string name() { return id; } \ │ │ │ │ │ +}; \ │ │ │ │ │ +} \ │ │ │ │ │ +DUNE_INC_COUNTER(Tag) │ │ │ │ │ +_D_U_N_E___G_E_T___C_O_U_N_T_E_R │ │ │ │ │ +#define DUNE_GET_COUNTER(Tag) │ │ │ │ │ +DDeeffiinniittiioonn counter.hh:17 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: globalaggregates.hh Source File │ │ │ │ +dune-istl: registry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,343 +70,106 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
globalaggregates.hh
│ │ │ │ +
registry.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_GLOBALAGGREGATES_HH
│ │ │ │ -
6#define DUNE_GLOBALAGGREGATES_HH
│ │ │ │ -
7
│ │ │ │ -
18#include "aggregates.hh"
│ │ │ │ -
19#include "pinfo.hh"
│ │ │ │ -
20#include <dune/common/parallel/indexset.hh>
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune
│ │ │ │ -
23{
│ │ │ │ -
24 namespace Amg
│ │ │ │ -
25 {
│ │ │ │ -
26
│ │ │ │ -
27 template<typename T, typename TI>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
29 {
│ │ │ │ -
30 public:
│ │ │ │ -
31 typedef TI ParallelIndexSet;
│ │ │ │ +
3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH
│ │ │ │ +
4#define DUNE_ISTL_COMMON_REGISTRY_HH
│ │ │ │ +
5
│ │ │ │ +
6#include <cstddef>
│ │ │ │ +
7#include <iostream>
│ │ │ │ +
8#include <memory>
│ │ │ │ +
9#include <string>
│ │ │ │ +
10#include <utility>
│ │ │ │ +
11
│ │ │ │ +
12#include "counter.hh"
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/typelist.hh>
│ │ │ │ +
15#include <dune/common/hybridutilities.hh>
│ │ │ │ +
16#include <dune/common/parameterizedobject.hh>
│ │ │ │ +
17
│ │ │ │ +
│ │ │ │ +
18#define DUNE_REGISTRY_PUT(Tag, id, ...) \
│ │ │ │ +
19 namespace { \
│ │ │ │ +
20 template<> \
│ │ │ │ +
21 struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \
│ │ │ │ +
22 { \
│ │ │ │ +
23 static auto getCreator() \
│ │ │ │ +
24 { \
│ │ │ │ +
25 return __VA_ARGS__; \
│ │ │ │ +
26 } \
│ │ │ │ +
27 static std::string name() { return id; } \
│ │ │ │ +
28 }; \
│ │ │ │ +
29 } \
│ │ │ │ +
30 DUNE_INC_COUNTER(Tag)
│ │ │ │ +
│ │ │ │ +
31
│ │ │ │
32
│ │ │ │ -
33 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ -
34
│ │ │ │ -
35 typedef typename ParallelIndexSet::GlobalIndex IndexedType;
│ │ │ │ -
36
│ │ │ │ -
37 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
│ │ │ │ +
33namespace Dune {
│ │ │ │ +
34 namespace {
│ │ │ │ +
35 template<class Tag, std::size_t index>
│ │ │ │ +
36 struct Registry;
│ │ │ │ +
37 }
│ │ │ │
38
│ │ │ │ -
39 typedef T Vertex;
│ │ │ │ -
40
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
42 const GlobalLookupIndexSet<ParallelIndexSet>& indexset)
│ │ │ │ -
43 : aggregates_(aggregates), indexset_(indexset)
│ │ │ │ -
44 {}
│ │ │ │ -
│ │ │ │ -
45
│ │ │ │ -
│ │ │ │ -
46 inline const GlobalIndex& operator[](std::size_t index) const
│ │ │ │ -
47 {
│ │ │ │ -
48 const Vertex& aggregate = aggregates_[index];
│ │ │ │ -
49 if(aggregate >= AggregatesMap<Vertex>::ISOLATED) {
│ │ │ │ -
50 assert(aggregate != AggregatesMap<Vertex>::UNAGGREGATED);
│ │ │ │ -
51 return isolatedMarker;
│ │ │ │ -
52 }else{
│ │ │ │ -
53 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
│ │ │ │ -
54 assert(pair!=0);
│ │ │ │ -
55 return pair->global();
│ │ │ │ -
56 }
│ │ │ │ -
57 }
│ │ │ │ -
│ │ │ │ -
58
│ │ │ │ -
59
│ │ │ │ -
│ │ │ │ -
60 inline GlobalIndex& get(std::size_t index)
│ │ │ │ -
61 {
│ │ │ │ -
62 const Vertex& aggregate = aggregates_[index];
│ │ │ │ -
63 assert(aggregate < AggregatesMap<Vertex>::ISOLATED);
│ │ │ │ -
64 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
│ │ │ │ -
65 assert(pair!=0);
│ │ │ │ -
66 return const_cast<GlobalIndex&>(pair->global());
│ │ │ │ -
67 }
│ │ │ │ -
│ │ │ │ -
68
│ │ │ │ -
│ │ │ │ -
69 class Proxy
│ │ │ │ -
70 {
│ │ │ │ -
71 public:
│ │ │ │ -
│ │ │ │ -
72 Proxy(const GlobalLookupIndexSet<ParallelIndexSet>& indexset, Vertex& aggregate)
│ │ │ │ -
73 : indexset_(&indexset), aggregate_(&aggregate)
│ │ │ │ -
74 {}
│ │ │ │ -
│ │ │ │ -
75
│ │ │ │ -
│ │ │ │ -
76 Proxy& operator=(const GlobalIndex& global)
│ │ │ │ -
77 {
│ │ │ │ -
78 if(global==isolatedMarker)
│ │ │ │ - │ │ │ │ -
80 else{
│ │ │ │ -
81 //assert(global < AggregatesMap<Vertex>::ISOLATED);
│ │ │ │ -
82 *aggregate_ = indexset_->operator[](global).local();
│ │ │ │ -
83 }
│ │ │ │ -
84 return *this;
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86 private:
│ │ │ │ -
87 const GlobalLookupIndexSet<ParallelIndexSet>* indexset_;
│ │ │ │ -
88 Vertex* aggregate_;
│ │ │ │ -
89 };
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
│ │ │ │ -
91 inline Proxy operator[](std::size_t index)
│ │ │ │ -
92 {
│ │ │ │ -
93 return Proxy(indexset_, aggregates_[index]);
│ │ │ │ -
94 }
│ │ │ │ -
│ │ │ │ -
95
│ │ │ │ -
│ │ │ │ -
96 inline void put(const GlobalIndex& global, size_t i)
│ │ │ │ -
97 {
│ │ │ │ -
98 aggregates_[i]=indexset_[global].local();
│ │ │ │ -
99
│ │ │ │ -
100 }
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
102 private:
│ │ │ │ -
103 AggregatesMap<Vertex>& aggregates_;
│ │ │ │ -
104 const GlobalLookupIndexSet<ParallelIndexSet>& indexset_;
│ │ │ │ -
105 static const GlobalIndex isolatedMarker;
│ │ │ │ -
106 };
│ │ │ │ -
│ │ │ │ -
107
│ │ │ │ -
108 template<typename T, typename TI>
│ │ │ │ -
109 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
│ │ │ │ -
110 std::numeric_limits<typename TI::GlobalIndex>::max();
│ │ │ │ -
111
│ │ │ │ -
112 template<typename T, typename TI>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
114 {
│ │ │ │ - │ │ │ │ -
116 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ -
117
│ │ │ │ -
│ │ │ │ -
118 static const GlobalIndex& gather(const GlobalAggregatesMap<T,TI>& ga, size_t i)
│ │ │ │ -
119 {
│ │ │ │ -
120 return ga[i];
│ │ │ │ -
121 }
│ │ │ │ -
│ │ │ │ -
122
│ │ │ │ -
│ │ │ │ -
123 static void scatter(GlobalAggregatesMap<T,TI>& ga, GlobalIndex global, size_t i)
│ │ │ │ -
124 {
│ │ │ │ -
125 ga[i]=global;
│ │ │ │ -
126 }
│ │ │ │ -
│ │ │ │ -
127 };
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
129 template<typename T, typename O, typename I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
131 {};
│ │ │ │ -
│ │ │ │ -
132
│ │ │ │ -
133#if HAVE_MPI
│ │ │ │ -
134
│ │ │ │ -
135#endif
│ │ │ │ -
136
│ │ │ │ -
137 } // namespace Amg
│ │ │ │ -
138
│ │ │ │ -
139#if HAVE_MPI
│ │ │ │ -
140 // forward declaration
│ │ │ │ -
141 template<class T1, class T2>
│ │ │ │ - │ │ │ │ -
143#endif
│ │ │ │ -
144
│ │ │ │ -
145 namespace Amg
│ │ │ │ -
146 {
│ │ │ │ -
147
│ │ │ │ -
148#if HAVE_MPI
│ │ │ │ -
158 template<typename T, typename O, typename T1, typename T2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
160 {
│ │ │ │ -
161 typedef T Vertex;
│ │ │ │ -
162 typedef O OverlapFlags;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
166
│ │ │ │ -
│ │ │ │ -
167 static void publish(AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
168 ParallelInformation& pinfo,
│ │ │ │ -
169 const GlobalLookupIndexSet& globalLookup)
│ │ │ │ -
170 {
│ │ │ │ - │ │ │ │ -
172 GlobalMap gmap(aggregates, globalLookup);
│ │ │ │ -
173 pinfo.copyOwnerToAll(gmap,gmap);
│ │ │ │ -
174 // communication only needed for ALU
│ │ │ │ -
175 // (ghosts with same global id as owners on the same process)
│ │ │ │ -
176 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping))
│ │ │ │ -
177 pinfo.copyCopyToAll(gmap,gmap);
│ │ │ │ -
178
│ │ │ │ -
179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
│ │ │ │ -
180 Lists lists = pinfo.remoteIndices().find(pinfo.communicator().rank());
│ │ │ │ -
181 if(lists!=pinfo.remoteIndices().end()) {
│ │ │ │ -
182
│ │ │ │ -
183 // For periodic boundary conditions we must renumber
│ │ │ │ -
184 // the aggregates of vertices in the overlap whose owners are
│ │ │ │ -
185 // on the same process
│ │ │ │ -
186 Vertex maxAggregate =0;
│ │ │ │ -
187 typedef typename AggregatesMap<Vertex>::const_iterator Iter;
│ │ │ │ -
188 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
│ │ │ │ -
189 maxAggregate = std::max(maxAggregate, *i);
│ │ │ │ -
190
│ │ │ │ -
191 // Compute new mapping of aggregates in the overlap that we also own
│ │ │ │ -
192 std::map<Vertex,Vertex> newMapping;
│ │ │ │ -
193
│ │ │ │ -
194 // insert all elements into map
│ │ │ │ -
195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
│ │ │ │ -
196 ::const_iterator RIter;
│ │ │ │ -
197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
│ │ │ │ -
198 ri!=rend; ++ri)
│ │ │ │ -
199 if(O::contains(ri->localIndexPair().local().attribute()))
│ │ │ │ -
200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
│ │ │ │ -
201 maxAggregate));
│ │ │ │ -
202 // renumber
│ │ │ │ -
203 typedef typename std::map<Vertex,Vertex>::iterator MIter;
│ │ │ │ -
204 for(MIter mi=newMapping.begin(), mend=newMapping.end();
│ │ │ │ -
205 mi != mend; ++mi)
│ │ │ │ -
206 mi->second=++maxAggregate;
│ │ │ │ -
207
│ │ │ │ -
208
│ │ │ │ -
209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
│ │ │ │ -
210 ri!=rend; ++ri)
│ │ │ │ -
211 if(O::contains(ri->localIndexPair().local().attribute()))
│ │ │ │ -
212 aggregates[ri->localIndexPair().local()] =
│ │ │ │ -
213 newMapping[aggregates[ri->localIndexPair().local()]];
│ │ │ │ -
214 }
│ │ │ │ -
215 }
│ │ │ │ -
│ │ │ │ -
216 };
│ │ │ │ -
│ │ │ │ -
217#endif
│ │ │ │ -
218
│ │ │ │ -
219 template<typename T, typename O>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
221 {
│ │ │ │ -
222 typedef T Vertex;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
225
│ │ │ │ -
│ │ │ │ -
226 static void publish([[maybe_unused]] AggregatesMap<Vertex>& aggregates,
│ │ │ │ -
227 [[maybe_unused]] ParallelInformation& pinfo,
│ │ │ │ -
228 [[maybe_unused]] const GlobalLookupIndexSet& globalLookup)
│ │ │ │ -
229 {}
│ │ │ │ -
│ │ │ │ -
230 };
│ │ │ │ -
│ │ │ │ -
231
│ │ │ │ -
232 } // end Amg namespace
│ │ │ │ -
233
│ │ │ │ -
234
│ │ │ │ -
235#if HAVE_MPI
│ │ │ │ -
236 template<typename T, typename TI>
│ │ │ │ -
│ │ │ │ -
237 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
│ │ │ │ -
238 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
241 typedef SizeOne IndexedTypeFlag;
│ │ │ │ -
│ │ │ │ -
242 static int getSize(const Type&, int)
│ │ │ │ -
243 {
│ │ │ │ -
244 return 1;
│ │ │ │ -
245 }
│ │ │ │ -
│ │ │ │ -
246 };
│ │ │ │ -
│ │ │ │ -
247#endif
│ │ │ │ -
248
│ │ │ │ -
249} // end Dune namespace
│ │ │ │ -
250 /* @} */
│ │ │ │ -
251#endif
│ │ │ │ -
Provides classes for the Coloring process of AMG.
│ │ │ │ - │ │ │ │ -
ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
Definition globalaggregates.hh:164
│ │ │ │ -
const GlobalIndex & operator[](std::size_t index) const
Definition globalaggregates.hh:46
│ │ │ │ - │ │ │ │ -
static int getSize(const Type &, int)
Definition globalaggregates.hh:242
│ │ │ │ -
Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
Definition globalaggregates.hh:240
│ │ │ │ -
GlobalIndex & get(std::size_t index)
Definition globalaggregates.hh:60
│ │ │ │ - │ │ │ │ -
static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
Definition globalaggregates.hh:226
│ │ │ │ -
SequentialInformation ParallelInformation
Definition globalaggregates.hh:223
│ │ │ │ -
ParallelIndexSet::GlobalIndex GlobalIndex
Definition globalaggregates.hh:33
│ │ │ │ -
ParallelInformation::ParallelIndexSet IndexSet
Definition globalaggregates.hh:165
│ │ │ │ -
void put(const GlobalIndex &global, size_t i)
Definition globalaggregates.hh:96
│ │ │ │ -
T Vertex
Definition globalaggregates.hh:39
│ │ │ │ -
GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const GlobalLookupIndexSet< ParallelIndexSet > &indexset)
Definition globalaggregates.hh:41
│ │ │ │ -
TI ParallelIndexSet
Definition globalaggregates.hh:31
│ │ │ │ -
Amg::AggregatesMap< T > Type
Definition globalaggregates.hh:239
│ │ │ │ -
static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, size_t i)
Definition globalaggregates.hh:123
│ │ │ │ -
OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation
Definition globalaggregates.hh:163
│ │ │ │ -
const_iterator begin() const
Definition aggregates.hh:725
│ │ │ │ -
SizeOne IndexedTypeFlag
Definition globalaggregates.hh:241
│ │ │ │ -
Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
Definition globalaggregates.hh:72
│ │ │ │ -
const_iterator end() const
Definition aggregates.hh:730
│ │ │ │ -
static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
Definition globalaggregates.hh:167
│ │ │ │ -
ParallelIndexSet::GlobalIndex GlobalIndex
Definition globalaggregates.hh:116
│ │ │ │ -
const AggregateDescriptor * const_iterator
Definition aggregates.hh:723
│ │ │ │ -
ParallelIndexSet::LocalIndex LocalIndex
Definition globalaggregates.hh:37
│ │ │ │ -
TI ParallelIndexSet
Definition globalaggregates.hh:115
│ │ │ │ - │ │ │ │ -
ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
Definition globalaggregates.hh:224
│ │ │ │ -
static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, size_t i)
Definition globalaggregates.hh:118
│ │ │ │ -
Proxy & operator=(const GlobalIndex &global)
Definition globalaggregates.hh:76
│ │ │ │ -
ParallelIndexSet::GlobalIndex IndexedType
Definition globalaggregates.hh:35
│ │ │ │ -
Proxy operator[](std::size_t index)
Definition globalaggregates.hh:91
│ │ │ │ +
39 namespace {
│ │ │ │ +
40 template<template<class> class Base, class V, class Tag, typename... Args>
│ │ │ │ +
41 auto registryGet(Tag , std::string name, Args... args)
│ │ │ │ +
42 {
│ │ │ │ +
43 constexpr auto count = DUNE_GET_COUNTER(Tag);
│ │ │ │ +
44 std::shared_ptr<Base<V> > result;
│ │ │ │ +
45 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
│ │ │ │ +
46 [&](auto index) {
│ │ │ │ +
47 using Reg = Registry<Tag, index>;
│ │ │ │ +
48 if(!result && Reg::name() == name) {
│ │ │ │ +
49 result = Reg::getCreator()(Dune::MetaType<V>{}, args...);
│ │ │ │ +
50 }
│ │ │ │ +
51 });
│ │ │ │ +
52 return result;
│ │ │ │ +
53 }
│ │ │ │ +
54
│ │ │ │ +
55 /*
│ │ │ │ +
56 Register all creators from the registry in the Parameterizedobjectfactory An
│ │ │ │ +
57 object of V is passed in the creator ans should be used to determine the
│ │ │ │ +
58 template arguments.
│ │ │ │ +
59 */
│ │ │ │ +
60 template<class V, class Type, class Tag, class... Args>
│ │ │ │ +
61 int addRegistryToFactory(Dune::ParameterizedObjectFactory<Type(Args...), std::string>& factory,
│ │ │ │ +
62 Tag){
│ │ │ │ +
63 constexpr auto count = DUNE_GET_COUNTER(Tag);
│ │ │ │ +
64 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
│ │ │ │ +
65 [&](auto index) {
│ │ │ │ +
66 // we first get the generic lambda
│ │ │ │ +
67 // and later specialize it with given parameters.
│ │ │ │ +
68 // doing all at once lead to an ICE woth g++-6
│ │ │ │ +
69 using Reg = Registry<Tag, index>;
│ │ │ │ +
70 auto genericcreator = Reg::getCreator();
│ │ │ │ +
71 factory.define(Reg::name(), [genericcreator](Args... args){
│ │ │ │ +
72 return genericcreator(V{}, args...);
│ │ │ │ +
73 });
│ │ │ │ +
74 });
│ │ │ │ +
75 return count;
│ │ │ │ +
76 }
│ │ │ │ +
77 } // end anonymous namespace
│ │ │ │ +
78} // end namespace Dune
│ │ │ │ +
79
│ │ │ │ +
80#endif // DUNE_ISTL_COMMON_REGISTRY_HH
│ │ │ │ + │ │ │ │ +
#define DUNE_GET_COUNTER(Tag)
Definition counter.hh:17
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition owneroverlapcopy.hh:328
│ │ │ │ -
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition owneroverlapcopy.hh:456
│ │ │ │ -
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ -
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │ -
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ -
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │ -
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:560
│ │ │ │ -
Definition globalaggregates.hh:29
│ │ │ │ -
Definition globalaggregates.hh:70
│ │ │ │ -
Definition globalaggregates.hh:114
│ │ │ │ -
Definition globalaggregates.hh:131
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
int GlobalLookupIndexSet
Definition pinfo.hh:54
│ │ │ │ -
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,424 +1,99 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -globalaggregates.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +registry.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_GLOBALAGGREGATES_HH │ │ │ │ │ -6#define DUNE_GLOBALAGGREGATES_HH │ │ │ │ │ -7 │ │ │ │ │ -18#include "_a_g_g_r_e_g_a_t_e_s_._h_h" │ │ │ │ │ -19#include "_p_i_n_f_o_._h_h" │ │ │ │ │ -20#include │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e │ │ │ │ │ -23{ │ │ │ │ │ -24 namespace Amg │ │ │ │ │ -25 { │ │ │ │ │ -26 │ │ │ │ │ -27 template │ │ │ │ │ -_2_8 struct _G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -29 { │ │ │ │ │ -30 public: │ │ │ │ │ -_3_1 typedef TI _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ +3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH │ │ │ │ │ +4#define DUNE_ISTL_COMMON_REGISTRY_HH │ │ │ │ │ +5 │ │ │ │ │ +6#include │ │ │ │ │ +7#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include "_c_o_u_n_t_e_r_._h_h" │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +_1_8#define DUNE_REGISTRY_PUT(Tag, id, ...) \ │ │ │ │ │ +19 namespace { \ │ │ │ │ │ +20 template<> \ │ │ │ │ │ +21 struct Registry \ │ │ │ │ │ +22 { \ │ │ │ │ │ +23 static auto getCreator() \ │ │ │ │ │ +24 { \ │ │ │ │ │ +25 return __VA_ARGS__; \ │ │ │ │ │ +26 } \ │ │ │ │ │ +27 static std::string name() { return id; } \ │ │ │ │ │ +28 }; \ │ │ │ │ │ +29 } \ │ │ │ │ │ +30 DUNE_INC_COUNTER(Tag) │ │ │ │ │ +31 │ │ │ │ │ 32 │ │ │ │ │ -_3_3 typedef typename ParallelIndexSet::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ -34 │ │ │ │ │ -_3_5 typedef typename ParallelIndexSet::GlobalIndex _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ -36 │ │ │ │ │ -_3_7 typedef typename ParallelIndexSet::LocalIndex _L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ +33namespace _D_u_n_e { │ │ │ │ │ +34 namespace { │ │ │ │ │ +35 template │ │ │ │ │ +36 struct Registry; │ │ │ │ │ +37 } │ │ │ │ │ 38 │ │ │ │ │ -_3_9 typedef T _V_e_r_t_e_x; │ │ │ │ │ -40 │ │ │ │ │ -_4_1 _G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -42 const GlobalLookupIndexSet& indexset) │ │ │ │ │ -43 : aggregates_(aggregates), indexset_(indexset) │ │ │ │ │ -44 {} │ │ │ │ │ -45 │ │ │ │ │ -_4_6 inline const _G_l_o_b_a_l_I_n_d_e_x& _o_p_e_r_a_t_o_r_[_](std::size_t index) const │ │ │ │ │ -47 { │ │ │ │ │ -48 const _V_e_r_t_e_x& aggregate = aggregates_[index]; │ │ │ │ │ -49 if(aggregate >= _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D) { │ │ │ │ │ -50 assert(aggregate != _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_U_N_A_G_G_R_E_G_A_T_E_D); │ │ │ │ │ -51 return isolatedMarker; │ │ │ │ │ -52 }else{ │ │ │ │ │ -53 const Dune::IndexPair* pair = indexset_.pair │ │ │ │ │ -(aggregate); │ │ │ │ │ -54 assert(pair!=0); │ │ │ │ │ -55 return pair->global(); │ │ │ │ │ -56 } │ │ │ │ │ -57 } │ │ │ │ │ -58 │ │ │ │ │ -59 │ │ │ │ │ -_6_0 inline _G_l_o_b_a_l_I_n_d_e_x& _g_e_t(std::size_t index) │ │ │ │ │ -61 { │ │ │ │ │ -62 const _V_e_r_t_e_x& aggregate = aggregates_[index]; │ │ │ │ │ -63 assert(aggregate < _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D); │ │ │ │ │ -64 const Dune::IndexPair* pair = indexset_.pair │ │ │ │ │ -(aggregate); │ │ │ │ │ -65 assert(pair!=0); │ │ │ │ │ -66 return const_cast<_G_l_o_b_a_l_I_n_d_e_x&>(pair->global()); │ │ │ │ │ -67 } │ │ │ │ │ -68 │ │ │ │ │ -_6_9 class _P_r_o_x_y │ │ │ │ │ -70 { │ │ │ │ │ -71 public: │ │ │ │ │ -_7_2 _P_r_o_x_y(const GlobalLookupIndexSet& indexset, _V_e_r_t_e_x& │ │ │ │ │ -aggregate) │ │ │ │ │ -73 : indexset_(&indexset), aggregate_(&aggregate) │ │ │ │ │ -74 {} │ │ │ │ │ -75 │ │ │ │ │ -_7_6 _P_r_o_x_y& _o_p_e_r_a_t_o_r_=(const _G_l_o_b_a_l_I_n_d_e_x& global) │ │ │ │ │ -77 { │ │ │ │ │ -78 if(global==isolatedMarker) │ │ │ │ │ -79 *aggregate_ = _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_I_S_O_L_A_T_E_D; │ │ │ │ │ -80 else{ │ │ │ │ │ -81 //assert(global < AggregatesMap::ISOLATED); │ │ │ │ │ -82 *aggregate_ = indexset_->operator[](global).local(); │ │ │ │ │ -83 } │ │ │ │ │ -84 return *this; │ │ │ │ │ -85 } │ │ │ │ │ -86 private: │ │ │ │ │ -87 const GlobalLookupIndexSet* indexset_; │ │ │ │ │ -88 _V_e_r_t_e_x* aggregate_; │ │ │ │ │ -89 }; │ │ │ │ │ -90 │ │ │ │ │ -_9_1 inline _P_r_o_x_y _o_p_e_r_a_t_o_r_[_](std::size_t index) │ │ │ │ │ -92 { │ │ │ │ │ -93 return _P_r_o_x_y(indexset_, aggregates_[index]); │ │ │ │ │ -94 } │ │ │ │ │ -95 │ │ │ │ │ -_9_6 inline void _p_u_t(const _G_l_o_b_a_l_I_n_d_e_x& global, size_t i) │ │ │ │ │ -97 { │ │ │ │ │ -98 aggregates_[i]=indexset_[global].local(); │ │ │ │ │ -99 │ │ │ │ │ -100 } │ │ │ │ │ -101 │ │ │ │ │ -102 private: │ │ │ │ │ -103 _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates_; │ │ │ │ │ -104 const GlobalLookupIndexSet& indexset_; │ │ │ │ │ -105 static const _G_l_o_b_a_l_I_n_d_e_x isolatedMarker; │ │ │ │ │ -106 }; │ │ │ │ │ -107 │ │ │ │ │ -108 template │ │ │ │ │ -109 const typename TI::GlobalIndex GlobalAggregatesMap::isolatedMarker = │ │ │ │ │ -110 std::numeric_limits::max(); │ │ │ │ │ -111 │ │ │ │ │ -112 template │ │ │ │ │ -_1_1_3 struct _A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -114 { │ │ │ │ │ -_1_1_5 typedef TI _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ -_1_1_6 typedef typename ParallelIndexSet::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ -117 │ │ │ │ │ -_1_1_8 static const _G_l_o_b_a_l_I_n_d_e_x& _g_a_t_h_e_r(const _G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_,_T_I_>& ga, │ │ │ │ │ -size_t i) │ │ │ │ │ -119 { │ │ │ │ │ -120 return ga[i]; │ │ │ │ │ -121 } │ │ │ │ │ -122 │ │ │ │ │ -_1_2_3 static void _s_c_a_t_t_e_r(_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_,_T_I_>& ga, _G_l_o_b_a_l_I_n_d_e_x global, │ │ │ │ │ -size_t i) │ │ │ │ │ -124 { │ │ │ │ │ -125 ga[i]=global; │ │ │ │ │ -126 } │ │ │ │ │ -127 }; │ │ │ │ │ -128 │ │ │ │ │ -129 template │ │ │ │ │ -_1_3_0 struct _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ -131 {}; │ │ │ │ │ -132 │ │ │ │ │ -133#if HAVE_MPI │ │ │ │ │ -134 │ │ │ │ │ -135#endif │ │ │ │ │ -136 │ │ │ │ │ -137 } // namespace Amg │ │ │ │ │ -138 │ │ │ │ │ -139#if HAVE_MPI │ │ │ │ │ -140 // forward declaration │ │ │ │ │ -141 template │ │ │ │ │ -142 class _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n; │ │ │ │ │ -143#endif │ │ │ │ │ -144 │ │ │ │ │ -145 namespace Amg │ │ │ │ │ -146 { │ │ │ │ │ -147 │ │ │ │ │ -148#if HAVE_MPI │ │ │ │ │ -158 template │ │ │ │ │ -_1_5_9 struct _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r > │ │ │ │ │ -160 { │ │ │ │ │ -_1_6_1 typedef T _V_e_r_t_e_x; │ │ │ │ │ -_1_6_2 typedef O _O_v_e_r_l_a_p_F_l_a_g_s; │ │ │ │ │ -_1_6_3 typedef _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -_1_6_4 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ -_1_6_5 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t _I_n_d_e_x_S_e_t; │ │ │ │ │ -166 │ │ │ │ │ -_1_6_7 static void _p_u_b_l_i_s_h(_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -168 _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -169 const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& globalLookup) │ │ │ │ │ -170 { │ │ │ │ │ -171 typedef _D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_,_I_n_d_e_x_S_e_t_> GlobalMap; │ │ │ │ │ -172 GlobalMap gmap(aggregates, globalLookup); │ │ │ │ │ -173 pinfo._c_o_p_y_O_w_n_e_r_T_o_A_l_l(gmap,gmap); │ │ │ │ │ -174 // communication only needed for ALU │ │ │ │ │ -175 // (ghosts with same global id as owners on the same process) │ │ │ │ │ -176 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(pinfo) == static_cast(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ -_n_o_n_o_v_e_r_l_a_p_p_i_n_g)) │ │ │ │ │ -177 pinfo._c_o_p_y_C_o_p_y_T_o_A_l_l(gmap,gmap); │ │ │ │ │ -178 │ │ │ │ │ -179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists; │ │ │ │ │ -180 Lists lists = pinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().find(pinfo._c_o_m_m_u_n_i_c_a_t_o_r().rank()); │ │ │ │ │ -181 if(lists!=pinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().end()) { │ │ │ │ │ -182 │ │ │ │ │ -183 // For periodic boundary conditions we must renumber │ │ │ │ │ -184 // the aggregates of vertices in the overlap whose owners are │ │ │ │ │ -185 // on the same process │ │ │ │ │ -186 _V_e_r_t_e_x maxAggregate =0; │ │ │ │ │ -187 typedef typename _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r Iter; │ │ │ │ │ -188 for(Iter i=aggregates._b_e_g_i_n(), end=aggregates._e_n_d(); i!=end; ++i) │ │ │ │ │ -189 maxAggregate = std::max(maxAggregate, *i); │ │ │ │ │ -190 │ │ │ │ │ -191 // Compute new mapping of aggregates in the overlap that we also own │ │ │ │ │ -192 std::map newMapping; │ │ │ │ │ -193 │ │ │ │ │ -194 // insert all elements into map │ │ │ │ │ -195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList │ │ │ │ │ -196 ::const_iterator RIter; │ │ │ │ │ -197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end │ │ │ │ │ -(); │ │ │ │ │ -198 ri!=rend; ++ri) │ │ │ │ │ -199 if(O::contains(ri->localIndexPair().local().attribute())) │ │ │ │ │ -200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()], │ │ │ │ │ -201 maxAggregate)); │ │ │ │ │ -202 // renumber │ │ │ │ │ -203 typedef typename std::map::iterator MIter; │ │ │ │ │ -204 for(MIter mi=newMapping.begin(), mend=newMapping.end(); │ │ │ │ │ -205 mi != mend; ++mi) │ │ │ │ │ -206 mi->second=++maxAggregate; │ │ │ │ │ -207 │ │ │ │ │ -208 │ │ │ │ │ -209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end │ │ │ │ │ -(); │ │ │ │ │ -210 ri!=rend; ++ri) │ │ │ │ │ -211 if(O::contains(ri->localIndexPair().local().attribute())) │ │ │ │ │ -212 aggregates[ri->localIndexPair().local()] = │ │ │ │ │ -213 newMapping[aggregates[ri->localIndexPair().local()]]; │ │ │ │ │ -214 } │ │ │ │ │ -215 } │ │ │ │ │ -216 }; │ │ │ │ │ -217#endif │ │ │ │ │ -218 │ │ │ │ │ -219 template │ │ │ │ │ -_2_2_0 struct _A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ -221 { │ │ │ │ │ -_2_2_2 typedef T _V_e_r_t_e_x; │ │ │ │ │ -_2_2_3 typedef _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -_2_2_4 typedef typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ -225 │ │ │ │ │ -_2_2_6 static void _p_u_b_l_i_s_h([[maybe_unused]] _A_g_g_r_e_g_a_t_e_s_M_a_p_<_V_e_r_t_e_x_>& aggregates, │ │ │ │ │ -227 [[maybe_unused]] _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo, │ │ │ │ │ -228 [[maybe_unused]] const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& globalLookup) │ │ │ │ │ -229 {} │ │ │ │ │ -230 }; │ │ │ │ │ -231 │ │ │ │ │ -232 } // end Amg namespace │ │ │ │ │ -233 │ │ │ │ │ -234 │ │ │ │ │ -235#if HAVE_MPI │ │ │ │ │ -236 template │ │ │ │ │ -_2_3_7 struct CommPolicy > │ │ │ │ │ -238 { │ │ │ │ │ -_2_3_9 typedef _A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_> _T_y_p_e; │ │ │ │ │ -_2_4_0 typedef typename _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_T_,_T_I_>_:_:_I_n_d_e_x_e_d_T_y_p_e _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ -_2_4_1 typedef SizeOne _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ -_2_4_2 static int _g_e_t_S_i_z_e(const _T_y_p_e&, int) │ │ │ │ │ -243 { │ │ │ │ │ -244 return 1; │ │ │ │ │ -245 } │ │ │ │ │ -246 }; │ │ │ │ │ -247#endif │ │ │ │ │ -248 │ │ │ │ │ -249} // end Dune namespace │ │ │ │ │ -250 /* @} */ │ │ │ │ │ -251#endif │ │ │ │ │ -_a_g_g_r_e_g_a_t_e_s_._h_h │ │ │ │ │ -Provides classes for the Coloring process of AMG. │ │ │ │ │ -_p_i_n_f_o_._h_h │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -_>_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const GlobalIndex & operator[](std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -_>_:_:_O_v_e_r_l_a_p_F_l_a_g_s │ │ │ │ │ -O OverlapFlags │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_g_e_t_S_i_z_e │ │ │ │ │ -static int getSize(const Type &, int) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:242 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ -Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:240 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_g_e_t │ │ │ │ │ -GlobalIndex & get(std::size_t index) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -_>_:_:_V_e_r_t_e_x │ │ │ │ │ -T Vertex │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_p_u_b_l_i_s_h │ │ │ │ │ -static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation │ │ │ │ │ -&pinfo, const GlobalLookupIndexSet &globalLookup) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_: │ │ │ │ │ -_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -SequentialInformation ParallelInformation │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:223 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -_>_:_:_I_n_d_e_x_S_e_t │ │ │ │ │ -ParallelInformation::ParallelIndexSet IndexSet │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_p_u_t │ │ │ │ │ -void put(const GlobalIndex &global, size_t i) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_V_e_r_t_e_x │ │ │ │ │ -T Vertex │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const │ │ │ │ │ -GlobalLookupIndexSet< ParallelIndexSet > &indexset) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -TI ParallelIndexSet │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -Amg::AggregatesMap< T > Type │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:239 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, │ │ │ │ │ -size_t i) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -_>_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:725 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_<_ _T_,_ _T_I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ -SizeOne IndexedTypeFlag │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_r_o_x_y_:_:_P_r_o_x_y │ │ │ │ │ -Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex │ │ │ │ │ -&aggregate) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:730 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_1_,_ _T_2_ _> │ │ │ │ │ -_>_:_:_p_u_b_l_i_s_h │ │ │ │ │ -static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation │ │ │ │ │ -&pinfo, const GlobalLookupIndexSet &globalLookup) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -const AggregateDescriptor * const_iterator │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:723 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ -ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -TI ParallelIndexSet │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ -T Vertex │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:222 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r_<_ _T_,_ _O_,_ _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_ _>_:_: │ │ │ │ │ -_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:224 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, │ │ │ │ │ -size_t i) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_r_o_x_y_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -Proxy & operator=(const GlobalIndex &global) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ -ParallelIndexSet::GlobalIndex IndexedType │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -Proxy operator[](std::size_t index) │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:91 │ │ │ │ │ +39 namespace { │ │ │ │ │ +40 template class Base, class V, class Tag, typename... Args> │ │ │ │ │ +41 auto registryGet(Tag , std::string name, Args... args) │ │ │ │ │ +42 { │ │ │ │ │ +43 constexpr auto count = _D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag); │ │ │ │ │ +44 std::shared_ptr > result; │ │ │ │ │ +45 Dune::Hybrid::forEach(std::make_index_sequence{}, │ │ │ │ │ +46 [&](auto index) { │ │ │ │ │ +47 using Reg = Registry; │ │ │ │ │ +48 if(!result && Reg::name() == name) { │ │ │ │ │ +49 result = Reg::getCreator()(Dune::MetaType{}, args...); │ │ │ │ │ +50 } │ │ │ │ │ +51 }); │ │ │ │ │ +52 return result; │ │ │ │ │ +53 } │ │ │ │ │ +54 │ │ │ │ │ +55 /* │ │ │ │ │ +56 Register all creators from the registry in the Parameterizedobjectfactory An │ │ │ │ │ +57 object of V is passed in the creator ans should be used to determine the │ │ │ │ │ +58 template arguments. │ │ │ │ │ +59 */ │ │ │ │ │ +60 template │ │ │ │ │ +61 int addRegistryToFactory(Dune::ParameterizedObjectFactory& factory, │ │ │ │ │ +62 Tag){ │ │ │ │ │ +63 constexpr auto count = _D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag); │ │ │ │ │ +64 Dune::Hybrid::forEach(std::make_index_sequence{}, │ │ │ │ │ +65 [&](auto index) { │ │ │ │ │ +66 // we first get the generic lambda │ │ │ │ │ +67 // and later specialize it with given parameters. │ │ │ │ │ +68 // doing all at once lead to an ICE woth g++-6 │ │ │ │ │ +69 using Reg = Registry; │ │ │ │ │ +70 auto genericcreator = Reg::getCreator(); │ │ │ │ │ +71 factory.define(Reg::name(), [genericcreator](Args... args){ │ │ │ │ │ +72 return genericcreator(V{}, args...); │ │ │ │ │ +73 }); │ │ │ │ │ +74 }); │ │ │ │ │ +75 return count; │ │ │ │ │ +76 } │ │ │ │ │ +77 } // end anonymous namespace │ │ │ │ │ +78} // end namespace Dune │ │ │ │ │ +79 │ │ │ │ │ +80#endif // DUNE_ISTL_COMMON_REGISTRY_HH │ │ │ │ │ +_c_o_u_n_t_e_r_._h_h │ │ │ │ │ +_D_U_N_E___G_E_T___C_O_U_N_T_E_R │ │ │ │ │ +#define DUNE_GET_COUNTER(Tag) │ │ │ │ │ +DDeeffiinniittiioonn counter.hh:17 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ -owner/overlap/copy sema... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_C_o_p_y_T_o_A_l_l │ │ │ │ │ -void copyCopyToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from copy data points to all other data points. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:328 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet │ │ │ │ │ -The type of the reverse lookup of indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:456 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -const Communication< MPI_Comm > & communicator() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ -void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from owner data points to all other data points. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -const RemoteIndices & remoteIndices() const │ │ │ │ │ -Get the underlying remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ -The type of the parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_G_l_o_b_a_l_A_g_g_r_e_g_a_t_e_s_M_a_p_:_:_P_r_o_x_y │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_g_g_r_e_g_a_t_e_s_P_u_b_l_i_s_h_e_r │ │ │ │ │ -DDeeffiinniittiioonn globalaggregates.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -int GlobalLookupIndexSet │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ nonoverlapping │ │ │ │ │ -Category for non-overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00137.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: kamg.hh File Reference │ │ │ │ +dune-istl: counter.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,51 +65,125 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Variables
│ │ │ │ +
counter.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Provides an algebraic multigrid using a Krylov cycle. │ │ │ │ -More...

│ │ │ │ -
#include <dune/istl/preconditioners.hh>
│ │ │ │ -#include "amg.hh"
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <typeinfo>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Amg::KAmgTwoGrid< AMG >
 Two grid operator for AMG with Krylov cycle. More...
 
class  Dune::Amg::KAMG< M, X, S, PI, K, A >
 an algebraic multigrid method using a Krylov-cycle. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
namespace  Dune::CounterImpl
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_GET_COUNTER(Tag)    (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
 
#define DUNE_INC_COUNTER(Tag)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

constexpr std::size_t maxcount = 100
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Provides an algebraic multigrid using a Krylov cycle.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GET_COUNTER

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GET_COUNTER( Tag)    (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_INC_COUNTER

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_INC_COUNTER( Tag)
│ │ │ │ +
│ │ │ │ +Value:
namespace { \
│ │ │ │ +
namespace CounterImpl { \
│ │ │ │ +
constexpr std::size_t \
│ │ │ │ +
counterFunc(Dune::PriorityTag<DUNE_GET_COUNTER(Tag)+1> p, Tag, ADLTag) \
│ │ │ │ +
{ \
│ │ │ │ +
return p.value; \
│ │ │ │ +
} \
│ │ │ │ +
} \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "unfudge indentation")
│ │ │ │ +
#define DUNE_GET_COUNTER(Tag)
Definition counter.hh:17
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +

Variable Documentation

│ │ │ │ + │ │ │ │ +

◆ maxcount

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
constexpr std::size_t maxcount = 100
│ │ │ │ +
│ │ │ │ +constexpr
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,33 +1,56 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -kamg.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides an algebraic multigrid using a Krylov cycle. _M_o_r_e_._._. │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -#include "_a_m_g_._h_h" │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ +counter.hh File Reference │ │ │ │ │ +#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_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_<_ _A_M_G_ _> │ │ │ │ │ -  Two grid operator for _A_M_G with Krylov cycle. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_<_ _M_,_ _X_,_ _S_,_ _P_I_,_ _K_,_ _A_ _> │ │ │ │ │ -  an algebraic multigrid method using a Krylov-cycle. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +namespace   _D_u_n_e_:_:_C_o_u_n_t_e_r_I_m_p_l │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag)    (counterFunc(Dune::PriorityTag<_m_a_x_c_o_u_n_t>{}, │ │ │ │ │ + Tag{}, Dune::CounterImpl::ADLTag{})) │ │ │ │ │ +  │ │ │ │ │ +#define  _D_U_N_E___I_N_C___C_O_U_N_T_E_R(Tag) │ │ │ │ │ +  │ │ │ │ │ +VVaarriiaabblleess │ │ │ │ │ +constexpr std::size_t  _m_a_x_c_o_u_n_t = 100 │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides an algebraic multigrid using a Krylov cycle. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEETT__CCOOUUNNTTEERR ********** │ │ │ │ │ +#define DUNE_GET_COUNTER (   Tag )     (counterFunc(Dune::PriorityTag<_m_a_x_c_o_u_n_t> │ │ │ │ │ + {}, Tag{}, Dune::CounterImpl::ADLTag{})) │ │ │ │ │ +********** _?◆_? DDUUNNEE__IINNCC__CCOOUUNNTTEERR ********** │ │ │ │ │ +#define DUNE_INC_COUNTER (   Tag ) │ │ │ │ │ +VVaalluuee:: │ │ │ │ │ +namespace { \ │ │ │ │ │ +namespace CounterImpl { \ │ │ │ │ │ +constexpr std::size_t \ │ │ │ │ │ +counterFunc(Dune::PriorityTag<_D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag)+1> p, Tag, ADLTag) \ │ │ │ │ │ +{ \ │ │ │ │ │ +return p.value; \ │ │ │ │ │ +} \ │ │ │ │ │ +} \ │ │ │ │ │ +} \ │ │ │ │ │ +static_assert(true, "unfudge indentation") │ │ │ │ │ +_D_U_N_E___G_E_T___C_O_U_N_T_E_R │ │ │ │ │ +#define DUNE_GET_COUNTER(Tag) │ │ │ │ │ +DDeeffiinniittiioonn counter.hh:17 │ │ │ │ │ +********** VVaarriiaabbllee DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? mmaaxxccoouunntt ********** │ │ │ │ │ +constexpr std::size_t maxcount = 100 constexpr │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: kamg.hh Source File │ │ │ │ +dune-istl: counter.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,336 +70,77 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
kamg.hh
│ │ │ │ +
counter.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_KAMG_HH
│ │ │ │ -
6#define DUNE_AMG_KAMG_HH
│ │ │ │ -
7
│ │ │ │ - │ │ │ │ -
9#include "amg.hh"
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune
│ │ │ │ -
12{
│ │ │ │ -
13 namespace Amg
│ │ │ │ -
14 {
│ │ │ │ -
15
│ │ │ │ -
30 template<class AMG>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
32 : public Preconditioner<typename AMG::Domain,typename AMG::Range>
│ │ │ │ -
33 {
│ │ │ │ -
35 typedef typename AMG::Domain Domain;
│ │ │ │ -
37 typedef typename AMG::Range Range;
│ │ │ │ -
38 public:
│ │ │ │ -
39
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
42 {
│ │ │ │ -
43 return amg_.category();
│ │ │ │ -
44 };
│ │ │ │ -
│ │ │ │ -
45
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
54 : amg_(amg), coarseSolver_(coarseSolver)
│ │ │ │ -
55 {}
│ │ │ │ -
│ │ │ │ -
56
│ │ │ │ -
│ │ │ │ -
58 void pre([[maybe_unused]] typename AMG::Domain& x, [[maybe_unused]] typename AMG::Range& b)
│ │ │ │ -
59 {}
│ │ │ │ -
│ │ │ │ -
60
│ │ │ │ -
│ │ │ │ -
62 void post([[maybe_unused]] typename AMG::Domain& x)
│ │ │ │ -
63 {}
│ │ │ │ -
│ │ │ │ -
64
│ │ │ │ -
│ │ │ │ -
66 void apply(typename AMG::Domain& v, const typename AMG::Range& d)
│ │ │ │ -
67 {
│ │ │ │ -
68 // Copy data
│ │ │ │ -
69 *levelContext_->update=0;
│ │ │ │ -
70 *levelContext_->rhs = d;
│ │ │ │ -
71 *levelContext_->lhs = v;
│ │ │ │ -
72
│ │ │ │ -
73 presmooth(*levelContext_, amg_.preSteps_);
│ │ │ │ -
74 bool processFineLevel =
│ │ │ │ -
75 amg_.moveToCoarseLevel(*levelContext_);
│ │ │ │ -
76
│ │ │ │ -
77 if(processFineLevel) {
│ │ │ │ -
78 typename AMG::Range b=*levelContext_->rhs;
│ │ │ │ -
79 typename AMG::Domain x=*levelContext_->update;
│ │ │ │ - │ │ │ │ -
81 coarseSolver_->apply(x, b, res);
│ │ │ │ -
82 *levelContext_->update=x;
│ │ │ │ -
83 }
│ │ │ │ -
84
│ │ │ │ -
85 amg_.moveToFineLevel(*levelContext_, processFineLevel);
│ │ │ │ -
86
│ │ │ │ -
87 postsmooth(*levelContext_, amg_.postSteps_);
│ │ │ │ -
88 v=*levelContext_->update;
│ │ │ │ -
89 }
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
96 {
│ │ │ │ -
97 return coarseSolver_;
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
104 void setLevelContext(std::shared_ptr<typename AMG::LevelContext> p)
│ │ │ │ -
105 {
│ │ │ │ -
106 levelContext_=p;
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
111 {}
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
113 private:
│ │ │ │ -
115 AMG& amg_;
│ │ │ │ -
117 std::shared_ptr<InverseOperator<Domain,Range> > coarseSolver_;
│ │ │ │ -
119 std::shared_ptr<typename AMG::LevelContext> levelContext_;
│ │ │ │ -
120 };
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122
│ │ │ │ -
123
│ │ │ │ -
137 template<class M, class X, class S, class PI=SequentialInformation,
│ │ │ │ -
138 class K=GeneralizedPCGSolver<X>, class A=std::allocator<X> >
│ │ │ │ -
│ │ │ │ -
139 class KAMG : public Preconditioner<X,X>
│ │ │ │ -
140 {
│ │ │ │ -
141 public:
│ │ │ │ - │ │ │ │ -
145 typedef K KrylovSolver;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
155 typedef typename Amg::Operator Operator;
│ │ │ │ -
157 typedef typename Amg::Domain Domain;
│ │ │ │ -
159 typedef typename Amg::Range Range;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
164
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
167 {
│ │ │ │ -
168 return amg.category();
│ │ │ │ -
169 };
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
182 KAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
│ │ │ │ -
183 const SmootherArgs& smootherArgs, const Parameters& parms,
│ │ │ │ -
184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1);
│ │ │ │ -
185
│ │ │ │ -
199 template<class C>
│ │ │ │ -
200 KAMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ -
201 const SmootherArgs& smootherArgs=SmootherArgs(),
│ │ │ │ -
202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1,
│ │ │ │ - │ │ │ │ -
204
│ │ │ │ -
206 void pre(Domain& x, Range& b);
│ │ │ │ -
208 void post(Domain& x);
│ │ │ │ -
210 void apply(Domain& v, const Range& d);
│ │ │ │ -
211
│ │ │ │ -
212 std::size_t maxlevels();
│ │ │ │ -
213
│ │ │ │ -
214 private:
│ │ │ │ -
216 Amg amg;
│ │ │ │ -
217
│ │ │ │ -
219 std::size_t maxLevelKrylovSteps;
│ │ │ │ -
220
│ │ │ │ -
222 double levelDefectReduction;
│ │ │ │ -
223
│ │ │ │ -
225 std::vector<std::shared_ptr<typename Amg::ScalarProduct> > scalarproducts;
│ │ │ │ -
226
│ │ │ │ -
228 std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > > ksolvers;
│ │ │ │ -
229 };
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
231
│ │ │ │ -
232 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
234 const SmootherArgs& smootherArgs, const Parameters& params,
│ │ │ │ -
235 std::size_t ksteps, double reduction)
│ │ │ │ -
236 : amg(matrices, coarseSolver, smootherArgs, params),
│ │ │ │ -
237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
│ │ │ │ -
238 {}
│ │ │ │ -
│ │ │ │ -
239
│ │ │ │ -
240
│ │ │ │ -
241 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
242 template<class C>
│ │ │ │ -
│ │ │ │ -
243 KAMG<M,X,S,P,K,A>::KAMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ -
244 const SmootherArgs& smootherArgs,
│ │ │ │ -
245 std::size_t ksteps, double reduction,
│ │ │ │ -
246 const ParallelInformation& pinfo)
│ │ │ │ -
247 : amg(fineOperator, criterion, smootherArgs, pinfo),
│ │ │ │ -
248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
│ │ │ │ -
249 {}
│ │ │ │ -
│ │ │ │ -
250
│ │ │ │ -
251
│ │ │ │ -
252 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
254 {
│ │ │ │ -
255 amg.pre(x,b);
│ │ │ │ -
256 scalarproducts.reserve(amg.levels());
│ │ │ │ -
257 ksolvers.reserve(amg.levels());
│ │ │ │ -
258
│ │ │ │ -
259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator
│ │ │ │ -
260 matrix = amg.matrices_->matrices().coarsest();
│ │ │ │ - │ │ │ │ -
262 pinfo = amg.matrices_->parallelInformation().coarsest();
│ │ │ │ -
263 bool hasCoarsest=(amg.levels()==amg.maxlevels());
│ │ │ │ -
264
│ │ │ │ -
265 if(hasCoarsest) {
│ │ │ │ -
266 if(matrix==amg.matrices_->matrices().finest())
│ │ │ │ -
267 return;
│ │ │ │ -
268 --matrix;
│ │ │ │ -
269 --pinfo;
│ │ │ │ -
270 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, amg.solver_)));
│ │ │ │ -
271 }else
│ │ │ │ -
272 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, std::shared_ptr<InverseOperator<Domain,Range> >())));
│ │ │ │ -
273
│ │ │ │ -
274 std::ostringstream s;
│ │ │ │ -
275
│ │ │ │ -
276 if(matrix!=amg.matrices_->matrices().finest())
│ │ │ │ -
277 while(true) {
│ │ │ │ -
278 scalarproducts.push_back(createScalarProduct<X>(*pinfo,category()));
│ │ │ │ -
279 std::shared_ptr<InverseOperator<Domain,Range> > ks =
│ │ │ │ -
280 std::shared_ptr<InverseOperator<Domain,Range> >(new KrylovSolver(*matrix, *(scalarproducts.back()),
│ │ │ │ -
281 *(ksolvers.back()), levelDefectReduction,
│ │ │ │ -
282 maxLevelKrylovSteps, 0));
│ │ │ │ -
283 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, ks)));
│ │ │ │ -
284 --matrix;
│ │ │ │ -
285 --pinfo;
│ │ │ │ -
286 if(matrix==amg.matrices_->matrices().finest())
│ │ │ │ -
287 break;
│ │ │ │ -
288 }
│ │ │ │ -
289 }
│ │ │ │ -
│ │ │ │ -
290
│ │ │ │ -
291
│ │ │ │ -
292 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
294 {
│ │ │ │ -
295 amg.post(x);
│ │ │ │ -
296
│ │ │ │ -
297 }
│ │ │ │ -
│ │ │ │ -
298
│ │ │ │ -
299 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
301 {
│ │ │ │ -
302 if(ksolvers.size()==0)
│ │ │ │ -
303 {
│ │ │ │ -
304 Range td=d;
│ │ │ │ - │ │ │ │ -
306 amg.solver_->apply(v,td,res);
│ │ │ │ -
307 }else
│ │ │ │ -
308 {
│ │ │ │ -
309 typedef typename Amg::LevelContext LevelContext;
│ │ │ │ -
310 std::shared_ptr<LevelContext> levelContext(new LevelContext);
│ │ │ │ -
311 amg.initIteratorsWithFineLevel(*levelContext);
│ │ │ │ -
312 typedef typename std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > >::iterator Iter;
│ │ │ │ -
313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)
│ │ │ │ -
314 (*solver)->setLevelContext(levelContext);
│ │ │ │ -
315 ksolvers.back()->apply(v,d);
│ │ │ │ -
316 }
│ │ │ │ -
317 }
│ │ │ │ -
│ │ │ │ -
318
│ │ │ │ -
319 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
321 {
│ │ │ │ -
322 return amg.maxlevels();
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
326 } // Amg
│ │ │ │ -
327} // Dune
│ │ │ │ -
328
│ │ │ │ -
329#endif
│ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
The AMG preconditioner.
│ │ │ │ -
void apply(Domain &v, const Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition kamg.hh:300
│ │ │ │ -
X Domain
The domain type.
Definition amg.hh:87
│ │ │ │ -
KAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs &smootherArgs, const Parameters &parms, std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1)
Construct a new amg with a specific coarse solver.
Definition kamg.hh:233
│ │ │ │ -
std::size_t maxlevels()
Definition kamg.hh:320
│ │ │ │ -
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition amg.hh:100
│ │ │ │ -
M Operator
The matrix operator type.
Definition amg.hh:73
│ │ │ │ -
void post(Domain &x)
Clean up.
Definition kamg.hh:293
│ │ │ │ -
X Range
The range type.
Definition amg.hh:89
│ │ │ │ -
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ -
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ -
void pre(Domain &x, Range &b)
Prepare the preconditioner.
Definition kamg.hh:253
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition amg.hh:194
│ │ │ │ -
PI ParallelInformation
The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
Definition amg.hh:80
│ │ │ │ +
3#ifndef DUNE_ISTL_COMMON_COUNTER_HH
│ │ │ │ +
4#define DUNE_ISTL_COMMON_COUNTER_HH
│ │ │ │ +
5
│ │ │ │ +
6#include <cassert>
│ │ │ │ +
7#include <typeinfo>
│ │ │ │ +
8#include <iostream>
│ │ │ │ +
9#include <memory>
│ │ │ │ +
10#include <tuple>
│ │ │ │ +
11#include <utility>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/typeutilities.hh>
│ │ │ │ +
14
│ │ │ │ +
15constexpr std::size_t maxcount = 100;
│ │ │ │ +
16
│ │ │ │ +
│ │ │ │ +
17#define DUNE_GET_COUNTER(Tag) \
│ │ │ │ +
18 (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
│ │ │ │ +
│ │ │ │ +
19
│ │ │ │ +
│ │ │ │ +
20#define DUNE_INC_COUNTER(Tag) \
│ │ │ │ +
21 namespace { \
│ │ │ │ +
22 namespace CounterImpl { \
│ │ │ │ +
23 constexpr std::size_t \
│ │ │ │ +
24 counterFunc(Dune::PriorityTag<DUNE_GET_COUNTER(Tag)+1> p, Tag, ADLTag) \
│ │ │ │ +
25 { \
│ │ │ │ +
26 return p.value; \
│ │ │ │ +
27 } \
│ │ │ │ +
28 } \
│ │ │ │ +
29 } \
│ │ │ │ +
30 static_assert(true, "unfudge indentation")
│ │ │ │ +
│ │ │ │ +
31
│ │ │ │ +
32namespace Dune {
│ │ │ │ +
33 namespace {
│ │ │ │ +
34
│ │ │ │ +
│ │ │ │ +
35 namespace CounterImpl {
│ │ │ │ +
36
│ │ │ │ +
37 struct ADLTag {};
│ │ │ │ +
38
│ │ │ │ +
39 template<class Tag>
│ │ │ │ +
40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag)
│ │ │ │ +
41 {
│ │ │ │ +
42 return 0;
│ │ │ │ +
43 }
│ │ │ │ +
44
│ │ │ │ +
45 } // end namespace CounterImpl
│ │ │ │ +
│ │ │ │ +
46 } // end empty namespace
│ │ │ │ +
47} // end namespace Dune
│ │ │ │ +
48#endif // DUNE_ISTL_COMMON_COUNTER_HH
│ │ │ │ +
constexpr std::size_t maxcount
Definition counter.hh:15
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
an algebraic multigrid method using a Krylov-cycle.
Definition kamg.hh:140
│ │ │ │ -
Amg::Domain Domain
the type of the domain.
Definition kamg.hh:157
│ │ │ │ -
Amg::SmootherArgs SmootherArgs
The type of the arguments for construction of the smoothers.
Definition kamg.hh:153
│ │ │ │ -
Amg::ParallelInformation ParallelInformation
the type of the parallelinformation to use.
Definition kamg.hh:151
│ │ │ │ -
Amg::CoarseSolver CoarseSolver
The type of the coarse solver.
Definition kamg.hh:149
│ │ │ │ -
Amg::OperatorHierarchy OperatorHierarchy
The type of the hierarchy of operators.
Definition kamg.hh:147
│ │ │ │ -
Amg::Range Range
The type of the range.
Definition kamg.hh:159
│ │ │ │ -
Amg::ScalarProduct ScalarProduct
The type of the scalar product.
Definition kamg.hh:163
│ │ │ │ -
AMG< M, X, S, PI, A > Amg
The type of the underlying AMG.
Definition kamg.hh:143
│ │ │ │ -
Amg::Operator Operator
the type of the lineatr operator.
Definition kamg.hh:155
│ │ │ │ -
Amg::ParallelInformationHierarchy ParallelInformationHierarchy
The type of the hierarchy of parallel information.
Definition kamg.hh:161
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition kamg.hh:166
│ │ │ │ -
K KrylovSolver
The type of the Krylov solver for the cycle.
Definition kamg.hh:145
│ │ │ │ -
Two grid operator for AMG with Krylov cycle.
Definition kamg.hh:33
│ │ │ │ -
void pre(typename AMG::Domain &x, typename AMG::Range &b)
Prepare the preconditioner.
Definition kamg.hh:58
│ │ │ │ -
KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > > coarseSolver)
Constructor.
Definition kamg.hh:53
│ │ │ │ -
~KAmgTwoGrid()
Destructor.
Definition kamg.hh:110
│ │ │ │ -
void post(typename AMG::Domain &x)
Clean up.
Definition kamg.hh:62
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition kamg.hh:41
│ │ │ │ -
void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p)
Set the level context pointer.
Definition kamg.hh:104
│ │ │ │ -
InverseOperator< Domain, Range > * coarseSolver()
Get a pointer to the coarse grid solver.
Definition kamg.hh:95
│ │ │ │ -
void apply(typename AMG::Domain &v, const typename AMG::Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition kamg.hh:66
│ │ │ │ -
Parallel algebraic multigrid based on agglomeration.
Definition amg.hh:65
│ │ │ │ - │ │ │ │ -
LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ -
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ -
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
Generalized preconditioned conjugate gradient solver.
Definition solvers.hh:1307
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,433 +1,66 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -kamg.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +counter.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_KAMG_HH │ │ │ │ │ -6#define DUNE_AMG_KAMG_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ -9#include "_a_m_g_._h_h" │ │ │ │ │ -10 │ │ │ │ │ -11namespace _D_u_n_e │ │ │ │ │ -12{ │ │ │ │ │ -13 namespace Amg │ │ │ │ │ -14 { │ │ │ │ │ -15 │ │ │ │ │ -30 template │ │ │ │ │ -_3_1 class _K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ -32 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -33 { │ │ │ │ │ -35 typedef typename _A_M_G_:_:_D_o_m_a_i_n Domain; │ │ │ │ │ -37 typedef typename _A_M_G_:_:_R_a_n_g_e Range; │ │ │ │ │ -38 public: │ │ │ │ │ -39 │ │ │ │ │ -_4_1 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -42 { │ │ │ │ │ -43 return amg_._c_a_t_e_g_o_r_y(); │ │ │ │ │ -44 }; │ │ │ │ │ -45 │ │ │ │ │ -_5_3 _K_A_m_g_T_w_o_G_r_i_d(_A_M_G& amg, std::shared_ptr<_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_> > │ │ │ │ │ -_c_o_a_r_s_e_S_o_l_v_e_r) │ │ │ │ │ -54 : amg_(amg), coarseSolver_(_c_o_a_r_s_e_S_o_l_v_e_r) │ │ │ │ │ -55 {} │ │ │ │ │ -56 │ │ │ │ │ -_5_8 void _p_r_e([[maybe_unused]] typename _A_M_G_:_:_D_o_m_a_i_n& x, [[maybe_unused]] typename │ │ │ │ │ -_A_M_G_:_:_R_a_n_g_e& b) │ │ │ │ │ -59 {} │ │ │ │ │ -60 │ │ │ │ │ -_6_2 void _p_o_s_t([[maybe_unused]] typename _A_M_G_:_:_D_o_m_a_i_n& x) │ │ │ │ │ -63 {} │ │ │ │ │ -64 │ │ │ │ │ -_6_6 void _a_p_p_l_y(typename _A_M_G_:_:_D_o_m_a_i_n& v, const typename _A_M_G_:_:_R_a_n_g_e& d) │ │ │ │ │ -67 { │ │ │ │ │ -68 // Copy data │ │ │ │ │ -69 *levelContext_->update=0; │ │ │ │ │ -70 *levelContext_->rhs = d; │ │ │ │ │ -71 *levelContext_->lhs = v; │ │ │ │ │ -72 │ │ │ │ │ -73 _p_r_e_s_m_o_o_t_h(*levelContext_, amg_.preSteps_); │ │ │ │ │ -74 bool processFineLevel = │ │ │ │ │ -75 amg_.moveToCoarseLevel(*levelContext_); │ │ │ │ │ -76 │ │ │ │ │ -77 if(processFineLevel) { │ │ │ │ │ -78 typename _A_M_G_:_:_R_a_n_g_e b=*levelContext_->rhs; │ │ │ │ │ -79 typename _A_M_G_:_:_D_o_m_a_i_n x=*levelContext_->update; │ │ │ │ │ -80 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ -81 coarseSolver_->apply(x, b, res); │ │ │ │ │ -82 *levelContext_->update=x; │ │ │ │ │ -83 } │ │ │ │ │ -84 │ │ │ │ │ -85 amg_.moveToFineLevel(*levelContext_, processFineLevel); │ │ │ │ │ -86 │ │ │ │ │ -87 _p_o_s_t_s_m_o_o_t_h(*levelContext_, amg_.postSteps_); │ │ │ │ │ -88 v=*levelContext_->update; │ │ │ │ │ -89 } │ │ │ │ │ -90 │ │ │ │ │ -_9_5 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_>* _c_o_a_r_s_e_S_o_l_v_e_r() │ │ │ │ │ -96 { │ │ │ │ │ -97 return coarseSolver_; │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -_1_0_4 void _s_e_t_L_e_v_e_l_C_o_n_t_e_x_t(std::shared_ptr p) │ │ │ │ │ -105 { │ │ │ │ │ -106 levelContext_=p; │ │ │ │ │ -107 } │ │ │ │ │ -108 │ │ │ │ │ -_1_1_0 _~_K_A_m_g_T_w_o_G_r_i_d() │ │ │ │ │ -111 {} │ │ │ │ │ -112 │ │ │ │ │ -113 private: │ │ │ │ │ -115 _A_M_G& amg_; │ │ │ │ │ -117 std::shared_ptr > coarseSolver_; │ │ │ │ │ -119 std::shared_ptr levelContext_; │ │ │ │ │ -120 }; │ │ │ │ │ -121 │ │ │ │ │ -122 │ │ │ │ │ -123 │ │ │ │ │ -137 template, class A=std::allocator > │ │ │ │ │ -_1_3_9 class _K_A_M_G : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -140 { │ │ │ │ │ -141 public: │ │ │ │ │ -_1_4_3 typedef _A_M_G_<_M_,_X_,_S_,_P_I_,_A_> _A_m_g; │ │ │ │ │ -_1_4_5 typedef K _K_r_y_l_o_v_S_o_l_v_e_r; │ │ │ │ │ -_1_4_7 typedef typename _A_m_g_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -_1_4_9 typedef typename _A_m_g_:_:_C_o_a_r_s_e_S_o_l_v_e_r _C_o_a_r_s_e_S_o_l_v_e_r; │ │ │ │ │ -_1_5_1 typedef typename _A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -_1_5_3 typedef typename _A_m_g_:_:_S_m_o_o_t_h_e_r_A_r_g_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ -_1_5_5 typedef typename _A_m_g_:_:_O_p_e_r_a_t_o_r _O_p_e_r_a_t_o_r; │ │ │ │ │ -_1_5_7 typedef typename _A_m_g_:_:_D_o_m_a_i_n _D_o_m_a_i_n; │ │ │ │ │ -_1_5_9 typedef typename _A_m_g_:_:_R_a_n_g_e _R_a_n_g_e; │ │ │ │ │ -_1_6_1 typedef typename _A_m_g_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -_1_6_3 typedef typename _A_m_g_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t _S_c_a_l_a_r_P_r_o_d_u_c_t; │ │ │ │ │ -164 │ │ │ │ │ -_1_6_6 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -167 { │ │ │ │ │ -168 return amg._c_a_t_e_g_o_r_y(); │ │ │ │ │ -169 }; │ │ │ │ │ -170 │ │ │ │ │ -182 _K_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& coarseSolver, │ │ │ │ │ -183 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, const _P_a_r_a_m_e_t_e_r_s& parms, │ │ │ │ │ -184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1); │ │ │ │ │ -185 │ │ │ │ │ -199 template │ │ │ │ │ -200 _K_A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ -201 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs=_S_m_o_o_t_h_e_r_A_r_g_s(), │ │ │ │ │ -202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1, │ │ │ │ │ -203 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ -204 │ │ │ │ │ -206 void _p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b); │ │ │ │ │ -208 void _p_o_s_t(_D_o_m_a_i_n& x); │ │ │ │ │ -210 void _a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d); │ │ │ │ │ -211 │ │ │ │ │ -212 std::size_t _m_a_x_l_e_v_e_l_s(); │ │ │ │ │ -213 │ │ │ │ │ -214 private: │ │ │ │ │ -216 _A_m_g amg; │ │ │ │ │ -217 │ │ │ │ │ -219 std::size_t maxLevelKrylovSteps; │ │ │ │ │ -220 │ │ │ │ │ -222 double levelDefectReduction; │ │ │ │ │ -223 │ │ │ │ │ -225 std::vector > scalarproducts; │ │ │ │ │ -226 │ │ │ │ │ -228 std::vector > > ksolvers; │ │ │ │ │ -229 }; │ │ │ │ │ -230 │ │ │ │ │ -231 │ │ │ │ │ -232 template │ │ │ │ │ -_2_3_3 _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_K_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& │ │ │ │ │ -coarseSolver, │ │ │ │ │ -234 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, const _P_a_r_a_m_e_t_e_r_s& params, │ │ │ │ │ -235 std::size_t ksteps, double reduction) │ │ │ │ │ -236 : amg(matrices, coarseSolver, smootherArgs, params), │ │ │ │ │ -237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction) │ │ │ │ │ -238 {} │ │ │ │ │ -239 │ │ │ │ │ -240 │ │ │ │ │ -241 template │ │ │ │ │ -242 template │ │ │ │ │ -_2_4_3 _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_K_A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ -244 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, │ │ │ │ │ -245 std::size_t ksteps, double reduction, │ │ │ │ │ -246 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo) │ │ │ │ │ -247 : amg(fineOperator, criterion, smootherArgs, pinfo), │ │ │ │ │ -248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction) │ │ │ │ │ -249 {} │ │ │ │ │ -250 │ │ │ │ │ -251 │ │ │ │ │ -252 template │ │ │ │ │ -_2_5_3 void _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b) │ │ │ │ │ -254 { │ │ │ │ │ -255 amg.pre(x,b); │ │ │ │ │ -256 scalarproducts.reserve(amg.levels()); │ │ │ │ │ -257 ksolvers.reserve(amg.levels()); │ │ │ │ │ -258 │ │ │ │ │ -259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator │ │ │ │ │ -260 matrix = amg.matrices_->matrices().coarsest(); │ │ │ │ │ -261 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -262 pinfo = amg.matrices_->parallelInformation().coarsest(); │ │ │ │ │ -263 bool hasCoarsest=(amg.levels()==amg.maxlevels()); │ │ │ │ │ -264 │ │ │ │ │ -265 if(hasCoarsest) { │ │ │ │ │ -266 if(matrix==amg.matrices_->matrices().finest()) │ │ │ │ │ -267 return; │ │ │ │ │ -268 --matrix; │ │ │ │ │ -269 --pinfo; │ │ │ │ │ -270 ksolvers.push_back(std::shared_ptr<_K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> >(new _K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> │ │ │ │ │ -(amg, amg.solver_))); │ │ │ │ │ -271 }else │ │ │ │ │ -272 ksolvers.push_back(std::shared_ptr<_K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> >(new _K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> │ │ │ │ │ -(amg, std::shared_ptr<_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_> >()))); │ │ │ │ │ -273 │ │ │ │ │ -274 std::ostringstream s; │ │ │ │ │ -275 │ │ │ │ │ -276 if(matrix!=amg.matrices_->matrices().finest()) │ │ │ │ │ -277 while(true) { │ │ │ │ │ -278 scalarproducts.push_back(createScalarProduct(*pinfo,category())); │ │ │ │ │ -279 std::shared_ptr > ks = │ │ │ │ │ -280 std::shared_ptr >(new _K_r_y_l_o_v_S_o_l_v_e_r(*matrix, * │ │ │ │ │ -(scalarproducts.back()), │ │ │ │ │ -281 *(ksolvers.back()), levelDefectReduction, │ │ │ │ │ -282 maxLevelKrylovSteps, 0)); │ │ │ │ │ -283 ksolvers.push_back(std::shared_ptr<_K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> >(new _K_A_m_g_T_w_o_G_r_i_d_<_A_m_g_> │ │ │ │ │ -(amg, ks))); │ │ │ │ │ -284 --matrix; │ │ │ │ │ -285 --pinfo; │ │ │ │ │ -286 if(matrix==amg.matrices_->matrices().finest()) │ │ │ │ │ -287 break; │ │ │ │ │ -288 } │ │ │ │ │ -289 } │ │ │ │ │ -290 │ │ │ │ │ -291 │ │ │ │ │ -292 template │ │ │ │ │ -_2_9_3 void _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_p_o_s_t(_D_o_m_a_i_n& x) │ │ │ │ │ -294 { │ │ │ │ │ -295 amg.post(x); │ │ │ │ │ -296 │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -299 template │ │ │ │ │ -_3_0_0 void _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -301 { │ │ │ │ │ -302 if(ksolvers.size()==0) │ │ │ │ │ -303 { │ │ │ │ │ -304 _R_a_n_g_e td=d; │ │ │ │ │ -305 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ -306 amg.solver_->apply(v,td,res); │ │ │ │ │ -307 }else │ │ │ │ │ -308 { │ │ │ │ │ -309 typedef typename Amg::LevelContext LevelContext; │ │ │ │ │ -310 std::shared_ptr levelContext(new LevelContext); │ │ │ │ │ -311 amg.initIteratorsWithFineLevel(*levelContext); │ │ │ │ │ -312 typedef typename std::vector > >::iterator │ │ │ │ │ -Iter; │ │ │ │ │ -313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver) │ │ │ │ │ -314 (*solver)->setLevelContext(levelContext); │ │ │ │ │ -315 ksolvers.back()->apply(v,d); │ │ │ │ │ -316 } │ │ │ │ │ -317 } │ │ │ │ │ -318 │ │ │ │ │ -319 template │ │ │ │ │ -_3_2_0 std::size_t _K_A_M_G_<_M_,_X_,_S_,_P_,_K_,_A_>_:_:_m_a_x_l_e_v_e_l_s() │ │ │ │ │ -321 { │ │ │ │ │ -322 return amg.maxlevels(); │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -326 } // Amg │ │ │ │ │ -327} // Dune │ │ │ │ │ -328 │ │ │ │ │ -329#endif │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -_a_m_g_._h_h │ │ │ │ │ -The AMG preconditioner. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_a_p_p_l_y │ │ │ │ │ -void apply(Domain &v, const Range &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ -X Domain │ │ │ │ │ -The domain type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_K_A_M_G │ │ │ │ │ -KAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const │ │ │ │ │ -SmootherArgs &smootherArgs, const Parameters &parms, std::size_t │ │ │ │ │ -maxLevelKrylovSteps=3, double minDefectReduction=1e-1) │ │ │ │ │ -Construct a new amg with a specific coarse solver. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ -std::size_t maxlevels() │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:320 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -SmootherTraits< Smoother >::Arguments SmootherArgs │ │ │ │ │ -The argument type for the construction of the smoother. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ -M Operator │ │ │ │ │ -The matrix operator type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_p_o_s_t │ │ │ │ │ -void post(Domain &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ -X Range │ │ │ │ │ -The range type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h │ │ │ │ │ -void presmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ -Apply pre smoothing on the current level. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h │ │ │ │ │ -void postsmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ -Apply post smoothing on the current level. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:428 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_p_r_e │ │ │ │ │ -void pre(Domain &x, Range &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:253 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -PI ParallelInformation │ │ │ │ │ -The type of the parallel information. Either OwnerOverlapCommunication or │ │ │ │ │ -another type describing the... │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:80 │ │ │ │ │ +3#ifndef DUNE_ISTL_COMMON_COUNTER_HH │ │ │ │ │ +4#define DUNE_ISTL_COMMON_COUNTER_HH │ │ │ │ │ +5 │ │ │ │ │ +6#include │ │ │ │ │ +7#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +_1_5constexpr std::size_t _m_a_x_c_o_u_n_t = 100; │ │ │ │ │ +16 │ │ │ │ │ +_1_7#define DUNE_GET_COUNTER(Tag) \ │ │ │ │ │ +18 (counterFunc(Dune::PriorityTag{}, Tag{}, Dune::CounterImpl::ADLTag │ │ │ │ │ +{})) │ │ │ │ │ +19 │ │ │ │ │ +_2_0#define DUNE_INC_COUNTER(Tag) \ │ │ │ │ │ +21 namespace { \ │ │ │ │ │ +22 namespace CounterImpl { \ │ │ │ │ │ +23 constexpr std::size_t \ │ │ │ │ │ +24 counterFunc(Dune::PriorityTag p, Tag, ADLTag) \ │ │ │ │ │ +25 { \ │ │ │ │ │ +26 return p.value; \ │ │ │ │ │ +27 } \ │ │ │ │ │ +28 } \ │ │ │ │ │ +29 } \ │ │ │ │ │ +30 static_assert(true, "unfudge indentation") │ │ │ │ │ +31 │ │ │ │ │ +32namespace _D_u_n_e { │ │ │ │ │ +33 namespace { │ │ │ │ │ +34 │ │ │ │ │ +_3_5 namespace CounterImpl { │ │ │ │ │ +36 │ │ │ │ │ +37 struct ADLTag {}; │ │ │ │ │ +38 │ │ │ │ │ +39 template │ │ │ │ │ +40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag) │ │ │ │ │ +41 { │ │ │ │ │ +42 return 0; │ │ │ │ │ +43 } │ │ │ │ │ +44 │ │ │ │ │ +45 } // end namespace CounterImpl │ │ │ │ │ +46 } // end empty namespace │ │ │ │ │ +47} // end namespace Dune │ │ │ │ │ +48#endif // DUNE_ISTL_COMMON_COUNTER_HH │ │ │ │ │ +_m_a_x_c_o_u_n_t │ │ │ │ │ +constexpr std::size_t maxcount │ │ │ │ │ +DDeeffiinniittiioonn counter.hh:15 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G │ │ │ │ │ -an algebraic multigrid method using a Krylov-cycle. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ -Amg::Domain Domain │ │ │ │ │ -the type of the domain. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -Amg::SmootherArgs SmootherArgs │ │ │ │ │ -The type of the arguments for construction of the smoothers. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -Amg::ParallelInformation ParallelInformation │ │ │ │ │ -the type of the parallelinformation to use. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_C_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ -Amg::CoarseSolver CoarseSolver │ │ │ │ │ -The type of the coarse solver. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Amg::OperatorHierarchy OperatorHierarchy │ │ │ │ │ -The type of the hierarchy of operators. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ -Amg::Range Range │ │ │ │ │ -The type of the range. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Amg::ScalarProduct ScalarProduct │ │ │ │ │ -The type of the scalar product. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_A_m_g │ │ │ │ │ -AMG< M, X, S, PI, A > Amg │ │ │ │ │ -The type of the underlying AMG. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ -Amg::Operator Operator │ │ │ │ │ -the type of the lineatr operator. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -Amg::ParallelInformationHierarchy ParallelInformationHierarchy │ │ │ │ │ -The type of the hierarchy of parallel information. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:166 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G_:_:_K_r_y_l_o_v_S_o_l_v_e_r │ │ │ │ │ -K KrylovSolver │ │ │ │ │ -The type of the Krylov solver for the cycle. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ -Two grid operator for AMG with Krylov cycle. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_p_r_e │ │ │ │ │ -void pre(typename AMG::Domain &x, typename AMG::Range &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ -KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > > │ │ │ │ │ -coarseSolver) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_~_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ -~KAmgTwoGrid() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_p_o_s_t │ │ │ │ │ -void post(typename AMG::Domain &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_s_e_t_L_e_v_e_l_C_o_n_t_e_x_t │ │ │ │ │ -void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p) │ │ │ │ │ -Set the level context pointer. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_c_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ -InverseOperator< Domain, Range > * coarseSolver() │ │ │ │ │ -Get a pointer to the coarse grid solver. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d_:_:_a_p_p_l_y │ │ │ │ │ -void apply(typename AMG::Domain &v, const typename AMG::Range &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G │ │ │ │ │ -Parallel algebraic multigrid based on agglomeration. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation │ │ │ │ │ -> Iterator │ │ │ │ │ -Type of the mutable iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -The hierarchies build by the coarsening process. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -All parameters for AMG. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Base class for scalar product and norm computation. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ -Generalized preconditioned conjugate gradient solver. │ │ │ │ │ -DDeeffiinniittiioonn solvers.hh:1307 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00140.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: dependency.hh File Reference │ │ │ │ +dune-istl: novlpschwarz.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,69 +65,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ +
novlpschwarz.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ -More...

│ │ │ │ -
#include <bitset>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include "graph.hh"
│ │ │ │ -#include "properties.hh"
│ │ │ │ -#include <dune/common/propertymap.hh>
│ │ │ │ +
#include <iostream>
│ │ │ │ +#include <fstream>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <sstream>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include "io.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include "vbvector.hh"
│ │ │ │ +#include "bcrsmatrix.hh"
│ │ │ │ +#include "gsetc.hh"
│ │ │ │ +#include "ilu.hh"
│ │ │ │ +#include "operators.hh"
│ │ │ │ +#include "solvers.hh"
│ │ │ │ +#include "preconditioners.hh"
│ │ │ │ +#include "scalarproducts.hh"
│ │ │ │ +#include "owneroverlapcopy.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::EdgeProperties
 Class representing the properties of an ede in the matrix graph. More...
 
class  Dune::Amg::VertexProperties
 Class representing a node in the matrix graph. More...
class  Dune::NonoverlappingSchwarzOperator< M, X, Y, C >
 A nonoverlapping operator with communication object. More...
 
class  Dune::Amg::PropertyGraphVertexPropertyMap< G, i >
 
struct  Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >
class  Dune::NonoverlappingBlockPreconditioner< C, P >
 Nonoverlapping parallel preconditioner. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<typename G , typename EP , typename VM , typename EM >
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type Dune::get (const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
 
std::ostream & Dune::Amg::operator<< (std::ostream &os, const EdgeProperties &props)
 
std::ostream & Dune::Amg::operator<< (std::ostream &os, const VertexProperties &props)
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Provides classes for initializing the link attributes of a matrix graph.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,56 +1,41 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_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 │ │ │ │ │ -dependency.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +novlpschwarz.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_i_o_._h_h" │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +#include "_i_l_u_._h_h" │ │ │ │ │ +#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ +#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ +#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ +#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ +#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -  Class representing the properties of an ede in the matrix graph. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_,_ _C_ _> │ │ │ │ │ +  A nonoverlapping operator with communication object. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -  Class representing a node in the matrix graph. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_<_ _G_,_ _i_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_P_r_o_p_e_r_t_y_M_a_p_T_y_p_e_S_e_l_e_c_t_o_r_<_ _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g_,_ _A_m_g_:_: │ │ │ │ │ - _P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_,_ _A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_ _E_P_,_ _V_M_,_ _E_M_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _C_,_ _P_ _> │ │ │ │ │ +  Nonoverlapping parallel preconditioner. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - PropertyMapTypeSelector< _A_m_g_:_: │ │ │ │ │ -_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g, _A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h< _D_u_n_e_:_:_g_e_t (const _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ - G, _A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, EP, VM, EM > &tag, _A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h< G, _A_m_g_:_: │ │ │ │ │ - >::Type  _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s, EP, VM, EM > &graph) │ │ │ │ │ -  │ │ │ │ │ - std::ostream &  _D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream │ │ │ │ │ - &os, const _E_d_g_e_P_r_o_p_e_r_t_i_e_s &props) │ │ │ │ │ -  │ │ │ │ │ - std::ostream &  _D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream │ │ │ │ │ - &os, const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s &props) │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides classes for initializing the link attributes of a matrix graph. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: dependency.hh Source File │ │ │ │ +dune-istl: novlpschwarz.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,490 +70,385 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
dependency.hh
│ │ │ │ +
novlpschwarz.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_DEPENDENCY_HH
│ │ │ │ -
6#define DUNE_AMG_DEPENDENCY_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH
│ │ │ │ +
6#define DUNE_ISTL_NOVLPSCHWARZ_HH
│ │ │ │
7
│ │ │ │ -
8
│ │ │ │ -
9#include <bitset>
│ │ │ │ -
10#include <ostream>
│ │ │ │ -
11
│ │ │ │ -
12#include "graph.hh"
│ │ │ │ -
13#include "properties.hh"
│ │ │ │ -
14#include <dune/common/propertymap.hh>
│ │ │ │ -
15
│ │ │ │ +
8#include <iostream> // for input/output to shell
│ │ │ │ +
9#include <fstream> // for input/output to files
│ │ │ │ +
10#include <vector> // STL vector class
│ │ │ │ +
11#include <sstream>
│ │ │ │ +
12
│ │ │ │ +
13#include <cmath> // Yes, we do some math here
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/timer.hh>
│ │ │ │
16
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
19 namespace Amg
│ │ │ │ -
20 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
39 {
│ │ │ │ -
40 friend std::ostream& operator<<(std::ostream& os, const EdgeProperties& props);
│ │ │ │ -
41 public:
│ │ │ │ - │ │ │ │ -
44
│ │ │ │ -
45 private:
│ │ │ │ -
46
│ │ │ │ -
47 std::bitset<SIZE> flags_;
│ │ │ │ -
48 public:
│ │ │ │ - │ │ │ │ -
51
│ │ │ │ -
53 std::bitset<SIZE>::reference operator[](std::size_t v);
│ │ │ │ -
54
│ │ │ │ -
56 bool operator[](std::size_t v) const;
│ │ │ │ -
57
│ │ │ │ -
63 bool depends() const;
│ │ │ │ -
64
│ │ │ │ -
69 void setDepends();
│ │ │ │ -
70
│ │ │ │ -
74 void resetDepends();
│ │ │ │ -
75
│ │ │ │ -
80 bool influences() const;
│ │ │ │ -
81
│ │ │ │ -
85 void setInfluences();
│ │ │ │ -
86
│ │ │ │ -
90 void resetInfluences();
│ │ │ │ -
91
│ │ │ │ -
96 bool isOneWay() const;
│ │ │ │ -
97
│ │ │ │ -
102 bool isTwoWay() const;
│ │ │ │ -
103
│ │ │ │ -
108 bool isStrong() const;
│ │ │ │ -
109
│ │ │ │ -
113 void reset();
│ │ │ │ -
114
│ │ │ │ -
118 void printFlags() const;
│ │ │ │ -
119 };
│ │ │ │ -
│ │ │ │ -
120
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
127 friend std::ostream& operator<<(std::ostream& os, const VertexProperties& props);
│ │ │ │ -
128 public:
│ │ │ │ - │ │ │ │ -
130 private:
│ │ │ │ +
17#include <dune/common/hybridutilities.hh>
│ │ │ │ +
18
│ │ │ │ +
19#include "io.hh"
│ │ │ │ +
20#include "bvector.hh"
│ │ │ │ +
21#include "vbvector.hh"
│ │ │ │ +
22#include "bcrsmatrix.hh"
│ │ │ │ +
23#include "io.hh"
│ │ │ │ +
24#include "gsetc.hh"
│ │ │ │ +
25#include "ilu.hh"
│ │ │ │ +
26#include "operators.hh"
│ │ │ │ +
27#include "solvers.hh"
│ │ │ │ +
28#include "preconditioners.hh"
│ │ │ │ +
29#include "scalarproducts.hh"
│ │ │ │ +
30#include "owneroverlapcopy.hh"
│ │ │ │ +
31
│ │ │ │ +
32namespace Dune {
│ │ │ │ +
33
│ │ │ │ +
59 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 {
│ │ │ │ +
62 public:
│ │ │ │ +
64 typedef M matrix_type;
│ │ │ │ +
66 typedef X domain_type;
│ │ │ │ +
68 typedef Y range_type;
│ │ │ │ +
70 typedef typename X::field_type field_type;
│ │ │ │ + │ │ │ │ +
73
│ │ │ │ +
74 typedef typename C::PIS PIS;
│ │ │ │ +
75 typedef typename C::RI RI;
│ │ │ │ +
76 typedef typename RI::RemoteIndexList RIL;
│ │ │ │ +
77 typedef typename RI::const_iterator RIIterator;
│ │ │ │ +
78 typedef typename RIL::const_iterator RILIterator;
│ │ │ │ +
79 typedef typename M::ConstColIterator ColIterator;
│ │ │ │ +
80 typedef typename M::ConstRowIterator RowIterator;
│ │ │ │ +
81 typedef std::multimap<int,int> MM;
│ │ │ │ +
82 typedef std::multimap<int,std::pair<int,RILIterator> > RIMap;
│ │ │ │ +
83 typedef typename RIMap::iterator RIMapit;
│ │ │ │ +
84
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true)
│ │ │ │ +
94 {}
│ │ │ │ +
│ │ │ │ +
95
│ │ │ │ +
│ │ │ │ +
96 NonoverlappingSchwarzOperator (std::shared_ptr<const matrix_type> A, const communication_type& com)
│ │ │ │ +
97 : _A_(A), communication(com), buildcomm(true)
│ │ │ │ +
98 {}
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
│ │ │ │ +
101 virtual void apply (const X& x, Y& y) const
│ │ │ │ +
102 {
│ │ │ │ +
103 y = 0;
│ │ │ │ +
104 novlp_op_apply(x,y,1);
│ │ │ │ +
105 communication.addOwnerCopyToOwnerCopy(y,y);
│ │ │ │ +
106 }
│ │ │ │ +
│ │ │ │ +
107
│ │ │ │ +
│ │ │ │ +
109 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
│ │ │ │ +
110 {
│ │ │ │ +
111 // only apply communication to alpha*A*x to make it consistent,
│ │ │ │ +
112 // y already has to be consistent.
│ │ │ │ +
113 Y y1(y);
│ │ │ │ +
114 y = 0;
│ │ │ │ +
115 novlp_op_apply(x,y,alpha);
│ │ │ │ +
116 communication.addOwnerCopyToOwnerCopy(y,y);
│ │ │ │ +
117 y += y1;
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │ +
│ │ │ │ +
121 virtual const matrix_type& getmat () const
│ │ │ │ +
122 {
│ │ │ │ +
123 return *_A_;
│ │ │ │ +
124 }
│ │ │ │ +
│ │ │ │ +
125
│ │ │ │ +
│ │ │ │ +
126 void novlp_op_apply (const X& x, Y& y, field_type alpha) const
│ │ │ │ +
127 {
│ │ │ │ +
128 //get index sets
│ │ │ │ +
129 const PIS& pis=communication.indexSet();
│ │ │ │ +
130 const RI& ri = communication.remoteIndices();
│ │ │ │
131
│ │ │ │ -
133 std::bitset<SIZE> flags_;
│ │ │ │ -
134
│ │ │ │ -
135 public:
│ │ │ │ - │ │ │ │ -
138
│ │ │ │ -
140 std::bitset<SIZE>::reference operator[](std::size_t v);
│ │ │ │ -
141
│ │ │ │ -
143 bool operator[](std::size_t v) const;
│ │ │ │ -
144
│ │ │ │ -
151 void setIsolated();
│ │ │ │ -
152
│ │ │ │ -
156 bool isolated() const;
│ │ │ │ -
157
│ │ │ │ -
161 void resetIsolated();
│ │ │ │ -
162
│ │ │ │ -
166 void setVisited();
│ │ │ │ -
167
│ │ │ │ -
171 bool visited() const;
│ │ │ │ -
172
│ │ │ │ -
176 void resetVisited();
│ │ │ │ -
177
│ │ │ │ -
181 void setFront();
│ │ │ │ -
182
│ │ │ │ -
186 bool front() const;
│ │ │ │ -
187
│ │ │ │ -
191 void resetFront();
│ │ │ │ -
192
│ │ │ │ -
196 void setExcludedBorder();
│ │ │ │ -
197
│ │ │ │ -
202 bool excludedBorder() const;
│ │ │ │ -
203
│ │ │ │ -
207 void resetExcludedBorder();
│ │ │ │ -
208
│ │ │ │ -
212 void reset();
│ │ │ │ -
213
│ │ │ │ -
214 };
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
216 template<typename G, std::size_t i>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
218 : public RAPropertyMapHelper<typename std::bitset<VertexProperties::SIZE>::reference,
│ │ │ │ -
219 PropertyGraphVertexPropertyMap<G,i> >
│ │ │ │ -
220 {
│ │ │ │ -
221 public:
│ │ │ │ -
222
│ │ │ │ -
223 typedef ReadWritePropertyMapTag Category;
│ │ │ │ -
224
│ │ │ │ -
225 enum {
│ │ │ │ -
227 index = i
│ │ │ │ -
228 };
│ │ │ │ -
229
│ │ │ │ -
233 typedef G Graph;
│ │ │ │ -
234
│ │ │ │ -
238 typedef std::bitset<VertexProperties::SIZE> BitSet;
│ │ │ │ +
132 // at the beginning make a multimap "bordercontribution".
│ │ │ │ +
133 // process has i and j as border dofs but is not the owner
│ │ │ │ +
134 // => only contribute to Ax if i,j is in bordercontribution
│ │ │ │ +
135 if (buildcomm == true) {
│ │ │ │ +
136
│ │ │ │ +
137 // set up mask vector
│ │ │ │ +
138 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size())) {
│ │ │ │ +
139 mask.resize(x.size());
│ │ │ │ +
140 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
│ │ │ │ +
141 mask[i] = 1;
│ │ │ │ +
142 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ +
143 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ +
144 mask[i->local().local()] = 0;
│ │ │ │ +
145 else if (i->local().attribute()==OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ +
146 mask[i->local().local()] = 2;
│ │ │ │ +
147 }
│ │ │ │ +
148
│ │ │ │ +
149 for (MM::iterator iter = bordercontribution.begin();
│ │ │ │ +
150 iter != bordercontribution.end(); ++iter)
│ │ │ │ +
151 bordercontribution.erase(iter);
│ │ │ │ +
152 std::map<int,int> owner; //key: local index i, value: process, that owns i
│ │ │ │ +
153 RIMap rimap;
│ │ │ │ +
154
│ │ │ │ +
155 // for each local index make multimap rimap:
│ │ │ │ +
156 // key: local index i, data: pair of process that knows i and pointer to RI entry
│ │ │ │ +
157 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i)
│ │ │ │ +
158 if (mask[i.index()] == 0)
│ │ │ │ +
159 for (RIIterator remote = ri.begin(); remote != ri.end(); ++remote) {
│ │ │ │ +
160 RIL& ril = *(remote->second.first);
│ │ │ │ +
161 for (RILIterator rindex = ril.begin(); rindex != ril.end(); ++rindex)
│ │ │ │ +
162 if (rindex->attribute() != OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ +
163 if (rindex->localIndexPair().local().local() == i.index()) {
│ │ │ │ +
164 rimap.insert
│ │ │ │ +
165 (std::make_pair(i.index(),
│ │ │ │ +
166 std::pair<int,RILIterator>(remote->first, rindex)));
│ │ │ │ +
167 if(rindex->attribute()==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ +
168 owner.insert(std::make_pair(i.index(),remote->first));
│ │ │ │ +
169 }
│ │ │ │ +
170 }
│ │ │ │ +
171
│ │ │ │ +
172 int iowner = 0;
│ │ │ │ +
173 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
│ │ │ │ +
174 if (mask[i.index()] == 0) {
│ │ │ │ +
175 std::map<int,int>::iterator it = owner.find(i.index());
│ │ │ │ +
176 iowner = it->second;
│ │ │ │ +
177 std::pair<RIMapit, RIMapit> foundiit = rimap.equal_range(i.index());
│ │ │ │ +
178 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
│ │ │ │ +
179 if (mask[j.index()] == 0) {
│ │ │ │ +
180 bool flag = true;
│ │ │ │ +
181 for (RIMapit foundi = foundiit.first; foundi != foundiit.second; ++foundi) {
│ │ │ │ +
182 std::pair<RIMapit, RIMapit> foundjit = rimap.equal_range(j.index());
│ │ │ │ +
183 for (RIMapit foundj = foundjit.first; foundj != foundjit.second; ++foundj)
│ │ │ │ +
184 if (foundj->second.first == foundi->second.first)
│ │ │ │ +
185 if (foundj->second.second->attribute() == OwnerOverlapCopyAttributeSet::owner
│ │ │ │ +
186 || foundj->second.first == iowner
│ │ │ │ +
187 || foundj->second.first < communication.communicator().rank()) {
│ │ │ │ +
188 flag = false;
│ │ │ │ +
189 continue;
│ │ │ │ +
190 }
│ │ │ │ +
191 if (flag == false)
│ │ │ │ +
192 continue;
│ │ │ │ +
193 }
│ │ │ │ +
194 // don´t contribute to Ax if
│ │ │ │ +
195 // 1. the owner of j has i as interior/border dof
│ │ │ │ +
196 // 2. iowner has j as interior/border dof
│ │ │ │ +
197 // 3. there is another process with smaller rank that has i and j
│ │ │ │ +
198 // as interor/border dofs
│ │ │ │ +
199 // if the owner of j does not have i as interior/border dof,
│ │ │ │ +
200 // it will not be taken into account
│ │ │ │ +
201 if (flag==true)
│ │ │ │ +
202 bordercontribution.insert(std::pair<int,int>(i.index(),j.index()));
│ │ │ │ +
203 }
│ │ │ │ +
204 }
│ │ │ │ +
205 }
│ │ │ │ +
206 }
│ │ │ │ +
207 buildcomm = false;
│ │ │ │ +
208 }
│ │ │ │ +
209
│ │ │ │ +
210 //compute alpha*A*x nonoverlapping case
│ │ │ │ +
211 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
│ │ │ │ +
212 if (mask[i.index()] == 0) {
│ │ │ │ +
213 //dof doesn't belong to process but is border (not ghost)
│ │ │ │ +
214 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
│ │ │ │ +
215 if (mask[j.index()] == 1) //j is owner => then sum entries
│ │ │ │ +
216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
│ │ │ │ +
217 else if (mask[j.index()] == 0) {
│ │ │ │ +
218 std::pair<MM::iterator, MM::iterator> itp =
│ │ │ │ +
219 bordercontribution.equal_range(i.index());
│ │ │ │ +
220 for (MM::iterator it = itp.first; it != itp.second; ++it)
│ │ │ │ +
221 if ((*it).second == (int)j.index())
│ │ │ │ +
222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
│ │ │ │ +
223 }
│ │ │ │ +
224 }
│ │ │ │ +
225 }
│ │ │ │ +
226 else if (mask[i.index()] == 1) {
│ │ │ │ +
227 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j)
│ │ │ │ +
228 if (mask[j.index()] != 2)
│ │ │ │ +
229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
│ │ │ │ +
230 }
│ │ │ │ +
231 }
│ │ │ │ +
232 }
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
236 {
│ │ │ │ + │ │ │ │ +
238 }
│ │ │ │ +
│ │ │ │
239
│ │ │ │ -
243 typedef typename BitSet::reference Reference;
│ │ │ │ -
244
│ │ │ │ -
248 typedef bool ValueType;
│ │ │ │ -
249
│ │ │ │ -
253 typedef typename G::VertexDescriptor Vertex;
│ │ │ │ -
254
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
260 : graph_(&g)
│ │ │ │ -
261 {}
│ │ │ │ -
│ │ │ │ -
262
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
267 : graph_(0)
│ │ │ │ -
268 {}
│ │ │ │ -
│ │ │ │ -
269
│ │ │ │ -
270
│ │ │ │ -
│ │ │ │ -
275 Reference operator[](const Vertex& vertex) const
│ │ │ │ -
276 {
│ │ │ │ -
277 return graph_->getVertexProperties(vertex)[index];
│ │ │ │ -
278 }
│ │ │ │ -
│ │ │ │ -
279 private:
│ │ │ │ -
280 Graph* graph_;
│ │ │ │ -
281 };
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ -
283 } // end namespace Amg
│ │ │ │ -
284
│ │ │ │ -
285 template<typename G, typename EP, typename VM, typename EM>
│ │ │ │ -
│ │ │ │ -
286 struct PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >
│ │ │ │ -
287 {
│ │ │ │ - │ │ │ │ -
289 };
│ │ │ │ -
│ │ │ │ -
290
│ │ │ │ -
291 template<typename G, typename EP, typename VM, typename EM>
│ │ │ │ -
292 typename PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >::Type
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
294 {
│ │ │ │ - │ │ │ │ -
296 }
│ │ │ │ -
│ │ │ │ -
297
│ │ │ │ -
298 namespace Amg
│ │ │ │ -
299 {
│ │ │ │ -
│ │ │ │ -
300 inline std::ostream& operator<<(std::ostream& os, const EdgeProperties& props)
│ │ │ │ -
301 {
│ │ │ │ -
302 return os << props.flags_;
│ │ │ │ -
303 }
│ │ │ │ -
│ │ │ │ -
304
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
306 : flags_()
│ │ │ │ -
307 {}
│ │ │ │ -
│ │ │ │ -
308
│ │ │ │ -
309 inline std::bitset<EdgeProperties::SIZE>::reference
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
311 {
│ │ │ │ -
312 return flags_[v];
│ │ │ │ -
313 }
│ │ │ │ -
│ │ │ │ -
314
│ │ │ │ -
│ │ │ │ -
315 inline bool EdgeProperties::operator[](std::size_t i) const
│ │ │ │ -
316 {
│ │ │ │ -
317 return flags_[i];
│ │ │ │ -
318 }
│ │ │ │ -
│ │ │ │ -
319
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
321 {
│ │ │ │ -
322 flags_.reset();
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
326 {
│ │ │ │ -
327 // Set the INFLUENCE bit
│ │ │ │ -
328 //flags_ |= (1<<INFLUENCE);
│ │ │ │ -
329 flags_.set(INFLUENCE);
│ │ │ │ -
330 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
242 {
│ │ │ │ +
243 return communication;
│ │ │ │ +
244 }
│ │ │ │ +
│ │ │ │ +
245 private:
│ │ │ │ +
246 std::shared_ptr<const matrix_type> _A_;
│ │ │ │ +
247 const communication_type& communication;
│ │ │ │ +
248 mutable bool buildcomm;
│ │ │ │ +
249 mutable std::vector<double> mask;
│ │ │ │ +
250 mutable std::multimap<int,int> bordercontribution;
│ │ │ │ +
251 };
│ │ │ │ +
│ │ │ │ +
252
│ │ │ │ +
│ │ │ │ +
255 namespace Amg
│ │ │ │ +
256 {
│ │ │ │ +
257 template<class T> struct ConstructionTraits;
│ │ │ │ +
258 }
│ │ │ │ +
│ │ │ │ +
259
│ │ │ │ +
274 template<class C, class P>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
276 : public Preconditioner<typename P::domain_type,typename P::range_type> {
│ │ │ │ +
277 friend struct Amg::ConstructionTraits<NonoverlappingBlockPreconditioner<C,P> >;
│ │ │ │ +
278 using X = typename P::domain_type;
│ │ │ │ +
279 using Y = typename P::range_type;
│ │ │ │ +
280 public:
│ │ │ │ +
282 typedef typename P::domain_type domain_type;
│ │ │ │ +
284 typedef typename P::range_type range_type;
│ │ │ │ + │ │ │ │ +
287
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
303 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
│ │ │ │ +
304 { }
│ │ │ │ +
│ │ │ │ +
305
│ │ │ │ +
│ │ │ │ +
313 NonoverlappingBlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
│ │ │ │ +
314 : _preconditioner(p), _communication(c)
│ │ │ │ +
315 { }
│ │ │ │ +
│ │ │ │ +
316
│ │ │ │ +
│ │ │ │ +
322 virtual void pre (domain_type& x, range_type& b)
│ │ │ │ +
323 {
│ │ │ │ +
324 _preconditioner->pre(x,b);
│ │ │ │ +
325 }
│ │ │ │
│ │ │ │ -
331
│ │ │ │ +
326
│ │ │ │
│ │ │ │ -
332 inline bool EdgeProperties::influences() const
│ │ │ │ -
333 {
│ │ │ │ -
334 // Test the INFLUENCE bit
│ │ │ │ -
335 return flags_.test(INFLUENCE);
│ │ │ │ -
336 }
│ │ │ │ -
│ │ │ │ -
337
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
339 {
│ │ │ │ -
340 // Set the first bit.
│ │ │ │ -
341 //flags_ |= (1<<DEPEND);
│ │ │ │ -
342 flags_.set(DEPEND);
│ │ │ │ -
343 }
│ │ │ │ -
│ │ │ │ -
344
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
346 {
│ │ │ │ -
347 // reset the first bit.
│ │ │ │ -
348 //flags_ &= ~(1<<DEPEND);
│ │ │ │ -
349 flags_.reset(DEPEND);
│ │ │ │ -
350 }
│ │ │ │ -
│ │ │ │ -
351
│ │ │ │ -
│ │ │ │ -
352 inline bool EdgeProperties::depends() const
│ │ │ │ -
353 {
│ │ │ │ -
354 // Return the first bit.
│ │ │ │ -
355 return flags_.test(DEPEND);
│ │ │ │ +
332 virtual void apply (domain_type& v, const range_type& d)
│ │ │ │ +
333 {
│ │ │ │ +
334 // block preconditioner equivalent to WrappedPreconditioner from
│ │ │ │ +
335 // pdelab/backend/ovlpistsolverbackend.hh,
│ │ │ │ +
336 // but not to BlockPreconditioner from schwarz.hh
│ │ │ │ +
337 _preconditioner->apply(v,d);
│ │ │ │ +
338 _communication.addOwnerCopyToOwnerCopy(v,v);
│ │ │ │ +
339 }
│ │ │ │ +
│ │ │ │ +
340
│ │ │ │ +
341 template<bool forward>
│ │ │ │ +
│ │ │ │ +
342 void apply (X& v, const Y& d)
│ │ │ │ +
343 {
│ │ │ │ +
344 _preconditioner->template apply<forward>(v,d);
│ │ │ │ +
345 _communication.addOwnerCopyToOwnerCopy(v,v);
│ │ │ │ +
346 }
│ │ │ │ +
│ │ │ │ +
347
│ │ │ │ +
│ │ │ │ +
353 virtual void post (domain_type& x)
│ │ │ │ +
354 {
│ │ │ │ +
355 _preconditioner->post(x);
│ │ │ │
356 }
│ │ │ │
│ │ │ │
357
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
359 {
│ │ │ │ -
360 // reset the second bit.
│ │ │ │ -
361 flags_ &= ~(1<<INFLUENCE);
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
360 {
│ │ │ │ + │ │ │ │
362 }
│ │ │ │
│ │ │ │
363
│ │ │ │ -
│ │ │ │ -
364 inline bool EdgeProperties::isOneWay() const
│ │ │ │ -
365 {
│ │ │ │ -
366 // Test whether only the first bit is set
│ │ │ │ -
367 //return isStrong() && !isTwoWay();
│ │ │ │ -
368 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==(1<<DEPEND);
│ │ │ │ -
369 }
│ │ │ │ -
│ │ │ │ -
370
│ │ │ │ -
│ │ │ │ -
371 inline bool EdgeProperties::isTwoWay() const
│ │ │ │ -
372 {
│ │ │ │ -
373 // Test whether the first and second bit is set
│ │ │ │ -
374 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==((1<<INFLUENCE)|(1<<DEPEND));
│ │ │ │ -
375 }
│ │ │ │ -
│ │ │ │ -
376
│ │ │ │ -
│ │ │ │ -
377 inline bool EdgeProperties::isStrong() const
│ │ │ │ -
378 {
│ │ │ │ -
379 // Test whether the first or second bit is set
│ │ │ │ -
380 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND))).to_ulong();
│ │ │ │ -
381 }
│ │ │ │ -
│ │ │ │ -
382
│ │ │ │ -
383
│ │ │ │ -
│ │ │ │ -
384 inline std::ostream& operator<<(std::ostream& os, const VertexProperties& props)
│ │ │ │ -
385 {
│ │ │ │ -
386 return os << props.flags_;
│ │ │ │ -
387 }
│ │ │ │ -
│ │ │ │ -
388
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
390 : flags_()
│ │ │ │ -
391 {}
│ │ │ │ -
│ │ │ │ -
392
│ │ │ │ -
393
│ │ │ │ -
394 inline std::bitset<VertexProperties::SIZE>::reference
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
396 {
│ │ │ │ -
397 return flags_[v];
│ │ │ │ -
398 }
│ │ │ │ -
│ │ │ │ -
399
│ │ │ │ -
│ │ │ │ -
400 inline bool VertexProperties::operator[](std::size_t v) const
│ │ │ │ -
401 {
│ │ │ │ -
402 return flags_[v];
│ │ │ │ -
403 }
│ │ │ │ -
│ │ │ │ -
404
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
406 {
│ │ │ │ -
407 flags_.set(ISOLATED);
│ │ │ │ -
408 }
│ │ │ │ -
│ │ │ │ -
409
│ │ │ │ -
│ │ │ │ -
410 inline bool VertexProperties::isolated() const
│ │ │ │ -
411 {
│ │ │ │ -
412 return flags_.test(ISOLATED);
│ │ │ │ -
413 }
│ │ │ │ -
│ │ │ │ -
414
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
416 {
│ │ │ │ -
417 flags_.reset(ISOLATED);
│ │ │ │ -
418 }
│ │ │ │ -
│ │ │ │ -
419
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
421 {
│ │ │ │ -
422 flags_.set(VISITED);
│ │ │ │ -
423 }
│ │ │ │ -
│ │ │ │ -
424
│ │ │ │ -
│ │ │ │ -
425 inline bool VertexProperties::visited() const
│ │ │ │ -
426 {
│ │ │ │ -
427 return flags_.test(VISITED);
│ │ │ │ -
428 }
│ │ │ │ -
│ │ │ │ -
429
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
431 {
│ │ │ │ -
432 flags_.reset(VISITED);
│ │ │ │ -
433 }
│ │ │ │ -
│ │ │ │ -
434
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
436 {
│ │ │ │ -
437 flags_.set(FRONT);
│ │ │ │ -
438 }
│ │ │ │ -
│ │ │ │ -
439
│ │ │ │ -
│ │ │ │ -
440 inline bool VertexProperties::front() const
│ │ │ │ -
441 {
│ │ │ │ -
442 return flags_.test(FRONT);
│ │ │ │ -
443 }
│ │ │ │ -
│ │ │ │ -
444
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
446 {
│ │ │ │ -
447 flags_.reset(FRONT);
│ │ │ │ -
448 }
│ │ │ │ -
│ │ │ │ -
449
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
451 {
│ │ │ │ -
452 flags_.set(BORDER);
│ │ │ │ -
453 }
│ │ │ │ -
│ │ │ │ -
454
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
456 {
│ │ │ │ -
457 return flags_.test(BORDER);
│ │ │ │ -
458 }
│ │ │ │ -
│ │ │ │ -
459
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
461 {
│ │ │ │ -
462 flags_.reset(BORDER);
│ │ │ │ -
463 }
│ │ │ │ -
│ │ │ │ -
464
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
466 {
│ │ │ │ -
467 flags_.reset();
│ │ │ │ -
468 }
│ │ │ │ -
│ │ │ │ -
469
│ │ │ │ -
471 }
│ │ │ │ -
472}
│ │ │ │ -
473#endif
│ │ │ │ -
Provides classes for building the matrix graph.
│ │ │ │ -
Provides classes for handling internal properties in a graph.
│ │ │ │ -
bool depends() const
Checks wether the vertex the edge points to depends on the vertex the edge starts.
Definition dependency.hh:352
│ │ │ │ -
void resetFront()
Resets the front node flag.
Definition dependency.hh:445
│ │ │ │ -
std::bitset< VertexProperties::SIZE > BitSet
The type of the bitset.
Definition dependency.hh:238
│ │ │ │ -
bool isolated() const
Checks wether the node is isolated.
Definition dependency.hh:410
│ │ │ │ -
bool ValueType
The value type.
Definition dependency.hh:248
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &os, const VertexProperties &props)
Definition dependency.hh:384
│ │ │ │ -
BitSet::reference Reference
The reference type.
Definition dependency.hh:243
│ │ │ │ -
bool isTwoWay() const
Checks wether the edge is two way. I.e. both the influence flag and the depends flag are that.
Definition dependency.hh:371
│ │ │ │ -
void setInfluences()
Marks the edge as one of which the start vertex by the end vertex.
Definition dependency.hh:325
│ │ │ │ -
VertexProperties()
Constructor.
Definition dependency.hh:389
│ │ │ │ -
void setDepends()
Marks the edge as one of which the end point depends on the starting point.
Definition dependency.hh:338
│ │ │ │ -
PropertyGraphVertexPropertyMap()
Default constructor.
Definition dependency.hh:266
│ │ │ │ -
PropertyGraphVertexPropertyMap(G &g)
Constructor.
Definition dependency.hh:259
│ │ │ │ -
G::VertexDescriptor Vertex
The vertex descriptor.
Definition dependency.hh:253
│ │ │ │ -
void resetExcludedBorder()
Marks the vertex as included in the aggregation.
Definition dependency.hh:460
│ │ │ │ -
void setFront()
Marks the node as belonging to the current clusters front.
Definition dependency.hh:435
│ │ │ │ -
void reset()
Reset all flags.
Definition dependency.hh:465
│ │ │ │ -
void setVisited()
Mark the node as already visited.
Definition dependency.hh:420
│ │ │ │ -
EdgeProperties()
Constructor.
Definition dependency.hh:305
│ │ │ │ -
void resetInfluences()
Resets the influence flag.
Definition dependency.hh:358
│ │ │ │ -
G Graph
The type of the graph with internal properties.
Definition dependency.hh:233
│ │ │ │ -
std::bitset< SIZE >::reference operator[](std::size_t v)
Access the bits directly.
Definition dependency.hh:395
│ │ │ │ -
void printFlags() const
Prints the attributes of the edge for debugging.
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props)
Definition dependency.hh:300
│ │ │ │ -
Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type
Definition dependency.hh:288
│ │ │ │ -
bool influences() const
Checks wether the start vertex is influenced by the end vertex.
Definition dependency.hh:332
│ │ │ │ -
void setIsolated()
Marks that node as being isolated.
Definition dependency.hh:405
│ │ │ │ -
bool excludedBorder() const
Tests whether the vertex is excluded from the aggregation.
Definition dependency.hh:455
│ │ │ │ -
void resetVisited()
Resets the visited flag.
Definition dependency.hh:430
│ │ │ │ -
bool visited() const
Checks wether the node is marked as visited.
Definition dependency.hh:425
│ │ │ │ -
Reference operator[](const Vertex &vertex) const
Get the properties associated to a vertex.
Definition dependency.hh:275
│ │ │ │ -
void reset()
Reset all flags.
Definition dependency.hh:320
│ │ │ │ -
void resetDepends()
Resets the depends flag.
Definition dependency.hh:345
│ │ │ │ -
ReadWritePropertyMapTag Category
Definition dependency.hh:223
│ │ │ │ -
void resetIsolated()
Resets the isolated flag.
Definition dependency.hh:415
│ │ │ │ -
std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
Definition aggregates.hh:113
│ │ │ │ -
bool isStrong() const
Checks wether the edge is strong. I.e. the influence or depends flag is set.
Definition dependency.hh:377
│ │ │ │ -
bool front() const
Checks wether the node is marked as a front node.
Definition dependency.hh:440
│ │ │ │ -
std::bitset< SIZE >::reference operator[](std::size_t v)
Access the bits directly.
Definition dependency.hh:310
│ │ │ │ -
void setExcludedBorder()
Marks the vertex as excluded from the aggregation.
Definition dependency.hh:450
│ │ │ │ -
bool isOneWay() const
Checks wether the edge is one way. I.e. either the influence or the depends flag but is set.
Definition dependency.hh:364
│ │ │ │ -
@ index
the index to access in the bitset.
Definition dependency.hh:227
│ │ │ │ -
@ VISITED
Definition dependency.hh:129
│ │ │ │ -
@ ISOLATED
Definition dependency.hh:129
│ │ │ │ -
@ SIZE
Definition dependency.hh:129
│ │ │ │ -
@ BORDER
Definition dependency.hh:129
│ │ │ │ -
@ FRONT
Definition dependency.hh:129
│ │ │ │ -
@ DEPEND
Definition dependency.hh:43
│ │ │ │ -
@ SIZE
Definition dependency.hh:43
│ │ │ │ -
@ INFLUENCE
Definition dependency.hh:43
│ │ │ │ +
364 private:
│ │ │ │ +
366 std::shared_ptr<P> _preconditioner;
│ │ │ │ +
367
│ │ │ │ +
369 const communication_type& _communication;
│ │ │ │ +
370 };
│ │ │ │ +
│ │ │ │ +
371
│ │ │ │ +
374} // end namespace
│ │ │ │ +
375
│ │ │ │ +
376#endif
│ │ │ │ +
Define base class for scalar product and norm.
│ │ │ │ +
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ +
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ +
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
Define general preconditioner interface.
│ │ │ │ +
The incomplete LU factorization kernels.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
Class representing the properties of an ede in the matrix graph.
Definition dependency.hh:39
│ │ │ │ -
Class representing a node in the matrix graph.
Definition dependency.hh:126
│ │ │ │ -
Definition dependency.hh:220
│ │ │ │ -
Attaches properties to the edges and vertices of a graph.
Definition graph.hh:978
│ │ │ │ -
Tag idnetifying the visited property of a vertex.
Definition properties.hh:29
│ │ │ │ +
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │ +
C::PIS PIS
Definition novlpschwarz.hh:74
│ │ │ │ +
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:72
│ │ │ │ +
std::multimap< int, std::pair< int, RILIterator > > RIMap
Definition novlpschwarz.hh:82
│ │ │ │ +
C::RI RI
Definition novlpschwarz.hh:75
│ │ │ │ +
void novlp_op_apply(const X &x, Y &y, field_type alpha) const
Definition novlpschwarz.hh:126
│ │ │ │ +
NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const communication_type &com)
Definition novlpschwarz.hh:96
│ │ │ │ +
M::ConstColIterator ColIterator
Definition novlpschwarz.hh:79
│ │ │ │ +
virtual void apply(const X &x, Y &y) const
apply operator to x:
Definition novlpschwarz.hh:101
│ │ │ │ +
X domain_type
The type of the domain.
Definition novlpschwarz.hh:66
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the linear operator (see SolverCategory::Category)
Definition novlpschwarz.hh:235
│ │ │ │ +
RIMap::iterator RIMapit
Definition novlpschwarz.hh:83
│ │ │ │ +
virtual const matrix_type & getmat() const
get matrix via *
Definition novlpschwarz.hh:121
│ │ │ │ +
RIL::const_iterator RILIterator
Definition novlpschwarz.hh:78
│ │ │ │ +
std::multimap< int, int > MM
Definition novlpschwarz.hh:81
│ │ │ │ +
Y range_type
The type of the range.
Definition novlpschwarz.hh:68
│ │ │ │ +
M matrix_type
The type of the matrix we operate on.
Definition novlpschwarz.hh:64
│ │ │ │ +
M::ConstRowIterator RowIterator
Definition novlpschwarz.hh:80
│ │ │ │ +
const communication_type & getCommunication() const
Get the object responsible for communication.
Definition novlpschwarz.hh:241
│ │ │ │ +
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
apply operator to x, scale and add:
Definition novlpschwarz.hh:109
│ │ │ │ +
RI::RemoteIndexList RIL
Definition novlpschwarz.hh:76
│ │ │ │ +
X::field_type field_type
The field type of the range.
Definition novlpschwarz.hh:70
│ │ │ │ +
NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
constructor: just store a reference to a matrix.
Definition novlpschwarz.hh:92
│ │ │ │ +
RI::const_iterator RIIterator
Definition novlpschwarz.hh:77
│ │ │ │ +
Nonoverlapping parallel preconditioner.
Definition novlpschwarz.hh:276
│ │ │ │ +
NonoverlappingBlockPreconditioner(P &p, const communication_type &c)
Constructor.
Definition novlpschwarz.hh:302
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition novlpschwarz.hh:359
│ │ │ │ +
virtual void apply(domain_type &v, const range_type &d)
Apply the preconditioner.
Definition novlpschwarz.hh:332
│ │ │ │ +
P::range_type range_type
The range type of the preconditioner.
Definition novlpschwarz.hh:284
│ │ │ │ +
NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
Constructor.
Definition novlpschwarz.hh:313
│ │ │ │ +
virtual void post(domain_type &x)
Clean up.
Definition novlpschwarz.hh:353
│ │ │ │ +
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:286
│ │ │ │ +
virtual void pre(domain_type &x, range_type &b)
Prepare the preconditioner.
Definition novlpschwarz.hh:322
│ │ │ │ +
void apply(X &v, const Y &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition novlpschwarz.hh:342
│ │ │ │ +
P::domain_type domain_type
The domain type of the preconditioner.
Definition novlpschwarz.hh:282
│ │ │ │ +
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ +
@ owner
Definition owneroverlapcopy.hh:61
│ │ │ │ +
@ copy
Definition owneroverlapcopy.hh:61
│ │ │ │ +
@ overlap
Definition owneroverlapcopy.hh:61
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,575 +1,474 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -dependency.hh │ │ │ │ │ +novlpschwarz.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_DEPENDENCY_HH │ │ │ │ │ -6#define DUNE_AMG_DEPENDENCY_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH │ │ │ │ │ +6#define DUNE_ISTL_NOVLPSCHWARZ_HH │ │ │ │ │ 7 │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include "_g_r_a_p_h_._h_h" │ │ │ │ │ -13#include "_p_r_o_p_e_r_t_i_e_s_._h_h" │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ +8#include // for input/output to shell │ │ │ │ │ +9#include // for input/output to files │ │ │ │ │ +10#include // STL vector class │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include // Yes, we do some math here │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ -17namespace _D_u_n_e │ │ │ │ │ -18{ │ │ │ │ │ -19 namespace Amg │ │ │ │ │ -20 { │ │ │ │ │ -_3_8 class _E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -39 { │ │ │ │ │ -40 friend std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ -props); │ │ │ │ │ -41 public: │ │ │ │ │ -_4_3 enum {_I_N_F_L_U_E_N_C_E, _D_E_P_E_N_D, _S_I_Z_E}; │ │ │ │ │ -44 │ │ │ │ │ -45 private: │ │ │ │ │ -46 │ │ │ │ │ -47 std::bitset flags_; │ │ │ │ │ -48 public: │ │ │ │ │ -50 _E_d_g_e_P_r_o_p_e_r_t_i_e_s(); │ │ │ │ │ -51 │ │ │ │ │ -53 std::bitset::reference _o_p_e_r_a_t_o_r_[_](std::size_t v); │ │ │ │ │ -54 │ │ │ │ │ -56 bool _o_p_e_r_a_t_o_r_[_](std::size_t v) const; │ │ │ │ │ -57 │ │ │ │ │ -63 bool _d_e_p_e_n_d_s() const; │ │ │ │ │ -64 │ │ │ │ │ -69 void _s_e_t_D_e_p_e_n_d_s(); │ │ │ │ │ -70 │ │ │ │ │ -74 void _r_e_s_e_t_D_e_p_e_n_d_s(); │ │ │ │ │ -75 │ │ │ │ │ -80 bool _i_n_f_l_u_e_n_c_e_s() const; │ │ │ │ │ -81 │ │ │ │ │ -85 void _s_e_t_I_n_f_l_u_e_n_c_e_s(); │ │ │ │ │ -86 │ │ │ │ │ -90 void _r_e_s_e_t_I_n_f_l_u_e_n_c_e_s(); │ │ │ │ │ -91 │ │ │ │ │ -96 bool _i_s_O_n_e_W_a_y() const; │ │ │ │ │ -97 │ │ │ │ │ -102 bool _i_s_T_w_o_W_a_y() const; │ │ │ │ │ -103 │ │ │ │ │ -108 bool _i_s_S_t_r_o_n_g() const; │ │ │ │ │ -109 │ │ │ │ │ -113 void _r_e_s_e_t(); │ │ │ │ │ -114 │ │ │ │ │ -_1_1_8 void _p_r_i_n_t_F_l_a_g_s() const; │ │ │ │ │ -119 }; │ │ │ │ │ -120 │ │ │ │ │ -_1_2_6 class _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s { │ │ │ │ │ -127 friend std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ -props); │ │ │ │ │ -128 public: │ │ │ │ │ -_1_2_9 enum { _I_S_O_L_A_T_E_D, _V_I_S_I_T_E_D, _F_R_O_N_T, _B_O_R_D_E_R, _S_I_Z_E }; │ │ │ │ │ -130 private: │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include "_i_o_._h_h" │ │ │ │ │ +20#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +21#include "_v_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +22#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +23#include "_i_o_._h_h" │ │ │ │ │ +24#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +25#include "_i_l_u_._h_h" │ │ │ │ │ +26#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ +27#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ +28#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ +29#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ +30#include "_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h" │ │ │ │ │ +31 │ │ │ │ │ +32namespace _D_u_n_e { │ │ │ │ │ +33 │ │ │ │ │ +59 template │ │ │ │ │ +_6_0 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r : public _A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +61 { │ │ │ │ │ +62 public: │ │ │ │ │ +_6_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_6_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_6_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_7_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_7_2 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ +73 │ │ │ │ │ +_7_4 typedef typename C::PIS _P_I_S; │ │ │ │ │ +_7_5 typedef typename C::RI _R_I; │ │ │ │ │ +_7_6 typedef typename RI::RemoteIndexList _R_I_L; │ │ │ │ │ +_7_7 typedef typename RI::const_iterator _R_I_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_8 typedef typename RIL::const_iterator _R_I_L_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_9 typedef typename M::ConstColIterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +_8_0 typedef typename M::ConstRowIterator _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +_8_1 typedef std::multimap _M_M; │ │ │ │ │ +_8_2 typedef std::multimap > _R_I_M_a_p; │ │ │ │ │ +_8_3 typedef typename RIMap::iterator _R_I_M_a_p_i_t; │ │ │ │ │ +84 │ │ │ │ │ +_9_2 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (const _m_a_t_r_i_x___t_y_p_e& A, const │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com) │ │ │ │ │ +93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true) │ │ │ │ │ +94 {} │ │ │ │ │ +95 │ │ │ │ │ +_9_6 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r (std::shared_ptr A, const │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& com) │ │ │ │ │ +97 : _A_(A), communication(com), buildcomm(true) │ │ │ │ │ +98 {} │ │ │ │ │ +99 │ │ │ │ │ +_1_0_1 virtual void _a_p_p_l_y (const X& x, Y& y) const │ │ │ │ │ +102 { │ │ │ │ │ +103 y = 0; │ │ │ │ │ +104 _n_o_v_l_p___o_p___a_p_p_l_y(x,y,1); │ │ │ │ │ +105 communication.addOwnerCopyToOwnerCopy(y,y); │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +_1_0_9 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (_f_i_e_l_d___t_y_p_e alpha, const X& x, Y& y) const │ │ │ │ │ +110 { │ │ │ │ │ +111 // only apply communication to alpha*A*x to make it consistent, │ │ │ │ │ +112 // y already has to be consistent. │ │ │ │ │ +113 Y y1(y); │ │ │ │ │ +114 y = 0; │ │ │ │ │ +115 _n_o_v_l_p___o_p___a_p_p_l_y(x,y,alpha); │ │ │ │ │ +116 communication.addOwnerCopyToOwnerCopy(y,y); │ │ │ │ │ +117 y += y1; │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +_1_2_1 virtual const _m_a_t_r_i_x___t_y_p_e& _g_e_t_m_a_t () const │ │ │ │ │ +122 { │ │ │ │ │ +123 return *_A_; │ │ │ │ │ +124 } │ │ │ │ │ +125 │ │ │ │ │ +_1_2_6 void _n_o_v_l_p___o_p___a_p_p_l_y (const X& x, Y& y, _f_i_e_l_d___t_y_p_e alpha) const │ │ │ │ │ +127 { │ │ │ │ │ +128 //get index sets │ │ │ │ │ +129 const _P_I_S& pis=communication.indexSet(); │ │ │ │ │ +130 const _R_I& ri = communication.remoteIndices(); │ │ │ │ │ 131 │ │ │ │ │ -133 std::bitset flags_; │ │ │ │ │ -134 │ │ │ │ │ -135 public: │ │ │ │ │ -137 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s(); │ │ │ │ │ -138 │ │ │ │ │ -140 std::bitset::reference _o_p_e_r_a_t_o_r_[_](std::size_t v); │ │ │ │ │ -141 │ │ │ │ │ -143 bool _o_p_e_r_a_t_o_r_[_](std::size_t v) const; │ │ │ │ │ -144 │ │ │ │ │ -151 void _s_e_t_I_s_o_l_a_t_e_d(); │ │ │ │ │ -152 │ │ │ │ │ -156 bool _i_s_o_l_a_t_e_d() const; │ │ │ │ │ -157 │ │ │ │ │ -161 void _r_e_s_e_t_I_s_o_l_a_t_e_d(); │ │ │ │ │ -162 │ │ │ │ │ -166 void _s_e_t_V_i_s_i_t_e_d(); │ │ │ │ │ -167 │ │ │ │ │ -171 bool _v_i_s_i_t_e_d() const; │ │ │ │ │ -172 │ │ │ │ │ -176 void _r_e_s_e_t_V_i_s_i_t_e_d(); │ │ │ │ │ -177 │ │ │ │ │ -181 void _s_e_t_F_r_o_n_t(); │ │ │ │ │ -182 │ │ │ │ │ -186 bool _f_r_o_n_t() const; │ │ │ │ │ -187 │ │ │ │ │ -191 void _r_e_s_e_t_F_r_o_n_t(); │ │ │ │ │ -192 │ │ │ │ │ -196 void _s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r(); │ │ │ │ │ -197 │ │ │ │ │ -202 bool _e_x_c_l_u_d_e_d_B_o_r_d_e_r() const; │ │ │ │ │ -203 │ │ │ │ │ -207 void _r_e_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r(); │ │ │ │ │ -208 │ │ │ │ │ -212 void _r_e_s_e_t(); │ │ │ │ │ -213 │ │ │ │ │ -214 }; │ │ │ │ │ -215 │ │ │ │ │ -216 template │ │ │ │ │ -_2_1_7 class _P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -218 : public RAPropertyMapHelper:: │ │ │ │ │ -reference, │ │ │ │ │ -219 PropertyGraphVertexPropertyMap > │ │ │ │ │ -220 { │ │ │ │ │ -221 public: │ │ │ │ │ -222 │ │ │ │ │ -_2_2_3 typedef ReadWritePropertyMapTag _C_a_t_e_g_o_r_y; │ │ │ │ │ -224 │ │ │ │ │ -225 enum { │ │ │ │ │ -227 _i_n_d_e_x = i │ │ │ │ │ -_2_2_8 }; │ │ │ │ │ -229 │ │ │ │ │ -_2_3_3 typedef G _G_r_a_p_h; │ │ │ │ │ -234 │ │ │ │ │ -_2_3_8 typedef std::bitset _B_i_t_S_e_t; │ │ │ │ │ +132 // at the beginning make a multimap "bordercontribution". │ │ │ │ │ +133 // process has i and j as border dofs but is not the owner │ │ │ │ │ +134 // => only contribute to Ax if i,j is in bordercontribution │ │ │ │ │ +135 if (buildcomm == true) { │ │ │ │ │ +136 │ │ │ │ │ +137 // set up mask vector │ │ │ │ │ +138 if (mask.size()!=static_cast::size_type> │ │ │ │ │ +(x.size())) { │ │ │ │ │ +139 mask.resize(x.size()); │ │ │ │ │ +140 for (typename std::vector::size_type i=0; ilocal().attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ +144 mask[i->local().local()] = 0; │ │ │ │ │ +145 else if (i->local().attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ +146 mask[i->local().local()] = 2; │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +149 for (MM::iterator iter = bordercontribution.begin(); │ │ │ │ │ +150 iter != bordercontribution.end(); ++iter) │ │ │ │ │ +151 bordercontribution.erase(iter); │ │ │ │ │ +152 std::map owner; //key: local index i, value: process, that owns i │ │ │ │ │ +153 _R_I_M_a_p rimap; │ │ │ │ │ +154 │ │ │ │ │ +155 // for each local index make multimap rimap: │ │ │ │ │ +156 // key: local index i, data: pair of process that knows i and pointer to RI │ │ │ │ │ +entry │ │ │ │ │ +157 for (_R_o_w_I_t_e_r_a_t_o_r i = _A_->begin(); i != _A_->end(); ++i) │ │ │ │ │ +158 if (mask[i.index()] == 0) │ │ │ │ │ +159 for (_R_I_I_t_e_r_a_t_o_r remote = ri.begin(); remote != ri.end(); ++remote) { │ │ │ │ │ +160 _R_I_L& ril = *(remote->second.first); │ │ │ │ │ +161 for (_R_I_L_I_t_e_r_a_t_o_r rindex = ril.begin(); rindex != ril.end(); ++rindex) │ │ │ │ │ +162 if (rindex->attribute() != _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ +163 if (rindex->localIndexPair().local().local() == i.index()) { │ │ │ │ │ +164 rimap.insert │ │ │ │ │ +165 (std::make_pair(i.index(), │ │ │ │ │ +166 std::pair(remote->first, rindex))); │ │ │ │ │ +167 if(rindex->attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ +168 owner.insert(std::make_pair(i.index(),remote->first)); │ │ │ │ │ +169 } │ │ │ │ │ +170 } │ │ │ │ │ +171 │ │ │ │ │ +172 int iowner = 0; │ │ │ │ │ +173 for (_R_o_w_I_t_e_r_a_t_o_r i = _A_->begin(); i != _A_->end(); ++i) { │ │ │ │ │ +174 if (mask[i.index()] == 0) { │ │ │ │ │ +175 std::map::iterator it = owner.find(i.index()); │ │ │ │ │ +176 iowner = it->second; │ │ │ │ │ +177 std::pair foundiit = rimap.equal_range(i.index()); │ │ │ │ │ +178 for (_C_o_l_I_t_e_r_a_t_o_r j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end │ │ │ │ │ +(); ++j) { │ │ │ │ │ +179 if (mask[j.index()] == 0) { │ │ │ │ │ +180 bool flag = true; │ │ │ │ │ +181 for (_R_I_M_a_p_i_t foundi = foundiit.first; foundi != foundiit.second; ++foundi) │ │ │ │ │ +{ │ │ │ │ │ +182 std::pair foundjit = rimap.equal_range(j.index()); │ │ │ │ │ +183 for (_R_I_M_a_p_i_t foundj = foundjit.first; foundj != foundjit.second; ++foundj) │ │ │ │ │ +184 if (foundj->second.first == foundi->second.first) │ │ │ │ │ +185 if (foundj->second.second->attribute() == _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ +_o_w_n_e_r │ │ │ │ │ +186 || foundj->second.first == iowner │ │ │ │ │ +187 || foundj->second.first < communication.communicator().rank()) { │ │ │ │ │ +188 flag = false; │ │ │ │ │ +189 continue; │ │ │ │ │ +190 } │ │ │ │ │ +191 if (flag == false) │ │ │ │ │ +192 continue; │ │ │ │ │ +193 } │ │ │ │ │ +194 // don´t contribute to Ax if │ │ │ │ │ +195 // 1. the owner of j has i as interior/border dof │ │ │ │ │ +196 // 2. iowner has j as interior/border dof │ │ │ │ │ +197 // 3. there is another process with smaller rank that has i and j │ │ │ │ │ +198 // as interor/border dofs │ │ │ │ │ +199 // if the owner of j does not have i as interior/border dof, │ │ │ │ │ +200 // it will not be taken into account │ │ │ │ │ +201 if (flag==true) │ │ │ │ │ +202 bordercontribution.insert(std::pair(i.index(),j.index())); │ │ │ │ │ +203 } │ │ │ │ │ +204 } │ │ │ │ │ +205 } │ │ │ │ │ +206 } │ │ │ │ │ +207 buildcomm = false; │ │ │ │ │ +208 } │ │ │ │ │ +209 │ │ │ │ │ +210 //compute alpha*A*x nonoverlapping case │ │ │ │ │ +211 for (_R_o_w_I_t_e_r_a_t_o_r i = _A_->begin(); i != _A_->end(); ++i) { │ │ │ │ │ +212 if (mask[i.index()] == 0) { │ │ │ │ │ +213 //dof doesn't belong to process but is border (not ghost) │ │ │ │ │ +214 for (_C_o_l_I_t_e_r_a_t_o_r j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end │ │ │ │ │ +(); ++j) { │ │ │ │ │ +215 if (mask[j.index()] == 1) //j is owner => then sum entries │ │ │ │ │ +216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]); │ │ │ │ │ +217 else if (mask[j.index()] == 0) { │ │ │ │ │ +218 std::pair itp = │ │ │ │ │ +219 bordercontribution.equal_range(i.index()); │ │ │ │ │ +220 for (MM::iterator it = itp.first; it != itp.second; ++it) │ │ │ │ │ +221 if ((*it).second == (int)j.index()) │ │ │ │ │ +222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]); │ │ │ │ │ +223 } │ │ │ │ │ +224 } │ │ │ │ │ +225 } │ │ │ │ │ +226 else if (mask[i.index()] == 1) { │ │ │ │ │ +227 for (_C_o_l_I_t_e_r_a_t_o_r j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end │ │ │ │ │ +(); ++j) │ │ │ │ │ +228 if (mask[j.index()] != 2) │ │ │ │ │ +229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]); │ │ │ │ │ +230 } │ │ │ │ │ +231 } │ │ │ │ │ +232 } │ │ │ │ │ +233 │ │ │ │ │ +_2_3_5 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +236 { │ │ │ │ │ +237 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ +238 } │ │ │ │ │ 239 │ │ │ │ │ -_2_4_3 typedef typename BitSet::reference _R_e_f_e_r_e_n_c_e; │ │ │ │ │ -244 │ │ │ │ │ -_2_4_8 typedef bool _V_a_l_u_e_T_y_p_e; │ │ │ │ │ -249 │ │ │ │ │ -_2_5_3 typedef typename G::VertexDescriptor _V_e_r_t_e_x; │ │ │ │ │ -254 │ │ │ │ │ -_2_5_9 _P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p(G& g) │ │ │ │ │ -260 : graph_(&g) │ │ │ │ │ -261 {} │ │ │ │ │ -262 │ │ │ │ │ -_2_6_6 _P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p() │ │ │ │ │ -267 : graph_(0) │ │ │ │ │ -268 {} │ │ │ │ │ -269 │ │ │ │ │ -270 │ │ │ │ │ -_2_7_5 _R_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_](const _V_e_r_t_e_x& vertex) const │ │ │ │ │ -276 { │ │ │ │ │ -277 return graph_->getVertexProperties(vertex)[_i_n_d_e_x]; │ │ │ │ │ -278 } │ │ │ │ │ -279 private: │ │ │ │ │ -280 _G_r_a_p_h* graph_; │ │ │ │ │ -281 }; │ │ │ │ │ -282 │ │ │ │ │ -283 } // end namespace Amg │ │ │ │ │ -284 │ │ │ │ │ -285 template │ │ │ │ │ -_2_8_6 struct PropertyMapTypeSelector > │ │ │ │ │ -287 { │ │ │ │ │ -_2_8_8 typedef _A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_<_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_G_,_A_m_g_:_: │ │ │ │ │ -_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_E_P_,_V_M_,_E_M_>, Amg::VertexProperties::VISITED> _T_y_p_e; │ │ │ │ │ -289 }; │ │ │ │ │ -290 │ │ │ │ │ -291 template │ │ │ │ │ -292 typename PropertyMapTypeSelector >::Type │ │ │ │ │ -_2_9_3 _g_e_t([[maybe_unused]] const _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g& tag, _A_m_g_:_: │ │ │ │ │ -_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_G_,_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_E_P_,_V_M_,_E_M_>& graph) │ │ │ │ │ -294 { │ │ │ │ │ -295 return _A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_<_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_G_,_A_m_g_:_: │ │ │ │ │ -_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_E_P_,_V_M_,_E_M_>, _A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_V_I_S_I_T_E_D>(graph); │ │ │ │ │ -296 } │ │ │ │ │ -297 │ │ │ │ │ -298 namespace Amg │ │ │ │ │ -299 { │ │ │ │ │ -_3_0_0 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _E_d_g_e_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ -props) │ │ │ │ │ -301 { │ │ │ │ │ -302 return os << props.flags_; │ │ │ │ │ -303 } │ │ │ │ │ -304 │ │ │ │ │ -_3_0_5 inline _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s() │ │ │ │ │ -306 : flags_() │ │ │ │ │ -307 {} │ │ │ │ │ -308 │ │ │ │ │ -309 inline std::bitset::reference │ │ │ │ │ -_3_1_0 _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t v) │ │ │ │ │ -311 { │ │ │ │ │ -312 return flags_[v]; │ │ │ │ │ -313 } │ │ │ │ │ -314 │ │ │ │ │ -_3_1_5 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t i) const │ │ │ │ │ -316 { │ │ │ │ │ -317 return flags_[i]; │ │ │ │ │ -318 } │ │ │ │ │ -319 │ │ │ │ │ -_3_2_0 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t() │ │ │ │ │ -321 { │ │ │ │ │ -322 flags_.reset(); │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -_3_2_5 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_I_n_f_l_u_e_n_c_e_s() │ │ │ │ │ -326 { │ │ │ │ │ -327 // Set the INFLUENCE bit │ │ │ │ │ -328 //flags_ |= (1< _A_; │ │ │ │ │ +247 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& communication; │ │ │ │ │ +248 mutable bool buildcomm; │ │ │ │ │ +249 mutable std::vector mask; │ │ │ │ │ +_2_5_0 mutable std::multimap bordercontribution; │ │ │ │ │ +251 }; │ │ │ │ │ +252 │ │ │ │ │ +_2_5_5 namespace Amg │ │ │ │ │ +256 { │ │ │ │ │ +257 template struct ConstructionTraits; │ │ │ │ │ +258 } │ │ │ │ │ +259 │ │ │ │ │ +274 template │ │ │ │ │ +_2_7_5 class _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +276 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +277 friend struct Amg:: │ │ │ │ │ +ConstructionTraits<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r >; │ │ │ │ │ +278 using X = typename P::domain_type; │ │ │ │ │ +279 using Y = typename P::range_type; │ │ │ │ │ +280 public: │ │ │ │ │ +_2_8_2 typedef typename P::domain_type _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_2_8_4 typedef typename P::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_2_8_6 typedef C _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e; │ │ │ │ │ +287 │ │ │ │ │ +_3_0_2 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (P& p, const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ +303 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c) │ │ │ │ │ +304 { } │ │ │ │ │ +305 │ │ │ │ │ +_3_1_3 _N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r (const std::shared_ptr

& p, const │ │ │ │ │ +_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& c) │ │ │ │ │ +314 : _preconditioner(p), _communication(c) │ │ │ │ │ +315 { } │ │ │ │ │ +316 │ │ │ │ │ +_3_2_2 virtual void _p_r_e (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b) │ │ │ │ │ +323 { │ │ │ │ │ +324 _preconditioner->pre(x,b); │ │ │ │ │ +325 } │ │ │ │ │ +326 │ │ │ │ │ +_3_3_2 virtual void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& d) │ │ │ │ │ 333 { │ │ │ │ │ -334 // Test the INFLUENCE bit │ │ │ │ │ -335 return flags_.test(_I_N_F_L_U_E_N_C_E); │ │ │ │ │ -336 } │ │ │ │ │ -337 │ │ │ │ │ -_3_3_8 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_D_e_p_e_n_d_s() │ │ │ │ │ -339 { │ │ │ │ │ -340 // Set the first bit. │ │ │ │ │ -341 //flags_ |= (1<apply(v,d); │ │ │ │ │ +338 _communication.addOwnerCopyToOwnerCopy(v,v); │ │ │ │ │ +339 } │ │ │ │ │ +340 │ │ │ │ │ +341 template │ │ │ │ │ +_3_4_2 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +343 { │ │ │ │ │ +344 _preconditioner->template apply(v,d); │ │ │ │ │ +345 _communication.addOwnerCopyToOwnerCopy(v,v); │ │ │ │ │ +346 } │ │ │ │ │ +347 │ │ │ │ │ +_3_5_3 virtual void _p_o_s_t (_d_o_m_a_i_n___t_y_p_e& x) │ │ │ │ │ +354 { │ │ │ │ │ +355 _preconditioner->post(x); │ │ │ │ │ 356 } │ │ │ │ │ 357 │ │ │ │ │ -_3_5_8 inline void _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_I_n_f_l_u_e_n_c_e_s() │ │ │ │ │ -359 { │ │ │ │ │ -360 // reset the second bit. │ │ │ │ │ -361 flags_ &= ~(1<<_I_N_F_L_U_E_N_C_E); │ │ │ │ │ +_3_5_9 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +360 { │ │ │ │ │ +361 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g; │ │ │ │ │ 362 } │ │ │ │ │ 363 │ │ │ │ │ -_3_6_4 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_O_n_e_W_a_y() const │ │ │ │ │ -365 { │ │ │ │ │ -366 // Test whether only the first bit is set │ │ │ │ │ -367 //return isStrong() && !isTwoWay(); │ │ │ │ │ -368 return ((flags_) & std::bitset((1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D)))== │ │ │ │ │ -(1<<_D_E_P_E_N_D); │ │ │ │ │ -369 } │ │ │ │ │ -370 │ │ │ │ │ -_3_7_1 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_T_w_o_W_a_y() const │ │ │ │ │ -372 { │ │ │ │ │ -373 // Test whether the first and second bit is set │ │ │ │ │ -374 return ((flags_) & std::bitset((1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D)))==( │ │ │ │ │ -(1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D)); │ │ │ │ │ -375 } │ │ │ │ │ -376 │ │ │ │ │ -_3_7_7 inline bool _E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_S_t_r_o_n_g() const │ │ │ │ │ -378 { │ │ │ │ │ -379 // Test whether the first or second bit is set │ │ │ │ │ -380 return ((flags_) & std::bitset((1<<_I_N_F_L_U_E_N_C_E)|(1<<_D_E_P_E_N_D))).to_ulong │ │ │ │ │ -(); │ │ │ │ │ -381 } │ │ │ │ │ -382 │ │ │ │ │ -383 │ │ │ │ │ -_3_8_4 inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& os, const _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s& │ │ │ │ │ -props) │ │ │ │ │ -385 { │ │ │ │ │ -386 return os << props.flags_; │ │ │ │ │ -387 } │ │ │ │ │ -388 │ │ │ │ │ -_3_8_9 inline _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s() │ │ │ │ │ -390 : flags_() │ │ │ │ │ -391 {} │ │ │ │ │ -392 │ │ │ │ │ -393 │ │ │ │ │ -394 inline std::bitset::reference │ │ │ │ │ -_3_9_5 _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t v) │ │ │ │ │ -396 { │ │ │ │ │ -397 return flags_[v]; │ │ │ │ │ -398 } │ │ │ │ │ -399 │ │ │ │ │ -_4_0_0 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_](std::size_t v) const │ │ │ │ │ -401 { │ │ │ │ │ -402 return flags_[v]; │ │ │ │ │ -403 } │ │ │ │ │ -404 │ │ │ │ │ -_4_0_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_I_s_o_l_a_t_e_d() │ │ │ │ │ -406 { │ │ │ │ │ -407 flags_.set(_I_S_O_L_A_T_E_D); │ │ │ │ │ -408 } │ │ │ │ │ -409 │ │ │ │ │ -_4_1_0 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_i_s_o_l_a_t_e_d() const │ │ │ │ │ -411 { │ │ │ │ │ -412 return flags_.test(_I_S_O_L_A_T_E_D); │ │ │ │ │ -413 } │ │ │ │ │ -414 │ │ │ │ │ -_4_1_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_I_s_o_l_a_t_e_d() │ │ │ │ │ -416 { │ │ │ │ │ -417 flags_.reset(_I_S_O_L_A_T_E_D); │ │ │ │ │ -418 } │ │ │ │ │ -419 │ │ │ │ │ -_4_2_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_V_i_s_i_t_e_d() │ │ │ │ │ -421 { │ │ │ │ │ -422 flags_.set(_V_I_S_I_T_E_D); │ │ │ │ │ -423 } │ │ │ │ │ -424 │ │ │ │ │ -_4_2_5 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_v_i_s_i_t_e_d() const │ │ │ │ │ -426 { │ │ │ │ │ -427 return flags_.test(_V_I_S_I_T_E_D); │ │ │ │ │ -428 } │ │ │ │ │ -429 │ │ │ │ │ -_4_3_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_V_i_s_i_t_e_d() │ │ │ │ │ -431 { │ │ │ │ │ -432 flags_.reset(_V_I_S_I_T_E_D); │ │ │ │ │ -433 } │ │ │ │ │ -434 │ │ │ │ │ -_4_3_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_F_r_o_n_t() │ │ │ │ │ -436 { │ │ │ │ │ -437 flags_.set(_F_R_O_N_T); │ │ │ │ │ -438 } │ │ │ │ │ -439 │ │ │ │ │ -_4_4_0 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_f_r_o_n_t() const │ │ │ │ │ -441 { │ │ │ │ │ -442 return flags_.test(_F_R_O_N_T); │ │ │ │ │ -443 } │ │ │ │ │ -444 │ │ │ │ │ -_4_4_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_F_r_o_n_t() │ │ │ │ │ -446 { │ │ │ │ │ -447 flags_.reset(_F_R_O_N_T); │ │ │ │ │ -448 } │ │ │ │ │ -449 │ │ │ │ │ -_4_5_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r() │ │ │ │ │ -451 { │ │ │ │ │ -452 flags_.set(_B_O_R_D_E_R); │ │ │ │ │ -453 } │ │ │ │ │ -454 │ │ │ │ │ -_4_5_5 inline bool _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_e_x_c_l_u_d_e_d_B_o_r_d_e_r() const │ │ │ │ │ -456 { │ │ │ │ │ -457 return flags_.test(_B_O_R_D_E_R); │ │ │ │ │ -458 } │ │ │ │ │ -459 │ │ │ │ │ -_4_6_0 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r() │ │ │ │ │ -461 { │ │ │ │ │ -462 flags_.reset(_B_O_R_D_E_R); │ │ │ │ │ -463 } │ │ │ │ │ -464 │ │ │ │ │ -_4_6_5 inline void _V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t() │ │ │ │ │ -466 { │ │ │ │ │ -467 flags_.reset(); │ │ │ │ │ -468 } │ │ │ │ │ -469 │ │ │ │ │ -471 } │ │ │ │ │ -472} │ │ │ │ │ -473#endif │ │ │ │ │ -_g_r_a_p_h_._h_h │ │ │ │ │ -Provides classes for building the matrix graph. │ │ │ │ │ -_p_r_o_p_e_r_t_i_e_s_._h_h │ │ │ │ │ -Provides classes for handling internal properties in a graph. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_d_e_p_e_n_d_s │ │ │ │ │ -bool depends() const │ │ │ │ │ -Checks wether the vertex the edge points to depends on the vertex the edge │ │ │ │ │ -starts. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:352 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_F_r_o_n_t │ │ │ │ │ -void resetFront() │ │ │ │ │ -Resets the front node flag. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:445 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_B_i_t_S_e_t │ │ │ │ │ -std::bitset< VertexProperties::SIZE > BitSet │ │ │ │ │ -The type of the bitset. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_i_s_o_l_a_t_e_d │ │ │ │ │ -bool isolated() const │ │ │ │ │ -Checks wether the node is isolated. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:410 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_V_a_l_u_e_T_y_p_e │ │ │ │ │ -bool ValueType │ │ │ │ │ -The value type. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:248 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &os, const VertexProperties │ │ │ │ │ -&props) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_R_e_f_e_r_e_n_c_e │ │ │ │ │ -BitSet::reference Reference │ │ │ │ │ -The reference type. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:243 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_T_w_o_W_a_y │ │ │ │ │ -bool isTwoWay() const │ │ │ │ │ -Checks wether the edge is two way. I.e. both the influence flag and the depends │ │ │ │ │ -flag are that. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_I_n_f_l_u_e_n_c_e_s │ │ │ │ │ -void setInfluences() │ │ │ │ │ -Marks the edge as one of which the start vertex by the end vertex. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:325 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -VertexProperties() │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_D_e_p_e_n_d_s │ │ │ │ │ -void setDepends() │ │ │ │ │ -Marks the edge as one of which the end point depends on the starting point. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:338 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -PropertyGraphVertexPropertyMap() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -PropertyGraphVertexPropertyMap(G &g) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:259 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_V_e_r_t_e_x │ │ │ │ │ -G::VertexDescriptor Vertex │ │ │ │ │ -The vertex descriptor. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:253 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r │ │ │ │ │ -void resetExcludedBorder() │ │ │ │ │ -Marks the vertex as included in the aggregation. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:460 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_F_r_o_n_t │ │ │ │ │ -void setFront() │ │ │ │ │ -Marks the node as belonging to the current clusters front. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:435 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t │ │ │ │ │ -void reset() │ │ │ │ │ -Reset all flags. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:465 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_V_i_s_i_t_e_d │ │ │ │ │ -void setVisited() │ │ │ │ │ -Mark the node as already visited. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:420 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -EdgeProperties() │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:305 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_I_n_f_l_u_e_n_c_e_s │ │ │ │ │ -void resetInfluences() │ │ │ │ │ -Resets the influence flag. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:358 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_G_r_a_p_h │ │ │ │ │ -G Graph │ │ │ │ │ -The type of the graph with internal properties. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -std::bitset< SIZE >::reference operator[](std::size_t v) │ │ │ │ │ -Access the bits directly. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_p_r_i_n_t_F_l_a_g_s │ │ │ │ │ -void printFlags() const │ │ │ │ │ -Prints the attributes of the edge for debugging. │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_P_r_o_p_e_r_t_y_M_a_p_T_y_p_e_S_e_l_e_c_t_o_r_<_ _A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g_,_ _A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h_<_ _G_, │ │ │ │ │ -_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_,_ _E_P_,_ _V_M_,_ _E_M_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:288 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_n_f_l_u_e_n_c_e_s │ │ │ │ │ -bool influences() const │ │ │ │ │ -Checks wether the start vertex is influenced by the end vertex. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_I_s_o_l_a_t_e_d │ │ │ │ │ -void setIsolated() │ │ │ │ │ -Marks that node as being isolated. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:405 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_e_x_c_l_u_d_e_d_B_o_r_d_e_r │ │ │ │ │ -bool excludedBorder() const │ │ │ │ │ -Tests whether the vertex is excluded from the aggregation. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:455 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_V_i_s_i_t_e_d │ │ │ │ │ -void resetVisited() │ │ │ │ │ -Resets the visited flag. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:430 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_v_i_s_i_t_e_d │ │ │ │ │ -bool visited() const │ │ │ │ │ -Checks wether the node is marked as visited. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -Reference operator[](const Vertex &vertex) const │ │ │ │ │ -Get the properties associated to a vertex. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t │ │ │ │ │ -void reset() │ │ │ │ │ -Reset all flags. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:320 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_D_e_p_e_n_d_s │ │ │ │ │ -void resetDepends() │ │ │ │ │ -Resets the depends flag. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:345 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -ReadWritePropertyMapTag Category │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:223 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_r_e_s_e_t_I_s_o_l_a_t_e_d │ │ │ │ │ -void resetIsolated() │ │ │ │ │ -Resets the isolated flag. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:415 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > │ │ │ │ │ -&criterion) │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_S_t_r_o_n_g │ │ │ │ │ -bool isStrong() const │ │ │ │ │ -Checks wether the edge is strong. I.e. the influence or depends flag is set. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_f_r_o_n_t │ │ │ │ │ -bool front() const │ │ │ │ │ -Checks wether the node is marked as a front node. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:440 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -std::bitset< SIZE >::reference operator[](std::size_t v) │ │ │ │ │ -Access the bits directly. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:310 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_s_e_t_E_x_c_l_u_d_e_d_B_o_r_d_e_r │ │ │ │ │ -void setExcludedBorder() │ │ │ │ │ -Marks the vertex as excluded from the aggregation. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:450 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_i_s_O_n_e_W_a_y │ │ │ │ │ -bool isOneWay() const │ │ │ │ │ -Checks wether the edge is one way. I.e. either the influence or the depends │ │ │ │ │ -flag but is set. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:364 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p_:_:_i_n_d_e_x │ │ │ │ │ -@ index │ │ │ │ │ -the index to access in the bitset. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:227 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_V_I_S_I_T_E_D │ │ │ │ │ -@ VISITED │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_I_S_O_L_A_T_E_D │ │ │ │ │ -@ ISOLATED │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_S_I_Z_E │ │ │ │ │ -@ SIZE │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_B_O_R_D_E_R │ │ │ │ │ -@ BORDER │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s_:_:_F_R_O_N_T │ │ │ │ │ -@ FRONT │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_D_E_P_E_N_D │ │ │ │ │ -@ DEPEND │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_S_I_Z_E │ │ │ │ │ -@ SIZE │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s_:_:_I_N_F_L_U_E_N_C_E │ │ │ │ │ -@ INFLUENCE │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:43 │ │ │ │ │ +364 private: │ │ │ │ │ +366 std::shared_ptr

_preconditioner; │ │ │ │ │ +367 │ │ │ │ │ +369 const _c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e& _communication; │ │ │ │ │ +370 }; │ │ │ │ │ +371 │ │ │ │ │ +374} // end namespace │ │ │ │ │ +375 │ │ │ │ │ +376#endif │ │ │ │ │ +_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +_i_o_._h_h │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ +_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_g_s_e_t_c_._h_h │ │ │ │ │ +Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ +generic way. │ │ │ │ │ +_v_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +??? │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ +_i_l_u_._h_h │ │ │ │ │ +The incomplete LU factorization kernels. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_E_d_g_e_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -Class representing the properties of an ede in the matrix graph. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_P_r_o_p_e_r_t_i_e_s │ │ │ │ │ -Class representing a node in the matrix graph. │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_y_G_r_a_p_h_V_e_r_t_e_x_P_r_o_p_e_r_t_y_M_a_p │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_r_o_p_e_r_t_i_e_s_G_r_a_p_h │ │ │ │ │ -Attaches properties to the edges and vertices of a graph. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:978 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_V_e_r_t_e_x_V_i_s_i_t_e_d_T_a_g │ │ │ │ │ -Tag idnetifying the visited property of a vertex. │ │ │ │ │ -DDeeffiinniittiioonn properties.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +A nonoverlapping operator with communication object. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_P_I_S │ │ │ │ │ +C::PIS PIS │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ +C communication_type │ │ │ │ │ +The type of the communication object. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_M_a_p │ │ │ │ │ +std::multimap< int, std::pair< int, RILIterator > > RIMap │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I │ │ │ │ │ +C::RI RI │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_n_o_v_l_p___o_p___a_p_p_l_y │ │ │ │ │ +void novlp_op_apply(const X &x, Y &y, field_type alpha) const │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const │ │ │ │ │ +communication_type &com) │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:96 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +M::ConstColIterator ColIterator │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(const X &x, Y &y) const │ │ │ │ │ +apply operator to x: │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The type of the domain. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:235 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_M_a_p_i_t │ │ │ │ │ +RIMap::iterator RIMapit │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_m_a_t │ │ │ │ │ +virtual const matrix_type & getmat() const │ │ │ │ │ +get matrix via * │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_L_I_t_e_r_a_t_o_r │ │ │ │ │ +RIL::const_iterator RILIterator │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_M_M │ │ │ │ │ +std::multimap< int, int > MM │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The type of the range. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The type of the matrix we operate on. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +M::ConstRowIterator RowIterator │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_g_e_t_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +const communication_type & getCommunication() const │ │ │ │ │ +Get the object responsible for communication. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ +virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const │ │ │ │ │ +apply operator to x, scale and add: │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_L │ │ │ │ │ +RI::RemoteIndexList RIL │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the range. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ +NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type │ │ │ │ │ +&com) │ │ │ │ │ +constructor: just store a reference to a matrix. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_:_:_R_I_I_t_e_r_a_t_o_r │ │ │ │ │ +RI::const_iterator RIIterator │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Nonoverlapping parallel preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +NonoverlappingBlockPreconditioner(P &p, const communication_type &c) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:302 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(domain_type &v, const range_type &d) │ │ │ │ │ +Apply the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:332 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +P::range_type range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const │ │ │ │ │ +communication_type &c) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ +virtual void post(domain_type &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_o_m_m_u_n_i_c_a_t_i_o_n___t_y_p_e │ │ │ │ │ +C communication_type │ │ │ │ │ +The type of the communication object. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ +virtual void pre(domain_type &x, range_type &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const Y &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_B_l_o_c_k_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +P::domain_type domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn novlpschwarz.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator exporting itself in matrix form. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r │ │ │ │ │ +@ owner │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y │ │ │ │ │ +@ copy │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p │ │ │ │ │ +@ overlap │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ +@ nonoverlapping │ │ │ │ │ +Category for non-overlapping solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00143.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: amg.hh File Reference │ │ │ │ +dune-istl: solverfactory.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,79 +65,95 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ +
solverfactory.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

The AMG preconditioner. │ │ │ │ -More...

│ │ │ │ -
#include <memory>
│ │ │ │ -#include <sstream>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/istl/paamg/smoother.hh>
│ │ │ │ -#include <dune/istl/paamg/transfer.hh>
│ │ │ │ -#include <dune/istl/paamg/matrixhierarchy.hh>
│ │ │ │ -#include <dune/istl/solvers.hh>
│ │ │ │ -#include <dune/istl/scalarproducts.hh>
│ │ │ │ -#include <dune/istl/superlu.hh>
│ │ │ │ -#include <dune/istl/umfpack.hh>
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/scalarvectorview.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
#include <unordered_map>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <memory>
│ │ │ │ #include <dune/common/parametertree.hh>
│ │ │ │ +#include <dune/common/singleton.hh>
│ │ │ │ +#include "solverregistry.hh"
│ │ │ │ +#include <dune/istl/solver.hh>
│ │ │ │ +#include <dune/istl/schwarz.hh>
│ │ │ │ +#include <dune/istl/novlpschwarz.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Amg::AMG< M, X, S, PI, A >
 Parallel algebraic multigrid based on agglomeration. More...
 
struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >
 
struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, SolverType >
 
struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, superlu >
 
struct  Dune::AMGCreator
 
struct  Dune::AMGCreator::isValidBlockType< class >
 
struct  Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >
class  Dune::SolverFactory< Operator >
 Factory to assembly solvers configured by a ParameterTree. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<class M , class X , class Y >
using Dune::DirectSolverSignature = std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &)
 
template<class M , class X , class Y >
using Dune::DirectSolverFactory = Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > >
 
template<class M , class X , class Y >
using Dune::PreconditionerSignature = std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &)
 
template<class M , class X , class Y >
using Dune::PreconditionerFactory = Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > >
 
template<class X , class Y >
using Dune::IterativeSolverSignature = std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &)
 
template<class X , class Y >
using Dune::IterativeSolverFactory = Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > >
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

 Dune::DUNE_REGISTER_PRECONDITIONER ("amg", AMGCreator())
 
template<class O , class Preconditioner >
std::shared_ptr< PreconditionerDune::wrapPreconditioner4Parallel (const std::shared_ptr< Preconditioner > &prec, const O &)
 
template<class M , class X , class Y , class C , class Preconditioner >
std::shared_ptr< PreconditionerDune::wrapPreconditioner4Parallel (const std::shared_ptr< Preconditioner > &prec, const std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class M , class X , class Y , class C , class Preconditioner >
std::shared_ptr< PreconditionerDune::wrapPreconditioner4Parallel (const std::shared_ptr< Preconditioner > &prec, const std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class M , class X , class Y >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const std::shared_ptr< MatrixAdapter< M, X, Y > > &)
 
template<class M , class X , class Y , class C >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class M , class X , class Y , class C >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class Operator >
std::shared_ptr< InverseOperator< typename Operator::domain_type, typename Operator::range_type > > Dune::getSolverFromFactory (std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner< typename Operator::domain_type, typename Operator::range_type > > prec=nullptr)
 Instantiates an InverseOperator from an Operator and a configuration given as a ParameterTree.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

The AMG preconditioner.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,60 +1,101 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -_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 │ │ │ │ │ -amg.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -» _P_a_r_a_l_l_e_l_ _A_l_g_e_b_r_a_i_c_ _M_u_l_t_i_g_r_i_d │ │ │ │ │ -The AMG preconditioner. _M_o_r_e_._._. │ │ │ │ │ +_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 │ │ │ │ │ +solverfactory.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include "_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_A_m_g_:_:_A_M_G_<_ _M_,_ _X_,_ _S_,_ _P_I_,_ _A_ _> │ │ │ │ │ -  Parallel algebraic multigrid based on agglomeration. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_<_ _M_a_t_r_i_x_,_ _V_e_c_t_o_r_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_<_ _M_a_t_r_i_x_,_ _V_e_c_t_o_r_ _>_:_:_S_o_l_v_e_r_<_ _M_, │ │ │ │ │ - _S_o_l_v_e_r_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_<_ _M_a_t_r_i_x_,_ _V_e_c_t_o_r_ _>_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e_<_ _c_l_a_s_s_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y_<_ _O_p_e_r_a_t_o_r_ _> │ │ │ │ │ +  Factory to assembly solvers configured by a ParameterTree. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_A_m_g │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr< _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< X, Y > > │ │ │ │ │ + (const M &, const ParameterTree &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y = Singleton< ParameterizedObjectFactory< │ │ │ │ │ + _D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e< M, X, Y > > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r< X, Y > │ │ │ │ │ + >(const std::shared_ptr< M > &, const ParameterTree &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y = Singleton< ParameterizedObjectFactory< │ │ │ │ │ + _P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e< M, X, Y > > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr< _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< X, Y │ │ │ │ │ + > >(const std::shared_ptr< _L_i_n_e_a_r_O_p_e_r_a_t_o_r< X, Y > > &, const std:: │ │ │ │ │ + shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > > &, const std::shared_ptr< │ │ │ │ │ + _P_r_e_c_o_n_d_i_t_i_o_n_e_r< X, Y > >, const ParameterTree &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y = Singleton< ParameterizedObjectFactory< │ │ │ │ │ + _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e< X, Y > > > │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("amg", _A_M_G_C_r_e_a_t_o_r()) │ │ │ │ │ +template │ │ │ │ │ + std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r >  _D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l (const │ │ │ │ │ + std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r > &prec, │ │ │ │ │ + const O &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r >  _D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l (const │ │ │ │ │ + std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r > &prec, │ │ │ │ │ + const std::shared_ptr< │ │ │ │ │ + _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< M, X, Y, C > │ │ │ │ │ + > &op) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r >  _D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l (const │ │ │ │ │ + std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r > &prec, │ │ │ │ │ + const std::shared_ptr< │ │ │ │ │ + _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< M, X, Y, │ │ │ │ │ + C > > &op) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const std:: │ │ │ │ │ + shared_ptr< _M_a_t_r_i_x_A_d_a_p_t_e_r< M, X, Y > > │ │ │ │ │ + &) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const std:: │ │ │ │ │ + shared_ptr< _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< │ │ │ │ │ + M, X, Y, C > > &op) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const std:: │ │ │ │ │ + shared_ptr< │ │ │ │ │ + _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< M, X, Y, │ │ │ │ │ + C > > &op) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::shared_ptr< _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< _D_u_n_e_:_:_g_e_t_S_o_l_v_e_r_F_r_o_m_F_a_c_t_o_r_y (std:: │ │ │ │ │ + typename Operator::domain_type, shared_ptr< Operator > op, const │ │ │ │ │ + typename Operator::range_type > >  ParameterTree &config, std::shared_ptr< │ │ │ │ │ + _P_r_e_c_o_n_d_i_t_i_o_n_e_r< typename Operator:: │ │ │ │ │ + domain_type, typename Operator:: │ │ │ │ │ + range_type > > prec=nullptr) │ │ │ │ │ + Instantiates an _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r from an │ │ │ │ │ +  Operator and a configuration given as a │ │ │ │ │ + ParameterTree. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -The AMG preconditioner. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: amg.hh Source File │ │ │ │ +dune-istl: solverfactory.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,1282 +70,249 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
amg.hh
│ │ │ │ +
solverfactory.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_AMG_AMG_HH
│ │ │ │ -
6#define DUNE_AMG_AMG_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <memory>
│ │ │ │ -
9#include <sstream>
│ │ │ │ -
10#include <dune/common/exceptions.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
14#include <dune/istl/solvers.hh>
│ │ │ │ - │ │ │ │ -
16#include <dune/istl/superlu.hh>
│ │ │ │ -
17#include <dune/istl/umfpack.hh>
│ │ │ │ - │ │ │ │ -
19#include <dune/common/typetraits.hh>
│ │ │ │ -
20#include <dune/common/exceptions.hh>
│ │ │ │ -
21#include <dune/common/scalarvectorview.hh>
│ │ │ │ -
22#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -
23#include <dune/common/parametertree.hh>
│ │ │ │ -
24
│ │ │ │ -
25namespace Dune
│ │ │ │ -
26{
│ │ │ │ -
27 namespace Amg
│ │ │ │ -
28 {
│ │ │ │ -
46 template<class M, class X, class S, class P, class K, class A>
│ │ │ │ -
47 class KAMG;
│ │ │ │ -
48
│ │ │ │ -
49 template<class T>
│ │ │ │ -
50 class KAmgTwoGrid;
│ │ │ │ -
51
│ │ │ │ -
62 template<class M, class X, class S, class PI=SequentialInformation,
│ │ │ │ -
63 class A=std::allocator<X> >
│ │ │ │ -
│ │ │ │ -
64 class AMG : public Preconditioner<X,X>
│ │ │ │ -
65 {
│ │ │ │ -
66 template<class M1, class X1, class S1, class P1, class K1, class A1>
│ │ │ │ -
67 friend class KAMG;
│ │ │ │ -
68
│ │ │ │ -
69 friend class KAmgTwoGrid<AMG>;
│ │ │ │ -
70
│ │ │ │ -
71 public:
│ │ │ │ -
73 typedef M Operator;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
85
│ │ │ │ -
87 typedef X Domain;
│ │ │ │ -
89 typedef X Range;
│ │ │ │ - │ │ │ │ -
97 typedef S Smoother;
│ │ │ │ -
98
│ │ │ │ - │ │ │ │ -
101
│ │ │ │ -
│ │ │ │ -
111 AMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
│ │ │ │ -
112 const SmootherArgs& smootherArgs, const Parameters& parms);
│ │ │ │ -
113
│ │ │ │ -
125 template<class C>
│ │ │ │ -
│ │ │ │ -
126 AMG(const Operator& fineOperator, const C& criterion,
│ │ │ │ -
127 const SmootherArgs& smootherArgs=SmootherArgs(),
│ │ │ │ - │ │ │ │ -
129
│ │ │ │ -
│ │ │ │ -
180 AMG(std::shared_ptr<const Operator> fineOperator, const ParameterTree& configuration, const ParallelInformation& pinfo=ParallelInformation());
│ │ │ │ -
181
│ │ │ │ -
│ │ │ │ -
185 AMG(const AMG& amg);
│ │ │ │ -
186
│ │ │ │ -
│ │ │ │ -
188 void pre(Domain& x, Range& b);
│ │ │ │ -
189
│ │ │ │ -
│ │ │ │ -
191 void apply(Domain& v, const Range& d);
│ │ │ │ -
192
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
195 {
│ │ │ │ -
196 return category_;
│ │ │ │ -
197 }
│ │ │ │ -
│ │ │ │ -
198
│ │ │ │ -
│ │ │ │ -
200 void post(Domain& x);
│ │ │ │ -
201
│ │ │ │ -
206 template<class A1>
│ │ │ │ -
│ │ │ │ -
207 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
│ │ │ │ -
208
│ │ │ │ -
│ │ │ │ -
209 std::size_t levels();
│ │ │ │ -
210
│ │ │ │ -
│ │ │ │ -
211 std::size_t maxlevels();
│ │ │ │ -
212
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
222 {
│ │ │ │ -
223 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
│ │ │ │ -
224 }
│ │ │ │ -
│ │ │ │ -
225
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
231
│ │ │ │ -
232 private:
│ │ │ │ -
233 /*
│ │ │ │ -
234 * @brief Helper function to create hierarchies with parameter tree.
│ │ │ │ -
235 *
│ │ │ │ -
236 * Will create the coarsen criterion with the norm and create the
│ │ │ │ -
237 * Hierarchies
│ │ │ │ -
238 * \tparam Norm Type of the norm to use.
│ │ │ │ -
239 */
│ │ │ │ -
240 template<class Norm>
│ │ │ │ -
241 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
│ │ │ │ -
242 const PI& pinfo, const Norm&,
│ │ │ │ -
243 const ParameterTree& configuration,
│ │ │ │ -
244 std::true_type compiles = std::true_type());
│ │ │ │ -
245 template<class Norm>
│ │ │ │ -
246 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
│ │ │ │ -
247 const PI& pinfo, const Norm&,
│ │ │ │ -
248 const ParameterTree& configuration,
│ │ │ │ -
249 std::false_type);
│ │ │ │ -
254 template<class C>
│ │ │ │ -
255 void createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr,
│ │ │ │ -
256 const PI& pinfo, const ParameterTree& configuration);
│ │ │ │ -
263 template<class C>
│ │ │ │ -
264 void createHierarchies(C& criterion,
│ │ │ │ -
265 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ -
266 const PI& pinfo);
│ │ │ │ -
273 struct LevelContext
│ │ │ │ -
274 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
283 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
│ │ │ │ - │ │ │ │ -
291 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
│ │ │ │ -
295 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
311 std::size_t level;
│ │ │ │ -
312 };
│ │ │ │ -
313
│ │ │ │ -
314
│ │ │ │ -
319 void mgc(LevelContext& levelContext);
│ │ │ │ -
320
│ │ │ │ -
321 void additiveMgc();
│ │ │ │ -
322
│ │ │ │ -
329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel);
│ │ │ │ -
330
│ │ │ │ -
335 bool moveToCoarseLevel(LevelContext& levelContext);
│ │ │ │ -
336
│ │ │ │ -
341 void initIteratorsWithFineLevel(LevelContext& levelContext);
│ │ │ │ -
342
│ │ │ │ -
344 std::shared_ptr<OperatorHierarchy> matrices_;
│ │ │ │ -
346 SmootherArgs smootherArgs_;
│ │ │ │ -
348 std::shared_ptr<Hierarchy<Smoother,A> > smoothers_;
│ │ │ │ -
350 std::shared_ptr<CoarseSolver> solver_;
│ │ │ │ -
352 std::shared_ptr<Hierarchy<Range,A>> rhs_;
│ │ │ │ -
354 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
│ │ │ │ -
356 std::shared_ptr<Hierarchy<Domain,A>> update_;
│ │ │ │ - │ │ │ │ -
360 std::shared_ptr<ScalarProduct> scalarProduct_;
│ │ │ │ -
362 std::size_t gamma_;
│ │ │ │ -
364 std::size_t preSteps_;
│ │ │ │ -
366 std::size_t postSteps_;
│ │ │ │ -
367 bool buildHierarchy_;
│ │ │ │ -
368 bool additive;
│ │ │ │ -
369 bool coarsesolverconverged;
│ │ │ │ -
370 std::shared_ptr<Smoother> coarseSmoother_;
│ │ │ │ -
372 SolverCategory::Category category_;
│ │ │ │ -
374 std::size_t verbosity_;
│ │ │ │ -
375
│ │ │ │ -
376 struct ToLower
│ │ │ │ -
377 {
│ │ │ │ -
│ │ │ │ -
378 std::string operator()(const std::string& str)
│ │ │ │ -
379 {
│ │ │ │ -
380 std::stringstream retval;
│ │ │ │ -
381 std::ostream_iterator<char> out(retval);
│ │ │ │ -
382 std::transform(str.begin(), str.end(), out,
│ │ │ │ -
383 [](char c){
│ │ │ │ -
384 return std::tolower(c, std::locale::classic());
│ │ │ │ -
385 });
│ │ │ │ -
386 return retval.str();
│ │ │ │ -
387 }
│ │ │ │ -
│ │ │ │ -
388 };
│ │ │ │ -
389 };
│ │ │ │ -
390
│ │ │ │ -
391 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ -
392 inline AMG<M,X,S,PI,A>::AMG(const AMG& amg)
│ │ │ │ -
393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_),
│ │ │ │ -
394 smoothers_(amg.smoothers_), solver_(amg.solver_),
│ │ │ │ -
395 rhs_(), lhs_(), update_(),
│ │ │ │ -
396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_),
│ │ │ │ -
397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
│ │ │ │ -
398 buildHierarchy_(amg.buildHierarchy_),
│ │ │ │ -
399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged),
│ │ │ │ -
400 coarseSmoother_(amg.coarseSmoother_),
│ │ │ │ -
401 category_(amg.category_),
│ │ │ │ -
402 verbosity_(amg.verbosity_)
│ │ │ │ -
403 {}
│ │ │ │ -
│ │ │ │ -
404
│ │ │ │ -
405 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
407 const SmootherArgs& smootherArgs,
│ │ │ │ -
408 const Parameters& parms)
│ │ │ │ -
409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_(smootherArgs),
│ │ │ │ -
410 smoothers_(new Hierarchy<Smoother,A>), solver_(&coarseSolver),
│ │ │ │ -
411 rhs_(), lhs_(), update_(), scalarProduct_(0),
│ │ │ │ -
412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
│ │ │ │ -
413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
│ │ │ │ -
414 additive(parms.getAdditive()), coarsesolverconverged(true),
│ │ │ │ -
415 coarseSmoother_(),
│ │ │ │ -
416// #warning should category be retrieved from matrices?
│ │ │ │ -
417 category_(SolverCategory::category(*smoothers_->coarsest())),
│ │ │ │ -
418 verbosity_(parms.debugLevel())
│ │ │ │ -
419 {
│ │ │ │ -
420 assert(matrices_->isBuilt());
│ │ │ │ -
421
│ │ │ │ -
422 // build the necessary smoother hierarchies
│ │ │ │ -
423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
│ │ │ │ -
424 }
│ │ │ │ -
│ │ │ │ -
425
│ │ │ │ -
426 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
427 template<class C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
429 const C& criterion,
│ │ │ │ -
430 const SmootherArgs& smootherArgs,
│ │ │ │ -
431 const PI& pinfo)
│ │ │ │ -
432 : smootherArgs_(smootherArgs),
│ │ │ │ -
433 smoothers_(new Hierarchy<Smoother,A>), solver_(),
│ │ │ │ -
434 rhs_(), lhs_(), update_(), scalarProduct_(),
│ │ │ │ -
435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()),
│ │ │ │ -
436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true),
│ │ │ │ -
437 additive(criterion.getAdditive()), coarsesolverconverged(true),
│ │ │ │ -
438 coarseSmoother_(),
│ │ │ │ -
439 category_(SolverCategory::category(pinfo)),
│ │ │ │ -
440 verbosity_(criterion.debugLevel())
│ │ │ │ -
441 {
│ │ │ │ - │ │ │ │ -
443 DUNE_THROW(InvalidSolverCategory, "Matrix and Communication must have the same SolverCategory!");
│ │ │ │ -
444 // TODO: reestablish compile time checks.
│ │ │ │ -
445 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
│ │ │ │ -
446 // "Matrix and Solver must match in terms of category!");
│ │ │ │ -
447 auto matrixptr = stackobject_to_shared_ptr(matrix);
│ │ │ │ -
448 createHierarchies(criterion, matrixptr, pinfo);
│ │ │ │ -
449 }
│ │ │ │ -
│ │ │ │ -
450
│ │ │ │ -
451 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ -
452 AMG<M,X,S,PI,A>::AMG(std::shared_ptr<const Operator> matrixptr,
│ │ │ │ -
453 const ParameterTree& configuration,
│ │ │ │ -
454 const ParallelInformation& pinfo) :
│ │ │ │ -
455 smoothers_(new Hierarchy<Smoother,A>),
│ │ │ │ -
456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_(true),
│ │ │ │ -
457 coarsesolverconverged(true), coarseSmoother_(),
│ │ │ │ -
458 category_(SolverCategory::category(pinfo))
│ │ │ │ -
459 {
│ │ │ │ -
460
│ │ │ │ -
461 if (configuration.hasKey ("smootherIterations"))
│ │ │ │ -
462 smootherArgs_.iterations = configuration.get<int>("smootherIterations");
│ │ │ │ -
463
│ │ │ │ -
464 if (configuration.hasKey ("smootherRelaxation"))
│ │ │ │ -
465 smootherArgs_.relaxationFactor = configuration.get<typename SmootherArgs::RelaxationFactor>("smootherRelaxation");
│ │ │ │ -
466
│ │ │ │ -
467 auto normName = ToLower()(configuration.get("strengthMeasure", "diagonal"));
│ │ │ │ -
468 auto index = configuration.get<int>("diagonalRowIndex", 0);
│ │ │ │ -
469
│ │ │ │ -
470 if ( normName == "diagonal")
│ │ │ │ -
471 {
│ │ │ │ -
472 using field_type = typename M::field_type;
│ │ │ │ -
473 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
474 std::is_convertible<field_type, real_type> compiles;
│ │ │ │ -
475
│ │ │ │ -
476 switch (index)
│ │ │ │ -
477 {
│ │ │ │ -
478 case 0:
│ │ │ │ -
479 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<0>(), configuration, compiles);
│ │ │ │ -
480 break;
│ │ │ │ -
481 case 1:
│ │ │ │ -
482 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<1>(), configuration, compiles);
│ │ │ │ -
483 break;
│ │ │ │ -
484 case 2:
│ │ │ │ -
485 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<2>(), configuration, compiles);
│ │ │ │ -
486 break;
│ │ │ │ -
487 case 3:
│ │ │ │ -
488 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<3>(), configuration, compiles);
│ │ │ │ -
489 break;
│ │ │ │ -
490 case 4:
│ │ │ │ -
491 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<4>(), configuration, compiles);
│ │ │ │ -
492 break;
│ │ │ │ -
493 default:
│ │ │ │ -
494 DUNE_THROW(InvalidStateException, "Currently strengthIndex>4 is not supported.");
│ │ │ │ -
495 }
│ │ │ │ -
496 }
│ │ │ │ -
497 else if (normName == "rowsum")
│ │ │ │ -
498 createCriterionAndHierarchies(matrixptr, pinfo, RowSum(), configuration);
│ │ │ │ -
499 else if (normName == "frobenius")
│ │ │ │ -
500 createCriterionAndHierarchies(matrixptr, pinfo, FrobeniusNorm(), configuration);
│ │ │ │ -
501 else if (normName == "one")
│ │ │ │ -
502 createCriterionAndHierarchies(matrixptr, pinfo, AlwaysOneNorm(), configuration);
│ │ │ │ -
503 else
│ │ │ │ -
504 DUNE_THROW(Dune::NotImplemented, "Wrong config file: strengthMeasure "<<normName<<" is not supported by AMG");
│ │ │ │ -
505 }
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
507 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
508 template<class Norm>
│ │ │ │ -
509 void AMG<M,X,S,PI,A>::createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const Norm&, const ParameterTree& configuration, std::false_type)
│ │ │ │ -
510 {
│ │ │ │ -
511 DUNE_THROW(InvalidStateException, "Strength of connection measure does not support this type ("
│ │ │ │ -
512 << className<typename M::field_type>() << ") as it is lacking a conversion to"
│ │ │ │ -
513 << className<typename FieldTraits<typename M::field_type>::real_type>() << ".");
│ │ │ │ -
514 }
│ │ │ │ -
515
│ │ │ │ -
516 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
517 template<class Norm>
│ │ │ │ -
518 void AMG<M,X,S,PI,A>::createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const Norm&, const ParameterTree& configuration, std::true_type)
│ │ │ │ -
519 {
│ │ │ │ -
520 if (configuration.get<bool>("criterionSymmetric", true))
│ │ │ │ -
521 {
│ │ │ │ -
522 using Criterion = Dune::Amg::CoarsenCriterion<
│ │ │ │ - │ │ │ │ -
524 Criterion criterion;
│ │ │ │ -
525 createHierarchies(criterion, matrixptr, pinfo, configuration);
│ │ │ │ -
526 }
│ │ │ │ -
527 else
│ │ │ │ -
528 {
│ │ │ │ -
529 using Criterion = Dune::Amg::CoarsenCriterion<
│ │ │ │ - │ │ │ │ -
531 Criterion criterion;
│ │ │ │ -
532 createHierarchies(criterion, matrixptr, pinfo, configuration);
│ │ │ │ -
533 }
│ │ │ │ -
534 }
│ │ │ │ -
535
│ │ │ │ -
536 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
537 template<class C>
│ │ │ │ -
538 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const ParameterTree& configuration)
│ │ │ │ -
539 {
│ │ │ │ -
540 if (configuration.hasKey ("maxLevel"))
│ │ │ │ -
541 criterion.setMaxLevel(configuration.get<int>("maxLevel"));
│ │ │ │ -
542
│ │ │ │ -
543 if (configuration.hasKey ("minCoarseningRate"))
│ │ │ │ -
544 criterion.setMinCoarsenRate(configuration.get<int>("minCoarseningRate"));
│ │ │ │ -
545
│ │ │ │ -
546 if (configuration.hasKey ("coarsenTarget"))
│ │ │ │ -
547 criterion.setCoarsenTarget (configuration.get<int>("coarsenTarget"));
│ │ │ │ -
548
│ │ │ │ -
549 if (configuration.hasKey ("accumulationMode"))
│ │ │ │ -
550 {
│ │ │ │ -
551 std::string mode = ToLower()(configuration.get<std::string>("accumulationMode"));
│ │ │ │ -
552 if ( mode == "none")
│ │ │ │ -
553 criterion.setAccumulate(AccumulationMode::noAccu);
│ │ │ │ -
554 else if ( mode == "atonce" )
│ │ │ │ -
555 criterion.setAccumulate(AccumulationMode::atOnceAccu);
│ │ │ │ -
556 else if ( mode == "successive")
│ │ │ │ -
557 criterion.setCoarsenTarget (AccumulationMode::successiveAccu);
│ │ │ │ -
558 else
│ │ │ │ -
559 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
│ │ │ │ -
560 << mode <<".");
│ │ │ │ -
561 }
│ │ │ │ -
562
│ │ │ │ -
563 if (configuration.hasKey ("prolongationDampingFactor"))
│ │ │ │ -
564 criterion.setProlongationDampingFactor (configuration.get<double>("prolongationDampingFactor"));
│ │ │ │ -
565
│ │ │ │ -
566 if (configuration.hasKey("defaultAggregationSizeMode"))
│ │ │ │ -
567 {
│ │ │ │ -
568 auto mode = ToLower()(configuration.get<std::string>("defaultAggregationSizeMode"));
│ │ │ │ -
569 auto dim = configuration.get<std::size_t>("defaultAggregationDimension");
│ │ │ │ -
570 std::size_t maxDistance = 2;
│ │ │ │ -
571 if (configuration.hasKey("MaxAggregateDistance"))
│ │ │ │ -
572 maxDistance = configuration.get<std::size_t>("maxAggregateDistance");
│ │ │ │ -
573 if (mode == "isotropic")
│ │ │ │ -
574 criterion.setDefaultValuesIsotropic(dim, maxDistance);
│ │ │ │ -
575 else if(mode == "anisotropic")
│ │ │ │ -
576 criterion.setDefaultValuesAnisotropic(dim, maxDistance);
│ │ │ │ -
577 else
│ │ │ │ -
578 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
│ │ │ │ -
579 << mode <<".");
│ │ │ │ -
580 }
│ │ │ │ -
581
│ │ │ │ -
582 if (configuration.hasKey("maxAggregateDistance"))
│ │ │ │ -
583 criterion.setMaxDistance(configuration.get<std::size_t>("maxAggregateDistance"));
│ │ │ │ -
584
│ │ │ │ -
585 if (configuration.hasKey("minAggregateSize"))
│ │ │ │ -
586 criterion.setMinAggregateSize(configuration.get<std::size_t>("minAggregateSize"));
│ │ │ │ -
587
│ │ │ │ -
588 if (configuration.hasKey("maxAggregateSize"))
│ │ │ │ -
589 criterion.setMaxAggregateSize(configuration.get<std::size_t>("maxAggregateSize"));
│ │ │ │ -
590
│ │ │ │ -
591 if (configuration.hasKey("maxAggregateConnectivity"))
│ │ │ │ -
592 criterion.setMaxConnectivity(configuration.get<std::size_t>("maxAggregateConnectivity"));
│ │ │ │ -
593
│ │ │ │ -
594 if (configuration.hasKey ("alpha"))
│ │ │ │ -
595 criterion.setAlpha (configuration.get<double> ("alpha"));
│ │ │ │ -
596
│ │ │ │ -
597 if (configuration.hasKey ("beta"))
│ │ │ │ -
598 criterion.setBeta (configuration.get<double> ("beta"));
│ │ │ │ -
599
│ │ │ │ -
600 if (configuration.hasKey ("gamma"))
│ │ │ │ -
601 criterion.setGamma (configuration.get<std::size_t> ("gamma"));
│ │ │ │ -
602 gamma_ = criterion.getGamma();
│ │ │ │ -
603
│ │ │ │ -
604 if (configuration.hasKey ("additive"))
│ │ │ │ -
605 criterion.setAdditive (configuration.get<bool>("additive"));
│ │ │ │ -
606 additive = criterion.getAdditive();
│ │ │ │ -
607
│ │ │ │ -
608 if (configuration.hasKey ("preSteps"))
│ │ │ │ -
609 criterion.setNoPreSmoothSteps (configuration.get<std::size_t> ("preSteps"));
│ │ │ │ -
610 preSteps_ = criterion.getNoPreSmoothSteps ();
│ │ │ │ -
611
│ │ │ │ -
612 if (configuration.hasKey ("postSteps"))
│ │ │ │ -
613 criterion.setNoPostSmoothSteps (configuration.get<std::size_t> ("postSteps"));
│ │ │ │ -
614 postSteps_ = criterion.getNoPostSmoothSteps ();
│ │ │ │ -
615
│ │ │ │ -
616 verbosity_ = configuration.get("verbosity", 0);
│ │ │ │ -
617 criterion.setDebugLevel (verbosity_);
│ │ │ │ -
618
│ │ │ │ -
619 createHierarchies(criterion, matrixptr, pinfo);
│ │ │ │ -
620 }
│ │ │ │ -
621
│ │ │ │ -
622 template <class Matrix,
│ │ │ │ -
623 class Vector>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
625 {
│ │ │ │ -
626 typedef typename Matrix :: field_type field_type;
│ │ │ │ - │ │ │ │ -
628
│ │ │ │ -
629 static constexpr SolverType solver =
│ │ │ │ -
630#if DISABLE_AMG_DIRECTSOLVER
│ │ │ │ -
631 none;
│ │ │ │ -
632#elif HAVE_SUITESPARSE_UMFPACK
│ │ │ │ - │ │ │ │ -
634#elif HAVE_SUPERLU
│ │ │ │ -
635 superlu ;
│ │ │ │ -
636#else
│ │ │ │ -
637 none;
│ │ │ │ -
638#endif
│ │ │ │ -
639
│ │ │ │ -
640 template <class M, SolverType>
│ │ │ │ -
│ │ │ │ -
641 struct Solver
│ │ │ │ -
642 {
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
644 static type* create(const M& mat, bool verbose, bool reusevector )
│ │ │ │ -
645 {
│ │ │ │ -
646 DUNE_THROW(NotImplemented,"DirectSolver not selected");
│ │ │ │ -
647 return nullptr;
│ │ │ │ -
648 }
│ │ │ │ -
│ │ │ │ -
649 static std::string name () { return "None"; }
│ │ │ │ -
650 };
│ │ │ │ -
│ │ │ │ -
651#if HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
652 template <class M>
│ │ │ │ -
653 struct Solver< M, umfpack >
│ │ │ │ -
654 {
│ │ │ │ -
655 typedef UMFPack< M > type;
│ │ │ │ -
656 static type* create(const M& mat, bool verbose, bool reusevector )
│ │ │ │ -
657 {
│ │ │ │ -
658 return new type(mat, verbose, reusevector );
│ │ │ │ -
659 }
│ │ │ │ -
660 static std::string name () { return "UMFPack"; }
│ │ │ │ -
661 };
│ │ │ │ -
662#endif
│ │ │ │ -
663#if HAVE_SUPERLU
│ │ │ │ -
664 template <class M>
│ │ │ │ -
│ │ │ │ -
665 struct Solver< M, superlu >
│ │ │ │ -
666 {
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
668 static type* create(const M& mat, bool verbose, bool reusevector )
│ │ │ │ -
669 {
│ │ │ │ -
670 return new type(mat, verbose, reusevector );
│ │ │ │ -
671 }
│ │ │ │ -
│ │ │ │ -
672 static std::string name () { return "SuperLU"; }
│ │ │ │ -
673 };
│ │ │ │ -
│ │ │ │ -
674#endif
│ │ │ │ -
675
│ │ │ │ -
676 // define direct solver type to be used
│ │ │ │ - │ │ │ │ -
678 typedef typename SelectedSolver :: type DirectSolver;
│ │ │ │ -
679 static constexpr bool isDirectSolver = solver != none;
│ │ │ │ -
680 static std::string name() { return SelectedSolver :: name (); }
│ │ │ │ -
│ │ │ │ -
681 static DirectSolver* create(const Matrix& mat, bool verbose, bool reusevector )
│ │ │ │ -
682 {
│ │ │ │ -
683 return SelectedSolver :: create( mat, verbose, reusevector );
│ │ │ │ -
684 }
│ │ │ │ -
│ │ │ │ -
685 };
│ │ │ │ -
│ │ │ │ -
686
│ │ │ │ -
687 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
688 template<class C>
│ │ │ │ -
689 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion,
│ │ │ │ -
690 const std::shared_ptr<const Operator>& matrixptr,
│ │ │ │ -
691 const PI& pinfo)
│ │ │ │ -
692 {
│ │ │ │ -
693 Timer watch;
│ │ │ │ -
694 matrices_ = std::make_shared<OperatorHierarchy>(
│ │ │ │ -
695 std::const_pointer_cast<Operator>(matrixptr),
│ │ │ │ -
696 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
│ │ │ │ -
697
│ │ │ │ -
698 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
│ │ │ │ -
699
│ │ │ │ -
700 // build the necessary smoother hierarchies
│ │ │ │ -
701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
│ │ │ │ -
702
│ │ │ │ -
703 // test whether we should solve on the coarse level. That is the case if we
│ │ │ │ -
704 // have that level and if there was a redistribution on this level then our
│ │ │ │ -
705 // communicator has to be valid (size()>0) as the smoother might try to communicate
│ │ │ │ -
706 // in the constructor.
│ │ │ │ -
707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()
│ │ │ │ -
708 && ( ! matrices_->redistributeInformation().back().isSetup() ||
│ │ │ │ -
709 matrices_->parallelInformation().coarsest().getRedistributed().communicator().size() ) )
│ │ │ │ -
710 {
│ │ │ │ -
711 // We have the carsest level. Create the coarse Solver
│ │ │ │ -
712 SmootherArgs sargs(smootherArgs_);
│ │ │ │ -
713 sargs.iterations = 1;
│ │ │ │ -
714
│ │ │ │ - │ │ │ │ -
716 cargs.setArgs(sargs);
│ │ │ │ -
717 if(matrices_->redistributeInformation().back().isSetup()) {
│ │ │ │ -
718 // Solve on the redistributed partitioning
│ │ │ │ -
719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
│ │ │ │ -
720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
│ │ │ │ -
721 }else{
│ │ │ │ -
722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
│ │ │ │ -
723 cargs.setComm(*matrices_->parallelInformation().coarsest());
│ │ │ │ -
724 }
│ │ │ │ -
725
│ │ │ │ -
726 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
│ │ │ │ -
727 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
│ │ │ │ -
728
│ │ │ │ -
729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector;
│ │ │ │ -
730
│ │ │ │ -
731 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
│ │ │ │ -
732 if( SolverSelector::isDirectSolver &&
│ │ │ │ -
733 (std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
│ │ │ │ -
734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
│ │ │ │ -
735 || (matrices_->parallelInformation().coarsest().isRedistributed()
│ │ │ │ -
736 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
│ │ │ │ -
737 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0) )
│ │ │ │ -
738 )
│ │ │ │ -
739 { // redistribute and 1 proc
│ │ │ │ -
740 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ -
741 {
│ │ │ │ -
742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ -
743 {
│ │ │ │ -
744 // We are still participating on this level
│ │ │ │ -
745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
│ │ │ │ -
746 }
│ │ │ │ -
747 else
│ │ │ │ -
748 solver_.reset();
│ │ │ │ -
749 }
│ │ │ │ -
750 else
│ │ │ │ -
751 {
│ │ │ │ -
752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()->getmat(), false, false));
│ │ │ │ -
753 }
│ │ │ │ -
754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
│ │ │ │ -
755 std::cout<< "Using a direct coarse solver (" << SolverSelector::name() << ")" << std::endl;
│ │ │ │ -
756 }
│ │ │ │ -
757 else
│ │ │ │ -
758 {
│ │ │ │ -
759 if(matrices_->parallelInformation().coarsest().isRedistributed())
│ │ │ │ -
760 {
│ │ │ │ -
761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
│ │ │ │ -
762 // We are still participating on this level
│ │ │ │ -
763
│ │ │ │ -
764 // we have to allocate these types using the rebound allocator
│ │ │ │ -
765 // in order to ensure that we fulfill the alignment requirements
│ │ │ │ -
766 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
│ │ │ │ -
767 *scalarProduct_,
│ │ │ │ -
768 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ -
769 else
│ │ │ │ -
770 solver_.reset();
│ │ │ │ -
771 }else
│ │ │ │ -
772 {
│ │ │ │ -
773 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
│ │ │ │ -
774 *scalarProduct_,
│ │ │ │ -
775 *coarseSmoother_, 1E-2, 1000, 0));
│ │ │ │ -
776 // // we have to allocate these types using the rebound allocator
│ │ │ │ -
777 // // in order to ensure that we fulfill the alignment requirements
│ │ │ │ -
778 // using Alloc = typename std::allocator_traits<A>::template rebind_alloc<BiCGSTABSolver<X>>;
│ │ │ │ -
779 // Alloc alloc;
│ │ │ │ -
780 // auto p = alloc.allocate(1);
│ │ │ │ -
781 // std::allocator_traits<Alloc>::construct(alloc, p,
│ │ │ │ -
782 // const_cast<M&>(*matrices_->matrices().coarsest()),
│ │ │ │ -
783 // *scalarProduct_,
│ │ │ │ -
784 // *coarseSmoother_, 1E-2, 1000, 0);
│ │ │ │ -
785 // solver_.reset(p,[](BiCGSTABSolver<X>* p){
│ │ │ │ -
786 // Alloc alloc;
│ │ │ │ -
787 // std::allocator_traits<Alloc>::destroy(alloc, p);
│ │ │ │ -
788 // alloc.deallocate(p,1);
│ │ │ │ -
789 // });
│ │ │ │ -
790 }
│ │ │ │ -
791 }
│ │ │ │ -
792 }
│ │ │ │ -
793
│ │ │ │ -
794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
│ │ │ │ -
795 std::cout<<"Building hierarchy of "<<matrices_->maxlevels()<<" levels "
│ │ │ │ -
796 <<"(including coarse solver) took "<<watch.elapsed()<<" seconds."<<std::endl;
│ │ │ │ -
797 }
│ │ │ │ -
798
│ │ │ │ -
799
│ │ │ │ -
800 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
802 {
│ │ │ │ -
803 // Detect Matrix rows where all offdiagonal entries are
│ │ │ │ -
804 // zero and set x such that A_dd*x_d=b_d
│ │ │ │ -
805 // Thus users can be more careless when setting up their linear
│ │ │ │ -
806 // systems.
│ │ │ │ -
807 typedef typename M::matrix_type Matrix;
│ │ │ │ -
808 typedef typename Matrix::ConstRowIterator RowIter;
│ │ │ │ -
809 typedef typename Matrix::ConstColIterator ColIter;
│ │ │ │ -
810 typedef typename Matrix::block_type Block;
│ │ │ │ -
811 Block zero;
│ │ │ │ -
812 zero=typename Matrix::field_type();
│ │ │ │ -
813
│ │ │ │ -
814 const Matrix& mat=matrices_->matrices().finest()->getmat();
│ │ │ │ -
815 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ -
816 bool isDirichlet = true;
│ │ │ │ -
817 bool hasDiagonal = false;
│ │ │ │ -
818 Block diagonal{};
│ │ │ │ -
819 for(ColIter col=row->begin(); col!=row->end(); ++col) {
│ │ │ │ -
820 if(row.index()==col.index()) {
│ │ │ │ -
821 diagonal = *col;
│ │ │ │ -
822 hasDiagonal = true;
│ │ │ │ -
823 }else{
│ │ │ │ -
824 if(*col!=zero)
│ │ │ │ -
825 isDirichlet = false;
│ │ │ │ -
826 }
│ │ │ │ -
827 }
│ │ │ │ -
828 if(isDirichlet && hasDiagonal)
│ │ │ │ -
829 {
│ │ │ │ -
830 auto&& xEntry = Impl::asVector(x[row.index()]);
│ │ │ │ -
831 auto&& bEntry = Impl::asVector(b[row.index()]);
│ │ │ │ -
832 Impl::asMatrix(diagonal).solve(xEntry, bEntry);
│ │ │ │ -
833 }
│ │ │ │ -
834 }
│ │ │ │ -
835
│ │ │ │ -
836 if(smoothers_->levels()>0)
│ │ │ │ -
837 smoothers_->finest()->pre(x,b);
│ │ │ │ -
838 else
│ │ │ │ -
839 // No smoother to make x consistent! Do it by hand
│ │ │ │ -
840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
│ │ │ │ -
841 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
│ │ │ │ -
842 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ -
843 update_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
│ │ │ │ -
844 matrices_->coarsenVector(*rhs_);
│ │ │ │ -
845 matrices_->coarsenVector(*lhs_);
│ │ │ │ -
846 matrices_->coarsenVector(*update_);
│ │ │ │ -
847
│ │ │ │ -
848 // Preprocess all smoothers
│ │ │ │ -
849 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
│ │ │ │ -
850 typedef typename Hierarchy<Range,A>::Iterator RIterator;
│ │ │ │ -
851 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
│ │ │ │ -
852 Iterator coarsest = smoothers_->coarsest();
│ │ │ │ -
853 Iterator smoother = smoothers_->finest();
│ │ │ │ -
854 RIterator rhs = rhs_->finest();
│ │ │ │ -
855 DIterator lhs = lhs_->finest();
│ │ │ │ -
856 if(smoothers_->levels()>1) {
│ │ │ │ -
857
│ │ │ │ -
858 assert(lhs_->levels()==rhs_->levels());
│ │ │ │ -
859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels()==matrices_->maxlevels());
│ │ │ │ -
860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels()<matrices_->maxlevels());
│ │ │ │ -
861
│ │ │ │ -
862 if(smoother!=coarsest)
│ │ │ │ -
863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs, ++rhs)
│ │ │ │ -
864 smoother->pre(*lhs,*rhs);
│ │ │ │ -
865 smoother->pre(*lhs,*rhs);
│ │ │ │ -
866 }
│ │ │ │ -
867
│ │ │ │ -
868
│ │ │ │ -
869 // The preconditioner might change x and b. So we have to
│ │ │ │ -
870 // copy the changes to the original vectors.
│ │ │ │ -
871 x = *lhs_->finest();
│ │ │ │ -
872 b = *rhs_->finest();
│ │ │ │ -
873
│ │ │ │ -
874 }
│ │ │ │ -
│ │ │ │ -
875 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
877 {
│ │ │ │ -
878 return matrices_->levels();
│ │ │ │ -
879 }
│ │ │ │ -
│ │ │ │ -
880 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
882 {
│ │ │ │ -
883 return matrices_->maxlevels();
│ │ │ │ -
884 }
│ │ │ │ -
│ │ │ │ -
885
│ │ │ │ -
887 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
889 {
│ │ │ │ -
890 LevelContext levelContext;
│ │ │ │ -
891
│ │ │ │ -
892 if(additive) {
│ │ │ │ -
893 *(rhs_->finest())=d;
│ │ │ │ -
894 additiveMgc();
│ │ │ │ -
895 v=*lhs_->finest();
│ │ │ │ -
896 }else{
│ │ │ │ -
897 // Init all iterators for the current level
│ │ │ │ -
898 initIteratorsWithFineLevel(levelContext);
│ │ │ │ -
899
│ │ │ │ -
900
│ │ │ │ -
901 *levelContext.lhs = v;
│ │ │ │ -
902 *levelContext.rhs = d;
│ │ │ │ -
903 *levelContext.update=0;
│ │ │ │ -
904 levelContext.level=0;
│ │ │ │ -
905
│ │ │ │ -
906 mgc(levelContext);
│ │ │ │ -
907
│ │ │ │ -
908 if(postSteps_==0||matrices_->maxlevels()==1)
│ │ │ │ -
909 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
│ │ │ │ -
910
│ │ │ │ -
911 v=*levelContext.update;
│ │ │ │ -
912 }
│ │ │ │ -
913
│ │ │ │ -
914 }
│ │ │ │ -
│ │ │ │ -
915
│ │ │ │ -
916 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
917 void AMG<M,X,S,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
│ │ │ │ -
918 {
│ │ │ │ -
919 levelContext.smoother = smoothers_->finest();
│ │ │ │ -
920 levelContext.matrix = matrices_->matrices().finest();
│ │ │ │ -
921 levelContext.pinfo = matrices_->parallelInformation().finest();
│ │ │ │ -
922 levelContext.redist =
│ │ │ │ -
923 matrices_->redistributeInformation().begin();
│ │ │ │ -
924 levelContext.aggregates = matrices_->aggregatesMaps().begin();
│ │ │ │ -
925 levelContext.lhs = lhs_->finest();
│ │ │ │ -
926 levelContext.update = update_->finest();
│ │ │ │ -
927 levelContext.rhs = rhs_->finest();
│ │ │ │ -
928 }
│ │ │ │ -
929
│ │ │ │ -
930 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
931 bool AMG<M,X,S,PI,A>
│ │ │ │ -
932 ::moveToCoarseLevel(LevelContext& levelContext)
│ │ │ │ -
933 {
│ │ │ │ -
934
│ │ │ │ -
935 bool processNextLevel=true;
│ │ │ │ -
936
│ │ │ │ -
937 if(levelContext.redist->isSetup()) {
│ │ │ │ -
938 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.rhs),
│ │ │ │ -
939 levelContext.rhs.getRedistributed());
│ │ │ │ -
940 processNextLevel = levelContext.rhs.getRedistributed().size()>0;
│ │ │ │ -
941 if(processNextLevel) {
│ │ │ │ -
942 //restrict defect to coarse level right hand side.
│ │ │ │ -
943 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
│ │ │ │ -
944 ++levelContext.pinfo;
│ │ │ │ -
945 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
│ │ │ │ -
947 static_cast<const Range&>(fineRhs.getRedistributed()),
│ │ │ │ -
948 *levelContext.pinfo);
│ │ │ │ -
949 }
│ │ │ │ -
950 }else{
│ │ │ │ -
951 //restrict defect to coarse level right hand side.
│ │ │ │ -
952 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
│ │ │ │ -
953 ++levelContext.pinfo;
│ │ │ │ -
954 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
955 ::restrictVector(*(*levelContext.aggregates),
│ │ │ │ -
956 *levelContext.rhs, static_cast<const Range&>(*fineRhs),
│ │ │ │ -
957 *levelContext.pinfo);
│ │ │ │ -
958 }
│ │ │ │ -
959
│ │ │ │ -
960 if(processNextLevel) {
│ │ │ │ -
961 // prepare coarse system
│ │ │ │ -
962 ++levelContext.lhs;
│ │ │ │ -
963 ++levelContext.update;
│ │ │ │ -
964 ++levelContext.matrix;
│ │ │ │ -
965 ++levelContext.level;
│ │ │ │ -
966 ++levelContext.redist;
│ │ │ │ -
967
│ │ │ │ -
968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ -
969 // next level is not the globally coarsest one
│ │ │ │ -
970 ++levelContext.smoother;
│ │ │ │ -
971 ++levelContext.aggregates;
│ │ │ │ -
972 }
│ │ │ │ -
973 // prepare the update on the next level
│ │ │ │ -
974 *levelContext.update=0;
│ │ │ │ -
975 }
│ │ │ │ -
976 return processNextLevel;
│ │ │ │ -
977 }
│ │ │ │ -
978
│ │ │ │ -
979 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
980 void AMG<M,X,S,PI,A>
│ │ │ │ -
981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel)
│ │ │ │ -
982 {
│ │ │ │ -
983 if(processNextLevel) {
│ │ │ │ -
984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
│ │ │ │ -
985 // previous level is not the globally coarsest one
│ │ │ │ -
986 --levelContext.smoother;
│ │ │ │ -
987 --levelContext.aggregates;
│ │ │ │ -
988 }
│ │ │ │ -
989 --levelContext.redist;
│ │ │ │ -
990 --levelContext.level;
│ │ │ │ -
991 //prolongate and add the correction (update is in coarse left hand side)
│ │ │ │ -
992 --levelContext.matrix;
│ │ │ │ -
993
│ │ │ │ -
994 //typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--;
│ │ │ │ -
995 --levelContext.lhs;
│ │ │ │ -
996 --levelContext.pinfo;
│ │ │ │ -
997 }
│ │ │ │ -
998 if(levelContext.redist->isSetup()) {
│ │ │ │ -
999 // Need to redistribute during prolongateVector
│ │ │ │ -
1000 levelContext.lhs.getRedistributed()=0;
│ │ │ │ -
1001 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
│ │ │ │ -
1003 levelContext.lhs.getRedistributed(),
│ │ │ │ -
1004 matrices_->getProlongationDampingFactor(),
│ │ │ │ -
1005 *levelContext.pinfo, *levelContext.redist);
│ │ │ │ -
1006 }else{
│ │ │ │ -
1007 *levelContext.lhs=0;
│ │ │ │ -
1008 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
│ │ │ │ -
1010 matrices_->getProlongationDampingFactor(),
│ │ │ │ -
1011 *levelContext.pinfo);
│ │ │ │ -
1012 }
│ │ │ │ -
1013
│ │ │ │ -
1014
│ │ │ │ -
1015 if(processNextLevel) {
│ │ │ │ -
1016 --levelContext.update;
│ │ │ │ -
1017 --levelContext.rhs;
│ │ │ │ -
1018 }
│ │ │ │ -
1019
│ │ │ │ -
1020 *levelContext.update += *levelContext.lhs;
│ │ │ │ -
1021 }
│ │ │ │ -
1022
│ │ │ │ -
1023 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1025 {
│ │ │ │ - │ │ │ │ -
1027 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
1028
│ │ │ │ -
1029 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
1030 void AMG<M,X,S,PI,A>::mgc(LevelContext& levelContext){
│ │ │ │ -
1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
│ │ │ │ -
1032 // Solve directly
│ │ │ │ - │ │ │ │ -
1034 res.converged=true; // If we do not compute this flag will not get updated
│ │ │ │ -
1035 if(levelContext.redist->isSetup()) {
│ │ │ │ -
1036 levelContext.redist->redistribute(*levelContext.rhs, levelContext.rhs.getRedistributed());
│ │ │ │ -
1037 if(levelContext.rhs.getRedistributed().size()>0) {
│ │ │ │ -
1038 // We are still participating in the computation
│ │ │ │ -
1039 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
│ │ │ │ -
1040 levelContext.rhs.getRedistributed());
│ │ │ │ -
1041 solver_->apply(levelContext.update.getRedistributed(),
│ │ │ │ -
1042 levelContext.rhs.getRedistributed(), res);
│ │ │ │ -
1043 }
│ │ │ │ -
1044 levelContext.redist->redistributeBackward(*levelContext.update, levelContext.update.getRedistributed());
│ │ │ │ -
1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
│ │ │ │ -
1046 }else{
│ │ │ │ -
1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs);
│ │ │ │ -
1048 solver_->apply(*levelContext.update, *levelContext.rhs, res);
│ │ │ │ -
1049 }
│ │ │ │ -
1050
│ │ │ │ -
1051 if (!res.converged)
│ │ │ │ -
1052 coarsesolverconverged = false;
│ │ │ │ -
1053 }else{
│ │ │ │ -
1054 // presmoothing
│ │ │ │ -
1055 presmooth(levelContext, preSteps_);
│ │ │ │ -
1056
│ │ │ │ -
1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
│ │ │ │ -
1058 bool processNextLevel = moveToCoarseLevel(levelContext);
│ │ │ │ -
1059
│ │ │ │ -
1060 if(processNextLevel) {
│ │ │ │ -
1061 // next level
│ │ │ │ -
1062 for(std::size_t i=0; i<gamma_; i++){
│ │ │ │ -
1063 mgc(levelContext);
│ │ │ │ -
1064 if (levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels())
│ │ │ │ -
1065 break;
│ │ │ │ -
1066 if(i+1 < gamma_){
│ │ │ │ -
1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs, *levelContext.rhs);
│ │ │ │ -
1068 }
│ │ │ │ -
1069 }
│ │ │ │ -
1070 }
│ │ │ │ -
1071
│ │ │ │ -
1072 moveToFineLevel(levelContext, processNextLevel);
│ │ │ │ -
1073#else
│ │ │ │ -
1074 *lhs=0;
│ │ │ │ -
1075#endif
│ │ │ │ -
1076
│ │ │ │ -
1077 if(levelContext.matrix == matrices_->matrices().finest()) {
│ │ │ │ -
1078 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
│ │ │ │ -
1079 if(!coarsesolverconverged)
│ │ │ │ -
1080 DUNE_THROW(MathError, "Coarse solver did not converge");
│ │ │ │ -
1081 }
│ │ │ │ -
1082 // postsmoothing
│ │ │ │ -
1083 postsmooth(levelContext, postSteps_);
│ │ │ │ -
1084
│ │ │ │ -
1085 }
│ │ │ │ -
1086 }
│ │ │ │ -
1087
│ │ │ │ -
1088 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
1089 void AMG<M,X,S,PI,A>::additiveMgc(){
│ │ │ │ -
1090
│ │ │ │ -
1091 // restrict residual to all levels
│ │ │ │ -
1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_->parallelInformation().finest();
│ │ │ │ -
1093 typename Hierarchy<Range,A>::Iterator rhs=rhs_->finest();
│ │ │ │ -
1094 typename Hierarchy<Domain,A>::Iterator lhs = lhs_->finest();
│ │ │ │ -
1095 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates=matrices_->aggregatesMaps().begin();
│ │ │ │ -
1096
│ │ │ │ -
1097 for(typename Hierarchy<Range,A>::Iterator fineRhs=rhs++; fineRhs != rhs_->coarsest(); fineRhs=rhs++, ++aggregates) {
│ │ │ │ -
1098 ++pinfo;
│ │ │ │ -
1099 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
1100 ::restrictVector(*(*aggregates), *rhs, static_cast<const Range&>(*fineRhs), *pinfo);
│ │ │ │ -
1101 }
│ │ │ │ -
1102
│ │ │ │ -
1103 // pinfo is invalid, set to coarsest level
│ │ │ │ -
1104 //pinfo = matrices_->parallelInformation().coarsest
│ │ │ │ -
1105 // calculate correction for all levels
│ │ │ │ -
1106 lhs = lhs_->finest();
│ │ │ │ -
1107 typename Hierarchy<Smoother,A>::Iterator smoother = smoothers_->finest();
│ │ │ │ -
1108
│ │ │ │ -
1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother) {
│ │ │ │ -
1110 // presmoothing
│ │ │ │ -
1111 *lhs=0;
│ │ │ │ -
1112 smoother->apply(*lhs, *rhs);
│ │ │ │ -
1113 }
│ │ │ │ -
1114
│ │ │ │ -
1115 // Coarse level solve
│ │ │ │ -
1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
│ │ │ │ -
1117 InverseOperatorResult res;
│ │ │ │ -
1118 pinfo->copyOwnerToAll(*rhs, *rhs);
│ │ │ │ -
1119 solver_->apply(*lhs, *rhs, res);
│ │ │ │ -
1120
│ │ │ │ -
1121 if(!res.converged)
│ │ │ │ -
1122 DUNE_THROW(MathError, "Coarse solver did not converge");
│ │ │ │ -
1123#else
│ │ │ │ -
1124 *lhs=0;
│ │ │ │ -
1125#endif
│ │ │ │ -
1126 // Prologate and add up corrections from all levels
│ │ │ │ -
1127 --pinfo;
│ │ │ │ -
1128 --aggregates;
│ │ │ │ -
1129
│ │ │ │ -
1130 for(typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--; coarseLhs != lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) {
│ │ │ │ -
1131 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
│ │ │ │ -
1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo);
│ │ │ │ -
1133 }
│ │ │ │ -
1134 }
│ │ │ │ -
1135
│ │ │ │ -
1136
│ │ │ │ -
1138 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
│ │ │ │ -
1139 void AMG<M,X,S,PI,A>::post([[maybe_unused]] Domain& x)
│ │ │ │ -
1140 {
│ │ │ │ -
1141 // Postprocess all smoothers
│ │ │ │ -
1142 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
│ │ │ │ -
1143 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
│ │ │ │ -
1144 Iterator coarsest = smoothers_->coarsest();
│ │ │ │ -
1145 Iterator smoother = smoothers_->finest();
│ │ │ │ -
1146 DIterator lhs = lhs_->finest();
│ │ │ │ -
1147 if(smoothers_->levels()>0) {
│ │ │ │ -
1148 if(smoother != coarsest || matrices_->levels()<matrices_->maxlevels())
│ │ │ │ -
1149 smoother->post(*lhs);
│ │ │ │ -
1150 if(smoother!=coarsest)
│ │ │ │ -
1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs)
│ │ │ │ -
1152 smoother->post(*lhs);
│ │ │ │ -
1153 smoother->post(*lhs);
│ │ │ │ -
1154 }
│ │ │ │ -
1155 lhs_ = nullptr;
│ │ │ │ -
1156 update_ = nullptr;
│ │ │ │ -
1157 rhs_ = nullptr;
│ │ │ │ -
1158 }
│ │ │ │ -
│ │ │ │ -
1159
│ │ │ │ -
1160 template<class M, class X, class S, class PI, class A>
│ │ │ │ -
1161 template<class A1>
│ │ │ │ -
│ │ │ │ -
1162 void AMG<M,X,S,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
│ │ │ │ -
1163 {
│ │ │ │ -
1164 matrices_->getCoarsestAggregatesOnFinest(cont);
│ │ │ │ -
1165 }
│ │ │ │ -
│ │ │ │ -
1166
│ │ │ │ -
1167 } // end namespace Amg
│ │ │ │ -
1168
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1170 template<class> struct isValidBlockType : std::false_type{};
│ │ │ │ -
1171 template<class T, int n, int m> struct isValidBlockType<FieldMatrix<T,n,m>> : std::true_type{};
│ │ │ │ -
1172
│ │ │ │ -
1173 template<class OP>
│ │ │ │ -
1174 std::shared_ptr<Dune::Preconditioner<typename OP::element_type::domain_type, typename OP::element_type::range_type> >
│ │ │ │ -
│ │ │ │ -
1175 makeAMG(const OP& op, const std::string& smoother, const Dune::ParameterTree& config) const
│ │ │ │ -
1176 {
│ │ │ │ -
1177 DUNE_THROW(Dune::Exception, "Operator type not supported by AMG");
│ │ │ │ -
1178 }
│ │ │ │ -
│ │ │ │ -
1179
│ │ │ │ -
1180 template<class M, class X, class Y>
│ │ │ │ -
1181 std::shared_ptr<Dune::Preconditioner<X,Y> >
│ │ │ │ -
│ │ │ │ -
1182 makeAMG(const std::shared_ptr<MatrixAdapter<M,X,Y>>& op, const std::string& smoother,
│ │ │ │ -
1183 const Dune::ParameterTree& config) const
│ │ │ │ -
1184 {
│ │ │ │ -
1185 using OP = MatrixAdapter<M,X,Y>;
│ │ │ │ -
1186
│ │ │ │ -
1187 if(smoother == "ssor")
│ │ │ │ -
1188 return std::make_shared<Amg::AMG<OP, X, SeqSSOR<M,X,Y>>>(op, config);
│ │ │ │ -
1189 if(smoother == "sor")
│ │ │ │ -
1190 return std::make_shared<Amg::AMG<OP, X, SeqSOR<M,X,Y>>>(op, config);
│ │ │ │ -
1191 if(smoother == "jac")
│ │ │ │ -
1192 return std::make_shared<Amg::AMG<OP, X, SeqJac<M,X,Y>>>(op, config);
│ │ │ │ -
1193 if(smoother == "gs")
│ │ │ │ -
1194 return std::make_shared<Amg::AMG<OP, X, SeqGS<M,X,Y>>>(op, config);
│ │ │ │ -
1195 if(smoother == "ilu")
│ │ │ │ -
1196 return std::make_shared<Amg::AMG<OP, X, SeqILU<M,X,Y>>>(op, config);
│ │ │ │ -
1197 else
│ │ │ │ -
1198 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
│ │ │ │ -
1199 }
│ │ │ │ -
│ │ │ │ -
1200
│ │ │ │ -
1201 template<class M, class X, class Y, class C>
│ │ │ │ -
1202 std::shared_ptr<Dune::Preconditioner<X,Y> >
│ │ │ │ -
│ │ │ │ -
1203 makeAMG(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
│ │ │ │ -
1204 const Dune::ParameterTree& config) const
│ │ │ │ -
1205 {
│ │ │ │ - │ │ │ │ -
1207
│ │ │ │ -
1208 auto cop = std::static_pointer_cast<const OP>(op);
│ │ │ │ -
1209
│ │ │ │ -
1210 if(smoother == "ssor")
│ │ │ │ -
1211 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ -
1212 if(smoother == "sor")
│ │ │ │ -
1213 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ -
1214 if(smoother == "jac")
│ │ │ │ -
1215 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqJac<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ -
1216 if(smoother == "gs")
│ │ │ │ -
1217 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqGS<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ -
1218 if(smoother == "ilu")
│ │ │ │ -
1219 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqILU<M,X,Y>>,C>>(cop, config, op->getCommunication());
│ │ │ │ -
1220 else
│ │ │ │ -
1221 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
│ │ │ │ -
1222 }
│ │ │ │ -
│ │ │ │ -
1223
│ │ │ │ -
1224 template<class M, class X, class Y, class C>
│ │ │ │ -
1225 std::shared_ptr<Dune::Preconditioner<X,Y> >
│ │ │ │ -
│ │ │ │ -
1226 makeAMG(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
│ │ │ │ -
1227 const Dune::ParameterTree& config) const
│ │ │ │ -
1228 {
│ │ │ │ - │ │ │ │ -
1230
│ │ │ │ -
1231 if(smoother == "ssor")
│ │ │ │ -
1232 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ -
1233 if(smoother == "sor")
│ │ │ │ -
1234 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ -
1235 if(smoother == "jac")
│ │ │ │ -
1236 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqJac<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ -
1237 if(smoother == "gs")
│ │ │ │ -
1238 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqGS<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ -
1239 if(smoother == "ilu")
│ │ │ │ -
1240 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqILU<M,X,Y>>,C>>(op, config, op->getCommunication());
│ │ │ │ -
1241 else
│ │ │ │ -
1242 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
│ │ │ │ -
1243 }
│ │ │ │ -
│ │ │ │ -
1244
│ │ │ │ -
1245 template<typename TL, typename OP>
│ │ │ │ -
1246 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
1247 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
│ │ │ │ -
1248 operator() (TL tl, const std::shared_ptr<OP>& op, const Dune::ParameterTree& config,
│ │ │ │ - │ │ │ │ -
1250 {
│ │ │ │ -
1251 using field_type = typename OP::matrix_type::field_type;
│ │ │ │ -
1252 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
1253 if (!std::is_convertible<field_type, real_type>())
│ │ │ │ -
1254 DUNE_THROW(UnsupportedType, "AMG needs field_type(" <<
│ │ │ │ -
1255 className<field_type>() <<
│ │ │ │ -
1256 ") to be convertible to its real_type (" <<
│ │ │ │ -
1257 className<real_type>() <<
│ │ │ │ -
1258 ").");
│ │ │ │ -
1259 using D = typename Dune::TypeListElement<1, decltype(tl)>::type;
│ │ │ │ -
1260 using R = typename Dune::TypeListElement<2, decltype(tl)>::type;
│ │ │ │ -
1261 std::shared_ptr<Preconditioner<D,R>> amg;
│ │ │ │ -
1262 std::string smoother = config.get("smoother", "ssor");
│ │ │ │ -
1263 return makeAMG(op, smoother, config);
│ │ │ │ -
1264 }
│ │ │ │ -
│ │ │ │ -
1265
│ │ │ │ -
1266 template<typename TL, typename OP>
│ │ │ │ -
1267 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ -
1268 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ -
│ │ │ │ -
1269 operator() (TL /*tl*/, const std::shared_ptr<OP>& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ - │ │ │ │ -
1271 {
│ │ │ │ -
1272 DUNE_THROW(UnsupportedType, "AMG needs a FieldMatrix as Matrix block_type");
│ │ │ │ -
1273 }
│ │ │ │ -
│ │ │ │ -
1274 };
│ │ │ │ -
│ │ │ │ -
1275
│ │ │ │ - │ │ │ │ -
1277} // end namespace Dune
│ │ │ │ -
1278
│ │ │ │ -
1279#endif
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
Classes for using SuperLU with ISTL matrices.
│ │ │ │ -
#define DUNE_REGISTER_PRECONDITIONER(name,...)
Definition solverregistry.hh:16
│ │ │ │ -
Define base class for scalar product and norm.
│ │ │ │ -
Classes for using UMFPack with ISTL matrices.
│ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ -
Prolongation and restriction for amg.
│ │ │ │ -
Provides a classes representing the hierarchies in AMG.
│ │ │ │ -
Classes for the generic construction and application of the smoothers.
│ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_ISTL_SOLVERFACTORY_HH
│ │ │ │ +
7#define DUNE_ISTL_SOLVERFACTORY_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <unordered_map>
│ │ │ │ +
10#include <functional>
│ │ │ │ +
11#include <memory>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/parametertree.hh>
│ │ │ │ +
14#include <dune/common/singleton.hh>
│ │ │ │ +
15
│ │ │ │ +
16#include "solverregistry.hh"
│ │ │ │ +
17#include <dune/istl/solver.hh>
│ │ │ │ +
18#include <dune/istl/schwarz.hh>
│ │ │ │ + │ │ │ │ +
20
│ │ │ │ +
21namespace Dune{
│ │ │ │ +
26 // Direct solver factory:
│ │ │ │ +
27 template<class M, class X, class Y>
│ │ │ │ +
28 using DirectSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(const M&, const ParameterTree&);
│ │ │ │ +
29 template<class M, class X, class Y>
│ │ │ │ +
30 using DirectSolverFactory = Singleton<ParameterizedObjectFactory<DirectSolverSignature<M,X,Y>>>;
│ │ │ │ +
31
│ │ │ │ +
32 // Preconditioner factory:
│ │ │ │ +
33 template<class M, class X, class Y>
│ │ │ │ +
34 using PreconditionerSignature = std::shared_ptr<Preconditioner<X,Y>>(const std::shared_ptr<M>&, const ParameterTree&);
│ │ │ │ +
35 template<class M, class X, class Y>
│ │ │ │ +
36 using PreconditionerFactory = Singleton<ParameterizedObjectFactory<PreconditionerSignature<M,X,Y>>>;
│ │ │ │ +
37
│ │ │ │ +
38 // Iterative solver factory
│ │ │ │ +
39 template<class X, class Y>
│ │ │ │ +
40 using IterativeSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(const std::shared_ptr<LinearOperator<X,Y>>&, const std::shared_ptr<ScalarProduct<X>>&, const std::shared_ptr<Preconditioner<X,Y>>, const ParameterTree&);
│ │ │ │ +
41 template<class X, class Y>
│ │ │ │ +
42 using IterativeSolverFactory = Singleton<ParameterizedObjectFactory<IterativeSolverSignature<X,Y>>>;
│ │ │ │ +
43
│ │ │ │ +
44 // initSolverFactories differs in different compilation units, so we have it
│ │ │ │ +
45 // in an anonymous namespace
│ │ │ │ +
46 namespace {
│ │ │ │ +
47
│ │ │ │ +
53 template<class O>
│ │ │ │ +
54 int initSolverFactories(){
│ │ │ │ +
55 using M = typename O::matrix_type;
│ │ │ │ +
56 using X = typename O::range_type;
│ │ │ │ +
57 using Y = typename O::domain_type;
│ │ │ │ +
58 using TL = Dune::TypeList<M,X,Y>;
│ │ │ │ + │ │ │ │ +
60 addRegistryToFactory<TL>(dsfac, DirectSolverTag{});
│ │ │ │ + │ │ │ │ +
62 addRegistryToFactory<TL>(pfac, PreconditionerTag{});
│ │ │ │ +
63 using TLS = Dune::TypeList<X,Y>;
│ │ │ │ + │ │ │ │ +
65 return addRegistryToFactory<TLS>(isfac, IterativeSolverTag{});
│ │ │ │ +
66 }
│ │ │ │ +
77 template<class O, class X, class Y>
│ │ │ │ +
78 [[deprecated("Use method 'initSolverFactories<O>' instead")]]
│ │ │ │ +
79 int initSolverFactories() {
│ │ │ │ +
80 return initSolverFactories<O>();
│ │ │ │ +
81 }
│ │ │ │ +
82 } // end anonymous namespace
│ │ │ │ +
83
│ │ │ │ +
84
│ │ │ │ +
85 template<class O, class Preconditioner>
│ │ │ │ +
│ │ │ │ +
86 std::shared_ptr<Preconditioner> wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
│ │ │ │ +
87 const O&)
│ │ │ │ +
88 {
│ │ │ │ +
89 return prec;
│ │ │ │ +
90 }
│ │ │ │ +
│ │ │ │ +
91
│ │ │ │ +
92 template<class M, class X, class Y, class C, class Preconditioner>
│ │ │ │ +
93 std::shared_ptr<Preconditioner>
│ │ │ │ +
│ │ │ │ +
94 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
│ │ │ │ +
95 const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ +
96 {
│ │ │ │ +
97 return std::make_shared<BlockPreconditioner<X,Y,C,Preconditioner> >(prec, op->getCommunication());
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
100 template<class M, class X, class Y, class C, class Preconditioner>
│ │ │ │ +
101 std::shared_ptr<Preconditioner>
│ │ │ │ +
│ │ │ │ +
102 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
│ │ │ │ +
103 const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ +
104 {
│ │ │ │ +
105 return std::make_shared<NonoverlappingBlockPreconditioner<C,Preconditioner> >(prec, op->getCommunication());
│ │ │ │ +
106 }
│ │ │ │ +
│ │ │ │ +
107
│ │ │ │ +
108 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
109 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<MatrixAdapter<M,X,Y> >&)
│ │ │ │ +
110 {
│ │ │ │ +
111 return std::make_shared<SeqScalarProduct<X>>();
│ │ │ │ +
112 }
│ │ │ │ +
│ │ │ │ +
113 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ +
114 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ +
115 {
│ │ │ │ +
116 return createScalarProduct<X>(op->getCommunication(), op->category());
│ │ │ │ +
117 }
│ │ │ │ +
│ │ │ │ +
118
│ │ │ │ +
119 template<class M, class X, class Y, class C>
│ │ │ │ +
│ │ │ │ +
120 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ +
121 {
│ │ │ │ +
122 return createScalarProduct<X>(op->getCommunication(), op->category());
│ │ │ │ +
123 }
│ │ │ │ +
│ │ │ │ +
124
│ │ │ │ +
144 template<class Operator>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
146 using Domain = typename Operator::domain_type;
│ │ │ │ +
147 using Range = typename Operator::range_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
150
│ │ │ │ +
151 template<class O>
│ │ │ │ +
152 using _matrix_type = typename O::matrix_type;
│ │ │ │ +
153 using matrix_type = Std::detected_or_t<int, _matrix_type, Operator>;
│ │ │ │ +
154 static constexpr bool isAssembled = !std::is_same<matrix_type, int>::value;
│ │ │ │ +
155
│ │ │ │ +
156 static const matrix_type* getmat(std::shared_ptr<Operator> op){
│ │ │ │ +
157 std::shared_ptr<AssembledLinearOperator<matrix_type, Domain, Range>> aop
│ │ │ │ +
158 = std::dynamic_pointer_cast<AssembledLinearOperator<matrix_type, Domain, Range>>(op);
│ │ │ │ +
159 if(aop)
│ │ │ │ +
160 return &aop->getmat();
│ │ │ │ +
161 return nullptr;
│ │ │ │ +
162 }
│ │ │ │ +
163
│ │ │ │ +
164 public:
│ │ │ │ +
165
│ │ │ │ +
│ │ │ │ +
168 static std::shared_ptr<Solver> get(std::shared_ptr<Operator> op,
│ │ │ │ +
169 const ParameterTree& config,
│ │ │ │ +
170 std::shared_ptr<Preconditioner> prec = nullptr){
│ │ │ │ +
171 std::string type = config.get<std::string>("type");
│ │ │ │ +
172 std::shared_ptr<Solver> result;
│ │ │ │ +
173 const matrix_type* mat = getmat(op);
│ │ │ │ +
174 if(mat){
│ │ │ │ + │ │ │ │ +
176 if(op->category()!=SolverCategory::sequential){
│ │ │ │ +
177 DUNE_THROW(NotImplemented, "The solver factory does not support parallel direct solvers!");
│ │ │ │ +
178 }
│ │ │ │ +
179 result = DirectSolverFactory<matrix_type, Domain, Range>::instance().create(type, *mat, config);
│ │ │ │ +
180 return result;
│ │ │ │ +
181 }
│ │ │ │ +
182 }
│ │ │ │ +
183 // if no direct solver is found it might be an iterative solver
│ │ │ │ + │ │ │ │ +
185 DUNE_THROW(Dune::InvalidStateException, "Solver not found in the factory.");
│ │ │ │ +
186 }
│ │ │ │ +
187 if(!prec){
│ │ │ │ +
188 const ParameterTree& precConfig = config.sub("preconditioner");
│ │ │ │ +
189 std::string prec_type = precConfig.get<std::string>("type");
│ │ │ │ +
190 prec = PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, precConfig);
│ │ │ │ +
191 if (prec->category() != op->category() && prec->category() == SolverCategory::sequential)
│ │ │ │ +
192 // try to wrap to a parallel preconditioner
│ │ │ │ +
193 prec = wrapPreconditioner4Parallel(prec, op);
│ │ │ │ +
194 }
│ │ │ │ +
195 std::shared_ptr<ScalarProduct<Domain>> sp = createScalarProduct(op);
│ │ │ │ +
196 result = IterativeSolverFactory<Domain, Range>::instance().create(type, op, sp, prec, config);
│ │ │ │ +
197 return result;
│ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │ +
199
│ │ │ │ +
│ │ │ │ +
203 static std::shared_ptr<Preconditioner> getPreconditioner(std::shared_ptr<Operator> op,
│ │ │ │ +
204 const ParameterTree& config){
│ │ │ │ +
205 const matrix_type* mat = getmat(op);
│ │ │ │ +
206 if(mat){
│ │ │ │ +
207 std::string prec_type = config.get<std::string>("type");
│ │ │ │ +
208 return PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, config);
│ │ │ │ +
209 }else{
│ │ │ │ +
210 DUNE_THROW(InvalidStateException, "Could not obtain matrix from operator. Please pass in an AssembledLinearOperator.");
│ │ │ │ +
211 }
│ │ │ │ +
212 }
│ │ │ │ +
│ │ │ │ +
213 };
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
225 template<class Operator>
│ │ │ │ +
226 std::shared_ptr<InverseOperator<typename Operator::domain_type,
│ │ │ │ +
│ │ │ │ +
227 typename Operator::range_type>> getSolverFromFactory(std::shared_ptr<Operator> op,
│ │ │ │ +
228 const ParameterTree& config,
│ │ │ │ +
229 std::shared_ptr<Preconditioner<typename Operator::domain_type,
│ │ │ │ +
230 typename Operator::range_type>> prec = nullptr){
│ │ │ │ +
231 return SolverFactory<Operator>::get(op, config, prec);
│ │ │ │ +
232 }
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
237} // end namespace Dune
│ │ │ │ +
238
│ │ │ │ +
239
│ │ │ │ +
240#endif
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Define general, extensible interface for inverse operators.
│ │ │ │
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
AMG(const AMG &amg)
Copy constructor.
Definition amg.hh:392
│ │ │ │ -
void pre(Domain &x, Range &b)
Prepare the preconditioner.
Definition amg.hh:801
│ │ │ │ -
static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector)
Definition amg.hh:681
│ │ │ │ -
static std::string name()
Definition amg.hh:680
│ │ │ │ -
Hierarchy< Domain, A >::Iterator update
The iterator over the updates.
Definition amg.hh:303
│ │ │ │ -
Hierarchy< Range, A >::Iterator rhs
The iterator over the right hand sided.
Definition amg.hh:307
│ │ │ │ -
static std::string name()
Definition amg.hh:672
│ │ │ │ -
bool usesDirectCoarseLevelSolver() const
Check whether the coarse solver used is a direct solver.
Definition amg.hh:1024
│ │ │ │ -
X Domain
The domain type.
Definition amg.hh:87
│ │ │ │ -
static type * create(const M &mat, bool verbose, bool reusevector)
Definition amg.hh:644
│ │ │ │ -
AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs &smootherArgs, const Parameters &parms)
Construct a new amg with a specific coarse solver.
Definition amg.hh:406
│ │ │ │ -
AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree &configuration, const ParallelInformation &pinfo=ParallelInformation())
Constructor an AMG via ParameterTree.
Definition amg.hh:452
│ │ │ │ -
ParallelInformationHierarchy::Iterator pinfo
The iterator over the parallel information.
Definition amg.hh:287
│ │ │ │ -
SolverType
Definition amg.hh:627
│ │ │ │ -
OperatorHierarchy::AggregatesMapList::const_iterator aggregates
The iterator over the aggregates maps.
Definition amg.hh:295
│ │ │ │ -
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition amg.hh:100
│ │ │ │ -
Solver< Matrix, solver > SelectedSolver
Definition amg.hh:677
│ │ │ │ -
std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< MatrixAdapter< M, X, Y > > &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1182
│ │ │ │ -
std::string operator()(const std::string &str)
Definition amg.hh:378
│ │ │ │ -
std::shared_ptr< Dune::Preconditioner< typename OP::element_type::domain_type, typename OP::element_type::range_type > > makeAMG(const OP &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1175
│ │ │ │ -
S Smoother
The type of the smoother.
Definition amg.hh:97
│ │ │ │ -
static std::string name()
Definition amg.hh:649
│ │ │ │ -
Hierarchy< Smoother, A >::Iterator smoother
The iterator over the smoothers.
Definition amg.hh:279
│ │ │ │ -
M Operator
The matrix operator type.
Definition amg.hh:73
│ │ │ │ -
OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
The iterator over the matrices.
Definition amg.hh:283
│ │ │ │ - │ │ │ │ -
static type * create(const M &mat, bool verbose, bool reusevector)
Definition amg.hh:668
│ │ │ │ -
OperatorHierarchy::RedistributeInfoList::const_iterator redist
The iterator over the redistribution information.
Definition amg.hh:291
│ │ │ │ -
X Range
The range type.
Definition amg.hh:89
│ │ │ │ -
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition smoother.hh:406
│ │ │ │ -
void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
Get the aggregate number of each unknown on the coarsest level.
Definition amg.hh:1162
│ │ │ │ -
std::size_t levels()
Definition amg.hh:876
│ │ │ │ -
InverseOperator< Vector, Vector > type
Definition amg.hh:643
│ │ │ │ -
std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1203
│ │ │ │ -
Hierarchy< Domain, A >::Iterator lhs
The iterator over the left hand side.
Definition amg.hh:299
│ │ │ │ -
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition construction.hh:44
│ │ │ │ -
static constexpr SolverType solver
Definition amg.hh:629
│ │ │ │ -
static std::shared_ptr< T > construct(Arguments &args)
Construct an object with the specified arguments.
Definition construction.hh:52
│ │ │ │ -
static constexpr bool isDirectSolver
Definition amg.hh:679
│ │ │ │ -
void recalculateHierarchy()
Recalculate the matrix hierarchy.
Definition amg.hh:221
│ │ │ │ -
Matrix::field_type field_type
Definition amg.hh:626
│ │ │ │ -
SelectedSolver::type DirectSolver
Definition amg.hh:678
│ │ │ │ -
std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL tl, const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std::enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value, int >=0) const
Definition amg.hh:1248
│ │ │ │ -
OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
The parallal data distribution hierarchy type.
Definition amg.hh:84
│ │ │ │ -
InverseOperator< X, X > CoarseSolver
the type of the coarse solver.
Definition amg.hh:91
│ │ │ │ -
void post(Domain &x)
Clean up.
Definition amg.hh:1139
│ │ │ │ -
std::size_t maxlevels()
Definition amg.hh:881
│ │ │ │ -
std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, const Dune::ParameterTree &config) const
Definition amg.hh:1226
│ │ │ │ -
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition smoother.hh:428
│ │ │ │ -
std::size_t level
The level index.
Definition amg.hh:311
│ │ │ │ -
AMG(const Operator &fineOperator, const C &criterion, const SmootherArgs &smootherArgs=SmootherArgs(), const ParallelInformation &pinfo=ParallelInformation())
Construct an AMG with an inexact coarse solver based on the smoother.
Definition amg.hh:428
│ │ │ │ -
void apply(Domain &v, const Range &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition amg.hh:888
│ │ │ │ -
Smoother SmootherType
Definition amg.hh:275
│ │ │ │ -
MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
The operator hierarchy type.
Definition amg.hh:82
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition amg.hh:194
│ │ │ │ -
PI ParallelInformation
The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
Definition amg.hh:80
│ │ │ │ -
@ none
Definition amg.hh:627
│ │ │ │ -
@ umfpack
Definition amg.hh:627
│ │ │ │ -
@ superlu
Definition amg.hh:627
│ │ │ │ -
@ atOnceAccu
Accumulate data to one process at once.
Definition parameters.hh:244
│ │ │ │ -
@ noAccu
No data accumulution.
Definition parameters.hh:238
│ │ │ │ -
@ successiveAccu
Successively accumulate to fewer processes.
Definition parameters.hh:248
│ │ │ │ +
Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > PreconditionerFactory
Definition solverfactory.hh:36
│ │ │ │ +
Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > DirectSolverFactory
Definition solverfactory.hh:30
│ │ │ │ +
std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &) IterativeSolverSignature
Definition solverfactory.hh:40
│ │ │ │ +
std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::shared_ptr< Preconditioner > &prec, const O &)
Definition solverfactory.hh:86
│ │ │ │ +
std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) DirectSolverSignature
Definition solverfactory.hh:28
│ │ │ │ +
std::shared_ptr< InverseOperator< typename Operator::domain_type, typename Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner< typename Operator::domain_type, typename Operator::range_type > > prec=nullptr)
Instantiates an InverseOperator from an Operator and a configuration given as a ParameterTree.
Definition solverfactory.hh:227
│ │ │ │ +
Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > IterativeSolverFactory
Definition solverfactory.hh:42
│ │ │ │ +
std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &) PreconditionerSignature
Definition solverfactory.hh:34
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ -
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ -
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ +
std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
Definition scalarproducts.hh:242
│ │ │ │
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ -
Norm that uses only the [N][N] entry of the block to determine couplings.
Definition aggregates.hh:379
│ │ │ │ -
Functor using the row sum (infinity) norm to determine strong couplings.
Definition aggregates.hh:463
│ │ │ │ -
Definition aggregates.hh:480
│ │ │ │ -
Definition aggregates.hh:496
│ │ │ │ -
Criterion taking advantage of symmetric matrices.
Definition aggregates.hh:519
│ │ │ │ -
Criterion suitable for unsymmetric matrices.
Definition aggregates.hh:539
│ │ │ │ -
an algebraic multigrid method using a Krylov-cycle.
Definition kamg.hh:140
│ │ │ │ -
Two grid operator for AMG with Krylov cycle.
Definition kamg.hh:33
│ │ │ │ -
Parallel algebraic multigrid based on agglomeration.
Definition amg.hh:65
│ │ │ │ -
Definition amg.hh:625
│ │ │ │ - │ │ │ │ -
Definition amg.hh:1169
│ │ │ │ - │ │ │ │
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ - │ │ │ │ -
LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
Type of the mutable iterator.
Definition hierarchy.hh:216
│ │ │ │ -
Iterator over the levels in the hierarchy.
Definition hierarchy.hh:120
│ │ │ │ -
The hierarchies build by the coarsening process.
Definition matrixhierarchy.hh:61
│ │ │ │ -
The criterion describing the stop criteria for the coarsening process.
Definition matrixhierarchy.hh:283
│ │ │ │ -
All parameters for AMG.
Definition parameters.hh:393
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
The default class for the smoother arguments.
Definition smoother.hh:38
│ │ │ │
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition preconditioner.hh:39
│ │ │ │ -
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ -
Definition solvercategory.hh:54
│ │ │ │ -
Definition solverregistry.hh:77
│ │ │ │ -
Definition solvertype.hh:16
│ │ │ │ -
SuperLu Solver.
Definition superlu.hh:271
│ │ │ │ -
Definition umfpack.hh:49
│ │ │ │ -
The UMFPack direct sparse solver.
Definition umfpack.hh:335
│ │ │ │ + │ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
Factory to assembly solvers configured by a ParameterTree.
Definition solverfactory.hh:145
│ │ │ │ +
static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr)
get a solver from the factory
Definition solverfactory.hh:168
│ │ │ │ +
static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< Operator > op, const ParameterTree &config)
Construct a Preconditioner for a given Operator.
Definition solverfactory.hh:203
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1597 +1,303 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _p_a_a_m_g │ │ │ │ │ -amg.hh │ │ │ │ │ +solverfactory.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_AMG_AMG_HH │ │ │ │ │ -6#define DUNE_AMG_AMG_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_s_m_o_o_t_h_e_r_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_t_r_a_n_s_f_e_r_._h_h> │ │ │ │ │ -13#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_i_s_t_l_/_s_u_p_e_r_l_u_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_i_s_t_l_/_u_m_f_p_a_c_k_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ -24 │ │ │ │ │ -25namespace _D_u_n_e │ │ │ │ │ -26{ │ │ │ │ │ -27 namespace Amg │ │ │ │ │ -28 { │ │ │ │ │ -46 template │ │ │ │ │ -47 class KAMG; │ │ │ │ │ -48 │ │ │ │ │ -49 template │ │ │ │ │ -50 class KAmgTwoGrid; │ │ │ │ │ -51 │ │ │ │ │ -62 template > │ │ │ │ │ -_6_4 class _A_M_G : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -65 { │ │ │ │ │ -66 template │ │ │ │ │ -_6_7 friend class _K_A_M_G; │ │ │ │ │ -68 │ │ │ │ │ -69 friend class _K_A_m_g_T_w_o_G_r_i_d<_A_M_G>; │ │ │ │ │ -70 │ │ │ │ │ -71 public: │ │ │ │ │ -_7_3 typedef M _O_p_e_r_a_t_o_r; │ │ │ │ │ -_8_0 typedef PI _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n; │ │ │ │ │ -_8_2 typedef _M_a_t_r_i_x_H_i_e_r_a_r_c_h_y_<_M_,_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_> _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -_8_4 typedef typename _O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y; │ │ │ │ │ -85 │ │ │ │ │ -_8_7 typedef X _D_o_m_a_i_n; │ │ │ │ │ -_8_9 typedef X _R_a_n_g_e; │ │ │ │ │ -_9_1 typedef _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_X_> _C_o_a_r_s_e_S_o_l_v_e_r; │ │ │ │ │ -_9_7 typedef S _S_m_o_o_t_h_e_r; │ │ │ │ │ -98 │ │ │ │ │ -_1_0_0 typedef typename _S_m_o_o_t_h_e_r_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s _S_m_o_o_t_h_e_r_A_r_g_s; │ │ │ │ │ -101 │ │ │ │ │ -_1_1_1 _A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& coarseSolver, │ │ │ │ │ -112 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, const _P_a_r_a_m_e_t_e_r_s& parms); │ │ │ │ │ -113 │ │ │ │ │ -125 template │ │ │ │ │ -_1_2_6 _A_M_G(const _O_p_e_r_a_t_o_r& fineOperator, const C& criterion, │ │ │ │ │ -127 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs=_S_m_o_o_t_h_e_r_A_r_g_s(), │ │ │ │ │ -128 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ -129 │ │ │ │ │ -_1_8_0 _A_M_G(std::shared_ptr fineOperator, const ParameterTree& │ │ │ │ │ -configuration, const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo=_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n()); │ │ │ │ │ -181 │ │ │ │ │ -_1_8_5 _A_M_G(const _A_M_G& amg); │ │ │ │ │ -186 │ │ │ │ │ -_1_8_8 void _p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b); │ │ │ │ │ -189 │ │ │ │ │ -_1_9_1 void _a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d); │ │ │ │ │ -192 │ │ │ │ │ -_1_9_4 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -195 { │ │ │ │ │ -196 return category_; │ │ │ │ │ -197 } │ │ │ │ │ -198 │ │ │ │ │ -_2_0_0 void _p_o_s_t(_D_o_m_a_i_n& x); │ │ │ │ │ -201 │ │ │ │ │ -206 template │ │ │ │ │ -_2_0_7 void _g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont); │ │ │ │ │ -208 │ │ │ │ │ -_2_0_9 std::size_t _l_e_v_e_l_s(); │ │ │ │ │ -210 │ │ │ │ │ -_2_1_1 std::size_t _m_a_x_l_e_v_e_l_s(); │ │ │ │ │ -212 │ │ │ │ │ -_2_2_1 void _r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y() │ │ │ │ │ -222 { │ │ │ │ │ -223 matrices_->recalculateGalerkin(NegateSet()); │ │ │ │ │ -224 } │ │ │ │ │ -225 │ │ │ │ │ -_2_3_0 bool _u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const; │ │ │ │ │ -231 │ │ │ │ │ -232 private: │ │ │ │ │ -233 /* │ │ │ │ │ -234 * @brief Helper function to create hierarchies with parameter tree. │ │ │ │ │ -235 * │ │ │ │ │ -236 * Will create the coarsen criterion with the norm and create the │ │ │ │ │ -237 * Hierarchies │ │ │ │ │ -238 * \tparam Norm Type of the norm to use. │ │ │ │ │ -239 */ │ │ │ │ │ -240 template │ │ │ │ │ -241 void createCriterionAndHierarchies(std::shared_ptr │ │ │ │ │ -matrixptr, │ │ │ │ │ -242 const PI& pinfo, const Norm&, │ │ │ │ │ -243 const ParameterTree& configuration, │ │ │ │ │ -244 std::true_type compiles = std::true_type()); │ │ │ │ │ -245 template │ │ │ │ │ -246 void createCriterionAndHierarchies(std::shared_ptr │ │ │ │ │ -matrixptr, │ │ │ │ │ -247 const PI& pinfo, const Norm&, │ │ │ │ │ -248 const ParameterTree& configuration, │ │ │ │ │ -249 std::false_type); │ │ │ │ │ -254 template │ │ │ │ │ -255 void createHierarchies(C& criterion, std::shared_ptr │ │ │ │ │ -matrixptr, │ │ │ │ │ -256 const PI& pinfo, const ParameterTree& configuration); │ │ │ │ │ -263 template │ │ │ │ │ -264 void createHierarchies(C& criterion, │ │ │ │ │ -265 const std::shared_ptr& matrixptr, │ │ │ │ │ -266 const PI& pinfo); │ │ │ │ │ -273 struct LevelContext │ │ │ │ │ -274 { │ │ │ │ │ -_2_7_5 typedef _S_m_o_o_t_h_e_r _S_m_o_o_t_h_e_r_T_y_p_e; │ │ │ │ │ -_2_7_9 typename _H_i_e_r_a_r_c_h_y_<_S_m_o_o_t_h_e_r_,_A_>_:_:_I_t_e_r_a_t_o_r _s_m_o_o_t_h_e_r; │ │ │ │ │ -_2_8_3 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _m_a_t_r_i_x; │ │ │ │ │ -_2_8_7 typename _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y_:_:_I_t_e_r_a_t_o_r _p_i_n_f_o; │ │ │ │ │ -_2_9_1 typename OperatorHierarchy::RedistributeInfoList::const_iterator _r_e_d_i_s_t; │ │ │ │ │ -_2_9_5 typename OperatorHierarchy::AggregatesMapList::const_iterator _a_g_g_r_e_g_a_t_e_s; │ │ │ │ │ -_2_9_9 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _l_h_s; │ │ │ │ │ -_3_0_3 typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r _u_p_d_a_t_e; │ │ │ │ │ -_3_0_7 typename _H_i_e_r_a_r_c_h_y_<_R_a_n_g_e_,_A_>_:_:_I_t_e_r_a_t_o_r _r_h_s; │ │ │ │ │ -_3_1_1 std::size_t _l_e_v_e_l; │ │ │ │ │ -312 }; │ │ │ │ │ -313 │ │ │ │ │ -314 │ │ │ │ │ -319 void mgc(LevelContext& levelContext); │ │ │ │ │ -320 │ │ │ │ │ -321 void additiveMgc(); │ │ │ │ │ -322 │ │ │ │ │ -329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel); │ │ │ │ │ -330 │ │ │ │ │ -335 bool moveToCoarseLevel(LevelContext& levelContext); │ │ │ │ │ -336 │ │ │ │ │ -341 void initIteratorsWithFineLevel(LevelContext& levelContext); │ │ │ │ │ -342 │ │ │ │ │ -344 std::shared_ptr matrices_; │ │ │ │ │ -346 _S_m_o_o_t_h_e_r_A_r_g_s smootherArgs_; │ │ │ │ │ -348 std::shared_ptr > smoothers_; │ │ │ │ │ -350 std::shared_ptr solver_; │ │ │ │ │ -352 std::shared_ptr> rhs_; │ │ │ │ │ -354 std::shared_ptr> lhs_; │ │ │ │ │ -356 std::shared_ptr> update_; │ │ │ │ │ -358 using _S_c_a_l_a_r_P_r_o_d_u_c_t = _D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>; │ │ │ │ │ -360 std::shared_ptr scalarProduct_; │ │ │ │ │ -362 std::size_t gamma_; │ │ │ │ │ -364 std::size_t preSteps_; │ │ │ │ │ -366 std::size_t postSteps_; │ │ │ │ │ -367 bool buildHierarchy_; │ │ │ │ │ -368 bool additive; │ │ │ │ │ -369 bool coarsesolverconverged; │ │ │ │ │ -370 std::shared_ptr coarseSmoother_; │ │ │ │ │ -372 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category_; │ │ │ │ │ -374 std::size_t verbosity_; │ │ │ │ │ -375 │ │ │ │ │ -376 struct ToLower │ │ │ │ │ -377 { │ │ │ │ │ -_3_7_8 std::string _o_p_e_r_a_t_o_r_(_)(const std::string& str) │ │ │ │ │ -379 { │ │ │ │ │ -380 std::stringstream retval; │ │ │ │ │ -381 std::ostream_iterator out(retval); │ │ │ │ │ -382 std::transform(str.begin(), str.end(), out, │ │ │ │ │ -383 [](char c){ │ │ │ │ │ -384 return std::tolower(c, std::locale::classic()); │ │ │ │ │ -385 }); │ │ │ │ │ -386 return retval.str(); │ │ │ │ │ -387 } │ │ │ │ │ -388 }; │ │ │ │ │ -389 }; │ │ │ │ │ -390 │ │ │ │ │ -391 template │ │ │ │ │ -_3_9_2 inline _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(const _A_M_G& amg) │ │ │ │ │ -393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_), │ │ │ │ │ -394 smoothers_(amg.smoothers_), solver_(amg.solver_), │ │ │ │ │ -395 rhs_(), lhs_(), update_(), │ │ │ │ │ -396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_), │ │ │ │ │ -397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_), │ │ │ │ │ -398 buildHierarchy_(amg.buildHierarchy_), │ │ │ │ │ -399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged), │ │ │ │ │ -400 coarseSmoother_(amg.coarseSmoother_), │ │ │ │ │ -401 category_(amg.category_), │ │ │ │ │ -402 verbosity_(amg.verbosity_) │ │ │ │ │ -403 {} │ │ │ │ │ -404 │ │ │ │ │ -405 template │ │ │ │ │ -_4_0_6 _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y& matrices, _C_o_a_r_s_e_S_o_l_v_e_r& │ │ │ │ │ -coarseSolver, │ │ │ │ │ -407 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, │ │ │ │ │ -408 const _P_a_r_a_m_e_t_e_r_s& parms) │ │ │ │ │ -409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_ │ │ │ │ │ -(smootherArgs), │ │ │ │ │ -410 smoothers_(new _H_i_e_r_a_r_c_h_y<_S_m_o_o_t_h_e_r,A>), solver_(&coarseSolver), │ │ │ │ │ -411 rhs_(), lhs_(), update_(), scalarProduct_(0), │ │ │ │ │ -412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()), │ │ │ │ │ -413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false), │ │ │ │ │ -414 additive(parms.getAdditive()), coarsesolverconverged(true), │ │ │ │ │ -415 coarseSmoother_(), │ │ │ │ │ -416// #warning should category be retrieved from matrices? │ │ │ │ │ -417 category_(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::category(*smoothers_->coarsest())), │ │ │ │ │ -418 verbosity_(parms.debugLevel()) │ │ │ │ │ -419 { │ │ │ │ │ -420 assert(matrices_->isBuilt()); │ │ │ │ │ -421 │ │ │ │ │ -422 // build the necessary smoother hierarchies │ │ │ │ │ -423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_); │ │ │ │ │ -424 } │ │ │ │ │ -425 │ │ │ │ │ -426 template │ │ │ │ │ -427 template │ │ │ │ │ -_4_2_8 _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(const _O_p_e_r_a_t_o_r& matrix, │ │ │ │ │ -429 const C& criterion, │ │ │ │ │ -430 const _S_m_o_o_t_h_e_r_A_r_g_s& smootherArgs, │ │ │ │ │ -431 const PI& pinfo) │ │ │ │ │ -432 : smootherArgs_(smootherArgs), │ │ │ │ │ -433 smoothers_(new _H_i_e_r_a_r_c_h_y<_S_m_o_o_t_h_e_r,A>), solver_(), │ │ │ │ │ -434 rhs_(), lhs_(), update_(), scalarProduct_(), │ │ │ │ │ -435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()), │ │ │ │ │ -436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true), │ │ │ │ │ -437 additive(criterion.getAdditive()), coarsesolverconverged(true), │ │ │ │ │ -438 coarseSmoother_(), │ │ │ │ │ -439 category_(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::category(pinfo)), │ │ │ │ │ -440 verbosity_(criterion.debugLevel()) │ │ │ │ │ -441 { │ │ │ │ │ -442 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(matrix) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(pinfo)) │ │ │ │ │ -443 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "Matrix and Communication must have the │ │ │ │ │ -same SolverCategory!"); │ │ │ │ │ -444 // TODO: reestablish compile time checks. │ │ │ │ │ -445 //static_assert(static_cast(PI::category)==static_cast(S:: │ │ │ │ │ -category), │ │ │ │ │ -446 // "Matrix and Solver must match in terms of category!"); │ │ │ │ │ -447 auto matrixptr = stackobject_to_shared_ptr(matrix); │ │ │ │ │ -448 createHierarchies(criterion, matrixptr, pinfo); │ │ │ │ │ -449 } │ │ │ │ │ -450 │ │ │ │ │ -451 template │ │ │ │ │ -_4_5_2 _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_A_M_G(std::shared_ptr matrixptr, │ │ │ │ │ -453 const ParameterTree& configuration, │ │ │ │ │ -454 const _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n& pinfo) : │ │ │ │ │ -455 smoothers_(new _H_i_e_r_a_r_c_h_y<_S_m_o_o_t_h_e_r,A>), │ │ │ │ │ -456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_ │ │ │ │ │ -(true), │ │ │ │ │ -457 coarsesolverconverged(true), coarseSmoother_(), │ │ │ │ │ -458 category_(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::category(pinfo)) │ │ │ │ │ -459 { │ │ │ │ │ -460 │ │ │ │ │ -461 if (configuration.hasKey ("smootherIterations")) │ │ │ │ │ -462 smootherArgs_.iterations = configuration.get("smootherIterations"); │ │ │ │ │ -463 │ │ │ │ │ -464 if (configuration.hasKey ("smootherRelaxation")) │ │ │ │ │ -465 smootherArgs_.relaxationFactor = configuration.get("smootherRelaxation"); │ │ │ │ │ -466 │ │ │ │ │ -467 auto normName = ToLower()(configuration.get("strengthMeasure", │ │ │ │ │ -"diagonal")); │ │ │ │ │ -468 auto index = configuration.get("diagonalRowIndex", 0); │ │ │ │ │ -469 │ │ │ │ │ -470 if ( normName == "diagonal") │ │ │ │ │ -471 { │ │ │ │ │ -472 using _f_i_e_l_d___t_y_p_e = typename M::field_type; │ │ │ │ │ -473 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -474 std::is_convertible compiles; │ │ │ │ │ -475 │ │ │ │ │ -476 switch (index) │ │ │ │ │ -477 { │ │ │ │ │ -478 case 0: │ │ │ │ │ -479 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_0_>(), │ │ │ │ │ -configuration, compiles); │ │ │ │ │ -480 break; │ │ │ │ │ -481 case 1: │ │ │ │ │ -482 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_1_>(), │ │ │ │ │ -configuration, compiles); │ │ │ │ │ -483 break; │ │ │ │ │ -484 case 2: │ │ │ │ │ -485 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_2_>(), │ │ │ │ │ -configuration, compiles); │ │ │ │ │ -486 break; │ │ │ │ │ -487 case 3: │ │ │ │ │ -488 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_3_>(), │ │ │ │ │ -configuration, compiles); │ │ │ │ │ -489 break; │ │ │ │ │ -490 case 4: │ │ │ │ │ -491 createCriterionAndHierarchies(matrixptr, pinfo, _D_i_a_g_o_n_a_l_<_4_>(), │ │ │ │ │ -configuration, compiles); │ │ │ │ │ -492 break; │ │ │ │ │ -493 default: │ │ │ │ │ -494 DUNE_THROW(InvalidStateException, "Currently strengthIndex>4 is not │ │ │ │ │ -supported."); │ │ │ │ │ -495 } │ │ │ │ │ -496 } │ │ │ │ │ -497 else if (normName == "rowsum") │ │ │ │ │ -498 createCriterionAndHierarchies(matrixptr, pinfo, _R_o_w_S_u_m(), configuration); │ │ │ │ │ -499 else if (normName == "frobenius") │ │ │ │ │ -500 createCriterionAndHierarchies(matrixptr, pinfo, _F_r_o_b_e_n_i_u_s_N_o_r_m(), │ │ │ │ │ -configuration); │ │ │ │ │ -501 else if (normName == "one") │ │ │ │ │ -502 createCriterionAndHierarchies(matrixptr, pinfo, _A_l_w_a_y_s_O_n_e_N_o_r_m(), │ │ │ │ │ -configuration); │ │ │ │ │ -503 else │ │ │ │ │ -504 DUNE_THROW(Dune::NotImplemented, "Wrong config file: strengthMeasure │ │ │ │ │ -"< │ │ │ │ │ -508 template │ │ │ │ │ -509 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_c_r_e_a_t_e_C_r_i_t_e_r_i_o_n_A_n_d_H_i_e_r_a_r_c_h_i_e_s(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree& │ │ │ │ │ -configuration, std::false_type) │ │ │ │ │ -510 { │ │ │ │ │ -511 DUNE_THROW(InvalidStateException, "Strength of connection measure does not │ │ │ │ │ -support this type (" │ │ │ │ │ -512 << className() << ") as it is lacking a conversion │ │ │ │ │ -to" │ │ │ │ │ -513 << className::real_type>() << │ │ │ │ │ -"."); │ │ │ │ │ -514 } │ │ │ │ │ -515 │ │ │ │ │ -516 template │ │ │ │ │ -517 template │ │ │ │ │ -518 void AMG::createCriterionAndHierarchies(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree& │ │ │ │ │ -configuration, std::true_type) │ │ │ │ │ -519 { │ │ │ │ │ -520 if (configuration.get("criterionSymmetric", true)) │ │ │ │ │ -521 { │ │ │ │ │ -522 using Criterion = _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n< │ │ │ │ │ -523 _D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_t_y_p_e_n_a_m_e_ _M_:_:_m_a_t_r_i_x___t_y_p_e_,_N_o_r_m_> >; │ │ │ │ │ -524 Criterion criterion; │ │ │ │ │ -525 createHierarchies(criterion, matrixptr, pinfo, configuration); │ │ │ │ │ -526 } │ │ │ │ │ -527 else │ │ │ │ │ -528 { │ │ │ │ │ -529 using Criterion = _D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n< │ │ │ │ │ -530 _D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n_<_t_y_p_e_n_a_m_e_ _M_:_:_m_a_t_r_i_x___t_y_p_e_,_N_o_r_m_> >; │ │ │ │ │ -531 Criterion criterion; │ │ │ │ │ -532 createHierarchies(criterion, matrixptr, pinfo, configuration); │ │ │ │ │ -533 } │ │ │ │ │ -534 } │ │ │ │ │ -535 │ │ │ │ │ -536 template │ │ │ │ │ -537 template │ │ │ │ │ -538 void AMG::createHierarchies(C& criterion, std::shared_ptr matrixptr, const PI& pinfo, const ParameterTree& configuration) │ │ │ │ │ -539 { │ │ │ │ │ -540 if (configuration.hasKey ("maxLevel")) │ │ │ │ │ -541 criterion.setMaxLevel(configuration.get("maxLevel")); │ │ │ │ │ -542 │ │ │ │ │ -543 if (configuration.hasKey ("minCoarseningRate")) │ │ │ │ │ -544 criterion.setMinCoarsenRate(configuration.get("minCoarseningRate")); │ │ │ │ │ -545 │ │ │ │ │ -546 if (configuration.hasKey ("coarsenTarget")) │ │ │ │ │ -547 criterion.setCoarsenTarget (configuration.get("coarsenTarget")); │ │ │ │ │ -548 │ │ │ │ │ -549 if (configuration.hasKey ("accumulationMode")) │ │ │ │ │ -550 { │ │ │ │ │ -551 std::string mode = ToLower()(configuration.get │ │ │ │ │ -("accumulationMode")); │ │ │ │ │ -552 if ( mode == "none") │ │ │ │ │ -553 criterion.setAccumulate(_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e_:_:_n_o_A_c_c_u); │ │ │ │ │ -554 else if ( mode == "atonce" ) │ │ │ │ │ -555 criterion.setAccumulate(_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e_:_:_a_t_O_n_c_e_A_c_c_u); │ │ │ │ │ -556 else if ( mode == "successive") │ │ │ │ │ -557 criterion.setCoarsenTarget (_A_c_c_u_m_u_l_a_t_i_o_n_M_o_d_e_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u); │ │ │ │ │ -558 else │ │ │ │ │ -559 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode │ │ │ │ │ -does not allow value " │ │ │ │ │ -560 << mode <<"."); │ │ │ │ │ -561 } │ │ │ │ │ -562 │ │ │ │ │ -563 if (configuration.hasKey ("prolongationDampingFactor")) │ │ │ │ │ -564 criterion.setProlongationDampingFactor (configuration.get │ │ │ │ │ -("prolongationDampingFactor")); │ │ │ │ │ -565 │ │ │ │ │ -566 if (configuration.hasKey("defaultAggregationSizeMode")) │ │ │ │ │ -567 { │ │ │ │ │ -568 auto mode = ToLower()(configuration.get │ │ │ │ │ -("defaultAggregationSizeMode")); │ │ │ │ │ -569 auto dim = configuration.get("defaultAggregationDimension"); │ │ │ │ │ -570 std::size_t maxDistance = 2; │ │ │ │ │ -571 if (configuration.hasKey("MaxAggregateDistance")) │ │ │ │ │ -572 maxDistance = configuration.get("maxAggregateDistance"); │ │ │ │ │ -573 if (mode == "isotropic") │ │ │ │ │ -574 criterion.setDefaultValuesIsotropic(dim, maxDistance); │ │ │ │ │ -575 else if(mode == "anisotropic") │ │ │ │ │ -576 criterion.setDefaultValuesAnisotropic(dim, maxDistance); │ │ │ │ │ -577 else │ │ │ │ │ -578 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode │ │ │ │ │ -does not allow value " │ │ │ │ │ -579 << mode <<"."); │ │ │ │ │ -580 } │ │ │ │ │ -581 │ │ │ │ │ -582 if (configuration.hasKey("maxAggregateDistance")) │ │ │ │ │ -583 criterion.setMaxDistance(configuration.get │ │ │ │ │ -("maxAggregateDistance")); │ │ │ │ │ -584 │ │ │ │ │ -585 if (configuration.hasKey("minAggregateSize")) │ │ │ │ │ -586 criterion.setMinAggregateSize(configuration.get │ │ │ │ │ -("minAggregateSize")); │ │ │ │ │ -587 │ │ │ │ │ -588 if (configuration.hasKey("maxAggregateSize")) │ │ │ │ │ -589 criterion.setMaxAggregateSize(configuration.get │ │ │ │ │ -("maxAggregateSize")); │ │ │ │ │ -590 │ │ │ │ │ -591 if (configuration.hasKey("maxAggregateConnectivity")) │ │ │ │ │ -592 criterion.setMaxConnectivity(configuration.get │ │ │ │ │ -("maxAggregateConnectivity")); │ │ │ │ │ -593 │ │ │ │ │ -594 if (configuration.hasKey ("alpha")) │ │ │ │ │ -595 criterion.setAlpha (configuration.get ("alpha")); │ │ │ │ │ -596 │ │ │ │ │ -597 if (configuration.hasKey ("beta")) │ │ │ │ │ -598 criterion.setBeta (configuration.get ("beta")); │ │ │ │ │ -599 │ │ │ │ │ -600 if (configuration.hasKey ("gamma")) │ │ │ │ │ -601 criterion.setGamma (configuration.get ("gamma")); │ │ │ │ │ -602 gamma_ = criterion.getGamma(); │ │ │ │ │ -603 │ │ │ │ │ -604 if (configuration.hasKey ("additive")) │ │ │ │ │ -605 criterion.setAdditive (configuration.get("additive")); │ │ │ │ │ -606 additive = criterion.getAdditive(); │ │ │ │ │ -607 │ │ │ │ │ -608 if (configuration.hasKey ("preSteps")) │ │ │ │ │ -609 criterion.setNoPreSmoothSteps (configuration.get │ │ │ │ │ -("preSteps")); │ │ │ │ │ -610 preSteps_ = criterion.getNoPreSmoothSteps (); │ │ │ │ │ -611 │ │ │ │ │ -612 if (configuration.hasKey ("postSteps")) │ │ │ │ │ -613 criterion.setNoPostSmoothSteps (configuration.get │ │ │ │ │ -("postSteps")); │ │ │ │ │ -614 postSteps_ = criterion.getNoPostSmoothSteps (); │ │ │ │ │ -615 │ │ │ │ │ -616 verbosity_ = configuration.get("verbosity", 0); │ │ │ │ │ -617 criterion.setDebugLevel (verbosity_); │ │ │ │ │ -618 │ │ │ │ │ -619 createHierarchies(criterion, matrixptr, pinfo); │ │ │ │ │ -620 } │ │ │ │ │ -621 │ │ │ │ │ -622 template │ │ │ │ │ -_6_2_4 struct _D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ -625 { │ │ │ │ │ -_6_2_6 typedef typename Matrix :: field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_6_2_7 enum _S_o_l_v_e_r_T_y_p_e { _u_m_f_p_a_c_k, _s_u_p_e_r_l_u, _n_o_n_e }; │ │ │ │ │ -628 │ │ │ │ │ -_6_2_9 static constexpr _S_o_l_v_e_r_T_y_p_e _s_o_l_v_e_r = │ │ │ │ │ -630#if DISABLE_AMG_DIRECTSOLVER │ │ │ │ │ -631 _n_o_n_e; │ │ │ │ │ -632#elif HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -633 _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _f_i_e_l_d___t_y_p_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _> :: valid ? _u_m_f_p_a_c_k : │ │ │ │ │ -_n_o_n_e ; │ │ │ │ │ -634#elif HAVE_SUPERLU │ │ │ │ │ -635 _s_u_p_e_r_l_u ; │ │ │ │ │ -636#else │ │ │ │ │ -637 _n_o_n_e; │ │ │ │ │ -638#endif │ │ │ │ │ -639 │ │ │ │ │ -640 template │ │ │ │ │ -_6_4_1 struct _S_o_l_v_e_r │ │ │ │ │ -642 { │ │ │ │ │ -_6_4_3 typedef _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_V_e_c_t_o_r_,_V_e_c_t_o_r_> _t_y_p_e; │ │ │ │ │ -_6_4_4 static _t_y_p_e* _c_r_e_a_t_e(const M& _m_a_t, bool verbose, bool reusevector ) │ │ │ │ │ -645 { │ │ │ │ │ -646 DUNE_THROW(NotImplemented,"DirectSolver not selected"); │ │ │ │ │ -647 return nullptr; │ │ │ │ │ -648 } │ │ │ │ │ -_6_4_9 static std::string _n_a_m_e () { return "None"; } │ │ │ │ │ -650 }; │ │ │ │ │ -651#if HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -652 template │ │ │ │ │ -653 struct Solver< M, _u_m_f_p_a_c_k > │ │ │ │ │ -654 { │ │ │ │ │ -655 typedef _U_M_F_P_a_c_k_<_ _M_ _> _t_y_p_e; │ │ │ │ │ -656 static _t_y_p_e* _c_r_e_a_t_e(const M& _m_a_t, bool verbose, bool reusevector ) │ │ │ │ │ -657 { │ │ │ │ │ -658 return new _t_y_p_e(_m_a_t, verbose, reusevector ); │ │ │ │ │ -659 } │ │ │ │ │ -660 static std::string _n_a_m_e () { return "UMFPack"; } │ │ │ │ │ -661 }; │ │ │ │ │ -662#endif │ │ │ │ │ -663#if HAVE_SUPERLU │ │ │ │ │ -664 template │ │ │ │ │ -_6_6_5 struct _S_o_l_v_e_r< M, _s_u_p_e_r_l_u > │ │ │ │ │ -666 { │ │ │ │ │ -_6_6_7 typedef _S_u_p_e_r_L_U_<_ _M_ _> _t_y_p_e; │ │ │ │ │ -_6_6_8 static _t_y_p_e* _c_r_e_a_t_e(const M& _m_a_t, bool verbose, bool reusevector ) │ │ │ │ │ -669 { │ │ │ │ │ -670 return new _t_y_p_e(_m_a_t, verbose, reusevector ); │ │ │ │ │ -671 } │ │ │ │ │ -_6_7_2 static std::string _n_a_m_e () { return "SuperLU"; } │ │ │ │ │ -673 }; │ │ │ │ │ -674#endif │ │ │ │ │ -675 │ │ │ │ │ -676 // define direct solver type to be used │ │ │ │ │ -_6_7_7 typedef _S_o_l_v_e_r_<_ _M_a_t_r_i_x_,_ _s_o_l_v_e_r_ _> _S_e_l_e_c_t_e_d_S_o_l_v_e_r ; │ │ │ │ │ -_6_7_8 typedef typename SelectedSolver :: type _D_i_r_e_c_t_S_o_l_v_e_r; │ │ │ │ │ -_6_7_9 static constexpr bool _i_s_D_i_r_e_c_t_S_o_l_v_e_r = _s_o_l_v_e_r != _n_o_n_e; │ │ │ │ │ -_6_8_0 static std::string _n_a_m_e() { return SelectedSolver :: name (); } │ │ │ │ │ -_6_8_1 static _D_i_r_e_c_t_S_o_l_v_e_r* _c_r_e_a_t_e(const _M_a_t_r_i_x& _m_a_t, bool verbose, bool │ │ │ │ │ -reusevector ) │ │ │ │ │ -682 { │ │ │ │ │ -683 return SelectedSolver :: create( _m_a_t, verbose, reusevector ); │ │ │ │ │ -684 } │ │ │ │ │ -685 }; │ │ │ │ │ -686 │ │ │ │ │ -687 template │ │ │ │ │ -688 template │ │ │ │ │ -689 void AMG::createHierarchies(C& criterion, │ │ │ │ │ -690 const std::shared_ptr& matrixptr, │ │ │ │ │ -691 const PI& pinfo) │ │ │ │ │ -692 { │ │ │ │ │ -693 Timer watch; │ │ │ │ │ -694 matrices_ = std::make_shared( │ │ │ │ │ -695 std::const_pointer_cast(matrixptr), │ │ │ │ │ -696 stackobject_to_shared_ptr(const_cast(pinfo))); │ │ │ │ │ -697 │ │ │ │ │ -698 matrices_->template build >(criterion); │ │ │ │ │ -699 │ │ │ │ │ -700 // build the necessary smoother hierarchies │ │ │ │ │ -701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_); │ │ │ │ │ -702 │ │ │ │ │ -703 // test whether we should solve on the coarse level. That is the case if we │ │ │ │ │ -704 // have that level and if there was a redistribution on this level then our │ │ │ │ │ -705 // communicator has to be valid (size()>0) as the smoother might try to │ │ │ │ │ -communicate │ │ │ │ │ -706 // in the constructor. │ │ │ │ │ -707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels() │ │ │ │ │ -708 && ( ! matrices_->redistributeInformation().back().isSetup() || │ │ │ │ │ -709 matrices_->parallelInformation().coarsest().getRedistributed().communicator │ │ │ │ │ -().size() ) ) │ │ │ │ │ -710 { │ │ │ │ │ -711 // We have the carsest level. Create the coarse Solver │ │ │ │ │ -712 SmootherArgs sargs(smootherArgs_); │ │ │ │ │ -713 sargs.iterations = 1; │ │ │ │ │ -714 │ │ │ │ │ -715 typename _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_A_r_g_u_m_e_n_t_s cargs; │ │ │ │ │ -716 cargs.setArgs(sargs); │ │ │ │ │ -717 if(matrices_->redistributeInformation().back().isSetup()) { │ │ │ │ │ -718 // Solve on the redistributed partitioning │ │ │ │ │ -719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat │ │ │ │ │ -()); │ │ │ │ │ -720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ -()); │ │ │ │ │ -721 }else{ │ │ │ │ │ -722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat()); │ │ │ │ │ -723 cargs.setComm(*matrices_->parallelInformation().coarsest()); │ │ │ │ │ -724 } │ │ │ │ │ -725 │ │ │ │ │ -726 coarseSmoother_ = _C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_<_S_m_o_o_t_h_e_r_>_:_:_c_o_n_s_t_r_u_c_t(cargs); │ │ │ │ │ -727 scalarProduct_ = createScalarProduct(cargs.getComm(),category()); │ │ │ │ │ -728 │ │ │ │ │ -729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector; │ │ │ │ │ -730 │ │ │ │ │ -731 // Use superlu if we are purely sequential or with only one processor on │ │ │ │ │ -the coarsest level. │ │ │ │ │ -732 if( SolverSelector::isDirectSolver && │ │ │ │ │ -733 (std::is_same::value / │ │ │ │ │ -/ sequential mode │ │ │ │ │ -734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 // │ │ │ │ │ -parallel mode and only one processor │ │ │ │ │ -735 || (matrices_->parallelInformation().coarsest().isRedistributed() │ │ │ │ │ -736 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ -().communicator().size()==1 │ │ │ │ │ -737 && matrices_->parallelInformation().coarsest().getRedistributed │ │ │ │ │ -().communicator().size()>0) ) │ │ │ │ │ -738 ) │ │ │ │ │ -739 { // redistribute and 1 proc │ │ │ │ │ -740 if(matrices_->parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ -741 { │ │ │ │ │ -742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ -743 { │ │ │ │ │ -744 // We are still participating on this level │ │ │ │ │ -745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest │ │ │ │ │ -().getRedistributed().getmat(), false, false)); │ │ │ │ │ -746 } │ │ │ │ │ -747 else │ │ │ │ │ -748 solver_.reset(); │ │ │ │ │ -749 } │ │ │ │ │ -750 else │ │ │ │ │ -751 { │ │ │ │ │ -752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()- │ │ │ │ │ ->getmat(), false, false)); │ │ │ │ │ -753 } │ │ │ │ │ -754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()- │ │ │ │ │ ->communicator().rank()==0) │ │ │ │ │ -755 std::cout<< "Using a direct coarse solver (" << SolverSelector::name() << │ │ │ │ │ -")" << std::endl; │ │ │ │ │ -756 } │ │ │ │ │ -757 else │ │ │ │ │ -758 { │ │ │ │ │ -759 if(matrices_->parallelInformation().coarsest().isRedistributed()) │ │ │ │ │ -760 { │ │ │ │ │ -761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0) │ │ │ │ │ -762 // We are still participating on this level │ │ │ │ │ -763 │ │ │ │ │ -764 // we have to allocate these types using the rebound allocator │ │ │ │ │ -765 // in order to ensure that we fulfill the alignment requirements │ │ │ │ │ -766 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices │ │ │ │ │ -().coarsest().getRedistributed()), │ │ │ │ │ -767 *scalarProduct_, │ │ │ │ │ -768 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ -769 else │ │ │ │ │ -770 solver_.reset(); │ │ │ │ │ -771 }else │ │ │ │ │ -772 { │ │ │ │ │ -773 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices │ │ │ │ │ -().coarsest()), │ │ │ │ │ -774 *scalarProduct_, │ │ │ │ │ -775 *coarseSmoother_, 1E-2, 1000, 0)); │ │ │ │ │ -776 // // we have to allocate these types using the rebound allocator │ │ │ │ │ -777 // // in order to ensure that we fulfill the alignment requirements │ │ │ │ │ -778 // using Alloc = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc>; │ │ │ │ │ -779 // Alloc alloc; │ │ │ │ │ -780 // auto p = alloc.allocate(1); │ │ │ │ │ -781 // std::allocator_traits::construct(alloc, p, │ │ │ │ │ -782 // const_cast(*matrices_->matrices().coarsest()), │ │ │ │ │ -783 // *scalarProduct_, │ │ │ │ │ -784 // *coarseSmoother_, 1E-2, 1000, 0); │ │ │ │ │ -785 // solver_.reset(p,[](BiCGSTABSolver* p){ │ │ │ │ │ -786 // Alloc alloc; │ │ │ │ │ -787 // std::allocator_traits::destroy(alloc, p); │ │ │ │ │ -788 // alloc.deallocate(p,1); │ │ │ │ │ -789 // }); │ │ │ │ │ -790 } │ │ │ │ │ -791 } │ │ │ │ │ -792 } │ │ │ │ │ -793 │ │ │ │ │ -794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator │ │ │ │ │ -().rank()==0) │ │ │ │ │ -795 std::cout<<"Building hierarchy of "<maxlevels()<<" levels " │ │ │ │ │ -796 <<"(including coarse solver) took "< │ │ │ │ │ -_8_0_1 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_p_r_e(_D_o_m_a_i_n& x, _R_a_n_g_e& b) │ │ │ │ │ -802 { │ │ │ │ │ -803 // Detect Matrix rows where all offdiagonal entries are │ │ │ │ │ -804 // zero and set x such that A_dd*x_d=b_d │ │ │ │ │ -805 // Thus users can be more careless when setting up their linear │ │ │ │ │ -806 // systems. │ │ │ │ │ -807 typedef typename M::matrix_type _M_a_t_r_i_x; │ │ │ │ │ -808 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r RowIter; │ │ │ │ │ -809 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r ColIter; │ │ │ │ │ -810 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e Block; │ │ │ │ │ -811 Block zero; │ │ │ │ │ -812 zero=typename _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e(); │ │ │ │ │ -813 │ │ │ │ │ -814 const _M_a_t_r_i_x& _m_a_t=matrices_->matrices().finest()->getmat(); │ │ │ │ │ -815 for(RowIter row=_m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ -816 bool isDirichlet = true; │ │ │ │ │ -817 bool hasDiagonal = false; │ │ │ │ │ -818 Block diagonal{}; │ │ │ │ │ -819 for(ColIter _c_o_l=row->begin(); _c_o_l!=row->end(); ++_c_o_l) { │ │ │ │ │ -820 if(row.index()==_c_o_l.index()) { │ │ │ │ │ -821 diagonal = *_c_o_l; │ │ │ │ │ -822 hasDiagonal = true; │ │ │ │ │ -823 }else{ │ │ │ │ │ -824 if(*_c_o_l!=zero) │ │ │ │ │ -825 isDirichlet = false; │ │ │ │ │ -826 } │ │ │ │ │ -827 } │ │ │ │ │ -828 if(isDirichlet && hasDiagonal) │ │ │ │ │ -829 { │ │ │ │ │ -830 auto&& xEntry = Impl::asVector(x[row.index()]); │ │ │ │ │ -831 auto&& bEntry = Impl::asVector(b[row.index()]); │ │ │ │ │ -832 Impl::asMatrix(diagonal).solve(xEntry, bEntry); │ │ │ │ │ -833 } │ │ │ │ │ -834 } │ │ │ │ │ -835 │ │ │ │ │ -836 if(smoothers_->levels()>0) │ │ │ │ │ -837 smoothers_->finest()->pre(x,b); │ │ │ │ │ -838 else │ │ │ │ │ -839 // No smoother to make x consistent! Do it by hand │ │ │ │ │ -840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x); │ │ │ │ │ -841 rhs_ = std::make_shared>(std::make_shared(b)); │ │ │ │ │ -842 lhs_ = std::make_shared>(std::make_shared(x)); │ │ │ │ │ -843 update_ = std::make_shared>(std::make_shared │ │ │ │ │ -(x)); │ │ │ │ │ -844 matrices_->coarsenVector(*rhs_); │ │ │ │ │ -845 matrices_->coarsenVector(*lhs_); │ │ │ │ │ -846 matrices_->coarsenVector(*update_); │ │ │ │ │ -847 │ │ │ │ │ -848 // Preprocess all smoothers │ │ │ │ │ -849 typedef typename _H_i_e_r_a_r_c_h_y_<_S_m_o_o_t_h_e_r_,_A_>_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -850 typedef typename _H_i_e_r_a_r_c_h_y_<_R_a_n_g_e_,_A_>_:_:_I_t_e_r_a_t_o_r RIterator; │ │ │ │ │ -851 typedef typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r DIterator; │ │ │ │ │ -852 Iterator coarsest = smoothers_->coarsest(); │ │ │ │ │ -853 Iterator smoother = smoothers_->finest(); │ │ │ │ │ -854 RIterator rhs = rhs_->finest(); │ │ │ │ │ -855 DIterator lhs = lhs_->finest(); │ │ │ │ │ -856 if(smoothers_->levels()>1) { │ │ │ │ │ -857 │ │ │ │ │ -858 assert(lhs_->levels()==rhs_->levels()); │ │ │ │ │ -859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels │ │ │ │ │ -()==matrices_->maxlevels()); │ │ │ │ │ -860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels │ │ │ │ │ -()maxlevels()); │ │ │ │ │ -861 │ │ │ │ │ -862 if(smoother!=coarsest) │ │ │ │ │ -863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs, │ │ │ │ │ -++rhs) │ │ │ │ │ -864 smoother->pre(*lhs,*rhs); │ │ │ │ │ -865 smoother->pre(*lhs,*rhs); │ │ │ │ │ -866 } │ │ │ │ │ -867 │ │ │ │ │ -868 │ │ │ │ │ -869 // The preconditioner might change x and b. So we have to │ │ │ │ │ -870 // copy the changes to the original vectors. │ │ │ │ │ -871 x = *lhs_->finest(); │ │ │ │ │ -872 b = *rhs_->finest(); │ │ │ │ │ -873 │ │ │ │ │ -874 } │ │ │ │ │ -875 template │ │ │ │ │ -_8_7_6 std::size_t _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_l_e_v_e_l_s() │ │ │ │ │ -877 { │ │ │ │ │ -878 return matrices_->levels(); │ │ │ │ │ -879 } │ │ │ │ │ -880 template │ │ │ │ │ -_8_8_1 std::size_t _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_m_a_x_l_e_v_e_l_s() │ │ │ │ │ -882 { │ │ │ │ │ -883 return matrices_->maxlevels(); │ │ │ │ │ -884 } │ │ │ │ │ -885 │ │ │ │ │ -887 template │ │ │ │ │ -_8_8_8 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_a_p_p_l_y(_D_o_m_a_i_n& v, const _R_a_n_g_e& d) │ │ │ │ │ -889 { │ │ │ │ │ -890 LevelContext levelContext; │ │ │ │ │ -891 │ │ │ │ │ -892 if(additive) { │ │ │ │ │ -893 *(rhs_->finest())=d; │ │ │ │ │ -894 additiveMgc(); │ │ │ │ │ -895 v=*lhs_->finest(); │ │ │ │ │ -896 }else{ │ │ │ │ │ -897 // Init all iterators for the current level │ │ │ │ │ -898 initIteratorsWithFineLevel(levelContext); │ │ │ │ │ -899 │ │ │ │ │ -900 │ │ │ │ │ -901 *levelContext.lhs = v; │ │ │ │ │ -902 *levelContext.rhs = d; │ │ │ │ │ -903 *levelContext.update=0; │ │ │ │ │ -904 levelContext.level=0; │ │ │ │ │ -905 │ │ │ │ │ -906 mgc(levelContext); │ │ │ │ │ -907 │ │ │ │ │ -908 if(postSteps_==0||matrices_->maxlevels()==1) │ │ │ │ │ -909 levelContext.pinfo->copyOwnerToAll(*levelContext.update, │ │ │ │ │ -*levelContext.update); │ │ │ │ │ -910 │ │ │ │ │ -911 v=*levelContext.update; │ │ │ │ │ -912 } │ │ │ │ │ -913 │ │ │ │ │ -914 } │ │ │ │ │ -915 │ │ │ │ │ -916 template │ │ │ │ │ -917 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_i_n_i_t_I_t_e_r_a_t_o_r_s_W_i_t_h_F_i_n_e_L_e_v_e_l(LevelContext& │ │ │ │ │ -levelContext) │ │ │ │ │ -918 { │ │ │ │ │ -919 levelContext.smoother = smoothers_->finest(); │ │ │ │ │ -920 levelContext.matrix = matrices_->matrices().finest(); │ │ │ │ │ -921 levelContext.pinfo = matrices_->parallelInformation().finest(); │ │ │ │ │ -922 levelContext.redist = │ │ │ │ │ -923 matrices_->redistributeInformation().begin(); │ │ │ │ │ -924 levelContext.aggregates = matrices_->aggregatesMaps().begin(); │ │ │ │ │ -925 levelContext.lhs = lhs_->finest(); │ │ │ │ │ -926 levelContext.update = update_->finest(); │ │ │ │ │ -927 levelContext.rhs = rhs_->finest(); │ │ │ │ │ -928 } │ │ │ │ │ -929 │ │ │ │ │ -930 template │ │ │ │ │ -931 bool AMG │ │ │ │ │ -932 ::moveToCoarseLevel(LevelContext& levelContext) │ │ │ │ │ -933 { │ │ │ │ │ -934 │ │ │ │ │ -935 bool processNextLevel=true; │ │ │ │ │ -936 │ │ │ │ │ -937 if(levelContext.redist->isSetup()) { │ │ │ │ │ -938 levelContext.redist->redistribute(static_cast │ │ │ │ │ -(*levelContext.rhs), │ │ │ │ │ -939 levelContext.rhs.getRedistributed()); │ │ │ │ │ -940 processNextLevel = levelContext.rhs.getRedistributed().size()>0; │ │ │ │ │ -941 if(processNextLevel) { │ │ │ │ │ -942 //restrict defect to coarse level right hand side. │ │ │ │ │ -943 typename Hierarchy::Iterator fineRhs = levelContext.rhs++; │ │ │ │ │ -944 ++levelContext.pinfo; │ │ │ │ │ -945 Transfer │ │ │ │ │ -946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs, │ │ │ │ │ -947 static_cast(fineRhs.getRedistributed()), │ │ │ │ │ -948 *levelContext.pinfo); │ │ │ │ │ -949 } │ │ │ │ │ -950 }else{ │ │ │ │ │ -951 //restrict defect to coarse level right hand side. │ │ │ │ │ -952 typename Hierarchy::Iterator fineRhs = levelContext.rhs++; │ │ │ │ │ -953 ++levelContext.pinfo; │ │ │ │ │ -954 Transfer │ │ │ │ │ -955 ::restrictVector(*(*levelContext.aggregates), │ │ │ │ │ -956 *levelContext.rhs, static_cast(*fineRhs), │ │ │ │ │ -957 *levelContext.pinfo); │ │ │ │ │ -958 } │ │ │ │ │ -959 │ │ │ │ │ -960 if(processNextLevel) { │ │ │ │ │ -961 // prepare coarse system │ │ │ │ │ -962 ++levelContext.lhs; │ │ │ │ │ -963 ++levelContext.update; │ │ │ │ │ -964 ++levelContext.matrix; │ │ │ │ │ -965 ++levelContext.level; │ │ │ │ │ -966 ++levelContext.redist; │ │ │ │ │ -967 │ │ │ │ │ -968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ ->levels()maxlevels()) { │ │ │ │ │ -969 // next level is not the globally coarsest one │ │ │ │ │ -970 ++levelContext.smoother; │ │ │ │ │ -971 ++levelContext.aggregates; │ │ │ │ │ -972 } │ │ │ │ │ -973 // prepare the update on the next level │ │ │ │ │ -974 *levelContext.update=0; │ │ │ │ │ -975 } │ │ │ │ │ -976 return processNextLevel; │ │ │ │ │ -977 } │ │ │ │ │ -978 │ │ │ │ │ -979 template │ │ │ │ │ -980 void AMG │ │ │ │ │ -981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel) │ │ │ │ │ -982 { │ │ │ │ │ -983 if(processNextLevel) { │ │ │ │ │ -984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_- │ │ │ │ │ ->levels()maxlevels()) { │ │ │ │ │ -985 // previous level is not the globally coarsest one │ │ │ │ │ -986 --levelContext.smoother; │ │ │ │ │ -987 --levelContext.aggregates; │ │ │ │ │ -988 } │ │ │ │ │ -989 --levelContext.redist; │ │ │ │ │ -990 --levelContext.level; │ │ │ │ │ -991 //prolongate and add the correction (update is in coarse left hand side) │ │ │ │ │ -992 --levelContext.matrix; │ │ │ │ │ -993 │ │ │ │ │ -994 //typename Hierarchy::Iterator coarseLhs = lhs--; │ │ │ │ │ -995 --levelContext.lhs; │ │ │ │ │ -996 --levelContext.pinfo; │ │ │ │ │ -997 } │ │ │ │ │ -998 if(levelContext.redist->isSetup()) { │ │ │ │ │ -999 // Need to redistribute during prolongateVector │ │ │ │ │ -1000 levelContext.lhs.getRedistributed()=0; │ │ │ │ │ -1001 Transfer │ │ │ │ │ -1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, │ │ │ │ │ -*levelContext.lhs, │ │ │ │ │ -1003 levelContext.lhs.getRedistributed(), │ │ │ │ │ -1004 matrices_->getProlongationDampingFactor(), │ │ │ │ │ -1005 *levelContext.pinfo, *levelContext.redist); │ │ │ │ │ -1006 }else{ │ │ │ │ │ -1007 *levelContext.lhs=0; │ │ │ │ │ -1008 Transfer │ │ │ │ │ -1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, │ │ │ │ │ -*levelContext.lhs, │ │ │ │ │ -1010 matrices_->getProlongationDampingFactor(), │ │ │ │ │ -1011 *levelContext.pinfo); │ │ │ │ │ -1012 } │ │ │ │ │ -1013 │ │ │ │ │ -1014 │ │ │ │ │ -1015 if(processNextLevel) { │ │ │ │ │ -1016 --levelContext.update; │ │ │ │ │ -1017 --levelContext.rhs; │ │ │ │ │ -1018 } │ │ │ │ │ -1019 │ │ │ │ │ -1020 *levelContext.update += *levelContext.lhs; │ │ │ │ │ -1021 } │ │ │ │ │ -1022 │ │ │ │ │ -1023 template │ │ │ │ │ -_1_0_2_4 bool _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r() const │ │ │ │ │ -1025 { │ │ │ │ │ -1026 return _I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _C_o_a_r_s_e_S_o_l_v_e_r_>_:_:_v_a_l_u_e; │ │ │ │ │ -1027 } │ │ │ │ │ -1028 │ │ │ │ │ -1029 template │ │ │ │ │ -1030 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_m_g_c(LevelContext& levelContext){ │ │ │ │ │ -1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels │ │ │ │ │ -()==maxlevels()) { │ │ │ │ │ -1032 // Solve directly │ │ │ │ │ -1033 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ -1034 res._c_o_n_v_e_r_g_e_d=true; // If we do not compute this flag will not get updated │ │ │ │ │ -1035 if(levelContext.redist->isSetup()) { │ │ │ │ │ -1036 levelContext.redist->redistribute(*levelContext.rhs, │ │ │ │ │ -levelContext.rhs.getRedistributed()); │ │ │ │ │ -1037 if(levelContext.rhs.getRedistributed().size()>0) { │ │ │ │ │ -1038 // We are still participating in the computation │ │ │ │ │ -1039 levelContext.pinfo.getRedistributed().copyOwnerToAll │ │ │ │ │ -(levelContext.rhs.getRedistributed(), │ │ │ │ │ -1040 levelContext.rhs.getRedistributed()); │ │ │ │ │ -1041 solver_->apply(levelContext.update.getRedistributed(), │ │ │ │ │ -1042 levelContext.rhs.getRedistributed(), res); │ │ │ │ │ -1043 } │ │ │ │ │ -1044 levelContext.redist->redistributeBackward(*levelContext.update, │ │ │ │ │ -levelContext.update.getRedistributed()); │ │ │ │ │ -1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update, │ │ │ │ │ -*levelContext.update); │ │ │ │ │ -1046 }else{ │ │ │ │ │ -1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs); │ │ │ │ │ -1048 solver_->apply(*levelContext.update, *levelContext.rhs, res); │ │ │ │ │ -1049 } │ │ │ │ │ -1050 │ │ │ │ │ -1051 if (!res._c_o_n_v_e_r_g_e_d) │ │ │ │ │ -1052 coarsesolverconverged = false; │ │ │ │ │ -1053 }else{ │ │ │ │ │ -1054 // presmoothing │ │ │ │ │ -1055 _p_r_e_s_m_o_o_t_h(levelContext, preSteps_); │ │ │ │ │ -1056 │ │ │ │ │ -1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION │ │ │ │ │ -1058 bool processNextLevel = moveToCoarseLevel(levelContext); │ │ │ │ │ -1059 │ │ │ │ │ -1060 if(processNextLevel) { │ │ │ │ │ -1061 // next level │ │ │ │ │ -1062 for(std::size_t i=0; imatrices().coarsest() && levels │ │ │ │ │ -()==maxlevels()) │ │ │ │ │ -1065 break; │ │ │ │ │ -1066 if(i+1 < gamma_){ │ │ │ │ │ -1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs, │ │ │ │ │ -*levelContext.rhs); │ │ │ │ │ -1068 } │ │ │ │ │ -1069 } │ │ │ │ │ -1070 } │ │ │ │ │ -1071 │ │ │ │ │ -1072 moveToFineLevel(levelContext, processNextLevel); │ │ │ │ │ -1073#else │ │ │ │ │ -1074 *lhs=0; │ │ │ │ │ -1075#endif │ │ │ │ │ -1076 │ │ │ │ │ -1077 if(levelContext.matrix == matrices_->matrices().finest()) { │ │ │ │ │ -1078 coarsesolverconverged = matrices_->parallelInformation().finest()- │ │ │ │ │ ->communicator().prod(coarsesolverconverged); │ │ │ │ │ -1079 if(!coarsesolverconverged) │ │ │ │ │ -1080 DUNE_THROW(MathError, "Coarse solver did not converge"); │ │ │ │ │ -1081 } │ │ │ │ │ -1082 // postsmoothing │ │ │ │ │ -1083 _p_o_s_t_s_m_o_o_t_h(levelContext, postSteps_); │ │ │ │ │ -1084 │ │ │ │ │ -1085 } │ │ │ │ │ -1086 } │ │ │ │ │ -1087 │ │ │ │ │ -1088 template │ │ │ │ │ -1089 void AMG::additiveMgc(){ │ │ │ │ │ -1090 │ │ │ │ │ -1091 // restrict residual to all levels │ │ │ │ │ -1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_- │ │ │ │ │ ->parallelInformation().finest(); │ │ │ │ │ -1093 typename Hierarchy::Iterator rhs=rhs_->finest(); │ │ │ │ │ -1094 typename Hierarchy::Iterator lhs = lhs_->finest(); │ │ │ │ │ -1095 typename OperatorHierarchy::AggregatesMapList::const_iterator │ │ │ │ │ -aggregates=matrices_->aggregatesMaps().begin(); │ │ │ │ │ -1096 │ │ │ │ │ -1097 for(typename Hierarchy::Iterator fineRhs=rhs++; fineRhs != rhs_- │ │ │ │ │ ->coarsest(); fineRhs=rhs++, ++aggregates) { │ │ │ │ │ -1098 ++pinfo; │ │ │ │ │ -1099 Transfer │ │ │ │ │ -1100 ::restrictVector(*(*aggregates), *rhs, static_cast │ │ │ │ │ -(*fineRhs), *pinfo); │ │ │ │ │ -1101 } │ │ │ │ │ -1102 │ │ │ │ │ -1103 // pinfo is invalid, set to coarsest level │ │ │ │ │ -1104 //pinfo = matrices_->parallelInformation().coarsest │ │ │ │ │ -1105 // calculate correction for all levels │ │ │ │ │ -1106 lhs = lhs_->finest(); │ │ │ │ │ -1107 typename Hierarchy::Iterator smoother = smoothers_->finest(); │ │ │ │ │ -1108 │ │ │ │ │ -1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother) │ │ │ │ │ -{ │ │ │ │ │ -1110 // presmoothing │ │ │ │ │ -1111 *lhs=0; │ │ │ │ │ -1112 smoother->apply(*lhs, *rhs); │ │ │ │ │ -1113 } │ │ │ │ │ -1114 │ │ │ │ │ -1115 // Coarse level solve │ │ │ │ │ -1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION │ │ │ │ │ -1117 InverseOperatorResult res; │ │ │ │ │ -1118 pinfo->copyOwnerToAll(*rhs, *rhs); │ │ │ │ │ -1119 solver_->apply(*lhs, *rhs, res); │ │ │ │ │ -1120 │ │ │ │ │ -1121 if(!res.converged) │ │ │ │ │ -1122 DUNE_THROW(MathError, "Coarse solver did not converge"); │ │ │ │ │ -1123#else │ │ │ │ │ -1124 *lhs=0; │ │ │ │ │ -1125#endif │ │ │ │ │ -1126 // Prologate and add up corrections from all levels │ │ │ │ │ -1127 --pinfo; │ │ │ │ │ -1128 --aggregates; │ │ │ │ │ -1129 │ │ │ │ │ -1130 for(typename Hierarchy::Iterator coarseLhs = lhs--; coarseLhs != │ │ │ │ │ -lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) { │ │ │ │ │ -1131 Transfer │ │ │ │ │ -1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo); │ │ │ │ │ -1133 } │ │ │ │ │ -1134 } │ │ │ │ │ -1135 │ │ │ │ │ -1136 │ │ │ │ │ -1138 template │ │ │ │ │ -_1_1_3_9 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_p_o_s_t([[maybe_unused]] _D_o_m_a_i_n& x) │ │ │ │ │ -1140 { │ │ │ │ │ -1141 // Postprocess all smoothers │ │ │ │ │ -1142 typedef typename _H_i_e_r_a_r_c_h_y_<_S_m_o_o_t_h_e_r_,_A_>_:_:_I_t_e_r_a_t_o_r Iterator; │ │ │ │ │ -1143 typedef typename _H_i_e_r_a_r_c_h_y_<_D_o_m_a_i_n_,_A_>_:_:_I_t_e_r_a_t_o_r DIterator; │ │ │ │ │ -1144 Iterator coarsest = smoothers_->coarsest(); │ │ │ │ │ -1145 Iterator smoother = smoothers_->finest(); │ │ │ │ │ -1146 DIterator lhs = lhs_->finest(); │ │ │ │ │ -1147 if(smoothers_->levels()>0) { │ │ │ │ │ -1148 if(smoother != coarsest || matrices_->levels()maxlevels()) │ │ │ │ │ -1149 smoother->post(*lhs); │ │ │ │ │ -1150 if(smoother!=coarsest) │ │ │ │ │ -1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs) │ │ │ │ │ -1152 smoother->post(*lhs); │ │ │ │ │ -1153 smoother->post(*lhs); │ │ │ │ │ -1154 } │ │ │ │ │ -1155 lhs_ = nullptr; │ │ │ │ │ -1156 update_ = nullptr; │ │ │ │ │ -1157 rhs_ = nullptr; │ │ │ │ │ -1158 } │ │ │ │ │ -1159 │ │ │ │ │ -1160 template │ │ │ │ │ -1161 template │ │ │ │ │ -_1_1_6_2 void _A_M_G_<_M_,_X_,_S_,_P_I_,_A_>_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s(std::vector& cont) │ │ │ │ │ -1163 { │ │ │ │ │ -1164 matrices_->getCoarsestAggregatesOnFinest(cont); │ │ │ │ │ -1165 } │ │ │ │ │ -1166 │ │ │ │ │ -1167 } // end namespace Amg │ │ │ │ │ -1168 │ │ │ │ │ -_1_1_6_9 struct _A_M_G_C_r_e_a_t_o_r{ │ │ │ │ │ -_1_1_7_0 template struct _i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e : std::false_type{}; │ │ │ │ │ -_1_1_7_1 template struct │ │ │ │ │ -_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e<_F_i_e_l_d_M_a_t_r_i_x> : std::true_type{}; │ │ │ │ │ -1172 │ │ │ │ │ -1173 template │ │ │ │ │ -1174 std::shared_ptr > │ │ │ │ │ -_1_1_7_5 _m_a_k_e_A_M_G(const OP& op, const std::string& smoother, const Dune:: │ │ │ │ │ -ParameterTree& config) const │ │ │ │ │ -1176 { │ │ │ │ │ -1177 DUNE_THROW(Dune::Exception, "Operator type not supported by AMG"); │ │ │ │ │ -1178 } │ │ │ │ │ -1179 │ │ │ │ │ -1180 template │ │ │ │ │ -1181 std::shared_ptr > │ │ │ │ │ -_1_1_8_2 _m_a_k_e_A_M_G(const std::shared_ptr<_M_a_t_r_i_x_A_d_a_p_t_e_r_<_M_,_X_,_Y_>>& op, const std:: │ │ │ │ │ -string& smoother, │ │ │ │ │ -1183 const Dune::ParameterTree& config) const │ │ │ │ │ -1184 { │ │ │ │ │ -1185 using OP = _M_a_t_r_i_x_A_d_a_p_t_e_r_<_M_,_X_,_Y_>; │ │ │ │ │ -1186 │ │ │ │ │ -1187 if(smoother == "ssor") │ │ │ │ │ -1188 return std::make_shared>>(op, config); │ │ │ │ │ -1189 if(smoother == "sor") │ │ │ │ │ -1190 return std::make_shared>>(op, config); │ │ │ │ │ -1191 if(smoother == "jac") │ │ │ │ │ -1192 return std::make_shared>>(op, config); │ │ │ │ │ -1193 if(smoother == "gs") │ │ │ │ │ -1194 return std::make_shared>>(op, config); │ │ │ │ │ -1195 if(smoother == "ilu") │ │ │ │ │ -1196 return std::make_shared>>(op, config); │ │ │ │ │ -1197 else │ │ │ │ │ -1198 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG"); │ │ │ │ │ -1199 } │ │ │ │ │ -1200 │ │ │ │ │ -1201 template │ │ │ │ │ -1202 std::shared_ptr > │ │ │ │ │ -_1_2_0_3 _m_a_k_e_A_M_G(const std::shared_ptr<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>>& op, │ │ │ │ │ -const std::string& smoother, │ │ │ │ │ -1204 const Dune::ParameterTree& config) const │ │ │ │ │ -1205 { │ │ │ │ │ -1206 using OP = _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>; │ │ │ │ │ -1207 │ │ │ │ │ -1208 auto cop = std::static_pointer_cast(op); │ │ │ │ │ -1209 │ │ │ │ │ -1210 if(smoother == "ssor") │ │ │ │ │ -1211 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ -()); │ │ │ │ │ -1212 if(smoother == "sor") │ │ │ │ │ -1213 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ -()); │ │ │ │ │ -1214 if(smoother == "jac") │ │ │ │ │ -1215 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ -()); │ │ │ │ │ -1216 if(smoother == "gs") │ │ │ │ │ -1217 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ -()); │ │ │ │ │ -1218 if(smoother == "ilu") │ │ │ │ │ -1219 return std::make_shared>,C>>(cop, config, op->getCommunication │ │ │ │ │ -()); │ │ │ │ │ -1220 else │ │ │ │ │ -1221 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG"); │ │ │ │ │ -1222 } │ │ │ │ │ -1223 │ │ │ │ │ -1224 template │ │ │ │ │ -1225 std::shared_ptr > │ │ │ │ │ -_1_2_2_6 _m_a_k_e_A_M_G(const std::shared_ptr<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>>& op, │ │ │ │ │ -const std::string& smoother, │ │ │ │ │ -1227 const Dune::ParameterTree& config) const │ │ │ │ │ -1228 { │ │ │ │ │ -1229 using OP = _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_>; │ │ │ │ │ -1230 │ │ │ │ │ -1231 if(smoother == "ssor") │ │ │ │ │ -1232 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ ->getCommunication()); │ │ │ │ │ -1233 if(smoother == "sor") │ │ │ │ │ -1234 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ ->getCommunication()); │ │ │ │ │ -1235 if(smoother == "jac") │ │ │ │ │ -1236 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ ->getCommunication()); │ │ │ │ │ -1237 if(smoother == "gs") │ │ │ │ │ -1238 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ ->getCommunication()); │ │ │ │ │ -1239 if(smoother == "ilu") │ │ │ │ │ -1240 return std::make_shared>,C>>(op, config, op- │ │ │ │ │ ->getCommunication()); │ │ │ │ │ -1241 else │ │ │ │ │ -1242 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG"); │ │ │ │ │ -1243 } │ │ │ │ │ -1244 │ │ │ │ │ -1245 template │ │ │ │ │ -1246 std::shared_ptr::type, │ │ │ │ │ -1247 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_1_2_4_8 _o_p_e_r_a_t_o_r_(_)_ (TL tl, const std::shared_ptr& op, const Dune:: │ │ │ │ │ -ParameterTree& config, │ │ │ │ │ -1249 std::enable_if_t<_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e_<_t_y_p_e_n_a_m_e_ _O_P_:_:_m_a_t_r_i_x___t_y_p_e_:_:_b_l_o_c_k___t_y_p_e_>_:_: │ │ │ │ │ -_v_a_l_u_e,int> = 0) const │ │ │ │ │ -1250 { │ │ │ │ │ -1251 using field_type = typename OP::matrix_type::field_type; │ │ │ │ │ -1252 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -1253 if (!std::is_convertible()) │ │ │ │ │ -1254 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, "AMG needs field_type(" << │ │ │ │ │ -1255 className() << │ │ │ │ │ -1256 ") to be convertible to its real_type (" << │ │ │ │ │ -1257 className() << │ │ │ │ │ -1258 ")."); │ │ │ │ │ -1259 using D = typename Dune::TypeListElement<1, decltype(tl)>::type; │ │ │ │ │ -1260 using R = typename Dune::TypeListElement<2, decltype(tl)>::type; │ │ │ │ │ -1261 std::shared_ptr> amg; │ │ │ │ │ -1262 std::string smoother = config.get("smoother", "ssor"); │ │ │ │ │ -1263 return _m_a_k_e_A_M_G(op, smoother, config); │ │ │ │ │ -1264 } │ │ │ │ │ -1265 │ │ │ │ │ -1266 template │ │ │ │ │ -1267 std::shared_ptr::type, │ │ │ │ │ -1268 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_1_2_6_9 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const std::shared_ptr& /*mat*/, const Dune:: │ │ │ │ │ -ParameterTree& /*config*/, │ │ │ │ │ -1270 std::enable_if_t_:_: │ │ │ │ │ -_v_a_l_u_e,int> = 0) const │ │ │ │ │ -1271 { │ │ │ │ │ -1272 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, "AMG needs a FieldMatrix as Matrix │ │ │ │ │ -block_type"); │ │ │ │ │ -1273 } │ │ │ │ │ -1274 }; │ │ │ │ │ -1275 │ │ │ │ │ -_1_2_7_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("amg", _A_M_G_C_r_e_a_t_o_r()); │ │ │ │ │ -1277} // end namespace Dune │ │ │ │ │ -1278 │ │ │ │ │ -1279#endif │ │ │ │ │ -_s_u_p_e_r_l_u_._h_h │ │ │ │ │ -Classes for using SuperLU with ISTL matrices. │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R │ │ │ │ │ -#define DUNE_REGISTER_PRECONDITIONER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:16 │ │ │ │ │ -_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ -_u_m_f_p_a_c_k_._h_h │ │ │ │ │ -Classes for using UMFPack with ISTL matrices. │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_t_r_a_n_s_f_e_r_._h_h │ │ │ │ │ -Prolongation and restriction for amg. │ │ │ │ │ -_m_a_t_r_i_x_h_i_e_r_a_r_c_h_y_._h_h │ │ │ │ │ -Provides a classes representing the hierarchies in AMG. │ │ │ │ │ -_s_m_o_o_t_h_e_r_._h_h │ │ │ │ │ -Classes for the generic construction and application of the smoothers. │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_ISTL_SOLVERFACTORY_HH │ │ │ │ │ +7#define DUNE_ISTL_SOLVERFACTORY_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include "_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h" │ │ │ │ │ +17#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +20 │ │ │ │ │ +21namespace _D_u_n_e{ │ │ │ │ │ +26 // Direct solver factory: │ │ │ │ │ +27 template │ │ │ │ │ +_2_8 using _D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr>(const │ │ │ │ │ +M&, const ParameterTree&); │ │ │ │ │ +29 template │ │ │ │ │ +_3_0 using _D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y = │ │ │ │ │ +Singleton>>; │ │ │ │ │ +31 │ │ │ │ │ +32 // Preconditioner factory: │ │ │ │ │ +33 template │ │ │ │ │ +_3_4 using _P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr>(const │ │ │ │ │ +std::shared_ptr&, const ParameterTree&); │ │ │ │ │ +35 template │ │ │ │ │ +_3_6 using _P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y = │ │ │ │ │ +Singleton>>; │ │ │ │ │ +37 │ │ │ │ │ +38 // Iterative solver factory │ │ │ │ │ +39 template │ │ │ │ │ +_4_0 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr>(const │ │ │ │ │ +std::shared_ptr>&, const std:: │ │ │ │ │ +shared_ptr>&, const std::shared_ptr>, │ │ │ │ │ +const ParameterTree&); │ │ │ │ │ +41 template │ │ │ │ │ +_4_2 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y = │ │ │ │ │ +Singleton>>; │ │ │ │ │ +43 │ │ │ │ │ +44 // initSolverFactories differs in different compilation units, so we have it │ │ │ │ │ +45 // in an anonymous namespace │ │ │ │ │ +46 namespace { │ │ │ │ │ +47 │ │ │ │ │ +53 template │ │ │ │ │ +54 int initSolverFactories(){ │ │ │ │ │ +55 using M = typename O::matrix_type; │ │ │ │ │ +56 using X = typename O::range_type; │ │ │ │ │ +57 using Y = typename O::domain_type; │ │ │ │ │ +58 using TL = Dune::TypeList; │ │ │ │ │ +59 auto& dsfac=_D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y_<_M_,_X_,_Y_>_:_:_i_n_s_t_a_n_c_e(); │ │ │ │ │ +60 addRegistryToFactory(dsfac, DirectSolverTag{}); │ │ │ │ │ +61 auto& pfac=_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y_<_O_,_X_,_Y_>_:_:_i_n_s_t_a_n_c_e(); │ │ │ │ │ +62 addRegistryToFactory(pfac, PreconditionerTag{}); │ │ │ │ │ +63 using TLS = Dune::TypeList; │ │ │ │ │ +64 auto& isfac=_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y_<_X_,_Y_>_:_:_i_n_s_t_a_n_c_e(); │ │ │ │ │ +65 return addRegistryToFactory(isfac, IterativeSolverTag{}); │ │ │ │ │ +66 } │ │ │ │ │ +77 template │ │ │ │ │ +78 [[deprecated("Use method 'initSolverFactories' instead")]] │ │ │ │ │ +79 int initSolverFactories() { │ │ │ │ │ +80 return initSolverFactories(); │ │ │ │ │ +81 } │ │ │ │ │ +82 } // end anonymous namespace │ │ │ │ │ +83 │ │ │ │ │ +84 │ │ │ │ │ +85 template │ │ │ │ │ +_8_6 std::shared_ptr _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(const std:: │ │ │ │ │ +shared_ptr& prec, │ │ │ │ │ +87 const O&) │ │ │ │ │ +88 { │ │ │ │ │ +89 return prec; │ │ │ │ │ +90 } │ │ │ │ │ +91 │ │ │ │ │ +92 template │ │ │ │ │ +93 std::shared_ptr │ │ │ │ │ +_9_4 _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(const std::shared_ptr& prec, │ │ │ │ │ +95 const std::shared_ptr<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ +96 { │ │ │ │ │ +97 return std::make_shared >(prec, │ │ │ │ │ +op->getCommunication()); │ │ │ │ │ +98 } │ │ │ │ │ +99 │ │ │ │ │ +100 template │ │ │ │ │ +101 std::shared_ptr │ │ │ │ │ +_1_0_2 _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(const std::shared_ptr& prec, │ │ │ │ │ +103 const std::shared_ptr<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ +104 { │ │ │ │ │ +105 return std::make_shared │ │ │ │ │ +>(prec, op->getCommunication()); │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +108 template │ │ │ │ │ +_1_0_9 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const std:: │ │ │ │ │ +shared_ptr<_M_a_t_r_i_x_A_d_a_p_t_e_r_<_M_,_X_,_Y_> >&) │ │ │ │ │ +110 { │ │ │ │ │ +111 return std::make_shared>(); │ │ │ │ │ +112 } │ │ │ │ │ +113 template │ │ │ │ │ +_1_1_4 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const std:: │ │ │ │ │ +shared_ptr<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ +115 { │ │ │ │ │ +116 return createScalarProduct(op->getCommunication(), op->category()); │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +119 template │ │ │ │ │ +_1_2_0 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const std:: │ │ │ │ │ +shared_ptr<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ +121 { │ │ │ │ │ +122 return createScalarProduct(op->getCommunication(), op->category()); │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +144 template │ │ │ │ │ +_1_4_5 class _S_o_l_v_e_r_F_a_c_t_o_r_y { │ │ │ │ │ +146 using Domain = typename Operator::domain_type; │ │ │ │ │ +147 using Range = typename Operator::range_type; │ │ │ │ │ +148 using _S_o_l_v_e_r = _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_>; │ │ │ │ │ +149 using _P_r_e_c_o_n_d_i_t_i_o_n_e_r = _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_D_o_m_a_i_n_,_ _R_a_n_g_e_>; │ │ │ │ │ +150 │ │ │ │ │ +151 template │ │ │ │ │ +152 using _matrix_type = typename O::matrix_type; │ │ │ │ │ +153 using matrix_type = Std::detected_or_t; │ │ │ │ │ +154 static constexpr bool isAssembled = !std::is_same::value; │ │ │ │ │ +155 │ │ │ │ │ +156 static const matrix_type* getmat(std::shared_ptr op){ │ │ │ │ │ +157 std::shared_ptr> aop │ │ │ │ │ +158 = std::dynamic_pointer_cast>(op); │ │ │ │ │ +159 if(aop) │ │ │ │ │ +160 return &aop->getmat(); │ │ │ │ │ +161 return nullptr; │ │ │ │ │ +162 } │ │ │ │ │ +163 │ │ │ │ │ +164 public: │ │ │ │ │ +165 │ │ │ │ │ +_1_6_8 static std::shared_ptr _g_e_t(std::shared_ptr op, │ │ │ │ │ +169 const ParameterTree& config, │ │ │ │ │ +170 std::shared_ptr prec = nullptr){ │ │ │ │ │ +171 std::string type = config.get("type"); │ │ │ │ │ +172 std::shared_ptr result; │ │ │ │ │ +173 const matrix_type* _m_a_t = getmat(op); │ │ │ │ │ +174 if(_m_a_t){ │ │ │ │ │ +175 if (_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y_<_m_a_t_r_i_x___t_y_p_e_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().contains │ │ │ │ │ +(type)) { │ │ │ │ │ +176 if(op->category()!=_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l){ │ │ │ │ │ +177 DUNE_THROW(NotImplemented, "The solver factory does not support parallel │ │ │ │ │ +direct solvers!"); │ │ │ │ │ +178 } │ │ │ │ │ +179 result = _D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y_<_m_a_t_r_i_x___t_y_p_e_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create │ │ │ │ │ +(type, *_m_a_t, config); │ │ │ │ │ +180 return result; │ │ │ │ │ +181 } │ │ │ │ │ +182 } │ │ │ │ │ +183 // if no direct solver is found it might be an iterative solver │ │ │ │ │ +184 if (!_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y_<_D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().contains(type)) { │ │ │ │ │ +185 DUNE_THROW(Dune::InvalidStateException, "Solver not found in the │ │ │ │ │ +factory."); │ │ │ │ │ +186 } │ │ │ │ │ +187 if(!prec){ │ │ │ │ │ +188 const ParameterTree& precConfig = config.sub("preconditioner"); │ │ │ │ │ +189 std::string prec_type = precConfig.get("type"); │ │ │ │ │ +190 prec = _P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y_<_O_p_e_r_a_t_o_r_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create │ │ │ │ │ +(prec_type, op, precConfig); │ │ │ │ │ +191 if (prec->category() != op->category() && prec->category() == │ │ │ │ │ +_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l) │ │ │ │ │ +192 // try to wrap to a parallel preconditioner │ │ │ │ │ +193 prec = _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(prec, op); │ │ │ │ │ +194 } │ │ │ │ │ +195 std::shared_ptr> sp = _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(op); │ │ │ │ │ +196 result = _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y_<_D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create(type, op, │ │ │ │ │ +sp, prec, config); │ │ │ │ │ +197 return result; │ │ │ │ │ +198 } │ │ │ │ │ +199 │ │ │ │ │ +_2_0_3 static std::shared_ptr _g_e_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r(std:: │ │ │ │ │ +shared_ptr op, │ │ │ │ │ +204 const ParameterTree& config){ │ │ │ │ │ +205 const matrix_type* _m_a_t = getmat(op); │ │ │ │ │ +206 if(_m_a_t){ │ │ │ │ │ +207 std::string prec_type = config.get("type"); │ │ │ │ │ +208 return _P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y_<_O_p_e_r_a_t_o_r_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create │ │ │ │ │ +(prec_type, op, config); │ │ │ │ │ +209 }else{ │ │ │ │ │ +210 DUNE_THROW(InvalidStateException, "Could not obtain matrix from operator. │ │ │ │ │ +Please pass in an AssembledLinearOperator."); │ │ │ │ │ +211 } │ │ │ │ │ +212 } │ │ │ │ │ +213 }; │ │ │ │ │ +214 │ │ │ │ │ +225 template │ │ │ │ │ +226 std::shared_ptr> _g_e_t_S_o_l_v_e_r_F_r_o_m_F_a_c_t_o_r_y(std:: │ │ │ │ │ +shared_ptr op, │ │ │ │ │ +228 const ParameterTree& config, │ │ │ │ │ +229 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r> prec = nullptr){ │ │ │ │ │ +231 return _S_o_l_v_e_r_F_a_c_t_o_r_y_<_O_p_e_r_a_t_o_r_>_:_:_g_e_t(op, config, prec); │ │ │ │ │ +232 } │ │ │ │ │ +233 │ │ │ │ │ +237} // end namespace Dune │ │ │ │ │ +238 │ │ │ │ │ +239 │ │ │ │ │ +240#endif │ │ │ │ │ +_s_c_h_w_a_r_z_._h_h │ │ │ │ │ +_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ +_n_o_v_l_p_s_c_h_w_a_r_z_._h_h │ │ │ │ │ +_s_o_l_v_e_r_._h_h │ │ │ │ │ +Define general, extensible interface for inverse operators. │ │ │ │ │ _m_a_t │ │ │ │ │ Matrix & mat │ │ │ │ │ DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ -AMG(const AMG &amg) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:392 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_p_r_e │ │ │ │ │ -void pre(Domain &x, Range &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:801 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_c_r_e_a_t_e │ │ │ │ │ -static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector) │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:681 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_n_a_m_e │ │ │ │ │ -static std::string name() │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:680 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_u_p_d_a_t_e │ │ │ │ │ -Hierarchy< Domain, A >::Iterator update │ │ │ │ │ -The iterator over the updates. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_h_s │ │ │ │ │ -Hierarchy< Range, A >::Iterator rhs │ │ │ │ │ -The iterator over the right hand sided. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u_ _>_:_:_n_a_m_e │ │ │ │ │ -static std::string name() │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:672 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_u_s_e_s_D_i_r_e_c_t_C_o_a_r_s_e_L_e_v_e_l_S_o_l_v_e_r │ │ │ │ │ -bool usesDirectCoarseLevelSolver() const │ │ │ │ │ -Check whether the coarse solver used is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1024 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_D_o_m_a_i_n │ │ │ │ │ -X Domain │ │ │ │ │ -The domain type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_:_:_c_r_e_a_t_e │ │ │ │ │ -static type * create(const M &mat, bool verbose, bool reusevector) │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:644 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ -AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs │ │ │ │ │ -&smootherArgs, const Parameters &parms) │ │ │ │ │ -Construct a new amg with a specific coarse solver. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ -AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree │ │ │ │ │ -&configuration, const ParallelInformation &pinfo=ParallelInformation()) │ │ │ │ │ -Constructor an AMG via ParameterTree. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:452 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_p_i_n_f_o │ │ │ │ │ -ParallelInformationHierarchy::Iterator pinfo │ │ │ │ │ -The iterator over the parallel information. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:287 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_T_y_p_e │ │ │ │ │ -SolverType │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_a_g_g_r_e_g_a_t_e_s │ │ │ │ │ -OperatorHierarchy::AggregatesMapList::const_iterator aggregates │ │ │ │ │ -The iterator over the aggregates maps. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:295 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -SmootherTraits< Smoother >::Arguments SmootherArgs │ │ │ │ │ -The argument type for the construction of the smoother. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_e_l_e_c_t_e_d_S_o_l_v_e_r │ │ │ │ │ -Solver< Matrix, solver > SelectedSolver │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:677 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ -std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< │ │ │ │ │ -MatrixAdapter< M, X, Y > > &op, const std::string &smoother, const Dune:: │ │ │ │ │ -ParameterTree &config) const │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1182 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_T_o_L_o_w_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::string operator()(const std::string &str) │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:378 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ -std::shared_ptr< Dune::Preconditioner< typename OP::element_type::domain_type, │ │ │ │ │ -typename OP::element_type::range_type > > makeAMG(const OP &op, const std:: │ │ │ │ │ -string &smoother, const Dune::ParameterTree &config) const │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1175 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_S_m_o_o_t_h_e_r │ │ │ │ │ -S Smoother │ │ │ │ │ -The type of the smoother. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_:_:_n_a_m_e │ │ │ │ │ -static std::string name() │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:649 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_s_m_o_o_t_h_e_r │ │ │ │ │ -Hierarchy< Smoother, A >::Iterator smoother │ │ │ │ │ -The iterator over the smoothers. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_O_p_e_r_a_t_o_r │ │ │ │ │ -M Operator │ │ │ │ │ -The matrix operator type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_m_a_t_r_i_x │ │ │ │ │ -OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix │ │ │ │ │ -The iterator over the matrices. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u_ _>_:_:_t_y_p_e │ │ │ │ │ -SuperLU< M > type │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:667 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_<_ _M_,_ _s_u_p_e_r_l_u_ _>_:_:_c_r_e_a_t_e │ │ │ │ │ -static type * create(const M &mat, bool verbose, bool reusevector) │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:668 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_r_e_d_i_s_t │ │ │ │ │ -OperatorHierarchy::RedistributeInfoList::const_iterator redist │ │ │ │ │ -The iterator over the redistribution information. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:291 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_R_a_n_g_e │ │ │ │ │ -X Range │ │ │ │ │ -The range type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_r_e_s_m_o_o_t_h │ │ │ │ │ -void presmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ -Apply pre smoothing on the current level. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_g_e_t_C_o_a_r_s_e_s_t_A_g_g_r_e_g_a_t_e_N_u_m_b_e_r_s │ │ │ │ │ -void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont) │ │ │ │ │ -Get the aggregate number of each unknown on the coarsest level. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1162 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_l_e_v_e_l_s │ │ │ │ │ -std::size_t levels() │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:876 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r_:_:_t_y_p_e │ │ │ │ │ -InverseOperator< Vector, Vector > type │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:643 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ -std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< │ │ │ │ │ -OverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, │ │ │ │ │ -const Dune::ParameterTree &config) const │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1203 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_h_s │ │ │ │ │ -Hierarchy< Domain, A >::Iterator lhs │ │ │ │ │ -The iterator over the left hand side. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_A_r_g_u_m_e_n_t_s │ │ │ │ │ -const void * Arguments │ │ │ │ │ -A type holding all the arguments needed to call the constructor. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_s_o_l_v_e_r │ │ │ │ │ -static constexpr SolverType solver │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:629 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_n_s_t_r_u_c_t_i_o_n_T_r_a_i_t_s_:_:_c_o_n_s_t_r_u_c_t │ │ │ │ │ -static std::shared_ptr< T > construct(Arguments &args) │ │ │ │ │ -Construct an object with the specified arguments. │ │ │ │ │ -DDeeffiinniittiioonn construction.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_i_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -static constexpr bool isDirectSolver │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:679 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_r_e_c_a_l_c_u_l_a_t_e_H_i_e_r_a_r_c_h_y │ │ │ │ │ -void recalculateHierarchy() │ │ │ │ │ -Recalculate the matrix hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:221 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -Matrix::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:626 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -SelectedSolver::type DirectSolver │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:678 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL │ │ │ │ │ ->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL tl, │ │ │ │ │ -const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std:: │ │ │ │ │ -enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value, │ │ │ │ │ -int >=0) const │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1248 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_H_i_e_r_a_r_c_h_y │ │ │ │ │ -OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy │ │ │ │ │ -The parallal data distribution hierarchy type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_C_o_a_r_s_e_S_o_l_v_e_r │ │ │ │ │ -InverseOperator< X, X > CoarseSolver │ │ │ │ │ -the type of the coarse solver. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_p_o_s_t │ │ │ │ │ -void post(Domain &x) │ │ │ │ │ -Clean up. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1139 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_m_a_x_l_e_v_e_l_s │ │ │ │ │ -std::size_t maxlevels() │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:881 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_m_a_k_e_A_M_G │ │ │ │ │ -std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr< │ │ │ │ │ -NonoverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother, │ │ │ │ │ -const Dune::ParameterTree &config) const │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1226 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_p_o_s_t_s_m_o_o_t_h │ │ │ │ │ -void postsmooth(LevelContext &levelContext, size_t steps) │ │ │ │ │ -Apply post smoothing on the current level. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:428 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_l_e_v_e_l │ │ │ │ │ -std::size_t level │ │ │ │ │ -The level index. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_A_M_G │ │ │ │ │ -AMG(const Operator &fineOperator, const C &criterion, const SmootherArgs │ │ │ │ │ -&smootherArgs=SmootherArgs(), const ParallelInformation │ │ │ │ │ -&pinfo=ParallelInformation()) │ │ │ │ │ -Construct an AMG with an inexact coarse solver based on the smoother. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:428 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_a_p_p_l_y │ │ │ │ │ -void apply(Domain &v, const Range &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:888 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_L_e_v_e_l_C_o_n_t_e_x_t_:_:_S_m_o_o_t_h_e_r_T_y_p_e │ │ │ │ │ -Smoother SmootherType │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_O_p_e_r_a_t_o_r_H_i_e_r_a_r_c_h_y │ │ │ │ │ -MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy │ │ │ │ │ -The operator hierarchy type. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G_:_:_P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -PI ParallelInformation │ │ │ │ │ -The type of the parallel information. Either OwnerOverlapCommunication or │ │ │ │ │ -another type describing the... │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_n_o_n_e │ │ │ │ │ -@ none │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_u_m_f_p_a_c_k │ │ │ │ │ -@ umfpack │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_s_u_p_e_r_l_u │ │ │ │ │ -@ superlu │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_a_t_O_n_c_e_A_c_c_u │ │ │ │ │ -@ atOnceAccu │ │ │ │ │ -Accumulate data to one process at once. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_n_o_A_c_c_u │ │ │ │ │ -@ noAccu │ │ │ │ │ -No data accumulution. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_s_u_c_c_e_s_s_i_v_e_A_c_c_u │ │ │ │ │ -@ successiveAccu │ │ │ │ │ -Successively accumulate to fewer processes. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y │ │ │ │ │ +Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > │ │ │ │ │ +PreconditionerFactory │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y │ │ │ │ │ +Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > │ │ │ │ │ +DirectSolverFactory │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e │ │ │ │ │ +std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< │ │ │ │ │ +LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, │ │ │ │ │ +const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &) │ │ │ │ │ +IterativeSolverSignature │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l │ │ │ │ │ +std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std:: │ │ │ │ │ +shared_ptr< Preconditioner > &prec, const O &) │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e │ │ │ │ │ +std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) │ │ │ │ │ +DirectSolverSignature │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:28 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t_S_o_l_v_e_r_F_r_o_m_F_a_c_t_o_r_y │ │ │ │ │ +std::shared_ptr< InverseOperator< typename Operator::domain_type, typename │ │ │ │ │ +Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op, │ │ │ │ │ +const ParameterTree &config, std::shared_ptr< Preconditioner< typename │ │ │ │ │ +Operator::domain_type, typename Operator::range_type > > prec=nullptr) │ │ │ │ │ +Instantiates an InverseOperator from an Operator and a configuration given as a │ │ │ │ │ +ParameterTree. │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y │ │ │ │ │ +Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > │ │ │ │ │ +IterativeSolverFactory │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e │ │ │ │ │ +std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const │ │ │ │ │ +ParameterTree &) PreconditionerSignature │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:34 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ -Export the type representing the underlying field. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::const_iterator ConstColIterator │ │ │ │ │ -Const iterator for the entries of each row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -T block_type │ │ │ │ │ -Export the type representing the components. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, │ │ │ │ │ +SolverCategory::Category category) │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:242 │ │ │ │ │ _D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ A nonoverlapping operator with communication object. │ │ │ │ │ DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ _D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ Adapter to turn a matrix into a linear operator. │ │ │ │ │ DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_a_g_o_n_a_l │ │ │ │ │ -Norm that uses only the [N][N] entry of the block to determine couplings. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_R_o_w_S_u_m │ │ │ │ │ -Functor using the row sum (infinity) norm to determine strong couplings. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:463 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_F_r_o_b_e_n_i_u_s_N_o_r_m │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:480 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_l_w_a_y_s_O_n_e_N_o_r_m │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:496 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -Criterion taking advantage of symmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:519 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_U_n_S_y_m_m_e_t_r_i_c_C_r_i_t_e_r_i_o_n │ │ │ │ │ -Criterion suitable for unsymmetric matrices. │ │ │ │ │ -DDeeffiinniittiioonn aggregates.hh:539 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_M_G │ │ │ │ │ -an algebraic multigrid method using a Krylov-cycle. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_K_A_m_g_T_w_o_G_r_i_d │ │ │ │ │ -Two grid operator for AMG with Krylov cycle. │ │ │ │ │ -DDeeffiinniittiioonn kamg.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_A_M_G │ │ │ │ │ -Parallel algebraic multigrid based on agglomeration. │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:625 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_e_l_e_c_t_o_r_:_:_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:642 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1169 │ │ │ │ │ -_D_u_n_e_:_:_A_M_G_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn amg.hh:1170 │ │ │ │ │ _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ An overlapping Schwarz operator. │ │ │ │ │ DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _> │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_<_ _P_a_r_a_l_l_e_l_I_n_f_o_r_m_a_t_i_o_n_,_ _A_l_l_o_c_a_t_o_r_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation │ │ │ │ │ -> Iterator │ │ │ │ │ -Type of the mutable iterator. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_H_i_e_r_a_r_c_h_y_:_:_L_e_v_e_l_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator over the levels in the hierarchy. │ │ │ │ │ -DDeeffiinniittiioonn hierarchy.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_H_i_e_r_a_r_c_h_y │ │ │ │ │ -The hierarchies build by the coarsening process. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_C_o_a_r_s_e_n_C_r_i_t_e_r_i_o_n │ │ │ │ │ -The criterion describing the stop criteria for the coarsening process. │ │ │ │ │ -DDeeffiinniittiioonn matrixhierarchy.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ -All parameters for AMG. │ │ │ │ │ -DDeeffiinniittiioonn parameters.hh:393 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_D_e_f_a_u_l_t_S_m_o_o_t_h_e_r_A_r_g_s │ │ │ │ │ -The default class for the smoother arguments. │ │ │ │ │ -DDeeffiinniittiioonn smoother.hh:38 │ │ │ │ │ _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ Base class for matrix free definition of preconditioners. │ │ │ │ │ DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _X_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Base class for scalar product and norm computation. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -Categories for the solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_S_u_p_e_r_L_U │ │ │ │ │ -SuperLu Solver. │ │ │ │ │ -DDeeffiinniittiioonn superlu.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_U_M_F_P_a_c_k │ │ │ │ │ -The UMFPack direct sparse solver. │ │ │ │ │ -DDeeffiinniittiioonn umfpack.hh:335 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_ _D_o_m_a_i_n_,_ _R_a_n_g_e_ _> │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y │ │ │ │ │ +Factory to assembly solvers configured by a ParameterTree. │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y_:_:_g_e_t │ │ │ │ │ +static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const │ │ │ │ │ +ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr) │ │ │ │ │ +get a solver from the factory │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y_:_:_g_e_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< │ │ │ │ │ +Operator > op, const ParameterTree &config) │ │ │ │ │ +Construct a Preconditioner for a given Operator. │ │ │ │ │ +DDeeffiinniittiioonn solverfactory.hh:203 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00146.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixindexset.hh File Reference │ │ │ │ +dune-istl: blocklevel.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,35 +70,56 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
matrixindexset.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
blocklevel.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <vector>
│ │ │ │ -#include <set>
│ │ │ │ + │ │ │ │ +

Helper functions for determining the vector/matrix block level. │ │ │ │ +More...

│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::MatrixIndexSet
 Stores the nonzero entries in a sparse matrix. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<typename T >
constexpr std::size_t Dune::maxBlockLevel ()
 Determine the maximum block level of a possibly nested vector/matrix type.
 
template<typename T >
constexpr std::size_t Dune::minBlockLevel ()
 Determine the minimum block level of a possibly nested vector/matrix type.
 
template<typename T >
constexpr bool Dune::hasUniqueBlockLevel ()
 Determine if a vector/matrix has a uniquely determinable block level.
 
template<typename T >
constexpr std::size_t Dune::blockLevel ()
 Determine the block level of a possibly nested vector/matrix type.
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Helper functions for determining the vector/matrix block level.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,43 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -matrixindexset.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +blocklevel.hh File Reference │ │ │ │ │ +Helper functions for determining the vector/matrix block level. _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_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ -  Stores the nonzero entries in a sparse matrix. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +constexpr std::size_t  _D_u_n_e_:_:_m_a_x_B_l_o_c_k_L_e_v_e_l () │ │ │ │ │ +  Determine the maximum block level of a possibly nested │ │ │ │ │ + vector/matrix type. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr std::size_t  _D_u_n_e_:_:_m_i_n_B_l_o_c_k_L_e_v_e_l () │ │ │ │ │ +  Determine the minimum block level of a possibly nested │ │ │ │ │ + vector/matrix type. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + constexpr bool  _D_u_n_e_:_:_h_a_s_U_n_i_q_u_e_B_l_o_c_k_L_e_v_e_l () │ │ │ │ │ +  Determine if a vector/matrix has a uniquely determinable │ │ │ │ │ + block level. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr std::size_t  _D_u_n_e_:_:_b_l_o_c_k_L_e_v_e_l () │ │ │ │ │ +  Determine the block level of a possibly nested vector/ │ │ │ │ │ + matrix type. │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixindexset.hh Source File │ │ │ │ +dune-istl: blocklevel.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,148 +74,203 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
matrixindexset.hh
│ │ │ │ +
blocklevel.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH
│ │ │ │ -
6#define DUNE_ISTL_MATRIXINDEXSET_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <vector>
│ │ │ │ -
9#include <set>
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12
│ │ │ │ -
13
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
16 {
│ │ │ │ -
17
│ │ │ │ -
18 public:
│ │ │ │ -
19 typedef std::size_t size_type;
│ │ │ │ -
20
│ │ │ │ -
│ │ │ │ -
22 MatrixIndexSet() : rows_(0), cols_(0)
│ │ │ │ -
23 {}
│ │ │ │ -
│ │ │ │ -
24
│ │ │ │ -
│ │ │ │ -
26 MatrixIndexSet(size_type rows, size_type cols) : rows_(rows), cols_(cols) {
│ │ │ │ -
27 indices_.resize(rows_);
│ │ │ │ -
28 }
│ │ │ │ -
│ │ │ │ -
29
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
32 rows_ = rows;
│ │ │ │ -
33 cols_ = cols;
│ │ │ │ -
34 indices_.resize(rows_);
│ │ │ │ -
35 }
│ │ │ │ -
│ │ │ │ -
36
│ │ │ │ -
│ │ │ │ -
38 void add(size_type i, size_type j) {
│ │ │ │ -
39 indices_[i].insert(j);
│ │ │ │ -
40 }
│ │ │ │ -
│ │ │ │ -
41
│ │ │ │ -
│ │ │ │ -
43 size_type size() const {
│ │ │ │ -
44 size_type entries = 0;
│ │ │ │ -
45 for (size_type i=0; i<rows_; i++)
│ │ │ │ -
46 entries += indices_[i].size();
│ │ │ │ -
47
│ │ │ │ -
48 return entries;
│ │ │ │ -
49 }
│ │ │ │ -
│ │ │ │ -
50
│ │ │ │ -
52 size_type rows() const {return rows_;}
│ │ │ │ -
53
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_ISTL_BLOCKLEVEL_HH
│ │ │ │ +
7#define DUNE_ISTL_BLOCKLEVEL_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/indices.hh>
│ │ │ │ +
13#include <dune/common/typetraits.hh>
│ │ │ │ +
14#include <dune/common/hybridutilities.hh>
│ │ │ │ +
15
│ │ │ │ +
21// forward declaration
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23template<typename... Args>
│ │ │ │ +
24class MultiTypeBlockVector;
│ │ │ │ +
25template<typename FirstRow, typename... Args>
│ │ │ │ +
26class MultiTypeBlockMatrix;
│ │ │ │ +
27} // end namespace Dune
│ │ │ │ +
28
│ │ │ │ +
29namespace Dune { namespace Impl {
│ │ │ │ +
30
│ │ │ │ +
31// forward declaration
│ │ │ │ +
32template<typename T> struct MaxBlockLevel;
│ │ │ │ +
33template<typename T> struct MinBlockLevel;
│ │ │ │ +
34
│ │ │ │ +
36template<typename M, template<typename B> typename BlockLevel, typename Op>
│ │ │ │ +
37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op)
│ │ │ │ +
38{
│ │ │ │ +
39 // inialize with zeroth diagonal block
│ │ │ │ +
40 using namespace Dune::Indices;
│ │ │ │ +
41 using Block00 = typename std::decay_t<decltype(std::declval<M>()[_0][_0])>;
│ │ │ │ +
42 std::size_t blockLevel = BlockLevel<Block00>::value() + 1;
│ │ │ │ +
43 // iterate over all blocks to determine min/max block level
│ │ │ │ +
44 using namespace Dune::Hybrid;
│ │ │ │ +
45 forEach(integralRange(index_constant<M::N()>()), [&](auto&& i) {
│ │ │ │ +
46 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ +
47 forEach(integralRange(index_constant<M::M()>()), [&](auto&& j) {
│ │ │ │ +
48 using Block = typename std::decay_t<decltype(std::declval<M>()[i][j])>;
│ │ │ │ +
49 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
│ │ │ │ +
50 });
│ │ │ │ +
51 });
│ │ │ │ +
52 return blockLevel;
│ │ │ │ +
53}
│ │ │ │
54
│ │ │ │ -
56 size_type rowsize(size_type row) const {return indices_[row].size();}
│ │ │ │ -
57
│ │ │ │ -
64 template <class MatrixType>
│ │ │ │ -
│ │ │ │ -
65 void import(const MatrixType& m, size_type rowOffset=0, size_type colOffset=0) {
│ │ │ │ -
66
│ │ │ │ -
67 typedef typename MatrixType::row_type RowType;
│ │ │ │ -
68 typedef typename RowType::ConstIterator ColumnIterator;
│ │ │ │ -
69
│ │ │ │ -
70 for (size_type rowIdx=0; rowIdx<m.N(); rowIdx++) {
│ │ │ │ +
56template<typename V, template<typename B> typename BlockLevel, typename Op>
│ │ │ │ +
57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op)
│ │ │ │ +
58{
│ │ │ │ +
59 // inialize with zeroth block
│ │ │ │ +
60 using namespace Dune::Indices;
│ │ │ │ +
61 using Block0 = typename std::decay_t<decltype(std::declval<V>()[_0])>;
│ │ │ │ +
62 std::size_t blockLevel = BlockLevel<Block0>::value() + 1;
│ │ │ │ +
63 // iterate over all blocks to determine min/max block level
│ │ │ │ +
64 using namespace Dune::Hybrid;
│ │ │ │ +
65 forEach(integralRange(index_constant<V::size()>()), [&](auto&& i) {
│ │ │ │ +
66 using Block = typename std::decay_t<decltype(std::declval<V>()[i])>;
│ │ │ │ +
67 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
│ │ │ │ +
68 });
│ │ │ │ +
69 return blockLevel;
│ │ │ │ +
70}
│ │ │ │
71
│ │ │ │ -
72 const RowType& row = m[rowIdx];
│ │ │ │ -
73
│ │ │ │ -
74 ColumnIterator cIt = row.begin();
│ │ │ │ -
75 ColumnIterator cEndIt = row.end();
│ │ │ │ -
76
│ │ │ │ -
77 for(; cIt!=cEndIt; ++cIt)
│ │ │ │ -
78 add(rowIdx+rowOffset, cIt.index()+colOffset);
│ │ │ │ -
79
│ │ │ │ -
80 }
│ │ │ │ -
81
│ │ │ │ -
82 }
│ │ │ │ -
│ │ │ │ -
83
│ │ │ │ -
89 template <class MatrixType>
│ │ │ │ -
│ │ │ │ -
90 void exportIdx(MatrixType& matrix) const {
│ │ │ │ -
91
│ │ │ │ -
92 matrix.setSize(rows_, cols_);
│ │ │ │ -
93 matrix.setBuildMode(MatrixType::random);
│ │ │ │ -
94
│ │ │ │ -
95 for (size_type i=0; i<rows_; i++)
│ │ │ │ -
96 matrix.setrowsize(i, indices_[i].size());
│ │ │ │ -
97
│ │ │ │ -
98 matrix.endrowsizes();
│ │ │ │ -
99
│ │ │ │ -
100 for (size_type i=0; i<rows_; i++) {
│ │ │ │ -
101
│ │ │ │ -
102 typename std::set<size_type>::iterator it = indices_[i].begin();
│ │ │ │ -
103 for (; it!=indices_[i].end(); ++it)
│ │ │ │ -
104 matrix.addindex(i, *it);
│ │ │ │ -
105
│ │ │ │ -
106 }
│ │ │ │ -
107
│ │ │ │ -
108 matrix.endindices();
│ │ │ │ -
109
│ │ │ │ -
110 }
│ │ │ │ -
│ │ │ │ -
111
│ │ │ │ -
112 private:
│ │ │ │ -
113
│ │ │ │ -
114 std::vector<std::set<size_type> > indices_;
│ │ │ │ -
115
│ │ │ │ -
116 size_type rows_, cols_;
│ │ │ │ -
117
│ │ │ │ -
118 };
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
120
│ │ │ │ -
121} // end namespace Dune
│ │ │ │ -
122
│ │ │ │ -
123#endif
│ │ │ │ +
72template<typename T>
│ │ │ │ +
73struct MaxBlockLevel
│ │ │ │ +
74{
│ │ │ │ +
75 static constexpr std::size_t value(){
│ │ │ │ +
76 if constexpr (IsNumber<T>::value)
│ │ │ │ +
77 return 0;
│ │ │ │ +
78 else
│ │ │ │ +
79 return MaxBlockLevel<typename T::block_type>::value() + 1;
│ │ │ │ +
80 }
│ │ │ │ +
81};
│ │ │ │ +
82
│ │ │ │ +
83template<typename T>
│ │ │ │ +
84struct MinBlockLevel
│ │ │ │ +
85{
│ │ │ │ +
86 // the default implementation assumes minBlockLevel == maxBlockLevel
│ │ │ │ +
87 static constexpr std::size_t value()
│ │ │ │ +
88 { return MaxBlockLevel<T>::value(); }
│ │ │ │ +
89};
│ │ │ │ +
90
│ │ │ │ +
91// max block level for MultiTypeBlockMatrix
│ │ │ │ +
92template<typename FirstRow, typename... Args>
│ │ │ │ +
93struct MaxBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
│ │ │ │ +
94{
│ │ │ │ +
95 static constexpr std::size_t value()
│ │ │ │ +
96 {
│ │ │ │ +
97 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
│ │ │ │ +
98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
│ │ │ │ +
99 return blockLevelMultiTypeBlockMatrix<M, MaxBlockLevel>(max);
│ │ │ │ +
100 }
│ │ │ │ +
101};
│ │ │ │ +
102
│ │ │ │ +
103// min block level for MultiTypeBlockMatrix
│ │ │ │ +
104template<typename FirstRow, typename... Args>
│ │ │ │ +
105struct MinBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
│ │ │ │ +
106{
│ │ │ │ +
107 static constexpr std::size_t value()
│ │ │ │ +
108 {
│ │ │ │ +
109 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
│ │ │ │ +
110 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
│ │ │ │ +
111 return blockLevelMultiTypeBlockMatrix<M, MinBlockLevel>(min);
│ │ │ │ +
112 }
│ │ │ │ +
113};
│ │ │ │ +
114
│ │ │ │ +
115// max block level for MultiTypeBlockVector
│ │ │ │ +
116template<typename... Args>
│ │ │ │ +
117struct MaxBlockLevel<Dune::MultiTypeBlockVector<Args...>>
│ │ │ │ +
118{
│ │ │ │ +
119 static constexpr std::size_t value()
│ │ │ │ +
120 {
│ │ │ │ +
121 using V = MultiTypeBlockVector<Args...>;
│ │ │ │ +
122 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
│ │ │ │ +
123 return blockLevelMultiTypeBlockVector<V, MaxBlockLevel>(max);
│ │ │ │ +
124 }
│ │ │ │ +
125};
│ │ │ │ +
126
│ │ │ │ +
127// min block level for MultiTypeBlockVector
│ │ │ │ +
128template<typename... Args>
│ │ │ │ +
129struct MinBlockLevel<Dune::MultiTypeBlockVector<Args...>>
│ │ │ │ +
130{
│ │ │ │ +
131 static constexpr std::size_t value()
│ │ │ │ +
132 {
│ │ │ │ +
133 using V = MultiTypeBlockVector<Args...>;
│ │ │ │ +
134 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
│ │ │ │ +
135 return blockLevelMultiTypeBlockVector<V, MinBlockLevel>(min);
│ │ │ │ +
136 }
│ │ │ │ +
137};
│ │ │ │ +
138
│ │ │ │ +
139// special case: empty MultiTypeBlockVector
│ │ │ │ +
140template<>
│ │ │ │ +
141struct MaxBlockLevel<Dune::MultiTypeBlockVector<>>
│ │ │ │ +
142{
│ │ │ │ +
143 static constexpr std::size_t value()
│ │ │ │ +
144 { return 0; };
│ │ │ │ +
145};
│ │ │ │ +
146
│ │ │ │ +
147// special case: empty MultiTypeBlockVector
│ │ │ │ +
148template<>
│ │ │ │ +
149struct MinBlockLevel<Dune::MultiTypeBlockVector<>>
│ │ │ │ +
150{
│ │ │ │ +
151 static constexpr std::size_t value()
│ │ │ │ +
152 { return 0; };
│ │ │ │ +
153};
│ │ │ │ +
154
│ │ │ │ +
155}} // end namespace Dune::Impl
│ │ │ │ +
156
│ │ │ │ +
157namespace Dune {
│ │ │ │ +
158
│ │ │ │ +
160template<typename T>
│ │ │ │ +
│ │ │ │ +
161constexpr std::size_t maxBlockLevel()
│ │ │ │ +
162{ return Impl::MaxBlockLevel<T>::value(); }
│ │ │ │ +
│ │ │ │ +
163
│ │ │ │ +
165template<typename T>
│ │ │ │ +
│ │ │ │ +
166constexpr std::size_t minBlockLevel()
│ │ │ │ +
167{ return Impl::MinBlockLevel<T>::value(); }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
170template<typename T>
│ │ │ │ +
│ │ │ │ +
171constexpr bool hasUniqueBlockLevel()
│ │ │ │ +
172{ return maxBlockLevel<T>() == minBlockLevel<T>(); }
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
175template<typename T>
│ │ │ │ +
│ │ │ │ +
176constexpr std::size_t blockLevel()
│ │ │ │ +
177{
│ │ │ │ +
178 static_assert(hasUniqueBlockLevel<T>(), "Block level cannot be uniquely determined!");
│ │ │ │ +
179 return Impl::MaxBlockLevel<T>::value();
│ │ │ │ +
180}
│ │ │ │ +
│ │ │ │ +
181
│ │ │ │ +
182} // end namespace Dune
│ │ │ │ +
183
│ │ │ │ +
184#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Stores the nonzero entries in a sparse matrix.
Definition matrixindexset.hh:16
│ │ │ │ -
void resize(size_type rows, size_type cols)
Reset the size of an index set.
Definition matrixindexset.hh:31
│ │ │ │ -
MatrixIndexSet()
Default constructor.
Definition matrixindexset.hh:22
│ │ │ │ -
void add(size_type i, size_type j)
Add an index to the index set.
Definition matrixindexset.hh:38
│ │ │ │ -
size_type rows() const
Return the number of rows.
Definition matrixindexset.hh:52
│ │ │ │ -
std::size_t size_type
Definition matrixindexset.hh:19
│ │ │ │ -
void exportIdx(MatrixType &matrix) const
Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet.
Definition matrixindexset.hh:90
│ │ │ │ -
MatrixIndexSet(size_type rows, size_type cols)
Constructor setting the matrix size.
Definition matrixindexset.hh:26
│ │ │ │ -
size_type rowsize(size_type row) const
Return the number of entries in a given row.
Definition matrixindexset.hh:56
│ │ │ │ -
size_type size() const
Return the number of entries.
Definition matrixindexset.hh:43
│ │ │ │ +
constexpr bool hasUniqueBlockLevel()
Determine if a vector/matrix has a uniquely determinable block level.
Definition blocklevel.hh:171
│ │ │ │ +
constexpr std::size_t maxBlockLevel()
Determine the maximum block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:161
│ │ │ │ +
constexpr std::size_t blockLevel()
Determine the block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:176
│ │ │ │ +
constexpr std::size_t minBlockLevel()
Determine the minimum block level of a possibly nested vector/matrix type.
Definition blocklevel.hh:166
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,156 +1,207 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -matrixindexset.hh │ │ │ │ │ +blocklevel.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH │ │ │ │ │ -6#define DUNE_ISTL_MATRIXINDEXSET_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11namespace _D_u_n_e { │ │ │ │ │ -12 │ │ │ │ │ -13 │ │ │ │ │ -_1_5 class _M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ -16 { │ │ │ │ │ -17 │ │ │ │ │ -18 public: │ │ │ │ │ -_1_9 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -20 │ │ │ │ │ -_2_2 _M_a_t_r_i_x_I_n_d_e_x_S_e_t() : rows_(0), cols_(0) │ │ │ │ │ -23 {} │ │ │ │ │ -24 │ │ │ │ │ -_2_6 _M_a_t_r_i_x_I_n_d_e_x_S_e_t(_s_i_z_e___t_y_p_e _r_o_w_s, _s_i_z_e___t_y_p_e cols) : rows_(_r_o_w_s), cols_(cols) { │ │ │ │ │ -27 indices_.resize(rows_); │ │ │ │ │ -28 } │ │ │ │ │ -29 │ │ │ │ │ -_3_1 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e _r_o_w_s, _s_i_z_e___t_y_p_e cols) { │ │ │ │ │ -32 rows_ = _r_o_w_s; │ │ │ │ │ -33 cols_ = cols; │ │ │ │ │ -34 indices_.resize(rows_); │ │ │ │ │ -35 } │ │ │ │ │ -36 │ │ │ │ │ -_3_8 void _a_d_d(_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) { │ │ │ │ │ -39 indices_[i].insert(j); │ │ │ │ │ -40 } │ │ │ │ │ -41 │ │ │ │ │ -_4_3 _s_i_z_e___t_y_p_e _s_i_z_e() const { │ │ │ │ │ -44 _s_i_z_e___t_y_p_e entries = 0; │ │ │ │ │ -45 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +21// forward declaration │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23template │ │ │ │ │ +24class MultiTypeBlockVector; │ │ │ │ │ +25template │ │ │ │ │ +26class MultiTypeBlockMatrix; │ │ │ │ │ +27} // end namespace Dune │ │ │ │ │ +28 │ │ │ │ │ +29namespace _D_u_n_e { namespace Impl { │ │ │ │ │ +30 │ │ │ │ │ +31// forward declaration │ │ │ │ │ +32template struct MaxBlockLevel; │ │ │ │ │ +33template struct MinBlockLevel; │ │ │ │ │ +34 │ │ │ │ │ +36template typename BlockLevel, typename Op> │ │ │ │ │ +37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op) │ │ │ │ │ +38{ │ │ │ │ │ +39 // inialize with zeroth diagonal block │ │ │ │ │ +40 using namespace Dune::Indices; │ │ │ │ │ +41 using Block00 = typename std::decay_t()[_0][_0])>; │ │ │ │ │ +42 std::size_t _b_l_o_c_k_L_e_v_e_l = BlockLevel::value() + 1; │ │ │ │ │ +43 // iterate over all blocks to determine min/max block level │ │ │ │ │ +44 using namespace Dune::Hybrid; │ │ │ │ │ +45 forEach(integralRange(index_constant()), [&](auto&& i) { │ │ │ │ │ +46 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ +47 forEach(integralRange(index_constant()), [&](auto&& j) { │ │ │ │ │ +48 using Block = typename std::decay_t()[i][j])>; │ │ │ │ │ +49 _b_l_o_c_k_L_e_v_e_l = op(_b_l_o_c_k_L_e_v_e_l, BlockLevel::value() + 1); │ │ │ │ │ +50 }); │ │ │ │ │ +51 }); │ │ │ │ │ +52 return _b_l_o_c_k_L_e_v_e_l; │ │ │ │ │ +53} │ │ │ │ │ 54 │ │ │ │ │ -_5_6 _s_i_z_e___t_y_p_e _r_o_w_s_i_z_e(_s_i_z_e___t_y_p_e row) const {return indices_[row].size();} │ │ │ │ │ -57 │ │ │ │ │ -64 template │ │ │ │ │ -_6_5 void import(const MatrixType& m, _s_i_z_e___t_y_p_e rowOffset=0, _s_i_z_e___t_y_p_e │ │ │ │ │ -colOffset=0) { │ │ │ │ │ -66 │ │ │ │ │ -67 typedef typename MatrixType::row_type RowType; │ │ │ │ │ -68 typedef typename RowType::ConstIterator ColumnIterator; │ │ │ │ │ -69 │ │ │ │ │ -70 for (_s_i_z_e___t_y_p_e rowIdx=0; rowIdx typename BlockLevel, typename Op> │ │ │ │ │ +57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op) │ │ │ │ │ +58{ │ │ │ │ │ +59 // inialize with zeroth block │ │ │ │ │ +60 using namespace Dune::Indices; │ │ │ │ │ +61 using Block0 = typename std::decay_t()[_0])>; │ │ │ │ │ +62 std::size_t _b_l_o_c_k_L_e_v_e_l = BlockLevel::value() + 1; │ │ │ │ │ +63 // iterate over all blocks to determine min/max block level │ │ │ │ │ +64 using namespace Dune::Hybrid; │ │ │ │ │ +65 forEach(integralRange(index_constant()), [&](auto&& i) { │ │ │ │ │ +66 using Block = typename std::decay_t()[i])>; │ │ │ │ │ +67 _b_l_o_c_k_L_e_v_e_l = op(_b_l_o_c_k_L_e_v_e_l, BlockLevel::value() + 1); │ │ │ │ │ +68 }); │ │ │ │ │ +69 return _b_l_o_c_k_L_e_v_e_l; │ │ │ │ │ +70} │ │ │ │ │ 71 │ │ │ │ │ -72 const RowType& row = m[rowIdx]; │ │ │ │ │ -73 │ │ │ │ │ -74 ColumnIterator cIt = row.begin(); │ │ │ │ │ -75 ColumnIterator cEndIt = row.end(); │ │ │ │ │ -76 │ │ │ │ │ -77 for(; cIt!=cEndIt; ++cIt) │ │ │ │ │ -78 _a_d_d(rowIdx+rowOffset, cIt.index()+colOffset); │ │ │ │ │ -79 │ │ │ │ │ +72template │ │ │ │ │ +73struct MaxBlockLevel │ │ │ │ │ +74{ │ │ │ │ │ +75 static constexpr std::size_t value(){ │ │ │ │ │ +76 if constexpr (IsNumber::value) │ │ │ │ │ +77 return 0; │ │ │ │ │ +78 else │ │ │ │ │ +79 return MaxBlockLevel::value() + 1; │ │ │ │ │ 80 } │ │ │ │ │ -81 │ │ │ │ │ -82 } │ │ │ │ │ -83 │ │ │ │ │ -89 template │ │ │ │ │ -_9_0 void _e_x_p_o_r_t_I_d_x(MatrixType& matrix) const { │ │ │ │ │ -91 │ │ │ │ │ -92 matrix.setSize(rows_, cols_); │ │ │ │ │ -93 matrix.setBuildMode(MatrixType::random); │ │ │ │ │ -94 │ │ │ │ │ -95 for (_s_i_z_e___t_y_p_e i=0; i::iterator it = indices_[i].begin(); │ │ │ │ │ -103 for (; it!=indices_[i].end(); ++it) │ │ │ │ │ -104 matrix.addindex(i, *it); │ │ │ │ │ -105 │ │ │ │ │ -106 } │ │ │ │ │ -107 │ │ │ │ │ -108 matrix.endindices(); │ │ │ │ │ -109 │ │ │ │ │ -110 } │ │ │ │ │ -111 │ │ │ │ │ -112 private: │ │ │ │ │ -113 │ │ │ │ │ -114 std::vector > indices_; │ │ │ │ │ -115 │ │ │ │ │ -116 _s_i_z_e___t_y_p_e rows_, cols_; │ │ │ │ │ -117 │ │ │ │ │ -118 }; │ │ │ │ │ -119 │ │ │ │ │ -120 │ │ │ │ │ -121} // end namespace Dune │ │ │ │ │ -122 │ │ │ │ │ -123#endif │ │ │ │ │ +81}; │ │ │ │ │ +82 │ │ │ │ │ +83template │ │ │ │ │ +84struct MinBlockLevel │ │ │ │ │ +85{ │ │ │ │ │ +86 // the default implementation assumes minBlockLevel == maxBlockLevel │ │ │ │ │ +87 static constexpr std::size_t value() │ │ │ │ │ +88 { return MaxBlockLevel::value(); } │ │ │ │ │ +89}; │ │ │ │ │ +90 │ │ │ │ │ +91// max block level for MultiTypeBlockMatrix │ │ │ │ │ +92template │ │ │ │ │ +93struct MaxBlockLevel<_D_u_n_e::MultiTypeBlockMatrix> │ │ │ │ │ +94{ │ │ │ │ │ +95 static constexpr std::size_t value() │ │ │ │ │ +96 { │ │ │ │ │ +97 using M = MultiTypeBlockMatrix; │ │ │ │ │ +98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); │ │ │ │ │ +}; │ │ │ │ │ +99 return blockLevelMultiTypeBlockMatrix(max); │ │ │ │ │ +100 } │ │ │ │ │ +101}; │ │ │ │ │ +102 │ │ │ │ │ +103// min block level for MultiTypeBlockMatrix │ │ │ │ │ +104template │ │ │ │ │ +105struct MinBlockLevel<_D_u_n_e::MultiTypeBlockMatrix> │ │ │ │ │ +106{ │ │ │ │ │ +107 static constexpr std::size_t value() │ │ │ │ │ +108 { │ │ │ │ │ +109 using M = MultiTypeBlockMatrix; │ │ │ │ │ +110 constexpr auto min = [](const auto& a, const auto& b){ return std::min │ │ │ │ │ +(a,b); }; │ │ │ │ │ +111 return blockLevelMultiTypeBlockMatrix(min); │ │ │ │ │ +112 } │ │ │ │ │ +113}; │ │ │ │ │ +114 │ │ │ │ │ +115// max block level for MultiTypeBlockVector │ │ │ │ │ +116template │ │ │ │ │ +117struct MaxBlockLevel<_D_u_n_e::MultiTypeBlockVector> │ │ │ │ │ +118{ │ │ │ │ │ +119 static constexpr std::size_t value() │ │ │ │ │ +120 { │ │ │ │ │ +121 using V = MultiTypeBlockVector; │ │ │ │ │ +122 constexpr auto max = [](const auto& a, const auto& b){ return std::max │ │ │ │ │ +(a,b); }; │ │ │ │ │ +123 return blockLevelMultiTypeBlockVector(max); │ │ │ │ │ +124 } │ │ │ │ │ +125}; │ │ │ │ │ +126 │ │ │ │ │ +127// min block level for MultiTypeBlockVector │ │ │ │ │ +128template │ │ │ │ │ +129struct MinBlockLevel<_D_u_n_e::MultiTypeBlockVector> │ │ │ │ │ +130{ │ │ │ │ │ +131 static constexpr std::size_t value() │ │ │ │ │ +132 { │ │ │ │ │ +133 using V = MultiTypeBlockVector; │ │ │ │ │ +134 constexpr auto min = [](const auto& a, const auto& b){ return std::min │ │ │ │ │ +(a,b); }; │ │ │ │ │ +135 return blockLevelMultiTypeBlockVector(min); │ │ │ │ │ +136 } │ │ │ │ │ +137}; │ │ │ │ │ +138 │ │ │ │ │ +139// special case: empty MultiTypeBlockVector │ │ │ │ │ +140template<> │ │ │ │ │ +141struct MaxBlockLevel<_D_u_n_e::MultiTypeBlockVector<>> │ │ │ │ │ +142{ │ │ │ │ │ +143 static constexpr std::size_t value() │ │ │ │ │ +144 { return 0; }; │ │ │ │ │ +145}; │ │ │ │ │ +146 │ │ │ │ │ +147// special case: empty MultiTypeBlockVector │ │ │ │ │ +148template<> │ │ │ │ │ +149struct MinBlockLevel<_D_u_n_e::MultiTypeBlockVector<>> │ │ │ │ │ +150{ │ │ │ │ │ +151 static constexpr std::size_t value() │ │ │ │ │ +152 { return 0; }; │ │ │ │ │ +153}; │ │ │ │ │ +154 │ │ │ │ │ +155}} // end namespace Dune::Impl │ │ │ │ │ +156 │ │ │ │ │ +157namespace _D_u_n_e { │ │ │ │ │ +158 │ │ │ │ │ +160template │ │ │ │ │ +_1_6_1constexpr std::size_t _m_a_x_B_l_o_c_k_L_e_v_e_l() │ │ │ │ │ +162{ return Impl::MaxBlockLevel::value(); } │ │ │ │ │ +163 │ │ │ │ │ +165template │ │ │ │ │ +_1_6_6constexpr std::size_t _m_i_n_B_l_o_c_k_L_e_v_e_l() │ │ │ │ │ +167{ return Impl::MinBlockLevel::value(); } │ │ │ │ │ +168 │ │ │ │ │ +170template │ │ │ │ │ +_1_7_1constexpr bool _h_a_s_U_n_i_q_u_e_B_l_o_c_k_L_e_v_e_l() │ │ │ │ │ +172{ return maxBlockLevel() == minBlockLevel(); } │ │ │ │ │ +173 │ │ │ │ │ +175template │ │ │ │ │ +_1_7_6constexpr std::size_t _b_l_o_c_k_L_e_v_e_l() │ │ │ │ │ +177{ │ │ │ │ │ +178 static_assert(hasUniqueBlockLevel(), "Block level cannot be uniquely │ │ │ │ │ +determined!"); │ │ │ │ │ +179 return Impl::MaxBlockLevel::value(); │ │ │ │ │ +180} │ │ │ │ │ +181 │ │ │ │ │ +182} // end namespace Dune │ │ │ │ │ +183 │ │ │ │ │ +184#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ -Stores the nonzero entries in a sparse matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type rows, size_type cols) │ │ │ │ │ -Reset the size of an index set. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ -MatrixIndexSet() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_a_d_d │ │ │ │ │ -void add(size_type i, size_type j) │ │ │ │ │ -Add an index to the index set. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_r_o_w_s │ │ │ │ │ -size_type rows() const │ │ │ │ │ -Return the number of rows. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_e_x_p_o_r_t_I_d_x │ │ │ │ │ -void exportIdx(MatrixType &matrix) const │ │ │ │ │ -Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ -MatrixIndexSet(size_type rows, size_type cols) │ │ │ │ │ -Constructor setting the matrix size. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:26 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_r_o_w_s_i_z_e │ │ │ │ │ -size_type rowsize(size_type row) const │ │ │ │ │ -Return the number of entries in a given row. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Return the number of entries. │ │ │ │ │ -DDeeffiinniittiioonn matrixindexset.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_h_a_s_U_n_i_q_u_e_B_l_o_c_k_L_e_v_e_l │ │ │ │ │ +constexpr bool hasUniqueBlockLevel() │ │ │ │ │ +Determine if a vector/matrix has a uniquely determinable block level. │ │ │ │ │ +DDeeffiinniittiioonn blocklevel.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_m_a_x_B_l_o_c_k_L_e_v_e_l │ │ │ │ │ +constexpr std::size_t maxBlockLevel() │ │ │ │ │ +Determine the maximum block level of a possibly nested vector/matrix type. │ │ │ │ │ +DDeeffiinniittiioonn blocklevel.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_b_l_o_c_k_L_e_v_e_l │ │ │ │ │ +constexpr std::size_t blockLevel() │ │ │ │ │ +Determine the block level of a possibly nested vector/matrix type. │ │ │ │ │ +DDeeffiinniittiioonn blocklevel.hh:176 │ │ │ │ │ +_D_u_n_e_:_:_m_i_n_B_l_o_c_k_L_e_v_e_l │ │ │ │ │ +constexpr std::size_t minBlockLevel() │ │ │ │ │ +Determine the minimum block level of a possibly nested vector/matrix type. │ │ │ │ │ +DDeeffiinniittiioonn blocklevel.hh:166 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00149.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: multitypeblockmatrix.hh File Reference │ │ │ │ +dune-istl: arpackpp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,67 +65,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
multitypeblockmatrix.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
arpackpp.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <cmath>
│ │ │ │ #include <iostream>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include "gsetc.hh"
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │ +#include <dune/istl/bvector.hh>
│ │ │ │ +#include <dune/istl/istlexception.hh>
│ │ │ │ +#include <dune/istl/io.hh>
│ │ │ │ +#include "arssym.h"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::MultiTypeBlockMatrix< FirstRow, Args >
 A Matrix class to support different block types. More...
 
class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col >
 part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
 
class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 >
 
class  Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row >
 solver for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
 
class  Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 >
 
struct  std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >
 Make std::tuple_element work for MultiTypeBlockMatrix. More...
class  Dune::ArPackPlusPlus_Algorithms< BCRSMatrix, BlockVector >
 Wrapper to use a range of ARPACK++ eigenvalue solvers. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  std
 STL namespace.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<typename T1 , typename... Args>
std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockMatrix< T1, Args... > &m)
 << operator for a MultiTypeBlockMatrix
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,47 +1,29 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -multitypeblockmatrix.hh File Reference │ │ │ │ │ + * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +arpackpp.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ +#include "arssym.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_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _F_i_r_s_t_R_o_w_,_ _A_r_g_s_ _> │ │ │ │ │ -  A _M_a_t_r_i_x class to support different block types. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_ _I_,_ _c_r_o_w_,_ _c_c_o_l_,_ _r_e_m_a_i_n___c_o_l_ _> │ │ │ │ │ -  part of solvers for _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r & _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x types │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_ _I_,_ _c_r_o_w_,_ _c_c_o_l_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _r_e_m_a_i_n___r_o_w_ _> │ │ │ │ │ -  solver for _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r & _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x types _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  Make std::tuple_element work for MultiTypeBlockMatrix. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_<_ _B_C_R_S_M_a_t_r_i_x_,_ _B_l_o_c_k_V_e_c_t_o_r_ _> │ │ │ │ │ +  Wrapper to use a range of ARPACK++ eigenvalue solvers. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _s_t_d │ │ │ │ │ -  STL namespace. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x< │ │ │ │ │ - T1, Args... > &m) │ │ │ │ │ -  << operator for a _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: multitypeblockmatrix.hh Source File │ │ │ │ +dune-istl: arpackpp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,670 +70,881 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
multitypeblockmatrix.hh
│ │ │ │ +
arpackpp.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
│ │ │ │ +
6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <iostream>
│ │ │ │ -
10#include <tuple>
│ │ │ │ +
8#if HAVE_ARPACKPP || defined DOXYGEN
│ │ │ │ +
9
│ │ │ │ +
10#include <cmath> // provides std::abs, std::pow, std::sqrt
│ │ │ │
11
│ │ │ │ -
12#include <dune/common/hybridutilities.hh>
│ │ │ │ -
13
│ │ │ │ -
14#include "istlexception.hh"
│ │ │ │ -
15
│ │ │ │ -
16// forward declaration
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
19 template<typename FirstRow, typename... Args>
│ │ │ │ -
20 class MultiTypeBlockMatrix;
│ │ │ │ -
21
│ │ │ │ -
22 template<int I, int crow, int remain_row>
│ │ │ │ -
23 class MultiTypeBlockMatrix_Solver;
│ │ │ │ -
24}
│ │ │ │ -
25
│ │ │ │ -
26#include "gsetc.hh"
│ │ │ │ -
27
│ │ │ │ -
28namespace Dune {
│ │ │ │ -
29
│ │ │ │ -
43 template<typename FirstRow, typename... Args>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
45 : public std::tuple<FirstRow, Args...>
│ │ │ │ -
46 {
│ │ │ │ -
47 using ParentType = std::tuple<FirstRow, Args...>;
│ │ │ │ -
48 public:
│ │ │ │ -
49
│ │ │ │ -
51 using ParentType::ParentType;
│ │ │ │ -
52
│ │ │ │ -
56 typedef MultiTypeBlockMatrix<FirstRow, Args...> type;
│ │ │ │ -
57
│ │ │ │ -
59 using size_type = std::size_t;
│ │ │ │ -
60
│ │ │ │ -
61 typedef typename FirstRow::field_type field_type;
│ │ │ │ -
62
│ │ │ │ -
│ │ │ │ -
64 static constexpr size_type N()
│ │ │ │ -
65 {
│ │ │ │ -
66 return 1+sizeof...(Args);
│ │ │ │ -
67 }
│ │ │ │ -
│ │ │ │ -
68
│ │ │ │ -
74 [[deprecated("Use method 'N' instead")]]
│ │ │ │ -
│ │ │ │ -
75 static constexpr size_type size()
│ │ │ │ -
76 {
│ │ │ │ -
77 return 1+sizeof...(Args);
│ │ │ │ -
78 }
│ │ │ │ -
│ │ │ │ -
79
│ │ │ │ -
│ │ │ │ -
81 static constexpr size_type M()
│ │ │ │ -
82 {
│ │ │ │ -
83 return FirstRow::size();
│ │ │ │ -
84 }
│ │ │ │ -
│ │ │ │ -
85
│ │ │ │ -
102 template< size_type index >
│ │ │ │ -
103 auto
│ │ │ │ -
│ │ │ │ -
104 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
│ │ │ │ -
105 -> decltype(std::get<index>(*this))
│ │ │ │ -
106 {
│ │ │ │ -
107 return std::get<index>(*this);
│ │ │ │ -
108 }
│ │ │ │ -
│ │ │ │ -
109
│ │ │ │ -
115 template< size_type index >
│ │ │ │ -
116 auto
│ │ │ │ -
│ │ │ │ -
117 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
│ │ │ │ -
118 -> decltype(std::get<index>(*this))
│ │ │ │ -
119 {
│ │ │ │ -
120 return std::get<index>(*this);
│ │ │ │ -
121 }
│ │ │ │ -
│ │ │ │ +
12#include <iostream> // provides std::cout, std::endl
│ │ │ │ +
13#include <string> // provides std::string
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/fvector.hh> // provides Dune::FieldVector
│ │ │ │ +
16#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
│ │ │ │ +
17
│ │ │ │ +
18#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
│ │ │ │ +
19#include <dune/istl/bvector.hh> // provides Dune::BlockVector
│ │ │ │ +
20#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
│ │ │ │ +
21#include <dune/istl/io.hh> // provides Dune::printvector(...)
│ │ │ │ +
22
│ │ │ │ +
23#ifdef Status
│ │ │ │ +
24#undef Status // prevent preprocessor from damaging the ARPACK++
│ │ │ │ +
25 // code when "X11/Xlib.h" is included (the latter
│ │ │ │ +
26 // defines Status as "#define Status int" and
│ │ │ │ +
27 // ARPACK++ provides a class with a method called
│ │ │ │ +
28 // Status)
│ │ │ │ +
29#endif
│ │ │ │ +
30#include "arssym.h" // provides ARSymStdEig
│ │ │ │ +
31
│ │ │ │ +
32namespace Dune
│ │ │ │ +
33{
│ │ │ │ +
34
│ │ │ │ +
39 namespace Impl {
│ │ │ │ +
55 template <class BCRSMatrix>
│ │ │ │ +
56 class ArPackPlusPlus_BCRSMatrixWrapper
│ │ │ │ +
57 {
│ │ │ │ +
58 public:
│ │ │ │ +
60 typedef typename BCRSMatrix::field_type Real;
│ │ │ │ +
61
│ │ │ │ +
62 public:
│ │ │ │ +
64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A)
│ │ │ │ +
65 : A_(A),
│ │ │ │ +
66 m_(A_.M() * mBlock), n_(A_.N() * nBlock)
│ │ │ │ +
67 {
│ │ │ │ +
68 // assert that BCRSMatrix type has blocklevel 2
│ │ │ │ +
69 static_assert
│ │ │ │ +
70 (blockLevel<BCRSMatrix>() == 2,
│ │ │ │ +
71 "Only BCRSMatrices with blocklevel 2 are supported.");
│ │ │ │ +
72
│ │ │ │ +
73 // allocate memory for auxiliary block vector objects
│ │ │ │ +
74 // which are compatible to matrix rows / columns
│ │ │ │ +
75 domainBlockVector.resize(A_.N());
│ │ │ │ +
76 rangeBlockVector.resize(A_.M());
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ +
80 inline void multMv (Real* v, Real* w)
│ │ │ │ +
81 {
│ │ │ │ +
82 // get vector v as an object of appropriate type
│ │ │ │ +
83 arrayToDomainBlockVector(v,domainBlockVector);
│ │ │ │ +
84
│ │ │ │ +
85 // perform matrix-vector product
│ │ │ │ +
86 A_.mv(domainBlockVector,rangeBlockVector);
│ │ │ │ +
87
│ │ │ │ +
88 // get vector w from object of appropriate type
│ │ │ │ +
89 rangeBlockVectorToArray(rangeBlockVector,w);
│ │ │ │ +
90 };
│ │ │ │ +
91
│ │ │ │ +
93 inline void multMtMv (Real* v, Real* w)
│ │ │ │ +
94 {
│ │ │ │ +
95 // get vector v as an object of appropriate type
│ │ │ │ +
96 arrayToDomainBlockVector(v,domainBlockVector);
│ │ │ │ +
97
│ │ │ │ +
98 // perform matrix-vector product
│ │ │ │ +
99 A_.mv(domainBlockVector,rangeBlockVector);
│ │ │ │ +
100 A_.mtv(rangeBlockVector,domainBlockVector);
│ │ │ │ +
101
│ │ │ │ +
102 // get vector w from object of appropriate type
│ │ │ │ +
103 domainBlockVectorToArray(domainBlockVector,w);
│ │ │ │ +
104 };
│ │ │ │ +
105
│ │ │ │ +
107 inline void multMMtv (Real* v, Real* w)
│ │ │ │ +
108 {
│ │ │ │ +
109 // get vector v as an object of appropriate type
│ │ │ │ +
110 arrayToRangeBlockVector(v,rangeBlockVector);
│ │ │ │ +
111
│ │ │ │ +
112 // perform matrix-vector product
│ │ │ │ +
113 A_.mtv(rangeBlockVector,domainBlockVector);
│ │ │ │ +
114 A_.mv(domainBlockVector,rangeBlockVector);
│ │ │ │ +
115
│ │ │ │ +
116 // get vector w from object of appropriate type
│ │ │ │ +
117 rangeBlockVectorToArray(rangeBlockVector,w);
│ │ │ │ +
118 };
│ │ │ │ +
119
│ │ │ │ +
121 inline int nrows () const { return m_; }
│ │ │ │
122
│ │ │ │ -
126 template<typename T>
│ │ │ │ -
│ │ │ │ -
127 void operator= (const T& newval) {
│ │ │ │ -
128 using namespace Dune::Hybrid;
│ │ │ │ -
129 auto size = index_constant<1+sizeof...(Args)>();
│ │ │ │ -
130 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented,
│ │ │ │ -
131 // we cannot use a plain forEach(*this, ...). This could be achieved,
│ │ │ │ -
132 // e.g., by implementing a static size() method.
│ │ │ │ -
133 forEach(integralRange(size), [&](auto&& i) {
│ │ │ │ -
134 (*this)[i] = newval;
│ │ │ │ -
135 });
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
138 //===== vector space arithmetic
│ │ │ │ -
139
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 auto size = index_constant<N()>();
│ │ │ │ -
144 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ -
145 (*this)[i] *= k;
│ │ │ │ -
146 });
│ │ │ │ -
147
│ │ │ │ -
148 return *this;
│ │ │ │ -
149 }
│ │ │ │ -
│ │ │ │ -
150
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
153 {
│ │ │ │ -
154 auto size = index_constant<N()>();
│ │ │ │ -
155 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ -
156 (*this)[i] /= k;
│ │ │ │ -
157 });
│ │ │ │ +
124 inline int ncols () const { return n_; }
│ │ │ │ +
125
│ │ │ │ +
126 protected:
│ │ │ │ +
127 // Number of rows and columns in each block of the matrix
│ │ │ │ +
128 constexpr static int mBlock = BCRSMatrix::block_type::rows;
│ │ │ │ +
129 constexpr static int nBlock = BCRSMatrix::block_type::cols;
│ │ │ │ +
130
│ │ │ │ +
131 // Type of vectors in the domain of the linear map associated with
│ │ │ │ +
132 // the matrix, i.e. block vectors compatible to matrix rows
│ │ │ │ +
133 constexpr static int dbvBlockSize = nBlock;
│ │ │ │ +
134 typedef Dune::FieldVector<Real,dbvBlockSize> DomainBlockVectorBlock;
│ │ │ │ +
135 typedef Dune::BlockVector<DomainBlockVectorBlock> DomainBlockVector;
│ │ │ │ +
136
│ │ │ │ +
137 // Type of vectors in the range of the linear map associated with
│ │ │ │ +
138 // the matrix, i.e. block vectors compatible to matrix columns
│ │ │ │ +
139 constexpr static int rbvBlockSize = mBlock;
│ │ │ │ +
140 typedef Dune::FieldVector<Real,rbvBlockSize> RangeBlockVectorBlock;
│ │ │ │ +
141 typedef Dune::BlockVector<RangeBlockVectorBlock> RangeBlockVector;
│ │ │ │ +
142
│ │ │ │ +
143 // Types for vector index access
│ │ │ │ +
144 typedef typename DomainBlockVector::size_type dbv_size_type;
│ │ │ │ +
145 typedef typename RangeBlockVector::size_type rbv_size_type;
│ │ │ │ +
146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type;
│ │ │ │ +
147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type;
│ │ │ │ +
148
│ │ │ │ +
149 // Get vector v from a block vector object which is compatible to
│ │ │ │ +
150 // matrix rows
│ │ │ │ +
151 static inline void
│ │ │ │ +
152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v)
│ │ │ │ +
153 {
│ │ │ │ +
154 for (dbv_size_type block = 0; block < dbv.N(); ++block)
│ │ │ │ +
155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
│ │ │ │ +
156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock];
│ │ │ │ +
157 }
│ │ │ │
158
│ │ │ │ -
159 return *this;
│ │ │ │ -
160 }
│ │ │ │ -
│ │ │ │ -
161
│ │ │ │ -
162
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
169 {
│ │ │ │ -
170 auto size = index_constant<N()>();
│ │ │ │ -
171 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ -
172 (*this)[i] += b[i];
│ │ │ │ -
173 });
│ │ │ │ -
174
│ │ │ │ -
175 return *this;
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
184 {
│ │ │ │ -
185 auto size = index_constant<N()>();
│ │ │ │ -
186 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
│ │ │ │ -
187 (*this)[i] -= b[i];
│ │ │ │ -
188 });
│ │ │ │ +
159 // Get vector v from a block vector object which is compatible to
│ │ │ │ +
160 // matrix columns
│ │ │ │ +
161 static inline void
│ │ │ │ +
162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v)
│ │ │ │ +
163 {
│ │ │ │ +
164 for (rbv_size_type block = 0; block < rbv.N(); ++block)
│ │ │ │ +
165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
│ │ │ │ +
166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock];
│ │ │ │ +
167 }
│ │ │ │ +
168
│ │ │ │ +
169 public:
│ │ │ │ +
172 static inline void arrayToDomainBlockVector (const Real* v,
│ │ │ │ +
173 DomainBlockVector& dbv)
│ │ │ │ +
174 {
│ │ │ │ +
175 for (dbv_size_type block = 0; block < dbv.N(); ++block)
│ │ │ │ +
176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
│ │ │ │ +
177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock];
│ │ │ │ +
178 }
│ │ │ │ +
179
│ │ │ │ +
182 static inline void arrayToRangeBlockVector (const Real* v,
│ │ │ │ +
183 RangeBlockVector& rbv)
│ │ │ │ +
184 {
│ │ │ │ +
185 for (rbv_size_type block = 0; block < rbv.N(); ++block)
│ │ │ │ +
186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
│ │ │ │ +
187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock];
│ │ │ │ +
188 }
│ │ │ │
189
│ │ │ │ -
190 return *this;
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
195 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
196 void mv (const X& x, Y& y) const {
│ │ │ │ -
197 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ -
198 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ -
199 y = 0; //reset y (for mv uses umv)
│ │ │ │ -
200 umv(x,y);
│ │ │ │ -
201 }
│ │ │ │ -
│ │ │ │ -
202
│ │ │ │ -
205 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
206 void umv (const X& x, Y& y) const {
│ │ │ │ -
207 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ -
208 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ -
209 using namespace Dune::Hybrid;
│ │ │ │ -
210 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
211 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
212 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
213 (*this)[i][j].umv(x[j], y[i]);
│ │ │ │ -
214 });
│ │ │ │ -
215 });
│ │ │ │ -
216 }
│ │ │ │ -
│ │ │ │ -
217
│ │ │ │ -
220 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
221 void mmv (const X& x, Y& y) const {
│ │ │ │ -
222 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ -
223 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ -
224 using namespace Dune::Hybrid;
│ │ │ │ -
225 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
226 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
227 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
228 (*this)[i][j].mmv(x[j], y[i]);
│ │ │ │ -
229 });
│ │ │ │ -
230 });
│ │ │ │ -
231 }
│ │ │ │ -
│ │ │ │ -
232
│ │ │ │ -
235 template<typename AlphaType, typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
236 void usmv (const AlphaType& alpha, const X& x, Y& y) const {
│ │ │ │ -
237 static_assert(X::size() == M(), "length of x does not match row length");
│ │ │ │ -
238 static_assert(Y::size() == N(), "length of y does not match row count");
│ │ │ │ -
239 using namespace Dune::Hybrid;
│ │ │ │ -
240 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
241 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
242 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
243 (*this)[i][j].usmv(alpha, x[j], y[i]);
│ │ │ │ -
244 });
│ │ │ │ -
245 });
│ │ │ │ -
246 }
│ │ │ │ -
│ │ │ │ -
247
│ │ │ │ -
250 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
251 void mtv (const X& x, Y& y) const {
│ │ │ │ -
252 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
253 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
254 y = 0;
│ │ │ │ -
255 umtv(x,y);
│ │ │ │ -
256 }
│ │ │ │ -
│ │ │ │ -
257
│ │ │ │ -
260 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
261 void umtv (const X& x, Y& y) const {
│ │ │ │ -
262 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
263 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
264 using namespace Dune::Hybrid;
│ │ │ │ -
265 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
266 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
267 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
268 (*this)[j][i].umtv(x[j], y[i]);
│ │ │ │ -
269 });
│ │ │ │ -
270 });
│ │ │ │ -
271 }
│ │ │ │ -
│ │ │ │ -
272
│ │ │ │ -
275 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
276 void mmtv (const X& x, Y& y) const {
│ │ │ │ -
277 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
278 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
279 using namespace Dune::Hybrid;
│ │ │ │ -
280 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
281 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
282 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
283 (*this)[j][i].mmtv(x[j], y[i]);
│ │ │ │ -
284 });
│ │ │ │ -
285 });
│ │ │ │ -
286 }
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
290 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
291 void usmtv (const field_type& alpha, const X& x, Y& y) const {
│ │ │ │ -
292 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
293 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
294 using namespace Dune::Hybrid;
│ │ │ │ -
295 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
296 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
297 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
298 (*this)[j][i].usmtv(alpha, x[j], y[i]);
│ │ │ │ -
299 });
│ │ │ │ -
300 });
│ │ │ │ -
301 }
│ │ │ │ -
│ │ │ │ +
190 protected:
│ │ │ │ +
191 // The DUNE-ISTL BCRSMatrix
│ │ │ │ +
192 const BCRSMatrix& A_;
│ │ │ │ +
193
│ │ │ │ +
194 // Number of rows and columns in the matrix
│ │ │ │ +
195 const int m_, n_;
│ │ │ │ +
196
│ │ │ │ +
197 // Auxiliary block vector objects which are
│ │ │ │ +
198 // compatible to matrix rows / columns
│ │ │ │ +
199 mutable DomainBlockVector domainBlockVector;
│ │ │ │ +
200 mutable RangeBlockVector rangeBlockVector;
│ │ │ │ +
201 };
│ │ │ │ +
202 } // end namespace Impl
│ │ │ │ +
203
│ │ │ │ +
243 template <typename BCRSMatrix, typename BlockVector>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
245 {
│ │ │ │ +
246 public:
│ │ │ │ + │ │ │ │ +
248
│ │ │ │ +
249 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
269 const unsigned int nIterationsMax = 100000,
│ │ │ │ +
270 const unsigned int verbosity_level = 0)
│ │ │ │ +
271 : m_(m), nIterationsMax_(nIterationsMax),
│ │ │ │ +
272 verbosity_level_(verbosity_level),
│ │ │ │ +
273 nIterations_(0),
│ │ │ │ +
274 title_(" ArPackPlusPlus_Algorithms: "),
│ │ │ │ +
275 blank_(title_.length(),' ')
│ │ │ │ +
276 {}
│ │ │ │ +
│ │ │ │ +
277
│ │ │ │ +
│ │ │ │ +
289 inline void computeSymMaxMagnitude (const Real& epsilon,
│ │ │ │ +
290 BlockVector& x, Real& lambda) const
│ │ │ │ +
291 {
│ │ │ │ +
292 // print verbosity information
│ │ │ │ +
293 if (verbosity_level_ > 0)
│ │ │ │ +
294 std::cout << title_ << "Computing an approximation of "
│ │ │ │ +
295 << "the dominant eigenvalue of a matrix which "
│ │ │ │ +
296 << "is assumed to be symmetric." << std::endl;
│ │ │ │ +
297
│ │ │ │ +
298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ +
299 // and to perform the product A*v (LU decomposition is not used)
│ │ │ │ +
300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ +
301 WrappedMatrix A(m_);
│ │ │ │
302
│ │ │ │ -
305 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
306 void umhv (const X& x, Y& y) const {
│ │ │ │ -
307 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
308 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
309 using namespace Dune::Hybrid;
│ │ │ │ -
310 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
311 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
312 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
313 (*this)[j][i].umhv(x[j], y[i]);
│ │ │ │ -
314 });
│ │ │ │ -
315 });
│ │ │ │ -
316 }
│ │ │ │ -
│ │ │ │ -
317
│ │ │ │ -
320 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
321 void mmhv (const X& x, Y& y) const {
│ │ │ │ -
322 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
323 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
324 using namespace Dune::Hybrid;
│ │ │ │ -
325 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
326 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
327 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
328 (*this)[j][i].mmhv(x[j], y[i]);
│ │ │ │ -
329 });
│ │ │ │ -
330 });
│ │ │ │ -
331 }
│ │ │ │ -
│ │ │ │ -
332
│ │ │ │ -
335 template<typename X, typename Y>
│ │ │ │ -
│ │ │ │ -
336 void usmhv (const field_type& alpha, const X& x, Y& y) const {
│ │ │ │ -
337 static_assert(X::size() == N(), "length of x does not match number of rows");
│ │ │ │ -
338 static_assert(Y::size() == M(), "length of y does not match number of columns");
│ │ │ │ -
339 using namespace Dune::Hybrid;
│ │ │ │ -
340 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
│ │ │ │ -
341 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
342 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
│ │ │ │ -
343 (*this)[j][i].usmhv(alpha, x[j], y[i]);
│ │ │ │ -
344 });
│ │ │ │ -
345 });
│ │ │ │ -
346 }
│ │ │ │ -
│ │ │ │ -
347
│ │ │ │ -
348
│ │ │ │ -
349 //===== norms
│ │ │ │ -
350
│ │ │ │ -
│ │ │ │ -
352 auto frobenius_norm2 () const
│ │ │ │ -
353 {
│ │ │ │ -
354 using field_type_00 = typename std::decay_t<decltype((*this)[Indices::_0][Indices::_0])>::field_type;
│ │ │ │ -
355 typename FieldTraits<field_type_00>::real_type sum=0;
│ │ │ │ -
356
│ │ │ │ -
357 auto rows = index_constant<N()>();
│ │ │ │ -
358 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
│ │ │ │ -
359 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
│ │ │ │ -
360 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
│ │ │ │ -
361 sum += (*this)[i][j].frobenius_norm2();
│ │ │ │ -
362 });
│ │ │ │ -
363 });
│ │ │ │ -
364
│ │ │ │ -
365 return sum;
│ │ │ │ -
366 }
│ │ │ │ -
│ │ │ │ -
367
│ │ │ │ -
│ │ │ │ -
369 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ -
370 {
│ │ │ │ -
371 return sqrt(frobenius_norm2());
│ │ │ │ -
372 }
│ │ │ │ -
│ │ │ │ -
373
│ │ │ │ -
│ │ │ │ -
375 auto infinity_norm () const
│ │ │ │ -
376 {
│ │ │ │ -
377 using field_type_00 = typename std::decay_t<decltype((*this)[Indices::_0][Indices::_0])>::field_type;
│ │ │ │ -
378 using std::max;
│ │ │ │ -
379 typename FieldTraits<field_type_00>::real_type norm=0;
│ │ │ │ -
380
│ │ │ │ -
381 auto rows = index_constant<N()>();
│ │ │ │ -
382 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
│ │ │ │ -
383
│ │ │ │ -
384 typename FieldTraits<field_type_00>::real_type sum=0;
│ │ │ │ -
385 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
│ │ │ │ -
386 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
│ │ │ │ -
387 sum += (*this)[i][j].infinity_norm();
│ │ │ │ -
388 });
│ │ │ │ -
389 norm = max(sum, norm);
│ │ │ │ -
390 });
│ │ │ │ -
391
│ │ │ │ -
392 return norm;
│ │ │ │ -
393 }
│ │ │ │ -
│ │ │ │ -
394
│ │ │ │ -
│ │ │ │ -
396 auto infinity_norm_real () const
│ │ │ │ -
397 {
│ │ │ │ -
398 using field_type_00 = typename std::decay_t<decltype((*this)[Indices::_0][Indices::_0])>::field_type;
│ │ │ │ -
399 using std::max;
│ │ │ │ -
400 typename FieldTraits<field_type_00>::real_type norm=0;
│ │ │ │ -
401
│ │ │ │ -
402 auto rows = index_constant<N()>();
│ │ │ │ -
403 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
│ │ │ │ +
303 // get number of rows and columns in A
│ │ │ │ +
304 const int nrows = A.nrows();
│ │ │ │ +
305 const int ncols = A.ncols();
│ │ │ │ +
306
│ │ │ │ +
307 // assert that A is square
│ │ │ │ +
308 if (nrows != ncols)
│ │ │ │ +
309 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ +
310 << nrows << "x" << ncols << ").");
│ │ │ │ +
311
│ │ │ │ +
312 // allocate memory for variables, set parameters
│ │ │ │ +
313 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ +
314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ +
315 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ +
316 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ +
317 Real* ev = new Real[nev]; // Computed eigenvalues of A
│ │ │ │ +
318 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ +
319 int nconv; // Number of converged eigenvalues
│ │ │ │ +
320
│ │ │ │ +
321 // define what we need: eigenvalues with largest magnitude
│ │ │ │ +
322 char which[] = "LM";
│ │ │ │ +
323 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ +
324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
│ │ │ │ +
325
│ │ │ │ +
326 // set ARPACK verbosity mode if requested
│ │ │ │ +
327 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ +
328
│ │ │ │ +
329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
│ │ │ │ +
330 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ +
331
│ │ │ │ +
332 // obtain approximated dominant eigenvalue of A
│ │ │ │ +
333 lambda = ev[nev-1];
│ │ │ │ +
334
│ │ │ │ +
335 // obtain associated approximated eigenvector of A
│ │ │ │ +
336 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ +
337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ +
338
│ │ │ │ +
339 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ +
340 nIterations_ = dprob.GetIter();
│ │ │ │ +
341
│ │ │ │ +
342 // compute residual norm
│ │ │ │ +
343 BlockVector r(x);
│ │ │ │ +
344 Real* Ax_raw = new Real[nrows];
│ │ │ │ +
345 A.multMv(x_raw,Ax_raw);
│ │ │ │ +
346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
│ │ │ │ +
347 r.axpy(-lambda,x);
│ │ │ │ +
348 const Real r_norm = r.two_norm();
│ │ │ │ +
349
│ │ │ │ +
350 // print verbosity information
│ │ │ │ +
351 if (verbosity_level_ > 0)
│ │ │ │ +
352 {
│ │ │ │ +
353 if (verbosity_level_ > 1)
│ │ │ │ +
354 {
│ │ │ │ +
355 // print some information about the problem
│ │ │ │ +
356 std::cout << blank_ << "Obtained eigenvalues of A by solving "
│ │ │ │ +
357 << "A*x = λ*x using the ARPACK++ class ARSym"
│ │ │ │ +
358 << "StdEig:" << std::endl;
│ │ │ │ +
359 std::cout << blank_ << " converged eigenvalues of A: "
│ │ │ │ +
360 << nconv << " / " << nev << std::endl;
│ │ │ │ +
361 std::cout << blank_ << " dominant eigenvalue of A: "
│ │ │ │ +
362 << lambda << std::endl;
│ │ │ │ +
363 }
│ │ │ │ +
364 std::cout << blank_ << "Result ("
│ │ │ │ +
365 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
366 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
367 << "λ = " << lambda << std::endl;
│ │ │ │ +
368 if (verbosity_level_ > 2)
│ │ │ │ +
369 {
│ │ │ │ +
370 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ +
371 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
372 }
│ │ │ │ +
373 }
│ │ │ │ +
374
│ │ │ │ +
375 // free dynamically allocated memory
│ │ │ │ +
376 delete[] Ax_raw;
│ │ │ │ +
377 delete[] ev;
│ │ │ │ +
378 }
│ │ │ │ +
│ │ │ │ +
379
│ │ │ │ +
│ │ │ │ +
391 inline void computeSymMinMagnitude (const Real& epsilon,
│ │ │ │ +
392 BlockVector& x, Real& lambda) const
│ │ │ │ +
393 {
│ │ │ │ +
394 // print verbosity information
│ │ │ │ +
395 if (verbosity_level_ > 0)
│ │ │ │ +
396 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ +
397 << "least dominant eigenvalue of a matrix which "
│ │ │ │ +
398 << "is assumed to be symmetric." << std::endl;
│ │ │ │ +
399
│ │ │ │ +
400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ +
401 // and to perform the product A*v (LU decomposition is not used)
│ │ │ │ +
402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ +
403 WrappedMatrix A(m_);
│ │ │ │
404
│ │ │ │ -
405 typename FieldTraits<field_type_00>::real_type sum=0;
│ │ │ │ -
406 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
│ │ │ │ -
407 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
│ │ │ │ -
408 sum += (*this)[i][j].infinity_norm_real();
│ │ │ │ -
409 });
│ │ │ │ -
410 norm = max(sum, norm);
│ │ │ │ -
411 });
│ │ │ │ -
412
│ │ │ │ -
413 return norm;
│ │ │ │ -
414 }
│ │ │ │ -
│ │ │ │ -
415
│ │ │ │ -
416 };
│ │ │ │ -
│ │ │ │ -
417
│ │ │ │ -
423 template<typename T1, typename... Args>
│ │ │ │ -
│ │ │ │ -
424 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockMatrix<T1,Args...>& m) {
│ │ │ │ -
425 auto N = index_constant<MultiTypeBlockMatrix<T1,Args...>::N()>();
│ │ │ │ -
426 auto M = index_constant<MultiTypeBlockMatrix<T1,Args...>::M()>();
│ │ │ │ -
427 using namespace Dune::Hybrid;
│ │ │ │ -
428 forEach(integralRange(N), [&](auto&& i) {
│ │ │ │ -
429 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
430 forEach(integralRange(M), [&](auto&& j) {
│ │ │ │ -
431 s << "\t(" << i << ", " << j << "): \n" << m[i][j];
│ │ │ │ -
432 });
│ │ │ │ -
433 });
│ │ │ │ -
434 s << std::endl;
│ │ │ │ -
435 return s;
│ │ │ │ -
436 }
│ │ │ │ -
│ │ │ │ -
437
│ │ │ │ -
438 //make algmeta_itsteps known
│ │ │ │ -
439 template<int I, typename M>
│ │ │ │ -
440 struct algmeta_itsteps;
│ │ │ │ -
441
│ │ │ │ -
448 template<int I, int crow, int ccol, int remain_col> //MultiTypeBlockMatrix_Solver_Col: iterating over one row
│ │ │ │ -
│ │ │ │ -
449 class MultiTypeBlockMatrix_Solver_Col { //calculating b- A[i][j]*x[j]
│ │ │ │ -
450 public:
│ │ │ │ -
454 template <typename Trhs, typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
455 static void calc_rhs(const TMatrix& A, TVector& x, TVector& v, Trhs& b, const K& w) {
│ │ │ │ -
456 std::get<ccol>( std::get<crow>(A) ).mmv( std::get<ccol>(x), b );
│ │ │ │ - │ │ │ │ -
458 }
│ │ │ │ -
│ │ │ │ -
459
│ │ │ │ -
460 };
│ │ │ │ -
│ │ │ │ -
461 template<int I, int crow, int ccol> //MultiTypeBlockMatrix_Solver_Col recursion end
│ │ │ │ -
│ │ │ │ -
462 class MultiTypeBlockMatrix_Solver_Col<I,crow,ccol,0> {
│ │ │ │ -
463 public:
│ │ │ │ -
464 template <typename Trhs, typename TVector, typename TMatrix, typename K>
│ │ │ │ -
465 static void calc_rhs(const TMatrix&, TVector&, TVector&, Trhs&, const K&) {}
│ │ │ │ -
466 };
│ │ │ │ -
│ │ │ │ -
467
│ │ │ │ -
468
│ │ │ │ -
469
│ │ │ │ -
476 template<int I, int crow, int remain_row>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
478 public:
│ │ │ │ -
479
│ │ │ │ -
483 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
484 static void dbgs(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ -
485 TVector xold(x);
│ │ │ │ -
486 xold=x; //store old x values
│ │ │ │ - │ │ │ │ -
488 x *= w;
│ │ │ │ -
489 x.axpy(1-w,xold); //improve x
│ │ │ │ -
490 }
│ │ │ │ -
│ │ │ │ -
491 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
492 static void dbgs(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ -
493 auto rhs = std::get<crow> (b);
│ │ │ │ -
494
│ │ │ │ -
495 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ -
496 //solve on blocklevel I-1
│ │ │ │ -
497 using M =
│ │ │ │ -
498 typename std::remove_cv<
│ │ │ │ -
499 typename std::remove_reference<
│ │ │ │ -
500 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ -
501 >::type
│ │ │ │ -
502 >::type;
│ │ │ │ -
503 algmeta_itsteps<I-1,M>::dbgs(std::get<crow>( std::get<crow>(A)), std::get<crow>(x),rhs,w);
│ │ │ │ - │ │ │ │ -
505 }
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
507
│ │ │ │ -
508
│ │ │ │ -
512 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
513 static void bsorf(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ -
514 TVector v;
│ │ │ │ -
515 v=x; //use latest x values in right side calculation
│ │ │ │ - │ │ │ │ -
517
│ │ │ │ -
518 }
│ │ │ │ -
│ │ │ │ -
519 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
│ │ │ │ -
│ │ │ │ -
520 static void bsorf(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ -
521 auto rhs = std::get<crow> (b);
│ │ │ │ -
522
│ │ │ │ -
523 MultiTypeBlockMatrix_Solver_Col<I,crow,0,TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ -
524 //solve on blocklevel I-1
│ │ │ │ -
525 using M =
│ │ │ │ -
526 typename std::remove_cv<
│ │ │ │ -
527 typename std::remove_reference<
│ │ │ │ -
528 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ -
529 >::type
│ │ │ │ -
530 >::type;
│ │ │ │ -
531 algmeta_itsteps<I-1,M>::bsorf(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
│ │ │ │ -
532 std::get<crow>(x).axpy(w,std::get<crow>(v));
│ │ │ │ - │ │ │ │ -
534 }
│ │ │ │ -
│ │ │ │ -
535
│ │ │ │ -
539 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
540 static void bsorb(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ -
541 TVector v;
│ │ │ │ -
542 v=x; //use latest x values in right side calculation
│ │ │ │ - │ │ │ │ -
544
│ │ │ │ -
545 }
│ │ │ │ -
│ │ │ │ -
546 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
│ │ │ │ -
│ │ │ │ -
547 static void bsorb(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ -
548 auto rhs = std::get<crow> (b);
│ │ │ │ -
549
│ │ │ │ -
550 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ -
551 //solve on blocklevel I-1
│ │ │ │ -
552 using M =
│ │ │ │ -
553 typename std::remove_cv<
│ │ │ │ -
554 typename std::remove_reference<
│ │ │ │ -
555 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ -
556 >::type
│ │ │ │ -
557 >::type;
│ │ │ │ -
558 algmeta_itsteps<I-1,M>::bsorb(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
│ │ │ │ -
559 std::get<crow>(x).axpy(w,std::get<crow>(v));
│ │ │ │ - │ │ │ │ -
561 }
│ │ │ │ -
│ │ │ │ -
562
│ │ │ │ +
405 // get number of rows and columns in A
│ │ │ │ +
406 const int nrows = A.nrows();
│ │ │ │ +
407 const int ncols = A.ncols();
│ │ │ │ +
408
│ │ │ │ +
409 // assert that A is square
│ │ │ │ +
410 if (nrows != ncols)
│ │ │ │ +
411 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ +
412 << nrows << "x" << ncols << ").");
│ │ │ │ +
413
│ │ │ │ +
414 // allocate memory for variables, set parameters
│ │ │ │ +
415 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ +
416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ +
417 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ +
418 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ +
419 Real* ev = new Real[nev]; // Computed eigenvalues of A
│ │ │ │ +
420 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ +
421 int nconv; // Number of converged eigenvalues
│ │ │ │ +
422
│ │ │ │ +
423 // define what we need: eigenvalues with smallest magnitude
│ │ │ │ +
424 char which[] = "SM";
│ │ │ │ +
425 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ +
426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
│ │ │ │ +
427
│ │ │ │ +
428 // set ARPACK verbosity mode if requested
│ │ │ │ +
429 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ +
430
│ │ │ │ +
431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
│ │ │ │ +
432 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ +
433
│ │ │ │ +
434 // obtain approximated least dominant eigenvalue of A
│ │ │ │ +
435 lambda = ev[nev-1];
│ │ │ │ +
436
│ │ │ │ +
437 // obtain associated approximated eigenvector of A
│ │ │ │ +
438 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ +
439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ +
440
│ │ │ │ +
441 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ +
442 nIterations_ = dprob.GetIter();
│ │ │ │ +
443
│ │ │ │ +
444 // compute residual norm
│ │ │ │ +
445 BlockVector r(x);
│ │ │ │ +
446 Real* Ax_raw = new Real[nrows];
│ │ │ │ +
447 A.multMv(x_raw,Ax_raw);
│ │ │ │ +
448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
│ │ │ │ +
449 r.axpy(-lambda,x);
│ │ │ │ +
450 const Real r_norm = r.two_norm();
│ │ │ │ +
451
│ │ │ │ +
452 // print verbosity information
│ │ │ │ +
453 if (verbosity_level_ > 0)
│ │ │ │ +
454 {
│ │ │ │ +
455 if (verbosity_level_ > 1)
│ │ │ │ +
456 {
│ │ │ │ +
457 // print some information about the problem
│ │ │ │ +
458 std::cout << blank_ << "Obtained eigenvalues of A by solving "
│ │ │ │ +
459 << "A*x = λ*x using the ARPACK++ class ARSym"
│ │ │ │ +
460 << "StdEig:" << std::endl;
│ │ │ │ +
461 std::cout << blank_ << " converged eigenvalues of A: "
│ │ │ │ +
462 << nconv << " / " << nev << std::endl;
│ │ │ │ +
463 std::cout << blank_ << " least dominant eigenvalue of A: "
│ │ │ │ +
464 << lambda << std::endl;
│ │ │ │ +
465 }
│ │ │ │ +
466 std::cout << blank_ << "Result ("
│ │ │ │ +
467 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
468 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
469 << "λ = " << lambda << std::endl;
│ │ │ │ +
470 if (verbosity_level_ > 2)
│ │ │ │ +
471 {
│ │ │ │ +
472 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ +
473 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
474 }
│ │ │ │ +
475 }
│ │ │ │ +
476
│ │ │ │ +
477 // free dynamically allocated memory
│ │ │ │ +
478 delete[] Ax_raw;
│ │ │ │ +
479 delete[] ev;
│ │ │ │ +
480 }
│ │ │ │ +
│ │ │ │ +
481
│ │ │ │ +
│ │ │ │ +
493 inline void computeSymCond2 (const Real& epsilon, Real& cond_2) const
│ │ │ │ +
494 {
│ │ │ │ +
495 // print verbosity information
│ │ │ │ +
496 if (verbosity_level_ > 0)
│ │ │ │ +
497 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ +
498 << "spectral condition number of a matrix which "
│ │ │ │ +
499 << "is assumed to be symmetric." << std::endl;
│ │ │ │ +
500
│ │ │ │ +
501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ +
502 // and to perform the product A*v (LU decomposition is not used)
│ │ │ │ +
503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ +
504 WrappedMatrix A(m_);
│ │ │ │ +
505
│ │ │ │ +
506 // get number of rows and columns in A
│ │ │ │ +
507 const int nrows = A.nrows();
│ │ │ │ +
508 const int ncols = A.ncols();
│ │ │ │ +
509
│ │ │ │ +
510 // assert that A is square
│ │ │ │ +
511 if (nrows != ncols)
│ │ │ │ +
512 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ +
513 << nrows << "x" << ncols << ").");
│ │ │ │ +
514
│ │ │ │ +
515 // allocate memory for variables, set parameters
│ │ │ │ +
516 const int nev = 2; // Number of eigenvalues to compute
│ │ │ │ +
517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ +
518 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ +
519 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ +
520 Real* ev = new Real[nev]; // Computed eigenvalues of A
│ │ │ │ +
521 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ +
522 int nconv; // Number of converged eigenvalues
│ │ │ │ +
523
│ │ │ │ +
524 // define what we need: eigenvalues from both ends of the spectrum
│ │ │ │ +
525 char which[] = "BE";
│ │ │ │ +
526 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ +
527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
│ │ │ │ +
528
│ │ │ │ +
529 // set ARPACK verbosity mode if requested
│ │ │ │ +
530 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ +
531
│ │ │ │ +
532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
│ │ │ │ +
533 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ +
534
│ │ │ │ +
535 // obtain approximated dominant and least dominant eigenvalue of A
│ │ │ │ +
536 const Real& lambda_max = ev[nev-1];
│ │ │ │ +
537 const Real& lambda_min = ev[0];
│ │ │ │ +
538
│ │ │ │ +
539 // obtain associated approximated eigenvectors of A
│ │ │ │ +
540 Real* x_max_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ +
541 Real* x_min_raw = dprob.RawEigenvector(0);
│ │ │ │ +
542
│ │ │ │ +
543 // obtain approximated spectral condition number of A
│ │ │ │ +
544 cond_2 = std::abs(lambda_max / lambda_min);
│ │ │ │ +
545
│ │ │ │ +
546 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ +
547 nIterations_ = dprob.GetIter();
│ │ │ │ +
548
│ │ │ │ +
549 // compute each residual norm
│ │ │ │ +
550 Real* Ax_max_raw = new Real[nrows];
│ │ │ │ +
551 Real* Ax_min_raw = new Real[nrows];
│ │ │ │ +
552 A.multMv(x_max_raw,Ax_max_raw);
│ │ │ │ +
553 A.multMv(x_min_raw,Ax_min_raw);
│ │ │ │ +
554 Real r_max_norm = 0.0;
│ │ │ │ +
555 Real r_min_norm = 0.0;
│ │ │ │ +
556 for (int i = 0; i < nrows; ++i)
│ │ │ │ +
557 {
│ │ │ │ +
558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2);
│ │ │ │ +
559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2);
│ │ │ │ +
560 }
│ │ │ │ +
561 r_max_norm = std::sqrt(r_max_norm);
│ │ │ │ +
562 r_min_norm = std::sqrt(r_min_norm);
│ │ │ │
563
│ │ │ │ -
567 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
568 static void dbjac(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
│ │ │ │ -
569 TVector v(x);
│ │ │ │ -
570 v=0; //calc new x in v
│ │ │ │ - │ │ │ │ -
572 x.axpy(w,v); //improve x
│ │ │ │ -
573 }
│ │ │ │ -
│ │ │ │ -
574 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
575 static void dbjac(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
│ │ │ │ -
576 auto rhs = std::get<crow> (b);
│ │ │ │ -
577
│ │ │ │ -
578 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
│ │ │ │ -
579 //solve on blocklevel I-1
│ │ │ │ -
580 using M =
│ │ │ │ -
581 typename std::remove_cv<
│ │ │ │ -
582 typename std::remove_reference<
│ │ │ │ -
583 decltype(std::get<crow>( std::get<crow>(A)))
│ │ │ │ -
584 >::type
│ │ │ │ -
585 >::type;
│ │ │ │ -
586 algmeta_itsteps<I-1,M>::dbjac(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
│ │ │ │ - │ │ │ │ -
588 }
│ │ │ │ -
│ │ │ │ +
564 // print verbosity information
│ │ │ │ +
565 if (verbosity_level_ > 0)
│ │ │ │ +
566 {
│ │ │ │ +
567 if (verbosity_level_ > 1)
│ │ │ │ +
568 {
│ │ │ │ +
569 // print some information about the problem
│ │ │ │ +
570 std::cout << blank_ << "Obtained eigenvalues of A by solving "
│ │ │ │ +
571 << "A*x = λ*x using the ARPACK++ class ARSym"
│ │ │ │ +
572 << "StdEig:" << std::endl;
│ │ │ │ +
573 std::cout << blank_ << " converged eigenvalues of A: "
│ │ │ │ +
574 << nconv << " / " << nev << std::endl;
│ │ │ │ +
575 std::cout << blank_ << " dominant eigenvalue of A: "
│ │ │ │ +
576 << lambda_max << std::endl;
│ │ │ │ +
577 std::cout << blank_ << " least dominant eigenvalue of A: "
│ │ │ │ +
578 << lambda_min << std::endl;
│ │ │ │ +
579 std::cout << blank_ << " spectral condition number of A: "
│ │ │ │ +
580 << cond_2 << std::endl;
│ │ │ │ +
581 }
│ │ │ │ +
582 std::cout << blank_ << "Result ("
│ │ │ │ +
583 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
584 << "║residual║_2 = {" << r_max_norm << ","
│ │ │ │ +
585 << r_min_norm << "}, " << "λ = {"
│ │ │ │ +
586 << lambda_max << "," << lambda_min
│ │ │ │ +
587 << "}): cond_2 = " << cond_2 << std::endl;
│ │ │ │ +
588 }
│ │ │ │
589
│ │ │ │ -
590
│ │ │ │ -
591
│ │ │ │ -
592
│ │ │ │ -
593 };
│ │ │ │ -
│ │ │ │ -
594 template<int I, int crow> //recursion end for remain_row = 0
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
596 public:
│ │ │ │ -
597 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
598 static void dbgs(const TMatrix&, TVector&, TVector&,
│ │ │ │ -
599 const TVector&, const K&) {}
│ │ │ │ -
│ │ │ │ -
600
│ │ │ │ -
601 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
602 static void bsorf(const TMatrix&, TVector&, TVector&,
│ │ │ │ -
603 const TVector&, const K&) {}
│ │ │ │ -
│ │ │ │ -
604
│ │ │ │ -
605 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
606 static void bsorb(const TMatrix&, TVector&, TVector&,
│ │ │ │ -
607 const TVector&, const K&) {}
│ │ │ │ -
│ │ │ │ -
608
│ │ │ │ -
609 template <typename TVector, typename TMatrix, typename K>
│ │ │ │ -
│ │ │ │ -
610 static void dbjac(const TMatrix&, TVector&, TVector&,
│ │ │ │ -
611 const TVector&, const K&) {}
│ │ │ │ -
│ │ │ │ -
612 };
│ │ │ │ -
│ │ │ │ -
613
│ │ │ │ -
614} // end namespace Dune
│ │ │ │ -
615
│ │ │ │ -
616namespace std
│ │ │ │ -
617{
│ │ │ │ -
622 template <size_t i, typename... Args>
│ │ │ │ -
│ │ │ │ -
623 struct tuple_element<i,Dune::MultiTypeBlockMatrix<Args...> >
│ │ │ │ -
624 {
│ │ │ │ -
625 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
│ │ │ │ -
626 };
│ │ │ │ -
│ │ │ │ -
627}
│ │ │ │ -
628#endif
│ │ │ │ -
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ - │ │ │ │ -
MultiTypeBlockMatrix< FirstRow, Args... > type
Definition multitypeblockmatrix.hh:56
│ │ │ │ -
static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:568
│ │ │ │ -
MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b)
Add the entries of another matrix to this one.
Definition multitypeblockmatrix.hh:168
│ │ │ │ -
void mv(const X &x, Y &y) const
y = A x
Definition multitypeblockmatrix.hh:196
│ │ │ │ -
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition multitypeblockmatrix.hh:276
│ │ │ │ -
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition multitypeblockmatrix.hh:321
│ │ │ │ -
static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:598
│ │ │ │ -
static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:484
│ │ │ │ -
static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:540
│ │ │ │ -
void usmhv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition multitypeblockmatrix.hh:336
│ │ │ │ -
FirstRow::field_type field_type
Definition multitypeblockmatrix.hh:61
│ │ │ │ -
void usmv(const AlphaType &alpha, const X &x, Y &y) const
y += alpha A x
Definition multitypeblockmatrix.hh:236
│ │ │ │ -
MultiTypeBlockMatrix & operator/=(const field_type &k)
vector space division by scalar
Definition multitypeblockmatrix.hh:152
│ │ │ │ -
typename std::tuple_element< i, std::tuple< Args... > >::type type
Definition multitypeblockmatrix.hh:625
│ │ │ │ -
static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:492
│ │ │ │ -
static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:520
│ │ │ │ -
void umhv(const X &x, Y &y) const
y += A^H x
Definition multitypeblockmatrix.hh:306
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition multitypeblockmatrix.hh:369
│ │ │ │ -
static constexpr size_type N()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:64
│ │ │ │ -
void usmtv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition multitypeblockmatrix.hh:291
│ │ │ │ -
void operator=(const T &newval)
Definition multitypeblockmatrix.hh:127
│ │ │ │ -
static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &)
Definition multitypeblockmatrix.hh:465
│ │ │ │ -
void umv(const X &x, Y &y) const
y += A x
Definition multitypeblockmatrix.hh:206
│ │ │ │ -
static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K &w)
Definition multitypeblockmatrix.hh:455
│ │ │ │ -
static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:513
│ │ │ │ -
static constexpr size_type size()
Return the number of matrix rows.
Definition multitypeblockmatrix.hh:75
│ │ │ │ -
static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:610
│ │ │ │ -
auto infinity_norm_real() const
Bastardized version of the infinity-norm / row-sum norm.
Definition multitypeblockmatrix.hh:396
│ │ │ │ -
auto frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition multitypeblockmatrix.hh:352
│ │ │ │ -
std::size_t size_type
Type used for sizes.
Definition multitypeblockmatrix.hh:59
│ │ │ │ -
auto infinity_norm() const
Bastardized version of the infinity-norm / row-sum norm.
Definition multitypeblockmatrix.hh:375
│ │ │ │ -
static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:606
│ │ │ │ -
MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b)
Subtract the entries of another matrix from this one.
Definition multitypeblockmatrix.hh:183
│ │ │ │ -
auto operator[](const std::integral_constant< size_type, index > indexVariable) -> decltype(std::get< index >(*this))
Random-access operator.
Definition multitypeblockmatrix.hh:104
│ │ │ │ -
static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:575
│ │ │ │ -
static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
Definition multitypeblockmatrix.hh:602
│ │ │ │ -
void mtv(const X &x, Y &y) const
y = A^T x
Definition multitypeblockmatrix.hh:251
│ │ │ │ -
static constexpr size_type M()
Return the number of matrix columns.
Definition multitypeblockmatrix.hh:81
│ │ │ │ -
void mmv(const X &x, Y &y) const
y -= A x
Definition multitypeblockmatrix.hh:221
│ │ │ │ -
void umtv(const X &x, Y &y) const
y += A^T x
Definition multitypeblockmatrix.hh:261
│ │ │ │ -
static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
Definition multitypeblockmatrix.hh:547
│ │ │ │ -
MultiTypeBlockMatrix & operator*=(const field_type &k)
vector space multiplication with scalar
Definition multitypeblockmatrix.hh:141
│ │ │ │ -
STL namespace.
│ │ │ │ +
590 // free dynamically allocated memory
│ │ │ │ +
591 delete[] Ax_min_raw;
│ │ │ │ +
592 delete[] Ax_max_raw;
│ │ │ │ +
593 delete[] ev;
│ │ │ │ +
594 }
│ │ │ │ +
│ │ │ │ +
595
│ │ │ │ +
│ │ │ │ +
609 inline void computeNonSymMax (const Real& epsilon,
│ │ │ │ +
610 BlockVector& x, Real& sigma) const
│ │ │ │ +
611 {
│ │ │ │ +
612 // print verbosity information
│ │ │ │ +
613 if (verbosity_level_ > 0)
│ │ │ │ +
614 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ +
615 << "largest singular value of a matrix which "
│ │ │ │ +
616 << "is assumed to be nonsymmetric." << std::endl;
│ │ │ │ +
617
│ │ │ │ +
618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ +
619 // and to perform the product A^T*A*v (LU decomposition is not used)
│ │ │ │ +
620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ +
621 WrappedMatrix A(m_);
│ │ │ │ +
622
│ │ │ │ +
623 // get number of rows and columns in A
│ │ │ │ +
624 const int nrows = A.nrows();
│ │ │ │ +
625 const int ncols = A.ncols();
│ │ │ │ +
626
│ │ │ │ +
627 // assert that A has more rows than columns (extend code later to the opposite case!)
│ │ │ │ +
628 if (nrows < ncols)
│ │ │ │ +
629 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
│ │ │ │ +
630 << "columns (" << nrows << "x" << ncols << ")."
│ │ │ │ +
631 << " This case is not implemented, yet.");
│ │ │ │ +
632
│ │ │ │ +
633 // allocate memory for variables, set parameters
│ │ │ │ +
634 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ +
635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ +
636 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ +
637 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ +
638 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
│ │ │ │ +
639 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ +
640 int nconv; // Number of converged eigenvalues
│ │ │ │ +
641
│ │ │ │ +
642 // define what we need: eigenvalues with largest algebraic value
│ │ │ │ +
643 char which[] = "LA";
│ │ │ │ +
644 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ +
645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
│ │ │ │ +
646
│ │ │ │ +
647 // set ARPACK verbosity mode if requested
│ │ │ │ +
648 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ +
649
│ │ │ │ +
650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
│ │ │ │ +
651 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ +
652
│ │ │ │ +
653 // obtain approximated largest eigenvalue of A^T*A
│ │ │ │ +
654 const Real& lambda = ev[nev-1];
│ │ │ │ +
655
│ │ │ │ +
656 // obtain associated approximated eigenvector of A^T*A
│ │ │ │ +
657 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ +
658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ +
659
│ │ │ │ +
660 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ +
661 nIterations_ = dprob.GetIter();
│ │ │ │ +
662
│ │ │ │ +
663 // compute residual norm
│ │ │ │ +
664 BlockVector r(x);
│ │ │ │ +
665 Real* AtAx_raw = new Real[ncols];
│ │ │ │ +
666 A.multMtMv(x_raw,AtAx_raw);
│ │ │ │ +
667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
│ │ │ │ +
668 r.axpy(-lambda,x);
│ │ │ │ +
669 const Real r_norm = r.two_norm();
│ │ │ │ +
670
│ │ │ │ +
671 // calculate largest singular value of A (note that
│ │ │ │ +
672 // x is right-singular / left-singular vector of A)
│ │ │ │ +
673 sigma = std::sqrt(lambda);
│ │ │ │ +
674
│ │ │ │ +
675 // print verbosity information
│ │ │ │ +
676 if (verbosity_level_ > 0)
│ │ │ │ +
677 {
│ │ │ │ +
678 if (verbosity_level_ > 1)
│ │ │ │ +
679 {
│ │ │ │ +
680 // print some information about the problem
│ │ │ │ +
681 std::cout << blank_ << "Obtained singular values of A by sol"
│ │ │ │ +
682 << "ving (A^T*A)*x = σ²*x using the ARPACK++ "
│ │ │ │ +
683 << "class ARSymStdEig:" << std::endl;
│ │ │ │ +
684 std::cout << blank_ << " converged eigenvalues of A^T*A: "
│ │ │ │ +
685 << nconv << " / " << nev << std::endl;
│ │ │ │ +
686 std::cout << blank_ << " largest eigenvalue of A^T*A: "
│ │ │ │ +
687 << lambda << std::endl;
│ │ │ │ +
688 std::cout << blank_ << " => largest singular value of A: "
│ │ │ │ +
689 << sigma << std::endl;
│ │ │ │ +
690 }
│ │ │ │ +
691 std::cout << blank_ << "Result ("
│ │ │ │ +
692 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
693 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
694 << "σ = " << sigma << std::endl;
│ │ │ │ +
695 if (verbosity_level_ > 2)
│ │ │ │ +
696 {
│ │ │ │ +
697 // print approximated right-singular / left-singular vector
│ │ │ │ +
698 // via DUNE-ISTL I/O methods
│ │ │ │ +
699 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
700 }
│ │ │ │ +
701 }
│ │ │ │ +
702
│ │ │ │ +
703 // free dynamically allocated memory
│ │ │ │ +
704 delete[] AtAx_raw;
│ │ │ │ +
705 delete[] ev;
│ │ │ │ +
706 }
│ │ │ │ +
│ │ │ │ +
707
│ │ │ │ +
│ │ │ │ +
721 inline void computeNonSymMin (const Real& epsilon,
│ │ │ │ +
722 BlockVector& x, Real& sigma) const
│ │ │ │ +
723 {
│ │ │ │ +
724 // print verbosity information
│ │ │ │ +
725 if (verbosity_level_ > 0)
│ │ │ │ +
726 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ +
727 << "smallest singular value of a matrix which "
│ │ │ │ +
728 << "is assumed to be nonsymmetric." << std::endl;
│ │ │ │ +
729
│ │ │ │ +
730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ +
731 // and to perform the product A^T*A*v (LU decomposition is not used)
│ │ │ │ +
732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ +
733 WrappedMatrix A(m_);
│ │ │ │ +
734
│ │ │ │ +
735 // get number of rows and columns in A
│ │ │ │ +
736 const int nrows = A.nrows();
│ │ │ │ +
737 const int ncols = A.ncols();
│ │ │ │ +
738
│ │ │ │ +
739 // assert that A has more rows than columns (extend code later to the opposite case!)
│ │ │ │ +
740 if (nrows < ncols)
│ │ │ │ +
741 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
│ │ │ │ +
742 << "columns (" << nrows << "x" << ncols << ")."
│ │ │ │ +
743 << " This case is not implemented, yet.");
│ │ │ │ +
744
│ │ │ │ +
745 // allocate memory for variables, set parameters
│ │ │ │ +
746 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ +
747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ +
748 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ +
749 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ +
750 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
│ │ │ │ +
751 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ +
752 int nconv; // Number of converged eigenvalues
│ │ │ │ +
753
│ │ │ │ +
754 // define what we need: eigenvalues with smallest algebraic value
│ │ │ │ +
755 char which[] = "SA";
│ │ │ │ +
756 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ +
757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
│ │ │ │ +
758
│ │ │ │ +
759 // set ARPACK verbosity mode if requested
│ │ │ │ +
760 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ +
761
│ │ │ │ +
762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
│ │ │ │ +
763 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ +
764
│ │ │ │ +
765 // obtain approximated smallest eigenvalue of A^T*A
│ │ │ │ +
766 const Real& lambda = ev[nev-1];
│ │ │ │ +
767
│ │ │ │ +
768 // obtain associated approximated eigenvector of A^T*A
│ │ │ │ +
769 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ +
770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ +
771
│ │ │ │ +
772 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ +
773 nIterations_ = dprob.GetIter();
│ │ │ │ +
774
│ │ │ │ +
775 // compute residual norm
│ │ │ │ +
776 BlockVector r(x);
│ │ │ │ +
777 Real* AtAx_raw = new Real[ncols];
│ │ │ │ +
778 A.multMtMv(x_raw,AtAx_raw);
│ │ │ │ +
779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
│ │ │ │ +
780 r.axpy(-lambda,x);
│ │ │ │ +
781 const Real r_norm = r.two_norm();
│ │ │ │ +
782
│ │ │ │ +
783 // calculate smallest singular value of A (note that
│ │ │ │ +
784 // x is right-singular / left-singular vector of A)
│ │ │ │ +
785 sigma = std::sqrt(lambda);
│ │ │ │ +
786
│ │ │ │ +
787 // print verbosity information
│ │ │ │ +
788 if (verbosity_level_ > 0)
│ │ │ │ +
789 {
│ │ │ │ +
790 if (verbosity_level_ > 1)
│ │ │ │ +
791 {
│ │ │ │ +
792 // print some information about the problem
│ │ │ │ +
793 std::cout << blank_ << "Obtained singular values of A by sol"
│ │ │ │ +
794 << "ving (A^T*A)*x = σ²*x using the ARPACK++ "
│ │ │ │ +
795 << "class ARSymStdEig:" << std::endl;
│ │ │ │ +
796 std::cout << blank_ << " converged eigenvalues of A^T*A: "
│ │ │ │ +
797 << nconv << " / " << nev << std::endl;
│ │ │ │ +
798 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
│ │ │ │ +
799 << lambda << std::endl;
│ │ │ │ +
800 std::cout << blank_ << " => smallest singular value of A: "
│ │ │ │ +
801 << sigma << std::endl;
│ │ │ │ +
802 }
│ │ │ │ +
803 std::cout << blank_ << "Result ("
│ │ │ │ +
804 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
805 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
806 << "σ = " << sigma << std::endl;
│ │ │ │ +
807 if (verbosity_level_ > 2)
│ │ │ │ +
808 {
│ │ │ │ +
809 // print approximated right-singular / left-singular vector
│ │ │ │ +
810 // via DUNE-ISTL I/O methods
│ │ │ │ +
811 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
812 }
│ │ │ │ +
813 }
│ │ │ │ +
814
│ │ │ │ +
815 // free dynamically allocated memory
│ │ │ │ +
816 delete[] AtAx_raw;
│ │ │ │ +
817 delete[] ev;
│ │ │ │ +
818 }
│ │ │ │ +
│ │ │ │ +
819
│ │ │ │ +
│ │ │ │ +
830 inline void computeNonSymCond2 (const Real& epsilon, Real& cond_2) const
│ │ │ │ +
831 {
│ │ │ │ +
832 // print verbosity information
│ │ │ │ +
833 if (verbosity_level_ > 0)
│ │ │ │ +
834 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ +
835 << "spectral condition number of a matrix which "
│ │ │ │ +
836 << "is assumed to be nonsymmetric." << std::endl;
│ │ │ │ +
837
│ │ │ │ +
838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ +
839 // and to perform the product A^T*A*v (LU decomposition is not used)
│ │ │ │ +
840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ +
841 WrappedMatrix A(m_);
│ │ │ │ +
842
│ │ │ │ +
843 // get number of rows and columns in A
│ │ │ │ +
844 const int nrows = A.nrows();
│ │ │ │ +
845 const int ncols = A.ncols();
│ │ │ │ +
846
│ │ │ │ +
847 // assert that A has more rows than columns (extend code later to the opposite case!)
│ │ │ │ +
848 if (nrows < ncols)
│ │ │ │ +
849 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
│ │ │ │ +
850 << "columns (" << nrows << "x" << ncols << ")."
│ │ │ │ +
851 << " This case is not implemented, yet.");
│ │ │ │ +
852
│ │ │ │ +
853 // allocate memory for variables, set parameters
│ │ │ │ +
854 const int nev = 2; // Number of eigenvalues to compute
│ │ │ │ +
855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ +
856 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ +
857 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ +
858 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
│ │ │ │ +
859 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ +
860 int nconv; // Number of converged eigenvalues
│ │ │ │ +
861
│ │ │ │ +
862 // define what we need: eigenvalues from both ends of the spectrum
│ │ │ │ +
863 char which[] = "BE";
│ │ │ │ +
864 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ +
865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
│ │ │ │ +
866
│ │ │ │ +
867 // set ARPACK verbosity mode if requested
│ │ │ │ +
868 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ +
869
│ │ │ │ +
870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
│ │ │ │ +
871 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ +
872
│ │ │ │ +
873 // obtain approximated largest and smallest eigenvalue of A^T*A
│ │ │ │ +
874 const Real& lambda_max = ev[nev-1];
│ │ │ │ +
875 const Real& lambda_min = ev[0];
│ │ │ │ +
876
│ │ │ │ +
877 // obtain associated approximated eigenvectors of A^T*A
│ │ │ │ +
878 Real* x_max_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ +
879 Real* x_min_raw = dprob.RawEigenvector(0);
│ │ │ │ +
880
│ │ │ │ +
881 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ +
882 nIterations_ = dprob.GetIter();
│ │ │ │ +
883
│ │ │ │ +
884 // compute each residual norm
│ │ │ │ +
885 Real* AtAx_max_raw = new Real[ncols];
│ │ │ │ +
886 Real* AtAx_min_raw = new Real[ncols];
│ │ │ │ +
887 A.multMtMv(x_max_raw,AtAx_max_raw);
│ │ │ │ +
888 A.multMtMv(x_min_raw,AtAx_min_raw);
│ │ │ │ +
889 Real r_max_norm = 0.0;
│ │ │ │ +
890 Real r_min_norm = 0.0;
│ │ │ │ +
891 for (int i = 0; i < ncols; ++i)
│ │ │ │ +
892 {
│ │ │ │ +
893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2);
│ │ │ │ +
894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2);
│ │ │ │ +
895 }
│ │ │ │ +
896 r_max_norm = std::sqrt(r_max_norm);
│ │ │ │ +
897 r_min_norm = std::sqrt(r_min_norm);
│ │ │ │ +
898
│ │ │ │ +
899 // calculate largest and smallest singular value of A
│ │ │ │ +
900 const Real sigma_max = std::sqrt(lambda_max);
│ │ │ │ +
901 const Real sigma_min = std::sqrt(lambda_min);
│ │ │ │ +
902
│ │ │ │ +
903 // obtain approximated spectral condition number of A
│ │ │ │ +
904 cond_2 = sigma_max / sigma_min;
│ │ │ │ +
905
│ │ │ │ +
906 // print verbosity information
│ │ │ │ +
907 if (verbosity_level_ > 0)
│ │ │ │ +
908 {
│ │ │ │ +
909 if (verbosity_level_ > 1)
│ │ │ │ +
910 {
│ │ │ │ +
911 // print some information about the problem
│ │ │ │ +
912 std::cout << blank_ << "Obtained singular values of A by sol"
│ │ │ │ +
913 << "ving (A^T*A)*x = σ²*x using the ARPACK++ "
│ │ │ │ +
914 << "class ARSymStdEig:" << std::endl;
│ │ │ │ +
915 std::cout << blank_ << " converged eigenvalues of A^T*A: "
│ │ │ │ +
916 << nconv << " / " << nev << std::endl;
│ │ │ │ +
917 std::cout << blank_ << " largest eigenvalue of A^T*A: "
│ │ │ │ +
918 << lambda_max << std::endl;
│ │ │ │ +
919 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
│ │ │ │ +
920 << lambda_min << std::endl;
│ │ │ │ +
921 std::cout << blank_ << " => largest singular value of A: "
│ │ │ │ +
922 << sigma_max << std::endl;
│ │ │ │ +
923 std::cout << blank_ << " => smallest singular value of A: "
│ │ │ │ +
924 << sigma_min << std::endl;
│ │ │ │ +
925 }
│ │ │ │ +
926 std::cout << blank_ << "Result ("
│ │ │ │ +
927 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
928 << "║residual║_2 = {" << r_max_norm << ","
│ │ │ │ +
929 << r_min_norm << "}, " << "σ = {"
│ │ │ │ +
930 << sigma_max << "," << sigma_min
│ │ │ │ +
931 << "}): cond_2 = " << cond_2 << std::endl;
│ │ │ │ +
932 }
│ │ │ │ +
933
│ │ │ │ +
934 // free dynamically allocated memory
│ │ │ │ +
935 delete[] AtAx_min_raw;
│ │ │ │ +
936 delete[] AtAx_max_raw;
│ │ │ │ +
937 delete[] ev;
│ │ │ │ +
938 }
│ │ │ │ +
│ │ │ │ +
939
│ │ │ │ +
│ │ │ │ +
944 inline unsigned int getIterationCount () const
│ │ │ │ +
945 {
│ │ │ │ +
946 if (nIterations_ == 0)
│ │ │ │ +
947 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
│ │ │ │ +
948
│ │ │ │ +
949 return nIterations_;
│ │ │ │ +
950 }
│ │ │ │ +
│ │ │ │ +
951
│ │ │ │ +
952 protected:
│ │ │ │ +
953 // parameters related to iterative eigenvalue algorithms
│ │ │ │ + │ │ │ │ +
955 const unsigned int nIterationsMax_;
│ │ │ │ +
956
│ │ │ │ +
957 // verbosity setting
│ │ │ │ +
958 const unsigned int verbosity_level_;
│ │ │ │ +
959
│ │ │ │ +
960 // memory for storing temporary variables (mutable as they shall
│ │ │ │ +
961 // just be effectless auxiliary variables of the const apply*(...)
│ │ │ │ +
962 // methods)
│ │ │ │ +
963 mutable unsigned int nIterations_;
│ │ │ │ +
964
│ │ │ │ +
965 // constants for printing verbosity information
│ │ │ │ +
966 const std::string title_;
│ │ │ │ +
967 const std::string blank_;
│ │ │ │ +
968 };
│ │ │ │ +
│ │ │ │ +
969
│ │ │ │ +
972} // namespace Dune
│ │ │ │ +
973
│ │ │ │ +
974#endif // HAVE_ARPACKPP
│ │ │ │ +
975
│ │ │ │ +
976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
│ │ │ │ +
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition io.hh:89
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
Send BlockVector to an output stream.
Definition bvector.hh:590
│ │ │ │ -
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
│ │ │ │ -
static void bsorb(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:461
│ │ │ │ -
static void bsorf(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:418
│ │ │ │ -
static void dbjac(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:504
│ │ │ │ -
static void dbgs(const M &A, X &x, const Y &b, const K &w)
Definition gsetc.hh:378
│ │ │ │ -
solver for MultiTypeBlockVector & MultiTypeBlockMatrix types
Definition multitypeblockmatrix.hh:477
│ │ │ │ -
part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types
Definition multitypeblockmatrix.hh:449
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bcrsmatrix.hh:488
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ +
A::size_type size_type
The type for the index access.
Definition bvector.hh:410
│ │ │ │ +
Wrapper to use a range of ARPACK++ eigenvalue solvers.
Definition arpackpp.hh:245
│ │ │ │ +
const unsigned int verbosity_level_
Definition arpackpp.hh:958
│ │ │ │ +
unsigned int getIterationCount() const
Return the number of iterations in last application of an algorithm.
Definition arpackpp.hh:944
│ │ │ │ +
const std::string title_
Definition arpackpp.hh:966
│ │ │ │ +
BlockVector::field_type Real
Definition arpackpp.hh:247
│ │ │ │ +
void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:289
│ │ │ │ +
void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:391
│ │ │ │ +
const BCRSMatrix & m_
Definition arpackpp.hh:954
│ │ │ │ +
const unsigned int nIterationsMax_
Definition arpackpp.hh:955
│ │ │ │ +
const std::string blank_
Definition arpackpp.hh:967
│ │ │ │ +
ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=100000, const unsigned int verbosity_level=0)
Construct from required parameters.
Definition arpackpp.hh:268
│ │ │ │ +
void computeSymCond2(const Real &epsilon, Real &cond_2) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation of its spectra...
Definition arpackpp.hh:493
│ │ │ │ +
unsigned int nIterations_
Definition arpackpp.hh:963
│ │ │ │ +
void computeNonSymMin(const Real &epsilon, BlockVector &x, Real &sigma) const
Assume the matrix to be nonsymmetric and perform IRLM to compute an approximation sigma of its smalle...
Definition arpackpp.hh:721
│ │ │ │ +
void computeNonSymCond2(const Real &epsilon, Real &cond_2) const
Assume the matrix to be nonsymmetric and perform IRLM to compute an approximation of its spectral con...
Definition arpackpp.hh:830
│ │ │ │ +
void computeNonSymMax(const Real &epsilon, BlockVector &x, Real &sigma) const
Assume the matrix to be nonsymmetric and perform IRLM to compute an approximation sigma of its larges...
Definition arpackpp.hh:609
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,756 +1,954 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -multitypeblockmatrix.hh │ │ │ │ │ + * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ +arpackpp.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH │ │ │ │ │ +6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ +8#if HAVE_ARPACKPP || defined DOXYGEN │ │ │ │ │ +9 │ │ │ │ │ +10#include // provides std::abs, std::pow, std::sqrt │ │ │ │ │ 11 │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -15 │ │ │ │ │ -16// forward declaration │ │ │ │ │ -17namespace _D_u_n_e │ │ │ │ │ -18{ │ │ │ │ │ -19 template │ │ │ │ │ -20 class MultiTypeBlockMatrix; │ │ │ │ │ -21 │ │ │ │ │ -22 template │ │ │ │ │ -23 class MultiTypeBlockMatrix_Solver; │ │ │ │ │ -24} │ │ │ │ │ -25 │ │ │ │ │ -26#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -27 │ │ │ │ │ -28namespace _D_u_n_e { │ │ │ │ │ -29 │ │ │ │ │ -43 template │ │ │ │ │ -_4_4 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ -45 : public std::tuple │ │ │ │ │ -46 { │ │ │ │ │ -47 using ParentType = std::tuple; │ │ │ │ │ -48 public: │ │ │ │ │ -49 │ │ │ │ │ -51 using ParentType::ParentType; │ │ │ │ │ -52 │ │ │ │ │ -_5_6 typedef _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x _t_y_p_e; │ │ │ │ │ -57 │ │ │ │ │ -_5_9 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -60 │ │ │ │ │ -_6_1 typedef typename FirstRow::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -62 │ │ │ │ │ -_6_4 static constexpr _s_i_z_e___t_y_p_e _N() │ │ │ │ │ -65 { │ │ │ │ │ -66 return 1+sizeof...(Args); │ │ │ │ │ -67 } │ │ │ │ │ -68 │ │ │ │ │ -74 [[deprecated("Use method 'N' instead")]] │ │ │ │ │ -_7_5 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e() │ │ │ │ │ -76 { │ │ │ │ │ -77 return 1+sizeof...(Args); │ │ │ │ │ -78 } │ │ │ │ │ -79 │ │ │ │ │ -_8_1 static constexpr _s_i_z_e___t_y_p_e _M() │ │ │ │ │ -82 { │ │ │ │ │ -83 return FirstRow::size(); │ │ │ │ │ -84 } │ │ │ │ │ -85 │ │ │ │ │ -102 template< size_type index > │ │ │ │ │ -103 auto │ │ │ │ │ -_1_0_4 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ -> indexVariable) │ │ │ │ │ -105 -> decltype(std::get(*this)) │ │ │ │ │ -106 { │ │ │ │ │ -107 return std::get(*this); │ │ │ │ │ -108 } │ │ │ │ │ -109 │ │ │ │ │ -115 template< size_type index > │ │ │ │ │ -116 auto │ │ │ │ │ -_1_1_7 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ -> indexVariable) const │ │ │ │ │ -118 -> decltype(std::get(*this)) │ │ │ │ │ -119 { │ │ │ │ │ -120 return std::get(*this); │ │ │ │ │ -121 } │ │ │ │ │ +12#include // provides std::cout, std::endl │ │ │ │ │ +13#include // provides std::string │ │ │ │ │ +14 │ │ │ │ │ +15#include // provides Dune::FieldVector │ │ │ │ │ +16#include // provides DUNE_THROW(...) │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> // provides Dune::blockLevel │ │ │ │ │ +19#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> // provides Dune::BlockVector │ │ │ │ │ +20#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> // provides Dune::ISTLError │ │ │ │ │ +21#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> // provides Dune::printvector(...) │ │ │ │ │ +22 │ │ │ │ │ +23#ifdef Status │ │ │ │ │ +24#undef Status // prevent preprocessor from damaging the ARPACK++ │ │ │ │ │ +25 // code when "X11/Xlib.h" is included (the latter │ │ │ │ │ +26 // defines Status as "#define Status int" and │ │ │ │ │ +27 // ARPACK++ provides a class with a method called │ │ │ │ │ +28 // Status) │ │ │ │ │ +29#endif │ │ │ │ │ +30#include "arssym.h" // provides ARSymStdEig │ │ │ │ │ +31 │ │ │ │ │ +32namespace _D_u_n_e │ │ │ │ │ +33{ │ │ │ │ │ +34 │ │ │ │ │ +39 namespace Impl { │ │ │ │ │ +55 template │ │ │ │ │ +56 class ArPackPlusPlus_BCRSMatrixWrapper │ │ │ │ │ +57 { │ │ │ │ │ +58 public: │ │ │ │ │ +60 typedef typename _B_C_R_S_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e Real; │ │ │ │ │ +61 │ │ │ │ │ +62 public: │ │ │ │ │ +64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A) │ │ │ │ │ +65 : A_(A), │ │ │ │ │ +66 m_(A_.M() * mBlock), n_(A_.N() * nBlock) │ │ │ │ │ +67 { │ │ │ │ │ +68 // assert that BCRSMatrix type has blocklevel 2 │ │ │ │ │ +69 static_assert │ │ │ │ │ +70 (blockLevel() == 2, │ │ │ │ │ +71 "Only BCRSMatrices with blocklevel 2 are supported."); │ │ │ │ │ +72 │ │ │ │ │ +73 // allocate memory for auxiliary block vector objects │ │ │ │ │ +74 // which are compatible to matrix rows / columns │ │ │ │ │ +75 domainBlockVector.resize(A_.N()); │ │ │ │ │ +76 rangeBlockVector.resize(A_.M()); │ │ │ │ │ +77 } │ │ │ │ │ +78 │ │ │ │ │ +80 inline void multMv (Real* v, Real* w) │ │ │ │ │ +81 { │ │ │ │ │ +82 // get vector v as an object of appropriate type │ │ │ │ │ +83 arrayToDomainBlockVector(v,domainBlockVector); │ │ │ │ │ +84 │ │ │ │ │ +85 // perform matrix-vector product │ │ │ │ │ +86 A_.mv(domainBlockVector,rangeBlockVector); │ │ │ │ │ +87 │ │ │ │ │ +88 // get vector w from object of appropriate type │ │ │ │ │ +89 rangeBlockVectorToArray(rangeBlockVector,w); │ │ │ │ │ +90 }; │ │ │ │ │ +91 │ │ │ │ │ +93 inline void multMtMv (Real* v, Real* w) │ │ │ │ │ +94 { │ │ │ │ │ +95 // get vector v as an object of appropriate type │ │ │ │ │ +96 arrayToDomainBlockVector(v,domainBlockVector); │ │ │ │ │ +97 │ │ │ │ │ +98 // perform matrix-vector product │ │ │ │ │ +99 A_.mv(domainBlockVector,rangeBlockVector); │ │ │ │ │ +100 A_.mtv(rangeBlockVector,domainBlockVector); │ │ │ │ │ +101 │ │ │ │ │ +102 // get vector w from object of appropriate type │ │ │ │ │ +103 domainBlockVectorToArray(domainBlockVector,w); │ │ │ │ │ +104 }; │ │ │ │ │ +105 │ │ │ │ │ +107 inline void multMMtv (Real* v, Real* w) │ │ │ │ │ +108 { │ │ │ │ │ +109 // get vector v as an object of appropriate type │ │ │ │ │ +110 arrayToRangeBlockVector(v,rangeBlockVector); │ │ │ │ │ +111 │ │ │ │ │ +112 // perform matrix-vector product │ │ │ │ │ +113 A_.mtv(rangeBlockVector,domainBlockVector); │ │ │ │ │ +114 A_.mv(domainBlockVector,rangeBlockVector); │ │ │ │ │ +115 │ │ │ │ │ +116 // get vector w from object of appropriate type │ │ │ │ │ +117 rangeBlockVectorToArray(rangeBlockVector,w); │ │ │ │ │ +118 }; │ │ │ │ │ +119 │ │ │ │ │ +121 inline int nrows () const { return m_; } │ │ │ │ │ 122 │ │ │ │ │ -126 template │ │ │ │ │ -_1_2_7 void _o_p_e_r_a_t_o_r_=_ (const T& newval) { │ │ │ │ │ -128 using namespace Dune::Hybrid; │ │ │ │ │ -129 auto _s_i_z_e = index_constant<1+sizeof...(Args)>(); │ │ │ │ │ -130 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented, │ │ │ │ │ -131 // we cannot use a plain forEach(*this, ...). This could be achieved, │ │ │ │ │ -132 // e.g., by implementing a static size() method. │ │ │ │ │ -133 forEach(integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ -134 (*this)[i] = newval; │ │ │ │ │ -135 }); │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -138 //===== vector space arithmetic │ │ │ │ │ -139 │ │ │ │ │ -_1_4_1 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_*_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -142 { │ │ │ │ │ -143 auto _s_i_z_e = index_constant(); │ │ │ │ │ -144 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ -145 (*this)[i] *= k; │ │ │ │ │ -146 }); │ │ │ │ │ -147 │ │ │ │ │ -148 return *this; │ │ │ │ │ -149 } │ │ │ │ │ -150 │ │ │ │ │ -_1_5_2 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_/_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +124 inline int ncols () const { return n_; } │ │ │ │ │ +125 │ │ │ │ │ +126 protected: │ │ │ │ │ +127 // Number of rows and columns in each block of the matrix │ │ │ │ │ +128 constexpr static int mBlock = BCRSMatrix::block_type::rows; │ │ │ │ │ +129 constexpr static int nBlock = BCRSMatrix::block_type::cols; │ │ │ │ │ +130 │ │ │ │ │ +131 // Type of vectors in the domain of the linear map associated with │ │ │ │ │ +132 // the matrix, i.e. block vectors compatible to matrix rows │ │ │ │ │ +133 constexpr static int dbvBlockSize = nBlock; │ │ │ │ │ +134 typedef Dune::FieldVector DomainBlockVectorBlock; │ │ │ │ │ +135 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_D_o_m_a_i_n_B_l_o_c_k_V_e_c_t_o_r_B_l_o_c_k_> DomainBlockVector; │ │ │ │ │ +136 │ │ │ │ │ +137 // Type of vectors in the range of the linear map associated with │ │ │ │ │ +138 // the matrix, i.e. block vectors compatible to matrix columns │ │ │ │ │ +139 constexpr static int rbvBlockSize = mBlock; │ │ │ │ │ +140 typedef Dune::FieldVector RangeBlockVectorBlock; │ │ │ │ │ +141 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_R_a_n_g_e_B_l_o_c_k_V_e_c_t_o_r_B_l_o_c_k_> RangeBlockVector; │ │ │ │ │ +142 │ │ │ │ │ +143 // Types for vector index access │ │ │ │ │ +144 typedef typename _D_o_m_a_i_n_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e dbv_size_type; │ │ │ │ │ +145 typedef typename _R_a_n_g_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e rbv_size_type; │ │ │ │ │ +146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type; │ │ │ │ │ +147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type; │ │ │ │ │ +148 │ │ │ │ │ +149 // Get vector v from a block vector object which is compatible to │ │ │ │ │ +150 // matrix rows │ │ │ │ │ +151 static inline void │ │ │ │ │ +152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v) │ │ │ │ │ 153 { │ │ │ │ │ -154 auto _s_i_z_e = index_constant(); │ │ │ │ │ -155 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ -156 (*this)[i] /= k; │ │ │ │ │ -157 }); │ │ │ │ │ +154 for (dbv_size_type block = 0; block < dbv.N(); ++block) │ │ │ │ │ +155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock) │ │ │ │ │ +156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock]; │ │ │ │ │ +157 } │ │ │ │ │ 158 │ │ │ │ │ -159 return *this; │ │ │ │ │ -160 } │ │ │ │ │ -161 │ │ │ │ │ -162 │ │ │ │ │ -_1_6_8 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& b) │ │ │ │ │ -169 { │ │ │ │ │ -170 auto _s_i_z_e = index_constant(); │ │ │ │ │ -171 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ -172 (*this)[i] += b[i]; │ │ │ │ │ -173 }); │ │ │ │ │ -174 │ │ │ │ │ -175 return *this; │ │ │ │ │ -176 } │ │ │ │ │ -177 │ │ │ │ │ -_1_8_3 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x& b) │ │ │ │ │ +159 // Get vector v from a block vector object which is compatible to │ │ │ │ │ +160 // matrix columns │ │ │ │ │ +161 static inline void │ │ │ │ │ +162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v) │ │ │ │ │ +163 { │ │ │ │ │ +164 for (rbv_size_type block = 0; block < rbv.N(); ++block) │ │ │ │ │ +165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock) │ │ │ │ │ +166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock]; │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +169 public: │ │ │ │ │ +172 static inline void arrayToDomainBlockVector (const Real* v, │ │ │ │ │ +173 DomainBlockVector& dbv) │ │ │ │ │ +174 { │ │ │ │ │ +175 for (dbv_size_type block = 0; block < dbv.N(); ++block) │ │ │ │ │ +176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock) │ │ │ │ │ +177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock]; │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +182 static inline void arrayToRangeBlockVector (const Real* v, │ │ │ │ │ +183 RangeBlockVector& rbv) │ │ │ │ │ 184 { │ │ │ │ │ -185 auto _s_i_z_e = index_constant(); │ │ │ │ │ -186 Hybrid::forEach(Hybrid::integralRange(_s_i_z_e), [&](auto&& i) { │ │ │ │ │ -187 (*this)[i] -= b[i]; │ │ │ │ │ -188 }); │ │ │ │ │ +185 for (rbv_size_type block = 0; block < rbv.N(); ++block) │ │ │ │ │ +186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock) │ │ │ │ │ +187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock]; │ │ │ │ │ +188 } │ │ │ │ │ 189 │ │ │ │ │ -190 return *this; │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -195 template │ │ │ │ │ -_1_9_6 void _m_v (const X& x, Y& y) const { │ │ │ │ │ -197 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ -198 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ -199 y = 0; //reset y (for mv uses umv) │ │ │ │ │ -200 _u_m_v(x,y); │ │ │ │ │ -201 } │ │ │ │ │ -202 │ │ │ │ │ -205 template │ │ │ │ │ -_2_0_6 void _u_m_v (const X& x, Y& y) const { │ │ │ │ │ -207 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ -208 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ -209 using namespace Dune::Hybrid; │ │ │ │ │ -210 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -211 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -212 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -213 (*this)[i][j].umv(x[j], y[i]); │ │ │ │ │ -214 }); │ │ │ │ │ -215 }); │ │ │ │ │ -216 } │ │ │ │ │ -217 │ │ │ │ │ -220 template │ │ │ │ │ -_2_2_1 void _m_m_v (const X& x, Y& y) const { │ │ │ │ │ -222 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ -223 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ -224 using namespace Dune::Hybrid; │ │ │ │ │ -225 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -226 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -227 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -228 (*this)[i][j].mmv(x[j], y[i]); │ │ │ │ │ -229 }); │ │ │ │ │ -230 }); │ │ │ │ │ -231 } │ │ │ │ │ -232 │ │ │ │ │ -235 template │ │ │ │ │ -_2_3_6 void _u_s_m_v (const AlphaType& alpha, const X& x, Y& y) const { │ │ │ │ │ -237 static_assert(X::size() == _M(), "length of x does not match row length"); │ │ │ │ │ -238 static_assert(Y::size() == _N(), "length of y does not match row count"); │ │ │ │ │ -239 using namespace Dune::Hybrid; │ │ │ │ │ -240 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -241 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -242 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -243 (*this)[i][j].usmv(alpha, x[j], y[i]); │ │ │ │ │ -244 }); │ │ │ │ │ -245 }); │ │ │ │ │ -246 } │ │ │ │ │ -247 │ │ │ │ │ -250 template │ │ │ │ │ -_2_5_1 void _m_t_v (const X& x, Y& y) const { │ │ │ │ │ -252 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -253 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -254 y = 0; │ │ │ │ │ -255 _u_m_t_v(x,y); │ │ │ │ │ -256 } │ │ │ │ │ -257 │ │ │ │ │ -260 template │ │ │ │ │ -_2_6_1 void _u_m_t_v (const X& x, Y& y) const { │ │ │ │ │ -262 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -263 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -264 using namespace Dune::Hybrid; │ │ │ │ │ -265 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -266 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -267 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -268 (*this)[j][i].umtv(x[j], y[i]); │ │ │ │ │ -269 }); │ │ │ │ │ -270 }); │ │ │ │ │ -271 } │ │ │ │ │ -272 │ │ │ │ │ -275 template │ │ │ │ │ -_2_7_6 void _m_m_t_v (const X& x, Y& y) const { │ │ │ │ │ -277 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -278 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -279 using namespace Dune::Hybrid; │ │ │ │ │ -280 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -281 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -282 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -283 (*this)[j][i].mmtv(x[j], y[i]); │ │ │ │ │ -284 }); │ │ │ │ │ -285 }); │ │ │ │ │ -286 } │ │ │ │ │ -287 │ │ │ │ │ -290 template │ │ │ │ │ -_2_9_1 void _u_s_m_t_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const { │ │ │ │ │ -292 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -293 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -294 using namespace Dune::Hybrid; │ │ │ │ │ -295 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -296 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -297 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -298 (*this)[j][i].usmtv(alpha, x[j], y[i]); │ │ │ │ │ -299 }); │ │ │ │ │ -300 }); │ │ │ │ │ -301 } │ │ │ │ │ +190 protected: │ │ │ │ │ +191 // The DUNE-ISTL BCRSMatrix │ │ │ │ │ +192 const BCRSMatrix& A_; │ │ │ │ │ +193 │ │ │ │ │ +194 // Number of rows and columns in the matrix │ │ │ │ │ +195 const int m_, n_; │ │ │ │ │ +196 │ │ │ │ │ +197 // Auxiliary block vector objects which are │ │ │ │ │ +198 // compatible to matrix rows / columns │ │ │ │ │ +199 mutable DomainBlockVector domainBlockVector; │ │ │ │ │ +200 mutable RangeBlockVector rangeBlockVector; │ │ │ │ │ +201 }; │ │ │ │ │ +202 } // end namespace Impl │ │ │ │ │ +203 │ │ │ │ │ +243 template │ │ │ │ │ +_2_4_4 class _A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +245 { │ │ │ │ │ +246 public: │ │ │ │ │ +_2_4_7 typedef typename _B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e _R_e_a_l; │ │ │ │ │ +248 │ │ │ │ │ +249 public: │ │ │ │ │ +_2_6_8 _A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s (const _B_C_R_S_M_a_t_r_i_x& m, │ │ │ │ │ +269 const unsigned int nIterationsMax = 100000, │ │ │ │ │ +270 const unsigned int verbosity_level = 0) │ │ │ │ │ +271 : _m__(m), _n_I_t_e_r_a_t_i_o_n_s_M_a_x__(nIterationsMax), │ │ │ │ │ +272 _v_e_r_b_o_s_i_t_y___l_e_v_e_l__(verbosity_level), │ │ │ │ │ +273 _n_I_t_e_r_a_t_i_o_n_s__(0), │ │ │ │ │ +274 _t_i_t_l_e__(" ArPackPlusPlus_Algorithms: "), │ │ │ │ │ +275 _b_l_a_n_k__(_t_i_t_l_e__.length(),' ') │ │ │ │ │ +276 {} │ │ │ │ │ +277 │ │ │ │ │ +_2_8_9 inline void _c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e (const _R_e_a_l& epsilon, │ │ │ │ │ +290 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +291 { │ │ │ │ │ +292 // print verbosity information │ │ │ │ │ +293 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +294 std::cout << _t_i_t_l_e__ << "Computing an approximation of " │ │ │ │ │ +295 << "the dominant eigenvalue of a matrix which " │ │ │ │ │ +296 << "is assumed to be symmetric." << std::endl; │ │ │ │ │ +297 │ │ │ │ │ +298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ +299 // and to perform the product A*v (LU decomposition is not used) │ │ │ │ │ +300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ +301 WrappedMatrix A(_m__); │ │ │ │ │ 302 │ │ │ │ │ -305 template │ │ │ │ │ -_3_0_6 void _u_m_h_v (const X& x, Y& y) const { │ │ │ │ │ -307 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -308 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -309 using namespace Dune::Hybrid; │ │ │ │ │ -310 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -311 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -312 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -313 (*this)[j][i].umhv(x[j], y[i]); │ │ │ │ │ -314 }); │ │ │ │ │ -315 }); │ │ │ │ │ -316 } │ │ │ │ │ -317 │ │ │ │ │ -320 template │ │ │ │ │ -_3_2_1 void _m_m_h_v (const X& x, Y& y) const { │ │ │ │ │ -322 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -323 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -324 using namespace Dune::Hybrid; │ │ │ │ │ -325 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -326 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -327 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -328 (*this)[j][i].mmhv(x[j], y[i]); │ │ │ │ │ -329 }); │ │ │ │ │ -330 }); │ │ │ │ │ -331 } │ │ │ │ │ -332 │ │ │ │ │ -335 template │ │ │ │ │ -_3_3_6 void _u_s_m_h_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const { │ │ │ │ │ -337 static_assert(X::size() == _N(), "length of x does not match number of │ │ │ │ │ -rows"); │ │ │ │ │ -338 static_assert(Y::size() == _M(), "length of y does not match number of │ │ │ │ │ -columns"); │ │ │ │ │ -339 using namespace Dune::Hybrid; │ │ │ │ │ -340 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) { │ │ │ │ │ -341 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -342 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) { │ │ │ │ │ -343 (*this)[j][i].usmhv(alpha, x[j], y[i]); │ │ │ │ │ -344 }); │ │ │ │ │ -345 }); │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -348 │ │ │ │ │ -349 //===== norms │ │ │ │ │ -350 │ │ │ │ │ -_3_5_2 auto _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ -353 { │ │ │ │ │ -354 using field_type_00 = typename std::decay_t_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -355 typename FieldTraits::real_type sum=0; │ │ │ │ │ -356 │ │ │ │ │ -357 auto rows = index_constant(); │ │ │ │ │ -358 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) { │ │ │ │ │ -359 auto cols = index_constant::M()>(); │ │ │ │ │ -360 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) { │ │ │ │ │ -361 sum += (*this)[i][j].frobenius_norm2(); │ │ │ │ │ -362 }); │ │ │ │ │ -363 }); │ │ │ │ │ -364 │ │ │ │ │ -365 return sum; │ │ │ │ │ -366 } │ │ │ │ │ -367 │ │ │ │ │ -_3_6_9 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ -370 { │ │ │ │ │ -371 return sqrt(_f_r_o_b_e_n_i_u_s___n_o_r_m_2()); │ │ │ │ │ +303 // get number of rows and columns in A │ │ │ │ │ +304 const int nrows = A.nrows(); │ │ │ │ │ +305 const int ncols = A.ncols(); │ │ │ │ │ +306 │ │ │ │ │ +307 // assert that A is square │ │ │ │ │ +308 if (nrows != ncols) │ │ │ │ │ +309 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ +310 << nrows << "x" << ncols << ")."); │ │ │ │ │ +311 │ │ │ │ │ +312 // allocate memory for variables, set parameters │ │ │ │ │ +313 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ +314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ +each iteration (0 == auto) │ │ │ │ │ +315 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ +values) (0 == machine precision) │ │ │ │ │ +316 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ +iterations allowed (0 == 100*nev) │ │ │ │ │ +317 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A │ │ │ │ │ +318 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ +determined │ │ │ │ │ +319 int nconv; // Number of converged eigenvalues │ │ │ │ │ +320 │ │ │ │ │ +321 // define what we need: eigenvalues with largest magnitude │ │ │ │ │ +322 char which[] = "LM"; │ │ │ │ │ +323 ARSymStdEig │ │ │ │ │ +324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit); │ │ │ │ │ +325 │ │ │ │ │ +326 // set ARPACK verbosity mode if requested │ │ │ │ │ +327 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ +328 │ │ │ │ │ +329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues │ │ │ │ │ +330 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ +331 │ │ │ │ │ +332 // obtain approximated dominant eigenvalue of A │ │ │ │ │ +333 lambda = ev[nev-1]; │ │ │ │ │ +334 │ │ │ │ │ +335 // obtain associated approximated eigenvector of A │ │ │ │ │ +336 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ +337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ +338 │ │ │ │ │ +339 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ +340 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ +341 │ │ │ │ │ +342 // compute residual norm │ │ │ │ │ +343 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ +344 _R_e_a_l* Ax_raw = new _R_e_a_l[nrows]; │ │ │ │ │ +345 A.multMv(x_raw,Ax_raw); │ │ │ │ │ +346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r); │ │ │ │ │ +347 r.axpy(-lambda,x); │ │ │ │ │ +348 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ +349 │ │ │ │ │ +350 // print verbosity information │ │ │ │ │ +351 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +352 { │ │ │ │ │ +353 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +354 { │ │ │ │ │ +355 // print some information about the problem │ │ │ │ │ +356 std::cout << _b_l_a_n_k__ << "Obtained eigenvalues of A by solving " │ │ │ │ │ +357 << "A*x = λ*x using the ARPACK++ class ARSym" │ │ │ │ │ +358 << "StdEig:" << std::endl; │ │ │ │ │ +359 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A: " │ │ │ │ │ +360 << nconv << " / " << nev << std::endl; │ │ │ │ │ +361 std::cout << _b_l_a_n_k__ << " dominant eigenvalue of A: " │ │ │ │ │ +362 << lambda << std::endl; │ │ │ │ │ +363 } │ │ │ │ │ +364 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +365 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +366 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +367 << "λ = " << lambda << std::endl; │ │ │ │ │ +368 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +369 { │ │ │ │ │ +370 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ +371 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ 372 } │ │ │ │ │ -373 │ │ │ │ │ -_3_7_5 auto _i_n_f_i_n_i_t_y___n_o_r_m () const │ │ │ │ │ -376 { │ │ │ │ │ -377 using field_type_00 = typename std::decay_t_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -378 using std::max; │ │ │ │ │ -379 typename FieldTraits::real_type norm=0; │ │ │ │ │ -380 │ │ │ │ │ -381 auto rows = index_constant(); │ │ │ │ │ -382 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) { │ │ │ │ │ -383 │ │ │ │ │ -384 typename FieldTraits::real_type sum=0; │ │ │ │ │ -385 auto cols = index_constant::M()>(); │ │ │ │ │ -386 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) { │ │ │ │ │ -387 sum += (*this)[i][j].infinity_norm(); │ │ │ │ │ -388 }); │ │ │ │ │ -389 norm = max(sum, norm); │ │ │ │ │ -390 }); │ │ │ │ │ -391 │ │ │ │ │ -392 return norm; │ │ │ │ │ -393 } │ │ │ │ │ -394 │ │ │ │ │ -_3_9_6 auto _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l () const │ │ │ │ │ -397 { │ │ │ │ │ -398 using field_type_00 = typename std::decay_t_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -399 using std::max; │ │ │ │ │ -400 typename FieldTraits::real_type norm=0; │ │ │ │ │ -401 │ │ │ │ │ -402 auto rows = index_constant(); │ │ │ │ │ -403 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) { │ │ │ │ │ +373 } │ │ │ │ │ +374 │ │ │ │ │ +375 // free dynamically allocated memory │ │ │ │ │ +376 delete[] Ax_raw; │ │ │ │ │ +377 delete[] ev; │ │ │ │ │ +378 } │ │ │ │ │ +379 │ │ │ │ │ +_3_9_1 inline void _c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e (const _R_e_a_l& epsilon, │ │ │ │ │ +392 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +393 { │ │ │ │ │ +394 // print verbosity information │ │ │ │ │ +395 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +396 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ +397 << "least dominant eigenvalue of a matrix which " │ │ │ │ │ +398 << "is assumed to be symmetric." << std::endl; │ │ │ │ │ +399 │ │ │ │ │ +400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ +401 // and to perform the product A*v (LU decomposition is not used) │ │ │ │ │ +402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ +403 WrappedMatrix A(_m__); │ │ │ │ │ 404 │ │ │ │ │ -405 typename FieldTraits::real_type sum=0; │ │ │ │ │ -406 auto cols = index_constant::M()>(); │ │ │ │ │ -407 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) { │ │ │ │ │ -408 sum += (*this)[i][j].infinity_norm_real(); │ │ │ │ │ -409 }); │ │ │ │ │ -410 norm = max(sum, norm); │ │ │ │ │ -411 }); │ │ │ │ │ -412 │ │ │ │ │ -413 return norm; │ │ │ │ │ -414 } │ │ │ │ │ -415 │ │ │ │ │ -416 }; │ │ │ │ │ -417 │ │ │ │ │ -423 template │ │ │ │ │ -_4_2_4 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ -_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_T_1_,_A_r_g_s_._._._>& m) { │ │ │ │ │ -425 auto N = index_constant::N()>(); │ │ │ │ │ -426 auto M = index_constant::M()>(); │ │ │ │ │ -427 using namespace Dune::Hybrid; │ │ │ │ │ -428 forEach(integralRange(N), [&](auto&& i) { │ │ │ │ │ -429 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -430 forEach(integralRange(M), [&](auto&& j) { │ │ │ │ │ -431 s << "\t(" << i << ", " << j << "): \n" << m[i][j]; │ │ │ │ │ -432 }); │ │ │ │ │ -433 }); │ │ │ │ │ -434 s << std::endl; │ │ │ │ │ -435 return s; │ │ │ │ │ -436 } │ │ │ │ │ -437 │ │ │ │ │ -438 //make algmeta_itsteps known │ │ │ │ │ -439 template │ │ │ │ │ -440 struct algmeta_itsteps; │ │ │ │ │ -441 │ │ │ │ │ -448 template // │ │ │ │ │ -MultiTypeBlockMatrix_Solver_Col: iterating over one row │ │ │ │ │ -_4_4_9 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l { //calculating b- A[i][j]*x[j] │ │ │ │ │ -450 public: │ │ │ │ │ -454 template │ │ │ │ │ -_4_5_5 static void _c_a_l_c___r_h_s(const TMatrix& A, TVector& x, TVector& v, Trhs& b, │ │ │ │ │ -const K& w) { │ │ │ │ │ -456 std::get( std::get(A) ).mmv( std::get(x), b ); │ │ │ │ │ -457 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_I_,_ _c_r_o_w_,_ _c_c_o_l_+_1_,_ _r_e_m_a_i_n___c_o_l_-_1_>_:_:_c_a_l_c___r_h_s │ │ │ │ │ -(A,x,v,b,w); //next column element │ │ │ │ │ -458 } │ │ │ │ │ -459 │ │ │ │ │ -460 }; │ │ │ │ │ -461 template //MultiTypeBlockMatrix_Solver_Col │ │ │ │ │ -recursion end │ │ │ │ │ -_4_6_2 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l { │ │ │ │ │ -463 public: │ │ │ │ │ -464 template │ │ │ │ │ -_4_6_5 static void _c_a_l_c___r_h_s(const TMatrix&, TVector&, TVector&, Trhs&, const K&) │ │ │ │ │ -{} │ │ │ │ │ -466 }; │ │ │ │ │ -467 │ │ │ │ │ -468 │ │ │ │ │ -469 │ │ │ │ │ -476 template │ │ │ │ │ -_4_7_7 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r { │ │ │ │ │ -478 public: │ │ │ │ │ -479 │ │ │ │ │ -483 template │ │ │ │ │ -_4_8_4 static void _d_b_g_s(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ -w) { │ │ │ │ │ -485 TVector xold(x); │ │ │ │ │ -486 xold=x; //store old x values │ │ │ │ │ -487 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_d_b_g_s(A,x,x,b,w); │ │ │ │ │ -488 x *= w; │ │ │ │ │ -489 x.axpy(1-w,xold); //improve x │ │ │ │ │ -490 } │ │ │ │ │ -491 template │ │ │ │ │ -_4_9_2 static void _d_b_g_s(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ -b, const K& w) { │ │ │ │ │ -493 auto rhs = std::get (b); │ │ │ │ │ -494 │ │ │ │ │ -495 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ -(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ -496 //solve on blocklevel I-1 │ │ │ │ │ -497 using M = │ │ │ │ │ -498 typename std::remove_cv< │ │ │ │ │ -499 typename std::remove_reference< │ │ │ │ │ -500 decltype(std::get( std::get(A))) │ │ │ │ │ -501 >::type │ │ │ │ │ -502 >::type; │ │ │ │ │ -503 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_d_b_g_s(std::get( std::get(A)), std:: │ │ │ │ │ -get(x),rhs,w); │ │ │ │ │ -504 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_+_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_d_b_g_s(A,x,v,b,w); //next │ │ │ │ │ -row │ │ │ │ │ -505 } │ │ │ │ │ -506 │ │ │ │ │ -507 │ │ │ │ │ -508 │ │ │ │ │ -512 template │ │ │ │ │ -_5_1_3 static void _b_s_o_r_f(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ -w) { │ │ │ │ │ -514 TVector v; │ │ │ │ │ -515 v=x; //use latest x values in right side calculation │ │ │ │ │ -516 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_b_s_o_r_f(A,x,v,b,w); │ │ │ │ │ -517 │ │ │ │ │ -518 } │ │ │ │ │ -519 template //recursion over │ │ │ │ │ -all matrix rows (A) │ │ │ │ │ -_5_2_0 static void _b_s_o_r_f(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ -b, const K& w) { │ │ │ │ │ -521 auto rhs = std::get (b); │ │ │ │ │ -522 │ │ │ │ │ -523 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ -(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ -524 //solve on blocklevel I-1 │ │ │ │ │ -525 using M = │ │ │ │ │ -526 typename std::remove_cv< │ │ │ │ │ -527 typename std::remove_reference< │ │ │ │ │ -528 decltype(std::get( std::get(A))) │ │ │ │ │ -529 >::type │ │ │ │ │ -530 >::type; │ │ │ │ │ -531 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_b_s_o_r_f(std::get( std::get(A)), std:: │ │ │ │ │ -get(v),rhs,w); │ │ │ │ │ -532 std::get(x).axpy(w,std::get(v)); │ │ │ │ │ -533 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_+_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_b_s_o_r_f(A,x,v,b,w); // │ │ │ │ │ -next row │ │ │ │ │ -534 } │ │ │ │ │ -535 │ │ │ │ │ -539 template │ │ │ │ │ -_5_4_0 static void _b_s_o_r_b(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ -w) { │ │ │ │ │ -541 TVector v; │ │ │ │ │ -542 v=x; //use latest x values in right side calculation │ │ │ │ │ -543 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_b_s_o_r_b(A,x,v,b,w); │ │ │ │ │ -544 │ │ │ │ │ -545 } │ │ │ │ │ -546 template //recursion over │ │ │ │ │ -all matrix rows (A) │ │ │ │ │ -_5_4_7 static void _b_s_o_r_b(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ -b, const K& w) { │ │ │ │ │ -548 auto rhs = std::get (b); │ │ │ │ │ -549 │ │ │ │ │ -550 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ -(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ -551 //solve on blocklevel I-1 │ │ │ │ │ -552 using M = │ │ │ │ │ -553 typename std::remove_cv< │ │ │ │ │ -554 typename std::remove_reference< │ │ │ │ │ -555 decltype(std::get( std::get(A))) │ │ │ │ │ -556 >::type │ │ │ │ │ -557 >::type; │ │ │ │ │ -558 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_b_s_o_r_b(std::get( std::get(A)), std:: │ │ │ │ │ -get(v),rhs,w); │ │ │ │ │ -559 std::get(x).axpy(w,std::get(v)); │ │ │ │ │ -560 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_-_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_b_s_o_r_b(A,x,v,b,w); // │ │ │ │ │ -next row │ │ │ │ │ -561 } │ │ │ │ │ -562 │ │ │ │ │ +405 // get number of rows and columns in A │ │ │ │ │ +406 const int nrows = A.nrows(); │ │ │ │ │ +407 const int ncols = A.ncols(); │ │ │ │ │ +408 │ │ │ │ │ +409 // assert that A is square │ │ │ │ │ +410 if (nrows != ncols) │ │ │ │ │ +411 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ +412 << nrows << "x" << ncols << ")."); │ │ │ │ │ +413 │ │ │ │ │ +414 // allocate memory for variables, set parameters │ │ │ │ │ +415 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ +416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ +each iteration (0 == auto) │ │ │ │ │ +417 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ +values) (0 == machine precision) │ │ │ │ │ +418 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ +iterations allowed (0 == 100*nev) │ │ │ │ │ +419 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A │ │ │ │ │ +420 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ +determined │ │ │ │ │ +421 int nconv; // Number of converged eigenvalues │ │ │ │ │ +422 │ │ │ │ │ +423 // define what we need: eigenvalues with smallest magnitude │ │ │ │ │ +424 char which[] = "SM"; │ │ │ │ │ +425 ARSymStdEig │ │ │ │ │ +426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit); │ │ │ │ │ +427 │ │ │ │ │ +428 // set ARPACK verbosity mode if requested │ │ │ │ │ +429 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ +430 │ │ │ │ │ +431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues │ │ │ │ │ +432 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ +433 │ │ │ │ │ +434 // obtain approximated least dominant eigenvalue of A │ │ │ │ │ +435 lambda = ev[nev-1]; │ │ │ │ │ +436 │ │ │ │ │ +437 // obtain associated approximated eigenvector of A │ │ │ │ │ +438 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ +439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ +440 │ │ │ │ │ +441 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ +442 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ +443 │ │ │ │ │ +444 // compute residual norm │ │ │ │ │ +445 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ +446 _R_e_a_l* Ax_raw = new _R_e_a_l[nrows]; │ │ │ │ │ +447 A.multMv(x_raw,Ax_raw); │ │ │ │ │ +448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r); │ │ │ │ │ +449 r.axpy(-lambda,x); │ │ │ │ │ +450 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ +451 │ │ │ │ │ +452 // print verbosity information │ │ │ │ │ +453 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +454 { │ │ │ │ │ +455 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +456 { │ │ │ │ │ +457 // print some information about the problem │ │ │ │ │ +458 std::cout << _b_l_a_n_k__ << "Obtained eigenvalues of A by solving " │ │ │ │ │ +459 << "A*x = λ*x using the ARPACK++ class ARSym" │ │ │ │ │ +460 << "StdEig:" << std::endl; │ │ │ │ │ +461 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A: " │ │ │ │ │ +462 << nconv << " / " << nev << std::endl; │ │ │ │ │ +463 std::cout << _b_l_a_n_k__ << " least dominant eigenvalue of A: " │ │ │ │ │ +464 << lambda << std::endl; │ │ │ │ │ +465 } │ │ │ │ │ +466 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +467 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +468 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +469 << "λ = " << lambda << std::endl; │ │ │ │ │ +470 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +471 { │ │ │ │ │ +472 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ +473 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +474 } │ │ │ │ │ +475 } │ │ │ │ │ +476 │ │ │ │ │ +477 // free dynamically allocated memory │ │ │ │ │ +478 delete[] Ax_raw; │ │ │ │ │ +479 delete[] ev; │ │ │ │ │ +480 } │ │ │ │ │ +481 │ │ │ │ │ +_4_9_3 inline void _c_o_m_p_u_t_e_S_y_m_C_o_n_d_2 (const _R_e_a_l& epsilon, _R_e_a_l& cond_2) const │ │ │ │ │ +494 { │ │ │ │ │ +495 // print verbosity information │ │ │ │ │ +496 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +497 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ +498 << "spectral condition number of a matrix which " │ │ │ │ │ +499 << "is assumed to be symmetric." << std::endl; │ │ │ │ │ +500 │ │ │ │ │ +501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ +502 // and to perform the product A*v (LU decomposition is not used) │ │ │ │ │ +503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ +504 WrappedMatrix A(_m__); │ │ │ │ │ +505 │ │ │ │ │ +506 // get number of rows and columns in A │ │ │ │ │ +507 const int nrows = A.nrows(); │ │ │ │ │ +508 const int ncols = A.ncols(); │ │ │ │ │ +509 │ │ │ │ │ +510 // assert that A is square │ │ │ │ │ +511 if (nrows != ncols) │ │ │ │ │ +512 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ +513 << nrows << "x" << ncols << ")."); │ │ │ │ │ +514 │ │ │ │ │ +515 // allocate memory for variables, set parameters │ │ │ │ │ +516 const int nev = 2; // Number of eigenvalues to compute │ │ │ │ │ +517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ +each iteration (0 == auto) │ │ │ │ │ +518 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ +values) (0 == machine precision) │ │ │ │ │ +519 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ +iterations allowed (0 == 100*nev) │ │ │ │ │ +520 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A │ │ │ │ │ +521 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ +determined │ │ │ │ │ +522 int nconv; // Number of converged eigenvalues │ │ │ │ │ +523 │ │ │ │ │ +524 // define what we need: eigenvalues from both ends of the spectrum │ │ │ │ │ +525 char which[] = "BE"; │ │ │ │ │ +526 ARSymStdEig │ │ │ │ │ +527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit); │ │ │ │ │ +528 │ │ │ │ │ +529 // set ARPACK verbosity mode if requested │ │ │ │ │ +530 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ +531 │ │ │ │ │ +532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues │ │ │ │ │ +533 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ +534 │ │ │ │ │ +535 // obtain approximated dominant and least dominant eigenvalue of A │ │ │ │ │ +536 const _R_e_a_l& lambda_max = ev[nev-1]; │ │ │ │ │ +537 const _R_e_a_l& lambda_min = ev[0]; │ │ │ │ │ +538 │ │ │ │ │ +539 // obtain associated approximated eigenvectors of A │ │ │ │ │ +540 _R_e_a_l* x_max_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ +541 _R_e_a_l* x_min_raw = dprob.RawEigenvector(0); │ │ │ │ │ +542 │ │ │ │ │ +543 // obtain approximated spectral condition number of A │ │ │ │ │ +544 cond_2 = std::abs(lambda_max / lambda_min); │ │ │ │ │ +545 │ │ │ │ │ +546 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ +547 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ +548 │ │ │ │ │ +549 // compute each residual norm │ │ │ │ │ +550 _R_e_a_l* Ax_max_raw = new _R_e_a_l[nrows]; │ │ │ │ │ +551 _R_e_a_l* Ax_min_raw = new _R_e_a_l[nrows]; │ │ │ │ │ +552 A.multMv(x_max_raw,Ax_max_raw); │ │ │ │ │ +553 A.multMv(x_min_raw,Ax_min_raw); │ │ │ │ │ +554 _R_e_a_l r_max_norm = 0.0; │ │ │ │ │ +555 _R_e_a_l r_min_norm = 0.0; │ │ │ │ │ +556 for (int i = 0; i < nrows; ++i) │ │ │ │ │ +557 { │ │ │ │ │ +558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2); │ │ │ │ │ +559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2); │ │ │ │ │ +560 } │ │ │ │ │ +561 r_max_norm = std::sqrt(r_max_norm); │ │ │ │ │ +562 r_min_norm = std::sqrt(r_min_norm); │ │ │ │ │ 563 │ │ │ │ │ -567 template │ │ │ │ │ -_5_6_8 static void _d_b_j_a_c(const TMatrix& A, TVector& x, const TVector& b, const K& │ │ │ │ │ -w) { │ │ │ │ │ -569 TVector v(x); │ │ │ │ │ -570 v=0; //calc new x in v │ │ │ │ │ -571 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_,_r_e_m_a_i_n___r_o_w_>_:_:_d_b_j_a_c(A,x,v,b,w); │ │ │ │ │ -572 x.axpy(w,v); //improve x │ │ │ │ │ -573 } │ │ │ │ │ -574 template │ │ │ │ │ -_5_7_5 static void _d_b_j_a_c(const TMatrix& A, TVector& x, TVector& v, const TVector& │ │ │ │ │ -b, const K& w) { │ │ │ │ │ -576 auto rhs = std::get (b); │ │ │ │ │ -577 │ │ │ │ │ -578 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l::calc_rhs │ │ │ │ │ -(A,x,v,rhs,w); // calculate right side of equation │ │ │ │ │ -579 //solve on blocklevel I-1 │ │ │ │ │ -580 using M = │ │ │ │ │ -581 typename std::remove_cv< │ │ │ │ │ -582 typename std::remove_reference< │ │ │ │ │ -583 decltype(std::get( std::get(A))) │ │ │ │ │ -584 >::type │ │ │ │ │ -585 >::type; │ │ │ │ │ -586 _a_l_g_m_e_t_a___i_t_s_t_e_p_s_<_I_-_1_,_M_>_:_:_d_b_j_a_c(std::get( std::get(A)), std:: │ │ │ │ │ -get(v),rhs,w); │ │ │ │ │ -587 _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_I_,_c_r_o_w_+_1_,_r_e_m_a_i_n___r_o_w_-_1_>_:_:_d_b_j_a_c(A,x,v,b,w); // │ │ │ │ │ -next row │ │ │ │ │ +564 // print verbosity information │ │ │ │ │ +565 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +566 { │ │ │ │ │ +567 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +568 { │ │ │ │ │ +569 // print some information about the problem │ │ │ │ │ +570 std::cout << _b_l_a_n_k__ << "Obtained eigenvalues of A by solving " │ │ │ │ │ +571 << "A*x = λ*x using the ARPACK++ class ARSym" │ │ │ │ │ +572 << "StdEig:" << std::endl; │ │ │ │ │ +573 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A: " │ │ │ │ │ +574 << nconv << " / " << nev << std::endl; │ │ │ │ │ +575 std::cout << _b_l_a_n_k__ << " dominant eigenvalue of A: " │ │ │ │ │ +576 << lambda_max << std::endl; │ │ │ │ │ +577 std::cout << _b_l_a_n_k__ << " least dominant eigenvalue of A: " │ │ │ │ │ +578 << lambda_min << std::endl; │ │ │ │ │ +579 std::cout << _b_l_a_n_k__ << " spectral condition number of A: " │ │ │ │ │ +580 << cond_2 << std::endl; │ │ │ │ │ +581 } │ │ │ │ │ +582 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +583 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +584 << "║residual║_2 = {" << r_max_norm << "," │ │ │ │ │ +585 << r_min_norm << "}, " << "λ = {" │ │ │ │ │ +586 << lambda_max << "," << lambda_min │ │ │ │ │ +587 << "}): cond_2 = " << cond_2 << std::endl; │ │ │ │ │ 588 } │ │ │ │ │ 589 │ │ │ │ │ -590 │ │ │ │ │ -591 │ │ │ │ │ -592 │ │ │ │ │ -593 }; │ │ │ │ │ -594 template //recursion end for remain_row = 0 │ │ │ │ │ -_5_9_5 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r { │ │ │ │ │ -596 public: │ │ │ │ │ -597 template │ │ │ │ │ -_5_9_8 static void _d_b_g_s(const TMatrix&, TVector&, TVector&, │ │ │ │ │ -599 const TVector&, const K&) {} │ │ │ │ │ -600 │ │ │ │ │ -601 template │ │ │ │ │ -_6_0_2 static void _b_s_o_r_f(const TMatrix&, TVector&, TVector&, │ │ │ │ │ -603 const TVector&, const K&) {} │ │ │ │ │ -604 │ │ │ │ │ -605 template │ │ │ │ │ -_6_0_6 static void _b_s_o_r_b(const TMatrix&, TVector&, TVector&, │ │ │ │ │ -607 const TVector&, const K&) {} │ │ │ │ │ -608 │ │ │ │ │ -609 template │ │ │ │ │ -_6_1_0 static void _d_b_j_a_c(const TMatrix&, TVector&, TVector&, │ │ │ │ │ -611 const TVector&, const K&) {} │ │ │ │ │ -612 }; │ │ │ │ │ -613 │ │ │ │ │ -614} // end namespace Dune │ │ │ │ │ -615 │ │ │ │ │ -616namespace _s_t_d │ │ │ │ │ -617{ │ │ │ │ │ -622 template │ │ │ │ │ -_6_2_3 struct tuple_element > │ │ │ │ │ -624 { │ │ │ │ │ -_6_2_5 using _t_y_p_e = typename std::tuple_element >::type; │ │ │ │ │ -626 }; │ │ │ │ │ -627} │ │ │ │ │ -628#endif │ │ │ │ │ -_g_s_e_t_c_._h_h │ │ │ │ │ -Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ -generic way. │ │ │ │ │ +590 // free dynamically allocated memory │ │ │ │ │ +591 delete[] Ax_min_raw; │ │ │ │ │ +592 delete[] Ax_max_raw; │ │ │ │ │ +593 delete[] ev; │ │ │ │ │ +594 } │ │ │ │ │ +595 │ │ │ │ │ +_6_0_9 inline void _c_o_m_p_u_t_e_N_o_n_S_y_m_M_a_x (const _R_e_a_l& epsilon, │ │ │ │ │ +610 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& sigma) const │ │ │ │ │ +611 { │ │ │ │ │ +612 // print verbosity information │ │ │ │ │ +613 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +614 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ +615 << "largest singular value of a matrix which " │ │ │ │ │ +616 << "is assumed to be nonsymmetric." << std::endl; │ │ │ │ │ +617 │ │ │ │ │ +618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ +619 // and to perform the product A^T*A*v (LU decomposition is not used) │ │ │ │ │ +620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ +621 WrappedMatrix A(_m__); │ │ │ │ │ +622 │ │ │ │ │ +623 // get number of rows and columns in A │ │ │ │ │ +624 const int nrows = A.nrows(); │ │ │ │ │ +625 const int ncols = A.ncols(); │ │ │ │ │ +626 │ │ │ │ │ +627 // assert that A has more rows than columns (extend code later to the │ │ │ │ │ +opposite case!) │ │ │ │ │ +628 if (nrows < ncols) │ │ │ │ │ +629 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix has less rows than " │ │ │ │ │ +630 << "columns (" << nrows << "x" << ncols << ")." │ │ │ │ │ +631 << " This case is not implemented, yet."); │ │ │ │ │ +632 │ │ │ │ │ +633 // allocate memory for variables, set parameters │ │ │ │ │ +634 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ +635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ +each iteration (0 == auto) │ │ │ │ │ +636 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ +values) (0 == machine precision) │ │ │ │ │ +637 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ +iterations allowed (0 == 100*nev) │ │ │ │ │ +638 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A^T*A │ │ │ │ │ +639 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ +determined │ │ │ │ │ +640 int nconv; // Number of converged eigenvalues │ │ │ │ │ +641 │ │ │ │ │ +642 // define what we need: eigenvalues with largest algebraic value │ │ │ │ │ +643 char which[] = "LA"; │ │ │ │ │ +644 ARSymStdEig │ │ │ │ │ +645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit); │ │ │ │ │ +646 │ │ │ │ │ +647 // set ARPACK verbosity mode if requested │ │ │ │ │ +648 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ +649 │ │ │ │ │ +650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues │ │ │ │ │ +651 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ +652 │ │ │ │ │ +653 // obtain approximated largest eigenvalue of A^T*A │ │ │ │ │ +654 const _R_e_a_l& lambda = ev[nev-1]; │ │ │ │ │ +655 │ │ │ │ │ +656 // obtain associated approximated eigenvector of A^T*A │ │ │ │ │ +657 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ +658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ +659 │ │ │ │ │ +660 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ +661 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ +662 │ │ │ │ │ +663 // compute residual norm │ │ │ │ │ +664 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ +665 _R_e_a_l* AtAx_raw = new _R_e_a_l[ncols]; │ │ │ │ │ +666 A.multMtMv(x_raw,AtAx_raw); │ │ │ │ │ +667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r); │ │ │ │ │ +668 r.axpy(-lambda,x); │ │ │ │ │ +669 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ +670 │ │ │ │ │ +671 // calculate largest singular value of A (note that │ │ │ │ │ +672 // x is right-singular / left-singular vector of A) │ │ │ │ │ +673 sigma = std::sqrt(lambda); │ │ │ │ │ +674 │ │ │ │ │ +675 // print verbosity information │ │ │ │ │ +676 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +677 { │ │ │ │ │ +678 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +679 { │ │ │ │ │ +680 // print some information about the problem │ │ │ │ │ +681 std::cout << _b_l_a_n_k__ << "Obtained singular values of A by sol" │ │ │ │ │ +682 << "ving (A^T*A)*x = σ²*x using the ARPACK++ " │ │ │ │ │ +683 << "class ARSymStdEig:" << std::endl; │ │ │ │ │ +684 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A^T*A: " │ │ │ │ │ +685 << nconv << " / " << nev << std::endl; │ │ │ │ │ +686 std::cout << _b_l_a_n_k__ << " largest eigenvalue of A^T*A: " │ │ │ │ │ +687 << lambda << std::endl; │ │ │ │ │ +688 std::cout << _b_l_a_n_k__ << " => largest singular value of A: " │ │ │ │ │ +689 << sigma << std::endl; │ │ │ │ │ +690 } │ │ │ │ │ +691 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +692 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +693 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +694 << "σ = " << sigma << std::endl; │ │ │ │ │ +695 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +696 { │ │ │ │ │ +697 // print approximated right-singular / left-singular vector │ │ │ │ │ +698 // via DUNE-ISTL I/O methods │ │ │ │ │ +699 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +700 } │ │ │ │ │ +701 } │ │ │ │ │ +702 │ │ │ │ │ +703 // free dynamically allocated memory │ │ │ │ │ +704 delete[] AtAx_raw; │ │ │ │ │ +705 delete[] ev; │ │ │ │ │ +706 } │ │ │ │ │ +707 │ │ │ │ │ +_7_2_1 inline void _c_o_m_p_u_t_e_N_o_n_S_y_m_M_i_n (const _R_e_a_l& epsilon, │ │ │ │ │ +722 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& sigma) const │ │ │ │ │ +723 { │ │ │ │ │ +724 // print verbosity information │ │ │ │ │ +725 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +726 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ +727 << "smallest singular value of a matrix which " │ │ │ │ │ +728 << "is assumed to be nonsymmetric." << std::endl; │ │ │ │ │ +729 │ │ │ │ │ +730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ +731 // and to perform the product A^T*A*v (LU decomposition is not used) │ │ │ │ │ +732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ +733 WrappedMatrix A(_m__); │ │ │ │ │ +734 │ │ │ │ │ +735 // get number of rows and columns in A │ │ │ │ │ +736 const int nrows = A.nrows(); │ │ │ │ │ +737 const int ncols = A.ncols(); │ │ │ │ │ +738 │ │ │ │ │ +739 // assert that A has more rows than columns (extend code later to the │ │ │ │ │ +opposite case!) │ │ │ │ │ +740 if (nrows < ncols) │ │ │ │ │ +741 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix has less rows than " │ │ │ │ │ +742 << "columns (" << nrows << "x" << ncols << ")." │ │ │ │ │ +743 << " This case is not implemented, yet."); │ │ │ │ │ +744 │ │ │ │ │ +745 // allocate memory for variables, set parameters │ │ │ │ │ +746 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ +747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ +each iteration (0 == auto) │ │ │ │ │ +748 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ +values) (0 == machine precision) │ │ │ │ │ +749 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ +iterations allowed (0 == 100*nev) │ │ │ │ │ +750 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A^T*A │ │ │ │ │ +751 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ +determined │ │ │ │ │ +752 int nconv; // Number of converged eigenvalues │ │ │ │ │ +753 │ │ │ │ │ +754 // define what we need: eigenvalues with smallest algebraic value │ │ │ │ │ +755 char which[] = "SA"; │ │ │ │ │ +756 ARSymStdEig │ │ │ │ │ +757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit); │ │ │ │ │ +758 │ │ │ │ │ +759 // set ARPACK verbosity mode if requested │ │ │ │ │ +760 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ +761 │ │ │ │ │ +762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues │ │ │ │ │ +763 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ +764 │ │ │ │ │ +765 // obtain approximated smallest eigenvalue of A^T*A │ │ │ │ │ +766 const _R_e_a_l& lambda = ev[nev-1]; │ │ │ │ │ +767 │ │ │ │ │ +768 // obtain associated approximated eigenvector of A^T*A │ │ │ │ │ +769 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ +770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ +771 │ │ │ │ │ +772 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ +773 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ +774 │ │ │ │ │ +775 // compute residual norm │ │ │ │ │ +776 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ +777 _R_e_a_l* AtAx_raw = new _R_e_a_l[ncols]; │ │ │ │ │ +778 A.multMtMv(x_raw,AtAx_raw); │ │ │ │ │ +779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r); │ │ │ │ │ +780 r.axpy(-lambda,x); │ │ │ │ │ +781 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ +782 │ │ │ │ │ +783 // calculate smallest singular value of A (note that │ │ │ │ │ +784 // x is right-singular / left-singular vector of A) │ │ │ │ │ +785 sigma = std::sqrt(lambda); │ │ │ │ │ +786 │ │ │ │ │ +787 // print verbosity information │ │ │ │ │ +788 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +789 { │ │ │ │ │ +790 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +791 { │ │ │ │ │ +792 // print some information about the problem │ │ │ │ │ +793 std::cout << _b_l_a_n_k__ << "Obtained singular values of A by sol" │ │ │ │ │ +794 << "ving (A^T*A)*x = σ²*x using the ARPACK++ " │ │ │ │ │ +795 << "class ARSymStdEig:" << std::endl; │ │ │ │ │ +796 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A^T*A: " │ │ │ │ │ +797 << nconv << " / " << nev << std::endl; │ │ │ │ │ +798 std::cout << _b_l_a_n_k__ << " smallest eigenvalue of A^T*A: " │ │ │ │ │ +799 << lambda << std::endl; │ │ │ │ │ +800 std::cout << _b_l_a_n_k__ << " => smallest singular value of A: " │ │ │ │ │ +801 << sigma << std::endl; │ │ │ │ │ +802 } │ │ │ │ │ +803 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +804 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +805 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +806 << "σ = " << sigma << std::endl; │ │ │ │ │ +807 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +808 { │ │ │ │ │ +809 // print approximated right-singular / left-singular vector │ │ │ │ │ +810 // via DUNE-ISTL I/O methods │ │ │ │ │ +811 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +812 } │ │ │ │ │ +813 } │ │ │ │ │ +814 │ │ │ │ │ +815 // free dynamically allocated memory │ │ │ │ │ +816 delete[] AtAx_raw; │ │ │ │ │ +817 delete[] ev; │ │ │ │ │ +818 } │ │ │ │ │ +819 │ │ │ │ │ +_8_3_0 inline void _c_o_m_p_u_t_e_N_o_n_S_y_m_C_o_n_d_2 (const _R_e_a_l& epsilon, _R_e_a_l& cond_2) const │ │ │ │ │ +831 { │ │ │ │ │ +832 // print verbosity information │ │ │ │ │ +833 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +834 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ +835 << "spectral condition number of a matrix which " │ │ │ │ │ +836 << "is assumed to be nonsymmetric." << std::endl; │ │ │ │ │ +837 │ │ │ │ │ +838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ +839 // and to perform the product A^T*A*v (LU decomposition is not used) │ │ │ │ │ +840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ +841 WrappedMatrix A(_m__); │ │ │ │ │ +842 │ │ │ │ │ +843 // get number of rows and columns in A │ │ │ │ │ +844 const int nrows = A.nrows(); │ │ │ │ │ +845 const int ncols = A.ncols(); │ │ │ │ │ +846 │ │ │ │ │ +847 // assert that A has more rows than columns (extend code later to the │ │ │ │ │ +opposite case!) │ │ │ │ │ +848 if (nrows < ncols) │ │ │ │ │ +849 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix has less rows than " │ │ │ │ │ +850 << "columns (" << nrows << "x" << ncols << ")." │ │ │ │ │ +851 << " This case is not implemented, yet."); │ │ │ │ │ +852 │ │ │ │ │ +853 // allocate memory for variables, set parameters │ │ │ │ │ +854 const int nev = 2; // Number of eigenvalues to compute │ │ │ │ │ +855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ +each iteration (0 == auto) │ │ │ │ │ +856 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ +values) (0 == machine precision) │ │ │ │ │ +857 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ +iterations allowed (0 == 100*nev) │ │ │ │ │ +858 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A^T*A │ │ │ │ │ +859 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ +determined │ │ │ │ │ +860 int nconv; // Number of converged eigenvalues │ │ │ │ │ +861 │ │ │ │ │ +862 // define what we need: eigenvalues from both ends of the spectrum │ │ │ │ │ +863 char which[] = "BE"; │ │ │ │ │ +864 ARSymStdEig │ │ │ │ │ +865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit); │ │ │ │ │ +866 │ │ │ │ │ +867 // set ARPACK verbosity mode if requested │ │ │ │ │ +868 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ +869 │ │ │ │ │ +870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues │ │ │ │ │ +871 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ +872 │ │ │ │ │ +873 // obtain approximated largest and smallest eigenvalue of A^T*A │ │ │ │ │ +874 const _R_e_a_l& lambda_max = ev[nev-1]; │ │ │ │ │ +875 const _R_e_a_l& lambda_min = ev[0]; │ │ │ │ │ +876 │ │ │ │ │ +877 // obtain associated approximated eigenvectors of A^T*A │ │ │ │ │ +878 _R_e_a_l* x_max_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ +879 _R_e_a_l* x_min_raw = dprob.RawEigenvector(0); │ │ │ │ │ +880 │ │ │ │ │ +881 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ +882 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ +883 │ │ │ │ │ +884 // compute each residual norm │ │ │ │ │ +885 _R_e_a_l* AtAx_max_raw = new _R_e_a_l[ncols]; │ │ │ │ │ +886 _R_e_a_l* AtAx_min_raw = new _R_e_a_l[ncols]; │ │ │ │ │ +887 A.multMtMv(x_max_raw,AtAx_max_raw); │ │ │ │ │ +888 A.multMtMv(x_min_raw,AtAx_min_raw); │ │ │ │ │ +889 _R_e_a_l r_max_norm = 0.0; │ │ │ │ │ +890 _R_e_a_l r_min_norm = 0.0; │ │ │ │ │ +891 for (int i = 0; i < ncols; ++i) │ │ │ │ │ +892 { │ │ │ │ │ +893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2); │ │ │ │ │ +894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2); │ │ │ │ │ +895 } │ │ │ │ │ +896 r_max_norm = std::sqrt(r_max_norm); │ │ │ │ │ +897 r_min_norm = std::sqrt(r_min_norm); │ │ │ │ │ +898 │ │ │ │ │ +899 // calculate largest and smallest singular value of A │ │ │ │ │ +900 const _R_e_a_l sigma_max = std::sqrt(lambda_max); │ │ │ │ │ +901 const _R_e_a_l sigma_min = std::sqrt(lambda_min); │ │ │ │ │ +902 │ │ │ │ │ +903 // obtain approximated spectral condition number of A │ │ │ │ │ +904 cond_2 = sigma_max / sigma_min; │ │ │ │ │ +905 │ │ │ │ │ +906 // print verbosity information │ │ │ │ │ +907 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +908 { │ │ │ │ │ +909 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +910 { │ │ │ │ │ +911 // print some information about the problem │ │ │ │ │ +912 std::cout << _b_l_a_n_k__ << "Obtained singular values of A by sol" │ │ │ │ │ +913 << "ving (A^T*A)*x = σ²*x using the ARPACK++ " │ │ │ │ │ +914 << "class ARSymStdEig:" << std::endl; │ │ │ │ │ +915 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A^T*A: " │ │ │ │ │ +916 << nconv << " / " << nev << std::endl; │ │ │ │ │ +917 std::cout << _b_l_a_n_k__ << " largest eigenvalue of A^T*A: " │ │ │ │ │ +918 << lambda_max << std::endl; │ │ │ │ │ +919 std::cout << _b_l_a_n_k__ << " smallest eigenvalue of A^T*A: " │ │ │ │ │ +920 << lambda_min << std::endl; │ │ │ │ │ +921 std::cout << _b_l_a_n_k__ << " => largest singular value of A: " │ │ │ │ │ +922 << sigma_max << std::endl; │ │ │ │ │ +923 std::cout << _b_l_a_n_k__ << " => smallest singular value of A: " │ │ │ │ │ +924 << sigma_min << std::endl; │ │ │ │ │ +925 } │ │ │ │ │ +926 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +927 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +928 << "║residual║_2 = {" << r_max_norm << "," │ │ │ │ │ +929 << r_min_norm << "}, " << "σ = {" │ │ │ │ │ +930 << sigma_max << "," << sigma_min │ │ │ │ │ +931 << "}): cond_2 = " << cond_2 << std::endl; │ │ │ │ │ +932 } │ │ │ │ │ +933 │ │ │ │ │ +934 // free dynamically allocated memory │ │ │ │ │ +935 delete[] AtAx_min_raw; │ │ │ │ │ +936 delete[] AtAx_max_raw; │ │ │ │ │ +937 delete[] ev; │ │ │ │ │ +938 } │ │ │ │ │ +939 │ │ │ │ │ +_9_4_4 inline unsigned int _g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t () const │ │ │ │ │ +945 { │ │ │ │ │ +946 if (_n_I_t_e_r_a_t_i_o_n_s__ == 0) │ │ │ │ │ +947 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"No algorithm applied, yet."); │ │ │ │ │ +948 │ │ │ │ │ +949 return _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ +950 } │ │ │ │ │ +951 │ │ │ │ │ +952 protected: │ │ │ │ │ +953 // parameters related to iterative eigenvalue algorithms │ │ │ │ │ +_9_5_4 const _B_C_R_S_M_a_t_r_i_x& _m__; │ │ │ │ │ +_9_5_5 const unsigned int _n_I_t_e_r_a_t_i_o_n_s_M_a_x__; │ │ │ │ │ +956 │ │ │ │ │ +957 // verbosity setting │ │ │ │ │ +_9_5_8 const unsigned int _v_e_r_b_o_s_i_t_y___l_e_v_e_l__; │ │ │ │ │ +959 │ │ │ │ │ +960 // memory for storing temporary variables (mutable as they shall │ │ │ │ │ +961 // just be effectless auxiliary variables of the const apply*(...) │ │ │ │ │ +962 // methods) │ │ │ │ │ +_9_6_3 mutable unsigned int _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ +964 │ │ │ │ │ +965 // constants for printing verbosity information │ │ │ │ │ +_9_6_6 const std::string _t_i_t_l_e__; │ │ │ │ │ +_9_6_7 const std::string _b_l_a_n_k__; │ │ │ │ │ +968 }; │ │ │ │ │ +969 │ │ │ │ │ +972} // namespace Dune │ │ │ │ │ +973 │ │ │ │ │ +974#endif // HAVE_ARPACKPP │ │ │ │ │ +975 │ │ │ │ │ +976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH │ │ │ │ │ +_i_o_._h_h │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ _i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_t_y_p_e │ │ │ │ │ -MultiTypeBlockMatrix< FirstRow, Args... > type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b) │ │ │ │ │ -Add the entries of another matrix to this one. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ -void mv(const X &x, Y &y) const │ │ │ │ │ -y = A x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ -void mmtv(const X &x, Y &y) const │ │ │ │ │ -y -= A^T x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ -void mmhv(const X &x, Y &y) const │ │ │ │ │ -y -= A^H x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:321 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ -K &) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:598 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:484 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:540 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ -void usmhv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^H x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:336 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -FirstRow::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ -void usmv(const AlphaType &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ -MultiTypeBlockMatrix & operator/=(const field_type &k) │ │ │ │ │ -vector space division by scalar │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:152 │ │ │ │ │ -_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _A_r_g_s_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -typename std::tuple_element< i, std::tuple< Args... > >::type type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:625 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ -const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:492 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ -const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ -void umhv(const X &x, Y &y) const │ │ │ │ │ -y += A^H x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ -frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:369 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_N │ │ │ │ │ -static constexpr size_type N() │ │ │ │ │ -Return the number of matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ -void usmtv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^T x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:291 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -void operator=(const T &newval) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_<_ _I_,_ _c_r_o_w_,_ _c_c_o_l_,_ _0_ _>_:_:_c_a_l_c___r_h_s │ │ │ │ │ -static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:465 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ -void umv(const X &x, Y &y) const │ │ │ │ │ -y += A x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l_:_:_c_a_l_c___r_h_s │ │ │ │ │ -static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K │ │ │ │ │ -&w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:455 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:513 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_s_i_z_e │ │ │ │ │ -static constexpr size_type size() │ │ │ │ │ -Return the number of matrix rows. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ -K &) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:610 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ -auto infinity_norm_real() const │ │ │ │ │ -Bastardized version of the infinity-norm / row-sum norm. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:396 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ -auto frobenius_norm2() const │ │ │ │ │ -square of frobenius norm, need for block recursion │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:352 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for sizes. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ -auto infinity_norm() const │ │ │ │ │ -Bastardized version of the infinity-norm / row-sum norm. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:375 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ -K &) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:606 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b) │ │ │ │ │ -Subtract the entries of another matrix from this one. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -auto operator[](const std::integral_constant< size_type, index > indexVariable) │ │ │ │ │ --> decltype(std::get< index >(*this)) │ │ │ │ │ -Random-access operator. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ -const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:575 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_<_ _I_,_ _c_r_o_w_,_ _0_ _>_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const │ │ │ │ │ -K &) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:602 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ -void mtv(const X &x, Y &y) const │ │ │ │ │ -y = A^T x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:251 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_M │ │ │ │ │ -static constexpr size_type M() │ │ │ │ │ -Return the number of matrix columns. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ -void mmv(const X &x, Y &y) const │ │ │ │ │ -y -= A x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:221 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ -void umtv(const X &x, Y &y) const │ │ │ │ │ -y += A^T x │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b, │ │ │ │ │ -const K &w) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:547 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ -MultiTypeBlockMatrix & operator*=(const field_type &k) │ │ │ │ │ -vector space multiplication with scalar │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:141 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ +void printvector(std::ostream &s, const V &v, std::string title, std::string │ │ │ │ │ +rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ +Print an ISTL vector. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:89 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v) │ │ │ │ │ -Send BlockVector to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:590 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ -A Matrix class to support different block types. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_b │ │ │ │ │ -static void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_b_s_o_r_f │ │ │ │ │ -static void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:418 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_j_a_c │ │ │ │ │ -static void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_a_l_g_m_e_t_a___i_t_s_t_e_p_s_:_:_d_b_g_s │ │ │ │ │ -static void dbgs(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ -DDeeffiinniittiioonn gsetc.hh:378 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r │ │ │ │ │ -solver for MultiTypeBlockVector & MultiTypeBlockMatrix types │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:477 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x___S_o_l_v_e_r___C_o_l │ │ │ │ │ -part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockmatrix.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:488 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +Wrapper to use a range of ARPACK++ eigenvalue solvers. │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ │ │ │ │ │ +const unsigned int verbosity_level_ │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:958 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t │ │ │ │ │ +unsigned int getIterationCount() const │ │ │ │ │ +Return the number of iterations in last application of an algorithm. │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:944 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_t_i_t_l_e__ │ │ │ │ │ +const std::string title_ │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:966 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_R_e_a_l │ │ │ │ │ +BlockVector::field_type Real │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:247 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e │ │ │ │ │ +void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ +const │ │ │ │ │ +Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ +approximation lambda of its ... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e │ │ │ │ │ +void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ +const │ │ │ │ │ +Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ +approximation lambda of its ... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:391 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_m__ │ │ │ │ │ +const BCRSMatrix & m_ │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:954 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s_M_a_x__ │ │ │ │ │ +const unsigned int nIterationsMax_ │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:955 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_b_l_a_n_k__ │ │ │ │ │ +const std::string blank_ │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:967 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int │ │ │ │ │ +nIterationsMax=100000, const unsigned int verbosity_level=0) │ │ │ │ │ +Construct from required parameters. │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_C_o_n_d_2 │ │ │ │ │ +void computeSymCond2(const Real &epsilon, Real &cond_2) const │ │ │ │ │ +Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ +approximation of its spectra... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:493 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ +unsigned int nIterations_ │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:963 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_N_o_n_S_y_m_M_i_n │ │ │ │ │ +void computeNonSymMin(const Real &epsilon, BlockVector &x, Real &sigma) const │ │ │ │ │ +Assume the matrix to be nonsymmetric and perform IRLM to compute an │ │ │ │ │ +approximation sigma of its smalle... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:721 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_N_o_n_S_y_m_C_o_n_d_2 │ │ │ │ │ +void computeNonSymCond2(const Real &epsilon, Real &cond_2) const │ │ │ │ │ +Assume the matrix to be nonsymmetric and perform IRLM to compute an │ │ │ │ │ +approximation of its spectral con... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:830 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_N_o_n_S_y_m_M_a_x │ │ │ │ │ +void computeNonSymMax(const Real &epsilon, BlockVector &x, Real &sigma) const │ │ │ │ │ +Assume the matrix to be nonsymmetric and perform IRLM to compute an │ │ │ │ │ +approximation sigma of its larges... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:609 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00152.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: superlufunctions.hh File Reference │ │ │ │ +dune-istl: poweriteration.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,48 +65,55 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
superlufunctions.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
poweriteration.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include "supermatrix.h"
│ │ │ │ -#include "slu_util.h"
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <ios>
│ │ │ │ +#include <iomanip>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │ +#include <dune/istl/operators.hh>
│ │ │ │ +#include <dune/istl/solvercategory.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/istl/istlexception.hh>
│ │ │ │ +#include <dune/istl/io.hh>
│ │ │ │ +#include <dune/istl/solvers.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Macros

#define int_t   SUPERLU_INT_TYPE
 

│ │ │ │ +Classes

class  Dune::PowerIteration_Algorithms< BCRSMatrix, BlockVector >
 Iterative eigenvalue algorithms based on power iteration. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Namespaces

namespace  Dune
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ int_t

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define int_t   SUPERLU_INT_TYPE
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,19 +1,36 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_M_a_c_r_o_s │ │ │ │ │ -superlufunctions.hh File Reference │ │ │ │ │ -#include "supermatrix.h" │ │ │ │ │ -#include "slu_util.h" │ │ │ │ │ + * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +poweriteration.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_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_. │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _i_n_t___t   SUPERLU_INT_TYPE │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_<_ _B_C_R_S_M_a_t_r_i_x_,_ _B_l_o_c_k_V_e_c_t_o_r_ _> │ │ │ │ │ +  Iterative eigenvalue algorithms based on power iteration. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? iinntt__tt ********** │ │ │ │ │ -#define int_t   SUPERLU_INT_TYPE │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: superlufunctions.hh Source File │ │ │ │ +dune-istl: poweriteration.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,139 +70,875 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
superlufunctions.hh
│ │ │ │ +
poweriteration.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH
│ │ │ │ -
6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH
│ │ │ │ -
7#if HAVE_SUPERLU
│ │ │ │ -
8
│ │ │ │ -
9
│ │ │ │ -
10#define int_t SUPERLU_INT_TYPE
│ │ │ │ -
11#include "supermatrix.h"
│ │ │ │ -
12#include "slu_util.h"
│ │ │ │ -
13#undef int_t
│ │ │ │ -
14
│ │ │ │ -
15#if __has_include("slu_sdefs.h")
│ │ │ │ -
16extern "C" {
│ │ │ │ -
17 extern void
│ │ │ │ -
18 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ -
19 char *, float *, float *, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
20 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
21 float *, float *, float *, float *,
│ │ │ │ -
22 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │ -
23
│ │ │ │ -
24 extern void
│ │ │ │ -
25 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int,
│ │ │ │ -
26 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
27 extern void
│ │ │ │ -
28 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *,
│ │ │ │ -
29 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
30 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ -
31
│ │ │ │ -
32 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ -
33}
│ │ │ │ -
34#endif
│ │ │ │ -
35
│ │ │ │ -
36#if __has_include("slu_ddefs.h")
│ │ │ │ -
37extern "C" {
│ │ │ │ -
38 extern void
│ │ │ │ -
39 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ -
40 char *, double *, double *, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
41 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
42 double *, double *, double *, double *,
│ │ │ │ -
43 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │ -
44
│ │ │ │ -
45 extern void
│ │ │ │ -
46 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *,
│ │ │ │ -
47 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
48
│ │ │ │ -
49 extern void
│ │ │ │ -
50 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int,
│ │ │ │ -
51 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ +
5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
│ │ │ │ +
6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <cstddef> // provides std::size_t
│ │ │ │ +
9#include <cmath> // provides std::sqrt, std::abs
│ │ │ │ +
10
│ │ │ │ +
11#include <type_traits> // provides std::is_same
│ │ │ │ +
12#include <iostream> // provides std::cout, std::endl
│ │ │ │ +
13#include <limits> // provides std::numeric_limits
│ │ │ │ +
14#include <ios> // provides std::left, std::ios::left
│ │ │ │ +
15#include <iomanip> // provides std::setw, std::resetiosflags
│ │ │ │ +
16#include <memory> // provides std::unique_ptr
│ │ │ │ +
17#include <string> // provides std::string
│ │ │ │ +
18
│ │ │ │ +
19#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
│ │ │ │ +
20
│ │ │ │ +
21#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
│ │ │ │ +
22#include <dune/istl/operators.hh> // provides Dune::LinearOperator
│ │ │ │ +
23#include <dune/istl/solvercategory.hh> // provides Dune::SolverCategory::sequential
│ │ │ │ +
24#include <dune/istl/solvertype.hh> // provides Dune::IsDirectSolver
│ │ │ │ +
25#include <dune/istl/operators.hh> // provides Dune::MatrixAdapter
│ │ │ │ +
26#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
│ │ │ │ +
27#include <dune/istl/io.hh> // provides Dune::printvector(...)
│ │ │ │ +
28#include <dune/istl/solvers.hh> // provides Dune::InverseOperatorResult
│ │ │ │ +
29
│ │ │ │ +
30namespace Dune
│ │ │ │ +
31{
│ │ │ │ +
32
│ │ │ │ +
37 namespace Impl {
│ │ │ │ +
45 template <class X, class Y = X>
│ │ │ │ +
46 class ScalingLinearOperator : public Dune::LinearOperator<X,Y>
│ │ │ │ +
47 {
│ │ │ │ +
48 public:
│ │ │ │ +
49 typedef X domain_type;
│ │ │ │ +
50 typedef Y range_type;
│ │ │ │ +
51 typedef typename X::field_type field_type;
│ │ │ │
52
│ │ │ │ -
53 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ -
54
│ │ │ │ -
55 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ -
56}
│ │ │ │ -
57#endif
│ │ │ │ +
53 ScalingLinearOperator (field_type immutable_scaling,
│ │ │ │ +
54 const field_type& mutable_scaling)
│ │ │ │ +
55 : immutable_scaling_(immutable_scaling),
│ │ │ │ +
56 mutable_scaling_(mutable_scaling)
│ │ │ │ +
57 {}
│ │ │ │
58
│ │ │ │ -
59#if __has_include("slu_cdefs.h")
│ │ │ │ -
60#ifndef SUPERLU_TYPEDEF_COMPLEX
│ │ │ │ -
61// For now let's keep backwards compatible and let
│ │ │ │ -
62// complex be a typedef of doublecomplex
│ │ │ │ -
63#define SUPERLU_TYPEDEF_COMPLEX
│ │ │ │ -
64#endif
│ │ │ │ -
65#include "slu_scomplex.h"
│ │ │ │ -
66
│ │ │ │ -
67extern "C" {
│ │ │ │ -
68 extern void
│ │ │ │ -
69 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ -
70 char *, float *, float *, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
71 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
72 float *, float *, float *, float *,
│ │ │ │ -
73 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │ -
74
│ │ │ │ -
75
│ │ │ │ -
76 extern void
│ │ │ │ -
77 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int,
│ │ │ │ -
78 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
79
│ │ │ │ -
80
│ │ │ │ -
81 extern void
│ │ │ │ -
82 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *,
│ │ │ │ -
83 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
84
│ │ │ │ -
85 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ -
86
│ │ │ │ -
87 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ -
88}
│ │ │ │ -
89#endif
│ │ │ │ -
90
│ │ │ │ -
91#if __has_include("slu_zdefs.h")
│ │ │ │ -
92#include "slu_dcomplex.h"
│ │ │ │ -
93extern "C" {
│ │ │ │ -
94 extern void
│ │ │ │ -
95 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
│ │ │ │ -
96 char *, double *, double *, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
97 void *, int, SuperMatrix *, SuperMatrix *,
│ │ │ │ -
98 double *, double *, double *, double *,
│ │ │ │ -
99 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
│ │ │ │ -
100
│ │ │ │ +
59 virtual void apply (const X& x, Y& y) const
│ │ │ │ +
60 {
│ │ │ │ +
61 y = x;
│ │ │ │ +
62 y *= immutable_scaling_*mutable_scaling_;
│ │ │ │ +
63 }
│ │ │ │ +
64
│ │ │ │ +
65 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
│ │ │ │ +
66 {
│ │ │ │ +
67 X temp(x);
│ │ │ │ +
68 temp *= immutable_scaling_*mutable_scaling_;
│ │ │ │ +
69 y.axpy(alpha,temp);
│ │ │ │ +
70 }
│ │ │ │ +
71
│ │ │ │ + │ │ │ │ +
74 {
│ │ │ │ + │ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ +
78 protected:
│ │ │ │ +
79 const field_type immutable_scaling_;
│ │ │ │ +
80 const field_type& mutable_scaling_;
│ │ │ │ +
81 };
│ │ │ │ +
82
│ │ │ │ +
83
│ │ │ │ +
92 template <class OP1, class OP2>
│ │ │ │ +
93 class LinearOperatorSum
│ │ │ │ +
94 : public Dune::LinearOperator<typename OP1::domain_type,
│ │ │ │ +
95 typename OP1::range_type>
│ │ │ │ +
96 {
│ │ │ │ +
97 public:
│ │ │ │ +
98 typedef typename OP1::domain_type domain_type;
│ │ │ │ +
99 typedef typename OP1::range_type range_type;
│ │ │ │ +
100 typedef typename domain_type::field_type field_type;
│ │ │ │
101
│ │ │ │ -
102 extern void
│ │ │ │ -
103 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *,
│ │ │ │ -
104 int *, int *, Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
105
│ │ │ │ -
106 extern void
│ │ │ │ -
107 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int,
│ │ │ │ -
108 Stype_t, Dtype_t, Mtype_t);
│ │ │ │ -
109
│ │ │ │ -
110 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
│ │ │ │ -
111
│ │ │ │ -
112 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *);
│ │ │ │ -
113}
│ │ │ │ -
114#endif
│ │ │ │ -
115
│ │ │ │ +
102 LinearOperatorSum (const OP1& op1, const OP2& op2)
│ │ │ │ +
103 : op1_(op1), op2_(op2)
│ │ │ │ +
104 {
│ │ │ │ +
105 static_assert(std::is_same<typename OP2::domain_type,domain_type>::value,
│ │ │ │ +
106 "Domain type of both operators doesn't match!");
│ │ │ │ +
107 static_assert(std::is_same<typename OP2::range_type,range_type>::value,
│ │ │ │ +
108 "Range type of both operators doesn't match!");
│ │ │ │ +
109 }
│ │ │ │ +
110
│ │ │ │ +
111 virtual void apply (const domain_type& x, range_type& y) const
│ │ │ │ +
112 {
│ │ │ │ +
113 op1_.apply(x,y);
│ │ │ │ +
114 op2_.applyscaleadd(1.0,x,y);
│ │ │ │ +
115 }
│ │ │ │
116
│ │ │ │ -
117#endif
│ │ │ │ -
118#endif
│ │ │ │ +
117 virtual void applyscaleadd (field_type alpha,
│ │ │ │ +
118 const domain_type& x, range_type& y) const
│ │ │ │ +
119 {
│ │ │ │ +
120 range_type temp(y);
│ │ │ │ +
121 op1_.apply(x,temp);
│ │ │ │ +
122 op2_.applyscaleadd(1.0,x,temp);
│ │ │ │ +
123 y.axpy(alpha,temp);
│ │ │ │ +
124 }
│ │ │ │ +
125
│ │ │ │ +
127 virtual SolverCategory::Category category() const
│ │ │ │ +
128 {
│ │ │ │ + │ │ │ │ +
130 }
│ │ │ │ +
131
│ │ │ │ +
132 protected:
│ │ │ │ +
133 const OP1& op1_;
│ │ │ │ +
134 const OP2& op2_;
│ │ │ │ +
135 };
│ │ │ │ +
136 } // end namespace Impl
│ │ │ │ +
137
│ │ │ │ +
174 template <typename BCRSMatrix, typename BlockVector>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
176 {
│ │ │ │ +
177 protected:
│ │ │ │ +
178 // Type definitions for type of iteration operator (m_ - mu_*I)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
181 typedef Impl::ScalingLinearOperator<BlockVector> ScalingOperator;
│ │ │ │ +
182 typedef Impl::LinearOperatorSum<MatrixOperator,ScalingOperator> OperatorSum;
│ │ │ │ +
183
│ │ │ │ +
184 public:
│ │ │ │ + │ │ │ │ +
187
│ │ │ │ + │ │ │ │ +
190
│ │ │ │ +
191 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
207 const unsigned int nIterationsMax = 1000,
│ │ │ │ +
208 const unsigned int verbosity_level = 0)
│ │ │ │ +
209 : m_(m), nIterationsMax_(nIterationsMax),
│ │ │ │ +
210 verbosity_level_(verbosity_level),
│ │ │ │ +
211 mu_(0.0),
│ │ │ │ + │ │ │ │ +
213 scalingOperator_(-1.0,mu_),
│ │ │ │ + │ │ │ │ +
215 nIterations_(0),
│ │ │ │ +
216 title_(" PowerIteration_Algorithms: "),
│ │ │ │ +
217 blank_(title_.length(),' ')
│ │ │ │ +
218 {
│ │ │ │ +
219 // assert that BCRSMatrix type has blocklevel 2
│ │ │ │ +
220 static_assert
│ │ │ │ +
221 (blockLevel<BCRSMatrix>() == 2,
│ │ │ │ +
222 "Only BCRSMatrices with blocklevel 2 are supported.");
│ │ │ │ +
223
│ │ │ │ +
224 // assert that BCRSMatrix type has square blocks
│ │ │ │ +
225 static_assert
│ │ │ │ +
226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols,
│ │ │ │ +
227 "Only BCRSMatrices with square blocks are supported.");
│ │ │ │ +
228
│ │ │ │ +
229 // assert that m_ is square
│ │ │ │ +
230 const int nrows = m_.M() * BCRSMatrix::block_type::rows;
│ │ │ │ +
231 const int ncols = m_.N() * BCRSMatrix::block_type::cols;
│ │ │ │ +
232 if (nrows != ncols)
│ │ │ │ +
233 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ +
234 << nrows << "x" << ncols << ").");
│ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ + │ │ │ │ +
241
│ │ │ │ + │ │ │ │ + │ │ │ │ +
247
│ │ │ │ +
│ │ │ │ +
260 inline void applyPowerIteration (const Real& epsilon,
│ │ │ │ +
261 BlockVector& x, Real& lambda) const
│ │ │ │ +
262 {
│ │ │ │ +
263 // print verbosity information
│ │ │ │ +
264 if (verbosity_level_ > 0)
│ │ │ │ +
265 std::cout << title_
│ │ │ │ +
266 << "Performing power iteration approximating "
│ │ │ │ +
267 << "the dominant eigenvalue." << std::endl;
│ │ │ │ +
268
│ │ │ │ +
269 // allocate memory for auxiliary variables
│ │ │ │ +
270 BlockVector y(x);
│ │ │ │ +
271 BlockVector temp(x);
│ │ │ │ +
272
│ │ │ │ +
273 // perform power iteration
│ │ │ │ +
274 x *= (1.0 / x.two_norm());
│ │ │ │ +
275 m_.mv(x,y);
│ │ │ │ +
276 Real r_norm = std::numeric_limits<Real>::max();
│ │ │ │ +
277 nIterations_ = 0;
│ │ │ │ +
278 while (r_norm > epsilon)
│ │ │ │ +
279 {
│ │ │ │ +
280 // update and check number of iterations
│ │ │ │ + │ │ │ │ +
282 DUNE_THROW(Dune::ISTLError,"Power iteration did not converge "
│ │ │ │ +
283 << "in " << nIterationsMax_ << " iterations "
│ │ │ │ +
284 << "(║residual║_2 = " << r_norm << ", epsilon = "
│ │ │ │ +
285 << epsilon << ").");
│ │ │ │ +
286
│ │ │ │ +
287 // do one iteration of the power iteration algorithm
│ │ │ │ +
288 // (use that y = m_ * x)
│ │ │ │ +
289 x = y;
│ │ │ │ +
290 x *= (1.0 / y.two_norm());
│ │ │ │ +
291
│ │ │ │ +
292 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ +
293 m_.mv(x,y);
│ │ │ │ +
294 lambda = x * y;
│ │ │ │ +
295
│ │ │ │ +
296 // get norm of residual (use that y = m_ * x)
│ │ │ │ +
297 temp = y;
│ │ │ │ +
298 temp.axpy(-lambda,x);
│ │ │ │ +
299 r_norm = temp.two_norm();
│ │ │ │ +
300
│ │ │ │ +
301 // print verbosity information
│ │ │ │ +
302 if (verbosity_level_ > 1)
│ │ │ │ +
303 std::cout << blank_ << std::left
│ │ │ │ +
304 << "iteration " << std::setw(3) << nIterations_
│ │ │ │ +
305 << " (║residual║_2 = " << std::setw(11) << r_norm
│ │ │ │ +
306 << "): λ = " << lambda << std::endl
│ │ │ │ +
307 << std::resetiosflags(std::ios::left);
│ │ │ │ +
308 }
│ │ │ │ +
309
│ │ │ │ +
310 // print verbosity information
│ │ │ │ +
311 if (verbosity_level_ > 0)
│ │ │ │ +
312 {
│ │ │ │ +
313 std::cout << blank_ << "Result ("
│ │ │ │ +
314 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
315 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
316 << "λ = " << lambda << std::endl;
│ │ │ │ +
317 if (verbosity_level_ > 2)
│ │ │ │ +
318 {
│ │ │ │ +
319 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ +
320 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
321 }
│ │ │ │ +
322 }
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
353 template <typename ISTLLinearSolver,
│ │ │ │ +
354 bool avoidLinSolverCrime = false>
│ │ │ │ +
│ │ │ │ +
355 inline void applyInverseIteration (const Real& epsilon,
│ │ │ │ +
356 ISTLLinearSolver& solver,
│ │ │ │ +
357 BlockVector& x, Real& lambda) const
│ │ │ │ +
358 {
│ │ │ │ +
359 constexpr Real gamma = 0.0;
│ │ │ │ +
360 applyInverseIteration(gamma,epsilon,solver,x,lambda);
│ │ │ │ +
361 }
│ │ │ │ +
│ │ │ │ +
362
│ │ │ │ +
392 template <typename ISTLLinearSolver,
│ │ │ │ +
393 bool avoidLinSolverCrime = false>
│ │ │ │ +
│ │ │ │ +
394 inline void applyInverseIteration (const Real& gamma,
│ │ │ │ +
395 const Real& epsilon,
│ │ │ │ +
396 ISTLLinearSolver& solver,
│ │ │ │ +
397 BlockVector& x, Real& lambda) const
│ │ │ │ +
398 {
│ │ │ │ +
399 // print verbosity information
│ │ │ │ +
400 if (verbosity_level_ > 0)
│ │ │ │ +
401 {
│ │ │ │ +
402 std::cout << title_;
│ │ │ │ +
403 if (gamma == 0.0)
│ │ │ │ +
404 std::cout << "Performing inverse iteration approximating "
│ │ │ │ +
405 << "the least dominant eigenvalue." << std::endl;
│ │ │ │ +
406 else
│ │ │ │ +
407 std::cout << "Performing inverse iteration with shift "
│ │ │ │ +
408 << "gamma = " << gamma << " approximating the "
│ │ │ │ +
409 << "eigenvalue closest to gamma." << std::endl;
│ │ │ │ +
410 }
│ │ │ │ +
411
│ │ │ │ +
412 // initialize iteration operator,
│ │ │ │ +
413 // initialize iteration matrix when needed
│ │ │ │ +
414 updateShiftMu(gamma,solver);
│ │ │ │ +
415
│ │ │ │ +
416 // allocate memory for linear solver statistics
│ │ │ │ +
417 Dune::InverseOperatorResult solver_statistics;
│ │ │ │ +
418
│ │ │ │ +
419 // allocate memory for auxiliary variables
│ │ │ │ +
420 BlockVector y(x);
│ │ │ │ +
421 Real y_norm;
│ │ │ │ +
422 BlockVector temp(x);
│ │ │ │ +
423
│ │ │ │ +
424 // perform inverse iteration with shift
│ │ │ │ +
425 x *= (1.0 / x.two_norm());
│ │ │ │ +
426 Real r_norm = std::numeric_limits<Real>::max();
│ │ │ │ +
427 nIterations_ = 0;
│ │ │ │ +
428 while (r_norm > epsilon)
│ │ │ │ +
429 {
│ │ │ │ +
430 // update and check number of iterations
│ │ │ │ + │ │ │ │ +
432 DUNE_THROW(Dune::ISTLError,"Inverse iteration "
│ │ │ │ +
433 << (gamma != 0.0 ? "with shift " : "") << "did not "
│ │ │ │ +
434 << "converge in " << nIterationsMax_ << " iterations "
│ │ │ │ +
435 << "(║residual║_2 = " << r_norm << ", epsilon = "
│ │ │ │ +
436 << epsilon << ").");
│ │ │ │ +
437
│ │ │ │ +
438 // do one iteration of the inverse iteration with shift algorithm,
│ │ │ │ +
439 // part 1: solve (m_ - gamma*I) * y = x for y
│ │ │ │ +
440 // (protect x from being changed)
│ │ │ │ +
441 temp = x;
│ │ │ │ +
442 solver.apply(y,temp,solver_statistics);
│ │ │ │ +
443
│ │ │ │ +
444 // get norm of y
│ │ │ │ +
445 y_norm = y.two_norm();
│ │ │ │ +
446
│ │ │ │ +
447 // compile time switch between accuracy and efficiency
│ │ │ │ +
448 if (avoidLinSolverCrime)
│ │ │ │ +
449 {
│ │ │ │ +
450 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ +
451 // (use that x_new = y / y_norm)
│ │ │ │ +
452 m_.mv(y,temp);
│ │ │ │ +
453 lambda = (y * temp) / (y_norm * y_norm);
│ │ │ │ +
454
│ │ │ │ +
455 // get norm of residual
│ │ │ │ +
456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
│ │ │ │ +
457 temp.axpy(-lambda,y);
│ │ │ │ +
458 r_norm = temp.two_norm() / y_norm;
│ │ │ │ +
459 }
│ │ │ │ +
460 else
│ │ │ │ +
461 {
│ │ │ │ +
462 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ +
463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
│ │ │ │ +
464 lambda = gamma + (y * x) / (y_norm * y_norm);
│ │ │ │ +
465
│ │ │ │ +
466 // get norm of residual
│ │ │ │ +
467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
│ │ │ │ +
468 temp = x; temp.axpy(gamma-lambda,y);
│ │ │ │ +
469 r_norm = temp.two_norm() / y_norm;
│ │ │ │ +
470 }
│ │ │ │ +
471
│ │ │ │ +
472 // do one iteration of the inverse iteration with shift algorithm,
│ │ │ │ +
473 // part 2: update x
│ │ │ │ +
474 x = y;
│ │ │ │ +
475 x *= (1.0 / y_norm);
│ │ │ │ +
476
│ │ │ │ +
477 // print verbosity information
│ │ │ │ +
478 if (verbosity_level_ > 1)
│ │ │ │ +
479 std::cout << blank_ << std::left
│ │ │ │ +
480 << "iteration " << std::setw(3) << nIterations_
│ │ │ │ +
481 << " (║residual║_2 = " << std::setw(11) << r_norm
│ │ │ │ +
482 << "): λ = " << lambda << std::endl
│ │ │ │ +
483 << std::resetiosflags(std::ios::left);
│ │ │ │ +
484 }
│ │ │ │ +
485
│ │ │ │ +
486 // print verbosity information
│ │ │ │ +
487 if (verbosity_level_ > 0)
│ │ │ │ +
488 {
│ │ │ │ +
489 std::cout << blank_ << "Result ("
│ │ │ │ +
490 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
491 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
492 << "λ = " << lambda << std::endl;
│ │ │ │ +
493 if (verbosity_level_ > 2)
│ │ │ │ +
494 {
│ │ │ │ +
495 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ +
496 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
497 }
│ │ │ │ +
498 }
│ │ │ │ +
499 }
│ │ │ │ +
│ │ │ │ +
500
│ │ │ │ +
531 template <typename ISTLLinearSolver,
│ │ │ │ +
532 bool avoidLinSolverCrime = false>
│ │ │ │ +
│ │ │ │ +
533 inline void applyRayleighQuotientIteration (const Real& epsilon,
│ │ │ │ +
534 ISTLLinearSolver& solver,
│ │ │ │ +
535 BlockVector& x, Real& lambda) const
│ │ │ │ +
536 {
│ │ │ │ +
537 // print verbosity information
│ │ │ │ +
538 if (verbosity_level_ > 0)
│ │ │ │ +
539 std::cout << title_
│ │ │ │ +
540 << "Performing Rayleigh quotient iteration for "
│ │ │ │ +
541 << "estimated eigenvalue " << lambda << "." << std::endl;
│ │ │ │ +
542
│ │ │ │ +
543 // allocate memory for linear solver statistics
│ │ │ │ +
544 Dune::InverseOperatorResult solver_statistics;
│ │ │ │ +
545
│ │ │ │ +
546 // allocate memory for auxiliary variables
│ │ │ │ +
547 BlockVector y(x);
│ │ │ │ +
548 Real y_norm;
│ │ │ │ +
549 Real lambda_update;
│ │ │ │ +
550 BlockVector temp(x);
│ │ │ │ +
551
│ │ │ │ +
552 // perform Rayleigh quotient iteration
│ │ │ │ +
553 x *= (1.0 / x.two_norm());
│ │ │ │ +
554 Real r_norm = std::numeric_limits<Real>::max();
│ │ │ │ +
555 nIterations_ = 0;
│ │ │ │ +
556 while (r_norm > epsilon)
│ │ │ │ +
557 {
│ │ │ │ +
558 // update and check number of iterations
│ │ │ │ + │ │ │ │ +
560 DUNE_THROW(Dune::ISTLError,"Rayleigh quotient iteration did not "
│ │ │ │ +
561 << "converge in " << nIterationsMax_ << " iterations "
│ │ │ │ +
562 << "(║residual║_2 = " << r_norm << ", epsilon = "
│ │ │ │ +
563 << epsilon << ").");
│ │ │ │ +
564
│ │ │ │ +
565 // update iteration operator,
│ │ │ │ +
566 // update iteration matrix when needed
│ │ │ │ +
567 updateShiftMu(lambda,solver);
│ │ │ │ +
568
│ │ │ │ +
569 // do one iteration of the Rayleigh quotient iteration algorithm,
│ │ │ │ +
570 // part 1: solve (m_ - lambda*I) * y = x for y
│ │ │ │ +
571 // (protect x from being changed)
│ │ │ │ +
572 temp = x;
│ │ │ │ +
573 solver.apply(y,temp,solver_statistics);
│ │ │ │ +
574
│ │ │ │ +
575 // get norm of y
│ │ │ │ +
576 y_norm = y.two_norm();
│ │ │ │ +
577
│ │ │ │ +
578 // compile time switch between accuracy and efficiency
│ │ │ │ +
579 if (avoidLinSolverCrime)
│ │ │ │ +
580 {
│ │ │ │ +
581 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ +
582 // (use that x_new = y / y_norm)
│ │ │ │ +
583 m_.mv(y,temp);
│ │ │ │ +
584 lambda = (y * temp) / (y_norm * y_norm);
│ │ │ │ +
585
│ │ │ │ +
586 // get norm of residual
│ │ │ │ +
587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
│ │ │ │ +
588 temp.axpy(-lambda,y);
│ │ │ │ +
589 r_norm = temp.two_norm() / y_norm;
│ │ │ │ +
590 }
│ │ │ │ +
591 else
│ │ │ │ +
592 {
│ │ │ │ +
593 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ +
594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
│ │ │ │ +
595 lambda_update = (y * x) / (y_norm * y_norm);
│ │ │ │ +
596 lambda += lambda_update;
│ │ │ │ +
597
│ │ │ │ +
598 // get norm of residual
│ │ │ │ +
599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
│ │ │ │ +
600 temp = x; temp.axpy(-lambda_update,y);
│ │ │ │ +
601 r_norm = temp.two_norm() / y_norm;
│ │ │ │ +
602 }
│ │ │ │ +
603
│ │ │ │ +
604 // do one iteration of the Rayleigh quotient iteration algorithm,
│ │ │ │ +
605 // part 2: update x
│ │ │ │ +
606 x = y;
│ │ │ │ +
607 x *= (1.0 / y_norm);
│ │ │ │ +
608
│ │ │ │ +
609 // print verbosity information
│ │ │ │ +
610 if (verbosity_level_ > 1)
│ │ │ │ +
611 std::cout << blank_ << std::left
│ │ │ │ +
612 << "iteration " << std::setw(3) << nIterations_
│ │ │ │ +
613 << " (║residual║_2 = " << std::setw(11) << r_norm
│ │ │ │ +
614 << "): λ = " << lambda << std::endl
│ │ │ │ +
615 << std::resetiosflags(std::ios::left);
│ │ │ │ +
616 }
│ │ │ │ +
617
│ │ │ │ +
618 // print verbosity information
│ │ │ │ +
619 if (verbosity_level_ > 0)
│ │ │ │ +
620 {
│ │ │ │ +
621 std::cout << blank_ << "Result ("
│ │ │ │ +
622 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
623 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
624 << "λ = " << lambda << std::endl;
│ │ │ │ +
625 if (verbosity_level_ > 2)
│ │ │ │ +
626 {
│ │ │ │ +
627 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ +
628 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
629 }
│ │ │ │ +
630 }
│ │ │ │ +
631 }
│ │ │ │ +
│ │ │ │ +
632
│ │ │ │ +
689 template <typename ISTLLinearSolver,
│ │ │ │ +
690 bool avoidLinSolverCrime = false>
│ │ │ │ +
│ │ │ │ +
691 inline void applyTLIMEIteration (const Real& gamma, const Real& eta,
│ │ │ │ +
692 const Real& epsilon,
│ │ │ │ +
693 ISTLLinearSolver& solver,
│ │ │ │ +
694 const Real& delta, const std::size_t& m,
│ │ │ │ +
695 bool& extrnl,
│ │ │ │ +
696 BlockVector& x, Real& lambda) const
│ │ │ │ +
697 {
│ │ │ │ +
698 // use same variable names as in [Szyld, 1988]
│ │ │ │ +
699 BlockVector& x_s = x;
│ │ │ │ +
700 Real& mu_s = lambda;
│ │ │ │ +
701
│ │ │ │ +
702 // print verbosity information
│ │ │ │ +
703 if (verbosity_level_ > 0)
│ │ │ │ +
704 std::cout << title_
│ │ │ │ +
705 << "Performing TLIME iteration for "
│ │ │ │ +
706 << "estimated eigenvalue in the "
│ │ │ │ +
707 << "interval (" << gamma - eta << ","
│ │ │ │ +
708 << gamma + eta << ")." << std::endl;
│ │ │ │ +
709
│ │ │ │ +
710 // allocate memory for linear solver statistics
│ │ │ │ +
711 Dune::InverseOperatorResult solver_statistics;
│ │ │ │ +
712
│ │ │ │ +
713 // allocate memory for auxiliary variables
│ │ │ │ +
714 bool doRQI;
│ │ │ │ +
715 Real mu;
│ │ │ │ +
716 BlockVector y(x_s);
│ │ │ │ +
717 Real omega;
│ │ │ │ +
718 Real mu_s_old;
│ │ │ │ +
719 Real mu_s_update;
│ │ │ │ +
720 BlockVector temp(x_s);
│ │ │ │ +
721 Real q_norm, r_norm;
│ │ │ │ +
722
│ │ │ │ +
723 // perform TLIME iteration
│ │ │ │ +
724 x_s *= (1.0 / x_s.two_norm());
│ │ │ │ +
725 extrnl = true;
│ │ │ │ +
726 doRQI = false;
│ │ │ │ +
727 r_norm = std::numeric_limits<Real>::max();
│ │ │ │ +
728 nIterations_ = 0;
│ │ │ │ +
729 while (r_norm > epsilon)
│ │ │ │ +
730 {
│ │ │ │ +
731 // update and check number of iterations
│ │ │ │ + │ │ │ │ +
733 DUNE_THROW(Dune::ISTLError,"TLIME iteration did not "
│ │ │ │ +
734 << "converge in " << nIterationsMax_
│ │ │ │ +
735 << " iterations (║residual║_2 = " << r_norm
│ │ │ │ +
736 << ", epsilon = " << epsilon << ").");
│ │ │ │ +
737
│ │ │ │ +
738 // set shift for next iteration according to inverse iteration
│ │ │ │ +
739 // with shift (II) resp. Rayleigh quotient iteration (RQI)
│ │ │ │ +
740 if (doRQI)
│ │ │ │ +
741 mu = mu_s;
│ │ │ │ +
742 else
│ │ │ │ +
743 mu = gamma;
│ │ │ │ +
744
│ │ │ │ +
745 // update II/RQI iteration operator,
│ │ │ │ +
746 // update II/RQI iteration matrix when needed
│ │ │ │ +
747 updateShiftMu(mu,solver);
│ │ │ │ +
748
│ │ │ │ +
749 // do one iteration of the II/RQI algorithm,
│ │ │ │ +
750 // part 1: solve (m_ - mu*I) * y = x for y
│ │ │ │ +
751 temp = x_s;
│ │ │ │ +
752 solver.apply(y,temp,solver_statistics);
│ │ │ │ +
753
│ │ │ │ +
754 // do one iteration of the II/RQI algorithm,
│ │ │ │ +
755 // part 2: compute omega
│ │ │ │ +
756 omega = (1.0 / y.two_norm());
│ │ │ │ +
757
│ │ │ │ +
758 // backup the old Rayleigh quotient
│ │ │ │ +
759 mu_s_old = mu_s;
│ │ │ │ +
760
│ │ │ │ +
761 // compile time switch between accuracy and efficiency
│ │ │ │ +
762 if (avoidLinSolverCrime)
│ │ │ │ +
763 {
│ │ │ │ +
764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
│ │ │ │ +
765 // (use that x_new = y * omega)
│ │ │ │ +
766 m_.mv(y,temp);
│ │ │ │ +
767 mu_s = (y * temp) * (omega * omega);
│ │ │ │ +
768
│ │ │ │ +
769 // get norm of "the residual with respect to the shift used by II",
│ │ │ │ +
770 // use normal representation of q
│ │ │ │ +
771 // (use that x_new = y * omega, use that temp = m_ * y)
│ │ │ │ +
772 temp.axpy(-gamma,y);
│ │ │ │ +
773 q_norm = temp.two_norm() * omega;
│ │ │ │ +
774
│ │ │ │ +
775 // get norm of "the residual with respect to the Rayleigh quotient"
│ │ │ │ +
776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s);
│ │ │ │ +
777 // prevent that truncation errors invalidate the norm
│ │ │ │ +
778 // (we don't want to calculate sqrt of a negative number)
│ │ │ │ +
779 if (r_norm >= 0)
│ │ │ │ +
780 {
│ │ │ │ +
781 // use relation between the norms of r and q for efficiency
│ │ │ │ +
782 r_norm = std::sqrt(r_norm);
│ │ │ │ +
783 }
│ │ │ │ +
784 else
│ │ │ │ +
785 {
│ │ │ │ +
786 // use relation between r and q
│ │ │ │ +
787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q / omega)
│ │ │ │ +
788 temp.axpy(gamma-mu_s,y);
│ │ │ │ +
789 r_norm = temp.two_norm() * omega;
│ │ │ │ +
790 }
│ │ │ │ +
791 }
│ │ │ │ +
792 else
│ │ │ │ +
793 {
│ │ │ │ +
794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
│ │ │ │ +
795 if (!doRQI)
│ │ │ │ +
796 {
│ │ │ │ +
797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
│ │ │ │ +
798 mu_s = gamma + (y * x_s) * (omega * omega);
│ │ │ │ +
799 }
│ │ │ │ +
800 else
│ │ │ │ +
801 {
│ │ │ │ +
802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
│ │ │ │ +
803 mu_s_update = (y * x_s) * (omega * omega);
│ │ │ │ +
804 mu_s += mu_s_update;
│ │ │ │ +
805 }
│ │ │ │ +
806
│ │ │ │ +
807 // get norm of "the residual with respect to the shift used by II"
│ │ │ │ +
808 if (!doRQI)
│ │ │ │ +
809 {
│ │ │ │ +
810 // use special representation of q in the II case
│ │ │ │ +
811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
│ │ │ │ +
812 q_norm = omega;
│ │ │ │ +
813 }
│ │ │ │ +
814 else
│ │ │ │ +
815 {
│ │ │ │ +
816 // use special representation of q in the RQI case
│ │ │ │ +
817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
│ │ │ │ +
818 temp = x_s; temp.axpy(mu_s-gamma,y);
│ │ │ │ +
819 q_norm = temp.two_norm() * omega;
│ │ │ │ +
820 }
│ │ │ │ +
821
│ │ │ │ +
822 // get norm of "the residual with respect to the Rayleigh quotient"
│ │ │ │ +
823 // don't use efficient relation between the norms of r and q, as
│ │ │ │ +
824 // this relation seems to yield a less accurate r_norm in the case
│ │ │ │ +
825 // where linear solver crime is admitted
│ │ │ │ +
826 if (!doRQI)
│ │ │ │ +
827 {
│ │ │ │ +
828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s)
│ │ │ │ +
829 temp = x_s; temp.axpy(gamma-lambda,y);
│ │ │ │ +
830 r_norm = temp.two_norm() * omega;
│ │ │ │ +
831 }
│ │ │ │ +
832 else
│ │ │ │ +
833 {
│ │ │ │ +
834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s)
│ │ │ │ +
835 temp = x_s; temp.axpy(-mu_s_update,y);
│ │ │ │ +
836 r_norm = temp.two_norm() * omega;
│ │ │ │ +
837 }
│ │ │ │ +
838 }
│ │ │ │ +
839
│ │ │ │ +
840 // do one iteration of the II/RQI algorithm,
│ │ │ │ +
841 // part 3: update x
│ │ │ │ +
842 x_s = y; x_s *= omega;
│ │ │ │ +
843
│ │ │ │ +
844 // // for relative residual norm mode, scale with mu_s^{-1}
│ │ │ │ +
845 // r_norm /= std::abs(mu_s);
│ │ │ │ +
846
│ │ │ │ +
847 // print verbosity information
│ │ │ │ +
848 if (verbosity_level_ > 1)
│ │ │ │ +
849 std::cout << blank_ << "iteration "
│ │ │ │ +
850 << std::left << std::setw(3) << nIterations_
│ │ │ │ +
851 << " (" << (doRQI ? "RQI," : "II, ")
│ │ │ │ +
852 << " " << (doRQI ? "—>" : " ") << " "
│ │ │ │ +
853 << "║r║_2 = " << std::setw(11) << r_norm
│ │ │ │ +
854 << ", " << (doRQI ? " " : "—>") << " "
│ │ │ │ +
855 << "║q║_2 = " << std::setw(11) << q_norm
│ │ │ │ +
856 << "): λ = " << lambda << std::endl
│ │ │ │ +
857 << std::resetiosflags(std::ios::left);
│ │ │ │ +
858
│ │ │ │ +
859 // check if the eigenvalue closest to gamma lies in J
│ │ │ │ +
860 if (!doRQI && q_norm < eta)
│ │ │ │ +
861 {
│ │ │ │ +
862 // J is not free of eigenvalues
│ │ │ │ +
863 extrnl = false;
│ │ │ │ +
864
│ │ │ │ +
865 // by theory we know now that mu_s also lies in J
│ │ │ │ +
866 assert(std::abs(mu_s-gamma) < eta);
│ │ │ │ +
867
│ │ │ │ +
868 // switch to RQI
│ │ │ │ +
869 doRQI = true;
│ │ │ │ +
870 }
│ │ │ │ +
871
│ │ │ │ +
872 // revert to II if J is not free of eigenvalues but
│ │ │ │ +
873 // at some point mu_s falls back again outside J
│ │ │ │ +
874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta)
│ │ │ │ +
875 doRQI = false;
│ │ │ │ +
876
│ │ │ │ +
877 // if eigenvalue closest to gamma does not lie in J use RQI
│ │ │ │ +
878 // solely to accelerate the convergence to this eigenvalue
│ │ │ │ +
879 // when II has become stationary
│ │ │ │ +
880 if (extrnl && !doRQI)
│ │ │ │ +
881 {
│ │ │ │ +
882 // switch to RQI if the relative change of the Rayleigh
│ │ │ │ +
883 // quotient indicates that II has become stationary
│ │ │ │ +
884 if (nIterations_ >= m &&
│ │ │ │ +
885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta)
│ │ │ │ +
886 doRQI = true;
│ │ │ │ +
887 }
│ │ │ │ +
888 }
│ │ │ │ +
889
│ │ │ │ +
890 // // compute final residual and lambda again (paranoia....)
│ │ │ │ +
891 // m_.mv(x_s,temp);
│ │ │ │ +
892 // mu_s = x_s * temp;
│ │ │ │ +
893 // temp.axpy(-mu_s,x_s);
│ │ │ │ +
894 // r_norm = temp.two_norm();
│ │ │ │ +
895 // // r_norm /= std::abs(mu_s);
│ │ │ │ +
896
│ │ │ │ +
897 // print verbosity information
│ │ │ │ +
898 if (verbosity_level_ > 0)
│ │ │ │ +
899 {
│ │ │ │ +
900 if (extrnl)
│ │ │ │ +
901 std::cout << blank_ << "Interval "
│ │ │ │ +
902 << "(" << gamma - eta << "," << gamma + eta
│ │ │ │ +
903 << ") is free of eigenvalues, approximating "
│ │ │ │ +
904 << "the closest eigenvalue." << std::endl;
│ │ │ │ +
905 std::cout << blank_ << "Result ("
│ │ │ │ +
906 << "#iterations = " << nIterations_ << ", "
│ │ │ │ +
907 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ +
908 << "λ = " << lambda << std::endl;
│ │ │ │ +
909 if (verbosity_level_ > 2)
│ │ │ │ +
910 {
│ │ │ │ +
911 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ +
912 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ +
913 }
│ │ │ │ +
914 }
│ │ │ │ +
915 }
│ │ │ │ +
│ │ │ │ +
916
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
926 {
│ │ │ │ +
927 // return iteration operator
│ │ │ │ +
928 return itOperator_;
│ │ │ │ +
929 }
│ │ │ │ +
│ │ │ │ +
930
│ │ │ │ +
│ │ │ │ +
945 inline const BCRSMatrix& getIterationMatrix () const
│ │ │ │ +
946 {
│ │ │ │ +
947 // create iteration matrix on demand
│ │ │ │ +
948 if (!itMatrix_)
│ │ │ │ +
949 itMatrix_ = std::make_unique<BCRSMatrix>(m_);
│ │ │ │ +
950
│ │ │ │ +
951 // return iteration matrix
│ │ │ │ +
952 return *itMatrix_;
│ │ │ │ +
953 }
│ │ │ │ +
│ │ │ │ +
954
│ │ │ │ +
│ │ │ │ +
959 inline unsigned int getIterationCount () const
│ │ │ │ +
960 {
│ │ │ │ +
961 if (nIterations_ == 0)
│ │ │ │ +
962 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
│ │ │ │ +
963
│ │ │ │ +
964 return nIterations_;
│ │ │ │ +
965 }
│ │ │ │ +
│ │ │ │ +
966
│ │ │ │ +
967 protected:
│ │ │ │ +
982 template <typename ISTLLinearSolver>
│ │ │ │ +
│ │ │ │ +
983 inline void updateShiftMu (const Real& mu,
│ │ │ │ +
984 ISTLLinearSolver& solver) const
│ │ │ │ +
985 {
│ │ │ │ +
986 // do nothing if new shift equals the old one
│ │ │ │ +
987 if (mu == mu_) return;
│ │ │ │ +
988
│ │ │ │ +
989 // update shift mu_, i.e. update iteration operator
│ │ │ │ +
990 mu_ = mu;
│ │ │ │ +
991
│ │ │ │ +
992 // update iteration matrix when needed
│ │ │ │ +
993 if (itMatrix_)
│ │ │ │ +
994 {
│ │ │ │ +
995 // iterate over entries in iteration matrix diagonal
│ │ │ │ +
996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows;
│ │ │ │ +
997 constexpr int colBlockSize = BCRSMatrix::block_type::cols;
│ │ │ │ +
998 for (typename BCRSMatrix::size_type i = 0;
│ │ │ │ +
999 i < itMatrix_->M()*rowBlockSize; ++i)
│ │ │ │ +
1000 {
│ │ │ │ +
1001 // access m_[i,i] where i is the flat index of a row/column
│ │ │ │ +
1002 const Real& m_entry = m_
│ │ │ │ +
1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
│ │ │ │ +
1004 // access *itMatrix[i,i] where i is the flat index of a row/column
│ │ │ │ +
1005 Real& entry = (*itMatrix_)
│ │ │ │ +
1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
│ │ │ │ +
1007 // change current entry in iteration matrix diagonal
│ │ │ │ +
1008 entry = m_entry - mu_;
│ │ │ │ +
1009 }
│ │ │ │ +
1010 // notify linear solver about change of the iteration matrix object
│ │ │ │ + │ │ │ │ +
1012 (solver,*itMatrix_);
│ │ │ │ +
1013 }
│ │ │ │ +
1014 }
│ │ │ │ +
│ │ │ │ +
1015
│ │ │ │ +
1016 protected:
│ │ │ │ +
1017 // parameters related to iterative eigenvalue algorithms
│ │ │ │ + │ │ │ │ +
1019 const unsigned int nIterationsMax_;
│ │ │ │ +
1020
│ │ │ │ +
1021 // verbosity setting
│ │ │ │ +
1022 const unsigned int verbosity_level_;
│ │ │ │ +
1023
│ │ │ │ +
1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I)
│ │ │ │ +
1025 mutable Real mu_;
│ │ │ │ +
1026
│ │ │ │ +
1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
1031
│ │ │ │ +
1032 // iteration matrix (m_ - mu_*I), provided on demand when needed
│ │ │ │ +
1033 // (e.g. for preconditioning)
│ │ │ │ +
1034 mutable std::unique_ptr<BCRSMatrix> itMatrix_;
│ │ │ │ +
1035
│ │ │ │ +
1036 // memory for storing temporary variables (mutable as they shall
│ │ │ │ +
1037 // just be effectless auxiliary variables of the const apply*(...)
│ │ │ │ +
1038 // methods)
│ │ │ │ +
1039 mutable unsigned int nIterations_;
│ │ │ │ +
1040
│ │ │ │ +
1041 // constants for printing verbosity information
│ │ │ │ +
1042 const std::string title_;
│ │ │ │ +
1043 const std::string blank_;
│ │ │ │ +
1044 };
│ │ │ │ +
│ │ │ │ +
1045
│ │ │ │ +
1048} // namespace Dune
│ │ │ │ +
1049
│ │ │ │ +
1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
│ │ │ │ +
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ + │ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ + │ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition io.hh:89
│ │ │ │ +
Definition allocator.hh:11
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ +
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │ +
void mv(const X &x, Y &y) const
y = A x
Definition bcrsmatrix.hh:1612
│ │ │ │ +
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ +
Iterative eigenvalue algorithms based on power iteration.
Definition poweriteration.hh:176
│ │ │ │ +
std::unique_ptr< BCRSMatrix > itMatrix_
Definition poweriteration.hh:1034
│ │ │ │ +
PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete
│ │ │ │ +
Impl::ScalingLinearOperator< BlockVector > ScalingOperator
Definition poweriteration.hh:181
│ │ │ │ +
const std::string blank_
Definition poweriteration.hh:1043
│ │ │ │ +
Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum
Definition poweriteration.hh:182
│ │ │ │ +
Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator
Definition poweriteration.hh:180
│ │ │ │ +
void applyInverseIteration(const Real &epsilon, ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const
Perform the inverse iteration algorithm to compute an approximation lambda of the least dominant (i....
Definition poweriteration.hh:355
│ │ │ │ +
void applyTLIMEIteration(const Real &gamma, const Real &eta, const Real &epsilon, ISTLLinearSolver &solver, const Real &delta, const std::size_t &m, bool &extrnl, BlockVector &x, Real &lambda) const
Perform the "two-level iterative method for eigenvalue calculations (TLIME)" iteration algorit...
Definition poweriteration.hh:691
│ │ │ │ +
IterationOperator & getIterationOperator()
Return the iteration operator (m_ - mu_*I).
Definition poweriteration.hh:925
│ │ │ │ +
OperatorSum itOperator_
Definition poweriteration.hh:1030
│ │ │ │ +
const BCRSMatrix & m_
Definition poweriteration.hh:1018
│ │ │ │ +
PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=1000, const unsigned int verbosity_level=0)
Construct from required parameters.
Definition poweriteration.hh:206
│ │ │ │ +
const unsigned int nIterationsMax_
Definition poweriteration.hh:1019
│ │ │ │ +
void applyPowerIteration(const Real &epsilon, BlockVector &x, Real &lambda) const
Perform the power iteration algorithm to compute an approximation lambda of the dominant (i....
Definition poweriteration.hh:260
│ │ │ │ +
OperatorSum IterationOperator
Type of iteration operator (m_ - mu_*I)
Definition poweriteration.hh:189
│ │ │ │ +
void applyRayleighQuotientIteration(const Real &epsilon, ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const
Perform the Rayleigh quotient iteration algorithm to compute an approximation lambda of an eigenvalue...
Definition poweriteration.hh:533
│ │ │ │ +
void applyInverseIteration(const Real &gamma, const Real &epsilon, ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const
Perform the inverse iteration with shift algorithm to compute an approximation lambda of the eigenval...
Definition poweriteration.hh:394
│ │ │ │ +
const ScalingOperator scalingOperator_
Definition poweriteration.hh:1029
│ │ │ │ +
void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const
Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I).
Definition poweriteration.hh:983
│ │ │ │ +
PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete
│ │ │ │ +
unsigned int getIterationCount() const
Return the number of iterations in last application of an algorithm.
Definition poweriteration.hh:959
│ │ │ │ +
const MatrixOperator matrixOperator_
Definition poweriteration.hh:1028
│ │ │ │ +
const BCRSMatrix & getIterationMatrix() const
Return the iteration matrix (m_ - mu_*I), provided on demand when needed (e.g. for direct solvers or ...
Definition poweriteration.hh:945
│ │ │ │ +
unsigned int nIterations_
Definition poweriteration.hh:1039
│ │ │ │ +
const unsigned int verbosity_level_
Definition poweriteration.hh:1022
│ │ │ │ +
const std::string title_
Definition poweriteration.hh:1042
│ │ │ │ +
BlockVector::field_type Real
Type of underlying field.
Definition poweriteration.hh:186
│ │ │ │ +
Real mu_
Definition poweriteration.hh:1025
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
A linear operator.
Definition operators.hh:67
│ │ │ │ +
X::field_type field_type
The field type of the operator.
Definition operators.hh:74
│ │ │ │ +
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
apply operator to x, scale and add:
│ │ │ │ +
virtual SolverCategory::Category category() const =0
Category of the linear operator (see SolverCategory::Category)
│ │ │ │ +
Y range_type
The type of the range of the operator.
Definition operators.hh:72
│ │ │ │ +
virtual void apply(const X &x, Y &y) const =0
apply operator to x: The input vector is consistent and the output must also be consistent on the in...
│ │ │ │ +
X domain_type
The type of the domain of the operator.
Definition operators.hh:70
│ │ │ │ +
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
Definition solver.hh:524
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,129 +1,993 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -superlufunctions.hh │ │ │ │ │ + * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ +poweriteration.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH │ │ │ │ │ -6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH │ │ │ │ │ -7#if HAVE_SUPERLU │ │ │ │ │ -8 │ │ │ │ │ -9 │ │ │ │ │ -_1_0#define int_t SUPERLU_INT_TYPE │ │ │ │ │ -11#include "supermatrix.h" │ │ │ │ │ -12#include "slu_util.h" │ │ │ │ │ -13#undef int_t │ │ │ │ │ -14 │ │ │ │ │ -15#if __has_include("slu_sdefs.h") │ │ │ │ │ -16extern "C" { │ │ │ │ │ -17 extern void │ │ │ │ │ -18 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ -19 char *, float *, float *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -20 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -21 float *, float *, float *, float *, │ │ │ │ │ -22 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ -23 │ │ │ │ │ -24 extern void │ │ │ │ │ -25 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int, │ │ │ │ │ -26 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -27 extern void │ │ │ │ │ -28 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *, │ │ │ │ │ -29 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -30 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ -31 │ │ │ │ │ -32 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ -33} │ │ │ │ │ -34#endif │ │ │ │ │ -35 │ │ │ │ │ -36#if __has_include("slu_ddefs.h") │ │ │ │ │ -37extern "C" { │ │ │ │ │ -38 extern void │ │ │ │ │ -39 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ -40 char *, double *, double *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -41 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -42 double *, double *, double *, double *, │ │ │ │ │ -43 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ -44 │ │ │ │ │ -45 extern void │ │ │ │ │ -46 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *, │ │ │ │ │ -47 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -48 │ │ │ │ │ -49 extern void │ │ │ │ │ -50 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int, │ │ │ │ │ -51 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ +5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH │ │ │ │ │ +6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include // provides std::size_t │ │ │ │ │ +9#include // provides std::sqrt, std::abs │ │ │ │ │ +10 │ │ │ │ │ +11#include // provides std::is_same │ │ │ │ │ +12#include // provides std::cout, std::endl │ │ │ │ │ +13#include // provides std::numeric_limits │ │ │ │ │ +14#include // provides std::left, std::ios::left │ │ │ │ │ +15#include // provides std::setw, std::resetiosflags │ │ │ │ │ +16#include // provides std::unique_ptr │ │ │ │ │ +17#include // provides std::string │ │ │ │ │ +18 │ │ │ │ │ +19#include // provides DUNE_THROW(...) │ │ │ │ │ +20 │ │ │ │ │ +21#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> // provides Dune::blockLevel │ │ │ │ │ +22#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> // provides Dune::LinearOperator │ │ │ │ │ +23#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> // provides Dune::SolverCategory:: │ │ │ │ │ +sequential │ │ │ │ │ +24#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> // provides Dune::IsDirectSolver │ │ │ │ │ +25#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> // provides Dune::MatrixAdapter │ │ │ │ │ +26#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> // provides Dune::ISTLError │ │ │ │ │ +27#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> // provides Dune::printvector(...) │ │ │ │ │ +28#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> // provides Dune::InverseOperatorResult │ │ │ │ │ +29 │ │ │ │ │ +30namespace _D_u_n_e │ │ │ │ │ +31{ │ │ │ │ │ +32 │ │ │ │ │ +37 namespace Impl { │ │ │ │ │ +45 template │ │ │ │ │ +46 class ScalingLinearOperator : public _D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +47 { │ │ │ │ │ +48 public: │ │ │ │ │ +49 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +50 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +51 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ 52 │ │ │ │ │ -53 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ -54 │ │ │ │ │ -55 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ -56} │ │ │ │ │ -57#endif │ │ │ │ │ +53 ScalingLinearOperator (field_type immutable_scaling, │ │ │ │ │ +54 const field_type& mutable_scaling) │ │ │ │ │ +55 : immutable_scaling_(immutable_scaling), │ │ │ │ │ +56 mutable_scaling_(mutable_scaling) │ │ │ │ │ +57 {} │ │ │ │ │ 58 │ │ │ │ │ -59#if __has_include("slu_cdefs.h") │ │ │ │ │ -60#ifndef SUPERLU_TYPEDEF_COMPLEX │ │ │ │ │ -61// For now let's keep backwards compatible and let │ │ │ │ │ -62// complex be a typedef of doublecomplex │ │ │ │ │ -63#define SUPERLU_TYPEDEF_COMPLEX │ │ │ │ │ -64#endif │ │ │ │ │ -65#include "slu_scomplex.h" │ │ │ │ │ -66 │ │ │ │ │ -67extern "C" { │ │ │ │ │ -68 extern void │ │ │ │ │ -69 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ -70 char *, float *, float *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -71 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -72 float *, float *, float *, float *, │ │ │ │ │ -73 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ -74 │ │ │ │ │ -75 │ │ │ │ │ -76 extern void │ │ │ │ │ -77 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int, │ │ │ │ │ -78 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -79 │ │ │ │ │ -80 │ │ │ │ │ -81 extern void │ │ │ │ │ -82 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *, │ │ │ │ │ -83 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -84 │ │ │ │ │ -85 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ -86 │ │ │ │ │ -87 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ -88} │ │ │ │ │ -89#endif │ │ │ │ │ -90 │ │ │ │ │ -91#if __has_include("slu_zdefs.h") │ │ │ │ │ -92#include "slu_dcomplex.h" │ │ │ │ │ -93extern "C" { │ │ │ │ │ -94 extern void │ │ │ │ │ -95 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, │ │ │ │ │ -96 char *, double *, double *, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -97 void *, int, SuperMatrix *, SuperMatrix *, │ │ │ │ │ -98 double *, double *, double *, double *, │ │ │ │ │ -99 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *); │ │ │ │ │ -100 │ │ │ │ │ +59 virtual void _a_p_p_l_y (const X& x, Y& y) const │ │ │ │ │ +60 { │ │ │ │ │ +61 y = x; │ │ │ │ │ +62 y *= immutable_scaling_*mutable_scaling_; │ │ │ │ │ +63 } │ │ │ │ │ +64 │ │ │ │ │ +65 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (field_type alpha, const X& x, Y& y) const │ │ │ │ │ +66 { │ │ │ │ │ +67 X temp(x); │ │ │ │ │ +68 temp *= immutable_scaling_*mutable_scaling_; │ │ │ │ │ +69 y.axpy(alpha,temp); │ │ │ │ │ +70 } │ │ │ │ │ +71 │ │ │ │ │ +73 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +74 { │ │ │ │ │ +75 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +76 } │ │ │ │ │ +77 │ │ │ │ │ +78 protected: │ │ │ │ │ +79 const field_type immutable_scaling_; │ │ │ │ │ +80 const field_type& mutable_scaling_; │ │ │ │ │ +81 }; │ │ │ │ │ +82 │ │ │ │ │ +83 │ │ │ │ │ +92 template │ │ │ │ │ +93 class LinearOperatorSum │ │ │ │ │ +94 : public _D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +96 { │ │ │ │ │ +97 public: │ │ │ │ │ +98 typedef typename OP1::domain_type domain_type; │ │ │ │ │ +99 typedef typename OP1::range_type range_type; │ │ │ │ │ +100 typedef typename domain_type::field_type field_type; │ │ │ │ │ 101 │ │ │ │ │ -102 extern void │ │ │ │ │ -103 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *, │ │ │ │ │ -104 int *, int *, Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -105 │ │ │ │ │ -106 extern void │ │ │ │ │ -107 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int, │ │ │ │ │ -108 Stype_t, Dtype_t, Mtype_t); │ │ │ │ │ -109 │ │ │ │ │ -110 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); │ │ │ │ │ -111 │ │ │ │ │ -112 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *); │ │ │ │ │ -113} │ │ │ │ │ -114#endif │ │ │ │ │ -115 │ │ │ │ │ +102 LinearOperatorSum (const OP1& op1, const OP2& op2) │ │ │ │ │ +103 : op1_(op1), op2_(op2) │ │ │ │ │ +104 { │ │ │ │ │ +105 static_assert(std::is_same::value, │ │ │ │ │ +106 "Domain type of both operators doesn't match!"); │ │ │ │ │ +107 static_assert(std::is_same::value, │ │ │ │ │ +108 "Range type of both operators doesn't match!"); │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +111 virtual void _a_p_p_l_y (const domain_type& x, range_type& y) const │ │ │ │ │ +112 { │ │ │ │ │ +113 op1_.apply(x,y); │ │ │ │ │ +114 op2_.applyscaleadd(1.0,x,y); │ │ │ │ │ +115 } │ │ │ │ │ 116 │ │ │ │ │ -117#endif │ │ │ │ │ -118#endif │ │ │ │ │ +117 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (field_type alpha, │ │ │ │ │ +118 const domain_type& x, range_type& y) const │ │ │ │ │ +119 { │ │ │ │ │ +120 range_type temp(y); │ │ │ │ │ +121 op1_.apply(x,temp); │ │ │ │ │ +122 op2_.applyscaleadd(1.0,x,temp); │ │ │ │ │ +123 y.axpy(alpha,temp); │ │ │ │ │ +124 } │ │ │ │ │ +125 │ │ │ │ │ +127 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +128 { │ │ │ │ │ +129 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +132 protected: │ │ │ │ │ +133 const OP1& op1_; │ │ │ │ │ +134 const OP2& op2_; │ │ │ │ │ +135 }; │ │ │ │ │ +136 } // end namespace Impl │ │ │ │ │ +137 │ │ │ │ │ +174 template │ │ │ │ │ +_1_7_5 class _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +176 { │ │ │ │ │ +177 protected: │ │ │ │ │ +178 // Type definitions for type of iteration operator (m_ - mu_*I) │ │ │ │ │ +179 typedef typename _D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_<_B_C_R_S_M_a_t_r_i_x_,_B_l_o_c_k_V_e_c_t_o_r_,_B_l_o_c_k_V_e_c_t_o_r_> │ │ │ │ │ +_1_8_0 _M_a_t_r_i_x_O_p_e_r_a_t_o_r; │ │ │ │ │ +_1_8_1 typedef Impl::ScalingLinearOperator _S_c_a_l_i_n_g_O_p_e_r_a_t_o_r; │ │ │ │ │ +_1_8_2 typedef Impl::LinearOperatorSum │ │ │ │ │ +_O_p_e_r_a_t_o_r_S_u_m; │ │ │ │ │ +183 │ │ │ │ │ +184 public: │ │ │ │ │ +_1_8_6 typedef typename _B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e _R_e_a_l; │ │ │ │ │ +187 │ │ │ │ │ +_1_8_9 typedef _O_p_e_r_a_t_o_r_S_u_m _I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r; │ │ │ │ │ +190 │ │ │ │ │ +191 public: │ │ │ │ │ +_2_0_6 _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s (const _B_C_R_S_M_a_t_r_i_x& m, │ │ │ │ │ +207 const unsigned int nIterationsMax = 1000, │ │ │ │ │ +208 const unsigned int verbosity_level = 0) │ │ │ │ │ +209 : _m__(m), _n_I_t_e_r_a_t_i_o_n_s_M_a_x__(nIterationsMax), │ │ │ │ │ +210 _v_e_r_b_o_s_i_t_y___l_e_v_e_l__(verbosity_level), │ │ │ │ │ +211 _m_u__(0.0), │ │ │ │ │ +212 _m_a_t_r_i_x_O_p_e_r_a_t_o_r__(_m__), │ │ │ │ │ +213 _s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__(-1.0,_m_u__), │ │ │ │ │ +214 _i_t_O_p_e_r_a_t_o_r__(_m_a_t_r_i_x_O_p_e_r_a_t_o_r__,_s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__), │ │ │ │ │ +215 _n_I_t_e_r_a_t_i_o_n_s__(0), │ │ │ │ │ +216 _t_i_t_l_e__(" PowerIteration_Algorithms: "), │ │ │ │ │ +217 _b_l_a_n_k__(_t_i_t_l_e__.length(),' ') │ │ │ │ │ +218 { │ │ │ │ │ +219 // assert that BCRSMatrix type has blocklevel 2 │ │ │ │ │ +220 static_assert │ │ │ │ │ +221 (blockLevel() == 2, │ │ │ │ │ +222 "Only BCRSMatrices with blocklevel 2 are supported."); │ │ │ │ │ +223 │ │ │ │ │ +224 // assert that BCRSMatrix type has square blocks │ │ │ │ │ +225 static_assert │ │ │ │ │ +226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols, │ │ │ │ │ +227 "Only BCRSMatrices with square blocks are supported."); │ │ │ │ │ +228 │ │ │ │ │ +229 // assert that m_ is square │ │ │ │ │ +230 const int nrows = _m__._M() * BCRSMatrix::block_type::rows; │ │ │ │ │ +231 const int ncols = _m__._N() * BCRSMatrix::block_type::cols; │ │ │ │ │ +232 if (nrows != ncols) │ │ │ │ │ +233 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ +234 << nrows << "x" << ncols << ")."); │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +_2_4_0 _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s (const _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s&) = delete; │ │ │ │ │ +241 │ │ │ │ │ +245 _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s& │ │ │ │ │ +_2_4_6 _o_p_e_r_a_t_o_r_=_ (const _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s&) = delete; │ │ │ │ │ +247 │ │ │ │ │ +_2_6_0 inline void _a_p_p_l_y_P_o_w_e_r_I_t_e_r_a_t_i_o_n (const _R_e_a_l& epsilon, │ │ │ │ │ +261 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +262 { │ │ │ │ │ +263 // print verbosity information │ │ │ │ │ +264 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +265 std::cout << _t_i_t_l_e__ │ │ │ │ │ +266 << "Performing power iteration approximating " │ │ │ │ │ +267 << "the dominant eigenvalue." << std::endl; │ │ │ │ │ +268 │ │ │ │ │ +269 // allocate memory for auxiliary variables │ │ │ │ │ +270 _B_l_o_c_k_V_e_c_t_o_r y(x); │ │ │ │ │ +271 _B_l_o_c_k_V_e_c_t_o_r temp(x); │ │ │ │ │ +272 │ │ │ │ │ +273 // perform power iteration │ │ │ │ │ +274 x *= (1.0 / x.two_norm()); │ │ │ │ │ +275 _m__._m_v(x,y); │ │ │ │ │ +276 _R_e_a_l r_norm = std::numeric_limits::max(); │ │ │ │ │ +277 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ +278 while (r_norm > epsilon) │ │ │ │ │ +279 { │ │ │ │ │ +280 // update and check number of iterations │ │ │ │ │ +281 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ +282 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Power iteration did not converge " │ │ │ │ │ +283 << "in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ << " iterations " │ │ │ │ │ +284 << "(║residual║_2 = " << r_norm << ", epsilon = " │ │ │ │ │ +285 << epsilon << ")."); │ │ │ │ │ +286 │ │ │ │ │ +287 // do one iteration of the power iteration algorithm │ │ │ │ │ +288 // (use that y = m_ * x) │ │ │ │ │ +289 x = y; │ │ │ │ │ +290 x *= (1.0 / y.two_norm()); │ │ │ │ │ +291 │ │ │ │ │ +292 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ +293 _m__._m_v(x,y); │ │ │ │ │ +294 lambda = x * y; │ │ │ │ │ +295 │ │ │ │ │ +296 // get norm of residual (use that y = m_ * x) │ │ │ │ │ +297 temp = y; │ │ │ │ │ +298 temp.axpy(-lambda,x); │ │ │ │ │ +299 r_norm = temp.two_norm(); │ │ │ │ │ +300 │ │ │ │ │ +301 // print verbosity information │ │ │ │ │ +302 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +303 std::cout << _b_l_a_n_k__ << std::left │ │ │ │ │ +304 << "iteration " << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ +305 << " (║residual║_2 = " << std::setw(11) << r_norm │ │ │ │ │ +306 << "): λ = " << lambda << std::endl │ │ │ │ │ +307 << std::resetiosflags(std::ios::left); │ │ │ │ │ +308 } │ │ │ │ │ +309 │ │ │ │ │ +310 // print verbosity information │ │ │ │ │ +311 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +312 { │ │ │ │ │ +313 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +314 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +315 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +316 << "λ = " << lambda << std::endl; │ │ │ │ │ +317 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +318 { │ │ │ │ │ +319 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ +320 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +321 } │ │ │ │ │ +322 } │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +353 template │ │ │ │ │ +_3_5_5 inline void _a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n (const _R_e_a_l& epsilon, │ │ │ │ │ +356 ISTLLinearSolver& solver, │ │ │ │ │ +357 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +358 { │ │ │ │ │ +359 constexpr _R_e_a_l gamma = 0.0; │ │ │ │ │ +360 _a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n(gamma,epsilon,solver,x,lambda); │ │ │ │ │ +361 } │ │ │ │ │ +362 │ │ │ │ │ +392 template │ │ │ │ │ +_3_9_4 inline void _a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n (const _R_e_a_l& gamma, │ │ │ │ │ +395 const _R_e_a_l& epsilon, │ │ │ │ │ +396 ISTLLinearSolver& solver, │ │ │ │ │ +397 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +398 { │ │ │ │ │ +399 // print verbosity information │ │ │ │ │ +400 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +401 { │ │ │ │ │ +402 std::cout << _t_i_t_l_e__; │ │ │ │ │ +403 if (gamma == 0.0) │ │ │ │ │ +404 std::cout << "Performing inverse iteration approximating " │ │ │ │ │ +405 << "the least dominant eigenvalue." << std::endl; │ │ │ │ │ +406 else │ │ │ │ │ +407 std::cout << "Performing inverse iteration with shift " │ │ │ │ │ +408 << "gamma = " << gamma << " approximating the " │ │ │ │ │ +409 << "eigenvalue closest to gamma." << std::endl; │ │ │ │ │ +410 } │ │ │ │ │ +411 │ │ │ │ │ +412 // initialize iteration operator, │ │ │ │ │ +413 // initialize iteration matrix when needed │ │ │ │ │ +414 _u_p_d_a_t_e_S_h_i_f_t_M_u(gamma,solver); │ │ │ │ │ +415 │ │ │ │ │ +416 // allocate memory for linear solver statistics │ │ │ │ │ +417 _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t solver_statistics; │ │ │ │ │ +418 │ │ │ │ │ +419 // allocate memory for auxiliary variables │ │ │ │ │ +420 _B_l_o_c_k_V_e_c_t_o_r y(x); │ │ │ │ │ +421 _R_e_a_l y_norm; │ │ │ │ │ +422 _B_l_o_c_k_V_e_c_t_o_r temp(x); │ │ │ │ │ +423 │ │ │ │ │ +424 // perform inverse iteration with shift │ │ │ │ │ +425 x *= (1.0 / x.two_norm()); │ │ │ │ │ +426 _R_e_a_l r_norm = std::numeric_limits::max(); │ │ │ │ │ +427 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ +428 while (r_norm > epsilon) │ │ │ │ │ +429 { │ │ │ │ │ +430 // update and check number of iterations │ │ │ │ │ +431 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ +432 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Inverse iteration " │ │ │ │ │ +433 << (gamma != 0.0 ? "with shift " : "") << "did not " │ │ │ │ │ +434 << "converge in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ << " iterations " │ │ │ │ │ +435 << "(║residual║_2 = " << r_norm << ", epsilon = " │ │ │ │ │ +436 << epsilon << ")."); │ │ │ │ │ +437 │ │ │ │ │ +438 // do one iteration of the inverse iteration with shift algorithm, │ │ │ │ │ +439 // part 1: solve (m_ - gamma*I) * y = x for y │ │ │ │ │ +440 // (protect x from being changed) │ │ │ │ │ +441 temp = x; │ │ │ │ │ +442 solver.apply(y,temp,solver_statistics); │ │ │ │ │ +443 │ │ │ │ │ +444 // get norm of y │ │ │ │ │ +445 y_norm = y.two_norm(); │ │ │ │ │ +446 │ │ │ │ │ +447 // compile time switch between accuracy and efficiency │ │ │ │ │ +448 if (avoidLinSolverCrime) │ │ │ │ │ +449 { │ │ │ │ │ +450 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ +451 // (use that x_new = y / y_norm) │ │ │ │ │ +452 _m__._m_v(y,temp); │ │ │ │ │ +453 lambda = (y * temp) / (y_norm * y_norm); │ │ │ │ │ +454 │ │ │ │ │ +455 // get norm of residual │ │ │ │ │ +456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y) │ │ │ │ │ +457 temp.axpy(-lambda,y); │ │ │ │ │ +458 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ +459 } │ │ │ │ │ +460 else │ │ │ │ │ +461 { │ │ │ │ │ +462 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ +463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x) │ │ │ │ │ +464 lambda = gamma + (y * x) / (y_norm * y_norm); │ │ │ │ │ +465 │ │ │ │ │ +466 // get norm of residual │ │ │ │ │ +467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x) │ │ │ │ │ +468 temp = x; temp.axpy(gamma-lambda,y); │ │ │ │ │ +469 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ +470 } │ │ │ │ │ +471 │ │ │ │ │ +472 // do one iteration of the inverse iteration with shift algorithm, │ │ │ │ │ +473 // part 2: update x │ │ │ │ │ +474 x = y; │ │ │ │ │ +475 x *= (1.0 / y_norm); │ │ │ │ │ +476 │ │ │ │ │ +477 // print verbosity information │ │ │ │ │ +478 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +479 std::cout << _b_l_a_n_k__ << std::left │ │ │ │ │ +480 << "iteration " << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ +481 << " (║residual║_2 = " << std::setw(11) << r_norm │ │ │ │ │ +482 << "): λ = " << lambda << std::endl │ │ │ │ │ +483 << std::resetiosflags(std::ios::left); │ │ │ │ │ +484 } │ │ │ │ │ +485 │ │ │ │ │ +486 // print verbosity information │ │ │ │ │ +487 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +488 { │ │ │ │ │ +489 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +490 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +491 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +492 << "λ = " << lambda << std::endl; │ │ │ │ │ +493 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +494 { │ │ │ │ │ +495 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ +496 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +497 } │ │ │ │ │ +498 } │ │ │ │ │ +499 } │ │ │ │ │ +500 │ │ │ │ │ +531 template │ │ │ │ │ +_5_3_3 inline void _a_p_p_l_y_R_a_y_l_e_i_g_h_Q_u_o_t_i_e_n_t_I_t_e_r_a_t_i_o_n (const _R_e_a_l& epsilon, │ │ │ │ │ +534 ISTLLinearSolver& solver, │ │ │ │ │ +535 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +536 { │ │ │ │ │ +537 // print verbosity information │ │ │ │ │ +538 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +539 std::cout << _t_i_t_l_e__ │ │ │ │ │ +540 << "Performing Rayleigh quotient iteration for " │ │ │ │ │ +541 << "estimated eigenvalue " << lambda << "." << std::endl; │ │ │ │ │ +542 │ │ │ │ │ +543 // allocate memory for linear solver statistics │ │ │ │ │ +544 _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t solver_statistics; │ │ │ │ │ +545 │ │ │ │ │ +546 // allocate memory for auxiliary variables │ │ │ │ │ +547 _B_l_o_c_k_V_e_c_t_o_r y(x); │ │ │ │ │ +548 _R_e_a_l y_norm; │ │ │ │ │ +549 _R_e_a_l lambda_update; │ │ │ │ │ +550 _B_l_o_c_k_V_e_c_t_o_r temp(x); │ │ │ │ │ +551 │ │ │ │ │ +552 // perform Rayleigh quotient iteration │ │ │ │ │ +553 x *= (1.0 / x.two_norm()); │ │ │ │ │ +554 _R_e_a_l r_norm = std::numeric_limits::max(); │ │ │ │ │ +555 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ +556 while (r_norm > epsilon) │ │ │ │ │ +557 { │ │ │ │ │ +558 // update and check number of iterations │ │ │ │ │ +559 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ +560 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Rayleigh quotient iteration did not " │ │ │ │ │ +561 << "converge in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ << " iterations " │ │ │ │ │ +562 << "(║residual║_2 = " << r_norm << ", epsilon = " │ │ │ │ │ +563 << epsilon << ")."); │ │ │ │ │ +564 │ │ │ │ │ +565 // update iteration operator, │ │ │ │ │ +566 // update iteration matrix when needed │ │ │ │ │ +567 _u_p_d_a_t_e_S_h_i_f_t_M_u(lambda,solver); │ │ │ │ │ +568 │ │ │ │ │ +569 // do one iteration of the Rayleigh quotient iteration algorithm, │ │ │ │ │ +570 // part 1: solve (m_ - lambda*I) * y = x for y │ │ │ │ │ +571 // (protect x from being changed) │ │ │ │ │ +572 temp = x; │ │ │ │ │ +573 solver.apply(y,temp,solver_statistics); │ │ │ │ │ +574 │ │ │ │ │ +575 // get norm of y │ │ │ │ │ +576 y_norm = y.two_norm(); │ │ │ │ │ +577 │ │ │ │ │ +578 // compile time switch between accuracy and efficiency │ │ │ │ │ +579 if (avoidLinSolverCrime) │ │ │ │ │ +580 { │ │ │ │ │ +581 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ +582 // (use that x_new = y / y_norm) │ │ │ │ │ +583 _m__._m_v(y,temp); │ │ │ │ │ +584 lambda = (y * temp) / (y_norm * y_norm); │ │ │ │ │ +585 │ │ │ │ │ +586 // get norm of residual │ │ │ │ │ +587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y) │ │ │ │ │ +588 temp.axpy(-lambda,y); │ │ │ │ │ +589 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ +590 } │ │ │ │ │ +591 else │ │ │ │ │ +592 { │ │ │ │ │ +593 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ +594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x) │ │ │ │ │ +595 lambda_update = (y * x) / (y_norm * y_norm); │ │ │ │ │ +596 lambda += lambda_update; │ │ │ │ │ +597 │ │ │ │ │ +598 // get norm of residual │ │ │ │ │ +599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x) │ │ │ │ │ +600 temp = x; temp.axpy(-lambda_update,y); │ │ │ │ │ +601 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ +602 } │ │ │ │ │ +603 │ │ │ │ │ +604 // do one iteration of the Rayleigh quotient iteration algorithm, │ │ │ │ │ +605 // part 2: update x │ │ │ │ │ +606 x = y; │ │ │ │ │ +607 x *= (1.0 / y_norm); │ │ │ │ │ +608 │ │ │ │ │ +609 // print verbosity information │ │ │ │ │ +610 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +611 std::cout << _b_l_a_n_k__ << std::left │ │ │ │ │ +612 << "iteration " << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ +613 << " (║residual║_2 = " << std::setw(11) << r_norm │ │ │ │ │ +614 << "): λ = " << lambda << std::endl │ │ │ │ │ +615 << std::resetiosflags(std::ios::left); │ │ │ │ │ +616 } │ │ │ │ │ +617 │ │ │ │ │ +618 // print verbosity information │ │ │ │ │ +619 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +620 { │ │ │ │ │ +621 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +622 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +623 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +624 << "λ = " << lambda << std::endl; │ │ │ │ │ +625 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +626 { │ │ │ │ │ +627 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ +628 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +629 } │ │ │ │ │ +630 } │ │ │ │ │ +631 } │ │ │ │ │ +632 │ │ │ │ │ +689 template │ │ │ │ │ +_6_9_1 inline void _a_p_p_l_y_T_L_I_M_E_I_t_e_r_a_t_i_o_n (const _R_e_a_l& gamma, const _R_e_a_l& eta, │ │ │ │ │ +692 const _R_e_a_l& epsilon, │ │ │ │ │ +693 ISTLLinearSolver& solver, │ │ │ │ │ +694 const _R_e_a_l& delta, const std::size_t& m, │ │ │ │ │ +695 bool& extrnl, │ │ │ │ │ +696 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ +697 { │ │ │ │ │ +698 // use same variable names as in [Szyld, 1988] │ │ │ │ │ +699 _B_l_o_c_k_V_e_c_t_o_r& x_s = x; │ │ │ │ │ +700 _R_e_a_l& mu_s = lambda; │ │ │ │ │ +701 │ │ │ │ │ +702 // print verbosity information │ │ │ │ │ +703 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +704 std::cout << _t_i_t_l_e__ │ │ │ │ │ +705 << "Performing TLIME iteration for " │ │ │ │ │ +706 << "estimated eigenvalue in the " │ │ │ │ │ +707 << "interval (" << gamma - eta << "," │ │ │ │ │ +708 << gamma + eta << ")." << std::endl; │ │ │ │ │ +709 │ │ │ │ │ +710 // allocate memory for linear solver statistics │ │ │ │ │ +711 _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t solver_statistics; │ │ │ │ │ +712 │ │ │ │ │ +713 // allocate memory for auxiliary variables │ │ │ │ │ +714 bool doRQI; │ │ │ │ │ +715 _R_e_a_l mu; │ │ │ │ │ +716 _B_l_o_c_k_V_e_c_t_o_r y(x_s); │ │ │ │ │ +717 _R_e_a_l omega; │ │ │ │ │ +718 _R_e_a_l mu_s_old; │ │ │ │ │ +719 _R_e_a_l mu_s_update; │ │ │ │ │ +720 _B_l_o_c_k_V_e_c_t_o_r temp(x_s); │ │ │ │ │ +721 _R_e_a_l q_norm, r_norm; │ │ │ │ │ +722 │ │ │ │ │ +723 // perform TLIME iteration │ │ │ │ │ +724 x_s *= (1.0 / x_s.two_norm()); │ │ │ │ │ +725 extrnl = true; │ │ │ │ │ +726 doRQI = false; │ │ │ │ │ +727 r_norm = std::numeric_limits::max(); │ │ │ │ │ +728 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ +729 while (r_norm > epsilon) │ │ │ │ │ +730 { │ │ │ │ │ +731 // update and check number of iterations │ │ │ │ │ +732 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ +733 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"TLIME iteration did not " │ │ │ │ │ +734 << "converge in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ │ │ │ │ │ +735 << " iterations (║residual║_2 = " << r_norm │ │ │ │ │ +736 << ", epsilon = " << epsilon << ")."); │ │ │ │ │ +737 │ │ │ │ │ +738 // set shift for next iteration according to inverse iteration │ │ │ │ │ +739 // with shift (II) resp. Rayleigh quotient iteration (RQI) │ │ │ │ │ +740 if (doRQI) │ │ │ │ │ +741 mu = mu_s; │ │ │ │ │ +742 else │ │ │ │ │ +743 mu = gamma; │ │ │ │ │ +744 │ │ │ │ │ +745 // update II/RQI iteration operator, │ │ │ │ │ +746 // update II/RQI iteration matrix when needed │ │ │ │ │ +747 _u_p_d_a_t_e_S_h_i_f_t_M_u(mu,solver); │ │ │ │ │ +748 │ │ │ │ │ +749 // do one iteration of the II/RQI algorithm, │ │ │ │ │ +750 // part 1: solve (m_ - mu*I) * y = x for y │ │ │ │ │ +751 temp = x_s; │ │ │ │ │ +752 solver.apply(y,temp,solver_statistics); │ │ │ │ │ +753 │ │ │ │ │ +754 // do one iteration of the II/RQI algorithm, │ │ │ │ │ +755 // part 2: compute omega │ │ │ │ │ +756 omega = (1.0 / y.two_norm()); │ │ │ │ │ +757 │ │ │ │ │ +758 // backup the old Rayleigh quotient │ │ │ │ │ +759 mu_s_old = mu_s; │ │ │ │ │ +760 │ │ │ │ │ +761 // compile time switch between accuracy and efficiency │ │ │ │ │ +762 if (avoidLinSolverCrime) │ │ │ │ │ +763 { │ │ │ │ │ +764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue │ │ │ │ │ +765 // (use that x_new = y * omega) │ │ │ │ │ +766 _m__._m_v(y,temp); │ │ │ │ │ +767 mu_s = (y * temp) * (omega * omega); │ │ │ │ │ +768 │ │ │ │ │ +769 // get norm of "the residual with respect to the shift used by II", │ │ │ │ │ +770 // use normal representation of q │ │ │ │ │ +771 // (use that x_new = y * omega, use that temp = m_ * y) │ │ │ │ │ +772 temp.axpy(-gamma,y); │ │ │ │ │ +773 q_norm = temp.two_norm() * omega; │ │ │ │ │ +774 │ │ │ │ │ +775 // get norm of "the residual with respect to the Rayleigh quotient" │ │ │ │ │ +776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s); │ │ │ │ │ +777 // prevent that truncation errors invalidate the norm │ │ │ │ │ +778 // (we don't want to calculate sqrt of a negative number) │ │ │ │ │ +779 if (r_norm >= 0) │ │ │ │ │ +780 { │ │ │ │ │ +781 // use relation between the norms of r and q for efficiency │ │ │ │ │ +782 r_norm = std::sqrt(r_norm); │ │ │ │ │ +783 } │ │ │ │ │ +784 else │ │ │ │ │ +785 { │ │ │ │ │ +786 // use relation between r and q │ │ │ │ │ +787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q / │ │ │ │ │ +omega) │ │ │ │ │ +788 temp.axpy(gamma-mu_s,y); │ │ │ │ │ +789 r_norm = temp.two_norm() * omega; │ │ │ │ │ +790 } │ │ │ │ │ +791 } │ │ │ │ │ +792 else │ │ │ │ │ +793 { │ │ │ │ │ +794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue │ │ │ │ │ +795 if (!doRQI) │ │ │ │ │ +796 { │ │ │ │ │ +797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = │ │ │ │ │ +x_s) │ │ │ │ │ +798 mu_s = gamma + (y * x_s) * (omega * omega); │ │ │ │ │ +799 } │ │ │ │ │ +800 else │ │ │ │ │ +801 { │ │ │ │ │ +802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y │ │ │ │ │ += x_s) │ │ │ │ │ +803 mu_s_update = (y * x_s) * (omega * omega); │ │ │ │ │ +804 mu_s += mu_s_update; │ │ │ │ │ +805 } │ │ │ │ │ +806 │ │ │ │ │ +807 // get norm of "the residual with respect to the shift used by II" │ │ │ │ │ +808 if (!doRQI) │ │ │ │ │ +809 { │ │ │ │ │ +810 // use special representation of q in the II case │ │ │ │ │ +811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = │ │ │ │ │ +x_s) │ │ │ │ │ +812 q_norm = omega; │ │ │ │ │ +813 } │ │ │ │ │ +814 else │ │ │ │ │ +815 { │ │ │ │ │ +816 // use special representation of q in the RQI case │ │ │ │ │ +817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y │ │ │ │ │ += x_s) │ │ │ │ │ +818 temp = x_s; temp.axpy(mu_s-gamma,y); │ │ │ │ │ +819 q_norm = temp.two_norm() * omega; │ │ │ │ │ +820 } │ │ │ │ │ +821 │ │ │ │ │ +822 // get norm of "the residual with respect to the Rayleigh quotient" │ │ │ │ │ +823 // don't use efficient relation between the norms of r and q, as │ │ │ │ │ +824 // this relation seems to yield a less accurate r_norm in the case │ │ │ │ │ +825 // where linear solver crime is admitted │ │ │ │ │ +826 if (!doRQI) │ │ │ │ │ +827 { │ │ │ │ │ +828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s) │ │ │ │ │ +829 temp = x_s; temp.axpy(gamma-lambda,y); │ │ │ │ │ +830 r_norm = temp.two_norm() * omega; │ │ │ │ │ +831 } │ │ │ │ │ +832 else │ │ │ │ │ +833 { │ │ │ │ │ +834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s) │ │ │ │ │ +835 temp = x_s; temp.axpy(-mu_s_update,y); │ │ │ │ │ +836 r_norm = temp.two_norm() * omega; │ │ │ │ │ +837 } │ │ │ │ │ +838 } │ │ │ │ │ +839 │ │ │ │ │ +840 // do one iteration of the II/RQI algorithm, │ │ │ │ │ +841 // part 3: update x │ │ │ │ │ +842 x_s = y; x_s *= omega; │ │ │ │ │ +843 │ │ │ │ │ +844 // // for relative residual norm mode, scale with mu_s^{-1} │ │ │ │ │ +845 // r_norm /= std::abs(mu_s); │ │ │ │ │ +846 │ │ │ │ │ +847 // print verbosity information │ │ │ │ │ +848 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ +849 std::cout << _b_l_a_n_k__ << "iteration " │ │ │ │ │ +850 << std::left << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ +851 << " (" << (doRQI ? "RQI," : "II, ") │ │ │ │ │ +852 << " " << (doRQI ? "—>" : " ") << " " │ │ │ │ │ +853 << "║r║_2 = " << std::setw(11) << r_norm │ │ │ │ │ +854 << ", " << (doRQI ? " " : "—>") << " " │ │ │ │ │ +855 << "║q║_2 = " << std::setw(11) << q_norm │ │ │ │ │ +856 << "): λ = " << lambda << std::endl │ │ │ │ │ +857 << std::resetiosflags(std::ios::left); │ │ │ │ │ +858 │ │ │ │ │ +859 // check if the eigenvalue closest to gamma lies in J │ │ │ │ │ +860 if (!doRQI && q_norm < eta) │ │ │ │ │ +861 { │ │ │ │ │ +862 // J is not free of eigenvalues │ │ │ │ │ +863 extrnl = false; │ │ │ │ │ +864 │ │ │ │ │ +865 // by theory we know now that mu_s also lies in J │ │ │ │ │ +866 assert(std::abs(mu_s-gamma) < eta); │ │ │ │ │ +867 │ │ │ │ │ +868 // switch to RQI │ │ │ │ │ +869 doRQI = true; │ │ │ │ │ +870 } │ │ │ │ │ +871 │ │ │ │ │ +872 // revert to II if J is not free of eigenvalues but │ │ │ │ │ +873 // at some point mu_s falls back again outside J │ │ │ │ │ +874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta) │ │ │ │ │ +875 doRQI = false; │ │ │ │ │ +876 │ │ │ │ │ +877 // if eigenvalue closest to gamma does not lie in J use RQI │ │ │ │ │ +878 // solely to accelerate the convergence to this eigenvalue │ │ │ │ │ +879 // when II has become stationary │ │ │ │ │ +880 if (extrnl && !doRQI) │ │ │ │ │ +881 { │ │ │ │ │ +882 // switch to RQI if the relative change of the Rayleigh │ │ │ │ │ +883 // quotient indicates that II has become stationary │ │ │ │ │ +884 if (_n_I_t_e_r_a_t_i_o_n_s__ >= m && │ │ │ │ │ +885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta) │ │ │ │ │ +886 doRQI = true; │ │ │ │ │ +887 } │ │ │ │ │ +888 } │ │ │ │ │ +889 │ │ │ │ │ +890 // // compute final residual and lambda again (paranoia....) │ │ │ │ │ +891 // m_.mv(x_s,temp); │ │ │ │ │ +892 // mu_s = x_s * temp; │ │ │ │ │ +893 // temp.axpy(-mu_s,x_s); │ │ │ │ │ +894 // r_norm = temp.two_norm(); │ │ │ │ │ +895 // // r_norm /= std::abs(mu_s); │ │ │ │ │ +896 │ │ │ │ │ +897 // print verbosity information │ │ │ │ │ +898 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ +899 { │ │ │ │ │ +900 if (extrnl) │ │ │ │ │ +901 std::cout << _b_l_a_n_k__ << "Interval " │ │ │ │ │ +902 << "(" << gamma - eta << "," << gamma + eta │ │ │ │ │ +903 << ") is free of eigenvalues, approximating " │ │ │ │ │ +904 << "the closest eigenvalue." << std::endl; │ │ │ │ │ +905 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ +906 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ +907 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ +908 << "λ = " << lambda << std::endl; │ │ │ │ │ +909 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ +910 { │ │ │ │ │ +911 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ +912 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ +913 } │ │ │ │ │ +914 } │ │ │ │ │ +915 } │ │ │ │ │ +916 │ │ │ │ │ +_9_2_5 inline _I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r& _g_e_t_I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r () │ │ │ │ │ +926 { │ │ │ │ │ +927 // return iteration operator │ │ │ │ │ +928 return _i_t_O_p_e_r_a_t_o_r__; │ │ │ │ │ +929 } │ │ │ │ │ +930 │ │ │ │ │ +_9_4_5 inline const _B_C_R_S_M_a_t_r_i_x& _g_e_t_I_t_e_r_a_t_i_o_n_M_a_t_r_i_x () const │ │ │ │ │ +946 { │ │ │ │ │ +947 // create iteration matrix on demand │ │ │ │ │ +948 if (!_i_t_M_a_t_r_i_x__) │ │ │ │ │ +949 _i_t_M_a_t_r_i_x__ = std::make_unique(_m__); │ │ │ │ │ +950 │ │ │ │ │ +951 // return iteration matrix │ │ │ │ │ +952 return *_i_t_M_a_t_r_i_x__; │ │ │ │ │ +953 } │ │ │ │ │ +954 │ │ │ │ │ +_9_5_9 inline unsigned int _g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t () const │ │ │ │ │ +960 { │ │ │ │ │ +961 if (_n_I_t_e_r_a_t_i_o_n_s__ == 0) │ │ │ │ │ +962 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"No algorithm applied, yet."); │ │ │ │ │ +963 │ │ │ │ │ +964 return _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ +965 } │ │ │ │ │ +966 │ │ │ │ │ +967 protected: │ │ │ │ │ +982 template │ │ │ │ │ +_9_8_3 inline void _u_p_d_a_t_e_S_h_i_f_t_M_u (const _R_e_a_l& mu, │ │ │ │ │ +984 ISTLLinearSolver& solver) const │ │ │ │ │ +985 { │ │ │ │ │ +986 // do nothing if new shift equals the old one │ │ │ │ │ +987 if (mu == _m_u__) return; │ │ │ │ │ +988 │ │ │ │ │ +989 // update shift mu_, i.e. update iteration operator │ │ │ │ │ +990 _m_u__ = mu; │ │ │ │ │ +991 │ │ │ │ │ +992 // update iteration matrix when needed │ │ │ │ │ +993 if (_i_t_M_a_t_r_i_x__) │ │ │ │ │ +994 { │ │ │ │ │ +995 // iterate over entries in iteration matrix diagonal │ │ │ │ │ +996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows; │ │ │ │ │ +997 constexpr int colBlockSize = BCRSMatrix::block_type::cols; │ │ │ │ │ +998 for (typename _B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e i = 0; │ │ │ │ │ +999 i < _i_t_M_a_t_r_i_x__->M()*rowBlockSize; ++i) │ │ │ │ │ +1000 { │ │ │ │ │ +1001 // access m_[i,i] where i is the flat index of a row/column │ │ │ │ │ +1002 const _R_e_a_l& m_entry = _m__ │ │ │ │ │ +1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize]; │ │ │ │ │ +1004 // access *itMatrix[i,i] where i is the flat index of a row/column │ │ │ │ │ +1005 _R_e_a_l& entry = (*itMatrix_) │ │ │ │ │ +1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize]; │ │ │ │ │ +1007 // change current entry in iteration matrix diagonal │ │ │ │ │ +1008 entry = m_entry - _m_u__; │ │ │ │ │ +1009 } │ │ │ │ │ +1010 // notify linear solver about change of the iteration matrix object │ │ │ │ │ +1011 _S_o_l_v_e_r_H_e_l_p_e_r_<_I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_B_C_R_S_M_a_t_r_i_x_>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +1012 (solver,*_i_t_M_a_t_r_i_x__); │ │ │ │ │ +1013 } │ │ │ │ │ +1014 } │ │ │ │ │ +1015 │ │ │ │ │ +1016 protected: │ │ │ │ │ +1017 // parameters related to iterative eigenvalue algorithms │ │ │ │ │ +_1_0_1_8 const _B_C_R_S_M_a_t_r_i_x& _m__; │ │ │ │ │ +_1_0_1_9 const unsigned int _n_I_t_e_r_a_t_i_o_n_s_M_a_x__; │ │ │ │ │ +1020 │ │ │ │ │ +1021 // verbosity setting │ │ │ │ │ +_1_0_2_2 const unsigned int _v_e_r_b_o_s_i_t_y___l_e_v_e_l__; │ │ │ │ │ +1023 │ │ │ │ │ +1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I) │ │ │ │ │ +_1_0_2_5 mutable _R_e_a_l _m_u__; │ │ │ │ │ +1026 │ │ │ │ │ +1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference │ │ │ │ │ +_1_0_2_8 const _M_a_t_r_i_x_O_p_e_r_a_t_o_r _m_a_t_r_i_x_O_p_e_r_a_t_o_r__; │ │ │ │ │ +_1_0_2_9 const _S_c_a_l_i_n_g_O_p_e_r_a_t_o_r _s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__; │ │ │ │ │ +_1_0_3_0 _O_p_e_r_a_t_o_r_S_u_m _i_t_O_p_e_r_a_t_o_r__; │ │ │ │ │ +1031 │ │ │ │ │ +1032 // iteration matrix (m_ - mu_*I), provided on demand when needed │ │ │ │ │ +1033 // (e.g. for preconditioning) │ │ │ │ │ +_1_0_3_4 mutable std::unique_ptr _i_t_M_a_t_r_i_x__; │ │ │ │ │ +1035 │ │ │ │ │ +1036 // memory for storing temporary variables (mutable as they shall │ │ │ │ │ +1037 // just be effectless auxiliary variables of the const apply*(...) │ │ │ │ │ +1038 // methods) │ │ │ │ │ +_1_0_3_9 mutable unsigned int _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ +1040 │ │ │ │ │ +1041 // constants for printing verbosity information │ │ │ │ │ +_1_0_4_2 const std::string _t_i_t_l_e__; │ │ │ │ │ +_1_0_4_3 const std::string _b_l_a_n_k__; │ │ │ │ │ +1044 }; │ │ │ │ │ +1045 │ │ │ │ │ +1048} // namespace Dune │ │ │ │ │ +1049 │ │ │ │ │ +1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH │ │ │ │ │ +_i_o_._h_h │ │ │ │ │ +Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ +void printvector(std::ostream &s, const V &v, std::string title, std::string │ │ │ │ │ +rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ +Print an ISTL vector. │ │ │ │ │ +DDeeffiinniittiioonn io.hh:89 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access and the size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +number of columns (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ +void mv(const X &x, Y &y) const │ │ │ │ │ +y = A x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1612 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of rows (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +Iterative eigenvalue algorithms based on power iteration. │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:176 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_i_t_M_a_t_r_i_x__ │ │ │ │ │ +std::unique_ptr< BCRSMatrix > itMatrix_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1034 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_S_c_a_l_i_n_g_O_p_e_r_a_t_o_r │ │ │ │ │ +Impl::ScalingLinearOperator< BlockVector > ScalingOperator │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_b_l_a_n_k__ │ │ │ │ │ +const std::string blank_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1043 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_O_p_e_r_a_t_o_r_S_u_m │ │ │ │ │ +Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_M_a_t_r_i_x_O_p_e_r_a_t_o_r │ │ │ │ │ +Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n │ │ │ │ │ +void applyInverseIteration(const Real &epsilon, ISTLLinearSolver &solver, │ │ │ │ │ +BlockVector &x, Real &lambda) const │ │ │ │ │ +Perform the inverse iteration algorithm to compute an approximation lambda of │ │ │ │ │ +the least dominant (i.... │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_T_L_I_M_E_I_t_e_r_a_t_i_o_n │ │ │ │ │ +void applyTLIMEIteration(const Real &gamma, const Real &eta, const Real │ │ │ │ │ +&epsilon, ISTLLinearSolver &solver, const Real &delta, const std::size_t &m, │ │ │ │ │ +bool &extrnl, BlockVector &x, Real &lambda) const │ │ │ │ │ +Perform the "two-level iterative method for eigenvalue calculations (TLIME)" │ │ │ │ │ +iteration algorit... │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:691 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r │ │ │ │ │ +IterationOperator & getIterationOperator() │ │ │ │ │ +Return the iteration operator (m_ - mu_*I). │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:925 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_i_t_O_p_e_r_a_t_o_r__ │ │ │ │ │ +OperatorSum itOperator_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1030 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_m__ │ │ │ │ │ +const BCRSMatrix & m_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1018 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int │ │ │ │ │ +nIterationsMax=1000, const unsigned int verbosity_level=0) │ │ │ │ │ +Construct from required parameters. │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s_M_a_x__ │ │ │ │ │ +const unsigned int nIterationsMax_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1019 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_P_o_w_e_r_I_t_e_r_a_t_i_o_n │ │ │ │ │ +void applyPowerIteration(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ +const │ │ │ │ │ +Perform the power iteration algorithm to compute an approximation lambda of the │ │ │ │ │ +dominant (i.... │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r │ │ │ │ │ +OperatorSum IterationOperator │ │ │ │ │ +Type of iteration operator (m_ - mu_*I) │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_R_a_y_l_e_i_g_h_Q_u_o_t_i_e_n_t_I_t_e_r_a_t_i_o_n │ │ │ │ │ +void applyRayleighQuotientIteration(const Real &epsilon, ISTLLinearSolver │ │ │ │ │ +&solver, BlockVector &x, Real &lambda) const │ │ │ │ │ +Perform the Rayleigh quotient iteration algorithm to compute an approximation │ │ │ │ │ +lambda of an eigenvalue... │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:533 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n │ │ │ │ │ +void applyInverseIteration(const Real &gamma, const Real &epsilon, │ │ │ │ │ +ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const │ │ │ │ │ +Perform the inverse iteration with shift algorithm to compute an approximation │ │ │ │ │ +lambda of the eigenval... │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:394 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__ │ │ │ │ │ +const ScalingOperator scalingOperator_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1029 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_u_p_d_a_t_e_S_h_i_f_t_M_u │ │ │ │ │ +void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const │ │ │ │ │ +Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I). │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:983 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t │ │ │ │ │ +unsigned int getIterationCount() const │ │ │ │ │ +Return the number of iterations in last application of an algorithm. │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:959 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_m_a_t_r_i_x_O_p_e_r_a_t_o_r__ │ │ │ │ │ +const MatrixOperator matrixOperator_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1028 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_M_a_t_r_i_x │ │ │ │ │ +const BCRSMatrix & getIterationMatrix() const │ │ │ │ │ +Return the iteration matrix (m_ - mu_*I), provided on demand when needed (e.g. │ │ │ │ │ +for direct solvers or ... │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:945 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ +unsigned int nIterations_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1039 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ │ │ │ │ │ +const unsigned int verbosity_level_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1022 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_t_i_t_l_e__ │ │ │ │ │ +const std::string title_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1042 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_R_e_a_l │ │ │ │ │ +BlockVector::field_type Real │ │ │ │ │ +Type of underlying field. │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_m_u__ │ │ │ │ │ +Real mu_ │ │ │ │ │ +DDeeffiinniittiioonn poweriteration.hh:1025 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ +virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0 │ │ │ │ │ +apply operator to x, scale and add: │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const =0 │ │ │ │ │ +Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The type of the range of the operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(const X &x, Y &y) const =0 │ │ │ │ │ +apply operator to x: The input vector is consistent and the output must also be │ │ │ │ │ +consistent on the in... │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The type of the domain of the operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ +Adapter to turn a matrix into a linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:524 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00155.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: overlappingschwarz.hh File Reference │ │ │ │ +dune-istl: preconditioner.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,133 +71,34 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ +
preconditioner.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Contains one level overlapping Schwarz preconditioners. │ │ │ │ -More...

│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <set>
│ │ │ │ -#include <dune/common/dynmatrix.hh>
│ │ │ │ -#include <dune/common/sllist.hh>
│ │ │ │ -#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ -#include "preconditioners.hh"
│ │ │ │ -#include "superlu.hh"
│ │ │ │ -#include "umfpack.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include "bcrsmatrix.hh"
│ │ │ │ -#include "ilusubdomainsolver.hh"
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ +
#include <dune/common/exceptions.hh>
│ │ │ │ +#include "solvercategory.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::OverlappingSchwarzInitializer< I, S, D >
 Initializer for SuperLU Matrices representing the subdomains. More...
 
struct  Dune::AdditiveSchwarzMode
 Tag that the tells the Schwarz method to be additive. More...
 
struct  Dune::MultiplicativeSchwarzMode
 Tag that tells the Schwarz method to be multiplicative. More...
 
struct  Dune::SymmetricMultiplicativeSchwarzMode
 Tag that tells the Schwarz method to be multiplicative and symmetric. More...
 
class  Dune::DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >
 
class  Dune::OverlappingAssignerHelper< T, tag >
 
class  Dune::OverlappingAssignerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false >
 
struct  Dune::OverlappingAssignerHelper< S< BCRSMatrix< T, A > >, true >
 
class  Dune::OverlappingAssignerILUBase< M, X, Y >
 
class  Dune::OverlappingAssignerHelper< ILU0SubdomainSolver< M, X, Y >, false >
 
class  Dune::OverlappingAssignerHelper< ILUNSubdomainSolver< M, X, Y >, false >
 
struct  Dune::AdditiveAdder< S, T >
 
struct  Dune::AdditiveAdder< S, BlockVector< T, A > >
 
struct  Dune::MultiplicativeAdder< S, T >
 
struct  Dune::MultiplicativeAdder< S, BlockVector< T, A > >
 
struct  Dune::AdderSelector< T, X, S >
 template meta program for choosing how to add the correction. More...
 
struct  Dune::AdderSelector< AdditiveSchwarzMode, X, S >
 
struct  Dune::AdderSelector< MultiplicativeSchwarzMode, X, S >
 
struct  Dune::AdderSelector< SymmetricMultiplicativeSchwarzMode, X, S >
 
struct  Dune::IteratorDirectionSelector< T1, T2, forward >
 Helper template meta program for application of overlapping Schwarz. More...
 
struct  Dune::IteratorDirectionSelector< T1, T2, false >
 
struct  Dune::SeqOverlappingSchwarzApplier< T >
 Helper template meta program for application of overlapping Schwarz. More...
 
struct  Dune::SeqOverlappingSchwarzApplier< SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< T, tag >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< S< BCRSMatrix< T, A > >, true >
 
struct  Dune::SeqOverlappingSchwarzAssemblerILUBase< M, X, Y >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< ILU0SubdomainSolver< M, X, Y >, false >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< ILUNSubdomainSolver< M, X, Y >, false >
 
class  Dune::SeqOverlappingSchwarz< M, X, TM, TD, TA >
 Sequential overlapping Schwarz preconditioner. More...
 
struct  Dune::SeqOverlappingSchwarzDomainSize< M >
 
struct  Dune::SeqOverlappingSchwarzDomainSize< BCRSMatrix< T, A > >
class  Dune::Preconditioner< X, Y >
 Base class for matrix free definition of preconditioners. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<typename T >
using Dune::OverlappingAssigner = OverlappingAssignerHelper< T, Dune::StoresColumnCompressed< T >::value >
 
template<class T >
using Dune::SeqOverlappingSchwarzAssembler = SeqOverlappingSchwarzAssemblerHelper< T, Dune::StoresColumnCompressed< T >::value >
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Contains one level overlapping Schwarz preconditioners.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,130 +1,20 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -overlappingschwarz.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ -Contains one level overlapping Schwarz preconditioners. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ -#include "_s_u_p_e_r_l_u_._h_h" │ │ │ │ │ -#include "_u_m_f_p_a_c_k_._h_h" │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -#include "_i_l_u_s_u_b_d_o_m_a_i_n_s_o_l_v_e_r_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +preconditioner.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_ _I_,_ _S_,_ _D_ _> │ │ │ │ │ -  Initializer for _S_u_p_e_r_L_U Matrices representing the subdomains. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -  Tag that the tells the Schwarz method to be additive. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -  Tag that tells the Schwarz method to be multiplicative. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -  Tag that tells the Schwarz method to be multiplicative and symmetric. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _T_,_ _t_a_g_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_< │ │ │ │ │ - _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _T_,_ _X_,_ _S_ _> │ │ │ │ │ -  template meta program for choosing how to add the correction. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_o_r_w_a_r_d_ _> │ │ │ │ │ -  Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _T_ _> │ │ │ │ │ -  Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ - _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _T_,_ _t_a_g_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_< │ │ │ │ │ - _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_, │ │ │ │ │ - _t_r_u_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_, │ │ │ │ │ - _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_, │ │ │ │ │ - _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_D_,_ _T_A_ _> │ │ │ │ │ -  Sequential overlapping Schwarz preconditioner. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_ _M_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_ _> │ │ │ │ │ +  Base class for matrix free definition of preconditioners. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r = _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r< T, _D_u_n_e_:_: │ │ │ │ │ - _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d< T >::value > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r = │ │ │ │ │ - _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r< T, _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d< T │ │ │ │ │ - >::value > │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Contains one level overlapping Schwarz preconditioners. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: overlappingschwarz.hh Source File │ │ │ │ +dune-istl: preconditioner.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1666 +74,73 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
overlappingschwarz.hh
│ │ │ │ +
preconditioner.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
│ │ │ │ -
6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
│ │ │ │ -
7#include <cassert>
│ │ │ │ -
8#include <algorithm>
│ │ │ │ -
9#include <functional>
│ │ │ │ -
10#include <memory>
│ │ │ │ -
11#include <vector>
│ │ │ │ -
12#include <set>
│ │ │ │ -
13#include <dune/common/dynmatrix.hh>
│ │ │ │ -
14#include <dune/common/sllist.hh>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ -
17#include "preconditioners.hh"
│ │ │ │ -
18#include "superlu.hh"
│ │ │ │ -
19#include "umfpack.hh"
│ │ │ │ -
20#include "bvector.hh"
│ │ │ │ -
21#include "bcrsmatrix.hh"
│ │ │ │ -
22#include "ilusubdomainsolver.hh"
│ │ │ │ - │ │ │ │ -
24
│ │ │ │ -
25namespace Dune
│ │ │ │ -
26{
│ │ │ │ -
27
│ │ │ │ -
39 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ -
40 class SeqOverlappingSchwarz;
│ │ │ │ -
41
│ │ │ │ -
45 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
47 {
│ │ │ │ -
48 public:
│ │ │ │ - │ │ │ │ -
51
│ │ │ │ -
52 typedef I InitializerList;
│ │ │ │ -
53 typedef typename InitializerList::value_type AtomInitializer;
│ │ │ │ -
54 typedef typename AtomInitializer::Matrix Matrix;
│ │ │ │ -
55 typedef typename Matrix::const_iterator Iter;
│ │ │ │ -
56 typedef typename Matrix::row_type::const_iterator CIter;
│ │ │ │ -
57
│ │ │ │ -
58 typedef S IndexSet;
│ │ │ │ -
59 typedef typename IndexSet::size_type size_type;
│ │ │ │ -
60
│ │ │ │ - │ │ │ │ -
62 const IndexSet& indices,
│ │ │ │ -
63 const subdomain_vector& domains);
│ │ │ │ -
64
│ │ │ │ -
65
│ │ │ │ -
66 void addRowNnz(const Iter& row);
│ │ │ │ -
67
│ │ │ │ -
68 void allocate();
│ │ │ │ -
69
│ │ │ │ -
70 void countEntries(const Iter& row, const CIter& col) const;
│ │ │ │ -
71
│ │ │ │ -
72 void calcColstart() const;
│ │ │ │ -
73
│ │ │ │ -
74 void copyValue(const Iter& row, const CIter& col) const;
│ │ │ │ -
75
│ │ │ │ -
76 void createMatrix() const;
│ │ │ │ -
77 private:
│ │ │ │ -
78 class IndexMap
│ │ │ │ -
79 {
│ │ │ │ -
80 public:
│ │ │ │ -
81 typedef typename S::size_type size_type;
│ │ │ │ -
82 typedef std::map<size_type,size_type> Map;
│ │ │ │ -
83 typedef typename Map::iterator iterator;
│ │ │ │ -
84 typedef typename Map::const_iterator const_iterator;
│ │ │ │ -
85
│ │ │ │ -
86 IndexMap();
│ │ │ │ -
87
│ │ │ │ -
88 void insert(size_type grow);
│ │ │ │ -
89
│ │ │ │ -
90 const_iterator find(size_type grow) const;
│ │ │ │ -
91
│ │ │ │ -
92 iterator find(size_type grow);
│ │ │ │ -
93
│ │ │ │ -
94 iterator begin();
│ │ │ │ -
95
│ │ │ │ -
96 const_iterator begin() const;
│ │ │ │ -
97
│ │ │ │ -
98 iterator end();
│ │ │ │ -
99
│ │ │ │ -
100 const_iterator end() const;
│ │ │ │ -
101
│ │ │ │ -
102 private:
│ │ │ │ -
103 std::map<size_type,size_type> map_;
│ │ │ │ -
104 size_type row;
│ │ │ │ -
105 };
│ │ │ │ -
106
│ │ │ │ -
107
│ │ │ │ -
108 typedef typename InitializerList::iterator InitIterator;
│ │ │ │ -
109 typedef typename IndexSet::const_iterator IndexIteratur;
│ │ │ │ -
110 InitializerList* initializers;
│ │ │ │ -
111 const IndexSet *indices;
│ │ │ │ -
112 mutable std::vector<IndexMap> indexMaps;
│ │ │ │ -
113 const subdomain_vector& domains;
│ │ │ │ -
114 };
│ │ │ │ -
│ │ │ │ -
115
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
120 {};
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
126 {};
│ │ │ │ -
│ │ │ │ -
127
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
133 {};
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
139 template<class M, class X, class Y>
│ │ │ │ - │ │ │ │ -
141
│ │ │ │ -
142 // Specialization for BCRSMatrix
│ │ │ │ -
143 template<class K, class Al, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
145 {
│ │ │ │ -
146 typedef BCRSMatrix< K, Al> M;
│ │ │ │ -
147 public:
│ │ │ │ -
149 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ -
150 typedef typename X::field_type field_type;
│ │ │ │ -
151 typedef typename std::remove_const<M>::type rilu_type;
│ │ │ │ -
153 typedef X domain_type;
│ │ │ │ -
155 typedef Y range_type;
│ │ │ │ -
156 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
│ │ │ │ -
157
│ │ │ │ -
│ │ │ │ -
162 void apply (DynamicVector<field_type>& v, DynamicVector<field_type>& d)
│ │ │ │ -
163 {
│ │ │ │ -
164 assert(v.size() > 0);
│ │ │ │ -
165 assert(v.size() == d.size());
│ │ │ │ -
166 assert(A.rows() <= v.size());
│ │ │ │ -
167 assert(A.cols() <= v.size());
│ │ │ │ -
168 size_t sz = A.rows();
│ │ │ │ -
169 v.resize(sz);
│ │ │ │ -
170 d.resize(sz);
│ │ │ │ -
171 A.solve(v,d);
│ │ │ │ -
172 v.resize(v.capacity());
│ │ │ │ -
173 d.resize(d.capacity());
│ │ │ │ -
174 }
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
183 template<class S>
│ │ │ │ -
│ │ │ │ -
184 void setSubMatrix(const M& BCRS, S& rowset)
│ │ │ │ -
185 {
│ │ │ │ -
186 size_t sz = rowset.size();
│ │ │ │ -
187 A.resize(sz*n,sz*n);
│ │ │ │ -
188 typedef typename S::const_iterator SIter;
│ │ │ │ -
189 size_t r = 0, c = 0;
│ │ │ │ -
190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end();
│ │ │ │ -
191 rowIdx!= rowEnd; ++rowIdx, r++)
│ │ │ │ -
192 {
│ │ │ │ -
193 c = 0;
│ │ │ │ -
194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end();
│ │ │ │ -
195 colIdx!= colEnd; ++colIdx, c++)
│ │ │ │ -
196 {
│ │ │ │ -
197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx].end())
│ │ │ │ -
198 continue;
│ │ │ │ -
199 for (size_t i=0; i<n; i++)
│ │ │ │ -
200 {
│ │ │ │ -
201 for (size_t j=0; j<n; j++)
│ │ │ │ -
202 {
│ │ │ │ -
203 A[r*n+i][c*n+j] = Impl::asMatrix(BCRS[*rowIdx][*colIdx])[i][j];
│ │ │ │ -
204 }
│ │ │ │ -
205 }
│ │ │ │ -
206 }
│ │ │ │ -
207 }
│ │ │ │ -
208 }
│ │ │ │ -
│ │ │ │ -
209 private:
│ │ │ │ -
210 DynamicMatrix<K> A;
│ │ │ │ -
211 };
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213 template<typename T, bool tag>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
215 {};
│ │ │ │ -
│ │ │ │ -
216
│ │ │ │ -
217 template<typename T>
│ │ │ │ - │ │ │ │ -
219
│ │ │ │ -
220 // specialization for DynamicMatrix
│ │ │ │ -
221 template<class K, class Al, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
223 {
│ │ │ │ -
224 public:
│ │ │ │ - │ │ │ │ -
226 typedef typename X::field_type field_type;
│ │ │ │ -
227 typedef Y range_type;
│ │ │ │ -
228 typedef typename range_type::block_type block_type;
│ │ │ │ - │ │ │ │ -
230 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
│ │ │ │ -
238 OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_, const X& b_, Y& x_);
│ │ │ │ -
239
│ │ │ │ -
243 inline
│ │ │ │ -
244 void deallocate();
│ │ │ │ -
245
│ │ │ │ -
249 inline
│ │ │ │ -
250 void resetIndexForNextDomain();
│ │ │ │ -
251
│ │ │ │ -
256 inline
│ │ │ │ -
257 DynamicVector<field_type> & lhs();
│ │ │ │ -
258
│ │ │ │ -
263 inline
│ │ │ │ -
264 DynamicVector<field_type> & rhs();
│ │ │ │ -
265
│ │ │ │ -
270 inline
│ │ │ │ -
271 void relaxResult(field_type relax);
│ │ │ │ -
272
│ │ │ │ -
277 void operator()(const size_type& domainIndex);
│ │ │ │ -
278
│ │ │ │ -
286 inline
│ │ │ │ -
287 void assignResult(block_type& res);
│ │ │ │ -
288
│ │ │ │ -
289 private:
│ │ │ │ -
293 const matrix_type* mat;
│ │ │ │ -
295 // we need a pointer, because we have to avoid deep copies
│ │ │ │ -
296 DynamicVector<field_type> * rhs_;
│ │ │ │ -
298 // we need a pointer, because we have to avoid deep copies
│ │ │ │ -
299 DynamicVector<field_type> * lhs_;
│ │ │ │ -
301 const range_type* b;
│ │ │ │ -
303 range_type* x;
│ │ │ │ -
305 std::size_t i;
│ │ │ │ -
307 std::size_t maxlength_;
│ │ │ │ -
308 };
│ │ │ │ -
│ │ │ │ -
309
│ │ │ │ -
310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
311 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
313 {
│ │ │ │ - │ │ │ │ -
315 typedef typename S<BCRSMatrix<T, A>>::range_type range_type;
│ │ │ │ -
316 typedef typename range_type::field_type field_type;
│ │ │ │ -
317 typedef typename range_type::block_type block_type;
│ │ │ │ -
318
│ │ │ │ - │ │ │ │ -
320
│ │ │ │ -
321 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
│ │ │ │ -
322 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
│ │ │ │ -
330 OverlappingAssignerHelper(std::size_t maxlength, const matrix_type& mat,
│ │ │ │ -
331 const range_type& b, range_type& x);
│ │ │ │ -
337 void deallocate();
│ │ │ │ -
338
│ │ │ │ -
339 /*
│ │ │ │ -
340 * @brief Resets the local index to zero.
│ │ │ │ -
341 */
│ │ │ │ -
342 void resetIndexForNextDomain();
│ │ │ │ -
343
│ │ │ │ -
348 field_type* lhs();
│ │ │ │ -
349
│ │ │ │ -
354 field_type* rhs();
│ │ │ │ -
355
│ │ │ │ -
360 void relaxResult(field_type relax);
│ │ │ │ -
361
│ │ │ │ -
366 void operator()(const size_type& domain);
│ │ │ │ -
367
│ │ │ │ -
375 void assignResult(block_type& res);
│ │ │ │ -
376
│ │ │ │ -
377 private:
│ │ │ │ -
381 const matrix_type* mat;
│ │ │ │ -
383 field_type* rhs_;
│ │ │ │ -
385 field_type* lhs_;
│ │ │ │ -
387 const range_type* b;
│ │ │ │ -
389 range_type* x;
│ │ │ │ -
391 std::size_t i;
│ │ │ │ -
393 std::size_t maxlength_;
│ │ │ │ -
394 };
│ │ │ │ -
│ │ │ │ -
395
│ │ │ │ -
396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
397
│ │ │ │ -
398 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
400 {
│ │ │ │ -
401 public:
│ │ │ │ -
402 typedef M matrix_type;
│ │ │ │ -
403
│ │ │ │ -
404 typedef typename Y::field_type field_type;
│ │ │ │ -
405
│ │ │ │ -
406 typedef typename Y::block_type block_type;
│ │ │ │ -
407
│ │ │ │ -
408 typedef typename matrix_type::size_type size_type;
│ │ │ │ -
416 OverlappingAssignerILUBase(std::size_t maxlength, const M& mat,
│ │ │ │ -
417 const Y& b, X& x);
│ │ │ │ -
423 void deallocate();
│ │ │ │ -
424
│ │ │ │ - │ │ │ │ -
429
│ │ │ │ -
434 X& lhs();
│ │ │ │ -
435
│ │ │ │ -
440 Y& rhs();
│ │ │ │ -
441
│ │ │ │ -
446 void relaxResult(field_type relax);
│ │ │ │ -
447
│ │ │ │ -
452 void operator()(const size_type& domain);
│ │ │ │ -
453
│ │ │ │ -
461 void assignResult(block_type& res);
│ │ │ │ -
462
│ │ │ │ -
463 private:
│ │ │ │ -
467 const M* mat;
│ │ │ │ -
469 X* lhs_;
│ │ │ │ -
471 Y* rhs_;
│ │ │ │ -
473 const Y* b;
│ │ │ │ -
475 X* x;
│ │ │ │ -
477 size_type i;
│ │ │ │ -
478 };
│ │ │ │ -
│ │ │ │ -
479
│ │ │ │ -
480 // specialization for ILU0
│ │ │ │ -
481 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
483 : public OverlappingAssignerILUBase<M,X,Y>
│ │ │ │ -
484 {
│ │ │ │ -
485 public:
│ │ │ │ -
│ │ │ │ -
493 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
│ │ │ │ -
494 const Y& b, X& x)
│ │ │ │ -
495 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
│ │ │ │ -
496 {}
│ │ │ │ -
│ │ │ │ -
497 };
│ │ │ │ -
│ │ │ │ -
498
│ │ │ │ -
499 // specialization for ILUN
│ │ │ │ -
500 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
502 : public OverlappingAssignerILUBase<M,X,Y>
│ │ │ │ -
503 {
│ │ │ │ -
504 public:
│ │ │ │ -
│ │ │ │ -
512 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
│ │ │ │ -
513 const Y& b, X& x)
│ │ │ │ -
514 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
│ │ │ │ -
515 {}
│ │ │ │ -
│ │ │ │ -
516 };
│ │ │ │ -
│ │ │ │ -
517
│ │ │ │ -
518 template<typename S, typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
520 {};
│ │ │ │ -
│ │ │ │ -
521
│ │ │ │ -
522 template<typename S, typename T, typename A>
│ │ │ │ -
│ │ │ │ -
523 struct AdditiveAdder<S, BlockVector<T,A> >
│ │ │ │ -
524 {
│ │ │ │ -
525 typedef typename A::size_type size_type;
│ │ │ │ -
526 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
│ │ │ │ - │ │ │ │ -
528 OverlappingAssigner<S>& assigner, const field_type& relax_);
│ │ │ │ -
529 void operator()(const size_type& domain);
│ │ │ │ -
530 void axpy();
│ │ │ │ -
531 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
│ │ │ │ -
532
│ │ │ │ -
533 private:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
536 OverlappingAssigner<S>* assigner;
│ │ │ │ -
537 field_type relax;
│ │ │ │ -
538 };
│ │ │ │ -
│ │ │ │ -
539
│ │ │ │ -
540 template<typename S,typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
542 {};
│ │ │ │ -
│ │ │ │ -
543
│ │ │ │ -
544 template<typename S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
546 {
│ │ │ │ -
547 typedef typename A::size_type size_type;
│ │ │ │ -
548 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
│ │ │ │ - │ │ │ │ -
550 OverlappingAssigner<S>& assigner_, const field_type& relax_);
│ │ │ │ -
551 void operator()(const size_type& domain);
│ │ │ │ -
552 void axpy();
│ │ │ │ -
553 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
│ │ │ │ -
554
│ │ │ │ -
555 private:
│ │ │ │ - │ │ │ │ -
557 OverlappingAssigner<S>* assigner;
│ │ │ │ -
558 field_type relax;
│ │ │ │ -
559 };
│ │ │ │ -
│ │ │ │ -
560
│ │ │ │ -
570 template<typename T, class X, class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
572 {};
│ │ │ │ -
│ │ │ │ -
573
│ │ │ │ -
574 template<class X, class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
576 {
│ │ │ │ - │ │ │ │ -
578 };
│ │ │ │ -
│ │ │ │ -
579
│ │ │ │ -
580 template<class X, class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
582 {
│ │ │ │ - │ │ │ │ -
584 };
│ │ │ │ -
│ │ │ │ -
585
│ │ │ │ -
586 template<class X, class S>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
588 {
│ │ │ │ - │ │ │ │ -
590 };
│ │ │ │ -
│ │ │ │ -
591
│ │ │ │ -
603 template<typename T1, typename T2, bool forward>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
605 {
│ │ │ │ -
606 typedef T1 solver_vector;
│ │ │ │ -
607 typedef typename solver_vector::iterator solver_iterator;
│ │ │ │ - │ │ │ │ -
609 typedef typename subdomain_vector::const_iterator domain_iterator;
│ │ │ │ -
610
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
612 {
│ │ │ │ -
613 return sv.begin();
│ │ │ │ -
614 }
│ │ │ │ -
│ │ │ │ -
615
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
617 {
│ │ │ │ -
618 return sv.end();
│ │ │ │ -
619 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
621 {
│ │ │ │ -
622 return sv.begin();
│ │ │ │ -
623 }
│ │ │ │ -
│ │ │ │ -
624
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
626 {
│ │ │ │ -
627 return sv.end();
│ │ │ │ -
628 }
│ │ │ │ -
│ │ │ │ -
629 };
│ │ │ │ -
│ │ │ │ -
630
│ │ │ │ -
631 template<typename T1, typename T2>
│ │ │ │ -
│ │ │ │ -
632 struct IteratorDirectionSelector<T1,T2,false>
│ │ │ │ -
633 {
│ │ │ │ -
634 typedef T1 solver_vector;
│ │ │ │ -
635 typedef typename solver_vector::reverse_iterator solver_iterator;
│ │ │ │ - │ │ │ │ -
637 typedef typename subdomain_vector::const_reverse_iterator domain_iterator;
│ │ │ │ -
638
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
640 {
│ │ │ │ -
641 return sv.rbegin();
│ │ │ │ -
642 }
│ │ │ │ -
│ │ │ │ -
643
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
645 {
│ │ │ │ -
646 return sv.rend();
│ │ │ │ -
647 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
649 {
│ │ │ │ -
650 return sv.rbegin();
│ │ │ │ -
651 }
│ │ │ │ -
│ │ │ │ -
652
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
654 {
│ │ │ │ -
655 return sv.rend();
│ │ │ │ -
656 }
│ │ │ │ -
│ │ │ │ -
657 };
│ │ │ │ -
│ │ │ │ -
658
│ │ │ │ -
667 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
669 {
│ │ │ │ -
670 typedef T smoother;
│ │ │ │ -
671 typedef typename smoother::range_type range_type;
│ │ │ │ -
672
│ │ │ │ -
│ │ │ │ -
673 static void apply(smoother& sm, range_type& v, const range_type& b)
│ │ │ │ -
674 {
│ │ │ │ -
675 sm.template apply<true>(v, b);
│ │ │ │ -
676 }
│ │ │ │ -
│ │ │ │ -
677 };
│ │ │ │ -
│ │ │ │ -
678
│ │ │ │ -
679 template<class M, class X, class TD, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
681 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
684
│ │ │ │ -
│ │ │ │ -
685 static void apply(smoother& sm, range_type& v, const range_type& b)
│ │ │ │ -
686 {
│ │ │ │ -
687 sm.template apply<true>(v, b);
│ │ │ │ -
688 sm.template apply<false>(v, b);
│ │ │ │ -
689 }
│ │ │ │ -
│ │ │ │ -
690 };
│ │ │ │ -
│ │ │ │ -
691
│ │ │ │ -
692 template<class T, bool tag>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
694 {};
│ │ │ │ -
│ │ │ │ -
695
│ │ │ │ -
696 template<class T>
│ │ │ │ - │ │ │ │ -
698
│ │ │ │ -
699 template<class K, class Al, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
701 {
│ │ │ │ - │ │ │ │ -
703 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
│ │ │ │ -
704 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ -
705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
│ │ │ │ -
706 Solvers& solvers, const SubDomains& domains,
│ │ │ │ -
707 bool onTheFly);
│ │ │ │ -
708 };
│ │ │ │ -
│ │ │ │ -
709
│ │ │ │ -
710 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
712 {
│ │ │ │ - │ │ │ │ -
714 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
│ │ │ │ -
715 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ -
716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
│ │ │ │ -
717 Solvers& solvers, const SubDomains& domains,
│ │ │ │ -
718 bool onTheFly);
│ │ │ │ -
719 };
│ │ │ │ -
│ │ │ │ -
720
│ │ │ │ -
721 template<class M,class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
723 {
│ │ │ │ -
724 typedef M matrix_type;
│ │ │ │ -
725 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ -
726 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
│ │ │ │ -
727 Solvers& solvers, const SubDomains& domains,
│ │ │ │ -
728 bool onTheFly);
│ │ │ │ -
729 };
│ │ │ │ -
│ │ │ │ -
730
│ │ │ │ -
731 template<class M,class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
734 {};
│ │ │ │ -
│ │ │ │ -
735
│ │ │ │ -
736 template<class M,class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
739 {};
│ │ │ │ -
│ │ │ │ -
740
│ │ │ │ -
751 template<class M, class X, class TM=AdditiveSchwarzMode,
│ │ │ │ -
752 class TD=ILU0SubdomainSolver<M,X,X>, class TA=std::allocator<X> >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
754 : public Preconditioner<X,X>
│ │ │ │ -
755 {
│ │ │ │ -
756 public:
│ │ │ │ -
760 typedef M matrix_type;
│ │ │ │ -
761
│ │ │ │ -
765 typedef X domain_type;
│ │ │ │ -
766
│ │ │ │ -
770 typedef X range_type;
│ │ │ │ -
771
│ │ │ │ -
778 typedef TM Mode;
│ │ │ │ -
779
│ │ │ │ -
783 typedef typename X::field_type field_type;
│ │ │ │ -
784
│ │ │ │ -
786 typedef typename matrix_type::size_type size_type;
│ │ │ │ -
787
│ │ │ │ -
789 typedef TA allocator;
│ │ │ │ -
790
│ │ │ │ -
792 typedef std::set<size_type, std::less<size_type>,
│ │ │ │ -
793 typename std::allocator_traits<TA>::template rebind_alloc<size_type> >
│ │ │ │ - │ │ │ │ -
795
│ │ │ │ -
797 typedef std::vector<subdomain_type, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_type> > subdomain_vector;
│ │ │ │ -
798
│ │ │ │ - │ │ │ │ -
801
│ │ │ │ -
803 typedef std::vector<subdomain_list, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_list> > rowtodomain_vector;
│ │ │ │ -
804
│ │ │ │ -
806 typedef TD slu;
│ │ │ │ -
807
│ │ │ │ -
809 typedef std::vector<slu, typename std::allocator_traits<TA>::template rebind_alloc<slu> > slu_vector;
│ │ │ │ -
810
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
825 field_type relaxationFactor=1, bool onTheFly_=true);
│ │ │ │ -
826
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
839 field_type relaxationFactor=1, bool onTheFly_=true);
│ │ │ │ -
840
│ │ │ │ -
│ │ │ │ -
846 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] X& b)
│ │ │ │ -
847 {}
│ │ │ │ -
│ │ │ │ -
848
│ │ │ │ -
│ │ │ │ -
854 virtual void apply (X& v, const X& d);
│ │ │ │ -
855
│ │ │ │ -
│ │ │ │ -
861 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ -
862 {}
│ │ │ │ -
│ │ │ │ -
863
│ │ │ │ -
864 template<bool forward>
│ │ │ │ -
│ │ │ │ -
865 void apply(X& v, const X& d);
│ │ │ │ -
866
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
869 {
│ │ │ │ - │ │ │ │ -
871 }
│ │ │ │ -
│ │ │ │ -
872
│ │ │ │ -
873 private:
│ │ │ │ -
874 const M& mat;
│ │ │ │ -
875 slu_vector solvers;
│ │ │ │ -
876 subdomain_vector subDomains;
│ │ │ │ -
877 field_type relax;
│ │ │ │ -
878
│ │ │ │ -
879 typename M::size_type maxlength;
│ │ │ │ -
880
│ │ │ │ -
881 bool onTheFly;
│ │ │ │ -
882 };
│ │ │ │ -
883
│ │ │ │ -
884
│ │ │ │ -
885
│ │ │ │ -
886 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
888 const IndexSet& idx,
│ │ │ │ -
889 const subdomain_vector& domains_)
│ │ │ │ -
890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_)
│ │ │ │ -
891 {}
│ │ │ │ -
│ │ │ │ -
892
│ │ │ │ -
893
│ │ │ │ -
894 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
896 {
│ │ │ │ -
897 typedef typename IndexSet::value_type::const_iterator iterator;
│ │ │ │ -
898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
│ │ │ │ -
899 (*initializers)[*domain].addRowNnz(row, domains[*domain]);
│ │ │ │ -
900 indexMaps[*domain].insert(row.index());
│ │ │ │ -
901 }
│ │ │ │ -
902 }
│ │ │ │ -
│ │ │ │ -
903
│ │ │ │ -
904 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
906 {
│ │ │ │ -
907 for(auto&& i: *initializers)
│ │ │ │ -
908 i.allocateMatrixStorage();
│ │ │ │ -
909 for(auto&& i: *initializers)
│ │ │ │ -
910 i.allocateMarker();
│ │ │ │ -
911 }
│ │ │ │ -
│ │ │ │ -
912
│ │ │ │ -
913 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
915 {
│ │ │ │ -
916 typedef typename IndexSet::value_type::const_iterator iterator;
│ │ │ │ -
917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
│ │ │ │ -
918 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
│ │ │ │ -
919 if(v!= indexMaps[*domain].end()) {
│ │ │ │ -
920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(col.index())->second);
│ │ │ │ -
921 }
│ │ │ │ -
922 }
│ │ │ │ -
923 }
│ │ │ │ -
│ │ │ │ -
924
│ │ │ │ -
925 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
927 {
│ │ │ │ -
928 for(auto&& i : *initializers)
│ │ │ │ -
929 i.calcColstart();
│ │ │ │ -
930 }
│ │ │ │ -
│ │ │ │ -
931
│ │ │ │ -
932 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
934 {
│ │ │ │ -
935 typedef typename IndexSet::value_type::const_iterator iterator;
│ │ │ │ -
936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices)[row.index()].end(); ++domain) {
│ │ │ │ -
937 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
│ │ │ │ -
938 if(v!= indexMaps[*domain].end()) {
│ │ │ │ -
939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index()));
│ │ │ │ -
940 (*initializers)[*domain].copyValue(col, indexMaps[*domain].find(row.index())->second,
│ │ │ │ -
941 v->second);
│ │ │ │ -
942 }
│ │ │ │ -
943 }
│ │ │ │ -
944 }
│ │ │ │ -
│ │ │ │ -
945
│ │ │ │ -
946 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
948 {
│ │ │ │ -
949 std::vector<IndexMap>().swap(indexMaps);
│ │ │ │ -
950 for(auto&& i: *initializers)
│ │ │ │ -
951 i.createMatrix();
│ │ │ │ -
952 }
│ │ │ │ +
5#ifndef DUNE_ISTL_PRECONDITIONER_HH
│ │ │ │ +
6#define DUNE_ISTL_PRECONDITIONER_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/exceptions.hh>
│ │ │ │ +
9
│ │ │ │ +
10#include "solvercategory.hh"
│ │ │ │ +
11
│ │ │ │ +
12namespace Dune {
│ │ │ │ +
17 //=====================================================================
│ │ │ │ +
30 //=====================================================================
│ │ │ │ +
31 template<class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
33 public:
│ │ │ │ +
35 typedef X domain_type;
│ │ │ │ +
37 typedef Y range_type;
│ │ │ │ +
39 typedef typename X::field_type field_type;
│ │ │ │ +
40
│ │ │ │ +
69 virtual void pre (X& x, Y& b) = 0;
│ │ │ │ +
70
│ │ │ │ +
81 virtual void apply (X& v, const Y& d) = 0;
│ │ │ │ +
82
│ │ │ │ +
91 virtual void post (X& x) = 0;
│ │ │ │ +
92
│ │ │ │ + │ │ │ │ +
95#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
│ │ │ │ +
96 {
│ │ │ │ +
97 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
│ │ │ │ +
98 }
│ │ │ │ +
99#else
│ │ │ │ +
100 = 0;
│ │ │ │ +
101#endif
│ │ │ │ +
102
│ │ │ │ +
104 virtual ~Preconditioner () {}
│ │ │ │ +
105
│ │ │ │ +
106 };
│ │ │ │
│ │ │ │ -
953
│ │ │ │ -
954 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
956 : row(0)
│ │ │ │ -
957 {}
│ │ │ │ -
│ │ │ │ -
958
│ │ │ │ -
959 template<class I, class S, class D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
961 {
│ │ │ │ -
962 assert(map_.find(grow)==map_.end());
│ │ │ │ -
963 map_.insert(std::make_pair(grow, row++));
│ │ │ │ -
964 }
│ │ │ │ -
│ │ │ │ -
965
│ │ │ │ -
966 template<class I, class S, class D>
│ │ │ │ -
967 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
969 {
│ │ │ │ -
970 return map_.find(grow);
│ │ │ │ -
971 }
│ │ │ │ -
│ │ │ │ -
972
│ │ │ │ -
973 template<class I, class S, class D>
│ │ │ │ -
974 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
976 {
│ │ │ │ -
977 return map_.find(grow);
│ │ │ │ -
978 }
│ │ │ │ -
│ │ │ │ -
979
│ │ │ │ -
980 template<class I, class S, class D>
│ │ │ │ -
981 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
983 {
│ │ │ │ -
984 return map_.end();
│ │ │ │ -
985 }
│ │ │ │ -
│ │ │ │ -
986
│ │ │ │ -
987 template<class I, class S, class D>
│ │ │ │ -
988 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
990 {
│ │ │ │ -
991 return map_.end();
│ │ │ │ -
992 }
│ │ │ │ -
│ │ │ │ -
993
│ │ │ │ -
994 template<class I, class S, class D>
│ │ │ │ -
995 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
997 {
│ │ │ │ -
998 return map_.begin();
│ │ │ │ -
999 }
│ │ │ │ -
│ │ │ │ -
1000
│ │ │ │ -
1001 template<class I, class S, class D>
│ │ │ │ -
1002 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1004 {
│ │ │ │ -
1005 return map_.begin();
│ │ │ │ -
1006 }
│ │ │ │ -
│ │ │ │ -
1007
│ │ │ │ -
1008 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1010 field_type relaxationFactor, bool fly)
│ │ │ │ -
1011 : mat(mat_), relax(relaxationFactor), onTheFly(fly)
│ │ │ │ -
1012 {
│ │ │ │ -
1013 typedef typename rowtodomain_vector::const_iterator RowDomainIterator;
│ │ │ │ -
1014 typedef typename subdomain_list::const_iterator DomainIterator;
│ │ │ │ -
1015#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1016 assert(rowToDomain.size()==mat.N());
│ │ │ │ -
1017 assert(rowToDomain.size()==mat.M());
│ │ │ │ -
1018
│ │ │ │ -
1019 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
│ │ │ │ -
1020 assert(iter->size()>0);
│ │ │ │ -
1021
│ │ │ │ -
1022#endif
│ │ │ │ -
1023 // calculate the number of domains
│ │ │ │ -
1024 size_type domains=0;
│ │ │ │ -
1025 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
│ │ │ │ -
1026 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
│ │ │ │ -
1027 domains=std::max(domains, *d);
│ │ │ │ -
1028 ++domains;
│ │ │ │ -
1029
│ │ │ │ -
1030 solvers.resize(domains);
│ │ │ │ -
1031 subDomains.resize(domains);
│ │ │ │ -
1032
│ │ │ │ -
1033 // initialize subdomains to row mapping from row to subdomain mapping
│ │ │ │ -
1034 size_type row=0;
│ │ │ │ -
1035 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter, ++row)
│ │ │ │ -
1036 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
│ │ │ │ -
1037 subDomains[*d].insert(row);
│ │ │ │ -
1038
│ │ │ │ -
1039#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1040 size_type i=0;
│ │ │ │ -
1041 typedef typename subdomain_vector::const_iterator iterator;
│ │ │ │ -
1042 for(iterator iter=subDomains.begin(); iter != subDomains.end(); ++iter) {
│ │ │ │ -
1043 typedef typename subdomain_type::const_iterator entry_iterator;
│ │ │ │ -
1044 Dune::dvverb<<"domain "<<i++<<":";
│ │ │ │ -
1045 for(entry_iterator entry = iter->begin(); entry != iter->end(); ++entry) {
│ │ │ │ -
1046 Dune::dvverb<<" "<<*entry;
│ │ │ │ -
1047 }
│ │ │ │ -
1048 Dune::dvverb<<std::endl;
│ │ │ │ -
1049 }
│ │ │ │ -
1050#endif
│ │ │ │ - │ │ │ │ -
1052 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
│ │ │ │ -
1053 }
│ │ │ │ -
│ │ │ │ -
1054
│ │ │ │ -
1055 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1057 const subdomain_vector& sd,
│ │ │ │ -
1058 field_type relaxationFactor,
│ │ │ │ -
1059 bool fly)
│ │ │ │ -
1060 : mat(mat_), solvers(sd.size()), subDomains(sd), relax(relaxationFactor),
│ │ │ │ -
1061 onTheFly(fly)
│ │ │ │ -
1062 {
│ │ │ │ -
1063 typedef typename subdomain_vector::const_iterator DomainIterator;
│ │ │ │ -
1064
│ │ │ │ -
1065#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1066 size_type i=0;
│ │ │ │ -
1067
│ │ │ │ -
1068 for(DomainIterator d=sd.begin(); d != sd.end(); ++d,++i) {
│ │ │ │ -
1069 //std::cout<<i<<": "<<d->size()<<std::endl;
│ │ │ │ -
1070 assert(d->size()>0);
│ │ │ │ -
1071 typedef typename DomainIterator::value_type::const_iterator entry_iterator;
│ │ │ │ -
1072 Dune::dvverb<<"domain "<<i<<":";
│ │ │ │ -
1073 for(entry_iterator entry = d->begin(); entry != d->end(); ++entry) {
│ │ │ │ -
1074 Dune::dvverb<<" "<<*entry;
│ │ │ │ -
1075 }
│ │ │ │ -
1076 Dune::dvverb<<std::endl;
│ │ │ │ -
1077 }
│ │ │ │ -
1078
│ │ │ │ -
1079#endif
│ │ │ │ -
1080
│ │ │ │ -
1081 // Create a row to subdomain mapping
│ │ │ │ - │ │ │ │ -
1083
│ │ │ │ - │ │ │ │ -
1085
│ │ │ │ -
1086 for(DomainIterator domain=sd.begin(); domain != sd.end(); ++domain, ++domainId) {
│ │ │ │ -
1087 typedef typename subdomain_type::const_iterator iterator;
│ │ │ │ -
1088 for(iterator row=domain->begin(); row != domain->end(); ++row)
│ │ │ │ -
1089 rowToDomain[*row].push_back(domainId);
│ │ │ │ -
1090 }
│ │ │ │ -
1091
│ │ │ │ - │ │ │ │ -
1093 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
│ │ │ │ -
1094 }
│ │ │ │ -
│ │ │ │ -
1095
│ │ │ │ -
1102 template<class M>
│ │ │ │ - │ │ │ │ -
1104
│ │ │ │ -
1105 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1107 {
│ │ │ │ -
1108 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
│ │ │ │ -
1109 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
│ │ │ │ -
1110 template<class Domain>
│ │ │ │ -
│ │ │ │ -
1111 static int size(const Domain & d)
│ │ │ │ -
1112 {
│ │ │ │ -
1113 assert(n==m);
│ │ │ │ -
1114 return m*d.size();
│ │ │ │ -
1115 }
│ │ │ │ -
│ │ │ │ -
1116 };
│ │ │ │ -
│ │ │ │ -
1117
│ │ │ │ -
1118 template<class K, class Al, class X, class Y>
│ │ │ │ -
1119 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ -
1120 std::size_t
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
│ │ │ │ -
1123 [[maybe_unused]] const matrix_type& mat,
│ │ │ │ -
1124 [[maybe_unused]] Solvers& solvers,
│ │ │ │ -
1125 const SubDomains& subDomains,
│ │ │ │ -
1126 [[maybe_unused]] bool onTheFly)
│ │ │ │ -
1127 {
│ │ │ │ -
1128 typedef typename SubDomains::const_iterator DomainIterator;
│ │ │ │ -
1129 std::size_t maxlength = 0;
│ │ │ │ -
1130
│ │ │ │ -
1131 assert(onTheFly);
│ │ │ │ -
1132
│ │ │ │ -
1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
│ │ │ │ -
1134 maxlength=std::max(maxlength, domain->size());
│ │ │ │ -
1135 maxlength*=n;
│ │ │ │ -
1136
│ │ │ │ -
1137 return maxlength;
│ │ │ │ -
1138 }
│ │ │ │ -
│ │ │ │ -
1139
│ │ │ │ -
1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
1141 template<template<class> class S, typename T, typename A>
│ │ │ │ -
1142 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ -
│ │ │ │ -
1143 std::size_t SeqOverlappingSchwarzAssemblerHelper<S<BCRSMatrix<T,A>>,true>::assembleLocalProblems(const RowToDomain& rowToDomain,
│ │ │ │ -
1144 const matrix_type& mat,
│ │ │ │ -
1145 Solvers& solvers,
│ │ │ │ -
1146 const SubDomains& subDomains,
│ │ │ │ -
1147 bool onTheFly)
│ │ │ │ -
1148 {
│ │ │ │ -
1149 typedef typename S<BCRSMatrix<T,A>>::MatrixInitializer MatrixInitializer;
│ │ │ │ -
1150 typedef typename std::vector<MatrixInitializer>::iterator InitializerIterator;
│ │ │ │ -
1151 typedef typename SubDomains::const_iterator DomainIterator;
│ │ │ │ -
1152 typedef typename Solvers::iterator SolverIterator;
│ │ │ │ -
1153 std::size_t maxlength = 0;
│ │ │ │ -
1154
│ │ │ │ -
1155 if(onTheFly) {
│ │ │ │ -
1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
│ │ │ │ -
1157 maxlength=std::max(maxlength, domain->size());
│ │ │ │ -
1158 maxlength*=Impl::asMatrix(*mat[0].begin()).N();
│ │ │ │ -
1159 }else{
│ │ │ │ -
1160 // initialize the initializers
│ │ │ │ -
1161 DomainIterator domain=subDomains.begin();
│ │ │ │ -
1162
│ │ │ │ -
1163 // Create the initializers list.
│ │ │ │ -
1164 std::vector<MatrixInitializer> initializers(subDomains.size());
│ │ │ │ -
1165
│ │ │ │ -
1166 SolverIterator solver=solvers.begin();
│ │ │ │ -
1167 for(InitializerIterator initializer=initializers.begin(); initializer!=initializers.end();
│ │ │ │ -
1168 ++initializer, ++solver, ++domain) {
│ │ │ │ -
1169 solver->getInternalMatrix().N_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
│ │ │ │ -
1170 solver->getInternalMatrix().M_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
│ │ │ │ -
1171 //solver->setVerbosity(true);
│ │ │ │ -
1172 *initializer=MatrixInitializer(solver->getInternalMatrix());
│ │ │ │ -
1173 }
│ │ │ │ -
1174
│ │ │ │ -
1175 // Set up the supermatrices according to the subdomains
│ │ │ │ - │ │ │ │ -
1177 RowToDomain, SubDomains> Initializer;
│ │ │ │ -
1178
│ │ │ │ -
1179 Initializer initializer(initializers, rowToDomain, subDomains);
│ │ │ │ -
1180 copyToBCCSMatrix(initializer, mat);
│ │ │ │ -
1181
│ │ │ │ -
1182 // Calculate the LU decompositions
│ │ │ │ -
1183 for(auto&& s: solvers)
│ │ │ │ -
1184 s.decompose();
│ │ │ │ -
1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end(); ++solverIt)
│ │ │ │ -
1186 {
│ │ │ │ -
1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix().M());
│ │ │ │ -
1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N());
│ │ │ │ -
1189 }
│ │ │ │ -
1190 }
│ │ │ │ -
1191 return maxlength;
│ │ │ │ -
1192 }
│ │ │ │ -
│ │ │ │ -
1193
│ │ │ │ -
1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
1195
│ │ │ │ -
1196 template<class M,class X,class Y>
│ │ │ │ -
1197 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ -
│ │ │ │ -
1198 std::size_t SeqOverlappingSchwarzAssemblerILUBase<M,X,Y>::assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
│ │ │ │ -
1199 const matrix_type& mat,
│ │ │ │ -
1200 Solvers& solvers,
│ │ │ │ -
1201 const SubDomains& subDomains,
│ │ │ │ -
1202 bool onTheFly)
│ │ │ │ -
1203 {
│ │ │ │ -
1204 typedef typename SubDomains::const_iterator DomainIterator;
│ │ │ │ -
1205 typedef typename Solvers::iterator SolverIterator;
│ │ │ │ -
1206 std::size_t maxlength = 0;
│ │ │ │ -
1207
│ │ │ │ -
1208 if(onTheFly) {
│ │ │ │ -
1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
│ │ │ │ -
1210 maxlength=std::max(maxlength, domain->size());
│ │ │ │ -
1211 }else{
│ │ │ │ -
1212 // initialize the solvers of the local prolems.
│ │ │ │ -
1213 SolverIterator solver=solvers.begin();
│ │ │ │ -
1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();
│ │ │ │ -
1215 ++domain, ++solver) {
│ │ │ │ -
1216 solver->setSubMatrix(mat, *domain);
│ │ │ │ -
1217 maxlength=std::max(maxlength, domain->size());
│ │ │ │ -
1218 }
│ │ │ │ -
1219 }
│ │ │ │ -
1220
│ │ │ │ -
1221 return maxlength;
│ │ │ │ -
1222
│ │ │ │ -
1223 }
│ │ │ │ -
│ │ │ │ -
1224
│ │ │ │ -
1225
│ │ │ │ -
1226 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1228 {
│ │ │ │ - │ │ │ │ -
1230 }
│ │ │ │ -
│ │ │ │ -
1231
│ │ │ │ -
1232 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ -
1233 template<bool forward>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1235 {
│ │ │ │ -
1236 typedef slu_vector solver_vector;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1239 domain_iterator;
│ │ │ │ -
1240
│ │ │ │ -
1241 OverlappingAssigner<TD> assigner(maxlength, mat, b, x);
│ │ │ │ -
1242
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1245 X v(x); // temporary for the update
│ │ │ │ -
1246 v=0;
│ │ │ │ -
1247
│ │ │ │ -
1248 typedef typename AdderSelector<TM,X,TD >::Adder Adder;
│ │ │ │ -
1249 Adder adder(v, x, assigner, relax);
│ │ │ │ -
1250
│ │ │ │ - │ │ │ │ -
1252 //Copy rhs to C-array for SuperLU
│ │ │ │ -
1253 std::for_each(domain->begin(), domain->end(), assigner);
│ │ │ │ -
1254 assigner.resetIndexForNextDomain();
│ │ │ │ -
1255 if(onTheFly) {
│ │ │ │ -
1256 // Create the subdomain solver
│ │ │ │ -
1257 slu sdsolver;
│ │ │ │ -
1258 sdsolver.setSubMatrix(mat, *domain);
│ │ │ │ -
1259 // Apply
│ │ │ │ -
1260 sdsolver.apply(assigner.lhs(), assigner.rhs());
│ │ │ │ -
1261 }else{
│ │ │ │ -
1262 solver->apply(assigner.lhs(), assigner.rhs());
│ │ │ │ -
1263 ++solver;
│ │ │ │ -
1264 }
│ │ │ │ -
1265
│ │ │ │ -
1266 //Add relaxed correction to from SuperLU to v
│ │ │ │ -
1267 std::for_each(domain->begin(), domain->end(), adder);
│ │ │ │ -
1268 assigner.resetIndexForNextDomain();
│ │ │ │ -
1269
│ │ │ │ -
1270 }
│ │ │ │ -
1271
│ │ │ │ -
1272 adder.axpy();
│ │ │ │ -
1273 assigner.deallocate();
│ │ │ │ -
1274 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
1275
│ │ │ │ -
1276 template<class K, class Al, class X, class Y>
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1278 ::OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_,
│ │ │ │ -
1279 const X& b_, Y& x_) :
│ │ │ │ -
1280 mat(&mat_),
│ │ │ │ -
1281 rhs_( new DynamicVector<field_type>(maxlength, 42) ),
│ │ │ │ -
1282 lhs_( new DynamicVector<field_type>(maxlength, -42) ),
│ │ │ │ -
1283 b(&b_),
│ │ │ │ -
1284 x(&x_),
│ │ │ │ -
1285 i(0),
│ │ │ │ -
1286 maxlength_(maxlength)
│ │ │ │ -
1287 {}
│ │ │ │ -
│ │ │ │ -
1288
│ │ │ │ -
1289 template<class K, class Al, class X, class Y>
│ │ │ │ -
1290 void
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1292 ::deallocate()
│ │ │ │ -
1293 {
│ │ │ │ -
1294 delete rhs_;
│ │ │ │ -
1295 delete lhs_;
│ │ │ │ -
1296 }
│ │ │ │ -
│ │ │ │ -
1297
│ │ │ │ -
1298 template<class K, class Al, class X, class Y>
│ │ │ │ -
1299 void
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1301 ::resetIndexForNextDomain()
│ │ │ │ -
1302 {
│ │ │ │ -
1303 i=0;
│ │ │ │ -
1304 }
│ │ │ │ -
│ │ │ │ -
1305
│ │ │ │ -
1306 template<class K, class Al, class X, class Y>
│ │ │ │ -
1307 DynamicVector<typename X::field_type> &
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1309 ::lhs()
│ │ │ │ -
1310 {
│ │ │ │ -
1311 return *lhs_;
│ │ │ │ -
1312 }
│ │ │ │ -
│ │ │ │ -
1313
│ │ │ │ -
1314 template<class K, class Al, class X, class Y>
│ │ │ │ -
1315 DynamicVector<typename X::field_type> &
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1317 ::rhs()
│ │ │ │ -
1318 {
│ │ │ │ -
1319 return *rhs_;
│ │ │ │ -
1320 }
│ │ │ │ -
│ │ │ │ -
1321
│ │ │ │ -
1322 template<class K, class Al, class X, class Y>
│ │ │ │ -
1323 void
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1325 ::relaxResult(field_type relax)
│ │ │ │ -
1326 {
│ │ │ │ -
1327 lhs() *= relax;
│ │ │ │ -
1328 }
│ │ │ │ -
│ │ │ │ -
1329
│ │ │ │ -
1330 template<class K, class Al, class X, class Y>
│ │ │ │ -
1331 void
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1333 ::operator()(const size_type& domainIndex)
│ │ │ │ -
1334 {
│ │ │ │ -
1335 lhs() = 0.0;
│ │ │ │ -
1336#if 0
│ │ │ │ -
1337 //assign right hand side of current domainindex block
│ │ │ │ -
1338 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1339 assert(i<maxlength_);
│ │ │ │ -
1340 rhs()[i]=(*b)[domainIndex][j];
│ │ │ │ -
1341 }
│ │ │ │ -
1342
│ │ │ │ -
1343 // loop over all Matrix row entries and calculate defect.
│ │ │ │ -
1344 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ -
1345
│ │ │ │ -
1346 // calculate defect for current row index block
│ │ │ │ -
1347 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ -
1348 block_type tmp(0.0);
│ │ │ │ -
1349 (*col).mv((*x)[col.index()], tmp);
│ │ │ │ -
1350 i-=n;
│ │ │ │ -
1351 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1352 assert(i<maxlength_);
│ │ │ │ -
1353 rhs()[i]-=tmp[j];
│ │ │ │ -
1354 }
│ │ │ │ -
1355 }
│ │ │ │ -
1356#else
│ │ │ │ -
1357 //assign right hand side of current domainindex block
│ │ │ │ -
1358 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1359 assert(i<maxlength_);
│ │ │ │ -
1360 rhs()[i]=Impl::asVector((*b)[domainIndex])[j];
│ │ │ │ -
1361
│ │ │ │ -
1362 // loop over all Matrix row entries and calculate defect.
│ │ │ │ -
1363 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ -
1364
│ │ │ │ -
1365 // calculate defect for current row index block
│ │ │ │ -
1366 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ -
1367 for(size_type k=0; k<n; ++k) {
│ │ │ │ -
1368 rhs()[i]-=Impl::asMatrix(*col)[j][k] * Impl::asVector((*x)[col.index()])[k];
│ │ │ │ -
1369 }
│ │ │ │ -
1370 }
│ │ │ │ -
1371 }
│ │ │ │ -
1372#endif
│ │ │ │ -
1373 }
│ │ │ │ -
│ │ │ │ -
1374
│ │ │ │ -
1375 template<class K, class Al, class X, class Y>
│ │ │ │ -
1376 void
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1378 ::assignResult(block_type& res)
│ │ │ │ -
1379 {
│ │ │ │ -
1380 // assign the result of the local solve to the global vector
│ │ │ │ -
1381 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1382 assert(i<maxlength_);
│ │ │ │ -
1383 Impl::asVector(res)[j]+=lhs()[i];
│ │ │ │ -
1384 }
│ │ │ │ -
1385 }
│ │ │ │ -
│ │ │ │ -
1386
│ │ │ │ -
1387#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
1388
│ │ │ │ -
1389 template<template<class> class S, typename T, typename A>
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1391 ::OverlappingAssignerHelper(std::size_t maxlength,
│ │ │ │ -
1392 const BCRSMatrix<T,A>& mat_,
│ │ │ │ -
1393 const range_type& b_,
│ │ │ │ -
1394 range_type& x_)
│ │ │ │ -
1395 : mat(&mat_),
│ │ │ │ -
1396 b(&b_),
│ │ │ │ -
1397 x(&x_), i(0), maxlength_(maxlength)
│ │ │ │ -
1398 {
│ │ │ │ -
1399 rhs_ = new field_type[maxlength];
│ │ │ │ -
1400 lhs_ = new field_type[maxlength];
│ │ │ │ -
1401
│ │ │ │ -
1402 }
│ │ │ │ -
│ │ │ │ -
1403
│ │ │ │ -
1404 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1406 {
│ │ │ │ -
1407 delete[] rhs_;
│ │ │ │ -
1408 delete[] lhs_;
│ │ │ │ -
1409 }
│ │ │ │ -
│ │ │ │ -
1410
│ │ │ │ -
1411 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ -
1412 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::operator()(const size_type& domainIndex)
│ │ │ │ -
1413 {
│ │ │ │ -
1414 //assign right hand side of current domainindex block
│ │ │ │ -
1415 // rhs is an array of doubles!
│ │ │ │ -
1416 // rhs[starti] = b[domainindex]
│ │ │ │ -
1417 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1418 assert(i<maxlength_);
│ │ │ │ -
1419 rhs_[i]=Impl::asVector((*b)[domainIndex])[j];
│ │ │ │ -
1420 }
│ │ │ │ -
1421
│ │ │ │ -
1422
│ │ │ │ -
1423 // loop over all Matrix row entries and calculate defect.
│ │ │ │ -
1424 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ -
1425
│ │ │ │ -
1426 // calculate defect for current row index block
│ │ │ │ -
1427 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ -
1428 block_type tmp;
│ │ │ │ -
1429 Impl::asMatrix(*col).mv((*x)[col.index()], tmp);
│ │ │ │ -
1430 i-=n;
│ │ │ │ -
1431 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1432 assert(i<maxlength_);
│ │ │ │ -
1433 rhs_[i]-=Impl::asVector(tmp)[j];
│ │ │ │ -
1434 }
│ │ │ │ -
1435
│ │ │ │ -
1436 }
│ │ │ │ -
1437
│ │ │ │ -
1438 }
│ │ │ │ -
│ │ │ │ -
1439
│ │ │ │ -
1440 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1442 {
│ │ │ │ -
1443 for(size_type j=i+n; i<j; ++i) {
│ │ │ │ -
1444 assert(i<maxlength_);
│ │ │ │ -
1445 lhs_[i]*=relax;
│ │ │ │ -
1446 }
│ │ │ │ -
1447 i-=n;
│ │ │ │ -
1448 }
│ │ │ │ -
│ │ │ │ -
1449
│ │ │ │ -
1450 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1452 {
│ │ │ │ -
1453 // assign the result of the local solve to the global vector
│ │ │ │ -
1454 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ -
1455 assert(i<maxlength_);
│ │ │ │ -
1456 Impl::asVector(res)[j]+=lhs_[i];
│ │ │ │ -
1457 }
│ │ │ │ -
1458 }
│ │ │ │ -
│ │ │ │ -
1459
│ │ │ │ -
1460 template<template<class> class S, typename T, typename A>
│ │ │ │ -
│ │ │ │ -
1461 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::resetIndexForNextDomain()
│ │ │ │ -
1462 {
│ │ │ │ -
1463 i=0;
│ │ │ │ -
1464 }
│ │ │ │ -
│ │ │ │ -
1465
│ │ │ │ -
1466 template<template<class> class S, typename T, typename A>
│ │ │ │ -
1467 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1469 {
│ │ │ │ -
1470 return lhs_;
│ │ │ │ -
1471 }
│ │ │ │ -
│ │ │ │ -
1472
│ │ │ │ -
1473 template<template<class> class S, typename T, typename A>
│ │ │ │ -
1474 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1476 {
│ │ │ │ -
1477 return rhs_;
│ │ │ │ -
1478 }
│ │ │ │ -
│ │ │ │ -
1479
│ │ │ │ -
1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ -
1481
│ │ │ │ -
1482 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1484 const M& mat_,
│ │ │ │ -
1485 const Y& b_,
│ │ │ │ -
1486 X& x_)
│ │ │ │ -
1487 : mat(&mat_),
│ │ │ │ -
1488 b(&b_),
│ │ │ │ -
1489 x(&x_), i(0)
│ │ │ │ -
1490 {
│ │ │ │ -
1491 rhs_= new Y(maxlength);
│ │ │ │ -
1492 lhs_ = new X(maxlength);
│ │ │ │ -
1493 }
│ │ │ │ -
│ │ │ │ -
1494
│ │ │ │ -
1495 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1497 {
│ │ │ │ -
1498 delete rhs_;
│ │ │ │ -
1499 delete lhs_;
│ │ │ │ -
1500 }
│ │ │ │ -
│ │ │ │ -
1501
│ │ │ │ -
1502 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1504 {
│ │ │ │ -
1505 (*rhs_)[i]=(*b)[domainIndex];
│ │ │ │ -
1506
│ │ │ │ -
1507 // loop over all Matrix row entries and calculate defect.
│ │ │ │ -
1508 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ -
1509
│ │ │ │ -
1510 // calculate defect for current row index block
│ │ │ │ -
1511 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ -
1512 Impl::asMatrix(*col).mmv((*x)[col.index()], (*rhs_)[i]);
│ │ │ │ -
1513 }
│ │ │ │ -
1514 // Goto next local index
│ │ │ │ -
1515 ++i;
│ │ │ │ -
1516 }
│ │ │ │ -
│ │ │ │ -
1517
│ │ │ │ -
1518 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1520 {
│ │ │ │ -
1521 (*lhs_)[i]*=relax;
│ │ │ │ -
1522 }
│ │ │ │ -
│ │ │ │ -
1523
│ │ │ │ -
1524 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1526 {
│ │ │ │ -
1527 res+=(*lhs_)[i++];
│ │ │ │ -
1528 }
│ │ │ │ -
│ │ │ │ -
1529
│ │ │ │ -
1530 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1532 {
│ │ │ │ -
1533 return *lhs_;
│ │ │ │ -
1534 }
│ │ │ │ -
│ │ │ │ -
1535
│ │ │ │ -
1536 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1538 {
│ │ │ │ -
1539 return *rhs_;
│ │ │ │ -
1540 }
│ │ │ │ -
│ │ │ │ -
1541
│ │ │ │ -
1542 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1544 {
│ │ │ │ -
1545 i=0;
│ │ │ │ -
1546 }
│ │ │ │ -
│ │ │ │ -
1547
│ │ │ │ -
1548 template<typename S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1550 BlockVector<T,A>& x_,
│ │ │ │ -
1551 OverlappingAssigner<S>& assigner_,
│ │ │ │ -
1552 const field_type& relax_)
│ │ │ │ -
1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_)
│ │ │ │ -
1554 {}
│ │ │ │ -
│ │ │ │ -
1555
│ │ │ │ -
1556 template<typename S, typename T, typename A>
│ │ │ │ -
│ │ │ │ -
1557 void AdditiveAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
│ │ │ │ -
1558 {
│ │ │ │ -
1559 // add the result of the local solve to the current update
│ │ │ │ -
1560 assigner->assignResult((*v)[domainIndex]);
│ │ │ │ -
1561 }
│ │ │ │ -
│ │ │ │ -
1562
│ │ │ │ -
1563
│ │ │ │ -
1564 template<typename S, typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1566 {
│ │ │ │ -
1567 // relax the update and add it to the current guess.
│ │ │ │ -
1568 x->axpy(relax,*v);
│ │ │ │ -
1569 }
│ │ │ │ -
│ │ │ │ -
1570
│ │ │ │ -
1571
│ │ │ │ -
1572 template<typename S, typename T, typename A>
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
1574 ::MultiplicativeAdder([[maybe_unused]] BlockVector<T,A>& v_,
│ │ │ │ -
1575 BlockVector<T,A>& x_,
│ │ │ │ -
1576 OverlappingAssigner<S>& assigner_, const field_type& relax_)
│ │ │ │ -
1577 : x(&x_), assigner(&assigner_), relax(relax_)
│ │ │ │ -
1578 {}
│ │ │ │ -
│ │ │ │ -
1579
│ │ │ │ -
1580
│ │ │ │ -
1581 template<typename S,typename T, typename A>
│ │ │ │ -
│ │ │ │ -
1582 void MultiplicativeAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
│ │ │ │ -
1583 {
│ │ │ │ -
1584 // add the result of the local solve to the current guess
│ │ │ │ -
1585 assigner->relaxResult(relax);
│ │ │ │ -
1586 assigner->assignResult((*x)[domainIndex]);
│ │ │ │ -
1587 }
│ │ │ │ -
│ │ │ │ -
1588
│ │ │ │ -
1589
│ │ │ │ -
1590 template<typename S,typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1592 {
│ │ │ │ -
1593 // nothing to do, as the corrections already relaxed and added in operator()
│ │ │ │ -
1594 }
│ │ │ │ -
│ │ │ │ -
1595
│ │ │ │ -
1596
│ │ │ │ -
1598}
│ │ │ │ -
1599
│ │ │ │ -
1600#endif
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
Classes for using SuperLU with ISTL matrices.
│ │ │ │ -
Define general preconditioner interface.
│ │ │ │ -
Classes for using UMFPack with ISTL matrices.
│ │ │ │ -
Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
void addRowNnz(const Iter &row)
Definition overlappingschwarz.hh:895
│ │ │ │ -
void apply(X &v, const X &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition overlappingschwarz.hh:1234
│ │ │ │ -
X & lhs()
Get the local left hand side.
Definition overlappingschwarz.hh:1531
│ │ │ │ -
void calcColstart() const
Definition overlappingschwarz.hh:926
│ │ │ │ -
Y & rhs()
Get the local right hand side.
Definition overlappingschwarz.hh:1537
│ │ │ │ -
iterator end()
Definition overlappingschwarz.hh:989
│ │ │ │ -
void resetIndexForNextDomain()
Resets the local index to zero.
Definition overlappingschwarz.hh:1543
│ │ │ │ -
void copyValue(const Iter &row, const CIter &col) const
Definition overlappingschwarz.hh:933
│ │ │ │ -
void createMatrix() const
Definition overlappingschwarz.hh:947
│ │ │ │ -
iterator begin()
Definition overlappingschwarz.hh:1003
│ │ │ │ -
OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices, const subdomain_vector &domains)
Definition overlappingschwarz.hh:887
│ │ │ │ -
IndexMap()
Definition overlappingschwarz.hh:955
│ │ │ │ -
virtual void apply(X &v, const X &d)
Apply the precondtioner.
Definition overlappingschwarz.hh:1227
│ │ │ │ -
OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X &x)
Constructor.
Definition overlappingschwarz.hh:1483
│ │ │ │ -
const_iterator find(size_type grow) const
Definition overlappingschwarz.hh:968
│ │ │ │ -
void operator()(const size_type &domain)
calculate one entry of the local defect.
Definition overlappingschwarz.hh:1503
│ │ │ │ -
SeqOverlappingSchwarz(const matrix_type &mat, const subdomain_vector &subDomains, field_type relaxationFactor=1, bool onTheFly_=true)
Construct the overlapping Schwarz method.
Definition overlappingschwarz.hh:1056
│ │ │ │ -
void allocate()
Definition overlappingschwarz.hh:905
│ │ │ │ -
void deallocate()
Deallocates memory of the local vector.
Definition overlappingschwarz.hh:1496
│ │ │ │ -
void insert(size_type grow)
Definition overlappingschwarz.hh:960
│ │ │ │ -
void countEntries(const Iter &row, const CIter &col) const
Definition overlappingschwarz.hh:914
│ │ │ │ -
static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly)
Definition overlappingschwarz.hh:1198
│ │ │ │ -
void relaxResult(field_type relax)
relax the result.
Definition overlappingschwarz.hh:1519
│ │ │ │ -
void assignResult(block_type &res)
Assigns the block to the current local index. At the same time the local defect is calculated for the...
Definition overlappingschwarz.hh:1525
│ │ │ │ -
SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector &rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true)
Definition overlappingschwarz.hh:1009
│ │ │ │ +
107
│ │ │ │ +
111}
│ │ │ │ +
112#endif
│ │ │ │ + │ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Initializer for SuperLU Matrices representing the subdomains.
Definition overlappingschwarz.hh:47
│ │ │ │ -
Matrix::row_type::const_iterator CIter
Definition overlappingschwarz.hh:56
│ │ │ │ -
S IndexSet
Definition overlappingschwarz.hh:58
│ │ │ │ -
Matrix::const_iterator Iter
Definition overlappingschwarz.hh:55
│ │ │ │ -
IndexSet::size_type size_type
Definition overlappingschwarz.hh:59
│ │ │ │ -
I InitializerList
Definition overlappingschwarz.hh:52
│ │ │ │ -
AtomInitializer::Matrix Matrix
Definition overlappingschwarz.hh:54
│ │ │ │ -
InitializerList::value_type AtomInitializer
Definition overlappingschwarz.hh:53
│ │ │ │ -
D subdomain_vector
The vector type containing the subdomain to row index mapping.
Definition overlappingschwarz.hh:50
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ -
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ -
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition bcrsmatrix.hh:741
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
Exact subdomain solver using ILU(p) with appropriate p.
Definition ilusubdomainsolver.hh:78
│ │ │ │ -
Definition ilusubdomainsolver.hh:111
│ │ │ │ -
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ -
X::field_type field_type
The field type of the preconditioner.
Definition overlappingschwarz.hh:783
│ │ │ │ -
SLList< size_type, typename std::allocator_traits< TA >::template rebind_alloc< size_type > > subdomain_list
The type for the row to subdomain mapping.
Definition overlappingschwarz.hh:800
│ │ │ │ -
std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc< slu > > slu_vector
The vector type containing subdomain solvers.
Definition overlappingschwarz.hh:809
│ │ │ │ -
M matrix_type
The type of the matrix to precondition.
Definition overlappingschwarz.hh:760
│ │ │ │ -
TM Mode
The mode (additive or multiplicative) of the Schwarz method.
Definition overlappingschwarz.hh:778
│ │ │ │ -
X range_type
The range type of the preconditioner.
Definition overlappingschwarz.hh:770
│ │ │ │ -
std::set< size_type, std::less< size_type >, typename std::allocator_traits< TA >::template rebind_alloc< size_type > > subdomain_type
The type for the subdomain to row index mapping.
Definition overlappingschwarz.hh:794
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition overlappingschwarz.hh:765
│ │ │ │ -
TD slu
The type for the subdomain solver in use.
Definition overlappingschwarz.hh:806
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition overlappingschwarz.hh:868
│ │ │ │ -
virtual void pre(X &x, X &b)
Prepare the preconditioner.
Definition overlappingschwarz.hh:846
│ │ │ │ -
virtual void post(X &x)
Postprocess the preconditioner.
Definition overlappingschwarz.hh:861
│ │ │ │ -
TA allocator
The allocator to use.
Definition overlappingschwarz.hh:789
│ │ │ │ -
std::vector< subdomain_type, typename std::allocator_traits< TA >::template rebind_alloc< subdomain_type > > subdomain_vector
The vector type containing the subdomain to row index mapping.
Definition overlappingschwarz.hh:797
│ │ │ │ -
std::vector< subdomain_list, typename std::allocator_traits< TA >::template rebind_alloc< subdomain_list > > rowtodomain_vector
The vector type containing the row index to subdomain mapping.
Definition overlappingschwarz.hh:803
│ │ │ │ -
matrix_type::size_type size_type
The return type of the size method.
Definition overlappingschwarz.hh:786
│ │ │ │ -
Definition overlappingschwarz.hh:694
│ │ │ │ -
Tag that the tells the Schwarz method to be additive.
Definition overlappingschwarz.hh:120
│ │ │ │ -
Tag that tells the Schwarz method to be multiplicative.
Definition overlappingschwarz.hh:126
│ │ │ │ -
Tag that tells the Schwarz method to be multiplicative and symmetric.
Definition overlappingschwarz.hh:133
│ │ │ │ -
Exact subdomain solver using Dune::DynamicMatrix<T>::solve.
Definition overlappingschwarz.hh:140
│ │ │ │ -
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition overlappingschwarz.hh:149
│ │ │ │ -
X::field_type field_type
Definition overlappingschwarz.hh:150
│ │ │ │ -
X domain_type
The domain type of the preconditioner.
Definition overlappingschwarz.hh:153
│ │ │ │ -
Y range_type
The range type of the preconditioner.
Definition overlappingschwarz.hh:155
│ │ │ │ -
void setSubMatrix(const M &BCRS, S &rowset)
Set the data of the local problem.
Definition overlappingschwarz.hh:184
│ │ │ │ -
void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d)
Apply the subdomain solver.
Definition overlappingschwarz.hh:162
│ │ │ │ -
std::remove_const< M >::type rilu_type
Definition overlappingschwarz.hh:151
│ │ │ │ -
Definition overlappingschwarz.hh:215
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
S< BCRSMatrix< T, A > >::range_type range_type
Definition overlappingschwarz.hh:315
│ │ │ │ -
range_type::block_type block_type
Definition overlappingschwarz.hh:317
│ │ │ │ -
range_type::field_type field_type
Definition overlappingschwarz.hh:316
│ │ │ │ -
matrix_type::size_type size_type
Definition overlappingschwarz.hh:319
│ │ │ │ -
BCRSMatrix< T, A > matrix_type
Definition overlappingschwarz.hh:314
│ │ │ │ -
Definition overlappingschwarz.hh:400
│ │ │ │ -
matrix_type::size_type size_type
Definition overlappingschwarz.hh:408
│ │ │ │ -
Y::field_type field_type
Definition overlappingschwarz.hh:404
│ │ │ │ -
Y::block_type block_type
Definition overlappingschwarz.hh:406
│ │ │ │ -
M matrix_type
Definition overlappingschwarz.hh:402
│ │ │ │ -
OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
Constructor.
Definition overlappingschwarz.hh:493
│ │ │ │ -
OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
Constructor.
Definition overlappingschwarz.hh:512
│ │ │ │ -
Definition overlappingschwarz.hh:520
│ │ │ │ -
std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
Definition overlappingschwarz.hh:526
│ │ │ │ -
A::size_type size_type
Definition overlappingschwarz.hh:525
│ │ │ │ -
Definition overlappingschwarz.hh:542
│ │ │ │ -
A::size_type size_type
Definition overlappingschwarz.hh:547
│ │ │ │ -
std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
Definition overlappingschwarz.hh:548
│ │ │ │ -
template meta program for choosing how to add the correction.
Definition overlappingschwarz.hh:572
│ │ │ │ -
AdditiveAdder< S, X > Adder
Definition overlappingschwarz.hh:577
│ │ │ │ -
MultiplicativeAdder< S, X > Adder
Definition overlappingschwarz.hh:583
│ │ │ │ -
MultiplicativeAdder< S, X > Adder
Definition overlappingschwarz.hh:589
│ │ │ │ -
Helper template meta program for application of overlapping Schwarz.
Definition overlappingschwarz.hh:605
│ │ │ │ -
static solver_iterator begin(solver_vector &sv)
Definition overlappingschwarz.hh:611
│ │ │ │ -
solver_vector::iterator solver_iterator
Definition overlappingschwarz.hh:607
│ │ │ │ -
static domain_iterator end(const subdomain_vector &sv)
Definition overlappingschwarz.hh:625
│ │ │ │ -
subdomain_vector::const_iterator domain_iterator
Definition overlappingschwarz.hh:609
│ │ │ │ -
T1 solver_vector
Definition overlappingschwarz.hh:606
│ │ │ │ -
static domain_iterator begin(const subdomain_vector &sv)
Definition overlappingschwarz.hh:620
│ │ │ │ -
T2 subdomain_vector
Definition overlappingschwarz.hh:608
│ │ │ │ -
static solver_iterator end(solver_vector &sv)
Definition overlappingschwarz.hh:616
│ │ │ │ -
T2 subdomain_vector
Definition overlappingschwarz.hh:636
│ │ │ │ -
static solver_iterator end(solver_vector &sv)
Definition overlappingschwarz.hh:644
│ │ │ │ -
solver_vector::reverse_iterator solver_iterator
Definition overlappingschwarz.hh:635
│ │ │ │ -
subdomain_vector::const_reverse_iterator domain_iterator
Definition overlappingschwarz.hh:637
│ │ │ │ -
static solver_iterator begin(solver_vector &sv)
Definition overlappingschwarz.hh:639
│ │ │ │ -
T1 solver_vector
Definition overlappingschwarz.hh:634
│ │ │ │ -
static domain_iterator begin(const subdomain_vector &sv)
Definition overlappingschwarz.hh:648
│ │ │ │ -
static domain_iterator end(const subdomain_vector &sv)
Definition overlappingschwarz.hh:653
│ │ │ │ -
Helper template meta program for application of overlapping Schwarz.
Definition overlappingschwarz.hh:669
│ │ │ │ -
smoother::range_type range_type
Definition overlappingschwarz.hh:671
│ │ │ │ -
T smoother
Definition overlappingschwarz.hh:670
│ │ │ │ -
static void apply(smoother &sm, range_type &v, const range_type &b)
Definition overlappingschwarz.hh:673
│ │ │ │ -
static void apply(smoother &sm, range_type &v, const range_type &b)
Definition overlappingschwarz.hh:685
│ │ │ │ -
SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > smoother
Definition overlappingschwarz.hh:682
│ │ │ │ - │ │ │ │ - │ │ │ │ -
BCRSMatrix< T, A > matrix_type
Definition overlappingschwarz.hh:713
│ │ │ │ -
Definition overlappingschwarz.hh:723
│ │ │ │ -
M matrix_type
Definition overlappingschwarz.hh:724
│ │ │ │ -
Definition overlappingschwarz.hh:1103
│ │ │ │ -
static int size(const Domain &d)
Definition overlappingschwarz.hh:1111
│ │ │ │
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
virtual void post(X &x)=0
Clean up.
│ │ │ │ +
virtual void apply(X &v, const Y &d)=0
Apply one step of the preconditioner to the system A(v)=d.
│ │ │ │ +
virtual ~Preconditioner()
every abstract base class has a virtual destructor
Definition preconditioner.hh:104
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioner.hh:37
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioner.hh:35
│ │ │ │ +
virtual SolverCategory::Category category() const =0
Category of the preconditioner (see SolverCategory::Category)
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioner.hh:39
│ │ │ │ +
virtual void pre(X &x, Y &b)=0
Prepare the preconditioner.
│ │ │ │
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1878 +1,91 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -overlappingschwarz.hh │ │ │ │ │ +preconditioner.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH │ │ │ │ │ -6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH │ │ │ │ │ -7#include │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -17#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ -18#include "_s_u_p_e_r_l_u_._h_h" │ │ │ │ │ -19#include "_u_m_f_p_a_c_k_._h_h" │ │ │ │ │ -20#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -21#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ -22#include "_i_l_u_s_u_b_d_o_m_a_i_n_s_o_l_v_e_r_._h_h" │ │ │ │ │ -23#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -24 │ │ │ │ │ -25namespace _D_u_n_e │ │ │ │ │ -26{ │ │ │ │ │ -27 │ │ │ │ │ -39 template │ │ │ │ │ -40 class SeqOverlappingSchwarz; │ │ │ │ │ -41 │ │ │ │ │ -45 template │ │ │ │ │ -_4_6 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -47 { │ │ │ │ │ -48 public: │ │ │ │ │ -_5_0 typedef D _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ -51 │ │ │ │ │ -_5_2 typedef I _I_n_i_t_i_a_l_i_z_e_r_L_i_s_t; │ │ │ │ │ -_5_3 typedef typename InitializerList::value_type _A_t_o_m_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -_5_4 typedef typename AtomInitializer::Matrix _M_a_t_r_i_x; │ │ │ │ │ -_5_5 typedef typename Matrix::const_iterator _I_t_e_r; │ │ │ │ │ -_5_6 typedef typename Matrix::row_type::const_iterator _C_I_t_e_r; │ │ │ │ │ -57 │ │ │ │ │ -_5_8 typedef S _I_n_d_e_x_S_e_t; │ │ │ │ │ -_5_9 typedef typename IndexSet::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -60 │ │ │ │ │ -61 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r(_I_n_i_t_i_a_l_i_z_e_r_L_i_s_t& il, │ │ │ │ │ -62 const _I_n_d_e_x_S_e_t& indices, │ │ │ │ │ -63 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& domains); │ │ │ │ │ -64 │ │ │ │ │ -65 │ │ │ │ │ -66 void _a_d_d_R_o_w_N_n_z(const _I_t_e_r& row); │ │ │ │ │ -67 │ │ │ │ │ -68 void _a_l_l_o_c_a_t_e(); │ │ │ │ │ -69 │ │ │ │ │ -70 void _c_o_u_n_t_E_n_t_r_i_e_s(const _I_t_e_r& row, const _C_I_t_e_r& _c_o_l) const; │ │ │ │ │ -71 │ │ │ │ │ -72 void _c_a_l_c_C_o_l_s_t_a_r_t() const; │ │ │ │ │ -73 │ │ │ │ │ -74 void _c_o_p_y_V_a_l_u_e(const _I_t_e_r& row, const _C_I_t_e_r& _c_o_l) const; │ │ │ │ │ -75 │ │ │ │ │ -76 void _c_r_e_a_t_e_M_a_t_r_i_x() const; │ │ │ │ │ -77 private: │ │ │ │ │ -78 class IndexMap │ │ │ │ │ -79 { │ │ │ │ │ -80 public: │ │ │ │ │ -81 typedef typename S::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -82 typedef std::map Map; │ │ │ │ │ -83 typedef typename Map::iterator iterator; │ │ │ │ │ -84 typedef typename Map::const_iterator const_iterator; │ │ │ │ │ -85 │ │ │ │ │ -86 _I_n_d_e_x_M_a_p(); │ │ │ │ │ -87 │ │ │ │ │ -88 void _i_n_s_e_r_t(_s_i_z_e___t_y_p_e grow); │ │ │ │ │ -89 │ │ │ │ │ -90 const_iterator _f_i_n_d(_s_i_z_e___t_y_p_e grow) const; │ │ │ │ │ -91 │ │ │ │ │ -92 iterator _f_i_n_d(_s_i_z_e___t_y_p_e grow); │ │ │ │ │ -93 │ │ │ │ │ -94 iterator _b_e_g_i_n(); │ │ │ │ │ -95 │ │ │ │ │ -96 const_iterator _b_e_g_i_n() const; │ │ │ │ │ -97 │ │ │ │ │ -98 iterator _e_n_d(); │ │ │ │ │ -99 │ │ │ │ │ -100 const_iterator _e_n_d() const; │ │ │ │ │ -101 │ │ │ │ │ -102 private: │ │ │ │ │ -103 std::map map_; │ │ │ │ │ -104 _s_i_z_e___t_y_p_e row; │ │ │ │ │ -105 }; │ │ │ │ │ -106 │ │ │ │ │ +5#ifndef DUNE_ISTL_PRECONDITIONER_HH │ │ │ │ │ +6#define DUNE_ISTL_PRECONDITIONER_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +11 │ │ │ │ │ +12namespace _D_u_n_e { │ │ │ │ │ +17 //===================================================================== │ │ │ │ │ +30 //===================================================================== │ │ │ │ │ +31 template │ │ │ │ │ +_3_2 class _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +33 public: │ │ │ │ │ +_3_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_3_7 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_3_9 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +40 │ │ │ │ │ +_6_9 virtual void _p_r_e (X& x, Y& b) = 0; │ │ │ │ │ +70 │ │ │ │ │ +_8_1 virtual void _a_p_p_l_y (X& v, const Y& d) = 0; │ │ │ │ │ +82 │ │ │ │ │ +_9_1 virtual void _p_o_s_t (X& x) = 0; │ │ │ │ │ +92 │ │ │ │ │ +_9_4 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +95#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE │ │ │ │ │ +96 { │ │ │ │ │ +97 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method │ │ │ │ │ +in a derived classes, in the future this method will pure virtual."); │ │ │ │ │ +98 } │ │ │ │ │ +99#else │ │ │ │ │ +100 = 0; │ │ │ │ │ +101#endif │ │ │ │ │ +102 │ │ │ │ │ +_1_0_4 virtual _~_P_r_e_c_o_n_d_i_t_i_o_n_e_r () {} │ │ │ │ │ +105 │ │ │ │ │ +106 }; │ │ │ │ │ 107 │ │ │ │ │ -108 typedef typename InitializerList::iterator InitIterator; │ │ │ │ │ -109 typedef typename IndexSet::const_iterator IndexIteratur; │ │ │ │ │ -110 _I_n_i_t_i_a_l_i_z_e_r_L_i_s_t* initializers; │ │ │ │ │ -111 const _I_n_d_e_x_S_e_t *indices; │ │ │ │ │ -112 mutable std::vector indexMaps; │ │ │ │ │ -113 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& domains; │ │ │ │ │ -114 }; │ │ │ │ │ -115 │ │ │ │ │ -_1_1_9 struct _A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -120 {}; │ │ │ │ │ -121 │ │ │ │ │ -_1_2_5 struct _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -126 {}; │ │ │ │ │ -127 │ │ │ │ │ -_1_3_2 struct _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -133 {}; │ │ │ │ │ -134 │ │ │ │ │ -139 template │ │ │ │ │ -_1_4_0 class _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r; │ │ │ │ │ -141 │ │ │ │ │ -142 // Specialization for BCRSMatrix │ │ │ │ │ -143 template │ │ │ │ │ -_1_4_4 class _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r< _B_C_R_S_M_a_t_r_i_x< K, Al>, X, Y > │ │ │ │ │ -145 { │ │ │ │ │ -146 typedef _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_> _M; │ │ │ │ │ -147 public: │ │ │ │ │ -_1_4_9 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_1_5_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_5_1 typedef typename std::remove_const::type _r_i_l_u___t_y_p_e; │ │ │ │ │ -_1_5_3 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_1_5_5 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_1_5_6 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ -157 │ │ │ │ │ -_1_6_2 void _a_p_p_l_y (DynamicVector& v, DynamicVector& d) │ │ │ │ │ -163 { │ │ │ │ │ -164 assert(v.size() > 0); │ │ │ │ │ -165 assert(v.size() == d.size()); │ │ │ │ │ -166 assert(A.rows() <= v.size()); │ │ │ │ │ -167 assert(A.cols() <= v.size()); │ │ │ │ │ -168 size_t sz = A.rows(); │ │ │ │ │ -169 v.resize(sz); │ │ │ │ │ -170 d.resize(sz); │ │ │ │ │ -171 A.solve(v,d); │ │ │ │ │ -172 v.resize(v.capacity()); │ │ │ │ │ -173 d.resize(d.capacity()); │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -183 template │ │ │ │ │ -_1_8_4 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M& BCRS, S& rowset) │ │ │ │ │ -185 { │ │ │ │ │ -186 size_t sz = rowset.size(); │ │ │ │ │ -187 A.resize(sz*n,sz*n); │ │ │ │ │ -188 typedef typename S::const_iterator SIter; │ │ │ │ │ -189 size_t r = 0, c = 0; │ │ │ │ │ -190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end(); │ │ │ │ │ -191 rowIdx!= rowEnd; ++rowIdx, r++) │ │ │ │ │ -192 { │ │ │ │ │ -193 c = 0; │ │ │ │ │ -194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end(); │ │ │ │ │ -195 colIdx!= colEnd; ++colIdx, c++) │ │ │ │ │ -196 { │ │ │ │ │ -197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx]._e_n_d()) │ │ │ │ │ -198 continue; │ │ │ │ │ -199 for (size_t i=0; i A; │ │ │ │ │ -211 }; │ │ │ │ │ -212 │ │ │ │ │ -213 template │ │ │ │ │ -_2_1_4 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ -215 {}; │ │ │ │ │ -216 │ │ │ │ │ -217 template │ │ │ │ │ -_2_1_8 using _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r = _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_T_,_ _D_u_n_e_:_: │ │ │ │ │ -_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_T_>_:_:_v_a_l_u_e>; │ │ │ │ │ -219 │ │ │ │ │ -220 // specialization for DynamicMatrix │ │ │ │ │ -221 template │ │ │ │ │ -_2_2_2 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r< _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r< │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x, X, Y >,false> │ │ │ │ │ -223 { │ │ │ │ │ -224 public: │ │ │ │ │ -_2_2_5 typedef _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_2_2_6 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_2_7 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_2_2_8 typedef typename range_type::block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -_2_2_9 typedef typename _m_a_t_r_i_x___t_y_p_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -_2_3_0 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ -238 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const _B_C_R_S_M_a_t_r_i_x_<_K_,_ _A_l_>& │ │ │ │ │ -mat_, const X& b_, Y& x_); │ │ │ │ │ -239 │ │ │ │ │ -243 inline │ │ │ │ │ -244 void deallocate(); │ │ │ │ │ -245 │ │ │ │ │ -249 inline │ │ │ │ │ -250 void resetIndexForNextDomain(); │ │ │ │ │ -251 │ │ │ │ │ -256 inline │ │ │ │ │ -257 DynamicVector & lhs(); │ │ │ │ │ -258 │ │ │ │ │ -263 inline │ │ │ │ │ -264 DynamicVector & rhs(); │ │ │ │ │ -265 │ │ │ │ │ -270 inline │ │ │ │ │ -271 void relaxResult(_f_i_e_l_d___t_y_p_e relax); │ │ │ │ │ -272 │ │ │ │ │ -277 void operator()(const _s_i_z_e___t_y_p_e& domainIndex); │ │ │ │ │ -278 │ │ │ │ │ -286 inline │ │ │ │ │ -287 void assignResult(_b_l_o_c_k___t_y_p_e& res); │ │ │ │ │ -288 │ │ │ │ │ -289 private: │ │ │ │ │ -293 const _m_a_t_r_i_x___t_y_p_e* _m_a_t; │ │ │ │ │ -295 // we need a pointer, because we have to avoid deep copies │ │ │ │ │ -296 DynamicVector * rhs_; │ │ │ │ │ -298 // we need a pointer, because we have to avoid deep copies │ │ │ │ │ -299 DynamicVector * lhs_; │ │ │ │ │ -301 const _r_a_n_g_e___t_y_p_e* b; │ │ │ │ │ -303 _r_a_n_g_e___t_y_p_e* x; │ │ │ │ │ -305 std::size_t i; │ │ │ │ │ -307 std::size_t maxlength_; │ │ │ │ │ -308 }; │ │ │ │ │ -309 │ │ │ │ │ -310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -311 template class S, typename T, typename A> │ │ │ │ │ -_3_1_2 struct _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r>, true> │ │ │ │ │ -313 { │ │ │ │ │ -_3_1_4 typedef _B_C_R_S_M_a_t_r_i_x_<_T_,_ _A_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_3_1_5 typedef typename S>::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -_3_1_6 typedef typename range_type::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_3_1_7 typedef typename range_type::block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -318 │ │ │ │ │ -_3_1_9 typedef typename _m_a_t_r_i_x___t_y_p_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ -320 │ │ │ │ │ -_3_2_1 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ -_3_2_2 static constexpr size_t m = std::decay_t()))>::cols; │ │ │ │ │ -330 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -331 const _r_a_n_g_e___t_y_p_e& b, _r_a_n_g_e___t_y_p_e& x); │ │ │ │ │ -337 void deallocate(); │ │ │ │ │ -338 │ │ │ │ │ -339 /* │ │ │ │ │ -340 * @brief Resets the local index to zero. │ │ │ │ │ -341 */ │ │ │ │ │ -342 void resetIndexForNextDomain(); │ │ │ │ │ -343 │ │ │ │ │ -348 _f_i_e_l_d___t_y_p_e* lhs(); │ │ │ │ │ -349 │ │ │ │ │ -354 _f_i_e_l_d___t_y_p_e* rhs(); │ │ │ │ │ -355 │ │ │ │ │ -360 void relaxResult(_f_i_e_l_d___t_y_p_e relax); │ │ │ │ │ -361 │ │ │ │ │ -366 void operator()(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ -367 │ │ │ │ │ -375 void assignResult(_b_l_o_c_k___t_y_p_e& res); │ │ │ │ │ -376 │ │ │ │ │ -377 private: │ │ │ │ │ -381 const _m_a_t_r_i_x___t_y_p_e* _m_a_t; │ │ │ │ │ -383 _f_i_e_l_d___t_y_p_e* rhs_; │ │ │ │ │ -385 _f_i_e_l_d___t_y_p_e* lhs_; │ │ │ │ │ -387 const _r_a_n_g_e___t_y_p_e* b; │ │ │ │ │ -389 _r_a_n_g_e___t_y_p_e* x; │ │ │ │ │ -391 std::size_t i; │ │ │ │ │ -393 std::size_t maxlength_; │ │ │ │ │ -394 }; │ │ │ │ │ -395 │ │ │ │ │ -396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -397 │ │ │ │ │ -398 template │ │ │ │ │ -_3_9_9 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ -400 { │ │ │ │ │ -401 public: │ │ │ │ │ -_4_0_2 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -403 │ │ │ │ │ -_4_0_4 typedef typename Y::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -405 │ │ │ │ │ -_4_0_6 typedef typename Y::block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -407 │ │ │ │ │ -_4_0_8 typedef typename matrix_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -416 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(std::size_t maxlength, const M& mat, │ │ │ │ │ -417 const Y& b, X& x); │ │ │ │ │ -423 void _d_e_a_l_l_o_c_a_t_e(); │ │ │ │ │ -424 │ │ │ │ │ -428 void _r_e_s_e_t_I_n_d_e_x_F_o_r_N_e_x_t_D_o_m_a_i_n(); │ │ │ │ │ -429 │ │ │ │ │ -434 X& _l_h_s(); │ │ │ │ │ -435 │ │ │ │ │ -440 Y& _r_h_s(); │ │ │ │ │ -441 │ │ │ │ │ -446 void _r_e_l_a_x_R_e_s_u_l_t(_f_i_e_l_d___t_y_p_e relax); │ │ │ │ │ -447 │ │ │ │ │ -452 void _o_p_e_r_a_t_o_r_(_)(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ -453 │ │ │ │ │ -461 void _a_s_s_i_g_n_R_e_s_u_l_t(_b_l_o_c_k___t_y_p_e& res); │ │ │ │ │ -462 │ │ │ │ │ -463 private: │ │ │ │ │ -467 const M* mat; │ │ │ │ │ -469 X* lhs_; │ │ │ │ │ -471 Y* rhs_; │ │ │ │ │ -473 const Y* b; │ │ │ │ │ -475 X* x; │ │ │ │ │ -477 _s_i_z_e___t_y_p_e i; │ │ │ │ │ -478 }; │ │ │ │ │ -479 │ │ │ │ │ -480 // specialization for ILU0 │ │ │ │ │ -481 template │ │ │ │ │ -_4_8_2 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r<_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r, false> │ │ │ │ │ -483 : public _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ -484 { │ │ │ │ │ -485 public: │ │ │ │ │ -_4_9_3 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const M& _m_a_t, │ │ │ │ │ -494 const Y& b, X& x) │ │ │ │ │ -495 : _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(maxlength, _m_a_t,b,x) │ │ │ │ │ -496 {} │ │ │ │ │ -497 }; │ │ │ │ │ -498 │ │ │ │ │ -499 // specialization for ILUN │ │ │ │ │ -500 template │ │ │ │ │ -_5_0_1 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r<_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r,false> │ │ │ │ │ -502 : public _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ -503 { │ │ │ │ │ -504 public: │ │ │ │ │ -_5_1_2 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const M& _m_a_t, │ │ │ │ │ -513 const Y& b, X& x) │ │ │ │ │ -514 : _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(maxlength, _m_a_t,b,x) │ │ │ │ │ -515 {} │ │ │ │ │ -516 }; │ │ │ │ │ -517 │ │ │ │ │ -518 template │ │ │ │ │ -_5_1_9 struct _A_d_d_i_t_i_v_e_A_d_d_e_r │ │ │ │ │ -520 {}; │ │ │ │ │ -521 │ │ │ │ │ -522 template │ │ │ │ │ -_5_2_3 struct _A_d_d_i_t_i_v_e_A_d_d_e_r > │ │ │ │ │ -524 { │ │ │ │ │ -_5_2_5 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -_5_2_6 typedef typename std::decay_t │ │ │ │ │ -()))>::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -527 _A_d_d_i_t_i_v_e_A_d_d_e_r(_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v, _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x, │ │ │ │ │ -528 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner, const _f_i_e_l_d___t_y_p_e& relax_); │ │ │ │ │ -529 void operator()(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ -530 void axpy(); │ │ │ │ │ -_5_3_1 static constexpr size_t n = std::decay_t()))>::dimension; │ │ │ │ │ -532 │ │ │ │ │ -533 private: │ │ │ │ │ -534 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>* v; │ │ │ │ │ -535 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>* x; │ │ │ │ │ -536 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>* assigner; │ │ │ │ │ -537 _f_i_e_l_d___t_y_p_e relax; │ │ │ │ │ -538 }; │ │ │ │ │ -539 │ │ │ │ │ -540 template │ │ │ │ │ -_5_4_1 struct _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r │ │ │ │ │ -542 {}; │ │ │ │ │ -543 │ │ │ │ │ -544 template │ │ │ │ │ -_5_4_5 struct _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r > │ │ │ │ │ -546 { │ │ │ │ │ -_5_4_7 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -_5_4_8 typedef typename std::decay_t │ │ │ │ │ -()))>::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -549 _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r(_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v, _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x, │ │ │ │ │ -550 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner_, const _f_i_e_l_d___t_y_p_e& relax_); │ │ │ │ │ -551 void operator()(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ -552 void axpy(); │ │ │ │ │ -_5_5_3 static constexpr size_t n = std::decay_t()))>::dimension; │ │ │ │ │ -554 │ │ │ │ │ -555 private: │ │ │ │ │ -556 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>* x; │ │ │ │ │ -557 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>* assigner; │ │ │ │ │ -558 _f_i_e_l_d___t_y_p_e relax; │ │ │ │ │ -559 }; │ │ │ │ │ -560 │ │ │ │ │ -570 template │ │ │ │ │ -_5_7_1 struct _A_d_d_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ -572 {}; │ │ │ │ │ -573 │ │ │ │ │ -574 template │ │ │ │ │ -_5_7_5 struct _A_d_d_e_r_S_e_l_e_c_t_o_r<_A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e,X,S> │ │ │ │ │ -576 { │ │ │ │ │ -_5_7_7 typedef _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_X_> _A_d_d_e_r; │ │ │ │ │ -578 }; │ │ │ │ │ -579 │ │ │ │ │ -580 template │ │ │ │ │ -_5_8_1 struct _A_d_d_e_r_S_e_l_e_c_t_o_r<_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e,X,S> │ │ │ │ │ -582 { │ │ │ │ │ -_5_8_3 typedef _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_X_> _A_d_d_e_r; │ │ │ │ │ -584 }; │ │ │ │ │ -585 │ │ │ │ │ -586 template │ │ │ │ │ -_5_8_7 struct _A_d_d_e_r_S_e_l_e_c_t_o_r<_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e,X,S> │ │ │ │ │ -588 { │ │ │ │ │ -_5_8_9 typedef _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_X_> _A_d_d_e_r; │ │ │ │ │ -590 }; │ │ │ │ │ -591 │ │ │ │ │ -603 template │ │ │ │ │ -_6_0_4 struct _I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r │ │ │ │ │ -605 { │ │ │ │ │ -_6_0_6 typedef T1 _s_o_l_v_e_r___v_e_c_t_o_r; │ │ │ │ │ -_6_0_7 typedef typename solver_vector::iterator _s_o_l_v_e_r___i_t_e_r_a_t_o_r; │ │ │ │ │ -_6_0_8 typedef T2 _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ -_6_0_9 typedef typename subdomain_vector::const_iterator _d_o_m_a_i_n___i_t_e_r_a_t_o_r; │ │ │ │ │ -610 │ │ │ │ │ -_6_1_1 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _b_e_g_i_n(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ -612 { │ │ │ │ │ -613 return sv.begin(); │ │ │ │ │ -614 } │ │ │ │ │ -615 │ │ │ │ │ -_6_1_6 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _e_n_d(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ -617 { │ │ │ │ │ -618 return sv.end(); │ │ │ │ │ -619 } │ │ │ │ │ -_6_2_0 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _b_e_g_i_n(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ -621 { │ │ │ │ │ -622 return sv.begin(); │ │ │ │ │ -623 } │ │ │ │ │ -624 │ │ │ │ │ -_6_2_5 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _e_n_d(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ -626 { │ │ │ │ │ -627 return sv.end(); │ │ │ │ │ -628 } │ │ │ │ │ -629 }; │ │ │ │ │ -630 │ │ │ │ │ -631 template │ │ │ │ │ -_6_3_2 struct _I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r │ │ │ │ │ -633 { │ │ │ │ │ -_6_3_4 typedef T1 _s_o_l_v_e_r___v_e_c_t_o_r; │ │ │ │ │ -_6_3_5 typedef typename solver_vector::reverse_iterator _s_o_l_v_e_r___i_t_e_r_a_t_o_r; │ │ │ │ │ -_6_3_6 typedef T2 _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ -_6_3_7 typedef typename subdomain_vector::const_reverse_iterator _d_o_m_a_i_n___i_t_e_r_a_t_o_r; │ │ │ │ │ -638 │ │ │ │ │ -_6_3_9 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _b_e_g_i_n(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ -640 { │ │ │ │ │ -641 return sv.rbegin(); │ │ │ │ │ -642 } │ │ │ │ │ -643 │ │ │ │ │ -_6_4_4 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _e_n_d(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ -645 { │ │ │ │ │ -646 return sv.rend(); │ │ │ │ │ -647 } │ │ │ │ │ -_6_4_8 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _b_e_g_i_n(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ -649 { │ │ │ │ │ -650 return sv.rbegin(); │ │ │ │ │ -651 } │ │ │ │ │ -652 │ │ │ │ │ -_6_5_3 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _e_n_d(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ -654 { │ │ │ │ │ -655 return sv.rend(); │ │ │ │ │ -656 } │ │ │ │ │ -657 }; │ │ │ │ │ -658 │ │ │ │ │ -667 template │ │ │ │ │ -_6_6_8 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r │ │ │ │ │ -669 { │ │ │ │ │ -_6_7_0 typedef T _s_m_o_o_t_h_e_r; │ │ │ │ │ -_6_7_1 typedef typename smoother::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -672 │ │ │ │ │ -_6_7_3 static void _a_p_p_l_y(_s_m_o_o_t_h_e_r& sm, _r_a_n_g_e___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& b) │ │ │ │ │ -674 { │ │ │ │ │ -675 sm.template apply(v, b); │ │ │ │ │ -676 } │ │ │ │ │ -677 }; │ │ │ │ │ -678 │ │ │ │ │ -679 template │ │ │ │ │ -_6_8_0 struct │ │ │ │ │ -_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -> │ │ │ │ │ -681 { │ │ │ │ │ -_6_8_2 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_T_D_,_T_A_> │ │ │ │ │ -_s_m_o_o_t_h_e_r; │ │ │ │ │ -_6_8_3 typedef typename _s_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -684 │ │ │ │ │ -_6_8_5 static void _a_p_p_l_y(_s_m_o_o_t_h_e_r& sm, _r_a_n_g_e___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& b) │ │ │ │ │ -686 { │ │ │ │ │ -687 sm.template apply(v, b); │ │ │ │ │ -688 sm.template apply(v, b); │ │ │ │ │ -689 } │ │ │ │ │ -690 }; │ │ │ │ │ -691 │ │ │ │ │ -692 template │ │ │ │ │ -_6_9_3 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -694 {}; │ │ │ │ │ -695 │ │ │ │ │ -696 template │ │ │ │ │ -_6_9_7 using _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r = │ │ │ │ │ -_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_T_,_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_T_>_:_:_v_a_l_u_e>; │ │ │ │ │ -698 │ │ │ │ │ -699 template │ │ │ │ │ -_7_0_0 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r< _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r< │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x< K, Al>, X, Y >,false> │ │ │ │ │ -701 { │ │ │ │ │ -_7_0_2 typedef _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_7_0_3 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ -704 template │ │ │ │ │ -705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, │ │ │ │ │ -const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -706 Solvers& solvers, const SubDomains& domains, │ │ │ │ │ -707 bool onTheFly); │ │ │ │ │ -708 }; │ │ │ │ │ -709 │ │ │ │ │ -710 template class S, typename T, typename A> │ │ │ │ │ -_7_1_1 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r>,true> │ │ │ │ │ -712 { │ │ │ │ │ -_7_1_3 typedef _B_C_R_S_M_a_t_r_i_x_<_T_,_A_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_7_1_4 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ -715 template │ │ │ │ │ -716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, │ │ │ │ │ -const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -717 Solvers& solvers, const SubDomains& domains, │ │ │ │ │ -718 bool onTheFly); │ │ │ │ │ -719 }; │ │ │ │ │ -720 │ │ │ │ │ -721 template │ │ │ │ │ -_7_2_2 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ -723 { │ │ │ │ │ -_7_2_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -725 template │ │ │ │ │ -726 static std::size_t _a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s(const RowToDomain& rowToDomain, │ │ │ │ │ -const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -727 Solvers& solvers, const SubDomains& domains, │ │ │ │ │ -728 bool onTheFly); │ │ │ │ │ -729 }; │ │ │ │ │ -730 │ │ │ │ │ -731 template │ │ │ │ │ -_7_3_2 struct │ │ │ │ │ -_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r,false> │ │ │ │ │ -733 : public _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ -734 {}; │ │ │ │ │ -735 │ │ │ │ │ -736 template │ │ │ │ │ -_7_3_7 struct │ │ │ │ │ -_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r,false> │ │ │ │ │ -738 : public _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ -739 {}; │ │ │ │ │ -740 │ │ │ │ │ -751 template, class TA=std::allocator > │ │ │ │ │ -_7_5_3 class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -754 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -755 { │ │ │ │ │ -756 public: │ │ │ │ │ -_7_6_0 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -761 │ │ │ │ │ -_7_6_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -766 │ │ │ │ │ -_7_7_0 typedef X _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -771 │ │ │ │ │ -_7_7_8 typedef _T_M _M_o_d_e; │ │ │ │ │ -779 │ │ │ │ │ -_7_8_3 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -784 │ │ │ │ │ -_7_8_6 typedef typename matrix_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -787 │ │ │ │ │ -_7_8_9 typedef _T_A _a_l_l_o_c_a_t_o_r; │ │ │ │ │ -790 │ │ │ │ │ -792 typedef std::set, │ │ │ │ │ -793 typename std::allocator_traits::template _r_e_b_i_n_d___a_l_l_o_c_<_s_i_z_e___t_y_p_e_> > │ │ │ │ │ -_7_9_4 _s_u_b_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -795 │ │ │ │ │ -_7_9_7 typedef std::vector:: │ │ │ │ │ -template _r_e_b_i_n_d___a_l_l_o_c_<_s_u_b_d_o_m_a_i_n___t_y_p_e_> > _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ -798 │ │ │ │ │ -_8_0_0 typedef _S_L_L_i_s_t_<_s_i_z_e___t_y_p_e_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_a_l_l_o_c_a_t_o_r___t_r_a_i_t_s_<_T_A_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_r_e_b_i_n_d___a_l_l_o_c_<_s_i_z_e___t_y_p_e_> > _s_u_b_d_o_m_a_i_n___l_i_s_t; │ │ │ │ │ -801 │ │ │ │ │ -_8_0_3 typedef std::vector:: │ │ │ │ │ -template _r_e_b_i_n_d___a_l_l_o_c_<_s_u_b_d_o_m_a_i_n___l_i_s_t_> > _r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ -804 │ │ │ │ │ -_8_0_6 typedef _T_D _s_l_u; │ │ │ │ │ -807 │ │ │ │ │ -_8_0_9 typedef std::vector::template │ │ │ │ │ -_r_e_b_i_n_d___a_l_l_o_c_<_s_l_u_> > _s_l_u___v_e_c_t_o_r; │ │ │ │ │ -810 │ │ │ │ │ -_8_2_4 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const _m_a_t_r_i_x___t_y_p_e& mat, const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& │ │ │ │ │ -subDomains, │ │ │ │ │ -825 _f_i_e_l_d___t_y_p_e relaxationFactor=1, bool _o_n_T_h_e_F_l_y__=true); │ │ │ │ │ -826 │ │ │ │ │ -_8_3_8 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const _m_a_t_r_i_x___t_y_p_e& mat, const _r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r& │ │ │ │ │ -_r_o_w_T_o_D_o_m_a_i_n, │ │ │ │ │ -839 _f_i_e_l_d___t_y_p_e relaxationFactor=1, bool _o_n_T_h_e_F_l_y__=true); │ │ │ │ │ -840 │ │ │ │ │ -_8_4_6 virtual void _p_r_e ([[_m_a_y_b_e___u_n_u_s_e_d]] X& x, [[_m_a_y_b_e___u_n_u_s_e_d]] X& b) │ │ │ │ │ -847 {} │ │ │ │ │ -848 │ │ │ │ │ -_8_5_4 virtual void _a_p_p_l_y (X& v, const X& _d); │ │ │ │ │ -855 │ │ │ │ │ -_8_6_1 virtual void _p_o_s_t ([[_m_a_y_b_e___u_n_u_s_e_d]] X& x) │ │ │ │ │ -862 {} │ │ │ │ │ -863 │ │ │ │ │ -864 template │ │ │ │ │ -_8_6_5 void _a_p_p_l_y(X& v, const X& _d); │ │ │ │ │ -866 │ │ │ │ │ -_8_6_8 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -869 { │ │ │ │ │ -870 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -871 } │ │ │ │ │ -872 │ │ │ │ │ -873 private: │ │ │ │ │ -874 const M& mat; │ │ │ │ │ -875 _s_l_u___v_e_c_t_o_r solvers; │ │ │ │ │ -876 _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r subDomains; │ │ │ │ │ -877 _f_i_e_l_d___t_y_p_e relax; │ │ │ │ │ -878 │ │ │ │ │ -879 typename M::size_type maxlength; │ │ │ │ │ -880 │ │ │ │ │ -881 bool onTheFly; │ │ │ │ │ -882 }; │ │ │ │ │ -883 │ │ │ │ │ -884 │ │ │ │ │ -885 │ │ │ │ │ -886 template │ │ │ │ │ -_8_8_7 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -(_I_n_i_t_i_a_l_i_z_e_r_L_i_s_t& il, │ │ │ │ │ -888 const _I_n_d_e_x_S_e_t& idx, │ │ │ │ │ -889 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& domains_) │ │ │ │ │ -890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_) │ │ │ │ │ -891 {} │ │ │ │ │ -892 │ │ │ │ │ -893 │ │ │ │ │ -894 template │ │ │ │ │ -_8_9_5 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_a_d_d_R_o_w_N_n_z(const _I_t_e_r& row) │ │ │ │ │ -896 { │ │ │ │ │ -897 typedef typename IndexSet::value_type::const_iterator iterator; │ │ │ │ │ -898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices) │ │ │ │ │ -[row.index()].end(); ++domain) { │ │ │ │ │ -899 (*initializers)[*domain].addRowNnz(row, domains[*domain]); │ │ │ │ │ -900 indexMaps[*domain].insert(row.index()); │ │ │ │ │ -901 } │ │ │ │ │ -902 } │ │ │ │ │ -903 │ │ │ │ │ -904 template │ │ │ │ │ -_9_0_5 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_a_l_l_o_c_a_t_e() │ │ │ │ │ -906 { │ │ │ │ │ -907 for(auto&& i: *initializers) │ │ │ │ │ -908 i.allocateMatrixStorage(); │ │ │ │ │ -909 for(auto&& i: *initializers) │ │ │ │ │ -910 i.allocateMarker(); │ │ │ │ │ -911 } │ │ │ │ │ -912 │ │ │ │ │ -913 template │ │ │ │ │ -_9_1_4 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_o_u_n_t_E_n_t_r_i_e_s(const _I_t_e_r& row, │ │ │ │ │ -const _C_I_t_e_r& _c_o_l) const │ │ │ │ │ -915 { │ │ │ │ │ -916 typedef typename IndexSet::value_type::const_iterator iterator; │ │ │ │ │ -917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices) │ │ │ │ │ -[row.index()].end(); ++domain) { │ │ │ │ │ -918 typename std::map::const_iterator v = indexMaps │ │ │ │ │ -[*domain].find(_c_o_l.index()); │ │ │ │ │ -919 if(v!= indexMaps[*domain].end()) { │ │ │ │ │ -920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(_c_o_l.index())- │ │ │ │ │ ->second); │ │ │ │ │ -921 } │ │ │ │ │ -922 } │ │ │ │ │ -923 } │ │ │ │ │ -924 │ │ │ │ │ -925 template │ │ │ │ │ -_9_2_6 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_a_l_c_C_o_l_s_t_a_r_t() const │ │ │ │ │ -927 { │ │ │ │ │ -928 for(auto&& i : *initializers) │ │ │ │ │ -929 i.calcColstart(); │ │ │ │ │ -930 } │ │ │ │ │ -931 │ │ │ │ │ -932 template │ │ │ │ │ -_9_3_3 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_o_p_y_V_a_l_u_e(const _I_t_e_r& row, const │ │ │ │ │ -_C_I_t_e_r& _c_o_l) const │ │ │ │ │ -934 { │ │ │ │ │ -935 typedef typename IndexSet::value_type::const_iterator iterator; │ │ │ │ │ -936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices) │ │ │ │ │ -[row.index()].end(); ++domain) { │ │ │ │ │ -937 typename std::map::const_iterator v = indexMaps │ │ │ │ │ -[*domain].find(_c_o_l.index()); │ │ │ │ │ -938 if(v!= indexMaps[*domain].end()) { │ │ │ │ │ -939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index())); │ │ │ │ │ -940 (*initializers)[*domain].copyValue(_c_o_l, indexMaps[*domain].find(row.index │ │ │ │ │ -())->second, │ │ │ │ │ -941 v->second); │ │ │ │ │ -942 } │ │ │ │ │ -943 } │ │ │ │ │ -944 } │ │ │ │ │ -945 │ │ │ │ │ -946 template │ │ │ │ │ -_9_4_7 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_r_e_a_t_e_M_a_t_r_i_x() const │ │ │ │ │ -948 { │ │ │ │ │ -949 std::vector().swap(indexMaps); │ │ │ │ │ -950 for(auto&& i: *initializers) │ │ │ │ │ -951 i.createMatrix(); │ │ │ │ │ -952 } │ │ │ │ │ -953 │ │ │ │ │ -954 template │ │ │ │ │ -_9_5_5 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_I_n_d_e_x_M_a_p() │ │ │ │ │ -956 : row(0) │ │ │ │ │ -957 {} │ │ │ │ │ -958 │ │ │ │ │ -959 template │ │ │ │ │ -_9_6_0 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_i_n_s_e_r_t(size_type grow) │ │ │ │ │ -961 { │ │ │ │ │ -962 assert(map_.find(grow)==map_.end()); │ │ │ │ │ -963 map_.insert(std::make_pair(grow, row++)); │ │ │ │ │ -964 } │ │ │ │ │ -965 │ │ │ │ │ -966 template │ │ │ │ │ -967 typename OverlappingSchwarzInitializer::IndexMap::const_iterator │ │ │ │ │ -_9_6_8 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_f_i_n_d(size_type grow) const │ │ │ │ │ -969 { │ │ │ │ │ -970 return map_.find(grow); │ │ │ │ │ -971 } │ │ │ │ │ -972 │ │ │ │ │ -973 template │ │ │ │ │ -974 typename OverlappingSchwarzInitializer::IndexMap::iterator │ │ │ │ │ -_9_7_5 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_f_i_n_d(size_type grow) │ │ │ │ │ -976 { │ │ │ │ │ -977 return map_.find(grow); │ │ │ │ │ -978 } │ │ │ │ │ -979 │ │ │ │ │ -980 template │ │ │ │ │ -981 typename OverlappingSchwarzInitializer::IndexMap::const_iterator │ │ │ │ │ -_9_8_2 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_e_n_d() const │ │ │ │ │ -983 { │ │ │ │ │ -984 return map_.end(); │ │ │ │ │ -985 } │ │ │ │ │ -986 │ │ │ │ │ -987 template │ │ │ │ │ -988 typename OverlappingSchwarzInitializer::IndexMap::iterator │ │ │ │ │ -_9_8_9 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_e_n_d() │ │ │ │ │ -990 { │ │ │ │ │ -991 return map_.end(); │ │ │ │ │ -992 } │ │ │ │ │ -993 │ │ │ │ │ -994 template │ │ │ │ │ -995 typename OverlappingSchwarzInitializer::IndexMap::const_iterator │ │ │ │ │ -_9_9_6 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_b_e_g_i_n() const │ │ │ │ │ -997 { │ │ │ │ │ -998 return map_.begin(); │ │ │ │ │ -999 } │ │ │ │ │ -1000 │ │ │ │ │ -1001 template │ │ │ │ │ -1002 typename OverlappingSchwarzInitializer::IndexMap::iterator │ │ │ │ │ -_1_0_0_3 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_b_e_g_i_n() │ │ │ │ │ -1004 { │ │ │ │ │ -1005 return map_.begin(); │ │ │ │ │ -1006 } │ │ │ │ │ -1007 │ │ │ │ │ -1008 template │ │ │ │ │ -_1_0_0_9 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const │ │ │ │ │ -_m_a_t_r_i_x___t_y_p_e& _m_a_t__, const _r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r& _r_o_w_T_o_D_o_m_a_i_n, │ │ │ │ │ -1010 _f_i_e_l_d___t_y_p_e relaxationFactor, bool _f_l_y) │ │ │ │ │ -1011 : _m_a_t(_m_a_t__), relax(relaxationFactor), onTheFly(_f_l_y) │ │ │ │ │ -1012 { │ │ │ │ │ -1013 typedef typename rowtodomain_vector::const_iterator _R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r; │ │ │ │ │ -1014 typedef typename subdomain_list::const_iterator _D_o_m_a_i_n_I_t_e_r_a_t_o_r; │ │ │ │ │ -1015#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1016 _a_s_s_e_r_t(_r_o_w_T_o_D_o_m_a_i_n.size()==mat.N()); │ │ │ │ │ -1017 _a_s_s_e_r_t(_r_o_w_T_o_D_o_m_a_i_n.size()==mat.M()); │ │ │ │ │ -1018 │ │ │ │ │ -1019 for(_R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r _i_t_e_r=_r_o_w_T_o_D_o_m_a_i_n.begin(); _i_t_e_r != _r_o_w_T_o_D_o_m_a_i_n.end(); │ │ │ │ │ -++_i_t_e_r) │ │ │ │ │ -1020 _a_s_s_e_r_t(_i_t_e_r->size()>0); │ │ │ │ │ -1021 │ │ │ │ │ -1022#endif │ │ │ │ │ -1023 // calculate the number of domains │ │ │ │ │ -1024 _s_i_z_e___t_y_p_e domains=0; │ │ │ │ │ -1025 for(_R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r _i_t_e_r=_r_o_w_T_o_D_o_m_a_i_n.begin(); _i_t_e_r != _r_o_w_T_o_D_o_m_a_i_n.end(); │ │ │ │ │ -++_i_t_e_r) │ │ │ │ │ -1026 for(_D_o_m_a_i_n_I_t_e_r_a_t_o_r _d=_i_t_e_r->begin(); _d != _i_t_e_r->end(); ++_d) │ │ │ │ │ -1027 domains=std::max(domains, *_d); │ │ │ │ │ -1028 ++domains; │ │ │ │ │ -1029 │ │ │ │ │ -1030 solvers.resize(domains); │ │ │ │ │ -1031 subDomains.resize(domains); │ │ │ │ │ -1032 │ │ │ │ │ -1033 // initialize subdomains to row mapping from row to subdomain mapping │ │ │ │ │ -1034 _s_i_z_e___t_y_p_e row=0; │ │ │ │ │ -1035 for(_R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r _i_t_e_r=_r_o_w_T_o_D_o_m_a_i_n.begin(); _i_t_e_r != _r_o_w_T_o_D_o_m_a_i_n.end(); │ │ │ │ │ -++_i_t_e_r, ++row) │ │ │ │ │ -1036 for(_D_o_m_a_i_n_I_t_e_r_a_t_o_r _d=_i_t_e_r->begin(); _d != _i_t_e_r->end(); ++_d) │ │ │ │ │ -1037 subDomains[*_d].insert(row); │ │ │ │ │ -1038 │ │ │ │ │ -1039#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1040 _s_i_z_e___t_y_p_e i=0; │ │ │ │ │ -1041 typedef typename subdomain_vector::const_iterator iterator; │ │ │ │ │ -1042 for(iterator _i_t_e_r=subDomains.begin(); _i_t_e_r != subDomains.end(); ++_i_t_e_r) { │ │ │ │ │ -1043 typedef typename subdomain_type::const_iterator _e_n_t_r_y___i_t_e_r_a_t_o_r; │ │ │ │ │ -1044 Dune::dvverb<<"domain "<begin(); entry != _i_t_e_r->end(); ++entry) { │ │ │ │ │ -1046 Dune::dvverb<<" "<<*entry; │ │ │ │ │ -1047 } │ │ │ │ │ -1048 Dune::dvverb< │ │ │ │ │ -1052_ _:_:_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s(_r_o_w_T_o_D_o_m_a_i_n, mat, solvers, subDomains, onTheFly); │ │ │ │ │ -1053 } │ │ │ │ │ -1054 │ │ │ │ │ -1055 template │ │ │ │ │ -_1_0_5_6 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const │ │ │ │ │ -_m_a_t_r_i_x___t_y_p_e& _m_a_t__, │ │ │ │ │ -1057 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& _s_d, │ │ │ │ │ -1058 _f_i_e_l_d___t_y_p_e relaxationFactor, │ │ │ │ │ -1059 bool _f_l_y) │ │ │ │ │ -1060 : _m_a_t(_m_a_t__), solvers(_s_d.size()), subDomains(_s_d), relax(relaxationFactor), │ │ │ │ │ -1061 onTheFly(_f_l_y) │ │ │ │ │ -1062 { │ │ │ │ │ -1063 typedef typename subdomain_vector::const_iterator _D_o_m_a_i_n_I_t_e_r_a_t_o_r; │ │ │ │ │ -1064 │ │ │ │ │ -1065#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1066 _s_i_z_e___t_y_p_e i=0; │ │ │ │ │ -1067 │ │ │ │ │ -1068 for(_D_o_m_a_i_n_I_t_e_r_a_t_o_r _d=_s_d.begin(); _d != _s_d.end(); ++_d,++i) { │ │ │ │ │ -1069 //std::cout<size()<size()>0); │ │ │ │ │ -1071 typedef typename DomainIterator::value_type::const_iterator │ │ │ │ │ -_e_n_t_r_y___i_t_e_r_a_t_o_r; │ │ │ │ │ -1072 Dune::dvverb<<"domain "<begin(); entry != _d->end(); ++entry) { │ │ │ │ │ -1074 Dune::dvverb<<" "<<*entry; │ │ │ │ │ -1075 } │ │ │ │ │ -1076 Dune::dvverb<begin(); row != _d_o_m_a_i_n->end(); ++row) │ │ │ │ │ -1089 _r_o_w_T_o_D_o_m_a_i_n[*row].push_back(_d_o_m_a_i_n_I_d); │ │ │ │ │ -1090 } │ │ │ │ │ -1091 │ │ │ │ │ -1092 maxlength = _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_<_s_l_u_> │ │ │ │ │ -1093_ _:_:_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s(_r_o_w_T_o_D_o_m_a_i_n, mat, solvers, subDomains, onTheFly); │ │ │ │ │ -1094 } │ │ │ │ │ -1095 │ │ │ │ │ -1102 template │ │ │ │ │ -_1_1_0_3 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e {}; │ │ │ │ │ -1104 │ │ │ │ │ -1105 template │ │ │ │ │ -_1_1_0_6 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -1107 { │ │ │ │ │ -_1_1_0_8 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ -_1_1_0_9 static constexpr size_t m = std::decay_t()))>::cols; │ │ │ │ │ -1110 template │ │ │ │ │ -_1_1_1_1 static int _s_i_z_e(const Domain & d) │ │ │ │ │ -1112 { │ │ │ │ │ -1113 assert(n==m); │ │ │ │ │ -1114 return m*d.size(); │ │ │ │ │ -1115 } │ │ │ │ │ -1116 }; │ │ │ │ │ -1117 │ │ │ │ │ -1118 template │ │ │ │ │ -1119 template │ │ │ │ │ -1120 std::size_t │ │ │ │ │ -_1_1_2_1 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_< │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_>, X, Y >,false>:: │ │ │ │ │ -1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain, │ │ │ │ │ -1123 [[maybe_unused]] const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -1124 [[maybe_unused]] Solvers& solvers, │ │ │ │ │ -1125 const SubDomains& subDomains, │ │ │ │ │ -1126 [[maybe_unused]] bool onTheFly) │ │ │ │ │ -1127 { │ │ │ │ │ -1128 typedef typename SubDomains::const_iterator DomainIterator; │ │ │ │ │ -1129 std::size_t maxlength = 0; │ │ │ │ │ -1130 │ │ │ │ │ -1131 assert(onTheFly); │ │ │ │ │ -1132 │ │ │ │ │ -1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ -++domain) │ │ │ │ │ -1134 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ -1135 maxlength*=n; │ │ │ │ │ -1136 │ │ │ │ │ -1137 return maxlength; │ │ │ │ │ -1138 } │ │ │ │ │ -1139 │ │ │ │ │ -1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -1141 template class S, typename T, typename A> │ │ │ │ │ -1142 template │ │ │ │ │ -_1_1_4_3 std::size_t │ │ │ │ │ -_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>:: │ │ │ │ │ -assembleLocalProblems(const RowToDomain& rowToDomain, │ │ │ │ │ -1144 const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -1145 Solvers& solvers, │ │ │ │ │ -1146 const SubDomains& subDomains, │ │ │ │ │ -1147 bool onTheFly) │ │ │ │ │ -1148 { │ │ │ │ │ -1149 typedef typename S>::MatrixInitializer MatrixInitializer; │ │ │ │ │ -1150 typedef typename std::vector::iterator │ │ │ │ │ -InitializerIterator; │ │ │ │ │ -1151 typedef typename SubDomains::const_iterator DomainIterator; │ │ │ │ │ -1152 typedef typename Solvers::iterator SolverIterator; │ │ │ │ │ -1153 std::size_t maxlength = 0; │ │ │ │ │ -1154 │ │ │ │ │ -1155 if(onTheFly) { │ │ │ │ │ -1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ -++domain) │ │ │ │ │ -1157 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ -1158 maxlength*=Impl::asMatrix(*_m_a_t[0].begin()).N(); │ │ │ │ │ -1159 }else{ │ │ │ │ │ -1160 // initialize the initializers │ │ │ │ │ -1161 DomainIterator domain=subDomains.begin(); │ │ │ │ │ -1162 │ │ │ │ │ -1163 // Create the initializers list. │ │ │ │ │ -1164 std::vector initializers(subDomains.size()); │ │ │ │ │ -1165 │ │ │ │ │ -1166 SolverIterator solver=solvers.begin(); │ │ │ │ │ -1167 for(InitializerIterator initializer=initializers.begin(); │ │ │ │ │ -initializer!=initializers.end(); │ │ │ │ │ -1168 ++initializer, ++solver, ++domain) { │ │ │ │ │ -1169 solver->getInternalMatrix │ │ │ │ │ -().N_=_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_m_a_t_r_i_x___t_y_p_e_>_:_:_s_i_z_e(*domain); │ │ │ │ │ -1170 solver->getInternalMatrix │ │ │ │ │ -().M_=_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_m_a_t_r_i_x___t_y_p_e_>_:_:_s_i_z_e(*domain); │ │ │ │ │ -1171 //solver->setVerbosity(true); │ │ │ │ │ -1172 *initializer=MatrixInitializer(solver->getInternalMatrix()); │ │ │ │ │ -1173 } │ │ │ │ │ -1174 │ │ │ │ │ -1175 // Set up the supermatrices according to the subdomains │ │ │ │ │ -1176 typedef _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_s_t_d_:_:_v_e_c_t_o_r_<_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_>, │ │ │ │ │ -1177 RowToDomain, SubDomains> Initializer; │ │ │ │ │ -1178 │ │ │ │ │ -1179 Initializer initializer(initializers, rowToDomain, subDomains); │ │ │ │ │ -1180 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ -1181 │ │ │ │ │ -1182 // Calculate the LU decompositions │ │ │ │ │ -1183 for(auto&& s: solvers) │ │ │ │ │ -1184 s.decompose(); │ │ │ │ │ -1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end(); │ │ │ │ │ -++solverIt) │ │ │ │ │ -1186 { │ │ │ │ │ -1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix │ │ │ │ │ -().M()); │ │ │ │ │ -1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N()); │ │ │ │ │ -1189 } │ │ │ │ │ -1190 } │ │ │ │ │ -1191 return maxlength; │ │ │ │ │ -1192 } │ │ │ │ │ -1193 │ │ │ │ │ -1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -1195 │ │ │ │ │ -1196 template │ │ │ │ │ -1197 template │ │ │ │ │ -_1_1_9_8 std::size_t _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_: │ │ │ │ │ -_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s([[maybe_unused]] const RowToDomain& rowToDomain, │ │ │ │ │ -1199 const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ -1200 Solvers& solvers, │ │ │ │ │ -1201 const SubDomains& subDomains, │ │ │ │ │ -1202 bool onTheFly) │ │ │ │ │ -1203 { │ │ │ │ │ -1204 typedef typename SubDomains::const_iterator DomainIterator; │ │ │ │ │ -1205 typedef typename Solvers::iterator SolverIterator; │ │ │ │ │ -1206 std::size_t maxlength = 0; │ │ │ │ │ -1207 │ │ │ │ │ -1208 if(onTheFly) { │ │ │ │ │ -1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ -++domain) │ │ │ │ │ -1210 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ -1211 }else{ │ │ │ │ │ -1212 // initialize the solvers of the local prolems. │ │ │ │ │ -1213 SolverIterator solver=solvers.begin(); │ │ │ │ │ -1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ -1215 ++domain, ++solver) { │ │ │ │ │ -1216 solver->setSubMatrix(_m_a_t, *domain); │ │ │ │ │ -1217 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ -1218 } │ │ │ │ │ -1219 } │ │ │ │ │ -1220 │ │ │ │ │ -1221 return maxlength; │ │ │ │ │ -1222 │ │ │ │ │ -1223 } │ │ │ │ │ -1224 │ │ │ │ │ -1225 │ │ │ │ │ -1226 template │ │ │ │ │ -_1_2_2_7 void _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_a_p_p_l_y(X& x, const X& b) │ │ │ │ │ -1228 { │ │ │ │ │ -1229 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_>_:_:_a_p_p_l_y(*this, x, b); │ │ │ │ │ -1230 } │ │ │ │ │ -1231 │ │ │ │ │ -1232 template │ │ │ │ │ -1233 template │ │ │ │ │ -_1_2_3_4 void _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_a_p_p_l_y(X& x, const X& b) │ │ │ │ │ -1235 { │ │ │ │ │ -1236 typedef _s_l_u___v_e_c_t_o_r solver_vector; │ │ │ │ │ -1237 typedef typename │ │ │ │ │ -_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_: │ │ │ │ │ -_s_o_l_v_e_r___i_t_e_r_a_t_o_r iterator; │ │ │ │ │ -1238 typedef typename │ │ │ │ │ -_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_: │ │ │ │ │ -_d_o_m_a_i_n___i_t_e_r_a_t_o_r │ │ │ │ │ -1239 domain_iterator; │ │ │ │ │ -1240 │ │ │ │ │ -1241 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_T_D_> assigner(maxlength, _m_a_t, b, x); │ │ │ │ │ -1242 │ │ │ │ │ -1243 domain_iterator │ │ │ │ │ -_d_o_m_a_i_n=_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_:_b_e_g_i_n │ │ │ │ │ -(subDomains); │ │ │ │ │ -1244 iterator solver = │ │ │ │ │ -_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_:_b_e_g_i_n │ │ │ │ │ -(solvers); │ │ │ │ │ -1245 X v(x); // temporary for the update │ │ │ │ │ -1246 v=0; │ │ │ │ │ -1247 │ │ │ │ │ -1248 typedef typename _A_d_d_e_r_S_e_l_e_c_t_o_r_<_T_M_,_X_,_T_D_ _>_:_:_A_d_d_e_r Adder; │ │ │ │ │ -1249 Adder adder(v, x, assigner, relax); │ │ │ │ │ -1250 │ │ │ │ │ -1251 for(; _d_o_m_a_i_n != │ │ │ │ │ -_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_:_e_n_d │ │ │ │ │ -(subDomains); ++_d_o_m_a_i_n) { │ │ │ │ │ -1252 //Copy rhs to C-array for SuperLU │ │ │ │ │ -1253 std::for_each(_d_o_m_a_i_n->begin(), _d_o_m_a_i_n->end(), assigner); │ │ │ │ │ -1254 assigner.resetIndexForNextDomain(); │ │ │ │ │ -1255 if(onTheFly) { │ │ │ │ │ -1256 // Create the subdomain solver │ │ │ │ │ -1257 _s_l_u _s_d_s_o_l_v_e_r; │ │ │ │ │ -1258 _s_d_s_o_l_v_e_r.setSubMatrix(_m_a_t, *_d_o_m_a_i_n); │ │ │ │ │ -1259 // Apply │ │ │ │ │ -1260 _s_d_s_o_l_v_e_r.apply(assigner.lhs(), assigner.rhs()); │ │ │ │ │ -1261 }else{ │ │ │ │ │ -1262 solver->apply(assigner.lhs(), assigner.rhs()); │ │ │ │ │ -1263 ++solver; │ │ │ │ │ -1264 } │ │ │ │ │ -1265 │ │ │ │ │ -1266 //Add relaxed correction to from SuperLU to v │ │ │ │ │ -1267 std::for_each(_d_o_m_a_i_n->begin(), _d_o_m_a_i_n->end(), adder); │ │ │ │ │ -1268 assigner.resetIndexForNextDomain(); │ │ │ │ │ -1269 │ │ │ │ │ -1270 } │ │ │ │ │ -1271 │ │ │ │ │ -1272 adder.axpy(); │ │ │ │ │ -1273 assigner.deallocate(); │ │ │ │ │ -1274 } │ │ │ │ │ -1275 │ │ │ │ │ -1276 template │ │ │ │ │ -1277 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_2_7_8 ::OverlappingAssignerHelper(std::size_t maxlength, const _B_C_R_S_M_a_t_r_i_x_<_K_, │ │ │ │ │ -_A_l_>& mat_, │ │ │ │ │ -1279 const X& b_, Y& x_) : │ │ │ │ │ -1280 _m_a_t(&mat_), │ │ │ │ │ -1281 rhs_( new DynamicVector<_f_i_e_l_d___t_y_p_e>(maxlength, 42) ), │ │ │ │ │ -1282 lhs_( new DynamicVector<_f_i_e_l_d___t_y_p_e>(maxlength, -42) ), │ │ │ │ │ -1283 b(&b_), │ │ │ │ │ -1284 x(&x_), │ │ │ │ │ -1285 i(0), │ │ │ │ │ -1286 maxlength_(maxlength) │ │ │ │ │ -1287 {} │ │ │ │ │ -1288 │ │ │ │ │ -1289 template │ │ │ │ │ -1290 void │ │ │ │ │ -1291 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_2_9_2 ::deallocate() │ │ │ │ │ -1293 { │ │ │ │ │ -1294 delete rhs_; │ │ │ │ │ -1295 delete lhs_; │ │ │ │ │ -1296 } │ │ │ │ │ -1297 │ │ │ │ │ -1298 template │ │ │ │ │ -1299 void │ │ │ │ │ -1300 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_3_0_1 ::resetIndexForNextDomain() │ │ │ │ │ -1302 { │ │ │ │ │ -1303 i=0; │ │ │ │ │ -1304 } │ │ │ │ │ -1305 │ │ │ │ │ -1306 template │ │ │ │ │ -1307 DynamicVector & │ │ │ │ │ -1308 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_3_0_9 ::lhs() │ │ │ │ │ -1310 { │ │ │ │ │ -1311 return *lhs_; │ │ │ │ │ -1312 } │ │ │ │ │ -1313 │ │ │ │ │ -1314 template │ │ │ │ │ -1315 DynamicVector & │ │ │ │ │ -1316 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_3_1_7 ::rhs() │ │ │ │ │ -1318 { │ │ │ │ │ -1319 return *rhs_; │ │ │ │ │ -1320 } │ │ │ │ │ -1321 │ │ │ │ │ -1322 template │ │ │ │ │ -1323 void │ │ │ │ │ -1324 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_3_2_5 ::relaxResult(_f_i_e_l_d___t_y_p_e relax) │ │ │ │ │ -1326 { │ │ │ │ │ -1327 lhs() *= relax; │ │ │ │ │ -1328 } │ │ │ │ │ -1329 │ │ │ │ │ -1330 template │ │ │ │ │ -1331 void │ │ │ │ │ -1332 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_3_3_3 ::operator()(const _s_i_z_e___t_y_p_e& domainIndex) │ │ │ │ │ -1334 { │ │ │ │ │ -1335 lhs() = 0.0; │ │ │ │ │ -1336#if 0 │ │ │ │ │ -1337 //assign right hand side of current domainindex block │ │ │ │ │ -1338 for(_s_i_z_e___t_y_p_e j=0; j │ │ │ │ │ -1376 void │ │ │ │ │ -1377 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_>, X, Y >,false> │ │ │ │ │ -_1_3_7_8 ::assignResult(_b_l_o_c_k___t_y_p_e& res) │ │ │ │ │ -1379 { │ │ │ │ │ -1380 // assign the result of the local solve to the global vector │ │ │ │ │ -1381 for(_s_i_z_e___t_y_p_e j=0; j class S, typename T, typename A> │ │ │ │ │ -1390 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true> │ │ │ │ │ -_1_3_9_1 ::OverlappingAssignerHelper(std::size_t maxlength, │ │ │ │ │ -1392 const _B_C_R_S_M_a_t_r_i_x_<_T_,_A_>& mat_, │ │ │ │ │ -1393 const _r_a_n_g_e___t_y_p_e& b_, │ │ │ │ │ -1394 _r_a_n_g_e___t_y_p_e& x_) │ │ │ │ │ -1395 : _m_a_t(&mat_), │ │ │ │ │ -1396 b(&b_), │ │ │ │ │ -1397 x(&x_), i(0), maxlength_(maxlength) │ │ │ │ │ -1398 { │ │ │ │ │ -1399 rhs_ = new _f_i_e_l_d___t_y_p_e[maxlength]; │ │ │ │ │ -1400 lhs_ = new _f_i_e_l_d___t_y_p_e[maxlength]; │ │ │ │ │ -1401 │ │ │ │ │ -1402 } │ │ │ │ │ -1403 │ │ │ │ │ -1404 template class S, typename T, typename A> │ │ │ │ │ -_1_4_0_5 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_> >,true>::deallocate() │ │ │ │ │ -1406 { │ │ │ │ │ -1407 delete[] rhs_; │ │ │ │ │ -1408 delete[] lhs_; │ │ │ │ │ -1409 } │ │ │ │ │ -1410 │ │ │ │ │ -1411 template class S, typename T, typename A> │ │ │ │ │ -_1_4_1_2 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::operator()(const │ │ │ │ │ -_s_i_z_e___t_y_p_e& domainIndex) │ │ │ │ │ -1413 { │ │ │ │ │ -1414 //assign right hand side of current domainindex block │ │ │ │ │ -1415 // rhs is an array of doubles! │ │ │ │ │ -1416 // rhs[starti] = b[domainindex] │ │ │ │ │ -1417 for(_s_i_z_e___t_y_p_e j=0; j class S, typename T, typename A> │ │ │ │ │ -_1_4_4_1 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::relaxResult │ │ │ │ │ -(_f_i_e_l_d___t_y_p_e relax) │ │ │ │ │ -1442 { │ │ │ │ │ -1443 for(_s_i_z_e___t_y_p_e j=i+n; i class S, typename T, typename A> │ │ │ │ │ -_1_4_5_1 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::assignResult │ │ │ │ │ -(_b_l_o_c_k___t_y_p_e& res) │ │ │ │ │ -1452 { │ │ │ │ │ -1453 // assign the result of the local solve to the global vector │ │ │ │ │ -1454 for(_s_i_z_e___t_y_p_e j=0; j class S, typename T, typename A> │ │ │ │ │ -_1_4_6_1 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>:: │ │ │ │ │ -resetIndexForNextDomain() │ │ │ │ │ -1462 { │ │ │ │ │ -1463 i=0; │ │ │ │ │ -1464 } │ │ │ │ │ -1465 │ │ │ │ │ -1466 template class S, typename T, typename A> │ │ │ │ │ -1467 typename _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::field_type* │ │ │ │ │ -_1_4_6_8 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::lhs() │ │ │ │ │ -1469 { │ │ │ │ │ -1470 return lhs_; │ │ │ │ │ -1471 } │ │ │ │ │ -1472 │ │ │ │ │ -1473 template class S, typename T, typename A> │ │ │ │ │ -1474 typename _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::field_type* │ │ │ │ │ -_1_4_7_5 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::rhs() │ │ │ │ │ -1476 { │ │ │ │ │ -1477 return rhs_; │ │ │ │ │ -1478 } │ │ │ │ │ -1479 │ │ │ │ │ -1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ -1481 │ │ │ │ │ -1482 template │ │ │ │ │ -_1_4_8_3 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(std::size_t │ │ │ │ │ -maxlength, │ │ │ │ │ -1484 const M& mat_, │ │ │ │ │ -1485 const Y& b_, │ │ │ │ │ -1486 X& x_) │ │ │ │ │ -1487 : _m_a_t(&mat_), │ │ │ │ │ -1488 b(&b_), │ │ │ │ │ -1489 x(&x_), i(0) │ │ │ │ │ -1490 { │ │ │ │ │ -1491 rhs_= new Y(maxlength); │ │ │ │ │ -1492 lhs_ = new X(maxlength); │ │ │ │ │ -1493 } │ │ │ │ │ -1494 │ │ │ │ │ -1495 template │ │ │ │ │ -_1_4_9_6 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_d_e_a_l_l_o_c_a_t_e() │ │ │ │ │ -1497 { │ │ │ │ │ -1498 delete rhs_; │ │ │ │ │ -1499 delete lhs_; │ │ │ │ │ -1500 } │ │ │ │ │ -1501 │ │ │ │ │ -1502 template │ │ │ │ │ -_1_5_0_3 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_o_p_e_r_a_t_o_r_(_)(const _s_i_z_e___t_y_p_e& │ │ │ │ │ -domainIndex) │ │ │ │ │ -1504 { │ │ │ │ │ -1505 (*rhs_)[i]=(*b)[domainIndex]; │ │ │ │ │ -1506 │ │ │ │ │ -1507 // loop over all Matrix row entries and calculate defect. │ │ │ │ │ -1508 typedef typename matrix_type::ConstColIterator col_iterator; │ │ │ │ │ -1509 │ │ │ │ │ -1510 // calculate defect for current row index block │ │ │ │ │ -1511 for(col_iterator _c_o_l=(*_m_a_t)[domainIndex].begin(); _c_o_l!=(*mat) │ │ │ │ │ -[domainIndex].end(); ++_c_o_l) { │ │ │ │ │ -1512 Impl::asMatrix(*col).mmv((*x)[_c_o_l.index()], (*rhs_)[i]); │ │ │ │ │ -1513 } │ │ │ │ │ -1514 // Goto next local index │ │ │ │ │ -1515 ++i; │ │ │ │ │ -1516 } │ │ │ │ │ -1517 │ │ │ │ │ -1518 template │ │ │ │ │ -_1_5_1_9 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_r_e_l_a_x_R_e_s_u_l_t(_f_i_e_l_d___t_y_p_e relax) │ │ │ │ │ -1520 { │ │ │ │ │ -1521 (*lhs_)[i]*=relax; │ │ │ │ │ -1522 } │ │ │ │ │ -1523 │ │ │ │ │ -1524 template │ │ │ │ │ -_1_5_2_5 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_a_s_s_i_g_n_R_e_s_u_l_t(_b_l_o_c_k___t_y_p_e& res) │ │ │ │ │ -1526 { │ │ │ │ │ -1527 res+=(*lhs_)[i++]; │ │ │ │ │ -1528 } │ │ │ │ │ -1529 │ │ │ │ │ -1530 template │ │ │ │ │ -_1_5_3_1 X& _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_l_h_s() │ │ │ │ │ -1532 { │ │ │ │ │ -1533 return *lhs_; │ │ │ │ │ -1534 } │ │ │ │ │ -1535 │ │ │ │ │ -1536 template │ │ │ │ │ -_1_5_3_7 Y& _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_r_h_s() │ │ │ │ │ -1538 { │ │ │ │ │ -1539 return *rhs_; │ │ │ │ │ -1540 } │ │ │ │ │ -1541 │ │ │ │ │ -1542 template │ │ │ │ │ -_1_5_4_3 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_r_e_s_e_t_I_n_d_e_x_F_o_r_N_e_x_t_D_o_m_a_i_n() │ │ │ │ │ -1544 { │ │ │ │ │ -1545 i=0; │ │ │ │ │ -1546 } │ │ │ │ │ -1547 │ │ │ │ │ -1548 template │ │ │ │ │ -_1_5_4_9 _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::AdditiveAdder(_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v_, │ │ │ │ │ -1550 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x_, │ │ │ │ │ -1551 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner_, │ │ │ │ │ -1552 const _f_i_e_l_d___t_y_p_e& relax_) │ │ │ │ │ -1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_) │ │ │ │ │ -1554 {} │ │ │ │ │ -1555 │ │ │ │ │ -1556 template │ │ │ │ │ -_1_5_5_7 void _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::operator()(const _s_i_z_e___t_y_p_e& │ │ │ │ │ -domainIndex) │ │ │ │ │ -1558 { │ │ │ │ │ -1559 // add the result of the local solve to the current update │ │ │ │ │ -1560 assigner->assignResult((*v)[domainIndex]); │ │ │ │ │ -1561 } │ │ │ │ │ -1562 │ │ │ │ │ -1563 │ │ │ │ │ -1564 template │ │ │ │ │ -_1_5_6_5 void _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::axpy() │ │ │ │ │ -1566 { │ │ │ │ │ -1567 // relax the update and add it to the current guess. │ │ │ │ │ -1568 x->axpy(relax,*v); │ │ │ │ │ -1569 } │ │ │ │ │ -1570 │ │ │ │ │ -1571 │ │ │ │ │ -1572 template │ │ │ │ │ -1573 _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> > │ │ │ │ │ -_1_5_7_4 ::MultiplicativeAdder([[maybe_unused]] _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v_, │ │ │ │ │ -1575 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x_, │ │ │ │ │ -1576 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner_, const _f_i_e_l_d___t_y_p_e& relax_) │ │ │ │ │ -1577 : x(&x_), assigner(&assigner_), relax(relax_) │ │ │ │ │ -1578 {} │ │ │ │ │ -1579 │ │ │ │ │ -1580 │ │ │ │ │ -1581 template │ │ │ │ │ -_1_5_8_2 void _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::operator()(const _s_i_z_e___t_y_p_e& │ │ │ │ │ -domainIndex) │ │ │ │ │ -1583 { │ │ │ │ │ -1584 // add the result of the local solve to the current guess │ │ │ │ │ -1585 assigner->relaxResult(relax); │ │ │ │ │ -1586 assigner->assignResult((*x)[domainIndex]); │ │ │ │ │ -1587 } │ │ │ │ │ -1588 │ │ │ │ │ -1589 │ │ │ │ │ -1590 template │ │ │ │ │ -_1_5_9_1 void _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::axpy() │ │ │ │ │ -1592 { │ │ │ │ │ -1593 // nothing to do, as the corrections already relaxed and added in operator │ │ │ │ │ -() │ │ │ │ │ -1594 } │ │ │ │ │ -1595 │ │ │ │ │ -1596 │ │ │ │ │ -1598} │ │ │ │ │ -1599 │ │ │ │ │ -1600#endif │ │ │ │ │ -_s_u_p_e_r_l_u_._h_h │ │ │ │ │ -Classes for using SuperLU with ISTL matrices. │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ -Define general preconditioner interface. │ │ │ │ │ -_u_m_f_p_a_c_k_._h_h │ │ │ │ │ -Classes for using UMFPack with ISTL matrices. │ │ │ │ │ -_i_l_u_s_u_b_d_o_m_a_i_n_s_o_l_v_e_r_._h_h │ │ │ │ │ -Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_a_d_d_R_o_w_N_n_z │ │ │ │ │ -void addRowNnz(const Iter &row) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:895 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_a_p_p_l_y │ │ │ │ │ -void apply(X &v, const X &d) │ │ │ │ │ -Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1234 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_l_h_s │ │ │ │ │ -X & lhs() │ │ │ │ │ -Get the local left hand side. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1531 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_a_l_c_C_o_l_s_t_a_r_t │ │ │ │ │ -void calcColstart() const │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:926 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_r_h_s │ │ │ │ │ -Y & rhs() │ │ │ │ │ -Get the local right hand side. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1537 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_e_n_d │ │ │ │ │ -iterator end() │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:989 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_r_e_s_e_t_I_n_d_e_x_F_o_r_N_e_x_t_D_o_m_a_i_n │ │ │ │ │ -void resetIndexForNextDomain() │ │ │ │ │ -Resets the local index to zero. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1543 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_o_p_y_V_a_l_u_e │ │ │ │ │ -void copyValue(const Iter &row, const CIter &col) const │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:933 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_r_e_a_t_e_M_a_t_r_i_x │ │ │ │ │ -void createMatrix() const │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:947 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1003 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices, │ │ │ │ │ -const subdomain_vector &domains) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:887 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_I_n_d_e_x_M_a_p │ │ │ │ │ -IndexMap() │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:955 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &v, const X &d) │ │ │ │ │ -Apply the precondtioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1227 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ -OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X │ │ │ │ │ -&x) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1483 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_f_i_n_d │ │ │ │ │ -const_iterator find(size_type grow) const │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:968 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const size_type &domain) │ │ │ │ │ -calculate one entry of the local defect. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1503 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -SeqOverlappingSchwarz(const matrix_type &mat, const subdomain_vector │ │ │ │ │ -&subDomains, field_type relaxationFactor=1, bool onTheFly_=true) │ │ │ │ │ -Construct the overlapping Schwarz method. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1056 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ -void allocate() │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:905 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_d_e_a_l_l_o_c_a_t_e │ │ │ │ │ -void deallocate() │ │ │ │ │ -Deallocates memory of the local vector. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1496 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_i_n_s_e_r_t │ │ │ │ │ -void insert(size_type grow) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:960 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_o_u_n_t_E_n_t_r_i_e_s │ │ │ │ │ -void countEntries(const Iter &row, const CIter &col) const │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:914 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_:_:_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s │ │ │ │ │ -static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const │ │ │ │ │ -matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1198 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_r_e_l_a_x_R_e_s_u_l_t │ │ │ │ │ -void relaxResult(field_type relax) │ │ │ │ │ -relax the result. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1519 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_a_s_s_i_g_n_R_e_s_u_l_t │ │ │ │ │ -void assignResult(block_type &res) │ │ │ │ │ -Assigns the block to the current local index. At the same time the local defect │ │ │ │ │ -is calculated for the... │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1525 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector │ │ │ │ │ -&rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1009 │ │ │ │ │ +111} │ │ │ │ │ +112#endif │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_C_I_t_e_r │ │ │ │ │ -Matrix::row_type::const_iterator CIter │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_S_e_t │ │ │ │ │ -S IndexSet │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_t_e_r │ │ │ │ │ -Matrix::const_iterator Iter │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -IndexSet::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_i_t_i_a_l_i_z_e_r_L_i_s_t │ │ │ │ │ -I InitializerList │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ -AtomInitializer::Matrix Matrix │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_A_t_o_m_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -InitializerList::value_type AtomInitializer │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ -D subdomain_vector │ │ │ │ │ -The vector type containing the subdomain to row index mapping. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access and the size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::ConstIterator ConstColIterator │ │ │ │ │ -Const iterator to the entries of a row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:741 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -Exact subdomain solver using ILU(p) with appropriate p. │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn ilusubdomainsolver.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -Sequential overlapping Schwarz preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:783 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_u_b_d_o_m_a_i_n___l_i_s_t │ │ │ │ │ -SLList< size_type, typename std::allocator_traits< TA >::template rebind_alloc< │ │ │ │ │ -size_type > > subdomain_list │ │ │ │ │ -The type for the row to subdomain mapping. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:800 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_l_u___v_e_c_t_o_r │ │ │ │ │ -std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc< │ │ │ │ │ -slu > > slu_vector │ │ │ │ │ -The vector type containing subdomain solvers. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:809 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -The type of the matrix to precondition. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:760 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_M_o_d_e │ │ │ │ │ -TM Mode │ │ │ │ │ -The mode (additive or multiplicative) of the Schwarz method. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:778 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -X range_type │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x)=0 │ │ │ │ │ +Clean up. │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d)=0 │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_~_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +virtual ~Preconditioner() │ │ │ │ │ +every abstract base class has a virtual destructor │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:770 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_u_b_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -std::set< size_type, std::less< size_type >, typename std::allocator_traits< TA │ │ │ │ │ ->::template rebind_alloc< size_type > > subdomain_type │ │ │ │ │ -The type for the subdomain to row index mapping. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:794 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ X domain_type │ │ │ │ │ The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:765 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_l_u │ │ │ │ │ -TD slu │ │ │ │ │ -The type for the subdomain solver in use. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:806 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const =0 │ │ │ │ │ Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:868 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_p_r_e │ │ │ │ │ -virtual void pre(X &x, X &b) │ │ │ │ │ -Prepare the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:846 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_p_o_s_t │ │ │ │ │ -virtual void post(X &x) │ │ │ │ │ -Postprocess the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_a_l_l_o_c_a_t_o_r │ │ │ │ │ -TA allocator │ │ │ │ │ -The allocator to use. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:789 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ -std::vector< subdomain_type, typename std::allocator_traits< TA >::template │ │ │ │ │ -rebind_alloc< subdomain_type > > subdomain_vector │ │ │ │ │ -The vector type containing the subdomain to row index mapping. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:797 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ -std::vector< subdomain_list, typename std::allocator_traits< TA >::template │ │ │ │ │ -rebind_alloc< subdomain_list > > rowtodomain_vector │ │ │ │ │ -The vector type containing the row index to subdomain mapping. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:803 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -matrix_type::size_type size_type │ │ │ │ │ -The return type of the size method. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:786 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -Tag that the tells the Schwarz method to be additive. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -Tag that tells the Schwarz method to be multiplicative. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ -Tag that tells the Schwarz method to be multiplicative and symmetric. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ -Exact subdomain solver using Dune::DynamicMatrix::solve. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type matrix_type │ │ │ │ │ -The matrix type the preconditioner is for. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The domain type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The range type of the preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const M &BCRS, S &rowset) │ │ │ │ │ -Set the data of the local problem. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_a_p_p_l_y │ │ │ │ │ -void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d) │ │ │ │ │ -Apply the subdomain solver. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_r_i_l_u___t_y_p_e │ │ │ │ │ -std::remove_const< M >::type rilu_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -matrix_type::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ X::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -BCRSMatrix< K, Al > matrix_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:227 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ -_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -range_type::block_type block_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -S< BCRSMatrix< T, A > >::range_type range_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:315 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -range_type::block_type block_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:317 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -range_type::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:316 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -matrix_type::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -BCRSMatrix< T, A > matrix_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:400 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -matrix_type::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:408 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -Y::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -Y::block_type block_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:402 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_: │ │ │ │ │ -_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ -OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X │ │ │ │ │ -&x) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_: │ │ │ │ │ -_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ -OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X │ │ │ │ │ -&x) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:512 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type │ │ │ │ │ -field_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:525 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:542 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:547 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type │ │ │ │ │ -field_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:548 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ -template meta program for choosing how to add the correction. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:572 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _>_:_:_A_d_d_e_r │ │ │ │ │ -AdditiveAdder< S, X > Adder │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _>_:_:_A_d_d_e_r │ │ │ │ │ -MultiplicativeAdder< S, X > Adder │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:583 │ │ │ │ │ -_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _>_:_:_A_d_d_e_r │ │ │ │ │ -MultiplicativeAdder< S, X > Adder │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r │ │ │ │ │ -Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:605 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -static solver_iterator begin(solver_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:611 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_s_o_l_v_e_r___i_t_e_r_a_t_o_r │ │ │ │ │ -solver_vector::iterator solver_iterator │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:607 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -static domain_iterator end(const subdomain_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:625 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_d_o_m_a_i_n___i_t_e_r_a_t_o_r │ │ │ │ │ -subdomain_vector::const_iterator domain_iterator │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:609 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_s_o_l_v_e_r___v_e_c_t_o_r │ │ │ │ │ -T1 solver_vector │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:606 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -static domain_iterator begin(const subdomain_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:620 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ -T2 subdomain_vector │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:608 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -static solver_iterator end(solver_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:616 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ -T2 subdomain_vector │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:636 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_e_n_d │ │ │ │ │ -static solver_iterator end(solver_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:644 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_s_o_l_v_e_r___i_t_e_r_a_t_o_r │ │ │ │ │ -solver_vector::reverse_iterator solver_iterator │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:635 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_d_o_m_a_i_n___i_t_e_r_a_t_o_r │ │ │ │ │ -subdomain_vector::const_reverse_iterator domain_iterator │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:637 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_b_e_g_i_n │ │ │ │ │ -static solver_iterator begin(solver_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:639 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_s_o_l_v_e_r___v_e_c_t_o_r │ │ │ │ │ -T1 solver_vector │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:634 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_b_e_g_i_n │ │ │ │ │ -static domain_iterator begin(const subdomain_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:648 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_e_n_d │ │ │ │ │ -static domain_iterator end(const subdomain_vector &sv) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:653 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r │ │ │ │ │ -Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:669 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -smoother::range_type range_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:671 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_:_:_s_m_o_o_t_h_e_r │ │ │ │ │ -T smoother │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:670 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(smoother &sm, range_type &v, const range_type &b) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:673 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ -_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -static void apply(smoother &sm, range_type &v, const range_type &b) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:685 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ -_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _>_:_:_s_m_o_o_t_h_e_r │ │ │ │ │ -SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > │ │ │ │ │ -smoother │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:682 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ -_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -smoother::range_type range_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:683 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_< │ │ │ │ │ -_B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -BCRSMatrix< K, Al > matrix_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:702 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_: │ │ │ │ │ -_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -BCRSMatrix< T, A > matrix_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:713 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:723 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -M matrix_type │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:724 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1103 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_s_i_z_e │ │ │ │ │ -static int size(const Domain &d) │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:1111 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b)=0 │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ _D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ Category │ │ │ │ │ DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00158.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: ildl.hh File Reference │ │ │ │ +dune-istl: ldl.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,55 +70,66 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
ildl.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Incomplete LDL decomposition. │ │ │ │ +

Class for using LDL with ISTL matrices. │ │ │ │ More...

│ │ │ │ -
#include <dune/common/scalarvectorview.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include "ilu.hh"
│ │ │ │ +
#include <iostream>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ +#include <dune/istl/solvers.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/istl/solverfactory.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::LDL< Matrix >
 Use the LDL package to directly solve linear systems – empty default class. More...
 
class  Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > >
 The LDL direct sparse solver for matrices of type BCRSMatrix. More...
 
struct  Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
 
struct  Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
 
struct  Dune::LDLCreator
 
struct  Dune::LDLCreator::isValidBlock< F >
 
struct  Dune::LDLCreator::isValidBlock< FieldVector< double, k > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class K , int m, int n>
static void Dune::bildl_subtractBCT (const FieldMatrix< K, m, n > &B, const FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A)
 
template<class K >
static void Dune::bildl_subtractBCT (const K &B, const K &CT, K &A, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
 
template<class Matrix >
static void Dune::bildl_subtractBCT (const Matrix &B, const Matrix &CT, Matrix &A, typename std::enable_if_t<!Dune::IsNumber< Matrix >::value > *sfinae=nullptr)
 
template<class Matrix >
void Dune::bildl_decompose (Matrix &A)
 compute ILDL decomposition of a symmetric matrix A
 
template<class Matrix , class X , class Y >
void Dune::bildl_backsolve (const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
 
 Dune::DUNE_REGISTER_DIRECT_SOLVER ("ldl", Dune::LDLCreator())
 
│ │ │ │

Detailed Description

│ │ │ │ -

Incomplete LDL decomposition.

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

Class for using LDL with ISTL matrices.

│ │ │ │ +
Author
Marco Agnese, Andrea Sacconi
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,50 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -ildl.hh File Reference │ │ │ │ │ -Incomplete LDL decomposition. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_l_u_._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 │ │ │ │ │ +ldl.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ +Class for using LDL with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ + class   _D_u_n_e_:_:_L_D_L_<_ _M_a_t_r_i_x_ _> │ │ │ │ │ +  Use the LDL package to directly solve linear systems – empty default │ │ │ │ │ + class. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _> │ │ │ │ │ +  The LDL direct sparse solver for matrices of type _B_C_R_S_M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_, │ │ │ │ │ + _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _d_o_u_b_l_e_,_ _k_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T (const _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &B, const │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &CT, _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &A) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T (const K &B, const K &CT, K &A, typename │ │ │ │ │ - std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static void  _D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T (const _M_a_t_r_i_x &B, const _M_a_t_r_i_x &CT, _M_a_t_r_i_x │ │ │ │ │ - &A, typename std::enable_if_t::value > │ │ │ │ │ - *sfinae=nullptr) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_b_i_l_d_l___d_e_c_o_m_p_o_s_e (_M_a_t_r_i_x &A) │ │ │ │ │ -  compute ILDL decomposition of a symmetric matrix A │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_b_i_l_d_l___b_a_c_k_s_o_l_v_e (const _M_a_t_r_i_x &A, X &v, const Y &d, bool │ │ │ │ │ - isLowerTriangular=false) │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("ldl", _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r()) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Incomplete LDL decomposition. │ │ │ │ │ +Class for using LDL with ISTL matrices. │ │ │ │ │ Author │ │ │ │ │ - Martin Nolte │ │ │ │ │ + Marco Agnese, Andrea Sacconi │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html │ │ │ │ @@ -21,2537 +21,4947 @@ │ │ │ │ 00000140: 2267 656e 6572 6174 6f72 2220 636f 6e74 "generator" cont │ │ │ │ 00000150: 656e 743d 2244 6f78 7967 656e 2031 2e39 ent="Doxygen 1.9 │ │ │ │ 00000160: 2e38 222f 3e0a 3c6d 6574 6120 6e61 6d65 .8"/>..dune-istl: il │ │ │ │ -000001c0: 646c 2e68 6820 536f 7572 6365 2046 696c dl.hh Source Fil │ │ │ │ -000001d0: 653c 2f74 6974 6c65 3e0a 3c6c 696e 6b20 e... │ │ │ │ -00000280: 3c2f 7363 7269 7074 3e0a 3c6c 696e 6b20 ... │ │ │ │ -00000310: 3c73 6372 6970 7420 7479 7065 3d22 7465 . │ │ │ │ -00000350: 3c6c 696e 6b20 6872 6566 3d22 646f 7879 ...
.
. │ │ │ │ -00000420: 0a20 3c74 626f 6479 3e0a 203c 7472 2069 . . . │ │ │ │ -00000440: 2020 3c74 6420 6964 3d22 7072 6f6a 6563 . . │ │ │ │ -000004c0: 203c 2f74 626f 6479 3e0a 3c2f 7461 626c .....< │ │ │ │ -00000630: 7363 7269 7074 2074 7970 653d 2274 6578 script type="tex │ │ │ │ -00000640: 742f 6a61 7661 7363 7269 7074 2220 7372 t/javascript" sr │ │ │ │ -00000650: 633d 226d 656e 752e 6a73 223e 3c2f 7363 c="menu.js">.. │ │ │ │
│ │ │ │ │ │ │ │ -

Implementation of the BDMatrix class. │ │ │ │ +

Classes for using SuperLU with ISTL matrices. │ │ │ │ More...

│ │ │ │ -
#include <memory>
│ │ │ │ -#include <dune/common/rangeutilities.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ +
#include "superlufunctions.hh"
│ │ │ │ +#include "solvers.hh"
│ │ │ │ +#include "supermatrix.hh"
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <functional>
│ │ │ │ +#include "bcrsmatrix.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/istl/solverfactory.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │
.
dune-istl 2.9.0< │ │ │ │ -000004a0: 2f73 7061 6e3e 0a20 2020 3c2f 6469 763e /span>.
│ │ │ │ -000004b0: 0a20 203c 2f74 643e 0a20 3c2f 7472 3e0a .
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::BDMatrix< B, A >
 A block-diagonal matrix. More...
struct  Dune::SuperLUSolveChooser< T >
 
struct  Dune::FieldTraits< BDMatrix< B, A > >
struct  Dune::SuperLUDenseMatChooser< T >
 
struct  Dune::SuperLUQueryChooser< T >
 
struct  Dune::QuerySpaceChooser< T >
 
class  Dune::SuperLU< M >
 SuperLu Solver. More...
 
struct  Dune::IsDirectSolver< SuperLU< BCRSMatrix< T, A > > >
 
struct  Dune::StoresColumnCompressed< SuperLU< BCRSMatrix< T, A > > >
 
struct  Dune::SuperLUCreator
 
struct  Dune::SuperLUCreator::isValidBlock< class >
 
struct  Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< double, k > >
 
struct  Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< std::complex< double >, k > >
 
struct  Dune::SuperLUCreator::isValidBlock< double >
 
struct  Dune::SuperLUCreator::isValidBlock< std::complex< double > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("superlu", SuperLUCreator())
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implementation of the BDMatrix class.

│ │ │ │ -
Author
Oliver Sander
│ │ │ │ +

Classes for using SuperLU with ISTL matrices.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,30 +1,65 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -bdmatrix.hh File Reference │ │ │ │ │ -Implementation of the BDMatrix class. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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 │ │ │ │ │ +superlu.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ +Classes for using SuperLU with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ +#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ +#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ +#include "_s_u_p_e_r_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _> │ │ │ │ │ -  A block-diagonal matrix. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_Q_u_e_r_y_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_Q_u_e_r_y_S_p_a_c_e_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_S_u_p_e_r_L_U_<_ _M_ _> │ │ │ │ │ +  SuperLu Solver. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _S_u_p_e_r_L_U_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _S_u_p_e_r_L_U_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _c_l_a_s_s_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_ _d_o_u_b_l_e_,_ _k_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_< │ │ │ │ │ + _d_o_u_b_l_e_ _>_,_ _k_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _d_o_u_b_l_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("superlu", _S_u_p_e_r_L_U_C_r_e_a_t_o_r()) │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implementation of the BDMatrix class. │ │ │ │ │ +Classes for using SuperLU with ISTL matrices. │ │ │ │ │ Author │ │ │ │ │ - Oliver Sander │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bdmatrix.hh Source File │ │ │ │ +dune-istl: superlu.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,189 +74,833 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
bdmatrix.hh
│ │ │ │ +
superlu.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_BDMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_BDMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_SUPERLU_HH
│ │ │ │ +
6#define DUNE_ISTL_SUPERLU_HH
│ │ │ │
7
│ │ │ │ -
8#include <memory>
│ │ │ │ +
8#if HAVE_SUPERLU
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/rangeutilities.hh>
│ │ │ │ -
11#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
31 template <class B, class A=std::allocator<B> >
│ │ │ │ -
│ │ │ │ -
32 class BDMatrix : public BCRSMatrix<B,A>
│ │ │ │ -
33 {
│ │ │ │ -
34 public:
│ │ │ │ -
35
│ │ │ │ -
36 //===== type definitions and constants
│ │ │ │ -
37
│ │ │ │ -
39 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
40
│ │ │ │ -
42 typedef B block_type;
│ │ │ │ -
43
│ │ │ │ -
45 typedef A allocator_type;
│ │ │ │ +
10#include "superlufunctions.hh"
│ │ │ │ +
11#include "solvers.hh"
│ │ │ │ +
12#include "supermatrix.hh"
│ │ │ │ +
13#include <algorithm>
│ │ │ │ +
14#include <functional>
│ │ │ │ +
15#include "bcrsmatrix.hh"
│ │ │ │ +
16#include "bvector.hh"
│ │ │ │ +
17#include "istlexception.hh"
│ │ │ │ +
18#include <dune/common/fmatrix.hh>
│ │ │ │ +
19#include <dune/common/fvector.hh>
│ │ │ │ +
20#include <dune/common/stdstreams.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24namespace Dune
│ │ │ │ +
25{
│ │ │ │ +
26
│ │ │ │ +
37 template<class M, class T, class TM, class TD, class TA>
│ │ │ │ +
38 class SeqOverlappingSchwarz;
│ │ │ │ +
39
│ │ │ │ +
40 template<class T, bool tag>
│ │ │ │ +
41 struct SeqOverlappingSchwarzAssemblerHelper;
│ │ │ │ +
42
│ │ │ │ +
43 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
45 {};
│ │ │ │ +
│ │ │ │
46
│ │ │ │ -
48 //typedef BCRSMatrix<B,A>::row_type row_type;
│ │ │ │ -
49
│ │ │ │ -
51 typedef typename A::size_type size_type;
│ │ │ │ -
52
│ │ │ │ -
54 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
55 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ -
56
│ │ │ │ -
58 BDMatrix() : BCRSMatrix<B,A>() {}
│ │ │ │ -
59
│ │ │ │ -
│ │ │ │ -
60 explicit BDMatrix(int size)
│ │ │ │ -
61 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random) {
│ │ │ │ -
62
│ │ │ │ -
63 for (int i=0; i<size; i++)
│ │ │ │ - │ │ │ │ -
65
│ │ │ │ - │ │ │ │ +
47 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
49 {};
│ │ │ │ +
│ │ │ │ +
50
│ │ │ │ +
51 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
53 {};
│ │ │ │ +
│ │ │ │ +
54
│ │ │ │ +
55 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
57 {};
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
59#if __has_include("slu_sdefs.h")
│ │ │ │ +
60 template<>
│ │ │ │ +
61 struct SuperLUDenseMatChooser<float>
│ │ │ │ +
62 {
│ │ │ │ +
63 static void create(SuperMatrix *mat, int n, int m, float *dat, int n1,
│ │ │ │ +
64 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
65 {
│ │ │ │ +
66 sCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
│ │ │ │
67
│ │ │ │ -
68 for (int i=0; i<size; i++)
│ │ │ │ -
69 this->BCRSMatrix<B,A>::addindex(i, i);
│ │ │ │ -
70
│ │ │ │ - │ │ │ │ +
68 }
│ │ │ │ +
69
│ │ │ │ +
70 static void destroy(SuperMatrix*)
│ │ │ │ +
71 {}
│ │ │ │
72
│ │ │ │ -
73 }
│ │ │ │ -
│ │ │ │ -
74
│ │ │ │ -
│ │ │ │ -
76 BDMatrix (std::initializer_list<B> const &list)
│ │ │ │ -
77 : BDMatrix(list.size())
│ │ │ │ -
78 {
│ │ │ │ -
79 size_t i=0;
│ │ │ │ -
80 for (auto it = list.begin(); it != list.end(); ++it, ++i)
│ │ │ │ -
81 (*this)[i][i] = *it;
│ │ │ │ -
82 }
│ │ │ │ -
│ │ │ │ -
83
│ │ │ │ -
│ │ │ │ -
85 void setSize(size_type size)
│ │ │ │ -
86 {
│ │ │ │ -
87 this->BCRSMatrix<B,A>::setSize(size, // rows
│ │ │ │ -
88 size, // columns
│ │ │ │ -
89 size); // nonzeros
│ │ │ │ -
90
│ │ │ │ -
91 for (auto i : range(size))
│ │ │ │ - │ │ │ │ -
93
│ │ │ │ - │ │ │ │ -
95
│ │ │ │ -
96 for (auto i : range(size))
│ │ │ │ -
97 this->BCRSMatrix<B,A>::addindex(i, i);
│ │ │ │ +
73 };
│ │ │ │ +
74 template<>
│ │ │ │ +
75 struct SuperLUSolveChooser<float>
│ │ │ │ +
76 {
│ │ │ │ +
77 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ +
78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ +
79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ +
80 float *rpg, float *rcond, float *ferr, float *berr,
│ │ │ │ +
81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ +
82 {
│ │ │ │ +
83 GlobalLU_t gLU;
│ │ │ │ +
84 sgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ +
85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ +
86 &gLU, memusage, stat, info);
│ │ │ │ +
87 }
│ │ │ │ +
88 };
│ │ │ │ +
89
│ │ │ │ +
90 template<>
│ │ │ │ +
91 struct QuerySpaceChooser<float>
│ │ │ │ +
92 {
│ │ │ │ +
93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ +
94 {
│ │ │ │ +
95 sQuerySpace(L,U,memusage);
│ │ │ │ +
96 }
│ │ │ │ +
97 };
│ │ │ │
98
│ │ │ │ - │ │ │ │ -
100 }
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
│ │ │ │ -
103 BDMatrix& operator= (const BDMatrix& other) {
│ │ │ │ -
104 this->BCRSMatrix<B,A>::operator=(other);
│ │ │ │ -
105 return *this;
│ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ -
107
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
111 return *this;
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113
│ │ │ │ -
119 template <class V>
│ │ │ │ -
│ │ │ │ -
120 void solve (V& x, const V& rhs) const {
│ │ │ │ -
121 for (size_type i=0; i<this->N(); i++)
│ │ │ │ -
122 {
│ │ │ │ -
123 auto&& xv = Impl::asVector(x[i]);
│ │ │ │ -
124 auto&& rhsv = Impl::asVector(rhs[i]);
│ │ │ │ -
125 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv);
│ │ │ │ -
126 }
│ │ │ │ -
127 }
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
│ │ │ │ -
130 void invert() {
│ │ │ │ -
131 for (size_type i=0; i<this->N(); i++)
│ │ │ │ -
132 Impl::asMatrix((*this)[i][i]).invert();
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
135 private:
│ │ │ │ -
136
│ │ │ │ -
137 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ -
138 // The following methods from the base class should now actually be called
│ │ │ │ -
139 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ -
140
│ │ │ │ -
141 // createbegin and createend should be in there, too, but I can't get it to compile
│ │ │ │ -
142 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
│ │ │ │ -
143 // BCRSMatrix<B,A>::CreateIterator createend () {}
│ │ │ │ -
144 void setrowsize (size_type i, size_type s) {}
│ │ │ │ -
145 void incrementrowsize (size_type i) {}
│ │ │ │ -
146 void endrowsizes () {}
│ │ │ │ -
147 void addindex (size_type row, size_type col) {}
│ │ │ │ -
148 void endindices () {}
│ │ │ │ -
149 };
│ │ │ │ -
│ │ │ │ +
99#endif
│ │ │ │ +
100
│ │ │ │ +
101#if __has_include("slu_ddefs.h")
│ │ │ │ +
102
│ │ │ │ +
103 template<>
│ │ │ │ +
104 struct SuperLUDenseMatChooser<double>
│ │ │ │ +
105 {
│ │ │ │ +
106 static void create(SuperMatrix *mat, int n, int m, double *dat, int n1,
│ │ │ │ +
107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
108 {
│ │ │ │ +
109 dCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
│ │ │ │ +
110
│ │ │ │ +
111 }
│ │ │ │ +
112
│ │ │ │ +
113 static void destroy(SuperMatrix * /* mat */)
│ │ │ │ +
114 {}
│ │ │ │ +
115 };
│ │ │ │ +
116 template<>
│ │ │ │ +
117 struct SuperLUSolveChooser<double>
│ │ │ │ +
118 {
│ │ │ │ +
119 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ +
120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ +
121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ +
122 double *rpg, double *rcond, double *ferr, double *berr,
│ │ │ │ +
123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ +
124 {
│ │ │ │ +
125 GlobalLU_t gLU;
│ │ │ │ +
126 dgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ +
127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ +
128 &gLU, memusage, stat, info);
│ │ │ │ +
129 }
│ │ │ │ +
130 };
│ │ │ │ +
131
│ │ │ │ +
132 template<>
│ │ │ │ +
133 struct QuerySpaceChooser<double>
│ │ │ │ +
134 {
│ │ │ │ +
135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ +
136 {
│ │ │ │ +
137 dQuerySpace(L,U,memusage);
│ │ │ │ +
138 }
│ │ │ │ +
139 };
│ │ │ │ +
140#endif
│ │ │ │ +
141
│ │ │ │ +
142#if __has_include("slu_zdefs.h")
│ │ │ │ +
143 template<>
│ │ │ │ +
144 struct SuperLUDenseMatChooser<std::complex<double> >
│ │ │ │ +
145 {
│ │ │ │ +
146 static void create(SuperMatrix *mat, int n, int m, std::complex<double> *dat, int n1,
│ │ │ │ +
147 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
148 {
│ │ │ │ +
149 zCreate_Dense_Matrix(mat, n, m, reinterpret_cast<doublecomplex*>(dat), n1, stype, dtype, mtype);
│ │ │ │
150
│ │ │ │ -
151 template<typename B, typename A>
│ │ │ │ -
│ │ │ │ -
152 struct FieldTraits< BDMatrix<B, A> >
│ │ │ │ -
153 {
│ │ │ │ - │ │ │ │ -
155 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
156 };
│ │ │ │ -
│ │ │ │ -
159} // end namespace Dune
│ │ │ │ -
160
│ │ │ │ -
161#endif
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
151 }
│ │ │ │ +
152
│ │ │ │ +
153 static void destroy(SuperMatrix*)
│ │ │ │ +
154 {}
│ │ │ │ +
155 };
│ │ │ │ +
156
│ │ │ │ +
157 template<>
│ │ │ │ +
158 struct SuperLUSolveChooser<std::complex<double> >
│ │ │ │ +
159 {
│ │ │ │ +
160 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ +
161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ +
162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ +
163 double *rpg, double *rcond, double *ferr, double *berr,
│ │ │ │ +
164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ +
165 {
│ │ │ │ +
166 GlobalLU_t gLU;
│ │ │ │ +
167 zgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ +
168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ +
169 &gLU, memusage, stat, info);
│ │ │ │ +
170 }
│ │ │ │ +
171 };
│ │ │ │ +
172
│ │ │ │ +
173 template<>
│ │ │ │ +
174 struct QuerySpaceChooser<std::complex<double> >
│ │ │ │ +
175 {
│ │ │ │ +
176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ +
177 {
│ │ │ │ +
178 zQuerySpace(L,U,memusage);
│ │ │ │ +
179 }
│ │ │ │ +
180 };
│ │ │ │ +
181#endif
│ │ │ │ +
182
│ │ │ │ +
183#if __has_include("slu_cdefs.h")
│ │ │ │ +
184 template<>
│ │ │ │ +
185 struct SuperLUDenseMatChooser<std::complex<float> >
│ │ │ │ +
186 {
│ │ │ │ +
187 static void create(SuperMatrix *mat, int n, int m, std::complex<float> *dat, int n1,
│ │ │ │ +
188 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
189 {
│ │ │ │ +
190 cCreate_Dense_Matrix(mat, n, m, reinterpret_cast< ::complex*>(dat), n1, stype, dtype, mtype);
│ │ │ │ +
191
│ │ │ │ +
192 }
│ │ │ │ +
193
│ │ │ │ +
194 static void destroy(SuperMatrix* /* mat */)
│ │ │ │ +
195 {}
│ │ │ │ +
196 };
│ │ │ │ +
197
│ │ │ │ +
198 template<>
│ │ │ │ +
199 struct SuperLUSolveChooser<std::complex<float> >
│ │ │ │ +
200 {
│ │ │ │ +
201 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
│ │ │ │ +
202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
│ │ │ │ +
203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
│ │ │ │ +
204 float *rpg, float *rcond, float *ferr, float *berr,
│ │ │ │ +
205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
│ │ │ │ +
206 {
│ │ │ │ +
207 GlobalLU_t gLU;
│ │ │ │ +
208 cgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
│ │ │ │ +
209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
│ │ │ │ +
210 &gLU, memusage, stat, info);
│ │ │ │ +
211 }
│ │ │ │ +
212 };
│ │ │ │ +
213
│ │ │ │ +
214 template<>
│ │ │ │ +
215 struct QuerySpaceChooser<std::complex<float> >
│ │ │ │ +
216 {
│ │ │ │ +
217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
│ │ │ │ +
218 {
│ │ │ │ +
219 cQuerySpace(L,U,memusage);
│ │ │ │ +
220 }
│ │ │ │ +
221 };
│ │ │ │ +
222#endif
│ │ │ │ +
223
│ │ │ │ +
224 namespace Impl
│ │ │ │ +
225 {
│ │ │ │ +
226 template<class M>
│ │ │ │ +
227 struct SuperLUVectorChooser
│ │ │ │ +
228 {};
│ │ │ │ +
229
│ │ │ │ +
230 template<typename T, typename A, int n, int m>
│ │ │ │ +
231 struct SuperLUVectorChooser<BCRSMatrix<FieldMatrix<T,n,m>,A > >
│ │ │ │ +
232 {
│ │ │ │ +
234 using domain_type = BlockVector<
│ │ │ │ +
235 FieldVector<T,m>,
│ │ │ │ +
236 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >;
│ │ │ │ +
238 using range_type = BlockVector<
│ │ │ │ +
239 FieldVector<T,n>,
│ │ │ │ +
240 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > >;
│ │ │ │ +
241 };
│ │ │ │ +
242
│ │ │ │ +
243 template<typename T, typename A>
│ │ │ │ +
244 struct SuperLUVectorChooser<BCRSMatrix<T,A> >
│ │ │ │ +
245 {
│ │ │ │ +
247 using domain_type = BlockVector<T, A>;
│ │ │ │ +
249 using range_type = BlockVector<T, A>;
│ │ │ │ +
250 };
│ │ │ │ +
251 }
│ │ │ │ +
252
│ │ │ │ +
266 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
268 : public InverseOperator<
│ │ │ │ +
269 typename Impl::SuperLUVectorChooser<M>::domain_type,
│ │ │ │ +
270 typename Impl::SuperLUVectorChooser<M>::range_type >
│ │ │ │ +
271 {
│ │ │ │ +
272 using T = typename M::field_type;
│ │ │ │ +
273 public:
│ │ │ │ +
275 using Matrix = M;
│ │ │ │ +
276 using matrix_type = M;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
282 using domain_type = typename Impl::SuperLUVectorChooser<M>::domain_type;
│ │ │ │ +
284 using range_type = typename Impl::SuperLUVectorChooser<M>::range_type;
│ │ │ │ +
285
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
288 {
│ │ │ │ + │ │ │ │ +
290 }
│ │ │ │ +
│ │ │ │ +
291
│ │ │ │ +
306 explicit SuperLU(const Matrix& mat, bool verbose=false,
│ │ │ │ +
307 bool reusevector=true);
│ │ │ │ +
308
│ │ │ │ +
309
│ │ │ │ +
│ │ │ │ +
320 SuperLU(const Matrix& mat, const ParameterTree& config)
│ │ │ │ +
321 : SuperLU(mat, config.get<bool>("verbose", false), config.get<bool>("reuseVector", true))
│ │ │ │ +
322 {}
│ │ │ │ +
│ │ │ │ +
323
│ │ │ │ +
330 SuperLU();
│ │ │ │ +
331
│ │ │ │ +
332 ~SuperLU();
│ │ │ │ +
333
│ │ │ │ + │ │ │ │ +
338
│ │ │ │ +
│ │ │ │ +
342 void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ +
343 {
│ │ │ │ +
344 apply(x,b,res);
│ │ │ │ +
345 }
│ │ │ │ +
│ │ │ │ +
346
│ │ │ │ +
350 void apply(T* x, T* b);
│ │ │ │ +
351
│ │ │ │ +
353 void setMatrix(const Matrix& mat);
│ │ │ │ +
354
│ │ │ │ +
│ │ │ │ +
355 typename SuperLUMatrix::size_type nnz() const
│ │ │ │ +
356 {
│ │ │ │ +
357 return mat.nonzeroes();
│ │ │ │ +
358 }
│ │ │ │ +
│ │ │ │ +
359
│ │ │ │ +
360 template<class S>
│ │ │ │ +
361 void setSubMatrix(const Matrix& mat, const S& rowIndexSet);
│ │ │ │ +
362
│ │ │ │ +
363 void setVerbosity(bool v);
│ │ │ │ +
364
│ │ │ │ +
369 void free();
│ │ │ │ +
370
│ │ │ │ +
371 const char* name() { return "SuperLU"; }
│ │ │ │ +
372 private:
│ │ │ │ +
373 template<class Mat,class X, class TM, class TD, class T1>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
376
│ │ │ │ +
377 SuperLUMatrix& getInternalMatrix() { return mat; }
│ │ │ │ +
378
│ │ │ │ +
380 void decompose();
│ │ │ │ +
381
│ │ │ │ + │ │ │ │ +
383 SuperMatrix L, U, B, X;
│ │ │ │ +
384 int *perm_c, *perm_r, *etree;
│ │ │ │ +
385 typename GetSuperLUType<T>::float_type *R, *C;
│ │ │ │ +
386 T *bstore;
│ │ │ │ +
387 superlu_options_t options;
│ │ │ │ +
388 char equed;
│ │ │ │ +
389 void *work;
│ │ │ │ +
390 int lwork;
│ │ │ │ +
391 bool first, verbose, reusevector;
│ │ │ │ +
392 };
│ │ │ │ +
│ │ │ │ +
393
│ │ │ │ +
394 template<typename M>
│ │ │ │ +
395 SuperLU<M>
│ │ │ │ +
│ │ │ │ +
396 ::~SuperLU()
│ │ │ │ +
397 {
│ │ │ │ +
398 if(mat.N()+mat.M()>0)
│ │ │ │ +
399 free();
│ │ │ │ +
400 }
│ │ │ │ +
│ │ │ │ +
401
│ │ │ │ +
402 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
404 {
│ │ │ │ +
405 delete[] perm_c;
│ │ │ │ +
406 delete[] perm_r;
│ │ │ │ +
407 delete[] etree;
│ │ │ │ +
408 delete[] R;
│ │ │ │ +
409 delete[] C;
│ │ │ │ +
410 if(lwork>=0) {
│ │ │ │ +
411 Destroy_SuperNode_Matrix(&L);
│ │ │ │ +
412 Destroy_CompCol_Matrix(&U);
│ │ │ │ +
413 }
│ │ │ │ +
414 lwork=0;
│ │ │ │ +
415 if(!first && reusevector) {
│ │ │ │ +
416 SUPERLU_FREE(B.Store);
│ │ │ │ +
417 SUPERLU_FREE(X.Store);
│ │ │ │ +
418 }
│ │ │ │ +
419 mat.free();
│ │ │ │ +
420 }
│ │ │ │ +
│ │ │ │ +
421
│ │ │ │ +
422 template<typename M>
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
424 ::SuperLU(const Matrix& mat_, bool verbose_, bool reusevector_)
│ │ │ │ +
425 : work(0), lwork(0), first(true), verbose(verbose_),
│ │ │ │ +
426 reusevector(reusevector_)
│ │ │ │ +
427 {
│ │ │ │ +
428 setMatrix(mat_);
│ │ │ │ +
429
│ │ │ │ +
430 }
│ │ │ │ +
│ │ │ │ +
431 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
433 : work(0), lwork(0),verbose(false),
│ │ │ │ +
434 reusevector(false)
│ │ │ │ +
435 {}
│ │ │ │ +
│ │ │ │ +
436 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
438 {
│ │ │ │ +
439 verbose=v;
│ │ │ │ +
440 }
│ │ │ │ +
│ │ │ │ +
441
│ │ │ │ +
442 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
444 {
│ │ │ │ +
445 if(mat.N()+mat.M()>0) {
│ │ │ │ +
446 free();
│ │ │ │ +
447 }
│ │ │ │ +
448 lwork=0;
│ │ │ │ +
449 work=0;
│ │ │ │ +
450 //a=&mat_;
│ │ │ │ +
451 mat=mat_;
│ │ │ │ +
452 decompose();
│ │ │ │ +
453 }
│ │ │ │ +
│ │ │ │ +
454
│ │ │ │ +
455 template<typename M>
│ │ │ │ +
456 template<class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
458 const S& mrs)
│ │ │ │ +
459 {
│ │ │ │ +
460 if(mat.N()+mat.M()>0) {
│ │ │ │ +
461 free();
│ │ │ │ +
462 }
│ │ │ │ +
463 lwork=0;
│ │ │ │ +
464 work=0;
│ │ │ │ +
465 //a=&mat_;
│ │ │ │ +
466 mat.setMatrix(mat_,mrs);
│ │ │ │ +
467 decompose();
│ │ │ │ +
468 }
│ │ │ │ +
│ │ │ │ +
469
│ │ │ │ +
470 template<typename M>
│ │ │ │ + │ │ │ │ +
472 {
│ │ │ │ +
473
│ │ │ │ +
474 first = true;
│ │ │ │ +
475 perm_c = new int[mat.M()];
│ │ │ │ +
476 perm_r = new int[mat.N()];
│ │ │ │ +
477 etree = new int[mat.M()];
│ │ │ │ +
478 R = new typename GetSuperLUType<T>::float_type[mat.N()];
│ │ │ │ +
479 C = new typename GetSuperLUType<T>::float_type[mat.M()];
│ │ │ │ +
480
│ │ │ │ +
481 set_default_options(&options);
│ │ │ │ +
482 // Do the factorization
│ │ │ │ +
483 B.ncol=0;
│ │ │ │ +
484 B.Stype=SLU_DN;
│ │ │ │ + │ │ │ │ +
486 B.Mtype= SLU_GE;
│ │ │ │ +
487 DNformat fakeFormat;
│ │ │ │ +
488 fakeFormat.lda=mat.N();
│ │ │ │ +
489 B.Store=&fakeFormat;
│ │ │ │ +
490 X.Stype=SLU_DN;
│ │ │ │ + │ │ │ │ +
492 X.Mtype= SLU_GE;
│ │ │ │ +
493 X.ncol=0;
│ │ │ │ +
494 X.Store=&fakeFormat;
│ │ │ │ +
495
│ │ │ │ +
496 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr=1e10;
│ │ │ │ +
497 int info;
│ │ │ │ +
498 mem_usage_t memusage;
│ │ │ │ +
499 SuperLUStat_t stat;
│ │ │ │ +
500
│ │ │ │ +
501 StatInit(&stat);
│ │ │ │ +
502 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
│ │ │ │ +
503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,
│ │ │ │ +
504 &berr, &memusage, &stat, &info);
│ │ │ │ +
505
│ │ │ │ +
506 if(verbose) {
│ │ │ │ +
507 dinfo<<"LU factorization: dgssvx() returns info "<< info<<std::endl;
│ │ │ │ +
508
│ │ │ │ +
509 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
│ │ │ │ +
510
│ │ │ │ +
511 if ( info == 0 || info == nSuperLUCol+1 ) {
│ │ │ │ +
512
│ │ │ │ +
513 if ( options.PivotGrowth )
│ │ │ │ +
514 dinfo<<"Recip. pivot growth = "<<rpg<<std::endl;
│ │ │ │ +
515 if ( options.ConditionNumber )
│ │ │ │ +
516 dinfo<<"Recip. condition number = %e\n"<< rcond<<std::endl;
│ │ │ │ +
517 SCformat* Lstore = (SCformat *) L.Store;
│ │ │ │ +
518 NCformat* Ustore = (NCformat *) U.Store;
│ │ │ │ +
519 dinfo<<"No of nonzeros in factor L = "<< Lstore->nnz<<std::endl;
│ │ │ │ +
520 dinfo<<"No of nonzeros in factor U = "<< Ustore->nnz<<std::endl;
│ │ │ │ +
521 dinfo<<"No of nonzeros in L+U = "<< Lstore->nnz + Ustore->nnz - nSuperLUCol<<std::endl;
│ │ │ │ +
522 QuerySpaceChooser<T>::querySpace(&L, &U, &memusage);
│ │ │ │ +
523 dinfo<<"L\\U MB "<<memusage.for_lu/1e6<<" \ttotal MB needed "<<memusage.total_needed/1e6
│ │ │ │ +
524 <<" \texpansions ";
│ │ │ │ +
525 std::cout<<stat.expansions<<std::endl;
│ │ │ │ +
526
│ │ │ │ +
527 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
│ │ │ │ +
528 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<std::endl;
│ │ │ │ +
529 }
│ │ │ │ +
530 if ( options.PrintStat ) StatPrint(&stat);
│ │ │ │ +
531 }
│ │ │ │ +
532 StatFree(&stat);
│ │ │ │ +
533 /*
│ │ │ │ +
534 NCformat* Ustore = (NCformat *) U.Store;
│ │ │ │ +
535 int k=0;
│ │ │ │ +
536 dPrint_CompCol_Matrix("U", &U);
│ │ │ │ +
537 for(int i=0; i < U.ncol; ++i, ++k){
│ │ │ │ +
538 std::cout<<i<<": ";
│ │ │ │ +
539 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
│ │ │ │ +
540 //if(Ustore->rowind[c]==i)
│ │ │ │ +
541 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
│ │ │ │ +
542 if(k==0){
│ │ │ │ +
543 //
│ │ │ │ +
544 k=-1;
│ │ │ │ +
545 }std::cout<<std::endl;
│ │ │ │ +
546 }
│ │ │ │ +
547 dPrint_SuperNode_Matrix("L", &L);
│ │ │ │ +
548 for(int i=0; i < U.ncol; ++i, ++k){
│ │ │ │ +
549 std::cout<<i<<": ";
│ │ │ │ +
550 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
│ │ │ │ +
551 //if(Ustore->rowind[c]==i)
│ │ │ │ +
552 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
│ │ │ │ +
553 if(k==0){
│ │ │ │ +
554 //
│ │ │ │ +
555 k=-1;
│ │ │ │ +
556 }std::cout<<std::endl;
│ │ │ │ +
557 } */
│ │ │ │ +
558 options.Fact = FACTORED;
│ │ │ │ +
559 }
│ │ │ │ +
560
│ │ │ │ +
561 template<typename M>
│ │ │ │ +
562 void SuperLU<M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
564 {
│ │ │ │ +
565 if (mat.N() != b.dim())
│ │ │ │ +
566 DUNE_THROW(ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
│ │ │ │ +
567 if (mat.M() != x.dim())
│ │ │ │ +
568 DUNE_THROW(ISTLError, "Size of solution vector x does not match the number of matrix columns!");
│ │ │ │ +
569 if (mat.M()+mat.N()==0)
│ │ │ │ +
570 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
│ │ │ │ +
571
│ │ │ │ +
572 SuperMatrix* mB = &B;
│ │ │ │ +
573 SuperMatrix* mX = &X;
│ │ │ │ +
574 SuperMatrix rB, rX;
│ │ │ │ +
575 if (reusevector) {
│ │ │ │ +
576 if(first) {
│ │ │ │ +
577 SuperLUDenseMatChooser<T>::create(&B, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
578 SuperLUDenseMatChooser<T>::create(&X, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
579 first=false;
│ │ │ │ +
580 }else{
│ │ │ │ +
581 ((DNformat*)B.Store)->nzval=&b[0];
│ │ │ │ +
582 ((DNformat*)X.Store)->nzval=&x[0];
│ │ │ │ +
583 }
│ │ │ │ +
584 } else {
│ │ │ │ +
585 SuperLUDenseMatChooser<T>::create(&rB, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
586 SuperLUDenseMatChooser<T>::create(&rX, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
587 mB = &rB;
│ │ │ │ +
588 mX = &rX;
│ │ │ │ +
589 }
│ │ │ │ +
590 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
│ │ │ │ +
591 int info;
│ │ │ │ +
592 mem_usage_t memusage;
│ │ │ │ +
593 SuperLUStat_t stat;
│ │ │ │ +
594 /* Initialize the statistics variables. */
│ │ │ │ +
595 StatInit(&stat);
│ │ │ │ +
596 /*
│ │ │ │ +
597 range_type d=b;
│ │ │ │ +
598 a->usmv(-1, x, d);
│ │ │ │ +
599
│ │ │ │ +
600 double def0=d.two_norm();
│ │ │ │ +
601 */
│ │ │ │ +
602 options.IterRefine=SLU_DOUBLE;
│ │ │ │ +
603
│ │ │ │ +
604 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
│ │ │ │ +
605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
│ │ │ │ +
606 &memusage, &stat, &info);
│ │ │ │ +
607
│ │ │ │ +
608 res.iterations=1;
│ │ │ │ +
609
│ │ │ │ +
610 /*
│ │ │ │ +
611 if(options.Equil==YES)
│ │ │ │ +
612 // undo scaling of right hand side
│ │ │ │ +
613 std::transform(reinterpret_cast<T*>(&b[0]),reinterpret_cast<T*>(&b[0])+mat.M(),
│ │ │ │ +
614 C, reinterpret_cast<T*>(&d[0]), std::divides<T>());
│ │ │ │ +
615 else
│ │ │ │ +
616 d=b;
│ │ │ │ +
617 a->usmv(-1, x, d);
│ │ │ │ +
618 res.reduction=d.two_norm()/def0;
│ │ │ │ +
619 res.conv_rate = res.reduction;
│ │ │ │ +
620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);
│ │ │ │ +
621 */
│ │ │ │ +
622 res.converged=true;
│ │ │ │ +
623
│ │ │ │ +
624 if(verbose) {
│ │ │ │ +
625
│ │ │ │ +
626 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
│ │ │ │ +
627
│ │ │ │ +
628 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
│ │ │ │ +
629
│ │ │ │ +
630 if ( info == 0 || info == nSuperLUCol+1 ) {
│ │ │ │ +
631
│ │ │ │ +
632 if ( options.IterRefine ) {
│ │ │ │ +
633 std::cout<<"Iterative Refinement: steps="
│ │ │ │ +
634 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ +
635 }else
│ │ │ │ +
636 std::cout<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ +
637 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
│ │ │ │ +
638 std::cout<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
│ │ │ │ +
639 }
│ │ │ │ +
640
│ │ │ │ +
641 if ( options.PrintStat ) StatPrint(&stat);
│ │ │ │ +
642 }
│ │ │ │ +
643 StatFree(&stat);
│ │ │ │ +
644 if (!reusevector) {
│ │ │ │ +
645 SUPERLU_FREE(rB.Store);
│ │ │ │ +
646 SUPERLU_FREE(rX.Store);
│ │ │ │ +
647 }
│ │ │ │ +
648 }
│ │ │ │ +
│ │ │ │ +
649
│ │ │ │ +
650 template<typename M>
│ │ │ │ +
651 void SuperLU<M>
│ │ │ │ +
│ │ │ │ +
652 ::apply(T* x, T* b)
│ │ │ │ +
653 {
│ │ │ │ +
654 if(mat.N()+mat.M()==0)
│ │ │ │ +
655 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
│ │ │ │ +
656
│ │ │ │ +
657 SuperMatrix* mB = &B;
│ │ │ │ +
658 SuperMatrix* mX = &X;
│ │ │ │ +
659 SuperMatrix rB, rX;
│ │ │ │ +
660 if (reusevector) {
│ │ │ │ +
661 if(first) {
│ │ │ │ +
662 SuperLUDenseMatChooser<T>::create(&B, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
663 SuperLUDenseMatChooser<T>::create(&X, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
664 first=false;
│ │ │ │ +
665 }else{
│ │ │ │ +
666 ((DNformat*) B.Store)->nzval=b;
│ │ │ │ +
667 ((DNformat*)X.Store)->nzval=x;
│ │ │ │ +
668 }
│ │ │ │ +
669 } else {
│ │ │ │ +
670 SuperLUDenseMatChooser<T>::create(&rB, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
671 SuperLUDenseMatChooser<T>::create(&rX, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
│ │ │ │ +
672 mB = &rB;
│ │ │ │ +
673 mX = &rX;
│ │ │ │ +
674 }
│ │ │ │ +
675
│ │ │ │ +
676 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
│ │ │ │ +
677 int info;
│ │ │ │ +
678 mem_usage_t memusage;
│ │ │ │ +
679 SuperLUStat_t stat;
│ │ │ │ +
680 /* Initialize the statistics variables. */
│ │ │ │ +
681 StatInit(&stat);
│ │ │ │ +
682
│ │ │ │ +
683 options.IterRefine=SLU_DOUBLE;
│ │ │ │ +
684
│ │ │ │ +
685 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
│ │ │ │ +
686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
│ │ │ │ +
687 &memusage, &stat, &info);
│ │ │ │ +
688
│ │ │ │ +
689 if(verbose) {
│ │ │ │ +
690 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
│ │ │ │ +
691
│ │ │ │ +
692 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
│ │ │ │ +
693
│ │ │ │ +
694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded
│ │ │ │ +
695
│ │ │ │ +
696 if ( options.IterRefine ) {
│ │ │ │ +
697 dinfo<<"Iterative Refinement: steps="
│ │ │ │ +
698 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ +
699 }else
│ │ │ │ +
700 dinfo<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
│ │ │ │ +
701 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
│ │ │ │ +
702 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
│ │ │ │ +
703 }
│ │ │ │ +
704 if ( options.PrintStat ) StatPrint(&stat);
│ │ │ │ +
705 }
│ │ │ │ +
706
│ │ │ │ +
707 StatFree(&stat);
│ │ │ │ +
708 if (!reusevector) {
│ │ │ │ +
709 SUPERLU_FREE(rB.Store);
│ │ │ │ +
710 SUPERLU_FREE(rX.Store);
│ │ │ │ +
711 }
│ │ │ │ +
712 }
│ │ │ │ +
│ │ │ │ +
715 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
717 {
│ │ │ │ +
718 enum { value=true};
│ │ │ │ +
719 };
│ │ │ │ +
│ │ │ │ +
720
│ │ │ │ +
721 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
723 {
│ │ │ │ +
724 enum { value = true };
│ │ │ │ +
725 };
│ │ │ │ +
│ │ │ │ +
726
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
728 template<class> struct isValidBlock : std::false_type{};
│ │ │ │ +
729 template<int k> struct isValidBlock<Dune::FieldVector<double,k>> : std::true_type{};
│ │ │ │ +
730 template<int k> struct isValidBlock<Dune::FieldVector<std::complex<double>,k>> : std::true_type{};
│ │ │ │ +
731 template<typename TL, typename M>
│ │ │ │ +
732 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
733 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
│ │ │ │ +
734 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
│ │ │ │ +
735 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ +
736 {
│ │ │ │ +
737 int verbose = config.get("verbose", 0);
│ │ │ │ +
738 return std::make_shared<Dune::SuperLU<M>>(mat,verbose);
│ │ │ │ +
739 }
│ │ │ │ +
│ │ │ │ +
740
│ │ │ │ +
741 // second version with SFINAE to validate the template parameters of SuperLU
│ │ │ │ +
742 template<typename TL, typename M>
│ │ │ │ +
743 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
744 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
│ │ │ │ +
745 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ +
746 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ +
747 {
│ │ │ │ +
748 DUNE_THROW(UnsupportedType,
│ │ │ │ +
749 "Unsupported Type in SuperLU (only double and std::complex<double> supported)");
│ │ │ │ +
750 }
│ │ │ │ +
│ │ │ │ +
751 };
│ │ │ │ +
│ │ │ │ +
752 template<> struct SuperLUCreator::isValidBlock<double> : std::true_type{};
│ │ │ │ +
753 template<> struct SuperLUCreator::isValidBlock<std::complex<double>> : std::true_type{};
│ │ │ │ +
754
│ │ │ │ + │ │ │ │ +
756} // end namespace DUNE
│ │ │ │ +
757
│ │ │ │ +
758// undefine macros from SuperLU's slu_util.h
│ │ │ │ +
759#undef FIRSTCOL_OF_SNODE
│ │ │ │ +
760#undef NO_MARKER
│ │ │ │ +
761#undef NUM_TEMPV
│ │ │ │ +
762#undef USER_ABORT
│ │ │ │ +
763#undef USER_MALLOC
│ │ │ │ +
764#undef SUPERLU_MALLOC
│ │ │ │ +
765#undef USER_FREE
│ │ │ │ +
766#undef SUPERLU_FREE
│ │ │ │ +
767#undef CHECK_MALLOC
│ │ │ │ +
768#undef SUPERLU_MAX
│ │ │ │ +
769#undef SUPERLU_MIN
│ │ │ │ +
770#undef L_SUB_START
│ │ │ │ +
771#undef L_SUB
│ │ │ │ +
772#undef L_NZ_START
│ │ │ │ +
773#undef L_FST_SUPC
│ │ │ │ +
774#undef U_NZ_START
│ │ │ │ +
775#undef U_SUB
│ │ │ │ +
776#undef TRUE
│ │ │ │ +
777#undef FALSE
│ │ │ │ +
778#undef EMPTY
│ │ │ │ +
779#undef NODROP
│ │ │ │ +
780#undef DROP_BASIC
│ │ │ │ +
781#undef DROP_PROWS
│ │ │ │ +
782#undef DROP_COLUMN
│ │ │ │ +
783#undef DROP_AREA
│ │ │ │ +
784#undef DROP_SECONDARY
│ │ │ │ +
785#undef DROP_DYNAMIC
│ │ │ │ +
786#undef DROP_INTERP
│ │ │ │ +
787#undef MILU_ALPHA
│ │ │ │ +
788
│ │ │ │ +
789#endif // HAVE_SUPERLU
│ │ │ │ +
790#endif // DUNE_SUPERLU_HH
│ │ │ │ + │ │ │ │ +
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
│ │ │ │ + │ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ + │ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │ + │ │ │ │ +
void setSubMatrix(const Matrix &mat, const S &rowIndexSet)
Definition superlu.hh:457
│ │ │ │ +
void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition superlu.hh:563
│ │ │ │ +
void setVerbosity(bool v)
Definition superlu.hh:437
│ │ │ │ +
void free()
free allocated space.
Definition superlu.hh:403
│ │ │ │ +
~SuperLU()
Definition superlu.hh:396
│ │ │ │ +
SuperLU()
Empty default constructor.
Definition superlu.hh:432
│ │ │ │ +
void setMatrix(const Matrix &mat)
Initialize data from given matrix.
Definition superlu.hh:443
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
void endrowsizes()
indicate that size of all rows is defined
Definition bcrsmatrix.hh:1149
│ │ │ │ -
@ random
Build entries randomly.
Definition bcrsmatrix.hh:530
│ │ │ │ -
void endindices()
indicate that all indices are defined, check consistency
Definition bcrsmatrix.hh:1248
│ │ │ │ -
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ -
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ -
BCRSMatrix & operator=(const BCRSMatrix &Mat)
assignment
Definition bcrsmatrix.hh:911
│ │ │ │ -
A block-diagonal matrix.
Definition bdmatrix.hh:33
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bdmatrix.hh:39
│ │ │ │ -
A::size_type size_type
implement row_type with compressed vector
Definition bdmatrix.hh:51
│ │ │ │ -
BDMatrix()
Default constructor.
Definition bdmatrix.hh:58
│ │ │ │ -
BDMatrix(std::initializer_list< B > const &list)
Construct from a std::initializer_list.
Definition bdmatrix.hh:76
│ │ │ │ -
B block_type
export the type representing the components
Definition bdmatrix.hh:42
│ │ │ │ -
void solve(V &x, const V &rhs) const
Solve the system Ax=b in O(n) time.
Definition bdmatrix.hh:120
│ │ │ │ -
A allocator_type
export the allocator type
Definition bdmatrix.hh:45
│ │ │ │ -
BDMatrix(int size)
Definition bdmatrix.hh:60
│ │ │ │ -
BDMatrix & operator=(const BDMatrix &other)
assignment
Definition bdmatrix.hh:103
│ │ │ │ -
static constexpr unsigned int blocklevel
increment block level counter
Definition bdmatrix.hh:55
│ │ │ │ -
void setSize(size_type size)
Resize the matrix. Invalidates the content!
Definition bdmatrix.hh:85
│ │ │ │ -
void invert()
Inverts the matrix.
Definition bdmatrix.hh:130
│ │ │ │ -
typename BDMatrix< B, A >::field_type field_type
Definition bdmatrix.hh:154
│ │ │ │ -
typename FieldTraits< field_type >::real_type real_type
Definition bdmatrix.hh:155
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ +
Definition overlappingschwarz.hh:694
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ +
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
int iterations
Number of iterations.
Definition solver.hh:67
│ │ │ │ +
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
Definition solverregistry.hh:77
│ │ │ │ +
Definition solvertype.hh:16
│ │ │ │ +
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
│ │ │ │ +
Definition solvertype.hh:30
│ │ │ │ +
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
│ │ │ │ +
Definition superlu.hh:45
│ │ │ │ +
Definition superlu.hh:49
│ │ │ │ +
Definition superlu.hh:53
│ │ │ │ +
Definition superlu.hh:57
│ │ │ │ +
SuperLu Solver.
Definition superlu.hh:271
│ │ │ │ +
SuperLUMatrix::size_type nnz() const
Definition superlu.hh:355
│ │ │ │ +
void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
apply inverse operator, with given convergence criteria.
Definition superlu.hh:342
│ │ │ │ +
typename Impl::SuperLUVectorChooser< M >::range_type range_type
The type of the range of the solver.
Definition superlu.hh:284
│ │ │ │ +
M matrix_type
Definition superlu.hh:276
│ │ │ │ +
SuperMatrixInitializer< Matrix > MatrixInitializer
Type of an associated initializer class.
Definition superlu.hh:280
│ │ │ │ +
M Matrix
The matrix type.
Definition superlu.hh:275
│ │ │ │ +
typename Impl::SuperLUVectorChooser< M >::domain_type domain_type
The type of the domain of the solver.
Definition superlu.hh:282
│ │ │ │ +
const char * name()
Definition superlu.hh:371
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition superlu.hh:287
│ │ │ │ +
Dune::SuperLUMatrix< Matrix > SuperLUMatrix
The corresponding SuperLU Matrix type.
Definition superlu.hh:278
│ │ │ │ +
SuperLU(const Matrix &mat, const ParameterTree &config)
Constructs the SuperLU solver.
Definition superlu.hh:320
│ │ │ │ +
Definition superlu.hh:727
│ │ │ │ +
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
Definition superlu.hh:734
│ │ │ │ +
Definition superlu.hh:728
│ │ │ │ +
Definition supermatrix.hh:132
│ │ │ │ +
Utility class for converting an ISTL Matrix into a SuperLU Matrix.
Definition supermatrix.hh:175
│ │ │ │ +
Definition supermatrix.hh:179
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,234 +1,947 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -bdmatrix.hh │ │ │ │ │ +superlu.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_BDMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_BDMATRIX_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_SUPERLU_HH │ │ │ │ │ +6#define DUNE_ISTL_SUPERLU_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ +8#if HAVE_SUPERLU │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -31 template > │ │ │ │ │ -_3_2 class _B_D_M_a_t_r_i_x : public _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -33 { │ │ │ │ │ -34 public: │ │ │ │ │ -35 │ │ │ │ │ -36 //===== type definitions and constants │ │ │ │ │ -37 │ │ │ │ │ -_3_9 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ -40 │ │ │ │ │ -_4_2 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -43 │ │ │ │ │ -_4_5 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +10#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ +11#include "_s_o_l_v_e_r_s_._h_h" │ │ │ │ │ +12#include "_s_u_p_e_r_m_a_t_r_i_x_._h_h" │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +16#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e │ │ │ │ │ +25{ │ │ │ │ │ +26 │ │ │ │ │ +37 template │ │ │ │ │ +38 class SeqOverlappingSchwarz; │ │ │ │ │ +39 │ │ │ │ │ +40 template │ │ │ │ │ +41 struct SeqOverlappingSchwarzAssemblerHelper; │ │ │ │ │ +42 │ │ │ │ │ +43 template │ │ │ │ │ +_4_4 struct _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r │ │ │ │ │ +45 {}; │ │ │ │ │ 46 │ │ │ │ │ -48 //typedef BCRSMatrix::row_type row_type; │ │ │ │ │ -49 │ │ │ │ │ -_5_1 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -52 │ │ │ │ │ -54 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]] │ │ │ │ │ -_5_5 static constexpr unsigned int _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ -56 │ │ │ │ │ -_5_8 _B_D_M_a_t_r_i_x() : _B_C_R_S_M_a_t_r_i_x() {} │ │ │ │ │ -59 │ │ │ │ │ -_6_0 explicit _B_D_M_a_t_r_i_x(int size) │ │ │ │ │ -61 : _B_C_R_S_M_a_t_r_i_x(size, size, _B_C_R_S_M_a_t_r_i_x::_r_a_n_d_o_m) { │ │ │ │ │ -62 │ │ │ │ │ -63 for (int i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 1); │ │ │ │ │ -65 │ │ │ │ │ -66 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ +47 template │ │ │ │ │ +_4_8 struct _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r │ │ │ │ │ +49 {}; │ │ │ │ │ +50 │ │ │ │ │ +51 template │ │ │ │ │ +_5_2 struct _S_u_p_e_r_L_U_Q_u_e_r_y_C_h_o_o_s_e_r │ │ │ │ │ +53 {}; │ │ │ │ │ +54 │ │ │ │ │ +55 template │ │ │ │ │ +_5_6 struct _Q_u_e_r_y_S_p_a_c_e_C_h_o_o_s_e_r │ │ │ │ │ +57 {}; │ │ │ │ │ +58 │ │ │ │ │ +59#if __has_include("slu_sdefs.h") │ │ │ │ │ +60 template<> │ │ │ │ │ +61 struct _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r │ │ │ │ │ +62 { │ │ │ │ │ +63 static void create(SuperMatrix *_m_a_t, int n, int m, float *dat, int n1, │ │ │ │ │ +64 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +65 { │ │ │ │ │ +66 sCreate_Dense_Matrix(_m_a_t, n, m, dat, n1, stype, dtype, mtype); │ │ │ │ │ 67 │ │ │ │ │ -68 for (int i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i); │ │ │ │ │ -70 │ │ │ │ │ -71 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ +68 } │ │ │ │ │ +69 │ │ │ │ │ +70 static void destroy(SuperMatrix*) │ │ │ │ │ +71 {} │ │ │ │ │ 72 │ │ │ │ │ -73 } │ │ │ │ │ -74 │ │ │ │ │ -_7_6 _B_D_M_a_t_r_i_x (std::initializer_list const &list) │ │ │ │ │ -77 : _B_D_M_a_t_r_i_x(list.size()) │ │ │ │ │ -78 { │ │ │ │ │ -79 size_t i=0; │ │ │ │ │ -80 for (auto it = list.begin(); it != list.end(); ++it, ++i) │ │ │ │ │ -81 (*this)[i][i] = *it; │ │ │ │ │ -82 } │ │ │ │ │ -83 │ │ │ │ │ -_8_5 void _s_e_t_S_i_z_e(_s_i_z_e___t_y_p_e size) │ │ │ │ │ -86 { │ │ │ │ │ -87 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_S_i_z_e(size, // rows │ │ │ │ │ -88 size, // columns │ │ │ │ │ -89 size); // nonzeros │ │ │ │ │ -90 │ │ │ │ │ -91 for (auto i : range(size)) │ │ │ │ │ -92 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 1); │ │ │ │ │ -93 │ │ │ │ │ -94 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ -95 │ │ │ │ │ -96 for (auto i : range(size)) │ │ │ │ │ -97 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i); │ │ │ │ │ +73 }; │ │ │ │ │ +74 template<> │ │ │ │ │ +75 struct SuperLUSolveChooser │ │ │ │ │ +76 { │ │ │ │ │ +77 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int *perm_c, │ │ │ │ │ +int *perm_r, int *etree, │ │ │ │ │ +78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ +79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ +80 float *rpg, float *rcond, float *ferr, float *berr, │ │ │ │ │ +81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ +82 { │ │ │ │ │ +83 GlobalLU_t gLU; │ │ │ │ │ +84 sgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ +85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ +86 &gLU, memusage, stat, info); │ │ │ │ │ +87 } │ │ │ │ │ +88 }; │ │ │ │ │ +89 │ │ │ │ │ +90 template<> │ │ │ │ │ +91 struct QuerySpaceChooser │ │ │ │ │ +92 { │ │ │ │ │ +93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ +memusage) │ │ │ │ │ +94 { │ │ │ │ │ +95 sQuerySpace(L,U,memusage); │ │ │ │ │ +96 } │ │ │ │ │ +97 }; │ │ │ │ │ 98 │ │ │ │ │ -99 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ -100 } │ │ │ │ │ -101 │ │ │ │ │ -_1_0_3 _B_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _B_D_M_a_t_r_i_x& other) { │ │ │ │ │ -104 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(other); │ │ │ │ │ -105 return *this; │ │ │ │ │ -106 } │ │ │ │ │ -107 │ │ │ │ │ -_1_0_9 _B_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) { │ │ │ │ │ -110 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(k); │ │ │ │ │ -111 return *this; │ │ │ │ │ -112 } │ │ │ │ │ -113 │ │ │ │ │ -119 template │ │ │ │ │ -_1_2_0 void _s_o_l_v_e (V& x, const V& rhs) const { │ │ │ │ │ -121 for (_s_i_z_e___t_y_p_e i=0; i_N(); i++) │ │ │ │ │ -122 { │ │ │ │ │ -123 auto&& xv = Impl::asVector(x[i]); │ │ │ │ │ -124 auto&& rhsv = Impl::asVector(rhs[i]); │ │ │ │ │ -125 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv); │ │ │ │ │ -126 } │ │ │ │ │ -127 } │ │ │ │ │ -128 │ │ │ │ │ -_1_3_0 void _i_n_v_e_r_t() { │ │ │ │ │ -131 for (_s_i_z_e___t_y_p_e i=0; i_N(); i++) │ │ │ │ │ -132 Impl::asMatrix((*this)[i][i])._i_n_v_e_r_t(); │ │ │ │ │ -133 } │ │ │ │ │ -134 │ │ │ │ │ -135 private: │ │ │ │ │ -136 │ │ │ │ │ -137 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ -//// │ │ │ │ │ -138 // The following methods from the base class should now actually be called │ │ │ │ │ -139 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ -//// │ │ │ │ │ -140 │ │ │ │ │ -141 // createbegin and createend should be in there, too, but I can't get it to │ │ │ │ │ -compile │ │ │ │ │ -142 // BCRSMatrix::CreateIterator createbegin () {} │ │ │ │ │ -143 // BCRSMatrix::CreateIterator createend () {} │ │ │ │ │ -144 void setrowsize (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s) {} │ │ │ │ │ -145 void incrementrowsize (_s_i_z_e___t_y_p_e i) {} │ │ │ │ │ -146 void endrowsizes () {} │ │ │ │ │ -147 void addindex (_s_i_z_e___t_y_p_e row, _s_i_z_e___t_y_p_e _c_o_l) {} │ │ │ │ │ -148 void endindices () {} │ │ │ │ │ -149 }; │ │ │ │ │ +99#endif │ │ │ │ │ +100 │ │ │ │ │ +101#if __has_include("slu_ddefs.h") │ │ │ │ │ +102 │ │ │ │ │ +103 template<> │ │ │ │ │ +104 struct SuperLUDenseMatChooser │ │ │ │ │ +105 { │ │ │ │ │ +106 static void create(SuperMatrix *_m_a_t, int n, int m, double *dat, int n1, │ │ │ │ │ +107 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +108 { │ │ │ │ │ +109 dCreate_Dense_Matrix(_m_a_t, n, m, dat, n1, stype, dtype, mtype); │ │ │ │ │ +110 │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +113 static void destroy(SuperMatrix * /* mat */) │ │ │ │ │ +114 {} │ │ │ │ │ +115 }; │ │ │ │ │ +116 template<> │ │ │ │ │ +117 struct SuperLUSolveChooser │ │ │ │ │ +118 { │ │ │ │ │ +119 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int │ │ │ │ │ +*perm_c, int *perm_r, int *etree, │ │ │ │ │ +120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ +121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ +122 double *rpg, double *rcond, double *ferr, double *berr, │ │ │ │ │ +123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ +124 { │ │ │ │ │ +125 GlobalLU_t gLU; │ │ │ │ │ +126 dgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ +127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ +128 &gLU, memusage, stat, info); │ │ │ │ │ +129 } │ │ │ │ │ +130 }; │ │ │ │ │ +131 │ │ │ │ │ +132 template<> │ │ │ │ │ +133 struct QuerySpaceChooser │ │ │ │ │ +134 { │ │ │ │ │ +135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ +memusage) │ │ │ │ │ +136 { │ │ │ │ │ +137 dQuerySpace(L,U,memusage); │ │ │ │ │ +138 } │ │ │ │ │ +139 }; │ │ │ │ │ +140#endif │ │ │ │ │ +141 │ │ │ │ │ +142#if __has_include("slu_zdefs.h") │ │ │ │ │ +143 template<> │ │ │ │ │ +144 struct SuperLUDenseMatChooser<_s_t_d::complex > │ │ │ │ │ +145 { │ │ │ │ │ +146 static void create(SuperMatrix *_m_a_t, int n, int m, std::complex │ │ │ │ │ +*dat, int n1, │ │ │ │ │ +147 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +148 { │ │ │ │ │ +149 zCreate_Dense_Matrix(_m_a_t, n, m, reinterpret_cast(dat), n1, │ │ │ │ │ +stype, dtype, mtype); │ │ │ │ │ 150 │ │ │ │ │ -151 template │ │ │ │ │ -_1_5_2 struct FieldTraits< _B_D_M_a_t_r_i_x > │ │ │ │ │ -153 { │ │ │ │ │ -_1_5_4 using _f_i_e_l_d___t_y_p_e = typename _B_D_M_a_t_r_i_x_<_B_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_1_5_5 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ -156 }; │ │ │ │ │ -159} // end namespace Dune │ │ │ │ │ -160 │ │ │ │ │ -161#endif │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ +151 } │ │ │ │ │ +152 │ │ │ │ │ +153 static void destroy(SuperMatrix*) │ │ │ │ │ +154 {} │ │ │ │ │ +155 }; │ │ │ │ │ +156 │ │ │ │ │ +157 template<> │ │ │ │ │ +158 struct SuperLUSolveChooser<_s_t_d::complex > │ │ │ │ │ +159 { │ │ │ │ │ +160 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int │ │ │ │ │ +*perm_c, int *perm_r, int *etree, │ │ │ │ │ +161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ +162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ +163 double *rpg, double *rcond, double *ferr, double *berr, │ │ │ │ │ +164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ +165 { │ │ │ │ │ +166 GlobalLU_t gLU; │ │ │ │ │ +167 zgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ +168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ +169 &gLU, memusage, stat, info); │ │ │ │ │ +170 } │ │ │ │ │ +171 }; │ │ │ │ │ +172 │ │ │ │ │ +173 template<> │ │ │ │ │ +174 struct QuerySpaceChooser<_s_t_d::complex > │ │ │ │ │ +175 { │ │ │ │ │ +176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ +memusage) │ │ │ │ │ +177 { │ │ │ │ │ +178 zQuerySpace(L,U,memusage); │ │ │ │ │ +179 } │ │ │ │ │ +180 }; │ │ │ │ │ +181#endif │ │ │ │ │ +182 │ │ │ │ │ +183#if __has_include("slu_cdefs.h") │ │ │ │ │ +184 template<> │ │ │ │ │ +185 struct SuperLUDenseMatChooser<_s_t_d::complex > │ │ │ │ │ +186 { │ │ │ │ │ +187 static void create(SuperMatrix *_m_a_t, int n, int m, std::complex │ │ │ │ │ +*dat, int n1, │ │ │ │ │ +188 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +189 { │ │ │ │ │ +190 cCreate_Dense_Matrix(_m_a_t, n, m, reinterpret_cast< ::complex*>(dat), n1, │ │ │ │ │ +stype, dtype, mtype); │ │ │ │ │ +191 │ │ │ │ │ +192 } │ │ │ │ │ +193 │ │ │ │ │ +194 static void destroy(SuperMatrix* /* mat */) │ │ │ │ │ +195 {} │ │ │ │ │ +196 }; │ │ │ │ │ +197 │ │ │ │ │ +198 template<> │ │ │ │ │ +199 struct SuperLUSolveChooser<_s_t_d::complex > │ │ │ │ │ +200 { │ │ │ │ │ +201 static void solve(superlu_options_t *options, SuperMatrix *_m_a_t, int │ │ │ │ │ +*perm_c, int *perm_r, int *etree, │ │ │ │ │ +202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U, │ │ │ │ │ +203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X, │ │ │ │ │ +204 float *rpg, float *rcond, float *ferr, float *berr, │ │ │ │ │ +205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info) │ │ │ │ │ +206 { │ │ │ │ │ +207 GlobalLU_t gLU; │ │ │ │ │ +208 cgssvx(options, _m_a_t, perm_c, perm_r, etree, equed, R, C, │ │ │ │ │ +209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr, │ │ │ │ │ +210 &gLU, memusage, stat, info); │ │ │ │ │ +211 } │ │ │ │ │ +212 }; │ │ │ │ │ +213 │ │ │ │ │ +214 template<> │ │ │ │ │ +215 struct QuerySpaceChooser<_s_t_d::complex > │ │ │ │ │ +216 { │ │ │ │ │ +217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* │ │ │ │ │ +memusage) │ │ │ │ │ +218 { │ │ │ │ │ +219 cQuerySpace(L,U,memusage); │ │ │ │ │ +220 } │ │ │ │ │ +221 }; │ │ │ │ │ +222#endif │ │ │ │ │ +223 │ │ │ │ │ +224 namespace Impl │ │ │ │ │ +225 { │ │ │ │ │ +226 template │ │ │ │ │ +227 struct SuperLUVectorChooser │ │ │ │ │ +228 {}; │ │ │ │ │ +229 │ │ │ │ │ +230 template │ │ │ │ │ +231 struct SuperLUVectorChooser,A > > │ │ │ │ │ +232 { │ │ │ │ │ +234 using domain_type = BlockVector< │ │ │ │ │ +235 FieldVector, │ │ │ │ │ +236 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ +>; │ │ │ │ │ +238 using range_type = BlockVector< │ │ │ │ │ +239 FieldVector, │ │ │ │ │ +240 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ +>; │ │ │ │ │ +241 }; │ │ │ │ │ +242 │ │ │ │ │ +243 template │ │ │ │ │ +244 struct SuperLUVectorChooser > │ │ │ │ │ +245 { │ │ │ │ │ +247 using domain_type = BlockVector; │ │ │ │ │ +249 using range_type = BlockVector; │ │ │ │ │ +250 }; │ │ │ │ │ +251 } │ │ │ │ │ +252 │ │ │ │ │ +266 template │ │ │ │ │ +_2_6_7 class _S_u_p_e_r_L_U │ │ │ │ │ +268 : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< │ │ │ │ │ +269 typename Impl::SuperLUVectorChooser::domain_type, │ │ │ │ │ +270 typename Impl::SuperLUVectorChooser::range_type > │ │ │ │ │ +271 { │ │ │ │ │ +272 using T = typename M::field_type; │ │ │ │ │ +273 public: │ │ │ │ │ +_2_7_5 using _M_a_t_r_i_x = M; │ │ │ │ │ +_2_7_6 using _m_a_t_r_i_x___t_y_p_e = M; │ │ │ │ │ +_2_7_8 typedef _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_M_a_t_r_i_x_> _S_u_p_e_r_L_U_M_a_t_r_i_x; │ │ │ │ │ +_2_8_0 typedef _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_M_a_t_r_i_x_> _M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ +_2_8_2 using _d_o_m_a_i_n___t_y_p_e = typename Impl::SuperLUVectorChooser::domain_type; │ │ │ │ │ +_2_8_4 using _r_a_n_g_e___t_y_p_e = typename Impl::SuperLUVectorChooser::range_type; │ │ │ │ │ +285 │ │ │ │ │ +_2_8_7 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +288 { │ │ │ │ │ +289 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +290 } │ │ │ │ │ +291 │ │ │ │ │ +306 explicit _S_u_p_e_r_L_U(const _M_a_t_r_i_x& mat, bool verbose=false, │ │ │ │ │ +307 bool reusevector=true); │ │ │ │ │ +308 │ │ │ │ │ +309 │ │ │ │ │ +_3_2_0 _S_u_p_e_r_L_U(const _M_a_t_r_i_x& mat, const ParameterTree& config) │ │ │ │ │ +321 : _S_u_p_e_r_L_U(_m_a_t, config._g_e_t("verbose", false), config._g_e_t │ │ │ │ │ +("reuseVector", true)) │ │ │ │ │ +322 {} │ │ │ │ │ +323 │ │ │ │ │ +330 _S_u_p_e_r_L_U(); │ │ │ │ │ +331 │ │ │ │ │ +332 _~_S_u_p_e_r_L_U(); │ │ │ │ │ +333 │ │ │ │ │ +337 void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res); │ │ │ │ │ +338 │ │ │ │ │ +_3_4_2 void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, [[maybe_unused]] double │ │ │ │ │ +reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +343 { │ │ │ │ │ +344 _a_p_p_l_y(x,b,res); │ │ │ │ │ +345 } │ │ │ │ │ +346 │ │ │ │ │ +350 void _a_p_p_l_y(T* x, T* b); │ │ │ │ │ +351 │ │ │ │ │ +353 void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& mat); │ │ │ │ │ +354 │ │ │ │ │ +_3_5_5 typename SuperLUMatrix::size_type _n_n_z() const │ │ │ │ │ +356 { │ │ │ │ │ +357 return mat.nonzeroes(); │ │ │ │ │ +358 } │ │ │ │ │ +359 │ │ │ │ │ +360 template │ │ │ │ │ +361 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& mat, const S& rowIndexSet); │ │ │ │ │ +362 │ │ │ │ │ +363 void _s_e_t_V_e_r_b_o_s_i_t_y(bool v); │ │ │ │ │ +364 │ │ │ │ │ +369 void _f_r_e_e(); │ │ │ │ │ +370 │ │ │ │ │ +_3_7_1 const char* _n_a_m_e() { return "SuperLU"; } │ │ │ │ │ +372 private: │ │ │ │ │ +373 template │ │ │ │ │ +_3_7_4 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ +375 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_S_u_p_e_r_L_U<_M_a_t_r_i_x>,true>; │ │ │ │ │ +376 │ │ │ │ │ +377 _S_u_p_e_r_L_U_M_a_t_r_i_x& getInternalMatrix() { return _m_a_t; } │ │ │ │ │ +378 │ │ │ │ │ +380 void decompose(); │ │ │ │ │ +381 │ │ │ │ │ +382 _S_u_p_e_r_L_U_M_a_t_r_i_x _m_a_t; │ │ │ │ │ +383 SuperMatrix L, U, B, X; │ │ │ │ │ +384 int *perm_c, *perm_r, *etree; │ │ │ │ │ +385 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e *R, *C; │ │ │ │ │ +386 T *bstore; │ │ │ │ │ +387 superlu_options_t options; │ │ │ │ │ +388 char equed; │ │ │ │ │ +389 void *work; │ │ │ │ │ +390 int lwork; │ │ │ │ │ +391 bool first, verbose, reusevector; │ │ │ │ │ +392 }; │ │ │ │ │ +393 │ │ │ │ │ +394 template │ │ │ │ │ +395 SuperLU │ │ │ │ │ +_3_9_6 ::~SuperLU() │ │ │ │ │ +397 { │ │ │ │ │ +398 if(_m_a_t._N()+_m_a_t._M()>0) │ │ │ │ │ +399 free(); │ │ │ │ │ +400 } │ │ │ │ │ +401 │ │ │ │ │ +402 template │ │ │ │ │ +_4_0_3 void _S_u_p_e_r_L_U_<_M_>_:_:_f_r_e_e() │ │ │ │ │ +404 { │ │ │ │ │ +405 delete[] perm_c; │ │ │ │ │ +406 delete[] perm_r; │ │ │ │ │ +407 delete[] etree; │ │ │ │ │ +408 delete[] R; │ │ │ │ │ +409 delete[] C; │ │ │ │ │ +410 if(lwork>=0) { │ │ │ │ │ +411 Destroy_SuperNode_Matrix(&L); │ │ │ │ │ +412 Destroy_CompCol_Matrix(&U); │ │ │ │ │ +413 } │ │ │ │ │ +414 lwork=0; │ │ │ │ │ +415 if(!first && reusevector) { │ │ │ │ │ +416 SUPERLU_FREE(B.Store); │ │ │ │ │ +417 SUPERLU_FREE(X.Store); │ │ │ │ │ +418 } │ │ │ │ │ +419 _m_a_t.free(); │ │ │ │ │ +420 } │ │ │ │ │ +421 │ │ │ │ │ +422 template │ │ │ │ │ +423 _S_u_p_e_r_L_U_<_M_> │ │ │ │ │ +_4_2_4_ _:_:_S_u_p_e_r_L_U(const _M_a_t_r_i_x& mat_, bool verbose_, bool reusevector_) │ │ │ │ │ +425 : work(0), lwork(0), first(true), verbose(verbose_), │ │ │ │ │ +426 reusevector(reusevector_) │ │ │ │ │ +427 { │ │ │ │ │ +428 _s_e_t_M_a_t_r_i_x(mat_); │ │ │ │ │ +429 │ │ │ │ │ +430 } │ │ │ │ │ +431 template │ │ │ │ │ +_4_3_2 _S_u_p_e_r_L_U_<_M_>_:_:_S_u_p_e_r_L_U() │ │ │ │ │ +433 : work(0), lwork(0),verbose(false), │ │ │ │ │ +434 reusevector(false) │ │ │ │ │ +435 {} │ │ │ │ │ +436 template │ │ │ │ │ +_4_3_7 void _S_u_p_e_r_L_U_<_M_>_:_:_s_e_t_V_e_r_b_o_s_i_t_y(bool v) │ │ │ │ │ +438 { │ │ │ │ │ +439 verbose=v; │ │ │ │ │ +440 } │ │ │ │ │ +441 │ │ │ │ │ +442 template │ │ │ │ │ +_4_4_3 void _S_u_p_e_r_L_U_<_M_>_:_:_s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& mat_) │ │ │ │ │ +444 { │ │ │ │ │ +445 if(_m_a_t._N()+_m_a_t._M()>0) { │ │ │ │ │ +446 free(); │ │ │ │ │ +447 } │ │ │ │ │ +448 lwork=0; │ │ │ │ │ +449 work=0; │ │ │ │ │ +450 //a=&mat_; │ │ │ │ │ +451 _m_a_t=mat_; │ │ │ │ │ +452 decompose(); │ │ │ │ │ +453 } │ │ │ │ │ +454 │ │ │ │ │ +455 template │ │ │ │ │ +456 template │ │ │ │ │ +_4_5_7 void _S_u_p_e_r_L_U_<_M_>_:_:_s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& mat_, │ │ │ │ │ +458 const S& mrs) │ │ │ │ │ +459 { │ │ │ │ │ +460 if(_m_a_t._N()+_m_a_t._M()>0) { │ │ │ │ │ +461 free(); │ │ │ │ │ +462 } │ │ │ │ │ +463 lwork=0; │ │ │ │ │ +464 work=0; │ │ │ │ │ +465 //a=&mat_; │ │ │ │ │ +466 _m_a_t.setMatrix(mat_,mrs); │ │ │ │ │ +467 decompose(); │ │ │ │ │ +468 } │ │ │ │ │ +469 │ │ │ │ │ +470 template │ │ │ │ │ +471 void _S_u_p_e_r_L_U_<_M_>_:_:_d_e_c_o_m_p_o_s_e() │ │ │ │ │ +472 { │ │ │ │ │ +473 │ │ │ │ │ +474 first = true; │ │ │ │ │ +475 perm_c = new int[_m_a_t._M()]; │ │ │ │ │ +476 perm_r = new int[_m_a_t._N()]; │ │ │ │ │ +477 etree = new int[_m_a_t._M()]; │ │ │ │ │ +478 R = new typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e[_m_a_t._N()]; │ │ │ │ │ +479 C = new typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e[_m_a_t._M()]; │ │ │ │ │ +480 │ │ │ │ │ +481 set_default_options(&options); │ │ │ │ │ +482 // Do the factorization │ │ │ │ │ +483 B.ncol=0; │ │ │ │ │ +484 B.Stype=SLU_DN; │ │ │ │ │ +485 B.Dtype=_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e; │ │ │ │ │ +486 B.Mtype= SLU_GE; │ │ │ │ │ +487 DNformat fakeFormat; │ │ │ │ │ +488 fakeFormat.lda=_m_a_t._N(); │ │ │ │ │ +489 B.Store=&fakeFormat; │ │ │ │ │ +490 X.Stype=SLU_DN; │ │ │ │ │ +491 X.Dtype=_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e; │ │ │ │ │ +492 X.Mtype= SLU_GE; │ │ │ │ │ +493 X.ncol=0; │ │ │ │ │ +494 X.Store=&fakeFormat; │ │ │ │ │ +495 │ │ │ │ │ +496 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e rpg, rcond, ferr=1e10, berr=1e10; │ │ │ │ │ +497 int info; │ │ │ │ │ +498 mem_usage_t memusage; │ │ │ │ │ +499 SuperLUStat_t stat; │ │ │ │ │ +500 │ │ │ │ │ +501 StatInit(&stat); │ │ │ │ │ +502 _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_T_>_:_:_s_o_l_v_e(&options, &static_cast(_m_a_t), │ │ │ │ │ +perm_c, perm_r, etree, &equed, R, C, │ │ │ │ │ +503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr, │ │ │ │ │ +504 &berr, &memusage, &stat, &info); │ │ │ │ │ +505 │ │ │ │ │ +506 if(verbose) { │ │ │ │ │ +507 dinfo<<"LU factorization: dgssvx() returns info "<< info<(_m_a_t).ncol; │ │ │ │ │ +510 │ │ │ │ │ +511 if ( info == 0 || info == nSuperLUCol+1 ) { │ │ │ │ │ +512 │ │ │ │ │ +513 if ( options.PivotGrowth ) │ │ │ │ │ +514 dinfo<<"Recip. pivot growth = "< 0 && lwork == -1 ) { // Memory allocation failed │ │ │ │ │ +528 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<colptr[i]; c < Ustore->colptr[i+1]; ++c) │ │ │ │ │ +540 //if(Ustore->rowind[c]==i) │ │ │ │ │ +541 std::cout<rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" "; │ │ │ │ │ +542 if(k==0){ │ │ │ │ │ +543 // │ │ │ │ │ +544 k=-1; │ │ │ │ │ +545 }std::cout<colptr[i]; c < Ustore->colptr[i+1]; ++c) │ │ │ │ │ +551 //if(Ustore->rowind[c]==i) │ │ │ │ │ +552 std::cout<rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" "; │ │ │ │ │ +553 if(k==0){ │ │ │ │ │ +554 // │ │ │ │ │ +555 k=-1; │ │ │ │ │ +556 }std::cout< │ │ │ │ │ +562 void SuperLU │ │ │ │ │ +_5_6_3 ::apply(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +564 { │ │ │ │ │ +565 if (_m_a_t._N() != b.dim()) │ │ │ │ │ +566 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Size of right-hand-side vector b does not match the │ │ │ │ │ +number of matrix rows!"); │ │ │ │ │ +567 if (_m_a_t._M() != x.dim()) │ │ │ │ │ +568 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Size of solution vector x does not match the number │ │ │ │ │ +of matrix columns!"); │ │ │ │ │ +569 if (_m_a_t._M()+_m_a_t._N()==0) │ │ │ │ │ +570 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Matrix of SuperLU is null!"); │ │ │ │ │ +571 │ │ │ │ │ +572 SuperMatrix* mB = &B; │ │ │ │ │ +573 SuperMatrix* mX = &X; │ │ │ │ │ +574 SuperMatrix rB, rX; │ │ │ │ │ +575 if (reusevector) { │ │ │ │ │ +576 if(first) { │ │ │ │ │ +577 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&B, (int)_m_a_t._N(), 1, reinterpret_cast │ │ │ │ │ +(&b[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ +578 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&X, (int)_m_a_t._N(), 1, reinterpret_cast │ │ │ │ │ +(&x[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ +579 first=false; │ │ │ │ │ +580 }else{ │ │ │ │ │ +581 ((DNformat*)B.Store)->nzval=&b[0]; │ │ │ │ │ +582 ((DNformat*)X.Store)->nzval=&x[0]; │ │ │ │ │ +583 } │ │ │ │ │ +584 } else { │ │ │ │ │ +585 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rB, (int)_m_a_t._N(), 1, │ │ │ │ │ +reinterpret_cast(&b[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, │ │ │ │ │ +SLU_GE); │ │ │ │ │ +586 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rX, (int)_m_a_t._N(), 1, │ │ │ │ │ +reinterpret_cast(&x[0]), (int)_m_a_t._N(), SLU_DN, _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, │ │ │ │ │ +SLU_GE); │ │ │ │ │ +587 mB = &rB; │ │ │ │ │ +588 mX = &rX; │ │ │ │ │ +589 } │ │ │ │ │ +590 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e rpg, rcond, ferr=1e10, berr; │ │ │ │ │ +591 int info; │ │ │ │ │ +592 mem_usage_t memusage; │ │ │ │ │ +593 SuperLUStat_t stat; │ │ │ │ │ +594 /* Initialize the statistics variables. */ │ │ │ │ │ +595 StatInit(&stat); │ │ │ │ │ +596 /* │ │ │ │ │ +597 range_type d=b; │ │ │ │ │ +598 a->usmv(-1, x, d); │ │ │ │ │ +599 │ │ │ │ │ +600 double def0=d.two_norm(); │ │ │ │ │ +601 */ │ │ │ │ │ +602 options.IterRefine=SLU_DOUBLE; │ │ │ │ │ +603 │ │ │ │ │ +604 _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_T_>_:_:_s_o_l_v_e(&options, &static_cast(_m_a_t), │ │ │ │ │ +perm_c, perm_r, etree, &equed, R, C, │ │ │ │ │ +605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr, │ │ │ │ │ +606 &memusage, &stat, &info); │ │ │ │ │ +607 │ │ │ │ │ +608 res._i_t_e_r_a_t_i_o_n_s=1; │ │ │ │ │ +609 │ │ │ │ │ +610 /* │ │ │ │ │ +611 if(options.Equil==YES) │ │ │ │ │ +612 // undo scaling of right hand side │ │ │ │ │ +613 std::transform(reinterpret_cast(&b[0]),reinterpret_cast(&b │ │ │ │ │ +[0])+mat.M(), │ │ │ │ │ +614 C, reinterpret_cast(&d[0]), std::divides()); │ │ │ │ │ +615 else │ │ │ │ │ +616 d=b; │ │ │ │ │ +617 a->usmv(-1, x, d); │ │ │ │ │ +618 res.reduction=d.two_norm()/def0; │ │ │ │ │ +619 res.conv_rate = res.reduction; │ │ │ │ │ +620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18); │ │ │ │ │ +621 */ │ │ │ │ │ +622 res._c_o_n_v_e_r_g_e_d=true; │ │ │ │ │ +623 │ │ │ │ │ +624 if(verbose) { │ │ │ │ │ +625 │ │ │ │ │ +626 dinfo<<"Triangular solve: dgssvx() returns info "<< info<(_m_a_t).ncol; │ │ │ │ │ +629 │ │ │ │ │ +630 if ( info == 0 || info == nSuperLUCol+1 ) { │ │ │ │ │ +631 │ │ │ │ │ +632 if ( options.IterRefine ) { │ │ │ │ │ +633 std::cout<<"Iterative Refinement: steps=" │ │ │ │ │ +634 < │ │ │ │ │ +651 void _S_u_p_e_r_L_U_<_M_> │ │ │ │ │ +_6_5_2_ _:_:_a_p_p_l_y(T* x, T* b) │ │ │ │ │ +653 { │ │ │ │ │ +654 if(_m_a_t._N()+_m_a_t._M()==0) │ │ │ │ │ +655 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Matrix of SuperLU is null!"); │ │ │ │ │ +656 │ │ │ │ │ +657 SuperMatrix* mB = &B; │ │ │ │ │ +658 SuperMatrix* mX = &X; │ │ │ │ │ +659 SuperMatrix rB, rX; │ │ │ │ │ +660 if (reusevector) { │ │ │ │ │ +661 if(first) { │ │ │ │ │ +662 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&B, _m_a_t._N(), 1, b, _m_a_t._N(), SLU_DN, │ │ │ │ │ +_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ +663 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&X, _m_a_t._N(), 1, x, _m_a_t._N(), SLU_DN, │ │ │ │ │ +_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ +664 first=false; │ │ │ │ │ +665 }else{ │ │ │ │ │ +666 ((DNformat*) B.Store)->nzval=b; │ │ │ │ │ +667 ((DNformat*)X.Store)->nzval=x; │ │ │ │ │ +668 } │ │ │ │ │ +669 } else { │ │ │ │ │ +670 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rB, _m_a_t._N(), 1, b, _m_a_t._N(), SLU_DN, │ │ │ │ │ +_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ +671 _S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r_<_T_>_:_:_c_r_e_a_t_e(&rX, _m_a_t._N(), 1, x, _m_a_t._N(), SLU_DN, │ │ │ │ │ +_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e, SLU_GE); │ │ │ │ │ +672 mB = &rB; │ │ │ │ │ +673 mX = &rX; │ │ │ │ │ +674 } │ │ │ │ │ +675 │ │ │ │ │ +676 typename _G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_f_l_o_a_t___t_y_p_e rpg, rcond, ferr=1e10, berr; │ │ │ │ │ +677 int info; │ │ │ │ │ +678 mem_usage_t memusage; │ │ │ │ │ +679 SuperLUStat_t stat; │ │ │ │ │ +680 /* Initialize the statistics variables. */ │ │ │ │ │ +681 StatInit(&stat); │ │ │ │ │ +682 │ │ │ │ │ +683 options.IterRefine=SLU_DOUBLE; │ │ │ │ │ +684 │ │ │ │ │ +685 _S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r_<_T_>_:_:_s_o_l_v_e(&options, &static_cast(_m_a_t), │ │ │ │ │ +perm_c, perm_r, etree, &equed, R, C, │ │ │ │ │ +686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr, │ │ │ │ │ +687 &memusage, &stat, &info); │ │ │ │ │ +688 │ │ │ │ │ +689 if(verbose) { │ │ │ │ │ +690 dinfo<<"Triangular solve: dgssvx() returns info "<< info<(_m_a_t).ncol; │ │ │ │ │ +693 │ │ │ │ │ +694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded │ │ │ │ │ +695 │ │ │ │ │ +696 if ( options.IterRefine ) { │ │ │ │ │ +697 dinfo<<"Iterative Refinement: steps=" │ │ │ │ │ +698 < │ │ │ │ │ +_7_1_6 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r<_S_u_p_e_r_L_U<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ +717 { │ │ │ │ │ +_7_1_8 enum { _v_a_l_u_e=true}; │ │ │ │ │ +719 }; │ │ │ │ │ +720 │ │ │ │ │ +721 template │ │ │ │ │ +_7_2_2 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d<_S_u_p_e_r_L_U<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ +723 { │ │ │ │ │ +_7_2_4 enum { _v_a_l_u_e = true }; │ │ │ │ │ +725 }; │ │ │ │ │ +726 │ │ │ │ │ +_7_2_7 struct _S_u_p_e_r_L_U_C_r_e_a_t_o_r { │ │ │ │ │ +_7_2_8 template struct _i_s_V_a_l_i_d_B_l_o_c_k : std::false_type{}; │ │ │ │ │ +_7_2_9 template struct _i_s_V_a_l_i_d_B_l_o_c_k<_D_u_n_e::FieldVector> : std:: │ │ │ │ │ +true_type{}; │ │ │ │ │ +_7_3_0 template struct _i_s_V_a_l_i_d_B_l_o_c_k<_D_u_n_e::FieldVector,k>> : std::true_type{}; │ │ │ │ │ +731 template │ │ │ │ │ +732 std::shared_ptr::type, │ │ │ │ │ +733 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +_7_3_4 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& config, │ │ │ │ │ +735 std::enable_if_t<_i_s_V_a_l_i_d_B_l_o_c_k::type:: │ │ │ │ │ +block_type>::value,int> = 0) const │ │ │ │ │ +736 { │ │ │ │ │ +737 int verbose = config.get("verbose", 0); │ │ │ │ │ +738 return std::make_shared>(_m_a_t,verbose); │ │ │ │ │ +739 } │ │ │ │ │ +740 │ │ │ │ │ +741 // second version with SFINAE to validate the template parameters of │ │ │ │ │ +SuperLU │ │ │ │ │ +742 template │ │ │ │ │ +743 std::shared_ptr::type, │ │ │ │ │ +744 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +_7_4_5 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ +*config*/, │ │ │ │ │ +746 std::enable_if_t:: │ │ │ │ │ +type::block_type>::value,int> = 0) const │ │ │ │ │ +747 { │ │ │ │ │ +748 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, │ │ │ │ │ +749 "Unsupported Type in SuperLU (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +750 } │ │ │ │ │ +751 }; │ │ │ │ │ +_7_5_2 template<> struct _S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k : std::true_type{}; │ │ │ │ │ +_7_5_3 template<> struct _S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k<_s_t_d::complex> : │ │ │ │ │ +std::true_type{}; │ │ │ │ │ +754 │ │ │ │ │ +_7_5_5 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("superlu", _S_u_p_e_r_L_U_C_r_e_a_t_o_r()); │ │ │ │ │ +756} // end namespace DUNE │ │ │ │ │ +757 │ │ │ │ │ +758// undefine macros from SuperLU's slu_util.h │ │ │ │ │ +759#undef FIRSTCOL_OF_SNODE │ │ │ │ │ +760#undef NO_MARKER │ │ │ │ │ +761#undef NUM_TEMPV │ │ │ │ │ +762#undef USER_ABORT │ │ │ │ │ +763#undef USER_MALLOC │ │ │ │ │ +764#undef SUPERLU_MALLOC │ │ │ │ │ +765#undef USER_FREE │ │ │ │ │ +766#undef SUPERLU_FREE │ │ │ │ │ +767#undef CHECK_MALLOC │ │ │ │ │ +768#undef SUPERLU_MAX │ │ │ │ │ +769#undef SUPERLU_MIN │ │ │ │ │ +770#undef L_SUB_START │ │ │ │ │ +771#undef L_SUB │ │ │ │ │ +772#undef L_NZ_START │ │ │ │ │ +773#undef L_FST_SUPC │ │ │ │ │ +774#undef U_NZ_START │ │ │ │ │ +775#undef U_SUB │ │ │ │ │ +776#undef TRUE │ │ │ │ │ +777#undef FALSE │ │ │ │ │ +778#undef EMPTY │ │ │ │ │ +779#undef NODROP │ │ │ │ │ +780#undef DROP_BASIC │ │ │ │ │ +781#undef DROP_PROWS │ │ │ │ │ +782#undef DROP_COLUMN │ │ │ │ │ +783#undef DROP_AREA │ │ │ │ │ +784#undef DROP_SECONDARY │ │ │ │ │ +785#undef DROP_DYNAMIC │ │ │ │ │ +786#undef DROP_INTERP │ │ │ │ │ +787#undef MILU_ALPHA │ │ │ │ │ +788 │ │ │ │ │ +789#endif // HAVE_SUPERLU │ │ │ │ │ +790#endif // DUNE_SUPERLU_HH │ │ │ │ │ +_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h │ │ │ │ │ +_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ +#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ _b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ Implementation of the BCRSMatrix class. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +_s_u_p_e_r_m_a_t_r_i_x_._h_h │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ +void setSubMatrix(const Matrix &mat, const S &rowIndexSet) │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:457 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_a_p_p_l_y │ │ │ │ │ +void apply(domain_type &x, range_type &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator,. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:563 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_s_e_t_V_e_r_b_o_s_i_t_y │ │ │ │ │ +void setVerbosity(bool v) │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:437 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +free allocated space. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:403 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_~_S_u_p_e_r_L_U │ │ │ │ │ +~SuperLU() │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:396 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_S_u_p_e_r_L_U │ │ │ │ │ +SuperLU() │ │ │ │ │ +Empty default constructor. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:432 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +void setMatrix(const Matrix &mat) │ │ │ │ │ +Initialize data from given matrix. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:443 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ A sparse block matrix with compressed row storage. │ │ │ │ │ DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_r_o_w_s_i_z_e_s │ │ │ │ │ -void endrowsizes() │ │ │ │ │ -indicate that size of all rows is defined │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1149 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_a_n_d_o_m │ │ │ │ │ -@ random │ │ │ │ │ -Build entries randomly. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:530 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_i_n_d_i_c_e_s │ │ │ │ │ -void endindices() │ │ │ │ │ -indicate that all indices are defined, check consistency │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1248 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +Sequential overlapping Schwarz preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +Return the number of columns. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ -Set the size of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BCRSMatrix & operator=(const BCRSMatrix &Mat) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:911 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ -A block-diagonal matrix. │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -implement row_type with compressed vector │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ -BDMatrix() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ -BDMatrix(std::initializer_list< B > const &list) │ │ │ │ │ -Construct from a std::initializer_list. │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -B block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ -void solve(V &x, const V &rhs) const │ │ │ │ │ -Solve the system Ax=b in O(n) time. │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -A allocator_type │ │ │ │ │ -export the allocator type │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ -BDMatrix(int size) │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BDMatrix & operator=(const BDMatrix &other) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:103 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr unsigned int blocklevel │ │ │ │ │ -increment block level counter │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type size) │ │ │ │ │ -Resize the matrix. Invalidates the content! │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_i_n_v_e_r_t │ │ │ │ │ -void invert() │ │ │ │ │ -Inverts the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename BDMatrix< B, A >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn bdmatrix.hh:155 │ │ │ │ │ +Return the number of rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ +int iterations │ │ │ │ │ +Number of iterations. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ +bool converged │ │ │ │ │ +True if convergence criterion has been met. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ +@ value │ │ │ │ │ +Whether this is a direct solver. │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ +@ value │ │ │ │ │ +whether the solver internally uses column compressed storage │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_S_o_l_v_e_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_D_e_n_s_e_M_a_t_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_Q_u_e_r_y_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_e_r_y_S_p_a_c_e_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U │ │ │ │ │ +SuperLu Solver. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_n_n_z │ │ │ │ │ +SuperLUMatrix::size_type nnz() const │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_a_p_p_l_y │ │ │ │ │ +void apply(domain_type &x, range_type &b, double reduction, │ │ │ │ │ +InverseOperatorResult &res) │ │ │ │ │ +apply inverse operator, with given convergence criteria. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +typename Impl::SuperLUVectorChooser< M >::range_type range_type │ │ │ │ │ +The type of the range of the solver. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +SuperMatrixInitializer< Matrix > MatrixInitializer │ │ │ │ │ +Type of an associated initializer class. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:280 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_M_a_t_r_i_x │ │ │ │ │ +M Matrix │ │ │ │ │ +The matrix type. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +typename Impl::SuperLUVectorChooser< M >::domain_type domain_type │ │ │ │ │ +The type of the domain of the solver. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_n_a_m_e │ │ │ │ │ +const char * name() │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the solver (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:287 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +Dune::SuperLUMatrix< Matrix > SuperLUMatrix │ │ │ │ │ +The corresponding SuperLU Matrix type. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:278 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_:_:_S_u_p_e_r_L_U │ │ │ │ │ +SuperLU(const Matrix &mat, const ParameterTree &config) │ │ │ │ │ +Constructs the SuperLU solver. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:320 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:727 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL │ │ │ │ │ +>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const │ │ │ │ │ +M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< │ │ │ │ │ +typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) │ │ │ │ │ +const │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:734 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:728 │ │ │ │ │ +_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +Utility class for converting an ISTL Matrix into a SuperLU Matrix. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:179 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00164.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: counter.hh File Reference │ │ │ │ +dune-istl: bcrsmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,125 +65,79 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Variables
│ │ │ │ -
counter.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
bcrsmatrix.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <typeinfo>
│ │ │ │ + │ │ │ │ +

Implementation of the BCRSMatrix class. │ │ │ │ +More...

│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <set>
│ │ │ │ #include <iostream>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <numeric>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <map>
│ │ │ │ #include <memory>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include "matrixutils.hh"
│ │ │ │ +#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::CompressionStatistics< size_type >
 Statistics about compression achieved in implicit mode. More...
 
class  Dune::ImplicitMatrixBuilder< M_ >
 A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mode. More...
 
class  Dune::ImplicitMatrixBuilder< M_ >::row_object
 Proxy row object for entry access. More...
 
class  Dune::BCRSMatrix< B, A >
 A sparse block matrix with compressed row storage. More...
 
class  Dune::BCRSMatrix< B, A >::RealRowIterator< T >
 Iterator access to matrix rows More...
 
class  Dune::BCRSMatrix< B, A >::CreateIterator
 Iterator class for sequential creation of blocks More...
 
struct  Dune::FieldTraits< BCRSMatrix< B, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::CounterImpl
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_GET_COUNTER(Tag)    (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
 
#define DUNE_INC_COUNTER(Tag)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Variables

constexpr std::size_t maxcount = 100
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GET_COUNTER

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GET_COUNTER( Tag)    (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

◆ DUNE_INC_COUNTER

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_INC_COUNTER( Tag)
│ │ │ │ -
│ │ │ │ -Value:
namespace { \
│ │ │ │ -
namespace CounterImpl { \
│ │ │ │ -
constexpr std::size_t \
│ │ │ │ -
counterFunc(Dune::PriorityTag<DUNE_GET_COUNTER(Tag)+1> p, Tag, ADLTag) \
│ │ │ │ -
{ \
│ │ │ │ -
return p.value; \
│ │ │ │ -
} \
│ │ │ │ -
} \
│ │ │ │ -
} \
│ │ │ │ -
static_assert(true, "unfudge indentation")
│ │ │ │ -
#define DUNE_GET_COUNTER(Tag)
Definition counter.hh:17
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -

Variable Documentation

│ │ │ │ - │ │ │ │ -

◆ maxcount

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
constexpr std::size_t maxcount = 100
│ │ │ │ -
│ │ │ │ -constexpr
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Implementation of the BCRSMatrix class.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,56 +1,58 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -counter.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +bcrsmatrix.hh File Reference │ │ │ │ │ +Implementation of the BCRSMatrix class. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_<_ _s_i_z_e___t_y_p_e_ _> │ │ │ │ │ +  Statistics about compression achieved in implicit mode. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_<_ _M___ _> │ │ │ │ │ +  A wrapper for uniform access to the _B_C_R_S_M_a_t_r_i_x during and after the │ │ │ │ │ + build stage in implicit build mode. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_<_ _M___ _>_:_:_r_o_w___o_b_j_e_c_t │ │ │ │ │ +  Proxy row object for entry access. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _> │ │ │ │ │ +  A sparse block matrix with compressed row storage. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_ _T_ _> │ │ │ │ │ +  Iterator access to matrix rows _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +  Iterator class for sequential creation of blocks _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_C_o_u_n_t_e_r_I_m_p_l │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag)    (counterFunc(Dune::PriorityTag<_m_a_x_c_o_u_n_t>{}, │ │ │ │ │ - Tag{}, Dune::CounterImpl::ADLTag{})) │ │ │ │ │ -  │ │ │ │ │ -#define  _D_U_N_E___I_N_C___C_O_U_N_T_E_R(Tag) │ │ │ │ │ -  │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ -constexpr std::size_t  _m_a_x_c_o_u_n_t = 100 │ │ │ │ │ -  │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEETT__CCOOUUNNTTEERR ********** │ │ │ │ │ -#define DUNE_GET_COUNTER (   Tag )     (counterFunc(Dune::PriorityTag<_m_a_x_c_o_u_n_t> │ │ │ │ │ - {}, Tag{}, Dune::CounterImpl::ADLTag{})) │ │ │ │ │ -********** _?◆_? DDUUNNEE__IINNCC__CCOOUUNNTTEERR ********** │ │ │ │ │ -#define DUNE_INC_COUNTER (   Tag ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -namespace { \ │ │ │ │ │ -namespace CounterImpl { \ │ │ │ │ │ -constexpr std::size_t \ │ │ │ │ │ -counterFunc(Dune::PriorityTag<_D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag)+1> p, Tag, ADLTag) \ │ │ │ │ │ -{ \ │ │ │ │ │ -return p.value; \ │ │ │ │ │ -} \ │ │ │ │ │ -} \ │ │ │ │ │ -} \ │ │ │ │ │ -static_assert(true, "unfudge indentation") │ │ │ │ │ -_D_U_N_E___G_E_T___C_O_U_N_T_E_R │ │ │ │ │ -#define DUNE_GET_COUNTER(Tag) │ │ │ │ │ -DDeeffiinniittiioonn counter.hh:17 │ │ │ │ │ -********** VVaarriiaabbllee DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? mmaaxxccoouunntt ********** │ │ │ │ │ -constexpr std::size_t maxcount = 100 constexpr │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: counter.hh Source File │ │ │ │ +dune-istl: bcrsmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,77 +70,2076 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
counter.hh
│ │ │ │ +
bcrsmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#ifndef DUNE_ISTL_COMMON_COUNTER_HH
│ │ │ │ -
4#define DUNE_ISTL_COMMON_COUNTER_HH
│ │ │ │ +
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
5
│ │ │ │ -
6#include <cassert>
│ │ │ │ -
7#include <typeinfo>
│ │ │ │ -
8#include <iostream>
│ │ │ │ -
9#include <memory>
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/typeutilities.hh>
│ │ │ │ -
14
│ │ │ │ -
15constexpr std::size_t maxcount = 100;
│ │ │ │ -
16
│ │ │ │ -
│ │ │ │ -
17#define DUNE_GET_COUNTER(Tag) \
│ │ │ │ -
18 (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
│ │ │ │ -
│ │ │ │ -
19
│ │ │ │ -
│ │ │ │ -
20#define DUNE_INC_COUNTER(Tag) \
│ │ │ │ -
21 namespace { \
│ │ │ │ -
22 namespace CounterImpl { \
│ │ │ │ -
23 constexpr std::size_t \
│ │ │ │ -
24 counterFunc(Dune::PriorityTag<DUNE_GET_COUNTER(Tag)+1> p, Tag, ADLTag) \
│ │ │ │ -
25 { \
│ │ │ │ -
26 return p.value; \
│ │ │ │ -
27 } \
│ │ │ │ -
28 } \
│ │ │ │ -
29 } \
│ │ │ │ -
30 static_assert(true, "unfudge indentation")
│ │ │ │ -
│ │ │ │ -
31
│ │ │ │ -
32namespace Dune {
│ │ │ │ -
33 namespace {
│ │ │ │ -
34
│ │ │ │ -
│ │ │ │ -
35 namespace CounterImpl {
│ │ │ │ +
6#ifndef DUNE_ISTL_BCRSMATRIX_HH
│ │ │ │ +
7#define DUNE_ISTL_BCRSMATRIX_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <cmath>
│ │ │ │ +
10#include <complex>
│ │ │ │ +
11#include <set>
│ │ │ │ +
12#include <iostream>
│ │ │ │ +
13#include <algorithm>
│ │ │ │ +
14#include <numeric>
│ │ │ │ +
15#include <vector>
│ │ │ │ +
16#include <map>
│ │ │ │ +
17#include <memory>
│ │ │ │ +
18
│ │ │ │ +
19#include "istlexception.hh"
│ │ │ │ +
20#include "bvector.hh"
│ │ │ │ +
21#include "matrixutils.hh"
│ │ │ │ +
22#include <dune/common/stdstreams.hh>
│ │ │ │ +
23#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
24#include <dune/common/typetraits.hh>
│ │ │ │ +
25#include <dune/common/ftraits.hh>
│ │ │ │ +
26#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
27#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
28
│ │ │ │ + │ │ │ │ +
30
│ │ │ │ +
35namespace Dune {
│ │ │ │
36
│ │ │ │ -
37 struct ADLTag {};
│ │ │ │ -
38
│ │ │ │ -
39 template<class Tag>
│ │ │ │ -
40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag)
│ │ │ │ -
41 {
│ │ │ │ -
42 return 0;
│ │ │ │ -
43 }
│ │ │ │ -
44
│ │ │ │ -
45 } // end namespace CounterImpl
│ │ │ │ -
│ │ │ │ -
46 } // end empty namespace
│ │ │ │ -
47} // end namespace Dune
│ │ │ │ -
48#endif // DUNE_ISTL_COMMON_COUNTER_HH
│ │ │ │ -
constexpr std::size_t maxcount
Definition counter.hh:15
│ │ │ │ +
76 template<typename M>
│ │ │ │ +
77 struct MatrixDimension;
│ │ │ │ +
78
│ │ │ │ +
80
│ │ │ │ +
86 template<typename size_type>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
88 {
│ │ │ │ +
90 double avg;
│ │ │ │ +
92 size_type maximum;
│ │ │ │ +
94 size_type overflow_total;
│ │ │ │ +
96
│ │ │ │ +
99 double mem_ratio;
│ │ │ │ +
100 };
│ │ │ │ +
│ │ │ │ +
101
│ │ │ │ +
103
│ │ │ │ +
115 template<class M_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 {
│ │ │ │ +
118
│ │ │ │ +
119 public:
│ │ │ │ +
120
│ │ │ │ +
122 typedef M_ Matrix;
│ │ │ │ +
123
│ │ │ │ + │ │ │ │ +
126
│ │ │ │ +
128 typedef typename Matrix::size_type size_type;
│ │ │ │ +
129
│ │ │ │ +
131
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
137 {
│ │ │ │ +
138
│ │ │ │ +
139 public:
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
143 {
│ │ │ │ +
144 return _m.entry(_i,j);
│ │ │ │ +
145 }
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
147#ifndef DOXYGEN
│ │ │ │ +
148
│ │ │ │ + │ │ │ │ +
150 : _m(m)
│ │ │ │ +
151 , _i(i)
│ │ │ │ +
152 {}
│ │ │ │ +
153
│ │ │ │ +
154#endif
│ │ │ │ +
155
│ │ │ │ +
156 private:
│ │ │ │ +
157
│ │ │ │ +
158 Matrix& _m;
│ │ │ │ + │ │ │ │ +
160
│ │ │ │ +
161 };
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
164
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
171 : _m(m)
│ │ │ │ +
172 {
│ │ │ │ +
173 if (m.buildMode() != Matrix::implicit)
│ │ │ │ +
174 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix in implicit build mode");
│ │ │ │ +
175 if (m.buildStage() != Matrix::building)
│ │ │ │ +
176 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix with set size that has not been compressed() yet");
│ │ │ │ +
177 }
│ │ │ │ +
│ │ │ │ +
178
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ +
194 ImplicitMatrixBuilder(Matrix& m, size_type rows, size_type cols, size_type avg_cols_per_row, double overflow_fraction)
│ │ │ │ +
195 : _m(m)
│ │ │ │ +
196 {
│ │ │ │ +
197 if (m.buildStage() != Matrix::notAllocated)
│ │ │ │ +
198 DUNE_THROW(BCRSMatrixError,"You can only set up a matrix for this ImplicitBuilder if it has no memory allocated yet");
│ │ │ │ +
199 m.setBuildMode(Matrix::implicit);
│ │ │ │ +
200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction);
│ │ │ │ +
201 m.setSize(rows,cols);
│ │ │ │ +
202 }
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
206 {
│ │ │ │ +
207 return row_object(_m,i);
│ │ │ │ +
208 }
│ │ │ │ +
│ │ │ │ +
209
│ │ │ │ +
│ │ │ │ +
211 size_type N() const
│ │ │ │ +
212 {
│ │ │ │ +
213 return _m.N();
│ │ │ │ +
214 }
│ │ │ │ +
│ │ │ │ +
215
│ │ │ │ +
│ │ │ │ +
217 size_type M() const
│ │ │ │ +
218 {
│ │ │ │ +
219 return _m.M();
│ │ │ │ +
220 }
│ │ │ │ +
│ │ │ │ +
221
│ │ │ │ +
222 private:
│ │ │ │ +
223
│ │ │ │ +
224 Matrix& _m;
│ │ │ │ +
225
│ │ │ │ +
226 };
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
464 template<class B, class A=std::allocator<B> >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
466 {
│ │ │ │ +
467 friend struct MatrixDimension<BCRSMatrix>;
│ │ │ │ +
468 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
482 built=3
│ │ │ │ +
483 };
│ │ │ │ +
│ │ │ │ +
484
│ │ │ │ +
485 //===== type definitions and constants
│ │ │ │ +
486
│ │ │ │ +
488 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
489
│ │ │ │ +
491 typedef B block_type;
│ │ │ │ +
492
│ │ │ │ +
494 typedef A allocator_type;
│ │ │ │ +
495
│ │ │ │ +
497 typedef Imp::CompressedBlockVectorWindow<B,A> row_type;
│ │ │ │ +
498
│ │ │ │ +
500 typedef typename A::size_type size_type;
│ │ │ │ +
501
│ │ │ │ +
503 typedef ::Dune::CompressionStatistics<size_type> CompressionStatistics;
│ │ │ │ +
504
│ │ │ │ +
506 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
507 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ +
508
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
543 unknown
│ │ │ │ +
544 };
│ │ │ │ +
│ │ │ │ +
545
│ │ │ │ +
546 //===== random access interface to rows of the matrix
│ │ │ │ +
547
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
550 {
│ │ │ │ +
551#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
552 if (build_mode == implicit && ready != built)
│ │ │ │ +
553 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
│ │ │ │ +
554 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
│ │ │ │ +
555 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
556#endif
│ │ │ │ +
557 return r[i];
│ │ │ │ +
558 }
│ │ │ │ +
│ │ │ │ +
559
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
562 {
│ │ │ │ +
563#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
564 if (build_mode == implicit && ready != built)
│ │ │ │ +
565 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
│ │ │ │ +
566 if (built!=ready) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
│ │ │ │ +
567 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
568#endif
│ │ │ │ +
569 return r[i];
│ │ │ │ +
570 }
│ │ │ │ +
│ │ │ │ +
571
│ │ │ │ +
572
│ │ │ │ +
573 //===== iterator interface to rows of the matrix
│ │ │ │ +
574
│ │ │ │ +
576 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
578 : public RandomAccessIteratorFacade<RealRowIterator<T>, T>
│ │ │ │ +
579 {
│ │ │ │ +
580
│ │ │ │ +
581 public:
│ │ │ │ +
583 typedef typename std::remove_const<T>::type ValueType;
│ │ │ │ +
584
│ │ │ │ +
585 friend class RandomAccessIteratorFacade<RealRowIterator<const ValueType>, const ValueType>;
│ │ │ │ +
586 friend class RandomAccessIteratorFacade<RealRowIterator<ValueType>, ValueType>;
│ │ │ │ +
587 friend class RealRowIterator<const ValueType>;
│ │ │ │ +
588 friend class RealRowIterator<ValueType>;
│ │ │ │ +
589
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
592 : p(_p), i(_i)
│ │ │ │ +
593 {}
│ │ │ │ +
│ │ │ │ +
594
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
597 : p(0), i(0)
│ │ │ │ +
598 {}
│ │ │ │ +
│ │ │ │ +
599
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
601 : p(it.p), i(it.i)
│ │ │ │ +
602 {}
│ │ │ │ +
│ │ │ │ +
603
│ │ │ │ +
604
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
607 {
│ │ │ │ +
608 return i;
│ │ │ │ +
609 }
│ │ │ │ +
│ │ │ │ +
610
│ │ │ │ +
│ │ │ │ +
611 std::ptrdiff_t distanceTo(const RealRowIterator<ValueType>& other) const
│ │ │ │ +
612 {
│ │ │ │ +
613 assert(other.p==p);
│ │ │ │ +
614 return (other.i-i);
│ │ │ │ +
615 }
│ │ │ │ +
│ │ │ │ +
616
│ │ │ │ +
│ │ │ │ +
617 std::ptrdiff_t distanceTo(const RealRowIterator<const ValueType>& other) const
│ │ │ │ +
618 {
│ │ │ │ +
619 assert(other.p==p);
│ │ │ │ +
620 return (other.i-i);
│ │ │ │ +
621 }
│ │ │ │ +
│ │ │ │ +
622
│ │ │ │ +
│ │ │ │ +
624 bool equals (const RealRowIterator<ValueType>& other) const
│ │ │ │ +
625 {
│ │ │ │ +
626 assert(other.p==p);
│ │ │ │ +
627 return i==other.i;
│ │ │ │ +
628 }
│ │ │ │ +
│ │ │ │ +
629
│ │ │ │ +
│ │ │ │ +
631 bool equals (const RealRowIterator<const ValueType>& other) const
│ │ │ │ +
632 {
│ │ │ │ +
633 assert(other.p==p);
│ │ │ │ +
634 return i==other.i;
│ │ │ │ +
635 }
│ │ │ │ +
│ │ │ │ +
636
│ │ │ │ +
637 private:
│ │ │ │ +
639 void increment()
│ │ │ │ +
640 {
│ │ │ │ +
641 ++i;
│ │ │ │ +
642 }
│ │ │ │ +
643
│ │ │ │ +
645 void decrement()
│ │ │ │ +
646 {
│ │ │ │ +
647 --i;
│ │ │ │ +
648 }
│ │ │ │ +
649
│ │ │ │ +
650 void advance(std::ptrdiff_t diff)
│ │ │ │ +
651 {
│ │ │ │ +
652 i+=diff;
│ │ │ │ +
653 }
│ │ │ │ +
654
│ │ │ │ +
655 T& elementAt(std::ptrdiff_t diff) const
│ │ │ │ +
656 {
│ │ │ │ +
657 return p[i+diff];
│ │ │ │ +
658 }
│ │ │ │ +
659
│ │ │ │ +
661 row_type& dereference () const
│ │ │ │ +
662 {
│ │ │ │ +
663 return p[i];
│ │ │ │ +
664 }
│ │ │ │ +
665
│ │ │ │ +
666 row_type* p;
│ │ │ │ +
667 size_type i;
│ │ │ │ +
668 };
│ │ │ │ +
│ │ │ │ +
669
│ │ │ │ + │ │ │ │ + │ │ │ │ +
673
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
676 {
│ │ │ │ +
677 return Iterator(r,0);
│ │ │ │ +
678 }
│ │ │ │ +
│ │ │ │ +
679
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
682 {
│ │ │ │ +
683 return Iterator(r,n);
│ │ │ │ +
684 }
│ │ │ │ +
│ │ │ │ +
685
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
689 {
│ │ │ │ +
690 return Iterator(r,n-1);
│ │ │ │ +
691 }
│ │ │ │ +
│ │ │ │ +
692
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
696 {
│ │ │ │ +
697 return Iterator(r,-1);
│ │ │ │ +
698 }
│ │ │ │ +
│ │ │ │ +
699
│ │ │ │ + │ │ │ │ +
702
│ │ │ │ +
704 typedef typename row_type::Iterator ColIterator;
│ │ │ │ +
705
│ │ │ │ + │ │ │ │ + │ │ │ │ +
709
│ │ │ │ +
710
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
713 {
│ │ │ │ +
714 return ConstIterator(r,0);
│ │ │ │ +
715 }
│ │ │ │ +
│ │ │ │ +
716
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
719 {
│ │ │ │ +
720 return ConstIterator(r,n);
│ │ │ │ +
721 }
│ │ │ │ +
│ │ │ │ +
722
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
726 {
│ │ │ │ +
727 return ConstIterator(r,n-1);
│ │ │ │ +
728 }
│ │ │ │ +
│ │ │ │ +
729
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
733 {
│ │ │ │ +
734 return ConstIterator(r,-1);
│ │ │ │ +
735 }
│ │ │ │ +
│ │ │ │ +
736
│ │ │ │ + │ │ │ │ +
739
│ │ │ │ +
741 typedef typename row_type::ConstIterator ConstColIterator;
│ │ │ │ +
742
│ │ │ │ +
743 //===== constructors & resizers
│ │ │ │ +
744
│ │ │ │ +
745 // we use a negative compressionBufferSize to indicate that the implicit
│ │ │ │ +
746 // mode parameters have not been set yet
│ │ │ │ +
747
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
750 : build_mode(unknown), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ +
751 allocationSize_(0), r(0), a(0),
│ │ │ │ + │ │ │ │ +
753 {}
│ │ │ │ +
│ │ │ │ +
754
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
757 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ +
758 allocationSize_(0), r(0), a(0),
│ │ │ │ + │ │ │ │ +
760 {
│ │ │ │ +
761 allocate(_n, _m, _nnz,true,false);
│ │ │ │ +
762 }
│ │ │ │ +
│ │ │ │ +
763
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
766 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ +
767 allocationSize_(0), r(0), a(0),
│ │ │ │ + │ │ │ │ +
769 {
│ │ │ │ +
770 allocate(_n, _m,0,true,false);
│ │ │ │ +
771 }
│ │ │ │ +
│ │ │ │ +
772
│ │ │ │ +
774
│ │ │ │ +
│ │ │ │ +
784 BCRSMatrix (size_type _n, size_type _m, size_type _avg, double compressionBufferSize, BuildMode bm)
│ │ │ │ +
785 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ +
786 allocationSize_(0), r(0), a(0),
│ │ │ │ +
787 avg(_avg), compressionBufferSize_(compressionBufferSize)
│ │ │ │ +
788 {
│ │ │ │ +
789 if (bm != implicit)
│ │ │ │ +
790 DUNE_THROW(BCRSMatrixError,"Only call this constructor when using the implicit build mode");
│ │ │ │ +
791 // Prevent user from setting a negative compression buffer size:
│ │ │ │ +
792 // 1) It doesn't make sense
│ │ │ │ +
793 // 2) We use a negative value to indicate that the parameters
│ │ │ │ +
794 // have not been set yet
│ │ │ │ +
795 if (compressionBufferSize_ < 0.0)
│ │ │ │ +
796 DUNE_THROW(BCRSMatrixError,"You cannot set a negative overflow fraction");
│ │ │ │ +
797 implicit_allocate(_n,_m);
│ │ │ │ +
798 }
│ │ │ │ +
│ │ │ │ +
799
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
806 : build_mode(Mat.build_mode), ready(notAllocated), n(0), m(0), nnz_(0),
│ │ │ │ +
807 allocationSize_(0), r(0), a(0),
│ │ │ │ + │ │ │ │ +
809 {
│ │ │ │ +
810 if (!(Mat.ready == notAllocated || Mat.ready == built))
│ │ │ │ +
811 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copy-constructed when source matrix is completely empty (size not set) or fully built)");
│ │ │ │ +
812
│ │ │ │ +
813 // deep copy in global array
│ │ │ │ +
814 size_type _nnz = Mat.nonzeroes();
│ │ │ │ +
815
│ │ │ │ +
816 j_ = Mat.j_; // enable column index sharing, release array in case of row-wise allocation
│ │ │ │ +
817 allocate(Mat.n, Mat.m, _nnz, true, true);
│ │ │ │ +
818
│ │ │ │ +
819 // build window structure
│ │ │ │ + │ │ │ │ +
821 }
│ │ │ │ +
│ │ │ │ +
822
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
825 {
│ │ │ │ +
826 deallocate();
│ │ │ │ +
827 }
│ │ │ │ +
│ │ │ │ +
828
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
834 {
│ │ │ │ +
835 if (ready == notAllocated)
│ │ │ │ +
836 {
│ │ │ │ +
837 build_mode = bm;
│ │ │ │ +
838 return;
│ │ │ │ +
839 }
│ │ │ │ +
840 if (ready == building && (build_mode == unknown || build_mode == random || build_mode == row_wise) && (bm == row_wise || bm == random))
│ │ │ │ +
841 build_mode = bm;
│ │ │ │ +
842 else
│ │ │ │ +
843 DUNE_THROW(InvalidStateException, "Matrix structure cannot be changed at this stage anymore (ready == "<<ready<<").");
│ │ │ │ +
844 }
│ │ │ │ +
│ │ │ │ +
845
│ │ │ │ +
│ │ │ │ +
861 void setSize(size_type rows, size_type columns, size_type nnz=0)
│ │ │ │ +
862 {
│ │ │ │ +
863 // deallocate already setup memory
│ │ │ │ +
864 deallocate();
│ │ │ │ +
865
│ │ │ │ +
866 if (build_mode == implicit)
│ │ │ │ +
867 {
│ │ │ │ +
868 if (nnz>0)
│ │ │ │ +
869 DUNE_THROW(Dune::BCRSMatrixError,"number of non-zeroes may not be set in implicit mode, use setImplicitBuildModeParameters() instead");
│ │ │ │ +
870
│ │ │ │ +
871 // implicit allocates differently
│ │ │ │ +
872 implicit_allocate(rows,columns);
│ │ │ │ +
873 }
│ │ │ │ +
874 else
│ │ │ │ +
875 {
│ │ │ │ +
876 // allocate matrix memory
│ │ │ │ +
877 allocate(rows, columns, nnz, true, false);
│ │ │ │ +
878 }
│ │ │ │ +
879 }
│ │ │ │ +
│ │ │ │ +
880
│ │ │ │ +
│ │ │ │ +
889 void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
│ │ │ │ +
890 {
│ │ │ │ +
891 // Prevent user from setting a negative compression buffer size:
│ │ │ │ +
892 // 1) It doesn't make sense
│ │ │ │ +
893 // 2) We use a negative value to indicate that the parameters
│ │ │ │ +
894 // have not been set yet
│ │ │ │ +
895 if (compressionBufferSize < 0.0)
│ │ │ │ +
896 DUNE_THROW(BCRSMatrixError,"You cannot set a negative compressionBufferSize value");
│ │ │ │ +
897
│ │ │ │ +
898 // make sure the parameters aren't changed after memory has been allocated
│ │ │ │ +
899 if (ready != notAllocated)
│ │ │ │ +
900 DUNE_THROW(InvalidStateException,"You cannot modify build mode parameters at this stage anymore");
│ │ │ │ +
901 avg = _avg;
│ │ │ │ +
902 compressionBufferSize_ = compressionBufferSize;
│ │ │ │ +
903 }
│ │ │ │ +
│ │ │ │ +
904
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
912 {
│ │ │ │ +
913 // return immediately when self-assignment
│ │ │ │ +
914 if (&Mat==this) return *this;
│ │ │ │ +
915
│ │ │ │ +
916 if (!((ready == notAllocated || ready == built) && (Mat.ready == notAllocated || Mat.ready == built)))
│ │ │ │ +
917 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copied when both target and source are empty or fully built)");
│ │ │ │ +
918
│ │ │ │ +
919 // make it simple: ALWAYS throw away memory for a and j_
│ │ │ │ +
920 // and deallocate rows only if n != Mat.n
│ │ │ │ +
921 deallocate(n!=Mat.n);
│ │ │ │ +
922
│ │ │ │ +
923 // reallocate the rows if required
│ │ │ │ +
924 if (n>0 && n!=Mat.n) {
│ │ │ │ +
925 // free rows
│ │ │ │ +
926 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
│ │ │ │ +
927 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
│ │ │ │ +
928 rowAllocator_.deallocate(r,n);
│ │ │ │ +
929 }
│ │ │ │ +
930
│ │ │ │ +
931 nnz_ = Mat.nonzeroes();
│ │ │ │ +
932
│ │ │ │ +
933 // allocate a, share j_
│ │ │ │ +
934 j_ = Mat.j_;
│ │ │ │ +
935 allocate(Mat.n, Mat.m, nnz_, n!=Mat.n, true);
│ │ │ │ +
936
│ │ │ │ +
937 // build window structure
│ │ │ │ + │ │ │ │ +
939 return *this;
│ │ │ │ +
940 }
│ │ │ │ +
│ │ │ │ +
941
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
944 {
│ │ │ │ +
945
│ │ │ │ +
946 if (!(ready == notAllocated || ready == built))
│ │ │ │ +
947 DUNE_THROW(InvalidStateException,"Scalar assignment only works on fully built BCRSMatrix)");
│ │ │ │ +
948
│ │ │ │ +
949 for (size_type i=0; i<n; i++) r[i] = k;
│ │ │ │ +
950 return *this;
│ │ │ │ +
951 }
│ │ │ │ +
│ │ │ │ +
952
│ │ │ │ +
953 //===== row-wise creation interface
│ │ │ │ +
954
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
957 {
│ │ │ │ +
958 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
961 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat.j_.get(), 0)
│ │ │ │ +
962 {
│ │ │ │ +
963 if (Mat.build_mode == unknown && Mat.ready == building)
│ │ │ │ +
964 {
│ │ │ │ +
965 Mat.build_mode = row_wise;
│ │ │ │ +
966 }
│ │ │ │ +
967 if (i==0 && Mat.ready != building)
│ │ │ │ +
968 DUNE_THROW(BCRSMatrixError,"creation only allowed for uninitialized matrix");
│ │ │ │ +
969 if(Mat.build_mode!=row_wise)
│ │ │ │ +
970 DUNE_THROW(BCRSMatrixError,"creation only allowed if row wise allocation was requested in the constructor");
│ │ │ │ +
971 if(i==0 && _Mat.N()==0)
│ │ │ │ +
972 // empty Matrix is always built.
│ │ │ │ +
973 Mat.ready = built;
│ │ │ │ +
974 }
│ │ │ │ +
│ │ │ │ +
975
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
978 {
│ │ │ │ +
979 // this should only be called if matrix is in creation
│ │ │ │ +
980 if (Mat.ready != building)
│ │ │ │ +
981 DUNE_THROW(BCRSMatrixError,"matrix already built up");
│ │ │ │ +
982
│ │ │ │ +
983 // row i is defined through the pattern
│ │ │ │ +
984 // get memory for the row and initialize the j_ array
│ │ │ │ +
985 // this depends on the allocation mode
│ │ │ │ +
986
│ │ │ │ +
987 // compute size of the row
│ │ │ │ +
988 size_type s = pattern.size();
│ │ │ │ +
989
│ │ │ │ +
990 if(s>0) {
│ │ │ │ +
991 // update number of nonzeroes including this row
│ │ │ │ +
992 nnz += s;
│ │ │ │ +
993
│ │ │ │ +
994 // alloc memory / set window
│ │ │ │ +
995 if (Mat.nnz_ > 0)
│ │ │ │ +
996 {
│ │ │ │ +
997 // memory is allocated in one long array
│ │ │ │ +
998
│ │ │ │ +
999 // check if that memory is sufficient
│ │ │ │ +
1000 if (nnz > Mat.nnz_)
│ │ │ │ +
1001 DUNE_THROW(BCRSMatrixError,"allocated nnz too small");
│ │ │ │ +
1002
│ │ │ │ +
1003 // set row i
│ │ │ │ +
1004 Mat.r[i].set(s,nullptr,current_row.getindexptr());
│ │ │ │ +
1005 current_row.setindexptr(current_row.getindexptr()+s);
│ │ │ │ +
1006 }else{
│ │ │ │ +
1007 // memory is allocated individually per row
│ │ │ │ +
1008 // allocate and set row i
│ │ │ │ +
1009 B* b = Mat.allocator_.allocate(s);
│ │ │ │ +
1010 // use placement new to call constructor that allocates
│ │ │ │ +
1011 // additional memory.
│ │ │ │ +
1012 new (b) B[s];
│ │ │ │ +
1013 size_type* j = Mat.sizeAllocator_.allocate(s);
│ │ │ │ +
1014 Mat.r[i].set(s,b,j);
│ │ │ │ +
1015 }
│ │ │ │ +
1016 }else
│ │ │ │ +
1017 // setup empty row
│ │ │ │ +
1018 Mat.r[i].set(0,nullptr,nullptr);
│ │ │ │ +
1019
│ │ │ │ +
1020 // initialize the j array for row i from pattern
│ │ │ │ +
1021 std::copy(pattern.cbegin(), pattern.cend(), Mat.r[i].getindexptr());
│ │ │ │ +
1022
│ │ │ │ +
1023 // now go to next row
│ │ │ │ +
1024 i++;
│ │ │ │ +
1025 pattern.clear();
│ │ │ │ +
1026
│ │ │ │ +
1027 // check if this was last row
│ │ │ │ +
1028 if (i==Mat.n)
│ │ │ │ +
1029 {
│ │ │ │ +
1030 Mat.ready = built;
│ │ │ │ +
1031 if(Mat.nnz_ > 0)
│ │ │ │ +
1032 {
│ │ │ │ +
1033 // Set nnz to the exact number of nonzero blocks inserted
│ │ │ │ +
1034 // as some methods rely on it
│ │ │ │ +
1035 Mat.nnz_ = nnz;
│ │ │ │ +
1036 // allocate data array
│ │ │ │ +
1037 Mat.allocateData();
│ │ │ │ +
1038 Mat.setDataPointers();
│ │ │ │ +
1039 }
│ │ │ │ +
1040 }
│ │ │ │ +
1041 // done
│ │ │ │ +
1042 return *this;
│ │ │ │ +
1043 }
│ │ │ │ +
│ │ │ │ +
1044
│ │ │ │ +
│ │ │ │ +
1046 bool operator!= (const CreateIterator& it) const
│ │ │ │ +
1047 {
│ │ │ │ +
1048 return (i!=it.i) || (&Mat!=&it.Mat);
│ │ │ │ +
1049 }
│ │ │ │ +
│ │ │ │ +
1050
│ │ │ │ +
│ │ │ │ +
1052 bool operator== (const CreateIterator& it) const
│ │ │ │ +
1053 {
│ │ │ │ +
1054 return (i==it.i) && (&Mat==&it.Mat);
│ │ │ │ +
1055 }
│ │ │ │ +
│ │ │ │ +
1056
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1059 {
│ │ │ │ +
1060 return i;
│ │ │ │ +
1061 }
│ │ │ │ +
│ │ │ │ +
1062
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1065 {
│ │ │ │ +
1066 pattern.insert(j);
│ │ │ │ +
1067 }
│ │ │ │ +
│ │ │ │ +
1068
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1071 {
│ │ │ │ +
1072 return pattern.find(j) != pattern.end();
│ │ │ │ +
1073 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1080 {
│ │ │ │ +
1081 return pattern.size();
│ │ │ │ +
1082 }
│ │ │ │ +
│ │ │ │ +
1083
│ │ │ │ +
1084 private:
│ │ │ │ +
1085 BCRSMatrix& Mat; // the matrix we are defining
│ │ │ │ +
1086 size_type i; // current row to be defined
│ │ │ │ +
1087 size_type nnz; // count total number of nonzeros
│ │ │ │ +
1088 typedef std::set<size_type,std::less<size_type> > PatternType;
│ │ │ │ +
1089 PatternType pattern; // used to compile entries in a row
│ │ │ │ +
1090 row_type current_row; // row pointing to the current row to setup
│ │ │ │ +
1091 };
│ │ │ │ +
│ │ │ │ +
1092
│ │ │ │ +
1094 friend class CreateIterator;
│ │ │ │ +
1095
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1098 {
│ │ │ │ +
1099 return CreateIterator(*this,0);
│ │ │ │ +
1100 }
│ │ │ │ +
│ │ │ │ +
1101
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1104 {
│ │ │ │ +
1105 return CreateIterator(*this,n);
│ │ │ │ +
1106 }
│ │ │ │ +
│ │ │ │ +
1107
│ │ │ │ +
1108
│ │ │ │ +
1109 //===== random creation interface
│ │ │ │ +
1110
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1118 {
│ │ │ │ +
1119 if (build_mode!=random)
│ │ │ │ +
1120 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ +
1121 if (ready != building)
│ │ │ │ +
1122 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
│ │ │ │ +
1123
│ │ │ │ +
1124 r[i].setsize(s);
│ │ │ │ +
1125 }
│ │ │ │ +
│ │ │ │ +
1126
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1129 {
│ │ │ │ +
1130#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1131 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
│ │ │ │ +
1132 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1133#endif
│ │ │ │ +
1134 return r[i].getsize();
│ │ │ │ +
1135 }
│ │ │ │ +
│ │ │ │ +
1136
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1139 {
│ │ │ │ +
1140 if (build_mode!=random)
│ │ │ │ +
1141 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ +
1142 if (ready != building)
│ │ │ │ +
1143 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
│ │ │ │ +
1144
│ │ │ │ +
1145 r[i].setsize(r[i].getsize()+s);
│ │ │ │ +
1146 }
│ │ │ │ +
│ │ │ │ +
1147
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1150 {
│ │ │ │ +
1151 if (build_mode!=random)
│ │ │ │ +
1152 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ +
1153 if (ready != building)
│ │ │ │ +
1154 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
│ │ │ │ +
1155
│ │ │ │ +
1156 // compute total size, check positivity
│ │ │ │ +
1157 size_type total=0;
│ │ │ │ +
1158 for (size_type i=0; i<n; i++)
│ │ │ │ +
1159 {
│ │ │ │ +
1160 total += r[i].getsize();
│ │ │ │ +
1161 }
│ │ │ │ +
1162
│ │ │ │ +
1163 if(nnz_ == 0)
│ │ │ │ +
1164 // allocate/check memory
│ │ │ │ +
1165 allocate(n,m,total,false,false);
│ │ │ │ +
1166 else if(nnz_ < total)
│ │ │ │ +
1167 DUNE_THROW(BCRSMatrixError,"Specified number of nonzeros ("<<nnz_<<") not "
│ │ │ │ +
1168 <<"sufficient for calculated nonzeros ("<<total<<"! ");
│ │ │ │ +
1169
│ │ │ │ +
1170 // set the window pointers correctly
│ │ │ │ + │ │ │ │ +
1172
│ │ │ │ +
1173 // initialize j_ array with m (an invalid column index)
│ │ │ │ +
1174 // this indicates an unused entry
│ │ │ │ +
1175 for (size_type k=0; k<nnz_; k++)
│ │ │ │ +
1176 j_.get()[k] = m;
│ │ │ │ + │ │ │ │ +
1178 }
│ │ │ │ +
│ │ │ │ +
1179
│ │ │ │ +
1181
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1192 {
│ │ │ │ +
1193 if (build_mode!=random)
│ │ │ │ +
1194 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ +
1195 if (ready==built)
│ │ │ │ +
1196 DUNE_THROW(BCRSMatrixError,"matrix already built up");
│ │ │ │ +
1197 if (ready==building)
│ │ │ │ +
1198 DUNE_THROW(BCRSMatrixError,"matrix row sizes not built up yet");
│ │ │ │ +
1199 if (ready==notAllocated)
│ │ │ │ +
1200 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ +
1201
│ │ │ │ +
1202 if (col >= m)
│ │ │ │ +
1203 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
│ │ │ │ +
1204
│ │ │ │ +
1205 // get row range
│ │ │ │ +
1206 size_type* const first = r[row].getindexptr();
│ │ │ │ +
1207 size_type* const last = first + r[row].getsize();
│ │ │ │ +
1208
│ │ │ │ +
1209 // find correct insertion position for new column index
│ │ │ │ +
1210 size_type* pos = std::lower_bound(first,last,col);
│ │ │ │ +
1211
│ │ │ │ +
1212 // check if index is already in row
│ │ │ │ +
1213 if (pos!=last && *pos == col) return;
│ │ │ │ +
1214
│ │ │ │ +
1215 // find end of already inserted column indices
│ │ │ │ +
1216 size_type* end = std::lower_bound(pos,last,m);
│ │ │ │ +
1217 if (end==last)
│ │ │ │ +
1218 DUNE_THROW(BCRSMatrixError,"row is too small");
│ │ │ │ +
1219
│ │ │ │ +
1220 // insert new column index at correct position
│ │ │ │ +
1221 std::copy_backward(pos,end,end+1);
│ │ │ │ +
1222 *pos = col;
│ │ │ │ +
1223 }
│ │ │ │ +
│ │ │ │ +
1224
│ │ │ │ +
1226
│ │ │ │ +
1233 template<typename It>
│ │ │ │ +
│ │ │ │ +
1234 void setIndices(size_type row, It begin, It end)
│ │ │ │ +
1235 {
│ │ │ │ +
1236 size_type row_size = r[row].size();
│ │ │ │ +
1237 size_type* col_begin = r[row].getindexptr();
│ │ │ │ +
1238 size_type* col_end;
│ │ │ │ +
1239 // consistency check between allocated row size and number of passed column indices
│ │ │ │ +
1240 if ((col_end = std::copy(begin,end,r[row].getindexptr())) != col_begin + row_size)
│ │ │ │ +
1241 DUNE_THROW(BCRSMatrixError,"Given size of row " << row
│ │ │ │ +
1242 << " (" << row_size
│ │ │ │ +
1243 << ") does not match number of passed entries (" << (col_end - col_begin) << ")");
│ │ │ │ +
1244 std::sort(col_begin,col_end);
│ │ │ │ +
1245 }
│ │ │ │ +
│ │ │ │ +
1246
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1249 {
│ │ │ │ +
1250 if (build_mode!=random)
│ │ │ │ +
1251 DUNE_THROW(BCRSMatrixError,"requires random build mode");
│ │ │ │ +
1252 if (ready==built)
│ │ │ │ +
1253 DUNE_THROW(BCRSMatrixError,"matrix already built up");
│ │ │ │ +
1254 if (ready==building)
│ │ │ │ +
1255 DUNE_THROW(BCRSMatrixError,"row sizes are not built up yet");
│ │ │ │ +
1256 if (ready==notAllocated)
│ │ │ │ +
1257 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ +
1258
│ │ │ │ +
1259 // check if there are undefined indices
│ │ │ │ +
1260 RowIterator endi=end();
│ │ │ │ +
1261 for (RowIterator i=begin(); i!=endi; ++i)
│ │ │ │ +
1262 {
│ │ │ │ +
1263 ColIterator endj = (*i).end();
│ │ │ │ +
1264 for (ColIterator j=(*i).begin(); j!=endj; ++j) {
│ │ │ │ +
1265 if (j.index() >= m) {
│ │ │ │ +
1266 dwarn << "WARNING: size of row "<< i.index()<<" is "<<j.offset()<<". But was specified as being "<< (*i).end().offset()
│ │ │ │ +
1267 <<". This means you are wasting valuable space and creating additional cache misses!"<<std::endl;
│ │ │ │ +
1268 nnz_ -= ((*i).end().offset() - j.offset());
│ │ │ │ +
1269 r[i.index()].setsize(j.offset());
│ │ │ │ +
1270 break;
│ │ │ │ +
1271 }
│ │ │ │ +
1272 }
│ │ │ │ +
1273 }
│ │ │ │ +
1274
│ │ │ │ +
1275 allocateData();
│ │ │ │ + │ │ │ │ +
1277
│ │ │ │ +
1278 // if not, set matrix to built
│ │ │ │ +
1279 ready = built;
│ │ │ │ +
1280 }
│ │ │ │ +
│ │ │ │ +
1281
│ │ │ │ +
1282 //===== implicit creation interface
│ │ │ │ +
1283
│ │ │ │ +
1285
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1297 {
│ │ │ │ +
1298#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1299 if (build_mode!=implicit)
│ │ │ │ +
1300 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
│ │ │ │ +
1301 if (ready==built)
│ │ │ │ +
1302 DUNE_THROW(BCRSMatrixError,"matrix already built up, use operator[] for entry access now");
│ │ │ │ +
1303 if (ready==notAllocated)
│ │ │ │ +
1304 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ +
1305 if (ready!=building)
│ │ │ │ +
1306 DUNE_THROW(InvalidStateException,"You may only use entry() during the 'building' stage");
│ │ │ │ +
1307
│ │ │ │ +
1308 if (row >= n)
│ │ │ │ +
1309 DUNE_THROW(BCRSMatrixError,"row index exceeds matrix size");
│ │ │ │ +
1310 if (col >= m)
│ │ │ │ +
1311 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
│ │ │ │ +
1312#endif
│ │ │ │ +
1313
│ │ │ │ +
1314 size_type* begin = r[row].getindexptr();
│ │ │ │ +
1315 size_type* end = begin + r[row].getsize();
│ │ │ │ +
1316
│ │ │ │ +
1317 size_type* pos = std::find(begin, end, col);
│ │ │ │ +
1318
│ │ │ │ +
1319 //treat the case that there was a match in the array
│ │ │ │ +
1320 if (pos != end)
│ │ │ │ +
1321 if (*pos == col)
│ │ │ │ +
1322 {
│ │ │ │ +
1323 std::ptrdiff_t offset = pos - r[row].getindexptr();
│ │ │ │ +
1324 B* aptr = r[row].getptr() + offset;
│ │ │ │ +
1325
│ │ │ │ +
1326 return *aptr;
│ │ │ │ +
1327 }
│ │ │ │ +
1328
│ │ │ │ +
1329 //determine whether overflow has to be taken into account or not
│ │ │ │ +
1330 if (r[row].getsize() == avg)
│ │ │ │ +
1331 return overflow[std::make_pair(row,col)];
│ │ │ │ +
1332 else
│ │ │ │ +
1333 {
│ │ │ │ +
1334 //modify index array
│ │ │ │ +
1335 *end = col;
│ │ │ │ +
1336
│ │ │ │ +
1337 //do simultaneous operations on data array a
│ │ │ │ +
1338 std::ptrdiff_t offset = end - r[row].getindexptr();
│ │ │ │ +
1339 B* apos = r[row].getptr() + offset;
│ │ │ │ +
1340
│ │ │ │ +
1341 //increase rowsize
│ │ │ │ +
1342 r[row].setsize(r[row].getsize()+1);
│ │ │ │ +
1343
│ │ │ │ +
1344 //return reference to the newly created entry
│ │ │ │ +
1345 return *apos;
│ │ │ │ +
1346 }
│ │ │ │ +
1347 }
│ │ │ │ +
│ │ │ │ +
1348
│ │ │ │ +
1350
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1361 {
│ │ │ │ +
1362 if (build_mode!=implicit)
│ │ │ │ +
1363 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
│ │ │ │ +
1364 if (ready==built)
│ │ │ │ +
1365 DUNE_THROW(BCRSMatrixError,"matrix already built up, no more need for compression");
│ │ │ │ +
1366 if (ready==notAllocated)
│ │ │ │ +
1367 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
│ │ │ │ +
1368 if (ready!=building)
│ │ │ │ +
1369 DUNE_THROW(InvalidStateException,"You may only call compress() at the end of the 'building' stage");
│ │ │ │ +
1370
│ │ │ │ +
1371 //calculate statistics
│ │ │ │ + │ │ │ │ +
1373 stats.overflow_total = overflow.size();
│ │ │ │ +
1374 stats.maximum = 0;
│ │ │ │ +
1375
│ │ │ │ +
1376 //get insertion iterators pointing to one before start (for later use of ++it)
│ │ │ │ +
1377 size_type* jiit = j_.get();
│ │ │ │ +
1378 B* aiit = a;
│ │ │ │ +
1379
│ │ │ │ +
1380 //get iterator to the smallest overflow element
│ │ │ │ +
1381 typename OverflowType::iterator oit = overflow.begin();
│ │ │ │ +
1382
│ │ │ │ +
1383 //store a copy of index pointers on which to perform sorting
│ │ │ │ +
1384 std::vector<size_type*> perm;
│ │ │ │ +
1385
│ │ │ │ +
1386 //iterate over all rows and copy elements into their position in the compressed array
│ │ │ │ +
1387 for (size_type i=0; i<n; i++)
│ │ │ │ +
1388 {
│ │ │ │ +
1389 //get old pointers into a and j and size without overflow changes
│ │ │ │ +
1390 size_type* begin = r[i].getindexptr();
│ │ │ │ +
1391 //B* apos = r[i].getptr();
│ │ │ │ +
1392 size_type size = r[i].getsize();
│ │ │ │ +
1393
│ │ │ │ +
1394 perm.resize(size);
│ │ │ │ +
1395
│ │ │ │ +
1396 typename std::vector<size_type*>::iterator it = perm.begin();
│ │ │ │ +
1397 for (size_type* iit = begin; iit < begin + size; ++iit, ++it)
│ │ │ │ +
1398 *it = iit;
│ │ │ │ +
1399
│ │ │ │ +
1400 //sort permutation array
│ │ │ │ +
1401 std::sort(perm.begin(),perm.end(),PointerCompare<size_type>());
│ │ │ │ +
1402
│ │ │ │ +
1403 //change row window pointer to their new positions
│ │ │ │ +
1404 r[i].setindexptr(jiit);
│ │ │ │ +
1405 r[i].setptr(aiit);
│ │ │ │ +
1406
│ │ │ │ +
1407 for (it = perm.begin(); it != perm.end(); ++it)
│ │ │ │ +
1408 {
│ │ │ │ +
1409 //check whether there are elements in the overflow area which take precedence
│ │ │ │ +
1410 while ((oit!=overflow.end()) && (oit->first < std::make_pair(i,**it)))
│ │ │ │ +
1411 {
│ │ │ │ +
1412 //check whether there is enough memory to write to
│ │ │ │ +
1413 if (jiit > begin)
│ │ │ │ + │ │ │ │ +
1415 "Allocated memory for BCRSMatrix exhausted during compress()!"
│ │ │ │ +
1416 "Please increase either the average number of entries per row or the compressionBufferSize value."
│ │ │ │ +
1417 );
│ │ │ │ +
1418 //copy an element from the overflow area to the insertion position in a and j
│ │ │ │ +
1419 *jiit = oit->first.second;
│ │ │ │ +
1420 ++jiit;
│ │ │ │ +
1421 *aiit = oit->second;
│ │ │ │ +
1422 ++aiit;
│ │ │ │ +
1423 ++oit;
│ │ │ │ +
1424 r[i].setsize(r[i].getsize()+1);
│ │ │ │ +
1425 }
│ │ │ │ +
1426
│ │ │ │ +
1427 //check whether there is enough memory to write to
│ │ │ │ +
1428 if (jiit > begin)
│ │ │ │ + │ │ │ │ +
1430 "Allocated memory for BCRSMatrix exhausted during compress()!"
│ │ │ │ +
1431 "Please increase either the average number of entries per row or the compressionBufferSize value."
│ │ │ │ +
1432 );
│ │ │ │ +
1433
│ │ │ │ +
1434 //copy element from array
│ │ │ │ +
1435 *jiit = **it;
│ │ │ │ +
1436 ++jiit;
│ │ │ │ +
1437 B* apos = *it - j_.get() + a;
│ │ │ │ +
1438 *aiit = *apos;
│ │ │ │ +
1439 ++aiit;
│ │ │ │ +
1440 }
│ │ │ │ +
1441
│ │ │ │ +
1442 //copy remaining elements from the overflow area
│ │ │ │ +
1443 while ((oit!=overflow.end()) && (oit->first.first == i))
│ │ │ │ +
1444 {
│ │ │ │ +
1445 //check whether there is enough memory to write to
│ │ │ │ +
1446 if (jiit > begin)
│ │ │ │ + │ │ │ │ +
1448 "Allocated memory for BCRSMatrix exhausted during compress()!"
│ │ │ │ +
1449 "Please increase either the average number of entries per row or the compressionBufferSize value."
│ │ │ │ +
1450 );
│ │ │ │ +
1451
│ │ │ │ +
1452 //copy and element from the overflow area to the insertion position in a and j
│ │ │ │ +
1453 *jiit = oit->first.second;
│ │ │ │ +
1454 ++jiit;
│ │ │ │ +
1455 *aiit = oit->second;
│ │ │ │ +
1456 ++aiit;
│ │ │ │ +
1457 ++oit;
│ │ │ │ +
1458 r[i].setsize(r[i].getsize()+1);
│ │ │ │ +
1459 }
│ │ │ │ +
1460
│ │ │ │ +
1461 // update maximum row size
│ │ │ │ +
1462 if (r[i].getsize()>stats.maximum)
│ │ │ │ +
1463 stats.maximum = r[i].getsize();
│ │ │ │ +
1464 }
│ │ │ │ +
1465
│ │ │ │ +
1466 // overflow area may be cleared
│ │ │ │ +
1467 overflow.clear();
│ │ │ │ +
1468
│ │ │ │ +
1469 //determine average number of entries and memory usage
│ │ │ │ +
1470 std::ptrdiff_t diff = (r[n-1].getindexptr() + r[n-1].getsize() - j_.get());
│ │ │ │ +
1471 nnz_ = diff;
│ │ │ │ +
1472 stats.avg = (double) (nnz_) / (double) n;
│ │ │ │ +
1473 stats.mem_ratio = (double) (nnz_) / (double) allocationSize_;
│ │ │ │ +
1474
│ │ │ │ +
1475 //matrix is now built
│ │ │ │ +
1476 ready = built;
│ │ │ │ +
1477
│ │ │ │ +
1478 return stats;
│ │ │ │ +
1479 }
│ │ │ │ +
│ │ │ │ +
1480
│ │ │ │ +
1481 //===== vector space arithmetic
│ │ │ │ +
1482
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1485 {
│ │ │ │ +
1486#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1487 if (ready != built)
│ │ │ │ +
1488 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1489#endif
│ │ │ │ +
1490
│ │ │ │ +
1491 if (nnz_ > 0)
│ │ │ │ +
1492 {
│ │ │ │ +
1493 // process 1D array
│ │ │ │ +
1494 for (size_type i=0; i<nnz_; i++)
│ │ │ │ +
1495 a[i] *= k;
│ │ │ │ +
1496 }
│ │ │ │ +
1497 else
│ │ │ │ +
1498 {
│ │ │ │ +
1499 RowIterator endi=end();
│ │ │ │ +
1500 for (RowIterator i=begin(); i!=endi; ++i)
│ │ │ │ +
1501 {
│ │ │ │ +
1502 ColIterator endj = (*i).end();
│ │ │ │ +
1503 for (ColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1504 (*j) *= k;
│ │ │ │ +
1505 }
│ │ │ │ +
1506 }
│ │ │ │ +
1507
│ │ │ │ +
1508 return *this;
│ │ │ │ +
1509 }
│ │ │ │ +
│ │ │ │ +
1510
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1513 {
│ │ │ │ +
1514#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1515 if (ready != built)
│ │ │ │ +
1516 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1517#endif
│ │ │ │ +
1518
│ │ │ │ +
1519 if (nnz_ > 0)
│ │ │ │ +
1520 {
│ │ │ │ +
1521 // process 1D array
│ │ │ │ +
1522 for (size_type i=0; i<nnz_; i++)
│ │ │ │ +
1523 a[i] /= k;
│ │ │ │ +
1524 }
│ │ │ │ +
1525 else
│ │ │ │ +
1526 {
│ │ │ │ +
1527 RowIterator endi=end();
│ │ │ │ +
1528 for (RowIterator i=begin(); i!=endi; ++i)
│ │ │ │ +
1529 {
│ │ │ │ +
1530 ColIterator endj = (*i).end();
│ │ │ │ +
1531 for (ColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1532 (*j) /= k;
│ │ │ │ +
1533 }
│ │ │ │ +
1534 }
│ │ │ │ +
1535
│ │ │ │ +
1536 return *this;
│ │ │ │ +
1537 }
│ │ │ │ +
│ │ │ │ +
1538
│ │ │ │ +
1539
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1546 {
│ │ │ │ +
1547#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1548 if (ready != built || b.ready != built)
│ │ │ │ +
1549 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1550 if(N()!=b.N() || M() != b.M())
│ │ │ │ +
1551 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ +
1552#endif
│ │ │ │ +
1553 RowIterator endi=end();
│ │ │ │ +
1554 ConstRowIterator j=b.begin();
│ │ │ │ +
1555 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
│ │ │ │ +
1556 i->operator+=(*j);
│ │ │ │ +
1557 }
│ │ │ │ +
1558
│ │ │ │ +
1559 return *this;
│ │ │ │ +
1560 }
│ │ │ │ +
│ │ │ │ +
1561
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1568 {
│ │ │ │ +
1569#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1570 if (ready != built || b.ready != built)
│ │ │ │ +
1571 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1572 if(N()!=b.N() || M() != b.M())
│ │ │ │ +
1573 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ +
1574#endif
│ │ │ │ +
1575 RowIterator endi=end();
│ │ │ │ +
1576 ConstRowIterator j=b.begin();
│ │ │ │ +
1577 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
│ │ │ │ +
1578 i->operator-=(*j);
│ │ │ │ +
1579 }
│ │ │ │ +
1580
│ │ │ │ +
1581 return *this;
│ │ │ │ +
1582 }
│ │ │ │ +
│ │ │ │ +
1583
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1593 {
│ │ │ │ +
1594#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1595 if (ready != built || b.ready != built)
│ │ │ │ +
1596 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1597 if(N()!=b.N() || M() != b.M())
│ │ │ │ +
1598 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ +
1599#endif
│ │ │ │ +
1600 RowIterator endi=end();
│ │ │ │ +
1601 ConstRowIterator j=b.begin();
│ │ │ │ +
1602 for(RowIterator i=begin(); i!=endi; ++i, ++j)
│ │ │ │ +
1603 i->axpy(alpha, *j);
│ │ │ │ +
1604
│ │ │ │ +
1605 return *this;
│ │ │ │ +
1606 }
│ │ │ │ +
│ │ │ │ +
1607
│ │ │ │ +
1608 //===== linear maps
│ │ │ │ +
1609
│ │ │ │ +
1611 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1612 void mv (const X& x, Y& y) const
│ │ │ │ +
1613 {
│ │ │ │ +
1614#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1615 if (ready != built)
│ │ │ │ +
1616 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1617 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,
│ │ │ │ +
1618 "Size mismatch: M: " << N() << "x" << M() << " x: " << x.N());
│ │ │ │ +
1619 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,
│ │ │ │ +
1620 "Size mismatch: M: " << N() << "x" << M() << " y: " << y.N());
│ │ │ │ +
1621#endif
│ │ │ │ +
1622 ConstRowIterator endi=end();
│ │ │ │ +
1623 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1624 {
│ │ │ │ +
1625 y[i.index()]=0;
│ │ │ │ +
1626 ConstColIterator endj = (*i).end();
│ │ │ │ +
1627 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1628 {
│ │ │ │ +
1629 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ +
1630 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ +
1631 Impl::asMatrix(*j).umv(xj, yi);
│ │ │ │ +
1632 }
│ │ │ │ +
1633 }
│ │ │ │ +
1634 }
│ │ │ │ +
│ │ │ │ +
1635
│ │ │ │ +
1637 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1638 void umv (const X& x, Y& y) const
│ │ │ │ +
1639 {
│ │ │ │ +
1640#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1641 if (ready != built)
│ │ │ │ +
1642 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1643 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1644 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1645#endif
│ │ │ │ +
1646 ConstRowIterator endi=end();
│ │ │ │ +
1647 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1648 {
│ │ │ │ +
1649 ConstColIterator endj = (*i).end();
│ │ │ │ +
1650 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1651 {
│ │ │ │ +
1652 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ +
1653 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ +
1654 Impl::asMatrix(*j).umv(xj,yi);
│ │ │ │ +
1655 }
│ │ │ │ +
1656 }
│ │ │ │ +
1657 }
│ │ │ │ +
│ │ │ │ +
1658
│ │ │ │ +
1660 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1661 void mmv (const X& x, Y& y) const
│ │ │ │ +
1662 {
│ │ │ │ +
1663#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1664 if (ready != built)
│ │ │ │ +
1665 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1666 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1667 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1668#endif
│ │ │ │ +
1669 ConstRowIterator endi=end();
│ │ │ │ +
1670 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1671 {
│ │ │ │ +
1672 ConstColIterator endj = (*i).end();
│ │ │ │ +
1673 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1674 {
│ │ │ │ +
1675 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ +
1676 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ +
1677 Impl::asMatrix(*j).mmv(xj,yi);
│ │ │ │ +
1678 }
│ │ │ │ +
1679 }
│ │ │ │ +
1680 }
│ │ │ │ +
│ │ │ │ +
1681
│ │ │ │ +
1683 template<class X, class Y, class F>
│ │ │ │ +
│ │ │ │ +
1684 void usmv (F&& alpha, const X& x, Y& y) const
│ │ │ │ +
1685 {
│ │ │ │ +
1686#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1687 if (ready != built)
│ │ │ │ +
1688 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1689 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1690 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1691#endif
│ │ │ │ +
1692 ConstRowIterator endi=end();
│ │ │ │ +
1693 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1694 {
│ │ │ │ +
1695 ConstColIterator endj = (*i).end();
│ │ │ │ +
1696 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1697 {
│ │ │ │ +
1698 auto&& xj = Impl::asVector(x[j.index()]);
│ │ │ │ +
1699 auto&& yi = Impl::asVector(y[i.index()]);
│ │ │ │ +
1700 Impl::asMatrix(*j).usmv(alpha,xj,yi);
│ │ │ │ +
1701 }
│ │ │ │ +
1702 }
│ │ │ │ +
1703 }
│ │ │ │ +
│ │ │ │ +
1704
│ │ │ │ +
1706 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1707 void mtv (const X& x, Y& y) const
│ │ │ │ +
1708 {
│ │ │ │ +
1709#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1710 if (ready != built)
│ │ │ │ +
1711 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1712 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1713 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1714#endif
│ │ │ │ +
1715 for(size_type i=0; i<y.N(); ++i)
│ │ │ │ +
1716 y[i]=0;
│ │ │ │ +
1717 umtv(x,y);
│ │ │ │ +
1718 }
│ │ │ │ +
│ │ │ │ +
1719
│ │ │ │ +
1721 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1722 void umtv (const X& x, Y& y) const
│ │ │ │ +
1723 {
│ │ │ │ +
1724#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1725 if (ready != built)
│ │ │ │ +
1726 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1727 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1728 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1729#endif
│ │ │ │ +
1730 ConstRowIterator endi=end();
│ │ │ │ +
1731 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1732 {
│ │ │ │ +
1733 ConstColIterator endj = (*i).end();
│ │ │ │ +
1734 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1735 {
│ │ │ │ +
1736 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ +
1737 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ +
1738 Impl::asMatrix(*j).umtv(xi,yj);
│ │ │ │ +
1739 }
│ │ │ │ +
1740 }
│ │ │ │ +
1741 }
│ │ │ │ +
│ │ │ │ +
1742
│ │ │ │ +
1744 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1745 void mmtv (const X& x, Y& y) const
│ │ │ │ +
1746 {
│ │ │ │ +
1747#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1748 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1749 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1750#endif
│ │ │ │ +
1751 ConstRowIterator endi=end();
│ │ │ │ +
1752 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1753 {
│ │ │ │ +
1754 ConstColIterator endj = (*i).end();
│ │ │ │ +
1755 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1756 {
│ │ │ │ +
1757 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ +
1758 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ +
1759 Impl::asMatrix(*j).mmtv(xi,yj);
│ │ │ │ +
1760 }
│ │ │ │ +
1761 }
│ │ │ │ +
1762 }
│ │ │ │ +
│ │ │ │ +
1763
│ │ │ │ +
1765 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1766 void usmtv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ +
1767 {
│ │ │ │ +
1768#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1769 if (ready != built)
│ │ │ │ +
1770 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1771 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1772 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1773#endif
│ │ │ │ +
1774 ConstRowIterator endi=end();
│ │ │ │ +
1775 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1776 {
│ │ │ │ +
1777 ConstColIterator endj = (*i).end();
│ │ │ │ +
1778 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1779 {
│ │ │ │ +
1780 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ +
1781 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ +
1782 Impl::asMatrix(*j).usmtv(alpha,xi,yj);
│ │ │ │ +
1783 }
│ │ │ │ +
1784 }
│ │ │ │ +
1785 }
│ │ │ │ +
│ │ │ │ +
1786
│ │ │ │ +
1788 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1789 void umhv (const X& x, Y& y) const
│ │ │ │ +
1790 {
│ │ │ │ +
1791#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1792 if (ready != built)
│ │ │ │ +
1793 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1794 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1795 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1796#endif
│ │ │ │ +
1797 ConstRowIterator endi=end();
│ │ │ │ +
1798 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1799 {
│ │ │ │ +
1800 ConstColIterator endj = (*i).end();
│ │ │ │ +
1801 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1802 {
│ │ │ │ +
1803 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ +
1804 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ +
1805 Impl::asMatrix(*j).umhv(xi,yj);
│ │ │ │ +
1806 }
│ │ │ │ +
1807 }
│ │ │ │ +
1808 }
│ │ │ │ +
│ │ │ │ +
1809
│ │ │ │ +
1811 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1812 void mmhv (const X& x, Y& y) const
│ │ │ │ +
1813 {
│ │ │ │ +
1814#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1815 if (ready != built)
│ │ │ │ +
1816 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1817 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1818 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1819#endif
│ │ │ │ +
1820 ConstRowIterator endi=end();
│ │ │ │ +
1821 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1822 {
│ │ │ │ +
1823 ConstColIterator endj = (*i).end();
│ │ │ │ +
1824 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1825 {
│ │ │ │ +
1826 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ +
1827 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ +
1828 Impl::asMatrix(*j).mmhv(xi,yj);
│ │ │ │ +
1829 }
│ │ │ │ +
1830 }
│ │ │ │ +
1831 }
│ │ │ │ +
│ │ │ │ +
1832
│ │ │ │ +
1834 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
1835 void usmhv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ +
1836 {
│ │ │ │ +
1837#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1838 if (ready != built)
│ │ │ │ +
1839 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1840 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1841 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
│ │ │ │ +
1842#endif
│ │ │ │ +
1843 ConstRowIterator endi=end();
│ │ │ │ +
1844 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
│ │ │ │ +
1845 {
│ │ │ │ +
1846 ConstColIterator endj = (*i).end();
│ │ │ │ +
1847 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
│ │ │ │ +
1848 {
│ │ │ │ +
1849 auto&& xi = Impl::asVector(x[i.index()]);
│ │ │ │ +
1850 auto&& yj = Impl::asVector(y[j.index()]);
│ │ │ │ +
1851 Impl::asMatrix(*j).usmhv(alpha,xi,yj);
│ │ │ │ +
1852 }
│ │ │ │ +
1853 }
│ │ │ │ +
1854 }
│ │ │ │ +
│ │ │ │ +
1855
│ │ │ │ +
1856
│ │ │ │ +
1857 //===== norms
│ │ │ │ +
1858
│ │ │ │ +
│ │ │ │ +
1860 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
│ │ │ │ +
1861 {
│ │ │ │ +
1862#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1863 if (ready != built)
│ │ │ │ +
1864 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1865#endif
│ │ │ │ +
1866
│ │ │ │ +
1867 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
1868
│ │ │ │ +
1869 for (auto&& row : (*this))
│ │ │ │ +
1870 for (auto&& entry : row)
│ │ │ │ +
1871 sum += Impl::asMatrix(entry).frobenius_norm2();
│ │ │ │ +
1872
│ │ │ │ +
1873 return sum;
│ │ │ │ +
1874 }
│ │ │ │ +
│ │ │ │ +
1875
│ │ │ │ +
│ │ │ │ +
1877 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ +
1878 {
│ │ │ │ +
1879 return sqrt(frobenius_norm2());
│ │ │ │ +
1880 }
│ │ │ │ +
│ │ │ │ +
1881
│ │ │ │ +
1883 template <typename ft = field_type,
│ │ │ │ +
1884 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1885 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
1886 if (ready != built)
│ │ │ │ +
1887 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1888
│ │ │ │ +
1889 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1890 using std::max;
│ │ │ │ +
1891
│ │ │ │ +
1892 real_type norm = 0;
│ │ │ │ +
1893 for (auto const &x : *this) {
│ │ │ │ +
1894 real_type sum = 0;
│ │ │ │ +
1895 for (auto const &y : x)
│ │ │ │ +
1896 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ +
1897 norm = max(sum, norm);
│ │ │ │ +
1898 }
│ │ │ │ +
1899 return norm;
│ │ │ │ +
1900 }
│ │ │ │ +
│ │ │ │ +
1901
│ │ │ │ +
1903 template <typename ft = field_type,
│ │ │ │ +
1904 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1905 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
1906 if (ready != built)
│ │ │ │ +
1907 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1908
│ │ │ │ +
1909 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1910 using std::max;
│ │ │ │ +
1911
│ │ │ │ +
1912 real_type norm = 0;
│ │ │ │ +
1913 for (auto const &x : *this) {
│ │ │ │ +
1914 real_type sum = 0;
│ │ │ │ +
1915 for (auto const &y : x)
│ │ │ │ +
1916 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ +
1917 norm = max(sum, norm);
│ │ │ │ +
1918 }
│ │ │ │ +
1919 return norm;
│ │ │ │ +
1920 }
│ │ │ │ +
│ │ │ │ +
1921
│ │ │ │ +
1923 template <typename ft = field_type,
│ │ │ │ +
1924 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1925 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
1926 if (ready != built)
│ │ │ │ +
1927 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1928
│ │ │ │ +
1929 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1930 using std::max;
│ │ │ │ +
1931
│ │ │ │ +
1932 real_type norm = 0;
│ │ │ │ +
1933 real_type isNaN = 1;
│ │ │ │ +
1934 for (auto const &x : *this) {
│ │ │ │ +
1935 real_type sum = 0;
│ │ │ │ +
1936 for (auto const &y : x)
│ │ │ │ +
1937 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ +
1938 norm = max(sum, norm);
│ │ │ │ +
1939 isNaN += sum;
│ │ │ │ +
1940 }
│ │ │ │ +
1941
│ │ │ │ +
1942 return norm * (isNaN / isNaN);
│ │ │ │ +
1943 }
│ │ │ │ +
│ │ │ │ +
1944
│ │ │ │ +
1946 template <typename ft = field_type,
│ │ │ │ +
1947 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1948 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
1949 if (ready != built)
│ │ │ │ +
1950 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
│ │ │ │ +
1951
│ │ │ │ +
1952 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1953 using std::max;
│ │ │ │ +
1954
│ │ │ │ +
1955 real_type norm = 0;
│ │ │ │ +
1956 real_type isNaN = 1;
│ │ │ │ +
1957
│ │ │ │ +
1958 for (auto const &x : *this) {
│ │ │ │ +
1959 real_type sum = 0;
│ │ │ │ +
1960 for (auto const &y : x)
│ │ │ │ +
1961 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ +
1962 norm = max(sum, norm);
│ │ │ │ +
1963 isNaN += sum;
│ │ │ │ +
1964 }
│ │ │ │ +
1965
│ │ │ │ +
1966 return norm * (isNaN / isNaN);
│ │ │ │ +
1967 }
│ │ │ │ +
│ │ │ │ +
1968
│ │ │ │ +
1969 //===== sizes
│ │ │ │ +
1970
│ │ │ │ +
│ │ │ │ +
1972 size_type N () const
│ │ │ │ +
1973 {
│ │ │ │ +
1974 return n;
│ │ │ │ +
1975 }
│ │ │ │ +
│ │ │ │ +
1976
│ │ │ │ +
│ │ │ │ +
1978 size_type M () const
│ │ │ │ +
1979 {
│ │ │ │ +
1980 return m;
│ │ │ │ +
1981 }
│ │ │ │ +
│ │ │ │ +
1982
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1985 {
│ │ │ │ +
1986 // in case of row-wise allocation
│ │ │ │ +
1987 if( nnz_ <= 0 )
│ │ │ │ +
1988 nnz_ = std::accumulate( begin(), end(), size_type( 0 ), [] ( size_type s, const row_type &row ) { return s+row.getsize(); } );
│ │ │ │ +
1989 return nnz_;
│ │ │ │ +
1990 }
│ │ │ │ +
│ │ │ │ +
1991
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1994 {
│ │ │ │ +
1995 return ready;
│ │ │ │ +
1996 }
│ │ │ │ +
│ │ │ │ +
1997
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2000 {
│ │ │ │ +
2001 return build_mode;
│ │ │ │ +
2002 }
│ │ │ │ +
│ │ │ │ +
2003
│ │ │ │ +
2004 //===== query
│ │ │ │ +
2005
│ │ │ │ +
│ │ │ │ +
2007 bool exists (size_type i, size_type j) const
│ │ │ │ +
2008 {
│ │ │ │ +
2009#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
2010 if (i<0 || i>=n) DUNE_THROW(BCRSMatrixError,"row index out of range");
│ │ │ │ +
2011 if (j<0 || j>=m) DUNE_THROW(BCRSMatrixError,"column index out of range");
│ │ │ │ +
2012#endif
│ │ │ │ +
2013 return (r[i].size() && r[i].find(j) != r[i].end());
│ │ │ │ +
2014 }
│ │ │ │ +
│ │ │ │ +
2015
│ │ │ │ +
2016
│ │ │ │ +
2017 protected:
│ │ │ │ +
2018 // state information
│ │ │ │ +
2019 BuildMode build_mode; // row wise or whole matrix
│ │ │ │ +
2020 BuildStage ready; // indicate the stage the matrix building is in
│ │ │ │ +
2021
│ │ │ │ +
2022 // The allocator used for memory management
│ │ │ │ +
2023 typename std::allocator_traits<A>::template rebind_alloc<B> allocator_;
│ │ │ │ +
2024
│ │ │ │ +
2025 typename std::allocator_traits<A>::template rebind_alloc<row_type> rowAllocator_;
│ │ │ │ +
2026
│ │ │ │ +
2027 typename std::allocator_traits<A>::template rebind_alloc<size_type> sizeAllocator_;
│ │ │ │ +
2028
│ │ │ │ +
2029 // size of the matrix
│ │ │ │ +
2030 size_type n; // number of rows
│ │ │ │ +
2031 size_type m; // number of columns
│ │ │ │ +
2032 mutable size_type nnz_; // number of nonzeroes contained in the matrix
│ │ │ │ +
2033 size_type allocationSize_; //allocated size of a and j arrays, except in implicit mode: nnz_==allocationsSize_
│ │ │ │ +
2034 // zero means that memory is allocated separately for each row.
│ │ │ │ +
2035
│ │ │ │ +
2036 // the rows are dynamically allocated
│ │ │ │ +
2037 row_type* r; // [n] the individual rows having pointers into a,j arrays
│ │ │ │ +
2038
│ │ │ │ +
2039 // dynamically allocated memory
│ │ │ │ +
2040 B* a; // [allocationSize] non-zero entries of the matrix in row-wise ordering
│ │ │ │ +
2041 // If a single array of column indices is used, it can be shared
│ │ │ │ +
2042 // between different matrices with the same sparsity pattern
│ │ │ │ +
2043 std::shared_ptr<size_type> j_; // [allocationSize] column indices of entries
│ │ │ │ +
2044
│ │ │ │ +
2045 // additional data is needed in implicit buildmode
│ │ │ │ + │ │ │ │ + │ │ │ │ +
2048
│ │ │ │ +
2049 typedef std::map<std::pair<size_type,size_type>, B> OverflowType;
│ │ │ │ + │ │ │ │ +
2051
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2053 {
│ │ │ │ +
2054 row_type current_row(a,j_.get(),0); // Pointers to current row data
│ │ │ │ +
2055 for (size_type i=0; i<n; i++, ++row) {
│ │ │ │ +
2056 // set row i
│ │ │ │ +
2057 size_type s = row->getsize();
│ │ │ │ +
2058
│ │ │ │ +
2059 if (s>0) {
│ │ │ │ +
2060 // setup pointers and size
│ │ │ │ +
2061 r[i].set(s,current_row.getptr(), current_row.getindexptr());
│ │ │ │ +
2062 // update pointer for next row
│ │ │ │ +
2063 current_row.setptr(current_row.getptr()+s);
│ │ │ │ +
2064 current_row.setindexptr(current_row.getindexptr()+s);
│ │ │ │ +
2065 } else{
│ │ │ │ +
2066 // empty row
│ │ │ │ +
2067 r[i].set(0,nullptr,nullptr);
│ │ │ │ +
2068 }
│ │ │ │ +
2069 }
│ │ │ │ +
2070 }
│ │ │ │ +
│ │ │ │ +
2071
│ │ │ │ +
2073
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2078 {
│ │ │ │ +
2079 size_type* jptr = j_.get();
│ │ │ │ +
2080 for (size_type i=0; i<n; ++i, ++row) {
│ │ │ │ +
2081 // set row i
│ │ │ │ +
2082 size_type s = row->getsize();
│ │ │ │ +
2083
│ │ │ │ +
2084 if (s>0) {
│ │ │ │ +
2085 // setup pointers and size
│ │ │ │ +
2086 r[i].setsize(s);
│ │ │ │ +
2087 r[i].setindexptr(jptr);
│ │ │ │ +
2088 } else{
│ │ │ │ +
2089 // empty row
│ │ │ │ +
2090 r[i].set(0,nullptr,nullptr);
│ │ │ │ +
2091 }
│ │ │ │ +
2092
│ │ │ │ +
2093 // advance position in global array
│ │ │ │ +
2094 jptr += s;
│ │ │ │ +
2095 }
│ │ │ │ +
2096 }
│ │ │ │ +
│ │ │ │ +
2097
│ │ │ │ +
2099
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2104 {
│ │ │ │ +
2105 B* aptr = a;
│ │ │ │ +
2106 for (size_type i=0; i<n; ++i) {
│ │ │ │ +
2107 // set row i
│ │ │ │ +
2108 if (r[i].getsize() > 0) {
│ │ │ │ +
2109 // setup pointers and size
│ │ │ │ +
2110 r[i].setptr(aptr);
│ │ │ │ +
2111 } else{
│ │ │ │ +
2112 // empty row
│ │ │ │ +
2113 r[i].set(0,nullptr,nullptr);
│ │ │ │ +
2114 }
│ │ │ │ +
2115
│ │ │ │ +
2116 // advance position in global array
│ │ │ │ +
2117 aptr += r[i].getsize();
│ │ │ │ +
2118 }
│ │ │ │ +
2119 }
│ │ │ │ +
│ │ │ │ +
2120
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2123 {
│ │ │ │ +
2124 setWindowPointers(Mat.begin());
│ │ │ │ +
2125
│ │ │ │ +
2126 // copy data
│ │ │ │ +
2127 for (size_type i=0; i<n; i++) r[i] = Mat.r[i];
│ │ │ │ +
2128
│ │ │ │ +
2129 // finish off
│ │ │ │ +
2130 build_mode = row_wise; // dummy
│ │ │ │ +
2131 ready = built;
│ │ │ │ +
2132 }
│ │ │ │ +
│ │ │ │ +
2133
│ │ │ │ +
│ │ │ │ +
2139 void deallocate(bool deallocateRows=true)
│ │ │ │ +
2140 {
│ │ │ │ +
2141
│ │ │ │ +
2142 if (notAllocated)
│ │ │ │ +
2143 return;
│ │ │ │ +
2144
│ │ │ │ +
2145 if (allocationSize_>0)
│ │ │ │ +
2146 {
│ │ │ │ +
2147 // a,j_ have been allocated as one long vector
│ │ │ │ +
2148 j_.reset();
│ │ │ │ +
2149 if (a)
│ │ │ │ +
2150 {
│ │ │ │ +
2151 for(B *aiter=a+(allocationSize_-1), *aend=a-1; aiter!=aend; --aiter)
│ │ │ │ +
2152 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, aiter);
│ │ │ │ +
2153 allocator_.deallocate(a,allocationSize_);
│ │ │ │ +
2154 a = nullptr;
│ │ │ │ +
2155 }
│ │ │ │ +
2156 }
│ │ │ │ +
2157 else if (r)
│ │ │ │ +
2158 {
│ │ │ │ +
2159 // check if memory for rows have been allocated individually
│ │ │ │ +
2160 for (size_type i=0; i<n; i++)
│ │ │ │ +
2161 if (r[i].getsize()>0)
│ │ │ │ +
2162 {
│ │ │ │ +
2163 for (B *col=r[i].getptr()+(r[i].getsize()-1),
│ │ │ │ +
2164 *colend = r[i].getptr()-1; col!=colend; --col) {
│ │ │ │ +
2165 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, col);
│ │ │ │ +
2166 }
│ │ │ │ +
2167 sizeAllocator_.deallocate(r[i].getindexptr(),1);
│ │ │ │ +
2168 allocator_.deallocate(r[i].getptr(),1);
│ │ │ │ +
2169 // clear out row data in case we don't want to deallocate the rows
│ │ │ │ +
2170 // otherwise we might run into a double free problem here later
│ │ │ │ +
2171 r[i].set(0,nullptr,nullptr);
│ │ │ │ +
2172 }
│ │ │ │ +
2173 }
│ │ │ │ +
2174
│ │ │ │ +
2175 // deallocate the rows
│ │ │ │ +
2176 if (n>0 && deallocateRows && r) {
│ │ │ │ +
2177 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
│ │ │ │ +
2178 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
│ │ │ │ +
2179 rowAllocator_.deallocate(r,n);
│ │ │ │ +
2180 r = nullptr;
│ │ │ │ +
2181 }
│ │ │ │ +
2182
│ │ │ │ +
2183 // Mark matrix as not built at all.
│ │ │ │ + │ │ │ │ +
2185
│ │ │ │ +
2186 }
│ │ │ │ +
│ │ │ │ +
2187
│ │ │ │ +
│ │ │ │ +
2205 void allocate(size_type rows, size_type columns, size_type allocationSize, bool allocateRows, bool allocate_data)
│ │ │ │ +
2206 {
│ │ │ │ +
2207 // Store size
│ │ │ │ +
2208 n = rows;
│ │ │ │ +
2209 m = columns;
│ │ │ │ +
2210 nnz_ = allocationSize;
│ │ │ │ +
2211 allocationSize_ = allocationSize;
│ │ │ │ +
2212
│ │ │ │ +
2213 // allocate rows
│ │ │ │ +
2214 if(allocateRows) {
│ │ │ │ +
2215 if (n>0) {
│ │ │ │ +
2216 if (r)
│ │ │ │ +
2217 DUNE_THROW(InvalidStateException,"Rows have already been allocated, cannot allocate a second time");
│ │ │ │ +
2218 r = rowAllocator_.allocate(rows);
│ │ │ │ +
2219 // initialize row entries
│ │ │ │ +
2220 for(row_type* ri=r; ri!=r+rows; ++ri)
│ │ │ │ +
2221 std::allocator_traits<decltype(rowAllocator_)>::construct(rowAllocator_, ri, row_type());
│ │ │ │ +
2222 }else{
│ │ │ │ +
2223 r = 0;
│ │ │ │ +
2224 }
│ │ │ │ +
2225 }
│ │ │ │ +
2226
│ │ │ │ +
2227 // allocate a and j_ array
│ │ │ │ +
2228 if (allocate_data)
│ │ │ │ +
2229 allocateData();
│ │ │ │ +
2230 // allocate column indices only if not yet present (enable sharing)
│ │ │ │ +
2231 if (allocationSize_>0) {
│ │ │ │ +
2232 // we copy allocator and size to the deleter since _j may outlive this class
│ │ │ │ +
2233 if (!j_.get())
│ │ │ │ +
2234 j_.reset(sizeAllocator_.allocate(allocationSize_),
│ │ │ │ +
2235 [alloc = sizeAllocator_, size = allocationSize_](auto ptr) mutable {
│ │ │ │ +
2236 alloc.deallocate(ptr, size);
│ │ │ │ +
2237 });
│ │ │ │ +
2238 }else{
│ │ │ │ +
2239 j_.reset();
│ │ │ │ +
2240 }
│ │ │ │ +
2241
│ │ │ │ +
2242 // Mark the matrix as not built.
│ │ │ │ +
2243 ready = building;
│ │ │ │ +
2244 }
│ │ │ │ +
│ │ │ │ +
2245
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2247 {
│ │ │ │ +
2248 if (a)
│ │ │ │ +
2249 DUNE_THROW(InvalidStateException,"Cannot allocate data array (already allocated)");
│ │ │ │ +
2250 if (allocationSize_>0) {
│ │ │ │ +
2251 a = allocator_.allocate(allocationSize_);
│ │ │ │ +
2252 // use placement new to call constructor that allocates
│ │ │ │ +
2253 // additional memory.
│ │ │ │ +
2254 new (a) B[allocationSize_];
│ │ │ │ +
2255 } else {
│ │ │ │ +
2256 a = nullptr;
│ │ │ │ +
2257 }
│ │ │ │ +
2258 }
│ │ │ │ +
│ │ │ │ +
2259
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
2266 {
│ │ │ │ +
2267 if (build_mode != implicit)
│ │ │ │ +
2268 DUNE_THROW(InvalidStateException,"implicit_allocate() may only be called in implicit build mode");
│ │ │ │ +
2269 if (ready != notAllocated)
│ │ │ │ +
2270 DUNE_THROW(InvalidStateException,"memory has already been allocated");
│ │ │ │ +
2271
│ │ │ │ +
2272 // check to make sure the user has actually set the parameters
│ │ │ │ +
2273 if (compressionBufferSize_ < 0)
│ │ │ │ +
2274 DUNE_THROW(InvalidStateException,"You have to set the implicit build mode parameters before starting to build the matrix");
│ │ │ │ +
2275 //calculate size of overflow region, add buffer for row sort!
│ │ │ │ + │ │ │ │ +
2277 allocationSize_ = _n*avg + osize;
│ │ │ │ +
2278
│ │ │ │ +
2279 allocate(_n, _m, allocationSize_,true,true);
│ │ │ │ +
2280
│ │ │ │ +
2281 //set row pointers correctly
│ │ │ │ +
2282 size_type* jptr = j_.get() + osize;
│ │ │ │ +
2283 B* aptr = a + osize;
│ │ │ │ +
2284 for (size_type i=0; i<n; i++)
│ │ │ │ +
2285 {
│ │ │ │ +
2286 r[i].set(0,aptr,jptr);
│ │ │ │ +
2287 jptr = jptr + avg;
│ │ │ │ +
2288 aptr = aptr + avg;
│ │ │ │ +
2289 }
│ │ │ │ +
2290
│ │ │ │ +
2291 ready = building;
│ │ │ │ +
2292 }
│ │ │ │ +
│ │ │ │ +
2293 };
│ │ │ │ +
│ │ │ │ +
2294
│ │ │ │ +
2295
│ │ │ │ +
2296 template<class B, class A>
│ │ │ │ +
│ │ │ │ +
2297 struct FieldTraits< BCRSMatrix<B, A> >
│ │ │ │ +
2298 {
│ │ │ │ + │ │ │ │ +
2300 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
2301 };
│ │ │ │ +
│ │ │ │ +
2302
│ │ │ │ +
2305} // end namespace
│ │ │ │ +
2306
│ │ │ │ +
2307#endif
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
Some handy generic functions for ISTL matrices.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
Definition matrixutils.hh:211
│ │ │ │ +
Statistics about compression achieved in implicit mode.
Definition bcrsmatrix.hh:88
│ │ │ │ +
size_type overflow_total
total number of elements written to the overflow area during construction.
Definition bcrsmatrix.hh:94
│ │ │ │ +
size_type maximum
maximum number of non-zeroes per row.
Definition bcrsmatrix.hh:92
│ │ │ │ +
double avg
average number of non-zeroes per row.
Definition bcrsmatrix.hh:90
│ │ │ │ +
double mem_ratio
fraction of wasted memory resulting from non-used overflow area.
Definition bcrsmatrix.hh:99
│ │ │ │ +
A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mod...
Definition bcrsmatrix.hh:117
│ │ │ │ +
Matrix::block_type block_type
The block_type of the underlying matrix.
Definition bcrsmatrix.hh:125
│ │ │ │ +
ImplicitMatrixBuilder(Matrix &m)
Creates an ImplicitMatrixBuilder for matrix m.
Definition bcrsmatrix.hh:170
│ │ │ │ +
M_ Matrix
The underlying matrix.
Definition bcrsmatrix.hh:122
│ │ │ │ +
ImplicitMatrixBuilder(Matrix &m, size_type rows, size_type cols, size_type avg_cols_per_row, double overflow_fraction)
Sets up matrix m for implicit construction using the given parameters and creates an ImplicitBmatrixu...
Definition bcrsmatrix.hh:194
│ │ │ │ +
size_type M() const
The number of columns in the matrix.
Definition bcrsmatrix.hh:217
│ │ │ │ +
Matrix::size_type size_type
The size_type of the underlying matrix.
Definition bcrsmatrix.hh:128
│ │ │ │ +
row_object operator[](size_type i) const
Returns a proxy for entries in row i.
Definition bcrsmatrix.hh:205
│ │ │ │ +
size_type N() const
The number of rows in the matrix.
Definition bcrsmatrix.hh:211
│ │ │ │ +
Proxy row object for entry access.
Definition bcrsmatrix.hh:137
│ │ │ │ +
block_type & operator[](size_type j) const
Returns entry in column j.
Definition bcrsmatrix.hh:142
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bcrsmatrix.hh:488
│ │ │ │ +
std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_
Definition bcrsmatrix.hh:2025
│ │ │ │ +
bool exists(size_type i, size_type j) const
return true if (i,j) is in pattern
Definition bcrsmatrix.hh:2007
│ │ │ │ +
BuildStage buildStage() const
The current build stage of the matrix.
Definition bcrsmatrix.hh:1993
│ │ │ │ +
Iterator begin()
Get iterator to first row.
Definition bcrsmatrix.hh:675
│ │ │ │ +
void copyWindowStructure(const BCRSMatrix &Mat)
Copy the window structure from another matrix.
Definition bcrsmatrix.hh:2122
│ │ │ │ +
B & entry(size_type row, size_type col)
Returns reference to entry (row,col) of the matrix.
Definition bcrsmatrix.hh:1296
│ │ │ │ +
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition bcrsmatrix.hh:1812
│ │ │ │ +
void usmhv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition bcrsmatrix.hh:1835
│ │ │ │ +
void umtv(const X &x, Y &y) const
y += A^T x
Definition bcrsmatrix.hh:1722
│ │ │ │ +
double compressionBufferSize_
Definition bcrsmatrix.hh:2047
│ │ │ │ +
size_type m
Definition bcrsmatrix.hh:2031
│ │ │ │ +
RealRowIterator< const row_type > const_iterator
The const iterator over the matrix rows.
Definition bcrsmatrix.hh:707
│ │ │ │ +
static constexpr unsigned int blocklevel
increment block level counter
Definition bcrsmatrix.hh:507
│ │ │ │ +
void allocate(size_type rows, size_type columns, size_type allocationSize, bool allocateRows, bool allocate_data)
Allocate memory for the matrix structure.
Definition bcrsmatrix.hh:2205
│ │ │ │ +
BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b)
Add the scaled entries of another matrix to this one.
Definition bcrsmatrix.hh:1592
│ │ │ │ +
FieldTraits< ft >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition bcrsmatrix.hh:1905
│ │ │ │ +
~BCRSMatrix()
destructor
Definition bcrsmatrix.hh:824
│ │ │ │ +
void allocateData()
Definition bcrsmatrix.hh:2246
│ │ │ │ +
void deallocate(bool deallocateRows=true)
deallocate memory of the matrix.
Definition bcrsmatrix.hh:2139
│ │ │ │ +
Iterator RowIterator
rename the iterators for easier access
Definition bcrsmatrix.hh:701
│ │ │ │ +
row_type & operator[](size_type i)
random access to the rows
Definition bcrsmatrix.hh:549
│ │ │ │ +
BCRSMatrix()
an empty matrix
Definition bcrsmatrix.hh:749
│ │ │ │ +
void endrowsizes()
indicate that size of all rows is defined
Definition bcrsmatrix.hh:1149
│ │ │ │ +
void incrementrowsize(size_type i, size_type s=1)
increment size of row i by s (1 by default)
Definition bcrsmatrix.hh:1138
│ │ │ │ +
void mtv(const X &x, Y &y) const
y = A^T x
Definition bcrsmatrix.hh:1707
│ │ │ │ +
void umhv(const X &x, Y &y) const
y += A^H x
Definition bcrsmatrix.hh:1789
│ │ │ │ +
size_type nonzeroes() const
number of blocks that are stored (the number of blocks that possibly are nonzero)
Definition bcrsmatrix.hh:1984
│ │ │ │ +
size_type allocationSize_
Definition bcrsmatrix.hh:2033
│ │ │ │ +
ConstIterator ConstRowIterator
rename the const row iterator for easier access
Definition bcrsmatrix.hh:738
│ │ │ │ +
BuildStage ready
Definition bcrsmatrix.hh:2020
│ │ │ │ +
BuildMode build_mode
Definition bcrsmatrix.hh:2019
│ │ │ │ +
void setrowsize(size_type i, size_type s)
Set number of indices in row i to s.
Definition bcrsmatrix.hh:1117
│ │ │ │ +
RealRowIterator< row_type > Iterator
Definition bcrsmatrix.hh:672
│ │ │ │ +
size_type nnz_
Definition bcrsmatrix.hh:2032
│ │ │ │ +
BCRSMatrix & operator*=(const field_type &k)
vector space multiplication with scalar
Definition bcrsmatrix.hh:1484
│ │ │ │ +
std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_
Definition bcrsmatrix.hh:2027
│ │ │ │ +
RealRowIterator< row_type > iterator
The iterator over the (mutable matrix rows.
Definition bcrsmatrix.hh:671
│ │ │ │ +
void usmtv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition bcrsmatrix.hh:1766
│ │ │ │ +
ConstIterator beforeBegin() const
Definition bcrsmatrix.hh:732
│ │ │ │ +
RealRowIterator< const row_type > ConstIterator
Definition bcrsmatrix.hh:708
│ │ │ │ +
Iterator beforeBegin()
Definition bcrsmatrix.hh:695
│ │ │ │ +
B * a
Definition bcrsmatrix.hh:2040
│ │ │ │ +
BuildMode
we support two modes
Definition bcrsmatrix.hh:510
│ │ │ │ +
@ implicit
Build entries randomly with an educated guess for the number of entries per row.
Definition bcrsmatrix.hh:539
│ │ │ │ +
@ unknown
Build mode not set!
Definition bcrsmatrix.hh:543
│ │ │ │ +
@ random
Build entries randomly.
Definition bcrsmatrix.hh:530
│ │ │ │ +
@ row_wise
Build in a row-wise manner.
Definition bcrsmatrix.hh:521
│ │ │ │ +
BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm)
matrix with known number of nonzeroes
Definition bcrsmatrix.hh:756
│ │ │ │ +
::Dune::CompressionStatistics< size_type > CompressionStatistics
The type for the statistics object returned by compress()
Definition bcrsmatrix.hh:503
│ │ │ │ +
BCRSMatrix & operator-=(const BCRSMatrix &b)
Subtract the entries of another matrix from this one.
Definition bcrsmatrix.hh:1567
│ │ │ │ +
BCRSMatrix(const BCRSMatrix &Mat)
copy constructor
Definition bcrsmatrix.hh:805
│ │ │ │ +
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ +
row_type * r
Definition bcrsmatrix.hh:2037
│ │ │ │ +
void setIndices(size_type row, It begin, It end)
Set all column indices for row from the given iterator range.
Definition bcrsmatrix.hh:1234
│ │ │ │ +
void addindex(size_type row, size_type col)
add index (row,col) to the matrix
Definition bcrsmatrix.hh:1191
│ │ │ │ +
std::map< std::pair< size_type, size_type >, B > OverflowType
Definition bcrsmatrix.hh:2049
│ │ │ │ +
row_type::Iterator ColIterator
Iterator for the entries of each row.
Definition bcrsmatrix.hh:704
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition bcrsmatrix.hh:1877
│ │ │ │ +
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ +
BCRSMatrix & operator/=(const field_type &k)
vector space division by scalar
Definition bcrsmatrix.hh:1512
│ │ │ │ +
OverflowType overflow
Definition bcrsmatrix.hh:2050
│ │ │ │ +
BCRSMatrix & operator+=(const BCRSMatrix &b)
Add the entries of another matrix to this one.
Definition bcrsmatrix.hh:1545
│ │ │ │ +
BCRSMatrix(size_type _n, size_type _m, size_type _avg, double compressionBufferSize, BuildMode bm)
construct matrix with a known average number of entries per row
Definition bcrsmatrix.hh:784
│ │ │ │ +
CreateIterator createend()
get create iterator pointing to one after the last block
Definition bcrsmatrix.hh:1103
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition bcrsmatrix.hh:1860
│ │ │ │ +
Iterator beforeEnd()
Definition bcrsmatrix.hh:688
│ │ │ │ +
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition bcrsmatrix.hh:741
│ │ │ │ +
void usmv(F &&alpha, const X &x, Y &y) const
y += alpha A x
Definition bcrsmatrix.hh:1684
│ │ │ │ +
size_type getrowsize(size_type i) const
get current number of indices in row i
Definition bcrsmatrix.hh:1128
│ │ │ │ +
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │ +
size_type n
Definition bcrsmatrix.hh:2030
│ │ │ │ +
Imp::CompressedBlockVectorWindow< B, A > row_type
implement row_type with compressed vector
Definition bcrsmatrix.hh:497
│ │ │ │ +
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ +
BuildStage
Definition bcrsmatrix.hh:469
│ │ │ │ +
@ rowSizesBuilt
The row sizes of the matrix are known.
Definition bcrsmatrix.hh:480
│ │ │ │ +
@ built
The matrix structure is fully built.
Definition bcrsmatrix.hh:482
│ │ │ │ +
@ notbuilt
Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
Definition bcrsmatrix.hh:471
│ │ │ │ +
@ notAllocated
Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
Definition bcrsmatrix.hh:473
│ │ │ │ +
@ building
Matrix is currently being built, some memory has been allocated, build mode and size are fixed.
Definition bcrsmatrix.hh:475
│ │ │ │ +
BuildMode buildMode() const
The currently selected build mode of the matrix.
Definition bcrsmatrix.hh:1999
│ │ │ │ +
void mmv(const X &x, Y &y) const
y -= A x
Definition bcrsmatrix.hh:1661
│ │ │ │ +
FieldTraits< ft >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition bcrsmatrix.hh:1885
│ │ │ │ +
void mv(const X &x, Y &y) const
y = A x
Definition bcrsmatrix.hh:1612
│ │ │ │ +
B block_type
export the type representing the components
Definition bcrsmatrix.hh:491
│ │ │ │ +
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition bcrsmatrix.hh:1745
│ │ │ │ +
size_type avg
Definition bcrsmatrix.hh:2046
│ │ │ │ +
void umv(const X &x, Y &y) const
y += A x
Definition bcrsmatrix.hh:1638
│ │ │ │ +
void implicit_allocate(size_type _n, size_type _m)
organizes allocation implicit mode calculates correct array size to be allocated and sets the the win...
Definition bcrsmatrix.hh:2265
│ │ │ │ +
void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
Set parameters needed for creation in implicit build mode.
Definition bcrsmatrix.hh:889
│ │ │ │ +
BCRSMatrix(size_type _n, size_type _m, BuildMode bm)
matrix with unknown number of nonzeroes
Definition bcrsmatrix.hh:765
│ │ │ │ +
void endindices()
indicate that all indices are defined, check consistency
Definition bcrsmatrix.hh:1248
│ │ │ │ +
CompressionStatistics compress()
Finishes the buildstage in implicit mode.
Definition bcrsmatrix.hh:1360
│ │ │ │ +
void setDataPointers()
Set data pointers for all rows.
Definition bcrsmatrix.hh:2103
│ │ │ │ +
std::allocator_traits< A >::template rebind_alloc< B > allocator_
Definition bcrsmatrix.hh:2023
│ │ │ │ +
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
void setBuildMode(BuildMode bm)
Sets the build mode of the matrix.
Definition bcrsmatrix.hh:833
│ │ │ │ +
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ +
std::shared_ptr< size_type > j_
Definition bcrsmatrix.hh:2043
│ │ │ │ +
void setWindowPointers(ConstRowIterator row)
Definition bcrsmatrix.hh:2052
│ │ │ │ +
BCRSMatrix & operator=(const BCRSMatrix &Mat)
assignment
Definition bcrsmatrix.hh:911
│ │ │ │ +
void setColumnPointers(ConstRowIterator row)
Copy row sizes from iterator range starting at row and set column index pointers for all rows.
Definition bcrsmatrix.hh:2077
│ │ │ │ +
ConstIterator end() const
Get const iterator to one beyond last row.
Definition bcrsmatrix.hh:718
│ │ │ │ +
ConstIterator begin() const
Get const iterator to first row.
Definition bcrsmatrix.hh:712
│ │ │ │ +
A allocator_type
export the allocator type
Definition bcrsmatrix.hh:494
│ │ │ │ +
ConstIterator beforeEnd() const
Definition bcrsmatrix.hh:725
│ │ │ │ +
Iterator access to matrix rows
Definition bcrsmatrix.hh:579
│ │ │ │ +
RealRowIterator()
empty constructor, use with care!
Definition bcrsmatrix.hh:596
│ │ │ │ +
bool equals(const RealRowIterator< ValueType > &other) const
equality
Definition bcrsmatrix.hh:624
│ │ │ │ +
std::remove_const< T >::type ValueType
The unqualified value type.
Definition bcrsmatrix.hh:583
│ │ │ │ +
RealRowIterator(const RealRowIterator< ValueType > &it)
Definition bcrsmatrix.hh:600
│ │ │ │ +
bool equals(const RealRowIterator< const ValueType > &other) const
equality
Definition bcrsmatrix.hh:631
│ │ │ │ +
RealRowIterator(row_type *_p, size_type _i)
constructor
Definition bcrsmatrix.hh:591
│ │ │ │ +
std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other) const
Definition bcrsmatrix.hh:617
│ │ │ │ +
size_type index() const
return index
Definition bcrsmatrix.hh:606
│ │ │ │ +
std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const
Definition bcrsmatrix.hh:611
│ │ │ │ +
Iterator class for sequential creation of blocks
Definition bcrsmatrix.hh:957
│ │ │ │ +
bool operator==(const CreateIterator &it) const
equality
Definition bcrsmatrix.hh:1052
│ │ │ │ +
CreateIterator & operator++()
prefix increment
Definition bcrsmatrix.hh:977
│ │ │ │ +
size_type index() const
The number of the row that the iterator currently points to.
Definition bcrsmatrix.hh:1058
│ │ │ │ +
bool operator!=(const CreateIterator &it) const
inequality
Definition bcrsmatrix.hh:1046
│ │ │ │ +
CreateIterator(BCRSMatrix &_Mat, size_type _i)
constructor
Definition bcrsmatrix.hh:960
│ │ │ │ +
void insert(size_type j)
put column index in row
Definition bcrsmatrix.hh:1064
│ │ │ │ +
bool contains(size_type j)
return true if column index is in row
Definition bcrsmatrix.hh:1070
│ │ │ │ +
size_type size() const
Get the current row size.
Definition bcrsmatrix.hh:1079
│ │ │ │ +
typename BCRSMatrix< B, A >::field_type field_type
Definition bcrsmatrix.hh:2299
│ │ │ │ +
typename FieldTraits< field_type >::real_type real_type
Definition bcrsmatrix.hh:2300
│ │ │ │ +
Error specific to BCRSMatrix.
Definition istlexception.hh:24
│ │ │ │ +
Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
Definition istlexception.hh:37
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ +
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ +
Definition matrixutils.hh:538
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,66 +1,2387 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -counter.hh │ │ │ │ │ +bcrsmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#ifndef DUNE_ISTL_COMMON_COUNTER_HH │ │ │ │ │ -4#define DUNE_ISTL_COMMON_COUNTER_HH │ │ │ │ │ +3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 5 │ │ │ │ │ -6#include │ │ │ │ │ -7#include │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -_1_5constexpr std::size_t _m_a_x_c_o_u_n_t = 100; │ │ │ │ │ -16 │ │ │ │ │ -_1_7#define DUNE_GET_COUNTER(Tag) \ │ │ │ │ │ -18 (counterFunc(Dune::PriorityTag{}, Tag{}, Dune::CounterImpl::ADLTag │ │ │ │ │ -{})) │ │ │ │ │ -19 │ │ │ │ │ -_2_0#define DUNE_INC_COUNTER(Tag) \ │ │ │ │ │ -21 namespace { \ │ │ │ │ │ -22 namespace CounterImpl { \ │ │ │ │ │ -23 constexpr std::size_t \ │ │ │ │ │ -24 counterFunc(Dune::PriorityTag p, Tag, ADLTag) \ │ │ │ │ │ -25 { \ │ │ │ │ │ -26 return p.value; \ │ │ │ │ │ -27 } \ │ │ │ │ │ -28 } \ │ │ │ │ │ -29 } \ │ │ │ │ │ -30 static_assert(true, "unfudge indentation") │ │ │ │ │ -31 │ │ │ │ │ -32namespace _D_u_n_e { │ │ │ │ │ -33 namespace { │ │ │ │ │ -34 │ │ │ │ │ -_3_5 namespace CounterImpl { │ │ │ │ │ +6#ifndef DUNE_ISTL_BCRSMATRIX_HH │ │ │ │ │ +7#define DUNE_ISTL_BCRSMATRIX_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +20#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +21#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ +22#include │ │ │ │ │ +23#include │ │ │ │ │ +24#include │ │ │ │ │ +25#include │ │ │ │ │ +26#include │ │ │ │ │ +27#include │ │ │ │ │ +28 │ │ │ │ │ +29#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +30 │ │ │ │ │ +35namespace _D_u_n_e { │ │ │ │ │ 36 │ │ │ │ │ -37 struct ADLTag {}; │ │ │ │ │ -38 │ │ │ │ │ -39 template │ │ │ │ │ -40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag) │ │ │ │ │ -41 { │ │ │ │ │ -42 return 0; │ │ │ │ │ -43 } │ │ │ │ │ -44 │ │ │ │ │ -45 } // end namespace CounterImpl │ │ │ │ │ -46 } // end empty namespace │ │ │ │ │ -47} // end namespace Dune │ │ │ │ │ -48#endif // DUNE_ISTL_COMMON_COUNTER_HH │ │ │ │ │ -_m_a_x_c_o_u_n_t │ │ │ │ │ -constexpr std::size_t maxcount │ │ │ │ │ -DDeeffiinniittiioonn counter.hh:15 │ │ │ │ │ +76 template │ │ │ │ │ +77 struct MatrixDimension; │ │ │ │ │ +78 │ │ │ │ │ +80 │ │ │ │ │ +86 template │ │ │ │ │ +_8_7 struct _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s │ │ │ │ │ +88 { │ │ │ │ │ +_9_0 double _a_v_g; │ │ │ │ │ +_9_2 size_type _m_a_x_i_m_u_m; │ │ │ │ │ +_9_4 size_type _o_v_e_r_f_l_o_w___t_o_t_a_l; │ │ │ │ │ +96 │ │ │ │ │ +_9_9 double _m_e_m___r_a_t_i_o; │ │ │ │ │ +100 }; │ │ │ │ │ +101 │ │ │ │ │ +103 │ │ │ │ │ +115 template │ │ │ │ │ +_1_1_6 class _I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ +117 { │ │ │ │ │ +118 │ │ │ │ │ +119 public: │ │ │ │ │ +120 │ │ │ │ │ +_1_2_2 typedef M_ _M_a_t_r_i_x; │ │ │ │ │ +123 │ │ │ │ │ +_1_2_5 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +126 │ │ │ │ │ +_1_2_8 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +129 │ │ │ │ │ +131 │ │ │ │ │ +_1_3_6 class _r_o_w___o_b_j_e_c_t │ │ │ │ │ +137 { │ │ │ │ │ +138 │ │ │ │ │ +139 public: │ │ │ │ │ +140 │ │ │ │ │ +_1_4_2 _b_l_o_c_k___t_y_p_e& _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e j) const │ │ │ │ │ +143 { │ │ │ │ │ +144 return _m.entry(_i,j); │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +147#ifndef DOXYGEN │ │ │ │ │ +148 │ │ │ │ │ +149 _r_o_w___o_b_j_e_c_t(_M_a_t_r_i_x& m, _s_i_z_e___t_y_p_e i) │ │ │ │ │ +150 : _m(m) │ │ │ │ │ +151 , _i(i) │ │ │ │ │ +152 {} │ │ │ │ │ +153 │ │ │ │ │ +154#endif │ │ │ │ │ +155 │ │ │ │ │ +156 private: │ │ │ │ │ +157 │ │ │ │ │ +158 _M_a_t_r_i_x& _m; │ │ │ │ │ +_1_5_9 _s_i_z_e___t_y_p_e _i; │ │ │ │ │ +160 │ │ │ │ │ +161 }; │ │ │ │ │ +162 │ │ │ │ │ +164 │ │ │ │ │ +_1_7_0 _I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r(_M_a_t_r_i_x& m) │ │ │ │ │ +171 : _m(m) │ │ │ │ │ +172 { │ │ │ │ │ +173 if (m.buildMode() != Matrix::implicit) │ │ │ │ │ +174 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only create an ImplicitBuilder for a │ │ │ │ │ +matrix in implicit build mode"); │ │ │ │ │ +175 if (m.buildStage() != Matrix::building) │ │ │ │ │ +176 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only create an ImplicitBuilder for a │ │ │ │ │ +matrix with set size that has not been compressed() yet"); │ │ │ │ │ +177 } │ │ │ │ │ +178 │ │ │ │ │ +180 │ │ │ │ │ +_1_9_4 _I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r(_M_a_t_r_i_x& m, _s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e cols, _s_i_z_e___t_y_p_e │ │ │ │ │ +avg_cols_per_row, double overflow_fraction) │ │ │ │ │ +195 : _m(m) │ │ │ │ │ +196 { │ │ │ │ │ +197 if (m.buildStage() != Matrix::notAllocated) │ │ │ │ │ +198 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only set up a matrix for this │ │ │ │ │ +ImplicitBuilder if it has no memory allocated yet"); │ │ │ │ │ +199 m.setBuildMode(Matrix::implicit); │ │ │ │ │ +200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction); │ │ │ │ │ +201 m.setSize(rows,cols); │ │ │ │ │ +202 } │ │ │ │ │ +203 │ │ │ │ │ +_2_0_5 _r_o_w___o_b_j_e_c_t _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +206 { │ │ │ │ │ +207 return _r_o_w___o_b_j_e_c_t(_m,i); │ │ │ │ │ +208 } │ │ │ │ │ +209 │ │ │ │ │ +_2_1_1 _s_i_z_e___t_y_p_e _N() const │ │ │ │ │ +212 { │ │ │ │ │ +213 return _m.N(); │ │ │ │ │ +214 } │ │ │ │ │ +215 │ │ │ │ │ +_2_1_7 _s_i_z_e___t_y_p_e _M() const │ │ │ │ │ +218 { │ │ │ │ │ +219 return _m.M(); │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +222 private: │ │ │ │ │ +223 │ │ │ │ │ +224 _M_a_t_r_i_x& _m; │ │ │ │ │ +225 │ │ │ │ │ +226 }; │ │ │ │ │ +227 │ │ │ │ │ +464 template > │ │ │ │ │ +_4_6_5 class _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +466 { │ │ │ │ │ +467 friend struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_B_C_R_S_M_a_t_r_i_x>; │ │ │ │ │ +468 public: │ │ │ │ │ +_4_6_9 enum _B_u_i_l_d_S_t_a_g_e { │ │ │ │ │ +_4_7_1 _n_o_t_b_u_i_l_t=0, │ │ │ │ │ +_4_7_3 _n_o_t_A_l_l_o_c_a_t_e_d=0, │ │ │ │ │ +_4_7_5 _b_u_i_l_d_i_n_g=1, │ │ │ │ │ +_4_8_0 _r_o_w_S_i_z_e_s_B_u_i_l_t=2, │ │ │ │ │ +482 _b_u_i_l_t=3 │ │ │ │ │ +_4_8_3 }; │ │ │ │ │ +484 │ │ │ │ │ +485 //===== type definitions and constants │ │ │ │ │ +486 │ │ │ │ │ +_4_8_8 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +489 │ │ │ │ │ +_4_9_1 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +492 │ │ │ │ │ +_4_9_4 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +495 │ │ │ │ │ +_4_9_7 typedef Imp::CompressedBlockVectorWindow _r_o_w___t_y_p_e; │ │ │ │ │ +498 │ │ │ │ │ +_5_0_0 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +501 │ │ │ │ │ +_5_0_3 typedef ::Dune::CompressionStatistics _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s; │ │ │ │ │ +504 │ │ │ │ │ +506 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ +2.8.")]] │ │ │ │ │ +_5_0_7 static constexpr unsigned int _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ +508 │ │ │ │ │ +_5_1_0 enum _B_u_i_l_d_M_o_d_e { │ │ │ │ │ +_5_2_1 _r_o_w___w_i_s_e, │ │ │ │ │ +_5_3_0 _r_a_n_d_o_m, │ │ │ │ │ +_5_3_9 _i_m_p_l_i_c_i_t, │ │ │ │ │ +543 _u_n_k_n_o_w_n │ │ │ │ │ +_5_4_4 }; │ │ │ │ │ +545 │ │ │ │ │ +546 //===== random access interface to rows of the matrix │ │ │ │ │ +547 │ │ │ │ │ +_5_4_9 _r_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +550 { │ │ │ │ │ +551#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +552 if (_b_u_i_l_d___m_o_d_e == _i_m_p_l_i_c_i_t && _r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +553 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot use operator[] in implicit build │ │ │ │ │ +mode before calling compress()"); │ │ │ │ │ +554 if (_r==0) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row not initialized yet"); │ │ │ │ │ +555 if (i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +556#endif │ │ │ │ │ +557 return _r[i]; │ │ │ │ │ +558 } │ │ │ │ │ +559 │ │ │ │ │ +_5_6_1 const _r_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +562 { │ │ │ │ │ +563#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +564 if (_b_u_i_l_d___m_o_d_e == _i_m_p_l_i_c_i_t && _r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +565 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot use operator[] in implicit build │ │ │ │ │ +mode before calling compress()"); │ │ │ │ │ +566 if (_b_u_i_l_t!=_r_e_a_d_y) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row not initialized yet"); │ │ │ │ │ +567 if (i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +568#endif │ │ │ │ │ +569 return _r[i]; │ │ │ │ │ +570 } │ │ │ │ │ +571 │ │ │ │ │ +572 │ │ │ │ │ +573 //===== iterator interface to rows of the matrix │ │ │ │ │ +574 │ │ │ │ │ +576 template │ │ │ │ │ +_5_7_7 class _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +578 : public RandomAccessIteratorFacade, T> │ │ │ │ │ +579 { │ │ │ │ │ +580 │ │ │ │ │ +581 public: │ │ │ │ │ +_5_8_3 typedef typename std::remove_const::type _V_a_l_u_e_T_y_p_e; │ │ │ │ │ +584 │ │ │ │ │ +585 friend class RandomAccessIteratorFacade<_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r, │ │ │ │ │ +const _V_a_l_u_e_T_y_p_e>; │ │ │ │ │ +586 friend class RandomAccessIteratorFacade<_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r<_V_a_l_u_e_T_y_p_e>, │ │ │ │ │ +_V_a_l_u_e_T_y_p_e>; │ │ │ │ │ +587 friend class _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +588 friend class _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r<_V_a_l_u_e_T_y_p_e>; │ │ │ │ │ +589 │ │ │ │ │ +_5_9_1 _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r (_r_o_w___t_y_p_e* _p, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ +592 : p(_p), i(_i) │ │ │ │ │ +593 {} │ │ │ │ │ +594 │ │ │ │ │ +_5_9_6 _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r () │ │ │ │ │ +597 : p(0), i(0) │ │ │ │ │ +598 {} │ │ │ │ │ +599 │ │ │ │ │ +_6_0_0 _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r(const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_V_a_l_u_e_T_y_p_e_>& it) │ │ │ │ │ +601 : p(it.p), i(it.i) │ │ │ │ │ +602 {} │ │ │ │ │ +603 │ │ │ │ │ +604 │ │ │ │ │ +_6_0_6 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ +607 { │ │ │ │ │ +608 return i; │ │ │ │ │ +609 } │ │ │ │ │ +610 │ │ │ │ │ +_6_1_1 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_V_a_l_u_e_T_y_p_e_>& other) const │ │ │ │ │ +612 { │ │ │ │ │ +613 assert(other.p==p); │ │ │ │ │ +614 return (other.i-i); │ │ │ │ │ +615 } │ │ │ │ │ +616 │ │ │ │ │ +_6_1_7 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _V_a_l_u_e_T_y_p_e_>& other) │ │ │ │ │ +const │ │ │ │ │ +618 { │ │ │ │ │ +619 assert(other.p==p); │ │ │ │ │ +620 return (other.i-i); │ │ │ │ │ +621 } │ │ │ │ │ +622 │ │ │ │ │ +_6_2_4 bool _e_q_u_a_l_s (const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_V_a_l_u_e_T_y_p_e_>& other) const │ │ │ │ │ +625 { │ │ │ │ │ +626 assert(other.p==p); │ │ │ │ │ +627 return i==other.i; │ │ │ │ │ +628 } │ │ │ │ │ +629 │ │ │ │ │ +_6_3_1 bool _e_q_u_a_l_s (const _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _V_a_l_u_e_T_y_p_e_>& other) const │ │ │ │ │ +632 { │ │ │ │ │ +633 assert(other.p==p); │ │ │ │ │ +634 return i==other.i; │ │ │ │ │ +635 } │ │ │ │ │ +636 │ │ │ │ │ +637 private: │ │ │ │ │ +639 void increment() │ │ │ │ │ +640 { │ │ │ │ │ +641 ++i; │ │ │ │ │ +642 } │ │ │ │ │ +643 │ │ │ │ │ +645 void decrement() │ │ │ │ │ +646 { │ │ │ │ │ +647 --i; │ │ │ │ │ +648 } │ │ │ │ │ +649 │ │ │ │ │ +650 void advance(std::ptrdiff_t diff) │ │ │ │ │ +651 { │ │ │ │ │ +652 i+=diff; │ │ │ │ │ +653 } │ │ │ │ │ +654 │ │ │ │ │ +655 T& elementAt(std::ptrdiff_t diff) const │ │ │ │ │ +656 { │ │ │ │ │ +657 return p[i+diff]; │ │ │ │ │ +658 } │ │ │ │ │ +659 │ │ │ │ │ +661 _r_o_w___t_y_p_e& dereference () const │ │ │ │ │ +662 { │ │ │ │ │ +663 return p[i]; │ │ │ │ │ +664 } │ │ │ │ │ +665 │ │ │ │ │ +666 _r_o_w___t_y_p_e* p; │ │ │ │ │ +667 _s_i_z_e___t_y_p_e i; │ │ │ │ │ +668 }; │ │ │ │ │ +669 │ │ │ │ │ +_6_7_1 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_r_o_w___t_y_p_e_> _i_t_e_r_a_t_o_r; │ │ │ │ │ +_6_7_2 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_r_o_w___t_y_p_e_> _I_t_e_r_a_t_o_r; │ │ │ │ │ +673 │ │ │ │ │ +_6_7_5 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ +676 { │ │ │ │ │ +677 return _I_t_e_r_a_t_o_r(_r,0); │ │ │ │ │ +678 } │ │ │ │ │ +679 │ │ │ │ │ +_6_8_1 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ +682 { │ │ │ │ │ +683 return _I_t_e_r_a_t_o_r(_r,_n); │ │ │ │ │ +684 } │ │ │ │ │ +685 │ │ │ │ │ +_6_8_8 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ +689 { │ │ │ │ │ +690 return _I_t_e_r_a_t_o_r(_r,_n-1); │ │ │ │ │ +691 } │ │ │ │ │ +692 │ │ │ │ │ +_6_9_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ +696 { │ │ │ │ │ +697 return _I_t_e_r_a_t_o_r(_r,-1); │ │ │ │ │ +698 } │ │ │ │ │ +699 │ │ │ │ │ +_7_0_1 typedef _I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +702 │ │ │ │ │ +_7_0_4 typedef typename row_type::Iterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +705 │ │ │ │ │ +_7_0_7 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _r_o_w___t_y_p_e_> _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +_7_0_8 typedef _R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _r_o_w___t_y_p_e_> _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +709 │ │ │ │ │ +710 │ │ │ │ │ +_7_1_2 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ +713 { │ │ │ │ │ +714 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,0); │ │ │ │ │ +715 } │ │ │ │ │ +716 │ │ │ │ │ +_7_1_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ +719 { │ │ │ │ │ +720 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,_n); │ │ │ │ │ +721 } │ │ │ │ │ +722 │ │ │ │ │ +_7_2_5 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ +726 { │ │ │ │ │ +727 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,_n-1); │ │ │ │ │ +728 } │ │ │ │ │ +729 │ │ │ │ │ +_7_3_2 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ +733 { │ │ │ │ │ +734 return _C_o_n_s_t_I_t_e_r_a_t_o_r(_r,-1); │ │ │ │ │ +735 } │ │ │ │ │ +736 │ │ │ │ │ +_7_3_8 typedef _C_o_n_s_t_I_t_e_r_a_t_o_r _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +739 │ │ │ │ │ +_7_4_1 typedef typename row_type::ConstIterator _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +742 │ │ │ │ │ +743 //===== constructors & resizers │ │ │ │ │ +744 │ │ │ │ │ +745 // we use a negative compressionBufferSize to indicate that the implicit │ │ │ │ │ +746 // mode parameters have not been set yet │ │ │ │ │ +747 │ │ │ │ │ +_7_4_9 _B_C_R_S_M_a_t_r_i_x () │ │ │ │ │ +750 : _b_u_i_l_d___m_o_d_e(_u_n_k_n_o_w_n), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ +751 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ +752 _a_v_g(0), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(-1.0) │ │ │ │ │ +753 {} │ │ │ │ │ +754 │ │ │ │ │ +_7_5_6 _B_C_R_S_M_a_t_r_i_x (_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m, _s_i_z_e___t_y_p_e _nnz, _B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ +757 : _b_u_i_l_d___m_o_d_e(bm), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ +758 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ +759 _a_v_g(0), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(-1.0) │ │ │ │ │ +760 { │ │ │ │ │ +761 _a_l_l_o_c_a_t_e(_n, _m, _nnz,true,false); │ │ │ │ │ +762 } │ │ │ │ │ +763 │ │ │ │ │ +_7_6_5 _B_C_R_S_M_a_t_r_i_x (_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m, _B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ +766 : _b_u_i_l_d___m_o_d_e(bm), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ +767 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ +768 _a_v_g(0), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(-1.0) │ │ │ │ │ +769 { │ │ │ │ │ +770 _a_l_l_o_c_a_t_e(_n, _m,0,true,false); │ │ │ │ │ +771 } │ │ │ │ │ +772 │ │ │ │ │ +774 │ │ │ │ │ +_7_8_4 _B_C_R_S_M_a_t_r_i_x (_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m, _s_i_z_e___t_y_p_e _avg, double │ │ │ │ │ +compressionBufferSize, _B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ +785 : _b_u_i_l_d___m_o_d_e(bm), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ +786 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ +787 _a_v_g(_avg), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(compressionBufferSize) │ │ │ │ │ +788 { │ │ │ │ │ +789 if (bm != _i_m_p_l_i_c_i_t) │ │ │ │ │ +790 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"Only call this constructor when using the │ │ │ │ │ +implicit build mode"); │ │ │ │ │ +791 // Prevent user from setting a negative compression buffer size: │ │ │ │ │ +792 // 1) It doesn't make sense │ │ │ │ │ +793 // 2) We use a negative value to indicate that the parameters │ │ │ │ │ +794 // have not been set yet │ │ │ │ │ +795 if (_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ < 0.0) │ │ │ │ │ +796 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot set a negative overflow fraction"); │ │ │ │ │ +797 _i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e(_n,_m); │ │ │ │ │ +798 } │ │ │ │ │ +799 │ │ │ │ │ +_8_0_5 _B_C_R_S_M_a_t_r_i_x (const _B_C_R_S_M_a_t_r_i_x& Mat) │ │ │ │ │ +806 : _b_u_i_l_d___m_o_d_e(Mat._b_u_i_l_d___m_o_d_e), _r_e_a_d_y(_n_o_t_A_l_l_o_c_a_t_e_d), _n(0), _m(0), _n_n_z__(0), │ │ │ │ │ +807 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__(0), _r(0), _a(0), │ │ │ │ │ +808 _a_v_g(Mat._a_v_g), _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__(Mat._c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__) │ │ │ │ │ +809 { │ │ │ │ │ +810 if (!(Mat._r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d || Mat._r_e_a_d_y == _b_u_i_l_t)) │ │ │ │ │ +811 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copy-constructed │ │ │ │ │ +when source matrix is completely empty (size not set) or fully built)"); │ │ │ │ │ +812 │ │ │ │ │ +813 // deep copy in global array │ │ │ │ │ +814 _s_i_z_e___t_y_p_e _nnz = Mat._n_o_n_z_e_r_o_e_s(); │ │ │ │ │ +815 │ │ │ │ │ +816 _j__ = Mat._j__; // enable column index sharing, release array in case of row- │ │ │ │ │ +wise allocation │ │ │ │ │ +817 _a_l_l_o_c_a_t_e(Mat._n, Mat._m, _nnz, true, true); │ │ │ │ │ +818 │ │ │ │ │ +819 // build window structure │ │ │ │ │ +820 _c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e(Mat); │ │ │ │ │ +821 } │ │ │ │ │ +822 │ │ │ │ │ +_8_2_4 _~_B_C_R_S_M_a_t_r_i_x () │ │ │ │ │ +825 { │ │ │ │ │ +826 _d_e_a_l_l_o_c_a_t_e(); │ │ │ │ │ +827 } │ │ │ │ │ +828 │ │ │ │ │ +_8_3_3 void _s_e_t_B_u_i_l_d_M_o_d_e(_B_u_i_l_d_M_o_d_e bm) │ │ │ │ │ +834 { │ │ │ │ │ +835 if (_r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ +836 { │ │ │ │ │ +837 _b_u_i_l_d___m_o_d_e = bm; │ │ │ │ │ +838 return; │ │ │ │ │ +839 } │ │ │ │ │ +840 if (_r_e_a_d_y == _b_u_i_l_d_i_n_g && (_b_u_i_l_d___m_o_d_e == _u_n_k_n_o_w_n || _b_u_i_l_d___m_o_d_e == _r_a_n_d_o_m || │ │ │ │ │ +_b_u_i_l_d___m_o_d_e == _r_o_w___w_i_s_e) && (bm == _r_o_w___w_i_s_e || bm == _r_a_n_d_o_m)) │ │ │ │ │ +841 _b_u_i_l_d___m_o_d_e = bm; │ │ │ │ │ +842 else │ │ │ │ │ +843 DUNE_THROW(InvalidStateException, "Matrix structure cannot be changed at │ │ │ │ │ +this stage anymore (ready == "<<_r_e_a_d_y<<")."); │ │ │ │ │ +844 } │ │ │ │ │ +845 │ │ │ │ │ +_8_6_1 void _s_e_t_S_i_z_e(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e nnz=0) │ │ │ │ │ +862 { │ │ │ │ │ +863 // deallocate already setup memory │ │ │ │ │ +864 _d_e_a_l_l_o_c_a_t_e(); │ │ │ │ │ +865 │ │ │ │ │ +866 if (_b_u_i_l_d___m_o_d_e == _i_m_p_l_i_c_i_t) │ │ │ │ │ +867 { │ │ │ │ │ +868 if (nnz>0) │ │ │ │ │ +869 DUNE_THROW(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"number of non-zeroes may not be set in │ │ │ │ │ +implicit mode, use setImplicitBuildModeParameters() instead"); │ │ │ │ │ +870 │ │ │ │ │ +871 // implicit allocates differently │ │ │ │ │ +872 _i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e(rows,columns); │ │ │ │ │ +873 } │ │ │ │ │ +874 else │ │ │ │ │ +875 { │ │ │ │ │ +876 // allocate matrix memory │ │ │ │ │ +877 _a_l_l_o_c_a_t_e(rows, columns, nnz, true, false); │ │ │ │ │ +878 } │ │ │ │ │ +879 } │ │ │ │ │ +880 │ │ │ │ │ +_8_8_9 void _s_e_t_I_m_p_l_i_c_i_t_B_u_i_l_d_M_o_d_e_P_a_r_a_m_e_t_e_r_s(_s_i_z_e___t_y_p_e _avg, double │ │ │ │ │ +compressionBufferSize) │ │ │ │ │ +890 { │ │ │ │ │ +891 // Prevent user from setting a negative compression buffer size: │ │ │ │ │ +892 // 1) It doesn't make sense │ │ │ │ │ +893 // 2) We use a negative value to indicate that the parameters │ │ │ │ │ +894 // have not been set yet │ │ │ │ │ +895 if (compressionBufferSize < 0.0) │ │ │ │ │ +896 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You cannot set a negative compressionBufferSize │ │ │ │ │ +value"); │ │ │ │ │ +897 │ │ │ │ │ +898 // make sure the parameters aren't changed after memory has been allocated │ │ │ │ │ +899 if (_r_e_a_d_y != _n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ +900 DUNE_THROW(InvalidStateException,"You cannot modify build mode parameters │ │ │ │ │ +at this stage anymore"); │ │ │ │ │ +901 _a_v_g = _avg; │ │ │ │ │ +902 _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ = compressionBufferSize; │ │ │ │ │ +903 } │ │ │ │ │ +904 │ │ │ │ │ +_9_1_1 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _B_C_R_S_M_a_t_r_i_x& Mat) │ │ │ │ │ +912 { │ │ │ │ │ +913 // return immediately when self-assignment │ │ │ │ │ +914 if (&Mat==this) return *this; │ │ │ │ │ +915 │ │ │ │ │ +916 if (!((_r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d || _r_e_a_d_y == _b_u_i_l_t) && (Mat._r_e_a_d_y == │ │ │ │ │ +_n_o_t_A_l_l_o_c_a_t_e_d || Mat._r_e_a_d_y == _b_u_i_l_t))) │ │ │ │ │ +917 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copied when both │ │ │ │ │ +target and source are empty or fully built)"); │ │ │ │ │ +918 │ │ │ │ │ +919 // make it simple: ALWAYS throw away memory for a and j_ │ │ │ │ │ +920 // and deallocate rows only if n != Mat.n │ │ │ │ │ +921 _d_e_a_l_l_o_c_a_t_e(_n!=Mat._n); │ │ │ │ │ +922 │ │ │ │ │ +923 // reallocate the rows if required │ │ │ │ │ +924 if (_n>0 && _n!=Mat._n) { │ │ │ │ │ +925 // free rows │ │ │ │ │ +926 for(_r_o_w___t_y_p_e *riter=_r+(_n-1), *rend=_r-1; riter!=rend; --riter) │ │ │ │ │ +927 std::allocator_traits::destroy(_r_o_w_A_l_l_o_c_a_t_o_r__, │ │ │ │ │ +riter); │ │ │ │ │ +928 _r_o_w_A_l_l_o_c_a_t_o_r__.deallocate(_r,_n); │ │ │ │ │ +929 } │ │ │ │ │ +930 │ │ │ │ │ +931 _n_n_z__ = Mat._n_o_n_z_e_r_o_e_s(); │ │ │ │ │ +932 │ │ │ │ │ +933 // allocate a, share j_ │ │ │ │ │ +934 _j__ = Mat._j__; │ │ │ │ │ +935 _a_l_l_o_c_a_t_e(Mat._n, Mat._m, _n_n_z__, _n!=Mat._n, true); │ │ │ │ │ +936 │ │ │ │ │ +937 // build window structure │ │ │ │ │ +938 _c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e(Mat); │ │ │ │ │ +939 return *this; │ │ │ │ │ +940 } │ │ │ │ │ +941 │ │ │ │ │ +_9_4_3 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +944 { │ │ │ │ │ +945 │ │ │ │ │ +946 if (!(_r_e_a_d_y == _n_o_t_A_l_l_o_c_a_t_e_d || _r_e_a_d_y == _b_u_i_l_t)) │ │ │ │ │ +947 DUNE_THROW(InvalidStateException,"Scalar assignment only works on fully │ │ │ │ │ +built BCRSMatrix)"); │ │ │ │ │ +948 │ │ │ │ │ +949 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) _r[i] = k; │ │ │ │ │ +950 return *this; │ │ │ │ │ +951 } │ │ │ │ │ +952 │ │ │ │ │ +953 //===== row-wise creation interface │ │ │ │ │ +954 │ │ │ │ │ +_9_5_6 class _C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +957 { │ │ │ │ │ +958 public: │ │ │ │ │ +_9_6_0 _C_r_e_a_t_e_I_t_e_r_a_t_o_r (_B_C_R_S_M_a_t_r_i_x& _Mat, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ +961 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat._j__._g_e_t(), 0) │ │ │ │ │ +962 { │ │ │ │ │ +963 if (Mat._b_u_i_l_d___m_o_d_e == _u_n_k_n_o_w_n && Mat._r_e_a_d_y == _b_u_i_l_d_i_n_g) │ │ │ │ │ +964 { │ │ │ │ │ +965 Mat._b_u_i_l_d___m_o_d_e = _r_o_w___w_i_s_e; │ │ │ │ │ +966 } │ │ │ │ │ +967 if (i==0 && Mat._r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ +968 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"creation only allowed for uninitialized │ │ │ │ │ +matrix"); │ │ │ │ │ +969 if(Mat._b_u_i_l_d___m_o_d_e!=_r_o_w___w_i_s_e) │ │ │ │ │ +970 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"creation only allowed if row wise allocation │ │ │ │ │ +was requested in the constructor"); │ │ │ │ │ +971 if(i==0 && _Mat._N()==0) │ │ │ │ │ +972 // empty Matrix is always built. │ │ │ │ │ +973 Mat._r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ +974 } │ │ │ │ │ +975 │ │ │ │ │ +_9_7_7 _C_r_e_a_t_e_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +978 { │ │ │ │ │ +979 // this should only be called if matrix is in creation │ │ │ │ │ +980 if (Mat._r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ +981 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix already built up"); │ │ │ │ │ +982 │ │ │ │ │ +983 // row i is defined through the pattern │ │ │ │ │ +984 // get memory for the row and initialize the j_ array │ │ │ │ │ +985 // this depends on the allocation mode │ │ │ │ │ +986 │ │ │ │ │ +987 // compute size of the row │ │ │ │ │ +988 _s_i_z_e___t_y_p_e s = pattern.size(); │ │ │ │ │ +989 │ │ │ │ │ +990 if(s>0) { │ │ │ │ │ +991 // update number of nonzeroes including this row │ │ │ │ │ +992 nnz += s; │ │ │ │ │ +993 │ │ │ │ │ +994 // alloc memory / set window │ │ │ │ │ +995 if (Mat._n_n_z__ > 0) │ │ │ │ │ +996 { │ │ │ │ │ +997 // memory is allocated in one long array │ │ │ │ │ +998 │ │ │ │ │ +999 // check if that memory is sufficient │ │ │ │ │ +1000 if (nnz > Mat._n_n_z__) │ │ │ │ │ +1001 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"allocated nnz too small"); │ │ │ │ │ +1002 │ │ │ │ │ +1003 // set row i │ │ │ │ │ +1004 Mat._r[i].set(s,nullptr,current_row.getindexptr()); │ │ │ │ │ +1005 current_row.setindexptr(current_row.getindexptr()+s); │ │ │ │ │ +1006 }else{ │ │ │ │ │ +1007 // memory is allocated individually per row │ │ │ │ │ +1008 // allocate and set row i │ │ │ │ │ +1009 B* b = Mat._a_l_l_o_c_a_t_o_r__.allocate(s); │ │ │ │ │ +1010 // use placement new to call constructor that allocates │ │ │ │ │ +1011 // additional memory. │ │ │ │ │ +1012 new (b) B[s]; │ │ │ │ │ +1013 _s_i_z_e___t_y_p_e* j = Mat._s_i_z_e_A_l_l_o_c_a_t_o_r__.allocate(s); │ │ │ │ │ +1014 Mat._r[i].set(s,b,j); │ │ │ │ │ +1015 } │ │ │ │ │ +1016 }else │ │ │ │ │ +1017 // setup empty row │ │ │ │ │ +1018 Mat._r[i].set(0,nullptr,nullptr); │ │ │ │ │ +1019 │ │ │ │ │ +1020 // initialize the j array for row i from pattern │ │ │ │ │ +1021 std::copy(pattern.cbegin(), pattern.cend(), Mat._r[i].getindexptr()); │ │ │ │ │ +1022 │ │ │ │ │ +1023 // now go to next row │ │ │ │ │ +1024 i++; │ │ │ │ │ +1025 pattern.clear(); │ │ │ │ │ +1026 │ │ │ │ │ +1027 // check if this was last row │ │ │ │ │ +1028 if (i==Mat._n) │ │ │ │ │ +1029 { │ │ │ │ │ +1030 Mat._r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ +1031 if(Mat._n_n_z__ > 0) │ │ │ │ │ +1032 { │ │ │ │ │ +1033 // Set nnz to the exact number of nonzero blocks inserted │ │ │ │ │ +1034 // as some methods rely on it │ │ │ │ │ +1035 Mat._n_n_z__ = nnz; │ │ │ │ │ +1036 // allocate data array │ │ │ │ │ +1037 Mat._a_l_l_o_c_a_t_e_D_a_t_a(); │ │ │ │ │ +1038 Mat._s_e_t_D_a_t_a_P_o_i_n_t_e_r_s(); │ │ │ │ │ +1039 } │ │ │ │ │ +1040 } │ │ │ │ │ +1041 // done │ │ │ │ │ +1042 return *this; │ │ │ │ │ +1043 } │ │ │ │ │ +1044 │ │ │ │ │ +_1_0_4_6 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +1047 { │ │ │ │ │ +1048 return (i!=it.i) || (&Mat!=&it.Mat); │ │ │ │ │ +1049 } │ │ │ │ │ +1050 │ │ │ │ │ +_1_0_5_2 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +1053 { │ │ │ │ │ +1054 return (i==it.i) && (&Mat==&it.Mat); │ │ │ │ │ +1055 } │ │ │ │ │ +1056 │ │ │ │ │ +_1_0_5_8 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ +1059 { │ │ │ │ │ +1060 return i; │ │ │ │ │ +1061 } │ │ │ │ │ +1062 │ │ │ │ │ +_1_0_6_4 void _i_n_s_e_r_t (_s_i_z_e___t_y_p_e j) │ │ │ │ │ +1065 { │ │ │ │ │ +1066 pattern.insert(j); │ │ │ │ │ +1067 } │ │ │ │ │ +1068 │ │ │ │ │ +_1_0_7_0 bool _c_o_n_t_a_i_n_s (_s_i_z_e___t_y_p_e j) │ │ │ │ │ +1071 { │ │ │ │ │ +1072 return pattern.find(j) != pattern.end(); │ │ │ │ │ +1073 } │ │ │ │ │ +_1_0_7_9 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +1080 { │ │ │ │ │ +1081 return pattern.size(); │ │ │ │ │ +1082 } │ │ │ │ │ +1083 │ │ │ │ │ +1084 private: │ │ │ │ │ +1085 _B_C_R_S_M_a_t_r_i_x& Mat; // the matrix we are defining │ │ │ │ │ +1086 _s_i_z_e___t_y_p_e i; // current row to be defined │ │ │ │ │ +1087 _s_i_z_e___t_y_p_e nnz; // count total number of nonzeros │ │ │ │ │ +1088 typedef std::set > PatternType; │ │ │ │ │ +1089 PatternType pattern; // used to compile entries in a row │ │ │ │ │ +1090 _r_o_w___t_y_p_e current_row; // row pointing to the current row to setup │ │ │ │ │ +1091 }; │ │ │ │ │ +1092 │ │ │ │ │ +_1_0_9_4 friend class _C_r_e_a_t_e_I_t_e_r_a_t_o_r; │ │ │ │ │ +1095 │ │ │ │ │ +_1_0_9_7 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_b_e_g_i_n () │ │ │ │ │ +1098 { │ │ │ │ │ +1099 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,0); │ │ │ │ │ +1100 } │ │ │ │ │ +1101 │ │ │ │ │ +_1_1_0_3 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_e_n_d () │ │ │ │ │ +1104 { │ │ │ │ │ +1105 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,_n); │ │ │ │ │ +1106 } │ │ │ │ │ +1107 │ │ │ │ │ +1108 │ │ │ │ │ +1109 //===== random creation interface │ │ │ │ │ +1110 │ │ │ │ │ +_1_1_1_7 void _s_e_t_r_o_w_s_i_z_e (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s) │ │ │ │ │ +1118 { │ │ │ │ │ +1119 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ +1120 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ +1121 if (_r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ +1122 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix row sizes already built up"); │ │ │ │ │ +1123 │ │ │ │ │ +1124 _r[i].setsize(s); │ │ │ │ │ +1125 } │ │ │ │ │ +1126 │ │ │ │ │ +_1_1_2_8 _s_i_z_e___t_y_p_e _g_e_t_r_o_w_s_i_z_e (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +1129 { │ │ │ │ │ +1130#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1131 if (_r==0) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row not initialized yet"); │ │ │ │ │ +1132 if (i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1133#endif │ │ │ │ │ +1134 return _r[i].getsize(); │ │ │ │ │ +1135 } │ │ │ │ │ +1136 │ │ │ │ │ +_1_1_3_8 void _i_n_c_r_e_m_e_n_t_r_o_w_s_i_z_e (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s = 1) │ │ │ │ │ +1139 { │ │ │ │ │ +1140 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ +1141 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ +1142 if (_r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ +1143 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix row sizes already built up"); │ │ │ │ │ +1144 │ │ │ │ │ +1145 _r[i].setsize(_r[i].getsize()+s); │ │ │ │ │ +1146 } │ │ │ │ │ +1147 │ │ │ │ │ +_1_1_4_9 void _e_n_d_r_o_w_s_i_z_e_s () │ │ │ │ │ +1150 { │ │ │ │ │ +1151 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ +1152 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ +1153 if (_r_e_a_d_y != _b_u_i_l_d_i_n_g) │ │ │ │ │ +1154 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix row sizes already built up"); │ │ │ │ │ +1155 │ │ │ │ │ +1156 // compute total size, check positivity │ │ │ │ │ +1157 _s_i_z_e___t_y_p_e total=0; │ │ │ │ │ +1158 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ +1159 { │ │ │ │ │ +1160 total += _r[i].getsize(); │ │ │ │ │ +1161 } │ │ │ │ │ +1162 │ │ │ │ │ +1163 if(_n_n_z__ == 0) │ │ │ │ │ +1164 // allocate/check memory │ │ │ │ │ +1165 _a_l_l_o_c_a_t_e(_n,_m,total,false,false); │ │ │ │ │ +1166 else if(_n_n_z__ < total) │ │ │ │ │ +1167 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"Specified number of nonzeros ("<<_n_n_z__<<") not │ │ │ │ │ +" │ │ │ │ │ +1168 <<"sufficient for calculated nonzeros ("<= _m) │ │ │ │ │ +1203 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"column index exceeds matrix size"); │ │ │ │ │ +1204 │ │ │ │ │ +1205 // get row range │ │ │ │ │ +1206 _s_i_z_e___t_y_p_e* const first = _r[row].getindexptr(); │ │ │ │ │ +1207 _s_i_z_e___t_y_p_e* const last = first + _r[row].getsize(); │ │ │ │ │ +1208 │ │ │ │ │ +1209 // find correct insertion position for new column index │ │ │ │ │ +1210 _s_i_z_e___t_y_p_e* pos = std::lower_bound(first,last,_c_o_l); │ │ │ │ │ +1211 │ │ │ │ │ +1212 // check if index is already in row │ │ │ │ │ +1213 if (pos!=last && *pos == _c_o_l) return; │ │ │ │ │ +1214 │ │ │ │ │ +1215 // find end of already inserted column indices │ │ │ │ │ +1216 _s_i_z_e___t_y_p_e* _e_n_d = std::lower_bound(pos,last,_m); │ │ │ │ │ +1217 if (_e_n_d==last) │ │ │ │ │ +1218 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row is too small"); │ │ │ │ │ +1219 │ │ │ │ │ +1220 // insert new column index at correct position │ │ │ │ │ +1221 std::copy_backward(pos,_e_n_d,_e_n_d+1); │ │ │ │ │ +1222 *pos = _c_o_l; │ │ │ │ │ +1223 } │ │ │ │ │ +1224 │ │ │ │ │ +1226 │ │ │ │ │ +1233 template │ │ │ │ │ +_1_2_3_4 void _s_e_t_I_n_d_i_c_e_s(_s_i_z_e___t_y_p_e row, It _b_e_g_i_n, It _e_n_d) │ │ │ │ │ +1235 { │ │ │ │ │ +1236 _s_i_z_e___t_y_p_e row_size = _r[row].size(); │ │ │ │ │ +1237 _s_i_z_e___t_y_p_e* col_begin = _r[row].getindexptr(); │ │ │ │ │ +1238 _s_i_z_e___t_y_p_e* col_end; │ │ │ │ │ +1239 // consistency check between allocated row size and number of passed │ │ │ │ │ +column indices │ │ │ │ │ +1240 if ((col_end = std::copy(_b_e_g_i_n,_e_n_d,_r[row].getindexptr())) != col_begin + │ │ │ │ │ +row_size) │ │ │ │ │ +1241 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"Given size of row " << row │ │ │ │ │ +1242 << " (" << row_size │ │ │ │ │ +1243 << ") does not match number of passed entries (" << (col_end - col_begin) │ │ │ │ │ +<< ")"); │ │ │ │ │ +1244 std::sort(col_begin,col_end); │ │ │ │ │ +1245 } │ │ │ │ │ +1246 │ │ │ │ │ +_1_2_4_8 void _e_n_d_i_n_d_i_c_e_s () │ │ │ │ │ +1249 { │ │ │ │ │ +1250 if (_b_u_i_l_d___m_o_d_e!=_r_a_n_d_o_m) │ │ │ │ │ +1251 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires random build mode"); │ │ │ │ │ +1252 if (_r_e_a_d_y==_b_u_i_l_t) │ │ │ │ │ +1253 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix already built up"); │ │ │ │ │ +1254 if (_r_e_a_d_y==_b_u_i_l_d_i_n_g) │ │ │ │ │ +1255 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row sizes are not built up yet"); │ │ │ │ │ +1256 if (_r_e_a_d_y==_n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ +1257 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix size not set and no memory allocated │ │ │ │ │ +yet"); │ │ │ │ │ +1258 │ │ │ │ │ +1259 // check if there are undefined indices │ │ │ │ │ +1260 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1261 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1262 { │ │ │ │ │ +1263 _C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1264 for (_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) { │ │ │ │ │ +1265 if (j.index() >= _m) { │ │ │ │ │ +1266 dwarn << "WARNING: size of row "<< i.index()<<" is "<= _n) │ │ │ │ │ +1309 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row index exceeds matrix size"); │ │ │ │ │ +1310 if (_c_o_l >= _m) │ │ │ │ │ +1311 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"column index exceeds matrix size"); │ │ │ │ │ +1312#endif │ │ │ │ │ +1313 │ │ │ │ │ +1314 _s_i_z_e___t_y_p_e* _b_e_g_i_n = _r[row].getindexptr(); │ │ │ │ │ +1315 _s_i_z_e___t_y_p_e* _e_n_d = _b_e_g_i_n + _r[row].getsize(); │ │ │ │ │ +1316 │ │ │ │ │ +1317 _s_i_z_e___t_y_p_e* pos = std::find(_b_e_g_i_n, _e_n_d, _c_o_l); │ │ │ │ │ +1318 │ │ │ │ │ +1319 //treat the case that there was a match in the array │ │ │ │ │ +1320 if (pos != _e_n_d) │ │ │ │ │ +1321 if (*pos == _c_o_l) │ │ │ │ │ +1322 { │ │ │ │ │ +1323 std::ptrdiff_t offset = pos - _r[row].getindexptr(); │ │ │ │ │ +1324 B* aptr = _r[row].getptr() + offset; │ │ │ │ │ +1325 │ │ │ │ │ +1326 return *aptr; │ │ │ │ │ +1327 } │ │ │ │ │ +1328 │ │ │ │ │ +1329 //determine whether overflow has to be taken into account or not │ │ │ │ │ +1330 if (_r[row].getsize() == _a_v_g) │ │ │ │ │ +1331 return _o_v_e_r_f_l_o_w[std::make_pair(row,_c_o_l)]; │ │ │ │ │ +1332 else │ │ │ │ │ +1333 { │ │ │ │ │ +1334 //modify index array │ │ │ │ │ +1335 *_e_n_d = _c_o_l; │ │ │ │ │ +1336 │ │ │ │ │ +1337 //do simultaneous operations on data array a │ │ │ │ │ +1338 std::ptrdiff_t offset = _e_n_d - _r[row].getindexptr(); │ │ │ │ │ +1339 B* apos = _r[row].getptr() + offset; │ │ │ │ │ +1340 │ │ │ │ │ +1341 //increase rowsize │ │ │ │ │ +1342 _r[row].setsize(_r[row].getsize()+1); │ │ │ │ │ +1343 │ │ │ │ │ +1344 //return reference to the newly created entry │ │ │ │ │ +1345 return *apos; │ │ │ │ │ +1346 } │ │ │ │ │ +1347 } │ │ │ │ │ +1348 │ │ │ │ │ +1350 │ │ │ │ │ +_1_3_6_0 _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s _c_o_m_p_r_e_s_s() │ │ │ │ │ +1361 { │ │ │ │ │ +1362 if (_b_u_i_l_d___m_o_d_e!=_i_m_p_l_i_c_i_t) │ │ │ │ │ +1363 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"requires implicit build mode"); │ │ │ │ │ +1364 if (_r_e_a_d_y==_b_u_i_l_t) │ │ │ │ │ +1365 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix already built up, no more need for │ │ │ │ │ +compression"); │ │ │ │ │ +1366 if (_r_e_a_d_y==_n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ +1367 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"matrix size not set and no memory allocated │ │ │ │ │ +yet"); │ │ │ │ │ +1368 if (_r_e_a_d_y!=_b_u_i_l_d_i_n_g) │ │ │ │ │ +1369 DUNE_THROW(InvalidStateException,"You may only call compress() at the end │ │ │ │ │ +of the 'building' stage"); │ │ │ │ │ +1370 │ │ │ │ │ +1371 //calculate statistics │ │ │ │ │ +1372 _C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s stats; │ │ │ │ │ +1373 stats._o_v_e_r_f_l_o_w___t_o_t_a_l = _o_v_e_r_f_l_o_w.size(); │ │ │ │ │ +1374 stats._m_a_x_i_m_u_m = 0; │ │ │ │ │ +1375 │ │ │ │ │ +1376 //get insertion iterators pointing to one before start (for later use of │ │ │ │ │ +++it) │ │ │ │ │ +1377 _s_i_z_e___t_y_p_e* jiit = _j__.get(); │ │ │ │ │ +1378 B* aiit = _a; │ │ │ │ │ +1379 │ │ │ │ │ +1380 //get iterator to the smallest overflow element │ │ │ │ │ +1381 typename OverflowType::iterator oit = _o_v_e_r_f_l_o_w.begin(); │ │ │ │ │ +1382 │ │ │ │ │ +1383 //store a copy of index pointers on which to perform sorting │ │ │ │ │ +1384 std::vector perm; │ │ │ │ │ +1385 │ │ │ │ │ +1386 //iterate over all rows and copy elements into their position in the │ │ │ │ │ +compressed array │ │ │ │ │ +1387 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ +1388 { │ │ │ │ │ +1389 //get old pointers into a and j and size without overflow changes │ │ │ │ │ +1390 _s_i_z_e___t_y_p_e* _b_e_g_i_n = _r[i].getindexptr(); │ │ │ │ │ +1391 //B* apos = r[i].getptr(); │ │ │ │ │ +1392 _s_i_z_e___t_y_p_e size = _r[i].getsize(); │ │ │ │ │ +1393 │ │ │ │ │ +1394 perm.resize(size); │ │ │ │ │ +1395 │ │ │ │ │ +1396 typename std::vector::iterator it = perm.begin(); │ │ │ │ │ +1397 for (_s_i_z_e___t_y_p_e* iit = _b_e_g_i_n; iit < _b_e_g_i_n + size; ++iit, ++it) │ │ │ │ │ +1398 *it = iit; │ │ │ │ │ +1399 │ │ │ │ │ +1400 //sort permutation array │ │ │ │ │ +1401 std::sort(perm.begin(),perm.end(),_P_o_i_n_t_e_r_C_o_m_p_a_r_e_<_s_i_z_e___t_y_p_e_>()); │ │ │ │ │ +1402 │ │ │ │ │ +1403 //change row window pointer to their new positions │ │ │ │ │ +1404 _r[i].setindexptr(jiit); │ │ │ │ │ +1405 _r[i].setptr(aiit); │ │ │ │ │ +1406 │ │ │ │ │ +1407 for (it = perm.begin(); it != perm.end(); ++it) │ │ │ │ │ +1408 { │ │ │ │ │ +1409 //check whether there are elements in the overflow area which take │ │ │ │ │ +precedence │ │ │ │ │ +1410 while ((oit!=_o_v_e_r_f_l_o_w.end()) && (oit->first < std::make_pair(i,**it))) │ │ │ │ │ +1411 { │ │ │ │ │ +1412 //check whether there is enough memory to write to │ │ │ │ │ +1413 if (jiit > _b_e_g_i_n) │ │ │ │ │ +1414 DUNE_THROW(_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d, │ │ │ │ │ +1415 "Allocated memory for BCRSMatrix exhausted during compress()!" │ │ │ │ │ +1416 "Please increase either the average number of entries per row or the │ │ │ │ │ +compressionBufferSize value." │ │ │ │ │ +1417 ); │ │ │ │ │ +1418 //copy an element from the overflow area to the insertion position in a │ │ │ │ │ +and j │ │ │ │ │ +1419 *jiit = oit->first.second; │ │ │ │ │ +1420 ++jiit; │ │ │ │ │ +1421 *aiit = oit->second; │ │ │ │ │ +1422 ++aiit; │ │ │ │ │ +1423 ++oit; │ │ │ │ │ +1424 _r[i].setsize(_r[i].getsize()+1); │ │ │ │ │ +1425 } │ │ │ │ │ +1426 │ │ │ │ │ +1427 //check whether there is enough memory to write to │ │ │ │ │ +1428 if (jiit > _b_e_g_i_n) │ │ │ │ │ +1429 DUNE_THROW(_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d, │ │ │ │ │ +1430 "Allocated memory for BCRSMatrix exhausted during compress()!" │ │ │ │ │ +1431 "Please increase either the average number of entries per row or the │ │ │ │ │ +compressionBufferSize value." │ │ │ │ │ +1432 ); │ │ │ │ │ +1433 │ │ │ │ │ +1434 //copy element from array │ │ │ │ │ +1435 *jiit = **it; │ │ │ │ │ +1436 ++jiit; │ │ │ │ │ +1437 B* apos = *it - _j__.get() + _a; │ │ │ │ │ +1438 *aiit = *apos; │ │ │ │ │ +1439 ++aiit; │ │ │ │ │ +1440 } │ │ │ │ │ +1441 │ │ │ │ │ +1442 //copy remaining elements from the overflow area │ │ │ │ │ +1443 while ((oit!=_o_v_e_r_f_l_o_w.end()) && (oit->first.first == i)) │ │ │ │ │ +1444 { │ │ │ │ │ +1445 //check whether there is enough memory to write to │ │ │ │ │ +1446 if (jiit > _b_e_g_i_n) │ │ │ │ │ +1447 DUNE_THROW(_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d, │ │ │ │ │ +1448 "Allocated memory for BCRSMatrix exhausted during compress()!" │ │ │ │ │ +1449 "Please increase either the average number of entries per row or the │ │ │ │ │ +compressionBufferSize value." │ │ │ │ │ +1450 ); │ │ │ │ │ +1451 │ │ │ │ │ +1452 //copy and element from the overflow area to the insertion position in a │ │ │ │ │ +and j │ │ │ │ │ +1453 *jiit = oit->first.second; │ │ │ │ │ +1454 ++jiit; │ │ │ │ │ +1455 *aiit = oit->second; │ │ │ │ │ +1456 ++aiit; │ │ │ │ │ +1457 ++oit; │ │ │ │ │ +1458 _r[i].setsize(_r[i].getsize()+1); │ │ │ │ │ +1459 } │ │ │ │ │ +1460 │ │ │ │ │ +1461 // update maximum row size │ │ │ │ │ +1462 if (_r[i].getsize()>stats._m_a_x_i_m_u_m) │ │ │ │ │ +1463 stats._m_a_x_i_m_u_m = _r[i].getsize(); │ │ │ │ │ +1464 } │ │ │ │ │ +1465 │ │ │ │ │ +1466 // overflow area may be cleared │ │ │ │ │ +1467 _o_v_e_r_f_l_o_w.clear(); │ │ │ │ │ +1468 │ │ │ │ │ +1469 //determine average number of entries and memory usage │ │ │ │ │ +1470 std::ptrdiff_t diff = (_r[_n-1].getindexptr() + _r[_n-1].getsize() - _j__.get │ │ │ │ │ +()); │ │ │ │ │ +1471 _n_n_z__ = diff; │ │ │ │ │ +1472 stats._a_v_g = (double) (_n_n_z__) / (double) _n; │ │ │ │ │ +1473 stats._m_e_m___r_a_t_i_o = (double) (_n_n_z__) / (double) _a_l_l_o_c_a_t_i_o_n_S_i_z_e__; │ │ │ │ │ +1474 │ │ │ │ │ +1475 //matrix is now built │ │ │ │ │ +1476 _r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ +1477 │ │ │ │ │ +1478 return stats; │ │ │ │ │ +1479 } │ │ │ │ │ +1480 │ │ │ │ │ +1481 //===== vector space arithmetic │ │ │ │ │ +1482 │ │ │ │ │ +_1_4_8_4 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_*_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +1485 { │ │ │ │ │ +1486#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1487 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1488 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1489#endif │ │ │ │ │ +1490 │ │ │ │ │ +1491 if (_n_n_z__ > 0) │ │ │ │ │ +1492 { │ │ │ │ │ +1493 // process 1D array │ │ │ │ │ +1494 for (_s_i_z_e___t_y_p_e i=0; i<_n_n_z__; i++) │ │ │ │ │ +1495 _a[i] *= k; │ │ │ │ │ +1496 } │ │ │ │ │ +1497 else │ │ │ │ │ +1498 { │ │ │ │ │ +1499 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1500 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1501 { │ │ │ │ │ +1502 _C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1503 for (_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1504 (*j) *= k; │ │ │ │ │ +1505 } │ │ │ │ │ +1506 } │ │ │ │ │ +1507 │ │ │ │ │ +1508 return *this; │ │ │ │ │ +1509 } │ │ │ │ │ +1510 │ │ │ │ │ +_1_5_1_2 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_/_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +1513 { │ │ │ │ │ +1514#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1515 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1516 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1517#endif │ │ │ │ │ +1518 │ │ │ │ │ +1519 if (_n_n_z__ > 0) │ │ │ │ │ +1520 { │ │ │ │ │ +1521 // process 1D array │ │ │ │ │ +1522 for (_s_i_z_e___t_y_p_e i=0; i<_n_n_z__; i++) │ │ │ │ │ +1523 _a[i] /= k; │ │ │ │ │ +1524 } │ │ │ │ │ +1525 else │ │ │ │ │ +1526 { │ │ │ │ │ +1527 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1528 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1529 { │ │ │ │ │ +1530 _C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1531 for (_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1532 (*j) /= k; │ │ │ │ │ +1533 } │ │ │ │ │ +1534 } │ │ │ │ │ +1535 │ │ │ │ │ +1536 return *this; │ │ │ │ │ +1537 } │ │ │ │ │ +1538 │ │ │ │ │ +1539 │ │ │ │ │ +_1_5_4_5 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _B_C_R_S_M_a_t_r_i_x& b) │ │ │ │ │ +1546 { │ │ │ │ │ +1547#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1548 if (_r_e_a_d_y != _b_u_i_l_t || b._r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1549 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1550 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ +1551 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ +1552#endif │ │ │ │ │ +1553 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1554 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r j=b._b_e_g_i_n(); │ │ │ │ │ +1555 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i, ++j) { │ │ │ │ │ +1556 i->operator+=(*j); │ │ │ │ │ +1557 } │ │ │ │ │ +1558 │ │ │ │ │ +1559 return *this; │ │ │ │ │ +1560 } │ │ │ │ │ +1561 │ │ │ │ │ +_1_5_6_7 _B_C_R_S_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _B_C_R_S_M_a_t_r_i_x& b) │ │ │ │ │ +1568 { │ │ │ │ │ +1569#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1570 if (_r_e_a_d_y != _b_u_i_l_t || b._r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1571 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1572 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ +1573 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ +1574#endif │ │ │ │ │ +1575 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1576 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r j=b._b_e_g_i_n(); │ │ │ │ │ +1577 for (_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i, ++j) { │ │ │ │ │ +1578 i->operator-=(*j); │ │ │ │ │ +1579 } │ │ │ │ │ +1580 │ │ │ │ │ +1581 return *this; │ │ │ │ │ +1582 } │ │ │ │ │ +1583 │ │ │ │ │ +_1_5_9_2 _B_C_R_S_M_a_t_r_i_x& _a_x_p_y(_f_i_e_l_d___t_y_p_e alpha, const _B_C_R_S_M_a_t_r_i_x& b) │ │ │ │ │ +1593 { │ │ │ │ │ +1594#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1595 if (_r_e_a_d_y != _b_u_i_l_t || b._r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1596 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1597 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ +1598 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ +1599#endif │ │ │ │ │ +1600 _R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1601 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r j=b._b_e_g_i_n(); │ │ │ │ │ +1602 for(_R_o_w_I_t_e_r_a_t_o_r i=_b_e_g_i_n(); i!=endi; ++i, ++j) │ │ │ │ │ +1603 i->axpy(alpha, *j); │ │ │ │ │ +1604 │ │ │ │ │ +1605 return *this; │ │ │ │ │ +1606 } │ │ │ │ │ +1607 │ │ │ │ │ +1608 //===== linear maps │ │ │ │ │ +1609 │ │ │ │ │ +1611 template │ │ │ │ │ +_1_6_1_2 void _m_v (const X& x, Y& y) const │ │ │ │ │ +1613 { │ │ │ │ │ +1614#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1615 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1616 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1617 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r, │ │ │ │ │ +1618 "Size mismatch: M: " << _N() << "x" << _M() << " x: " << x.N()); │ │ │ │ │ +1619 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r, │ │ │ │ │ +1620 "Size mismatch: M: " << _N() << "x" << _M() << " y: " << y.N()); │ │ │ │ │ +1621#endif │ │ │ │ │ +1622 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1623 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1624 { │ │ │ │ │ +1625 y[i.index()]=0; │ │ │ │ │ +1626 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1627 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1628 { │ │ │ │ │ +1629 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ +1630 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ +1631 Impl::asMatrix(*j).umv(xj, yi); │ │ │ │ │ +1632 } │ │ │ │ │ +1633 } │ │ │ │ │ +1634 } │ │ │ │ │ +1635 │ │ │ │ │ +1637 template │ │ │ │ │ +_1_6_3_8 void _u_m_v (const X& x, Y& y) const │ │ │ │ │ +1639 { │ │ │ │ │ +1640#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1641 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1642 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1643 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1644 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1645#endif │ │ │ │ │ +1646 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1647 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1648 { │ │ │ │ │ +1649 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1650 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1651 { │ │ │ │ │ +1652 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ +1653 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ +1654 Impl::asMatrix(*j).umv(xj,yi); │ │ │ │ │ +1655 } │ │ │ │ │ +1656 } │ │ │ │ │ +1657 } │ │ │ │ │ +1658 │ │ │ │ │ +1660 template │ │ │ │ │ +_1_6_6_1 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ +1662 { │ │ │ │ │ +1663#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1664 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1665 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1666 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1667 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1668#endif │ │ │ │ │ +1669 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1670 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1671 { │ │ │ │ │ +1672 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1673 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1674 { │ │ │ │ │ +1675 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ +1676 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ +1677 Impl::asMatrix(*j).mmv(xj,yi); │ │ │ │ │ +1678 } │ │ │ │ │ +1679 } │ │ │ │ │ +1680 } │ │ │ │ │ +1681 │ │ │ │ │ +1683 template │ │ │ │ │ +_1_6_8_4 void _u_s_m_v (F&& alpha, const X& x, Y& y) const │ │ │ │ │ +1685 { │ │ │ │ │ +1686#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1687 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1688 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1689 if (x.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1690 if (y.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1691#endif │ │ │ │ │ +1692 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1693 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1694 { │ │ │ │ │ +1695 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1696 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1697 { │ │ │ │ │ +1698 auto&& xj = Impl::asVector(x[j.index()]); │ │ │ │ │ +1699 auto&& yi = Impl::asVector(y[i.index()]); │ │ │ │ │ +1700 Impl::asMatrix(*j).usmv(alpha,xj,yi); │ │ │ │ │ +1701 } │ │ │ │ │ +1702 } │ │ │ │ │ +1703 } │ │ │ │ │ +1704 │ │ │ │ │ +1706 template │ │ │ │ │ +_1_7_0_7 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ +1708 { │ │ │ │ │ +1709#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1710 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1711 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1712 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1713 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1714#endif │ │ │ │ │ +1715 for(_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_1_7_2_2 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ +1723 { │ │ │ │ │ +1724#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1725 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1726 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1727 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1728 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1729#endif │ │ │ │ │ +1730 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1731 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1732 { │ │ │ │ │ +1733 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1734 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1735 { │ │ │ │ │ +1736 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ +1737 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ +1738 Impl::asMatrix(*j).umtv(xi,yj); │ │ │ │ │ +1739 } │ │ │ │ │ +1740 } │ │ │ │ │ +1741 } │ │ │ │ │ +1742 │ │ │ │ │ +1744 template │ │ │ │ │ +_1_7_4_5 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ +1746 { │ │ │ │ │ +1747#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1748 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1749 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1750#endif │ │ │ │ │ +1751 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1752 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1753 { │ │ │ │ │ +1754 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1755 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1756 { │ │ │ │ │ +1757 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ +1758 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ +1759 Impl::asMatrix(*j).mmtv(xi,yj); │ │ │ │ │ +1760 } │ │ │ │ │ +1761 } │ │ │ │ │ +1762 } │ │ │ │ │ +1763 │ │ │ │ │ +1765 template │ │ │ │ │ +_1_7_6_6 void _u_s_m_t_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ +1767 { │ │ │ │ │ +1768#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1769 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1770 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1771 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1772 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1773#endif │ │ │ │ │ +1774 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1775 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1776 { │ │ │ │ │ +1777 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1778 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1779 { │ │ │ │ │ +1780 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ +1781 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ +1782 Impl::asMatrix(*j).usmtv(alpha,xi,yj); │ │ │ │ │ +1783 } │ │ │ │ │ +1784 } │ │ │ │ │ +1785 } │ │ │ │ │ +1786 │ │ │ │ │ +1788 template │ │ │ │ │ +_1_7_8_9 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ +1790 { │ │ │ │ │ +1791#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1792 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1793 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1794 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1795 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1796#endif │ │ │ │ │ +1797 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1798 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1799 { │ │ │ │ │ +1800 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1801 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1802 { │ │ │ │ │ +1803 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ +1804 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ +1805 Impl::asMatrix(*j).umhv(xi,yj); │ │ │ │ │ +1806 } │ │ │ │ │ +1807 } │ │ │ │ │ +1808 } │ │ │ │ │ +1809 │ │ │ │ │ +1811 template │ │ │ │ │ +_1_8_1_2 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ +1813 { │ │ │ │ │ +1814#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1815 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1816 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1817 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1818 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1819#endif │ │ │ │ │ +1820 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1821 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1822 { │ │ │ │ │ +1823 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1824 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1825 { │ │ │ │ │ +1826 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ +1827 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ +1828 Impl::asMatrix(*j).mmhv(xi,yj); │ │ │ │ │ +1829 } │ │ │ │ │ +1830 } │ │ │ │ │ +1831 } │ │ │ │ │ +1832 │ │ │ │ │ +1834 template │ │ │ │ │ +_1_8_3_5 void _u_s_m_h_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ +1836 { │ │ │ │ │ +1837#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1838 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1839 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1840 if (x.N()!=_N()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1841 if (y.N()!=_M()) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"index out of range"); │ │ │ │ │ +1842#endif │ │ │ │ │ +1843 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r endi=_e_n_d(); │ │ │ │ │ +1844 for (_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r i=this->_b_e_g_i_n(); i!=endi; ++i) │ │ │ │ │ +1845 { │ │ │ │ │ +1846 _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r endj = (*i).end(); │ │ │ │ │ +1847 for (_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r j=(*i).begin(); j!=endj; ++j) │ │ │ │ │ +1848 { │ │ │ │ │ +1849 auto&& xi = Impl::asVector(x[i.index()]); │ │ │ │ │ +1850 auto&& yj = Impl::asVector(y[j.index()]); │ │ │ │ │ +1851 Impl::asMatrix(*j).usmhv(alpha,xi,yj); │ │ │ │ │ +1852 } │ │ │ │ │ +1853 } │ │ │ │ │ +1854 } │ │ │ │ │ +1855 │ │ │ │ │ +1856 │ │ │ │ │ +1857 //===== norms │ │ │ │ │ +1858 │ │ │ │ │ +_1_8_6_0 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ +1861 { │ │ │ │ │ +1862#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1863 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1864 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1865#endif │ │ │ │ │ +1866 │ │ │ │ │ +1867 typename FieldTraits::real_type sum=0; │ │ │ │ │ +1868 │ │ │ │ │ +1869 for (auto&& row : (*this)) │ │ │ │ │ +1870 for (auto&& _e_n_t_r_y : row) │ │ │ │ │ +1871 sum += Impl::asMatrix(_e_n_t_r_y).frobenius_norm2(); │ │ │ │ │ +1872 │ │ │ │ │ +1873 return sum; │ │ │ │ │ +1874 } │ │ │ │ │ +1875 │ │ │ │ │ +_1_8_7_7 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ +1878 { │ │ │ │ │ +1879 return sqrt(_f_r_o_b_e_n_i_u_s___n_o_r_m_2()); │ │ │ │ │ +1880 } │ │ │ │ │ +1881 │ │ │ │ │ +1883 template ::value, int>::type = 0> │ │ │ │ │ +_1_8_8_5 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ +1886 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1887 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1888 │ │ │ │ │ +1889 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1890 using std::max; │ │ │ │ │ +1891 │ │ │ │ │ +1892 real_type norm = 0; │ │ │ │ │ +1893 for (auto const &x : *this) { │ │ │ │ │ +1894 real_type sum = 0; │ │ │ │ │ +1895 for (auto const &y : x) │ │ │ │ │ +1896 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ +1897 norm = max(sum, norm); │ │ │ │ │ +1898 } │ │ │ │ │ +1899 return norm; │ │ │ │ │ +1900 } │ │ │ │ │ +1901 │ │ │ │ │ +1903 template ::value, int>::type = 0> │ │ │ │ │ +_1_9_0_5 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ +1906 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1907 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1908 │ │ │ │ │ +1909 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1910 using std::max; │ │ │ │ │ +1911 │ │ │ │ │ +1912 real_type norm = 0; │ │ │ │ │ +1913 for (auto const &x : *this) { │ │ │ │ │ +1914 real_type sum = 0; │ │ │ │ │ +1915 for (auto const &y : x) │ │ │ │ │ +1916 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ +1917 norm = max(sum, norm); │ │ │ │ │ +1918 } │ │ │ │ │ +1919 return norm; │ │ │ │ │ +1920 } │ │ │ │ │ +1921 │ │ │ │ │ +1923 template ::value, int>::type = 0> │ │ │ │ │ +_1_9_2_5 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ +1926 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1927 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1928 │ │ │ │ │ +1929 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1930 using std::max; │ │ │ │ │ +1931 │ │ │ │ │ +1932 real_type norm = 0; │ │ │ │ │ +1933 real_type isNaN = 1; │ │ │ │ │ +1934 for (auto const &x : *this) { │ │ │ │ │ +1935 real_type sum = 0; │ │ │ │ │ +1936 for (auto const &y : x) │ │ │ │ │ +1937 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ +1938 norm = max(sum, norm); │ │ │ │ │ +1939 isNaN += sum; │ │ │ │ │ +1940 } │ │ │ │ │ +1941 │ │ │ │ │ +1942 return norm * (isNaN / isNaN); │ │ │ │ │ +1943 } │ │ │ │ │ +1944 │ │ │ │ │ +1946 template ::value, int>::type = 0> │ │ │ │ │ +_1_9_4_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ +1949 if (_r_e_a_d_y != _b_u_i_l_t) │ │ │ │ │ +1950 DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"You can only call arithmetic operations on │ │ │ │ │ +fully built BCRSMatrix instances"); │ │ │ │ │ +1951 │ │ │ │ │ +1952 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1953 using std::max; │ │ │ │ │ +1954 │ │ │ │ │ +1955 real_type norm = 0; │ │ │ │ │ +1956 real_type isNaN = 1; │ │ │ │ │ +1957 │ │ │ │ │ +1958 for (auto const &x : *this) { │ │ │ │ │ +1959 real_type sum = 0; │ │ │ │ │ +1960 for (auto const &y : x) │ │ │ │ │ +1961 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ +1962 norm = max(sum, norm); │ │ │ │ │ +1963 isNaN += sum; │ │ │ │ │ +1964 } │ │ │ │ │ +1965 │ │ │ │ │ +1966 return norm * (isNaN / isNaN); │ │ │ │ │ +1967 } │ │ │ │ │ +1968 │ │ │ │ │ +1969 //===== sizes │ │ │ │ │ +1970 │ │ │ │ │ +_1_9_7_2 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ +1973 { │ │ │ │ │ +1974 return _n; │ │ │ │ │ +1975 } │ │ │ │ │ +1976 │ │ │ │ │ +_1_9_7_8 _s_i_z_e___t_y_p_e _M () const │ │ │ │ │ +1979 { │ │ │ │ │ +1980 return _m; │ │ │ │ │ +1981 } │ │ │ │ │ +1982 │ │ │ │ │ +_1_9_8_4 _s_i_z_e___t_y_p_e _n_o_n_z_e_r_o_e_s () const │ │ │ │ │ +1985 { │ │ │ │ │ +1986 // in case of row-wise allocation │ │ │ │ │ +1987 if( _n_n_z__ <= 0 ) │ │ │ │ │ +1988 _n_n_z__ = std::accumulate( _b_e_g_i_n(), _e_n_d(), _s_i_z_e___t_y_p_e( 0 ), [] ( _s_i_z_e___t_y_p_e s, │ │ │ │ │ +const _r_o_w___t_y_p_e &row ) { return s+row.getsize(); } ); │ │ │ │ │ +1989 return _n_n_z__; │ │ │ │ │ +1990 } │ │ │ │ │ +1991 │ │ │ │ │ +_1_9_9_3 _B_u_i_l_d_S_t_a_g_e _b_u_i_l_d_S_t_a_g_e() const │ │ │ │ │ +1994 { │ │ │ │ │ +1995 return _r_e_a_d_y; │ │ │ │ │ +1996 } │ │ │ │ │ +1997 │ │ │ │ │ +_1_9_9_9 _B_u_i_l_d_M_o_d_e _b_u_i_l_d_M_o_d_e() const │ │ │ │ │ +2000 { │ │ │ │ │ +2001 return _b_u_i_l_d___m_o_d_e; │ │ │ │ │ +2002 } │ │ │ │ │ +2003 │ │ │ │ │ +2004 //===== query │ │ │ │ │ +2005 │ │ │ │ │ +_2_0_0_7 bool _e_x_i_s_t_s (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) const │ │ │ │ │ +2008 { │ │ │ │ │ +2009#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +2010 if (i<0 || i>=_n) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"row index out of range"); │ │ │ │ │ +2011 if (j<0 || j>=_m) DUNE_THROW(_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r,"column index out of range"); │ │ │ │ │ +2012#endif │ │ │ │ │ +2013 return (_r[i].size() && _r[i].find(j) != _r[i]._e_n_d()); │ │ │ │ │ +2014 } │ │ │ │ │ +2015 │ │ │ │ │ +2016 │ │ │ │ │ +2017 protected: │ │ │ │ │ +2018 // state information │ │ │ │ │ +_2_0_1_9 _B_u_i_l_d_M_o_d_e _b_u_i_l_d___m_o_d_e; // row wise or whole matrix │ │ │ │ │ +_2_0_2_0 _B_u_i_l_d_S_t_a_g_e _r_e_a_d_y; // indicate the stage the matrix building is in │ │ │ │ │ +2021 │ │ │ │ │ +2022 // The allocator used for memory management │ │ │ │ │ +_2_0_2_3 typename std::allocator_traits::template rebind_alloc _a_l_l_o_c_a_t_o_r__; │ │ │ │ │ +2024 │ │ │ │ │ +_2_0_2_5 typename std::allocator_traits::template rebind_alloc │ │ │ │ │ +_r_o_w_A_l_l_o_c_a_t_o_r__; │ │ │ │ │ +2026 │ │ │ │ │ +_2_0_2_7 typename std::allocator_traits::template rebind_alloc │ │ │ │ │ +_s_i_z_e_A_l_l_o_c_a_t_o_r__; │ │ │ │ │ +2028 │ │ │ │ │ +2029 // size of the matrix │ │ │ │ │ +_2_0_3_0 _s_i_z_e___t_y_p_e _n; // number of rows │ │ │ │ │ +_2_0_3_1 _s_i_z_e___t_y_p_e _m; // number of columns │ │ │ │ │ +_2_0_3_2 mutable _s_i_z_e___t_y_p_e _n_n_z__; // number of nonzeroes contained in the matrix │ │ │ │ │ +_2_0_3_3 _s_i_z_e___t_y_p_e _a_l_l_o_c_a_t_i_o_n_S_i_z_e__; //allocated size of a and j arrays, except in │ │ │ │ │ +implicit mode: nnz_==allocationsSize_ │ │ │ │ │ +2034 // zero means that memory is allocated separately for each row. │ │ │ │ │ +2035 │ │ │ │ │ +2036 // the rows are dynamically allocated │ │ │ │ │ +_2_0_3_7 _r_o_w___t_y_p_e* _r; // [n] the individual rows having pointers into a,j arrays │ │ │ │ │ +2038 │ │ │ │ │ +2039 // dynamically allocated memory │ │ │ │ │ +_2_0_4_0 B* _a; // [allocationSize] non-zero entries of the matrix in row-wise │ │ │ │ │ +ordering │ │ │ │ │ +2041 // If a single array of column indices is used, it can be shared │ │ │ │ │ +2042 // between different matrices with the same sparsity pattern │ │ │ │ │ +_2_0_4_3 std::shared_ptr _j__; // [allocationSize] column indices of │ │ │ │ │ +entries │ │ │ │ │ +2044 │ │ │ │ │ +2045 // additional data is needed in implicit buildmode │ │ │ │ │ +_2_0_4_6 _s_i_z_e___t_y_p_e _a_v_g; │ │ │ │ │ +_2_0_4_7 double _c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__; │ │ │ │ │ +2048 │ │ │ │ │ +_2_0_4_9 typedef std::map, B> _O_v_e_r_f_l_o_w_T_y_p_e; │ │ │ │ │ +_2_0_5_0 _O_v_e_r_f_l_o_w_T_y_p_e _o_v_e_r_f_l_o_w; │ │ │ │ │ +2051 │ │ │ │ │ +_2_0_5_2 void _s_e_t_W_i_n_d_o_w_P_o_i_n_t_e_r_s(_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r row) │ │ │ │ │ +2053 { │ │ │ │ │ +2054 _r_o_w___t_y_p_e current_row(_a,_j__.get(),0); // Pointers to current row data │ │ │ │ │ +2055 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++, ++row) { │ │ │ │ │ +2056 // set row i │ │ │ │ │ +2057 _s_i_z_e___t_y_p_e s = row->getsize(); │ │ │ │ │ +2058 │ │ │ │ │ +2059 if (s>0) { │ │ │ │ │ +2060 // setup pointers and size │ │ │ │ │ +2061 _r[i].set(s,current_row.getptr(), current_row.getindexptr()); │ │ │ │ │ +2062 // update pointer for next row │ │ │ │ │ +2063 current_row.setptr(current_row.getptr()+s); │ │ │ │ │ +2064 current_row.setindexptr(current_row.getindexptr()+s); │ │ │ │ │ +2065 } else{ │ │ │ │ │ +2066 // empty row │ │ │ │ │ +2067 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ +2068 } │ │ │ │ │ +2069 } │ │ │ │ │ +2070 } │ │ │ │ │ +2071 │ │ │ │ │ +2073 │ │ │ │ │ +_2_0_7_7 void _s_e_t_C_o_l_u_m_n_P_o_i_n_t_e_r_s(_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r row) │ │ │ │ │ +2078 { │ │ │ │ │ +2079 _s_i_z_e___t_y_p_e* jptr = _j__.get(); │ │ │ │ │ +2080 for (_s_i_z_e___t_y_p_e i=0; i<_n; ++i, ++row) { │ │ │ │ │ +2081 // set row i │ │ │ │ │ +2082 _s_i_z_e___t_y_p_e s = row->getsize(); │ │ │ │ │ +2083 │ │ │ │ │ +2084 if (s>0) { │ │ │ │ │ +2085 // setup pointers and size │ │ │ │ │ +2086 _r[i].setsize(s); │ │ │ │ │ +2087 _r[i].setindexptr(jptr); │ │ │ │ │ +2088 } else{ │ │ │ │ │ +2089 // empty row │ │ │ │ │ +2090 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ +2091 } │ │ │ │ │ +2092 │ │ │ │ │ +2093 // advance position in global array │ │ │ │ │ +2094 jptr += s; │ │ │ │ │ +2095 } │ │ │ │ │ +2096 } │ │ │ │ │ +2097 │ │ │ │ │ +2099 │ │ │ │ │ +_2_1_0_3 void _s_e_t_D_a_t_a_P_o_i_n_t_e_r_s() │ │ │ │ │ +2104 { │ │ │ │ │ +2105 B* aptr = _a; │ │ │ │ │ +2106 for (_s_i_z_e___t_y_p_e i=0; i<_n; ++i) { │ │ │ │ │ +2107 // set row i │ │ │ │ │ +2108 if (_r[i].getsize() > 0) { │ │ │ │ │ +2109 // setup pointers and size │ │ │ │ │ +2110 _r[i].setptr(aptr); │ │ │ │ │ +2111 } else{ │ │ │ │ │ +2112 // empty row │ │ │ │ │ +2113 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ +2114 } │ │ │ │ │ +2115 │ │ │ │ │ +2116 // advance position in global array │ │ │ │ │ +2117 aptr += _r[i].getsize(); │ │ │ │ │ +2118 } │ │ │ │ │ +2119 } │ │ │ │ │ +2120 │ │ │ │ │ +_2_1_2_2 void _c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e(const _B_C_R_S_M_a_t_r_i_x& Mat) │ │ │ │ │ +2123 { │ │ │ │ │ +2124 _s_e_t_W_i_n_d_o_w_P_o_i_n_t_e_r_s(Mat._b_e_g_i_n()); │ │ │ │ │ +2125 │ │ │ │ │ +2126 // copy data │ │ │ │ │ +2127 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) _r[i] = Mat._r[i]; │ │ │ │ │ +2128 │ │ │ │ │ +2129 // finish off │ │ │ │ │ +2130 _b_u_i_l_d___m_o_d_e = _r_o_w___w_i_s_e; // dummy │ │ │ │ │ +2131 _r_e_a_d_y = _b_u_i_l_t; │ │ │ │ │ +2132 } │ │ │ │ │ +2133 │ │ │ │ │ +_2_1_3_9 void _d_e_a_l_l_o_c_a_t_e(bool deallocateRows=true) │ │ │ │ │ +2140 { │ │ │ │ │ +2141 │ │ │ │ │ +2142 if (_n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ +2143 return; │ │ │ │ │ +2144 │ │ │ │ │ +2145 if (_a_l_l_o_c_a_t_i_o_n_S_i_z_e__>0) │ │ │ │ │ +2146 { │ │ │ │ │ +2147 // a,j_ have been allocated as one long vector │ │ │ │ │ +2148 _j__.reset(); │ │ │ │ │ +2149 if (_a) │ │ │ │ │ +2150 { │ │ │ │ │ +2151 for(B *aiter=_a+(_a_l_l_o_c_a_t_i_o_n_S_i_z_e__-1), *aend=_a-1; aiter!=aend; --aiter) │ │ │ │ │ +2152 std::allocator_traits::destroy(_a_l_l_o_c_a_t_o_r__, aiter); │ │ │ │ │ +2153 _a_l_l_o_c_a_t_o_r__.deallocate(_a,_a_l_l_o_c_a_t_i_o_n_S_i_z_e__); │ │ │ │ │ +2154 _a = nullptr; │ │ │ │ │ +2155 } │ │ │ │ │ +2156 } │ │ │ │ │ +2157 else if (_r) │ │ │ │ │ +2158 { │ │ │ │ │ +2159 // check if memory for rows have been allocated individually │ │ │ │ │ +2160 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ +2161 if (_r[i].getsize()>0) │ │ │ │ │ +2162 { │ │ │ │ │ +2163 for (B *_c_o_l=_r[i].getptr()+(_r[i].getsize()-1), │ │ │ │ │ +2164 *colend = _r[i].getptr()-1; _c_o_l!=colend; --_c_o_l) { │ │ │ │ │ +2165 std::allocator_traits::destroy(_a_l_l_o_c_a_t_o_r__, _c_o_l); │ │ │ │ │ +2166 } │ │ │ │ │ +2167 _s_i_z_e_A_l_l_o_c_a_t_o_r__.deallocate(_r[i].getindexptr(),1); │ │ │ │ │ +2168 _a_l_l_o_c_a_t_o_r__.deallocate(_r[i].getptr(),1); │ │ │ │ │ +2169 // clear out row data in case we don't want to deallocate the rows │ │ │ │ │ +2170 // otherwise we might run into a double free problem here later │ │ │ │ │ +2171 _r[i].set(0,nullptr,nullptr); │ │ │ │ │ +2172 } │ │ │ │ │ +2173 } │ │ │ │ │ +2174 │ │ │ │ │ +2175 // deallocate the rows │ │ │ │ │ +2176 if (_n>0 && deallocateRows && _r) { │ │ │ │ │ +2177 for(_r_o_w___t_y_p_e *riter=_r+(_n-1), *rend=_r-1; riter!=rend; --riter) │ │ │ │ │ +2178 std::allocator_traits::destroy(_r_o_w_A_l_l_o_c_a_t_o_r__, │ │ │ │ │ +riter); │ │ │ │ │ +2179 _r_o_w_A_l_l_o_c_a_t_o_r__.deallocate(_r,_n); │ │ │ │ │ +2180 _r = nullptr; │ │ │ │ │ +2181 } │ │ │ │ │ +2182 │ │ │ │ │ +2183 // Mark matrix as not built at all. │ │ │ │ │ +2184 _r_e_a_d_y=_n_o_t_A_l_l_o_c_a_t_e_d; │ │ │ │ │ +2185 │ │ │ │ │ +2186 } │ │ │ │ │ +2187 │ │ │ │ │ +_2_2_0_5 void _a_l_l_o_c_a_t_e(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e allocationSize, │ │ │ │ │ +bool allocateRows, bool allocate_data) │ │ │ │ │ +2206 { │ │ │ │ │ +2207 // Store size │ │ │ │ │ +2208 _n = rows; │ │ │ │ │ +2209 _m = columns; │ │ │ │ │ +2210 _n_n_z__ = allocationSize; │ │ │ │ │ +2211 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__ = allocationSize; │ │ │ │ │ +2212 │ │ │ │ │ +2213 // allocate rows │ │ │ │ │ +2214 if(allocateRows) { │ │ │ │ │ +2215 if (_n>0) { │ │ │ │ │ +2216 if (_r) │ │ │ │ │ +2217 DUNE_THROW(InvalidStateException,"Rows have already been allocated, cannot │ │ │ │ │ +allocate a second time"); │ │ │ │ │ +2218 _r = _r_o_w_A_l_l_o_c_a_t_o_r__.allocate(rows); │ │ │ │ │ +2219 // initialize row entries │ │ │ │ │ +2220 for(_r_o_w___t_y_p_e* ri=_r; ri!=_r+rows; ++ri) │ │ │ │ │ +2221 std::allocator_traits::construct(_r_o_w_A_l_l_o_c_a_t_o_r__, │ │ │ │ │ +ri, _r_o_w___t_y_p_e()); │ │ │ │ │ +2222 }else{ │ │ │ │ │ +2223 _r = 0; │ │ │ │ │ +2224 } │ │ │ │ │ +2225 } │ │ │ │ │ +2226 │ │ │ │ │ +2227 // allocate a and j_ array │ │ │ │ │ +2228 if (allocate_data) │ │ │ │ │ +2229 _a_l_l_o_c_a_t_e_D_a_t_a(); │ │ │ │ │ +2230 // allocate column indices only if not yet present (enable sharing) │ │ │ │ │ +2231 if (_a_l_l_o_c_a_t_i_o_n_S_i_z_e__>0) { │ │ │ │ │ +2232 // we copy allocator and size to the deleter since _j may outlive this │ │ │ │ │ +class │ │ │ │ │ +2233 if (!_j__.get()) │ │ │ │ │ +2234 _j__.reset(_s_i_z_e_A_l_l_o_c_a_t_o_r__.allocate(_a_l_l_o_c_a_t_i_o_n_S_i_z_e__), │ │ │ │ │ +2235 [alloc = _s_i_z_e_A_l_l_o_c_a_t_o_r__, size = _a_l_l_o_c_a_t_i_o_n_S_i_z_e__](auto ptr) mutable { │ │ │ │ │ +2236 alloc.deallocate(ptr, size); │ │ │ │ │ +2237 }); │ │ │ │ │ +2238 }else{ │ │ │ │ │ +2239 _j__.reset(); │ │ │ │ │ +2240 } │ │ │ │ │ +2241 │ │ │ │ │ +2242 // Mark the matrix as not built. │ │ │ │ │ +2243 _r_e_a_d_y = _b_u_i_l_d_i_n_g; │ │ │ │ │ +2244 } │ │ │ │ │ +2245 │ │ │ │ │ +_2_2_4_6 void _a_l_l_o_c_a_t_e_D_a_t_a() │ │ │ │ │ +2247 { │ │ │ │ │ +2248 if (_a) │ │ │ │ │ +2249 DUNE_THROW(InvalidStateException,"Cannot allocate data array (already │ │ │ │ │ +allocated)"); │ │ │ │ │ +2250 if (_a_l_l_o_c_a_t_i_o_n_S_i_z_e__>0) { │ │ │ │ │ +2251 _a = _a_l_l_o_c_a_t_o_r__.allocate(_a_l_l_o_c_a_t_i_o_n_S_i_z_e__); │ │ │ │ │ +2252 // use placement new to call constructor that allocates │ │ │ │ │ +2253 // additional memory. │ │ │ │ │ +2254 new (_a) B[_a_l_l_o_c_a_t_i_o_n_S_i_z_e__]; │ │ │ │ │ +2255 } else { │ │ │ │ │ +2256 _a = nullptr; │ │ │ │ │ +2257 } │ │ │ │ │ +2258 } │ │ │ │ │ +2259 │ │ │ │ │ +_2_2_6_5 void _i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e(_s_i_z_e___t_y_p_e _n, _s_i_z_e___t_y_p_e _m) │ │ │ │ │ +2266 { │ │ │ │ │ +2267 if (_b_u_i_l_d___m_o_d_e != _i_m_p_l_i_c_i_t) │ │ │ │ │ +2268 DUNE_THROW(InvalidStateException,"implicit_allocate() may only be called │ │ │ │ │ +in implicit build mode"); │ │ │ │ │ +2269 if (_r_e_a_d_y != _n_o_t_A_l_l_o_c_a_t_e_d) │ │ │ │ │ +2270 DUNE_THROW(InvalidStateException,"memory has already been allocated"); │ │ │ │ │ +2271 │ │ │ │ │ +2272 // check to make sure the user has actually set the parameters │ │ │ │ │ +2273 if (_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ < 0) │ │ │ │ │ +2274 DUNE_THROW(InvalidStateException,"You have to set the implicit build mode │ │ │ │ │ +parameters before starting to build the matrix"); │ │ │ │ │ +2275 //calculate size of overflow region, add buffer for row sort! │ │ │ │ │ +2276 _s_i_z_e___t_y_p_e osize = (_s_i_z_e___t_y_p_e) (_n*_a_v_g)*_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ + 4*_a_v_g; │ │ │ │ │ +2277 _a_l_l_o_c_a_t_i_o_n_S_i_z_e__ = _n*_a_v_g + osize; │ │ │ │ │ +2278 │ │ │ │ │ +2279 _a_l_l_o_c_a_t_e(_n, _m, _a_l_l_o_c_a_t_i_o_n_S_i_z_e__,true,true); │ │ │ │ │ +2280 │ │ │ │ │ +2281 //set row pointers correctly │ │ │ │ │ +2282 _s_i_z_e___t_y_p_e* jptr = _j__.get() + osize; │ │ │ │ │ +2283 B* aptr = _a + osize; │ │ │ │ │ +2284 for (_s_i_z_e___t_y_p_e i=0; i<_n; i++) │ │ │ │ │ +2285 { │ │ │ │ │ +2286 _r[i].set(0,aptr,jptr); │ │ │ │ │ +2287 jptr = jptr + _a_v_g; │ │ │ │ │ +2288 aptr = aptr + _a_v_g; │ │ │ │ │ +2289 } │ │ │ │ │ +2290 │ │ │ │ │ +2291 _r_e_a_d_y = _b_u_i_l_d_i_n_g; │ │ │ │ │ +2292 } │ │ │ │ │ +2293 }; │ │ │ │ │ +2294 │ │ │ │ │ +2295 │ │ │ │ │ +2296 template │ │ │ │ │ +_2_2_9_7 struct FieldTraits< _B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +2298 { │ │ │ │ │ +_2_2_9_9 using _f_i_e_l_d___t_y_p_e = typename _B_C_R_S_M_a_t_r_i_x_<_B_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_3_0_0 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ +2301 }; │ │ │ │ │ +2302 │ │ │ │ │ +2305} // end namespace │ │ │ │ │ +2306 │ │ │ │ │ +2307#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ +_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ +Some handy generic functions for ISTL matrices. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s │ │ │ │ │ +Statistics about compression achieved in implicit mode. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_o_v_e_r_f_l_o_w___t_o_t_a_l │ │ │ │ │ +size_type overflow_total │ │ │ │ │ +total number of elements written to the overflow area during construction. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_m_a_x_i_m_u_m │ │ │ │ │ +size_type maximum │ │ │ │ │ +maximum number of non-zeroes per row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_a_v_g │ │ │ │ │ +double avg │ │ │ │ │ +average number of non-zeroes per row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s_:_:_m_e_m___r_a_t_i_o │ │ │ │ │ +double mem_ratio │ │ │ │ │ +fraction of wasted memory resulting from non-used overflow area. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ +A wrapper for uniform access to the BCRSMatrix during and after the build stage │ │ │ │ │ +in implicit build mod... │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +Matrix::block_type block_type │ │ │ │ │ +The block_type of the underlying matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ +ImplicitMatrixBuilder(Matrix &m) │ │ │ │ │ +Creates an ImplicitMatrixBuilder for matrix m. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ +M_ Matrix │ │ │ │ │ +The underlying matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r │ │ │ │ │ +ImplicitMatrixBuilder(Matrix &m, size_type rows, size_type cols, size_type │ │ │ │ │ +avg_cols_per_row, double overflow_fraction) │ │ │ │ │ +Sets up matrix m for implicit construction using the given parameters and │ │ │ │ │ +creates an ImplicitBmatrixu... │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +The number of columns in the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:217 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +The size_type of the underlying matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +row_object operator[](size_type i) const │ │ │ │ │ +Returns a proxy for entries in row i. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +The number of rows in the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_r_o_w___o_b_j_e_c_t │ │ │ │ │ +Proxy row object for entry access. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_a_t_r_i_x_B_u_i_l_d_e_r_:_:_r_o_w___o_b_j_e_c_t_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +block_type & operator[](size_type j) const │ │ │ │ │ +Returns entry in column j. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:488 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w_A_l_l_o_c_a_t_o_r__ │ │ │ │ │ +std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2025 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ │ +bool exists(size_type i, size_type j) const │ │ │ │ │ +return true if (i,j) is in pattern │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2007 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d_S_t_a_g_e │ │ │ │ │ +BuildStage buildStage() const │ │ │ │ │ +The current build stage of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1993 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +Iterator begin() │ │ │ │ │ +Get iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:675 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_p_y_W_i_n_d_o_w_S_t_r_u_c_t_u_r_e │ │ │ │ │ +void copyWindowStructure(const BCRSMatrix &Mat) │ │ │ │ │ +Copy the window structure from another matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2122 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_t_r_y │ │ │ │ │ +B & entry(size_type row, size_type col) │ │ │ │ │ +Returns reference to entry (row,col) of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1296 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ +void mmhv(const X &x, Y &y) const │ │ │ │ │ +y -= A^H x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1812 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ +void usmhv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^H x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1835 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ +void umtv(const X &x, Y &y) const │ │ │ │ │ +y += A^T x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1722 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_S_i_z_e__ │ │ │ │ │ +double compressionBufferSize_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2047 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m │ │ │ │ │ +size_type m │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2031 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator< const row_type > const_iterator │ │ │ │ │ +The const iterator over the matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:707 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr unsigned int blocklevel │ │ │ │ │ +increment block level counter │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:507 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ +void allocate(size_type rows, size_type columns, size_type allocationSize, bool │ │ │ │ │ +allocateRows, bool allocate_data) │ │ │ │ │ +Allocate memory for the matrix structure. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2205 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_x_p_y │ │ │ │ │ +BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b) │ │ │ │ │ +Add the scaled entries of another matrix to this one. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1592 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ +FieldTraits< ft >::real_type infinity_norm_real() const │ │ │ │ │ +simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1905 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_~_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +~BCRSMatrix() │ │ │ │ │ +destructor │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:824 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_e_D_a_t_a │ │ │ │ │ +void allocateData() │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2246 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_d_e_a_l_l_o_c_a_t_e │ │ │ │ │ +void deallocate(bool deallocateRows=true) │ │ │ │ │ +deallocate memory of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2139 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator RowIterator │ │ │ │ │ +rename the iterators for easier access │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:701 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +row_type & operator[](size_type i) │ │ │ │ │ +random access to the rows │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:549 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix() │ │ │ │ │ +an empty matrix │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:749 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_r_o_w_s_i_z_e_s │ │ │ │ │ +void endrowsizes() │ │ │ │ │ +indicate that size of all rows is defined │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1149 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_n_c_r_e_m_e_n_t_r_o_w_s_i_z_e │ │ │ │ │ +void incrementrowsize(size_type i, size_type s=1) │ │ │ │ │ +increment size of row i by s (1 by default) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1138 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ +void mtv(const X &x, Y &y) const │ │ │ │ │ +y = A^T x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1707 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ +void umhv(const X &x, Y &y) const │ │ │ │ │ +y += A^H x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1789 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_o_n_z_e_r_o_e_s │ │ │ │ │ +size_type nonzeroes() const │ │ │ │ │ +number of blocks that are stored (the number of blocks that possibly are │ │ │ │ │ +nonzero) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1984 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_i_o_n_S_i_z_e__ │ │ │ │ │ +size_type allocationSize_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2033 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator ConstRowIterator │ │ │ │ │ +rename the const row iterator for easier access │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:738 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_e_a_d_y │ │ │ │ │ +BuildStage ready │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2020 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d___m_o_d_e │ │ │ │ │ +BuildMode build_mode │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2019 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_r_o_w_s_i_z_e │ │ │ │ │ +void setrowsize(size_type i, size_type s) │ │ │ │ │ +Set number of indices in row i to s. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1117 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator< row_type > Iterator │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:672 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_n_z__ │ │ │ │ │ +size_type nnz_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2032 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ +BCRSMatrix & operator*=(const field_type &k) │ │ │ │ │ +vector space multiplication with scalar │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1484 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e_A_l_l_o_c_a_t_o_r__ │ │ │ │ │ +std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2027 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator< row_type > iterator │ │ │ │ │ +The iterator over the (mutable matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:671 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ +void usmtv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^T x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1766 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +ConstIterator beforeBegin() const │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:732 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator< const row_type > ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:708 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +Iterator beforeBegin() │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a │ │ │ │ │ +B * a │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2040 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_u_i_l_d_M_o_d_e │ │ │ │ │ +BuildMode │ │ │ │ │ +we support two modes │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:510 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_m_p_l_i_c_i_t │ │ │ │ │ +@ implicit │ │ │ │ │ +Build entries randomly with an educated guess for the number of entries per │ │ │ │ │ +row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_n_k_n_o_w_n │ │ │ │ │ +@ unknown │ │ │ │ │ +Build mode not set! │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:543 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_a_n_d_o_m │ │ │ │ │ +@ random │ │ │ │ │ +Build entries randomly. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:530 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w___w_i_s_e │ │ │ │ │ +@ row_wise │ │ │ │ │ +Build in a row-wise manner. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:521 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm) │ │ │ │ │ +matrix with known number of nonzeroes │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:756 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_m_p_r_e_s_s_i_o_n_S_t_a_t_i_s_t_i_c_s │ │ │ │ │ +::Dune::CompressionStatistics< size_type > CompressionStatistics │ │ │ │ │ +The type for the statistics object returned by compress() │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:503 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ +BCRSMatrix & operator-=(const BCRSMatrix &b) │ │ │ │ │ +Subtract the entries of another matrix from this one. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1567 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix(const BCRSMatrix &Mat) │ │ │ │ │ +copy constructor │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:805 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +Iterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r │ │ │ │ │ +row_type * r │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2037 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_I_n_d_i_c_e_s │ │ │ │ │ +void setIndices(size_type row, It begin, It end) │ │ │ │ │ +Set all column indices for row from the given iterator range. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1234 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_d_d_i_n_d_e_x │ │ │ │ │ +void addindex(size_type row, size_type col) │ │ │ │ │ +add index (row,col) to the matrix │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1191 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_O_v_e_r_f_l_o_w_T_y_p_e │ │ │ │ │ +std::map< std::pair< size_type, size_type >, B > OverflowType │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2049 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::Iterator ColIterator │ │ │ │ │ +Iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:704 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ +frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1877 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access and the size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ +BCRSMatrix & operator/=(const field_type &k) │ │ │ │ │ +vector space division by scalar │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1512 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_v_e_r_f_l_o_w │ │ │ │ │ +OverflowType overflow │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2050 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ +BCRSMatrix & operator+=(const BCRSMatrix &b) │ │ │ │ │ +Add the entries of another matrix to this one. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1545 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix(size_type _n, size_type _m, size_type _avg, double │ │ │ │ │ +compressionBufferSize, BuildMode bm) │ │ │ │ │ +construct matrix with a known average number of entries per row │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:784 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ +CreateIterator createend() │ │ │ │ │ +get create iterator pointing to one after the last block │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1103 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm2() const │ │ │ │ │ +square of frobenius norm, need for block recursion │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1860 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +Iterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:688 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::ConstIterator ConstColIterator │ │ │ │ │ +Const iterator to the entries of a row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:741 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ +void usmv(F &&alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1684 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_g_e_t_r_o_w_s_i_z_e │ │ │ │ │ +size_type getrowsize(size_type i) const │ │ │ │ │ +get current number of indices in row i │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1128 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +number of columns (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n │ │ │ │ │ +size_type n │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2030 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +Imp::CompressedBlockVectorWindow< B, A > row_type │ │ │ │ │ +implement row_type with compressed vector │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:497 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ +CreateIterator createbegin() │ │ │ │ │ +get initial create iterator │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_u_i_l_d_S_t_a_g_e │ │ │ │ │ +BuildStage │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:469 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w_S_i_z_e_s_B_u_i_l_t │ │ │ │ │ +@ rowSizesBuilt │ │ │ │ │ +The row sizes of the matrix are known. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:480 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_t │ │ │ │ │ +@ built │ │ │ │ │ +The matrix structure is fully built. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:482 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_o_t_b_u_i_l_t │ │ │ │ │ +@ notbuilt │ │ │ │ │ +Matrix is not built at all, no memory has been allocated, build mode and size │ │ │ │ │ +can still be set. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:471 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_n_o_t_A_l_l_o_c_a_t_e_d │ │ │ │ │ +@ notAllocated │ │ │ │ │ +Matrix is not built at all, no memory has been allocated, build mode and size │ │ │ │ │ +can still be set. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:473 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d_i_n_g │ │ │ │ │ +@ building │ │ │ │ │ +Matrix is currently being built, some memory has been allocated, build mode and │ │ │ │ │ +size are fixed. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:475 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_u_i_l_d_M_o_d_e │ │ │ │ │ +BuildMode buildMode() const │ │ │ │ │ +The currently selected build mode of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1999 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ +void mmv(const X &x, Y &y) const │ │ │ │ │ +y -= A x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1661 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ +FieldTraits< ft >::real_type infinity_norm() const │ │ │ │ │ +infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1885 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ +void mv(const X &x, Y &y) const │ │ │ │ │ +y = A x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1612 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +B block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:491 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ +void mmtv(const X &x, Y &y) const │ │ │ │ │ +y -= A^T x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1745 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_v_g │ │ │ │ │ +size_type avg │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2046 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ +void umv(const X &x, Y &y) const │ │ │ │ │ +y += A x │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1638 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_i_m_p_l_i_c_i_t___a_l_l_o_c_a_t_e │ │ │ │ │ +void implicit_allocate(size_type _n, size_type _m) │ │ │ │ │ +organizes allocation implicit mode calculates correct array size to be │ │ │ │ │ +allocated and sets the the win... │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2265 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_I_m_p_l_i_c_i_t_B_u_i_l_d_M_o_d_e_P_a_r_a_m_e_t_e_r_s │ │ │ │ │ +void setImplicitBuildModeParameters(size_type _avg, double │ │ │ │ │ +compressionBufferSize) │ │ │ │ │ +Set parameters needed for creation in implicit build mode. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:889 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix(size_type _n, size_type _m, BuildMode bm) │ │ │ │ │ +matrix with unknown number of nonzeroes │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:765 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_i_n_d_i_c_e_s │ │ │ │ │ +void endindices() │ │ │ │ │ +indicate that all indices are defined, check consistency │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1248 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_o_m_p_r_e_s_s │ │ │ │ │ +CompressionStatistics compress() │ │ │ │ │ +Finishes the buildstage in implicit mode. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1360 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_D_a_t_a_P_o_i_n_t_e_r_s │ │ │ │ │ +void setDataPointers() │ │ │ │ │ +Set data pointers for all rows. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2103 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r__ │ │ │ │ │ +std::allocator_traits< A >::template rebind_alloc< B > allocator_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2023 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of rows (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_B_u_i_l_d_M_o_d_e │ │ │ │ │ +void setBuildMode(BuildMode bm) │ │ │ │ │ +Sets the build mode of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:833 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ +Set the size of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_j__ │ │ │ │ │ +std::shared_ptr< size_type > j_ │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2043 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_W_i_n_d_o_w_P_o_i_n_t_e_r_s │ │ │ │ │ +void setWindowPointers(ConstRowIterator row) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2052 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +BCRSMatrix & operator=(const BCRSMatrix &Mat) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:911 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_C_o_l_u_m_n_P_o_i_n_t_e_r_s │ │ │ │ │ +void setColumnPointers(ConstRowIterator row) │ │ │ │ │ +Copy row sizes from iterator range starting at row and set column index │ │ │ │ │ +pointers for all rows. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2077 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +ConstIterator end() const │ │ │ │ │ +Get const iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:718 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +ConstIterator begin() const │ │ │ │ │ +Get const iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:712 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +A allocator_type │ │ │ │ │ +export the allocator type │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:494 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:725 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator access to matrix rows │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:579 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator() │ │ │ │ │ +empty constructor, use with care! │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:596 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const RealRowIterator< ValueType > &other) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:624 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_V_a_l_u_e_T_y_p_e │ │ │ │ │ +std::remove_const< T >::type ValueType │ │ │ │ │ +The unqualified value type. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:583 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator(const RealRowIterator< ValueType > &it) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:600 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const RealRowIterator< const ValueType > &other) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:631 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +RealRowIterator(row_type *_p, size_type _i) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:591 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other) │ │ │ │ │ +const │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:617 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +size_type index() const │ │ │ │ │ +return index │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:606 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:611 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator class for sequential creation of blocks │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:957 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const CreateIterator &it) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1052 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +CreateIterator & operator++() │ │ │ │ │ +prefix increment │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:977 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +size_type index() const │ │ │ │ │ +The number of the row that the iterator currently points to. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1058 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const CreateIterator &it) const │ │ │ │ │ +inequality │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1046 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +CreateIterator(BCRSMatrix &_Mat, size_type _i) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:960 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_s_e_r_t │ │ │ │ │ +void insert(size_type j) │ │ │ │ │ +put column index in row │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1064 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ +bool contains(size_type j) │ │ │ │ │ +return true if column index is in row │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1070 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Get the current row size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1079 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename BCRSMatrix< B, A >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2299 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:2300 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ │ +Error specific to BCRSMatrix. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_I_m_p_l_i_c_i_t_M_o_d_e_C_o_m_p_r_e_s_s_i_o_n_B_u_f_f_e_r_E_x_h_a_u_s_t_e_d │ │ │ │ │ +Thrown when the compression buffer used by the implicit BCRSMatrix construction │ │ │ │ │ +is exhausted. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +Type for indices and sizes. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +T block_type │ │ │ │ │ +Export the type representing the components. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:538 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00167.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: registry.hh File Reference │ │ │ │ +dune-istl: umfpack.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,94 +65,81 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros
│ │ │ │ -
registry.hh File Reference
│ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <string>
│ │ │ │ -#include <utility>
│ │ │ │ -#include "counter.hh"
│ │ │ │ -#include <dune/common/typelist.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/parameterizedobject.hh>
│ │ │ │ + │ │ │ │ +

Classes for using UMFPack with ISTL matrices. │ │ │ │ +More...

│ │ │ │ +
#include <complex>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <umfpack.h>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/solvers.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/istl/solverfactory.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::UMFPackMethodChooser< SCalar, Integer >
 
struct  Dune::UMFPackMethodChooser< double, std::true_type >
 
struct  Dune::UMFPackMethodChooser< double, std::false_type >
 
struct  Dune::UMFPackMethodChooser< std::complex< double >, std::true_type >
 
struct  Dune::UMFPackMethodChooser< std::complex< double >, std::false_type >
 
class  Dune::UMFPack< M >
 The UMFPack direct sparse solver. More...
 
struct  Dune::IsDirectSolver< UMFPack< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
 
struct  Dune::StoresColumnCompressed< UMFPack< BCRSMatrix< T, A > > >
 
struct  Dune::UMFPackCreator
 
struct  Dune::UMFPackCreator::isValidBlock< F, class >
 
struct  Dune::UMFPackCreator::isValidBlock< B, std::enable_if_t< std::is_same< typename FieldTraits< B >::real_type, double >::value > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -Macros

#define DUNE_REGISTRY_PUT(Tag, id, ...)
 

│ │ │ │ +Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("umfpack", Dune::UMFPackCreator())
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_REGISTRY_PUT

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_REGISTRY_PUT( Tag,
 id,
 ... 
)
│ │ │ │ -
│ │ │ │ -Value:
namespace { \
│ │ │ │ -
template<> \
│ │ │ │ -
struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \
│ │ │ │ -
{ \
│ │ │ │ -
static auto getCreator() \
│ │ │ │ -
{ \
│ │ │ │ -
return __VA_ARGS__; \
│ │ │ │ -
} \
│ │ │ │ -
static std::string name() { return id; } \
│ │ │ │ -
}; \
│ │ │ │ -
} \
│ │ │ │ -
DUNE_INC_COUNTER(Tag)
│ │ │ │ -
#define DUNE_GET_COUNTER(Tag)
Definition counter.hh:17
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Classes for using UMFPack with ISTL matrices.

│ │ │ │ +
Author
Dominic Kempf
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,49 +1,60 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -registry.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_c_o_u_n_t_e_r_._h_h" │ │ │ │ │ -#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 │ │ │ │ │ +umfpack.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ +Classes for using UMFPack with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _S_C_a_l_a_r_,_ _I_n_t_e_g_e_r_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_U_M_F_P_a_c_k_<_ _M_ _> │ │ │ │ │ +  The UMFPack direct sparse solver. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _U_M_F_P_a_c_k_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _> │ │ │ │ │ + _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _U_M_F_P_a_c_k_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_,_ _c_l_a_s_s_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _B_,_ _s_t_d_:_:_e_n_a_b_l_e___i_f___t_<_ _s_t_d_:_:_i_s___s_a_m_e_< │ │ │ │ │ + _t_y_p_e_n_a_m_e_ _F_i_e_l_d_T_r_a_i_t_s_<_ _B_ _>_:_:_r_e_a_l___t_y_p_e_,_ _d_o_u_b_l_e_ _>_:_:_v_a_l_u_e_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___R_E_G_I_S_T_R_Y___P_U_T(Tag, id, ...) │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("umfpack", _D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r()) │ │ │ │ │   │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__RREEGGIISSTTRRYY__PPUUTT ********** │ │ │ │ │ -#define DUNE_REGISTRY_PUT (   Tag, │ │ │ │ │ -   id, │ │ │ │ │ -   ......  │ │ │ │ │ - ) │ │ │ │ │ -VVaalluuee:: │ │ │ │ │ -namespace { \ │ │ │ │ │ -template<> \ │ │ │ │ │ -struct Registry \ │ │ │ │ │ -{ \ │ │ │ │ │ -static auto getCreator() \ │ │ │ │ │ -{ \ │ │ │ │ │ -return __VA_ARGS__; \ │ │ │ │ │ -} \ │ │ │ │ │ -static std::string name() { return id; } \ │ │ │ │ │ -}; \ │ │ │ │ │ -} \ │ │ │ │ │ -DUNE_INC_COUNTER(Tag) │ │ │ │ │ -_D_U_N_E___G_E_T___C_O_U_N_T_E_R │ │ │ │ │ -#define DUNE_GET_COUNTER(Tag) │ │ │ │ │ -DDeeffiinniittiioonn counter.hh:17 │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Classes for using UMFPack with ISTL matrices. │ │ │ │ │ + Author │ │ │ │ │ + Dominic Kempf │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: registry.hh Source File │ │ │ │ +dune-istl: umfpack.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,106 +70,903 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
registry.hh
│ │ │ │ +
umfpack.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH
│ │ │ │ -
4#define DUNE_ISTL_COMMON_REGISTRY_HH
│ │ │ │ -
5
│ │ │ │ -
6#include <cstddef>
│ │ │ │ -
7#include <iostream>
│ │ │ │ -
8#include <memory>
│ │ │ │ -
9#include <string>
│ │ │ │ -
10#include <utility>
│ │ │ │ -
11
│ │ │ │ -
12#include "counter.hh"
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/typelist.hh>
│ │ │ │ -
15#include <dune/common/hybridutilities.hh>
│ │ │ │ -
16#include <dune/common/parameterizedobject.hh>
│ │ │ │ -
17
│ │ │ │ -
│ │ │ │ -
18#define DUNE_REGISTRY_PUT(Tag, id, ...) \
│ │ │ │ -
19 namespace { \
│ │ │ │ -
20 template<> \
│ │ │ │ -
21 struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \
│ │ │ │ -
22 { \
│ │ │ │ -
23 static auto getCreator() \
│ │ │ │ -
24 { \
│ │ │ │ -
25 return __VA_ARGS__; \
│ │ │ │ -
26 } \
│ │ │ │ -
27 static std::string name() { return id; } \
│ │ │ │ -
28 }; \
│ │ │ │ -
29 } \
│ │ │ │ -
30 DUNE_INC_COUNTER(Tag)
│ │ │ │ -
│ │ │ │ -
31
│ │ │ │ -
32
│ │ │ │ -
33namespace Dune {
│ │ │ │ -
34 namespace {
│ │ │ │ -
35 template<class Tag, std::size_t index>
│ │ │ │ -
36 struct Registry;
│ │ │ │ -
37 }
│ │ │ │ -
38
│ │ │ │ -
39 namespace {
│ │ │ │ -
40 template<template<class> class Base, class V, class Tag, typename... Args>
│ │ │ │ -
41 auto registryGet(Tag , std::string name, Args... args)
│ │ │ │ -
42 {
│ │ │ │ -
43 constexpr auto count = DUNE_GET_COUNTER(Tag);
│ │ │ │ -
44 std::shared_ptr<Base<V> > result;
│ │ │ │ -
45 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
│ │ │ │ -
46 [&](auto index) {
│ │ │ │ -
47 using Reg = Registry<Tag, index>;
│ │ │ │ -
48 if(!result && Reg::name() == name) {
│ │ │ │ -
49 result = Reg::getCreator()(Dune::MetaType<V>{}, args...);
│ │ │ │ -
50 }
│ │ │ │ -
51 });
│ │ │ │ -
52 return result;
│ │ │ │ -
53 }
│ │ │ │ -
54
│ │ │ │ -
55 /*
│ │ │ │ -
56 Register all creators from the registry in the Parameterizedobjectfactory An
│ │ │ │ -
57 object of V is passed in the creator ans should be used to determine the
│ │ │ │ -
58 template arguments.
│ │ │ │ -
59 */
│ │ │ │ -
60 template<class V, class Type, class Tag, class... Args>
│ │ │ │ -
61 int addRegistryToFactory(Dune::ParameterizedObjectFactory<Type(Args...), std::string>& factory,
│ │ │ │ -
62 Tag){
│ │ │ │ -
63 constexpr auto count = DUNE_GET_COUNTER(Tag);
│ │ │ │ -
64 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
│ │ │ │ -
65 [&](auto index) {
│ │ │ │ -
66 // we first get the generic lambda
│ │ │ │ -
67 // and later specialize it with given parameters.
│ │ │ │ -
68 // doing all at once lead to an ICE woth g++-6
│ │ │ │ -
69 using Reg = Registry<Tag, index>;
│ │ │ │ -
70 auto genericcreator = Reg::getCreator();
│ │ │ │ -
71 factory.define(Reg::name(), [genericcreator](Args... args){
│ │ │ │ -
72 return genericcreator(V{}, args...);
│ │ │ │ -
73 });
│ │ │ │ -
74 });
│ │ │ │ -
75 return count;
│ │ │ │ -
76 }
│ │ │ │ -
77 } // end anonymous namespace
│ │ │ │ -
78} // end namespace Dune
│ │ │ │ -
79
│ │ │ │ -
80#endif // DUNE_ISTL_COMMON_REGISTRY_HH
│ │ │ │ - │ │ │ │ -
#define DUNE_GET_COUNTER(Tag)
Definition counter.hh:17
│ │ │ │ +
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
5#ifndef DUNE_ISTL_UMFPACK_HH
│ │ │ │ +
6#define DUNE_ISTL_UMFPACK_HH
│ │ │ │ +
7
│ │ │ │ +
8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN
│ │ │ │ +
9
│ │ │ │ +
10#include<complex>
│ │ │ │ +
11#include<type_traits>
│ │ │ │ +
12
│ │ │ │ +
13#include<umfpack.h>
│ │ │ │ +
14
│ │ │ │ +
15#include<dune/common/exceptions.hh>
│ │ │ │ +
16#include<dune/common/fmatrix.hh>
│ │ │ │ +
17#include<dune/common/fvector.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
26namespace Dune {
│ │ │ │ +
38 // FORWARD DECLARATIONS
│ │ │ │ +
39 template<class M, class T, class TM, class TD, class TA>
│ │ │ │ +
40 class SeqOverlappingSchwarz;
│ │ │ │ +
41
│ │ │ │ +
42 template<class T, bool tag>
│ │ │ │ +
43 struct SeqOverlappingSchwarzAssemblerHelper;
│ │ │ │ +
44
│ │ │ │ +
45 // wrapper class for C-Function Calls in the backend. Choose the right function namespace
│ │ │ │ +
46 // depending on the template parameter used.
│ │ │ │ +
47template<typename SCalar, typename Integer>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
49 {
│ │ │ │ +
50 static constexpr bool valid = false ;
│ │ │ │ +
51 };
│ │ │ │ +
│ │ │ │ +
52
│ │ │ │ +
53 template<>
│ │ │ │ +
│ │ │ │ +
54 struct UMFPackMethodChooser<double, std::true_type>
│ │ │ │ +
55 {
│ │ │ │ +
56 static constexpr bool valid = true ;
│ │ │ │ +
57
│ │ │ │ +
58 template<typename... A>
│ │ │ │ +
│ │ │ │ +
59 static void defaults(A... args)
│ │ │ │ +
60 {
│ │ │ │ +
61 umfpack_dl_defaults(args...);
│ │ │ │ +
62 }
│ │ │ │ +
│ │ │ │ +
63 template<typename... A>
│ │ │ │ +
│ │ │ │ +
64 static void free_numeric(A... args)
│ │ │ │ +
65 {
│ │ │ │ +
66 umfpack_dl_free_numeric(args...);
│ │ │ │ +
67 }
│ │ │ │ +
│ │ │ │ +
68 template<typename... A>
│ │ │ │ +
│ │ │ │ +
69 static void free_symbolic(A... args)
│ │ │ │ +
70 {
│ │ │ │ +
71 umfpack_dl_free_symbolic(args...);
│ │ │ │ +
72 }
│ │ │ │ +
│ │ │ │ +
73 template<typename... A>
│ │ │ │ +
│ │ │ │ +
74 static int load_numeric(A... args)
│ │ │ │ +
75 {
│ │ │ │ +
76 return umfpack_dl_load_numeric(args...);
│ │ │ │ +
77 }
│ │ │ │ +
│ │ │ │ +
78 template<typename... A>
│ │ │ │ +
│ │ │ │ +
79 static void numeric(A... args)
│ │ │ │ +
80 {
│ │ │ │ +
81 umfpack_dl_numeric(args...);
│ │ │ │ +
82 }
│ │ │ │ +
│ │ │ │ +
83 template<typename... A>
│ │ │ │ +
│ │ │ │ +
84 static void report_info(A... args)
│ │ │ │ +
85 {
│ │ │ │ +
86 umfpack_dl_report_info(args...);
│ │ │ │ +
87 }
│ │ │ │ +
│ │ │ │ +
88 template<typename... A>
│ │ │ │ +
│ │ │ │ +
89 static void report_status(A... args)
│ │ │ │ +
90 {
│ │ │ │ +
91 umfpack_dl_report_status(args...);
│ │ │ │ +
92 }
│ │ │ │ +
│ │ │ │ +
93 template<typename... A>
│ │ │ │ +
│ │ │ │ +
94 static int save_numeric(A... args)
│ │ │ │ +
95 {
│ │ │ │ +
96 return umfpack_dl_save_numeric(args...);
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98 template<typename... A>
│ │ │ │ +
│ │ │ │ +
99 static void solve(A... args)
│ │ │ │ +
100 {
│ │ │ │ +
101 umfpack_dl_solve(args...);
│ │ │ │ +
102 }
│ │ │ │ +
│ │ │ │ +
103 template<typename... A>
│ │ │ │ +
│ │ │ │ +
104 static void symbolic(A... args)
│ │ │ │ +
105 {
│ │ │ │ +
106 umfpack_dl_symbolic(args...);
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
108 };
│ │ │ │ +
│ │ │ │ +
109
│ │ │ │ +
110 template<>
│ │ │ │ +
│ │ │ │ +
111 struct UMFPackMethodChooser<double, std::false_type>
│ │ │ │ +
112 {
│ │ │ │ +
113 static constexpr bool valid = true ;
│ │ │ │ +
114
│ │ │ │ +
115 template<typename... A>
│ │ │ │ +
│ │ │ │ +
116 static void defaults(A... args)
│ │ │ │ +
117 {
│ │ │ │ +
118 umfpack_di_defaults(args...);
│ │ │ │ +
119 }
│ │ │ │ +
│ │ │ │ +
120 template<typename... A>
│ │ │ │ +
│ │ │ │ +
121 static void free_numeric(A... args)
│ │ │ │ +
122 {
│ │ │ │ +
123 umfpack_di_free_numeric(args...);
│ │ │ │ +
124 }
│ │ │ │ +
│ │ │ │ +
125 template<typename... A>
│ │ │ │ +
│ │ │ │ +
126 static void free_symbolic(A... args)
│ │ │ │ +
127 {
│ │ │ │ +
128 umfpack_di_free_symbolic(args...);
│ │ │ │ +
129 }
│ │ │ │ +
│ │ │ │ +
130 template<typename... A>
│ │ │ │ +
│ │ │ │ +
131 static int load_numeric(A... args)
│ │ │ │ +
132 {
│ │ │ │ +
133 return umfpack_di_load_numeric(args...);
│ │ │ │ +
134 }
│ │ │ │ +
│ │ │ │ +
135 template<typename... A>
│ │ │ │ +
│ │ │ │ +
136 static void numeric(A... args)
│ │ │ │ +
137 {
│ │ │ │ +
138 umfpack_di_numeric(args...);
│ │ │ │ +
139 }
│ │ │ │ +
│ │ │ │ +
140 template<typename... A>
│ │ │ │ +
│ │ │ │ +
141 static void report_info(A... args)
│ │ │ │ +
142 {
│ │ │ │ +
143 umfpack_di_report_info(args...);
│ │ │ │ +
144 }
│ │ │ │ +
│ │ │ │ +
145 template<typename... A>
│ │ │ │ +
│ │ │ │ +
146 static void report_status(A... args)
│ │ │ │ +
147 {
│ │ │ │ +
148 umfpack_di_report_status(args...);
│ │ │ │ +
149 }
│ │ │ │ +
│ │ │ │ +
150 template<typename... A>
│ │ │ │ +
│ │ │ │ +
151 static int save_numeric(A... args)
│ │ │ │ +
152 {
│ │ │ │ +
153 return umfpack_di_save_numeric(args...);
│ │ │ │ +
154 }
│ │ │ │ +
│ │ │ │ +
155 template<typename... A>
│ │ │ │ +
│ │ │ │ +
156 static void solve(A... args)
│ │ │ │ +
157 {
│ │ │ │ +
158 umfpack_di_solve(args...);
│ │ │ │ +
159 }
│ │ │ │ +
│ │ │ │ +
160 template<typename... A>
│ │ │ │ +
│ │ │ │ +
161 static void symbolic(A... args)
│ │ │ │ +
162 {
│ │ │ │ +
163 umfpack_di_symbolic(args...);
│ │ │ │ +
164 }
│ │ │ │ +
│ │ │ │ +
165 };
│ │ │ │ +
│ │ │ │ +
166
│ │ │ │ +
167 template<>
│ │ │ │ +
│ │ │ │ +
168 struct UMFPackMethodChooser<std::complex<double>, std::true_type>
│ │ │ │ +
169 {
│ │ │ │ +
170 static constexpr bool valid = true ;
│ │ │ │ +
171
│ │ │ │ +
172 using umf_int_type = int64_t;
│ │ │ │ +
173
│ │ │ │ +
174 template<typename... A>
│ │ │ │ +
│ │ │ │ +
175 static void defaults(A... args)
│ │ │ │ +
176 {
│ │ │ │ +
177 umfpack_zl_defaults(args...);
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │ +
179 template<typename... A>
│ │ │ │ +
│ │ │ │ +
180 static void free_numeric(A... args)
│ │ │ │ +
181 {
│ │ │ │ +
182 umfpack_zl_free_numeric(args...);
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184 template<typename... A>
│ │ │ │ +
│ │ │ │ +
185 static void free_symbolic(A... args)
│ │ │ │ +
186 {
│ │ │ │ +
187 umfpack_zl_free_symbolic(args...);
│ │ │ │ +
188 }
│ │ │ │ +
│ │ │ │ +
189 template<typename... A>
│ │ │ │ +
│ │ │ │ +
190 static int load_numeric(A... args)
│ │ │ │ +
191 {
│ │ │ │ +
192 return umfpack_zl_load_numeric(args...);
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194 template<typename... A>
│ │ │ │ +
│ │ │ │ +
195 static void numeric(const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ +
196 {
│ │ │ │ +
197 umfpack_zl_numeric(cs,ri,val,NULL,args...);
│ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │ +
199 template<typename... A>
│ │ │ │ +
│ │ │ │ +
200 static void report_info(A... args)
│ │ │ │ +
201 {
│ │ │ │ +
202 umfpack_zl_report_info(args...);
│ │ │ │ +
203 }
│ │ │ │ +
│ │ │ │ +
204 template<typename... A>
│ │ │ │ +
│ │ │ │ +
205 static void report_status(A... args)
│ │ │ │ +
206 {
│ │ │ │ +
207 umfpack_zl_report_status(args...);
│ │ │ │ +
208 }
│ │ │ │ +
│ │ │ │ +
209 template<typename... A>
│ │ │ │ +
│ │ │ │ +
210 static int save_numeric(A... args)
│ │ │ │ +
211 {
│ │ │ │ +
212 return umfpack_zl_save_numeric(args...);
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214 template<typename... A>
│ │ │ │ +
│ │ │ │ +
215 static void solve(umf_int_type m, const umf_int_type* cs, const umf_int_type* ri, std::complex<double>* val, double* x, const double* b,A... args)
│ │ │ │ +
216 {
│ │ │ │ +
217 const double* cval = reinterpret_cast<const double*>(val);
│ │ │ │ +
218 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);
│ │ │ │ +
219 }
│ │ │ │ +
│ │ │ │ +
220 template<typename... A>
│ │ │ │ +
│ │ │ │ +
221 static void symbolic(umf_int_type m, umf_int_type n, const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ +
222 {
│ │ │ │ +
223 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...);
│ │ │ │ +
224 }
│ │ │ │ +
│ │ │ │ +
225 };
│ │ │ │ +
│ │ │ │ +
226
│ │ │ │ +
227
│ │ │ │ +
228 template<>
│ │ │ │ +
│ │ │ │ +
229 struct UMFPackMethodChooser<std::complex<double>, std::false_type>
│ │ │ │ +
230 {
│ │ │ │ +
231 static constexpr bool valid = true ;
│ │ │ │ +
232
│ │ │ │ +
233 using umf_int_type = int32_t;
│ │ │ │ +
234
│ │ │ │ +
235 template<typename... A>
│ │ │ │ +
│ │ │ │ +
236 static void defaults(A... args)
│ │ │ │ +
237 {
│ │ │ │ +
238 umfpack_zi_defaults(args...);
│ │ │ │ +
239 }
│ │ │ │ +
│ │ │ │ +
240 template<typename... A>
│ │ │ │ +
│ │ │ │ +
241 static void free_numeric(A... args)
│ │ │ │ +
242 {
│ │ │ │ +
243 umfpack_zi_free_numeric(args...);
│ │ │ │ +
244 }
│ │ │ │ +
│ │ │ │ +
245 template<typename... A>
│ │ │ │ +
│ │ │ │ +
246 static void free_symbolic(A... args)
│ │ │ │ +
247 {
│ │ │ │ +
248 umfpack_zi_free_symbolic(args...);
│ │ │ │ +
249 }
│ │ │ │ +
│ │ │ │ +
250 template<typename... A>
│ │ │ │ +
│ │ │ │ +
251 static int load_numeric(A... args)
│ │ │ │ +
252 {
│ │ │ │ +
253 return umfpack_zi_load_numeric(args...);
│ │ │ │ +
254 }
│ │ │ │ +
│ │ │ │ +
255 template<typename... A>
│ │ │ │ +
│ │ │ │ +
256 static void numeric(const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ +
257 {
│ │ │ │ +
258 umfpack_zi_numeric(cs,ri,val,NULL,args...);
│ │ │ │ +
259 }
│ │ │ │ +
│ │ │ │ +
260 template<typename... A>
│ │ │ │ +
│ │ │ │ +
261 static void report_info(A... args)
│ │ │ │ +
262 {
│ │ │ │ +
263 umfpack_zi_report_info(args...);
│ │ │ │ +
264 }
│ │ │ │ +
│ │ │ │ +
265 template<typename... A>
│ │ │ │ +
│ │ │ │ +
266 static void report_status(A... args)
│ │ │ │ +
267 {
│ │ │ │ +
268 umfpack_zi_report_status(args...);
│ │ │ │ +
269 }
│ │ │ │ +
│ │ │ │ +
270 template<typename... A>
│ │ │ │ +
│ │ │ │ +
271 static int save_numeric(A... args)
│ │ │ │ +
272 {
│ │ │ │ +
273 return umfpack_zi_save_numeric(args...);
│ │ │ │ +
274 }
│ │ │ │ +
│ │ │ │ +
275 template<typename... A>
│ │ │ │ +
│ │ │ │ +
276 static void solve(umf_int_type m, const umf_int_type* cs, const umf_int_type* ri, std::complex<double>* val, double* x, const double* b,A... args)
│ │ │ │ +
277 {
│ │ │ │ +
278 const double* cval = reinterpret_cast<const double*>(val);
│ │ │ │ +
279 umfpack_zi_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);
│ │ │ │ +
280 }
│ │ │ │ +
│ │ │ │ +
281 template<typename... A>
│ │ │ │ +
│ │ │ │ +
282 static void symbolic(umf_int_type m, std::size_t n, const umf_int_type* cs, const umf_int_type* ri, const double* val, A... args)
│ │ │ │ +
283 {
│ │ │ │ +
284 umfpack_zi_symbolic(m,n,cs,ri,val,NULL,args...);
│ │ │ │ +
285 }
│ │ │ │ +
│ │ │ │ +
286 };
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
288 namespace Impl
│ │ │ │ +
289 {
│ │ │ │ +
290 template<class M>
│ │ │ │ +
291 struct UMFPackVectorChooser
│ │ │ │ +
292 {};
│ │ │ │ +
293
│ │ │ │ +
294 template<typename T, typename A, int n, int m>
│ │ │ │ +
295 struct UMFPackVectorChooser<BCRSMatrix<FieldMatrix<T,n,m>,A > >
│ │ │ │ +
296 {
│ │ │ │ +
298 using domain_type = BlockVector<
│ │ │ │ +
299 FieldVector<T,m>,
│ │ │ │ +
300 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >;
│ │ │ │ +
302 using range_type = BlockVector<
│ │ │ │ +
303 FieldVector<T,n>,
│ │ │ │ +
304 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > >;
│ │ │ │ +
305 };
│ │ │ │ +
306
│ │ │ │ +
307 template<typename T, typename A>
│ │ │ │ +
308 struct UMFPackVectorChooser<BCRSMatrix<T,A> >
│ │ │ │ +
309 {
│ │ │ │ +
311 using domain_type = BlockVector<T, A>;
│ │ │ │ +
313 using range_type = BlockVector<T, A>;
│ │ │ │ +
314 };
│ │ │ │ +
315 }
│ │ │ │ +
316
│ │ │ │ +
330 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
332 : public InverseOperator<
│ │ │ │ +
333 typename Impl::UMFPackVectorChooser<M>::domain_type,
│ │ │ │ +
334 typename Impl::UMFPackVectorChooser<M>::range_type >
│ │ │ │ +
335 {
│ │ │ │ +
336 using T = typename M::field_type;
│ │ │ │ +
337
│ │ │ │ +
338 public:
│ │ │ │ +
340 using Matrix = M;
│ │ │ │ +
341 using matrix_type = M;
│ │ │ │ +
342 using umf_int_type = std::conditional_t<(sizeof(typename M::size_type) == 8), int64_t, int32_t>;
│ │ │ │ +
344 typedef ISTL::Impl::BCCSMatrix<typename Matrix::field_type, umf_int_type> UMFPackMatrix;
│ │ │ │ +
346 typedef ISTL::Impl::BCCSMatrixInitializer<M, umf_int_type> MatrixInitializer;
│ │ │ │ +
348 using domain_type = typename Impl::UMFPackVectorChooser<M>::domain_type;
│ │ │ │ +
350 using range_type = typename Impl::UMFPackVectorChooser<M>::range_type;
│ │ │ │ +
351
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
354 {
│ │ │ │ + │ │ │ │ +
356 }
│ │ │ │ +
│ │ │ │ +
357
│ │ │ │ +
│ │ │ │ +
366 UMFPack(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false)
│ │ │ │ +
367 {
│ │ │ │ +
368 //check whether T is a supported type
│ │ │ │ +
369 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ +
370 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ +
371 Caller::defaults(UMF_Control);
│ │ │ │ +
372 setVerbosity(verbose);
│ │ │ │ +
373 setMatrix(matrix);
│ │ │ │ +
374 }
│ │ │ │ +
│ │ │ │ +
375
│ │ │ │ +
│ │ │ │ +
384 UMFPack(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false)
│ │ │ │ +
385 {
│ │ │ │ +
386 //check whether T is a supported type
│ │ │ │ +
387 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ +
388 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ +
389 Caller::defaults(UMF_Control);
│ │ │ │ +
390 setVerbosity(verbose);
│ │ │ │ +
391 setMatrix(matrix);
│ │ │ │ +
392 }
│ │ │ │ +
│ │ │ │ +
393
│ │ │ │ +
│ │ │ │ +
403 UMFPack(const Matrix& mat_, const ParameterTree& config)
│ │ │ │ +
404 : UMFPack(mat_, config.get<int>("verbose", 0))
│ │ │ │ +
405 {}
│ │ │ │ +
│ │ │ │ +
406
│ │ │ │ +
│ │ │ │ +
409 UMFPack() : matrixIsLoaded_(false), verbosity_(0)
│ │ │ │ +
410 {
│ │ │ │ +
411 //check whether T is a supported type
│ │ │ │ +
412 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ +
413 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ +
414 Caller::defaults(UMF_Control);
│ │ │ │ +
415 }
│ │ │ │ +
│ │ │ │ +
416
│ │ │ │ +
│ │ │ │ +
427 UMFPack(const Matrix& mat_, const char* file, int verbose=0)
│ │ │ │ +
428 {
│ │ │ │ +
429 //check whether T is a supported type
│ │ │ │ +
430 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ +
431 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ +
432 Caller::defaults(UMF_Control);
│ │ │ │ +
433 setVerbosity(verbose);
│ │ │ │ +
434 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
│ │ │ │ +
435 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode == UMFPACK_ERROR_file_IO))
│ │ │ │ +
436 {
│ │ │ │ +
437 matrixIsLoaded_ = false;
│ │ │ │ +
438 setMatrix(mat_);
│ │ │ │ +
439 saveDecomposition(file);
│ │ │ │ +
440 }
│ │ │ │ +
441 else
│ │ │ │ +
442 {
│ │ │ │ +
443 matrixIsLoaded_ = true;
│ │ │ │ +
444 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
│ │ │ │ +
445 }
│ │ │ │ +
446 }
│ │ │ │ +
│ │ │ │ +
447
│ │ │ │ +
│ │ │ │ +
454 UMFPack(const char* file, int verbose=0)
│ │ │ │ +
455 {
│ │ │ │ +
456 //check whether T is a supported type
│ │ │ │ +
457 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
│ │ │ │ +
458 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ +
459 Caller::defaults(UMF_Control);
│ │ │ │ +
460 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
│ │ │ │ +
461 if (errcode == UMFPACK_ERROR_out_of_memory)
│ │ │ │ +
462 DUNE_THROW(Dune::Exception, "ran out of memory while loading UMFPack decomposition");
│ │ │ │ +
463 if (errcode == UMFPACK_ERROR_file_IO)
│ │ │ │ +
464 DUNE_THROW(Dune::Exception, "IO error while loading UMFPack decomposition");
│ │ │ │ +
465 matrixIsLoaded_ = true;
│ │ │ │ +
466 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
│ │ │ │ +
467 setVerbosity(verbose);
│ │ │ │ +
468 }
│ │ │ │ +
│ │ │ │ +
469
│ │ │ │ +
│ │ │ │ +
470 virtual ~UMFPack()
│ │ │ │ +
471 {
│ │ │ │ +
472 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
│ │ │ │ +
473 free();
│ │ │ │ +
474 }
│ │ │ │ +
│ │ │ │ +
475
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
480 {
│ │ │ │ +
481 if (umfpackMatrix_.N() != b.dim())
│ │ │ │ +
482 DUNE_THROW(Dune::ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
│ │ │ │ +
483 if (umfpackMatrix_.M() != x.dim())
│ │ │ │ +
484 DUNE_THROW(Dune::ISTLError, "Size of solution vector x does not match the number of matrix columns!");
│ │ │ │ +
485 if (b.size() == 0)
│ │ │ │ +
486 return;
│ │ │ │ +
487
│ │ │ │ +
488 double UMF_Apply_Info[UMFPACK_INFO];
│ │ │ │ +
489 Caller::solve(UMFPACK_A,
│ │ │ │ +
490 umfpackMatrix_.getColStart(),
│ │ │ │ +
491 umfpackMatrix_.getRowIndex(),
│ │ │ │ +
492 umfpackMatrix_.getValues(),
│ │ │ │ +
493 reinterpret_cast<double*>(&x[0]),
│ │ │ │ +
494 reinterpret_cast<double*>(&b[0]),
│ │ │ │ +
495 UMF_Numeric,
│ │ │ │ +
496 UMF_Control,
│ │ │ │ +
497 UMF_Apply_Info);
│ │ │ │ +
498
│ │ │ │ +
499 //this is a direct solver
│ │ │ │ +
500 res.iterations = 1;
│ │ │ │ +
501 res.converged = true;
│ │ │ │ +
502 res.elapsed = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME];
│ │ │ │ +
503
│ │ │ │ +
504 printOnApply(UMF_Apply_Info);
│ │ │ │ +
505 }
│ │ │ │ +
│ │ │ │ +
506
│ │ │ │ +
│ │ │ │ +
510 virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ +
511 {
│ │ │ │ +
512 apply(x,b,res);
│ │ │ │ +
513 }
│ │ │ │ +
│ │ │ │ +
514
│ │ │ │ +
│ │ │ │ +
520 void apply(T* x, T* b)
│ │ │ │ +
521 {
│ │ │ │ +
522 double UMF_Apply_Info[UMFPACK_INFO];
│ │ │ │ +
523 Caller::solve(UMFPACK_A,
│ │ │ │ +
524 umfpackMatrix_.getColStart(),
│ │ │ │ +
525 umfpackMatrix_.getRowIndex(),
│ │ │ │ +
526 umfpackMatrix_.getValues(),
│ │ │ │ +
527 x,
│ │ │ │ +
528 b,
│ │ │ │ +
529 UMF_Numeric,
│ │ │ │ +
530 UMF_Control,
│ │ │ │ +
531 UMF_Apply_Info);
│ │ │ │ +
532 printOnApply(UMF_Apply_Info);
│ │ │ │ +
533 }
│ │ │ │ +
│ │ │ │ +
534
│ │ │ │ +
│ │ │ │ +
546 void setOption(unsigned int option, double value)
│ │ │ │ +
547 {
│ │ │ │ +
548 if (option >= UMFPACK_CONTROL)
│ │ │ │ +
549 DUNE_THROW(RangeError, "Requested non-existing UMFPack option");
│ │ │ │ +
550
│ │ │ │ +
551 UMF_Control[option] = value;
│ │ │ │ +
552 }
│ │ │ │ +
│ │ │ │ +
553
│ │ │ │ +
│ │ │ │ +
557 void saveDecomposition(const char* file)
│ │ │ │ +
558 {
│ │ │ │ +
559 int errcode = Caller::save_numeric(UMF_Numeric, const_cast<char*>(file));
│ │ │ │ +
560 if (errcode != UMFPACK_OK)
│ │ │ │ +
561 DUNE_THROW(Dune::Exception,"IO ERROR while trying to save UMFPack decomposition");
│ │ │ │ +
562 }
│ │ │ │ +
│ │ │ │ +
563
│ │ │ │ +
│ │ │ │ +
565 void setMatrix(const Matrix& matrix)
│ │ │ │ +
566 {
│ │ │ │ +
567 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
│ │ │ │ +
568 free();
│ │ │ │ +
569 if (matrix.N() == 0 or matrix.M() == 0)
│ │ │ │ +
570 return;
│ │ │ │ +
571
│ │ │ │ +
572 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
│ │ │ │ +
573 umfpackMatrix_.free();
│ │ │ │ +
574 umfpackMatrix_.setSize(MatrixDimension<Matrix>::rowdim(matrix),
│ │ │ │ + │ │ │ │ +
576 ISTL::Impl::BCCSMatrixInitializer<Matrix, umf_int_type> initializer(umfpackMatrix_);
│ │ │ │ +
577
│ │ │ │ +
578 copyToBCCSMatrix(initializer, matrix);
│ │ │ │ +
579
│ │ │ │ +
580 decompose();
│ │ │ │ +
581 }
│ │ │ │ +
│ │ │ │ +
582
│ │ │ │ +
583 template<class S>
│ │ │ │ +
│ │ │ │ +
584 void setSubMatrix(const Matrix& _mat, const S& rowIndexSet)
│ │ │ │ +
585 {
│ │ │ │ +
586 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
│ │ │ │ +
587 free();
│ │ │ │ +
588
│ │ │ │ +
589 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
│ │ │ │ +
590 umfpackMatrix_.free();
│ │ │ │ +
591
│ │ │ │ +
592 umfpackMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(_mat) / _mat.N(),
│ │ │ │ +
593 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(_mat) / _mat.M());
│ │ │ │ +
594 ISTL::Impl::BCCSMatrixInitializer<Matrix, umf_int_type> initializer(umfpackMatrix_);
│ │ │ │ +
595
│ │ │ │ +
596 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(_mat,rowIndexSet));
│ │ │ │ +
597
│ │ │ │ +
598 decompose();
│ │ │ │ +
599 }
│ │ │ │ +
│ │ │ │ +
600
│ │ │ │ +
│ │ │ │ +
608 void setVerbosity(int v)
│ │ │ │ +
609 {
│ │ │ │ +
610 verbosity_ = v;
│ │ │ │ +
611 // set the verbosity level in UMFPack
│ │ │ │ +
612 if (verbosity_ == 0)
│ │ │ │ +
613 UMF_Control[UMFPACK_PRL] = 1;
│ │ │ │ +
614 if (verbosity_ == 1)
│ │ │ │ +
615 UMF_Control[UMFPACK_PRL] = 2;
│ │ │ │ +
616 if (verbosity_ == 2)
│ │ │ │ +
617 UMF_Control[UMFPACK_PRL] = 4;
│ │ │ │ +
618 }
│ │ │ │ +
│ │ │ │ +
619
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
625 {
│ │ │ │ +
626 return UMF_Numeric;
│ │ │ │ +
627 }
│ │ │ │ +
│ │ │ │ +
628
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
634 {
│ │ │ │ +
635 return umfpackMatrix_;
│ │ │ │ +
636 }
│ │ │ │ +
│ │ │ │ +
637
│ │ │ │ +
│ │ │ │ +
642 void free()
│ │ │ │ +
643 {
│ │ │ │ +
644 if (!matrixIsLoaded_)
│ │ │ │ +
645 {
│ │ │ │ +
646 Caller::free_symbolic(&UMF_Symbolic);
│ │ │ │ +
647 umfpackMatrix_.free();
│ │ │ │ +
648 }
│ │ │ │ +
649 Caller::free_numeric(&UMF_Numeric);
│ │ │ │ +
650 matrixIsLoaded_ = false;
│ │ │ │ +
651 }
│ │ │ │ +
│ │ │ │ +
652
│ │ │ │ +
653 const char* name() { return "UMFPACK"; }
│ │ │ │ +
654
│ │ │ │ +
655 private:
│ │ │ │ +
656 typedef typename Dune::UMFPackMethodChooser<T,std::integral_constant<bool, (sizeof(typename M::size_type) == 8)>> Caller;
│ │ │ │ +
657
│ │ │ │ +
658 template<class Mat,class X, class TM, class TD, class T1>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
661
│ │ │ │ +
663 void decompose()
│ │ │ │ +
664 {
│ │ │ │ +
665 double UMF_Decomposition_Info[UMFPACK_INFO];
│ │ │ │ +
666 Caller::symbolic(static_cast<umf_int_type>(umfpackMatrix_.N()),
│ │ │ │ +
667 static_cast<umf_int_type>(umfpackMatrix_.N()),
│ │ │ │ +
668 umfpackMatrix_.getColStart(),
│ │ │ │ +
669 umfpackMatrix_.getRowIndex(),
│ │ │ │ +
670 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
│ │ │ │ +
671 &UMF_Symbolic,
│ │ │ │ +
672 UMF_Control,
│ │ │ │ +
673 UMF_Decomposition_Info);
│ │ │ │ +
674 Caller::numeric(umfpackMatrix_.getColStart(),
│ │ │ │ +
675 umfpackMatrix_.getRowIndex(),
│ │ │ │ +
676 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
│ │ │ │ +
677 UMF_Symbolic,
│ │ │ │ +
678 &UMF_Numeric,
│ │ │ │ +
679 UMF_Control,
│ │ │ │ +
680 UMF_Decomposition_Info);
│ │ │ │ +
681 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]);
│ │ │ │ +
682 if (verbosity_ == 1)
│ │ │ │ +
683 {
│ │ │ │ +
684 std::cout << "[UMFPack Decomposition]" << std::endl;
│ │ │ │ +
685 std::cout << "Wallclock Time taken: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_WALLTIME] << " (CPU Time: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_TIME] << ")" << std::endl;
│ │ │ │ +
686 std::cout << "Flops taken: " << UMF_Decomposition_Info[UMFPACK_FLOPS] << std::endl;
│ │ │ │ +
687 std::cout << "Peak Memory Usage: " << UMF_Decomposition_Info[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << " bytes" << std::endl;
│ │ │ │ +
688 std::cout << "Condition number estimate: " << 1./UMF_Decomposition_Info[UMFPACK_RCOND] << std::endl;
│ │ │ │ +
689 std::cout << "Numbers of non-zeroes in decomposition: L: " << UMF_Decomposition_Info[UMFPACK_LNZ] << " U: " << UMF_Decomposition_Info[UMFPACK_UNZ] << std::endl;
│ │ │ │ +
690 }
│ │ │ │ +
691 if (verbosity_ == 2)
│ │ │ │ +
692 {
│ │ │ │ +
693 Caller::report_info(UMF_Control,UMF_Decomposition_Info);
│ │ │ │ +
694 }
│ │ │ │ +
695 }
│ │ │ │ +
696
│ │ │ │ +
697 void printOnApply(double* UMF_Info)
│ │ │ │ +
698 {
│ │ │ │ +
699 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]);
│ │ │ │ +
700 if (verbosity_ > 0)
│ │ │ │ +
701 {
│ │ │ │ +
702 std::cout << "[UMFPack Solve]" << std::endl;
│ │ │ │ +
703 std::cout << "Wallclock Time: " << UMF_Info[UMFPACK_SOLVE_WALLTIME] << " (CPU Time: " << UMF_Info[UMFPACK_SOLVE_TIME] << ")" << std::endl;
│ │ │ │ +
704 std::cout << "Flops Taken: " << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl;
│ │ │ │ +
705 std::cout << "Iterative Refinement steps taken: " << UMF_Info[UMFPACK_IR_TAKEN] << std::endl;
│ │ │ │ +
706 std::cout << "Error Estimate: " << UMF_Info[UMFPACK_OMEGA1] << " resp. " << UMF_Info[UMFPACK_OMEGA2] << std::endl;
│ │ │ │ +
707 }
│ │ │ │ +
708 }
│ │ │ │ +
709
│ │ │ │ +
710 UMFPackMatrix umfpackMatrix_;
│ │ │ │ +
711 bool matrixIsLoaded_;
│ │ │ │ +
712 int verbosity_;
│ │ │ │ +
713 void *UMF_Symbolic;
│ │ │ │ +
714 void *UMF_Numeric;
│ │ │ │ +
715 double UMF_Control[UMFPACK_CONTROL];
│ │ │ │ +
716 };
│ │ │ │ +
│ │ │ │ +
717
│ │ │ │ +
718 template<typename T, typename A, int n, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
720 {
│ │ │ │ +
721 enum { value=true};
│ │ │ │ +
722 };
│ │ │ │ +
│ │ │ │ +
723
│ │ │ │ +
724 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
726 {
│ │ │ │ +
727 enum { value = true };
│ │ │ │ +
728 };
│ │ │ │ +
│ │ │ │ +
729
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
731 template<class F,class=void> struct isValidBlock : std::false_type{};
│ │ │ │ +
732 template<class B> struct isValidBlock<B, std::enable_if_t<std::is_same<typename FieldTraits<B>::real_type,double>::value>> : std::true_type {};
│ │ │ │ +
733
│ │ │ │ +
734 template<typename TL, typename M>
│ │ │ │ +
735 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
736 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
│ │ │ │ +
737 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
│ │ │ │ +
738 std::enable_if_t<
│ │ │ │ +
739 isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ +
740 {
│ │ │ │ +
741 int verbose = config.get("verbose", 0);
│ │ │ │ +
742 return std::make_shared<Dune::UMFPack<M>>(mat,verbose);
│ │ │ │ +
743 }
│ │ │ │ +
│ │ │ │ +
744
│ │ │ │ +
745 // second version with SFINAE to validate the template parameters of UMFPack
│ │ │ │ +
746 template<typename TL, typename M>
│ │ │ │ +
747 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
748 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
│ │ │ │ +
749 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ +
750 std::enable_if_t<
│ │ │ │ +
751 !isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ +
752 {
│ │ │ │ +
753 DUNE_THROW(UnsupportedType,
│ │ │ │ +
754 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
│ │ │ │ +
755 }
│ │ │ │ +
│ │ │ │ +
756 };
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
758} // end namespace Dune
│ │ │ │ +
759
│ │ │ │ +
760#endif // HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
761
│ │ │ │ +
762#endif //DUNE_ISTL_UMFPACK_HH
│ │ │ │ + │ │ │ │ +
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
│ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ + │ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Implementations of the inverse operator interface.
│ │ │ │ +
static void numeric(const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:256
│ │ │ │ +
void free()
free allocated space.
Definition umfpack.hh:642
│ │ │ │ +
static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type *ri, std::complex< double > *val, double *x, const double *b, A... args)
Definition umfpack.hh:215
│ │ │ │ +
virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition umfpack.hh:479
│ │ │ │ +
ISTL::Impl::BCCSMatrixInitializer< M, umf_int_type > MatrixInitializer
Type of an associated initializer class.
Definition umfpack.hh:346
│ │ │ │ +
static void report_info(A... args)
Definition umfpack.hh:200
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition umfpack.hh:353
│ │ │ │ +
M matrix_type
Definition umfpack.hh:341
│ │ │ │ +
void setMatrix(const Matrix &matrix)
Initialize data from given matrix.
Definition umfpack.hh:565
│ │ │ │ +
static int save_numeric(A... args)
Definition umfpack.hh:210
│ │ │ │ +
static void numeric(A... args)
Definition umfpack.hh:79
│ │ │ │ +
UMFPack(const Matrix &mat_, const ParameterTree &config)
Construct a solver object from a matrix.
Definition umfpack.hh:403
│ │ │ │ +
static void symbolic(umf_int_type m, umf_int_type n, const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:221
│ │ │ │ +
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
Definition umfpack.hh:737
│ │ │ │ +
static void report_status(A... args)
Definition umfpack.hh:89
│ │ │ │ +
UMFPack(const Matrix &mat_, const char *file, int verbose=0)
Try loading a decomposition from file and do a decomposition if unsuccessful.
Definition umfpack.hh:427
│ │ │ │ +
static int load_numeric(A... args)
Definition umfpack.hh:131
│ │ │ │ +
static void free_numeric(A... args)
Definition umfpack.hh:64
│ │ │ │ +
static void defaults(A... args)
Definition umfpack.hh:175
│ │ │ │ +
typename Impl::UMFPackVectorChooser< M >::range_type range_type
The type of the range of the solver.
Definition umfpack.hh:350
│ │ │ │ +
static int save_numeric(A... args)
Definition umfpack.hh:271
│ │ │ │ +
static void report_info(A... args)
Definition umfpack.hh:84
│ │ │ │ +
static void solve(A... args)
Definition umfpack.hh:99
│ │ │ │ +
UMFPack()
default constructor
Definition umfpack.hh:409
│ │ │ │ + │ │ │ │ +
static int load_numeric(A... args)
Definition umfpack.hh:251
│ │ │ │ +
static void symbolic(A... args)
Definition umfpack.hh:161
│ │ │ │ +
static void numeric(A... args)
Definition umfpack.hh:136
│ │ │ │ +
static void report_info(A... args)
Definition umfpack.hh:141
│ │ │ │ +
static void report_status(A... args)
Definition umfpack.hh:205
│ │ │ │ +
static void free_symbolic(A... args)
Definition umfpack.hh:69
│ │ │ │ +
static void free_symbolic(A... args)
Definition umfpack.hh:185
│ │ │ │ +
static void numeric(const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:195
│ │ │ │ +
void setSubMatrix(const Matrix &_mat, const S &rowIndexSet)
Definition umfpack.hh:584
│ │ │ │ +
static void solve(A... args)
Definition umfpack.hh:156
│ │ │ │ +
static void free_numeric(A... args)
Definition umfpack.hh:180
│ │ │ │ +
void apply(T *x, T *b)
additional apply method with c-arrays in analogy to superlu
Definition umfpack.hh:520
│ │ │ │ + │ │ │ │ +
static constexpr bool valid
Definition umfpack.hh:50
│ │ │ │ +
void setVerbosity(int v)
sets the verbosity level for the UMFPack solver
Definition umfpack.hh:608
│ │ │ │ +
UMFPack(const char *file, int verbose=0)
try loading a decomposition from file
Definition umfpack.hh:454
│ │ │ │ +
static void defaults(A... args)
Definition umfpack.hh:236
│ │ │ │ +
static int save_numeric(A... args)
Definition umfpack.hh:151
│ │ │ │ +
static int load_numeric(A... args)
Definition umfpack.hh:74
│ │ │ │ +
static void symbolic(A... args)
Definition umfpack.hh:104
│ │ │ │ +
virtual ~UMFPack()
Definition umfpack.hh:470
│ │ │ │ +
const char * name()
Definition umfpack.hh:653
│ │ │ │ +
ISTL::Impl::BCCSMatrix< typename Matrix::field_type, umf_int_type > UMFPackMatrix
The corresponding UMFPack matrix type.
Definition umfpack.hh:344
│ │ │ │ +
static void free_symbolic(A... args)
Definition umfpack.hh:126
│ │ │ │ +
void saveDecomposition(const char *file)
saves a decomposition to a file
Definition umfpack.hh:557
│ │ │ │ +
UMFPackMatrix & getInternalMatrix()
Return the column compress matrix from UMFPack.
Definition umfpack.hh:633
│ │ │ │ +
static void free_numeric(A... args)
Definition umfpack.hh:121
│ │ │ │ +
static void free_numeric(A... args)
Definition umfpack.hh:241
│ │ │ │ +
static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type *ri, std::complex< double > *val, double *x, const double *b, A... args)
Definition umfpack.hh:276
│ │ │ │ +
static void report_status(A... args)
Definition umfpack.hh:146
│ │ │ │ +
typename Impl::UMFPackVectorChooser< M >::domain_type domain_type
The type of the domain of the solver.
Definition umfpack.hh:348
│ │ │ │ +
UMFPack(const Matrix &matrix, int verbose=0)
Construct a solver object from a matrix.
Definition umfpack.hh:366
│ │ │ │ +
static int save_numeric(A... args)
Definition umfpack.hh:94
│ │ │ │ +
static void report_info(A... args)
Definition umfpack.hh:261
│ │ │ │ +
virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
apply inverse operator, with given convergence criteria.
Definition umfpack.hh:510
│ │ │ │ +
void setOption(unsigned int option, double value)
Set UMFPack-specific options.
Definition umfpack.hh:546
│ │ │ │ +
static void defaults(A... args)
Definition umfpack.hh:59
│ │ │ │ +
M Matrix
The matrix type.
Definition umfpack.hh:340
│ │ │ │ +
static void symbolic(umf_int_type m, std::size_t n, const umf_int_type *cs, const umf_int_type *ri, const double *val, A... args)
Definition umfpack.hh:282
│ │ │ │ +
static void free_symbolic(A... args)
Definition umfpack.hh:246
│ │ │ │ +
static void defaults(A... args)
Definition umfpack.hh:116
│ │ │ │ +
std::conditional_t<(sizeof(typename M::size_type)==8), int64_t, int32_t > umf_int_type
Definition umfpack.hh:342
│ │ │ │ +
static int load_numeric(A... args)
Definition umfpack.hh:190
│ │ │ │ +
UMFPack(const Matrix &matrix, int verbose, bool)
Constructor for compatibility with SuperLU standard constructor.
Definition umfpack.hh:384
│ │ │ │ +
void * getFactorization()
Return the matrix factorization.
Definition umfpack.hh:624
│ │ │ │ +
static void report_status(A... args)
Definition umfpack.hh:266
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
Definition matrixutils.hh:211
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ +
Definition overlappingschwarz.hh:694
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
double elapsed
Elapsed time in seconds.
Definition solver.hh:82
│ │ │ │ +
int iterations
Number of iterations.
Definition solver.hh:67
│ │ │ │ +
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
Definition solverregistry.hh:77
│ │ │ │ +
Definition solvertype.hh:16
│ │ │ │ +
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
│ │ │ │ +
Definition solvertype.hh:30
│ │ │ │ +
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
│ │ │ │ +
Definition umfpack.hh:49
│ │ │ │ +
The UMFPack direct sparse solver.
Definition umfpack.hh:335
│ │ │ │ +
Definition umfpack.hh:730
│ │ │ │ +
Definition umfpack.hh:731
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,99 +1,1059 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -registry.hh │ │ │ │ │ +umfpack.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH │ │ │ │ │ -4#define DUNE_ISTL_COMMON_REGISTRY_HH │ │ │ │ │ -5 │ │ │ │ │ -6#include │ │ │ │ │ -7#include │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include "_c_o_u_n_t_e_r_._h_h" │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -_1_8#define DUNE_REGISTRY_PUT(Tag, id, ...) \ │ │ │ │ │ -19 namespace { \ │ │ │ │ │ -20 template<> \ │ │ │ │ │ -21 struct Registry \ │ │ │ │ │ -22 { \ │ │ │ │ │ -23 static auto getCreator() \ │ │ │ │ │ -24 { \ │ │ │ │ │ -25 return __VA_ARGS__; \ │ │ │ │ │ -26 } \ │ │ │ │ │ -27 static std::string name() { return id; } \ │ │ │ │ │ -28 }; \ │ │ │ │ │ -29 } \ │ │ │ │ │ -30 DUNE_INC_COUNTER(Tag) │ │ │ │ │ -31 │ │ │ │ │ -32 │ │ │ │ │ -33namespace _D_u_n_e { │ │ │ │ │ -34 namespace { │ │ │ │ │ -35 template │ │ │ │ │ -36 struct Registry; │ │ │ │ │ -37 } │ │ │ │ │ -38 │ │ │ │ │ -39 namespace { │ │ │ │ │ -40 template class Base, class V, class Tag, typename... Args> │ │ │ │ │ -41 auto registryGet(Tag , std::string name, Args... args) │ │ │ │ │ -42 { │ │ │ │ │ -43 constexpr auto count = _D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag); │ │ │ │ │ -44 std::shared_ptr > result; │ │ │ │ │ -45 Dune::Hybrid::forEach(std::make_index_sequence{}, │ │ │ │ │ -46 [&](auto index) { │ │ │ │ │ -47 using Reg = Registry; │ │ │ │ │ -48 if(!result && Reg::name() == name) { │ │ │ │ │ -49 result = Reg::getCreator()(Dune::MetaType{}, args...); │ │ │ │ │ -50 } │ │ │ │ │ -51 }); │ │ │ │ │ -52 return result; │ │ │ │ │ -53 } │ │ │ │ │ -54 │ │ │ │ │ -55 /* │ │ │ │ │ -56 Register all creators from the registry in the Parameterizedobjectfactory An │ │ │ │ │ -57 object of V is passed in the creator ans should be used to determine the │ │ │ │ │ -58 template arguments. │ │ │ │ │ -59 */ │ │ │ │ │ -60 template │ │ │ │ │ -61 int addRegistryToFactory(Dune::ParameterizedObjectFactory& factory, │ │ │ │ │ -62 Tag){ │ │ │ │ │ -63 constexpr auto count = _D_U_N_E___G_E_T___C_O_U_N_T_E_R(Tag); │ │ │ │ │ -64 Dune::Hybrid::forEach(std::make_index_sequence{}, │ │ │ │ │ -65 [&](auto index) { │ │ │ │ │ -66 // we first get the generic lambda │ │ │ │ │ -67 // and later specialize it with given parameters. │ │ │ │ │ -68 // doing all at once lead to an ICE woth g++-6 │ │ │ │ │ -69 using Reg = Registry; │ │ │ │ │ -70 auto genericcreator = Reg::getCreator(); │ │ │ │ │ -71 factory.define(Reg::name(), [genericcreator](Args... args){ │ │ │ │ │ -72 return genericcreator(V{}, args...); │ │ │ │ │ -73 }); │ │ │ │ │ -74 }); │ │ │ │ │ -75 return count; │ │ │ │ │ -76 } │ │ │ │ │ -77 } // end anonymous namespace │ │ │ │ │ -78} // end namespace Dune │ │ │ │ │ -79 │ │ │ │ │ -80#endif // DUNE_ISTL_COMMON_REGISTRY_HH │ │ │ │ │ -_c_o_u_n_t_e_r_._h_h │ │ │ │ │ -_D_U_N_E___G_E_T___C_O_U_N_T_E_R │ │ │ │ │ -#define DUNE_GET_COUNTER(Tag) │ │ │ │ │ -DDeeffiinniittiioonn counter.hh:17 │ │ │ │ │ +3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +5#ifndef DUNE_ISTL_UMFPACK_HH │ │ │ │ │ +6#define DUNE_ISTL_UMFPACK_HH │ │ │ │ │ +7 │ │ │ │ │ +8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN │ │ │ │ │ +9 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include<_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +19#include<_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +20#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +21#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ +23 │ │ │ │ │ +24 │ │ │ │ │ +25 │ │ │ │ │ +26namespace _D_u_n_e { │ │ │ │ │ +38 // FORWARD DECLARATIONS │ │ │ │ │ +39 template │ │ │ │ │ +40 class SeqOverlappingSchwarz; │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +43 struct SeqOverlappingSchwarzAssemblerHelper; │ │ │ │ │ +44 │ │ │ │ │ +45 // wrapper class for C-Function Calls in the backend. Choose the right │ │ │ │ │ +function namespace │ │ │ │ │ +46 // depending on the template parameter used. │ │ │ │ │ +47template │ │ │ │ │ +_4_8 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ +49 { │ │ │ │ │ +_5_0 static constexpr bool _v_a_l_i_d = false ; │ │ │ │ │ +51 }; │ │ │ │ │ +52 │ │ │ │ │ +53 template<> │ │ │ │ │ +_5_4 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ +55 { │ │ │ │ │ +_5_6 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ +57 │ │ │ │ │ +58 template │ │ │ │ │ +_5_9 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ +60 { │ │ │ │ │ +61 umfpack_dl_defaults(args...); │ │ │ │ │ +62 } │ │ │ │ │ +63 template │ │ │ │ │ +_6_4 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +65 { │ │ │ │ │ +66 umfpack_dl_free_numeric(args...); │ │ │ │ │ +67 } │ │ │ │ │ +68 template │ │ │ │ │ +_6_9 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ +70 { │ │ │ │ │ +71 umfpack_dl_free_symbolic(args...); │ │ │ │ │ +72 } │ │ │ │ │ +73 template │ │ │ │ │ +_7_4 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +75 { │ │ │ │ │ +76 return umfpack_dl_load_numeric(args...); │ │ │ │ │ +77 } │ │ │ │ │ +78 template │ │ │ │ │ +_7_9 static void _n_u_m_e_r_i_c(A... args) │ │ │ │ │ +80 { │ │ │ │ │ +81 umfpack_dl_numeric(args...); │ │ │ │ │ +82 } │ │ │ │ │ +83 template │ │ │ │ │ +_8_4 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ +85 { │ │ │ │ │ +86 umfpack_dl_report_info(args...); │ │ │ │ │ +87 } │ │ │ │ │ +88 template │ │ │ │ │ +_8_9 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ +90 { │ │ │ │ │ +91 umfpack_dl_report_status(args...); │ │ │ │ │ +92 } │ │ │ │ │ +93 template │ │ │ │ │ +_9_4 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +95 { │ │ │ │ │ +96 return umfpack_dl_save_numeric(args...); │ │ │ │ │ +97 } │ │ │ │ │ +98 template │ │ │ │ │ +_9_9 static void _s_o_l_v_e(A... args) │ │ │ │ │ +100 { │ │ │ │ │ +101 umfpack_dl_solve(args...); │ │ │ │ │ +102 } │ │ │ │ │ +103 template │ │ │ │ │ +_1_0_4 static void _s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ +105 { │ │ │ │ │ +106 umfpack_dl_symbolic(args...); │ │ │ │ │ +107 } │ │ │ │ │ +108 }; │ │ │ │ │ +109 │ │ │ │ │ +110 template<> │ │ │ │ │ +_1_1_1 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ +112 { │ │ │ │ │ +_1_1_3 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ +114 │ │ │ │ │ +115 template │ │ │ │ │ +_1_1_6 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ +117 { │ │ │ │ │ +118 umfpack_di_defaults(args...); │ │ │ │ │ +119 } │ │ │ │ │ +120 template │ │ │ │ │ +_1_2_1 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +122 { │ │ │ │ │ +123 umfpack_di_free_numeric(args...); │ │ │ │ │ +124 } │ │ │ │ │ +125 template │ │ │ │ │ +_1_2_6 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ +127 { │ │ │ │ │ +128 umfpack_di_free_symbolic(args...); │ │ │ │ │ +129 } │ │ │ │ │ +130 template │ │ │ │ │ +_1_3_1 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +132 { │ │ │ │ │ +133 return umfpack_di_load_numeric(args...); │ │ │ │ │ +134 } │ │ │ │ │ +135 template │ │ │ │ │ +_1_3_6 static void _n_u_m_e_r_i_c(A... args) │ │ │ │ │ +137 { │ │ │ │ │ +138 umfpack_di_numeric(args...); │ │ │ │ │ +139 } │ │ │ │ │ +140 template │ │ │ │ │ +_1_4_1 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ +142 { │ │ │ │ │ +143 umfpack_di_report_info(args...); │ │ │ │ │ +144 } │ │ │ │ │ +145 template │ │ │ │ │ +_1_4_6 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ +147 { │ │ │ │ │ +148 umfpack_di_report_status(args...); │ │ │ │ │ +149 } │ │ │ │ │ +150 template │ │ │ │ │ +_1_5_1 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +152 { │ │ │ │ │ +153 return umfpack_di_save_numeric(args...); │ │ │ │ │ +154 } │ │ │ │ │ +155 template │ │ │ │ │ +_1_5_6 static void _s_o_l_v_e(A... args) │ │ │ │ │ +157 { │ │ │ │ │ +158 umfpack_di_solve(args...); │ │ │ │ │ +159 } │ │ │ │ │ +160 template │ │ │ │ │ +_1_6_1 static void _s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ +162 { │ │ │ │ │ +163 umfpack_di_symbolic(args...); │ │ │ │ │ +164 } │ │ │ │ │ +165 }; │ │ │ │ │ +166 │ │ │ │ │ +167 template<> │ │ │ │ │ +_1_6_8 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r<_s_t_d::complex, std::true_type> │ │ │ │ │ +169 { │ │ │ │ │ +_1_7_0 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ +171 │ │ │ │ │ +_1_7_2 using _u_m_f___i_n_t___t_y_p_e = int64_t; │ │ │ │ │ +173 │ │ │ │ │ +174 template │ │ │ │ │ +_1_7_5 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ +176 { │ │ │ │ │ +177 umfpack_zl_defaults(args...); │ │ │ │ │ +178 } │ │ │ │ │ +179 template │ │ │ │ │ +_1_8_0 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +181 { │ │ │ │ │ +182 umfpack_zl_free_numeric(args...); │ │ │ │ │ +183 } │ │ │ │ │ +184 template │ │ │ │ │ +_1_8_5 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ +186 { │ │ │ │ │ +187 umfpack_zl_free_symbolic(args...); │ │ │ │ │ +188 } │ │ │ │ │ +189 template │ │ │ │ │ +_1_9_0 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +191 { │ │ │ │ │ +192 return umfpack_zl_load_numeric(args...); │ │ │ │ │ +193 } │ │ │ │ │ +194 template │ │ │ │ │ +_1_9_5 static void _n_u_m_e_r_i_c(const _u_m_f___i_n_t___t_y_p_e* cs, const _u_m_f___i_n_t___t_y_p_e* ri, const │ │ │ │ │ +double* val, A... args) │ │ │ │ │ +196 { │ │ │ │ │ +197 umfpack_zl_numeric(cs,ri,val,NULL,args...); │ │ │ │ │ +198 } │ │ │ │ │ +199 template │ │ │ │ │ +_2_0_0 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ +201 { │ │ │ │ │ +202 umfpack_zl_report_info(args...); │ │ │ │ │ +203 } │ │ │ │ │ +204 template │ │ │ │ │ +_2_0_5 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ +206 { │ │ │ │ │ +207 umfpack_zl_report_status(args...); │ │ │ │ │ +208 } │ │ │ │ │ +209 template │ │ │ │ │ +_2_1_0 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +211 { │ │ │ │ │ +212 return umfpack_zl_save_numeric(args...); │ │ │ │ │ +213 } │ │ │ │ │ +214 template │ │ │ │ │ +_2_1_5 static void _s_o_l_v_e(_u_m_f___i_n_t___t_y_p_e m, const _u_m_f___i_n_t___t_y_p_e* cs, const │ │ │ │ │ +_u_m_f___i_n_t___t_y_p_e* ri, std::complex* val, double* x, const double* b,A... │ │ │ │ │ +args) │ │ │ │ │ +216 { │ │ │ │ │ +217 const double* cval = reinterpret_cast(val); │ │ │ │ │ +218 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...); │ │ │ │ │ +219 } │ │ │ │ │ +220 template │ │ │ │ │ +_2_2_1 static void _s_y_m_b_o_l_i_c(_u_m_f___i_n_t___t_y_p_e m, _u_m_f___i_n_t___t_y_p_e n, const _u_m_f___i_n_t___t_y_p_e* │ │ │ │ │ +cs, const _u_m_f___i_n_t___t_y_p_e* ri, const double* val, A... args) │ │ │ │ │ +222 { │ │ │ │ │ +223 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...); │ │ │ │ │ +224 } │ │ │ │ │ +225 }; │ │ │ │ │ +226 │ │ │ │ │ +227 │ │ │ │ │ +228 template<> │ │ │ │ │ +_2_2_9 struct _U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r<_s_t_d::complex, std::false_type> │ │ │ │ │ +230 { │ │ │ │ │ +_2_3_1 static constexpr bool _v_a_l_i_d = true ; │ │ │ │ │ +232 │ │ │ │ │ +_2_3_3 using _u_m_f___i_n_t___t_y_p_e = int32_t; │ │ │ │ │ +234 │ │ │ │ │ +235 template │ │ │ │ │ +_2_3_6 static void _d_e_f_a_u_l_t_s(A... args) │ │ │ │ │ +237 { │ │ │ │ │ +238 umfpack_zi_defaults(args...); │ │ │ │ │ +239 } │ │ │ │ │ +240 template │ │ │ │ │ +_2_4_1 static void _f_r_e_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +242 { │ │ │ │ │ +243 umfpack_zi_free_numeric(args...); │ │ │ │ │ +244 } │ │ │ │ │ +245 template │ │ │ │ │ +_2_4_6 static void _f_r_e_e___s_y_m_b_o_l_i_c(A... args) │ │ │ │ │ +247 { │ │ │ │ │ +248 umfpack_zi_free_symbolic(args...); │ │ │ │ │ +249 } │ │ │ │ │ +250 template │ │ │ │ │ +_2_5_1 static int _l_o_a_d___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +252 { │ │ │ │ │ +253 return umfpack_zi_load_numeric(args...); │ │ │ │ │ +254 } │ │ │ │ │ +255 template │ │ │ │ │ +_2_5_6 static void _n_u_m_e_r_i_c(const _u_m_f___i_n_t___t_y_p_e* cs, const _u_m_f___i_n_t___t_y_p_e* ri, const │ │ │ │ │ +double* val, A... args) │ │ │ │ │ +257 { │ │ │ │ │ +258 umfpack_zi_numeric(cs,ri,val,NULL,args...); │ │ │ │ │ +259 } │ │ │ │ │ +260 template │ │ │ │ │ +_2_6_1 static void _r_e_p_o_r_t___i_n_f_o(A... args) │ │ │ │ │ +262 { │ │ │ │ │ +263 umfpack_zi_report_info(args...); │ │ │ │ │ +264 } │ │ │ │ │ +265 template │ │ │ │ │ +_2_6_6 static void _r_e_p_o_r_t___s_t_a_t_u_s(A... args) │ │ │ │ │ +267 { │ │ │ │ │ +268 umfpack_zi_report_status(args...); │ │ │ │ │ +269 } │ │ │ │ │ +270 template │ │ │ │ │ +_2_7_1 static int _s_a_v_e___n_u_m_e_r_i_c(A... args) │ │ │ │ │ +272 { │ │ │ │ │ +273 return umfpack_zi_save_numeric(args...); │ │ │ │ │ +274 } │ │ │ │ │ +275 template │ │ │ │ │ +_2_7_6 static void _s_o_l_v_e(_u_m_f___i_n_t___t_y_p_e m, const _u_m_f___i_n_t___t_y_p_e* cs, const │ │ │ │ │ +_u_m_f___i_n_t___t_y_p_e* ri, std::complex* val, double* x, const double* b,A... │ │ │ │ │ +args) │ │ │ │ │ +277 { │ │ │ │ │ +278 const double* cval = reinterpret_cast(val); │ │ │ │ │ +279 umfpack_zi_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...); │ │ │ │ │ +280 } │ │ │ │ │ +281 template │ │ │ │ │ +_2_8_2 static void _s_y_m_b_o_l_i_c(_u_m_f___i_n_t___t_y_p_e m, std::size_t n, const _u_m_f___i_n_t___t_y_p_e* cs, │ │ │ │ │ +const _u_m_f___i_n_t___t_y_p_e* ri, const double* val, A... args) │ │ │ │ │ +283 { │ │ │ │ │ +284 umfpack_zi_symbolic(m,n,cs,ri,val,NULL,args...); │ │ │ │ │ +285 } │ │ │ │ │ +286 }; │ │ │ │ │ +287 │ │ │ │ │ +288 namespace Impl │ │ │ │ │ +289 { │ │ │ │ │ +290 template │ │ │ │ │ +291 struct UMFPackVectorChooser │ │ │ │ │ +292 {}; │ │ │ │ │ +293 │ │ │ │ │ +294 template │ │ │ │ │ +295 struct UMFPackVectorChooser,A > > │ │ │ │ │ +296 { │ │ │ │ │ +298 using domain_type = BlockVector< │ │ │ │ │ +299 FieldVector, │ │ │ │ │ +300 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ +>; │ │ │ │ │ +302 using range_type = BlockVector< │ │ │ │ │ +303 FieldVector, │ │ │ │ │ +304 typename std::allocator_traits::template rebind_alloc > │ │ │ │ │ +>; │ │ │ │ │ +305 }; │ │ │ │ │ +306 │ │ │ │ │ +307 template │ │ │ │ │ +308 struct UMFPackVectorChooser > │ │ │ │ │ +309 { │ │ │ │ │ +311 using domain_type = BlockVector; │ │ │ │ │ +313 using range_type = BlockVector; │ │ │ │ │ +314 }; │ │ │ │ │ +315 } │ │ │ │ │ +316 │ │ │ │ │ +330 template │ │ │ │ │ +_3_3_1 class _U_M_F_P_a_c_k │ │ │ │ │ +332 : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< │ │ │ │ │ +333 typename Impl::UMFPackVectorChooser::domain_type, │ │ │ │ │ +334 typename Impl::UMFPackVectorChooser::range_type > │ │ │ │ │ +335 { │ │ │ │ │ +336 using T = typename M::field_type; │ │ │ │ │ +337 │ │ │ │ │ +338 public: │ │ │ │ │ +_3_4_0 using _M_a_t_r_i_x = M; │ │ │ │ │ +_3_4_1 using _m_a_t_r_i_x___t_y_p_e = M; │ │ │ │ │ +_3_4_2 using _u_m_f___i_n_t___t_y_p_e = std::conditional_t<(sizeof(typename M::size_type) == │ │ │ │ │ +8), int64_t, int32_t>; │ │ │ │ │ +_3_4_4 typedef ISTL::Impl::BCCSMatrix │ │ │ │ │ +_U_M_F_P_a_c_k_M_a_t_r_i_x; │ │ │ │ │ +_3_4_6 typedef ISTL::Impl::BCCSMatrixInitializer │ │ │ │ │ +_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ +_3_4_8 using _d_o_m_a_i_n___t_y_p_e = typename Impl::UMFPackVectorChooser::domain_type; │ │ │ │ │ +_3_5_0 using _r_a_n_g_e___t_y_p_e = typename Impl::UMFPackVectorChooser::range_type; │ │ │ │ │ +351 │ │ │ │ │ +_3_5_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +354 { │ │ │ │ │ +355 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +356 } │ │ │ │ │ +357 │ │ │ │ │ +_3_6_6 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& matrix, int verbose=0) : matrixIsLoaded_(false) │ │ │ │ │ +367 { │ │ │ │ │ +368 //check whether T is a supported type │ │ │ │ │ +369 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ +370 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +371 Caller::defaults(UMF_Control); │ │ │ │ │ +372 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ +373 _s_e_t_M_a_t_r_i_x(matrix); │ │ │ │ │ +374 } │ │ │ │ │ +375 │ │ │ │ │ +_3_8_4 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& matrix, int verbose, bool) : matrixIsLoaded_(false) │ │ │ │ │ +385 { │ │ │ │ │ +386 //check whether T is a supported type │ │ │ │ │ +387 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ +388 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +389 Caller::defaults(UMF_Control); │ │ │ │ │ +390 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ +391 _s_e_t_M_a_t_r_i_x(matrix); │ │ │ │ │ +392 } │ │ │ │ │ +393 │ │ │ │ │ +_4_0_3 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& mat_, const ParameterTree& config) │ │ │ │ │ +404 : _U_M_F_P_a_c_k(mat_, config._g_e_t("verbose", 0)) │ │ │ │ │ +405 {} │ │ │ │ │ +406 │ │ │ │ │ +_4_0_9 _U_M_F_P_a_c_k() : matrixIsLoaded_(false), verbosity_(0) │ │ │ │ │ +410 { │ │ │ │ │ +411 //check whether T is a supported type │ │ │ │ │ +412 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ +413 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +414 Caller::defaults(UMF_Control); │ │ │ │ │ +415 } │ │ │ │ │ +416 │ │ │ │ │ +_4_2_7 _U_M_F_P_a_c_k(const _M_a_t_r_i_x& mat_, const char* file, int verbose=0) │ │ │ │ │ +428 { │ │ │ │ │ +429 //check whether T is a supported type │ │ │ │ │ +430 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ +431 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +432 Caller::defaults(UMF_Control); │ │ │ │ │ +433 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ +434 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file)); │ │ │ │ │ +435 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode == │ │ │ │ │ +UMFPACK_ERROR_file_IO)) │ │ │ │ │ +436 { │ │ │ │ │ +437 matrixIsLoaded_ = false; │ │ │ │ │ +438 _s_e_t_M_a_t_r_i_x(mat_); │ │ │ │ │ +439 _s_a_v_e_D_e_c_o_m_p_o_s_i_t_i_o_n(file); │ │ │ │ │ +440 } │ │ │ │ │ +441 else │ │ │ │ │ +442 { │ │ │ │ │ +443 matrixIsLoaded_ = true; │ │ │ │ │ +444 std::cout << "UMFPack decomposition successfully loaded from " << file << │ │ │ │ │ +std::endl; │ │ │ │ │ +445 } │ │ │ │ │ +446 } │ │ │ │ │ +447 │ │ │ │ │ +_4_5_4 _U_M_F_P_a_c_k(const char* file, int verbose=0) │ │ │ │ │ +455 { │ │ │ │ │ +456 //check whether T is a supported type │ │ │ │ │ +457 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ +458 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +459 Caller::defaults(UMF_Control); │ │ │ │ │ +460 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file)); │ │ │ │ │ +461 if (errcode == UMFPACK_ERROR_out_of_memory) │ │ │ │ │ +462 DUNE_THROW(Dune::Exception, "ran out of memory while loading UMFPack │ │ │ │ │ +decomposition"); │ │ │ │ │ +463 if (errcode == UMFPACK_ERROR_file_IO) │ │ │ │ │ +464 DUNE_THROW(Dune::Exception, "IO error while loading UMFPack │ │ │ │ │ +decomposition"); │ │ │ │ │ +465 matrixIsLoaded_ = true; │ │ │ │ │ +466 std::cout << "UMFPack decomposition successfully loaded from " << file << │ │ │ │ │ +std::endl; │ │ │ │ │ +467 _s_e_t_V_e_r_b_o_s_i_t_y(verbose); │ │ │ │ │ +468 } │ │ │ │ │ +469 │ │ │ │ │ +_4_7_0 virtual _~_U_M_F_P_a_c_k() │ │ │ │ │ +471 { │ │ │ │ │ +472 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ +473 _f_r_e_e(); │ │ │ │ │ +474 } │ │ │ │ │ +475 │ │ │ │ │ +_4_7_9 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ +res) │ │ │ │ │ +480 { │ │ │ │ │ +481 if (umfpackMatrix_.N() != b.dim()) │ │ │ │ │ +482 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r, "Size of right-hand-side vector b does not │ │ │ │ │ +match the number of matrix rows!"); │ │ │ │ │ +483 if (umfpackMatrix_.M() != x.dim()) │ │ │ │ │ +484 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r, "Size of solution vector x does not match the │ │ │ │ │ +number of matrix columns!"); │ │ │ │ │ +485 if (b.size() == 0) │ │ │ │ │ +486 return; │ │ │ │ │ +487 │ │ │ │ │ +488 double UMF_Apply_Info[UMFPACK_INFO]; │ │ │ │ │ +489 Caller::solve(UMFPACK_A, │ │ │ │ │ +490 umfpackMatrix_.getColStart(), │ │ │ │ │ +491 umfpackMatrix_.getRowIndex(), │ │ │ │ │ +492 umfpackMatrix_.getValues(), │ │ │ │ │ +493 reinterpret_cast(&x[0]), │ │ │ │ │ +494 reinterpret_cast(&b[0]), │ │ │ │ │ +495 UMF_Numeric, │ │ │ │ │ +496 UMF_Control, │ │ │ │ │ +497 UMF_Apply_Info); │ │ │ │ │ +498 │ │ │ │ │ +499 //this is a direct solver │ │ │ │ │ +500 res._i_t_e_r_a_t_i_o_n_s = 1; │ │ │ │ │ +501 res._c_o_n_v_e_r_g_e_d = true; │ │ │ │ │ +502 res._e_l_a_p_s_e_d = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME]; │ │ │ │ │ +503 │ │ │ │ │ +504 printOnApply(UMF_Apply_Info); │ │ │ │ │ +505 } │ │ │ │ │ +506 │ │ │ │ │ +_5_1_0 virtual void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, [[maybe_unused]] double │ │ │ │ │ +reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +511 { │ │ │ │ │ +512 _a_p_p_l_y(x,b,res); │ │ │ │ │ +513 } │ │ │ │ │ +514 │ │ │ │ │ +_5_2_0 void _a_p_p_l_y(T* x, T* b) │ │ │ │ │ +521 { │ │ │ │ │ +522 double UMF_Apply_Info[UMFPACK_INFO]; │ │ │ │ │ +523 Caller::solve(UMFPACK_A, │ │ │ │ │ +524 umfpackMatrix_.getColStart(), │ │ │ │ │ +525 umfpackMatrix_.getRowIndex(), │ │ │ │ │ +526 umfpackMatrix_.getValues(), │ │ │ │ │ +527 x, │ │ │ │ │ +528 b, │ │ │ │ │ +529 UMF_Numeric, │ │ │ │ │ +530 UMF_Control, │ │ │ │ │ +531 UMF_Apply_Info); │ │ │ │ │ +532 printOnApply(UMF_Apply_Info); │ │ │ │ │ +533 } │ │ │ │ │ +534 │ │ │ │ │ +_5_4_6 void _s_e_t_O_p_t_i_o_n(unsigned int option, double value) │ │ │ │ │ +547 { │ │ │ │ │ +548 if (option >= UMFPACK_CONTROL) │ │ │ │ │ +549 DUNE_THROW(RangeError, "Requested non-existing UMFPack option"); │ │ │ │ │ +550 │ │ │ │ │ +551 UMF_Control[option] = value; │ │ │ │ │ +552 } │ │ │ │ │ +553 │ │ │ │ │ +_5_5_7 void _s_a_v_e_D_e_c_o_m_p_o_s_i_t_i_o_n(const char* file) │ │ │ │ │ +558 { │ │ │ │ │ +559 int errcode = Caller::save_numeric(UMF_Numeric, const_cast(file)); │ │ │ │ │ +560 if (errcode != UMFPACK_OK) │ │ │ │ │ +561 DUNE_THROW(Dune::Exception,"IO ERROR while trying to save UMFPack │ │ │ │ │ +decomposition"); │ │ │ │ │ +562 } │ │ │ │ │ +563 │ │ │ │ │ +_5_6_5 void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& matrix) │ │ │ │ │ +566 { │ │ │ │ │ +567 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ +568 _f_r_e_e(); │ │ │ │ │ +569 if (matrix.N() == 0 or matrix.M() == 0) │ │ │ │ │ +570 return; │ │ │ │ │ +571 │ │ │ │ │ +572 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != │ │ │ │ │ +0) │ │ │ │ │ +573 umfpackMatrix_.free(); │ │ │ │ │ +574 umfpackMatrix_.setSize(_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(matrix), │ │ │ │ │ +575 _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(matrix)); │ │ │ │ │ +576 ISTL::Impl::BCCSMatrixInitializer initializer │ │ │ │ │ +(umfpackMatrix_); │ │ │ │ │ +577 │ │ │ │ │ +578 copyToBCCSMatrix(initializer, matrix); │ │ │ │ │ +579 │ │ │ │ │ +580 decompose(); │ │ │ │ │ +581 } │ │ │ │ │ +582 │ │ │ │ │ +583 template │ │ │ │ │ +_5_8_4 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& _mat, const S& rowIndexSet) │ │ │ │ │ +585 { │ │ │ │ │ +586 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ +587 _f_r_e_e(); │ │ │ │ │ +588 │ │ │ │ │ +589 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != │ │ │ │ │ +0) │ │ │ │ │ +590 umfpackMatrix_.free(); │ │ │ │ │ +591 │ │ │ │ │ +592 umfpackMatrix_.setSize(rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m │ │ │ │ │ +(_mat) / _mat.N(), │ │ │ │ │ +593 rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_mat) / _mat.M()); │ │ │ │ │ +594 ISTL::Impl::BCCSMatrixInitializer initializer │ │ │ │ │ +(umfpackMatrix_); │ │ │ │ │ +595 │ │ │ │ │ +596 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_M_a_t_r_i_x,std:: │ │ │ │ │ +set >(_mat,rowIndexSet)); │ │ │ │ │ +597 │ │ │ │ │ +598 decompose(); │ │ │ │ │ +599 } │ │ │ │ │ +600 │ │ │ │ │ +_6_0_8 void _s_e_t_V_e_r_b_o_s_i_t_y(int v) │ │ │ │ │ +609 { │ │ │ │ │ +610 verbosity_ = v; │ │ │ │ │ +611 // set the verbosity level in UMFPack │ │ │ │ │ +612 if (verbosity_ == 0) │ │ │ │ │ +613 UMF_Control[UMFPACK_PRL] = 1; │ │ │ │ │ +614 if (verbosity_ == 1) │ │ │ │ │ +615 UMF_Control[UMFPACK_PRL] = 2; │ │ │ │ │ +616 if (verbosity_ == 2) │ │ │ │ │ +617 UMF_Control[UMFPACK_PRL] = 4; │ │ │ │ │ +618 } │ │ │ │ │ +619 │ │ │ │ │ +_6_2_4 void* _g_e_t_F_a_c_t_o_r_i_z_a_t_i_o_n() │ │ │ │ │ +625 { │ │ │ │ │ +626 return UMF_Numeric; │ │ │ │ │ +627 } │ │ │ │ │ +628 │ │ │ │ │ +_6_3_3 _U_M_F_P_a_c_k_M_a_t_r_i_x& _g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x() │ │ │ │ │ +634 { │ │ │ │ │ +635 return umfpackMatrix_; │ │ │ │ │ +636 } │ │ │ │ │ +637 │ │ │ │ │ +_6_4_2 void _f_r_e_e() │ │ │ │ │ +643 { │ │ │ │ │ +644 if (!matrixIsLoaded_) │ │ │ │ │ +645 { │ │ │ │ │ +646 Caller::free_symbolic(&UMF_Symbolic); │ │ │ │ │ +647 umfpackMatrix_.free(); │ │ │ │ │ +648 } │ │ │ │ │ +649 Caller::free_numeric(&UMF_Numeric); │ │ │ │ │ +650 matrixIsLoaded_ = false; │ │ │ │ │ +651 } │ │ │ │ │ +652 │ │ │ │ │ +_6_5_3 const char* _n_a_m_e() { return "UMFPACK"; } │ │ │ │ │ +654 │ │ │ │ │ +655 private: │ │ │ │ │ +656 typedef typename _D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r> Caller; │ │ │ │ │ +657 │ │ │ │ │ +658 template │ │ │ │ │ +_6_5_9 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ +660 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_U_M_F_P_a_c_k<_M_a_t_r_i_x>,true>; │ │ │ │ │ +661 │ │ │ │ │ +663 void decompose() │ │ │ │ │ +664 { │ │ │ │ │ +665 double UMF_Decomposition_Info[UMFPACK_INFO]; │ │ │ │ │ +666 Caller::symbolic(static_cast<_u_m_f___i_n_t___t_y_p_e>(umfpackMatrix_.N()), │ │ │ │ │ +667 static_cast<_u_m_f___i_n_t___t_y_p_e>(umfpackMatrix_.N()), │ │ │ │ │ +668 umfpackMatrix_.getColStart(), │ │ │ │ │ +669 umfpackMatrix_.getRowIndex(), │ │ │ │ │ +670 reinterpret_cast(umfpackMatrix_.getValues()), │ │ │ │ │ +671 &UMF_Symbolic, │ │ │ │ │ +672 UMF_Control, │ │ │ │ │ +673 UMF_Decomposition_Info); │ │ │ │ │ +674 Caller::numeric(umfpackMatrix_.getColStart(), │ │ │ │ │ +675 umfpackMatrix_.getRowIndex(), │ │ │ │ │ +676 reinterpret_cast(umfpackMatrix_.getValues()), │ │ │ │ │ +677 UMF_Symbolic, │ │ │ │ │ +678 &UMF_Numeric, │ │ │ │ │ +679 UMF_Control, │ │ │ │ │ +680 UMF_Decomposition_Info); │ │ │ │ │ +681 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]); │ │ │ │ │ +682 if (verbosity_ == 1) │ │ │ │ │ +683 { │ │ │ │ │ +684 std::cout << "[UMFPack Decomposition]" << std::endl; │ │ │ │ │ +685 std::cout << "Wallclock Time taken: " << UMF_Decomposition_Info │ │ │ │ │ +[UMFPACK_NUMERIC_WALLTIME] << " (CPU Time: " << UMF_Decomposition_Info │ │ │ │ │ +[UMFPACK_NUMERIC_TIME] << ")" << std::endl; │ │ │ │ │ +686 std::cout << "Flops taken: " << UMF_Decomposition_Info[UMFPACK_FLOPS] << │ │ │ │ │ +std::endl; │ │ │ │ │ +687 std::cout << "Peak Memory Usage: " << UMF_Decomposition_Info │ │ │ │ │ +[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << " bytes" │ │ │ │ │ +<< std::endl; │ │ │ │ │ +688 std::cout << "Condition number estimate: " << 1./UMF_Decomposition_Info │ │ │ │ │ +[UMFPACK_RCOND] << std::endl; │ │ │ │ │ +689 std::cout << "Numbers of non-zeroes in decomposition: L: " << │ │ │ │ │ +UMF_Decomposition_Info[UMFPACK_LNZ] << " U: " << UMF_Decomposition_Info │ │ │ │ │ +[UMFPACK_UNZ] << std::endl; │ │ │ │ │ +690 } │ │ │ │ │ +691 if (verbosity_ == 2) │ │ │ │ │ +692 { │ │ │ │ │ +693 Caller::report_info(UMF_Control,UMF_Decomposition_Info); │ │ │ │ │ +694 } │ │ │ │ │ +695 } │ │ │ │ │ +696 │ │ │ │ │ +697 void printOnApply(double* UMF_Info) │ │ │ │ │ +698 { │ │ │ │ │ +699 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]); │ │ │ │ │ +700 if (verbosity_ > 0) │ │ │ │ │ +701 { │ │ │ │ │ +702 std::cout << "[UMFPack Solve]" << std::endl; │ │ │ │ │ +703 std::cout << "Wallclock Time: " << UMF_Info[UMFPACK_SOLVE_WALLTIME] << " │ │ │ │ │ +(CPU Time: " << UMF_Info[UMFPACK_SOLVE_TIME] << ")" << std::endl; │ │ │ │ │ +704 std::cout << "Flops Taken: " << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl; │ │ │ │ │ +705 std::cout << "Iterative Refinement steps taken: " << UMF_Info │ │ │ │ │ +[UMFPACK_IR_TAKEN] << std::endl; │ │ │ │ │ +706 std::cout << "Error Estimate: " << UMF_Info[UMFPACK_OMEGA1] << " resp. " << │ │ │ │ │ +UMF_Info[UMFPACK_OMEGA2] << std::endl; │ │ │ │ │ +707 } │ │ │ │ │ +708 } │ │ │ │ │ +709 │ │ │ │ │ +710 _U_M_F_P_a_c_k_M_a_t_r_i_x umfpackMatrix_; │ │ │ │ │ +711 bool matrixIsLoaded_; │ │ │ │ │ +712 int verbosity_; │ │ │ │ │ +713 void *UMF_Symbolic; │ │ │ │ │ +714 void *UMF_Numeric; │ │ │ │ │ +715 double UMF_Control[UMFPACK_CONTROL]; │ │ │ │ │ +716 }; │ │ │ │ │ +717 │ │ │ │ │ +718 template │ │ │ │ │ +_7_1_9 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r<_U_M_F_P_a_c_k<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > > │ │ │ │ │ +720 { │ │ │ │ │ +_7_2_1 enum { _v_a_l_u_e=true}; │ │ │ │ │ +722 }; │ │ │ │ │ +723 │ │ │ │ │ +724 template │ │ │ │ │ +_7_2_5 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d<_U_M_F_P_a_c_k<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ +726 { │ │ │ │ │ +_7_2_7 enum { _v_a_l_u_e = true }; │ │ │ │ │ +728 }; │ │ │ │ │ +729 │ │ │ │ │ +_7_3_0 struct _U_M_F_P_a_c_k_C_r_e_a_t_o_r { │ │ │ │ │ +_7_3_1 template struct _i_s_V_a_l_i_d_B_l_o_c_k : std::false_type{}; │ │ │ │ │ +_7_3_2 template struct _i_s_V_a_l_i_d_B_l_o_c_k::real_type,double>::value>> : std::true_type │ │ │ │ │ +{}; │ │ │ │ │ +733 │ │ │ │ │ +734 template │ │ │ │ │ +735 std::shared_ptr::type, │ │ │ │ │ +736 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +_7_3_7 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& config, │ │ │ │ │ +738 std::enable_if_t< │ │ │ │ │ +739 _i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ +value,int> = 0) const │ │ │ │ │ +740 { │ │ │ │ │ +741 int verbose = config.get("verbose", 0); │ │ │ │ │ +742 return std::make_shared>(_m_a_t,verbose); │ │ │ │ │ +743 } │ │ │ │ │ +744 │ │ │ │ │ +745 // second version with SFINAE to validate the template parameters of │ │ │ │ │ +UMFPack │ │ │ │ │ +746 template │ │ │ │ │ +747 std::shared_ptr::type, │ │ │ │ │ +748 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +_7_4_9 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ +*config*/, │ │ │ │ │ +750 std::enable_if_t< │ │ │ │ │ +751 !_i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ +value,int> = 0) const │ │ │ │ │ +752 { │ │ │ │ │ +753 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, │ │ │ │ │ +754 "Unsupported Type in UMFPack (only double and std::complex │ │ │ │ │ +supported)"); │ │ │ │ │ +755 } │ │ │ │ │ +756 }; │ │ │ │ │ +_7_5_7 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("umfpack",_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r()); │ │ │ │ │ +758} // end namespace Dune │ │ │ │ │ +759 │ │ │ │ │ +760#endif // HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +761 │ │ │ │ │ +762#endif //DUNE_ISTL_UMFPACK_HH │ │ │ │ │ +_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ +_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ +#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_s_o_l_v_e_r_s_._h_h │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ +static void numeric(const umf_int_type *cs, const umf_int_type *ri, const │ │ │ │ │ +double *val, A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_f_r_e_e │ │ │ │ │ +void free() │ │ │ │ │ +free allocated space. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:642 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ +static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type │ │ │ │ │ +*ri, std::complex< double > *val, double *x, const double *b, A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator,. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:479 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +ISTL::Impl::BCCSMatrixInitializer< M, umf_int_type > MatrixInitializer │ │ │ │ │ +Type of an associated initializer class. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:346 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ +static void report_info(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:200 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the solver (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:341 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +void setMatrix(const Matrix &matrix) │ │ │ │ │ +Initialize data from given matrix. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:565 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ +static int save_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ +static void numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ +UMFPack(const Matrix &mat_, const ParameterTree &config) │ │ │ │ │ +Construct a solver object from a matrix. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:403 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ +static void symbolic(umf_int_type m, umf_int_type n, const umf_int_type *cs, │ │ │ │ │ +const umf_int_type *ri, const double *val, A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL │ │ │ │ │ +>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const │ │ │ │ │ +M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< │ │ │ │ │ +typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) │ │ │ │ │ +const │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:737 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ +static void report_status(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ +UMFPack(const Matrix &mat_, const char *file, int verbose=0) │ │ │ │ │ +Try loading a decomposition from file and do a decomposition if unsuccessful. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:427 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ +static int load_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ +static void free_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ +static void defaults(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +typename Impl::UMFPackVectorChooser< M >::range_type range_type │ │ │ │ │ +The type of the range of the solver. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ +static int save_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ +static void report_info(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ +static void solve(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ +UMFPack() │ │ │ │ │ +default constructor │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:409 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_u_m_f___i_n_t___t_y_p_e │ │ │ │ │ +int64_t umf_int_type │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ +static int load_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:251 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ +static void symbolic(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ +static void numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:136 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ +static void report_info(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ +static void report_status(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ +static void free_symbolic(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ +static void free_symbolic(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_n_u_m_e_r_i_c │ │ │ │ │ +static void numeric(const umf_int_type *cs, const umf_int_type *ri, const │ │ │ │ │ +double *val, A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:195 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ +void setSubMatrix(const Matrix &_mat, const S &rowIndexSet) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:584 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ +static void solve(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ +static void free_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_a_p_p_l_y │ │ │ │ │ +void apply(T *x, T *b) │ │ │ │ │ +additional apply method with c-arrays in analogy to superlu │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_u_m_f___i_n_t___t_y_p_e │ │ │ │ │ +int32_t umf_int_type │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:233 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_:_:_v_a_l_i_d │ │ │ │ │ +static constexpr bool valid │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_V_e_r_b_o_s_i_t_y │ │ │ │ │ +void setVerbosity(int v) │ │ │ │ │ +sets the verbosity level for the UMFPack solver │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:608 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ +UMFPack(const char *file, int verbose=0) │ │ │ │ │ +try loading a decomposition from file │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:454 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ +static void defaults(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:236 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ +static int save_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ +static int load_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ +static void symbolic(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_~_U_M_F_P_a_c_k │ │ │ │ │ +virtual ~UMFPack() │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:470 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_n_a_m_e │ │ │ │ │ +const char * name() │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:653 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k_M_a_t_r_i_x │ │ │ │ │ +ISTL::Impl::BCCSMatrix< typename Matrix::field_type, umf_int_type > │ │ │ │ │ +UMFPackMatrix │ │ │ │ │ +The corresponding UMFPack matrix type. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:344 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ +static void free_symbolic(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_a_v_e_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void saveDecomposition(const char *file) │ │ │ │ │ +saves a decomposition to a file │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:557 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x │ │ │ │ │ +UMFPackMatrix & getInternalMatrix() │ │ │ │ │ +Return the column compress matrix from UMFPack. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:633 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ +static void free_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_f_r_e_e___n_u_m_e_r_i_c │ │ │ │ │ +static void free_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_o_l_v_e │ │ │ │ │ +static void solve(umf_int_type m, const umf_int_type *cs, const umf_int_type │ │ │ │ │ +*ri, std::complex< double > *val, double *x, const double *b, A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ +static void report_status(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +typename Impl::UMFPackVectorChooser< M >::domain_type domain_type │ │ │ │ │ +The type of the domain of the solver. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:348 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ +UMFPack(const Matrix &matrix, int verbose=0) │ │ │ │ │ +Construct a solver object from a matrix. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:366 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_s_a_v_e___n_u_m_e_r_i_c │ │ │ │ │ +static int save_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_r_e_p_o_r_t___i_n_f_o │ │ │ │ │ +static void report_info(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(domain_type &x, range_type &b, double reduction, │ │ │ │ │ +InverseOperatorResult &res) │ │ │ │ │ +apply inverse operator, with given convergence criteria. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:510 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_s_e_t_O_p_t_i_o_n │ │ │ │ │ +void setOption(unsigned int option, double value) │ │ │ │ │ +Set UMFPack-specific options. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:546 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ +static void defaults(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_M_a_t_r_i_x │ │ │ │ │ +M Matrix │ │ │ │ │ +The matrix type. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:340 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_s_y_m_b_o_l_i_c │ │ │ │ │ +static void symbolic(umf_int_type m, std::size_t n, const umf_int_type *cs, │ │ │ │ │ +const umf_int_type *ri, const double *val, A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_f_r_e_e___s_y_m_b_o_l_i_c │ │ │ │ │ +static void free_symbolic(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:246 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _d_o_u_b_l_e_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_:_d_e_f_a_u_l_t_s │ │ │ │ │ +static void defaults(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_u_m_f___i_n_t___t_y_p_e │ │ │ │ │ +std::conditional_t<(sizeof(typename M::size_type)==8), int64_t, int32_t > │ │ │ │ │ +umf_int_type │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_t_r_u_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_l_o_a_d___n_u_m_e_r_i_c │ │ │ │ │ +static int load_numeric(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_U_M_F_P_a_c_k │ │ │ │ │ +UMFPack(const Matrix &matrix, int verbose, bool) │ │ │ │ │ +Constructor for compatibility with SuperLU standard constructor. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:384 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_:_:_g_e_t_F_a_c_t_o_r_i_z_a_t_i_o_n │ │ │ │ │ +void * getFactorization() │ │ │ │ │ +Return the matrix factorization. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:624 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_,_ _s_t_d_:_:_f_a_l_s_e___t_y_p_e_ _>_:_: │ │ │ │ │ +_r_e_p_o_r_t___s_t_a_t_u_s │ │ │ │ │ +static void report_status(A... args) │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:266 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +Sequential overlapping Schwarz preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_e_l_a_p_s_e_d │ │ │ │ │ +double elapsed │ │ │ │ │ +Elapsed time in seconds. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ +int iterations │ │ │ │ │ +Number of iterations. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ +bool converged │ │ │ │ │ +True if convergence criterion has been met. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ +@ value │ │ │ │ │ +Whether this is a direct solver. │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ +@ value │ │ │ │ │ +whether the solver internally uses column compressed storage │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_M_e_t_h_o_d_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k │ │ │ │ │ +The UMFPack direct sparse solver. │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:335 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:730 │ │ │ │ │ +_D_u_n_e_:_:_U_M_F_P_a_c_k_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k │ │ │ │ │ +DDeeffiinniittiioonn umfpack.hh:731 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00170.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solver.hh File Reference │ │ │ │ +dune-istl: matrixindexset.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,69 +72,33 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ - │ │ │ │ +
matrixindexset.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Define general, extensible interface for inverse operators. │ │ │ │ -More...

│ │ │ │ -
#include <iomanip>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <string>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/shared_ptr.hh>
│ │ │ │ -#include <dune/common/simd/io.hh>
│ │ │ │ -#include <dune/common/simd/simd.hh>
│ │ │ │ -#include <dune/common/parametertree.hh>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ -#include "solvertype.hh"
│ │ │ │ -#include "preconditioner.hh"
│ │ │ │ -#include "operators.hh"
│ │ │ │ -#include "scalarproducts.hh"
│ │ │ │ +
#include <vector>
│ │ │ │ +#include <set>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::InverseOperatorResult
 Statistics about the application of an inverse operator. More...
 
class  Dune::InverseOperator< X, Y >
 Abstract base class for all solvers. More...
 
class  Dune::IterativeSolver< X, Y >
 Base class for all implementations of iterative solvers. More...
 
class  Dune::IterativeSolver< X, Y >::Iteration< CountType >
 Class for controlling iterative methods. More...
 
class  Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >
 Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in a unified way, i.e. independent from the solver's type (direct/iterative). More...
 
struct  Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< is_direct_solver, Dummy >
 Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTABSolver. More...
 
struct  Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< true, Dummy >
 Implementation that works together with direct ISTL solvers, e.g. Dune::SuperLU or Dune::UMFPack. More...
class  Dune::MatrixIndexSet
 Stores the nonzero entries in a sparse matrix. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Define general, extensible interface for inverse operators.

│ │ │ │ -

Implementation here covers only inversion of linear operators, but the implementation might be used for nonlinear operators as well.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,62 +1,20 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -solver.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s │ │ │ │ │ -Define general, extensible interface for inverse operators. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_s_o_l_v_e_r_t_y_p_e_._h_h" │ │ │ │ │ -#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ -#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ -#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ +matrixindexset.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -  Statistics about the application of an inverse operator. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_ _X_,_ _Y_ _> │ │ │ │ │ -  Abstract base class for all solvers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _Y_ _> │ │ │ │ │ -  Base class for all implementations of iterative solvers. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _Y_ _>_:_:_I_t_e_r_a_t_i_o_n_<_ _C_o_u_n_t_T_y_p_e_ _> │ │ │ │ │ -  Class for controlling iterative methods. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_<_ _I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_ _B_C_R_S_M_a_t_r_i_x_ _> │ │ │ │ │ - Helper class for notifying a DUNE-ISTL linear solver about a change of │ │ │ │ │ -  the iteration matrix object in a unified way, i.e. independent from │ │ │ │ │ - the solver's type (direct/iterative). _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_<_ _I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_ _B_C_R_S_M_a_t_r_i_x_ _>_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_< │ │ │ │ │ - _i_s___d_i_r_e_c_t___s_o_l_v_e_r_,_ _D_u_m_m_y_ _> │ │ │ │ │ -  _I_m_p_l_e_m_e_n_t_a_t_i_o_n that works together with iterative _I_S_T_L solvers, e.g. │ │ │ │ │ - _D_u_n_e_:_:_C_G_S_o_l_v_e_r or _D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_<_ _I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_ _B_C_R_S_M_a_t_r_i_x_ _>_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_< │ │ │ │ │ - _t_r_u_e_,_ _D_u_m_m_y_ _> │ │ │ │ │ -  _I_m_p_l_e_m_e_n_t_a_t_i_o_n that works together with direct _I_S_T_L solvers, e.g. │ │ │ │ │ - _D_u_n_e_:_:_S_u_p_e_r_L_U or _D_u_n_e_:_:_U_M_F_P_a_c_k. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ +  Stores the nonzero entries in a sparse matrix. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Define general, extensible interface for inverse operators. │ │ │ │ │ -Implementation here covers only inversion of linear operators, but the │ │ │ │ │ -implementation might be used for nonlinear operators as well. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solver.hh Source File │ │ │ │ +dune-istl: matrixindexset.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,495 +74,148 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
solver.hh
│ │ │ │ +
matrixindexset.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_ISTL_SOLVER_HH
│ │ │ │ -
7#define DUNE_ISTL_SOLVER_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <iomanip>
│ │ │ │ -
10#include <ostream>
│ │ │ │ -
11#include <string>
│ │ │ │ -
12#include <functional>
│ │ │ │ +
5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH
│ │ │ │ +
6#define DUNE_ISTL_MATRIXINDEXSET_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <vector>
│ │ │ │ +
9#include <set>
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12
│ │ │ │
13
│ │ │ │ -
14#include <dune/common/exceptions.hh>
│ │ │ │ -
15#include <dune/common/shared_ptr.hh>
│ │ │ │ -
16#include <dune/common/simd/io.hh>
│ │ │ │ -
17#include <dune/common/simd/simd.hh>
│ │ │ │ -
18#include <dune/common/parametertree.hh>
│ │ │ │ -
19#include <dune/common/timer.hh>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
16 {
│ │ │ │ +
17
│ │ │ │ +
18 public:
│ │ │ │ +
19 typedef std::size_t size_type;
│ │ │ │
20
│ │ │ │ -
21#include "solvertype.hh"
│ │ │ │ -
22#include "preconditioner.hh"
│ │ │ │ -
23#include "operators.hh"
│ │ │ │ -
24#include "scalarproducts.hh"
│ │ │ │ -
25
│ │ │ │ -
26namespace Dune
│ │ │ │ -
27{
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
48 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
51 {
│ │ │ │ -
52 clear();
│ │ │ │ -
53 }
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
22 MatrixIndexSet() : rows_(0), cols_(0)
│ │ │ │ +
23 {}
│ │ │ │ +
│ │ │ │ +
24
│ │ │ │ +
│ │ │ │ +
26 MatrixIndexSet(size_type rows, size_type cols) : rows_(rows), cols_(cols) {
│ │ │ │ +
27 indices_.resize(rows_);
│ │ │ │ +
28 }
│ │ │ │ +
│ │ │ │ +
29
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
32 rows_ = rows;
│ │ │ │ +
33 cols_ = cols;
│ │ │ │ +
34 indices_.resize(rows_);
│ │ │ │ +
35 }
│ │ │ │ +
│ │ │ │ +
36
│ │ │ │ +
│ │ │ │ +
38 void add(size_type i, size_type j) {
│ │ │ │ +
39 indices_[i].insert(j);
│ │ │ │ +
40 }
│ │ │ │ +
│ │ │ │ +
41
│ │ │ │ +
│ │ │ │ +
43 size_type size() const {
│ │ │ │ +
44 size_type entries = 0;
│ │ │ │ +
45 for (size_type i=0; i<rows_; i++)
│ │ │ │ +
46 entries += indices_[i].size();
│ │ │ │ +
47
│ │ │ │ +
48 return entries;
│ │ │ │ +
49 }
│ │ │ │ +
│ │ │ │ +
50
│ │ │ │ +
52 size_type rows() const {return rows_;}
│ │ │ │ +
53
│ │ │ │
54
│ │ │ │ -
│ │ │ │ -
56 void clear ()
│ │ │ │ -
57 {
│ │ │ │ -
58 iterations = 0;
│ │ │ │ -
59 reduction = 0;
│ │ │ │ -
60 converged = false;
│ │ │ │ -
61 conv_rate = 1;
│ │ │ │ -
62 elapsed = 0;
│ │ │ │ - │ │ │ │ -
64 }
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ - │ │ │ │ -
68
│ │ │ │ -
70 double reduction;
│ │ │ │ +
56 size_type rowsize(size_type row) const {return indices_[row].size();}
│ │ │ │ +
57
│ │ │ │ +
64 template <class MatrixType>
│ │ │ │ +
│ │ │ │ +
65 void import(const MatrixType& m, size_type rowOffset=0, size_type colOffset=0) {
│ │ │ │ +
66
│ │ │ │ +
67 typedef typename MatrixType::row_type RowType;
│ │ │ │ +
68 typedef typename RowType::ConstIterator ColumnIterator;
│ │ │ │ +
69
│ │ │ │ +
70 for (size_type rowIdx=0; rowIdx<m.N(); rowIdx++) {
│ │ │ │
71
│ │ │ │ - │ │ │ │ -
74
│ │ │ │ -
76 double conv_rate;
│ │ │ │ -
77
│ │ │ │ -
79 double condition_estimate = -1;
│ │ │ │ -
80
│ │ │ │ -
82 double elapsed;
│ │ │ │ -
83 };
│ │ │ │ -
│ │ │ │ -
84
│ │ │ │ -
85
│ │ │ │ -
86 //=====================================================================
│ │ │ │ -
98 template<class X, class Y>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
100 public:
│ │ │ │ -
102 typedef X domain_type;
│ │ │ │ -
103
│ │ │ │ -
105 typedef Y range_type;
│ │ │ │ -
106
│ │ │ │ -
108 typedef typename X::field_type field_type;
│ │ │ │ +
72 const RowType& row = m[rowIdx];
│ │ │ │ +
73
│ │ │ │ +
74 ColumnIterator cIt = row.begin();
│ │ │ │ +
75 ColumnIterator cEndIt = row.end();
│ │ │ │ +
76
│ │ │ │ +
77 for(; cIt!=cEndIt; ++cIt)
│ │ │ │ +
78 add(rowIdx+rowOffset, cIt.index()+colOffset);
│ │ │ │ +
79
│ │ │ │ +
80 }
│ │ │ │ +
81
│ │ │ │ +
82 }
│ │ │ │ +
│ │ │ │ +
83
│ │ │ │ +
89 template <class MatrixType>
│ │ │ │ +
│ │ │ │ +
90 void exportIdx(MatrixType& matrix) const {
│ │ │ │ +
91
│ │ │ │ +
92 matrix.setSize(rows_, cols_);
│ │ │ │ +
93 matrix.setBuildMode(MatrixType::random);
│ │ │ │ +
94
│ │ │ │ +
95 for (size_type i=0; i<rows_; i++)
│ │ │ │ +
96 matrix.setrowsize(i, indices_[i].size());
│ │ │ │ +
97
│ │ │ │ +
98 matrix.endrowsizes();
│ │ │ │ +
99
│ │ │ │ +
100 for (size_type i=0; i<rows_; i++) {
│ │ │ │ +
101
│ │ │ │ +
102 typename std::set<size_type>::iterator it = indices_[i].begin();
│ │ │ │ +
103 for (; it!=indices_[i].end(); ++it)
│ │ │ │ +
104 matrix.addindex(i, *it);
│ │ │ │ +
105
│ │ │ │ +
106 }
│ │ │ │ +
107
│ │ │ │ +
108 matrix.endindices();
│ │ │ │
109
│ │ │ │ -
111 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ -
112
│ │ │ │ -
114 typedef Simd::Scalar<real_type> scalar_real_type;
│ │ │ │ +
110 }
│ │ │ │ +
│ │ │ │ +
111
│ │ │ │ +
112 private:
│ │ │ │ +
113
│ │ │ │ +
114 std::vector<std::set<size_type> > indices_;
│ │ │ │
115
│ │ │ │ -
128 virtual void apply (X& x, Y& b, InverseOperatorResult& res) = 0;
│ │ │ │ -
129
│ │ │ │ -
143 virtual void apply (X& x, Y& b, double reduction, InverseOperatorResult& res) = 0;
│ │ │ │ -
144
│ │ │ │ - │ │ │ │ -
147#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
│ │ │ │ -
148 {
│ │ │ │ -
149 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
│ │ │ │ -
150 }
│ │ │ │ -
151#else
│ │ │ │ -
152 = 0;
│ │ │ │ -
153#endif
│ │ │ │ -
154
│ │ │ │ -
156 virtual ~InverseOperator () {}
│ │ │ │ -
157
│ │ │ │ -
158 protected:
│ │ │ │ -
159 // spacing values
│ │ │ │ -
160 enum { iterationSpacing = 5 , normSpacing = 16 };
│ │ │ │ -
161
│ │ │ │ -
│ │ │ │ -
163 void printHeader(std::ostream& s) const
│ │ │ │ -
164 {
│ │ │ │ -
165 s << std::setw(iterationSpacing) << " Iter";
│ │ │ │ -
166 s << std::setw(normSpacing) << "Defect";
│ │ │ │ -
167 s << std::setw(normSpacing) << "Rate" << std::endl;
│ │ │ │ -
168 }
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
171 template <typename CountType, typename DataType>
│ │ │ │ -
│ │ │ │ -
172 void printOutput(std::ostream& s,
│ │ │ │ -
173 const CountType& iter,
│ │ │ │ -
174 const DataType& norm,
│ │ │ │ -
175 const DataType& norm_old) const
│ │ │ │ -
176 {
│ │ │ │ -
177 const DataType rate = norm/norm_old;
│ │ │ │ -
178 s << std::setw(iterationSpacing) << iter << " ";
│ │ │ │ -
179 s << std::setw(normSpacing) << Simd::io(norm) << " ";
│ │ │ │ -
180 s << std::setw(normSpacing) << Simd::io(rate) << std::endl;
│ │ │ │ -
181 }
│ │ │ │ -
│ │ │ │ -
182
│ │ │ │ -
184 template <typename CountType, typename DataType>
│ │ │ │ -
│ │ │ │ -
185 void printOutput(std::ostream& s,
│ │ │ │ -
186 const CountType& iter,
│ │ │ │ -
187 const DataType& norm) const
│ │ │ │ -
188 {
│ │ │ │ -
189 s << std::setw(iterationSpacing) << iter << " ";
│ │ │ │ -
190 s << std::setw(normSpacing) << Simd::io(norm) << std::endl;
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192 };
│ │ │ │ -
│ │ │ │ -
193
│ │ │ │ -
202 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
203 class IterativeSolver : public InverseOperator<X,Y>{
│ │ │ │ -
204 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
208 using typename InverseOperator<X,Y>::real_type;
│ │ │ │ - │ │ │ │ -
210
│ │ │ │ -
│ │ │ │ -
230 IterativeSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int maxit, int verbose) :
│ │ │ │ -
231 _op(stackobject_to_shared_ptr(op)),
│ │ │ │ -
232 _prec(stackobject_to_shared_ptr(prec)),
│ │ │ │ -
233 _sp(new SeqScalarProduct<X>),
│ │ │ │ -
234 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::sequential)
│ │ │ │ -
235 {
│ │ │ │ - │ │ │ │ -
237 DUNE_THROW(InvalidSolverCategory, "LinearOperator has to be sequential!");
│ │ │ │ - │ │ │ │ -
239 DUNE_THROW(InvalidSolverCategory, "Preconditioner has to be sequential!");
│ │ │ │ -
240 }
│ │ │ │ -
│ │ │ │ -
241
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
263 scalar_real_type reduction, int maxit, int verbose) :
│ │ │ │ -
264 _op(stackobject_to_shared_ptr(op)),
│ │ │ │ -
265 _prec(stackobject_to_shared_ptr(prec)),
│ │ │ │ -
266 _sp(stackobject_to_shared_ptr(sp)),
│ │ │ │ -
267 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::category(op))
│ │ │ │ -
268 {
│ │ │ │ - │ │ │ │ -
270 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
│ │ │ │ - │ │ │ │ -
272 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
│ │ │ │ -
273 }
│ │ │ │ -
│ │ │ │ -
274
│ │ │ │ -
│ │ │ │ -
290 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ -
291 IterativeSolver(op,std::make_shared<SeqScalarProduct<X>>(),prec,
│ │ │ │ -
292 configuration.get<real_type>("reduction"),
│ │ │ │ -
293 configuration.get<int>("maxit"),
│ │ │ │ -
294 configuration.get<int>("verbose"))
│ │ │ │ -
295 {}
│ │ │ │ -
│ │ │ │ -
296
│ │ │ │ -
│ │ │ │ -
313 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<const ScalarProduct<X> > sp, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ -
314 IterativeSolver(op,sp,prec,
│ │ │ │ -
315 configuration.get<scalar_real_type>("reduction"),
│ │ │ │ -
316 configuration.get<int>("maxit"),
│ │ │ │ -
317 configuration.get<int>("verbose"))
│ │ │ │ -
318 {}
│ │ │ │ -
│ │ │ │ -
319
│ │ │ │ -
│ │ │ │ -
340 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
│ │ │ │ -
341 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ -
342 std::shared_ptr<Preconditioner<X,Y>> prec,
│ │ │ │ -
343 scalar_real_type reduction, int maxit, int verbose) :
│ │ │ │ -
344 _op(op),
│ │ │ │ -
345 _prec(prec),
│ │ │ │ -
346 _sp(sp),
│ │ │ │ -
347 _reduction(reduction), _maxit(maxit), _verbose(verbose),
│ │ │ │ - │ │ │ │ -
349 {
│ │ │ │ - │ │ │ │ -
351 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
│ │ │ │ - │ │ │ │ -
353 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
│ │ │ │ -
354 }
│ │ │ │ -
│ │ │ │ -
355
│ │ │ │ -
356 // #warning actually we want to have this as the default and just implement the second one
│ │ │ │ -
357 // //! \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
│ │ │ │ -
358 // virtual void apply (X& x, Y& b, InverseOperatorResult& res)
│ │ │ │ -
359 // {
│ │ │ │ -
360 // apply(x,b,_reduction,res);
│ │ │ │ -
361 // }
│ │ │ │ -
362
│ │ │ │ -
363#ifndef DOXYGEN
│ │ │ │ -
364 // make sure the three-argument apply from the base class does not get shadowed
│ │ │ │ -
365 // by the redefined four-argument version below
│ │ │ │ -
366 using InverseOperator<X,Y>::apply;
│ │ │ │ -
367#endif
│ │ │ │ -
368
│ │ │ │ -
│ │ │ │ -
374 virtual void apply (X& x, X& b, double reduction, InverseOperatorResult& res)
│ │ │ │ -
375 {
│ │ │ │ -
376 scalar_real_type saved_reduction = _reduction;
│ │ │ │ -
377 _reduction = reduction;
│ │ │ │ -
378 this->apply(x,b,res);
│ │ │ │ -
379 _reduction = saved_reduction;
│ │ │ │ -
380 }
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
384 {
│ │ │ │ -
385 return _category;
│ │ │ │ -
386 }
│ │ │ │ -
│ │ │ │ -
387
│ │ │ │ -
│ │ │ │ -
388 std::string name() const{
│ │ │ │ -
389 std::string name = className(*this);
│ │ │ │ -
390 return name.substr(0, name.find("<"));
│ │ │ │ -
391 }
│ │ │ │ -
│ │ │ │ -
392
│ │ │ │ -
410 template<class CountType = unsigned int>
│ │ │ │ -
│ │ │ │ -
411 class Iteration {
│ │ │ │ -
412 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
414 : _i(0)
│ │ │ │ -
415 , _res(res)
│ │ │ │ -
416 , _parent(parent)
│ │ │ │ -
417 , _valid(true)
│ │ │ │ -
418 {
│ │ │ │ -
419 res.clear();
│ │ │ │ -
420 if(_parent._verbose>0){
│ │ │ │ -
421 std::cout << "=== " << parent.name() << std::endl;
│ │ │ │ -
422 if(_parent._verbose > 1)
│ │ │ │ -
423 _parent.printHeader(std::cout);
│ │ │ │ -
424 }
│ │ │ │ -
425 }
│ │ │ │ -
│ │ │ │ -
426
│ │ │ │ -
427 Iteration(const Iteration&) = delete;
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
429 : _def0(other._def0)
│ │ │ │ -
430 , _def(other._def)
│ │ │ │ -
431 , _i(other._i)
│ │ │ │ -
432 , _watch(other._watch)
│ │ │ │ -
433 , _res(other._res)
│ │ │ │ -
434 , _parent(other._parent)
│ │ │ │ -
435 , _valid(other._valid)
│ │ │ │ -
436 {
│ │ │ │ -
437 other._valid = false;
│ │ │ │ -
438 }
│ │ │ │ -
│ │ │ │ -
439
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
441 if(_valid)
│ │ │ │ -
442 finalize();
│ │ │ │ -
443 }
│ │ │ │ -
│ │ │ │ -
444
│ │ │ │ -
│ │ │ │ -
455 bool step(CountType i, real_type def){
│ │ │ │ -
456 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN
│ │ │ │ -
457 {
│ │ │ │ -
458 if (_parent._verbose>0)
│ │ │ │ -
459 std::cout << "=== " << _parent.name() << ": abort due to infinite or NaN defect"
│ │ │ │ -
460 << std::endl;
│ │ │ │ -
461 DUNE_THROW(SolverAbort,
│ │ │ │ -
462 _parent.name() << ": defect=" << Simd::io(def)
│ │ │ │ -
463 << " is infinite or NaN");
│ │ │ │ -
464 }
│ │ │ │ -
465 if(i == 0)
│ │ │ │ -
466 _def0 = def;
│ │ │ │ -
467 if(_parent._verbose > 1){
│ │ │ │ -
468 if(i!=0)
│ │ │ │ -
469 _parent.printOutput(std::cout,i,def,_def);
│ │ │ │ -
470 else
│ │ │ │ -
471 _parent.printOutput(std::cout,i,def);
│ │ │ │ -
472 }
│ │ │ │ -
473 _def = def;
│ │ │ │ -
474 _i = i;
│ │ │ │ -
475 _res.converged = (Simd::allTrue(def<_def0*_parent._reduction || def<real_type(1E-30))); // convergence check
│ │ │ │ -
476 return _res.converged;
│ │ │ │ -
477 }
│ │ │ │ -
│ │ │ │ -
478
│ │ │ │ -
479 protected:
│ │ │ │ -
│ │ │ │ -
480 void finalize(){
│ │ │ │ -
481 _res.converged = (Simd::allTrue(_def<_def0*_parent._reduction || _def<real_type(1E-30)));
│ │ │ │ - │ │ │ │ -
483 _res.reduction = static_cast<double>(Simd::max(_def/_def0));
│ │ │ │ -
484 _res.conv_rate = pow(_res.reduction,1.0/_i);
│ │ │ │ -
485 _res.elapsed = _watch.elapsed();
│ │ │ │ -
486 if (_parent._verbose>0) // final print
│ │ │ │ -
487 {
│ │ │ │ -
488 std::cout << "=== rate=" << _res.conv_rate
│ │ │ │ -
489 << ", T=" << _res.elapsed
│ │ │ │ -
490 << ", TIT=" << _res.elapsed/_res.iterations
│ │ │ │ -
491 << ", IT=" << _res.iterations << std::endl;
│ │ │ │ -
492 }
│ │ │ │ -
493 }
│ │ │ │ -
│ │ │ │ -
494
│ │ │ │ -
495 real_type _def0 = 0.0, _def = 0.0;
│ │ │ │ -
496 CountType _i;
│ │ │ │ -
497 Timer _watch;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
500 bool _valid;
│ │ │ │ -
501 };
│ │ │ │ -
│ │ │ │ -
502
│ │ │ │ -
503 protected:
│ │ │ │ -
504 std::shared_ptr<const LinearOperator<X,Y>> _op;
│ │ │ │ -
505 std::shared_ptr<Preconditioner<X,Y>> _prec;
│ │ │ │ -
506 std::shared_ptr<const ScalarProduct<X>> _sp;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
511 };
│ │ │ │ -
│ │ │ │ -
512
│ │ │ │ -
520 template <typename ISTLLinearSolver, typename BCRSMatrix>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
522 {
│ │ │ │ -
523 public:
│ │ │ │ -
│ │ │ │ -
524 static void setMatrix (ISTLLinearSolver& solver,
│ │ │ │ -
525 const BCRSMatrix& matrix)
│ │ │ │ -
526 {
│ │ │ │ -
527 static const bool is_direct_solver
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
531 }
│ │ │ │ -
│ │ │ │ -
532
│ │ │ │ -
533 protected:
│ │ │ │ -
538 template <bool is_direct_solver, typename Dummy = void>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
540 {
│ │ │ │ -
│ │ │ │ -
541 static void setMatrix (ISTLLinearSolver&,
│ │ │ │ -
542 const BCRSMatrix&)
│ │ │ │ -
543 {}
│ │ │ │ -
│ │ │ │ -
544 };
│ │ │ │ -
│ │ │ │ -
545
│ │ │ │ -
550 template <typename Dummy>
│ │ │ │ -
│ │ │ │ -
551 struct Implementation<true,Dummy>
│ │ │ │ -
552 {
│ │ │ │ -
│ │ │ │ -
553 static void setMatrix (ISTLLinearSolver& solver,
│ │ │ │ -
554 const BCRSMatrix& matrix)
│ │ │ │ -
555 {
│ │ │ │ -
556 solver.setMatrix(matrix);
│ │ │ │ -
557 }
│ │ │ │ -
│ │ │ │ -
558 };
│ │ │ │ -
│ │ │ │ -
559 };
│ │ │ │ -
│ │ │ │ -
560
│ │ │ │ -
564}
│ │ │ │ -
565
│ │ │ │ -
566#endif
│ │ │ │ -
Define base class for scalar product and norm.
│ │ │ │ - │ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
STL namespace.
│ │ │ │ +
116 size_type rows_, cols_;
│ │ │ │ +
117
│ │ │ │ +
118 };
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │ +
120
│ │ │ │ +
121} // end namespace Dune
│ │ │ │ +
122
│ │ │ │ +
123#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
Thrown when a solver aborts due to some problem.
Definition istlexception.hh:46
│ │ │ │ -
A linear operator.
Definition operators.hh:67
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ -
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ -
Default implementation for the scalar case.
Definition scalarproducts.hh:168
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
InverseOperatorResult()
Default constructor.
Definition solver.hh:50
│ │ │ │ -
double condition_estimate
Estimate of condition number.
Definition solver.hh:79
│ │ │ │ -
double elapsed
Elapsed time in seconds.
Definition solver.hh:82
│ │ │ │ -
int iterations
Number of iterations.
Definition solver.hh:67
│ │ │ │ -
double reduction
Reduction achieved: .
Definition solver.hh:70
│ │ │ │ -
void clear()
Resets all data.
Definition solver.hh:56
│ │ │ │ -
double conv_rate
Convergence rate (average reduction per step)
Definition solver.hh:76
│ │ │ │ -
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ -
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ -
void printHeader(std::ostream &s) const
helper function for printing header of solver output
Definition solver.hh:163
│ │ │ │ -
virtual ~InverseOperator()
Destructor.
Definition solver.hh:156
│ │ │ │ -
void printOutput(std::ostream &s, const CountType &iter, const DataType &norm) const
helper function for printing solver output
Definition solver.hh:185
│ │ │ │ -
void printOutput(std::ostream &s, const CountType &iter, const DataType &norm, const DataType &norm_old) const
helper function for printing solver output
Definition solver.hh:172
│ │ │ │ -
virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0
apply inverse operator, with given convergence criteria.
│ │ │ │ -
Simd::Scalar< real_type > scalar_real_type
scalar type underlying the field_type
Definition solver.hh:114
│ │ │ │ -
Y range_type
Type of the range of the operator to be inverted.
Definition solver.hh:105
│ │ │ │ -
@ normSpacing
Definition solver.hh:160
│ │ │ │ -
@ iterationSpacing
Definition solver.hh:160
│ │ │ │ -
X domain_type
Type of the domain of the operator to be inverted.
Definition solver.hh:102
│ │ │ │ -
virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0
Apply inverse operator,.
│ │ │ │ -
X::field_type field_type
The field type of the operator.
Definition solver.hh:108
│ │ │ │ -
FieldTraits< field_type >::real_type real_type
The real type of the field type (is the same if using real numbers, but differs for std::complex)
Definition solver.hh:111
│ │ │ │ -
virtual SolverCategory::Category category() const =0
Category of the solver (see SolverCategory::Category)
│ │ │ │ -
Base class for all implementations of iterative solvers.
Definition solver.hh:203
│ │ │ │ -
IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solver.hh:313
│ │ │ │ -
IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solver.hh:290
│ │ │ │ -
virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)
Apply inverse operator with given reduction factor.
Definition solver.hh:374
│ │ │ │ -
std::shared_ptr< const ScalarProduct< X > > _sp
Definition solver.hh:506
│ │ │ │ -
IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, Y > > prec, scalar_real_type reduction, int maxit, int verbose)
General constructor to initialize an iterative solver.
Definition solver.hh:340
│ │ │ │ -
std::string name() const
Definition solver.hh:388
│ │ │ │ -
IterativeSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int verbose)
General constructor to initialize an iterative solver.
Definition solver.hh:230
│ │ │ │ -
std::shared_ptr< const LinearOperator< X, Y > > _op
Definition solver.hh:504
│ │ │ │ -
int _maxit
Definition solver.hh:508
│ │ │ │ -
int _verbose
Definition solver.hh:509
│ │ │ │ -
scalar_real_type _reduction
Definition solver.hh:507
│ │ │ │ -
IterativeSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int verbose)
General constructor to initialize an iterative solver.
Definition solver.hh:262
│ │ │ │ -
SolverCategory::Category _category
Definition solver.hh:510
│ │ │ │ -
std::shared_ptr< Preconditioner< X, Y > > _prec
Definition solver.hh:505
│ │ │ │ -
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition solver.hh:383
│ │ │ │ -
Class for controlling iterative methods.
Definition solver.hh:411
│ │ │ │ -
Iteration(const IterativeSolver &parent, InverseOperatorResult &res)
Definition solver.hh:413
│ │ │ │ -
Iteration(Iteration &&other)
Definition solver.hh:428
│ │ │ │ -
InverseOperatorResult & _res
Definition solver.hh:498
│ │ │ │ -
const IterativeSolver & _parent
Definition solver.hh:499
│ │ │ │ -
Timer _watch
Definition solver.hh:497
│ │ │ │ -
Iteration(const Iteration &)=delete
│ │ │ │ -
CountType _i
Definition solver.hh:496
│ │ │ │ -
real_type _def0
Definition solver.hh:495
│ │ │ │ -
bool step(CountType i, real_type def)
registers the iteration step, checks for invalid defect norm and convergence.
Definition solver.hh:455
│ │ │ │ -
void finalize()
Definition solver.hh:480
│ │ │ │ -
real_type _def
Definition solver.hh:495
│ │ │ │ -
~Iteration()
Definition solver.hh:440
│ │ │ │ -
bool _valid
Definition solver.hh:500
│ │ │ │ -
Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in...
Definition solver.hh:522
│ │ │ │ -
static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
Definition solver.hh:524
│ │ │ │ -
Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTAB...
Definition solver.hh:540
│ │ │ │ -
static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &)
Definition solver.hh:541
│ │ │ │ -
static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
Definition solver.hh:553
│ │ │ │ -
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ -
Definition solvercategory.hh:54
│ │ │ │ -
Definition solvertype.hh:16
│ │ │ │ +
Stores the nonzero entries in a sparse matrix.
Definition matrixindexset.hh:16
│ │ │ │ +
void resize(size_type rows, size_type cols)
Reset the size of an index set.
Definition matrixindexset.hh:31
│ │ │ │ +
MatrixIndexSet()
Default constructor.
Definition matrixindexset.hh:22
│ │ │ │ +
void add(size_type i, size_type j)
Add an index to the index set.
Definition matrixindexset.hh:38
│ │ │ │ +
size_type rows() const
Return the number of rows.
Definition matrixindexset.hh:52
│ │ │ │ +
std::size_t size_type
Definition matrixindexset.hh:19
│ │ │ │ +
void exportIdx(MatrixType &matrix) const
Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet.
Definition matrixindexset.hh:90
│ │ │ │ +
MatrixIndexSet(size_type rows, size_type cols)
Constructor setting the matrix size.
Definition matrixindexset.hh:26
│ │ │ │ +
size_type rowsize(size_type row) const
Return the number of entries in a given row.
Definition matrixindexset.hh:56
│ │ │ │ +
size_type size() const
Return the number of entries.
Definition matrixindexset.hh:43
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,642 +1,156 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -solver.hh │ │ │ │ │ +matrixindexset.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_ISTL_SOLVER_HH │ │ │ │ │ -7#define DUNE_ISTL_SOLVER_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH │ │ │ │ │ +6#define DUNE_ISTL_MATRIXINDEXSET_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11namespace _D_u_n_e { │ │ │ │ │ +12 │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ +_1_5 class _M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ +16 { │ │ │ │ │ +17 │ │ │ │ │ +18 public: │ │ │ │ │ +_1_9 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ 20 │ │ │ │ │ -21#include "_s_o_l_v_e_r_t_y_p_e_._h_h" │ │ │ │ │ -22#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ -23#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ -24#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ -25 │ │ │ │ │ -26namespace _D_u_n_e │ │ │ │ │ -27{ │ │ │ │ │ -_4_7 struct _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -48 { │ │ │ │ │ -_5_0 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t () │ │ │ │ │ -51 { │ │ │ │ │ -52 _c_l_e_a_r(); │ │ │ │ │ -53 } │ │ │ │ │ +_2_2 _M_a_t_r_i_x_I_n_d_e_x_S_e_t() : rows_(0), cols_(0) │ │ │ │ │ +23 {} │ │ │ │ │ +24 │ │ │ │ │ +_2_6 _M_a_t_r_i_x_I_n_d_e_x_S_e_t(_s_i_z_e___t_y_p_e _r_o_w_s, _s_i_z_e___t_y_p_e cols) : rows_(_r_o_w_s), cols_(cols) { │ │ │ │ │ +27 indices_.resize(rows_); │ │ │ │ │ +28 } │ │ │ │ │ +29 │ │ │ │ │ +_3_1 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e _r_o_w_s, _s_i_z_e___t_y_p_e cols) { │ │ │ │ │ +32 rows_ = _r_o_w_s; │ │ │ │ │ +33 cols_ = cols; │ │ │ │ │ +34 indices_.resize(rows_); │ │ │ │ │ +35 } │ │ │ │ │ +36 │ │ │ │ │ +_3_8 void _a_d_d(_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) { │ │ │ │ │ +39 indices_[i].insert(j); │ │ │ │ │ +40 } │ │ │ │ │ +41 │ │ │ │ │ +_4_3 _s_i_z_e___t_y_p_e _s_i_z_e() const { │ │ │ │ │ +44 _s_i_z_e___t_y_p_e entries = 0; │ │ │ │ │ +45 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_6_5 void import(const MatrixType& m, _s_i_z_e___t_y_p_e rowOffset=0, _s_i_z_e___t_y_p_e │ │ │ │ │ +colOffset=0) { │ │ │ │ │ +66 │ │ │ │ │ +67 typedef typename MatrixType::row_type RowType; │ │ │ │ │ +68 typedef typename RowType::ConstIterator ColumnIterator; │ │ │ │ │ +69 │ │ │ │ │ +70 for (_s_i_z_e___t_y_p_e rowIdx=0; rowIdx │ │ │ │ │ -_9_9 class _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r { │ │ │ │ │ -100 public: │ │ │ │ │ -_1_0_2 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -103 │ │ │ │ │ -_1_0_5 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -106 │ │ │ │ │ -_1_0_8 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +72 const RowType& row = m[rowIdx]; │ │ │ │ │ +73 │ │ │ │ │ +74 ColumnIterator cIt = row.begin(); │ │ │ │ │ +75 ColumnIterator cEndIt = row.end(); │ │ │ │ │ +76 │ │ │ │ │ +77 for(; cIt!=cEndIt; ++cIt) │ │ │ │ │ +78 _a_d_d(rowIdx+rowOffset, cIt.index()+colOffset); │ │ │ │ │ +79 │ │ │ │ │ +80 } │ │ │ │ │ +81 │ │ │ │ │ +82 } │ │ │ │ │ +83 │ │ │ │ │ +89 template │ │ │ │ │ +_9_0 void _e_x_p_o_r_t_I_d_x(MatrixType& matrix) const { │ │ │ │ │ +91 │ │ │ │ │ +92 matrix.setSize(rows_, cols_); │ │ │ │ │ +93 matrix.setBuildMode(MatrixType::random); │ │ │ │ │ +94 │ │ │ │ │ +95 for (_s_i_z_e___t_y_p_e i=0; i::iterator it = indices_[i].begin(); │ │ │ │ │ +103 for (; it!=indices_[i].end(); ++it) │ │ │ │ │ +104 matrix.addindex(i, *it); │ │ │ │ │ +105 │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +108 matrix.endindices(); │ │ │ │ │ 109 │ │ │ │ │ -_1_1_1 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -112 │ │ │ │ │ -_1_1_4 typedef Simd::Scalar _s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +110 } │ │ │ │ │ +111 │ │ │ │ │ +112 private: │ │ │ │ │ +113 │ │ │ │ │ +114 std::vector > indices_; │ │ │ │ │ 115 │ │ │ │ │ -_1_2_8 virtual void _a_p_p_l_y (X& x, Y& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) = 0; │ │ │ │ │ -129 │ │ │ │ │ -_1_4_3 virtual void _a_p_p_l_y (X& x, Y& b, double reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ -res) = 0; │ │ │ │ │ -144 │ │ │ │ │ -_1_4_6 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -147#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE │ │ │ │ │ -148 { │ │ │ │ │ -149 DUNE_THROW(Dune::Exception,"It is necessary to implement the category │ │ │ │ │ -method in a derived classes, in the future this method will pure virtual."); │ │ │ │ │ -150 } │ │ │ │ │ -151#else │ │ │ │ │ -152 = 0; │ │ │ │ │ -153#endif │ │ │ │ │ -154 │ │ │ │ │ -_1_5_6 virtual _~_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r () {} │ │ │ │ │ -157 │ │ │ │ │ -158 protected: │ │ │ │ │ -159 // spacing values │ │ │ │ │ -_1_6_0 enum { _i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g = 5 , _n_o_r_m_S_p_a_c_i_n_g = 16 }; │ │ │ │ │ -161 │ │ │ │ │ -_1_6_3 void _p_r_i_n_t_H_e_a_d_e_r(std::ostream& s) const │ │ │ │ │ -164 { │ │ │ │ │ -165 s << std::setw(_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g) << " Iter"; │ │ │ │ │ -166 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << "Defect"; │ │ │ │ │ -167 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << "Rate" << std::endl; │ │ │ │ │ -168 } │ │ │ │ │ -169 │ │ │ │ │ -171 template │ │ │ │ │ -_1_7_2 void _p_r_i_n_t_O_u_t_p_u_t(std::ostream& s, │ │ │ │ │ -173 const CountType& iter, │ │ │ │ │ -174 const DataType& norm, │ │ │ │ │ -175 const DataType& norm_old) const │ │ │ │ │ -176 { │ │ │ │ │ -177 const DataType rate = norm/norm_old; │ │ │ │ │ -178 s << std::setw(_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g) << iter << " "; │ │ │ │ │ -179 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << Simd::io(norm) << " "; │ │ │ │ │ -180 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << Simd::io(rate) << std::endl; │ │ │ │ │ -181 } │ │ │ │ │ -182 │ │ │ │ │ -184 template │ │ │ │ │ -_1_8_5 void _p_r_i_n_t_O_u_t_p_u_t(std::ostream& s, │ │ │ │ │ -186 const CountType& iter, │ │ │ │ │ -187 const DataType& norm) const │ │ │ │ │ -188 { │ │ │ │ │ -189 s << std::setw(_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g) << iter << " "; │ │ │ │ │ -190 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << Simd::io(norm) << std::endl; │ │ │ │ │ -191 } │ │ │ │ │ -192 }; │ │ │ │ │ -193 │ │ │ │ │ -202 template │ │ │ │ │ -_2_0_3 class _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r{ │ │ │ │ │ -204 public: │ │ │ │ │ -205 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -206 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ -207 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -208 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ -209 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ -210 │ │ │ │ │ -_2_3_0 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& prec, │ │ │ │ │ -_s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose) : │ │ │ │ │ -231 ___o_p(stackobject_to_shared_ptr(op)), │ │ │ │ │ -232 ___p_r_e_c(stackobject_to_shared_ptr(prec)), │ │ │ │ │ -233 ___s_p(new _S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t), │ │ │ │ │ -234 ___r_e_d_u_c_t_i_o_n(reduction), ___m_a_x_i_t(maxit), ___v_e_r_b_o_s_e(verbose), ___c_a_t_e_g_o_r_y │ │ │ │ │ -(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::sequential) │ │ │ │ │ -235 { │ │ │ │ │ -236 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l) │ │ │ │ │ -237 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator has to be sequential!"); │ │ │ │ │ -238 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(prec) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l) │ │ │ │ │ -239 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "Preconditioner has to be sequential!"); │ │ │ │ │ -240 } │ │ │ │ │ -241 │ │ │ │ │ -_2_6_2 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, const _S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, │ │ │ │ │ -_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& prec, │ │ │ │ │ -263 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose) : │ │ │ │ │ -264 ___o_p(stackobject_to_shared_ptr(op)), │ │ │ │ │ -265 ___p_r_e_c(stackobject_to_shared_ptr(prec)), │ │ │ │ │ -266 ___s_p(stackobject_to_shared_ptr(sp)), │ │ │ │ │ -267 ___r_e_d_u_c_t_i_o_n(reduction), ___m_a_x_i_t(maxit), ___v_e_r_b_o_s_e(verbose), ___c_a_t_e_g_o_r_y │ │ │ │ │ -(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::_c_a_t_e_g_o_r_y(op)) │ │ │ │ │ -268 { │ │ │ │ │ -269 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(prec)) │ │ │ │ │ -270 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and Preconditioner must │ │ │ │ │ -have the same SolverCategory!"); │ │ │ │ │ -271 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(sp)) │ │ │ │ │ -272 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and ScalarProduct must │ │ │ │ │ -have the same SolverCategory!"); │ │ │ │ │ -273 } │ │ │ │ │ -274 │ │ │ │ │ -_2_9_0 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ -shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) : │ │ │ │ │ -291 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,_s_t_d::make_shared<_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t>(),prec, │ │ │ │ │ -292 configuration._g_e_t<_r_e_a_l___t_y_p_e>("reduction"), │ │ │ │ │ -293 configuration._g_e_t("maxit"), │ │ │ │ │ -294 configuration._g_e_t("verbose")) │ │ │ │ │ -295 {} │ │ │ │ │ -296 │ │ │ │ │ -_3_1_3 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ -shared_ptr > sp, std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > │ │ │ │ │ -prec, const ParameterTree& configuration) : │ │ │ │ │ -314 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec, │ │ │ │ │ -315 configuration._g_e_t<_s_c_a_l_a_r___r_e_a_l___t_y_p_e>("reduction"), │ │ │ │ │ -316 configuration._g_e_t("maxit"), │ │ │ │ │ -317 configuration._g_e_t("verbose")) │ │ │ │ │ -318 {} │ │ │ │ │ -319 │ │ │ │ │ -_3_4_0 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ -341 std::shared_ptr> sp, │ │ │ │ │ -342 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>> prec, │ │ │ │ │ -343 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose) : │ │ │ │ │ -344 ___o_p(op), │ │ │ │ │ -345 ___p_r_e_c(prec), │ │ │ │ │ -346 ___s_p(sp), │ │ │ │ │ -347 ___r_e_d_u_c_t_i_o_n(reduction), ___m_a_x_i_t(maxit), ___v_e_r_b_o_s_e(verbose), │ │ │ │ │ -348 ___c_a_t_e_g_o_r_y(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::_c_a_t_e_g_o_r_y(*op)) │ │ │ │ │ -349 { │ │ │ │ │ -350 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*prec)) │ │ │ │ │ -351 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and Preconditioner must │ │ │ │ │ -have the same SolverCategory!"); │ │ │ │ │ -352 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*sp)) │ │ │ │ │ -353 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and ScalarProduct must │ │ │ │ │ -have the same SolverCategory!"); │ │ │ │ │ -354 } │ │ │ │ │ -355 │ │ │ │ │ -356 // #warning actually we want to have this as the default and just implement │ │ │ │ │ -the second one │ │ │ │ │ -357 // //! \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&) │ │ │ │ │ -358 // virtual void apply (X& x, Y& b, InverseOperatorResult& res) │ │ │ │ │ -359 // { │ │ │ │ │ -360 // apply(x,b,_reduction,res); │ │ │ │ │ -361 // } │ │ │ │ │ -362 │ │ │ │ │ -363#ifndef DOXYGEN │ │ │ │ │ -364 // make sure the three-argument apply from the base class does not get │ │ │ │ │ -shadowed │ │ │ │ │ -365 // by the redefined four-argument version below │ │ │ │ │ -366 using _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y; │ │ │ │ │ -367#endif │ │ │ │ │ -368 │ │ │ │ │ -_3_7_4 virtual void _a_p_p_l_y (X& x, X& b, double reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ -res) │ │ │ │ │ -375 { │ │ │ │ │ -376 _s_c_a_l_a_r___r_e_a_l___t_y_p_e saved_reduction = ___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -377 ___r_e_d_u_c_t_i_o_n = reduction; │ │ │ │ │ -378 this->_a_p_p_l_y(x,b,res); │ │ │ │ │ -379 ___r_e_d_u_c_t_i_o_n = saved_reduction; │ │ │ │ │ -380 } │ │ │ │ │ -381 │ │ │ │ │ -_3_8_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -384 { │ │ │ │ │ -385 return ___c_a_t_e_g_o_r_y; │ │ │ │ │ -386 } │ │ │ │ │ -387 │ │ │ │ │ -_3_8_8 std::string _n_a_m_e() const{ │ │ │ │ │ -389 std::string _n_a_m_e = className(*this); │ │ │ │ │ -390 return _n_a_m_e.substr(0, _n_a_m_e.find("<")); │ │ │ │ │ -391 } │ │ │ │ │ -392 │ │ │ │ │ -410 template │ │ │ │ │ -_4_1_1 class _I_t_e_r_a_t_i_o_n { │ │ │ │ │ -412 public: │ │ │ │ │ -_4_1_3 _I_t_e_r_a_t_i_o_n(const _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r& parent, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -414 : ___i(0) │ │ │ │ │ -415 , ___r_e_s(res) │ │ │ │ │ -416 , ___p_a_r_e_n_t(parent) │ │ │ │ │ -417 , ___v_a_l_i_d(true) │ │ │ │ │ -418 { │ │ │ │ │ -419 res._c_l_e_a_r(); │ │ │ │ │ -420 if(___p_a_r_e_n_t.___v_e_r_b_o_s_e>0){ │ │ │ │ │ -421 std::cout << "=== " << parent._n_a_m_e() << std::endl; │ │ │ │ │ -422 if(___p_a_r_e_n_t.___v_e_r_b_o_s_e > 1) │ │ │ │ │ -423 ___p_a_r_e_n_t._p_r_i_n_t_H_e_a_d_e_r(std::cout); │ │ │ │ │ -424 } │ │ │ │ │ -425 } │ │ │ │ │ -426 │ │ │ │ │ -_4_2_7 _I_t_e_r_a_t_i_o_n(const _I_t_e_r_a_t_i_o_n&) = delete; │ │ │ │ │ -_4_2_8 _I_t_e_r_a_t_i_o_n(_I_t_e_r_a_t_i_o_n&& other) │ │ │ │ │ -429 : ___d_e_f_0(other.___d_e_f_0) │ │ │ │ │ -430 , ___d_e_f(other.___d_e_f) │ │ │ │ │ -431 , ___i(other.___i) │ │ │ │ │ -432 , ___w_a_t_c_h(other.___w_a_t_c_h) │ │ │ │ │ -433 , ___r_e_s(other.___r_e_s) │ │ │ │ │ -434 , ___p_a_r_e_n_t(other.___p_a_r_e_n_t) │ │ │ │ │ -435 , ___v_a_l_i_d(other.___v_a_l_i_d) │ │ │ │ │ -436 { │ │ │ │ │ -437 other._valid = false; │ │ │ │ │ -438 } │ │ │ │ │ -439 │ │ │ │ │ -_4_4_0 _~_I_t_e_r_a_t_i_o_n(){ │ │ │ │ │ -441 if(___v_a_l_i_d) │ │ │ │ │ -442 _f_i_n_a_l_i_z_e(); │ │ │ │ │ -443 } │ │ │ │ │ -444 │ │ │ │ │ -_4_5_5 bool _s_t_e_p(CountType i, _r_e_a_l___t_y_p_e def){ │ │ │ │ │ -456 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN │ │ │ │ │ -457 { │ │ │ │ │ -458 if (___p_a_r_e_n_t.___v_e_r_b_o_s_e>0) │ │ │ │ │ -459 std::cout << "=== " << ___p_a_r_e_n_t._n_a_m_e() << ": abort due to infinite or NaN │ │ │ │ │ -defect" │ │ │ │ │ -460 << std::endl; │ │ │ │ │ -461 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t, │ │ │ │ │ -462 ___p_a_r_e_n_t._n_a_m_e() << ": defect=" << Simd::io(def) │ │ │ │ │ -463 << " is infinite or NaN"); │ │ │ │ │ -464 } │ │ │ │ │ -465 if(i == 0) │ │ │ │ │ -466 ___d_e_f_0 = def; │ │ │ │ │ -467 if(___p_a_r_e_n_t.___v_e_r_b_o_s_e > 1){ │ │ │ │ │ -468 if(i!=0) │ │ │ │ │ -469 ___p_a_r_e_n_t._p_r_i_n_t_O_u_t_p_u_t(std::cout,i,def,___d_e_f); │ │ │ │ │ -470 else │ │ │ │ │ -471 ___p_a_r_e_n_t._p_r_i_n_t_O_u_t_p_u_t(std::cout,i,def); │ │ │ │ │ -472 } │ │ │ │ │ -473 ___d_e_f = def; │ │ │ │ │ -474 ___i = i; │ │ │ │ │ -475 ___r_e_s._c_o_n_v_e_r_g_e_d = (Simd::allTrue(def<___d_e_f_0*___p_a_r_e_n_t.___r_e_d_u_c_t_i_o_n || │ │ │ │ │ -def<_r_e_a_l___t_y_p_e(1E-30))); // convergence check │ │ │ │ │ -476 return ___r_e_s._c_o_n_v_e_r_g_e_d; │ │ │ │ │ -477 } │ │ │ │ │ -478 │ │ │ │ │ -479 protected: │ │ │ │ │ -_4_8_0 void _f_i_n_a_l_i_z_e(){ │ │ │ │ │ -481 ___r_e_s._c_o_n_v_e_r_g_e_d = (Simd::allTrue(___d_e_f<___d_e_f_0*___p_a_r_e_n_t.___r_e_d_u_c_t_i_o_n || │ │ │ │ │ -___d_e_f<_r_e_a_l___t_y_p_e(1E-30))); │ │ │ │ │ -482 ___r_e_s._i_t_e_r_a_t_i_o_n_s = ___i; │ │ │ │ │ -483 ___r_e_s._r_e_d_u_c_t_i_o_n = static_cast(Simd::max(___d_e_f/___d_e_f_0)); │ │ │ │ │ -484 ___r_e_s._c_o_n_v___r_a_t_e = pow(___r_e_s._r_e_d_u_c_t_i_o_n,1.0/___i); │ │ │ │ │ -485 ___r_e_s._e_l_a_p_s_e_d = ___w_a_t_c_h.elapsed(); │ │ │ │ │ -486 if (___p_a_r_e_n_t.___v_e_r_b_o_s_e>0) // final print │ │ │ │ │ -487 { │ │ │ │ │ -488 std::cout << "=== rate=" << ___r_e_s._c_o_n_v___r_a_t_e │ │ │ │ │ -489 << ", T=" << ___r_e_s._e_l_a_p_s_e_d │ │ │ │ │ -490 << ", TIT=" << ___r_e_s._e_l_a_p_s_e_d/___r_e_s._i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -491 << ", IT=" << ___r_e_s._i_t_e_r_a_t_i_o_n_s << std::endl; │ │ │ │ │ -492 } │ │ │ │ │ -493 } │ │ │ │ │ -494 │ │ │ │ │ -_4_9_5 _r_e_a_l___t_y_p_e ___d_e_f_0 = 0.0, ___d_e_f = 0.0; │ │ │ │ │ -_4_9_6 CountType ___i; │ │ │ │ │ -_4_9_7 Timer ___w_a_t_c_h; │ │ │ │ │ -_4_9_8 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& ___r_e_s; │ │ │ │ │ -_4_9_9 const _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r& ___p_a_r_e_n_t; │ │ │ │ │ -_5_0_0 bool ___v_a_l_i_d; │ │ │ │ │ -501 }; │ │ │ │ │ -502 │ │ │ │ │ -503 protected: │ │ │ │ │ -_5_0_4 std::shared_ptr> ___o_p; │ │ │ │ │ -_5_0_5 std::shared_ptr> ___p_r_e_c; │ │ │ │ │ -_5_0_6 std::shared_ptr> ___s_p; │ │ │ │ │ -_5_0_7 _s_c_a_l_a_r___r_e_a_l___t_y_p_e ___r_e_d_u_c_t_i_o_n; │ │ │ │ │ -_5_0_8 int ___m_a_x_i_t; │ │ │ │ │ -_5_0_9 int ___v_e_r_b_o_s_e; │ │ │ │ │ -_5_1_0 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y ___c_a_t_e_g_o_r_y; │ │ │ │ │ -511 }; │ │ │ │ │ -512 │ │ │ │ │ -520 template │ │ │ │ │ -_5_2_1 class _S_o_l_v_e_r_H_e_l_p_e_r │ │ │ │ │ -522 { │ │ │ │ │ -523 public: │ │ │ │ │ -_5_2_4 static void _s_e_t_M_a_t_r_i_x (ISTLLinearSolver& solver, │ │ │ │ │ -525 const _B_C_R_S_M_a_t_r_i_x& matrix) │ │ │ │ │ -526 { │ │ │ │ │ -527 static const bool is_direct_solver │ │ │ │ │ -528 = _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_>_:_:_v_a_l_u_e; │ │ │ │ │ -529 _S_o_l_v_e_r_H_e_l_p_e_r_<_I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_B_C_R_S_M_a_t_r_i_x_>_:_: │ │ │ │ │ -530_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_<_i_s___d_i_r_e_c_t___s_o_l_v_e_r_>_:_:_s_e_t_M_a_t_r_i_x(solver,matrix); │ │ │ │ │ -531 } │ │ │ │ │ -532 │ │ │ │ │ -533 protected: │ │ │ │ │ -538 template │ │ │ │ │ -_5_3_9 struct _I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ -540 { │ │ │ │ │ -_5_4_1 static void _s_e_t_M_a_t_r_i_x (ISTLLinearSolver&, │ │ │ │ │ -542 const _B_C_R_S_M_a_t_r_i_x&) │ │ │ │ │ -543 {} │ │ │ │ │ -544 }; │ │ │ │ │ -545 │ │ │ │ │ -550 template │ │ │ │ │ -_5_5_1 struct _I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ -552 { │ │ │ │ │ -_5_5_3 static void _s_e_t_M_a_t_r_i_x (ISTLLinearSolver& solver, │ │ │ │ │ -554 const _B_C_R_S_M_a_t_r_i_x& matrix) │ │ │ │ │ -555 { │ │ │ │ │ -556 solver.setMatrix(matrix); │ │ │ │ │ -557 } │ │ │ │ │ -558 }; │ │ │ │ │ -559 }; │ │ │ │ │ -560 │ │ │ │ │ -564} │ │ │ │ │ -565 │ │ │ │ │ -566#endif │ │ │ │ │ -_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ -Define base class for scalar product and norm. │ │ │ │ │ -_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +116 _s_i_z_e___t_y_p_e rows_, cols_; │ │ │ │ │ +117 │ │ │ │ │ +118 }; │ │ │ │ │ +119 │ │ │ │ │ +120 │ │ │ │ │ +121} // end namespace Dune │ │ │ │ │ +122 │ │ │ │ │ +123#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ -Thrown when a solver aborts due to some problem. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -A linear operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Base class for scalar product and norm computation. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -Default implementation for the scalar case. │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -InverseOperatorResult() │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ +Stores the nonzero entries in a sparse matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type rows, size_type cols) │ │ │ │ │ +Reset the size of an index set. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ +MatrixIndexSet() │ │ │ │ │ Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e │ │ │ │ │ -double condition_estimate │ │ │ │ │ -Estimate of condition number. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_e_l_a_p_s_e_d │ │ │ │ │ -double elapsed │ │ │ │ │ -Elapsed time in seconds. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -int iterations │ │ │ │ │ -Number of iterations. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_r_e_d_u_c_t_i_o_n │ │ │ │ │ -double reduction │ │ │ │ │ -Reduction achieved: . │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Resets all data. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v___r_a_t_e │ │ │ │ │ -double conv_rate │ │ │ │ │ -Convergence rate (average reduction per step) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_p_r_i_n_t_H_e_a_d_e_r │ │ │ │ │ -void printHeader(std::ostream &s) const │ │ │ │ │ -helper function for printing header of solver output │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_~_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -virtual ~InverseOperator() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_p_r_i_n_t_O_u_t_p_u_t │ │ │ │ │ -void printOutput(std::ostream &s, const CountType &iter, const DataType &norm) │ │ │ │ │ -const │ │ │ │ │ -helper function for printing solver output │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_p_r_i_n_t_O_u_t_p_u_t │ │ │ │ │ -void printOutput(std::ostream &s, const CountType &iter, const DataType &norm, │ │ │ │ │ -const DataType &norm_old) const │ │ │ │ │ -helper function for printing solver output │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0 │ │ │ │ │ -apply inverse operator, with given convergence criteria. │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e │ │ │ │ │ -Simd::Scalar< real_type > scalar_real_type │ │ │ │ │ -scalar type underlying the field_type │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -Type of the range of the operator to be inverted. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_n_o_r_m_S_p_a_c_i_n_g │ │ │ │ │ -@ normSpacing │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g │ │ │ │ │ -@ iterationSpacing │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -Type of the domain of the operator to be inverted. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0 │ │ │ │ │ -Apply inverse operator,. │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< field_type >::real_type real_type │ │ │ │ │ -The real type of the field type (is the same if using real numbers, but differs │ │ │ │ │ -for std::complex) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const =0 │ │ │ │ │ -Category of the solver (see SolverCategory::Category) │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -Base class for all implementations of iterative solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -X > > prec, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:313 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ -shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator with given reduction factor. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:374 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p │ │ │ │ │ -std::shared_ptr< const ScalarProduct< X > > _sp │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:506 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ -shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ -Y > > prec, scalar_real_type reduction, int maxit, int verbose) │ │ │ │ │ -General constructor to initialize an iterative solver. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_n_a_m_e │ │ │ │ │ -std::string name() const │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:388 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -IterativeSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec, │ │ │ │ │ -scalar_real_type reduction, int maxit, int verbose) │ │ │ │ │ -General constructor to initialize an iterative solver. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p │ │ │ │ │ -std::shared_ptr< const LinearOperator< X, Y > > _op │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t │ │ │ │ │ -int _maxit │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:508 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e │ │ │ │ │ -int _verbose │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:509 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n │ │ │ │ │ -scalar_real_type _reduction │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:507 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ -IterativeSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp, │ │ │ │ │ -Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ -verbose) │ │ │ │ │ -General constructor to initialize an iterative solver. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___c_a_t_e_g_o_r_y │ │ │ │ │ -SolverCategory::Category _category │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:510 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c │ │ │ │ │ -std::shared_ptr< Preconditioner< X, Y > > _prec │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the solver (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:383 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -Class for controlling iterative methods. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:411 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -Iteration(const IterativeSolver &parent, InverseOperatorResult &res) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:413 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -Iteration(Iteration &&other) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:428 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___r_e_s │ │ │ │ │ -InverseOperatorResult & _res │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:498 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___p_a_r_e_n_t │ │ │ │ │ -const IterativeSolver & _parent │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___w_a_t_c_h │ │ │ │ │ -Timer _watch │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:497 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ -Iteration(const Iteration &)=delete │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___i │ │ │ │ │ -CountType _i │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:496 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___d_e_f_0 │ │ │ │ │ -real_type _def0 │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:495 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_s_t_e_p │ │ │ │ │ -bool step(CountType i, real_type def) │ │ │ │ │ -registers the iteration step, checks for invalid defect norm and convergence. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:455 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_f_i_n_a_l_i_z_e │ │ │ │ │ -void finalize() │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:480 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___d_e_f │ │ │ │ │ -real_type _def │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:495 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_~_I_t_e_r_a_t_i_o_n │ │ │ │ │ -~Iteration() │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:440 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___v_a_l_i_d │ │ │ │ │ -bool _valid │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r │ │ │ │ │ -Helper class for notifying a DUNE-ISTL linear solver about a change of the │ │ │ │ │ -iteration matrix object in... │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:522 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:524 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ -Implementation that works together with iterative ISTL solvers, e.g. Dune:: │ │ │ │ │ -CGSolver or Dune::BiCGSTAB... │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:540 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_<_ _t_r_u_e_,_ _D_u_m_m_y_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:553 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -Categories for the solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_a_d_d │ │ │ │ │ +void add(size_type i, size_type j) │ │ │ │ │ +Add an index to the index set. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_r_o_w_s │ │ │ │ │ +size_type rows() const │ │ │ │ │ +Return the number of rows. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_e_x_p_o_r_t_I_d_x │ │ │ │ │ +void exportIdx(MatrixType &matrix) const │ │ │ │ │ +Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t │ │ │ │ │ +MatrixIndexSet(size_type rows, size_type cols) │ │ │ │ │ +Constructor setting the matrix size. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:26 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_r_o_w_s_i_z_e │ │ │ │ │ +size_type rowsize(size_type row) const │ │ │ │ │ +Return the number of entries in a given row. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_d_e_x_S_e_t_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Return the number of entries. │ │ │ │ │ +DDeeffiinniittiioonn matrixindexset.hh:43 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00173.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: foreach.hh File Reference │ │ │ │ +dune-istl: solvers.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,58 +70,112 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
foreach.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <cassert>
│ │ │ │ + │ │ │ │ +

Implementations of the inverse operator interface. │ │ │ │ +More...

│ │ │ │ +
#include <array>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/simd/io.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ #include <dune/common/std/type_traits.hh>
│ │ │ │ -#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/scaledidmatrix.hh>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include <dune/istl/allocator.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/eigenvalue/arpackpp.hh>
│ │ │ │ +#include <dune/istl/istlexception.hh>
│ │ │ │ +#include <dune/istl/operators.hh>
│ │ │ │ +#include <dune/istl/preconditioner.hh>
│ │ │ │ +#include <dune/istl/scalarproducts.hh>
│ │ │ │ +#include <dune/istl/solver.hh>
│ │ │ │ +#include <dune/istl/solverregistry.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::LoopSolver< X >
 Preconditioned loop solver. More...
 
class  Dune::GradientSolver< X >
 gradient method More...
 
class  Dune::CGSolver< X >
 conjugate gradient method More...
 
class  Dune::BiCGSTABSolver< X >
 Bi-conjugate Gradient Stabilized (BiCG-STAB) More...
 
class  Dune::MINRESSolver< X >
 Minimal Residual Method (MINRES) More...
 
class  Dune::RestartedGMResSolver< X, Y, F >
 implements the Generalized Minimal Residual (GMRes) method More...
 
class  Dune::RestartedFlexibleGMResSolver< X, Y, F >
 implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned) More...
 
class  Dune::GeneralizedPCGSolver< X >
 Generalized preconditioned conjugate gradient solver. More...
 
class  Dune::RestartedFCGSolver< X >
 Accelerated flexible conjugate gradient method. More...
 
class  Dune::CompleteFCGSolver< X >
 Complete flexible conjugate gradient method. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ForEach
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class Matrix >
auto Dune::ForEach::rows (Matrix const &matrix)
 
template<class Matrix >
auto Dune::ForEach::cols (Matrix const &matrix)
 
template<class Vector >
auto Dune::ForEach::size (Vector const &vector)
 
template<class Vector , class F >
std::size_t Dune::flatVectorForEach (Vector &&vector, F &&f, std::size_t offset=0)
 Traverse a blocked vector and call a functor at each scalar entry.
 
template<class Matrix , class F >
std::pair< std::size_t, std::size_t > Dune::flatMatrixForEach (Matrix &&matrix, F &&f, std::size_t rowOffset=0, std::size_t colOffset=0)
 Traverse a blocked matrix and call a functor at each scalar entry.
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("loopsolver", defaultIterativeSolverCreator< Dune::LoopSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("gradientsolver", defaultIterativeSolverCreator< Dune::GradientSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("cgsolver", defaultIterativeSolverCreator< Dune::CGSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("bicgstabsolver", defaultIterativeSolverCreator< Dune::BiCGSTABSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("minressolver", defaultIterativeSolverCreator< Dune::MINRESSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("restartedgmressolver", defaultIterativeSolverCreator< Dune::RestartedGMResSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("restartedflexiblegmressolver", defaultIterativeSolverCreator< Dune::RestartedFlexibleGMResSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("generalizedpcgsolver", defaultIterativeSolverCreator< Dune::GeneralizedPCGSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("restartedfcgsolver", defaultIterativeSolverCreator< Dune::RestartedFCGSolver >())
 
 Dune::DUNE_REGISTER_ITERATIVE_SOLVER ("completefcgsolver", defaultIterativeSolverCreator< Dune::CompleteFCGSolver >())
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Implementations of the inverse operator interface.

│ │ │ │ +

This file provides various preconditioned Krylov methods.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,51 +1,104 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -foreach.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 │ │ │ │ │ +solvers.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s │ │ │ │ │ +Implementations of the inverse operator interface. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_a_l_l_o_c_a_t_o_r_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_e_i_g_e_n_v_a_l_u_e_/_a_r_p_a_c_k_p_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  Preconditioned loop solver. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  gradient method _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  conjugate gradient method _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  Bi-conjugate Gradient Stabilized (BiCG-STAB) _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  Minimal Residual Method (MINRES) _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_ _X_,_ _Y_,_ _F_ _> │ │ │ │ │ +  implements the Generalized Minimal Residual (GMRes) method _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r_<_ _X_,_ _Y_,_ _F_ _> │ │ │ │ │ +  implements the Flexible Generalized Minimal Residual (FGMRes) method │ │ │ │ │ + (right preconditioned) _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  Generalized preconditioned conjugate gradient solver. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  Accelerated flexible conjugate gradient method. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r_<_ _X_ _> │ │ │ │ │ +  Complete flexible conjugate gradient method. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_o_r_E_a_c_h │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_r_o_w_s (_M_a_t_r_i_x const │ │ │ │ │ - &matrix) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_c_o_l_s (_M_a_t_r_i_x const │ │ │ │ │ - &matrix) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_s_i_z_e (Vector const │ │ │ │ │ - &vector) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::size_t  _D_u_n_e_:_:_f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h (Vector │ │ │ │ │ - &&vector, F &&f, std::size_t offset=0) │ │ │ │ │ -  Traverse a blocked vector and call a │ │ │ │ │ - functor at each scalar entry. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::pair< std::size_t, std::size_t >  _D_u_n_e_:_:_f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h (_M_a_t_r_i_x │ │ │ │ │ - &&matrix, F &&f, std::size_t │ │ │ │ │ - rowOffset=0, std::size_t colOffset=0) │ │ │ │ │ -  Traverse a blocked matrix and call a │ │ │ │ │ - functor at each scalar entry. │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("loopsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("gradientsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("cgsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_C_G_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("bicgstabsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("minressolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("restartedgmressolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("restartedflexiblegmressolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("generalizedpcgsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("restartedfcgsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R ("completefcgsolver", │ │ │ │ │ + _d_e_f_a_u_l_t_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_C_r_e_a_t_o_r< _D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r >()) │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Implementations of the inverse operator interface. │ │ │ │ │ +This file provides various preconditioned Krylov methods. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: foreach.hh Source File │ │ │ │ +dune-istl: solvers.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,201 +74,1670 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
foreach.hh
│ │ │ │ +
solvers.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3#pragma once
│ │ │ │ -
4
│ │ │ │ -
5#include<type_traits>
│ │ │ │ -
6#include<utility>
│ │ │ │ -
7#include<cassert>
│ │ │ │ +
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_ISTL_SOLVERS_HH
│ │ │ │ +
7#define DUNE_ISTL_SOLVERS_HH
│ │ │ │
8
│ │ │ │ -
9#include<dune/common/std/type_traits.hh>
│ │ │ │ -
10#include<dune/common/diagonalmatrix.hh>
│ │ │ │ -
11#include<dune/common/hybridutilities.hh>
│ │ │ │ -
12#include<dune/common/indices.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ +
9#include <array>
│ │ │ │ +
10#include <cmath>
│ │ │ │ +
11#include <complex>
│ │ │ │ +
12#include <iostream>
│ │ │ │ +
13#include <memory>
│ │ │ │ +
14#include <type_traits>
│ │ │ │ +
15#include <vector>
│ │ │ │
16
│ │ │ │ -
17namespace Dune{
│ │ │ │ -
18
│ │ │ │ -
19 namespace Impl {
│ │ │ │ -
20
│ │ │ │ -
21 // stolen from dune-functions: we call a type "scalar" if it does not support index accessing
│ │ │ │ -
22 template<class C>
│ │ │ │ -
23 using StaticIndexAccessConcept = decltype(std::declval<C>()[Dune::Indices::_0]);
│ │ │ │ -
24
│ │ │ │ -
25 template<class C>
│ │ │ │ -
26 using IsScalar = std::negation<Dune::Std::is_detected<StaticIndexAccessConcept, std::remove_reference_t<C>>>;
│ │ │ │ -
27
│ │ │ │ -
28 // Type trait for matrix types that supports
│ │ │ │ -
29 // - iteration done row-wise
│ │ │ │ -
30 // - sparse iteration over nonzero entries
│ │ │ │ -
31 template <class T>
│ │ │ │ -
32 struct IsRowMajorSparse : std::false_type {};
│ │ │ │ +
17#include <dune/common/exceptions.hh>
│ │ │ │ +
18#include <dune/common/math.hh>
│ │ │ │ +
19#include <dune/common/simd/io.hh>
│ │ │ │ +
20#include <dune/common/simd/simd.hh>
│ │ │ │ +
21#include <dune/common/std/type_traits.hh>
│ │ │ │ +
22#include <dune/common/timer.hh>
│ │ │ │ +
23
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
31#include <dune/istl/solver.hh>
│ │ │ │ + │ │ │ │
33
│ │ │ │ -
34 // This is supported by the following matrix types:
│ │ │ │ -
35 template <class B, class A>
│ │ │ │ -
36 struct IsRowMajorSparse<BCRSMatrix<B,A>> : std::true_type {};
│ │ │ │ -
37
│ │ │ │ -
38 template <class K, int n>
│ │ │ │ -
39 struct IsRowMajorSparse<DiagonalMatrix<K,n>> : std::true_type {};
│ │ │ │ -
40
│ │ │ │ -
41 template <class K, int n>
│ │ │ │ -
42 struct IsRowMajorSparse<ScaledIdentityMatrix<K,n>> : std::true_type {};
│ │ │ │ -
43
│ │ │ │ -
44
│ │ │ │ -
45 template <class Matrix>
│ │ │ │ -
46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Matrix::N()> { return {}; }
│ │ │ │ -
47
│ │ │ │ -
48 template <class Matrix>
│ │ │ │ -
49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Matrix::M()> { return {}; }
│ │ │ │ -
50
│ │ │ │ -
51 template <class Matrix>
│ │ │ │ -
52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N()) { return matrix.N(); }
│ │ │ │ -
53
│ │ │ │ -
54 template <class Matrix>
│ │ │ │ -
55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M()) { return matrix.M(); }
│ │ │ │ -
56
│ │ │ │ -
57 template <class Vector>
│ │ │ │ -
58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Vector::size()> { return {}; }
│ │ │ │ -
59
│ │ │ │ -
60 template <class Vector>
│ │ │ │ -
61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size()) { return vector.size(); }
│ │ │ │ -
62
│ │ │ │ -
63
│ │ │ │ -
64 } // end namespace Impl
│ │ │ │ +
34namespace Dune {
│ │ │ │ +
46 //=====================================================================
│ │ │ │ +
47 // Implementation of this interface
│ │ │ │ +
48 //=====================================================================
│ │ │ │ +
49
│ │ │ │ +
58 template<class X>
│ │ │ │ +
│ │ │ │ +
59 class LoopSolver : public IterativeSolver<X,X> {
│ │ │ │ +
60 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
65
│ │ │ │ -
│ │ │ │ -
66namespace ForEach{
│ │ │ │ -
67
│ │ │ │ -
68 template <class Matrix>
│ │ │ │ -
69 auto rows(Matrix const& matrix) { return Impl::rows(matrix, PriorityTag<5>{}); }
│ │ │ │ -
70
│ │ │ │ -
71 template <class Matrix>
│ │ │ │ -
72 auto cols(Matrix const& matrix) { return Impl::cols(matrix, PriorityTag<5>{}); }
│ │ │ │ -
73
│ │ │ │ -
74 template <class Vector>
│ │ │ │ -
75 auto size(Vector const& vector) { return Impl::size(vector, PriorityTag<5>{}); }
│ │ │ │ -
76
│ │ │ │ -
77} // namespace ForEach
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
79
│ │ │ │ +
66 // copy base class constructors
│ │ │ │ +
67 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
68
│ │ │ │ +
69 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
70 using IterativeSolver<X,X>::apply;
│ │ │ │ +
71
│ │ │ │ +
│ │ │ │ +
73 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
74 {
│ │ │ │ +
75 Iteration iteration(*this, res);
│ │ │ │ +
76 _prec->pre(x,b);
│ │ │ │ +
77
│ │ │ │ +
78 // overwrite b with defect
│ │ │ │ +
79 _op->applyscaleadd(-1,x,b);
│ │ │ │
80
│ │ │ │ -
81
│ │ │ │ -
94template <class Vector, class F>
│ │ │ │ -
│ │ │ │ -
95std::size_t flatVectorForEach(Vector&& vector, F&& f, std::size_t offset = 0)
│ │ │ │ -
96{
│ │ │ │ -
97 using V = std::decay_t<Vector>;
│ │ │ │ -
98 if constexpr( Impl::IsScalar<V>::value )
│ │ │ │ -
99 {
│ │ │ │ -
100 f(vector, offset);
│ │ │ │ -
101 return 1;
│ │ │ │ -
102 }
│ │ │ │ -
103 else
│ │ │ │ -
104 {
│ │ │ │ -
105 std::size_t idx = 0;
│ │ │ │ -
106 Hybrid::forEach(Dune::range(ForEach::size(vector)), [&](auto i) {
│ │ │ │ -
107 idx += flatVectorForEach(vector[i], f, offset + idx);
│ │ │ │ -
108 });
│ │ │ │ -
109 return idx;
│ │ │ │ -
110 }
│ │ │ │ -
111}
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
113
│ │ │ │ -
131template <class Matrix, class F>
│ │ │ │ -
│ │ │ │ -
132std::pair<std::size_t,std::size_t> flatMatrixForEach(Matrix&& matrix, F&& f, std::size_t rowOffset = 0, std::size_t colOffset = 0)
│ │ │ │ -
133{
│ │ │ │ -
134 using M = std::decay_t<Matrix>;
│ │ │ │ -
135 if constexpr ( Impl::IsScalar<M>::value )
│ │ │ │ -
136 {
│ │ │ │ -
137 f(matrix,rowOffset,colOffset);
│ │ │ │ -
138 return {1,1};
│ │ │ │ -
139 }
│ │ │ │ -
140 else
│ │ │ │ -
141 {
│ │ │ │ -
142 // if M supports the IsRowMajorSparse type trait: iterate just over the nonzero entries and
│ │ │ │ -
143 // and compute the flat row/col size directly
│ │ │ │ -
144 if constexpr ( Impl::IsRowMajorSparse<M>::value )
│ │ │ │ -
145 {
│ │ │ │ -
146 using Block = std::decay_t<decltype(matrix[0][0])>;
│ │ │ │ -
147
│ │ │ │ -
148 // find an existing block or at least try to create one
│ │ │ │ -
149 auto block = [&]{
│ │ │ │ -
150 for (auto const& row : matrix)
│ │ │ │ -
151 for (auto const& entry : row)
│ │ │ │ -
152 return entry;
│ │ │ │ -
153 return Block{};
│ │ │ │ -
154 }();
│ │ │ │ -
155
│ │ │ │ -
156 // compute the scalar size of the block
│ │ │ │ -
157 auto [blockRows, blockCols] = flatMatrixForEach(block, [](...){});
│ │ │ │ -
158
│ │ │ │ -
159 // check whether we have valid sized blocks
│ │ │ │ -
160 assert( ( blockRows!=0 or blockCols!=0 ) and "the block size can't be zero");
│ │ │ │ -
161
│ │ │ │ -
162 for ( auto rowIt = matrix.begin(); rowIt != matrix.end(); rowIt++ )
│ │ │ │ -
163 {
│ │ │ │ -
164 auto&& row = *rowIt;
│ │ │ │ -
165 auto rowIdx = rowIt.index();
│ │ │ │ -
166 for ( auto colIt = row.begin(); colIt != row.end(); colIt++ )
│ │ │ │ -
167 {
│ │ │ │ -
168 auto&& entry = *colIt;
│ │ │ │ -
169 auto colIdx = colIt.index();
│ │ │ │ -
170 auto [ dummyRows, dummyCols ] = flatMatrixForEach(entry, f, rowOffset + rowIdx*blockRows, colOffset + colIdx*blockCols);
│ │ │ │ -
171 assert( dummyRows == blockRows and dummyCols == blockCols and "we need the same size of each block in this matrix type");
│ │ │ │ -
172 }
│ │ │ │ -
173 }
│ │ │ │ -
174
│ │ │ │ -
175 return { matrix.N()*blockRows, matrix.M()*blockCols };
│ │ │ │ -
176 }
│ │ │ │ -
177 // all other matrix types are accessed index-wise with dynamic flat row/col counting
│ │ │ │ -
178 else
│ │ │ │ -
179 {
│ │ │ │ -
180 std::size_t r = 0, c = 0;
│ │ │ │ -
181 std::size_t nRows, nCols;
│ │ │ │ -
182
│ │ │ │ -
183 Hybrid::forEach(Dune::range(ForEach::rows(matrix)), [&](auto i) {
│ │ │ │ -
184 c = 0;
│ │ │ │ -
185 Hybrid::forEach(Dune::range(ForEach::cols(matrix)), [&](auto j) {
│ │ │ │ -
186 std::tie(nRows,nCols) = flatMatrixForEach(matrix[i][j], f, rowOffset + r, colOffset + c);
│ │ │ │ -
187 c += nCols;
│ │ │ │ -
188 });
│ │ │ │ -
189 r += nRows;
│ │ │ │ -
190 });
│ │ │ │ -
191 return {r,c};
│ │ │ │ -
192 }
│ │ │ │ -
193 }
│ │ │ │ -
194}
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196} // namespace Dune
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
This file implements a quadratic matrix of fixed size which is a multiple of the identity.
│ │ │ │ +
81 // compute norm, \todo parallelization
│ │ │ │ +
82 real_type def = _sp->norm(b);
│ │ │ │ +
83 if(iteration.step(0, def)){
│ │ │ │ +
84 _prec->post(x);
│ │ │ │ +
85 return;
│ │ │ │ +
86 }
│ │ │ │ +
87 // prepare preconditioner
│ │ │ │ +
88
│ │ │ │ +
89 // allocate correction vector
│ │ │ │ +
90 X v(x);
│ │ │ │ +
91
│ │ │ │ +
92 // iteration loop
│ │ │ │ +
93 int i=1;
│ │ │ │ +
94 for ( ; i<=_maxit; i++ )
│ │ │ │ +
95 {
│ │ │ │ +
96 v = 0; // clear correction
│ │ │ │ +
97 _prec->apply(v,b); // apply preconditioner
│ │ │ │ +
98 x += v; // update solution
│ │ │ │ +
99 _op->applyscaleadd(-1,v,b); // update defect
│ │ │ │ +
100 def=_sp->norm(b); // comp defect norm
│ │ │ │ +
101 if(iteration.step(i, def))
│ │ │ │ +
102 break;
│ │ │ │ +
103 }
│ │ │ │ +
104
│ │ │ │ +
105 // postprocess preconditioner
│ │ │ │ +
106 _prec->post(x);
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
109 protected:
│ │ │ │ +
110 using IterativeSolver<X,X>::_op;
│ │ │ │ +
111 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
112 using IterativeSolver<X,X>::_sp;
│ │ │ │ + │ │ │ │ +
114 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
115 using IterativeSolver<X,X>::_verbose;
│ │ │ │ + │ │ │ │ +
117 };
│ │ │ │ +
│ │ │ │ +
118 DUNE_REGISTER_ITERATIVE_SOLVER("loopsolver", defaultIterativeSolverCreator<Dune::LoopSolver>());
│ │ │ │ +
119
│ │ │ │ +
120
│ │ │ │ +
121 // all these solvers are taken from the SUMO library
│ │ │ │ +
123 template<class X>
│ │ │ │ +
│ │ │ │ +
124 class GradientSolver : public IterativeSolver<X,X> {
│ │ │ │ +
125 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
129 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
130
│ │ │ │ +
131 // copy base class constructors
│ │ │ │ +
132 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
133
│ │ │ │ +
134 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
135 using IterativeSolver<X,X>::apply;
│ │ │ │ +
136
│ │ │ │ +
│ │ │ │ +
142 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
143 {
│ │ │ │ +
144 Iteration iteration(*this, res);
│ │ │ │ +
145 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ +
146
│ │ │ │ +
147 _op->applyscaleadd(-1,x,b); // overwrite b with defec
│ │ │ │ +
148
│ │ │ │ +
149 real_type def = _sp->norm(b); // compute norm
│ │ │ │ +
150 if(iteration.step(0, def)){
│ │ │ │ +
151 _prec->post(x);
│ │ │ │ +
152 return;
│ │ │ │ +
153 }
│ │ │ │ +
154
│ │ │ │ +
155 X p(x); // create local vectors
│ │ │ │ +
156 X q(b);
│ │ │ │ +
157
│ │ │ │ +
158 int i=1; // loop variables
│ │ │ │ +
159 field_type lambda;
│ │ │ │ +
160 for ( ; i<=_maxit; i++ )
│ │ │ │ +
161 {
│ │ │ │ +
162 p = 0; // clear correction
│ │ │ │ +
163 _prec->apply(p,b); // apply preconditioner
│ │ │ │ +
164 _op->apply(p,q); // q=Ap
│ │ │ │ +
165 auto alpha = _sp->dot(q,p);
│ │ │ │ +
166 lambda = Simd::cond(def==field_type(0.),
│ │ │ │ +
167 field_type(0.), // no need for minimization if def is already 0
│ │ │ │ +
168 _sp->dot(p,b)/alpha); // minimization
│ │ │ │ +
169 x.axpy(lambda,p); // update solution
│ │ │ │ +
170 b.axpy(-lambda,q); // update defect
│ │ │ │ +
171
│ │ │ │ +
172 def =_sp->norm(b); // comp defect norm
│ │ │ │ +
173 if(iteration.step(i, def))
│ │ │ │ +
174 break;
│ │ │ │ +
175 }
│ │ │ │ +
176 // postprocess preconditioner
│ │ │ │ +
177 _prec->post(x);
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │ +
179
│ │ │ │ +
180 protected:
│ │ │ │ +
181 using IterativeSolver<X,X>::_op;
│ │ │ │ +
182 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
183 using IterativeSolver<X,X>::_sp;
│ │ │ │ + │ │ │ │ +
185 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
186 using IterativeSolver<X,X>::_verbose;
│ │ │ │ + │ │ │ │ +
188 };
│ │ │ │ +
│ │ │ │ +
189 DUNE_REGISTER_ITERATIVE_SOLVER("gradientsolver", defaultIterativeSolverCreator<Dune::GradientSolver>());
│ │ │ │ +
190
│ │ │ │ +
192 template<class X>
│ │ │ │ +
│ │ │ │ +
193 class CGSolver : public IterativeSolver<X,X> {
│ │ │ │ +
194 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
198 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
199
│ │ │ │ +
200 // copy base class constructors
│ │ │ │ +
201 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
202
│ │ │ │ +
203 private:
│ │ │ │ + │ │ │ │ +
205
│ │ │ │ +
206 protected:
│ │ │ │ +
207
│ │ │ │ +
208 static constexpr bool enableConditionEstimate = (std::is_same_v<field_type,float> || std::is_same_v<field_type,double>);
│ │ │ │ +
209
│ │ │ │ +
210 public:
│ │ │ │ +
211
│ │ │ │ +
212 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
213 using IterativeSolver<X,X>::apply;
│ │ │ │ +
214
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
223 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) : IterativeSolver<X,X>(op, prec, reduction, maxit, verbose),
│ │ │ │ +
224 condition_estimate_(condition_estimate)
│ │ │ │ +
225 {
│ │ │ │ +
226 if (condition_estimate && !enableConditionEstimate) {
│ │ │ │ +
227 condition_estimate_ = false;
│ │ │ │ +
228 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
│ │ │ │ +
229 }
│ │ │ │ +
230 }
│ │ │ │ +
│ │ │ │ +
231
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
240 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose),
│ │ │ │ +
241 condition_estimate_(condition_estimate)
│ │ │ │ +
242 {
│ │ │ │ +
243 if (condition_estimate && !(std::is_same<field_type,float>::value || std::is_same<field_type,double>::value)) {
│ │ │ │ +
244 condition_estimate_ = false;
│ │ │ │ +
245 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
│ │ │ │ +
246 }
│ │ │ │ +
247 }
│ │ │ │ +
│ │ │ │ +
248
│ │ │ │ +
│ │ │ │ +
256 CGSolver (std::shared_ptr<const LinearOperator<X,X>> op, std::shared_ptr<ScalarProduct<X>> sp,
│ │ │ │ +
257 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ +
258 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
│ │ │ │ +
259 : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose),
│ │ │ │ +
260 condition_estimate_(condition_estimate)
│ │ │ │ +
261 {
│ │ │ │ +
262 if (condition_estimate && !(std::is_same<field_type,float>::value || std::is_same<field_type,double>::value)) {
│ │ │ │ +
263 condition_estimate_ = false;
│ │ │ │ +
264 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
│ │ │ │ +
265 }
│ │ │ │ +
266 }
│ │ │ │ +
│ │ │ │ +
267
│ │ │ │ +
│ │ │ │ +
279 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
280 {
│ │ │ │ +
281 Iteration iteration(*this,res);
│ │ │ │ +
282 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ +
283
│ │ │ │ +
284 _op->applyscaleadd(-1,x,b); // overwrite b with defect
│ │ │ │ +
285
│ │ │ │ +
286 real_type def = _sp->norm(b); // compute norm
│ │ │ │ +
287 if(iteration.step(0, def)){
│ │ │ │ +
288 _prec->post(x);
│ │ │ │ +
289 return;
│ │ │ │ +
290 }
│ │ │ │ +
291
│ │ │ │ +
292 X p(x); // the search direction
│ │ │ │ +
293 X q(x); // a temporary vector
│ │ │ │ +
294
│ │ │ │ +
295 // Remember lambda and beta values for condition estimate
│ │ │ │ +
296 std::vector<real_type> lambdas(0);
│ │ │ │ +
297 std::vector<real_type> betas(0);
│ │ │ │ +
298
│ │ │ │ +
299 // some local variables
│ │ │ │ +
300 field_type rho,rholast,lambda,alpha,beta;
│ │ │ │ +
301
│ │ │ │ +
302 // determine initial search direction
│ │ │ │ +
303 p = 0; // clear correction
│ │ │ │ +
304 _prec->apply(p,b); // apply preconditioner
│ │ │ │ +
305 rholast = _sp->dot(p,b); // orthogonalization
│ │ │ │ +
306
│ │ │ │ +
307 // the loop
│ │ │ │ +
308 int i=1;
│ │ │ │ +
309 for ( ; i<=_maxit; i++ )
│ │ │ │ +
310 {
│ │ │ │ +
311 // minimize in given search direction p
│ │ │ │ +
312 _op->apply(p,q); // q=Ap
│ │ │ │ +
313 alpha = _sp->dot(p,q); // scalar product
│ │ │ │ +
314 lambda = Simd::cond(def==field_type(0.), field_type(0.), rholast/alpha); // minimization
│ │ │ │ +
315 if constexpr (enableConditionEstimate)
│ │ │ │ +
316 if (condition_estimate_)
│ │ │ │ +
317 lambdas.push_back(std::real(lambda));
│ │ │ │ +
318 x.axpy(lambda,p); // update solution
│ │ │ │ +
319 b.axpy(-lambda,q); // update defect
│ │ │ │ +
320
│ │ │ │ +
321 // convergence test
│ │ │ │ +
322 def=_sp->norm(b); // comp defect norm
│ │ │ │ +
323 if(iteration.step(i, def))
│ │ │ │ +
324 break;
│ │ │ │ +
325
│ │ │ │ +
326 // determine new search direction
│ │ │ │ +
327 q = 0; // clear correction
│ │ │ │ +
328 _prec->apply(q,b); // apply preconditioner
│ │ │ │ +
329 rho = _sp->dot(q,b); // orthogonalization
│ │ │ │ +
330 beta = Simd::cond(def==field_type(0.), field_type(0.), rho/rholast); // scaling factor
│ │ │ │ +
331 if constexpr (enableConditionEstimate)
│ │ │ │ +
332 if (condition_estimate_)
│ │ │ │ +
333 betas.push_back(std::real(beta));
│ │ │ │ +
334 p *= beta; // scale old search direction
│ │ │ │ +
335 p += q; // orthogonalization with correction
│ │ │ │ +
336 rholast = rho; // remember rho for recurrence
│ │ │ │ +
337 }
│ │ │ │ +
338
│ │ │ │ +
339 _prec->post(x); // postprocess preconditioner
│ │ │ │ +
340
│ │ │ │ +
341 if (condition_estimate_) {
│ │ │ │ +
342#if HAVE_ARPACKPP
│ │ │ │ +
343 if constexpr (enableConditionEstimate) {
│ │ │ │ +
344 using std::sqrt;
│ │ │ │ +
345
│ │ │ │ +
346 // Build T matrix which has extreme eigenvalues approximating
│ │ │ │ +
347 // those of the original system
│ │ │ │ +
348 // (see Y. Saad, Iterative methods for sparse linear systems)
│ │ │ │ +
349
│ │ │ │ + │ │ │ │ +
351
│ │ │ │ +
352 for (auto row = T.createbegin(); row != T.createend(); ++row) {
│ │ │ │ +
353 if (row.index() > 0)
│ │ │ │ +
354 row.insert(row.index()-1);
│ │ │ │ +
355 row.insert(row.index());
│ │ │ │ +
356 if (row.index() < T.N() - 1)
│ │ │ │ +
357 row.insert(row.index()+1);
│ │ │ │ +
358 }
│ │ │ │ +
359 for (int row = 0; row < i; ++row) {
│ │ │ │ +
360 if (row > 0) {
│ │ │ │ +
361 T[row][row-1] = sqrt(betas[row-1]) / lambdas[row-1];
│ │ │ │ +
362 }
│ │ │ │ +
363
│ │ │ │ +
364 T[row][row] = 1.0 / lambdas[row];
│ │ │ │ +
365 if (row > 0) {
│ │ │ │ +
366 T[row][row] += betas[row-1] / lambdas[row-1];
│ │ │ │ +
367 }
│ │ │ │ +
368
│ │ │ │ +
369 if (row < i - 1) {
│ │ │ │ +
370 T[row][row+1] = sqrt(betas[row]) / lambdas[row];
│ │ │ │ +
371 }
│ │ │ │ +
372 }
│ │ │ │ +
373
│ │ │ │ +
374 // Compute largest and smallest eigenvalue of T matrix and return as estimate
│ │ │ │ + │ │ │ │ +
376
│ │ │ │ +
377 real_type eps = 0.0;
│ │ │ │ +
378 COND_VEC eigv;
│ │ │ │ +
379 real_type min_eigv, max_eigv;
│ │ │ │ +
380 arpack.computeSymMinMagnitude (eps, eigv, min_eigv);
│ │ │ │ +
381 arpack.computeSymMaxMagnitude (eps, eigv, max_eigv);
│ │ │ │ +
382
│ │ │ │ +
383 res.condition_estimate = max_eigv / min_eigv;
│ │ │ │ +
384
│ │ │ │ +
385 if (this->_verbose > 0) {
│ │ │ │ +
386 std::cout << "Min eigv estimate: " << Simd::io(min_eigv) << '\n';
│ │ │ │ +
387 std::cout << "Max eigv estimate: " << Simd::io(max_eigv) << '\n';
│ │ │ │ +
388 std::cout << "Condition estimate: "
│ │ │ │ +
389 << Simd::io(max_eigv / min_eigv) << std::endl;
│ │ │ │ +
390 }
│ │ │ │ +
391 }
│ │ │ │ +
392#else
│ │ │ │ +
393 std::cerr << "WARNING: Condition estimate was requested. This requires ARPACK, but ARPACK was not found!" << std::endl;
│ │ │ │ +
394#endif
│ │ │ │ +
395 }
│ │ │ │ +
396 }
│ │ │ │ +
│ │ │ │ +
397
│ │ │ │ +
398 private:
│ │ │ │ +
399 bool condition_estimate_ = false;
│ │ │ │ +
400
│ │ │ │ +
401 // Matrix and vector types used for condition estimate
│ │ │ │ + │ │ │ │ + │ │ │ │ +
404
│ │ │ │ +
405 protected:
│ │ │ │ +
406 using IterativeSolver<X,X>::_op;
│ │ │ │ +
407 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
408 using IterativeSolver<X,X>::_sp;
│ │ │ │ + │ │ │ │ +
410 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
411 using IterativeSolver<X,X>::_verbose;
│ │ │ │ + │ │ │ │ +
413 };
│ │ │ │ +
│ │ │ │ +
414 DUNE_REGISTER_ITERATIVE_SOLVER("cgsolver", defaultIterativeSolverCreator<Dune::CGSolver>());
│ │ │ │ +
415
│ │ │ │ +
416 // Ronald Kriemanns BiCG-STAB implementation from Sumo
│ │ │ │ +
418 template<class X>
│ │ │ │ +
│ │ │ │ +
419 class BiCGSTABSolver : public IterativeSolver<X,X> {
│ │ │ │ +
420 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
424 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
425
│ │ │ │ +
426 // copy base class constructors
│ │ │ │ +
427 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
428
│ │ │ │ +
429 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
430 using IterativeSolver<X,X>::apply;
│ │ │ │ +
431
│ │ │ │ +
│ │ │ │ +
439 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
440 {
│ │ │ │ +
441 using std::abs;
│ │ │ │ +
442 const Simd::Scalar<real_type> EPSILON=1e-80;
│ │ │ │ +
443 using std::abs;
│ │ │ │ +
444 double it;
│ │ │ │ +
445 field_type rho, rho_new, alpha, beta, h, omega;
│ │ │ │ +
446 real_type norm;
│ │ │ │ +
447
│ │ │ │ +
448 //
│ │ │ │ +
449 // get vectors and matrix
│ │ │ │ +
450 //
│ │ │ │ +
451 X& r=b;
│ │ │ │ +
452 X p(x);
│ │ │ │ +
453 X v(x);
│ │ │ │ +
454 X t(x);
│ │ │ │ +
455 X y(x);
│ │ │ │ +
456 X rt(x);
│ │ │ │ +
457
│ │ │ │ +
458 //
│ │ │ │ +
459 // begin iteration
│ │ │ │ +
460 //
│ │ │ │ +
461
│ │ │ │ +
462 // r = r - Ax; rt = r
│ │ │ │ +
463 Iteration<double> iteration(*this,res);
│ │ │ │ +
464 _prec->pre(x,r); // prepare preconditioner
│ │ │ │ +
465
│ │ │ │ +
466 _op->applyscaleadd(-1,x,r); // overwrite b with defect
│ │ │ │ +
467
│ │ │ │ +
468 rt=r;
│ │ │ │ +
469
│ │ │ │ +
470 norm = _sp->norm(r);
│ │ │ │ +
471 if(iteration.step(0, norm)){
│ │ │ │ +
472 _prec->post(x);
│ │ │ │ +
473 return;
│ │ │ │ +
474 }
│ │ │ │ +
475 p=0;
│ │ │ │ +
476 v=0;
│ │ │ │ +
477
│ │ │ │ +
478 rho = 1;
│ │ │ │ +
479 alpha = 1;
│ │ │ │ +
480 omega = 1;
│ │ │ │ +
481
│ │ │ │ +
482 //
│ │ │ │ +
483 // iteration
│ │ │ │ +
484 //
│ │ │ │ +
485
│ │ │ │ +
486 for (it = 0.5; it < _maxit; it+=.5)
│ │ │ │ +
487 {
│ │ │ │ +
488 //
│ │ │ │ +
489 // preprocess, set vecsizes etc.
│ │ │ │ +
490 //
│ │ │ │ +
491
│ │ │ │ +
492 // rho_new = < rt , r >
│ │ │ │ +
493 rho_new = _sp->dot(rt,r);
│ │ │ │ +
494
│ │ │ │ +
495 // look if breakdown occurred
│ │ │ │ +
496 if (Simd::allTrue(abs(rho) <= EPSILON))
│ │ │ │ +
497 DUNE_THROW(SolverAbort,"breakdown in BiCGSTAB - rho "
│ │ │ │ +
498 << Simd::io(rho) << " <= EPSILON " << EPSILON
│ │ │ │ +
499 << " after " << it << " iterations");
│ │ │ │ +
500 if (Simd::allTrue(abs(omega) <= EPSILON))
│ │ │ │ +
501 DUNE_THROW(SolverAbort,"breakdown in BiCGSTAB - omega "
│ │ │ │ +
502 << Simd::io(omega) << " <= EPSILON " << EPSILON
│ │ │ │ +
503 << " after " << it << " iterations");
│ │ │ │ +
504
│ │ │ │ +
505
│ │ │ │ +
506 if (it<1)
│ │ │ │ +
507 p = r;
│ │ │ │ +
508 else
│ │ │ │ +
509 {
│ │ │ │ +
510 beta = Simd::cond(norm==field_type(0.),
│ │ │ │ +
511 field_type(0.), // no need for orthogonalization if norm is already 0
│ │ │ │ +
512 ( rho_new / rho ) * ( alpha / omega ));
│ │ │ │ +
513 p.axpy(-omega,v); // p = r + beta (p - omega*v)
│ │ │ │ +
514 p *= beta;
│ │ │ │ +
515 p += r;
│ │ │ │ +
516 }
│ │ │ │ +
517
│ │ │ │ +
518 // y = W^-1 * p
│ │ │ │ +
519 y = 0;
│ │ │ │ +
520 _prec->apply(y,p); // apply preconditioner
│ │ │ │ +
521
│ │ │ │ +
522 // v = A * y
│ │ │ │ +
523 _op->apply(y,v);
│ │ │ │ +
524
│ │ │ │ +
525 // alpha = rho_new / < rt, v >
│ │ │ │ +
526 h = _sp->dot(rt,v);
│ │ │ │ +
527
│ │ │ │ +
528 if ( Simd::allTrue(abs(h) < EPSILON) )
│ │ │ │ +
529 DUNE_THROW(SolverAbort,"abs(h) < EPSILON in BiCGSTAB - abs(h) "
│ │ │ │ +
530 << Simd::io(abs(h)) << " < EPSILON " << EPSILON
│ │ │ │ +
531 << " after " << it << " iterations");
│ │ │ │ +
532
│ │ │ │ +
533 alpha = Simd::cond(norm==field_type(0.),
│ │ │ │ +
534 field_type(0.),
│ │ │ │ +
535 rho_new / h);
│ │ │ │ +
536
│ │ │ │ +
537 // apply first correction to x
│ │ │ │ +
538 // x <- x + alpha y
│ │ │ │ +
539 x.axpy(alpha,y);
│ │ │ │ +
540
│ │ │ │ +
541 // r = r - alpha*v
│ │ │ │ +
542 r.axpy(-alpha,v);
│ │ │ │ +
543
│ │ │ │ +
544 //
│ │ │ │ +
545 // test stop criteria
│ │ │ │ +
546 //
│ │ │ │ +
547
│ │ │ │ +
548 norm = _sp->norm(r);
│ │ │ │ +
549 if(iteration.step(it, norm)){
│ │ │ │ +
550 break;
│ │ │ │ +
551 }
│ │ │ │ +
552
│ │ │ │ +
553 it+=.5;
│ │ │ │ +
554
│ │ │ │ +
555 // y = W^-1 * r
│ │ │ │ +
556 y = 0;
│ │ │ │ +
557 _prec->apply(y,r);
│ │ │ │ +
558
│ │ │ │ +
559 // t = A * y
│ │ │ │ +
560 _op->apply(y,t);
│ │ │ │ +
561
│ │ │ │ +
562 // omega = < t, r > / < t, t >
│ │ │ │ +
563 h = _sp->dot(t,t);
│ │ │ │ +
564 omega = Simd::cond(norm==field_type(0.),
│ │ │ │ +
565 field_type(0.),
│ │ │ │ +
566 _sp->dot(t,r)/h);
│ │ │ │ +
567
│ │ │ │ +
568 // apply second correction to x
│ │ │ │ +
569 // x <- x + omega y
│ │ │ │ +
570 x.axpy(omega,y);
│ │ │ │ +
571
│ │ │ │ +
572 // r = s - omega*t (remember : r = s)
│ │ │ │ +
573 r.axpy(-omega,t);
│ │ │ │ +
574
│ │ │ │ +
575 rho = rho_new;
│ │ │ │ +
576
│ │ │ │ +
577 //
│ │ │ │ +
578 // test stop criteria
│ │ │ │ +
579 //
│ │ │ │ +
580
│ │ │ │ +
581 norm = _sp->norm(r);
│ │ │ │ +
582 if(iteration.step(it, norm)){
│ │ │ │ +
583 break;
│ │ │ │ +
584 }
│ │ │ │ +
585 } // end for
│ │ │ │ +
586
│ │ │ │ +
587 _prec->post(x); // postprocess preconditioner
│ │ │ │ +
588 }
│ │ │ │ +
│ │ │ │ +
589
│ │ │ │ +
590 protected:
│ │ │ │ +
591 using IterativeSolver<X,X>::_op;
│ │ │ │ +
592 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
593 using IterativeSolver<X,X>::_sp;
│ │ │ │ + │ │ │ │ +
595 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
596 using IterativeSolver<X,X>::_verbose;
│ │ │ │ +
597 template<class CountType>
│ │ │ │ + │ │ │ │ +
599 };
│ │ │ │ +
│ │ │ │ +
600 DUNE_REGISTER_ITERATIVE_SOLVER("bicgstabsolver", defaultIterativeSolverCreator<Dune::BiCGSTABSolver>());
│ │ │ │ +
601
│ │ │ │ +
608 template<class X>
│ │ │ │ +
│ │ │ │ +
609 class MINRESSolver : public IterativeSolver<X,X> {
│ │ │ │ +
610 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
614 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
615
│ │ │ │ +
616 // copy base class constructors
│ │ │ │ +
617 using IterativeSolver<X,X>::IterativeSolver;
│ │ │ │ +
618
│ │ │ │ +
619 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
620 using IterativeSolver<X,X>::apply;
│ │ │ │ +
621
│ │ │ │ +
│ │ │ │ +
627 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
628 {
│ │ │ │ +
629 using std::sqrt;
│ │ │ │ +
630 using std::abs;
│ │ │ │ +
631 Iteration iteration(*this, res);
│ │ │ │ +
632 // prepare preconditioner
│ │ │ │ +
633 _prec->pre(x,b);
│ │ │ │ +
634
│ │ │ │ +
635 // overwrite rhs with defect
│ │ │ │ +
636 _op->applyscaleadd(-1.0,x,b); // b -= Ax
│ │ │ │ +
637
│ │ │ │ +
638 // some temporary vectors
│ │ │ │ +
639 X z(b), dummy(b);
│ │ │ │ +
640 z = 0.0;
│ │ │ │ +
641
│ │ │ │ +
642 // calculate preconditioned defect
│ │ │ │ +
643 _prec->apply(z,b); // r = W^-1 (b - Ax)
│ │ │ │ +
644 real_type def = _sp->norm(z);
│ │ │ │ +
645 if (iteration.step(0, def)){
│ │ │ │ +
646 _prec->post(x);
│ │ │ │ +
647 return;
│ │ │ │ +
648 }
│ │ │ │ +
649
│ │ │ │ +
650 // recurrence coefficients as computed in Lanczos algorithm
│ │ │ │ +
651 field_type alpha, beta;
│ │ │ │ +
652 // diagonal entries of givens rotation
│ │ │ │ +
653 std::array<real_type,2> c{{0.0,0.0}};
│ │ │ │ +
654 // off-diagonal entries of givens rotation
│ │ │ │ +
655 std::array<field_type,2> s{{0.0,0.0}};
│ │ │ │ +
656
│ │ │ │ +
657 // recurrence coefficients (column k of tridiag matrix T_k)
│ │ │ │ +
658 std::array<field_type,3> T{{0.0,0.0,0.0}};
│ │ │ │ +
659
│ │ │ │ +
660 // the rhs vector of the min problem
│ │ │ │ +
661 std::array<field_type,2> xi{{1.0,0.0}};
│ │ │ │ +
662
│ │ │ │ +
663 // beta is real and positive in exact arithmetic
│ │ │ │ +
664 // since it is the norm of the basis vectors (in unpreconditioned case)
│ │ │ │ +
665 beta = sqrt(_sp->dot(b,z));
│ │ │ │ +
666 field_type beta0 = beta;
│ │ │ │ +
667
│ │ │ │ +
668 // the search directions
│ │ │ │ +
669 std::array<X,3> p{{b,b,b}};
│ │ │ │ +
670 p[0] = 0.0;
│ │ │ │ +
671 p[1] = 0.0;
│ │ │ │ +
672 p[2] = 0.0;
│ │ │ │ +
673
│ │ │ │ +
674 // orthonormal basis vectors (in unpreconditioned case)
│ │ │ │ +
675 std::array<X,3> q{{b,b,b}};
│ │ │ │ +
676 q[0] = 0.0;
│ │ │ │ +
677 q[1] *= Simd::cond(def==field_type(0.),
│ │ │ │ +
678 field_type(0.),
│ │ │ │ +
679 real_type(1.0)/beta);
│ │ │ │ +
680 q[2] = 0.0;
│ │ │ │ +
681
│ │ │ │ +
682 z *= Simd::cond(def==field_type(0.),
│ │ │ │ +
683 field_type(0.),
│ │ │ │ +
684 real_type(1.0)/beta);
│ │ │ │ +
685
│ │ │ │ +
686 // the loop
│ │ │ │ +
687 int i = 1;
│ │ │ │ +
688 for( ; i<=_maxit; i++) {
│ │ │ │ +
689
│ │ │ │ +
690 dummy = z;
│ │ │ │ +
691 int i1 = i%3,
│ │ │ │ +
692 i0 = (i1+2)%3,
│ │ │ │ +
693 i2 = (i1+1)%3;
│ │ │ │ +
694
│ │ │ │ +
695 // symmetrically preconditioned Lanczos algorithm (see Greenbaum p.121)
│ │ │ │ +
696 _op->apply(z,q[i2]); // q[i2] = Az
│ │ │ │ +
697 q[i2].axpy(-beta,q[i0]);
│ │ │ │ +
698 // alpha is real since it is the diagonal entry of the hermitian tridiagonal matrix
│ │ │ │ +
699 // from the Lanczos Algorithm
│ │ │ │ +
700 // so the order in the scalar product doesn't matter even for the complex case
│ │ │ │ +
701 alpha = _sp->dot(z,q[i2]);
│ │ │ │ +
702 q[i2].axpy(-alpha,q[i1]);
│ │ │ │ +
703
│ │ │ │ +
704 z = 0.0;
│ │ │ │ +
705 _prec->apply(z,q[i2]);
│ │ │ │ +
706
│ │ │ │ +
707 // beta is real and positive in exact arithmetic
│ │ │ │ +
708 // since it is the norm of the basis vectors (in unpreconditioned case)
│ │ │ │ +
709 beta = sqrt(_sp->dot(q[i2],z));
│ │ │ │ +
710
│ │ │ │ +
711 q[i2] *= Simd::cond(def==field_type(0.),
│ │ │ │ +
712 field_type(0.),
│ │ │ │ +
713 real_type(1.0)/beta);
│ │ │ │ +
714 z *= Simd::cond(def==field_type(0.),
│ │ │ │ +
715 field_type(0.),
│ │ │ │ +
716 real_type(1.0)/beta);
│ │ │ │ +
717
│ │ │ │ +
718 // QR Factorization of recurrence coefficient matrix
│ │ │ │ +
719 // apply previous givens rotations to last column of T
│ │ │ │ +
720 T[1] = T[2];
│ │ │ │ +
721 if(i>2) {
│ │ │ │ +
722 T[0] = s[i%2]*T[1];
│ │ │ │ +
723 T[1] = c[i%2]*T[1];
│ │ │ │ +
724 }
│ │ │ │ +
725 if(i>1) {
│ │ │ │ +
726 T[2] = c[(i+1)%2]*alpha - s[(i+1)%2]*T[1];
│ │ │ │ +
727 T[1] = c[(i+1)%2]*T[1] + s[(i+1)%2]*alpha;
│ │ │ │ +
728 }
│ │ │ │ +
729 else
│ │ │ │ +
730 T[2] = alpha;
│ │ │ │ +
731
│ │ │ │ +
732 // update QR factorization
│ │ │ │ +
733 generateGivensRotation(T[2],beta,c[i%2],s[i%2]);
│ │ │ │ +
734 // to last column of T_k
│ │ │ │ +
735 T[2] = c[i%2]*T[2] + s[i%2]*beta;
│ │ │ │ +
736 // and to the rhs xi of the min problem
│ │ │ │ +
737 xi[i%2] = -s[i%2]*xi[(i+1)%2];
│ │ │ │ +
738 xi[(i+1)%2] *= c[i%2];
│ │ │ │ +
739
│ │ │ │ +
740 // compute correction direction
│ │ │ │ +
741 p[i2] = dummy;
│ │ │ │ +
742 p[i2].axpy(-T[1],p[i1]);
│ │ │ │ +
743 p[i2].axpy(-T[0],p[i0]);
│ │ │ │ +
744 p[i2] *= real_type(1.0)/T[2];
│ │ │ │ +
745
│ │ │ │ +
746 // apply correction/update solution
│ │ │ │ +
747 x.axpy(beta0*xi[(i+1)%2],p[i2]);
│ │ │ │ +
748
│ │ │ │ +
749 // remember beta_old
│ │ │ │ +
750 T[2] = beta;
│ │ │ │ +
751
│ │ │ │ +
752 // check for convergence
│ │ │ │ +
753 // the last entry in the rhs of the min-problem is the residual
│ │ │ │ +
754 def = abs(beta0*xi[i%2]);
│ │ │ │ +
755 if(iteration.step(i, def)){
│ │ │ │ +
756 break;
│ │ │ │ +
757 }
│ │ │ │ +
758 } // end for
│ │ │ │ +
759
│ │ │ │ +
760 // postprocess preconditioner
│ │ │ │ +
761 _prec->post(x);
│ │ │ │ +
762 }
│ │ │ │ +
│ │ │ │ +
763
│ │ │ │ +
764 private:
│ │ │ │ +
765
│ │ │ │ +
766 void generateGivensRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
│ │ │ │ +
767 {
│ │ │ │ +
768 using std::sqrt;
│ │ │ │ +
769 using std::abs;
│ │ │ │ +
770 using std::max;
│ │ │ │ +
771 using std::min;
│ │ │ │ +
772 const real_type eps = 1e-15;
│ │ │ │ +
773 real_type norm_dx = abs(dx);
│ │ │ │ +
774 real_type norm_dy = abs(dy);
│ │ │ │ +
775 real_type norm_max = max(norm_dx, norm_dy);
│ │ │ │ +
776 real_type norm_min = min(norm_dx, norm_dy);
│ │ │ │ +
777 real_type temp = norm_min/norm_max;
│ │ │ │ +
778 // we rewrite the code in a vectorizable fashion
│ │ │ │ +
779 cs = Simd::cond(norm_dy < eps,
│ │ │ │ +
780 real_type(1.0),
│ │ │ │ +
781 Simd::cond(norm_dx < eps,
│ │ │ │ +
782 real_type(0.0),
│ │ │ │ +
783 Simd::cond(norm_dy > norm_dx,
│ │ │ │ +
784 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)*temp,
│ │ │ │ +
785 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)
│ │ │ │ +
786 )));
│ │ │ │ +
787 sn = Simd::cond(norm_dy < eps,
│ │ │ │ +
788 field_type(0.0),
│ │ │ │ +
789 Simd::cond(norm_dx < eps,
│ │ │ │ +
790 field_type(1.0),
│ │ │ │ +
791 Simd::cond(norm_dy > norm_dx,
│ │ │ │ +
792 // dy and dx are real in exact arithmetic
│ │ │ │ +
793 // thus dx*dy is real so we can explicitly enforce it
│ │ │ │ +
794 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dx*dy/norm_dx/norm_dy,
│ │ │ │ +
795 // dy and dx is real in exact arithmetic
│ │ │ │ +
796 // so we don't have to conjugate both of them
│ │ │ │ +
797 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dy/dx
│ │ │ │ +
798 )));
│ │ │ │ +
799 }
│ │ │ │ +
800
│ │ │ │ +
801 protected:
│ │ │ │ +
802 using IterativeSolver<X,X>::_op;
│ │ │ │ +
803 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
804 using IterativeSolver<X,X>::_sp;
│ │ │ │ +
805 using IterativeSolver<X,X>::_reduction;
│ │ │ │ +
806 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
807 using IterativeSolver<X,X>::_verbose;
│ │ │ │ + │ │ │ │ +
809 };
│ │ │ │ +
│ │ │ │ +
810 DUNE_REGISTER_ITERATIVE_SOLVER("minressolver", defaultIterativeSolverCreator<Dune::MINRESSolver>());
│ │ │ │ +
811
│ │ │ │ +
825 template<class X, class Y=X, class F = Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
827 {
│ │ │ │ +
828 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
832 using typename IterativeSolver<X,Y>::real_type;
│ │ │ │ +
833
│ │ │ │ +
834 protected:
│ │ │ │ + │ │ │ │ +
836
│ │ │ │ + │ │ │ │ + │ │ │ │ +
841
│ │ │ │ +
842 public:
│ │ │ │ +
843
│ │ │ │ +
│ │ │ │ +
850 RestartedGMResSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int restart, int maxit, int verbose) :
│ │ │ │ +
851 IterativeSolver<X,Y>::IterativeSolver(op,prec,reduction,maxit,verbose),
│ │ │ │ +
852 _restart(restart)
│ │ │ │ +
853 {}
│ │ │ │ +
│ │ │ │ +
854
│ │ │ │ +
│ │ │ │ +
861 RestartedGMResSolver (const LinearOperator<X,Y>& op, const ScalarProduct<X>& sp, Preconditioner<X,Y>& prec, scalar_real_type reduction, int restart, int maxit, int verbose) :
│ │ │ │ +
862 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ +
863 _restart(restart)
│ │ │ │ +
864 {}
│ │ │ │ +
│ │ │ │ +
865
│ │ │ │ +
│ │ │ │ +
878 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ +
879 IterativeSolver<X,Y>::IterativeSolver(op,prec,configuration),
│ │ │ │ +
880 _restart(configuration.get<int>("restart"))
│ │ │ │ +
881 {}
│ │ │ │ +
│ │ │ │ +
882
│ │ │ │ +
│ │ │ │ +
883 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<const ScalarProduct<X> > sp, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ +
884 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,configuration),
│ │ │ │ +
885 _restart(configuration.get<int>("restart"))
│ │ │ │ +
886 {}
│ │ │ │ +
│ │ │ │ +
887
│ │ │ │ +
│ │ │ │ +
894 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
│ │ │ │ +
895 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ +
896 std::shared_ptr<Preconditioner<X,Y>> prec,
│ │ │ │ +
897 scalar_real_type reduction, int restart, int maxit, int verbose) :
│ │ │ │ +
898 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ +
899 _restart(restart)
│ │ │ │ +
900 {}
│ │ │ │ +
│ │ │ │ +
901
│ │ │ │ +
│ │ │ │ +
910 virtual void apply (X& x, Y& b, InverseOperatorResult& res)
│ │ │ │ +
911 {
│ │ │ │ +
912 apply(x,b,Simd::max(_reduction),res);
│ │ │ │ +
913 }
│ │ │ │ +
│ │ │ │ +
914
│ │ │ │ +
│ │ │ │ +
923 virtual void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ +
924 {
│ │ │ │ +
925 using std::abs;
│ │ │ │ +
926 const Simd::Scalar<real_type> EPSILON = 1e-80;
│ │ │ │ +
927 const int m = _restart;
│ │ │ │ +
928 real_type norm = 0.0;
│ │ │ │ +
929 int j = 1;
│ │ │ │ +
930 std::vector<field_type,fAlloc> s(m+1), sn(m);
│ │ │ │ +
931 std::vector<real_type,rAlloc> cs(m);
│ │ │ │ +
932 // need copy of rhs if GMRes has to be restarted
│ │ │ │ +
933 Y b2(b);
│ │ │ │ +
934 // helper vector
│ │ │ │ +
935 Y w(b);
│ │ │ │ +
936 std::vector< std::vector<field_type,fAlloc> > H(m+1,s);
│ │ │ │ +
937 std::vector<F> v(m+1,b);
│ │ │ │ +
938
│ │ │ │ +
939 Iteration iteration(*this,res);
│ │ │ │ +
940
│ │ │ │ +
941 // clear solver statistics and set res.converged to false
│ │ │ │ +
942 _prec->pre(x,b);
│ │ │ │ +
943
│ │ │ │ +
944 // calculate defect and overwrite rhs with it
│ │ │ │ +
945 _op->applyscaleadd(-1.0,x,b); // b -= Ax
│ │ │ │ +
946 // calculate preconditioned defect
│ │ │ │ +
947 v[0] = 0.0; _prec->apply(v[0],b); // r = W^-1 b
│ │ │ │ +
948 norm = _sp->norm(v[0]);
│ │ │ │ +
949 if(iteration.step(0, norm)){
│ │ │ │ +
950 _prec->post(x);
│ │ │ │ +
951 return;
│ │ │ │ +
952 }
│ │ │ │ +
953
│ │ │ │ +
954 while(j <= _maxit && res.converged != true) {
│ │ │ │ +
955
│ │ │ │ +
956 int i = 0;
│ │ │ │ +
957 v[0] *= Simd::cond(norm==real_type(0.),
│ │ │ │ +
958 real_type(0.),
│ │ │ │ +
959 real_type(1.0)/norm);
│ │ │ │ +
960 s[0] = norm;
│ │ │ │ +
961 for(i=1; i<m+1; i++)
│ │ │ │ +
962 s[i] = 0.0;
│ │ │ │ +
963
│ │ │ │ +
964 for(i=0; i < m && j <= _maxit && res.converged != true; i++, j++) {
│ │ │ │ +
965 w = 0.0;
│ │ │ │ +
966 // use v[i+1] as temporary vector
│ │ │ │ +
967 v[i+1] = 0.0;
│ │ │ │ +
968 // do Arnoldi algorithm
│ │ │ │ +
969 _op->apply(v[i],v[i+1]);
│ │ │ │ +
970 _prec->apply(w,v[i+1]);
│ │ │ │ +
971 for(int k=0; k<i+1; k++) {
│ │ │ │ +
972 // notice that _sp->dot(v[k],w) = v[k]\adjoint w
│ │ │ │ +
973 // so one has to pay attention to the order
│ │ │ │ +
974 // in the scalar product for the complex case
│ │ │ │ +
975 // doing the modified Gram-Schmidt algorithm
│ │ │ │ +
976 H[k][i] = _sp->dot(v[k],w);
│ │ │ │ +
977 // w -= H[k][i] * v[k]
│ │ │ │ +
978 w.axpy(-H[k][i],v[k]);
│ │ │ │ +
979 }
│ │ │ │ +
980 H[i+1][i] = _sp->norm(w);
│ │ │ │ +
981 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))
│ │ │ │ +
982 DUNE_THROW(SolverAbort,
│ │ │ │ +
983 "breakdown in GMRes - |w| == 0.0 after " << j << " iterations");
│ │ │ │ +
984
│ │ │ │ +
985 // normalize new vector
│ │ │ │ +
986 v[i+1] = w;
│ │ │ │ +
987 v[i+1] *= Simd::cond(norm==real_type(0.),
│ │ │ │ +
988 field_type(0.),
│ │ │ │ +
989 real_type(1.0)/H[i+1][i]);
│ │ │ │ +
990
│ │ │ │ +
991 // update QR factorization
│ │ │ │ +
992 for(int k=0; k<i; k++)
│ │ │ │ +
993 applyPlaneRotation(H[k][i],H[k+1][i],cs[k],sn[k]);
│ │ │ │ +
994
│ │ │ │ +
995 // compute new givens rotation
│ │ │ │ +
996 generatePlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ +
997 // finish updating QR factorization
│ │ │ │ +
998 applyPlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ +
999 applyPlaneRotation(s[i],s[i+1],cs[i],sn[i]);
│ │ │ │ +
1000
│ │ │ │ +
1001 // norm of the defect is the last component the vector s
│ │ │ │ +
1002 norm = abs(s[i+1]);
│ │ │ │ +
1003
│ │ │ │ +
1004 iteration.step(j, norm);
│ │ │ │ +
1005
│ │ │ │ +
1006 } // end for
│ │ │ │ +
1007
│ │ │ │ +
1008 // calculate update vector
│ │ │ │ +
1009 w = 0.0;
│ │ │ │ +
1010 update(w,i,H,s,v);
│ │ │ │ +
1011 // and current iterate
│ │ │ │ +
1012 x += w;
│ │ │ │ +
1013
│ │ │ │ +
1014 // restart GMRes if convergence was not achieved,
│ │ │ │ +
1015 // i.e. linear defect has not reached desired reduction
│ │ │ │ +
1016 // and if j < _maxit (do not restart on last iteration)
│ │ │ │ +
1017 if( res.converged != true && j < _maxit ) {
│ │ │ │ +
1018
│ │ │ │ +
1019 if(_verbose > 0)
│ │ │ │ +
1020 std::cout << "=== GMRes::restart" << std::endl;
│ │ │ │ +
1021 // get saved rhs
│ │ │ │ +
1022 b = b2;
│ │ │ │ +
1023 // calculate new defect
│ │ │ │ +
1024 _op->applyscaleadd(-1.0,x,b); // b -= Ax;
│ │ │ │ +
1025 // calculate preconditioned defect
│ │ │ │ +
1026 v[0] = 0.0;
│ │ │ │ +
1027 _prec->apply(v[0],b);
│ │ │ │ +
1028 norm = _sp->norm(v[0]);
│ │ │ │ +
1029 }
│ │ │ │ +
1030
│ │ │ │ +
1031 } //end while
│ │ │ │ +
1032
│ │ │ │ +
1033 // postprocess preconditioner
│ │ │ │ +
1034 _prec->post(x);
│ │ │ │ +
1035 }
│ │ │ │ +
│ │ │ │ +
1036
│ │ │ │ +
1037 protected :
│ │ │ │ +
1038
│ │ │ │ +
│ │ │ │ +
1039 void update(X& w, int i,
│ │ │ │ +
1040 const std::vector<std::vector<field_type,fAlloc> >& H,
│ │ │ │ +
1041 const std::vector<field_type,fAlloc>& s,
│ │ │ │ +
1042 const std::vector<X>& v) {
│ │ │ │ +
1043 // solution vector of the upper triangular system
│ │ │ │ +
1044 std::vector<field_type,fAlloc> y(s);
│ │ │ │ +
1045
│ │ │ │ +
1046 // backsolve
│ │ │ │ +
1047 for(int a=i-1; a>=0; a--) {
│ │ │ │ +
1048 field_type rhs(s[a]);
│ │ │ │ +
1049 for(int b=a+1; b<i; b++)
│ │ │ │ +
1050 rhs -= H[a][b]*y[b];
│ │ │ │ +
1051 y[a] = Simd::cond(rhs==field_type(0.),
│ │ │ │ +
1052 field_type(0.),
│ │ │ │ +
1053 rhs/H[a][a]);
│ │ │ │ +
1054
│ │ │ │ +
1055 // compute update on the fly
│ │ │ │ +
1056 // w += y[a]*v[a]
│ │ │ │ +
1057 w.axpy(y[a],v[a]);
│ │ │ │ +
1058 }
│ │ │ │ +
1059 }
│ │ │ │ +
│ │ │ │ +
1060
│ │ │ │ +
1061 template<typename T>
│ │ │ │ +
│ │ │ │ +
1062 typename std::enable_if<std::is_same<field_type,real_type>::value,T>::type conjugate(const T& t) {
│ │ │ │ +
1063 return t;
│ │ │ │ +
1064 }
│ │ │ │ +
│ │ │ │ +
1065
│ │ │ │ +
1066 template<typename T>
│ │ │ │ +
│ │ │ │ +
1067 typename std::enable_if<!std::is_same<field_type,real_type>::value,T>::type conjugate(const T& t) {
│ │ │ │ +
1068 using std::conj;
│ │ │ │ +
1069 return conj(t);
│ │ │ │ +
1070 }
│ │ │ │ +
│ │ │ │ +
1071
│ │ │ │ +
1072 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1074 {
│ │ │ │ +
1075 using std::sqrt;
│ │ │ │ +
1076 using std::abs;
│ │ │ │ +
1077 using std::max;
│ │ │ │ +
1078 using std::min;
│ │ │ │ +
1079 const real_type eps = 1e-15;
│ │ │ │ +
1080 real_type norm_dx = abs(dx);
│ │ │ │ +
1081 real_type norm_dy = abs(dy);
│ │ │ │ +
1082 real_type norm_max = max(norm_dx, norm_dy);
│ │ │ │ +
1083 real_type norm_min = min(norm_dx, norm_dy);
│ │ │ │ +
1084 real_type temp = norm_min/norm_max;
│ │ │ │ +
1085 // we rewrite the code in a vectorizable fashion
│ │ │ │ +
1086 cs = Simd::cond(norm_dy < eps,
│ │ │ │ +
1087 real_type(1.0),
│ │ │ │ +
1088 Simd::cond(norm_dx < eps,
│ │ │ │ +
1089 real_type(0.0),
│ │ │ │ +
1090 Simd::cond(norm_dy > norm_dx,
│ │ │ │ +
1091 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)*temp,
│ │ │ │ +
1092 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)
│ │ │ │ +
1093 )));
│ │ │ │ +
1094 sn = Simd::cond(norm_dy < eps,
│ │ │ │ +
1095 field_type(0.0),
│ │ │ │ +
1096 Simd::cond(norm_dx < eps,
│ │ │ │ +
1097 field_type(1.0),
│ │ │ │ +
1098 Simd::cond(norm_dy > norm_dx,
│ │ │ │ +
1099 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dx*conjugate(dy)/norm_dx/norm_dy,
│ │ │ │ +
1100 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*conjugate(dy/dx)
│ │ │ │ +
1101 )));
│ │ │ │ +
1102 }
│ │ │ │ +
│ │ │ │ +
1103
│ │ │ │ +
1104
│ │ │ │ +
1105 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1107 {
│ │ │ │ +
1108 field_type temp = cs * dx + sn * dy;
│ │ │ │ +
1109 dy = -conjugate(sn) * dx + cs * dy;
│ │ │ │ +
1110 dx = temp;
│ │ │ │ +
1111 }
│ │ │ │ +
│ │ │ │ +
1112
│ │ │ │ +
1113 using IterativeSolver<X,Y>::_op;
│ │ │ │ +
1114 using IterativeSolver<X,Y>::_prec;
│ │ │ │ +
1115 using IterativeSolver<X,Y>::_sp;
│ │ │ │ +
1116 using IterativeSolver<X,Y>::_reduction;
│ │ │ │ +
1117 using IterativeSolver<X,Y>::_maxit;
│ │ │ │ +
1118 using IterativeSolver<X,Y>::_verbose;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1121 };
│ │ │ │ +
│ │ │ │ +
1122 DUNE_REGISTER_ITERATIVE_SOLVER("restartedgmressolver", defaultIterativeSolverCreator<Dune::RestartedGMResSolver>());
│ │ │ │ +
1123
│ │ │ │ +
1137 template<class X, class Y=X, class F = Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1139 {
│ │ │ │ +
1140 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
1145
│ │ │ │ +
1146 private:
│ │ │ │ + │ │ │ │ +
1148
│ │ │ │ +
1150 using fAlloc = typename RestartedGMResSolver<X,Y>::fAlloc;
│ │ │ │ +
1152 using rAlloc = typename RestartedGMResSolver<X,Y>::rAlloc;
│ │ │ │ +
1153
│ │ │ │ +
1154 public:
│ │ │ │ +
1155 // copy base class constructors
│ │ │ │ +
1156 using RestartedGMResSolver<X,Y>::RestartedGMResSolver;
│ │ │ │ +
1157
│ │ │ │ +
1158 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
1159 using RestartedGMResSolver<X,Y>::apply;
│ │ │ │ +
1160
│ │ │ │ +
│ │ │ │ +
1169 void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
│ │ │ │ +
1170 {
│ │ │ │ +
1171 using std::abs;
│ │ │ │ +
1172 const Simd::Scalar<real_type> EPSILON = 1e-80;
│ │ │ │ +
1173 const int m = _restart;
│ │ │ │ +
1174 real_type norm = 0.0;
│ │ │ │ +
1175 int i, j = 1, k;
│ │ │ │ +
1176 std::vector<field_type,fAlloc> s(m+1), sn(m);
│ │ │ │ +
1177 std::vector<real_type,rAlloc> cs(m);
│ │ │ │ +
1178 // helper vector
│ │ │ │ +
1179 Y tmp(b);
│ │ │ │ +
1180 std::vector< std::vector<field_type,fAlloc> > H(m+1,s);
│ │ │ │ +
1181 std::vector<F> v(m+1,b);
│ │ │ │ +
1182 std::vector<X> w(m+1,b);
│ │ │ │ +
1183
│ │ │ │ +
1184 Iteration iteration(*this,res);
│ │ │ │ +
1185 // setup preconditioner if it does something in pre
│ │ │ │ +
1186
│ │ │ │ +
1187 // calculate residual and overwrite a copy of the rhs with it
│ │ │ │ +
1188 _prec->pre(x, b);
│ │ │ │ +
1189 v[0] = b;
│ │ │ │ +
1190 _op->applyscaleadd(-1.0, x, v[0]); // b -= Ax
│ │ │ │ +
1191
│ │ │ │ +
1192 norm = _sp->norm(v[0]); // the residual norm
│ │ │ │ +
1193 if(iteration.step(0, norm)){
│ │ │ │ +
1194 _prec->post(x);
│ │ │ │ +
1195 return;
│ │ │ │ +
1196 }
│ │ │ │ +
1197
│ │ │ │ +
1198 // start iterations
│ │ │ │ +
1199 res.converged = false;;
│ │ │ │ +
1200 while(j <= _maxit && res.converged != true)
│ │ │ │ +
1201 {
│ │ │ │ +
1202 v[0] *= (1.0 / norm);
│ │ │ │ +
1203 s[0] = norm;
│ │ │ │ +
1204 for(i=1; i<m+1; ++i)
│ │ │ │ +
1205 s[i] = 0.0;
│ │ │ │ +
1206
│ │ │ │ +
1207 // inner loop
│ │ │ │ +
1208 for(i=0; i < m && j <= _maxit && res.converged != true; i++, j++)
│ │ │ │ +
1209 {
│ │ │ │ +
1210 w[i] = 0.0;
│ │ │ │ +
1211 // compute wi = M^-1*vi (also called zi)
│ │ │ │ +
1212 _prec->apply(w[i], v[i]);
│ │ │ │ +
1213 // compute vi = A*wi
│ │ │ │ +
1214 // use v[i+1] as temporary vector for w
│ │ │ │ +
1215 _op->apply(w[i], v[i+1]);
│ │ │ │ +
1216 // do Arnoldi algorithm
│ │ │ │ +
1217 for(int kk=0; kk<i+1; kk++)
│ │ │ │ +
1218 {
│ │ │ │ +
1219 // notice that _sp->dot(v[k],v[i+1]) = v[k]\adjoint v[i+1]
│ │ │ │ +
1220 // so one has to pay attention to the order
│ │ │ │ +
1221 // in the scalar product for the complex case
│ │ │ │ +
1222 // doing the modified Gram-Schmidt algorithm
│ │ │ │ +
1223 H[kk][i] = _sp->dot(v[kk],v[i+1]);
│ │ │ │ +
1224 // w -= H[k][i] * v[kk]
│ │ │ │ +
1225 v[i+1].axpy(-H[kk][i], v[kk]);
│ │ │ │ +
1226 }
│ │ │ │ +
1227 H[i+1][i] = _sp->norm(v[i+1]);
│ │ │ │ +
1228 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))
│ │ │ │ +
1229 DUNE_THROW(SolverAbort, "breakdown in fGMRes - |w| (-> "
│ │ │ │ +
1230 << w[i] << ") == 0.0 after "
│ │ │ │ +
1231 << j << " iterations");
│ │ │ │ +
1232
│ │ │ │ +
1233 // v[i+1] = w*1/H[i+1][i]
│ │ │ │ +
1234 v[i+1] *= real_type(1.0)/H[i+1][i];
│ │ │ │ +
1235
│ │ │ │ +
1236 // update QR factorization
│ │ │ │ +
1237 for(k=0; k<i; k++)
│ │ │ │ +
1238 this->applyPlaneRotation(H[k][i],H[k+1][i],cs[k],sn[k]);
│ │ │ │ +
1239
│ │ │ │ +
1240 // compute new givens rotation
│ │ │ │ +
1241 this->generatePlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ +
1242
│ │ │ │ +
1243 // finish updating QR factorization
│ │ │ │ +
1244 this->applyPlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
│ │ │ │ +
1245 this->applyPlaneRotation(s[i],s[i+1],cs[i],sn[i]);
│ │ │ │ +
1246
│ │ │ │ +
1247 // norm of the residual is the last component of vector s
│ │ │ │ +
1248 using std::abs;
│ │ │ │ +
1249 norm = abs(s[i+1]);
│ │ │ │ +
1250 iteration.step(j, norm);
│ │ │ │ +
1251 } // end inner for loop
│ │ │ │ +
1252
│ │ │ │ +
1253 // calculate update vector
│ │ │ │ +
1254 tmp = 0.0;
│ │ │ │ +
1255 this->update(tmp, i, H, s, w);
│ │ │ │ +
1256 // and update current iterate
│ │ │ │ +
1257 x += tmp;
│ │ │ │ +
1258
│ │ │ │ +
1259 // restart fGMRes if convergence was not achieved,
│ │ │ │ +
1260 // i.e. linear residual has not reached desired reduction
│ │ │ │ +
1261 // and if still j < _maxit (do not restart on last iteration)
│ │ │ │ +
1262 if( res.converged != true && j < _maxit)
│ │ │ │ +
1263 {
│ │ │ │ +
1264 if (_verbose > 0)
│ │ │ │ +
1265 std::cout << "=== fGMRes::restart" << std::endl;
│ │ │ │ +
1266 // get rhs
│ │ │ │ +
1267 v[0] = b;
│ │ │ │ +
1268 // calculate new defect
│ │ │ │ +
1269 _op->applyscaleadd(-1.0, x,v[0]); // b -= Ax;
│ │ │ │ +
1270 // calculate preconditioned defect
│ │ │ │ +
1271 norm = _sp->norm(v[0]); // update the residual norm
│ │ │ │ +
1272 }
│ │ │ │ +
1273
│ │ │ │ +
1274 } // end outer while loop
│ │ │ │ +
1275
│ │ │ │ +
1276 // post-process preconditioner
│ │ │ │ +
1277 _prec->post(x);
│ │ │ │ +
1278 }
│ │ │ │ +
│ │ │ │ +
1279
│ │ │ │ +
1280private:
│ │ │ │ +
1281 using RestartedGMResSolver<X,Y>::_op;
│ │ │ │ +
1282 using RestartedGMResSolver<X,Y>::_prec;
│ │ │ │ +
1283 using RestartedGMResSolver<X,Y>::_sp;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
1288 using Iteration = typename IterativeSolver<X,X>::template Iteration<unsigned int>;
│ │ │ │ +
1289 };
│ │ │ │ +
│ │ │ │ +
1290 DUNE_REGISTER_ITERATIVE_SOLVER("restartedflexiblegmressolver", defaultIterativeSolverCreator<Dune::RestartedFlexibleGMResSolver>());
│ │ │ │ +
1291
│ │ │ │ +
1305 template<class X>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1307 {
│ │ │ │ +
1308 public:
│ │ │ │ +
1309 using typename IterativeSolver<X,X>::domain_type;
│ │ │ │ +
1310 using typename IterativeSolver<X,X>::range_type;
│ │ │ │ +
1311 using typename IterativeSolver<X,X>::field_type;
│ │ │ │ +
1312 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
1313
│ │ │ │ +
1314 private:
│ │ │ │ + │ │ │ │ +
1316
│ │ │ │ + │ │ │ │ +
1319
│ │ │ │ +
1320 public:
│ │ │ │ +
1321
│ │ │ │ +
1322 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
1323 using IterativeSolver<X,X>::apply;
│ │ │ │ +
1324
│ │ │ │ +
│ │ │ │ +
1331 GeneralizedPCGSolver (const LinearOperator<X,X>& op, Preconditioner<X,X>& prec, scalar_real_type reduction, int maxit, int verbose, int restart = 10) :
│ │ │ │ +
1332 IterativeSolver<X,X>::IterativeSolver(op,prec,reduction,maxit,verbose),
│ │ │ │ +
1333 _restart(restart)
│ │ │ │ +
1334 {}
│ │ │ │ +
│ │ │ │ +
1335
│ │ │ │ +
│ │ │ │ +
1343 GeneralizedPCGSolver (const LinearOperator<X,X>& op, const ScalarProduct<X>& sp, Preconditioner<X,X>& prec, scalar_real_type reduction, int maxit, int verbose, int restart = 10) :
│ │ │ │ +
1344 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ +
1345 _restart(restart)
│ │ │ │ +
1346 {}
│ │ │ │ +
│ │ │ │ +
1347
│ │ │ │ +
1348
│ │ │ │ +
│ │ │ │ +
1361 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ +
1362 IterativeSolver<X,X>::IterativeSolver(op,prec,configuration),
│ │ │ │ +
1363 _restart(configuration.get<int>("restart"))
│ │ │ │ +
1364 {}
│ │ │ │ +
│ │ │ │ +
1365
│ │ │ │ +
│ │ │ │ +
1366 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X> > op, std::shared_ptr<const ScalarProduct<X> > sp, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ +
1367 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,configuration),
│ │ │ │ +
1368 _restart(configuration.get<int>("restart"))
│ │ │ │ +
1369 {}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
1377 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ +
1378 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ +
1379 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ +
1380 scalar_real_type reduction, int maxit, int verbose,
│ │ │ │ +
1381 int restart = 10) :
│ │ │ │ +
1382 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
│ │ │ │ +
1383 _restart(restart)
│ │ │ │ +
1384 {}
│ │ │ │ +
│ │ │ │ +
1385
│ │ │ │ +
│ │ │ │ +
1391 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
1392 {
│ │ │ │ +
1393 Iteration iteration(*this, res);
│ │ │ │ +
1394 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ +
1395 _op->applyscaleadd(-1,x,b); // overwrite b with defect
│ │ │ │ +
1396
│ │ │ │ +
1397 std::vector<std::shared_ptr<X> > p(_restart);
│ │ │ │ +
1398 std::vector<field_type,fAlloc> pp(_restart);
│ │ │ │ +
1399 X q(x); // a temporary vector
│ │ │ │ +
1400 X prec_res(x); // a temporary vector for preconditioner output
│ │ │ │ +
1401
│ │ │ │ +
1402 p[0].reset(new X(x));
│ │ │ │ +
1403
│ │ │ │ +
1404 real_type def = _sp->norm(b); // compute norm
│ │ │ │ +
1405 if(iteration.step(0, def)){
│ │ │ │ +
1406 _prec->post(x);
│ │ │ │ +
1407 return;
│ │ │ │ +
1408 }
│ │ │ │ +
1409 // some local variables
│ │ │ │ +
1410 field_type rho, lambda;
│ │ │ │ +
1411
│ │ │ │ +
1412 int i=0;
│ │ │ │ +
1413 int ii=0;
│ │ │ │ +
1414 // determine initial search direction
│ │ │ │ +
1415 *(p[0]) = 0; // clear correction
│ │ │ │ +
1416 _prec->apply(*(p[0]),b); // apply preconditioner
│ │ │ │ +
1417 rho = _sp->dot(*(p[0]),b); // orthogonalization
│ │ │ │ +
1418 _op->apply(*(p[0]),q); // q=Ap
│ │ │ │ +
1419 pp[0] = _sp->dot(*(p[0]),q); // scalar product
│ │ │ │ +
1420 lambda = rho/pp[0]; // minimization
│ │ │ │ +
1421 x.axpy(lambda,*(p[0])); // update solution
│ │ │ │ +
1422 b.axpy(-lambda,q); // update defect
│ │ │ │ +
1423
│ │ │ │ +
1424 // convergence test
│ │ │ │ +
1425 def=_sp->norm(b); // comp defect norm
│ │ │ │ +
1426 ++i;
│ │ │ │ +
1427 if(iteration.step(i, def)){
│ │ │ │ +
1428 _prec->post(x);
│ │ │ │ +
1429 return;
│ │ │ │ +
1430 }
│ │ │ │ +
1431
│ │ │ │ +
1432 while(i<_maxit) {
│ │ │ │ +
1433 // the loop
│ │ │ │ +
1434 int end=std::min(_restart, _maxit-i+1);
│ │ │ │ +
1435 for (ii=1; ii<end; ++ii )
│ │ │ │ +
1436 {
│ │ │ │ +
1437 //std::cout<<" ii="<<ii<<" i="<<i<<std::endl;
│ │ │ │ +
1438 // compute next conjugate direction
│ │ │ │ +
1439 prec_res = 0; // clear correction
│ │ │ │ +
1440 _prec->apply(prec_res,b); // apply preconditioner
│ │ │ │ +
1441
│ │ │ │ +
1442 p[ii].reset(new X(prec_res));
│ │ │ │ +
1443 _op->apply(prec_res, q);
│ │ │ │ +
1444
│ │ │ │ +
1445 for(int j=0; j<ii; ++j) {
│ │ │ │ +
1446 rho =_sp->dot(q,*(p[j]))/pp[j];
│ │ │ │ +
1447 p[ii]->axpy(-rho, *(p[j]));
│ │ │ │ +
1448 }
│ │ │ │ +
1449
│ │ │ │ +
1450 // minimize in given search direction
│ │ │ │ +
1451 _op->apply(*(p[ii]),q); // q=Ap
│ │ │ │ +
1452 pp[ii] = _sp->dot(*(p[ii]),q); // scalar product
│ │ │ │ +
1453 rho = _sp->dot(*(p[ii]),b); // orthogonalization
│ │ │ │ +
1454 lambda = rho/pp[ii]; // minimization
│ │ │ │ +
1455 x.axpy(lambda,*(p[ii])); // update solution
│ │ │ │ +
1456 b.axpy(-lambda,q); // update defect
│ │ │ │ +
1457
│ │ │ │ +
1458 // convergence test
│ │ │ │ +
1459 def = _sp->norm(b); // comp defect norm
│ │ │ │ +
1460
│ │ │ │ +
1461 ++i;
│ │ │ │ +
1462 iteration.step(i, def);
│ │ │ │ +
1463 }
│ │ │ │ +
1464 if(res.converged)
│ │ │ │ +
1465 break;
│ │ │ │ +
1466 if(end==_restart) {
│ │ │ │ +
1467 *(p[0])=*(p[_restart-1]);
│ │ │ │ +
1468 pp[0]=pp[_restart-1];
│ │ │ │ +
1469 }
│ │ │ │ +
1470 }
│ │ │ │ +
1471
│ │ │ │ +
1472 // postprocess preconditioner
│ │ │ │ +
1473 _prec->post(x);
│ │ │ │ +
1474
│ │ │ │ +
1475 }
│ │ │ │ +
│ │ │ │ +
1476
│ │ │ │ +
1477 private:
│ │ │ │ +
1478 using IterativeSolver<X,X>::_op;
│ │ │ │ +
1479 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
1480 using IterativeSolver<X,X>::_sp;
│ │ │ │ +
1481 using IterativeSolver<X,X>::_reduction;
│ │ │ │ +
1482 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
1483 using IterativeSolver<X,X>::_verbose;
│ │ │ │ +
1484 using Iteration = typename IterativeSolver<X,X>::template Iteration<unsigned int>;
│ │ │ │ +
1485 int _restart;
│ │ │ │ +
1486 };
│ │ │ │ +
│ │ │ │ +
1487 DUNE_REGISTER_ITERATIVE_SOLVER("generalizedpcgsolver", defaultIterativeSolverCreator<Dune::GeneralizedPCGSolver>());
│ │ │ │ +
1488
│ │ │ │ +
1500 template<class X>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1502 public:
│ │ │ │ +
1503 using typename IterativeSolver<X,X>::domain_type;
│ │ │ │ +
1504 using typename IterativeSolver<X,X>::range_type;
│ │ │ │ +
1505 using typename IterativeSolver<X,X>::field_type;
│ │ │ │ +
1506 using typename IterativeSolver<X,X>::real_type;
│ │ │ │ +
1507
│ │ │ │ +
1508 private:
│ │ │ │ + │ │ │ │ +
1510
│ │ │ │ +
1511 public:
│ │ │ │ +
1512 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ +
1513 using IterativeSolver<X,X>::apply;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1520 scalar_real_type reduction, int maxit, int verbose, int mmax = 10) : IterativeSolver<X,X>(op, prec, reduction, maxit, verbose), _mmax(mmax)
│ │ │ │ +
1521 {
│ │ │ │ +
1522 }
│ │ │ │ +
│ │ │ │ +
1523
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1530 scalar_real_type reduction, int maxit, int verbose, int mmax = 10) : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose), _mmax(mmax)
│ │ │ │ +
1531 {
│ │ │ │ +
1532 }
│ │ │ │ +
│ │ │ │ +
1533
│ │ │ │ +
│ │ │ │ +
1539 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ +
1540 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ +
1541 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ +
1542 scalar_real_type reduction, int maxit, int verbose,
│ │ │ │ +
1543 int mmax = 10)
│ │ │ │ +
1544 : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose), _mmax(mmax)
│ │ │ │ +
1545 {}
│ │ │ │ +
│ │ │ │ +
1546
│ │ │ │ +
│ │ │ │ +
1559 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ +
1560 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ +
1561 const ParameterTree& config)
│ │ │ │ +
1562 : IterativeSolver<X,X>(op, prec, config), _mmax(config.get("mmax", 10))
│ │ │ │ +
1563 {}
│ │ │ │ +
│ │ │ │ +
1564
│ │ │ │ +
│ │ │ │ +
1565 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
│ │ │ │ +
1566 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ +
1567 std::shared_ptr<Preconditioner<X,X>> prec,
│ │ │ │ +
1568 const ParameterTree& config)
│ │ │ │ +
1569 : IterativeSolver<X,X>(op, sp, prec, config), _mmax(config.get("mmax", 10))
│ │ │ │ +
1570 {}
│ │ │ │ +
│ │ │ │ +
1571
│ │ │ │ +
│ │ │ │ +
1584 virtual void apply (X& x, X& b, InverseOperatorResult& res)
│ │ │ │ +
1585 {
│ │ │ │ + │ │ │ │ +
1587 res.clear();
│ │ │ │ +
1588 Iteration iteration(*this,res);
│ │ │ │ +
1589 _prec->pre(x,b); // prepare preconditioner
│ │ │ │ +
1590 _op->applyscaleadd(-1,x,b); // overwrite b with defect
│ │ │ │ +
1591
│ │ │ │ +
1592 //arrays for interim values:
│ │ │ │ +
1593 std::vector<X> d(_mmax+1, x); // array for directions
│ │ │ │ +
1594 std::vector<X> Ad(_mmax+1, x); // array for Ad[i]
│ │ │ │ +
1595 std::vector<field_type,rAlloc> ddotAd(_mmax+1,0); // array for <d[i],Ad[i]>
│ │ │ │ +
1596 X w(x);
│ │ │ │ +
1597
│ │ │ │ +
1598 real_type def = _sp->norm(b); // compute norm
│ │ │ │ +
1599 if(iteration.step(0, def)){
│ │ │ │ +
1600 _prec->post(x);
│ │ │ │ +
1601 return;
│ │ │ │ +
1602 }
│ │ │ │ +
1603
│ │ │ │ +
1604 // some local variables
│ │ │ │ +
1605 field_type alpha;
│ │ │ │ +
1606
│ │ │ │ +
1607 // the loop
│ │ │ │ +
1608 int i=1;
│ │ │ │ +
1609 int i_bounded=0;
│ │ │ │ +
1610 while(i<=_maxit && !res.converged) {
│ │ │ │ +
1611 for (; i_bounded <= _mmax && i<= _maxit; i_bounded++) {
│ │ │ │ +
1612 d[i_bounded] = 0; // reset search direction
│ │ │ │ +
1613 _prec->apply(d[i_bounded], b); // apply preconditioner
│ │ │ │ +
1614 w = d[i_bounded]; // copy of current d[i]
│ │ │ │ +
1615 // orthogonalization with previous directions
│ │ │ │ +
1616 orthogonalizations(i_bounded,Ad,w,ddotAd,d);
│ │ │ │ +
1617
│ │ │ │ +
1618 //saving interim values for future calculating
│ │ │ │ +
1619 _op->apply(d[i_bounded], Ad[i_bounded]); // save Ad[i]
│ │ │ │ +
1620 ddotAd[i_bounded]=_sp->dot(d[i_bounded],Ad[i_bounded]); // save <d[i],Ad[i]>
│ │ │ │ +
1621 alpha = _sp->dot(d[i_bounded], b)/ddotAd[i_bounded]; // <d[i],b>/<d[i],Ad[i]>
│ │ │ │ +
1622
│ │ │ │ +
1623 //update solution and defect
│ │ │ │ +
1624 x.axpy(alpha, d[i_bounded]);
│ │ │ │ +
1625 b.axpy(-alpha, Ad[i_bounded]);
│ │ │ │ +
1626
│ │ │ │ +
1627 // convergence test
│ │ │ │ +
1628 def = _sp->norm(b); // comp defect norm
│ │ │ │ +
1629
│ │ │ │ +
1630 iteration.step(i, def);
│ │ │ │ +
1631 i++;
│ │ │ │ +
1632 }
│ │ │ │ +
1633 //restart: exchange first and last stored values
│ │ │ │ +
1634 cycle(Ad,d,ddotAd,i_bounded);
│ │ │ │ +
1635 }
│ │ │ │ +
1636
│ │ │ │ +
1637 //correct i which is wrong if convergence was not achieved.
│ │ │ │ +
1638 i=std::min(_maxit,i);
│ │ │ │ +
1639
│ │ │ │ +
1640 _prec->post(x); // postprocess preconditioner
│ │ │ │ +
1641 }
│ │ │ │ +
│ │ │ │ +
1642
│ │ │ │ +
1643 private:
│ │ │ │ +
1644 //This function is called every iteration to orthogonalize against the last search directions
│ │ │ │ +
1645 virtual void orthogonalizations(const int& i_bounded,const std::vector<X>& Ad, const X& w, const std::vector<field_type,ReboundAllocatorType<X,field_type>>& ddotAd,std::vector<X>& d) {
│ │ │ │ +
1646 // The RestartedFCGSolver uses only values with lower array index;
│ │ │ │ +
1647 for (int k = 0; k < i_bounded; k++) {
│ │ │ │ +
1648 d[i_bounded].axpy(-_sp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= <<Ad[k],w>/<d[k],Ad[k]>>d[k]
│ │ │ │ +
1649 }
│ │ │ │ +
1650 }
│ │ │ │ +
1651
│ │ │ │ +
1652 // This function is called every mmax iterations to handle limited array sizes.
│ │ │ │ +
1653 virtual void cycle(std::vector<X>& Ad,std::vector<X>& d,std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) {
│ │ │ │ +
1654 // Reset loop index and exchange the first and last arrays
│ │ │ │ +
1655 i_bounded = 1;
│ │ │ │ +
1656 std::swap(Ad[0], Ad[_mmax]);
│ │ │ │ +
1657 std::swap(d[0], d[_mmax]);
│ │ │ │ +
1658 std::swap(ddotAd[0], ddotAd[_mmax]);
│ │ │ │ +
1659 }
│ │ │ │ +
1660
│ │ │ │ +
1661 protected:
│ │ │ │ + │ │ │ │ +
1663 using IterativeSolver<X,X>::_op;
│ │ │ │ +
1664 using IterativeSolver<X,X>::_prec;
│ │ │ │ +
1665 using IterativeSolver<X,X>::_sp;
│ │ │ │ +
1666 using IterativeSolver<X,X>::_reduction;
│ │ │ │ +
1667 using IterativeSolver<X,X>::_maxit;
│ │ │ │ +
1668 using IterativeSolver<X,X>::_verbose;
│ │ │ │ + │ │ │ │ +
1670 };
│ │ │ │ +
│ │ │ │ +
1671 DUNE_REGISTER_ITERATIVE_SOLVER("restartedfcgsolver", defaultIterativeSolverCreator<Dune::RestartedFCGSolver>());
│ │ │ │ +
1672
│ │ │ │ +
1679 template<class X>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1681 public:
│ │ │ │ + │ │ │ │ +
1683 using typename RestartedFCGSolver<X>::range_type;
│ │ │ │ +
1684 using typename RestartedFCGSolver<X>::field_type;
│ │ │ │ +
1685 using typename RestartedFCGSolver<X>::real_type;
│ │ │ │ +
1686
│ │ │ │ +
1687 // copy base class constructors
│ │ │ │ +
1688 using RestartedFCGSolver<X>::RestartedFCGSolver;
│ │ │ │ +
1689
│ │ │ │ +
1690 // don't shadow four-argument version of apply defined in the base class
│ │ │ │ + │ │ │ │ +
1692
│ │ │ │ +
1693 // just a minor part of the RestartedFCGSolver apply method will be modified
│ │ │ │ +
│ │ │ │ +
1694 virtual void apply (X& x, X& b, InverseOperatorResult& res) override {
│ │ │ │ +
1695 // reset limiter of orthogonalization loop
│ │ │ │ +
1696 _k_limit = 0;
│ │ │ │ +
1697 this->RestartedFCGSolver<X>::apply(x,b,res);
│ │ │ │ +
1698 };
│ │ │ │ +
│ │ │ │ +
1699
│ │ │ │ +
1700 private:
│ │ │ │ +
1701 // This function is called every iteration to orthogonalize against the last search directions.
│ │ │ │ +
1702 virtual void orthogonalizations(const int& i_bounded,const std::vector<X>& Ad, const X& w, const std::vector<field_type,ReboundAllocatorType<X,field_type>>& ddotAd,std::vector<X>& d) override {
│ │ │ │ +
1703 // This FCGSolver uses values with higher array indexes too, if existent.
│ │ │ │ +
1704 for (int k = 0; k < _k_limit; k++) {
│ │ │ │ +
1705 if(i_bounded!=k)
│ │ │ │ +
1706 d[i_bounded].axpy(-_sp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= <<Ad[k],w>/<d[k],Ad[k]>>d[k]
│ │ │ │ +
1707 }
│ │ │ │ +
1708 // The loop limit increase, if array is not completely filled.
│ │ │ │ +
1709 if(_k_limit<=i_bounded)
│ │ │ │ +
1710 _k_limit++;
│ │ │ │ +
1711
│ │ │ │ +
1712 };
│ │ │ │ +
1713
│ │ │ │ +
1714 // This function is called every mmax iterations to handle limited array sizes.
│ │ │ │ +
1715 virtual void cycle(std::vector<X>& Ad, [[maybe_unused]] std::vector<X>& d, [[maybe_unused]] std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) override {
│ │ │ │ +
1716 // Only the loop index i_bounded return to 0, if it reached mmax.
│ │ │ │ +
1717 i_bounded = 0;
│ │ │ │ +
1718 // Now all arrays are filled and the loop in void orthogonalizations can use the whole arrays.
│ │ │ │ +
1719 _k_limit = Ad.size();
│ │ │ │ +
1720 };
│ │ │ │ +
1721
│ │ │ │ +
1722 int _k_limit = 0;
│ │ │ │ +
1723
│ │ │ │ +
1724 protected:
│ │ │ │ + │ │ │ │ +
1726 using RestartedFCGSolver<X>::_op;
│ │ │ │ + │ │ │ │ +
1728 using RestartedFCGSolver<X>::_sp;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
1732 };
│ │ │ │ +
│ │ │ │ +
1733 DUNE_REGISTER_ITERATIVE_SOLVER("completefcgsolver", defaultIterativeSolverCreator<Dune::CompleteFCGSolver>());
│ │ │ │ +
1735} // end namespace
│ │ │ │ +
1736
│ │ │ │ +
1737#endif
│ │ │ │ +
Define base class for scalar product and norm.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_REGISTER_ITERATIVE_SOLVER(name,...)
Definition solverregistry.hh:19
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
Define general, extensible interface for inverse operators.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, std::size_t rowOffset=0, std::size_t colOffset=0)
Traverse a blocked matrix and call a functor at each scalar entry.
Definition foreach.hh:132
│ │ │ │ -
std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)
Traverse a blocked vector and call a functor at each scalar entry.
Definition foreach.hh:95
│ │ │ │ -
auto rows(Matrix const &matrix)
Definition foreach.hh:69
│ │ │ │ -
auto cols(Matrix const &matrix)
Definition foreach.hh:72
│ │ │ │ -
auto size(Vector const &vector)
Definition foreach.hh:75
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ -
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X > ReboundAllocatorType
Definition allocator.hh:37
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
@ row_wise
Build in a row-wise manner.
Definition bcrsmatrix.hh:521
│ │ │ │ +
CreateIterator createend()
get create iterator pointing to one after the last block
Definition bcrsmatrix.hh:1103
│ │ │ │ +
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ +
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
Wrapper to use a range of ARPACK++ eigenvalue solvers.
Definition arpackpp.hh:245
│ │ │ │ +
void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:289
│ │ │ │ +
void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:391
│ │ │ │ +
Thrown when a solver aborts due to some problem.
Definition istlexception.hh:46
│ │ │ │ +
A linear operator.
Definition operators.hh:67
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
double condition_estimate
Estimate of condition number.
Definition solver.hh:79
│ │ │ │ +
void clear()
Resets all data.
Definition solver.hh:56
│ │ │ │ +
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ +
Simd::Scalar< real_type > scalar_real_type
scalar type underlying the field_type
Definition solver.hh:114
│ │ │ │ +
Y range_type
Type of the range of the operator to be inverted.
Definition solver.hh:105
│ │ │ │ +
X domain_type
Type of the domain of the operator to be inverted.
Definition solver.hh:102
│ │ │ │ +
X::field_type field_type
The field type of the operator.
Definition solver.hh:108
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
The real type of the field type (is the same if using real numbers, but differs for std::complex)
Definition solver.hh:111
│ │ │ │ +
Base class for all implementations of iterative solvers.
Definition solver.hh:203
│ │ │ │ +
std::shared_ptr< const ScalarProduct< X > > _sp
Definition solver.hh:506
│ │ │ │ +
std::shared_ptr< const LinearOperator< X, X > > _op
Definition solver.hh:504
│ │ │ │ +
int _maxit
Definition solver.hh:508
│ │ │ │ +
int _verbose
Definition solver.hh:509
│ │ │ │ +
scalar_real_type _reduction
Definition solver.hh:507
│ │ │ │ +
std::shared_ptr< Preconditioner< X, X > > _prec
Definition solver.hh:505
│ │ │ │ +
Preconditioned loop solver.
Definition solvers.hh:59
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition solvers.hh:73
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:116
│ │ │ │ +
gradient method
Definition solvers.hh:124
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:142
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:187
│ │ │ │ +
conjugate gradient method
Definition solvers.hh:193
│ │ │ │ +
CGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
Constructor to initialize a CG solver.
Definition solvers.hh:256
│ │ │ │ +
static constexpr bool enableConditionEstimate
Definition solvers.hh:208
│ │ │ │ +
CGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
Constructor to initialize a CG solver.
Definition solvers.hh:239
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:279
│ │ │ │ +
CGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
Constructor to initialize a CG solver.
Definition solvers.hh:222
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:412
│ │ │ │ +
Bi-conjugate Gradient Stabilized (BiCG-STAB)
Definition solvers.hh:419
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< CountType > Iteration
Definition solvers.hh:598
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:439
│ │ │ │ +
Minimal Residual Method (MINRES)
Definition solvers.hh:609
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:627
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:808
│ │ │ │ +
implements the Generalized Minimal Residual (GMRes) method
Definition solvers.hh:827
│ │ │ │ +
RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solvers.hh:878
│ │ │ │ +
std::enable_if<!std::is_same< field_type, real_type >::value, T >::type conjugate(const T &t)
Definition solvers.hh:1067
│ │ │ │ +
RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Definition solvers.hh:883
│ │ │ │ +
void update(X &w, int i, const std::vector< std::vector< field_type, fAlloc > > &H, const std::vector< field_type, fAlloc > &s, const std::vector< X > &v)
Definition solvers.hh:1039
│ │ │ │ +
std::enable_if< std::is_same< field_type, real_type >::value, T >::type conjugate(const T &t)
Definition solvers.hh:1062
│ │ │ │ +
ReboundAllocatorType< X, field_type > fAlloc
field_type Allocator retrieved from domain type
Definition solvers.hh:838
│ │ │ │ +
int _restart
Definition solvers.hh:1120
│ │ │ │ +
ReboundAllocatorType< X, real_type > rAlloc
real_type Allocator retrieved from domain type
Definition solvers.hh:840
│ │ │ │ +
virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:923
│ │ │ │ +
RestartedGMResSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int maxit, int verbose)
Set up RestartedGMResSolver solver.
Definition solvers.hh:850
│ │ │ │ +
RestartedGMResSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int maxit, int verbose)
Set up RestartedGMResSolver solver.
Definition solvers.hh:861
│ │ │ │ +
void generatePlaneRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
Definition solvers.hh:1073
│ │ │ │ +
RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, Y > > prec, scalar_real_type reduction, int restart, int maxit, int verbose)
Set up RestartedGMResSolver solver.
Definition solvers.hh:894
│ │ │ │ +
virtual void apply(X &x, Y &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:910
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:1119
│ │ │ │ +
void applyPlaneRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
Definition solvers.hh:1106
│ │ │ │ +
implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned)
Definition solvers.hh:1139
│ │ │ │ +
void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) override
Apply inverse operator.
Definition solvers.hh:1169
│ │ │ │ +
Generalized preconditioned conjugate gradient solver.
Definition solvers.hh:1307
│ │ │ │ +
GeneralizedPCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)
Set up nonlinear preconditioned conjugate gradient solver.
Definition solvers.hh:1343
│ │ │ │ +
GeneralizedPCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)
Set up nonlinear preconditioned conjugate gradient solver.
Definition solvers.hh:1331
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:1391
│ │ │ │ +
GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solvers.hh:1361
│ │ │ │ +
GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)
Set up nonlinear preconditioned conjugate gradient solver.
Definition solvers.hh:1377
│ │ │ │ +
GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Definition solvers.hh:1366
│ │ │ │ +
Accelerated flexible conjugate gradient method.
Definition solvers.hh:1501
│ │ │ │ +
RestartedFCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)
Constructor to initialize a RestartedFCG solver.
Definition solvers.hh:1519
│ │ │ │ +
RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config)
Constructor.
Definition solvers.hh:1559
│ │ │ │ +
RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)
Constructor to initialize a RestartedFCG solver.
Definition solvers.hh:1539
│ │ │ │ +
int _mmax
Definition solvers.hh:1662
│ │ │ │ +
RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config)
Definition solvers.hh:1565
│ │ │ │ +
typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
Definition solvers.hh:1669
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res)
Apply inverse operator.
Definition solvers.hh:1584
│ │ │ │ +
RestartedFCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)
Constructor to initialize a RestartedFCG solver.
Definition solvers.hh:1529
│ │ │ │ +
Complete flexible conjugate gradient method.
Definition solvers.hh:1680
│ │ │ │ +
virtual void apply(X &x, X &b, InverseOperatorResult &res) override
Apply inverse operator.
Definition solvers.hh:1694
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,233 +1,1929 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -foreach.hh │ │ │ │ │ +solvers.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3#pragma once │ │ │ │ │ -4 │ │ │ │ │ -5#include │ │ │ │ │ -6#include │ │ │ │ │ -7#include │ │ │ │ │ +3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_ISTL_SOLVERS_HH │ │ │ │ │ +7#define DUNE_ISTL_SOLVERS_HH │ │ │ │ │ 8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include<_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -15#include<_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ -17namespace _D_u_n_e{ │ │ │ │ │ -18 │ │ │ │ │ -19 namespace Impl { │ │ │ │ │ -20 │ │ │ │ │ -21 // stolen from dune-functions: we call a type "scalar" if it does not │ │ │ │ │ -support index accessing │ │ │ │ │ -22 template │ │ │ │ │ -23 using StaticIndexAccessConcept = decltype(std::declval()[Dune::Indices:: │ │ │ │ │ -_0]); │ │ │ │ │ -24 │ │ │ │ │ -25 template │ │ │ │ │ -26 using IsScalar = std::negation>>; │ │ │ │ │ -27 │ │ │ │ │ -28 // Type trait for matrix types that supports │ │ │ │ │ -29 // - iteration done row-wise │ │ │ │ │ -30 // - sparse iteration over nonzero entries │ │ │ │ │ -31 template │ │ │ │ │ -32 struct IsRowMajorSparse : std::false_type {}; │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23 │ │ │ │ │ +24#include <_d_u_n_e_/_i_s_t_l_/_a_l_l_o_c_a_t_o_r_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_i_s_t_l_/_e_i_g_e_n_v_a_l_u_e_/_a_r_p_a_c_k_p_p_._h_h> │ │ │ │ │ +27#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +28#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ +29#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h> │ │ │ │ │ +30#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h> │ │ │ │ │ +31#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ +32#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ 33 │ │ │ │ │ -34 // This is supported by the following matrix types: │ │ │ │ │ -35 template │ │ │ │ │ -36 struct IsRowMajorSparse> : std::true_type {}; │ │ │ │ │ -37 │ │ │ │ │ -38 template │ │ │ │ │ -39 struct IsRowMajorSparse> : std::true_type {}; │ │ │ │ │ -40 │ │ │ │ │ -41 template │ │ │ │ │ -42 struct IsRowMajorSparse> : std::true_type {}; │ │ │ │ │ -43 │ │ │ │ │ -44 │ │ │ │ │ -45 template │ │ │ │ │ -46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std:: │ │ │ │ │ -integral_constant { return {}; } │ │ │ │ │ -47 │ │ │ │ │ -48 template │ │ │ │ │ -49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std:: │ │ │ │ │ -integral_constant { return {}; } │ │ │ │ │ -50 │ │ │ │ │ -51 template │ │ │ │ │ -52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N()) │ │ │ │ │ -{ return matrix.N(); } │ │ │ │ │ -53 │ │ │ │ │ -54 template │ │ │ │ │ -55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M()) │ │ │ │ │ -{ return matrix.M(); } │ │ │ │ │ -56 │ │ │ │ │ -57 template │ │ │ │ │ -58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std:: │ │ │ │ │ -integral_constant { return {}; } │ │ │ │ │ -59 │ │ │ │ │ -60 template │ │ │ │ │ -61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size()) │ │ │ │ │ -{ return vector.size(); } │ │ │ │ │ -62 │ │ │ │ │ -63 │ │ │ │ │ -64 } // end namespace Impl │ │ │ │ │ +34namespace _D_u_n_e { │ │ │ │ │ +46 //===================================================================== │ │ │ │ │ +47 // Implementation of this interface │ │ │ │ │ +48 //===================================================================== │ │ │ │ │ +49 │ │ │ │ │ +58 template │ │ │ │ │ +_5_9 class _L_o_o_p_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ +60 public: │ │ │ │ │ +61 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +62 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +63 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +64 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ 65 │ │ │ │ │ -_6_6namespace ForEach{ │ │ │ │ │ -67 │ │ │ │ │ -68 template │ │ │ │ │ -_6_9 auto _r_o_w_s(_M_a_t_r_i_x const& matrix) { return Impl::rows(matrix, PriorityTag<5> │ │ │ │ │ -{}); } │ │ │ │ │ -70 │ │ │ │ │ -71 template │ │ │ │ │ -_7_2 auto _c_o_l_s(_M_a_t_r_i_x const& matrix) { return Impl::cols(matrix, PriorityTag<5> │ │ │ │ │ -{}); } │ │ │ │ │ -73 │ │ │ │ │ -74 template │ │ │ │ │ -_7_5 auto _s_i_z_e(Vector const& vector) { return Impl::size(vector, PriorityTag<5> │ │ │ │ │ -{}); } │ │ │ │ │ -76 │ │ │ │ │ -77} // namespace ForEach │ │ │ │ │ -78 │ │ │ │ │ -79 │ │ │ │ │ +66 // copy base class constructors │ │ │ │ │ +67 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +68 │ │ │ │ │ +69 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +70 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +71 │ │ │ │ │ +_7_3 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +74 { │ │ │ │ │ +75 _I_t_e_r_a_t_i_o_n iteration(*this, res); │ │ │ │ │ +76 ___p_r_e_c->pre(x,b); │ │ │ │ │ +77 │ │ │ │ │ +78 // overwrite b with defect │ │ │ │ │ +79 ___o_p->applyscaleadd(-1,x,b); │ │ │ │ │ 80 │ │ │ │ │ -81 │ │ │ │ │ -94template │ │ │ │ │ -_9_5std::size_t _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(Vector&& vector, F&& f, std::size_t offset = 0) │ │ │ │ │ -96{ │ │ │ │ │ -97 using V = std::decay_t; │ │ │ │ │ -98 if constexpr( Impl::IsScalar::value ) │ │ │ │ │ -99 { │ │ │ │ │ -100 f(vector, offset); │ │ │ │ │ -101 return 1; │ │ │ │ │ -102 } │ │ │ │ │ -103 else │ │ │ │ │ -104 { │ │ │ │ │ -105 std::size_t idx = 0; │ │ │ │ │ -106 Hybrid::forEach(Dune::range(_F_o_r_E_a_c_h_:_:_s_i_z_e(vector)), [&](auto i) { │ │ │ │ │ -107 idx += _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(vector[i], f, offset + idx); │ │ │ │ │ -108 }); │ │ │ │ │ -109 return idx; │ │ │ │ │ -110 } │ │ │ │ │ -111} │ │ │ │ │ -112 │ │ │ │ │ -113 │ │ │ │ │ -131template │ │ │ │ │ -_1_3_2std::pair _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(_M_a_t_r_i_x&& matrix, F&& f, │ │ │ │ │ -std::size_t rowOffset = 0, std::size_t colOffset = 0) │ │ │ │ │ -133{ │ │ │ │ │ -134 using M = std::decay_t; │ │ │ │ │ -135 if constexpr ( Impl::IsScalar::value ) │ │ │ │ │ -136 { │ │ │ │ │ -137 f(matrix,rowOffset,colOffset); │ │ │ │ │ -138 return {1,1}; │ │ │ │ │ -139 } │ │ │ │ │ -140 else │ │ │ │ │ -141 { │ │ │ │ │ -142 // if M supports the IsRowMajorSparse type trait: iterate just over the │ │ │ │ │ -nonzero entries and │ │ │ │ │ -143 // and compute the flat row/col size directly │ │ │ │ │ -144 if constexpr ( Impl::IsRowMajorSparse::value ) │ │ │ │ │ -145 { │ │ │ │ │ -146 using Block = std::decay_t; │ │ │ │ │ -147 │ │ │ │ │ -148 // find an existing block or at least try to create one │ │ │ │ │ -149 auto block = [&]{ │ │ │ │ │ -150 for (auto const& row : matrix) │ │ │ │ │ -151 for (auto const& entry : row) │ │ │ │ │ -152 return entry; │ │ │ │ │ -153 return Block{}; │ │ │ │ │ -154 }(); │ │ │ │ │ -155 │ │ │ │ │ -156 // compute the scalar size of the block │ │ │ │ │ -157 auto [blockRows, blockCols] = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(block, [](...){}); │ │ │ │ │ -158 │ │ │ │ │ -159 // check whether we have valid sized blocks │ │ │ │ │ -160 assert( ( blockRows!=0 or blockCols!=0 ) and "the block size can't be │ │ │ │ │ -zero"); │ │ │ │ │ -161 │ │ │ │ │ -162 for ( auto rowIt = matrix.begin(); rowIt != matrix.end(); rowIt++ ) │ │ │ │ │ -163 { │ │ │ │ │ -164 auto&& row = *rowIt; │ │ │ │ │ -165 auto rowIdx = rowIt.index(); │ │ │ │ │ -166 for ( auto colIt = row.begin(); colIt != row.end(); colIt++ ) │ │ │ │ │ -167 { │ │ │ │ │ -168 auto&& entry = *colIt; │ │ │ │ │ -169 auto colIdx = colIt.index(); │ │ │ │ │ -170 auto [ dummyRows, dummyCols ] = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(entry, f, rowOffset + │ │ │ │ │ -rowIdx*blockRows, colOffset + colIdx*blockCols); │ │ │ │ │ -171 assert( dummyRows == blockRows and dummyCols == blockCols and "we need the │ │ │ │ │ -same size of each block in this matrix type"); │ │ │ │ │ -172 } │ │ │ │ │ -173 } │ │ │ │ │ -174 │ │ │ │ │ -175 return { matrix.N()*blockRows, matrix.M()*blockCols }; │ │ │ │ │ -176 } │ │ │ │ │ -177 // all other matrix types are accessed index-wise with dynamic flat row/col │ │ │ │ │ -counting │ │ │ │ │ -178 else │ │ │ │ │ -179 { │ │ │ │ │ -180 std::size_t r = 0, c = 0; │ │ │ │ │ -181 std::size_t nRows, nCols; │ │ │ │ │ -182 │ │ │ │ │ -183 Hybrid::forEach(Dune::range(_F_o_r_E_a_c_h_:_:_r_o_w_s(matrix)), [&](auto i) { │ │ │ │ │ -184 c = 0; │ │ │ │ │ -185 Hybrid::forEach(Dune::range(_F_o_r_E_a_c_h_:_:_c_o_l_s(matrix)), [&](auto j) { │ │ │ │ │ -186 std::tie(nRows,nCols) = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(matrix[i][j], f, rowOffset + r, │ │ │ │ │ -colOffset + c); │ │ │ │ │ -187 c += nCols; │ │ │ │ │ -188 }); │ │ │ │ │ -189 r += nRows; │ │ │ │ │ -190 }); │ │ │ │ │ -191 return {r,c}; │ │ │ │ │ -192 } │ │ │ │ │ -193 } │ │ │ │ │ -194} │ │ │ │ │ -195 │ │ │ │ │ -196} // namespace Dune │ │ │ │ │ +81 // compute norm, \todo parallelization │ │ │ │ │ +82 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); │ │ │ │ │ +83 if(iteration.step(0, def)){ │ │ │ │ │ +84 ___p_r_e_c->post(x); │ │ │ │ │ +85 return; │ │ │ │ │ +86 } │ │ │ │ │ +87 // prepare preconditioner │ │ │ │ │ +88 │ │ │ │ │ +89 // allocate correction vector │ │ │ │ │ +90 X v(x); │ │ │ │ │ +91 │ │ │ │ │ +92 // iteration loop │ │ │ │ │ +93 int i=1; │ │ │ │ │ +94 for ( ; i<=___m_a_x_i_t; i++ ) │ │ │ │ │ +95 { │ │ │ │ │ +96 v = 0; // clear correction │ │ │ │ │ +97 ___p_r_e_c->apply(v,b); // apply preconditioner │ │ │ │ │ +98 x += v; // update solution │ │ │ │ │ +99 ___o_p->applyscaleadd(-1,v,b); // update defect │ │ │ │ │ +100 def=___s_p->norm(b); // comp defect norm │ │ │ │ │ +101 if(iteration.step(i, def)) │ │ │ │ │ +102 break; │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +105 // postprocess preconditioner │ │ │ │ │ +106 ___p_r_e_c->post(x); │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +109 protected: │ │ │ │ │ +110 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +111 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +112 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +113 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +114 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +115 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +_1_1_6 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ +117 }; │ │ │ │ │ +_1_1_8 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("loopsolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +119 │ │ │ │ │ +120 │ │ │ │ │ +121 // all these solvers are taken from the SUMO library │ │ │ │ │ +123 template │ │ │ │ │ +_1_2_4 class _G_r_a_d_i_e_n_t_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ +125 public: │ │ │ │ │ +126 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +127 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +128 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +129 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +130 │ │ │ │ │ +131 // copy base class constructors │ │ │ │ │ +132 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +133 │ │ │ │ │ +134 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +135 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +136 │ │ │ │ │ +_1_4_2 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +143 { │ │ │ │ │ +144 _I_t_e_r_a_t_i_o_n iteration(*this, res); │ │ │ │ │ +145 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ +146 │ │ │ │ │ +147 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defec │ │ │ │ │ +148 │ │ │ │ │ +149 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ +150 if(iteration.step(0, def)){ │ │ │ │ │ +151 ___p_r_e_c->post(x); │ │ │ │ │ +152 return; │ │ │ │ │ +153 } │ │ │ │ │ +154 │ │ │ │ │ +155 X p(x); // create local vectors │ │ │ │ │ +156 X q(b); │ │ │ │ │ +157 │ │ │ │ │ +158 int i=1; // loop variables │ │ │ │ │ +159 _f_i_e_l_d___t_y_p_e lambda; │ │ │ │ │ +160 for ( ; i<=___m_a_x_i_t; i++ ) │ │ │ │ │ +161 { │ │ │ │ │ +162 p = 0; // clear correction │ │ │ │ │ +163 ___p_r_e_c->apply(p,b); // apply preconditioner │ │ │ │ │ +164 ___o_p->apply(p,q); // q=Ap │ │ │ │ │ +165 auto alpha = ___s_p->dot(q,p); │ │ │ │ │ +166 lambda = Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +167 _f_i_e_l_d___t_y_p_e(0.), // no need for minimization if def is already 0 │ │ │ │ │ +168 ___s_p->dot(p,b)/alpha); // minimization │ │ │ │ │ +169 x.axpy(lambda,p); // update solution │ │ │ │ │ +170 b.axpy(-lambda,q); // update defect │ │ │ │ │ +171 │ │ │ │ │ +172 def =___s_p->norm(b); // comp defect norm │ │ │ │ │ +173 if(iteration.step(i, def)) │ │ │ │ │ +174 break; │ │ │ │ │ +175 } │ │ │ │ │ +176 // postprocess preconditioner │ │ │ │ │ +177 ___p_r_e_c->post(x); │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +180 protected: │ │ │ │ │ +181 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +182 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +183 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +184 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +185 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +186 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +_1_8_7 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ +188 }; │ │ │ │ │ +_1_8_9 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("gradientsolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +190 │ │ │ │ │ +192 template │ │ │ │ │ +_1_9_3 class _C_G_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ +194 public: │ │ │ │ │ +195 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +196 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +197 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +198 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +199 │ │ │ │ │ +200 // copy base class constructors │ │ │ │ │ +201 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +202 │ │ │ │ │ +203 private: │ │ │ │ │ +204 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +205 │ │ │ │ │ +206 protected: │ │ │ │ │ +207 │ │ │ │ │ +_2_0_8 static constexpr bool _e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e = (std:: │ │ │ │ │ +is_same_v || std::is_same_v); │ │ │ │ │ +209 │ │ │ │ │ +210 public: │ │ │ │ │ +211 │ │ │ │ │ +212 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +213 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +214 │ │ │ │ │ +_2_2_2 _C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, │ │ │ │ │ +223 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, bool │ │ │ │ │ +condition_estimate) : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, prec, reduction, maxit, │ │ │ │ │ +verbose), │ │ │ │ │ +224 condition_estimate_(condition_estimate) │ │ │ │ │ +225 { │ │ │ │ │ +226 if (condition_estimate && !_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) { │ │ │ │ │ +227 condition_estimate_ = false; │ │ │ │ │ +228 std::cerr << "WARNING: Condition estimate was disabled. It is only │ │ │ │ │ +available for double and float field types!" << std::endl; │ │ │ │ │ +229 } │ │ │ │ │ +230 } │ │ │ │ │ +231 │ │ │ │ │ +_2_3_9 _C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, const _S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, │ │ │ │ │ +_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, │ │ │ │ │ +240 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, bool │ │ │ │ │ +condition_estimate) : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, │ │ │ │ │ +verbose), │ │ │ │ │ +241 condition_estimate_(condition_estimate) │ │ │ │ │ +242 { │ │ │ │ │ +243 if (condition_estimate && !(std::is_same::value || std:: │ │ │ │ │ +is_same::value)) { │ │ │ │ │ +244 condition_estimate_ = false; │ │ │ │ │ +245 std::cerr << "WARNING: Condition estimate was disabled. It is only │ │ │ │ │ +available for double and float field types!" << std::endl; │ │ │ │ │ +246 } │ │ │ │ │ +247 } │ │ │ │ │ +248 │ │ │ │ │ +_2_5_6 _C_G_S_o_l_v_e_r (std::shared_ptr> op, std:: │ │ │ │ │ +shared_ptr<_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>> sp, │ │ │ │ │ +257 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ +258 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, bool │ │ │ │ │ +condition_estimate) │ │ │ │ │ +259 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, verbose), │ │ │ │ │ +260 condition_estimate_(condition_estimate) │ │ │ │ │ +261 { │ │ │ │ │ +262 if (condition_estimate && !(std::is_same::value || std:: │ │ │ │ │ +is_same::value)) { │ │ │ │ │ +263 condition_estimate_ = false; │ │ │ │ │ +264 std::cerr << "WARNING: Condition estimate was disabled. It is only │ │ │ │ │ +available for double and float field types!" << std::endl; │ │ │ │ │ +265 } │ │ │ │ │ +266 } │ │ │ │ │ +267 │ │ │ │ │ +_2_7_9 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +280 { │ │ │ │ │ +281 _I_t_e_r_a_t_i_o_n iteration(*this,res); │ │ │ │ │ +282 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ +283 │ │ │ │ │ +284 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defect │ │ │ │ │ +285 │ │ │ │ │ +286 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ +287 if(iteration.step(0, def)){ │ │ │ │ │ +288 ___p_r_e_c->post(x); │ │ │ │ │ +289 return; │ │ │ │ │ +290 } │ │ │ │ │ +291 │ │ │ │ │ +292 X p(x); // the search direction │ │ │ │ │ +293 X q(x); // a temporary vector │ │ │ │ │ +294 │ │ │ │ │ +295 // Remember lambda and beta values for condition estimate │ │ │ │ │ +296 std::vector lambdas(0); │ │ │ │ │ +297 std::vector betas(0); │ │ │ │ │ +298 │ │ │ │ │ +299 // some local variables │ │ │ │ │ +300 _f_i_e_l_d___t_y_p_e rho,rholast,lambda,alpha,beta; │ │ │ │ │ +301 │ │ │ │ │ +302 // determine initial search direction │ │ │ │ │ +303 p = 0; // clear correction │ │ │ │ │ +304 ___p_r_e_c->apply(p,b); // apply preconditioner │ │ │ │ │ +305 rholast = ___s_p->dot(p,b); // orthogonalization │ │ │ │ │ +306 │ │ │ │ │ +307 // the loop │ │ │ │ │ +308 int i=1; │ │ │ │ │ +309 for ( ; i<=___m_a_x_i_t; i++ ) │ │ │ │ │ +310 { │ │ │ │ │ +311 // minimize in given search direction p │ │ │ │ │ +312 ___o_p->apply(p,q); // q=Ap │ │ │ │ │ +313 alpha = ___s_p->dot(p,q); // scalar product │ │ │ │ │ +314 lambda = Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), _f_i_e_l_d___t_y_p_e(0.), rholast/alpha); / │ │ │ │ │ +/ minimization │ │ │ │ │ +315 if constexpr (_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) │ │ │ │ │ +316 if (condition_estimate_) │ │ │ │ │ +317 lambdas.push_back(std::real(lambda)); │ │ │ │ │ +318 x.axpy(lambda,p); // update solution │ │ │ │ │ +319 b.axpy(-lambda,q); // update defect │ │ │ │ │ +320 │ │ │ │ │ +321 // convergence test │ │ │ │ │ +322 def=___s_p->norm(b); // comp defect norm │ │ │ │ │ +323 if(iteration.step(i, def)) │ │ │ │ │ +324 break; │ │ │ │ │ +325 │ │ │ │ │ +326 // determine new search direction │ │ │ │ │ +327 q = 0; // clear correction │ │ │ │ │ +328 ___p_r_e_c->apply(q,b); // apply preconditioner │ │ │ │ │ +329 rho = ___s_p->dot(q,b); // orthogonalization │ │ │ │ │ +330 beta = Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), _f_i_e_l_d___t_y_p_e(0.), rho/rholast); / │ │ │ │ │ +/ scaling factor │ │ │ │ │ +331 if constexpr (_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) │ │ │ │ │ +332 if (condition_estimate_) │ │ │ │ │ +333 betas.push_back(std::real(beta)); │ │ │ │ │ +334 p *= beta; // scale old search direction │ │ │ │ │ +335 p += q; // orthogonalization with correction │ │ │ │ │ +336 rholast = rho; // remember rho for recurrence │ │ │ │ │ +337 } │ │ │ │ │ +338 │ │ │ │ │ +339 ___p_r_e_c->post(x); // postprocess preconditioner │ │ │ │ │ +340 │ │ │ │ │ +341 if (condition_estimate_) { │ │ │ │ │ +342#if HAVE_ARPACKPP │ │ │ │ │ +343 if constexpr (_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e) { │ │ │ │ │ +344 using std::sqrt; │ │ │ │ │ +345 │ │ │ │ │ +346 // Build T matrix which has extreme eigenvalues approximating │ │ │ │ │ +347 // those of the original system │ │ │ │ │ +348 // (see Y. Saad, Iterative methods for sparse linear systems) │ │ │ │ │ +349 │ │ │ │ │ +350 _C_O_N_D___M_A_T T(i, i, _C_O_N_D___M_A_T_:_:_r_o_w___w_i_s_e); │ │ │ │ │ +351 │ │ │ │ │ +352 for (auto row = T._c_r_e_a_t_e_b_e_g_i_n(); row != T._c_r_e_a_t_e_e_n_d(); ++row) { │ │ │ │ │ +353 if (row.index() > 0) │ │ │ │ │ +354 row.insert(row.index()-1); │ │ │ │ │ +355 row.insert(row.index()); │ │ │ │ │ +356 if (row.index() < T._N() - 1) │ │ │ │ │ +357 row.insert(row.index()+1); │ │ │ │ │ +358 } │ │ │ │ │ +359 for (int row = 0; row < i; ++row) { │ │ │ │ │ +360 if (row > 0) { │ │ │ │ │ +361 T[row][row-1] = sqrt(betas[row-1]) / lambdas[row-1]; │ │ │ │ │ +362 } │ │ │ │ │ +363 │ │ │ │ │ +364 T[row][row] = 1.0 / lambdas[row]; │ │ │ │ │ +365 if (row > 0) { │ │ │ │ │ +366 T[row][row] += betas[row-1] / lambdas[row-1]; │ │ │ │ │ +367 } │ │ │ │ │ +368 │ │ │ │ │ +369 if (row < i - 1) { │ │ │ │ │ +370 T[row][row+1] = sqrt(betas[row]) / lambdas[row]; │ │ │ │ │ +371 } │ │ │ │ │ +372 } │ │ │ │ │ +373 │ │ │ │ │ +374 // Compute largest and smallest eigenvalue of T matrix and return as │ │ │ │ │ +estimate │ │ │ │ │ +375 _D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_<_C_O_N_D___M_A_T_,_ _C_O_N_D___V_E_C_> arpack(T); │ │ │ │ │ +376 │ │ │ │ │ +377 _r_e_a_l___t_y_p_e eps = 0.0; │ │ │ │ │ +378 _C_O_N_D___V_E_C eigv; │ │ │ │ │ +379 _r_e_a_l___t_y_p_e min_eigv, max_eigv; │ │ │ │ │ +380 arpack._c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e (eps, eigv, min_eigv); │ │ │ │ │ +381 arpack._c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e (eps, eigv, max_eigv); │ │ │ │ │ +382 │ │ │ │ │ +383 res._c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e = max_eigv / min_eigv; │ │ │ │ │ +384 │ │ │ │ │ +385 if (this->___v_e_r_b_o_s_e > 0) { │ │ │ │ │ +386 std::cout << "Min eigv estimate: " << Simd::io(min_eigv) << '\n'; │ │ │ │ │ +387 std::cout << "Max eigv estimate: " << Simd::io(max_eigv) << '\n'; │ │ │ │ │ +388 std::cout << "Condition estimate: " │ │ │ │ │ +389 << Simd::io(max_eigv / min_eigv) << std::endl; │ │ │ │ │ +390 } │ │ │ │ │ +391 } │ │ │ │ │ +392#else │ │ │ │ │ +393 std::cerr << "WARNING: Condition estimate was requested. This requires │ │ │ │ │ +ARPACK, but ARPACK was not found!" << std::endl; │ │ │ │ │ +394#endif │ │ │ │ │ +395 } │ │ │ │ │ +396 } │ │ │ │ │ +397 │ │ │ │ │ +398 private: │ │ │ │ │ +399 bool condition_estimate_ = false; │ │ │ │ │ +400 │ │ │ │ │ +401 // Matrix and vector types used for condition estimate │ │ │ │ │ +402 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_r_e_a_l___t_y_p_e_,_1_,_1_> > COND_MAT; │ │ │ │ │ +403 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r_<_r_e_a_l___t_y_p_e_,_1_> > COND_VEC; │ │ │ │ │ +404 │ │ │ │ │ +405 protected: │ │ │ │ │ +406 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +407 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +408 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +409 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +410 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +411 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +_4_1_2 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ +413 }; │ │ │ │ │ +_4_1_4 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("cgsolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +415 │ │ │ │ │ +416 // Ronald Kriemanns BiCG-STAB implementation from Sumo │ │ │ │ │ +418 template │ │ │ │ │ +_4_1_9 class _B_i_C_G_S_T_A_B_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ +420 public: │ │ │ │ │ +421 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +422 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +423 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +424 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +425 │ │ │ │ │ +426 // copy base class constructors │ │ │ │ │ +427 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +428 │ │ │ │ │ +429 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +430 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +431 │ │ │ │ │ +_4_3_9 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +440 { │ │ │ │ │ +441 using std::abs; │ │ │ │ │ +442 const Simd::Scalar EPSILON=1e-80; │ │ │ │ │ +443 using std::abs; │ │ │ │ │ +444 double it; │ │ │ │ │ +445 _f_i_e_l_d___t_y_p_e rho, rho_new, alpha, beta, h, omega; │ │ │ │ │ +446 _r_e_a_l___t_y_p_e norm; │ │ │ │ │ +447 │ │ │ │ │ +448 // │ │ │ │ │ +449 // get vectors and matrix │ │ │ │ │ +450 // │ │ │ │ │ +451 X& r=b; │ │ │ │ │ +452 X p(x); │ │ │ │ │ +453 X v(x); │ │ │ │ │ +454 X t(x); │ │ │ │ │ +455 X y(x); │ │ │ │ │ +456 X rt(x); │ │ │ │ │ +457 │ │ │ │ │ +458 // │ │ │ │ │ +459 // begin iteration │ │ │ │ │ +460 // │ │ │ │ │ +461 │ │ │ │ │ +462 // r = r - Ax; rt = r │ │ │ │ │ +463 _I_t_e_r_a_t_i_o_n_<_d_o_u_b_l_e_> iteration(*this,res); │ │ │ │ │ +464 ___p_r_e_c->pre(x,r); // prepare preconditioner │ │ │ │ │ +465 │ │ │ │ │ +466 ___o_p->applyscaleadd(-1,x,r); // overwrite b with defect │ │ │ │ │ +467 │ │ │ │ │ +468 rt=r; │ │ │ │ │ +469 │ │ │ │ │ +470 norm = ___s_p->norm(r); │ │ │ │ │ +471 if(iteration.step(0, norm)){ │ │ │ │ │ +472 ___p_r_e_c->post(x); │ │ │ │ │ +473 return; │ │ │ │ │ +474 } │ │ │ │ │ +475 p=0; │ │ │ │ │ +476 v=0; │ │ │ │ │ +477 │ │ │ │ │ +478 rho = 1; │ │ │ │ │ +479 alpha = 1; │ │ │ │ │ +480 omega = 1; │ │ │ │ │ +481 │ │ │ │ │ +482 // │ │ │ │ │ +483 // iteration │ │ │ │ │ +484 // │ │ │ │ │ +485 │ │ │ │ │ +486 for (it = 0.5; it < ___m_a_x_i_t; it+=.5) │ │ │ │ │ +487 { │ │ │ │ │ +488 // │ │ │ │ │ +489 // preprocess, set vecsizes etc. │ │ │ │ │ +490 // │ │ │ │ │ +491 │ │ │ │ │ +492 // rho_new = < rt , r > │ │ │ │ │ +493 rho_new = ___s_p->dot(rt,r); │ │ │ │ │ +494 │ │ │ │ │ +495 // look if breakdown occurred │ │ │ │ │ +496 if (Simd::allTrue(abs(rho) <= EPSILON)) │ │ │ │ │ +497 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t,"breakdown in BiCGSTAB - rho " │ │ │ │ │ +498 << Simd::io(rho) << " <= EPSILON " << EPSILON │ │ │ │ │ +499 << " after " << it << " iterations"); │ │ │ │ │ +500 if (Simd::allTrue(abs(omega) <= EPSILON)) │ │ │ │ │ +501 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t,"breakdown in BiCGSTAB - omega " │ │ │ │ │ +502 << Simd::io(omega) << " <= EPSILON " << EPSILON │ │ │ │ │ +503 << " after " << it << " iterations"); │ │ │ │ │ +504 │ │ │ │ │ +505 │ │ │ │ │ +506 if (it<1) │ │ │ │ │ +507 p = r; │ │ │ │ │ +508 else │ │ │ │ │ +509 { │ │ │ │ │ +510 beta = Simd::cond(norm==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +511 _f_i_e_l_d___t_y_p_e(0.), // no need for orthogonalization if norm is already 0 │ │ │ │ │ +512 ( rho_new / rho ) * ( alpha / omega )); │ │ │ │ │ +513 p.axpy(-omega,v); // p = r + beta (p - omega*v) │ │ │ │ │ +514 p *= beta; │ │ │ │ │ +515 p += r; │ │ │ │ │ +516 } │ │ │ │ │ +517 │ │ │ │ │ +518 // y = W^-1 * p │ │ │ │ │ +519 y = 0; │ │ │ │ │ +520 ___p_r_e_c->apply(y,p); // apply preconditioner │ │ │ │ │ +521 │ │ │ │ │ +522 // v = A * y │ │ │ │ │ +523 ___o_p->apply(y,v); │ │ │ │ │ +524 │ │ │ │ │ +525 // alpha = rho_new / < rt, v > │ │ │ │ │ +526 h = ___s_p->dot(rt,v); │ │ │ │ │ +527 │ │ │ │ │ +528 if ( Simd::allTrue(abs(h) < EPSILON) ) │ │ │ │ │ +529 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t,"abs(h) < EPSILON in BiCGSTAB - abs(h) " │ │ │ │ │ +530 << Simd::io(abs(h)) << " < EPSILON " << EPSILON │ │ │ │ │ +531 << " after " << it << " iterations"); │ │ │ │ │ +532 │ │ │ │ │ +533 alpha = Simd::cond(norm==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +534 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +535 rho_new / h); │ │ │ │ │ +536 │ │ │ │ │ +537 // apply first correction to x │ │ │ │ │ +538 // x <- x + alpha y │ │ │ │ │ +539 x.axpy(alpha,y); │ │ │ │ │ +540 │ │ │ │ │ +541 // r = r - alpha*v │ │ │ │ │ +542 r.axpy(-alpha,v); │ │ │ │ │ +543 │ │ │ │ │ +544 // │ │ │ │ │ +545 // test stop criteria │ │ │ │ │ +546 // │ │ │ │ │ +547 │ │ │ │ │ +548 norm = ___s_p->norm(r); │ │ │ │ │ +549 if(iteration.step(it, norm)){ │ │ │ │ │ +550 break; │ │ │ │ │ +551 } │ │ │ │ │ +552 │ │ │ │ │ +553 it+=.5; │ │ │ │ │ +554 │ │ │ │ │ +555 // y = W^-1 * r │ │ │ │ │ +556 y = 0; │ │ │ │ │ +557 ___p_r_e_c->apply(y,r); │ │ │ │ │ +558 │ │ │ │ │ +559 // t = A * y │ │ │ │ │ +560 ___o_p->apply(y,t); │ │ │ │ │ +561 │ │ │ │ │ +562 // omega = < t, r > / < t, t > │ │ │ │ │ +563 h = ___s_p->dot(t,t); │ │ │ │ │ +564 omega = Simd::cond(norm==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +565 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +566 ___s_p->dot(t,r)/h); │ │ │ │ │ +567 │ │ │ │ │ +568 // apply second correction to x │ │ │ │ │ +569 // x <- x + omega y │ │ │ │ │ +570 x.axpy(omega,y); │ │ │ │ │ +571 │ │ │ │ │ +572 // r = s - omega*t (remember : r = s) │ │ │ │ │ +573 r.axpy(-omega,t); │ │ │ │ │ +574 │ │ │ │ │ +575 rho = rho_new; │ │ │ │ │ +576 │ │ │ │ │ +577 // │ │ │ │ │ +578 // test stop criteria │ │ │ │ │ +579 // │ │ │ │ │ +580 │ │ │ │ │ +581 norm = ___s_p->norm(r); │ │ │ │ │ +582 if(iteration.step(it, norm)){ │ │ │ │ │ +583 break; │ │ │ │ │ +584 } │ │ │ │ │ +585 } // end for │ │ │ │ │ +586 │ │ │ │ │ +587 ___p_r_e_c->post(x); // postprocess preconditioner │ │ │ │ │ +588 } │ │ │ │ │ +589 │ │ │ │ │ +590 protected: │ │ │ │ │ +591 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +592 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +593 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +594 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +595 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +596 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +597 template │ │ │ │ │ +_5_9_8 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_C_o_u_n_t_T_y_p_e_>; │ │ │ │ │ +599 }; │ │ │ │ │ +_6_0_0 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("bicgstabsolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +601 │ │ │ │ │ +608 template │ │ │ │ │ +_6_0_9 class _M_I_N_R_E_S_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ +610 public: │ │ │ │ │ +611 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +612 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +613 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +614 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +615 │ │ │ │ │ +616 // copy base class constructors │ │ │ │ │ +617 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::IterativeSolver; │ │ │ │ │ +618 │ │ │ │ │ +619 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +620 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +621 │ │ │ │ │ +_6_2_7 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +628 { │ │ │ │ │ +629 using std::sqrt; │ │ │ │ │ +630 using std::abs; │ │ │ │ │ +631 _I_t_e_r_a_t_i_o_n iteration(*this, res); │ │ │ │ │ +632 // prepare preconditioner │ │ │ │ │ +633 ___p_r_e_c->pre(x,b); │ │ │ │ │ +634 │ │ │ │ │ +635 // overwrite rhs with defect │ │ │ │ │ +636 ___o_p->applyscaleadd(-1.0,x,b); // b -= Ax │ │ │ │ │ +637 │ │ │ │ │ +638 // some temporary vectors │ │ │ │ │ +639 X z(b), dummy(b); │ │ │ │ │ +640 z = 0.0; │ │ │ │ │ +641 │ │ │ │ │ +642 // calculate preconditioned defect │ │ │ │ │ +643 ___p_r_e_c->apply(z,b); // r = W^-1 (b - Ax) │ │ │ │ │ +644 _r_e_a_l___t_y_p_e def = ___s_p->norm(z); │ │ │ │ │ +645 if (iteration.step(0, def)){ │ │ │ │ │ +646 ___p_r_e_c->post(x); │ │ │ │ │ +647 return; │ │ │ │ │ +648 } │ │ │ │ │ +649 │ │ │ │ │ +650 // recurrence coefficients as computed in Lanczos algorithm │ │ │ │ │ +651 _f_i_e_l_d___t_y_p_e alpha, beta; │ │ │ │ │ +652 // diagonal entries of givens rotation │ │ │ │ │ +653 std::array c{{0.0,0.0}}; │ │ │ │ │ +654 // off-diagonal entries of givens rotation │ │ │ │ │ +655 std::array s{{0.0,0.0}}; │ │ │ │ │ +656 │ │ │ │ │ +657 // recurrence coefficients (column k of tridiag matrix T_k) │ │ │ │ │ +658 std::array T{{0.0,0.0,0.0}}; │ │ │ │ │ +659 │ │ │ │ │ +660 // the rhs vector of the min problem │ │ │ │ │ +661 std::array xi{{1.0,0.0}}; │ │ │ │ │ +662 │ │ │ │ │ +663 // beta is real and positive in exact arithmetic │ │ │ │ │ +664 // since it is the norm of the basis vectors (in unpreconditioned case) │ │ │ │ │ +665 beta = sqrt(___s_p->dot(b,z)); │ │ │ │ │ +666 _f_i_e_l_d___t_y_p_e beta0 = beta; │ │ │ │ │ +667 │ │ │ │ │ +668 // the search directions │ │ │ │ │ +669 std::array p{{b,b,b}}; │ │ │ │ │ +670 p[0] = 0.0; │ │ │ │ │ +671 p[1] = 0.0; │ │ │ │ │ +672 p[2] = 0.0; │ │ │ │ │ +673 │ │ │ │ │ +674 // orthonormal basis vectors (in unpreconditioned case) │ │ │ │ │ +675 std::array q{{b,b,b}}; │ │ │ │ │ +676 q[0] = 0.0; │ │ │ │ │ +677 q[1] *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +678 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +679 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ +680 q[2] = 0.0; │ │ │ │ │ +681 │ │ │ │ │ +682 z *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +683 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +684 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ +685 │ │ │ │ │ +686 // the loop │ │ │ │ │ +687 int i = 1; │ │ │ │ │ +688 for( ; i<=___m_a_x_i_t; i++) { │ │ │ │ │ +689 │ │ │ │ │ +690 dummy = z; │ │ │ │ │ +691 int i1 = i%3, │ │ │ │ │ +692 i0 = (i1+2)%3, │ │ │ │ │ +693 i2 = (i1+1)%3; │ │ │ │ │ +694 │ │ │ │ │ +695 // symmetrically preconditioned Lanczos algorithm (see Greenbaum p.121) │ │ │ │ │ +696 ___o_p->apply(z,q[i2]); // q[i2] = Az │ │ │ │ │ +697 q[i2].axpy(-beta,q[i0]); │ │ │ │ │ +698 // alpha is real since it is the diagonal entry of the hermitian │ │ │ │ │ +tridiagonal matrix │ │ │ │ │ +699 // from the Lanczos Algorithm │ │ │ │ │ +700 // so the order in the scalar product doesn't matter even for the complex │ │ │ │ │ +case │ │ │ │ │ +701 alpha = ___s_p->dot(z,q[i2]); │ │ │ │ │ +702 q[i2].axpy(-alpha,q[i1]); │ │ │ │ │ +703 │ │ │ │ │ +704 z = 0.0; │ │ │ │ │ +705 ___p_r_e_c->apply(z,q[i2]); │ │ │ │ │ +706 │ │ │ │ │ +707 // beta is real and positive in exact arithmetic │ │ │ │ │ +708 // since it is the norm of the basis vectors (in unpreconditioned case) │ │ │ │ │ +709 beta = sqrt(___s_p->dot(q[i2],z)); │ │ │ │ │ +710 │ │ │ │ │ +711 q[i2] *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +712 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +713 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ +714 z *= Simd::cond(def==_f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +715 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +716 _r_e_a_l___t_y_p_e(1.0)/beta); │ │ │ │ │ +717 │ │ │ │ │ +718 // QR Factorization of recurrence coefficient matrix │ │ │ │ │ +719 // apply previous givens rotations to last column of T │ │ │ │ │ +720 T[1] = T[2]; │ │ │ │ │ +721 if(i>2) { │ │ │ │ │ +722 T[0] = s[i%2]*T[1]; │ │ │ │ │ +723 T[1] = c[i%2]*T[1]; │ │ │ │ │ +724 } │ │ │ │ │ +725 if(i>1) { │ │ │ │ │ +726 T[2] = c[(i+1)%2]*alpha - s[(i+1)%2]*T[1]; │ │ │ │ │ +727 T[1] = c[(i+1)%2]*T[1] + s[(i+1)%2]*alpha; │ │ │ │ │ +728 } │ │ │ │ │ +729 else │ │ │ │ │ +730 T[2] = alpha; │ │ │ │ │ +731 │ │ │ │ │ +732 // update QR factorization │ │ │ │ │ +733 generateGivensRotation(T[2],beta,c[i%2],s[i%2]); │ │ │ │ │ +734 // to last column of T_k │ │ │ │ │ +735 T[2] = c[i%2]*T[2] + s[i%2]*beta; │ │ │ │ │ +736 // and to the rhs xi of the min problem │ │ │ │ │ +737 xi[i%2] = -s[i%2]*xi[(i+1)%2]; │ │ │ │ │ +738 xi[(i+1)%2] *= c[i%2]; │ │ │ │ │ +739 │ │ │ │ │ +740 // compute correction direction │ │ │ │ │ +741 p[i2] = dummy; │ │ │ │ │ +742 p[i2].axpy(-T[1],p[i1]); │ │ │ │ │ +743 p[i2].axpy(-T[0],p[i0]); │ │ │ │ │ +744 p[i2] *= _r_e_a_l___t_y_p_e(1.0)/T[2]; │ │ │ │ │ +745 │ │ │ │ │ +746 // apply correction/update solution │ │ │ │ │ +747 x.axpy(beta0*xi[(i+1)%2],p[i2]); │ │ │ │ │ +748 │ │ │ │ │ +749 // remember beta_old │ │ │ │ │ +750 T[2] = beta; │ │ │ │ │ +751 │ │ │ │ │ +752 // check for convergence │ │ │ │ │ +753 // the last entry in the rhs of the min-problem is the residual │ │ │ │ │ +754 def = abs(beta0*xi[i%2]); │ │ │ │ │ +755 if(iteration.step(i, def)){ │ │ │ │ │ +756 break; │ │ │ │ │ +757 } │ │ │ │ │ +758 } // end for │ │ │ │ │ +759 │ │ │ │ │ +760 // postprocess preconditioner │ │ │ │ │ +761 ___p_r_e_c->post(x); │ │ │ │ │ +762 } │ │ │ │ │ +763 │ │ │ │ │ +764 private: │ │ │ │ │ +765 │ │ │ │ │ +766 void generateGivensRotation(_f_i_e_l_d___t_y_p_e &dx, _f_i_e_l_d___t_y_p_e &dy, _r_e_a_l___t_y_p_e &cs, │ │ │ │ │ +_f_i_e_l_d___t_y_p_e &sn) │ │ │ │ │ +767 { │ │ │ │ │ +768 using std::sqrt; │ │ │ │ │ +769 using std::abs; │ │ │ │ │ +770 using std::max; │ │ │ │ │ +771 using std::min; │ │ │ │ │ +772 const _r_e_a_l___t_y_p_e eps = 1e-15; │ │ │ │ │ +773 _r_e_a_l___t_y_p_e norm_dx = abs(dx); │ │ │ │ │ +774 _r_e_a_l___t_y_p_e norm_dy = abs(dy); │ │ │ │ │ +775 _r_e_a_l___t_y_p_e norm_max = max(norm_dx, norm_dy); │ │ │ │ │ +776 _r_e_a_l___t_y_p_e norm_min = min(norm_dx, norm_dy); │ │ │ │ │ +777 _r_e_a_l___t_y_p_e temp = norm_min/norm_max; │ │ │ │ │ +778 // we rewrite the code in a vectorizable fashion │ │ │ │ │ +779 cs = Simd::cond(norm_dy < eps, │ │ │ │ │ +780 _r_e_a_l___t_y_p_e(1.0), │ │ │ │ │ +781 Simd::cond(norm_dx < eps, │ │ │ │ │ +782 _r_e_a_l___t_y_p_e(0.0), │ │ │ │ │ +783 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ +784 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*temp, │ │ │ │ │ +785 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp) │ │ │ │ │ +786 ))); │ │ │ │ │ +787 sn = Simd::cond(norm_dy < eps, │ │ │ │ │ +788 _f_i_e_l_d___t_y_p_e(0.0), │ │ │ │ │ +789 Simd::cond(norm_dx < eps, │ │ │ │ │ +790 _f_i_e_l_d___t_y_p_e(1.0), │ │ │ │ │ +791 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ +792 // dy and dx are real in exact arithmetic │ │ │ │ │ +793 // thus dx*dy is real so we can explicitly enforce it │ │ │ │ │ +794 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*dx*dy/norm_dx/norm_dy, │ │ │ │ │ +795 // dy and dx is real in exact arithmetic │ │ │ │ │ +796 // so we don't have to conjugate both of them │ │ │ │ │ +797 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*dy/dx │ │ │ │ │ +798 ))); │ │ │ │ │ +799 } │ │ │ │ │ +800 │ │ │ │ │ +801 protected: │ │ │ │ │ +802 using IterativeSolver_:_:___o_p; │ │ │ │ │ +803 using IterativeSolver_:_:___p_r_e_c; │ │ │ │ │ +804 using IterativeSolver_:_:___s_p; │ │ │ │ │ +805 using IterativeSolver_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +806 using IterativeSolver_:_:___m_a_x_i_t; │ │ │ │ │ +807 using IterativeSolver_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +_8_0_8 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ +809 }; │ │ │ │ │ +_8_1_0 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("minressolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +811 │ │ │ │ │ +825 template │ │ │ │ │ +_8_2_6 class _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +827 { │ │ │ │ │ +828 public: │ │ │ │ │ +829 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +830 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +831 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +832 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +833 │ │ │ │ │ +834 protected: │ │ │ │ │ +835 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +836 │ │ │ │ │ +_8_3_8 using _f_A_l_l_o_c = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>; │ │ │ │ │ +_8_4_0 using _r_A_l_l_o_c = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_r_e_a_l___t_y_p_e_>; │ │ │ │ │ +841 │ │ │ │ │ +842 public: │ │ │ │ │ +843 │ │ │ │ │ +_8_5_0 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& │ │ │ │ │ +prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int restart, int maxit, int verbose) : │ │ │ │ │ +851 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,reduction,maxit,verbose), │ │ │ │ │ +852 ___r_e_s_t_a_r_t(restart) │ │ │ │ │ +853 {} │ │ │ │ │ +854 │ │ │ │ │ +_8_6_1 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, const │ │ │ │ │ +_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, │ │ │ │ │ +int restart, int maxit, int verbose) : │ │ │ │ │ +862 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ +863 ___r_e_s_t_a_r_t(restart) │ │ │ │ │ +864 {} │ │ │ │ │ +865 │ │ │ │ │ +_8_7_8 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ +shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) : │ │ │ │ │ +879 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,configuration), │ │ │ │ │ +880 ___r_e_s_t_a_r_t(configuration._g_e_t("restart")) │ │ │ │ │ +881 {} │ │ │ │ │ +882 │ │ │ │ │ +_8_8_3 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ +shared_ptr > sp, std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > │ │ │ │ │ +prec, const ParameterTree& configuration) : │ │ │ │ │ +884 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,configuration), │ │ │ │ │ +885 ___r_e_s_t_a_r_t(configuration._g_e_t("restart")) │ │ │ │ │ +886 {} │ │ │ │ │ +887 │ │ │ │ │ +_8_9_4 _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ +895 std::shared_ptr> sp, │ │ │ │ │ +896 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>> prec, │ │ │ │ │ +897 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int restart, int maxit, int verbose) : │ │ │ │ │ +898 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ +899 ___r_e_s_t_a_r_t(restart) │ │ │ │ │ +900 {} │ │ │ │ │ +901 │ │ │ │ │ +_9_1_0 virtual void _a_p_p_l_y (X& x, Y& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +911 { │ │ │ │ │ +912 _a_p_p_l_y(x,b,Simd::max(___r_e_d_u_c_t_i_o_n),res); │ │ │ │ │ +913 } │ │ │ │ │ +914 │ │ │ │ │ +_9_2_3 virtual void _a_p_p_l_y (X& x, Y& b, [[maybe_unused]] double reduction, │ │ │ │ │ +_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +924 { │ │ │ │ │ +925 using std::abs; │ │ │ │ │ +926 const Simd::Scalar EPSILON = 1e-80; │ │ │ │ │ +927 const int m = ___r_e_s_t_a_r_t; │ │ │ │ │ +928 _r_e_a_l___t_y_p_e norm = 0.0; │ │ │ │ │ +929 int j = 1; │ │ │ │ │ +930 std::vector s(m+1), sn(m); │ │ │ │ │ +931 std::vector cs(m); │ │ │ │ │ +932 // need copy of rhs if GMRes has to be restarted │ │ │ │ │ +933 Y b2(b); │ │ │ │ │ +934 // helper vector │ │ │ │ │ +935 Y w(b); │ │ │ │ │ +936 std::vector< std::vector > H(m+1,s); │ │ │ │ │ +937 std::vector v(m+1,b); │ │ │ │ │ +938 │ │ │ │ │ +939 _I_t_e_r_a_t_i_o_n iteration(*this,res); │ │ │ │ │ +940 │ │ │ │ │ +941 // clear solver statistics and set res.converged to false │ │ │ │ │ +942 ___p_r_e_c->pre(x,b); │ │ │ │ │ +943 │ │ │ │ │ +944 // calculate defect and overwrite rhs with it │ │ │ │ │ +945 ___o_p->applyscaleadd(-1.0,x,b); // b -= Ax │ │ │ │ │ +946 // calculate preconditioned defect │ │ │ │ │ +947 v[0] = 0.0; ___p_r_e_c->apply(v[0],b); // r = W^-1 b │ │ │ │ │ +948 norm = ___s_p->norm(v[0]); │ │ │ │ │ +949 if(iteration.step(0, norm)){ │ │ │ │ │ +950 ___p_r_e_c->post(x); │ │ │ │ │ +951 return; │ │ │ │ │ +952 } │ │ │ │ │ +953 │ │ │ │ │ +954 while(j <= ___m_a_x_i_t && res._c_o_n_v_e_r_g_e_d != true) { │ │ │ │ │ +955 │ │ │ │ │ +956 int i = 0; │ │ │ │ │ +957 v[0] *= Simd::cond(norm==_r_e_a_l___t_y_p_e(0.), │ │ │ │ │ +958 _r_e_a_l___t_y_p_e(0.), │ │ │ │ │ +959 _r_e_a_l___t_y_p_e(1.0)/norm); │ │ │ │ │ +960 s[0] = norm; │ │ │ │ │ +961 for(i=1; iapply(v[i],v[i+1]); │ │ │ │ │ +970 ___p_r_e_c->apply(w,v[i+1]); │ │ │ │ │ +971 for(int k=0; kdot(v[k],w) = v[k]\adjoint w │ │ │ │ │ +973 // so one has to pay attention to the order │ │ │ │ │ +974 // in the scalar product for the complex case │ │ │ │ │ +975 // doing the modified Gram-Schmidt algorithm │ │ │ │ │ +976 H[k][i] = ___s_p->dot(v[k],w); │ │ │ │ │ +977 // w -= H[k][i] * v[k] │ │ │ │ │ +978 w.axpy(-H[k][i],v[k]); │ │ │ │ │ +979 } │ │ │ │ │ +980 H[i+1][i] = ___s_p->norm(w); │ │ │ │ │ +981 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON)) │ │ │ │ │ +982 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t, │ │ │ │ │ +983 "breakdown in GMRes - |w| == 0.0 after " << j << " iterations"); │ │ │ │ │ +984 │ │ │ │ │ +985 // normalize new vector │ │ │ │ │ +986 v[i+1] = w; │ │ │ │ │ +987 v[i+1] *= Simd::cond(norm==_r_e_a_l___t_y_p_e(0.), │ │ │ │ │ +988 _f_i_e_l_d___t_y_p_e(0.), │ │ │ │ │ +989 _r_e_a_l___t_y_p_e(1.0)/H[i+1][i]); │ │ │ │ │ +990 │ │ │ │ │ +991 // update QR factorization │ │ │ │ │ +992 for(int k=0; k 0) │ │ │ │ │ +1020 std::cout << "=== GMRes::restart" << std::endl; │ │ │ │ │ +1021 // get saved rhs │ │ │ │ │ +1022 b = b2; │ │ │ │ │ +1023 // calculate new defect │ │ │ │ │ +1024 ___o_p->applyscaleadd(-1.0,x,b); // b -= Ax; │ │ │ │ │ +1025 // calculate preconditioned defect │ │ │ │ │ +1026 v[0] = 0.0; │ │ │ │ │ +1027 ___p_r_e_c->apply(v[0],b); │ │ │ │ │ +1028 norm = ___s_p->norm(v[0]); │ │ │ │ │ +1029 } │ │ │ │ │ +1030 │ │ │ │ │ +1031 } //end while │ │ │ │ │ +1032 │ │ │ │ │ +1033 // postprocess preconditioner │ │ │ │ │ +1034 ___p_r_e_c->post(x); │ │ │ │ │ +1035 } │ │ │ │ │ +1036 │ │ │ │ │ +1037 protected : │ │ │ │ │ +1038 │ │ │ │ │ +_1_0_3_9 void _u_p_d_a_t_e(X& w, int i, │ │ │ │ │ +1040 const std::vector >& H, │ │ │ │ │ +1041 const std::vector& s, │ │ │ │ │ +1042 const std::vector& v) { │ │ │ │ │ +1043 // solution vector of the upper triangular system │ │ │ │ │ +1044 std::vector y(s); │ │ │ │ │ +1045 │ │ │ │ │ +1046 // backsolve │ │ │ │ │ +1047 for(int a=i-1; a>=0; a--) { │ │ │ │ │ +1048 _f_i_e_l_d___t_y_p_e rhs(s[a]); │ │ │ │ │ +1049 for(int b=a+1; b │ │ │ │ │ +_1_0_6_2 typename std::enable_if::value,T>::type │ │ │ │ │ +_c_o_n_j_u_g_a_t_e(const T& t) { │ │ │ │ │ +1063 return t; │ │ │ │ │ +1064 } │ │ │ │ │ +1065 │ │ │ │ │ +1066 template │ │ │ │ │ +_1_0_6_7 typename std::enable_if::value,T>:: │ │ │ │ │ +type _c_o_n_j_u_g_a_t_e(const T& t) { │ │ │ │ │ +1068 using std::conj; │ │ │ │ │ +1069 return conj(t); │ │ │ │ │ +1070 } │ │ │ │ │ +1071 │ │ │ │ │ +1072 void │ │ │ │ │ +_1_0_7_3 _g_e_n_e_r_a_t_e_P_l_a_n_e_R_o_t_a_t_i_o_n(_f_i_e_l_d___t_y_p_e &dx, _f_i_e_l_d___t_y_p_e &dy, _r_e_a_l___t_y_p_e &cs, │ │ │ │ │ +_f_i_e_l_d___t_y_p_e &sn) │ │ │ │ │ +1074 { │ │ │ │ │ +1075 using std::sqrt; │ │ │ │ │ +1076 using std::abs; │ │ │ │ │ +1077 using std::max; │ │ │ │ │ +1078 using std::min; │ │ │ │ │ +1079 const _r_e_a_l___t_y_p_e eps = 1e-15; │ │ │ │ │ +1080 _r_e_a_l___t_y_p_e norm_dx = abs(dx); │ │ │ │ │ +1081 _r_e_a_l___t_y_p_e norm_dy = abs(dy); │ │ │ │ │ +1082 _r_e_a_l___t_y_p_e norm_max = max(norm_dx, norm_dy); │ │ │ │ │ +1083 _r_e_a_l___t_y_p_e norm_min = min(norm_dx, norm_dy); │ │ │ │ │ +1084 _r_e_a_l___t_y_p_e temp = norm_min/norm_max; │ │ │ │ │ +1085 // we rewrite the code in a vectorizable fashion │ │ │ │ │ +1086 cs = Simd::cond(norm_dy < eps, │ │ │ │ │ +1087 _r_e_a_l___t_y_p_e(1.0), │ │ │ │ │ +1088 Simd::cond(norm_dx < eps, │ │ │ │ │ +1089 _r_e_a_l___t_y_p_e(0.0), │ │ │ │ │ +1090 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ +1091 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*temp, │ │ │ │ │ +1092 _r_e_a_l___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp) │ │ │ │ │ +1093 ))); │ │ │ │ │ +1094 sn = Simd::cond(norm_dy < eps, │ │ │ │ │ +1095 _f_i_e_l_d___t_y_p_e(0.0), │ │ │ │ │ +1096 Simd::cond(norm_dx < eps, │ │ │ │ │ +1097 _f_i_e_l_d___t_y_p_e(1.0), │ │ │ │ │ +1098 Simd::cond(norm_dy > norm_dx, │ │ │ │ │ +1099 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*dx*_c_o_n_j_u_g_a_t_e(dy)/norm_dx/ │ │ │ │ │ +norm_dy, │ │ │ │ │ +1100 _f_i_e_l_d___t_y_p_e(1.0)/sqrt(_r_e_a_l___t_y_p_e(1.0) + temp*temp)*_c_o_n_j_u_g_a_t_e(dy/dx) │ │ │ │ │ +1101 ))); │ │ │ │ │ +1102 } │ │ │ │ │ +1103 │ │ │ │ │ +1104 │ │ │ │ │ +1105 void │ │ │ │ │ +_1_1_0_6 _a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(_f_i_e_l_d___t_y_p_e &dx, _f_i_e_l_d___t_y_p_e &dy, _r_e_a_l___t_y_p_e &cs, │ │ │ │ │ +_f_i_e_l_d___t_y_p_e &sn) │ │ │ │ │ +1107 { │ │ │ │ │ +1108 _f_i_e_l_d___t_y_p_e temp = cs * dx + sn * dy; │ │ │ │ │ +1109 dy = -_c_o_n_j_u_g_a_t_e(sn) * dx + cs * dy; │ │ │ │ │ +1110 dx = temp; │ │ │ │ │ +1111 } │ │ │ │ │ +1112 │ │ │ │ │ +1113 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +1114 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +1115 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +1116 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +1117 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +1118 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +_1_1_1_9 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ +_1_1_2_0 int ___r_e_s_t_a_r_t; │ │ │ │ │ +1121 }; │ │ │ │ │ +_1_1_2_2 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("restartedgmressolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +1123 │ │ │ │ │ +1137 template │ │ │ │ │ +_1_1_3_8 class _R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r : public _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +1139 { │ │ │ │ │ +1140 public: │ │ │ │ │ +1141 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +1142 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +1143 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +1144 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +1145 │ │ │ │ │ +1146 private: │ │ │ │ │ +1147 using typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +1148 │ │ │ │ │ +1150 using fAlloc = typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_f_A_l_l_o_c; │ │ │ │ │ +1152 using rAlloc = typename _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_<_X_,_Y_>_:_:_r_A_l_l_o_c; │ │ │ │ │ +1153 │ │ │ │ │ +1154 public: │ │ │ │ │ +1155 // copy base class constructors │ │ │ │ │ +1156 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r::RestartedGMResSolver; │ │ │ │ │ +1157 │ │ │ │ │ +1158 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +1159 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +1160 │ │ │ │ │ +_1_1_6_9 void _a_p_p_l_y (X& x, Y& b, [[maybe_unused]] double reduction, │ │ │ │ │ +_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) override │ │ │ │ │ +1170 { │ │ │ │ │ +1171 using std::abs; │ │ │ │ │ +1172 const Simd::Scalar EPSILON = 1e-80; │ │ │ │ │ +1173 const int m = ___r_e_s_t_a_r_t; │ │ │ │ │ +1174 _r_e_a_l___t_y_p_e norm = 0.0; │ │ │ │ │ +1175 int i, j = 1, k; │ │ │ │ │ +1176 std::vector s(m+1), sn(m); │ │ │ │ │ +1177 std::vector cs(m); │ │ │ │ │ +1178 // helper vector │ │ │ │ │ +1179 Y tmp(b); │ │ │ │ │ +1180 std::vector< std::vector > H(m+1,s); │ │ │ │ │ +1181 std::vector v(m+1,b); │ │ │ │ │ +1182 std::vector w(m+1,b); │ │ │ │ │ +1183 │ │ │ │ │ +1184 Iteration iteration(*this,res); │ │ │ │ │ +1185 // setup preconditioner if it does something in pre │ │ │ │ │ +1186 │ │ │ │ │ +1187 // calculate residual and overwrite a copy of the rhs with it │ │ │ │ │ +1188 ___p_r_e_c->pre(x, b); │ │ │ │ │ +1189 v[0] = b; │ │ │ │ │ +1190 ___o_p->applyscaleadd(-1.0, x, v[0]); // b -= Ax │ │ │ │ │ +1191 │ │ │ │ │ +1192 norm = ___s_p->norm(v[0]); // the residual norm │ │ │ │ │ +1193 if(iteration.step(0, norm)){ │ │ │ │ │ +1194 ___p_r_e_c->post(x); │ │ │ │ │ +1195 return; │ │ │ │ │ +1196 } │ │ │ │ │ +1197 │ │ │ │ │ +1198 // start iterations │ │ │ │ │ +1199 res._c_o_n_v_e_r_g_e_d = false;; │ │ │ │ │ +1200 while(j <= ___m_a_x_i_t && res._c_o_n_v_e_r_g_e_d != true) │ │ │ │ │ +1201 { │ │ │ │ │ +1202 v[0] *= (1.0 / norm); │ │ │ │ │ +1203 s[0] = norm; │ │ │ │ │ +1204 for(i=1; iapply(w[i], v[i]); │ │ │ │ │ +1213 // compute vi = A*wi │ │ │ │ │ +1214 // use v[i+1] as temporary vector for w │ │ │ │ │ +1215 ___o_p->apply(w[i], v[i+1]); │ │ │ │ │ +1216 // do Arnoldi algorithm │ │ │ │ │ +1217 for(int kk=0; kkdot(v[k],v[i+1]) = v[k]\adjoint v[i+1] │ │ │ │ │ +1220 // so one has to pay attention to the order │ │ │ │ │ +1221 // in the scalar product for the complex case │ │ │ │ │ +1222 // doing the modified Gram-Schmidt algorithm │ │ │ │ │ +1223 H[kk][i] = ___s_p->dot(v[kk],v[i+1]); │ │ │ │ │ +1224 // w -= H[k][i] * v[kk] │ │ │ │ │ +1225 v[i+1].axpy(-H[kk][i], v[kk]); │ │ │ │ │ +1226 } │ │ │ │ │ +1227 H[i+1][i] = ___s_p->norm(v[i+1]); │ │ │ │ │ +1228 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON)) │ │ │ │ │ +1229 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t, "breakdown in fGMRes - |w| (-> " │ │ │ │ │ +1230 << w[i] << ") == 0.0 after " │ │ │ │ │ +1231 << j << " iterations"); │ │ │ │ │ +1232 │ │ │ │ │ +1233 // v[i+1] = w*1/H[i+1][i] │ │ │ │ │ +1234 v[i+1] *= _r_e_a_l___t_y_p_e(1.0)/H[i+1][i]; │ │ │ │ │ +1235 │ │ │ │ │ +1236 // update QR factorization │ │ │ │ │ +1237 for(k=0; k_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(H[k][i],H[k+1][i],cs[k],sn[k]); │ │ │ │ │ +1239 │ │ │ │ │ +1240 // compute new givens rotation │ │ │ │ │ +1241 this->_g_e_n_e_r_a_t_e_P_l_a_n_e_R_o_t_a_t_i_o_n(H[i][i],H[i+1][i],cs[i],sn[i]); │ │ │ │ │ +1242 │ │ │ │ │ +1243 // finish updating QR factorization │ │ │ │ │ +1244 this->_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(H[i][i],H[i+1][i],cs[i],sn[i]); │ │ │ │ │ +1245 this->_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n(s[i],s[i+1],cs[i],sn[i]); │ │ │ │ │ +1246 │ │ │ │ │ +1247 // norm of the residual is the last component of vector s │ │ │ │ │ +1248 using std::abs; │ │ │ │ │ +1249 norm = abs(s[i+1]); │ │ │ │ │ +1250 iteration.step(j, norm); │ │ │ │ │ +1251 } // end inner for loop │ │ │ │ │ +1252 │ │ │ │ │ +1253 // calculate update vector │ │ │ │ │ +1254 tmp = 0.0; │ │ │ │ │ +1255 this->_u_p_d_a_t_e(tmp, i, H, s, w); │ │ │ │ │ +1256 // and update current iterate │ │ │ │ │ +1257 x += tmp; │ │ │ │ │ +1258 │ │ │ │ │ +1259 // restart fGMRes if convergence was not achieved, │ │ │ │ │ +1260 // i.e. linear residual has not reached desired reduction │ │ │ │ │ +1261 // and if still j < _maxit (do not restart on last iteration) │ │ │ │ │ +1262 if( res._c_o_n_v_e_r_g_e_d != true && j < ___m_a_x_i_t) │ │ │ │ │ +1263 { │ │ │ │ │ +1264 if (___v_e_r_b_o_s_e > 0) │ │ │ │ │ +1265 std::cout << "=== fGMRes::restart" << std::endl; │ │ │ │ │ +1266 // get rhs │ │ │ │ │ +1267 v[0] = b; │ │ │ │ │ +1268 // calculate new defect │ │ │ │ │ +1269 ___o_p->applyscaleadd(-1.0, x,v[0]); // b -= Ax; │ │ │ │ │ +1270 // calculate preconditioned defect │ │ │ │ │ +1271 norm = ___s_p->norm(v[0]); // update the residual norm │ │ │ │ │ +1272 } │ │ │ │ │ +1273 │ │ │ │ │ +1274 } // end outer while loop │ │ │ │ │ +1275 │ │ │ │ │ +1276 // post-process preconditioner │ │ │ │ │ +1277 ___p_r_e_c->post(x); │ │ │ │ │ +1278 } │ │ │ │ │ +1279 │ │ │ │ │ +1280private: │ │ │ │ │ +1281 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +1282 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +1283 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +1284 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +1285 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +1286 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +1287 using _R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___r_e_s_t_a_r_t; │ │ │ │ │ +1288 using Iteration = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +Iteration; │ │ │ │ │ +1289 }; │ │ │ │ │ +_1_2_9_0 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("restartedflexiblegmressolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +1291 │ │ │ │ │ +1305 template │ │ │ │ │ +_1_3_0_6 class _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +1307 { │ │ │ │ │ +1308 public: │ │ │ │ │ +1309 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +1310 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +1311 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +1312 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +1313 │ │ │ │ │ +1314 private: │ │ │ │ │ +1315 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +1316 │ │ │ │ │ +1318 using fAlloc = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>; │ │ │ │ │ +1319 │ │ │ │ │ +1320 public: │ │ │ │ │ +1321 │ │ │ │ │ +1322 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +1323 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +1324 │ │ │ │ │ +_1_3_3_1 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& │ │ │ │ │ +prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, int restart = 10) : │ │ │ │ │ +1332 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,reduction,maxit,verbose), │ │ │ │ │ +1333 _restart(restart) │ │ │ │ │ +1334 {} │ │ │ │ │ +1335 │ │ │ │ │ +_1_3_4_3 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, const │ │ │ │ │ +_S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, │ │ │ │ │ +int maxit, int verbose, int restart = 10) : │ │ │ │ │ +1344 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ +1345 _restart(restart) │ │ │ │ │ +1346 {} │ │ │ │ │ +1347 │ │ │ │ │ +1348 │ │ │ │ │ +_1_3_6_1 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (std::shared_ptr > op, │ │ │ │ │ +std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) │ │ │ │ │ +: │ │ │ │ │ +1362 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,prec,configuration), │ │ │ │ │ +1363 _restart(configuration._g_e_t("restart")) │ │ │ │ │ +1364 {} │ │ │ │ │ +1365 │ │ │ │ │ +_1_3_6_6 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (std::shared_ptr > op, │ │ │ │ │ +std::shared_ptr > sp, std:: │ │ │ │ │ +shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) : │ │ │ │ │ +1367 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,configuration), │ │ │ │ │ +1368 _restart(configuration._g_e_t("restart")) │ │ │ │ │ +1369 {} │ │ │ │ │ +_1_3_7_7 _G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ +1378 std::shared_ptr> sp, │ │ │ │ │ +1379 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ +1380 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, │ │ │ │ │ +1381 int restart = 10) : │ │ │ │ │ +1382 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r::_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec,reduction,maxit,verbose), │ │ │ │ │ +1383 _restart(restart) │ │ │ │ │ +1384 {} │ │ │ │ │ +1385 │ │ │ │ │ +_1_3_9_1 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +1392 { │ │ │ │ │ +1393 Iteration iteration(*this, res); │ │ │ │ │ +1394 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ +1395 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defect │ │ │ │ │ +1396 │ │ │ │ │ +1397 std::vector > p(_restart); │ │ │ │ │ +1398 std::vector pp(_restart); │ │ │ │ │ +1399 X q(x); // a temporary vector │ │ │ │ │ +1400 X prec_res(x); // a temporary vector for preconditioner output │ │ │ │ │ +1401 │ │ │ │ │ +1402 p[0].reset(new X(x)); │ │ │ │ │ +1403 │ │ │ │ │ +1404 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ +1405 if(iteration.step(0, def)){ │ │ │ │ │ +1406 ___p_r_e_c->post(x); │ │ │ │ │ +1407 return; │ │ │ │ │ +1408 } │ │ │ │ │ +1409 // some local variables │ │ │ │ │ +1410 _f_i_e_l_d___t_y_p_e rho, lambda; │ │ │ │ │ +1411 │ │ │ │ │ +1412 int i=0; │ │ │ │ │ +1413 int ii=0; │ │ │ │ │ +1414 // determine initial search direction │ │ │ │ │ +1415 *(p[0]) = 0; // clear correction │ │ │ │ │ +1416 ___p_r_e_c->apply(*(p[0]),b); // apply preconditioner │ │ │ │ │ +1417 rho = ___s_p->dot(*(p[0]),b); // orthogonalization │ │ │ │ │ +1418 ___o_p->apply(*(p[0]),q); // q=Ap │ │ │ │ │ +1419 pp[0] = ___s_p->dot(*(p[0]),q); // scalar product │ │ │ │ │ +1420 lambda = rho/pp[0]; // minimization │ │ │ │ │ +1421 x.axpy(lambda,*(p[0])); // update solution │ │ │ │ │ +1422 b.axpy(-lambda,q); // update defect │ │ │ │ │ +1423 │ │ │ │ │ +1424 // convergence test │ │ │ │ │ +1425 def=___s_p->norm(b); // comp defect norm │ │ │ │ │ +1426 ++i; │ │ │ │ │ +1427 if(iteration.step(i, def)){ │ │ │ │ │ +1428 ___p_r_e_c->post(x); │ │ │ │ │ +1429 return; │ │ │ │ │ +1430 } │ │ │ │ │ +1431 │ │ │ │ │ +1432 while(i<___m_a_x_i_t) { │ │ │ │ │ +1433 // the loop │ │ │ │ │ +1434 int end=std::min(_restart, ___m_a_x_i_t-i+1); │ │ │ │ │ +1435 for (ii=1; ii()); │ │ │ │ │ +1488 │ │ │ │ │ +1500 template │ │ │ │ │ +_1_5_0_1 class _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r : public _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r { │ │ │ │ │ +1502 public: │ │ │ │ │ +1503 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +1504 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +1505 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +1506 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +1507 │ │ │ │ │ +1508 private: │ │ │ │ │ +1509 using typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +1510 │ │ │ │ │ +1511 public: │ │ │ │ │ +1512 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +1513 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +_1_5_1_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& │ │ │ │ │ +prec, │ │ │ │ │ +1520 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, int mmax = 10) : │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, prec, reduction, maxit, verbose), ___m_m_a_x(mmax) │ │ │ │ │ +1521 { │ │ │ │ │ +1522 } │ │ │ │ │ +1523 │ │ │ │ │ +_1_5_2_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_X_>& op, const _S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& │ │ │ │ │ +sp, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>& prec, │ │ │ │ │ +1530 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, int mmax = 10) : │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, verbose), ___m_m_a_x(mmax) │ │ │ │ │ +1531 { │ │ │ │ │ +1532 } │ │ │ │ │ +1533 │ │ │ │ │ +_1_5_3_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ +1540 std::shared_ptr> sp, │ │ │ │ │ +1541 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ +1542 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose, │ │ │ │ │ +1543 int mmax = 10) │ │ │ │ │ +1544 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, reduction, maxit, verbose), ___m_m_a_x │ │ │ │ │ +(mmax) │ │ │ │ │ +1545 {} │ │ │ │ │ +1546 │ │ │ │ │ +_1_5_5_9 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ +1560 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ +1561 const ParameterTree& config) │ │ │ │ │ +1562 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, prec, config), ___m_m_a_x(config._g_e_t("mmax", 10)) │ │ │ │ │ +1563 {} │ │ │ │ │ +1564 │ │ │ │ │ +_1_5_6_5 _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ +1566 std::shared_ptr> sp, │ │ │ │ │ +1567 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_>> prec, │ │ │ │ │ +1568 const ParameterTree& config) │ │ │ │ │ +1569 : _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op, sp, prec, config), ___m_m_a_x(config._g_e_t("mmax", │ │ │ │ │ +10)) │ │ │ │ │ +1570 {} │ │ │ │ │ +1571 │ │ │ │ │ +_1_5_8_4 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +1585 { │ │ │ │ │ +1586 using rAlloc = _R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>; │ │ │ │ │ +1587 res._c_l_e_a_r(); │ │ │ │ │ +1588 _I_t_e_r_a_t_i_o_n iteration(*this,res); │ │ │ │ │ +1589 ___p_r_e_c->pre(x,b); // prepare preconditioner │ │ │ │ │ +1590 ___o_p->applyscaleadd(-1,x,b); // overwrite b with defect │ │ │ │ │ +1591 │ │ │ │ │ +1592 //arrays for interim values: │ │ │ │ │ +1593 std::vector d(___m_m_a_x+1, x); // array for directions │ │ │ │ │ +1594 std::vector Ad(___m_m_a_x+1, x); // array for Ad[i] │ │ │ │ │ +1595 std::vector ddotAd(___m_m_a_x+1,0); // array for │ │ │ │ │ +1596 X w(x); │ │ │ │ │ +1597 │ │ │ │ │ +1598 _r_e_a_l___t_y_p_e def = ___s_p->norm(b); // compute norm │ │ │ │ │ +1599 if(iteration.step(0, def)){ │ │ │ │ │ +1600 ___p_r_e_c->post(x); │ │ │ │ │ +1601 return; │ │ │ │ │ +1602 } │ │ │ │ │ +1603 │ │ │ │ │ +1604 // some local variables │ │ │ │ │ +1605 _f_i_e_l_d___t_y_p_e alpha; │ │ │ │ │ +1606 │ │ │ │ │ +1607 // the loop │ │ │ │ │ +1608 int i=1; │ │ │ │ │ +1609 int i_bounded=0; │ │ │ │ │ +1610 while(i<=___m_a_x_i_t && !res._c_o_n_v_e_r_g_e_d) { │ │ │ │ │ +1611 for (; i_bounded <= ___m_m_a_x && i<= ___m_a_x_i_t; i_bounded++) { │ │ │ │ │ +1612 d[i_bounded] = 0; // reset search direction │ │ │ │ │ +1613 ___p_r_e_c->apply(d[i_bounded], b); // apply preconditioner │ │ │ │ │ +1614 w = d[i_bounded]; // copy of current d[i] │ │ │ │ │ +1615 // orthogonalization with previous directions │ │ │ │ │ +1616 orthogonalizations(i_bounded,Ad,w,ddotAd,d); │ │ │ │ │ +1617 │ │ │ │ │ +1618 //saving interim values for future calculating │ │ │ │ │ +1619 ___o_p->apply(d[i_bounded], Ad[i_bounded]); // save Ad[i] │ │ │ │ │ +1620 ddotAd[i_bounded]=___s_p->dot(d[i_bounded],Ad[i_bounded]); // save │ │ │ │ │ +1621 alpha = ___s_p->dot(d[i_bounded], b)/ddotAd[i_bounded]; // / │ │ │ │ │ +1622 │ │ │ │ │ +1623 //update solution and defect │ │ │ │ │ +1624 x.axpy(alpha, d[i_bounded]); │ │ │ │ │ +1625 b.axpy(-alpha, Ad[i_bounded]); │ │ │ │ │ +1626 │ │ │ │ │ +1627 // convergence test │ │ │ │ │ +1628 def = ___s_p->norm(b); // comp defect norm │ │ │ │ │ +1629 │ │ │ │ │ +1630 iteration.step(i, def); │ │ │ │ │ +1631 i++; │ │ │ │ │ +1632 } │ │ │ │ │ +1633 //restart: exchange first and last stored values │ │ │ │ │ +1634 cycle(Ad,d,ddotAd,i_bounded); │ │ │ │ │ +1635 } │ │ │ │ │ +1636 │ │ │ │ │ +1637 //correct i which is wrong if convergence was not achieved. │ │ │ │ │ +1638 i=std::min(___m_a_x_i_t,i); │ │ │ │ │ +1639 │ │ │ │ │ +1640 ___p_r_e_c->post(x); // postprocess preconditioner │ │ │ │ │ +1641 } │ │ │ │ │ +1642 │ │ │ │ │ +1643 private: │ │ │ │ │ +1644 //This function is called every iteration to orthogonalize against the │ │ │ │ │ +last search directions │ │ │ │ │ +1645 virtual void orthogonalizations(const int& i_bounded,const std::vector& │ │ │ │ │ +Ad, const X& w, const std:: │ │ │ │ │ +vector<_f_i_e_l_d___t_y_p_e,_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>>& ddotAd,std::vector& │ │ │ │ │ +d) { │ │ │ │ │ +1646 // The RestartedFCGSolver uses only values with lower array index; │ │ │ │ │ +1647 for (int k = 0; k < i_bounded; k++) { │ │ │ │ │ +1648 d[i_bounded].axpy(-___s_p->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= </>d[k] │ │ │ │ │ +1649 } │ │ │ │ │ +1650 } │ │ │ │ │ +1651 │ │ │ │ │ +1652 // This function is called every mmax iterations to handle limited array │ │ │ │ │ +sizes. │ │ │ │ │ +1653 virtual void cycle(std::vector& Ad,std::vector& d,std:: │ │ │ │ │ +vector<_f_i_e_l_d___t_y_p_e,ReboundAllocatorType >& ddotAd,int& i_bounded) │ │ │ │ │ +{ │ │ │ │ │ +1654 // Reset loop index and exchange the first and last arrays │ │ │ │ │ +1655 i_bounded = 1; │ │ │ │ │ +1656 std::swap(Ad[0], Ad[___m_m_a_x]); │ │ │ │ │ +1657 std::swap(d[0], d[___m_m_a_x]); │ │ │ │ │ +1658 std::swap(ddotAd[0], ddotAd[___m_m_a_x]); │ │ │ │ │ +1659 } │ │ │ │ │ +1660 │ │ │ │ │ +1661 protected: │ │ │ │ │ +_1_6_6_2 int ___m_m_a_x; │ │ │ │ │ +1663 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +1664 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +1665 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +1666 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +1667 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +1668 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +_1_6_6_9 using _I_t_e_r_a_t_i_o_n = typename _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_X_,_X_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_I_t_e_r_a_t_i_o_n_<_u_n_s_i_g_n_e_d_ _i_n_t_>; │ │ │ │ │ +1670 }; │ │ │ │ │ +_1_6_7_1 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("restartedfcgsolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +1672 │ │ │ │ │ +1679 template │ │ │ │ │ +_1_6_8_0 class _C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r : public _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r { │ │ │ │ │ +1681 public: │ │ │ │ │ +1682 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +1683 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +1684 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +1685 using typename _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +1686 │ │ │ │ │ +1687 // copy base class constructors │ │ │ │ │ +1688 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r::RestartedFCGSolver; │ │ │ │ │ +1689 │ │ │ │ │ +1690 // don't shadow four-argument version of apply defined in the base class │ │ │ │ │ +1691 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y; │ │ │ │ │ +1692 │ │ │ │ │ +1693 // just a minor part of the RestartedFCGSolver apply method will be │ │ │ │ │ +modified │ │ │ │ │ +_1_6_9_4 virtual void _a_p_p_l_y (X& x, X& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) override { │ │ │ │ │ +1695 // reset limiter of orthogonalization loop │ │ │ │ │ +1696 _k_limit = 0; │ │ │ │ │ +1697 this->_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_<_X_>_:_:_a_p_p_l_y(x,b,res); │ │ │ │ │ +1698 }; │ │ │ │ │ +1699 │ │ │ │ │ +1700 private: │ │ │ │ │ +1701 // This function is called every iteration to orthogonalize against the │ │ │ │ │ +last search directions. │ │ │ │ │ +1702 virtual void orthogonalizations(const int& i_bounded,const std::vector& │ │ │ │ │ +Ad, const X& w, const std:: │ │ │ │ │ +vector<_f_i_e_l_d___t_y_p_e,_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e_<_X_,_f_i_e_l_d___t_y_p_e_>>& ddotAd,std::vector& │ │ │ │ │ +d) override { │ │ │ │ │ +1703 // This FCGSolver uses values with higher array indexes too, if existent. │ │ │ │ │ +1704 for (int k = 0; k < _k_limit; k++) { │ │ │ │ │ +1705 if(i_bounded!=k) │ │ │ │ │ +1706 d[i_bounded].axpy(-___s_p->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= </>d[k] │ │ │ │ │ +1707 } │ │ │ │ │ +1708 // The loop limit increase, if array is not completely filled. │ │ │ │ │ +1709 if(_k_limit<=i_bounded) │ │ │ │ │ +1710 _k_limit++; │ │ │ │ │ +1711 │ │ │ │ │ +1712 }; │ │ │ │ │ +1713 │ │ │ │ │ +1714 // This function is called every mmax iterations to handle limited array │ │ │ │ │ +sizes. │ │ │ │ │ +1715 virtual void cycle(std::vector& Ad, [[maybe_unused]] std::vector& d, │ │ │ │ │ +[[maybe_unused]] std::vector<_f_i_e_l_d___t_y_p_e,ReboundAllocatorType >& │ │ │ │ │ +ddotAd,int& i_bounded) override { │ │ │ │ │ +1716 // Only the loop index i_bounded return to 0, if it reached mmax. │ │ │ │ │ +1717 i_bounded = 0; │ │ │ │ │ +1718 // Now all arrays are filled and the loop in void orthogonalizations can │ │ │ │ │ +use the whole arrays. │ │ │ │ │ +1719 _k_limit = Ad.size(); │ │ │ │ │ +1720 }; │ │ │ │ │ +1721 │ │ │ │ │ +1722 int _k_limit = 0; │ │ │ │ │ +1723 │ │ │ │ │ +1724 protected: │ │ │ │ │ +1725 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___m_m_a_x; │ │ │ │ │ +1726 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___o_p; │ │ │ │ │ +1727 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___p_r_e_c; │ │ │ │ │ +1728 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___s_p; │ │ │ │ │ +1729 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +1730 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___m_a_x_i_t; │ │ │ │ │ +1731 using _R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e; │ │ │ │ │ +1732 }; │ │ │ │ │ +_1_7_3_3 _D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R("completefcgsolver", │ │ │ │ │ +defaultIterativeSolverCreator()); │ │ │ │ │ +1735} // end namespace │ │ │ │ │ +1736 │ │ │ │ │ +1737#endif │ │ │ │ │ +_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +_a_l_l_o_c_a_t_o_r_._h_h │ │ │ │ │ +_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ +_D_U_N_E___R_E_G_I_S_T_E_R___I_T_E_R_A_T_I_V_E___S_O_L_V_E_R │ │ │ │ │ +#define DUNE_REGISTER_ITERATIVE_SOLVER(name,...) │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:19 │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_a_r_p_a_c_k_p_p_._h_h │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ _b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ Implementation of the BCRSMatrix class. │ │ │ │ │ -_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h │ │ │ │ │ -This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ -the identity. │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ +_s_o_l_v_e_r_._h_h │ │ │ │ │ +Define general, extensible interface for inverse operators. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h │ │ │ │ │ -std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, │ │ │ │ │ -std::size_t rowOffset=0, std::size_t colOffset=0) │ │ │ │ │ -Traverse a blocked matrix and call a functor at each scalar entry. │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h │ │ │ │ │ -std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0) │ │ │ │ │ -Traverse a blocked vector and call a functor at each scalar entry. │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_r_o_w_s │ │ │ │ │ -auto rows(Matrix const &matrix) │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_c_o_l_s │ │ │ │ │ -auto cols(Matrix const &matrix) │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_s_i_z_e │ │ │ │ │ -auto size(Vector const &vector) │ │ │ │ │ -DDeeffiinniittiioonn foreach.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -Return the number of columns. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_R_e_b_o_u_n_d_A_l_l_o_c_a_t_o_r_T_y_p_e │ │ │ │ │ +typename std::allocator_traits< typename AllocatorTraits< T >::type >::template │ │ │ │ │ +rebind_alloc< X > ReboundAllocatorType │ │ │ │ │ +DDeeffiinniittiioonn allocator.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_o_w___w_i_s_e │ │ │ │ │ +@ row_wise │ │ │ │ │ +Build in a row-wise manner. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:521 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ +CreateIterator createend() │ │ │ │ │ +get create iterator pointing to one after the last block │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1103 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ +CreateIterator createbegin() │ │ │ │ │ +get initial create iterator │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ size_type N() const │ │ │ │ │ -Return the number of rows. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ +number of rows (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ +Wrapper to use a range of ARPACK++ eigenvalue solvers. │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e │ │ │ │ │ +void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ +const │ │ │ │ │ +Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ +approximation lambda of its ... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e │ │ │ │ │ +void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ +const │ │ │ │ │ +Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ +approximation lambda of its ... │ │ │ │ │ +DDeeffiinniittiioonn arpackpp.hh:391 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ +Thrown when a solver aborts due to some problem. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Base class for scalar product and norm computation. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e │ │ │ │ │ +double condition_estimate │ │ │ │ │ +Estimate of condition number. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +Resets all data. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ +bool converged │ │ │ │ │ +True if convergence criterion has been met. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e │ │ │ │ │ +Simd::Scalar< real_type > scalar_real_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +Type of the range of the operator to be inverted. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +Type of the domain of the operator to be inverted. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:102 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +The real type of the field type (is the same if using real numbers, but differs │ │ │ │ │ +for std::complex) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +Base class for all implementations of iterative solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___s_p │ │ │ │ │ +std::shared_ptr< const ScalarProduct< X > > _sp │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:506 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___o_p │ │ │ │ │ +std::shared_ptr< const LinearOperator< X, X > > _op │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___m_a_x_i_t │ │ │ │ │ +int _maxit │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:508 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___v_e_r_b_o_s_e │ │ │ │ │ +int _verbose │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:509 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___r_e_d_u_c_t_i_o_n │ │ │ │ │ +scalar_real_type _reduction │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:507 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _X_ _>_:_:___p_r_e_c │ │ │ │ │ +std::shared_ptr< Preconditioner< X, X > > _prec │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:505 │ │ │ │ │ +_D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r │ │ │ │ │ +Preconditioned loop solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator,. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_L_o_o_p_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r │ │ │ │ │ +gradient method │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_G_r_a_d_i_e_n_t_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ +conjugate gradient method │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ +CGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< │ │ │ │ │ +ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, │ │ │ │ │ +scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) │ │ │ │ │ +Constructor to initialize a CG solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_e_n_a_b_l_e_C_o_n_d_i_t_i_o_n_E_s_t_i_m_a_t_e │ │ │ │ │ +static constexpr bool enableConditionEstimate │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ +CGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp, │ │ │ │ │ +Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ +verbose, bool condition_estimate) │ │ │ │ │ +Constructor to initialize a CG solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:239 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_C_G_S_o_l_v_e_r │ │ │ │ │ +CGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec, │ │ │ │ │ +scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) │ │ │ │ │ +Constructor to initialize a CG solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_C_G_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:412 │ │ │ │ │ +_D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r │ │ │ │ │ +Bi-conjugate Gradient Stabilized (BiCG-STAB) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:419 │ │ │ │ │ +_D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< CountType > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:598 │ │ │ │ │ +_D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:439 │ │ │ │ │ +_D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r │ │ │ │ │ +Minimal Residual Method (MINRES) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:609 │ │ │ │ │ +_D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_M_I_N_R_E_S_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:808 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +implements the Generalized Minimal Residual (GMRes) method │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:827 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ +shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:878 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_c_o_n_j_u_g_a_t_e │ │ │ │ │ +std::enable_if::value, T >::type │ │ │ │ │ +conjugate(const T &t) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1067 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +X > > prec, const ParameterTree &configuration) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:883 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(X &w, int i, const std::vector< std::vector< field_type, fAlloc > > │ │ │ │ │ +&H, const std::vector< field_type, fAlloc > &s, const std::vector< X > &v) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1039 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_c_o_n_j_u_g_a_t_e │ │ │ │ │ +std::enable_if< std::is_same< field_type, real_type >::value, T >::type │ │ │ │ │ +conjugate(const T &t) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1062 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_f_A_l_l_o_c │ │ │ │ │ +ReboundAllocatorType< X, field_type > fAlloc │ │ │ │ │ +field_type Allocator retrieved from domain type │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:838 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:___r_e_s_t_a_r_t │ │ │ │ │ +int _restart │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1120 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_r_A_l_l_o_c │ │ │ │ │ +ReboundAllocatorType< X, real_type > rAlloc │ │ │ │ │ +real_type Allocator retrieved from domain type │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:840 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:923 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +RestartedGMResSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > │ │ │ │ │ +&prec, scalar_real_type reduction, int restart, int maxit, int verbose) │ │ │ │ │ +Set up RestartedGMResSolver solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:850 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +RestartedGMResSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > │ │ │ │ │ +&sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int │ │ │ │ │ +maxit, int verbose) │ │ │ │ │ +Set up RestartedGMResSolver solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:861 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_g_e_n_e_r_a_t_e_P_l_a_n_e_R_o_t_a_t_i_o_n │ │ │ │ │ +void generatePlaneRotation(field_type &dx, field_type &dy, real_type &cs, │ │ │ │ │ +field_type &sn) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1073 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +Y > > prec, scalar_real_type reduction, int restart, int maxit, int verbose) │ │ │ │ │ +Set up RestartedGMResSolver solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:894 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, Y &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:910 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1119 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y_P_l_a_n_e_R_o_t_a_t_i_o_n │ │ │ │ │ +void applyPlaneRotation(field_type &dx, field_type &dy, real_type &cs, │ │ │ │ │ +field_type &sn) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1106 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r │ │ │ │ │ +implements the Flexible Generalized Minimal Residual (FGMRes) method (right │ │ │ │ │ +preconditioned) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1139 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_l_e_x_i_b_l_e_G_M_R_e_s_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) override │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1169 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +Generalized preconditioned conjugate gradient solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1307 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +GeneralizedPCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > │ │ │ │ │ +&sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ +verbose, int restart=10) │ │ │ │ │ +Set up nonlinear preconditioned conjugate gradient solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1343 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +GeneralizedPCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > │ │ │ │ │ +&prec, scalar_real_type reduction, int maxit, int verbose, int restart=10) │ │ │ │ │ +Set up nonlinear preconditioned conjugate gradient solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1331 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1391 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ +shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1361 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +X > > prec, scalar_real_type reduction, int maxit, int verbose, int restart=10) │ │ │ │ │ +Set up nonlinear preconditioned conjugate gradient solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1377 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r_:_:_G_e_n_e_r_a_l_i_z_e_d_P_C_G_S_o_l_v_e_r │ │ │ │ │ +GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +X > > prec, const ParameterTree &configuration) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1366 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ +Accelerated flexible conjugate gradient method. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1501 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ +RestartedFCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > │ │ │ │ │ +&prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10) │ │ │ │ │ +Constructor to initialize a RestartedFCG solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1519 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ +RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ +shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1559 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ +RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +X > > prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10) │ │ │ │ │ +Constructor to initialize a RestartedFCG solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1539 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:___m_m_a_x │ │ │ │ │ +int _mmax │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1662 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ +RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +X > > prec, const ParameterTree &config) │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1565 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1669 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1584 │ │ │ │ │ +_D_u_n_e_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r_:_:_R_e_s_t_a_r_t_e_d_F_C_G_S_o_l_v_e_r │ │ │ │ │ +RestartedFCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > │ │ │ │ │ +&sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ +verbose, int mmax=10) │ │ │ │ │ +Constructor to initialize a RestartedFCG solver. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1529 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r │ │ │ │ │ +Complete flexible conjugate gradient method. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1680 │ │ │ │ │ +_D_u_n_e_:_:_C_o_m_p_l_e_t_e_F_C_G_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, InverseOperatorResult &res) override │ │ │ │ │ +Apply inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solvers.hh:1694 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00176.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixmarket.hh File Reference │ │ │ │ +dune-istl: supermatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,265 +71,63 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Enumerations | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ +
supermatrix.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices. │ │ │ │ -More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <fstream>
│ │ │ │ -#include <ios>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <istream>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <set>
│ │ │ │ -#include <sstream>
│ │ │ │ -#include <string>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include "bcrsmatrix.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ #include <dune/common/fmatrix.hh>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/simd/simd.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/bvector.hh>
│ │ │ │ -#include <dune/istl/matrixutils.hh>
│ │ │ │ -#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ +#include "superlufunctions.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::MatrixMarketImpl::mm_numeric_type< T >
 Helper metaprogram to get the matrix market string representation of the numeric type. More...
 
struct  Dune::MatrixMarketImpl::mm_numeric_type< int >
 
struct  Dune::MatrixMarketImpl::mm_numeric_type< double >
 
struct  Dune::MatrixMarketImpl::mm_numeric_type< float >
 
struct  Dune::MatrixMarketImpl::mm_numeric_type< std::complex< double > >
 
struct  Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > >
 
struct  Dune::MatrixMarketImpl::mm_header_printer< BCRSMatrix< T, A > >
 
struct  Dune::MatrixMarketImpl::mm_header_printer< BlockVector< B, A > >
 
struct  Dune::MatrixMarketImpl::mm_header_printer< FieldVector< T, j > >
 
struct  Dune::MatrixMarketImpl::mm_header_printer< FieldMatrix< T, i, j > >
struct  Dune::SuperMatrixCreateSparseChooser< T >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< T, A > >
struct  Dune::SuperMatrixPrinter< T >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< FieldVector< T, i >, A > >
struct  Dune::BaseGetSuperLUType< T >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< T, A > >
struct  Dune::GetSuperLUType< T >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< FieldMatrix< T, i, j >, A > >
struct  Dune::GetSuperLUType< double >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< FieldMatrix< T, i, j > >
struct  Dune::GetSuperLUType< float >
 
struct  Dune::MatrixMarketImpl::mm_block_structure_header< FieldVector< T, i > >
struct  Dune::GetSuperLUType< std::complex< double > >
 
struct  Dune::MatrixMarketImpl::MMHeader
struct  Dune::GetSuperLUType< std::complex< float > >
 
struct  Dune::MatrixMarketImpl::IndexData< T >
struct  Dune::SuperLUMatrix< M >
 Utility class for converting an ISTL Matrix into a SuperLU Matrix. More...
 
struct  Dune::MatrixMarketImpl::NumericWrapper< T >
 a wrapper class of numeric values. More...
struct  Dune::SuperMatrixInitializer< M >
 
struct  Dune::MatrixMarketImpl::PatternDummy
 Utility class for marking the pattern type of the MatrixMarket matrices. More...
class  Dune::SuperLUMatrix< BCRSMatrix< B, TA > >
 Converter for BCRSMatrix to SuperLU Matrix. More...
 
struct  Dune::MatrixMarketImpl::NumericWrapper< PatternDummy >
 
struct  Dune::MatrixMarketImpl::MatrixValuesSetter< D, brows, bcols >
 Functor to the data values of the matrix. More...
 
struct  Dune::MatrixMarketImpl::MatrixValuesSetter< PatternDummy, brows, bcols >
 
struct  Dune::MatrixMarketImpl::is_complex< T >
 
struct  Dune::MatrixMarketImpl::is_complex< std::complex< T > >
 
struct  Dune::MatrixMarketImpl::mm_multipliers< M >
 
struct  Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< B, A > >
 
struct  Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< FieldMatrix< B, i, j >, A > >
 
class  Dune::MatrixMarketFormatError
class  Dune::SuperMatrixInitializer< BCRSMatrix< B, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::MatrixMarketImpl
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Enumerations

enum  Dune::MatrixMarketImpl::LineType { Dune::MatrixMarketImpl::MM_HEADER │ │ │ │ -, Dune::MatrixMarketImpl::MM_ISTLSTRUCT │ │ │ │ -, Dune::MatrixMarketImpl::DATA │ │ │ │ - }
 
enum  { Dune::MatrixMarketImpl::MM_MAX_LINE_LENGTH =1025 │ │ │ │ - }
 
enum  Dune::MatrixMarketImpl::MM_TYPE { Dune::MatrixMarketImpl::coordinate_type │ │ │ │ -, Dune::MatrixMarketImpl::array_type │ │ │ │ -, Dune::MatrixMarketImpl::unknown_type │ │ │ │ - }
 
enum  Dune::MatrixMarketImpl::MM_CTYPE {
│ │ │ │ -  Dune::MatrixMarketImpl::integer_type │ │ │ │ -, Dune::MatrixMarketImpl::double_type │ │ │ │ -, Dune::MatrixMarketImpl::complex_type │ │ │ │ -, Dune::MatrixMarketImpl::pattern │ │ │ │ -,
│ │ │ │ -  Dune::MatrixMarketImpl::unknown_ctype │ │ │ │ -
│ │ │ │ - }
 
enum  Dune::MatrixMarketImpl::MM_STRUCTURE {
│ │ │ │ -  Dune::MatrixMarketImpl::general │ │ │ │ -, Dune::MatrixMarketImpl::symmetric │ │ │ │ -, Dune::MatrixMarketImpl::skew_symmetric │ │ │ │ -, Dune::MatrixMarketImpl::hermitian │ │ │ │ -,
│ │ │ │ -  Dune::MatrixMarketImpl::unknown_structure │ │ │ │ -
│ │ │ │ - }
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

bool Dune::MatrixMarketImpl::lineFeed (std::istream &file)
 
void Dune::MatrixMarketImpl::skipComments (std::istream &file)
 
bool Dune::MatrixMarketImpl::readMatrixMarketBanner (std::istream &file, MMHeader &mmHeader)
 
template<std::size_t brows, std::size_t bcols>
std::tuple< std::size_t, std::size_t, std::size_t > Dune::MatrixMarketImpl::calculateNNZ (std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader &header)
 
template<typename T >
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, NumericWrapper< T > &num)
 
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, NumericWrapper< PatternDummy > &num)
 
template<typename T >
bool Dune::MatrixMarketImpl::operator< (const IndexData< T > &i1, const IndexData< T > &i2)
 LessThan operator.
 
template<typename T >
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, IndexData< T > &data)
 Read IndexData from a stream.
 
template<typename T >
std::istream & Dune::MatrixMarketImpl::operator>> (std::istream &is, IndexData< NumericWrapper< std::complex< T > > > &data)
 Read IndexData from a stream. Specialization for std::complex.
 
template<class T >
std::enable_if_t<!is_complex< T >::value, T > Dune::MatrixMarketImpl::conj (const T &r)
 
template<class T >
std::enable_if_t< is_complex< T >::value, T > Dune::MatrixMarketImpl::conj (const T &r)
 
template<typename T , typename A , typename D >
void Dune::MatrixMarketImpl::readSparseEntries (Dune::BCRSMatrix< T, A > &matrix, std::istream &file, std::size_t entries, const MMHeader &mmHeader, const D &)
 
std::tuple< std::string, std::string > Dune::MatrixMarketImpl::splitFilename (const std::string &filename)
 
void Dune::mm_read_header (std::size_t &rows, std::size_t &cols, MatrixMarketImpl::MMHeader &header, std::istream &istr, bool isVector)
 
template<typename T , typename A >
void Dune::mm_read_vector_entries (Dune::BlockVector< T, A > &vector, std::size_t size, std::istream &istr, size_t lane)
 
template<typename T , typename A , int entries>
void Dune::mm_read_vector_entries (Dune::BlockVector< Dune::FieldVector< T, entries >, A > &vector, std::size_t size, std::istream &istr, size_t lane)
 
template<typename T , typename A >
void Dune::readMatrixMarket (Dune::BlockVector< T, A > &vector, std::istream &istr)
 Reads a BlockVector from a matrix market file.
 
template<typename T , typename A >
void Dune::readMatrixMarket (Dune::BCRSMatrix< T, A > &matrix, std::istream &istr)
 Reads a sparse matrix from a matrix market file.
 
template<typename B >
void Dune::mm_print_entry (const B &entry, std::size_t rowidx, std::size_t colidx, std::ostream &ostr)
 
template<typename V >
void Dune::mm_print_vector_entry (const V &entry, std::ostream &ostr, const std::integral_constant< int, 1 > &, size_t lane)
 
template<typename V >
void Dune::mm_print_vector_entry (const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &, size_t lane)
 
template<typename T , typename A >
std::size_t Dune::countEntries (const BlockVector< T, A > &vector)
 
template<typename T , typename A , int i>
std::size_t Dune::countEntries (const BlockVector< FieldVector< T, i >, A > &vector)
 
template<typename V >
void Dune::writeMatrixMarket (const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &)
 
template<typename M >
void Dune::writeMatrixMarket (const M &matrix, std::ostream &ostr, const std::integral_constant< int, 1 > &)
 
template<typename M >
void Dune::writeMatrixMarket (const M &matrix, std::ostream &ostr)
 writes a ISTL matrix or vector to a stream in matrix market format.
 
template<typename M >
void Dune::storeMatrixMarket (const M &matrix, std::string filename, int prec=default_precision)
 Stores a parallel matrix/vector in matrix market format in a file.
 
template<typename M , typename G , typename L >
void Dune::storeMatrixMarket (const M &matrix, std::string filename, const OwnerOverlapCopyCommunication< G, L > &comm, bool storeIndices=true, int prec=default_precision)
 Stores a parallel matrix/vector in matrix market format in a file.
 
template<typename M , typename G , typename L >
void Dune::loadMatrixMarket (M &matrix, const std::string &filename, OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true)
 Load a parallel matrix/vector stored in matrix market format.
 
template<typename M >
void Dune::loadMatrixMarket (M &matrix, const std::string &filename)
 Load a matrix/vector stored in matrix market format.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Variables

static const int Dune::default_precision = -1
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,316 +1,50 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _E_n_u_m_e_r_a_t_i_o_n_s | _F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -matrixmarket.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s » │ │ │ │ │ -_I_O_ _f_o_r_ _m_a_t_r_i_c_e_s_ _a_n_d_ _v_e_c_t_o_r_s_. │ │ │ │ │ -Provides classes for reading and writing MatrixMarket Files with an extension │ │ │ │ │ -for parallel matrices. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +supermatrix.hh File Reference │ │ │ │ │ +#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_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_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _T_ _> │ │ │ │ │ -  Helper metaprogram to get the matrix market string representation of │ │ │ │ │ - the numeric type. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _i_n_t_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _d_o_u_b_l_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _f_l_o_a_t_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _j_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_P_r_i_n_t_e_r_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _> │ │ │ │ │ - _> │ │ │ │ │ +struct   _D_u_n_e_:_:_B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_< │ │ │ │ │ - _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _>_,_ _A_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _> │ │ │ │ │ - _> │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _d_o_u_b_l_e_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_< │ │ │ │ │ - _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_,_ _A_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _f_l_o_a_t_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_, │ │ │ │ │ - _j_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _> │ │ │ │ │ - _> │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _M_ _> │ │ │ │ │ +  Utility class for converting an _I_S_T_L _M_a_t_r_i_x into a _S_u_p_e_r_L_U _M_a_t_r_i_x. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_I_n_d_e_x_D_a_t_a_<_ _T_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _M_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_ _T_ _> │ │ │ │ │ -  a wrapper class of numeric values. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _> │ │ │ │ │ +  Converter for _B_C_R_S_M_a_t_r_i_x to _S_u_p_e_r_L_U _M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_P_a_t_t_e_r_n_D_u_m_m_y │ │ │ │ │ -  Utility class for marking the pattern type of the MatrixMarket │ │ │ │ │ - matrices. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_ _P_a_t_t_e_r_n_D_u_m_m_y_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_ _D_,_ _b_r_o_w_s_,_ _b_c_o_l_s_ _> │ │ │ │ │ -  Functor to the data values of the matrix. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_ _P_a_t_t_e_r_n_D_u_m_m_y_,_ _b_r_o_w_s_,_ _b_c_o_l_s │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_s___c_o_m_p_l_e_x_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_s___c_o_m_p_l_e_x_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _T_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_ _M_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _i_, │ │ │ │ │ - _j_ _>_,_ _A_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r │ │ │ │ │ + class   _D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l │ │ │ │ │ -  │ │ │ │ │ -EEnnuummeerraattiioonnss │ │ │ │ │ -enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_L_i_n_e_T_y_p_e { _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___H_E_A_D_E_R , │ │ │ │ │ - _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___I_S_T_L_S_T_R_U_C_T , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_D_A_T_A } │ │ │ │ │ -  │ │ │ │ │ -enum   { _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___M_A_X___L_I_N_E___L_E_N_G_T_H =1025 } │ │ │ │ │ -  │ │ │ │ │ -enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___T_Y_P_E { _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ - _c_o_o_r_d_i_n_a_t_e___t_y_p_e , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_a_r_r_a_y___t_y_p_e , _D_u_n_e_:_: │ │ │ │ │ - _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___t_y_p_e } │ │ │ │ │ -  │ │ │ │ │ -enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___C_T_Y_P_E { │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_n_t_e_g_e_r___t_y_p_e , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ - _d_o_u_b_l_e___t_y_p_e , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_m_p_l_e_x___t_y_p_e , _D_u_n_e_:_: │ │ │ │ │ - _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_p_a_t_t_e_r_n , │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___c_t_y_p_e │ │ │ │ │ - } │ │ │ │ │ -  │ │ │ │ │ -enum   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___S_T_R_U_C_T_U_R_E { │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_g_e_n_e_r_a_l , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_y_m_m_e_t_r_i_c , │ │ │ │ │ - _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_e_w___s_y_m_m_e_t_r_i_c , _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ - _h_e_r_m_i_t_i_a_n , │ │ │ │ │ -   _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___s_t_r_u_c_t_u_r_e │ │ │ │ │ - } │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ - bool  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_l_i_n_e_F_e_e_d (std:: │ │ │ │ │ - istream &file) │ │ │ │ │ -  │ │ │ │ │ - void  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_i_p_C_o_m_m_e_n_t_s │ │ │ │ │ - (std::istream &file) │ │ │ │ │ -  │ │ │ │ │ - bool  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ - _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t_B_a_n_n_e_r (std::istream │ │ │ │ │ - &file, _M_M_H_e_a_d_e_r &mmHeader) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::tuple< std::size_t, std::size_t, _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_a_l_c_u_l_a_t_e_N_N_Z │ │ │ │ │ - std::size_t >  (std::size_t rows, std::size_t cols, │ │ │ │ │ - std::size_t entries, const _M_M_H_e_a_d_e_r │ │ │ │ │ - &header) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ - (std::istream &is, _N_u_m_e_r_i_c_W_r_a_p_p_e_r< T > │ │ │ │ │ - &num) │ │ │ │ │ -  │ │ │ │ │ - std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ - (std::istream &is, _N_u_m_e_r_i_c_W_r_a_p_p_e_r< │ │ │ │ │ - _P_a_t_t_e_r_n_D_u_m_m_y > &num) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ - (const _I_n_d_e_x_D_a_t_a< T > &i1, const │ │ │ │ │ - _I_n_d_e_x_D_a_t_a< T > &i2) │ │ │ │ │ -  LessThan operator. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ - (std::istream &is, _I_n_d_e_x_D_a_t_a< T > │ │ │ │ │ - &data) │ │ │ │ │ -  Read _I_n_d_e_x_D_a_t_a from a stream. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::istream &  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ - (std::istream &is, _I_n_d_e_x_D_a_t_a< │ │ │ │ │ - _N_u_m_e_r_i_c_W_r_a_p_p_e_r< std::complex< T > > > │ │ │ │ │ - &data) │ │ │ │ │ -  Read _I_n_d_e_x_D_a_t_a from a stream. │ │ │ │ │ - Specialization for std::complex. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::enable_if_t:: _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_n_j (const T │ │ │ │ │ - value, T >  &r) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::enable_if_t< _i_s___c_o_m_p_l_e_x< T >:: _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_n_j (const T │ │ │ │ │ - value, T >  &r) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_: │ │ │ │ │ - _r_e_a_d_S_p_a_r_s_e_E_n_t_r_i_e_s (_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x< T, │ │ │ │ │ - A > &matrix, std::istream &file, std:: │ │ │ │ │ - size_t entries, const _M_M_H_e_a_d_e_r │ │ │ │ │ - &mmHeader, const D &) │ │ │ │ │ -  │ │ │ │ │ -std::tuple< std::string, std::string >  _D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ - (const std::string &filename) │ │ │ │ │ -  │ │ │ │ │ - void  _D_u_n_e_:_:_m_m___r_e_a_d___h_e_a_d_e_r (std::size_t │ │ │ │ │ - &rows, std::size_t &cols, │ │ │ │ │ - _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r &header, │ │ │ │ │ - std::istream &istr, bool isVector) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s (_D_u_n_e_:_: │ │ │ │ │ - _B_l_o_c_k_V_e_c_t_o_r< T, A > &vector, std:: │ │ │ │ │ - size_t size, std::istream &istr, size_t │ │ │ │ │ - lane) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s (_D_u_n_e_:_: │ │ │ │ │ - _B_l_o_c_k_V_e_c_t_o_r< Dune::FieldVector< T, │ │ │ │ │ - entries >, A > &vector, std::size_t │ │ │ │ │ - size, std::istream &istr, size_t lane) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t (_D_u_n_e_:_: │ │ │ │ │ - _B_l_o_c_k_V_e_c_t_o_r< T, A > &vector, std:: │ │ │ │ │ - istream &istr) │ │ │ │ │ -  Reads a _B_l_o_c_k_V_e_c_t_o_r from a matrix │ │ │ │ │ - market file. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t (_D_u_n_e_:_: │ │ │ │ │ - _B_C_R_S_M_a_t_r_i_x< T, A > &matrix, std:: │ │ │ │ │ - istream &istr) │ │ │ │ │ -  Reads a sparse matrix from a matrix │ │ │ │ │ - market file. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_m_m___p_r_i_n_t___e_n_t_r_y (const B &entry, │ │ │ │ │ - std::size_t rowidx, std::size_t colidx, │ │ │ │ │ - std::ostream &ostr) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y (const V │ │ │ │ │ - &entry, std::ostream &ostr, const std:: │ │ │ │ │ - integral_constant< int, 1 > &, size_t │ │ │ │ │ - lane) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y (const V │ │ │ │ │ - &vector, std::ostream &ostr, const │ │ │ │ │ - std::integral_constant< int, 0 > &, │ │ │ │ │ - size_t lane) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::size_t  _D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s (const _B_l_o_c_k_V_e_c_t_o_r< │ │ │ │ │ - T, A > &vector) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::size_t  _D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s (const _B_l_o_c_k_V_e_c_t_o_r< │ │ │ │ │ - FieldVector< T, i >, A > &vector) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t (const V │ │ │ │ │ - &vector, std::ostream &ostr, const │ │ │ │ │ - std::integral_constant< int, 0 > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ - &matrix, std::ostream &ostr, const │ │ │ │ │ - std::integral_constant< int, 1 > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ - &matrix, std::ostream &ostr) │ │ │ │ │ -  writes a _I_S_T_L matrix or vector to a │ │ │ │ │ - stream in matrix market format. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ - &matrix, std::string filename, int │ │ │ │ │ - prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ -  Stores a parallel matrix/vector in │ │ │ │ │ - matrix market format in a file. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t (const M │ │ │ │ │ - &matrix, std::string filename, const │ │ │ │ │ - _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< G, L > │ │ │ │ │ - &comm, bool storeIndices=true, int │ │ │ │ │ - prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ -  Stores a parallel matrix/vector in │ │ │ │ │ - matrix market format in a file. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t (M &matrix, │ │ │ │ │ - const std::string &filename, │ │ │ │ │ - _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< G, L > │ │ │ │ │ - &comm, bool readIndices=true) │ │ │ │ │ -  Load a parallel matrix/vector stored in │ │ │ │ │ - matrix market format. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t (M &matrix, │ │ │ │ │ - const std::string &filename) │ │ │ │ │ -  Load a matrix/vector stored in matrix │ │ │ │ │ - market format. │ │ │ │ │ -  │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ -static const int  _D_u_n_e_:_:_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n = -1 │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Provides classes for reading and writing MatrixMarket Files with an extension │ │ │ │ │ -for parallel matrices. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixmarket.hh Source File │ │ │ │ +dune-istl: supermatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1499 +74,427 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
matrixmarket.hh
│ │ │ │ +
supermatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MATRIXMARKET_HH
│ │ │ │ -
6#define DUNE_ISTL_MATRIXMARKET_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_SUPERMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_SUPERMATRIX_HH
│ │ │ │
7
│ │ │ │ -
8#include <algorithm>
│ │ │ │ -
9#include <complex>
│ │ │ │ -
10#include <cstddef>
│ │ │ │ -
11#include <fstream>
│ │ │ │ -
12#include <ios>
│ │ │ │ -
13#include <iostream>
│ │ │ │ -
14#include <istream>
│ │ │ │ +
8#if HAVE_SUPERLU
│ │ │ │ +
9
│ │ │ │ +
10#include "bcrsmatrix.hh"
│ │ │ │ +
11#include "bvector.hh"
│ │ │ │ +
12#include <dune/common/fmatrix.hh>
│ │ │ │ +
13#include <dune/common/fvector.hh>
│ │ │ │ +
14#include <dune/common/typetraits.hh>
│ │ │ │
15#include <limits>
│ │ │ │ -
16#include <ostream>
│ │ │ │ -
17#include <set>
│ │ │ │ -
18#include <sstream>
│ │ │ │ -
19#include <string>
│ │ │ │ -
20#include <tuple>
│ │ │ │ -
21#include <type_traits>
│ │ │ │ -
22#include <vector>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ +
18
│ │ │ │ +
19#include "superlufunctions.hh"
│ │ │ │ +
20
│ │ │ │ +
21namespace Dune
│ │ │ │ +
22{
│ │ │ │
23
│ │ │ │ -
24#include <dune/common/exceptions.hh>
│ │ │ │ -
25#include <dune/common/fmatrix.hh>
│ │ │ │ -
26#include <dune/common/fvector.hh>
│ │ │ │ -
27#include <dune/common/hybridutilities.hh>
│ │ │ │ -
28#include <dune/common/stdstreams.hh>
│ │ │ │ -
29#include <dune/common/simd/simd.hh>
│ │ │ │ -
30
│ │ │ │ - │ │ │ │ -
32#include <dune/istl/bvector.hh>
│ │ │ │ -
33#include <dune/istl/matrixutils.hh> // countNonZeros()
│ │ │ │ - │ │ │ │ -
35
│ │ │ │ -
36namespace Dune
│ │ │ │ -
37{
│ │ │ │ -
38
│ │ │ │ -
│ │ │ │ -
64 namespace MatrixMarketImpl
│ │ │ │ -
65 {
│ │ │ │ -
75 template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
77 enum {
│ │ │ │ -
81 is_numeric=false
│ │ │ │ -
82 };
│ │ │ │ -
83 };
│ │ │ │ -
│ │ │ │ -
84
│ │ │ │ -
85 template<>
│ │ │ │ -
│ │ │ │ -
86 struct mm_numeric_type<int>
│ │ │ │ -
87 {
│ │ │ │ -
88 enum {
│ │ │ │ -
92 is_numeric=true
│ │ │ │ -
93 };
│ │ │ │ -
94
│ │ │ │ -
│ │ │ │ -
95 static std::string str()
│ │ │ │ -
96 {
│ │ │ │ -
97 return "integer";
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99 };
│ │ │ │ -
│ │ │ │ +
24 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
26 {};
│ │ │ │ +
│ │ │ │ +
27
│ │ │ │ +
28 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
30 {};
│ │ │ │ +
│ │ │ │ +
31
│ │ │ │ +
32#if __has_include("slu_sdefs.h")
│ │ │ │ +
33 template<>
│ │ │ │ + │ │ │ │ +
35 {
│ │ │ │ +
36 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ +
37 float *values, int *rowindex, int* colindex,
│ │ │ │ +
38 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
39 {
│ │ │ │ +
40 sCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
│ │ │ │ +
41 stype, dtype, mtype);
│ │ │ │ +
42 }
│ │ │ │ +
43 };
│ │ │ │ +
44
│ │ │ │ +
45 template<>
│ │ │ │ +
46 struct SuperMatrixPrinter<float>
│ │ │ │ +
47 {
│ │ │ │ +
48 static void print(char* name, SuperMatrix* mat)
│ │ │ │ +
49 {
│ │ │ │ +
50 sPrint_CompCol_Matrix(name, mat);
│ │ │ │ +
51 }
│ │ │ │ +
52 };
│ │ │ │ +
53#endif
│ │ │ │ +
54
│ │ │ │ +
55#if __has_include("slu_ddefs.h")
│ │ │ │ +
56 template<>
│ │ │ │ +
57 struct SuperMatrixCreateSparseChooser<double>
│ │ │ │ +
58 {
│ │ │ │ +
59 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ +
60 double *values, int *rowindex, int* colindex,
│ │ │ │ +
61 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
62 {
│ │ │ │ +
63 dCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
│ │ │ │ +
64 stype, dtype, mtype);
│ │ │ │ +
65 }
│ │ │ │ +
66 };
│ │ │ │ +
67
│ │ │ │ +
68 template<>
│ │ │ │ +
69 struct SuperMatrixPrinter<double>
│ │ │ │ +
70 {
│ │ │ │ +
71 static void print(char* name, SuperMatrix* mat)
│ │ │ │ +
72 {
│ │ │ │ +
73 dPrint_CompCol_Matrix(name, mat);
│ │ │ │ +
74 }
│ │ │ │ +
75 };
│ │ │ │ +
76#endif
│ │ │ │ +
77
│ │ │ │ +
78#if __has_include("slu_cdefs.h")
│ │ │ │ +
79 template<>
│ │ │ │ +
80 struct SuperMatrixCreateSparseChooser<std::complex<float> >
│ │ │ │ +
81 {
│ │ │ │ +
82 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ +
83 std::complex<float> *values, int *rowindex, int* colindex,
│ │ │ │ +
84 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
85 {
│ │ │ │ +
86 cCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast< ::complex*>(values),
│ │ │ │ +
87 rowindex, colindex, stype, dtype, mtype);
│ │ │ │ +
88 }
│ │ │ │ +
89 };
│ │ │ │ +
90
│ │ │ │ +
91 template<>
│ │ │ │ +
92 struct SuperMatrixPrinter<std::complex<float> >
│ │ │ │ +
93 {
│ │ │ │ +
94 static void print(char* name, SuperMatrix* mat)
│ │ │ │ +
95 {
│ │ │ │ +
96 cPrint_CompCol_Matrix(name, mat);
│ │ │ │ +
97 }
│ │ │ │ +
98 };
│ │ │ │ +
99#endif
│ │ │ │
100
│ │ │ │ -
101 template<>
│ │ │ │ -
│ │ │ │ -
102 struct mm_numeric_type<double>
│ │ │ │ -
103 {
│ │ │ │ -
104 enum {
│ │ │ │ -
108 is_numeric=true
│ │ │ │ -
109 };
│ │ │ │ -
110
│ │ │ │ -
│ │ │ │ -
111 static std::string str()
│ │ │ │ -
112 {
│ │ │ │ -
113 return "real";
│ │ │ │ -
114 }
│ │ │ │ -
│ │ │ │ -
115 };
│ │ │ │ -
│ │ │ │ -
116
│ │ │ │ -
117 template<>
│ │ │ │ -
│ │ │ │ -
118 struct mm_numeric_type<float>
│ │ │ │ -
119 {
│ │ │ │ -
120 enum {
│ │ │ │ -
124 is_numeric=true
│ │ │ │ -
125 };
│ │ │ │ -
126
│ │ │ │ -
│ │ │ │ -
127 static std::string str()
│ │ │ │ -
128 {
│ │ │ │ -
129 return "real";
│ │ │ │ -
130 }
│ │ │ │ -
│ │ │ │ -
131 };
│ │ │ │ -
│ │ │ │ -
132
│ │ │ │ -
133 template<>
│ │ │ │ -
│ │ │ │ -
134 struct mm_numeric_type<std::complex<double> >
│ │ │ │ -
135 {
│ │ │ │ -
136 enum {
│ │ │ │ -
140 is_numeric=true
│ │ │ │ -
141 };
│ │ │ │ -
142
│ │ │ │ -
│ │ │ │ -
143 static std::string str()
│ │ │ │ -
144 {
│ │ │ │ -
145 return "complex";
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147 };
│ │ │ │ -
│ │ │ │ -
148
│ │ │ │ -
149 template<>
│ │ │ │ -
│ │ │ │ -
150 struct mm_numeric_type<std::complex<float> >
│ │ │ │ -
151 {
│ │ │ │ -
152 enum {
│ │ │ │ -
156 is_numeric=true
│ │ │ │ -
157 };
│ │ │ │ -
158
│ │ │ │ -
│ │ │ │ -
159 static std::string str()
│ │ │ │ -
160 {
│ │ │ │ -
161 return "complex";
│ │ │ │ -
162 }
│ │ │ │ -
│ │ │ │ -
163 };
│ │ │ │ -
│ │ │ │ -
164
│ │ │ │ -
173 template<class M>
│ │ │ │ - │ │ │ │ -
175
│ │ │ │ -
176 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
178 {
│ │ │ │ -
│ │ │ │ -
179 static void print(std::ostream& os)
│ │ │ │ -
180 {
│ │ │ │ -
181 os<<"%%MatrixMarket matrix coordinate ";
│ │ │ │ -
182 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<T>::field_type>>::str()<<" general"<<std::endl;
│ │ │ │ -
183 }
│ │ │ │ -
│ │ │ │ -
184 };
│ │ │ │ -
│ │ │ │ -
185
│ │ │ │ -
186 template<typename B, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
188 {
│ │ │ │ -
│ │ │ │ -
189 static void print(std::ostream& os)
│ │ │ │ -
190 {
│ │ │ │ -
191 os<<"%%MatrixMarket matrix array ";
│ │ │ │ -
192 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<B>::field_type>>::str()<<" general"<<std::endl;
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194 };
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196 template<typename T, int j>
│ │ │ │ -
│ │ │ │ -
197 struct mm_header_printer<FieldVector<T,j> >
│ │ │ │ -
198 {
│ │ │ │ -
│ │ │ │ -
199 static void print(std::ostream& os)
│ │ │ │ -
200 {
│ │ │ │ -
201 os<<"%%MatrixMarket matrix array ";
│ │ │ │ -
202 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
│ │ │ │ -
203 }
│ │ │ │ -
│ │ │ │ -
204 };
│ │ │ │ -
│ │ │ │ +
101#if __has_include("slu_zdefs.h")
│ │ │ │ +
102 template<>
│ │ │ │ +
103 struct SuperMatrixCreateSparseChooser<std::complex<double> >
│ │ │ │ +
104 {
│ │ │ │ +
105 static void create(SuperMatrix *mat, int n, int m, int offset,
│ │ │ │ +
106 std::complex<double> *values, int *rowindex, int* colindex,
│ │ │ │ +
107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
│ │ │ │ +
108 {
│ │ │ │ +
109 zCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast<doublecomplex*>(values),
│ │ │ │ +
110 rowindex, colindex, stype, dtype, mtype);
│ │ │ │ +
111 }
│ │ │ │ +
112 };
│ │ │ │ +
113
│ │ │ │ +
114 template<>
│ │ │ │ +
115 struct SuperMatrixPrinter<std::complex<double> >
│ │ │ │ +
116 {
│ │ │ │ +
117 static void print(char* name, SuperMatrix* mat)
│ │ │ │ +
118 {
│ │ │ │ +
119 zPrint_CompCol_Matrix(name, mat);
│ │ │ │ +
120 }
│ │ │ │ +
121 };
│ │ │ │ +
122#endif
│ │ │ │ +
123
│ │ │ │ +
124 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
126 {
│ │ │ │ +
127 static const Dtype_t type;
│ │ │ │ +
128 };
│ │ │ │ +
│ │ │ │ +
129
│ │ │ │ +
130 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
132 {};
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
134 template<class T>
│ │ │ │ +
135 const Dtype_t BaseGetSuperLUType<T>::type =
│ │ │ │ +
136 std::is_same<T,float>::value ? SLU_S :
│ │ │ │ +
137 ( std::is_same<T,std::complex<double> >::value ? SLU_Z :
│ │ │ │ +
138 ( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ));
│ │ │ │ +
139
│ │ │ │ +
140 template<>
│ │ │ │ +
│ │ │ │ +
141 struct GetSuperLUType<double>
│ │ │ │ +
142 : public BaseGetSuperLUType<double>
│ │ │ │ +
143 {
│ │ │ │ +
144 typedef double float_type;
│ │ │ │ +
145 };
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
147 template<>
│ │ │ │ +
│ │ │ │ +
148 struct GetSuperLUType<float>
│ │ │ │ +
149 : public BaseGetSuperLUType<float>
│ │ │ │ +
150 {
│ │ │ │ +
151 typedef float float_type;
│ │ │ │ +
152 };
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
154 template<>
│ │ │ │ +
│ │ │ │ +
155 struct GetSuperLUType<std::complex<double> >
│ │ │ │ +
156 : public BaseGetSuperLUType<std::complex<double> >
│ │ │ │ +
157 {
│ │ │ │ +
158 typedef double float_type;
│ │ │ │ +
159 };
│ │ │ │ +
│ │ │ │ +
160
│ │ │ │ +
161 template<>
│ │ │ │ +
│ │ │ │ +
162 struct GetSuperLUType<std::complex<float> >
│ │ │ │ +
163 : public BaseGetSuperLUType<std::complex<float> >
│ │ │ │ +
164 {
│ │ │ │ +
165 typedef float float_type;
│ │ │ │ +
166
│ │ │ │ +
167 };
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
173 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
175 {};
│ │ │ │ +
│ │ │ │ +
176
│ │ │ │ +
177 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
179 {};
│ │ │ │ +
│ │ │ │ +
180
│ │ │ │ +
181 template<class T>
│ │ │ │ +
182 class SuperLU;
│ │ │ │ +
183
│ │ │ │ +
184 template<class M, class X, class TM, class TD, class T1>
│ │ │ │ + │ │ │ │ +
186
│ │ │ │ +
187 template<class T, bool flag>
│ │ │ │ + │ │ │ │ +
189
│ │ │ │ +
193 template<class B, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
195 : public ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>
│ │ │ │ +
196 {
│ │ │ │ +
197 template<class M, class X, class TM, class TD, class T1>
│ │ │ │ + │ │ │ │ +
199 friend struct SuperMatrixInitializer<BCRSMatrix<B,TA> >;
│ │ │ │ +
200 public:
│ │ │ │ + │ │ │ │ +
203
│ │ │ │ + │ │ │ │
205
│ │ │ │ -
206 template<typename T, int i, int j>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
208 {
│ │ │ │ -
│ │ │ │ -
209 static void print(std::ostream& os)
│ │ │ │ -
210 {
│ │ │ │ -
211 os<<"%%MatrixMarket matrix array ";
│ │ │ │ -
212 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
│ │ │ │ -
213 }
│ │ │ │ -
│ │ │ │ -
214 };
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
224 template<class M>
│ │ │ │ - │ │ │ │ -
226
│ │ │ │ -
227 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
229 {
│ │ │ │ - │ │ │ │ -
231 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
│ │ │ │ -
232
│ │ │ │ -
│ │ │ │ -
233 static void print(std::ostream& os, const M&)
│ │ │ │ -
234 {
│ │ │ │ -
235 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ -
236 os<<"1 1"<<std::endl;
│ │ │ │ -
237 }
│ │ │ │ -
│ │ │ │ -
238 };
│ │ │ │ -
│ │ │ │ -
239
│ │ │ │ -
240 template<typename T, typename A, int i>
│ │ │ │ -
│ │ │ │ -
241 struct mm_block_structure_header<BlockVector<FieldVector<T,i>,A> >
│ │ │ │ -
242 {
│ │ │ │ - │ │ │ │ -
244
│ │ │ │ -
│ │ │ │ -
245 static void print(std::ostream& os, const M&)
│ │ │ │ -
246 {
│ │ │ │ -
247 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ -
248 os<<i<<" "<<1<<std::endl;
│ │ │ │ -
249 }
│ │ │ │ -
│ │ │ │ -
250 };
│ │ │ │ -
│ │ │ │ -
251
│ │ │ │ -
252 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
254 {
│ │ │ │ - │ │ │ │ -
256 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ -
258 static void print(std::ostream& os, const M&)
│ │ │ │ -
259 {
│ │ │ │ -
260 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ -
261 os<<"1 1"<<std::endl;
│ │ │ │ -
262 }
│ │ │ │ -
│ │ │ │ -
263 };
│ │ │ │ -
│ │ │ │ -
264
│ │ │ │ -
265 template<typename T, typename A, int i, int j>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
267 {
│ │ │ │ - │ │ │ │ -
269
│ │ │ │ -
│ │ │ │ -
270 static void print(std::ostream& os, const M&)
│ │ │ │ -
271 {
│ │ │ │ -
272 os<<"% ISTL_STRUCT blocked ";
│ │ │ │ -
273 os<<i<<" "<<j<<std::endl;
│ │ │ │ -
274 }
│ │ │ │ -
│ │ │ │ -
275 };
│ │ │ │ -
│ │ │ │ -
276
│ │ │ │ -
277
│ │ │ │ -
278 template<typename T, int i, int j>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
280 {
│ │ │ │ - │ │ │ │ -
282
│ │ │ │ -
│ │ │ │ -
283 static void print(std::ostream& os, const M& m)
│ │ │ │ -
284 {}
│ │ │ │ -
│ │ │ │ -
285 };
│ │ │ │ -
│ │ │ │ -
286
│ │ │ │ -
287 template<typename T, int i>
│ │ │ │ -
│ │ │ │ -
288 struct mm_block_structure_header<FieldVector<T,i> >
│ │ │ │ -
289 {
│ │ │ │ -
290 typedef FieldVector<T,i> M;
│ │ │ │ +
206 typedef typename Matrix::size_type size_type;
│ │ │ │ +
207
│ │ │ │ +
│ │ │ │ +
212 explicit SuperLUMatrix(const Matrix& mat) : ISTL::Impl::BCCSMatrix<BCRSMatrix<B,TA>, int>(mat)
│ │ │ │ +
213 {}
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
│ │ │ │ +
215 SuperLUMatrix() : ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>()
│ │ │ │ +
216 {}
│ │ │ │ +
│ │ │ │ +
217
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
220 {
│ │ │ │ +
221 if (this->N_+this->M_*this->Nnz_ != 0)
│ │ │ │ +
222 free();
│ │ │ │ +
223 }
│ │ │ │ +
│ │ │ │ +
224
│ │ │ │ +
│ │ │ │ +
226 operator SuperMatrix&()
│ │ │ │ +
227 {
│ │ │ │ +
228 return A;
│ │ │ │ +
229 }
│ │ │ │ +
│ │ │ │ +
230
│ │ │ │ +
│ │ │ │ +
232 operator const SuperMatrix&() const
│ │ │ │ +
233 {
│ │ │ │ +
234 return A;
│ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
238 {
│ │ │ │ +
239 if (this->N_ + this->M_ + this->Nnz_!=0)
│ │ │ │ +
240 free();
│ │ │ │ +
241
│ │ │ │ +
242 using Matrix = BCRSMatrix<B,TA>;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
245 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
│ │ │ │ +
246
│ │ │ │ +
247 copyToBCCSMatrix(initializer, mat);
│ │ │ │ +
248
│ │ │ │ + │ │ │ │ +
250 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
│ │ │ │ +
251 this->values,this->rowindex, this->colstart, SLU_NC,
│ │ │ │ +
252 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
│ │ │ │ +
253 return *this;
│ │ │ │ +
254 }
│ │ │ │ +
│ │ │ │ +
255
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
257 {
│ │ │ │ +
258 if (this->N_ + this->M_ + this->Nnz_!=0)
│ │ │ │ +
259 free();
│ │ │ │ +
260
│ │ │ │ +
261 using Matrix = BCRSMatrix<B,TA>;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
264 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
│ │ │ │ +
265
│ │ │ │ +
266 copyToBCCSMatrix(initializer, mat);
│ │ │ │ +
267
│ │ │ │ + │ │ │ │ +
269 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
│ │ │ │ +
270 this->values,this->rowindex, this->colstart, SLU_NC,
│ │ │ │ +
271 static_cast<Dtype_t>(GetSuperLUType<B>::type), SLU_GE);
│ │ │ │ +
272 return *this;
│ │ │ │ +
273 }
│ │ │ │ +
│ │ │ │ +
274
│ │ │ │ +
│ │ │ │ +
281 virtual void setMatrix(const Matrix& mat, const std::set<std::size_t>& mrs)
│ │ │ │ +
282 {
│ │ │ │ +
283 if(this->N_+this->M_+this->Nnz_!=0)
│ │ │ │ +
284 free();
│ │ │ │ +
285 this->N_=mrs.size()*MatrixDimension<typename Matrix::block_type>::rowdim(*(mat[0].begin()));
│ │ │ │ +
286 this->M_=mrs.size()*MatrixDimension<typename Matrix::block_type>::coldim(*(mat[0].begin()));
│ │ │ │ +
287 SuperMatrixInitializer<Matrix> initializer(*this);
│ │ │ │ +
288
│ │ │ │ +
289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(mat,mrs));
│ │ │ │ +
290 }
│ │ │ │ +
│ │ │ │
291
│ │ │ │ -
│ │ │ │ -
292 static void print(std::ostream& os, const M& m)
│ │ │ │ -
293 {}
│ │ │ │ -
│ │ │ │ -
294 };
│ │ │ │ -
│ │ │ │ -
295
│ │ │ │ - │ │ │ │ -
297 enum { MM_MAX_LINE_LENGTH=1025 };
│ │ │ │ +
│ │ │ │ +
293 virtual void setMatrix(const Matrix& mat)
│ │ │ │ +
294 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
297 SuperMatrixInitializer<Matrix> initializer(*this);
│ │ │ │
298
│ │ │ │ - │ │ │ │ -
300
│ │ │ │ - │ │ │ │ -
302
│ │ │ │ - │ │ │ │ -
304
│ │ │ │ -
│ │ │ │ -
305 struct MMHeader
│ │ │ │ -
306 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
309 {}
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
313 };
│ │ │ │ -
│ │ │ │ -
314
│ │ │ │ -
│ │ │ │ -
315 inline bool lineFeed(std::istream& file)
│ │ │ │ -
316 {
│ │ │ │ -
317 char c;
│ │ │ │ -
318 if(!file.eof())
│ │ │ │ -
319 c=file.peek();
│ │ │ │ -
320 else
│ │ │ │ -
321 return false;
│ │ │ │ -
322 // ignore whitespace
│ │ │ │ -
323 while(c==' ')
│ │ │ │ -
324 {
│ │ │ │ -
325 file.get();
│ │ │ │ -
326 if(file.eof())
│ │ │ │ -
327 return false;
│ │ │ │ -
328 c=file.peek();
│ │ │ │ -
329 }
│ │ │ │ -
330
│ │ │ │ -
331 if(c=='\n') {
│ │ │ │ -
332 /* eat the line feed */
│ │ │ │ -
333 file.get();
│ │ │ │ -
334 return true;
│ │ │ │ -
335 }
│ │ │ │ -
336 return false;
│ │ │ │ -
337 }
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
│ │ │ │ -
339 inline void skipComments(std::istream& file)
│ │ │ │ -
340 {
│ │ │ │ -
341 lineFeed(file);
│ │ │ │ -
342 char c=file.peek();
│ │ │ │ -
343 // ignore comment lines
│ │ │ │ -
344 while(c=='%')
│ │ │ │ -
345 {
│ │ │ │ -
346 /* discard the rest of the line */
│ │ │ │ -
347 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
348 c=file.peek();
│ │ │ │ -
349 }
│ │ │ │ -
350 }
│ │ │ │ -
│ │ │ │ -
351
│ │ │ │ -
352
│ │ │ │ -
│ │ │ │ -
353 inline bool readMatrixMarketBanner(std::istream& file, MMHeader& mmHeader)
│ │ │ │ -
354 {
│ │ │ │ -
355 std::string buffer;
│ │ │ │ -
356 char c;
│ │ │ │ -
357 file >> buffer;
│ │ │ │ -
358 c=buffer[0];
│ │ │ │ -
359 mmHeader=MMHeader();
│ │ │ │ -
360 if(c!='%')
│ │ │ │ -
361 return false;
│ │ │ │ -
362 dverb<<buffer<<std::endl;
│ │ │ │ -
363 /* read the banner */
│ │ │ │ -
364 if(buffer!="%%MatrixMarket") {
│ │ │ │ -
365 /* discard the rest of the line */
│ │ │ │ -
366 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
367 return false;
│ │ │ │ -
368 }
│ │ │ │ -
369
│ │ │ │ -
370 if(lineFeed(file))
│ │ │ │ -
371 /* premature end of line */
│ │ │ │ -
372 return false;
│ │ │ │ -
373
│ │ │ │ -
374 /* read the matrix_type */
│ │ │ │ -
375 file >> buffer;
│ │ │ │ -
376
│ │ │ │ -
377 if(buffer != "matrix")
│ │ │ │ -
378 {
│ │ │ │ -
379 /* discard the rest of the line */
│ │ │ │ -
380 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
381 return false;
│ │ │ │ -
382 }
│ │ │ │ -
383
│ │ │ │ -
384 if(lineFeed(file))
│ │ │ │ -
385 /* premature end of line */
│ │ │ │ -
386 return false;
│ │ │ │ -
387
│ │ │ │ -
388 /* The type of the matrix */
│ │ │ │ -
389 file >> buffer;
│ │ │ │ -
390
│ │ │ │ -
391 if(buffer.empty())
│ │ │ │ -
392 return false;
│ │ │ │ -
393
│ │ │ │ -
394 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
│ │ │ │ -
395 ::tolower);
│ │ │ │ -
396
│ │ │ │ -
397 switch(buffer[0])
│ │ │ │ -
398 {
│ │ │ │ -
399 case 'a' :
│ │ │ │ -
400 /* sanity check */
│ │ │ │ -
401 if(buffer != "array")
│ │ │ │ -
402 {
│ │ │ │ -
403 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
404 return false;
│ │ │ │ -
405 }
│ │ │ │ -
406 mmHeader.type=array_type;
│ │ │ │ -
407 break;
│ │ │ │ -
408 case 'c' :
│ │ │ │ -
409 /* sanity check */
│ │ │ │ -
410 if(buffer != "coordinate")
│ │ │ │ -
411 {
│ │ │ │ -
412 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
413 return false;
│ │ │ │ -
414 }
│ │ │ │ -
415 mmHeader.type=coordinate_type;
│ │ │ │ -
416 break;
│ │ │ │ -
417 default :
│ │ │ │ -
418 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
419 return false;
│ │ │ │ -
420 }
│ │ │ │ -
421
│ │ │ │ -
422 if(lineFeed(file))
│ │ │ │ -
423 /* premature end of line */
│ │ │ │ -
424 return false;
│ │ │ │ -
425
│ │ │ │ -
426 /* The numeric type used. */
│ │ │ │ -
427 file >> buffer;
│ │ │ │ -
428
│ │ │ │ -
429 if(buffer.empty())
│ │ │ │ -
430 return false;
│ │ │ │ -
431
│ │ │ │ -
432 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
│ │ │ │ -
433 ::tolower);
│ │ │ │ -
434 switch(buffer[0])
│ │ │ │ -
435 {
│ │ │ │ -
436 case 'i' :
│ │ │ │ -
437 /* sanity check */
│ │ │ │ -
438 if(buffer != "integer")
│ │ │ │ -
439 {
│ │ │ │ -
440 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
441 return false;
│ │ │ │ -
442 }
│ │ │ │ -
443 mmHeader.ctype=integer_type;
│ │ │ │ -
444 break;
│ │ │ │ -
445 case 'r' :
│ │ │ │ -
446 /* sanity check */
│ │ │ │ -
447 if(buffer != "real")
│ │ │ │ -
448 {
│ │ │ │ -
449 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
450 return false;
│ │ │ │ -
451 }
│ │ │ │ -
452 mmHeader.ctype=double_type;
│ │ │ │ -
453 break;
│ │ │ │ -
454 case 'c' :
│ │ │ │ -
455 /* sanity check */
│ │ │ │ -
456 if(buffer != "complex")
│ │ │ │ -
457 {
│ │ │ │ -
458 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
459 return false;
│ │ │ │ -
460 }
│ │ │ │ -
461 mmHeader.ctype=complex_type;
│ │ │ │ -
462 break;
│ │ │ │ -
463 case 'p' :
│ │ │ │ -
464 /* sanity check */
│ │ │ │ -
465 if(buffer != "pattern")
│ │ │ │ -
466 {
│ │ │ │ -
467 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
468 return false;
│ │ │ │ -
469 }
│ │ │ │ -
470 mmHeader.ctype=pattern;
│ │ │ │ -
471 break;
│ │ │ │ -
472 default :
│ │ │ │ -
473 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
474 return false;
│ │ │ │ -
475 }
│ │ │ │ -
476
│ │ │ │ -
477 if(lineFeed(file))
│ │ │ │ -
478 return false;
│ │ │ │ -
479
│ │ │ │ -
480 file >> buffer;
│ │ │ │ -
481
│ │ │ │ -
482 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
│ │ │ │ -
483 ::tolower);
│ │ │ │ -
484 switch(buffer[0])
│ │ │ │ -
485 {
│ │ │ │ -
486 case 'g' :
│ │ │ │ -
487 /* sanity check */
│ │ │ │ -
488 if(buffer != "general")
│ │ │ │ -
489 {
│ │ │ │ -
490 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
491 return false;
│ │ │ │ -
492 }
│ │ │ │ -
493 mmHeader.structure=general;
│ │ │ │ -
494 break;
│ │ │ │ -
495 case 'h' :
│ │ │ │ -
496 /* sanity check */
│ │ │ │ -
497 if(buffer != "hermitian")
│ │ │ │ -
498 {
│ │ │ │ -
499 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
500 return false;
│ │ │ │ -
501 }
│ │ │ │ -
502 mmHeader.structure=hermitian;
│ │ │ │ -
503 break;
│ │ │ │ -
504 case 's' :
│ │ │ │ -
505 if(buffer.size()==1) {
│ │ │ │ -
506 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
507 return false;
│ │ │ │ -
508 }
│ │ │ │ -
509
│ │ │ │ -
510 switch(buffer[1])
│ │ │ │ -
511 {
│ │ │ │ -
512 case 'y' :
│ │ │ │ -
513 /* sanity check */
│ │ │ │ -
514 if(buffer != "symmetric")
│ │ │ │ -
515 {
│ │ │ │ -
516 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
517 return false;
│ │ │ │ -
518 }
│ │ │ │ -
519 mmHeader.structure=symmetric;
│ │ │ │ -
520 break;
│ │ │ │ -
521 case 'k' :
│ │ │ │ -
522 /* sanity check */
│ │ │ │ -
523 if(buffer != "skew-symmetric")
│ │ │ │ -
524 {
│ │ │ │ -
525 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
526 return false;
│ │ │ │ -
527 }
│ │ │ │ -
528 mmHeader.structure=skew_symmetric;
│ │ │ │ -
529 break;
│ │ │ │ -
530 default :
│ │ │ │ -
531 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
532 return false;
│ │ │ │ -
533 }
│ │ │ │ -
534 break;
│ │ │ │ -
535 default :
│ │ │ │ -
536 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
537 return false;
│ │ │ │ -
538 }
│ │ │ │ -
539 file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
540 c=file.peek();
│ │ │ │ -
541 return true;
│ │ │ │ -
542
│ │ │ │ -
543 }
│ │ │ │ -
│ │ │ │ -
544
│ │ │ │ -
545 template<std::size_t brows, std::size_t bcols>
│ │ │ │ -
546 std::tuple<std::size_t, std::size_t, std::size_t>
│ │ │ │ -
│ │ │ │ -
547 calculateNNZ(std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader& header)
│ │ │ │ -
548 {
│ │ │ │ -
549 std::size_t blockrows=rows/brows;
│ │ │ │ -
550 std::size_t blockcols=cols/bcols;
│ │ │ │ -
551 std::size_t blocksize=brows*bcols;
│ │ │ │ -
552 std::size_t blockentries=0;
│ │ │ │ -
553
│ │ │ │ -
554 switch(header.structure)
│ │ │ │ -
555 {
│ │ │ │ -
556 case general :
│ │ │ │ -
557 blockentries = entries/blocksize; break;
│ │ │ │ -
558 case skew_symmetric :
│ │ │ │ -
559 blockentries = 2*entries/blocksize; break;
│ │ │ │ -
560 case symmetric :
│ │ │ │ -
561 blockentries = (2*entries-rows)/blocksize; break;
│ │ │ │ -
562 case hermitian :
│ │ │ │ -
563 blockentries = (2*entries-rows)/blocksize; break;
│ │ │ │ -
564 default :
│ │ │ │ -
565 throw Dune::NotImplemented();
│ │ │ │ -
566 }
│ │ │ │ -
567 return std::make_tuple(blockrows, blockcols, blockentries);
│ │ │ │ -
568 }
│ │ │ │ -
│ │ │ │ -
569
│ │ │ │ -
570 /*
│ │ │ │ -
571 * @brief Storage class for the column index and the numeric value.
│ │ │ │ -
572 *
│ │ │ │ -
573 * \tparam T Either a NumericWrapper of the numeric type or PatternDummy
│ │ │ │ -
574 * for MatrixMarket pattern case.
│ │ │ │ -
575 */
│ │ │ │ -
576 template<typename T>
│ │ │ │ -
│ │ │ │ -
577 struct IndexData : public T
│ │ │ │ -
578 {
│ │ │ │ -
579 std::size_t index = {};
│ │ │ │ -
580 };
│ │ │ │ -
│ │ │ │ -
581
│ │ │ │ -
582
│ │ │ │ -
593 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
595 {
│ │ │ │ -
596 T number = {};
│ │ │ │ -
│ │ │ │ -
597 operator T&()
│ │ │ │ -
598 {
│ │ │ │ -
599 return number;
│ │ │ │ -
600 }
│ │ │ │ -
│ │ │ │ -
601 };
│ │ │ │ -
│ │ │ │ -
602
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
607 {};
│ │ │ │ -
│ │ │ │ -
608
│ │ │ │ -
609 template<>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
611 {};
│ │ │ │ -
│ │ │ │ -
612
│ │ │ │ -
613 template<typename T>
│ │ │ │ -
│ │ │ │ -
614 std::istream& operator>>(std::istream& is, NumericWrapper<T>& num)
│ │ │ │ -
615 {
│ │ │ │ -
616 return is>>num.number;
│ │ │ │ -
617 }
│ │ │ │ -
│ │ │ │ -
618
│ │ │ │ -
│ │ │ │ -
619 inline std::istream& operator>>(std::istream& is, [[maybe_unused]] NumericWrapper<PatternDummy>& num)
│ │ │ │ -
620 {
│ │ │ │ -
621 return is;
│ │ │ │ -
622 }
│ │ │ │ -
│ │ │ │ -
623
│ │ │ │ -
629 template<typename T>
│ │ │ │ -
│ │ │ │ -
630 bool operator<(const IndexData<T>& i1, const IndexData<T>& i2)
│ │ │ │ -
631 {
│ │ │ │ -
632 return i1.index<i2.index;
│ │ │ │ -
633 }
│ │ │ │ -
│ │ │ │ -
634
│ │ │ │ -
640 template<typename T>
│ │ │ │ -
│ │ │ │ -
641 std::istream& operator>>(std::istream& is, IndexData<T>& data)
│ │ │ │ -
642 {
│ │ │ │ -
643 is>>data.index;
│ │ │ │ -
644 /* MatrixMarket indices are one based. Decrement for C++ */
│ │ │ │ -
645 --data.index;
│ │ │ │ -
646 return is>>data.number;
│ │ │ │ -
647 }
│ │ │ │ -
│ │ │ │ -
648
│ │ │ │ -
654 template<typename T>
│ │ │ │ -
│ │ │ │ -
655 std::istream& operator>>(std::istream& is, IndexData<NumericWrapper<std::complex<T>>>& data)
│ │ │ │ -
656 {
│ │ │ │ -
657 is>>data.index;
│ │ │ │ -
658 /* MatrixMarket indices are one based. Decrement for C++ */
│ │ │ │ -
659 --data.index;
│ │ │ │ -
660 // real and imaginary part needs to be read separately as
│ │ │ │ -
661 // complex numbers are not provided in pair form. (x,y)
│ │ │ │ -
662 NumericWrapper<T> real, imag;
│ │ │ │ -
663 is>>real;
│ │ │ │ -
664 is>>imag;
│ │ │ │ -
665 data.number = {real.number, imag.number};
│ │ │ │ -
666 return is;
│ │ │ │ -
667 }
│ │ │ │ -
│ │ │ │ -
668
│ │ │ │ -
675 template<typename D, int brows, int bcols>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
677 {
│ │ │ │ -
683 template<typename T>
│ │ │ │ -
│ │ │ │ -
684 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
│ │ │ │ -
685 BCRSMatrix<T>& matrix)
│ │ │ │ -
686 {
│ │ │ │ -
687 static_assert(IsNumber<T>::value && brows==1 && bcols==1, "Only scalar entries are expected here!");
│ │ │ │ -
688 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
│ │ │ │ -
689 {
│ │ │ │ -
690 auto brow=iter.index();
│ │ │ │ -
691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter)
│ │ │ │ -
692 (*iter)[siter->index] = siter->number;
│ │ │ │ -
693 }
│ │ │ │ -
694 }
│ │ │ │ -
│ │ │ │ -
695
│ │ │ │ -
701 template<typename T>
│ │ │ │ -
│ │ │ │ -
702 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
│ │ │ │ - │ │ │ │ -
704 {
│ │ │ │ -
705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
│ │ │ │ -
706 {
│ │ │ │ -
707 for (auto brow=iter.index()*brows,
│ │ │ │ -
708 browend=iter.index()*brows+brows;
│ │ │ │ -
709 brow<browend; ++brow)
│ │ │ │ -
710 {
│ │ │ │ -
711 for (auto siter=rows[brow].begin(), send=rows[brow].end();
│ │ │ │ -
712 siter != send; ++siter)
│ │ │ │ -
713 (*iter)[siter->index/bcols][brow%brows][siter->index%bcols]=siter->number;
│ │ │ │ -
714 }
│ │ │ │ -
715 }
│ │ │ │ -
716 }
│ │ │ │ -
│ │ │ │ -
717 };
│ │ │ │ -
│ │ │ │ -
718
│ │ │ │ -
719 template<int brows, int bcols>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
721 {
│ │ │ │ -
722 template<typename M>
│ │ │ │ -
│ │ │ │ -
723 void operator()(const std::vector<std::set<IndexData<PatternDummy> > >& rows,
│ │ │ │ -
724 M& matrix)
│ │ │ │ -
725 {}
│ │ │ │ -
│ │ │ │ -
726 };
│ │ │ │ -
│ │ │ │ -
727
│ │ │ │ -
728 template<class T> struct is_complex : std::false_type {};
│ │ │ │ -
729 template<class T> struct is_complex<std::complex<T>> : std::true_type {};
│ │ │ │ -
730
│ │ │ │ -
731 // wrapper for std::conj. Returns T if T is not complex.
│ │ │ │ -
732 template<class T>
│ │ │ │ -
│ │ │ │ -
733 std::enable_if_t<!is_complex<T>::value, T> conj(const T& r){
│ │ │ │ -
734 return r;
│ │ │ │ -
735 }
│ │ │ │ -
│ │ │ │ -
736
│ │ │ │ -
737 template<class T>
│ │ │ │ -
│ │ │ │ -
738 std::enable_if_t<is_complex<T>::value, T> conj(const T& r){
│ │ │ │ -
739 return std::conj(r);
│ │ │ │ -
740 }
│ │ │ │ -
│ │ │ │ -
741
│ │ │ │ -
742 template<typename M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
744 {};
│ │ │ │ -
│ │ │ │ -
745
│ │ │ │ -
746 template<typename B, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
748 {
│ │ │ │ -
749 enum {
│ │ │ │ -
750 rows = 1,
│ │ │ │ -
751 cols = 1
│ │ │ │ -
752 };
│ │ │ │ -
753 };
│ │ │ │ -
│ │ │ │ -
754
│ │ │ │ -
755 template<typename B, int i, int j, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
757 {
│ │ │ │ -
758 enum {
│ │ │ │ -
759 rows = i,
│ │ │ │ -
760 cols = j
│ │ │ │ -
761 };
│ │ │ │ -
762 };
│ │ │ │ -
│ │ │ │ -
763
│ │ │ │ -
764 template<typename T, typename A, typename D>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
766 std::istream& file, std::size_t entries,
│ │ │ │ -
767 const MMHeader& mmHeader, const D&)
│ │ │ │ -
768 {
│ │ │ │ - │ │ │ │ -
770
│ │ │ │ -
771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
│ │ │ │ -
772 constexpr int brows = mm_multipliers<Matrix>::rows;
│ │ │ │ -
773 constexpr int bcols = mm_multipliers<Matrix>::cols;
│ │ │ │ -
774
│ │ │ │ -
775 // First path
│ │ │ │ -
776 // store entries together with column index in a separate
│ │ │ │ -
777 // data structure
│ │ │ │ -
778 std::vector<std::set<IndexData<D> > > rows(matrix.N()*brows);
│ │ │ │ -
779
│ │ │ │ -
780 auto readloop = [&] (auto symmetryFixup) {
│ │ │ │ -
781 for(std::size_t i = 0; i < entries; ++i) {
│ │ │ │ -
782 std::size_t row;
│ │ │ │ -
783 IndexData<D> data;
│ │ │ │ -
784 skipComments(file);
│ │ │ │ -
785 file>>row;
│ │ │ │ -
786 --row; // Index was 1 based.
│ │ │ │ -
787 assert(row/bcols<matrix.N());
│ │ │ │ -
788 file>>data;
│ │ │ │ -
789 assert(data.index/bcols<matrix.M());
│ │ │ │ -
790 rows[row].insert(data);
│ │ │ │ -
791 if(row!=data.index)
│ │ │ │ -
792 symmetryFixup(row, data);
│ │ │ │ -
793 }
│ │ │ │ -
794 };
│ │ │ │ -
795
│ │ │ │ -
796 switch(mmHeader.structure)
│ │ │ │ -
797 {
│ │ │ │ -
798 case general:
│ │ │ │ -
799 readloop([](auto...){});
│ │ │ │ -
800 break;
│ │ │ │ -
801 case symmetric :
│ │ │ │ -
802 readloop([&](auto row, auto data) {
│ │ │ │ -
803 IndexData<D> data_sym(data);
│ │ │ │ -
804 data_sym.index = row;
│ │ │ │ -
805 rows[data.index].insert(data_sym);
│ │ │ │ -
806 });
│ │ │ │ -
807 break;
│ │ │ │ -
808 case skew_symmetric :
│ │ │ │ -
809 readloop([&](auto row, auto data) {
│ │ │ │ -
810 IndexData<D> data_sym;
│ │ │ │ -
811 data_sym.number = -data.number;
│ │ │ │ -
812 data_sym.index = row;
│ │ │ │ -
813 rows[data.index].insert(data_sym);
│ │ │ │ -
814 });
│ │ │ │ -
815 break;
│ │ │ │ -
816 case hermitian :
│ │ │ │ -
817 readloop([&](auto row, auto data) {
│ │ │ │ -
818 IndexData<D> data_sym;
│ │ │ │ -
819 data_sym.number = conj(data.number);
│ │ │ │ -
820 data_sym.index = row;
│ │ │ │ -
821 rows[data.index].insert(data_sym);
│ │ │ │ -
822 });
│ │ │ │ -
823 break;
│ │ │ │ -
824 default:
│ │ │ │ -
825 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ -
826 "Only general, symmetric, skew-symmetric and hermitian is supported right now!");
│ │ │ │ -
827 }
│ │ │ │ -
828
│ │ │ │ -
829 // Setup the matrix sparsity pattern
│ │ │ │ -
830 int nnz=0;
│ │ │ │ -
831 for(typename Matrix::CreateIterator iter=matrix.createbegin();
│ │ │ │ -
832 iter!= matrix.createend(); ++iter)
│ │ │ │ -
833 {
│ │ │ │ -
834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows;
│ │ │ │ -
835 brow<browend; ++brow)
│ │ │ │ -
836 {
│ │ │ │ -
837 typedef typename std::set<IndexData<D> >::const_iterator Siter;
│ │ │ │ -
838 for(Siter siter=rows[brow].begin(), send=rows[brow].end();
│ │ │ │ -
839 siter != send; ++siter, ++nnz)
│ │ │ │ -
840 iter.insert(siter->index/bcols);
│ │ │ │ -
841 }
│ │ │ │ -
842 }
│ │ │ │ -
843
│ │ │ │ -
844 //Set the matrix values
│ │ │ │ -
845 matrix=0;
│ │ │ │ -
846
│ │ │ │ - │ │ │ │ -
848
│ │ │ │ -
849 Setter(rows, matrix);
│ │ │ │ -
850 }
│ │ │ │ -
│ │ │ │ -
851
│ │ │ │ -
│ │ │ │ -
852 inline std::tuple<std::string, std::string> splitFilename(const std::string& filename) {
│ │ │ │ -
853 std::size_t lastdot = filename.find_last_of(".");
│ │ │ │ -
854 if(lastdot == std::string::npos)
│ │ │ │ -
855 return std::make_tuple(filename, "");
│ │ │ │ -
856 else {
│ │ │ │ -
857 std::string potentialFileExtension = filename.substr(lastdot);
│ │ │ │ -
858 if (potentialFileExtension == ".mm" || potentialFileExtension == ".mtx")
│ │ │ │ -
859 return std::make_tuple(filename.substr(0, lastdot), potentialFileExtension);
│ │ │ │ -
860 else
│ │ │ │ -
861 return std::make_tuple(filename, "");
│ │ │ │ -
862 }
│ │ │ │ -
863 }
│ │ │ │ -
│ │ │ │ -
864
│ │ │ │ -
865 } // end namespace MatrixMarketImpl
│ │ │ │ -
│ │ │ │ -
866
│ │ │ │ -
│ │ │ │ -
867 class MatrixMarketFormatError : public Dune::Exception
│ │ │ │ -
868 {};
│ │ │ │ -
│ │ │ │ -
869
│ │ │ │ -
870
│ │ │ │ -
│ │ │ │ -
871 inline void mm_read_header(std::size_t& rows, std::size_t& cols,
│ │ │ │ -
872 MatrixMarketImpl::MMHeader& header, std::istream& istr,
│ │ │ │ -
873 bool isVector)
│ │ │ │ -
874 {
│ │ │ │ -
875 using namespace MatrixMarketImpl;
│ │ │ │ -
876
│ │ │ │ -
877 if(!readMatrixMarketBanner(istr, header)) {
│ │ │ │ -
878 std::cerr << "First line was not a correct Matrix Market banner. Using default:\n"
│ │ │ │ -
879 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
│ │ │ │ -
880 // Go to the beginning of the file
│ │ │ │ -
881 istr.clear() ;
│ │ │ │ -
882 istr.seekg(0, std::ios::beg);
│ │ │ │ -
883 if(isVector)
│ │ │ │ -
884 header.type=array_type;
│ │ │ │ -
885 }
│ │ │ │ -
886
│ │ │ │ -
887 skipComments(istr);
│ │ │ │ -
888
│ │ │ │ -
889 if(lineFeed(istr))
│ │ │ │ - │ │ │ │ -
891
│ │ │ │ -
892 istr >> rows;
│ │ │ │ -
893
│ │ │ │ -
894 if(lineFeed(istr))
│ │ │ │ - │ │ │ │ -
896 istr >> cols;
│ │ │ │ -
897 }
│ │ │ │ -
│ │ │ │ -
898
│ │ │ │ -
899 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
901 std::size_t size,
│ │ │ │ -
902 std::istream& istr,
│ │ │ │ -
903 size_t lane)
│ │ │ │ -
904 {
│ │ │ │ -
905 for (int i=0; size>0; ++i, --size)
│ │ │ │ -
906 istr>>Simd::lane(lane,vector[i]);
│ │ │ │ -
907 }
│ │ │ │ -
│ │ │ │ -
908
│ │ │ │ -
909 template<typename T, typename A, int entries>
│ │ │ │ -
│ │ │ │ -
910 void mm_read_vector_entries(Dune::BlockVector<Dune::FieldVector<T,entries>,A>& vector,
│ │ │ │ -
911 std::size_t size,
│ │ │ │ -
912 std::istream& istr,
│ │ │ │ -
913 size_t lane)
│ │ │ │ -
914 {
│ │ │ │ -
915 for(int i=0; size>0; ++i, --size) {
│ │ │ │ -
916 Simd::Scalar<T> val;
│ │ │ │ -
917 istr>>val;
│ │ │ │ -
918 Simd::lane(lane, vector[i/entries][i%entries])=val;
│ │ │ │ -
919 }
│ │ │ │ -
920 }
│ │ │ │ -
│ │ │ │ -
921
│ │ │ │ -
922
│ │ │ │ -
929 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
931 std::istream& istr)
│ │ │ │ -
932 {
│ │ │ │ -
933 typedef typename Dune::BlockVector<T,A>::field_type field_type;
│ │ │ │ -
934 using namespace MatrixMarketImpl;
│ │ │ │ -
935
│ │ │ │ -
936 MMHeader header;
│ │ │ │ -
937 std::size_t rows, cols;
│ │ │ │ -
938 mm_read_header(rows,cols,header,istr, true);
│ │ │ │ -
939 if(cols!=Simd::lanes<field_type>()) {
│ │ │ │ -
940 if(Simd::lanes<field_type>() == 1)
│ │ │ │ -
941 DUNE_THROW(MatrixMarketFormatError, "cols!=1, therefore this is no vector!");
│ │ │ │ -
942 else
│ │ │ │ -
943 DUNE_THROW(MatrixMarketFormatError, "cols does not match the number of lanes in the field_type!");
│ │ │ │ -
944 }
│ │ │ │ -
945
│ │ │ │ -
946 if(header.type!=array_type)
│ │ │ │ -
947 DUNE_THROW(MatrixMarketFormatError, "Vectors have to be stored in array format!");
│ │ │ │ -
948
│ │ │ │ -
949
│ │ │ │ -
950 if constexpr (Dune::IsNumber<T>())
│ │ │ │ -
951 vector.resize(rows);
│ │ │ │ -
952 else
│ │ │ │ -
953 {
│ │ │ │ -
954 T dummy;
│ │ │ │ -
955 auto blocksize = dummy.size();
│ │ │ │ -
956 std::size_t size=rows/blocksize;
│ │ │ │ -
957 if(size*blocksize!=rows)
│ │ │ │ -
958 DUNE_THROW(MatrixMarketFormatError, "Block size of vector is not correct!");
│ │ │ │ -
959
│ │ │ │ -
960 vector.resize(size);
│ │ │ │ -
961 }
│ │ │ │ -
962
│ │ │ │ -
963 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
964 for(size_t l=0;l<Simd::lanes<field_type>();++l){
│ │ │ │ -
965 mm_read_vector_entries(vector, rows, istr, l);
│ │ │ │ -
966 }
│ │ │ │ -
967 }
│ │ │ │ -
│ │ │ │ -
968
│ │ │ │ -
975 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
977 std::istream& istr)
│ │ │ │ -
978 {
│ │ │ │ -
979 using namespace MatrixMarketImpl;
│ │ │ │ - │ │ │ │ -
981
│ │ │ │ -
982 MMHeader header;
│ │ │ │ -
983 if(!readMatrixMarketBanner(istr, header)) {
│ │ │ │ -
984 std::cerr << "First line was not a correct Matrix Market banner. Using default:\n"
│ │ │ │ -
985 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
│ │ │ │ -
986 // Go to the beginning of the file
│ │ │ │ -
987 istr.clear() ;
│ │ │ │ -
988 istr.seekg(0, std::ios::beg);
│ │ │ │ -
989 }
│ │ │ │ -
990 skipComments(istr);
│ │ │ │ -
991
│ │ │ │ -
992 std::size_t rows, cols, entries;
│ │ │ │ -
993
│ │ │ │ -
994 if(lineFeed(istr))
│ │ │ │ - │ │ │ │ -
996
│ │ │ │ -
997 istr >> rows;
│ │ │ │ -
998
│ │ │ │ -
999 if(lineFeed(istr))
│ │ │ │ - │ │ │ │ -
1001 istr >> cols;
│ │ │ │ -
1002
│ │ │ │ -
1003 if(lineFeed(istr))
│ │ │ │ - │ │ │ │ -
1005
│ │ │ │ -
1006 istr >>entries;
│ │ │ │ -
1007
│ │ │ │ -
1008 std::size_t nnz, blockrows, blockcols;
│ │ │ │ -
1009
│ │ │ │ -
1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
│ │ │ │ -
1011 constexpr int brows = mm_multipliers<Matrix>::rows;
│ │ │ │ -
1012 constexpr int bcols = mm_multipliers<Matrix>::cols;
│ │ │ │ -
1013
│ │ │ │ -
1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ<brows, bcols>(rows, cols, entries, header);
│ │ │ │ -
1015
│ │ │ │ -
1016 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
│ │ │ │ -
1017
│ │ │ │ -
1018
│ │ │ │ -
1019 matrix.setSize(blockrows, blockcols, nnz);
│ │ │ │ - │ │ │ │ -
1021
│ │ │ │ -
1022 if(header.type==array_type)
│ │ │ │ -
1023 DUNE_THROW(Dune::NotImplemented, "Array format currently not supported for matrices!");
│ │ │ │ -
1024
│ │ │ │ -
1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper<typename Matrix::field_type>());
│ │ │ │ -
1026 }
│ │ │ │ -
│ │ │ │ -
1027
│ │ │ │ -
1028 // Print a scalar entry
│ │ │ │ -
1029 template<typename B>
│ │ │ │ -
│ │ │ │ -
1030 void mm_print_entry(const B& entry,
│ │ │ │ -
1031 std::size_t rowidx,
│ │ │ │ -
1032 std::size_t colidx,
│ │ │ │ -
1033 std::ostream& ostr)
│ │ │ │ -
1034 {
│ │ │ │ -
1035 if constexpr (IsNumber<B>())
│ │ │ │ -
1036 ostr << rowidx << " " << colidx << " " << entry << std::endl;
│ │ │ │ -
1037 else
│ │ │ │ -
1038 {
│ │ │ │ -
1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) {
│ │ │ │ -
1040 int coli=colidx;
│ │ │ │ -
1041 for (auto col = row->begin(); col != row->end(); ++col, ++coli)
│ │ │ │ -
1042 ostr<< rowidx<<" "<<coli<<" "<<*col<<std::endl;
│ │ │ │ -
1043 }
│ │ │ │ -
1044 }
│ │ │ │ -
1045 }
│ │ │ │ -
│ │ │ │ -
1046
│ │ │ │ -
1047 // Write a vector entry
│ │ │ │ -
1048 template<typename V>
│ │ │ │ -
│ │ │ │ -
1049 void mm_print_vector_entry(const V& entry, std::ostream& ostr,
│ │ │ │ -
1050 const std::integral_constant<int,1>&,
│ │ │ │ -
1051 size_t lane)
│ │ │ │ -
1052 {
│ │ │ │ -
1053 ostr<<Simd::lane(lane,entry)<<std::endl;
│ │ │ │ -
1054 }
│ │ │ │ -
│ │ │ │ -
1055
│ │ │ │ -
1056 // Write a vector
│ │ │ │ -
1057 template<typename V>
│ │ │ │ -
│ │ │ │ -
1058 void mm_print_vector_entry(const V& vector, std::ostream& ostr,
│ │ │ │ -
1059 const std::integral_constant<int,0>&,
│ │ │ │ -
1060 size_t lane)
│ │ │ │ -
1061 {
│ │ │ │ -
1062 using namespace MatrixMarketImpl;
│ │ │ │ -
1063
│ │ │ │ -
1064 // Is the entry a supported numeric type?
│ │ │ │ -
1065 const int isnumeric = mm_numeric_type<Simd::Scalar<typename V::block_type>>::is_numeric;
│ │ │ │ -
1066 typedef typename V::const_iterator VIter;
│ │ │ │ -
1067
│ │ │ │ -
1068 for(VIter i=vector.begin(); i != vector.end(); ++i)
│ │ │ │ -
1069
│ │ │ │ -
1070 mm_print_vector_entry(*i, ostr,
│ │ │ │ -
1071 std::integral_constant<int,isnumeric>(),
│ │ │ │ -
1072 lane);
│ │ │ │ -
1073 }
│ │ │ │ -
│ │ │ │ -
1074
│ │ │ │ -
1075 template<typename T, typename A>
│ │ │ │ -
│ │ │ │ -
1076 std::size_t countEntries(const BlockVector<T,A>& vector)
│ │ │ │ -
1077 {
│ │ │ │ -
1078 return vector.size();
│ │ │ │ -
1079 }
│ │ │ │ -
│ │ │ │ -
1080
│ │ │ │ -
1081 template<typename T, typename A, int i>
│ │ │ │ -
│ │ │ │ -
1082 std::size_t countEntries(const BlockVector<FieldVector<T,i>,A>& vector)
│ │ │ │ -
1083 {
│ │ │ │ -
1084 return vector.size()*i;
│ │ │ │ -
1085 }
│ │ │ │ -
│ │ │ │ -
1086
│ │ │ │ -
1087 // Version for writing vectors.
│ │ │ │ -
1088 template<typename V>
│ │ │ │ -
│ │ │ │ -
1089 void writeMatrixMarket(const V& vector, std::ostream& ostr,
│ │ │ │ -
1090 const std::integral_constant<int,0>&)
│ │ │ │ -
1091 {
│ │ │ │ -
1092 using namespace MatrixMarketImpl;
│ │ │ │ -
1093 typedef typename V::field_type field_type;
│ │ │ │ -
1094
│ │ │ │ -
1095 ostr<<countEntries(vector)<<" "<<Simd::lanes<field_type>()<<std::endl;
│ │ │ │ -
1096 const int isnumeric = mm_numeric_type<Simd::Scalar<V>>::is_numeric;
│ │ │ │ -
1097 for(size_t l=0;l<Simd::lanes<field_type>(); ++l){
│ │ │ │ -
1098 mm_print_vector_entry(vector,ostr, std::integral_constant<int,isnumeric>(), l);
│ │ │ │ -
1099 }
│ │ │ │ -
1100 }
│ │ │ │ -
│ │ │ │ -
1101
│ │ │ │ -
1102 // Versions for writing matrices
│ │ │ │ -
1103 template<typename M>
│ │ │ │ -
│ │ │ │ -
1104 void writeMatrixMarket(const M& matrix,
│ │ │ │ -
1105 std::ostream& ostr,
│ │ │ │ -
1106 const std::integral_constant<int,1>&)
│ │ │ │ -
1107 {
│ │ │ │ -
1108 ostr<<matrix.N()*MatrixMarketImpl::mm_multipliers<M>::rows<<" "
│ │ │ │ - │ │ │ │ -
1110 <<countNonZeros(matrix)<<std::endl;
│ │ │ │ -
1111
│ │ │ │ -
1112 typedef typename M::const_iterator riterator;
│ │ │ │ -
1113 typedef typename M::ConstColIterator citerator;
│ │ │ │ -
1114 for(riterator row=matrix.begin(); row != matrix.end(); ++row)
│ │ │ │ -
1115 for(citerator col = row->begin(); col != row->end(); ++col)
│ │ │ │ -
1116 // Matrix Market indexing start with 1!
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1119 }
│ │ │ │ -
│ │ │ │ -
1120
│ │ │ │ -
1121
│ │ │ │ -
1125 template<typename M>
│ │ │ │ -
│ │ │ │ -
1126 void writeMatrixMarket(const M& matrix,
│ │ │ │ -
1127 std::ostream& ostr)
│ │ │ │ -
1128 {
│ │ │ │ -
1129 using namespace MatrixMarketImpl;
│ │ │ │ -
1130
│ │ │ │ -
1131 // Write header information
│ │ │ │ -
1132 mm_header_printer<M>::print(ostr);
│ │ │ │ -
1133 mm_block_structure_header<M>::print(ostr,matrix);
│ │ │ │ -
1134 // Choose the correct function for matrix and vector
│ │ │ │ -
1135 writeMatrixMarket(matrix,ostr,std::integral_constant<int,IsMatrix<M>::value>());
│ │ │ │ -
1136 }
│ │ │ │ -
│ │ │ │ -
1137
│ │ │ │ -
1138 static const int default_precision = -1;
│ │ │ │ -
1150 template<typename M>
│ │ │ │ -
│ │ │ │ -
1151 void storeMatrixMarket(const M& matrix,
│ │ │ │ -
1152 std::string filename,
│ │ │ │ -
1153 int prec=default_precision)
│ │ │ │ -
1154 {
│ │ │ │ -
1155 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ -
1156 std::string rfilename;
│ │ │ │ -
1157 std::ofstream file;
│ │ │ │ -
1158 if (extension != "") {
│ │ │ │ -
1159 rfilename = pureFilename + extension;
│ │ │ │ -
1160 file.open(rfilename.c_str());
│ │ │ │ -
1161 if(!file)
│ │ │ │ -
1162 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ -
1163 }
│ │ │ │ -
1164 else {
│ │ │ │ -
1165 // only try .mm so we do not ignore potential errors
│ │ │ │ -
1166 rfilename = pureFilename + ".mm";
│ │ │ │ -
1167 file.open(rfilename.c_str());
│ │ │ │ -
1168 if(!file)
│ │ │ │ -
1169 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ -
1170 }
│ │ │ │ -
1171
│ │ │ │ -
1172 file.setf(std::ios::scientific,std::ios::floatfield);
│ │ │ │ -
1173 if(prec>0)
│ │ │ │ -
1174 file.precision(prec);
│ │ │ │ -
1175 writeMatrixMarket(matrix, file);
│ │ │ │ -
1176 file.close();
│ │ │ │ -
1177 }
│ │ │ │ -
│ │ │ │ -
1178
│ │ │ │ -
1179#if HAVE_MPI
│ │ │ │ -
1194 template<typename M, typename G, typename L>
│ │ │ │ -
│ │ │ │ -
1195 void storeMatrixMarket(const M& matrix,
│ │ │ │ -
1196 std::string filename,
│ │ │ │ - │ │ │ │ -
1198 bool storeIndices=true,
│ │ │ │ -
1199 int prec=default_precision)
│ │ │ │ -
1200 {
│ │ │ │ -
1201 // Get our rank
│ │ │ │ -
1202 int rank = comm.communicator().rank();
│ │ │ │ -
1203 // Write the local matrix
│ │ │ │ -
1204 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ -
1205 std::string rfilename;
│ │ │ │ -
1206 std::ofstream file;
│ │ │ │ -
1207 if (extension != "") {
│ │ │ │ -
1208 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
│ │ │ │ -
1209 file.open(rfilename.c_str());
│ │ │ │ -
1210 dverb<< rfilename <<std::endl;
│ │ │ │ -
1211 if(!file)
│ │ │ │ -
1212 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ -
1213 }
│ │ │ │ -
1214 else {
│ │ │ │ -
1215 // only try .mm so we do not ignore potential errors
│ │ │ │ -
1216 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
│ │ │ │ -
1217 file.open(rfilename.c_str());
│ │ │ │ -
1218 dverb<< rfilename <<std::endl;
│ │ │ │ -
1219 if(!file)
│ │ │ │ -
1220 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ -
1221 }
│ │ │ │ -
1222 file.setf(std::ios::scientific,std::ios::floatfield);
│ │ │ │ -
1223 if(prec>0)
│ │ │ │ -
1224 file.precision(prec);
│ │ │ │ -
1225 writeMatrixMarket(matrix, file);
│ │ │ │ -
1226 file.close();
│ │ │ │ -
1227
│ │ │ │ -
1228 if(!storeIndices)
│ │ │ │ -
1229 return;
│ │ │ │ -
1230
│ │ │ │ -
1231 // Write the global to local index mapping
│ │ │ │ -
1232 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
│ │ │ │ -
1233 file.open(rfilename.c_str());
│ │ │ │ -
1234 if(!file)
│ │ │ │ -
1235 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
│ │ │ │ -
1236 file.setf(std::ios::scientific,std::ios::floatfield);
│ │ │ │ - │ │ │ │ -
1238 typedef typename IndexSet::const_iterator Iterator;
│ │ │ │ -
1239 for(Iterator iter = comm.indexSet().begin();
│ │ │ │ -
1240 iter != comm.indexSet().end(); ++iter) {
│ │ │ │ -
1241 file << iter->global()<<" "<<(std::size_t)iter->local()<<" "
│ │ │ │ -
1242 <<(int)iter->local().attribute()<<" "<<(int)iter->local().isPublic()<<std::endl;
│ │ │ │ -
1243 }
│ │ │ │ -
1244 // Store neighbour information for efficient remote indices setup.
│ │ │ │ -
1245 file<<"neighbours:";
│ │ │ │ -
1246 const std::set<int>& neighbours=comm.remoteIndices().getNeighbours();
│ │ │ │ -
1247 typedef std::set<int>::const_iterator SIter;
│ │ │ │ -
1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end(); ++neighbour) {
│ │ │ │ -
1249 file<<" "<< *neighbour;
│ │ │ │ -
1250 }
│ │ │ │ -
1251 file.close();
│ │ │ │ -
1252 }
│ │ │ │ -
│ │ │ │ -
1253
│ │ │ │ -
1268 template<typename M, typename G, typename L>
│ │ │ │ -
│ │ │ │ -
1269 void loadMatrixMarket(M& matrix,
│ │ │ │ -
1270 const std::string& filename,
│ │ │ │ - │ │ │ │ -
1272 bool readIndices=true)
│ │ │ │ -
1273 {
│ │ │ │ -
1274 using namespace MatrixMarketImpl;
│ │ │ │ -
1275
│ │ │ │ - │ │ │ │ -
1277 typedef typename LocalIndexT::Attribute Attribute;
│ │ │ │ -
1278 // Get our rank
│ │ │ │ -
1279 int rank = comm.communicator().rank();
│ │ │ │ -
1280 // load local matrix
│ │ │ │ -
1281 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ -
1282 std::string rfilename;
│ │ │ │ -
1283 std::ifstream file;
│ │ │ │ -
1284 if (extension != "") {
│ │ │ │ -
1285 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
│ │ │ │ -
1286 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ -
1287 dverb<< rfilename <<std::endl;
│ │ │ │ -
1288 if(!file)
│ │ │ │ -
1289 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ -
1290 }
│ │ │ │ -
1291 else {
│ │ │ │ -
1292 // try both .mm and .mtx
│ │ │ │ -
1293 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
│ │ │ │ -
1294 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ -
1295 if(!file) {
│ │ │ │ -
1296 rfilename = pureFilename + "_" + std::to_string(rank) + ".mtx";
│ │ │ │ -
1297 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ -
1298 dverb<< rfilename <<std::endl;
│ │ │ │ -
1299 if(!file)
│ │ │ │ -
1300 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ -
1301 }
│ │ │ │ -
1302 }
│ │ │ │ -
1303 readMatrixMarket(matrix,file);
│ │ │ │ -
1304 file.close();
│ │ │ │ -
1305
│ │ │ │ -
1306 if(!readIndices)
│ │ │ │ -
1307 return;
│ │ │ │ -
1308
│ │ │ │ -
1309 // read indices
│ │ │ │ - │ │ │ │ -
1311 IndexSet& pis=comm.pis;
│ │ │ │ -
1312 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
│ │ │ │ -
1313 file.open(rfilename.c_str());
│ │ │ │ -
1314 if(!file)
│ │ │ │ -
1315 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ -
1316 if(pis.size()!=0)
│ │ │ │ -
1317 DUNE_THROW(InvalidIndexSetState, "Index set is not empty!");
│ │ │ │ -
1318
│ │ │ │ -
1319 pis.beginResize();
│ │ │ │ -
1320 while(!file.eof() && file.peek()!='n') {
│ │ │ │ -
1321 G g;
│ │ │ │ -
1322 file >>g;
│ │ │ │ -
1323 std::size_t l;
│ │ │ │ -
1324 file >>l;
│ │ │ │ -
1325 int c;
│ │ │ │ -
1326 file >>c;
│ │ │ │ -
1327 bool b;
│ │ │ │ -
1328 file >> b;
│ │ │ │ -
1329 pis.add(g,LocalIndexT(l,Attribute(c),b));
│ │ │ │ -
1330 lineFeed(file);
│ │ │ │ -
1331 }
│ │ │ │ -
1332 pis.endResize();
│ │ │ │ -
1333 if(!file.eof()) {
│ │ │ │ -
1334 // read neighbours
│ │ │ │ -
1335 std::string s;
│ │ │ │ -
1336 file>>s;
│ │ │ │ -
1337 if(s!="neighbours:")
│ │ │ │ -
1338 DUNE_THROW(MatrixMarketFormatError, "was expecting the string: \"neighbours:\"");
│ │ │ │ -
1339 std::set<int> nb;
│ │ │ │ -
1340 while(!file.eof()) {
│ │ │ │ -
1341 int i;
│ │ │ │ -
1342 file >> i;
│ │ │ │ -
1343 nb.insert(i);
│ │ │ │ -
1344 }
│ │ │ │ -
1345 file.close();
│ │ │ │ -
1346 comm.ri.setNeighbours(nb);
│ │ │ │ -
1347 }
│ │ │ │ -
1348 comm.ri.template rebuild<false>();
│ │ │ │ -
1349 }
│ │ │ │ -
│ │ │ │ -
1350
│ │ │ │ -
1351 #endif
│ │ │ │ -
1352
│ │ │ │ -
1363 template<typename M>
│ │ │ │ -
│ │ │ │ -
1364 void loadMatrixMarket(M& matrix,
│ │ │ │ -
1365 const std::string& filename)
│ │ │ │ -
1366 {
│ │ │ │ -
1367 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
│ │ │ │ -
1368 std::string rfilename;
│ │ │ │ -
1369 std::ifstream file;
│ │ │ │ -
1370 if (extension != "") {
│ │ │ │ -
1371 rfilename = pureFilename + extension;
│ │ │ │ -
1372 file.open(rfilename.c_str());
│ │ │ │ -
1373 if(!file)
│ │ │ │ -
1374 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ -
1375 }
│ │ │ │ -
1376 else {
│ │ │ │ -
1377 // try both .mm and .mtx
│ │ │ │ -
1378 rfilename = pureFilename + ".mm";
│ │ │ │ -
1379 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ -
1380 if(!file) {
│ │ │ │ -
1381 rfilename = pureFilename + ".mtx";
│ │ │ │ -
1382 file.open(rfilename.c_str(), std::ios::in);
│ │ │ │ -
1383 if(!file)
│ │ │ │ -
1384 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
│ │ │ │ -
1385 }
│ │ │ │ -
1386 }
│ │ │ │ -
1387 readMatrixMarket(matrix,file);
│ │ │ │ -
1388 file.close();
│ │ │ │ -
1389 }
│ │ │ │ -
│ │ │ │ -
1390
│ │ │ │ -
1392}
│ │ │ │ -
1393#endif
│ │ │ │ -
Some handy generic functions for ISTL matrices.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
Get the number of nonzero fields in the matrix.
Definition matrixutils.hh:119
│ │ │ │ -
void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr)
Reads a BlockVector from a matrix market file.
Definition matrixmarket.hh:930
│ │ │ │ -
void storeMatrixMarket(const M &matrix, std::string filename, int prec=default_precision)
Stores a parallel matrix/vector in matrix market format in a file.
Definition matrixmarket.hh:1151
│ │ │ │ -
void loadMatrixMarket(M &matrix, const std::string &filename, OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true)
Load a parallel matrix/vector stored in matrix market format.
Definition matrixmarket.hh:1269
│ │ │ │ -
std::size_t countEntries(const BlockVector< T, A > &vector)
Definition matrixmarket.hh:1076
│ │ │ │ -
void writeMatrixMarket(const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &)
Definition matrixmarket.hh:1089
│ │ │ │ -
void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std::integral_constant< int, 1 > &, size_t lane)
Definition matrixmarket.hh:1049
│ │ │ │ -
static const int default_precision
Definition matrixmarket.hh:1138
│ │ │ │ -
void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t size, std::istream &istr, size_t lane)
Definition matrixmarket.hh:900
│ │ │ │ -
void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl::MMHeader &header, std::istream &istr, bool isVector)
Definition matrixmarket.hh:871
│ │ │ │ -
void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx, std::ostream &ostr)
Definition matrixmarket.hh:1030
│ │ │ │ +
299 copyToBCCSMatrix(initializer, mat);
│ │ │ │ +
300 }
│ │ │ │ +
│ │ │ │ +
301
│ │ │ │ +
│ │ │ │ +
303 virtual void free()
│ │ │ │ +
304 {
│ │ │ │ +
305 ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>::free();
│ │ │ │ +
306 SUPERLU_FREE(A.Store);
│ │ │ │ +
307 }
│ │ │ │ +
│ │ │ │ +
308 private:
│ │ │ │ +
309 SuperMatrix A;
│ │ │ │ +
310 };
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
312 template<class B, class A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
314 : public ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>
│ │ │ │ +
315 {
│ │ │ │ +
316 template<class I, class S, class D>
│ │ │ │ + │ │ │ │ +
318 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
321
│ │ │ │ +
│ │ │ │ +
322 SuperMatrixInitializer(SuperLUMatrix& lum) : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>(lum)
│ │ │ │ +
323 ,slumat(&lum)
│ │ │ │ +
324 {}
│ │ │ │ +
│ │ │ │ +
325
│ │ │ │ +
│ │ │ │ +
326 SuperMatrixInitializer() : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>()
│ │ │ │ +
327 {}
│ │ │ │ +
│ │ │ │ +
328
│ │ │ │ +
│ │ │ │ +
329 virtual void createMatrix() const
│ │ │ │ +
330 {
│ │ │ │ +
331 ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>::createMatrix();
│ │ │ │ + │ │ │ │ +
333 ::create(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],
│ │ │ │ +
334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,
│ │ │ │ +
335 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
│ │ │ │ +
336 }
│ │ │ │ +
│ │ │ │ +
337 private:
│ │ │ │ +
338 SuperLUMatrix* slumat;
│ │ │ │ +
339 };
│ │ │ │ +
│ │ │ │ +
340}
│ │ │ │ +
341#endif // HAVE_SUPERLU
│ │ │ │ +
342#endif
│ │ │ │ + │ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::tuple< std::size_t, std::size_t, std::size_t > calculateNNZ(std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader &header)
Definition matrixmarket.hh:547
│ │ │ │ -
bool operator<(const IndexData< T > &i1, const IndexData< T > &i2)
LessThan operator.
Definition matrixmarket.hh:630
│ │ │ │ -
LineType
Definition matrixmarket.hh:296
│ │ │ │ -
@ DATA
Definition matrixmarket.hh:296
│ │ │ │ -
@ MM_HEADER
Definition matrixmarket.hh:296
│ │ │ │ -
@ MM_ISTLSTRUCT
Definition matrixmarket.hh:296
│ │ │ │ -
bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader)
Definition matrixmarket.hh:353
│ │ │ │ -
void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file, std::size_t entries, const MMHeader &mmHeader, const D &)
Definition matrixmarket.hh:765
│ │ │ │ -
MM_TYPE
Definition matrixmarket.hh:299
│ │ │ │ -
@ array_type
Definition matrixmarket.hh:299
│ │ │ │ -
@ coordinate_type
Definition matrixmarket.hh:299
│ │ │ │ -
@ unknown_type
Definition matrixmarket.hh:299
│ │ │ │ -
std::istream & operator>>(std::istream &is, NumericWrapper< T > &num)
Definition matrixmarket.hh:614
│ │ │ │ -
void skipComments(std::istream &file)
Definition matrixmarket.hh:339
│ │ │ │ -
bool lineFeed(std::istream &file)
Definition matrixmarket.hh:315
│ │ │ │ -
@ MM_MAX_LINE_LENGTH
Definition matrixmarket.hh:297
│ │ │ │ -
MM_STRUCTURE
Definition matrixmarket.hh:303
│ │ │ │ -
@ skew_symmetric
Definition matrixmarket.hh:303
│ │ │ │ -
@ general
Definition matrixmarket.hh:303
│ │ │ │ -
@ hermitian
Definition matrixmarket.hh:303
│ │ │ │ -
@ unknown_structure
Definition matrixmarket.hh:303
│ │ │ │ -
@ symmetric
Definition matrixmarket.hh:303
│ │ │ │ -
MM_CTYPE
Definition matrixmarket.hh:301
│ │ │ │ -
@ unknown_ctype
Definition matrixmarket.hh:301
│ │ │ │ -
@ pattern
Definition matrixmarket.hh:301
│ │ │ │ -
@ complex_type
Definition matrixmarket.hh:301
│ │ │ │ -
@ double_type
Definition matrixmarket.hh:301
│ │ │ │ -
@ integer_type
Definition matrixmarket.hh:301
│ │ │ │ -
std::enable_if_t<!is_complex< T >::value, T > conj(const T &r)
Definition matrixmarket.hh:733
│ │ │ │ -
std::tuple< std::string, std::string > splitFilename(const std::string &filename)
Definition matrixmarket.hh:852
│ │ │ │ +
Initializer for SuperLU Matrices representing the subdomains.
Definition overlappingschwarz.hh:47
│ │ │ │ +
static auto coldim(const M &A)
Definition matrixutils.hh:219
│ │ │ │ +
static auto rowdim(const M &A)
Definition matrixutils.hh:214
│ │ │ │
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
Iterator begin()
Get iterator to first row.
Definition bcrsmatrix.hh:675
│ │ │ │ -
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ -
CreateIterator createend()
get create iterator pointing to one after the last block
Definition bcrsmatrix.hh:1103
│ │ │ │ -
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │ -
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ -
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ -
void setBuildMode(BuildMode bm)
Sets the build mode of the matrix.
Definition bcrsmatrix.hh:833
│ │ │ │ -
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
void resize(size_type size)
Resize the vector.
Definition bvector.hh:503
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ -
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ -
Helper metaprogram to get the matrix market string representation of the numeric type.
Definition matrixmarket.hh:76
│ │ │ │ -
@ is_numeric
Whether T is a supported numeric type.
Definition matrixmarket.hh:81
│ │ │ │ -
static std::string str()
Definition matrixmarket.hh:95
│ │ │ │ -
static std::string str()
Definition matrixmarket.hh:111
│ │ │ │ -
static std::string str()
Definition matrixmarket.hh:127
│ │ │ │ -
static std::string str()
Definition matrixmarket.hh:143
│ │ │ │ -
static std::string str()
Definition matrixmarket.hh:159
│ │ │ │ -
Meta program to write the correct Matrix Market header.
Definition matrixmarket.hh:174
│ │ │ │ -
static void print(std::ostream &os)
Definition matrixmarket.hh:179
│ │ │ │ -
static void print(std::ostream &os)
Definition matrixmarket.hh:189
│ │ │ │ -
static void print(std::ostream &os)
Definition matrixmarket.hh:199
│ │ │ │ -
static void print(std::ostream &os)
Definition matrixmarket.hh:209
│ │ │ │ -
Metaprogram for writing the ISTL block structure header.
Definition matrixmarket.hh:225
│ │ │ │ -
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:233
│ │ │ │ -
BlockVector< T, A > M
Definition matrixmarket.hh:230
│ │ │ │ -
BlockVector< FieldVector< T, i >, A > M
Definition matrixmarket.hh:243
│ │ │ │ -
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:245
│ │ │ │ -
BCRSMatrix< T, A > M
Definition matrixmarket.hh:255
│ │ │ │ -
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:258
│ │ │ │ -
BCRSMatrix< FieldMatrix< T, i, j >, A > M
Definition matrixmarket.hh:268
│ │ │ │ -
static void print(std::ostream &os, const M &)
Definition matrixmarket.hh:270
│ │ │ │ -
static void print(std::ostream &os, const M &m)
Definition matrixmarket.hh:283
│ │ │ │ -
FieldMatrix< T, i, j > M
Definition matrixmarket.hh:281
│ │ │ │ -
static void print(std::ostream &os, const M &m)
Definition matrixmarket.hh:292
│ │ │ │ -
FieldVector< T, i > M
Definition matrixmarket.hh:290
│ │ │ │ -
Definition matrixmarket.hh:306
│ │ │ │ -
MM_STRUCTURE structure
Definition matrixmarket.hh:312
│ │ │ │ -
MM_TYPE type
Definition matrixmarket.hh:310
│ │ │ │ -
MMHeader()
Definition matrixmarket.hh:307
│ │ │ │ -
MM_CTYPE ctype
Definition matrixmarket.hh:311
│ │ │ │ -
Definition matrixmarket.hh:578
│ │ │ │ -
std::size_t index
Definition matrixmarket.hh:579
│ │ │ │ -
a wrapper class of numeric values.
Definition matrixmarket.hh:595
│ │ │ │ -
T number
Definition matrixmarket.hh:596
│ │ │ │ -
Utility class for marking the pattern type of the MatrixMarket matrices.
Definition matrixmarket.hh:607
│ │ │ │ -
Functor to the data values of the matrix.
Definition matrixmarket.hh:677
│ │ │ │ -
void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< T > &matrix)
Sets the matrix values.
Definition matrixmarket.hh:684
│ │ │ │ -
void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix)
Sets the matrix values.
Definition matrixmarket.hh:702
│ │ │ │ -
void operator()(const std::vector< std::set< IndexData< PatternDummy > > > &rows, M &matrix)
Definition matrixmarket.hh:723
│ │ │ │ -
Definition matrixmarket.hh:728
│ │ │ │ -
Definition matrixmarket.hh:744
│ │ │ │ -
Definition matrixmarket.hh:868
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ -
Test whether a type is an ISTL Matrix.
Definition matrixutils.hh:504
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:462
│ │ │ │ -
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ -
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ -
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │ +
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ +
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ +
Definition overlappingschwarz.hh:694
│ │ │ │ +
SuperLu Solver.
Definition superlu.hh:271
│ │ │ │ +
Definition supermatrix.hh:26
│ │ │ │ +
Definition supermatrix.hh:30
│ │ │ │ +
Definition supermatrix.hh:126
│ │ │ │ +
static const Dtype_t type
Definition supermatrix.hh:127
│ │ │ │ +
Definition supermatrix.hh:132
│ │ │ │ +
double float_type
Definition supermatrix.hh:144
│ │ │ │ +
float float_type
Definition supermatrix.hh:151
│ │ │ │ +
double float_type
Definition supermatrix.hh:158
│ │ │ │ +
float float_type
Definition supermatrix.hh:165
│ │ │ │ +
Utility class for converting an ISTL Matrix into a SuperLU Matrix.
Definition supermatrix.hh:175
│ │ │ │ +
Definition supermatrix.hh:179
│ │ │ │ +
virtual void free()
free allocated space.
Definition supermatrix.hh:303
│ │ │ │ +
SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix< BCRSMatrix< B, TA > > &mat)
Definition supermatrix.hh:256
│ │ │ │ +
SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA > &mat)
Definition supermatrix.hh:237
│ │ │ │ +
SuperLUMatrix(const Matrix &mat)
Constructor that initializes the data.
Definition supermatrix.hh:212
│ │ │ │ +
virtual void setMatrix(const Matrix &mat)
Initialize data from given matrix.
Definition supermatrix.hh:293
│ │ │ │ +
SuperLUMatrix()
Definition supermatrix.hh:215
│ │ │ │ +
Matrix::size_type size_type
Definition supermatrix.hh:206
│ │ │ │ +
BCRSMatrix< B, TA > Matrix
The type of the matrix to convert.
Definition supermatrix.hh:202
│ │ │ │ +
virtual void setMatrix(const Matrix &mat, const std::set< std::size_t > &mrs)
Initialize data from a given set of matrix rows and columns.
Definition supermatrix.hh:281
│ │ │ │ +
virtual ~SuperLUMatrix()
Destructor.
Definition supermatrix.hh:219
│ │ │ │ +
Dune::SuperLUMatrix< Matrix > SuperLUMatrix
Definition supermatrix.hh:320
│ │ │ │ +
BCRSMatrix< B, A > Matrix
Definition supermatrix.hh:319
│ │ │ │ +
SuperMatrixInitializer()
Definition supermatrix.hh:326
│ │ │ │ +
virtual void createMatrix() const
Definition supermatrix.hh:329
│ │ │ │ +
SuperMatrixInitializer(SuperLUMatrix &lum)
Definition supermatrix.hh:322
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1632 +1,461 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -matrixmarket.hh │ │ │ │ │ +supermatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MATRIXMARKET_HH │ │ │ │ │ -6#define DUNE_ISTL_MATRIXMARKET_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_SUPERMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_SUPERMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ +8#if HAVE_SUPERLU │ │ │ │ │ +9 │ │ │ │ │ +10#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +11#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ 15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ +16 │ │ │ │ │ +17#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +18 │ │ │ │ │ +19#include "_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h" │ │ │ │ │ +20 │ │ │ │ │ +21namespace _D_u_n_e │ │ │ │ │ +22{ │ │ │ │ │ 23 │ │ │ │ │ -24#include │ │ │ │ │ -25#include │ │ │ │ │ -26#include │ │ │ │ │ -27#include │ │ │ │ │ -28#include │ │ │ │ │ -29#include │ │ │ │ │ -30 │ │ │ │ │ -31#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -32#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -33#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_u_t_i_l_s_._h_h> // countNonZeros() │ │ │ │ │ -34#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -35 │ │ │ │ │ -36namespace _D_u_n_e │ │ │ │ │ -37{ │ │ │ │ │ -38 │ │ │ │ │ -_6_4 namespace MatrixMarketImpl │ │ │ │ │ -65 { │ │ │ │ │ -75 template │ │ │ │ │ -_7_6 struct _m_m___n_u_m_e_r_i_c___t_y_p_e { │ │ │ │ │ -77 enum { │ │ │ │ │ -81 _i_s___n_u_m_e_r_i_c=false │ │ │ │ │ -_8_2 }; │ │ │ │ │ -83 }; │ │ │ │ │ -84 │ │ │ │ │ -85 template<> │ │ │ │ │ -_8_6 struct _m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ -87 { │ │ │ │ │ -88 enum { │ │ │ │ │ -92 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ -_9_3 }; │ │ │ │ │ -94 │ │ │ │ │ -_9_5 static std::string _s_t_r() │ │ │ │ │ -96 { │ │ │ │ │ -97 return "integer"; │ │ │ │ │ -98 } │ │ │ │ │ -99 }; │ │ │ │ │ +24 template │ │ │ │ │ +_2_5 struct _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r │ │ │ │ │ +26 {}; │ │ │ │ │ +27 │ │ │ │ │ +28 template │ │ │ │ │ +_2_9 struct _S_u_p_e_r_M_a_t_r_i_x_P_r_i_n_t_e_r │ │ │ │ │ +30 {}; │ │ │ │ │ +31 │ │ │ │ │ +32#if __has_include("slu_sdefs.h") │ │ │ │ │ +33 template<> │ │ │ │ │ +34 struct _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r │ │ │ │ │ +35 { │ │ │ │ │ +36 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ +37 float *values, int *rowindex, int* colindex, │ │ │ │ │ +38 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +39 { │ │ │ │ │ +40 sCreate_CompCol_Matrix(_m_a_t, n, m, offset, values, rowindex, colindex, │ │ │ │ │ +41 stype, dtype, mtype); │ │ │ │ │ +42 } │ │ │ │ │ +43 }; │ │ │ │ │ +44 │ │ │ │ │ +45 template<> │ │ │ │ │ +46 struct SuperMatrixPrinter │ │ │ │ │ +47 { │ │ │ │ │ +48 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ +49 { │ │ │ │ │ +50 sPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ +51 } │ │ │ │ │ +52 }; │ │ │ │ │ +53#endif │ │ │ │ │ +54 │ │ │ │ │ +55#if __has_include("slu_ddefs.h") │ │ │ │ │ +56 template<> │ │ │ │ │ +57 struct SuperMatrixCreateSparseChooser │ │ │ │ │ +58 { │ │ │ │ │ +59 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ +60 double *values, int *rowindex, int* colindex, │ │ │ │ │ +61 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +62 { │ │ │ │ │ +63 dCreate_CompCol_Matrix(_m_a_t, n, m, offset, values, rowindex, colindex, │ │ │ │ │ +64 stype, dtype, mtype); │ │ │ │ │ +65 } │ │ │ │ │ +66 }; │ │ │ │ │ +67 │ │ │ │ │ +68 template<> │ │ │ │ │ +69 struct SuperMatrixPrinter │ │ │ │ │ +70 { │ │ │ │ │ +71 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ +72 { │ │ │ │ │ +73 dPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ +74 } │ │ │ │ │ +75 }; │ │ │ │ │ +76#endif │ │ │ │ │ +77 │ │ │ │ │ +78#if __has_include("slu_cdefs.h") │ │ │ │ │ +79 template<> │ │ │ │ │ +80 struct SuperMatrixCreateSparseChooser<_s_t_d::complex > │ │ │ │ │ +81 { │ │ │ │ │ +82 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ +83 std::complex *values, int *rowindex, int* colindex, │ │ │ │ │ +84 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +85 { │ │ │ │ │ +86 cCreate_CompCol_Matrix(_m_a_t, n, m, offset, reinterpret_cast< ::complex*> │ │ │ │ │ +(values), │ │ │ │ │ +87 rowindex, colindex, stype, dtype, mtype); │ │ │ │ │ +88 } │ │ │ │ │ +89 }; │ │ │ │ │ +90 │ │ │ │ │ +91 template<> │ │ │ │ │ +92 struct SuperMatrixPrinter<_s_t_d::complex > │ │ │ │ │ +93 { │ │ │ │ │ +94 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ +95 { │ │ │ │ │ +96 cPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ +97 } │ │ │ │ │ +98 }; │ │ │ │ │ +99#endif │ │ │ │ │ 100 │ │ │ │ │ -101 template<> │ │ │ │ │ -_1_0_2 struct _m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ -103 { │ │ │ │ │ -104 enum { │ │ │ │ │ -108 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ -_1_0_9 }; │ │ │ │ │ -110 │ │ │ │ │ -_1_1_1 static std::string _s_t_r() │ │ │ │ │ -112 { │ │ │ │ │ -113 return "real"; │ │ │ │ │ -114 } │ │ │ │ │ -115 }; │ │ │ │ │ -116 │ │ │ │ │ -117 template<> │ │ │ │ │ -_1_1_8 struct _m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ -119 { │ │ │ │ │ -120 enum { │ │ │ │ │ -124 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ -_1_2_5 }; │ │ │ │ │ -126 │ │ │ │ │ -_1_2_7 static std::string _s_t_r() │ │ │ │ │ -128 { │ │ │ │ │ -129 return "real"; │ │ │ │ │ -130 } │ │ │ │ │ -131 }; │ │ │ │ │ -132 │ │ │ │ │ -133 template<> │ │ │ │ │ -_1_3_4 struct _m_m___n_u_m_e_r_i_c___t_y_p_e<_s_t_d::complex > │ │ │ │ │ -135 { │ │ │ │ │ -136 enum { │ │ │ │ │ -140 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ -_1_4_1 }; │ │ │ │ │ -142 │ │ │ │ │ -_1_4_3 static std::string _s_t_r() │ │ │ │ │ -144 { │ │ │ │ │ -145 return "complex"; │ │ │ │ │ -146 } │ │ │ │ │ -147 }; │ │ │ │ │ -148 │ │ │ │ │ -149 template<> │ │ │ │ │ -_1_5_0 struct _m_m___n_u_m_e_r_i_c___t_y_p_e<_s_t_d::complex > │ │ │ │ │ -151 { │ │ │ │ │ -152 enum { │ │ │ │ │ -156 _i_s___n_u_m_e_r_i_c=true │ │ │ │ │ -_1_5_7 }; │ │ │ │ │ -158 │ │ │ │ │ -_1_5_9 static std::string _s_t_r() │ │ │ │ │ -160 { │ │ │ │ │ -161 return "complex"; │ │ │ │ │ -162 } │ │ │ │ │ -163 }; │ │ │ │ │ -164 │ │ │ │ │ +101#if __has_include("slu_zdefs.h") │ │ │ │ │ +102 template<> │ │ │ │ │ +103 struct SuperMatrixCreateSparseChooser<_s_t_d::complex > │ │ │ │ │ +104 { │ │ │ │ │ +105 static void create(SuperMatrix *_m_a_t, int n, int m, int offset, │ │ │ │ │ +106 std::complex *values, int *rowindex, int* colindex, │ │ │ │ │ +107 Stype_t stype, Dtype_t dtype, Mtype_t mtype) │ │ │ │ │ +108 { │ │ │ │ │ +109 zCreate_CompCol_Matrix(_m_a_t, n, m, offset, reinterpret_cast │ │ │ │ │ +(values), │ │ │ │ │ +110 rowindex, colindex, stype, dtype, mtype); │ │ │ │ │ +111 } │ │ │ │ │ +112 }; │ │ │ │ │ +113 │ │ │ │ │ +114 template<> │ │ │ │ │ +115 struct SuperMatrixPrinter<_s_t_d::complex > │ │ │ │ │ +116 { │ │ │ │ │ +117 static void print(char* name, SuperMatrix* _m_a_t) │ │ │ │ │ +118 { │ │ │ │ │ +119 zPrint_CompCol_Matrix(name, _m_a_t); │ │ │ │ │ +120 } │ │ │ │ │ +121 }; │ │ │ │ │ +122#endif │ │ │ │ │ +123 │ │ │ │ │ +124 template │ │ │ │ │ +_1_2_5 struct _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +126 { │ │ │ │ │ +_1_2_7 static const Dtype_t _t_y_p_e; │ │ │ │ │ +128 }; │ │ │ │ │ +129 │ │ │ │ │ +130 template │ │ │ │ │ +_1_3_1 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +132 {}; │ │ │ │ │ +133 │ │ │ │ │ +134 template │ │ │ │ │ +135 const Dtype_t _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_T_>_:_:_t_y_p_e = │ │ │ │ │ +136 std::is_same::value ? SLU_S : │ │ │ │ │ +137 ( std::is_same >::value ? SLU_Z : │ │ │ │ │ +138 ( std::is_same >::value ? SLU_C : SLU_D )); │ │ │ │ │ +139 │ │ │ │ │ +140 template<> │ │ │ │ │ +_1_4_1 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +142 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +143 { │ │ │ │ │ +_1_4_4 typedef double _f_l_o_a_t___t_y_p_e; │ │ │ │ │ +145 }; │ │ │ │ │ +146 │ │ │ │ │ +147 template<> │ │ │ │ │ +_1_4_8 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +149 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +150 { │ │ │ │ │ +_1_5_1 typedef float _f_l_o_a_t___t_y_p_e; │ │ │ │ │ +152 }; │ │ │ │ │ +153 │ │ │ │ │ +154 template<> │ │ │ │ │ +_1_5_5 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e<_s_t_d::complex > │ │ │ │ │ +156 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e > │ │ │ │ │ +157 { │ │ │ │ │ +_1_5_8 typedef double _f_l_o_a_t___t_y_p_e; │ │ │ │ │ +159 }; │ │ │ │ │ +160 │ │ │ │ │ +161 template<> │ │ │ │ │ +_1_6_2 struct _G_e_t_S_u_p_e_r_L_U_T_y_p_e<_s_t_d::complex > │ │ │ │ │ +163 : public _B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e > │ │ │ │ │ +164 { │ │ │ │ │ +_1_6_5 typedef float _f_l_o_a_t___t_y_p_e; │ │ │ │ │ +166 │ │ │ │ │ +167 }; │ │ │ │ │ +168 │ │ │ │ │ 173 template │ │ │ │ │ -_1_7_4 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r; │ │ │ │ │ -175 │ │ │ │ │ -176 template │ │ │ │ │ -_1_7_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -178 { │ │ │ │ │ -_1_7_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ -180 { │ │ │ │ │ -181 os<<"%%MatrixMarket matrix coordinate "; │ │ │ │ │ -182 os<:: │ │ │ │ │ -field_type>>::str()<<" general"< │ │ │ │ │ -_1_8_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r<_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ -188 { │ │ │ │ │ -_1_8_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ -190 { │ │ │ │ │ -191 os<<"%%MatrixMarket matrix array "; │ │ │ │ │ -192 os<:: │ │ │ │ │ -field_type>>::str()<<" general"< │ │ │ │ │ -_1_9_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r > │ │ │ │ │ -198 { │ │ │ │ │ -_1_9_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ -200 { │ │ │ │ │ -201 os<<"%%MatrixMarket matrix array "; │ │ │ │ │ -202 os<::str()<<" general"< │ │ │ │ │ +_1_7_8 struct _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +179 {}; │ │ │ │ │ +180 │ │ │ │ │ +181 template │ │ │ │ │ +182 class _S_u_p_e_r_L_U; │ │ │ │ │ +183 │ │ │ │ │ +184 template │ │ │ │ │ +185 class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ +186 │ │ │ │ │ +187 template │ │ │ │ │ +188 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r; │ │ │ │ │ +189 │ │ │ │ │ +193 template │ │ │ │ │ +_1_9_4 class _S_u_p_e_r_L_U_M_a_t_r_i_x<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +195 : public ISTL::Impl::BCCSMatrix::field_type, int> │ │ │ │ │ +196 { │ │ │ │ │ +197 template │ │ │ │ │ +_1_9_8 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ +199 friend struct _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r<_B_C_R_S_M_a_t_r_i_x >; │ │ │ │ │ +200 public: │ │ │ │ │ +_2_0_2 typedef _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> _M_a_t_r_i_x; │ │ │ │ │ +203 │ │ │ │ │ +204 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_S_u_p_e_r_L_U<_M_a_t_r_i_x>, true>; │ │ │ │ │ 205 │ │ │ │ │ -206 template │ │ │ │ │ -_2_0_7 struct _m_m___h_e_a_d_e_r___p_r_i_n_t_e_r<_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -208 { │ │ │ │ │ -_2_0_9 static void _p_r_i_n_t(std::ostream& os) │ │ │ │ │ -210 { │ │ │ │ │ -211 os<<"%%MatrixMarket matrix array "; │ │ │ │ │ -212 os<::str()<<" general"< │ │ │ │ │ -_2_2_5 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r; │ │ │ │ │ -226 │ │ │ │ │ -227 template │ │ │ │ │ -_2_2_8 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ -229 { │ │ │ │ │ -_2_3_0 typedef _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> _M; │ │ │ │ │ -231 static_assert(IsNumber::value, "Only scalar entries are expected │ │ │ │ │ -here!"); │ │ │ │ │ -232 │ │ │ │ │ -_2_3_3 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ -234 { │ │ │ │ │ -235 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ -236 os<<"1 1"< │ │ │ │ │ -_2_4_1 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_l_o_c_k_V_e_c_t_o_r,A> > │ │ │ │ │ -242 { │ │ │ │ │ -_2_4_3 typedef _B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_T_,_i_>,A> _M; │ │ │ │ │ -244 │ │ │ │ │ -_2_4_5 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ -246 { │ │ │ │ │ -247 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ -248 os< │ │ │ │ │ -_2_5_3 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -254 { │ │ │ │ │ -_2_5_5 typedef _B_C_R_S_M_a_t_r_i_x_<_T_,_A_> _M; │ │ │ │ │ -256 static_assert(IsNumber::value, "Only scalar entries are expected │ │ │ │ │ -here!"); │ │ │ │ │ -257 │ │ │ │ │ -_2_5_8 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ -259 { │ │ │ │ │ -260 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ -261 os<<"1 1"< │ │ │ │ │ -_2_6_6 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > │ │ │ │ │ -267 { │ │ │ │ │ -_2_6_8 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_i_,_j_>,A> _M; │ │ │ │ │ -269 │ │ │ │ │ -_2_7_0 static void _p_r_i_n_t(std::ostream& os, const _M&) │ │ │ │ │ -271 { │ │ │ │ │ -272 os<<"% ISTL_STRUCT blocked "; │ │ │ │ │ -273 os< │ │ │ │ │ -_2_7_9 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r<_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ -280 { │ │ │ │ │ -_2_8_1 typedef _F_i_e_l_d_M_a_t_r_i_x_<_T_,_i_,_j_> _M; │ │ │ │ │ -282 │ │ │ │ │ -_2_8_3 static void _p_r_i_n_t(std::ostream& os, const _M& m) │ │ │ │ │ -284 {} │ │ │ │ │ -285 }; │ │ │ │ │ -286 │ │ │ │ │ -287 template │ │ │ │ │ -_2_8_8 struct _m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r > │ │ │ │ │ -289 { │ │ │ │ │ -_2_9_0 typedef FieldVector _M; │ │ │ │ │ +_2_0_6 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +207 │ │ │ │ │ +_2_1_2 explicit _S_u_p_e_r_L_U_M_a_t_r_i_x(const _M_a_t_r_i_x& _m_a_t) : ISTL::Impl:: │ │ │ │ │ +BCCSMatrix<_B_C_R_S_M_a_t_r_i_x, int>(_m_a_t) │ │ │ │ │ +213 {} │ │ │ │ │ +214 │ │ │ │ │ +_2_1_5 _S_u_p_e_r_L_U_M_a_t_r_i_x() : ISTL::Impl::BCCSMatrix:: │ │ │ │ │ +field_type, int>() │ │ │ │ │ +216 {} │ │ │ │ │ +217 │ │ │ │ │ +_2_1_9 virtual _~_S_u_p_e_r_L_U_M_a_t_r_i_x() │ │ │ │ │ +220 { │ │ │ │ │ +221 if (this->N_+this->M_*this->Nnz_ != 0) │ │ │ │ │ +222 free(); │ │ │ │ │ +223 } │ │ │ │ │ +224 │ │ │ │ │ +_2_2_6 operator SuperMatrix&() │ │ │ │ │ +227 { │ │ │ │ │ +228 return A; │ │ │ │ │ +229 } │ │ │ │ │ +230 │ │ │ │ │ +_2_3_2 operator const SuperMatrix&() const │ │ │ │ │ +233 { │ │ │ │ │ +234 return A; │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +_2_3_7 _S_u_p_e_r_L_U_M_a_t_r_i_x_<_B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> >& _o_p_e_r_a_t_o_r_=(const _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_>& _m_a_t) │ │ │ │ │ +238 { │ │ │ │ │ +239 if (this->N_ + this->M_ + this->Nnz_!=0) │ │ │ │ │ +240 free(); │ │ │ │ │ +241 │ │ │ │ │ +242 using _M_a_t_r_i_x = _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_>; │ │ │ │ │ +243 this->N_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t); │ │ │ │ │ +244 this->M_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t); │ │ │ │ │ +245 ISTL::Impl::BCCSMatrixInitializer initializer(*this); │ │ │ │ │ +246 │ │ │ │ │ +247 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ +248 │ │ │ │ │ +249 _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ +250_ _:_:_c_r_e_a_t_e(&A, this->N_, this->M_, this->colstart[this->N_], │ │ │ │ │ +251 this->values,this->rowindex, this->colstart, SLU_NC, │ │ │ │ │ +252 static_cast(_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_>_:_:_t_y_p_e), │ │ │ │ │ +SLU_GE); │ │ │ │ │ +253 return *this; │ │ │ │ │ +254 } │ │ │ │ │ +255 │ │ │ │ │ +_2_5_6 _S_u_p_e_r_L_U_M_a_t_r_i_x_<_B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> >& _o_p_e_r_a_t_o_r_=(const _S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +<_B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> >& _m_a_t) │ │ │ │ │ +257 { │ │ │ │ │ +258 if (this->N_ + this->M_ + this->Nnz_!=0) │ │ │ │ │ +259 free(); │ │ │ │ │ +260 │ │ │ │ │ +261 using _M_a_t_r_i_x = _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_>; │ │ │ │ │ +262 this->N_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t); │ │ │ │ │ +263 this->M_ = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t); │ │ │ │ │ +264 ISTL::Impl::BCCSMatrixInitializer initializer(*this); │ │ │ │ │ +265 │ │ │ │ │ +266 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ +267 │ │ │ │ │ +268 _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_B_> │ │ │ │ │ +269_ _:_:_c_r_e_a_t_e(&A, this->N_, this->M_, this->colstart[this->N_], │ │ │ │ │ +270 this->values,this->rowindex, this->colstart, SLU_NC, │ │ │ │ │ +271 static_cast(_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_B_>_:_:_t_y_p_e), SLU_GE); │ │ │ │ │ +272 return *this; │ │ │ │ │ +273 } │ │ │ │ │ +274 │ │ │ │ │ +_2_8_1 virtual void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& _m_a_t, const std::set& mrs) │ │ │ │ │ +282 { │ │ │ │ │ +283 if(this->N_+this->M_+this->Nnz_!=0) │ │ │ │ │ +284 free(); │ │ │ │ │ +285 this->N_=mrs.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e_>_:_:_r_o_w_d_i_m(* │ │ │ │ │ +(_m_a_t[0].begin())); │ │ │ │ │ +286 this->M_=mrs.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e_>_:_:_c_o_l_d_i_m(* │ │ │ │ │ +(_m_a_t[0].begin())); │ │ │ │ │ +287 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_M_a_t_r_i_x_> initializer(*this); │ │ │ │ │ +288 │ │ │ │ │ +289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_M_a_t_r_i_x,std:: │ │ │ │ │ +set >(_m_a_t,mrs)); │ │ │ │ │ +290 } │ │ │ │ │ 291 │ │ │ │ │ -_2_9_2 static void _p_r_i_n_t(std::ostream& os, const _M& m) │ │ │ │ │ -293 {} │ │ │ │ │ -294 }; │ │ │ │ │ -295 │ │ │ │ │ -_2_9_6 enum _L_i_n_e_T_y_p_e { _M_M___H_E_A_D_E_R, _M_M___I_S_T_L_S_T_R_U_C_T, _D_A_T_A }; │ │ │ │ │ -_2_9_7 enum { _M_M___M_A_X___L_I_N_E___L_E_N_G_T_H=1025 }; │ │ │ │ │ +_2_9_3 virtual void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& _m_a_t) │ │ │ │ │ +294 { │ │ │ │ │ +295 this->N_=_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(_m_a_t); │ │ │ │ │ +296 this->M_=_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(_m_a_t); │ │ │ │ │ +297 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_M_a_t_r_i_x_> initializer(*this); │ │ │ │ │ 298 │ │ │ │ │ -_2_9_9 enum _M_M___T_Y_P_E { _c_o_o_r_d_i_n_a_t_e___t_y_p_e, _a_r_r_a_y___t_y_p_e, _u_n_k_n_o_w_n___t_y_p_e }; │ │ │ │ │ -300 │ │ │ │ │ -_3_0_1 enum _M_M___C_T_Y_P_E { _i_n_t_e_g_e_r___t_y_p_e, _d_o_u_b_l_e___t_y_p_e, _c_o_m_p_l_e_x___t_y_p_e, _p_a_t_t_e_r_n, │ │ │ │ │ -_u_n_k_n_o_w_n___c_t_y_p_e }; │ │ │ │ │ -302 │ │ │ │ │ -_3_0_3 enum _M_M___S_T_R_U_C_T_U_R_E { _g_e_n_e_r_a_l, _s_y_m_m_e_t_r_i_c, _s_k_e_w___s_y_m_m_e_t_r_i_c, _h_e_r_m_i_t_i_a_n, │ │ │ │ │ -_u_n_k_n_o_w_n___s_t_r_u_c_t_u_r_e }; │ │ │ │ │ -304 │ │ │ │ │ -_3_0_5 struct _M_M_H_e_a_d_e_r │ │ │ │ │ -306 { │ │ │ │ │ -_3_0_7 _M_M_H_e_a_d_e_r() │ │ │ │ │ -308 : _t_y_p_e(_c_o_o_r_d_i_n_a_t_e___t_y_p_e), _c_t_y_p_e(_d_o_u_b_l_e___t_y_p_e), _s_t_r_u_c_t_u_r_e(_g_e_n_e_r_a_l) │ │ │ │ │ -309 {} │ │ │ │ │ -_3_1_0 _M_M___T_Y_P_E _t_y_p_e; │ │ │ │ │ -_3_1_1 _M_M___C_T_Y_P_E _c_t_y_p_e; │ │ │ │ │ -_3_1_2 _M_M___S_T_R_U_C_T_U_R_E _s_t_r_u_c_t_u_r_e; │ │ │ │ │ -313 }; │ │ │ │ │ -314 │ │ │ │ │ -_3_1_5 inline bool _l_i_n_e_F_e_e_d(std::istream& file) │ │ │ │ │ -316 { │ │ │ │ │ -317 char c; │ │ │ │ │ -318 if(!file.eof()) │ │ │ │ │ -319 c=file.peek(); │ │ │ │ │ -320 else │ │ │ │ │ -321 return false; │ │ │ │ │ -322 // ignore whitespace │ │ │ │ │ -323 while(c==' ') │ │ │ │ │ -324 { │ │ │ │ │ -325 file.get(); │ │ │ │ │ -326 if(file.eof()) │ │ │ │ │ -327 return false; │ │ │ │ │ -328 c=file.peek(); │ │ │ │ │ -329 } │ │ │ │ │ -330 │ │ │ │ │ -331 if(c=='\n') { │ │ │ │ │ -332 /* eat the line feed */ │ │ │ │ │ -333 file.get(); │ │ │ │ │ -334 return true; │ │ │ │ │ -335 } │ │ │ │ │ -336 return false; │ │ │ │ │ -337 } │ │ │ │ │ -338 │ │ │ │ │ -_3_3_9 inline void _s_k_i_p_C_o_m_m_e_n_t_s(std::istream& file) │ │ │ │ │ -340 { │ │ │ │ │ -341 _l_i_n_e_F_e_e_d(file); │ │ │ │ │ -342 char c=file.peek(); │ │ │ │ │ -343 // ignore comment lines │ │ │ │ │ -344 while(c=='%') │ │ │ │ │ -345 { │ │ │ │ │ -346 /* discard the rest of the line */ │ │ │ │ │ -347 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -348 c=file.peek(); │ │ │ │ │ -349 } │ │ │ │ │ -350 } │ │ │ │ │ -351 │ │ │ │ │ -352 │ │ │ │ │ -_3_5_3 inline bool _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t_B_a_n_n_e_r(std::istream& file, _M_M_H_e_a_d_e_r& mmHeader) │ │ │ │ │ -354 { │ │ │ │ │ -355 std::string buffer; │ │ │ │ │ -356 char c; │ │ │ │ │ -357 file >> buffer; │ │ │ │ │ -358 c=buffer[0]; │ │ │ │ │ -359 mmHeader=_M_M_H_e_a_d_e_r(); │ │ │ │ │ -360 if(c!='%') │ │ │ │ │ -361 return false; │ │ │ │ │ -362 dverb<::max(),'\n'); │ │ │ │ │ -367 return false; │ │ │ │ │ -368 } │ │ │ │ │ -369 │ │ │ │ │ -370 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ -371 /* premature end of line */ │ │ │ │ │ -372 return false; │ │ │ │ │ -373 │ │ │ │ │ -374 /* read the matrix_type */ │ │ │ │ │ -375 file >> buffer; │ │ │ │ │ -376 │ │ │ │ │ -377 if(buffer != "matrix") │ │ │ │ │ -378 { │ │ │ │ │ -379 /* discard the rest of the line */ │ │ │ │ │ -380 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -381 return false; │ │ │ │ │ -382 } │ │ │ │ │ -383 │ │ │ │ │ -384 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ -385 /* premature end of line */ │ │ │ │ │ -386 return false; │ │ │ │ │ -387 │ │ │ │ │ -388 /* The type of the matrix */ │ │ │ │ │ -389 file >> buffer; │ │ │ │ │ -390 │ │ │ │ │ -391 if(buffer.empty()) │ │ │ │ │ -392 return false; │ │ │ │ │ -393 │ │ │ │ │ -394 std::transform(buffer.begin(), buffer.end(), buffer.begin(), │ │ │ │ │ -395 ::tolower); │ │ │ │ │ -396 │ │ │ │ │ -397 switch(buffer[0]) │ │ │ │ │ -398 { │ │ │ │ │ -399 case 'a' : │ │ │ │ │ -400 /* sanity check */ │ │ │ │ │ -401 if(buffer != "array") │ │ │ │ │ -402 { │ │ │ │ │ -403 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -404 return false; │ │ │ │ │ -405 } │ │ │ │ │ -406 mmHeader._t_y_p_e=_a_r_r_a_y___t_y_p_e; │ │ │ │ │ -407 break; │ │ │ │ │ -408 case 'c' : │ │ │ │ │ -409 /* sanity check */ │ │ │ │ │ -410 if(buffer != "coordinate") │ │ │ │ │ -411 { │ │ │ │ │ -412 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -413 return false; │ │ │ │ │ -414 } │ │ │ │ │ -415 mmHeader._t_y_p_e=_c_o_o_r_d_i_n_a_t_e___t_y_p_e; │ │ │ │ │ -416 break; │ │ │ │ │ -417 default : │ │ │ │ │ -418 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -419 return false; │ │ │ │ │ -420 } │ │ │ │ │ -421 │ │ │ │ │ -422 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ -423 /* premature end of line */ │ │ │ │ │ -424 return false; │ │ │ │ │ -425 │ │ │ │ │ -426 /* The numeric type used. */ │ │ │ │ │ -427 file >> buffer; │ │ │ │ │ -428 │ │ │ │ │ -429 if(buffer.empty()) │ │ │ │ │ -430 return false; │ │ │ │ │ -431 │ │ │ │ │ -432 std::transform(buffer.begin(), buffer.end(), buffer.begin(), │ │ │ │ │ -433 ::tolower); │ │ │ │ │ -434 switch(buffer[0]) │ │ │ │ │ -435 { │ │ │ │ │ -436 case 'i' : │ │ │ │ │ -437 /* sanity check */ │ │ │ │ │ -438 if(buffer != "integer") │ │ │ │ │ -439 { │ │ │ │ │ -440 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -441 return false; │ │ │ │ │ -442 } │ │ │ │ │ -443 mmHeader._c_t_y_p_e=_i_n_t_e_g_e_r___t_y_p_e; │ │ │ │ │ -444 break; │ │ │ │ │ -445 case 'r' : │ │ │ │ │ -446 /* sanity check */ │ │ │ │ │ -447 if(buffer != "real") │ │ │ │ │ -448 { │ │ │ │ │ -449 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -450 return false; │ │ │ │ │ -451 } │ │ │ │ │ -452 mmHeader._c_t_y_p_e=_d_o_u_b_l_e___t_y_p_e; │ │ │ │ │ -453 break; │ │ │ │ │ -454 case 'c' : │ │ │ │ │ -455 /* sanity check */ │ │ │ │ │ -456 if(buffer != "complex") │ │ │ │ │ -457 { │ │ │ │ │ -458 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -459 return false; │ │ │ │ │ -460 } │ │ │ │ │ -461 mmHeader._c_t_y_p_e=_c_o_m_p_l_e_x___t_y_p_e; │ │ │ │ │ -462 break; │ │ │ │ │ -463 case 'p' : │ │ │ │ │ -464 /* sanity check */ │ │ │ │ │ -465 if(buffer != "pattern") │ │ │ │ │ -466 { │ │ │ │ │ -467 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -468 return false; │ │ │ │ │ -469 } │ │ │ │ │ -470 mmHeader._c_t_y_p_e=_p_a_t_t_e_r_n; │ │ │ │ │ -471 break; │ │ │ │ │ -472 default : │ │ │ │ │ -473 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -474 return false; │ │ │ │ │ -475 } │ │ │ │ │ -476 │ │ │ │ │ -477 if(_l_i_n_e_F_e_e_d(file)) │ │ │ │ │ -478 return false; │ │ │ │ │ -479 │ │ │ │ │ -480 file >> buffer; │ │ │ │ │ -481 │ │ │ │ │ -482 std::transform(buffer.begin(), buffer.end(), buffer.begin(), │ │ │ │ │ -483 ::tolower); │ │ │ │ │ -484 switch(buffer[0]) │ │ │ │ │ -485 { │ │ │ │ │ -486 case 'g' : │ │ │ │ │ -487 /* sanity check */ │ │ │ │ │ -488 if(buffer != "general") │ │ │ │ │ -489 { │ │ │ │ │ -490 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -491 return false; │ │ │ │ │ -492 } │ │ │ │ │ -493 mmHeader._s_t_r_u_c_t_u_r_e=_g_e_n_e_r_a_l; │ │ │ │ │ -494 break; │ │ │ │ │ -495 case 'h' : │ │ │ │ │ -496 /* sanity check */ │ │ │ │ │ -497 if(buffer != "hermitian") │ │ │ │ │ -498 { │ │ │ │ │ -499 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -500 return false; │ │ │ │ │ -501 } │ │ │ │ │ -502 mmHeader._s_t_r_u_c_t_u_r_e=_h_e_r_m_i_t_i_a_n; │ │ │ │ │ -503 break; │ │ │ │ │ -504 case 's' : │ │ │ │ │ -505 if(buffer.size()==1) { │ │ │ │ │ -506 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -507 return false; │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -510 switch(buffer[1]) │ │ │ │ │ -511 { │ │ │ │ │ -512 case 'y' : │ │ │ │ │ -513 /* sanity check */ │ │ │ │ │ -514 if(buffer != "symmetric") │ │ │ │ │ -515 { │ │ │ │ │ -516 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -517 return false; │ │ │ │ │ -518 } │ │ │ │ │ -519 mmHeader._s_t_r_u_c_t_u_r_e=_s_y_m_m_e_t_r_i_c; │ │ │ │ │ -520 break; │ │ │ │ │ -521 case 'k' : │ │ │ │ │ -522 /* sanity check */ │ │ │ │ │ -523 if(buffer != "skew-symmetric") │ │ │ │ │ -524 { │ │ │ │ │ -525 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -526 return false; │ │ │ │ │ -527 } │ │ │ │ │ -528 mmHeader._s_t_r_u_c_t_u_r_e=_s_k_e_w___s_y_m_m_e_t_r_i_c; │ │ │ │ │ -529 break; │ │ │ │ │ -530 default : │ │ │ │ │ -531 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -532 return false; │ │ │ │ │ -533 } │ │ │ │ │ -534 break; │ │ │ │ │ -535 default : │ │ │ │ │ -536 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -537 return false; │ │ │ │ │ -538 } │ │ │ │ │ -539 file.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -540 c=file.peek(); │ │ │ │ │ -541 return true; │ │ │ │ │ -542 │ │ │ │ │ -543 } │ │ │ │ │ -544 │ │ │ │ │ -545 template │ │ │ │ │ -546 std::tuple │ │ │ │ │ -_5_4_7 _c_a_l_c_u_l_a_t_e_N_N_Z(std::size_t rows, std::size_t cols, std::size_t entries, const │ │ │ │ │ -_M_M_H_e_a_d_e_r& header) │ │ │ │ │ -548 { │ │ │ │ │ -549 std::size_t blockrows=rows/brows; │ │ │ │ │ -550 std::size_t blockcols=cols/bcols; │ │ │ │ │ -551 std::size_t blocksize=brows*bcols; │ │ │ │ │ -552 std::size_t blockentries=0; │ │ │ │ │ -553 │ │ │ │ │ -554 switch(header._s_t_r_u_c_t_u_r_e) │ │ │ │ │ -555 { │ │ │ │ │ -556 case _g_e_n_e_r_a_l : │ │ │ │ │ -557 blockentries = entries/blocksize; break; │ │ │ │ │ -558 case _s_k_e_w___s_y_m_m_e_t_r_i_c : │ │ │ │ │ -559 blockentries = 2*entries/blocksize; break; │ │ │ │ │ -560 case _s_y_m_m_e_t_r_i_c : │ │ │ │ │ -561 blockentries = (2*entries-rows)/blocksize; break; │ │ │ │ │ -562 case _h_e_r_m_i_t_i_a_n : │ │ │ │ │ -563 blockentries = (2*entries-rows)/blocksize; break; │ │ │ │ │ -564 default : │ │ │ │ │ -565 throw Dune::NotImplemented(); │ │ │ │ │ -566 } │ │ │ │ │ -567 return std::make_tuple(blockrows, blockcols, blockentries); │ │ │ │ │ -568 } │ │ │ │ │ -569 │ │ │ │ │ -570 /* │ │ │ │ │ -571 * @brief Storage class for the column index and the numeric value. │ │ │ │ │ -572 * │ │ │ │ │ -573 * \tparam T Either a NumericWrapper of the numeric type or PatternDummy │ │ │ │ │ -574 * for MatrixMarket pattern case. │ │ │ │ │ -575 */ │ │ │ │ │ -576 template │ │ │ │ │ -_5_7_7 struct _I_n_d_e_x_D_a_t_a : public T │ │ │ │ │ -578 { │ │ │ │ │ -_5_7_9 std::size_t _i_n_d_e_x = {}; │ │ │ │ │ -580 }; │ │ │ │ │ -581 │ │ │ │ │ -582 │ │ │ │ │ -593 template │ │ │ │ │ -_5_9_4 struct _N_u_m_e_r_i_c_W_r_a_p_p_e_r │ │ │ │ │ -595 { │ │ │ │ │ -_5_9_6 T _n_u_m_b_e_r = {}; │ │ │ │ │ -_5_9_7 operator T&() │ │ │ │ │ -598 { │ │ │ │ │ -599 return _n_u_m_b_e_r; │ │ │ │ │ -600 } │ │ │ │ │ -601 }; │ │ │ │ │ -602 │ │ │ │ │ -_6_0_6 struct _P_a_t_t_e_r_n_D_u_m_m_y │ │ │ │ │ -607 {}; │ │ │ │ │ -608 │ │ │ │ │ -609 template<> │ │ │ │ │ -_6_1_0 struct _N_u_m_e_r_i_c_W_r_a_p_p_e_r<_P_a_t_t_e_r_n_D_u_m_m_y> │ │ │ │ │ -611 {}; │ │ │ │ │ -612 │ │ │ │ │ -613 template │ │ │ │ │ -_6_1_4 std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, _N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_T_>& num) │ │ │ │ │ -615 { │ │ │ │ │ -616 return is>>num._n_u_m_b_e_r; │ │ │ │ │ -617 } │ │ │ │ │ -618 │ │ │ │ │ -_6_1_9 inline std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, [[maybe_unused]] │ │ │ │ │ -_N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_P_a_t_t_e_r_n_D_u_m_m_y_>& num) │ │ │ │ │ -620 { │ │ │ │ │ -621 return is; │ │ │ │ │ -622 } │ │ │ │ │ -623 │ │ │ │ │ -629 template │ │ │ │ │ -_6_3_0 bool _o_p_e_r_a_t_o_r_<(const _I_n_d_e_x_D_a_t_a_<_T_>& i1, const _I_n_d_e_x_D_a_t_a_<_T_>& i2) │ │ │ │ │ -631 { │ │ │ │ │ -632 return i1._i_n_d_e_x │ │ │ │ │ -_6_4_1 std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, _I_n_d_e_x_D_a_t_a_<_T_>& data) │ │ │ │ │ -642 { │ │ │ │ │ -643 is>>data._i_n_d_e_x; │ │ │ │ │ -644 /* MatrixMarket indices are one based. Decrement for C++ */ │ │ │ │ │ -645 --data._i_n_d_e_x; │ │ │ │ │ -646 return is>>data.number; │ │ │ │ │ -647 } │ │ │ │ │ -648 │ │ │ │ │ -654 template │ │ │ │ │ -_6_5_5 std::istream& _o_p_e_r_a_t_o_r_>_>(std::istream& is, _I_n_d_e_x_D_a_t_a<_N_u_m_e_r_i_c_W_r_a_p_p_e_r>>& data) │ │ │ │ │ -656 { │ │ │ │ │ -657 is>>data._i_n_d_e_x; │ │ │ │ │ -658 /* MatrixMarket indices are one based. Decrement for C++ */ │ │ │ │ │ -659 --data.index; │ │ │ │ │ -660 // real and imaginary part needs to be read separately as │ │ │ │ │ -661 // complex numbers are not provided in pair form. (x,y) │ │ │ │ │ -662 _N_u_m_e_r_i_c_W_r_a_p_p_e_r_<_T_> real, imag; │ │ │ │ │ -663 is>>real; │ │ │ │ │ -664 is>>imag; │ │ │ │ │ -665 data._n_u_m_b_e_r = {real._n_u_m_b_e_r, imag._n_u_m_b_e_r}; │ │ │ │ │ -666 return is; │ │ │ │ │ -667 } │ │ │ │ │ -668 │ │ │ │ │ -675 template │ │ │ │ │ -_6_7_6 struct _M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r │ │ │ │ │ -677 { │ │ │ │ │ -683 template │ │ │ │ │ -_6_8_4 void _o_p_e_r_a_t_o_r_(_)(const std::vector > >& rows, │ │ │ │ │ -685 _B_C_R_S_M_a_t_r_i_x_<_T_>& matrix) │ │ │ │ │ -686 { │ │ │ │ │ -687 static_assert(IsNumber::value && brows==1 && bcols==1, "Only scalar │ │ │ │ │ -entries are expected here!"); │ │ │ │ │ -688 for (auto iter=matrix._b_e_g_i_n(); iter!= matrix._e_n_d(); ++iter) │ │ │ │ │ -689 { │ │ │ │ │ -690 auto brow=iter.index(); │ │ │ │ │ -691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter) │ │ │ │ │ -692 (*iter)[siter->index] = siter->number; │ │ │ │ │ -693 } │ │ │ │ │ -694 } │ │ │ │ │ -695 │ │ │ │ │ -701 template │ │ │ │ │ -_7_0_2 void _o_p_e_r_a_t_o_r_(_)(const std::vector > >& rows, │ │ │ │ │ -703 _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_b_r_o_w_s_,_b_c_o_l_s_> >& matrix) │ │ │ │ │ -704 { │ │ │ │ │ -705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter) │ │ │ │ │ -706 { │ │ │ │ │ -707 for (auto brow=iter.index()*brows, │ │ │ │ │ -708 browend=iter.index()*brows+brows; │ │ │ │ │ -709 browindex/bcols][brow%brows][siter->index%bcols]=siter->number; │ │ │ │ │ -714 } │ │ │ │ │ -715 } │ │ │ │ │ -716 } │ │ │ │ │ -717 }; │ │ │ │ │ -718 │ │ │ │ │ -719 template │ │ │ │ │ -_7_2_0 struct _M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r<_P_a_t_t_e_r_n_D_u_m_m_y,brows,bcols> │ │ │ │ │ -721 { │ │ │ │ │ -722 template │ │ │ │ │ -_7_2_3 void _o_p_e_r_a_t_o_r_(_)(const std::vector > >& │ │ │ │ │ -rows, │ │ │ │ │ -724 M& matrix) │ │ │ │ │ -725 {} │ │ │ │ │ -726 }; │ │ │ │ │ -727 │ │ │ │ │ -_7_2_8 template struct _i_s___c_o_m_p_l_e_x : std::false_type {}; │ │ │ │ │ -_7_2_9 template struct _i_s___c_o_m_p_l_e_x<_s_t_d::complex> : std::true_type {}; │ │ │ │ │ -730 │ │ │ │ │ -731 // wrapper for std::conj. Returns T if T is not complex. │ │ │ │ │ -732 template │ │ │ │ │ -_7_3_3 std::enable_if_t::value, T> _c_o_n_j(const T& r){ │ │ │ │ │ -734 return r; │ │ │ │ │ -735 } │ │ │ │ │ -736 │ │ │ │ │ -737 template │ │ │ │ │ -_7_3_8 std::enable_if_t::value, T> _c_o_n_j(const T& r){ │ │ │ │ │ -739 return std::conj(r); │ │ │ │ │ -740 } │ │ │ │ │ -741 │ │ │ │ │ -742 template │ │ │ │ │ -_7_4_3 struct _m_m___m_u_l_t_i_p_l_i_e_r_s │ │ │ │ │ -744 {}; │ │ │ │ │ -745 │ │ │ │ │ -746 template │ │ │ │ │ -_7_4_7 struct _m_m___m_u_l_t_i_p_l_i_e_r_s<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ -748 { │ │ │ │ │ -749 enum { │ │ │ │ │ -_7_5_0 rows = 1, │ │ │ │ │ -751 cols = 1 │ │ │ │ │ -_7_5_2 }; │ │ │ │ │ -753 }; │ │ │ │ │ -754 │ │ │ │ │ -755 template │ │ │ │ │ -_7_5_6 struct _m_m___m_u_l_t_i_p_l_i_e_r_s<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > │ │ │ │ │ -757 { │ │ │ │ │ -758 enum { │ │ │ │ │ -_7_5_9 rows = i, │ │ │ │ │ -760 cols = j │ │ │ │ │ -_7_6_1 }; │ │ │ │ │ -762 }; │ │ │ │ │ -763 │ │ │ │ │ -764 template │ │ │ │ │ -_7_6_5 void _r_e_a_d_S_p_a_r_s_e_E_n_t_r_i_e_s(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>& matrix, │ │ │ │ │ -766 std::istream& file, std::size_t entries, │ │ │ │ │ -767 const _M_M_H_e_a_d_e_r& mmHeader, const D&) │ │ │ │ │ -768 { │ │ │ │ │ -769 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_> _M_a_t_r_i_x; │ │ │ │ │ -770 │ │ │ │ │ -771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise) │ │ │ │ │ -772 constexpr int brows = _m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_a_t_r_i_x_>_:_:_r_o_w_s; │ │ │ │ │ -773 constexpr int bcols = _m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_a_t_r_i_x_>_:_:_c_o_l_s; │ │ │ │ │ -774 │ │ │ │ │ -775 // First path │ │ │ │ │ -776 // store entries together with column index in a separate │ │ │ │ │ -777 // data structure │ │ │ │ │ -778 std::vector > > rows(matrix._N()*brows); │ │ │ │ │ -779 │ │ │ │ │ -780 auto readloop = [&] (auto symmetryFixup) { │ │ │ │ │ -781 for(std::size_t i = 0; i < entries; ++i) { │ │ │ │ │ -782 std::size_t row; │ │ │ │ │ -783 _I_n_d_e_x_D_a_t_a_<_D_> data; │ │ │ │ │ -784 _s_k_i_p_C_o_m_m_e_n_t_s(file); │ │ │ │ │ -785 file>>row; │ │ │ │ │ -786 --row; // Index was 1 based. │ │ │ │ │ -787 assert(row/bcols>data; │ │ │ │ │ -789 assert(data._i_n_d_e_x/bcols data_sym(data); │ │ │ │ │ -804 data_sym._i_n_d_e_x = row; │ │ │ │ │ -805 rows[data.index].insert(data_sym); │ │ │ │ │ -806 }); │ │ │ │ │ -807 break; │ │ │ │ │ -808 case _s_k_e_w___s_y_m_m_e_t_r_i_c : │ │ │ │ │ -809 readloop([&](auto row, auto data) { │ │ │ │ │ -810 _I_n_d_e_x_D_a_t_a_<_D_> data_sym; │ │ │ │ │ -811 data_sym.number = -data.number; │ │ │ │ │ -812 data_sym._i_n_d_e_x = row; │ │ │ │ │ -813 rows[data.index].insert(data_sym); │ │ │ │ │ -814 }); │ │ │ │ │ -815 break; │ │ │ │ │ -816 case _h_e_r_m_i_t_i_a_n : │ │ │ │ │ -817 readloop([&](auto row, auto data) { │ │ │ │ │ -818 _I_n_d_e_x_D_a_t_a_<_D_> data_sym; │ │ │ │ │ -819 data_sym.number = _c_o_n_j(data.number); │ │ │ │ │ -820 data_sym._i_n_d_e_x = row; │ │ │ │ │ -821 rows[data.index].insert(data_sym); │ │ │ │ │ -822 }); │ │ │ │ │ -823 break; │ │ │ │ │ -824 default: │ │ │ │ │ -825 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ -826 "Only general, symmetric, skew-symmetric and hermitian is supported right │ │ │ │ │ -now!"); │ │ │ │ │ -827 } │ │ │ │ │ -828 │ │ │ │ │ -829 // Setup the matrix sparsity pattern │ │ │ │ │ -830 int nnz=0; │ │ │ │ │ -831 for(typename Matrix::CreateIterator iter=matrix._c_r_e_a_t_e_b_e_g_i_n(); │ │ │ │ │ -832 iter!= matrix._c_r_e_a_t_e_e_n_d(); ++iter) │ │ │ │ │ -833 { │ │ │ │ │ -834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows; │ │ │ │ │ -835 brow >::const_iterator Siter; │ │ │ │ │ -838 for(Siter siter=rows[brow].begin(), send=rows[brow].end(); │ │ │ │ │ -839 siter != send; ++siter, ++nnz) │ │ │ │ │ -840 iter.insert(siter->index/bcols); │ │ │ │ │ -841 } │ │ │ │ │ -842 } │ │ │ │ │ -843 │ │ │ │ │ -844 //Set the matrix values │ │ │ │ │ -845 matrix=0; │ │ │ │ │ -846 │ │ │ │ │ -847 _M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_D_,_b_r_o_w_s_,_b_c_o_l_s_> Setter; │ │ │ │ │ -848 │ │ │ │ │ -849 Setter(rows, matrix); │ │ │ │ │ -850 } │ │ │ │ │ -851 │ │ │ │ │ -_8_5_2 inline std::tuple _s_p_l_i_t_F_i_l_e_n_a_m_e(const std:: │ │ │ │ │ -string& filename) { │ │ │ │ │ -853 std::size_t lastdot = filename.find_last_of("."); │ │ │ │ │ -854 if(lastdot == std::string::npos) │ │ │ │ │ -855 return std::make_tuple(filename, ""); │ │ │ │ │ -856 else { │ │ │ │ │ -857 std::string potentialFileExtension = filename.substr(lastdot); │ │ │ │ │ -858 if (potentialFileExtension == ".mm" || potentialFileExtension == ".mtx") │ │ │ │ │ -859 return std::make_tuple(filename.substr(0, lastdot), │ │ │ │ │ -potentialFileExtension); │ │ │ │ │ -860 else │ │ │ │ │ -861 return std::make_tuple(filename, ""); │ │ │ │ │ -862 } │ │ │ │ │ -863 } │ │ │ │ │ -864 │ │ │ │ │ -865 } // end namespace MatrixMarketImpl │ │ │ │ │ -866 │ │ │ │ │ -_8_6_7 class _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r : public Dune::Exception │ │ │ │ │ -868 {}; │ │ │ │ │ -869 │ │ │ │ │ -870 │ │ │ │ │ -_8_7_1 inline void _m_m___r_e_a_d___h_e_a_d_e_r(std::size_t& rows, std::size_t& cols, │ │ │ │ │ -872 _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r& header, std::istream& istr, │ │ │ │ │ -873 bool isVector) │ │ │ │ │ -874 { │ │ │ │ │ -875 using namespace MatrixMarketImpl; │ │ │ │ │ -876 │ │ │ │ │ -877 if(!readMatrixMarketBanner(istr, header)) { │ │ │ │ │ -878 std::cerr << "First line was not a correct Matrix Market banner. Using │ │ │ │ │ -default:\n" │ │ │ │ │ -879 << "%%MatrixMarket matrix coordinate real general"<> rows; │ │ │ │ │ -893 │ │ │ │ │ -894 if(lineFeed(istr)) │ │ │ │ │ -895 throw _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r(); │ │ │ │ │ -896 istr >> cols; │ │ │ │ │ -897 } │ │ │ │ │ -898 │ │ │ │ │ -899 template │ │ │ │ │ -_9_0_0 void _m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s(_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& vector, │ │ │ │ │ -901 std::size_t size, │ │ │ │ │ -902 std::istream& istr, │ │ │ │ │ -903 size_t lane) │ │ │ │ │ -904 { │ │ │ │ │ -905 for (int i=0; size>0; ++i, --size) │ │ │ │ │ -906 istr>>Simd::lane(lane,vector[i]); │ │ │ │ │ -907 } │ │ │ │ │ -908 │ │ │ │ │ -909 template │ │ │ │ │ -_9_1_0 void _m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s(_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r,A>& vector, │ │ │ │ │ -911 std::size_t size, │ │ │ │ │ -912 std::istream& istr, │ │ │ │ │ -913 size_t lane) │ │ │ │ │ -914 { │ │ │ │ │ -915 for(int i=0; size>0; ++i, --size) { │ │ │ │ │ -916 Simd::Scalar val; │ │ │ │ │ -917 istr>>val; │ │ │ │ │ -918 Simd::lane(lane, vector[i/entries][i%entries])=val; │ │ │ │ │ -919 } │ │ │ │ │ -920 } │ │ │ │ │ -921 │ │ │ │ │ -922 │ │ │ │ │ -929 template │ │ │ │ │ -_9_3_0 void _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t(_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& vector, │ │ │ │ │ -931 std::istream& istr) │ │ │ │ │ -932 { │ │ │ │ │ -933 typedef typename _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>_:_:_f_i_e_l_d___t_y_p_e field_type; │ │ │ │ │ -934 using namespace MatrixMarketImpl; │ │ │ │ │ -935 │ │ │ │ │ -936 MMHeader header; │ │ │ │ │ -937 std::size_t rows, cols; │ │ │ │ │ -938 _m_m___r_e_a_d___h_e_a_d_e_r(rows,cols,header,istr, true); │ │ │ │ │ -939 if(cols!=Simd::lanes()) { │ │ │ │ │ -940 if(Simd::lanes() == 1) │ │ │ │ │ -941 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "cols!=1, therefore this is no │ │ │ │ │ -vector!"); │ │ │ │ │ -942 else │ │ │ │ │ -943 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "cols does not match the number of │ │ │ │ │ -lanes in the field_type!"); │ │ │ │ │ -944 } │ │ │ │ │ -945 │ │ │ │ │ -946 if(header.type!=array_type) │ │ │ │ │ -947 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "Vectors have to be stored in array │ │ │ │ │ -format!"); │ │ │ │ │ -948 │ │ │ │ │ -949 │ │ │ │ │ -950 if constexpr (Dune::IsNumber()) │ │ │ │ │ -951 vector._r_e_s_i_z_e(rows); │ │ │ │ │ -952 else │ │ │ │ │ -953 { │ │ │ │ │ -954 T dummy; │ │ │ │ │ -955 auto blocksize = dummy.size(); │ │ │ │ │ -956 std::size_t size=rows/blocksize; │ │ │ │ │ -957 if(size*blocksize!=rows) │ │ │ │ │ -958 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "Block size of vector is not │ │ │ │ │ -correct!"); │ │ │ │ │ -959 │ │ │ │ │ -960 vector._r_e_s_i_z_e(size); │ │ │ │ │ -961 } │ │ │ │ │ -962 │ │ │ │ │ -963 istr.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -964 for(size_t l=0;l();++l){ │ │ │ │ │ -965 _m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s(vector, rows, istr, l); │ │ │ │ │ -966 } │ │ │ │ │ -967 } │ │ │ │ │ -968 │ │ │ │ │ -975 template │ │ │ │ │ -_9_7_6 void _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>& matrix, │ │ │ │ │ -977 std::istream& istr) │ │ │ │ │ -978 { │ │ │ │ │ -979 using namespace MatrixMarketImpl; │ │ │ │ │ -980 using _M_a_t_r_i_x = _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>; │ │ │ │ │ -981 │ │ │ │ │ -982 MMHeader header; │ │ │ │ │ -983 if(!readMatrixMarketBanner(istr, header)) { │ │ │ │ │ -984 std::cerr << "First line was not a correct Matrix Market banner. Using │ │ │ │ │ -default:\n" │ │ │ │ │ -985 << "%%MatrixMarket matrix coordinate real general"<> rows; │ │ │ │ │ -998 │ │ │ │ │ -999 if(lineFeed(istr)) │ │ │ │ │ -1000 throw _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r(); │ │ │ │ │ -1001 istr >> cols; │ │ │ │ │ -1002 │ │ │ │ │ -1003 if(lineFeed(istr)) │ │ │ │ │ -1004 throw _M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r(); │ │ │ │ │ -1005 │ │ │ │ │ -1006 istr >>entries; │ │ │ │ │ -1007 │ │ │ │ │ -1008 std::size_t nnz, blockrows, blockcols; │ │ │ │ │ -1009 │ │ │ │ │ -1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise) │ │ │ │ │ -1011 constexpr int brows = mm_multipliers::rows; │ │ │ │ │ -1012 constexpr int bcols = mm_multipliers::cols; │ │ │ │ │ -1013 │ │ │ │ │ -1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ(rows, │ │ │ │ │ -cols, entries, header); │ │ │ │ │ -1015 │ │ │ │ │ -1016 istr.ignore(std::numeric_limits::max(),'\n'); │ │ │ │ │ -1017 │ │ │ │ │ -1018 │ │ │ │ │ -1019 matrix._s_e_t_S_i_z_e(blockrows, blockcols, nnz); │ │ │ │ │ -1020 matrix._s_e_t_B_u_i_l_d_M_o_d_e(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>_:_:_r_o_w___w_i_s_e); │ │ │ │ │ -1021 │ │ │ │ │ -1022 if(header.type==array_type) │ │ │ │ │ -1023 DUNE_THROW(Dune::NotImplemented, "Array format currently not supported for │ │ │ │ │ -matrices!"); │ │ │ │ │ -1024 │ │ │ │ │ -1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper()); │ │ │ │ │ -1026 } │ │ │ │ │ -1027 │ │ │ │ │ -1028 // Print a scalar entry │ │ │ │ │ -1029 template │ │ │ │ │ -_1_0_3_0 void _m_m___p_r_i_n_t___e_n_t_r_y(const B& entry, │ │ │ │ │ -1031 std::size_t rowidx, │ │ │ │ │ -1032 std::size_t colidx, │ │ │ │ │ -1033 std::ostream& ostr) │ │ │ │ │ -1034 { │ │ │ │ │ -1035 if constexpr (IsNumber()) │ │ │ │ │ -1036 ostr << rowidx << " " << colidx << " " << entry << std::endl; │ │ │ │ │ -1037 else │ │ │ │ │ -1038 { │ │ │ │ │ -1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) { │ │ │ │ │ -1040 int coli=colidx; │ │ │ │ │ -1041 for (auto _c_o_l = row->begin(); _c_o_l != row->end(); ++_c_o_l, ++coli) │ │ │ │ │ -1042 ostr<< rowidx<<" "< │ │ │ │ │ -_1_0_4_9 void _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(const V& entry, std::ostream& ostr, │ │ │ │ │ -1050 const std::integral_constant&, │ │ │ │ │ -1051 size_t lane) │ │ │ │ │ -1052 { │ │ │ │ │ -1053 ostr< │ │ │ │ │ -_1_0_5_8 void _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(const V& vector, std::ostream& ostr, │ │ │ │ │ -1059 const std::integral_constant&, │ │ │ │ │ -1060 size_t lane) │ │ │ │ │ -1061 { │ │ │ │ │ -1062 using namespace MatrixMarketImpl; │ │ │ │ │ -1063 │ │ │ │ │ -1064 // Is the entry a supported numeric type? │ │ │ │ │ -1065 const int isnumeric = mm_numeric_type>::is_numeric; │ │ │ │ │ -1066 typedef typename V::const_iterator VIter; │ │ │ │ │ -1067 │ │ │ │ │ -1068 for(VIter i=vector.begin(); i != vector.end(); ++i) │ │ │ │ │ -1069 │ │ │ │ │ -1070 _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(*i, ostr, │ │ │ │ │ -1071 std::integral_constant(), │ │ │ │ │ -1072 lane); │ │ │ │ │ -1073 } │ │ │ │ │ -1074 │ │ │ │ │ -1075 template │ │ │ │ │ -_1_0_7_6 std::size_t _c_o_u_n_t_E_n_t_r_i_e_s(const _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& vector) │ │ │ │ │ -1077 { │ │ │ │ │ -1078 return vector.size(); │ │ │ │ │ -1079 } │ │ │ │ │ -1080 │ │ │ │ │ -1081 template │ │ │ │ │ -_1_0_8_2 std::size_t _c_o_u_n_t_E_n_t_r_i_e_s(const _B_l_o_c_k_V_e_c_t_o_r,A>& vector) │ │ │ │ │ -1083 { │ │ │ │ │ -1084 return vector.size()*i; │ │ │ │ │ -1085 } │ │ │ │ │ -1086 │ │ │ │ │ -1087 // Version for writing vectors. │ │ │ │ │ -1088 template │ │ │ │ │ -_1_0_8_9 void _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(const V& vector, std::ostream& ostr, │ │ │ │ │ -1090 const std::integral_constant&) │ │ │ │ │ -1091 { │ │ │ │ │ -1092 using namespace MatrixMarketImpl; │ │ │ │ │ -1093 typedef typename V::field_type field_type; │ │ │ │ │ -1094 │ │ │ │ │ -1095 ostr<<_c_o_u_n_t_E_n_t_r_i_e_s(vector)<<" "<()<>::is_numeric; │ │ │ │ │ -1097 for(size_t l=0;l(); ++l){ │ │ │ │ │ -1098 _m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y(vector,ostr, std::integral_constant │ │ │ │ │ -(), l); │ │ │ │ │ -1099 } │ │ │ │ │ -1100 } │ │ │ │ │ -1101 │ │ │ │ │ -1102 // Versions for writing matrices │ │ │ │ │ -1103 template │ │ │ │ │ -_1_1_0_4 void _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ -1105 std::ostream& ostr, │ │ │ │ │ -1106 const std::integral_constant&) │ │ │ │ │ -1107 { │ │ │ │ │ -1108 ostr<_:_:_r_o_w_s<<" " │ │ │ │ │ -1109 <_:_:_c_o_l_s<<" " │ │ │ │ │ -1110 <<_c_o_u_n_t_N_o_n_Z_e_r_o_s(matrix)<begin(); _c_o_l != row->end(); ++_c_o_l) │ │ │ │ │ -1116 // Matrix Market indexing start with 1! │ │ │ │ │ -1117 _m_m___p_r_i_n_t___e_n_t_r_y(*_c_o_l, row.index()*_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_>_:_: │ │ │ │ │ -_r_o_w_s+1, │ │ │ │ │ -1118 _c_o_l.index()*_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s_<_M_>_:_:_c_o_l_s+1, ostr); │ │ │ │ │ -1119 } │ │ │ │ │ -1120 │ │ │ │ │ -1121 │ │ │ │ │ -1125 template │ │ │ │ │ -_1_1_2_6 void _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ -1127 std::ostream& ostr) │ │ │ │ │ -1128 { │ │ │ │ │ -1129 using namespace MatrixMarketImpl; │ │ │ │ │ -1130 │ │ │ │ │ -1131 // Write header information │ │ │ │ │ -1132 mm_header_printer::print(ostr); │ │ │ │ │ -1133 mm_block_structure_header::print(ostr,matrix); │ │ │ │ │ -1134 // Choose the correct function for matrix and vector │ │ │ │ │ -1135 _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(matrix,ostr,std::integral_constant_:_: │ │ │ │ │ -_v_a_l_u_e>()); │ │ │ │ │ -1136 } │ │ │ │ │ -1137 │ │ │ │ │ -_1_1_3_8 static const int _d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n = -1; │ │ │ │ │ -1150 template │ │ │ │ │ -_1_1_5_1 void _s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ -1152 std::string filename, │ │ │ │ │ -1153 int prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ -1154 { │ │ │ │ │ -1155 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ -(filename); │ │ │ │ │ -1156 std::string rfilename; │ │ │ │ │ -1157 std::ofstream file; │ │ │ │ │ -1158 if (extension != "") { │ │ │ │ │ -1159 rfilename = pureFilename + extension; │ │ │ │ │ -1160 file.open(rfilename.c_str()); │ │ │ │ │ -1161 if(!file) │ │ │ │ │ -1162 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str │ │ │ │ │ -()); │ │ │ │ │ -1163 } │ │ │ │ │ -1164 else { │ │ │ │ │ -1165 // only try .mm so we do not ignore potential errors │ │ │ │ │ -1166 rfilename = pureFilename + ".mm"; │ │ │ │ │ -1167 file.open(rfilename.c_str()); │ │ │ │ │ -1168 if(!file) │ │ │ │ │ -1169 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str │ │ │ │ │ -()); │ │ │ │ │ -1170 } │ │ │ │ │ -1171 │ │ │ │ │ -1172 file.setf(std::ios::scientific,std::ios::floatfield); │ │ │ │ │ -1173 if(prec>0) │ │ │ │ │ -1174 file.precision(prec); │ │ │ │ │ -1175 _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(matrix, file); │ │ │ │ │ -1176 file.close(); │ │ │ │ │ -1177 } │ │ │ │ │ -1178 │ │ │ │ │ -1179#if HAVE_MPI │ │ │ │ │ -1194 template │ │ │ │ │ -_1_1_9_5 void _s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t(const M& matrix, │ │ │ │ │ -1196 std::string filename, │ │ │ │ │ -1197 const _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>& comm, │ │ │ │ │ -1198 bool storeIndices=true, │ │ │ │ │ -1199 int prec=_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n) │ │ │ │ │ -1200 { │ │ │ │ │ -1201 // Get our rank │ │ │ │ │ -1202 int rank = comm._c_o_m_m_u_n_i_c_a_t_o_r().rank(); │ │ │ │ │ -1203 // Write the local matrix │ │ │ │ │ -1204 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ -(filename); │ │ │ │ │ -1205 std::string rfilename; │ │ │ │ │ -1206 std::ofstream file; │ │ │ │ │ -1207 if (extension != "") { │ │ │ │ │ -1208 rfilename = pureFilename + "_" + std::to_string(rank) + extension; │ │ │ │ │ -1209 file.open(rfilename.c_str()); │ │ │ │ │ -1210 dverb<< rfilename <0) │ │ │ │ │ -1224 file.precision(prec); │ │ │ │ │ -1225 _w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t(matrix, file); │ │ │ │ │ -1226 file.close(); │ │ │ │ │ -1227 │ │ │ │ │ -1228 if(!storeIndices) │ │ │ │ │ -1229 return; │ │ │ │ │ -1230 │ │ │ │ │ -1231 // Write the global to local index mapping │ │ │ │ │ -1232 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx"; │ │ │ │ │ -1233 file.open(rfilename.c_str()); │ │ │ │ │ -1234 if(!file) │ │ │ │ │ -1235 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str │ │ │ │ │ -()); │ │ │ │ │ -1236 file.setf(std::ios::scientific,std::ios::floatfield); │ │ │ │ │ -1237 typedef typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -IndexSet; │ │ │ │ │ -1238 typedef typename IndexSet::const_iterator Iterator; │ │ │ │ │ -1239 for(Iterator iter = comm._i_n_d_e_x_S_e_t().begin(); │ │ │ │ │ -1240 iter != comm._i_n_d_e_x_S_e_t().end(); ++iter) { │ │ │ │ │ -1241 file << iter->global()<<" "<<(std::size_t)iter->local()<<" " │ │ │ │ │ -1242 <<(int)iter->local().attribute()<<" "<<(int)iter->local().isPublic │ │ │ │ │ -()<& neighbours=comm._r_e_m_o_t_e_I_n_d_i_c_e_s().getNeighbours(); │ │ │ │ │ -1247 typedef std::set::const_iterator SIter; │ │ │ │ │ -1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end(); │ │ │ │ │ -++neighbour) { │ │ │ │ │ -1249 file<<" "<< *neighbour; │ │ │ │ │ -1250 } │ │ │ │ │ -1251 file.close(); │ │ │ │ │ -1252 } │ │ │ │ │ -1253 │ │ │ │ │ -1268 template │ │ │ │ │ -_1_2_6_9 void _l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t(M& matrix, │ │ │ │ │ -1270 const std::string& filename, │ │ │ │ │ -1271 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>& comm, │ │ │ │ │ -1272 bool readIndices=true) │ │ │ │ │ -1273 { │ │ │ │ │ -1274 using namespace MatrixMarketImpl; │ │ │ │ │ -1275 │ │ │ │ │ -1276 using LocalIndexT = typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>_:_: │ │ │ │ │ -_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t_:_:_L_o_c_a_l_I_n_d_e_x; │ │ │ │ │ -1277 typedef typename LocalIndexT::Attribute Attribute; │ │ │ │ │ -1278 // Get our rank │ │ │ │ │ -1279 int rank = comm._c_o_m_m_u_n_i_c_a_t_o_r().rank(); │ │ │ │ │ -1280 // load local matrix │ │ │ │ │ -1281 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ -(filename); │ │ │ │ │ -1282 std::string rfilename; │ │ │ │ │ -1283 std::ifstream file; │ │ │ │ │ -1284 if (extension != "") { │ │ │ │ │ -1285 rfilename = pureFilename + "_" + std::to_string(rank) + extension; │ │ │ │ │ -1286 file.open(rfilename.c_str(), std::ios::in); │ │ │ │ │ -1287 dverb<< rfilename <_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -IndexSet; │ │ │ │ │ -1311 IndexSet& pis=comm.pis; │ │ │ │ │ -1312 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx"; │ │ │ │ │ -1313 file.open(rfilename.c_str()); │ │ │ │ │ -1314 if(!file) │ │ │ │ │ -1315 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str()); │ │ │ │ │ -1316 if(pis.size()!=0) │ │ │ │ │ -1317 DUNE_THROW(InvalidIndexSetState, "Index set is not empty!"); │ │ │ │ │ -1318 │ │ │ │ │ -1319 pis.beginResize(); │ │ │ │ │ -1320 while(!file.eof() && file.peek()!='n') { │ │ │ │ │ -1321 G g; │ │ │ │ │ -1322 file >>g; │ │ │ │ │ -1323 std::size_t l; │ │ │ │ │ -1324 file >>l; │ │ │ │ │ -1325 int c; │ │ │ │ │ -1326 file >>c; │ │ │ │ │ -1327 bool b; │ │ │ │ │ -1328 file >> b; │ │ │ │ │ -1329 pis.add(g,LocalIndexT(l,Attribute(c),b)); │ │ │ │ │ -1330 lineFeed(file); │ │ │ │ │ -1331 } │ │ │ │ │ -1332 pis.endResize(); │ │ │ │ │ -1333 if(!file.eof()) { │ │ │ │ │ -1334 // read neighbours │ │ │ │ │ -1335 std::string s; │ │ │ │ │ -1336 file>>s; │ │ │ │ │ -1337 if(s!="neighbours:") │ │ │ │ │ -1338 DUNE_THROW(_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r, "was expecting the string: │ │ │ │ │ -\"neighbours:\""); │ │ │ │ │ -1339 std::set nb; │ │ │ │ │ -1340 while(!file.eof()) { │ │ │ │ │ -1341 int i; │ │ │ │ │ -1342 file >> i; │ │ │ │ │ -1343 nb.insert(i); │ │ │ │ │ -1344 } │ │ │ │ │ -1345 file.close(); │ │ │ │ │ -1346 comm.ri.setNeighbours(nb); │ │ │ │ │ -1347 } │ │ │ │ │ -1348 comm.ri.template rebuild(); │ │ │ │ │ -1349 } │ │ │ │ │ -1350 │ │ │ │ │ -1351 #endif │ │ │ │ │ -1352 │ │ │ │ │ -1363 template │ │ │ │ │ -_1_3_6_4 void _l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t(M& matrix, │ │ │ │ │ -1365 const std::string& filename) │ │ │ │ │ -1366 { │ │ │ │ │ -1367 auto [pureFilename, extension] = _M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ -(filename); │ │ │ │ │ -1368 std::string rfilename; │ │ │ │ │ -1369 std::ifstream file; │ │ │ │ │ -1370 if (extension != "") { │ │ │ │ │ -1371 rfilename = pureFilename + extension; │ │ │ │ │ -1372 file.open(rfilename.c_str()); │ │ │ │ │ -1373 if(!file) │ │ │ │ │ -1374 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str()); │ │ │ │ │ -1375 } │ │ │ │ │ -1376 else { │ │ │ │ │ -1377 // try both .mm and .mtx │ │ │ │ │ -1378 rfilename = pureFilename + ".mm"; │ │ │ │ │ -1379 file.open(rfilename.c_str(), std::ios::in); │ │ │ │ │ -1380 if(!file) { │ │ │ │ │ -1381 rfilename = pureFilename + ".mtx"; │ │ │ │ │ -1382 file.open(rfilename.c_str(), std::ios::in); │ │ │ │ │ -1383 if(!file) │ │ │ │ │ -1384 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str()); │ │ │ │ │ -1385 } │ │ │ │ │ -1386 } │ │ │ │ │ -1387 _r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t(matrix,file); │ │ │ │ │ -1388 file.close(); │ │ │ │ │ -1389 } │ │ │ │ │ -1390 │ │ │ │ │ -1392} │ │ │ │ │ -1393#endif │ │ │ │ │ -_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ -Some handy generic functions for ISTL matrices. │ │ │ │ │ -_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ -Implementation of the BCRSMatrix class. │ │ │ │ │ -_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +299 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ +300 } │ │ │ │ │ +301 │ │ │ │ │ +_3_0_3 virtual void _f_r_e_e() │ │ │ │ │ +304 { │ │ │ │ │ +305 ISTL::Impl::BCCSMatrix::field_type, int>::free(); │ │ │ │ │ +306 SUPERLU_FREE(A.Store); │ │ │ │ │ +307 } │ │ │ │ │ +308 private: │ │ │ │ │ +309 SuperMatrix A; │ │ │ │ │ +310 }; │ │ │ │ │ +311 │ │ │ │ │ +312 template │ │ │ │ │ +_3_1_3 class _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +314 : public ISTL::Impl::BCCSMatrixInitializer, int> │ │ │ │ │ +315 { │ │ │ │ │ +316 template │ │ │ │ │ +_3_1_7 friend class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ +318 public: │ │ │ │ │ +_3_1_9 typedef _B_C_R_S_M_a_t_r_i_x_<_B_,_A_> _M_a_t_r_i_x; │ │ │ │ │ +_3_2_0 typedef _D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_M_a_t_r_i_x_> _S_u_p_e_r_L_U_M_a_t_r_i_x; │ │ │ │ │ +321 │ │ │ │ │ +_3_2_2 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r(_S_u_p_e_r_L_U_M_a_t_r_i_x& lum) : ISTL::Impl:: │ │ │ │ │ +BCCSMatrixInitializer<_B_C_R_S_M_a_t_r_i_x, int>(lum) │ │ │ │ │ +323 ,slumat(&lum) │ │ │ │ │ +324 {} │ │ │ │ │ +325 │ │ │ │ │ +_3_2_6 _S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r() : ISTL::Impl:: │ │ │ │ │ +BCCSMatrixInitializer<_B_C_R_S_M_a_t_r_i_x, int>() │ │ │ │ │ +327 {} │ │ │ │ │ +328 │ │ │ │ │ +_3_2_9 virtual void _c_r_e_a_t_e_M_a_t_r_i_x() const │ │ │ │ │ +330 { │ │ │ │ │ +331 ISTL::Impl::BCCSMatrixInitializer, int>::createMatrix(); │ │ │ │ │ +332 _S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_> │ │ │ │ │ +333_ _:_:_c_r_e_a_t_e(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols], │ │ │ │ │ +334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC, │ │ │ │ │ +335 static_cast(_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_t_y_p_e_n_a_m_e_ _M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e_>_:_:_t_y_p_e), │ │ │ │ │ +SLU_GE); │ │ │ │ │ +336 } │ │ │ │ │ +337 private: │ │ │ │ │ +338 _S_u_p_e_r_L_U_M_a_t_r_i_x* slumat; │ │ │ │ │ +339 }; │ │ │ │ │ +340} │ │ │ │ │ +341#endif // HAVE_SUPERLU │ │ │ │ │ +342#endif │ │ │ │ │ +_s_u_p_e_r_l_u_f_u_n_c_t_i_o_n_s_._h_h │ │ │ │ │ +_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ _b_v_e_c_t_o_r_._h_h │ │ │ │ │ This file implements a vector space as a tensor product of a given vector │ │ │ │ │ space. The number of compon... │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ -_D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s │ │ │ │ │ -auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ -value > *sfinae=nullptr) │ │ │ │ │ -Get the number of nonzero fields in the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:119 │ │ │ │ │ -_D_u_n_e_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ -void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr) │ │ │ │ │ -Reads a BlockVector from a matrix market file. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:930 │ │ │ │ │ -_D_u_n_e_:_:_s_t_o_r_e_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ -void storeMatrixMarket(const M &matrix, std::string filename, int │ │ │ │ │ -prec=default_precision) │ │ │ │ │ -Stores a parallel matrix/vector in matrix market format in a file. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1151 │ │ │ │ │ -_D_u_n_e_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ -void loadMatrixMarket(M &matrix, const std::string &filename, │ │ │ │ │ -OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true) │ │ │ │ │ -Load a parallel matrix/vector stored in matrix market format. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1269 │ │ │ │ │ -_D_u_n_e_:_:_c_o_u_n_t_E_n_t_r_i_e_s │ │ │ │ │ -std::size_t countEntries(const BlockVector< T, A > &vector) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1076 │ │ │ │ │ -_D_u_n_e_:_:_w_r_i_t_e_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ -void writeMatrixMarket(const V &vector, std::ostream &ostr, const std:: │ │ │ │ │ -integral_constant< int, 0 > &) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1089 │ │ │ │ │ -_D_u_n_e_:_:_m_m___p_r_i_n_t___v_e_c_t_o_r___e_n_t_r_y │ │ │ │ │ -void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std:: │ │ │ │ │ -integral_constant< int, 1 > &, size_t lane) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1049 │ │ │ │ │ -_D_u_n_e_:_:_d_e_f_a_u_l_t___p_r_e_c_i_s_i_o_n │ │ │ │ │ -static const int default_precision │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1138 │ │ │ │ │ -_D_u_n_e_:_:_m_m___r_e_a_d___v_e_c_t_o_r___e_n_t_r_i_e_s │ │ │ │ │ -void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t │ │ │ │ │ -size, std::istream &istr, size_t lane) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:900 │ │ │ │ │ -_D_u_n_e_:_:_m_m___r_e_a_d___h_e_a_d_e_r │ │ │ │ │ -void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl:: │ │ │ │ │ -MMHeader &header, std::istream &istr, bool isVector) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:871 │ │ │ │ │ -_D_u_n_e_:_:_m_m___p_r_i_n_t___e_n_t_r_y │ │ │ │ │ -void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx, │ │ │ │ │ -std::ostream &ostr) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1030 │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ _s_t_d │ │ │ │ │ STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_a_l_c_u_l_a_t_e_N_N_Z │ │ │ │ │ -std::tuple< std::size_t, std::size_t, std::size_t > calculateNNZ(std::size_t │ │ │ │ │ -rows, std::size_t cols, std::size_t entries, const MMHeader &header) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:547 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ -bool operator<(const IndexData< T > &i1, const IndexData< T > &i2) │ │ │ │ │ -LessThan operator. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:630 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_L_i_n_e_T_y_p_e │ │ │ │ │ -LineType │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_D_A_T_A │ │ │ │ │ -@ DATA │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___H_E_A_D_E_R │ │ │ │ │ -@ MM_HEADER │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___I_S_T_L_S_T_R_U_C_T │ │ │ │ │ -@ MM_ISTLSTRUCT │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_r_e_a_d_M_a_t_r_i_x_M_a_r_k_e_t_B_a_n_n_e_r │ │ │ │ │ -bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_r_e_a_d_S_p_a_r_s_e_E_n_t_r_i_e_s │ │ │ │ │ -void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file, │ │ │ │ │ -std::size_t entries, const MMHeader &mmHeader, const D &) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:765 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___T_Y_P_E │ │ │ │ │ -MM_TYPE │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_a_r_r_a_y___t_y_p_e │ │ │ │ │ -@ array_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_o_r_d_i_n_a_t_e___t_y_p_e │ │ │ │ │ -@ coordinate_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___t_y_p_e │ │ │ │ │ -@ unknown_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_o_p_e_r_a_t_o_r_>_> │ │ │ │ │ -std::istream & operator>>(std::istream &is, NumericWrapper< T > &num) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:614 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_i_p_C_o_m_m_e_n_t_s │ │ │ │ │ -void skipComments(std::istream &file) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:339 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_l_i_n_e_F_e_e_d │ │ │ │ │ -bool lineFeed(std::istream &file) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:315 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___M_A_X___L_I_N_E___L_E_N_G_T_H │ │ │ │ │ -@ MM_MAX_LINE_LENGTH │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___S_T_R_U_C_T_U_R_E │ │ │ │ │ -MM_STRUCTURE │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_k_e_w___s_y_m_m_e_t_r_i_c │ │ │ │ │ -@ skew_symmetric │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_g_e_n_e_r_a_l │ │ │ │ │ -@ general │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_h_e_r_m_i_t_i_a_n │ │ │ │ │ -@ hermitian │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___s_t_r_u_c_t_u_r_e │ │ │ │ │ -@ unknown_structure │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_y_m_m_e_t_r_i_c │ │ │ │ │ -@ symmetric │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M___C_T_Y_P_E │ │ │ │ │ -MM_CTYPE │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_u_n_k_n_o_w_n___c_t_y_p_e │ │ │ │ │ -@ unknown_ctype │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_p_a_t_t_e_r_n │ │ │ │ │ -@ pattern │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_m_p_l_e_x___t_y_p_e │ │ │ │ │ -@ complex_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_d_o_u_b_l_e___t_y_p_e │ │ │ │ │ -@ double_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_n_t_e_g_e_r___t_y_p_e │ │ │ │ │ -@ integer_type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_c_o_n_j │ │ │ │ │ -std::enable_if_t::value, T > conj(const T &r) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:733 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_s_p_l_i_t_F_i_l_e_n_a_m_e │ │ │ │ │ -std::tuple< std::string, std::string > splitFilename(const std::string │ │ │ │ │ -&filename) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:852 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_c_o_l_d_i_m │ │ │ │ │ +static auto coldim(const M &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_r_o_w_d_i_m │ │ │ │ │ +static auto rowdim(const M &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:214 │ │ │ │ │ _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ A sparse block matrix with compressed row storage. │ │ │ │ │ DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -Get iterator to first row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:675 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -Get iterator to one beyond last row. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ -CreateIterator createend() │ │ │ │ │ -get create iterator pointing to one after the last block │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1103 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -number of columns (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ -CreateIterator createbegin() │ │ │ │ │ -get initial create iterator │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_B_u_i_l_d_M_o_d_e │ │ │ │ │ -void setBuildMode(BuildMode bm) │ │ │ │ │ -Sets the build mode of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:833 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ -Set the size of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type size) │ │ │ │ │ -Resize the vector. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:503 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ -A generic dynamic dense matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e │ │ │ │ │ -Helper metaprogram to get the matrix market string representation of the │ │ │ │ │ -numeric type. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_:_:_i_s___n_u_m_e_r_i_c │ │ │ │ │ -@ is_numeric │ │ │ │ │ -Whether T is a supported numeric type. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _i_n_t_ _>_:_:_s_t_r │ │ │ │ │ -static std::string str() │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _d_o_u_b_l_e_ _>_:_:_s_t_r │ │ │ │ │ -static std::string str() │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _f_l_o_a_t_ _>_:_:_s_t_r │ │ │ │ │ -static std::string str() │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _>_:_:_s_t_r │ │ │ │ │ -static std::string str() │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___n_u_m_e_r_i_c___t_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _>_:_:_s_t_r │ │ │ │ │ -static std::string str() │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r │ │ │ │ │ -Meta program to write the correct Matrix Market header. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _j_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:199 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___h_e_a_d_e_r___p_r_i_n_t_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:209 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r │ │ │ │ │ -Metaprogram for writing the ISTL block structure header. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os, const M &) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ -BlockVector< T, A > M │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_, │ │ │ │ │ -_i_ _>_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ -BlockVector< FieldVector< T, i >, A > M │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:243 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_, │ │ │ │ │ -_i_ _>_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os, const M &) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ -BCRSMatrix< T, A > M │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:255 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os, const M &) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:258 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_, │ │ │ │ │ -_i_,_ _j_ _>_,_ _A_ _>_ _>_:_:_M │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, i, j >, A > M │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_, │ │ │ │ │ -_i_,_ _j_ _>_,_ _A_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os, const M &) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:270 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _>_:_: │ │ │ │ │ -_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os, const M &m) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _i_,_ _j_ _>_ _>_:_:_M │ │ │ │ │ -FieldMatrix< T, i, j > M │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _>_ _>_:_:_p_r_i_n_t │ │ │ │ │ -static void print(std::ostream &os, const M &m) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:292 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___b_l_o_c_k___s_t_r_u_c_t_u_r_e___h_e_a_d_e_r_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _T_,_ _i_ _>_ _>_:_:_M │ │ │ │ │ -FieldVector< T, i > M │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_s_t_r_u_c_t_u_r_e │ │ │ │ │ -MM_STRUCTURE structure │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:312 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_t_y_p_e │ │ │ │ │ -MM_TYPE type │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:310 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_M_M_H_e_a_d_e_r │ │ │ │ │ -MMHeader() │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_M_H_e_a_d_e_r_:_:_c_t_y_p_e │ │ │ │ │ -MM_CTYPE ctype │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_I_n_d_e_x_D_a_t_a │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:578 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_I_n_d_e_x_D_a_t_a_:_:_i_n_d_e_x │ │ │ │ │ -std::size_t index │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:579 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r │ │ │ │ │ -a wrapper class of numeric values. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:595 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_N_u_m_e_r_i_c_W_r_a_p_p_e_r_:_:_n_u_m_b_e_r │ │ │ │ │ -T number │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:596 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_P_a_t_t_e_r_n_D_u_m_m_y │ │ │ │ │ -Utility class for marking the pattern type of the MatrixMarket matrices. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:607 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r │ │ │ │ │ -Functor to the data values of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:677 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const std::vector< std::set< IndexData< D > > > &rows, │ │ │ │ │ -BCRSMatrix< T > &matrix) │ │ │ │ │ -Sets the matrix values. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:684 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const std::vector< std::set< IndexData< D > > > &rows, │ │ │ │ │ -BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix) │ │ │ │ │ -Sets the matrix values. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:702 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_M_a_t_r_i_x_V_a_l_u_e_s_S_e_t_t_e_r_<_ _P_a_t_t_e_r_n_D_u_m_m_y_,_ _b_r_o_w_s_,_ _b_c_o_l_s_ _>_:_: │ │ │ │ │ -_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -void operator()(const std::vector< std::set< IndexData< PatternDummy > > > │ │ │ │ │ -&rows, M &matrix) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:723 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_i_s___c_o_m_p_l_e_x │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:728 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_I_m_p_l_:_:_m_m___m_u_l_t_i_p_l_i_e_r_s │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:744 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_M_a_r_k_e_t_F_o_r_m_a_t_E_r_r_o_r │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:868 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_I_s_M_a_t_r_i_x │ │ │ │ │ -Test whether a type is an ISTL Matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ -owner/overlap/copy sema... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ -const ParallelIndexSet & indexSet() const │ │ │ │ │ -Get the underlying parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:462 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -const Communication< MPI_Comm > & communicator() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -const RemoteIndices & remoteIndices() const │ │ │ │ │ -Get the underlying remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ -The type of the parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access and the size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +Sequential overlapping Schwarz preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U │ │ │ │ │ +SuperLu Solver. │ │ │ │ │ +DDeeffiinniittiioonn superlu.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_C_r_e_a_t_e_S_p_a_r_s_e_C_h_o_o_s_e_r │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:26 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_P_r_i_n_t_e_r │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_B_a_s_e_G_e_t_S_u_p_e_r_L_U_T_y_p_e_:_:_t_y_p_e │ │ │ │ │ +static const Dtype_t type │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _d_o_u_b_l_e_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ +double float_type │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _f_l_o_a_t_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ +float float_type │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _d_o_u_b_l_e_ _>_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ +double float_type │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_G_e_t_S_u_p_e_r_L_U_T_y_p_e_<_ _s_t_d_:_:_c_o_m_p_l_e_x_<_ _f_l_o_a_t_ _>_ _>_:_:_f_l_o_a_t___t_y_p_e │ │ │ │ │ +float float_type │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +Utility class for converting an ISTL Matrix into a SuperLU Matrix. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_f_r_e_e │ │ │ │ │ +virtual void free() │ │ │ │ │ +free allocated space. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix< │ │ │ │ │ +BCRSMatrix< B, TA > > &mat) │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA > │ │ │ │ │ +&mat) │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +SuperLUMatrix(const Matrix &mat) │ │ │ │ │ +Constructor that initializes the data. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:212 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +virtual void setMatrix(const Matrix &mat) │ │ │ │ │ +Initialize data from given matrix. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +SuperLUMatrix() │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< B, TA > Matrix │ │ │ │ │ +The type of the matrix to convert. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +virtual void setMatrix(const Matrix &mat, const std::set< std::size_t > &mrs) │ │ │ │ │ +Initialize data from a given set of matrix rows and columns. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_~_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +virtual ~SuperLUMatrix() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_S_u_p_e_r_L_U_M_a_t_r_i_x │ │ │ │ │ +Dune::SuperLUMatrix< Matrix > SuperLUMatrix │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:320 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< B, A > Matrix │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +SuperMatrixInitializer() │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:326 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_c_r_e_a_t_e_M_a_t_r_i_x │ │ │ │ │ +virtual void createMatrix() const │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:329 │ │ │ │ │ +_D_u_n_e_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_S_u_p_e_r_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +SuperMatrixInitializer(SuperLUMatrix &lum) │ │ │ │ │ +DDeeffiinniittiioonn supermatrix.hh:322 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00179.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solverfactory.hh File Reference │ │ │ │ +dune-istl: matrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,89 +71,59 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
solverfactory.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
matrix.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <unordered_map>
│ │ │ │ -#include <functional>
│ │ │ │ + │ │ │ │ +

A dynamic dense block matrix class. │ │ │ │ +More...

│ │ │ │ +
#include <cmath>
│ │ │ │ #include <memory>
│ │ │ │ -#include <dune/common/parametertree.hh>
│ │ │ │ -#include <dune/common/singleton.hh>
│ │ │ │ -#include "solverregistry.hh"
│ │ │ │ -#include <dune/istl/solver.hh>
│ │ │ │ -#include <dune/istl/schwarz.hh>
│ │ │ │ -#include <dune/istl/novlpschwarz.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include <dune/istl/bvector.hh>
│ │ │ │ +#include <dune/istl/istlexception.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::SolverFactory< Operator >
 Factory to assembly solvers configured by a ParameterTree. More...
class  Dune::MatrixImp::DenseMatrixBase< B, A >
 A Vector of blocks with different blocksizes. More...
 
class  Dune::MatrixImp::DenseMatrixBase< B, A >::Iterator
 Iterator class for sequential access. More...
 
class  Dune::MatrixImp::DenseMatrixBase< B, A >::ConstIterator
 ConstIterator class for sequential access. More...
 
class  Dune::Matrix< T, A >
 A generic dynamic dense matrix. More...
 
struct  Dune::FieldTraits< Matrix< T, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class M , class X , class Y >
using Dune::DirectSolverSignature = std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &)
 
template<class M , class X , class Y >
using Dune::DirectSolverFactory = Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > >
 
template<class M , class X , class Y >
using Dune::PreconditionerSignature = std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &)
 
template<class M , class X , class Y >
using Dune::PreconditionerFactory = Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > >
 
template<class X , class Y >
using Dune::IterativeSolverSignature = std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &)
 
template<class X , class Y >
using Dune::IterativeSolverFactory = Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > >
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<class O , class Preconditioner >
std::shared_ptr< PreconditionerDune::wrapPreconditioner4Parallel (const std::shared_ptr< Preconditioner > &prec, const O &)
 
template<class M , class X , class Y , class C , class Preconditioner >
std::shared_ptr< PreconditionerDune::wrapPreconditioner4Parallel (const std::shared_ptr< Preconditioner > &prec, const std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class M , class X , class Y , class C , class Preconditioner >
std::shared_ptr< PreconditionerDune::wrapPreconditioner4Parallel (const std::shared_ptr< Preconditioner > &prec, const std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class M , class X , class Y >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const std::shared_ptr< MatrixAdapter< M, X, Y > > &)
 
template<class M , class X , class Y , class C >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class M , class X , class Y , class C >
std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > &op)
 
template<class Operator >
std::shared_ptr< InverseOperator< typename Operator::domain_type, typename Operator::range_type > > Dune::getSolverFromFactory (std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner< typename Operator::domain_type, typename Operator::range_type > > prec=nullptr)
 Instantiates an InverseOperator from an Operator and a configuration given as a ParameterTree.
 
namespace  Dune::MatrixImp
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

A dynamic dense block matrix class.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,101 +1,43 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -solverfactory.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +matrix.hh File Reference │ │ │ │ │ +A dynamic dense block matrix class. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y_<_ _O_p_e_r_a_t_o_r_ _> │ │ │ │ │ -  Factory to assembly solvers configured by a ParameterTree. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_ _B_,_ _A_ _> │ │ │ │ │ +  A Vector of blocks with different blocksizes. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_ _B_,_ _A_ _>_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +  _I_t_e_r_a_t_o_r class for sequential access. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_ _B_,_ _A_ _>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +  _C_o_n_s_t_I_t_e_r_a_t_o_r class for sequential access. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_a_t_r_i_x_<_ _T_,_ _A_ _> │ │ │ │ │ +  A generic dynamic dense matrix. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr< _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< X, Y > > │ │ │ │ │ - (const M &, const ParameterTree &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y = Singleton< ParameterizedObjectFactory< │ │ │ │ │ - _D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e< M, X, Y > > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r< X, Y > │ │ │ │ │ - >(const std::shared_ptr< M > &, const ParameterTree &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y = Singleton< ParameterizedObjectFactory< │ │ │ │ │ - _P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e< M, X, Y > > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr< _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< X, Y │ │ │ │ │ - > >(const std::shared_ptr< _L_i_n_e_a_r_O_p_e_r_a_t_o_r< X, Y > > &, const std:: │ │ │ │ │ - shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > > &, const std::shared_ptr< │ │ │ │ │ - _P_r_e_c_o_n_d_i_t_i_o_n_e_r< X, Y > >, const ParameterTree &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y = Singleton< ParameterizedObjectFactory< │ │ │ │ │ - _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e< X, Y > > > │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r >  _D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l (const │ │ │ │ │ - std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r > &prec, │ │ │ │ │ - const O &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r >  _D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l (const │ │ │ │ │ - std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r > &prec, │ │ │ │ │ - const std::shared_ptr< │ │ │ │ │ - _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< M, X, Y, C > │ │ │ │ │ - > &op) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r >  _D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l (const │ │ │ │ │ - std::shared_ptr< _P_r_e_c_o_n_d_i_t_i_o_n_e_r > &prec, │ │ │ │ │ - const std::shared_ptr< │ │ │ │ │ - _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< M, X, Y, │ │ │ │ │ - C > > &op) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const std:: │ │ │ │ │ - shared_ptr< _M_a_t_r_i_x_A_d_a_p_t_e_r< M, X, Y > > │ │ │ │ │ - &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const std:: │ │ │ │ │ - shared_ptr< _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< │ │ │ │ │ - M, X, Y, C > > &op) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::shared_ptr< _S_c_a_l_a_r_P_r_o_d_u_c_t< X > >  _D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t (const std:: │ │ │ │ │ - shared_ptr< │ │ │ │ │ - _N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r< M, X, Y, │ │ │ │ │ - C > > &op) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::shared_ptr< _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r< _D_u_n_e_:_:_g_e_t_S_o_l_v_e_r_F_r_o_m_F_a_c_t_o_r_y (std:: │ │ │ │ │ - typename Operator::domain_type, shared_ptr< Operator > op, const │ │ │ │ │ - typename Operator::range_type > >  ParameterTree &config, std::shared_ptr< │ │ │ │ │ - _P_r_e_c_o_n_d_i_t_i_o_n_e_r< typename Operator:: │ │ │ │ │ - domain_type, typename Operator:: │ │ │ │ │ - range_type > > prec=nullptr) │ │ │ │ │ - Instantiates an _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r from an │ │ │ │ │ -  Operator and a configuration given as a │ │ │ │ │ - ParameterTree. │ │ │ │ │ +namespace   _D_u_n_e_:_:_M_a_t_r_i_x_I_m_p │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +A dynamic dense block matrix class. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solverfactory.hh Source File │ │ │ │ +dune-istl: matrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,245 +74,1258 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
solverfactory.hh
│ │ │ │ +
matrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_ISTL_SOLVERFACTORY_HH
│ │ │ │ -
7#define DUNE_ISTL_SOLVERFACTORY_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <unordered_map>
│ │ │ │ -
10#include <functional>
│ │ │ │ -
11#include <memory>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/parametertree.hh>
│ │ │ │ -
14#include <dune/common/singleton.hh>
│ │ │ │ -
15
│ │ │ │ -
16#include "solverregistry.hh"
│ │ │ │ -
17#include <dune/istl/solver.hh>
│ │ │ │ -
18#include <dune/istl/schwarz.hh>
│ │ │ │ - │ │ │ │ -
20
│ │ │ │ -
21namespace Dune{
│ │ │ │ -
26 // Direct solver factory:
│ │ │ │ -
27 template<class M, class X, class Y>
│ │ │ │ -
28 using DirectSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(const M&, const ParameterTree&);
│ │ │ │ -
29 template<class M, class X, class Y>
│ │ │ │ -
30 using DirectSolverFactory = Singleton<ParameterizedObjectFactory<DirectSolverSignature<M,X,Y>>>;
│ │ │ │ -
31
│ │ │ │ -
32 // Preconditioner factory:
│ │ │ │ -
33 template<class M, class X, class Y>
│ │ │ │ -
34 using PreconditionerSignature = std::shared_ptr<Preconditioner<X,Y>>(const std::shared_ptr<M>&, const ParameterTree&);
│ │ │ │ -
35 template<class M, class X, class Y>
│ │ │ │ -
36 using PreconditionerFactory = Singleton<ParameterizedObjectFactory<PreconditionerSignature<M,X,Y>>>;
│ │ │ │ -
37
│ │ │ │ -
38 // Iterative solver factory
│ │ │ │ -
39 template<class X, class Y>
│ │ │ │ -
40 using IterativeSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(const std::shared_ptr<LinearOperator<X,Y>>&, const std::shared_ptr<ScalarProduct<X>>&, const std::shared_ptr<Preconditioner<X,Y>>, const ParameterTree&);
│ │ │ │ -
41 template<class X, class Y>
│ │ │ │ -
42 using IterativeSolverFactory = Singleton<ParameterizedObjectFactory<IterativeSolverSignature<X,Y>>>;
│ │ │ │ -
43
│ │ │ │ -
44 // initSolverFactories differs in different compilation units, so we have it
│ │ │ │ -
45 // in an anonymous namespace
│ │ │ │ -
46 namespace {
│ │ │ │ -
47
│ │ │ │ -
53 template<class O>
│ │ │ │ -
54 int initSolverFactories(){
│ │ │ │ -
55 using M = typename O::matrix_type;
│ │ │ │ -
56 using X = typename O::range_type;
│ │ │ │ -
57 using Y = typename O::domain_type;
│ │ │ │ -
58 using TL = Dune::TypeList<M,X,Y>;
│ │ │ │ - │ │ │ │ -
60 addRegistryToFactory<TL>(dsfac, DirectSolverTag{});
│ │ │ │ - │ │ │ │ -
62 addRegistryToFactory<TL>(pfac, PreconditionerTag{});
│ │ │ │ -
63 using TLS = Dune::TypeList<X,Y>;
│ │ │ │ - │ │ │ │ -
65 return addRegistryToFactory<TLS>(isfac, IterativeSolverTag{});
│ │ │ │ -
66 }
│ │ │ │ -
77 template<class O, class X, class Y>
│ │ │ │ -
78 [[deprecated("Use method 'initSolverFactories<O>' instead")]]
│ │ │ │ -
79 int initSolverFactories() {
│ │ │ │ -
80 return initSolverFactories<O>();
│ │ │ │ -
81 }
│ │ │ │ -
82 } // end anonymous namespace
│ │ │ │ -
83
│ │ │ │ -
84
│ │ │ │ -
85 template<class O, class Preconditioner>
│ │ │ │ -
│ │ │ │ -
86 std::shared_ptr<Preconditioner> wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
│ │ │ │ -
87 const O&)
│ │ │ │ -
88 {
│ │ │ │ -
89 return prec;
│ │ │ │ -
90 }
│ │ │ │ -
│ │ │ │ -
91
│ │ │ │ -
92 template<class M, class X, class Y, class C, class Preconditioner>
│ │ │ │ -
93 std::shared_ptr<Preconditioner>
│ │ │ │ -
│ │ │ │ -
94 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
│ │ │ │ -
95 const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ -
96 {
│ │ │ │ -
97 return std::make_shared<BlockPreconditioner<X,Y,C,Preconditioner> >(prec, op->getCommunication());
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
100 template<class M, class X, class Y, class C, class Preconditioner>
│ │ │ │ -
101 std::shared_ptr<Preconditioner>
│ │ │ │ -
│ │ │ │ -
102 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
│ │ │ │ -
103 const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ -
104 {
│ │ │ │ -
105 return std::make_shared<NonoverlappingBlockPreconditioner<C,Preconditioner> >(prec, op->getCommunication());
│ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ -
107
│ │ │ │ -
108 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
109 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<MatrixAdapter<M,X,Y> >&)
│ │ │ │ -
110 {
│ │ │ │ -
111 return std::make_shared<SeqScalarProduct<X>>();
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ -
114 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ -
115 {
│ │ │ │ -
116 return createScalarProduct<X>(op->getCommunication(), op->category());
│ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
119 template<class M, class X, class Y, class C>
│ │ │ │ -
│ │ │ │ -
120 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
│ │ │ │ -
121 {
│ │ │ │ -
122 return createScalarProduct<X>(op->getCommunication(), op->category());
│ │ │ │ -
123 }
│ │ │ │ -
│ │ │ │ -
124
│ │ │ │ -
144 template<class Operator>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
146 using Domain = typename Operator::domain_type;
│ │ │ │ -
147 using Range = typename Operator::range_type;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
150
│ │ │ │ -
151 template<class O>
│ │ │ │ -
152 using _matrix_type = typename O::matrix_type;
│ │ │ │ -
153 using matrix_type = Std::detected_or_t<int, _matrix_type, Operator>;
│ │ │ │ -
154 static constexpr bool isAssembled = !std::is_same<matrix_type, int>::value;
│ │ │ │ -
155
│ │ │ │ -
156 static const matrix_type* getmat(std::shared_ptr<Operator> op){
│ │ │ │ -
157 std::shared_ptr<AssembledLinearOperator<matrix_type, Domain, Range>> aop
│ │ │ │ -
158 = std::dynamic_pointer_cast<AssembledLinearOperator<matrix_type, Domain, Range>>(op);
│ │ │ │ -
159 if(aop)
│ │ │ │ -
160 return &aop->getmat();
│ │ │ │ -
161 return nullptr;
│ │ │ │ -
162 }
│ │ │ │ -
163
│ │ │ │ -
164 public:
│ │ │ │ -
165
│ │ │ │ -
│ │ │ │ -
168 static std::shared_ptr<Solver> get(std::shared_ptr<Operator> op,
│ │ │ │ -
169 const ParameterTree& config,
│ │ │ │ -
170 std::shared_ptr<Preconditioner> prec = nullptr){
│ │ │ │ -
171 std::string type = config.get<std::string>("type");
│ │ │ │ -
172 std::shared_ptr<Solver> result;
│ │ │ │ -
173 const matrix_type* mat = getmat(op);
│ │ │ │ -
174 if(mat){
│ │ │ │ - │ │ │ │ -
176 if(op->category()!=SolverCategory::sequential){
│ │ │ │ -
177 DUNE_THROW(NotImplemented, "The solver factory does not support parallel direct solvers!");
│ │ │ │ -
178 }
│ │ │ │ -
179 result = DirectSolverFactory<matrix_type, Domain, Range>::instance().create(type, *mat, config);
│ │ │ │ -
180 return result;
│ │ │ │ -
181 }
│ │ │ │ -
182 }
│ │ │ │ -
183 // if no direct solver is found it might be an iterative solver
│ │ │ │ - │ │ │ │ -
185 DUNE_THROW(Dune::InvalidStateException, "Solver not found in the factory.");
│ │ │ │ -
186 }
│ │ │ │ -
187 if(!prec){
│ │ │ │ -
188 const ParameterTree& precConfig = config.sub("preconditioner");
│ │ │ │ -
189 std::string prec_type = precConfig.get<std::string>("type");
│ │ │ │ -
190 prec = PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, precConfig);
│ │ │ │ -
191 if (prec->category() != op->category() && prec->category() == SolverCategory::sequential)
│ │ │ │ -
192 // try to wrap to a parallel preconditioner
│ │ │ │ -
193 prec = wrapPreconditioner4Parallel(prec, op);
│ │ │ │ -
194 }
│ │ │ │ -
195 std::shared_ptr<ScalarProduct<Domain>> sp = createScalarProduct(op);
│ │ │ │ -
196 result = IterativeSolverFactory<Domain, Range>::instance().create(type, op, sp, prec, config);
│ │ │ │ -
197 return result;
│ │ │ │ -
198 }
│ │ │ │ -
│ │ │ │ -
199
│ │ │ │ -
│ │ │ │ -
203 static std::shared_ptr<Preconditioner> getPreconditioner(std::shared_ptr<Operator> op,
│ │ │ │ -
204 const ParameterTree& config){
│ │ │ │ -
205 const matrix_type* mat = getmat(op);
│ │ │ │ -
206 if(mat){
│ │ │ │ -
207 std::string prec_type = config.get<std::string>("type");
│ │ │ │ -
208 return PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, config);
│ │ │ │ -
209 }else{
│ │ │ │ -
210 DUNE_THROW(InvalidStateException, "Could not obtain matrix from operator. Please pass in an AssembledLinearOperator.");
│ │ │ │ -
211 }
│ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
213 };
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
225 template<class Operator>
│ │ │ │ -
226 std::shared_ptr<InverseOperator<typename Operator::domain_type,
│ │ │ │ -
│ │ │ │ -
227 typename Operator::range_type>> getSolverFromFactory(std::shared_ptr<Operator> op,
│ │ │ │ -
228 const ParameterTree& config,
│ │ │ │ -
229 std::shared_ptr<Preconditioner<typename Operator::domain_type,
│ │ │ │ -
230 typename Operator::range_type>> prec = nullptr){
│ │ │ │ -
231 return SolverFactory<Operator>::get(op, config, prec);
│ │ │ │ -
232 }
│ │ │ │ -
│ │ │ │ -
233
│ │ │ │ -
237} // end namespace Dune
│ │ │ │ -
238
│ │ │ │ +
5#ifndef DUNE_ISTL_MATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_MATRIX_HH
│ │ │ │ +
7
│ │ │ │ +
12#include <cmath>
│ │ │ │ +
13#include <memory>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/ftraits.hh>
│ │ │ │ +
16#include <dune/common/typetraits.hh>
│ │ │ │ +
17#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
18#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
19
│ │ │ │ +
20#include <dune/istl/bvector.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25
│ │ │ │ +
│ │ │ │ +
26namespace MatrixImp
│ │ │ │ +
27{
│ │ │ │ +
39 template<class B, class A=std::allocator<B> >
│ │ │ │ +
│ │ │ │ +
40 class DenseMatrixBase : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ +
41 // this derivation gives us all the blas level 1 and norms
│ │ │ │ +
42 // on the large array. However, access operators have to be
│ │ │ │ +
43 // overwritten.
│ │ │ │ +
44 {
│ │ │ │ +
45 public:
│ │ │ │ +
46
│ │ │ │ +
47 //===== type definitions and constants
│ │ │ │ +
48
│ │ │ │ +
50 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
51
│ │ │ │ +
53 typedef A allocator_type;
│ │ │ │ +
54
│ │ │ │ +
56 typedef typename A::size_type size_type;
│ │ │ │ +
57
│ │ │ │ + │ │ │ │ +
64
│ │ │ │ + │ │ │ │ +
68
│ │ │ │ +
69 // just a shorthand
│ │ │ │ +
70 typedef Imp::BlockVectorWindow<B,A> window_type;
│ │ │ │ +
71
│ │ │ │ + │ │ │ │ +
73
│ │ │ │ + │ │ │ │ +
75
│ │ │ │ +
76
│ │ │ │ +
77 //===== constructors and such
│ │ │ │ +
78
│ │ │ │ +
│ │ │ │ +
82 DenseMatrixBase () : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ +
83 {
│ │ │ │ +
84 // nothing is known ...
│ │ │ │ +
85 rows_ = 0;
│ │ │ │ +
86 columns_ = 0;
│ │ │ │ +
87 }
│ │ │ │ +
│ │ │ │ +
88
│ │ │ │ +
│ │ │ │ +
95 DenseMatrixBase (size_type rows, size_type columns) : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ +
96 {
│ │ │ │ +
97 // and we can allocate the big array in the base class
│ │ │ │ +
98 this->n = rows*columns;
│ │ │ │ +
99 columns_ = columns;
│ │ │ │ +
100 if (this->n>0)
│ │ │ │ +
101 {
│ │ │ │ +
102 this->p = allocator_.allocate(this->n);
│ │ │ │ +
103 new (this->p)B[this->n];
│ │ │ │ +
104 }
│ │ │ │ +
105 else
│ │ │ │ +
106 {
│ │ │ │ +
107 this->n = 0;
│ │ │ │ +
108 this->p = 0;
│ │ │ │ +
109 }
│ │ │ │ +
110
│ │ │ │ +
111 // we can allocate the windows now
│ │ │ │ +
112 rows_ = rows;
│ │ │ │ +
113 }
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 {
│ │ │ │ +
118 // allocate the big array in the base class
│ │ │ │ +
119 this->n = a.n;
│ │ │ │ +
120 columns_ = a.columns_;
│ │ │ │ +
121 if (this->n>0)
│ │ │ │ +
122 {
│ │ │ │ +
123 // allocate and construct objects
│ │ │ │ +
124 this->p = allocator_.allocate(this->n);
│ │ │ │ +
125 new (this->p)B[this->n];
│ │ │ │ +
126
│ │ │ │ +
127 // copy data
│ │ │ │ +
128 for (size_type i=0; i<this->n; i++)
│ │ │ │ +
129 this->p[i]=a.p[i];
│ │ │ │ +
130 }
│ │ │ │ +
131 else
│ │ │ │ +
132 {
│ │ │ │ +
133 this->n = 0;
│ │ │ │ +
134 this->p = nullptr;
│ │ │ │ +
135 }
│ │ │ │ +
136
│ │ │ │ +
137 // we can allocate the windows now
│ │ │ │ +
138 rows_ = a.rows_;
│ │ │ │ +
139 }
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
143 {
│ │ │ │ +
144 if (this->n>0) {
│ │ │ │ +
145 size_type i=this->n;
│ │ │ │ +
146 while (i)
│ │ │ │ +
147 this->p[--i].~B();
│ │ │ │ +
148 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
149 }
│ │ │ │ +
150 }
│ │ │ │ +
│ │ │ │ +
151
│ │ │ │ +
│ │ │ │ +
153 void resize (size_type rows, size_type columns)
│ │ │ │ +
154 {
│ │ │ │ +
155 // deconstruct objects and deallocate memory if necessary
│ │ │ │ +
156 if (this->n>0) {
│ │ │ │ +
157 size_type i=this->n;
│ │ │ │ +
158 while (i)
│ │ │ │ +
159 this->p[--i].~B();
│ │ │ │ +
160 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
161 }
│ │ │ │ +
162
│ │ │ │ +
163 // and we can allocate the big array in the base class
│ │ │ │ +
164 this->n = rows*columns;
│ │ │ │ +
165 if (this->n>0)
│ │ │ │ +
166 {
│ │ │ │ +
167 this->p = allocator_.allocate(this->n);
│ │ │ │ +
168 new (this->p)B[this->n];
│ │ │ │ +
169 }
│ │ │ │ +
170 else
│ │ │ │ +
171 {
│ │ │ │ +
172 this->n = 0;
│ │ │ │ +
173 this->p = nullptr;
│ │ │ │ +
174 }
│ │ │ │ +
175
│ │ │ │ +
176 // we can allocate the windows now
│ │ │ │ +
177 rows_ = rows;
│ │ │ │ +
178 columns_ = columns;
│ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
183 {
│ │ │ │ +
184 if (&a!=this) // check if this and a are different objects
│ │ │ │ +
185 {
│ │ │ │ +
186 columns_ = a.columns_;
│ │ │ │ +
187 // reallocate arrays if necessary
│ │ │ │ +
188 // Note: still the block sizes may vary !
│ │ │ │ +
189 if (this->n!=a.n || rows_!=a.rows_)
│ │ │ │ +
190 {
│ │ │ │ +
191 // deconstruct objects and deallocate memory if necessary
│ │ │ │ +
192 if (this->n>0) {
│ │ │ │ +
193 size_type i=this->n;
│ │ │ │ +
194 while (i)
│ │ │ │ +
195 this->p[--i].~B();
│ │ │ │ +
196 allocator_.deallocate(this->p,this->n);
│ │ │ │ +
197 }
│ │ │ │ +
198
│ │ │ │ +
199 // allocate the big array in the base class
│ │ │ │ +
200 this->n = a.n;
│ │ │ │ +
201 if (this->n>0)
│ │ │ │ +
202 {
│ │ │ │ +
203 // allocate and construct objects
│ │ │ │ +
204 this->p = allocator_.allocate(this->n);
│ │ │ │ +
205 new (this->p)B[this->n];
│ │ │ │ +
206 }
│ │ │ │ +
207 else
│ │ │ │ +
208 {
│ │ │ │ +
209 this->n = 0;
│ │ │ │ +
210 this->p = nullptr;
│ │ │ │ +
211 }
│ │ │ │ +
212
│ │ │ │ +
213 // Copy number of rows
│ │ │ │ +
214 rows_ = a.rows_;
│ │ │ │ +
215 }
│ │ │ │ +
216
│ │ │ │ +
217 // and copy the data
│ │ │ │ +
218 for (size_type i=0; i<this->n; i++)
│ │ │ │ +
219 this->p[i]=a.p[i];
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ +
222 return *this;
│ │ │ │ +
223 }
│ │ │ │ +
│ │ │ │ +
224
│ │ │ │ +
225
│ │ │ │ +
226 //===== assignment from scalar
│ │ │ │ +
227
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
230 {
│ │ │ │ +
231 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ +
232 return *this;
│ │ │ │ +
233 }
│ │ │ │ +
│ │ │ │ +
234
│ │ │ │ +
235
│ │ │ │ +
236 //===== access to components
│ │ │ │ +
237 // has to be overwritten from base class because it must
│ │ │ │ +
238 // return access to the windows
│ │ │ │
239
│ │ │ │ -
240#endif
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Define general, extensible interface for inverse operators.
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > PreconditionerFactory
Definition solverfactory.hh:36
│ │ │ │ -
Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > DirectSolverFactory
Definition solverfactory.hh:30
│ │ │ │ -
std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &) IterativeSolverSignature
Definition solverfactory.hh:40
│ │ │ │ -
std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::shared_ptr< Preconditioner > &prec, const O &)
Definition solverfactory.hh:86
│ │ │ │ -
std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) DirectSolverSignature
Definition solverfactory.hh:28
│ │ │ │ -
std::shared_ptr< InverseOperator< typename Operator::domain_type, typename Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner< typename Operator::domain_type, typename Operator::range_type > > prec=nullptr)
Instantiates an InverseOperator from an Operator and a configuration given as a ParameterTree.
Definition solverfactory.hh:227
│ │ │ │ -
Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > IterativeSolverFactory
Definition solverfactory.hh:42
│ │ │ │ -
std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &) PreconditionerSignature
Definition solverfactory.hh:34
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
242 {
│ │ │ │ +
243#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
244 if (i>=rows_) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
245#endif
│ │ │ │ +
246 return window_type(this->p + i*columns_, columns_);
│ │ │ │ +
247 }
│ │ │ │ +
│ │ │ │ +
248
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
251 {
│ │ │ │ +
252#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
253 if (i<0 || i>=rows_) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
254#endif
│ │ │ │ +
255 return window_type(this->p + i*columns_, columns_);
│ │ │ │ +
256 }
│ │ │ │ +
│ │ │ │ +
257
│ │ │ │ +
258 // forward declaration
│ │ │ │ +
259 class ConstIterator;
│ │ │ │ +
260
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
263 {
│ │ │ │ +
264 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
267 : window_(nullptr,0)
│ │ │ │ +
268 {
│ │ │ │ +
269 i = 0;
│ │ │ │ +
270 }
│ │ │ │ +
│ │ │ │ +
271
│ │ │ │ +
272 Iterator (Iterator& other) = default;
│ │ │ │ +
273 Iterator (Iterator&& other) = default;
│ │ │ │ +
274
│ │ │ │ +
│ │ │ │ +
276 Iterator (B* data, size_type columns, size_type _i)
│ │ │ │ +
277 : i(_i),
│ │ │ │ +
278 window_(data + _i*columns, columns)
│ │ │ │ +
279 {}
│ │ │ │ +
│ │ │ │ +
280
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
283 {
│ │ │ │ +
284 i = other.i;
│ │ │ │ +
285 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ +
286 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ +
287 return *this;
│ │ │ │ +
288 }
│ │ │ │ +
│ │ │ │ +
289
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
292 {
│ │ │ │ +
293 i = other.i;
│ │ │ │ +
294 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ +
295 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ +
296 return *this;
│ │ │ │ +
297 }
│ │ │ │ +
│ │ │ │ +
298
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
301 {
│ │ │ │ +
302 ++i;
│ │ │ │ +
303 window_.setptr(window_.getptr()+window_.getsize());
│ │ │ │ +
304 return *this;
│ │ │ │ +
305 }
│ │ │ │ +
│ │ │ │ +
306
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
309 {
│ │ │ │ +
310 --i;
│ │ │ │ +
311 window_.setptr(window_.getptr()-window_.getsize());
│ │ │ │ +
312 return *this;
│ │ │ │ +
313 }
│ │ │ │ +
│ │ │ │ +
314
│ │ │ │ +
│ │ │ │ +
316 bool operator== (const Iterator& it) const
│ │ │ │ +
317 {
│ │ │ │ +
318 return window_.getptr() == it.window_.getptr();
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
│ │ │ │ +
322 bool operator!= (const Iterator& it) const
│ │ │ │ +
323 {
│ │ │ │ +
324 return window_.getptr() != it.window_.getptr();
│ │ │ │ +
325 }
│ │ │ │ +
│ │ │ │ +
326
│ │ │ │ +
│ │ │ │ +
328 bool operator== (const ConstIterator& it) const
│ │ │ │ +
329 {
│ │ │ │ +
330 return window_.getptr() == it.window_.getptr();
│ │ │ │ +
331 }
│ │ │ │ +
│ │ │ │ +
332
│ │ │ │ +
│ │ │ │ +
334 bool operator!= (const ConstIterator& it) const
│ │ │ │ +
335 {
│ │ │ │ +
336 return window_.getptr() != it.window_.getptr();
│ │ │ │ +
337 }
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
341 {
│ │ │ │ +
342 return window_;
│ │ │ │ +
343 }
│ │ │ │ +
│ │ │ │ +
344
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
347 {
│ │ │ │ +
348 return &window_;
│ │ │ │ +
349 }
│ │ │ │ +
│ │ │ │ +
350
│ │ │ │ +
351 // return index corresponding to pointer
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
353 {
│ │ │ │ +
354 return i;
│ │ │ │ +
355 }
│ │ │ │ +
│ │ │ │ +
356
│ │ │ │ +
357 friend class ConstIterator;
│ │ │ │ +
358
│ │ │ │ +
359 private:
│ │ │ │ +
360 size_type i;
│ │ │ │ +
361 mutable window_type window_;
│ │ │ │ +
362 };
│ │ │ │ +
│ │ │ │ +
363
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
366 {
│ │ │ │ +
367 return Iterator(this->p, columns_, 0);
│ │ │ │ +
368 }
│ │ │ │ +
│ │ │ │ +
369
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
372 {
│ │ │ │ +
373 return Iterator(this->p, columns_, rows_);
│ │ │ │ +
374 }
│ │ │ │ +
│ │ │ │ +
375
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
379 {
│ │ │ │ +
380 return Iterator(this->p, columns_, rows_-1);
│ │ │ │ +
381 }
│ │ │ │ +
│ │ │ │ +
382
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
386 {
│ │ │ │ +
387 return Iterator(this->p, columns_, -1);
│ │ │ │ +
388 }
│ │ │ │ +
│ │ │ │ +
389
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
392 {
│ │ │ │ +
393 return Iterator(this->p, columns_, std::min(i,rows_));
│ │ │ │ +
394 }
│ │ │ │ +
│ │ │ │ +
395
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
398 {
│ │ │ │ +
399 return ConstIterator(this->p, columns_, std::min(i,rows_));
│ │ │ │ +
400 }
│ │ │ │ +
│ │ │ │ +
401
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
404 {
│ │ │ │ +
405 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
408 : window_(nullptr,0)
│ │ │ │ +
409 {
│ │ │ │ +
410 i = 0;
│ │ │ │ +
411 }
│ │ │ │ +
│ │ │ │ +
412
│ │ │ │ +
│ │ │ │ +
414 ConstIterator (const B* data, size_type columns, size_type _i)
│ │ │ │ +
415 : i(_i),
│ │ │ │ +
416 window_(const_cast<B*>(data + _i * columns), columns)
│ │ │ │ +
417 {}
│ │ │ │ +
│ │ │ │ +
418
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize())
│ │ │ │ +
422 {}
│ │ │ │ +
│ │ │ │ +
423
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
425 {
│ │ │ │ +
426 i = other.i;
│ │ │ │ +
427 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ +
428 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ +
429 return *this;
│ │ │ │ +
430 }
│ │ │ │ +
│ │ │ │ +
431
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
433 {
│ │ │ │ +
434 i = other.i;
│ │ │ │ +
435 // Do NOT use window_.operator=, because that copies the window content, not just the window!
│ │ │ │ +
436 window_.set(other.window_.getsize(),other.window_.getptr());
│ │ │ │ +
437 return *this;
│ │ │ │ +
438 }
│ │ │ │ +
│ │ │ │ +
439
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
442 {
│ │ │ │ +
443 ++i;
│ │ │ │ +
444 window_.setptr(window_.getptr()+window_.getsize());
│ │ │ │ +
445 return *this;
│ │ │ │ +
446 }
│ │ │ │ +
│ │ │ │ +
447
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
450 {
│ │ │ │ +
451 --i;
│ │ │ │ +
452 window_.setptr(window_.getptr()-window_.getsize());
│ │ │ │ +
453 return *this;
│ │ │ │ +
454 }
│ │ │ │ +
│ │ │ │ +
455
│ │ │ │ +
│ │ │ │ +
457 bool operator== (const ConstIterator& it) const
│ │ │ │ +
458 {
│ │ │ │ +
459 return window_.getptr() == it.window_.getptr();
│ │ │ │ +
460 }
│ │ │ │ +
│ │ │ │ +
461
│ │ │ │ +
│ │ │ │ +
463 bool operator!= (const ConstIterator& it) const
│ │ │ │ +
464 {
│ │ │ │ +
465 return window_.getptr() != it.window_.getptr();
│ │ │ │ +
466 }
│ │ │ │ +
│ │ │ │ +
467
│ │ │ │ +
│ │ │ │ +
469 bool operator== (const Iterator& it) const
│ │ │ │ +
470 {
│ │ │ │ +
471 return window_.getptr() == it.window_.getptr();
│ │ │ │ +
472 }
│ │ │ │ +
│ │ │ │ +
473
│ │ │ │ +
│ │ │ │ +
475 bool operator!= (const Iterator& it) const
│ │ │ │ +
476 {
│ │ │ │ +
477 return window_.getptr() != it.window_.getptr();
│ │ │ │ +
478 }
│ │ │ │ +
│ │ │ │ +
479
│ │ │ │ +
│ │ │ │ +
481 const window_type& operator* () const
│ │ │ │ +
482 {
│ │ │ │ +
483 return window_;
│ │ │ │ +
484 }
│ │ │ │ +
│ │ │ │ +
485
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
488 {
│ │ │ │ +
489 return &window_;
│ │ │ │ +
490 }
│ │ │ │ +
│ │ │ │ +
491
│ │ │ │ +
492 // return index corresponding to pointer
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
494 {
│ │ │ │ +
495 return i;
│ │ │ │ +
496 }
│ │ │ │ +
│ │ │ │ +
497
│ │ │ │ +
498 friend class Iterator;
│ │ │ │ +
499
│ │ │ │ +
500 private:
│ │ │ │ +
501 size_type i;
│ │ │ │ +
502 mutable window_type window_;
│ │ │ │ +
503 };
│ │ │ │ +
│ │ │ │ +
504
│ │ │ │ + │ │ │ │ +
507
│ │ │ │ + │ │ │ │ +
510
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
513 {
│ │ │ │ +
514 return ConstIterator(this->p, columns_, 0);
│ │ │ │ +
515 }
│ │ │ │ +
│ │ │ │ +
516
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
519 {
│ │ │ │ +
520 return ConstIterator(this->p, columns_, rows_);
│ │ │ │ +
521 }
│ │ │ │ +
│ │ │ │ +
522
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
526 {
│ │ │ │ +
527 return ConstIterator(this->p, columns_, rows_-1);
│ │ │ │ +
528 }
│ │ │ │ +
│ │ │ │ +
529
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
532 {
│ │ │ │ +
533 return ConstIterator(this->p, columns_, -1);
│ │ │ │ +
534 }
│ │ │ │ +
│ │ │ │ +
535
│ │ │ │ +
536 //===== sizes
│ │ │ │ +
537
│ │ │ │ +
│ │ │ │ +
539 size_type N () const
│ │ │ │ +
540 {
│ │ │ │ +
541 return rows_;
│ │ │ │ +
542 }
│ │ │ │ +
│ │ │ │ +
543
│ │ │ │ +
544
│ │ │ │ +
545 private:
│ │ │ │ +
546 size_type rows_; // number of matrix rows
│ │ │ │ +
547 size_type columns_; // number of matrix columns
│ │ │ │ +
548
│ │ │ │ +
549 A allocator_;
│ │ │ │ +
550 };
│ │ │ │ +
│ │ │ │ +
551
│ │ │ │ +
552} // namespace MatrixImp
│ │ │ │ +
│ │ │ │ +
553
│ │ │ │ +
559 template<class T, class A=std::allocator<T> >
│ │ │ │ +
│ │ │ │ +
560 class Matrix
│ │ │ │ +
561 {
│ │ │ │ +
562 public:
│ │ │ │ +
563
│ │ │ │ +
565 using field_type = typename Imp::BlockTraits<T>::field_type;
│ │ │ │ +
566
│ │ │ │ +
568 typedef T block_type;
│ │ │ │ +
569
│ │ │ │ +
571 typedef A allocator_type;
│ │ │ │ +
572
│ │ │ │ + │ │ │ │ +
575
│ │ │ │ +
577 typedef typename A::size_type size_type;
│ │ │ │ +
578
│ │ │ │ + │ │ │ │ +
581
│ │ │ │ +
583 typedef typename row_type::iterator ColIterator;
│ │ │ │ +
584
│ │ │ │ + │ │ │ │ +
587
│ │ │ │ +
589 typedef typename row_type::const_iterator ConstColIterator;
│ │ │ │ +
590
│ │ │ │ +
592 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
593 static constexpr auto blocklevel = blockLevel<T>()+1;
│ │ │ │ +
594
│ │ │ │ +
│ │ │ │ +
596 Matrix() : data_(0,0), cols_(0)
│ │ │ │ +
597 {}
│ │ │ │ +
│ │ │ │ +
598
│ │ │ │ +
│ │ │ │ +
601 Matrix(size_type rows, size_type cols) : data_(rows,cols), cols_(cols)
│ │ │ │ +
602 {}
│ │ │ │ +
│ │ │ │ +
603
│ │ │ │ +
│ │ │ │ +
608 void setSize(size_type rows, size_type cols) {
│ │ │ │ +
609 data_.resize(rows,cols);
│ │ │ │ +
610 cols_ = cols;
│ │ │ │ +
611 }
│ │ │ │ +
│ │ │ │ +
612
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
615 {
│ │ │ │ +
616 return data_.begin();
│ │ │ │ +
617 }
│ │ │ │ +
│ │ │ │ +
618
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
621 {
│ │ │ │ +
622 return data_.end();
│ │ │ │ +
623 }
│ │ │ │ +
│ │ │ │ +
624
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
628 {
│ │ │ │ +
629 return data_.beforeEnd();
│ │ │ │ +
630 }
│ │ │ │ +
│ │ │ │ +
631
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
635 {
│ │ │ │ +
636 return data_.beforeBegin();
│ │ │ │ +
637 }
│ │ │ │ +
│ │ │ │ +
638
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
641 {
│ │ │ │ +
642 return data_.begin();
│ │ │ │ +
643 }
│ │ │ │ +
│ │ │ │ +
644
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
647 {
│ │ │ │ +
648 return data_.end();
│ │ │ │ +
649 }
│ │ │ │ +
│ │ │ │ +
650
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
654 {
│ │ │ │ +
655 return data_.beforeEnd();
│ │ │ │ +
656 }
│ │ │ │ +
│ │ │ │ +
657
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
661 {
│ │ │ │ +
662 return data_.beforeBegin();
│ │ │ │ +
663 }
│ │ │ │ +
│ │ │ │ +
664
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
667 {
│ │ │ │ +
668 data_ = t;
│ │ │ │ +
669 return *this;
│ │ │ │ +
670 }
│ │ │ │ +
│ │ │ │ +
671
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
674#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
675 if (row<0)
│ │ │ │ +
676 DUNE_THROW(ISTLError, "Can't access negative rows!");
│ │ │ │ +
677 if (row>=N())
│ │ │ │ +
678 DUNE_THROW(ISTLError, "Row index out of range!");
│ │ │ │ +
679#endif
│ │ │ │ +
680 return data_[row];
│ │ │ │ +
681 }
│ │ │ │ +
│ │ │ │ +
682
│ │ │ │ +
│ │ │ │ +
684 const row_type operator[](size_type row) const {
│ │ │ │ +
685#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
686 if (row<0)
│ │ │ │ +
687 DUNE_THROW(ISTLError, "Can't access negative rows!");
│ │ │ │ +
688 if (row>=N())
│ │ │ │ +
689 DUNE_THROW(ISTLError, "Row index out of range!");
│ │ │ │ +
690#endif
│ │ │ │ +
691 return data_[row];
│ │ │ │ +
692 }
│ │ │ │ +
│ │ │ │ +
693
│ │ │ │ +
│ │ │ │ +
695 size_type N() const {
│ │ │ │ +
696 return data_.N();
│ │ │ │ +
697 }
│ │ │ │ +
│ │ │ │ +
698
│ │ │ │ +
│ │ │ │ +
700 size_type M() const {
│ │ │ │ +
701 return cols_;
│ │ │ │ +
702 }
│ │ │ │ +
│ │ │ │ +
703
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
706 data_ *= scalar;
│ │ │ │ +
707 return (*this);
│ │ │ │ +
708 }
│ │ │ │ +
│ │ │ │ +
709
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
712 data_ /= scalar;
│ │ │ │ +
713 return (*this);
│ │ │ │ +
714 }
│ │ │ │ +
│ │ │ │ +
715
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
722#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
723 if(N()!=b.N() || M() != b.M())
│ │ │ │ +
724 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ +
725#endif
│ │ │ │ +
726 data_ += b.data_;
│ │ │ │ +
727 return (*this);
│ │ │ │ +
728 }
│ │ │ │ +
│ │ │ │ +
729
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
736#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
737 if(N()!=b.N() || M() != b.M())
│ │ │ │ +
738 DUNE_THROW(RangeError, "Matrix sizes do not match!");
│ │ │ │ +
739#endif
│ │ │ │ +
740 data_ -= b.data_;
│ │ │ │ +
741 return (*this);
│ │ │ │ +
742 }
│ │ │ │ +
│ │ │ │ +
743
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
746 Matrix out(M(), N());
│ │ │ │ +
747 for (size_type i=0; i<N(); i++)
│ │ │ │ +
748 for (size_type j=0; j<M(); j++)
│ │ │ │ +
749 out[j][i] = (*this)[i][j];
│ │ │ │ +
750
│ │ │ │ +
751 return out;
│ │ │ │ +
752 }
│ │ │ │ +
│ │ │ │ +
753
│ │ │ │ +
│ │ │ │ +
755 friend Matrix<T> operator*(const Matrix<T>& m1, const Matrix<T>& m2) {
│ │ │ │ +
756 Matrix<T> out(m1.N(), m2.M());
│ │ │ │ +
757 out = 0;
│ │ │ │ +
758
│ │ │ │ +
759 for (size_type i=0; i<out.N(); i++ ) {
│ │ │ │ +
760 for ( size_type j=0; j<out.M(); j++ )
│ │ │ │ +
761 for (size_type k=0; k<m1.M(); k++)
│ │ │ │ +
762 out[i][j] += m1[i][k]*m2[k][j];
│ │ │ │ +
763 }
│ │ │ │ +
764
│ │ │ │ +
765 return out;
│ │ │ │ +
766 }
│ │ │ │ +
│ │ │ │ +
767
│ │ │ │ +
769 template <class X, class Y>
│ │ │ │ +
│ │ │ │ +
770 friend Y operator*(const Matrix<T>& m, const X& vec) {
│ │ │ │ +
771#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
772 if (m.M()!=vec.size())
│ │ │ │ +
773 DUNE_THROW(ISTLError, "Vector size doesn't match the number of matrix columns!");
│ │ │ │ +
774#endif
│ │ │ │ +
775 Y out(m.N());
│ │ │ │ +
776 out = 0;
│ │ │ │ +
777
│ │ │ │ +
778 for (size_type i=0; i<out.size(); i++ ) {
│ │ │ │ +
779 for ( size_type j=0; j<vec.size(); j++ )
│ │ │ │ +
780 out[i] += m[i][j]*vec[j];
│ │ │ │ +
781 }
│ │ │ │ +
782
│ │ │ │ +
783 return out;
│ │ │ │ +
784 }
│ │ │ │ +
│ │ │ │ +
785
│ │ │ │ +
787 template <class X, class Y>
│ │ │ │ +
│ │ │ │ +
788 void mv(const X& x, Y& y) const
│ │ │ │ +
789 {
│ │ │ │ +
790#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
791 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
792 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
793#endif
│ │ │ │ +
794 for (size_type i=0; i<data_.N(); i++) {
│ │ │ │ +
795 y[i]=0;
│ │ │ │ +
796 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
797 {
│ │ │ │ +
798 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ +
799 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ +
800 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
│ │ │ │ +
801 }
│ │ │ │ +
802 }
│ │ │ │ +
803 }
│ │ │ │ +
│ │ │ │ +
804
│ │ │ │ +
806 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
807 void mtv (const X& x, Y& y) const
│ │ │ │ +
808 {
│ │ │ │ +
809#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
810 if (x.N()!=N()) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
811 if (y.N()!=M()) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
812#endif
│ │ │ │ +
813 for(size_type i=0; i<y.N(); ++i)
│ │ │ │ +
814 y[i]=0;
│ │ │ │ +
815 umtv(x,y);
│ │ │ │ +
816 }
│ │ │ │ +
│ │ │ │ +
817
│ │ │ │ +
819 template <class X, class Y>
│ │ │ │ +
│ │ │ │ +
820 void umv(const X& x, Y& y) const
│ │ │ │ +
821 {
│ │ │ │ +
822#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
823 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
824 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
825#endif
│ │ │ │ +
826 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
827 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
828 {
│ │ │ │ +
829 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ +
830 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ +
831 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
│ │ │ │ +
832 }
│ │ │ │ +
833 }
│ │ │ │ +
│ │ │ │ +
834
│ │ │ │ +
836 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
837 void mmv (const X& x, Y& y) const
│ │ │ │ +
838 {
│ │ │ │ +
839#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
840 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
841 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
842#endif
│ │ │ │ +
843 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
844 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
845 {
│ │ │ │ +
846 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ +
847 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ +
848 Impl::asMatrix((*this)[i][j]).mmv(xj, yi);
│ │ │ │ +
849 }
│ │ │ │ +
850 }
│ │ │ │ +
│ │ │ │ +
851
│ │ │ │ +
853 template <class X, class Y>
│ │ │ │ +
│ │ │ │ +
854 void usmv(const field_type& alpha, const X& x, Y& y) const
│ │ │ │ +
855 {
│ │ │ │ +
856#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
857 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
858 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
859#endif
│ │ │ │ +
860 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
861 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
862 {
│ │ │ │ +
863 auto&& xj = Impl::asVector(x[j]);
│ │ │ │ +
864 auto&& yi = Impl::asVector(y[i]);
│ │ │ │ +
865 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi);
│ │ │ │ +
866 }
│ │ │ │ +
867 }
│ │ │ │ +
│ │ │ │ +
868
│ │ │ │ +
870 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
871 void umtv (const X& x, Y& y) const
│ │ │ │ +
872 {
│ │ │ │ +
873#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
874 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
875 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
876#endif
│ │ │ │ +
877 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
878 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
879 {
│ │ │ │ +
880 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ +
881 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ +
882 Impl::asMatrix((*this)[i][j]).umtv(xi, yj);
│ │ │ │ +
883 }
│ │ │ │ +
884 }
│ │ │ │ +
│ │ │ │ +
885
│ │ │ │ +
887 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
888 void mmtv (const X& x, Y& y) const
│ │ │ │ +
889 {
│ │ │ │ +
890#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
891 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
892 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
893#endif
│ │ │ │ +
894 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
895 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
896 {
│ │ │ │ +
897 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ +
898 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ +
899 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj);
│ │ │ │ +
900 }
│ │ │ │ +
901 }
│ │ │ │ +
│ │ │ │ +
902
│ │ │ │ +
904 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
905 void usmtv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ +
906 {
│ │ │ │ +
907#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
908 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
909 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
910#endif
│ │ │ │ +
911 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
912 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
913 {
│ │ │ │ +
914 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ +
915 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ +
916 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj);
│ │ │ │ +
917 }
│ │ │ │ +
918 }
│ │ │ │ +
│ │ │ │ +
919
│ │ │ │ +
921 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
922 void umhv (const X& x, Y& y) const
│ │ │ │ +
923 {
│ │ │ │ +
924#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
925 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
926 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
927#endif
│ │ │ │ +
928 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
929 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
930 {
│ │ │ │ +
931 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ +
932 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ +
933 Impl::asMatrix((*this)[i][j]).umhv(xi,yj);
│ │ │ │ +
934 }
│ │ │ │ +
935 }
│ │ │ │ +
│ │ │ │ +
936
│ │ │ │ +
938 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
939 void mmhv (const X& x, Y& y) const
│ │ │ │ +
940 {
│ │ │ │ +
941#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
942 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
943 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
944#endif
│ │ │ │ +
945 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
946 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
947 {
│ │ │ │ +
948 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ +
949 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ +
950 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj);
│ │ │ │ +
951 }
│ │ │ │ +
952 }
│ │ │ │ +
│ │ │ │ +
953
│ │ │ │ +
955 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
956 void usmhv (const field_type& alpha, const X& x, Y& y) const
│ │ │ │ +
957 {
│ │ │ │ +
958#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
959 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
960 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
│ │ │ │ +
961#endif
│ │ │ │ +
962 for (size_type i=0; i<data_.N(); i++)
│ │ │ │ +
963 for (size_type j=0; j<cols_; j++)
│ │ │ │ +
964 {
│ │ │ │ +
965 auto&& xi = Impl::asVector(x[i]);
│ │ │ │ +
966 auto&& yj = Impl::asVector(y[j]);
│ │ │ │ +
967 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj);
│ │ │ │ +
968 }
│ │ │ │ +
969 }
│ │ │ │ +
│ │ │ │ +
970
│ │ │ │ +
971 //===== norms
│ │ │ │ +
972
│ │ │ │ +
│ │ │ │ +
974 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ +
975 {
│ │ │ │ +
976 return std::sqrt(frobenius_norm2());
│ │ │ │ +
977 }
│ │ │ │ +
│ │ │ │ +
978
│ │ │ │ +
│ │ │ │ +
980 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
│ │ │ │ +
981 {
│ │ │ │ +
982 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ +
983 for (size_type i=0; i<this->N(); i++)
│ │ │ │ +
984 for (size_type j=0; j<this->M(); j++)
│ │ │ │ +
985 sum += Impl::asMatrix(data_[i][j]).frobenius_norm2();
│ │ │ │ +
986 return sum;
│ │ │ │ +
987 }
│ │ │ │ +
│ │ │ │ +
988
│ │ │ │ +
990 template <typename ft = field_type,
│ │ │ │ +
991 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
992 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
993 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
994 using std::max;
│ │ │ │ +
995
│ │ │ │ +
996 real_type norm = 0;
│ │ │ │ +
997 for (auto const &x : *this) {
│ │ │ │ +
998 real_type sum = 0;
│ │ │ │ +
999 for (auto const &y : x)
│ │ │ │ +
1000 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ +
1001 norm = max(sum, norm);
│ │ │ │ +
1002 isNaN += sum;
│ │ │ │ +
1003 }
│ │ │ │ +
1004
│ │ │ │ +
1005 return norm;
│ │ │ │ +
1006 }
│ │ │ │ +
│ │ │ │ +
1007
│ │ │ │ +
1009 template <typename ft = field_type,
│ │ │ │ +
1010 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1011 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
1012 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1013 using std::max;
│ │ │ │ +
1014
│ │ │ │ +
1015 real_type norm = 0;
│ │ │ │ +
1016 for (auto const &x : *this) {
│ │ │ │ +
1017 real_type sum = 0;
│ │ │ │ +
1018 for (auto const &y : x)
│ │ │ │ +
1019 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ +
1020 norm = max(sum, norm);
│ │ │ │ +
1021 }
│ │ │ │ +
1022 return norm;
│ │ │ │ +
1023 }
│ │ │ │ +
│ │ │ │ +
1024
│ │ │ │ +
1026 template <typename ft = field_type,
│ │ │ │ +
1027 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1028 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ +
1029 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1030 using std::max;
│ │ │ │ +
1031
│ │ │ │ +
1032 real_type norm = 0;
│ │ │ │ +
1033 real_type isNaN = 1;
│ │ │ │ +
1034 for (auto const &x : *this) {
│ │ │ │ +
1035 real_type sum = 0;
│ │ │ │ +
1036 for (auto const &y : x)
│ │ │ │ +
1037 sum += Impl::asMatrix(y).infinity_norm();
│ │ │ │ +
1038 norm = max(sum, norm);
│ │ │ │ +
1039 isNaN += sum;
│ │ │ │ +
1040 }
│ │ │ │ +
1041
│ │ │ │ +
1042 return norm * (isNaN / isNaN);
│ │ │ │ +
1043 }
│ │ │ │ +
│ │ │ │ +
1044
│ │ │ │ +
1046 template <typename ft = field_type,
│ │ │ │ +
1047 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ +
│ │ │ │ +
1048 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ +
1049 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ +
1050 using std::max;
│ │ │ │ +
1051
│ │ │ │ +
1052 real_type norm = 0;
│ │ │ │ +
1053 real_type isNaN = 1;
│ │ │ │ +
1054 for (auto const &x : *this) {
│ │ │ │ +
1055 real_type sum = 0;
│ │ │ │ +
1056 for (auto const &y : x)
│ │ │ │ +
1057 sum += Impl::asMatrix(y).infinity_norm_real();
│ │ │ │ +
1058 norm = max(sum, norm);
│ │ │ │ +
1059 isNaN += sum;
│ │ │ │ +
1060 }
│ │ │ │ +
1061
│ │ │ │ +
1062 return norm * (isNaN / isNaN);
│ │ │ │ +
1063 }
│ │ │ │ +
│ │ │ │ +
1064
│ │ │ │ +
1065 //===== query
│ │ │ │ +
1066
│ │ │ │ +
│ │ │ │ +
1068 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
│ │ │ │ +
1069 {
│ │ │ │ +
1070#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1071 if (i<0 || i>=N()) DUNE_THROW(ISTLError,"row index out of range");
│ │ │ │ +
1072 if (j<0 || i>=M()) DUNE_THROW(ISTLError,"column index out of range");
│ │ │ │ +
1073#endif
│ │ │ │ +
1074 return true;
│ │ │ │ +
1075 }
│ │ │ │ +
│ │ │ │ +
1076
│ │ │ │ +
1077 protected:
│ │ │ │ +
1078
│ │ │ │ + │ │ │ │ +
1082
│ │ │ │ + │ │ │ │ +
1089 };
│ │ │ │ +
│ │ │ │ +
1090
│ │ │ │ +
1091 template<class T, class A>
│ │ │ │ +
│ │ │ │ +
1092 struct FieldTraits< Matrix<T, A> >
│ │ │ │ +
1093 {
│ │ │ │ + │ │ │ │ +
1095 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
1096 };
│ │ │ │ +
│ │ │ │ +
1097
│ │ │ │ +
1099} // end namespace Dune
│ │ │ │ +
1100
│ │ │ │ +
1101#endif
│ │ │ │ + │ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
Definition scalarproducts.hh:242
│ │ │ │ -
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:61
│ │ │ │ -
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ -
An overlapping Schwarz operator.
Definition schwarz.hh:75
│ │ │ │ -
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ - │ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ -
Factory to assembly solvers configured by a ParameterTree.
Definition solverfactory.hh:145
│ │ │ │ -
static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr)
get a solver from the factory
Definition solverfactory.hh:168
│ │ │ │ -
static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< Operator > op, const ParameterTree &config)
Construct a Preconditioner for a given Operator.
Definition solverfactory.hh:203
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
A Vector of blocks with different blocksizes.
Definition matrix.hh:44
│ │ │ │ +
Imp::BlockVectorWindow< B, A > window_type
Definition matrix.hh:70
│ │ │ │ +
BlockVector< B, A > block_type
Same as value_type, here for historical reasons.
Definition matrix.hh:67
│ │ │ │ +
DenseMatrixBase & operator=(const DenseMatrixBase &a)
assignment
Definition matrix.hh:182
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition matrix.hh:50
│ │ │ │ +
Iterator beforeBegin() const
Definition matrix.hh:385
│ │ │ │ +
void resize(size_type rows, size_type columns)
same effect as constructor with same argument
Definition matrix.hh:153
│ │ │ │ +
const window_type const_reference
Definition matrix.hh:74
│ │ │ │ +
DenseMatrixBase(size_type rows, size_type columns)
Definition matrix.hh:95
│ │ │ │ +
Iterator end()
end Iterator
Definition matrix.hh:371
│ │ │ │ +
reference operator[](size_type i)
random access to blocks
Definition matrix.hh:241
│ │ │ │ +
BlockVector< B, A > value_type
Type of the elements of the outer vector, i.e., dynamic vectors of B.
Definition matrix.hh:63
│ │ │ │ +
Iterator find(size_type i)
random access returning iterator (end if not contained)
Definition matrix.hh:391
│ │ │ │ +
size_type N() const
number of blocks in the vector (are of variable size here)
Definition matrix.hh:539
│ │ │ │ +
ConstIterator beforeEnd() const
Definition matrix.hh:525
│ │ │ │ +
ConstIterator end() const
end ConstIterator
Definition matrix.hh:518
│ │ │ │ +
window_type reference
Definition matrix.hh:72
│ │ │ │ +
ConstIterator rend() const
end ConstIterator
Definition matrix.hh:531
│ │ │ │ +
Iterator beforeEnd()
Definition matrix.hh:378
│ │ │ │ +
ConstIterator begin() const
begin ConstIterator
Definition matrix.hh:512
│ │ │ │ +
A allocator_type
export the allocator type
Definition matrix.hh:53
│ │ │ │ +
DenseMatrixBase()
Definition matrix.hh:82
│ │ │ │ +
ConstIterator find(size_type i) const
random access returning iterator (end if not contained)
Definition matrix.hh:397
│ │ │ │ +
A::size_type size_type
The size type for the index access.
Definition matrix.hh:56
│ │ │ │ +
~DenseMatrixBase()
free dynamic memory
Definition matrix.hh:142
│ │ │ │ +
Iterator begin()
begin Iterator
Definition matrix.hh:365
│ │ │ │ +
DenseMatrixBase(const DenseMatrixBase &a)
copy constructor, has copy semantics
Definition matrix.hh:116
│ │ │ │ +
Iterator class for sequential access.
Definition matrix.hh:263
│ │ │ │ +
Iterator & operator--()
prefix decrement
Definition matrix.hh:308
│ │ │ │ +
size_type index() const
Definition matrix.hh:352
│ │ │ │ + │ │ │ │ + │ │ │ │ +
bool operator!=(const Iterator &it) const
inequality
Definition matrix.hh:322
│ │ │ │ +
Iterator & operator=(Iterator &&other)
Move assignment.
Definition matrix.hh:282
│ │ │ │ +
Iterator & operator++()
prefix increment
Definition matrix.hh:300
│ │ │ │ +
Iterator()
constructor, no arguments
Definition matrix.hh:266
│ │ │ │ +
window_type & operator*() const
dereferencing
Definition matrix.hh:340
│ │ │ │ +
bool operator==(const Iterator &it) const
equality
Definition matrix.hh:316
│ │ │ │ +
Iterator & operator=(Iterator &other)
Copy assignment.
Definition matrix.hh:291
│ │ │ │ +
Iterator(B *data, size_type columns, size_type _i)
constructor
Definition matrix.hh:276
│ │ │ │ +
window_type * operator->() const
arrow
Definition matrix.hh:346
│ │ │ │ +
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ +
const window_type * operator->() const
arrow
Definition matrix.hh:487
│ │ │ │ +
const window_type & operator*() const
dereferencing
Definition matrix.hh:481
│ │ │ │ +
ConstIterator & operator++()
prefix increment
Definition matrix.hh:441
│ │ │ │ +
ConstIterator(const B *data, size_type columns, size_type _i)
constructor from pointer
Definition matrix.hh:414
│ │ │ │ +
ConstIterator & operator--()
prefix decrement
Definition matrix.hh:449
│ │ │ │ +
ConstIterator(const Iterator &it)
constructor from non_const iterator
Definition matrix.hh:420
│ │ │ │ +
bool operator!=(const ConstIterator &it) const
inequality
Definition matrix.hh:463
│ │ │ │ +
ConstIterator()
constructor
Definition matrix.hh:407
│ │ │ │ +
bool operator==(const ConstIterator &it) const
equality
Definition matrix.hh:457
│ │ │ │ +
size_type index() const
Definition matrix.hh:493
│ │ │ │ +
ConstIterator & operator=(Iterator &&other)
Definition matrix.hh:424
│ │ │ │ +
ConstIterator & operator=(Iterator &other)
Definition matrix.hh:432
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
size_type cols_
Number of columns of the matrix.
Definition matrix.hh:1088
│ │ │ │ +
FieldTraits< ft >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition matrix.hh:992
│ │ │ │ +
A allocator_type
Export the allocator.
Definition matrix.hh:571
│ │ │ │ +
FieldTraits< ft >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition matrix.hh:1011
│ │ │ │ +
void usmhv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition matrix.hh:956
│ │ │ │ +
void usmv(const field_type &alpha, const X &x, Y &y) const
Definition matrix.hh:854
│ │ │ │ +
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A > data_
Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.
Definition matrix.hh:1081
│ │ │ │ +
Matrix transpose() const
Return the transpose of the matrix.
Definition matrix.hh:745
│ │ │ │ +
void mtv(const X &x, Y &y) const
y = A^T x
Definition matrix.hh:807
│ │ │ │ +
void umv(const X &x, Y &y) const
y += A x
Definition matrix.hh:820
│ │ │ │ +
void mv(const X &x, Y &y) const
y = A x
Definition matrix.hh:788
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator
Const iterator over the matrix rows.
Definition matrix.hh:586
│ │ │ │ +
void setSize(size_type rows, size_type cols)
Change the matrix size.
Definition matrix.hh:608
│ │ │ │ +
RowIterator beforeBegin()
Definition matrix.hh:634
│ │ │ │ +
RowIterator beforeEnd()
Definition matrix.hh:627
│ │ │ │ +
Matrix()
Create empty matrix.
Definition matrix.hh:596
│ │ │ │ +
Matrix & operator-=(const Matrix &b)
Subtract the entries of another matrix from this one.
Definition matrix.hh:735
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition matrix.hh:980
│ │ │ │ +
row_type::iterator ColIterator
Iterator for the entries of each row.
Definition matrix.hh:583
│ │ │ │ +
ConstRowIterator beforeEnd() const
Definition matrix.hh:653
│ │ │ │ +
Matrix & operator=(const field_type &t)
Assignment from scalar.
Definition matrix.hh:666
│ │ │ │ +
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ +
const row_type operator[](size_type row) const
The const index operator.
Definition matrix.hh:684
│ │ │ │ +
ConstRowIterator end() const
Get const iterator to one beyond last row.
Definition matrix.hh:646
│ │ │ │ +
friend Y operator*(const Matrix< T > &m, const X &vec)
Generic matrix-vector multiplication.
Definition matrix.hh:770
│ │ │ │ +
Matrix< T > & operator*=(const field_type &scalar)
Multiplication with a scalar.
Definition matrix.hh:705
│ │ │ │ +
row_type operator[](size_type row)
The index operator.
Definition matrix.hh:673
│ │ │ │ +
void mmv(const X &x, Y &y) const
y -= A x
Definition matrix.hh:837
│ │ │ │ +
Matrix & operator+=(const Matrix &b)
Add the entries of another matrix to this one.
Definition matrix.hh:721
│ │ │ │ +
ConstRowIterator begin() const
Get const iterator to first row.
Definition matrix.hh:640
│ │ │ │ +
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition matrix.hh:939
│ │ │ │ +
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ +
typename Imp::BlockTraits< T >::field_type field_type
Export the type representing the underlying field.
Definition matrix.hh:565
│ │ │ │ +
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ +
static constexpr auto blocklevel
The number of nesting levels the matrix contains.
Definition matrix.hh:593
│ │ │ │ +
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ +
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ +
bool exists(size_type i, size_type j) const
return true if (i,j) is in pattern
Definition matrix.hh:1068
│ │ │ │ +
Matrix< T > & operator/=(const field_type &scalar)
Division by a scalar.
Definition matrix.hh:711
│ │ │ │ +
friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2)
Generic matrix multiplication.
Definition matrix.hh:755
│ │ │ │ +
void umtv(const X &x, Y &y) const
y += A^T x
Definition matrix.hh:871
│ │ │ │ +
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition matrix.hh:888
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition matrix.hh:974
│ │ │ │ +
void usmtv(const field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition matrix.hh:905
│ │ │ │ +
void umhv(const X &x, Y &y) const
y += A^H x
Definition matrix.hh:922
│ │ │ │ +
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ +
ConstRowIterator beforeBegin() const
Definition matrix.hh:660
│ │ │ │ +
Matrix(size_type rows, size_type cols)
Create uninitialized matrix of size rows x cols.
Definition matrix.hh:601
│ │ │ │ +
MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator
Iterator over the matrix rows.
Definition matrix.hh:580
│ │ │ │ +
typename Matrix< T, A >::field_type field_type
Definition matrix.hh:1094
│ │ │ │ +
typename FieldTraits< field_type >::real_type real_type
Definition matrix.hh:1095
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,303 +1,1378 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -solverfactory.hh │ │ │ │ │ +matrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_ISTL_SOLVERFACTORY_HH │ │ │ │ │ -7#define DUNE_ISTL_SOLVERFACTORY_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include "_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h" │ │ │ │ │ -17#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_i_s_t_l_/_n_o_v_l_p_s_c_h_w_a_r_z_._h_h> │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e{ │ │ │ │ │ -26 // Direct solver factory: │ │ │ │ │ -27 template │ │ │ │ │ -_2_8 using _D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr>(const │ │ │ │ │ -M&, const ParameterTree&); │ │ │ │ │ -29 template │ │ │ │ │ -_3_0 using _D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y = │ │ │ │ │ -Singleton>>; │ │ │ │ │ -31 │ │ │ │ │ -32 // Preconditioner factory: │ │ │ │ │ -33 template │ │ │ │ │ -_3_4 using _P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr>(const │ │ │ │ │ -std::shared_ptr&, const ParameterTree&); │ │ │ │ │ -35 template │ │ │ │ │ -_3_6 using _P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y = │ │ │ │ │ -Singleton>>; │ │ │ │ │ -37 │ │ │ │ │ -38 // Iterative solver factory │ │ │ │ │ -39 template │ │ │ │ │ -_4_0 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e = std::shared_ptr>(const │ │ │ │ │ -std::shared_ptr>&, const std:: │ │ │ │ │ -shared_ptr>&, const std::shared_ptr>, │ │ │ │ │ -const ParameterTree&); │ │ │ │ │ -41 template │ │ │ │ │ -_4_2 using _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y = │ │ │ │ │ -Singleton>>; │ │ │ │ │ -43 │ │ │ │ │ -44 // initSolverFactories differs in different compilation units, so we have it │ │ │ │ │ -45 // in an anonymous namespace │ │ │ │ │ -46 namespace { │ │ │ │ │ -47 │ │ │ │ │ -53 template │ │ │ │ │ -54 int initSolverFactories(){ │ │ │ │ │ -55 using M = typename O::matrix_type; │ │ │ │ │ -56 using X = typename O::range_type; │ │ │ │ │ -57 using Y = typename O::domain_type; │ │ │ │ │ -58 using TL = Dune::TypeList; │ │ │ │ │ -59 auto& dsfac=_D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y_<_M_,_X_,_Y_>_:_:_i_n_s_t_a_n_c_e(); │ │ │ │ │ -60 addRegistryToFactory(dsfac, DirectSolverTag{}); │ │ │ │ │ -61 auto& pfac=_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y_<_O_,_X_,_Y_>_:_:_i_n_s_t_a_n_c_e(); │ │ │ │ │ -62 addRegistryToFactory(pfac, PreconditionerTag{}); │ │ │ │ │ -63 using TLS = Dune::TypeList; │ │ │ │ │ -64 auto& isfac=_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y_<_X_,_Y_>_:_:_i_n_s_t_a_n_c_e(); │ │ │ │ │ -65 return addRegistryToFactory(isfac, IterativeSolverTag{}); │ │ │ │ │ -66 } │ │ │ │ │ -77 template │ │ │ │ │ -78 [[deprecated("Use method 'initSolverFactories' instead")]] │ │ │ │ │ -79 int initSolverFactories() { │ │ │ │ │ -80 return initSolverFactories(); │ │ │ │ │ -81 } │ │ │ │ │ -82 } // end anonymous namespace │ │ │ │ │ -83 │ │ │ │ │ -84 │ │ │ │ │ -85 template │ │ │ │ │ -_8_6 std::shared_ptr _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(const std:: │ │ │ │ │ -shared_ptr& prec, │ │ │ │ │ -87 const O&) │ │ │ │ │ -88 { │ │ │ │ │ -89 return prec; │ │ │ │ │ -90 } │ │ │ │ │ -91 │ │ │ │ │ -92 template │ │ │ │ │ -93 std::shared_ptr │ │ │ │ │ -_9_4 _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(const std::shared_ptr& prec, │ │ │ │ │ -95 const std::shared_ptr<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ +5#ifndef DUNE_ISTL_MATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_MATRIX_HH │ │ │ │ │ +7 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19 │ │ │ │ │ +20#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25 │ │ │ │ │ +_2_6namespace MatrixImp │ │ │ │ │ +27{ │ │ │ │ │ +39 template > │ │ │ │ │ +_4_0 class _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e : public Imp::block_vector_unmanaged │ │ │ │ │ +41 // this derivation gives us all the blas level 1 and norms │ │ │ │ │ +42 // on the large array. However, access operators have to be │ │ │ │ │ +43 // overwritten. │ │ │ │ │ +44 { │ │ │ │ │ +45 public: │ │ │ │ │ +46 │ │ │ │ │ +47 //===== type definitions and constants │ │ │ │ │ +48 │ │ │ │ │ +_5_0 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +51 │ │ │ │ │ +_5_3 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +54 │ │ │ │ │ +_5_6 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +57 │ │ │ │ │ +_6_3 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +64 │ │ │ │ │ +_6_7 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +68 │ │ │ │ │ +69 // just a shorthand │ │ │ │ │ +_7_0 typedef Imp::BlockVectorWindow _w_i_n_d_o_w___t_y_p_e; │ │ │ │ │ +71 │ │ │ │ │ +_7_2 typedef _w_i_n_d_o_w___t_y_p_e _r_e_f_e_r_e_n_c_e; │ │ │ │ │ +73 │ │ │ │ │ +_7_4 typedef const _w_i_n_d_o_w___t_y_p_e _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +75 │ │ │ │ │ +76 │ │ │ │ │ +77 //===== constructors and such │ │ │ │ │ +78 │ │ │ │ │ +_8_2 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e () : Imp::block_vector_unmanaged() │ │ │ │ │ +83 { │ │ │ │ │ +84 // nothing is known ... │ │ │ │ │ +85 rows_ = 0; │ │ │ │ │ +86 columns_ = 0; │ │ │ │ │ +87 } │ │ │ │ │ +88 │ │ │ │ │ +_9_5 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e (_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns) : Imp:: │ │ │ │ │ +block_vector_unmanaged() │ │ │ │ │ 96 { │ │ │ │ │ -97 return std::make_shared >(prec, │ │ │ │ │ -op->getCommunication()); │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -100 template │ │ │ │ │ -101 std::shared_ptr │ │ │ │ │ -_1_0_2 _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(const std::shared_ptr& prec, │ │ │ │ │ -103 const std::shared_ptr<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ -104 { │ │ │ │ │ -105 return std::make_shared │ │ │ │ │ ->(prec, op->getCommunication()); │ │ │ │ │ -106 } │ │ │ │ │ -107 │ │ │ │ │ -108 template │ │ │ │ │ -_1_0_9 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const std:: │ │ │ │ │ -shared_ptr<_M_a_t_r_i_x_A_d_a_p_t_e_r_<_M_,_X_,_Y_> >&) │ │ │ │ │ -110 { │ │ │ │ │ -111 return std::make_shared>(); │ │ │ │ │ -112 } │ │ │ │ │ -113 template │ │ │ │ │ -_1_1_4 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const std:: │ │ │ │ │ -shared_ptr<_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ -115 { │ │ │ │ │ -116 return createScalarProduct(op->getCommunication(), op->category()); │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -119 template │ │ │ │ │ -_1_2_0 std::shared_ptr> _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(const std:: │ │ │ │ │ -shared_ptr<_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r_<_M_,_X_,_Y_,_C_> >& op) │ │ │ │ │ -121 { │ │ │ │ │ -122 return createScalarProduct(op->getCommunication(), op->category()); │ │ │ │ │ -123 } │ │ │ │ │ -124 │ │ │ │ │ -144 template │ │ │ │ │ -_1_4_5 class _S_o_l_v_e_r_F_a_c_t_o_r_y { │ │ │ │ │ -146 using Domain = typename Operator::domain_type; │ │ │ │ │ -147 using Range = typename Operator::range_type; │ │ │ │ │ -148 using _S_o_l_v_e_r = _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_D_o_m_a_i_n_,_R_a_n_g_e_>; │ │ │ │ │ -149 using _P_r_e_c_o_n_d_i_t_i_o_n_e_r = _D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_D_o_m_a_i_n_,_ _R_a_n_g_e_>; │ │ │ │ │ -150 │ │ │ │ │ -151 template │ │ │ │ │ -152 using _matrix_type = typename O::matrix_type; │ │ │ │ │ -153 using matrix_type = Std::detected_or_t; │ │ │ │ │ -154 static constexpr bool isAssembled = !std::is_same::value; │ │ │ │ │ -155 │ │ │ │ │ -156 static const matrix_type* getmat(std::shared_ptr op){ │ │ │ │ │ -157 std::shared_ptr> aop │ │ │ │ │ -158 = std::dynamic_pointer_cast>(op); │ │ │ │ │ -159 if(aop) │ │ │ │ │ -160 return &aop->getmat(); │ │ │ │ │ -161 return nullptr; │ │ │ │ │ -162 } │ │ │ │ │ -163 │ │ │ │ │ -164 public: │ │ │ │ │ -165 │ │ │ │ │ -_1_6_8 static std::shared_ptr _g_e_t(std::shared_ptr op, │ │ │ │ │ -169 const ParameterTree& config, │ │ │ │ │ -170 std::shared_ptr prec = nullptr){ │ │ │ │ │ -171 std::string type = config.get("type"); │ │ │ │ │ -172 std::shared_ptr result; │ │ │ │ │ -173 const matrix_type* _m_a_t = getmat(op); │ │ │ │ │ -174 if(_m_a_t){ │ │ │ │ │ -175 if (_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y_<_m_a_t_r_i_x___t_y_p_e_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().contains │ │ │ │ │ -(type)) { │ │ │ │ │ -176 if(op->category()!=_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l){ │ │ │ │ │ -177 DUNE_THROW(NotImplemented, "The solver factory does not support parallel │ │ │ │ │ -direct solvers!"); │ │ │ │ │ -178 } │ │ │ │ │ -179 result = _D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y_<_m_a_t_r_i_x___t_y_p_e_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create │ │ │ │ │ -(type, *_m_a_t, config); │ │ │ │ │ -180 return result; │ │ │ │ │ -181 } │ │ │ │ │ -182 } │ │ │ │ │ -183 // if no direct solver is found it might be an iterative solver │ │ │ │ │ -184 if (!_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y_<_D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().contains(type)) { │ │ │ │ │ -185 DUNE_THROW(Dune::InvalidStateException, "Solver not found in the │ │ │ │ │ -factory."); │ │ │ │ │ -186 } │ │ │ │ │ -187 if(!prec){ │ │ │ │ │ -188 const ParameterTree& precConfig = config.sub("preconditioner"); │ │ │ │ │ -189 std::string prec_type = precConfig.get("type"); │ │ │ │ │ -190 prec = _P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y_<_O_p_e_r_a_t_o_r_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create │ │ │ │ │ -(prec_type, op, precConfig); │ │ │ │ │ -191 if (prec->category() != op->category() && prec->category() == │ │ │ │ │ -_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l) │ │ │ │ │ -192 // try to wrap to a parallel preconditioner │ │ │ │ │ -193 prec = _w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l(prec, op); │ │ │ │ │ -194 } │ │ │ │ │ -195 std::shared_ptr> sp = _c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t(op); │ │ │ │ │ -196 result = _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y_<_D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create(type, op, │ │ │ │ │ -sp, prec, config); │ │ │ │ │ -197 return result; │ │ │ │ │ -198 } │ │ │ │ │ -199 │ │ │ │ │ -_2_0_3 static std::shared_ptr _g_e_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r(std:: │ │ │ │ │ -shared_ptr op, │ │ │ │ │ -204 const ParameterTree& config){ │ │ │ │ │ -205 const matrix_type* _m_a_t = getmat(op); │ │ │ │ │ -206 if(_m_a_t){ │ │ │ │ │ -207 std::string prec_type = config.get("type"); │ │ │ │ │ -208 return _P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y_<_O_p_e_r_a_t_o_r_,_ _D_o_m_a_i_n_,_ _R_a_n_g_e_>_:_:_i_n_s_t_a_n_c_e().create │ │ │ │ │ -(prec_type, op, config); │ │ │ │ │ -209 }else{ │ │ │ │ │ -210 DUNE_THROW(InvalidStateException, "Could not obtain matrix from operator. │ │ │ │ │ -Please pass in an AssembledLinearOperator."); │ │ │ │ │ +97 // and we can allocate the big array in the base class │ │ │ │ │ +98 this->n = rows*columns; │ │ │ │ │ +99 columns_ = columns; │ │ │ │ │ +100 if (this->n>0) │ │ │ │ │ +101 { │ │ │ │ │ +102 this->p = allocator_.allocate(this->n); │ │ │ │ │ +103 new (this->p)B[this->n]; │ │ │ │ │ +104 } │ │ │ │ │ +105 else │ │ │ │ │ +106 { │ │ │ │ │ +107 this->n = 0; │ │ │ │ │ +108 this->p = 0; │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +111 // we can allocate the windows now │ │ │ │ │ +112 rows_ = rows; │ │ │ │ │ +113 } │ │ │ │ │ +114 │ │ │ │ │ +_1_1_6 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e (const _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& a) │ │ │ │ │ +117 { │ │ │ │ │ +118 // allocate the big array in the base class │ │ │ │ │ +119 this->n = a.n; │ │ │ │ │ +120 columns_ = a.columns_; │ │ │ │ │ +121 if (this->n>0) │ │ │ │ │ +122 { │ │ │ │ │ +123 // allocate and construct objects │ │ │ │ │ +124 this->p = allocator_.allocate(this->n); │ │ │ │ │ +125 new (this->p)B[this->n]; │ │ │ │ │ +126 │ │ │ │ │ +127 // copy data │ │ │ │ │ +128 for (_s_i_z_e___t_y_p_e i=0; in; i++) │ │ │ │ │ +129 this->p[i]=a.p[i]; │ │ │ │ │ +130 } │ │ │ │ │ +131 else │ │ │ │ │ +132 { │ │ │ │ │ +133 this->n = 0; │ │ │ │ │ +134 this->p = nullptr; │ │ │ │ │ +135 } │ │ │ │ │ +136 │ │ │ │ │ +137 // we can allocate the windows now │ │ │ │ │ +138 rows_ = a.rows_; │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +_1_4_2 _~_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e () │ │ │ │ │ +143 { │ │ │ │ │ +144 if (this->n>0) { │ │ │ │ │ +145 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +146 while (i) │ │ │ │ │ +147 this->p[--i].~B(); │ │ │ │ │ +148 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +149 } │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +_1_5_3 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e columns) │ │ │ │ │ +154 { │ │ │ │ │ +155 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ +156 if (this->n>0) { │ │ │ │ │ +157 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +158 while (i) │ │ │ │ │ +159 this->p[--i].~B(); │ │ │ │ │ +160 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +163 // and we can allocate the big array in the base class │ │ │ │ │ +164 this->n = rows*columns; │ │ │ │ │ +165 if (this->n>0) │ │ │ │ │ +166 { │ │ │ │ │ +167 this->p = allocator_.allocate(this->n); │ │ │ │ │ +168 new (this->p)B[this->n]; │ │ │ │ │ +169 } │ │ │ │ │ +170 else │ │ │ │ │ +171 { │ │ │ │ │ +172 this->n = 0; │ │ │ │ │ +173 this->p = nullptr; │ │ │ │ │ +174 } │ │ │ │ │ +175 │ │ │ │ │ +176 // we can allocate the windows now │ │ │ │ │ +177 rows_ = rows; │ │ │ │ │ +178 columns_ = columns; │ │ │ │ │ +179 } │ │ │ │ │ +180 │ │ │ │ │ +_1_8_2 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& _o_p_e_r_a_t_o_r_=_ (const _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& a) │ │ │ │ │ +183 { │ │ │ │ │ +184 if (&a!=this) // check if this and a are different objects │ │ │ │ │ +185 { │ │ │ │ │ +186 columns_ = a.columns_; │ │ │ │ │ +187 // reallocate arrays if necessary │ │ │ │ │ +188 // Note: still the block sizes may vary ! │ │ │ │ │ +189 if (this->n!=a.n || rows_!=a.rows_) │ │ │ │ │ +190 { │ │ │ │ │ +191 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ +192 if (this->n>0) { │ │ │ │ │ +193 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ +194 while (i) │ │ │ │ │ +195 this->p[--i].~B(); │ │ │ │ │ +196 allocator_.deallocate(this->p,this->n); │ │ │ │ │ +197 } │ │ │ │ │ +198 │ │ │ │ │ +199 // allocate the big array in the base class │ │ │ │ │ +200 this->n = a.n; │ │ │ │ │ +201 if (this->n>0) │ │ │ │ │ +202 { │ │ │ │ │ +203 // allocate and construct objects │ │ │ │ │ +204 this->p = allocator_.allocate(this->n); │ │ │ │ │ +205 new (this->p)B[this->n]; │ │ │ │ │ +206 } │ │ │ │ │ +207 else │ │ │ │ │ +208 { │ │ │ │ │ +209 this->n = 0; │ │ │ │ │ +210 this->p = nullptr; │ │ │ │ │ 211 } │ │ │ │ │ -212 } │ │ │ │ │ -213 }; │ │ │ │ │ -214 │ │ │ │ │ -225 template │ │ │ │ │ -226 std::shared_ptr> _g_e_t_S_o_l_v_e_r_F_r_o_m_F_a_c_t_o_r_y(std:: │ │ │ │ │ -shared_ptr op, │ │ │ │ │ -228 const ParameterTree& config, │ │ │ │ │ -229 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r> prec = nullptr){ │ │ │ │ │ -231 return _S_o_l_v_e_r_F_a_c_t_o_r_y_<_O_p_e_r_a_t_o_r_>_:_:_g_e_t(op, config, prec); │ │ │ │ │ -232 } │ │ │ │ │ -233 │ │ │ │ │ -237} // end namespace Dune │ │ │ │ │ -238 │ │ │ │ │ +212 │ │ │ │ │ +213 // Copy number of rows │ │ │ │ │ +214 rows_ = a.rows_; │ │ │ │ │ +215 } │ │ │ │ │ +216 │ │ │ │ │ +217 // and copy the data │ │ │ │ │ +218 for (_s_i_z_e___t_y_p_e i=0; in; i++) │ │ │ │ │ +219 this->p[i]=a.p[i]; │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +222 return *this; │ │ │ │ │ +223 } │ │ │ │ │ +224 │ │ │ │ │ +225 │ │ │ │ │ +226 //===== assignment from scalar │ │ │ │ │ +227 │ │ │ │ │ +_2_2_9 _D_e_n_s_e_M_a_t_r_i_x_B_a_s_e& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ +230 { │ │ │ │ │ +231 (static_cast&>(*this)) = k; │ │ │ │ │ +232 return *this; │ │ │ │ │ +233 } │ │ │ │ │ +234 │ │ │ │ │ +235 │ │ │ │ │ +236 //===== access to components │ │ │ │ │ +237 // has to be overwritten from base class because it must │ │ │ │ │ +238 // return access to the windows │ │ │ │ │ 239 │ │ │ │ │ -240#endif │ │ │ │ │ -_s_c_h_w_a_r_z_._h_h │ │ │ │ │ -_n_o_v_l_p_s_c_h_w_a_r_z_._h_h │ │ │ │ │ -_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ -_s_o_l_v_e_r_._h_h │ │ │ │ │ -Define general, extensible interface for inverse operators. │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_F_a_c_t_o_r_y │ │ │ │ │ -Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > │ │ │ │ │ -PreconditionerFactory │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_F_a_c_t_o_r_y │ │ │ │ │ -Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > │ │ │ │ │ -DirectSolverFactory │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e │ │ │ │ │ -std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< │ │ │ │ │ -LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, │ │ │ │ │ -const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &) │ │ │ │ │ -IterativeSolverSignature │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_w_r_a_p_P_r_e_c_o_n_d_i_t_i_o_n_e_r_4_P_a_r_a_l_l_e_l │ │ │ │ │ -std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std:: │ │ │ │ │ -shared_ptr< Preconditioner > &prec, const O &) │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_D_i_r_e_c_t_S_o_l_v_e_r_S_i_g_n_a_t_u_r_e │ │ │ │ │ -std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) │ │ │ │ │ -DirectSolverSignature │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t_S_o_l_v_e_r_F_r_o_m_F_a_c_t_o_r_y │ │ │ │ │ -std::shared_ptr< InverseOperator< typename Operator::domain_type, typename │ │ │ │ │ -Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op, │ │ │ │ │ -const ParameterTree &config, std::shared_ptr< Preconditioner< typename │ │ │ │ │ -Operator::domain_type, typename Operator::range_type > > prec=nullptr) │ │ │ │ │ -Instantiates an InverseOperator from an Operator and a configuration given as a │ │ │ │ │ -ParameterTree. │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:227 │ │ │ │ │ -_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_F_a_c_t_o_r_y │ │ │ │ │ -Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > │ │ │ │ │ -IterativeSolverFactory │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r_S_i_g_n_a_t_u_r_e │ │ │ │ │ -std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const │ │ │ │ │ -ParameterTree &) PreconditionerSignature │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:34 │ │ │ │ │ +_2_4_1 _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) │ │ │ │ │ +242 { │ │ │ │ │ +243#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +244 if (i>=rows_) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ +245#endif │ │ │ │ │ +246 return _w_i_n_d_o_w___t_y_p_e(this->p + i*columns_, columns_); │ │ │ │ │ +247 } │ │ │ │ │ +248 │ │ │ │ │ +_2_5_0 _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 │ │ │ │ │ +251 { │ │ │ │ │ +252#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +253 if (i<0 || i>=rows_) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ +254#endif │ │ │ │ │ +255 return _w_i_n_d_o_w___t_y_p_e(this->p + i*columns_, columns_); │ │ │ │ │ +256 } │ │ │ │ │ +257 │ │ │ │ │ +258 // forward declaration │ │ │ │ │ +259 class ConstIterator; │ │ │ │ │ +260 │ │ │ │ │ +_2_6_2 class _I_t_e_r_a_t_o_r │ │ │ │ │ +263 { │ │ │ │ │ +264 public: │ │ │ │ │ +_2_6_6 _I_t_e_r_a_t_o_r () │ │ │ │ │ +267 : window_(nullptr,0) │ │ │ │ │ +268 { │ │ │ │ │ +269 i = 0; │ │ │ │ │ +270 } │ │ │ │ │ +271 │ │ │ │ │ +_2_7_2 _I_t_e_r_a_t_o_r (_I_t_e_r_a_t_o_r& other) = default; │ │ │ │ │ +_2_7_3 _I_t_e_r_a_t_o_r (_I_t_e_r_a_t_o_r&& other) = default; │ │ │ │ │ +274 │ │ │ │ │ +_2_7_6 _I_t_e_r_a_t_o_r (B* data, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ +277 : i(_i), │ │ │ │ │ +278 window_(data + _i*columns, columns) │ │ │ │ │ +279 {} │ │ │ │ │ +280 │ │ │ │ │ +_2_8_2 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r&& other) │ │ │ │ │ +283 { │ │ │ │ │ +284 i = other.i; │ │ │ │ │ +285 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ +not just the window! │ │ │ │ │ +286 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ +287 return *this; │ │ │ │ │ +288 } │ │ │ │ │ +289 │ │ │ │ │ +_2_9_1 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r& other) │ │ │ │ │ +292 { │ │ │ │ │ +293 i = other.i; │ │ │ │ │ +294 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ +not just the window! │ │ │ │ │ +295 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ +296 return *this; │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +_3_0_0 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +301 { │ │ │ │ │ +302 ++i; │ │ │ │ │ +303 window_.setptr(window_.getptr()+window_.getsize()); │ │ │ │ │ +304 return *this; │ │ │ │ │ +305 } │ │ │ │ │ +306 │ │ │ │ │ +_3_0_8 _I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ +309 { │ │ │ │ │ +310 --i; │ │ │ │ │ +311 window_.setptr(window_.getptr()-window_.getsize()); │ │ │ │ │ +312 return *this; │ │ │ │ │ +313 } │ │ │ │ │ +314 │ │ │ │ │ +_3_1_6 bool _o_p_e_r_a_t_o_r_=_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +317 { │ │ │ │ │ +318 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +_3_2_2 bool _o_p_e_r_a_t_o_r_!_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +323 { │ │ │ │ │ +324 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ +325 } │ │ │ │ │ +326 │ │ │ │ │ +_3_2_8 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +329 { │ │ │ │ │ +330 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ +331 } │ │ │ │ │ +332 │ │ │ │ │ +_3_3_4 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +335 { │ │ │ │ │ +336 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ +337 } │ │ │ │ │ +338 │ │ │ │ │ +_3_4_0 _w_i_n_d_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_*_ () const │ │ │ │ │ +341 { │ │ │ │ │ +342 return window_; │ │ │ │ │ +343 } │ │ │ │ │ +344 │ │ │ │ │ +_3_4_6 _w_i_n_d_o_w___t_y_p_e* _o_p_e_r_a_t_o_r_-_>_ () const │ │ │ │ │ +347 { │ │ │ │ │ +348 return &window_; │ │ │ │ │ +349 } │ │ │ │ │ +350 │ │ │ │ │ +351 // return index corresponding to pointer │ │ │ │ │ +_3_5_2 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ +353 { │ │ │ │ │ +354 return i; │ │ │ │ │ +355 } │ │ │ │ │ +356 │ │ │ │ │ +_3_5_7 friend class _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +358 │ │ │ │ │ +359 private: │ │ │ │ │ +360 _s_i_z_e___t_y_p_e i; │ │ │ │ │ +361 mutable _w_i_n_d_o_w___t_y_p_e window_; │ │ │ │ │ +362 }; │ │ │ │ │ +363 │ │ │ │ │ +_3_6_5 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ +366 { │ │ │ │ │ +367 return _I_t_e_r_a_t_o_r(this->p, columns_, 0); │ │ │ │ │ +368 } │ │ │ │ │ +369 │ │ │ │ │ +_3_7_1 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ +372 { │ │ │ │ │ +373 return _I_t_e_r_a_t_o_r(this->p, columns_, rows_); │ │ │ │ │ +374 } │ │ │ │ │ +375 │ │ │ │ │ +_3_7_8 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ +379 { │ │ │ │ │ +380 return _I_t_e_r_a_t_o_r(this->p, columns_, rows_-1); │ │ │ │ │ +381 } │ │ │ │ │ +382 │ │ │ │ │ +_3_8_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ +386 { │ │ │ │ │ +387 return _I_t_e_r_a_t_o_r(this->p, columns_, -1); │ │ │ │ │ +388 } │ │ │ │ │ +389 │ │ │ │ │ +_3_9_1 _I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +392 { │ │ │ │ │ +393 return _I_t_e_r_a_t_o_r(this->p, columns_, std::min(i,rows_)); │ │ │ │ │ +394 } │ │ │ │ │ +395 │ │ │ │ │ +_3_9_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +398 { │ │ │ │ │ +399 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, std::min(i,rows_)); │ │ │ │ │ +400 } │ │ │ │ │ +401 │ │ │ │ │ +_4_0_3 class _C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +404 { │ │ │ │ │ +405 public: │ │ │ │ │ +_4_0_7 _C_o_n_s_t_I_t_e_r_a_t_o_r () │ │ │ │ │ +408 : window_(nullptr,0) │ │ │ │ │ +409 { │ │ │ │ │ +410 i = 0; │ │ │ │ │ +411 } │ │ │ │ │ +412 │ │ │ │ │ +_4_1_4 _C_o_n_s_t_I_t_e_r_a_t_o_r (const B* data, _s_i_z_e___t_y_p_e columns, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ +415 : i(_i), │ │ │ │ │ +416 window_(const_cast(data + _i * columns), columns) │ │ │ │ │ +417 {} │ │ │ │ │ +418 │ │ │ │ │ +_4_2_0 _C_o_n_s_t_I_t_e_r_a_t_o_r (const _I_t_e_r_a_t_o_r& it) │ │ │ │ │ +421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize()) │ │ │ │ │ +422 {} │ │ │ │ │ +423 │ │ │ │ │ +_4_2_4 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r&& other) │ │ │ │ │ +425 { │ │ │ │ │ +426 i = other.i; │ │ │ │ │ +427 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ +not just the window! │ │ │ │ │ +428 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ +429 return *this; │ │ │ │ │ +430 } │ │ │ │ │ +431 │ │ │ │ │ +_4_3_2 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_=(_I_t_e_r_a_t_o_r& other) │ │ │ │ │ +433 { │ │ │ │ │ +434 i = other.i; │ │ │ │ │ +435 // Do NOT use window_.operator=, because that copies the window content, │ │ │ │ │ +not just the window! │ │ │ │ │ +436 window_.set(other.window_.getsize(),other.window_.getptr()); │ │ │ │ │ +437 return *this; │ │ │ │ │ +438 } │ │ │ │ │ +439 │ │ │ │ │ +_4_4_1 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +442 { │ │ │ │ │ +443 ++i; │ │ │ │ │ +444 window_.setptr(window_.getptr()+window_.getsize()); │ │ │ │ │ +445 return *this; │ │ │ │ │ +446 } │ │ │ │ │ +447 │ │ │ │ │ +_4_4_9 _C_o_n_s_t_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ │ +450 { │ │ │ │ │ +451 --i; │ │ │ │ │ +452 window_.setptr(window_.getptr()-window_.getsize()); │ │ │ │ │ +453 return *this; │ │ │ │ │ +454 } │ │ │ │ │ +455 │ │ │ │ │ +_4_5_7 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +458 { │ │ │ │ │ +459 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ +460 } │ │ │ │ │ +461 │ │ │ │ │ +_4_6_3 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_o_n_s_t_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +464 { │ │ │ │ │ +465 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ +466 } │ │ │ │ │ +467 │ │ │ │ │ +_4_6_9 bool _o_p_e_r_a_t_o_r_=_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +470 { │ │ │ │ │ +471 return window_.getptr() == it.window_.getptr(); │ │ │ │ │ +472 } │ │ │ │ │ +473 │ │ │ │ │ +_4_7_5 bool _o_p_e_r_a_t_o_r_!_=_ (const _I_t_e_r_a_t_o_r& it) const │ │ │ │ │ +476 { │ │ │ │ │ +477 return window_.getptr() != it.window_.getptr(); │ │ │ │ │ +478 } │ │ │ │ │ +479 │ │ │ │ │ +_4_8_1 const _w_i_n_d_o_w___t_y_p_e& _o_p_e_r_a_t_o_r_*_ () const │ │ │ │ │ +482 { │ │ │ │ │ +483 return window_; │ │ │ │ │ +484 } │ │ │ │ │ +485 │ │ │ │ │ +_4_8_7 const _w_i_n_d_o_w___t_y_p_e* _o_p_e_r_a_t_o_r_-_>_ () const │ │ │ │ │ +488 { │ │ │ │ │ +489 return &window_; │ │ │ │ │ +490 } │ │ │ │ │ +491 │ │ │ │ │ +492 // return index corresponding to pointer │ │ │ │ │ +_4_9_3 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ +494 { │ │ │ │ │ +495 return i; │ │ │ │ │ +496 } │ │ │ │ │ +497 │ │ │ │ │ +_4_9_8 friend class _I_t_e_r_a_t_o_r; │ │ │ │ │ +499 │ │ │ │ │ +500 private: │ │ │ │ │ +501 _s_i_z_e___t_y_p_e i; │ │ │ │ │ +502 mutable _w_i_n_d_o_w___t_y_p_e window_; │ │ │ │ │ +503 }; │ │ │ │ │ +504 │ │ │ │ │ +_5_0_6 using _i_t_e_r_a_t_o_r = _I_t_e_r_a_t_o_r; │ │ │ │ │ +507 │ │ │ │ │ +_5_0_9 using _c_o_n_s_t___i_t_e_r_a_t_o_r = _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +510 │ │ │ │ │ +_5_1_2 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ +513 { │ │ │ │ │ +514 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, 0); │ │ │ │ │ +515 } │ │ │ │ │ +516 │ │ │ │ │ +_5_1_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ +519 { │ │ │ │ │ +520 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, rows_); │ │ │ │ │ +521 } │ │ │ │ │ +522 │ │ │ │ │ +_5_2_5 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ +526 { │ │ │ │ │ +527 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, rows_-1); │ │ │ │ │ +528 } │ │ │ │ │ +529 │ │ │ │ │ +_5_3_1 _C_o_n_s_t_I_t_e_r_a_t_o_r _r_e_n_d () const │ │ │ │ │ +532 { │ │ │ │ │ +533 return _C_o_n_s_t_I_t_e_r_a_t_o_r(this->p, columns_, -1); │ │ │ │ │ +534 } │ │ │ │ │ +535 │ │ │ │ │ +536 //===== sizes │ │ │ │ │ +537 │ │ │ │ │ +_5_3_9 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ +540 { │ │ │ │ │ +541 return rows_; │ │ │ │ │ +542 } │ │ │ │ │ +543 │ │ │ │ │ +544 │ │ │ │ │ +545 private: │ │ │ │ │ +546 _s_i_z_e___t_y_p_e rows_; // number of matrix rows │ │ │ │ │ +547 _s_i_z_e___t_y_p_e columns_; // number of matrix columns │ │ │ │ │ +548 │ │ │ │ │ +549 A allocator_; │ │ │ │ │ +550 }; │ │ │ │ │ +551 │ │ │ │ │ +552} // namespace MatrixImp │ │ │ │ │ +553 │ │ │ │ │ +559 template > │ │ │ │ │ +_5_6_0 class _M_a_t_r_i_x │ │ │ │ │ +561 { │ │ │ │ │ +562 public: │ │ │ │ │ +563 │ │ │ │ │ +_5_6_5 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +566 │ │ │ │ │ +_5_6_8 typedef T _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +569 │ │ │ │ │ +_5_7_1 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +572 │ │ │ │ │ +_5_7_4 typedef typename _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_>_:_:_w_i_n_d_o_w___t_y_p_e _r_o_w___t_y_p_e; │ │ │ │ │ +575 │ │ │ │ │ +_5_7_7 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +578 │ │ │ │ │ +_5_8_0 typedef typename _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_>_:_:_I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +581 │ │ │ │ │ +_5_8_3 typedef typename row_type::iterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +584 │ │ │ │ │ +_5_8_6 typedef typename _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_>_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +587 │ │ │ │ │ +_5_8_9 typedef typename row_type::const_iterator _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +590 │ │ │ │ │ +592 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ +2.8.")]] │ │ │ │ │ +_5_9_3 static constexpr auto _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ +594 │ │ │ │ │ +_5_9_6 _M_a_t_r_i_x() : _d_a_t_a__(0,0), _c_o_l_s__(0) │ │ │ │ │ +597 {} │ │ │ │ │ +598 │ │ │ │ │ +_6_0_1 _M_a_t_r_i_x(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e cols) : _d_a_t_a__(rows,cols), _c_o_l_s__(cols) │ │ │ │ │ +602 {} │ │ │ │ │ +603 │ │ │ │ │ +_6_0_8 void _s_e_t_S_i_z_e(_s_i_z_e___t_y_p_e rows, _s_i_z_e___t_y_p_e cols) { │ │ │ │ │ +609 _d_a_t_a__.resize(rows,cols); │ │ │ │ │ +610 _c_o_l_s__ = cols; │ │ │ │ │ +611 } │ │ │ │ │ +612 │ │ │ │ │ +_6_1_4 _R_o_w_I_t_e_r_a_t_o_r _b_e_g_i_n() │ │ │ │ │ +615 { │ │ │ │ │ +616 return _d_a_t_a__.begin(); │ │ │ │ │ +617 } │ │ │ │ │ +618 │ │ │ │ │ +_6_2_0 _R_o_w_I_t_e_r_a_t_o_r _e_n_d() │ │ │ │ │ +621 { │ │ │ │ │ +622 return _d_a_t_a__.end(); │ │ │ │ │ +623 } │ │ │ │ │ +624 │ │ │ │ │ +_6_2_7 _R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ +628 { │ │ │ │ │ +629 return _d_a_t_a__.beforeEnd(); │ │ │ │ │ +630 } │ │ │ │ │ +631 │ │ │ │ │ +_6_3_4 _R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ +635 { │ │ │ │ │ +636 return _d_a_t_a__.beforeBegin(); │ │ │ │ │ +637 } │ │ │ │ │ +638 │ │ │ │ │ +_6_4_0 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ +641 { │ │ │ │ │ +642 return _d_a_t_a__.begin(); │ │ │ │ │ +643 } │ │ │ │ │ +644 │ │ │ │ │ +_6_4_6 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ +647 { │ │ │ │ │ +648 return _d_a_t_a__.end(); │ │ │ │ │ +649 } │ │ │ │ │ +650 │ │ │ │ │ +_6_5_3 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ +654 { │ │ │ │ │ +655 return _d_a_t_a__.beforeEnd(); │ │ │ │ │ +656 } │ │ │ │ │ +657 │ │ │ │ │ +_6_6_0 _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ +661 { │ │ │ │ │ +662 return _d_a_t_a__.beforeBegin(); │ │ │ │ │ +663 } │ │ │ │ │ +664 │ │ │ │ │ +_6_6_6 _M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& t) │ │ │ │ │ +667 { │ │ │ │ │ +668 _d_a_t_a__ = t; │ │ │ │ │ +669 return *this; │ │ │ │ │ +670 } │ │ │ │ │ +671 │ │ │ │ │ +_6_7_3 _r_o_w___t_y_p_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e row) { │ │ │ │ │ +674#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +675 if (row<0) │ │ │ │ │ +676 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Can't access negative rows!"); │ │ │ │ │ +677 if (row>=_N()) │ │ │ │ │ +678 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Row index out of range!"); │ │ │ │ │ +679#endif │ │ │ │ │ +680 return _d_a_t_a__[row]; │ │ │ │ │ +681 } │ │ │ │ │ +682 │ │ │ │ │ +_6_8_4 const _r_o_w___t_y_p_e _o_p_e_r_a_t_o_r_[_](_s_i_z_e___t_y_p_e row) const { │ │ │ │ │ +685#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +686 if (row<0) │ │ │ │ │ +687 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Can't access negative rows!"); │ │ │ │ │ +688 if (row>=_N()) │ │ │ │ │ +689 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Row index out of range!"); │ │ │ │ │ +690#endif │ │ │ │ │ +691 return _d_a_t_a__[row]; │ │ │ │ │ +692 } │ │ │ │ │ +693 │ │ │ │ │ +_6_9_5 _s_i_z_e___t_y_p_e _N() const { │ │ │ │ │ +696 return _d_a_t_a__.N(); │ │ │ │ │ +697 } │ │ │ │ │ +698 │ │ │ │ │ +_7_0_0 _s_i_z_e___t_y_p_e _M() const { │ │ │ │ │ +701 return _c_o_l_s__; │ │ │ │ │ +702 } │ │ │ │ │ +703 │ │ │ │ │ +_7_0_5 _M_a_t_r_i_x_<_T_>& _o_p_e_r_a_t_o_r_*_=(const _f_i_e_l_d___t_y_p_e& scalar) { │ │ │ │ │ +706 _d_a_t_a__ *= scalar; │ │ │ │ │ +707 return (*this); │ │ │ │ │ +708 } │ │ │ │ │ +709 │ │ │ │ │ +_7_1_1 _M_a_t_r_i_x_<_T_>& _o_p_e_r_a_t_o_r_/_=(const _f_i_e_l_d___t_y_p_e& scalar) { │ │ │ │ │ +712 _d_a_t_a__ /= scalar; │ │ │ │ │ +713 return (*this); │ │ │ │ │ +714 } │ │ │ │ │ +715 │ │ │ │ │ +_7_2_1 _M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _M_a_t_r_i_x& b) { │ │ │ │ │ +722#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +723 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ +724 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ +725#endif │ │ │ │ │ +726 _d_a_t_a__ += b._d_a_t_a__; │ │ │ │ │ +727 return (*this); │ │ │ │ │ +728 } │ │ │ │ │ +729 │ │ │ │ │ +_7_3_5 _M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _M_a_t_r_i_x& b) { │ │ │ │ │ +736#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +737 if(_N()!=b._N() || _M() != b._M()) │ │ │ │ │ +738 DUNE_THROW(RangeError, "Matrix sizes do not match!"); │ │ │ │ │ +739#endif │ │ │ │ │ +740 _d_a_t_a__ -= b._d_a_t_a__; │ │ │ │ │ +741 return (*this); │ │ │ │ │ +742 } │ │ │ │ │ +743 │ │ │ │ │ +_7_4_5 _M_a_t_r_i_x _t_r_a_n_s_p_o_s_e() const { │ │ │ │ │ +746 _M_a_t_r_i_x out(_M(), _N()); │ │ │ │ │ +747 for (_s_i_z_e___t_y_p_e i=0; i<_N(); i++) │ │ │ │ │ +748 for (_s_i_z_e___t_y_p_e j=0; j<_M(); j++) │ │ │ │ │ +749 out[j][i] = (*this)[i][j]; │ │ │ │ │ +750 │ │ │ │ │ +751 return out; │ │ │ │ │ +752 } │ │ │ │ │ +753 │ │ │ │ │ +_7_5_5 friend _M_a_t_r_i_x_<_T_> _o_p_e_r_a_t_o_r_*(const _M_a_t_r_i_x_<_T_>& m1, const _M_a_t_r_i_x_<_T_>& m2) { │ │ │ │ │ +756 _M_a_t_r_i_x_<_T_> out(m1._N(), m2._M()); │ │ │ │ │ +757 out = 0; │ │ │ │ │ +758 │ │ │ │ │ +759 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_7_7_0 friend Y _o_p_e_r_a_t_o_r_*(const _M_a_t_r_i_x_<_T_>& m, const X& vec) { │ │ │ │ │ +771#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +772 if (m._M()!=vec.size()) │ │ │ │ │ +773 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Vector size doesn't match the number of matrix │ │ │ │ │ +columns!"); │ │ │ │ │ +774#endif │ │ │ │ │ +775 Y out(m._N()); │ │ │ │ │ +776 out = 0; │ │ │ │ │ +777 │ │ │ │ │ +778 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_7_8_8 void _m_v(const X& x, Y& y) const │ │ │ │ │ +789 { │ │ │ │ │ +790#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +791 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +792 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +793#endif │ │ │ │ │ +794 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) { │ │ │ │ │ +795 y[i]=0; │ │ │ │ │ +796 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +797 { │ │ │ │ │ +798 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ +799 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ +800 Impl::asMatrix((*this)[i][j]).umv(xj, yi); │ │ │ │ │ +801 } │ │ │ │ │ +802 } │ │ │ │ │ +803 } │ │ │ │ │ +804 │ │ │ │ │ +806 template │ │ │ │ │ +_8_0_7 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ +808 { │ │ │ │ │ +809#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +810 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ +811 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ +812#endif │ │ │ │ │ +813 for(_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_8_2_0 void _u_m_v(const X& x, Y& y) const │ │ │ │ │ +821 { │ │ │ │ │ +822#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +823 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +824 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +825#endif │ │ │ │ │ +826 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +827 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +828 { │ │ │ │ │ +829 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ +830 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ +831 Impl::asMatrix((*this)[i][j]).umv(xj, yi); │ │ │ │ │ +832 } │ │ │ │ │ +833 } │ │ │ │ │ +834 │ │ │ │ │ +836 template │ │ │ │ │ +_8_3_7 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ +838 { │ │ │ │ │ +839#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +840 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +841 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +842#endif │ │ │ │ │ +843 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +844 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +845 { │ │ │ │ │ +846 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ +847 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ +848 Impl::asMatrix((*this)[i][j]).mmv(xj, yi); │ │ │ │ │ +849 } │ │ │ │ │ +850 } │ │ │ │ │ +851 │ │ │ │ │ +853 template │ │ │ │ │ +_8_5_4 void _u_s_m_v(const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ +855 { │ │ │ │ │ +856#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +857 if (x.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +858 if (y.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +859#endif │ │ │ │ │ +860 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +861 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +862 { │ │ │ │ │ +863 auto&& xj = Impl::asVector(x[j]); │ │ │ │ │ +864 auto&& yi = Impl::asVector(y[i]); │ │ │ │ │ +865 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi); │ │ │ │ │ +866 } │ │ │ │ │ +867 } │ │ │ │ │ +868 │ │ │ │ │ +870 template │ │ │ │ │ +_8_7_1 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ +872 { │ │ │ │ │ +873#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +874 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +875 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +876#endif │ │ │ │ │ +877 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +878 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +879 { │ │ │ │ │ +880 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ +881 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ +882 Impl::asMatrix((*this)[i][j]).umtv(xi, yj); │ │ │ │ │ +883 } │ │ │ │ │ +884 } │ │ │ │ │ +885 │ │ │ │ │ +887 template │ │ │ │ │ +_8_8_8 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ +889 { │ │ │ │ │ +890#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +891 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +892 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +893#endif │ │ │ │ │ +894 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +895 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +896 { │ │ │ │ │ +897 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ +898 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ +899 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj); │ │ │ │ │ +900 } │ │ │ │ │ +901 } │ │ │ │ │ +902 │ │ │ │ │ +904 template │ │ │ │ │ +_9_0_5 void _u_s_m_t_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ +906 { │ │ │ │ │ +907#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +908 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +909 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +910#endif │ │ │ │ │ +911 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +912 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +913 { │ │ │ │ │ +914 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ +915 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ +916 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj); │ │ │ │ │ +917 } │ │ │ │ │ +918 } │ │ │ │ │ +919 │ │ │ │ │ +921 template │ │ │ │ │ +_9_2_2 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ +923 { │ │ │ │ │ +924#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +925 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +926 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +927#endif │ │ │ │ │ +928 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +929 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +930 { │ │ │ │ │ +931 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ +932 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ +933 Impl::asMatrix((*this)[i][j]).umhv(xi,yj); │ │ │ │ │ +934 } │ │ │ │ │ +935 } │ │ │ │ │ +936 │ │ │ │ │ +938 template │ │ │ │ │ +_9_3_9 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ +940 { │ │ │ │ │ +941#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +942 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +943 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +944#endif │ │ │ │ │ +945 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +946 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +947 { │ │ │ │ │ +948 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ +949 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ +950 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj); │ │ │ │ │ +951 } │ │ │ │ │ +952 } │ │ │ │ │ +953 │ │ │ │ │ +955 template │ │ │ │ │ +_9_5_6 void _u_s_m_h_v (const _f_i_e_l_d___t_y_p_e& alpha, const X& x, Y& y) const │ │ │ │ │ +957 { │ │ │ │ │ +958#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +959 if (x.N()!=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +960 if (y.N()!=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"vector/matrix size mismatch!"); │ │ │ │ │ +961#endif │ │ │ │ │ +962 for (_s_i_z_e___t_y_p_e i=0; i<_d_a_t_a__.N(); i++) │ │ │ │ │ +963 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s__; j++) │ │ │ │ │ +964 { │ │ │ │ │ +965 auto&& xi = Impl::asVector(x[i]); │ │ │ │ │ +966 auto&& yj = Impl::asVector(y[j]); │ │ │ │ │ +967 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj); │ │ │ │ │ +968 } │ │ │ │ │ +969 } │ │ │ │ │ +970 │ │ │ │ │ +971 //===== norms │ │ │ │ │ +972 │ │ │ │ │ +_9_7_4 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ +975 { │ │ │ │ │ +976 return std::sqrt(_f_r_o_b_e_n_i_u_s___n_o_r_m_2()); │ │ │ │ │ +977 } │ │ │ │ │ +978 │ │ │ │ │ +_9_8_0 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ +981 { │ │ │ │ │ +982 typename FieldTraits::real_type sum=0; │ │ │ │ │ +983 for (_s_i_z_e___t_y_p_e i=0; i_N(); i++) │ │ │ │ │ +984 for (_s_i_z_e___t_y_p_e j=0; j_M(); j++) │ │ │ │ │ +985 sum += Impl::asMatrix(_d_a_t_a__[i][j]).frobenius_norm2(); │ │ │ │ │ +986 return sum; │ │ │ │ │ +987 } │ │ │ │ │ +988 │ │ │ │ │ +990 template ::value, int>::type = 0> │ │ │ │ │ +_9_9_2 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ +993 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +994 using std::max; │ │ │ │ │ +995 │ │ │ │ │ +996 real_type norm = 0; │ │ │ │ │ +997 for (auto const &x : *this) { │ │ │ │ │ +998 real_type sum = 0; │ │ │ │ │ +999 for (auto const &y : x) │ │ │ │ │ +1000 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ +1001 norm = max(sum, norm); │ │ │ │ │ +1002 isNaN += sum; │ │ │ │ │ +1003 } │ │ │ │ │ +1004 │ │ │ │ │ +1005 return norm; │ │ │ │ │ +1006 } │ │ │ │ │ +1007 │ │ │ │ │ +1009 template ::value, int>::type = 0> │ │ │ │ │ +_1_0_1_1 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ +1012 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1013 using std::max; │ │ │ │ │ +1014 │ │ │ │ │ +1015 real_type norm = 0; │ │ │ │ │ +1016 for (auto const &x : *this) { │ │ │ │ │ +1017 real_type sum = 0; │ │ │ │ │ +1018 for (auto const &y : x) │ │ │ │ │ +1019 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ +1020 norm = max(sum, norm); │ │ │ │ │ +1021 } │ │ │ │ │ +1022 return norm; │ │ │ │ │ +1023 } │ │ │ │ │ +1024 │ │ │ │ │ +1026 template ::value, int>::type = 0> │ │ │ │ │ +_1_0_2_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ │ +1029 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1030 using std::max; │ │ │ │ │ +1031 │ │ │ │ │ +1032 real_type norm = 0; │ │ │ │ │ +1033 real_type isNaN = 1; │ │ │ │ │ +1034 for (auto const &x : *this) { │ │ │ │ │ +1035 real_type sum = 0; │ │ │ │ │ +1036 for (auto const &y : x) │ │ │ │ │ +1037 sum += Impl::asMatrix(y).infinity_norm(); │ │ │ │ │ +1038 norm = max(sum, norm); │ │ │ │ │ +1039 isNaN += sum; │ │ │ │ │ +1040 } │ │ │ │ │ +1041 │ │ │ │ │ +1042 return norm * (isNaN / isNaN); │ │ │ │ │ +1043 } │ │ │ │ │ +1044 │ │ │ │ │ +1046 template ::value, int>::type = 0> │ │ │ │ │ +_1_0_4_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ │ +1049 using real_type = typename FieldTraits::real_type; │ │ │ │ │ +1050 using std::max; │ │ │ │ │ +1051 │ │ │ │ │ +1052 real_type norm = 0; │ │ │ │ │ +1053 real_type isNaN = 1; │ │ │ │ │ +1054 for (auto const &x : *this) { │ │ │ │ │ +1055 real_type sum = 0; │ │ │ │ │ +1056 for (auto const &y : x) │ │ │ │ │ +1057 sum += Impl::asMatrix(y).infinity_norm_real(); │ │ │ │ │ +1058 norm = max(sum, norm); │ │ │ │ │ +1059 isNaN += sum; │ │ │ │ │ +1060 } │ │ │ │ │ +1061 │ │ │ │ │ +1062 return norm * (isNaN / isNaN); │ │ │ │ │ +1063 } │ │ │ │ │ +1064 │ │ │ │ │ +1065 //===== query │ │ │ │ │ +1066 │ │ │ │ │ +_1_0_6_8 bool _e_x_i_s_t_s ([[maybe_unused]] _s_i_z_e___t_y_p_e i, [[maybe_unused]] _s_i_z_e___t_y_p_e j) │ │ │ │ │ +const │ │ │ │ │ +1069 { │ │ │ │ │ +1070#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1071 if (i<0 || i>=_N()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"row index out of range"); │ │ │ │ │ +1072 if (j<0 || i>=_M()) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"column index out of range"); │ │ │ │ │ +1073#endif │ │ │ │ │ +1074 return true; │ │ │ │ │ +1075 } │ │ │ │ │ +1076 │ │ │ │ │ +1077 protected: │ │ │ │ │ +1078 │ │ │ │ │ +_1_0_8_1 _M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_<_T_,_A_> _d_a_t_a__; │ │ │ │ │ +1082 │ │ │ │ │ +_1_0_8_8 _s_i_z_e___t_y_p_e _c_o_l_s__; │ │ │ │ │ +1089 }; │ │ │ │ │ +1090 │ │ │ │ │ +1091 template │ │ │ │ │ +_1_0_9_2 struct FieldTraits< _M_a_t_r_i_x > │ │ │ │ │ +1093 { │ │ │ │ │ +_1_0_9_4 using _f_i_e_l_d___t_y_p_e = typename _M_a_t_r_i_x_<_T_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_0_9_5 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ +1096 }; │ │ │ │ │ +1097 │ │ │ │ │ +1099} // end namespace Dune │ │ │ │ │ +1100 │ │ │ │ │ +1101#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_c_r_e_a_t_e_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ -std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, │ │ │ │ │ -SolverCategory::Category category) │ │ │ │ │ -DDeeffiinniittiioonn scalarproducts.hh:242 │ │ │ │ │ -_D_u_n_e_:_:_N_o_n_o_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -A nonoverlapping operator with communication object. │ │ │ │ │ -DDeeffiinniittiioonn novlpschwarz.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ -Adapter to turn a matrix into a linear operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_O_p_e_r_a_t_o_r │ │ │ │ │ -An overlapping Schwarz operator. │ │ │ │ │ -DDeeffiinniittiioonn schwarz.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -Base class for matrix free definition of preconditioners. │ │ │ │ │ -DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_ _D_o_m_a_i_n_,_ _R_a_n_g_e_ _> │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y │ │ │ │ │ -Factory to assembly solvers configured by a ParameterTree. │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y_:_:_g_e_t │ │ │ │ │ -static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const │ │ │ │ │ -ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr) │ │ │ │ │ -get a solver from the factory │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_F_a_c_t_o_r_y_:_:_g_e_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ -static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< │ │ │ │ │ -Operator > op, const ParameterTree &config) │ │ │ │ │ -Construct a Preconditioner for a given Operator. │ │ │ │ │ -DDeeffiinniittiioonn solverfactory.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ +A Vector of blocks with different blocksizes. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_w_i_n_d_o_w___t_y_p_e │ │ │ │ │ +Imp::BlockVectorWindow< B, A > window_type │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +BlockVector< B, A > block_type │ │ │ │ │ +Same as value_type, here for historical reasons. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +DenseMatrixBase & operator=(const DenseMatrixBase &a) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +Iterator beforeBegin() const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:385 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type rows, size_type columns) │ │ │ │ │ +same effect as constructor with same argument │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +const window_type const_reference │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ +DenseMatrixBase(size_type rows, size_type columns) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_e_n_d │ │ │ │ │ +Iterator end() │ │ │ │ │ +end Iterator │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +reference operator[](size_type i) │ │ │ │ │ +random access to blocks │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +BlockVector< B, A > value_type │ │ │ │ │ +Type of the elements of the outer vector, i.e., dynamic vectors of B. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_f_i_n_d │ │ │ │ │ +Iterator find(size_type i) │ │ │ │ │ +random access returning iterator (end if not contained) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:391 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of blocks in the vector (are of variable size here) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:525 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_e_n_d │ │ │ │ │ +ConstIterator end() const │ │ │ │ │ +end ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:518 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +window_type reference │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_r_e_n_d │ │ │ │ │ +ConstIterator rend() const │ │ │ │ │ +end ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:531 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +Iterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:378 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_g_i_n │ │ │ │ │ +ConstIterator begin() const │ │ │ │ │ +begin ConstIterator │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:512 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +A allocator_type │ │ │ │ │ +export the allocator type │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ +DenseMatrixBase() │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_f_i_n_d │ │ │ │ │ +ConstIterator find(size_type i) const │ │ │ │ │ +random access returning iterator (end if not contained) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:397 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The size type for the index access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_~_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ +~DenseMatrixBase() │ │ │ │ │ +free dynamic memory │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_b_e_g_i_n │ │ │ │ │ +Iterator begin() │ │ │ │ │ +begin Iterator │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e │ │ │ │ │ +DenseMatrixBase(const DenseMatrixBase &a) │ │ │ │ │ +copy constructor, has copy semantics │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ +Iterator & operator--() │ │ │ │ │ +prefix decrement │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:308 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +size_type index() const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:352 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator(Iterator &other)=default │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator(Iterator &&other)=default │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const Iterator &it) const │ │ │ │ │ +inequality │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +Iterator & operator=(Iterator &&other) │ │ │ │ │ +Move assignment. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +Iterator & operator++() │ │ │ │ │ +prefix increment │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator() │ │ │ │ │ +constructor, no arguments │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +window_type & operator*() const │ │ │ │ │ +dereferencing │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:340 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const Iterator &it) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:316 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +Iterator & operator=(Iterator &other) │ │ │ │ │ +Copy assignment. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:291 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator(B *data, size_type columns, size_type _i) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ +window_type * operator->() const │ │ │ │ │ +arrow │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:346 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ │ +const window_type * operator->() const │ │ │ │ │ +arrow │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:487 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +const window_type & operator*() const │ │ │ │ │ +dereferencing │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:481 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +ConstIterator & operator++() │ │ │ │ │ +prefix increment │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:441 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator(const B *data, size_type columns, size_type _i) │ │ │ │ │ +constructor from pointer │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:414 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ │ +ConstIterator & operator--() │ │ │ │ │ +prefix decrement │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator(const Iterator &it) │ │ │ │ │ +constructor from non_const iterator │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:420 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const ConstIterator &it) const │ │ │ │ │ +inequality │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:463 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator() │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:407 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const ConstIterator &it) const │ │ │ │ │ +equality │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:457 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ +size_type index() const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:493 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +ConstIterator & operator=(Iterator &&other) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:424 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +ConstIterator & operator=(Iterator &other) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:432 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_c_o_l_s__ │ │ │ │ │ +size_type cols_ │ │ │ │ │ +Number of columns of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:1088 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ +FieldTraits< ft >::real_type infinity_norm() const │ │ │ │ │ +infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:992 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +A allocator_type │ │ │ │ │ +Export the allocator. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:571 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ +FieldTraits< ft >::real_type infinity_norm_real() const │ │ │ │ │ +simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:1011 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ +void usmhv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^H x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:956 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ +void usmv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:854 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +Type for indices and sizes. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_d_a_t_a__ │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A > data_ │ │ │ │ │ +Abuse DenseMatrixBase as an engine for a 2d array ISTL-style. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:1081 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_t_r_a_n_s_p_o_s_e │ │ │ │ │ +Matrix transpose() const │ │ │ │ │ +Return the transpose of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:745 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ +void mtv(const X &x, Y &y) const │ │ │ │ │ +y = A^T x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:807 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ +void umv(const X &x, Y &y) const │ │ │ │ │ +y += A x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:820 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ +void mv(const X &x, Y &y) const │ │ │ │ │ +y = A x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:788 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator │ │ │ │ │ +Const iterator over the matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:586 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type rows, size_type cols) │ │ │ │ │ +Change the matrix size. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:608 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +RowIterator beforeBegin() │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:634 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +RowIterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M_a_t_r_i_x │ │ │ │ │ +Matrix() │ │ │ │ │ +Create empty matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:596 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ +Matrix & operator-=(const Matrix &b) │ │ │ │ │ +Subtract the entries of another matrix from this one. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:735 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm2() const │ │ │ │ │ +square of frobenius norm, need for block recursion │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:980 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::iterator ColIterator │ │ │ │ │ +Iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:583 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +ConstRowIterator beforeEnd() const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:653 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +Matrix & operator=(const field_type &t) │ │ │ │ │ +Assignment from scalar. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:666 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +RowIterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const row_type operator[](size_type row) const │ │ │ │ │ +The const index operator. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:684 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +ConstRowIterator end() const │ │ │ │ │ +Get const iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:646 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +friend Y operator*(const Matrix< T > &m, const X &vec) │ │ │ │ │ +Generic matrix-vector multiplication. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:770 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ +Matrix< T > & operator*=(const field_type &scalar) │ │ │ │ │ +Multiplication with a scalar. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:705 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +row_type operator[](size_type row) │ │ │ │ │ +The index operator. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:673 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ +void mmv(const X &x, Y &y) const │ │ │ │ │ +y -= A x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:837 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ +Matrix & operator+=(const Matrix &b) │ │ │ │ │ +Add the entries of another matrix to this one. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:721 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +ConstRowIterator begin() const │ │ │ │ │ +Get const iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:640 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ +void mmhv(const X &x, Y &y) const │ │ │ │ │ +y -= A^H x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:939 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +RowIterator begin() │ │ │ │ │ +Get iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< T >::field_type field_type │ │ │ │ │ +Export the type representing the underlying field. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:565 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::const_iterator ConstColIterator │ │ │ │ │ +Const iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr auto blocklevel │ │ │ │ │ +The number of nesting levels the matrix contains. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:593 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +Return the number of columns. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +T block_type │ │ │ │ │ +Export the type representing the components. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ │ +bool exists(size_type i, size_type j) const │ │ │ │ │ +return true if (i,j) is in pattern │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:1068 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ +Matrix< T > & operator/=(const field_type &scalar) │ │ │ │ │ +Division by a scalar. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:711 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2) │ │ │ │ │ +Generic matrix multiplication. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:755 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ +void umtv(const X &x, Y &y) const │ │ │ │ │ +y += A^T x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:871 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ +void mmtv(const X &x, Y &y) const │ │ │ │ │ +y -= A^T x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:888 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ +The type implementing a matrix row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ +frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:974 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ +void usmtv(const field_type &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^T x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:905 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ +void umhv(const X &x, Y &y) const │ │ │ │ │ +y += A^H x │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:922 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +Return the number of rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +ConstRowIterator beforeBegin() const │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:660 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M_a_t_r_i_x │ │ │ │ │ +Matrix(size_type rows, size_type cols) │ │ │ │ │ +Create uninitialized matrix of size rows x cols. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:601 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator │ │ │ │ │ +Iterator over the matrix rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:580 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Matrix< T, A >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:1094 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:1095 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00182.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: btdmatrix.hh File Reference │ │ │ │ +dune-istl: overlappingschwarz.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,45 +71,133 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
btdmatrix.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Implementation of the BTDMatrix class. │ │ │ │ +

Contains one level overlapping Schwarz preconditioners. │ │ │ │ More...

│ │ │ │ -
#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/scalarvectorview.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <set>
│ │ │ │ +#include <dune/common/dynmatrix.hh>
│ │ │ │ +#include <dune/common/sllist.hh>
│ │ │ │ +#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ +#include "preconditioners.hh"
│ │ │ │ +#include "superlu.hh"
│ │ │ │ +#include "umfpack.hh"
│ │ │ │ +#include "bvector.hh"
│ │ │ │ +#include "bcrsmatrix.hh"
│ │ │ │ +#include "ilusubdomainsolver.hh"
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::BTDMatrix< B, A >
 A block-tridiagonal matrix. More...
class  Dune::OverlappingSchwarzInitializer< I, S, D >
 Initializer for SuperLU Matrices representing the subdomains. More...
 
struct  Dune::FieldTraits< BTDMatrix< B, A > >
struct  Dune::AdditiveSchwarzMode
 Tag that the tells the Schwarz method to be additive. More...
 
struct  Dune::MultiplicativeSchwarzMode
 Tag that tells the Schwarz method to be multiplicative. More...
 
struct  Dune::SymmetricMultiplicativeSchwarzMode
 Tag that tells the Schwarz method to be multiplicative and symmetric. More...
 
class  Dune::DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >
 
class  Dune::OverlappingAssignerHelper< T, tag >
 
class  Dune::OverlappingAssignerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false >
 
struct  Dune::OverlappingAssignerHelper< S< BCRSMatrix< T, A > >, true >
 
class  Dune::OverlappingAssignerILUBase< M, X, Y >
 
class  Dune::OverlappingAssignerHelper< ILU0SubdomainSolver< M, X, Y >, false >
 
class  Dune::OverlappingAssignerHelper< ILUNSubdomainSolver< M, X, Y >, false >
 
struct  Dune::AdditiveAdder< S, T >
 
struct  Dune::AdditiveAdder< S, BlockVector< T, A > >
 
struct  Dune::MultiplicativeAdder< S, T >
 
struct  Dune::MultiplicativeAdder< S, BlockVector< T, A > >
 
struct  Dune::AdderSelector< T, X, S >
 template meta program for choosing how to add the correction. More...
 
struct  Dune::AdderSelector< AdditiveSchwarzMode, X, S >
 
struct  Dune::AdderSelector< MultiplicativeSchwarzMode, X, S >
 
struct  Dune::AdderSelector< SymmetricMultiplicativeSchwarzMode, X, S >
 
struct  Dune::IteratorDirectionSelector< T1, T2, forward >
 Helper template meta program for application of overlapping Schwarz. More...
 
struct  Dune::IteratorDirectionSelector< T1, T2, false >
 
struct  Dune::SeqOverlappingSchwarzApplier< T >
 Helper template meta program for application of overlapping Schwarz. More...
 
struct  Dune::SeqOverlappingSchwarzApplier< SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< T, tag >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< S< BCRSMatrix< T, A > >, true >
 
struct  Dune::SeqOverlappingSchwarzAssemblerILUBase< M, X, Y >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< ILU0SubdomainSolver< M, X, Y >, false >
 
struct  Dune::SeqOverlappingSchwarzAssemblerHelper< ILUNSubdomainSolver< M, X, Y >, false >
 
class  Dune::SeqOverlappingSchwarz< M, X, TM, TD, TA >
 Sequential overlapping Schwarz preconditioner. More...
 
struct  Dune::SeqOverlappingSchwarzDomainSize< M >
 
struct  Dune::SeqOverlappingSchwarzDomainSize< BCRSMatrix< T, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

template<typename T >
using Dune::OverlappingAssigner = OverlappingAssignerHelper< T, Dune::StoresColumnCompressed< T >::value >
 
template<class T >
using Dune::SeqOverlappingSchwarzAssembler = SeqOverlappingSchwarzAssemblerHelper< T, Dune::StoresColumnCompressed< T >::value >
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implementation of the BTDMatrix class.

│ │ │ │ -
Author
Oliver Sander
│ │ │ │ +

Contains one level overlapping Schwarz preconditioners.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,30 +1,130 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -btdmatrix.hh File Reference │ │ │ │ │ -Implementation of the BTDMatrix class. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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 │ │ │ │ │ +overlappingschwarz.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +Contains one level overlapping Schwarz preconditioners. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ +#include "_s_u_p_e_r_l_u_._h_h" │ │ │ │ │ +#include "_u_m_f_p_a_c_k_._h_h" │ │ │ │ │ +#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +#include "_i_l_u_s_u_b_d_o_m_a_i_n_s_o_l_v_e_r_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _> │ │ │ │ │ -  A block-tridiagonal matrix. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_ _I_,_ _S_,_ _D_ _> │ │ │ │ │ +  Initializer for _S_u_p_e_r_L_U Matrices representing the subdomains. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +  Tag that the tells the Schwarz method to be additive. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +  Tag that tells the Schwarz method to be multiplicative. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +  Tag that tells the Schwarz method to be multiplicative and symmetric. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _T_,_ _t_a_g_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_< │ │ │ │ │ + _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e │ │ │ │ │ + _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e │ │ │ │ │ + _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _T_,_ _X_,_ _S_ _> │ │ │ │ │ +  template meta program for choosing how to add the correction. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_o_r_w_a_r_d_ _> │ │ │ │ │ +  Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _T_ _> │ │ │ │ │ +  Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ + _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _T_,_ _t_a_g_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_< │ │ │ │ │ + _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_, │ │ │ │ │ + _t_r_u_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_, │ │ │ │ │ + _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_, │ │ │ │ │ + _Y_ _>_,_ _f_a_l_s_e_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_,_ _T_M_,_ _T_D_,_ _T_A_ _> │ │ │ │ │ +  Sequential overlapping Schwarz preconditioner. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_ _M_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r = _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r< T, _D_u_n_e_:_: │ │ │ │ │ + _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d< T >::value > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r = │ │ │ │ │ + _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r< T, _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d< T │ │ │ │ │ + >::value > │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Implementation of the BTDMatrix class. │ │ │ │ │ +Contains one level overlapping Schwarz preconditioners. │ │ │ │ │ Author │ │ │ │ │ - Oliver Sander │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: btdmatrix.hh Source File │ │ │ │ +dune-istl: overlappingschwarz.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,240 +74,1666 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
btdmatrix.hh
│ │ │ │ +
overlappingschwarz.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_BTDMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_BTDMATRIX_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/fmatrix.hh>
│ │ │ │ -
9#include <dune/common/scalarvectorview.hh>
│ │ │ │ -
10#include <dune/common/scalarmatrixview.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
19namespace Dune {
│ │ │ │ -
29 template <class B, class A=std::allocator<B> >
│ │ │ │ -
│ │ │ │ -
30 class BTDMatrix : public BCRSMatrix<B,A>
│ │ │ │ -
31 {
│ │ │ │ -
32 public:
│ │ │ │ -
33
│ │ │ │ -
34 //===== type definitions and constants
│ │ │ │ -
35
│ │ │ │ -
37 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
38
│ │ │ │ -
40 typedef B block_type;
│ │ │ │ +
5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
│ │ │ │ +
6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
│ │ │ │ +
7#include <cassert>
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <functional>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11#include <vector>
│ │ │ │ +
12#include <set>
│ │ │ │ +
13#include <dune/common/dynmatrix.hh>
│ │ │ │ +
14#include <dune/common/sllist.hh>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ +
17#include "preconditioners.hh"
│ │ │ │ +
18#include "superlu.hh"
│ │ │ │ +
19#include "umfpack.hh"
│ │ │ │ +
20#include "bvector.hh"
│ │ │ │ +
21#include "bcrsmatrix.hh"
│ │ │ │ +
22#include "ilusubdomainsolver.hh"
│ │ │ │ + │ │ │ │ +
24
│ │ │ │ +
25namespace Dune
│ │ │ │ +
26{
│ │ │ │ +
27
│ │ │ │ +
39 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ +
40 class SeqOverlappingSchwarz;
│ │ │ │
41
│ │ │ │ -
43 typedef A allocator_type;
│ │ │ │ -
44
│ │ │ │ -
46 //typedef BCRSMatrix<B,A>::row_type row_type;
│ │ │ │ -
47
│ │ │ │ -
49 typedef typename A::size_type size_type;
│ │ │ │ -
50
│ │ │ │ -
52 [[deprecated("Use free blockLevel function. Will be removed after 2.8.")]]
│ │ │ │ -
53 static constexpr auto blocklevel = blockLevel<B>()+1;
│ │ │ │ -
54
│ │ │ │ -
56 BTDMatrix() : BCRSMatrix<B,A>() {}
│ │ │ │ +
45 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
47 {
│ │ │ │ +
48 public:
│ │ │ │ + │ │ │ │ +
51
│ │ │ │ +
52 typedef I InitializerList;
│ │ │ │ +
53 typedef typename InitializerList::value_type AtomInitializer;
│ │ │ │ +
54 typedef typename AtomInitializer::Matrix Matrix;
│ │ │ │ +
55 typedef typename Matrix::const_iterator Iter;
│ │ │ │ +
56 typedef typename Matrix::row_type::const_iterator CIter;
│ │ │ │
57
│ │ │ │ -
│ │ │ │ -
58 explicit BTDMatrix(size_type size)
│ │ │ │ -
59 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random)
│ │ │ │ -
60 {
│ │ │ │ -
61 // Set number of entries for each row
│ │ │ │ -
62 // All rows get three entries, except for the first and the last one
│ │ │ │ -
63 for (size_t i=0; i<size; i++)
│ │ │ │ -
64 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
│ │ │ │ +
58 typedef S IndexSet;
│ │ │ │ +
59 typedef typename IndexSet::size_type size_type;
│ │ │ │ +
60
│ │ │ │ + │ │ │ │ +
62 const IndexSet& indices,
│ │ │ │ +
63 const subdomain_vector& domains);
│ │ │ │ +
64
│ │ │ │
65
│ │ │ │ - │ │ │ │ +
66 void addRowNnz(const Iter& row);
│ │ │ │
67
│ │ │ │ -
68 // The actual entries for each row
│ │ │ │ -
69 for (size_t i=0; i<size; i++) {
│ │ │ │ -
70 if (i>0)
│ │ │ │ -
71 this->BCRSMatrix<B,A>::addindex(i, i-1);
│ │ │ │ -
72 this->BCRSMatrix<B,A>::addindex(i, i );
│ │ │ │ -
73 if (i<size-1)
│ │ │ │ -
74 this->BCRSMatrix<B,A>::addindex(i, i+1);
│ │ │ │ -
75 }
│ │ │ │ -
76
│ │ │ │ - │ │ │ │ -
78 }
│ │ │ │ -
│ │ │ │ -
79
│ │ │ │ -
│ │ │ │ -
81 void setSize(size_type size)
│ │ │ │ -
82 {
│ │ │ │ -
83 auto nonZeros = (size==0) ? 0 : size + 2*(size-1);
│ │ │ │ -
84 this->BCRSMatrix<B,A>::setSize(size, // rows
│ │ │ │ -
85 size, // columns
│ │ │ │ -
86 nonZeros);
│ │ │ │ +
68 void allocate();
│ │ │ │ +
69
│ │ │ │ +
70 void countEntries(const Iter& row, const CIter& col) const;
│ │ │ │ +
71
│ │ │ │ +
72 void calcColstart() const;
│ │ │ │ +
73
│ │ │ │ +
74 void copyValue(const Iter& row, const CIter& col) const;
│ │ │ │ +
75
│ │ │ │ +
76 void createMatrix() const;
│ │ │ │ +
77 private:
│ │ │ │ +
78 class IndexMap
│ │ │ │ +
79 {
│ │ │ │ +
80 public:
│ │ │ │ +
81 typedef typename S::size_type size_type;
│ │ │ │ +
82 typedef std::map<size_type,size_type> Map;
│ │ │ │ +
83 typedef typename Map::iterator iterator;
│ │ │ │ +
84 typedef typename Map::const_iterator const_iterator;
│ │ │ │ +
85
│ │ │ │ +
86 IndexMap();
│ │ │ │
87
│ │ │ │ -
88 // Set number of entries for each row
│ │ │ │ -
89 // All rows get three entries, except for the first and the last one
│ │ │ │ -
90 for (size_t i=0; i<size; i++)
│ │ │ │ -
91 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
│ │ │ │ -
92
│ │ │ │ - │ │ │ │ -
94
│ │ │ │ -
95 // The actual entries for each row
│ │ │ │ -
96 for (size_t i=0; i<size; i++) {
│ │ │ │ -
97 if (i>0)
│ │ │ │ -
98 this->BCRSMatrix<B,A>::addindex(i, i-1);
│ │ │ │ -
99 this->BCRSMatrix<B,A>::addindex(i, i );
│ │ │ │ -
100 if (i<size-1)
│ │ │ │ -
101 this->BCRSMatrix<B,A>::addindex(i, i+1);
│ │ │ │ -
102 }
│ │ │ │ -
103
│ │ │ │ - │ │ │ │ -
105 }
│ │ │ │ -
│ │ │ │ +
88 void insert(size_type grow);
│ │ │ │ +
89
│ │ │ │ +
90 const_iterator find(size_type grow) const;
│ │ │ │ +
91
│ │ │ │ +
92 iterator find(size_type grow);
│ │ │ │ +
93
│ │ │ │ +
94 iterator begin();
│ │ │ │ +
95
│ │ │ │ +
96 const_iterator begin() const;
│ │ │ │ +
97
│ │ │ │ +
98 iterator end();
│ │ │ │ +
99
│ │ │ │ +
100 const_iterator end() const;
│ │ │ │ +
101
│ │ │ │ +
102 private:
│ │ │ │ +
103 std::map<size_type,size_type> map_;
│ │ │ │ +
104 size_type row;
│ │ │ │ +
105 };
│ │ │ │
106
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
109 this->BCRSMatrix<B,A>::operator=(other);
│ │ │ │ -
110 return *this;
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
116 return *this;
│ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
124 template <class V>
│ │ │ │ -
│ │ │ │ -
125 void solve (V& x, const V& rhs) const {
│ │ │ │ -
126
│ │ │ │ -
127 // special handling for 1x1 matrices. The generic algorithm doesn't work for them
│ │ │ │ -
128 if (this->N()==1) {
│ │ │ │ -
129 auto&& x0 = Impl::asVector(x[0]);
│ │ │ │ -
130 auto&& rhs0 = Impl::asVector(rhs[0]);
│ │ │ │ -
131 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0);
│ │ │ │ -
132 return;
│ │ │ │ -
133 }
│ │ │ │ +
107
│ │ │ │ +
108 typedef typename InitializerList::iterator InitIterator;
│ │ │ │ +
109 typedef typename IndexSet::const_iterator IndexIteratur;
│ │ │ │ +
110 InitializerList* initializers;
│ │ │ │ +
111 const IndexSet *indices;
│ │ │ │ +
112 mutable std::vector<IndexMap> indexMaps;
│ │ │ │ +
113 const subdomain_vector& domains;
│ │ │ │ +
114 };
│ │ │ │ +
│ │ │ │ +
115
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
120 {};
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
126 {};
│ │ │ │ +
│ │ │ │ +
127
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
133 {};
│ │ │ │ +
│ │ │ │
134
│ │ │ │ -
135 // Make copies of the rhs and the right matrix band
│ │ │ │ -
136 V d = rhs;
│ │ │ │ -
137 std::vector<block_type> c(this->N()-1);
│ │ │ │ -
138 for (size_t i=0; i<this->N()-1; i++)
│ │ │ │ -
139 c[i] = (*this)[i][i+1];
│ │ │ │ -
140
│ │ │ │ -
141 /* Modify the coefficients. */
│ │ │ │ -
142 block_type a_00_inv = (*this)[0][0];
│ │ │ │ -
143 Impl::asMatrix(a_00_inv).invert();
│ │ │ │ -
144
│ │ │ │ -
145 //c[0] /= (*this)[0][0]; /* Division by zero risk. */
│ │ │ │ -
146 block_type tmp = a_00_inv;
│ │ │ │ -
147 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0]));
│ │ │ │ -
148 c[0] = tmp;
│ │ │ │ -
149
│ │ │ │ -
150 // d = a^{-1} d /* Division by zero would imply a singular matrix. */
│ │ │ │ -
151 auto d_0_tmp = d[0];
│ │ │ │ -
152 auto&& d_0 = Impl::asVector(d[0]);
│ │ │ │ -
153 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0);
│ │ │ │ -
154
│ │ │ │ -
155 for (unsigned int i = 1; i < this->N(); i++) {
│ │ │ │ -
156
│ │ │ │ -
157 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1}
│ │ │ │ -
158 block_type tmp;
│ │ │ │ -
159 tmp = (*this)[i][i-1];
│ │ │ │ -
160 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1]));
│ │ │ │ -
161
│ │ │ │ -
162 block_type id = (*this)[i][i];
│ │ │ │ -
163 id -= tmp;
│ │ │ │ -
164 Impl::asMatrix(id).invert(); /* Division by zero risk. */
│ │ │ │ -
165
│ │ │ │ -
166 if (i<c.size()) {
│ │ │ │ -
167 Impl::asMatrix(c[i]).leftmultiply(Impl::asMatrix(id)); /* Last value calculated is redundant. */
│ │ │ │ -
168 }
│ │ │ │ -
169
│ │ │ │ -
170 // d[i] = (d[i] - d[i-1] * (*this)[i][i-1]) * id;
│ │ │ │ -
171 auto&& d_i = Impl::asVector(d[i]);
│ │ │ │ -
172 Impl::asMatrix((*this)[i][i-1]).mmv(Impl::asVector(d[i-1]), d_i);
│ │ │ │ -
173 auto tmpVec = d[i];
│ │ │ │ -
174 Impl::asMatrix(id).mv(Impl::asVector(tmpVec), d_i);
│ │ │ │ -
175 }
│ │ │ │ -
176
│ │ │ │ -
177 /* Now back substitute. */
│ │ │ │ -
178 x[this->N() - 1] = d[this->N() - 1];
│ │ │ │ -
179 for (int i = this->N() - 2; i >= 0; i--) {
│ │ │ │ -
180 //x[i] = d[i] - c[i] * x[i + 1];
│ │ │ │ -
181 x[i] = d[i];
│ │ │ │ -
182 auto&& x_i = Impl::asVector(x[i]);
│ │ │ │ -
183 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i);
│ │ │ │ -
184 }
│ │ │ │ -
185
│ │ │ │ -
186 }
│ │ │ │ -
│ │ │ │ -
187
│ │ │ │ -
188 private:
│ │ │ │ -
189
│ │ │ │ -
190 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ -
191 // The following methods from the base class should now actually be called
│ │ │ │ -
192 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ -
193
│ │ │ │ -
194 // createbegin and createend should be in there, too, but I can't get it to compile
│ │ │ │ -
195 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
│ │ │ │ -
196 // BCRSMatrix<B,A>::CreateIterator createend () {}
│ │ │ │ -
197 void setrowsize (size_type i, size_type s) {}
│ │ │ │ -
198 void incrementrowsize (size_type i) {}
│ │ │ │ -
199 void endrowsizes () {}
│ │ │ │ -
200 void addindex (size_type row, size_type col) {}
│ │ │ │ -
201 void endindices () {}
│ │ │ │ -
202 };
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
204 template<typename B, typename A>
│ │ │ │ -
│ │ │ │ -
205 struct FieldTraits< BTDMatrix<B, A> >
│ │ │ │ -
206 {
│ │ │ │ - │ │ │ │ -
208 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
209 };
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
213} // end namespace Dune
│ │ │ │ -
214
│ │ │ │ -
215#endif
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ +
139 template<class M, class X, class Y>
│ │ │ │ + │ │ │ │ +
141
│ │ │ │ +
142 // Specialization for BCRSMatrix
│ │ │ │ +
143 template<class K, class Al, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
145 {
│ │ │ │ +
146 typedef BCRSMatrix< K, Al> M;
│ │ │ │ +
147 public:
│ │ │ │ +
149 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ +
150 typedef typename X::field_type field_type;
│ │ │ │ +
151 typedef typename std::remove_const<M>::type rilu_type;
│ │ │ │ +
153 typedef X domain_type;
│ │ │ │ +
155 typedef Y range_type;
│ │ │ │ +
156 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
│ │ │ │ +
157
│ │ │ │ +
│ │ │ │ +
162 void apply (DynamicVector<field_type>& v, DynamicVector<field_type>& d)
│ │ │ │ +
163 {
│ │ │ │ +
164 assert(v.size() > 0);
│ │ │ │ +
165 assert(v.size() == d.size());
│ │ │ │ +
166 assert(A.rows() <= v.size());
│ │ │ │ +
167 assert(A.cols() <= v.size());
│ │ │ │ +
168 size_t sz = A.rows();
│ │ │ │ +
169 v.resize(sz);
│ │ │ │ +
170 d.resize(sz);
│ │ │ │ +
171 A.solve(v,d);
│ │ │ │ +
172 v.resize(v.capacity());
│ │ │ │ +
173 d.resize(d.capacity());
│ │ │ │ +
174 }
│ │ │ │ +
│ │ │ │ +
175
│ │ │ │ +
183 template<class S>
│ │ │ │ +
│ │ │ │ +
184 void setSubMatrix(const M& BCRS, S& rowset)
│ │ │ │ +
185 {
│ │ │ │ +
186 size_t sz = rowset.size();
│ │ │ │ +
187 A.resize(sz*n,sz*n);
│ │ │ │ +
188 typedef typename S::const_iterator SIter;
│ │ │ │ +
189 size_t r = 0, c = 0;
│ │ │ │ +
190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end();
│ │ │ │ +
191 rowIdx!= rowEnd; ++rowIdx, r++)
│ │ │ │ +
192 {
│ │ │ │ +
193 c = 0;
│ │ │ │ +
194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end();
│ │ │ │ +
195 colIdx!= colEnd; ++colIdx, c++)
│ │ │ │ +
196 {
│ │ │ │ +
197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx].end())
│ │ │ │ +
198 continue;
│ │ │ │ +
199 for (size_t i=0; i<n; i++)
│ │ │ │ +
200 {
│ │ │ │ +
201 for (size_t j=0; j<n; j++)
│ │ │ │ +
202 {
│ │ │ │ +
203 A[r*n+i][c*n+j] = Impl::asMatrix(BCRS[*rowIdx][*colIdx])[i][j];
│ │ │ │ +
204 }
│ │ │ │ +
205 }
│ │ │ │ +
206 }
│ │ │ │ +
207 }
│ │ │ │ +
208 }
│ │ │ │ +
│ │ │ │ +
209 private:
│ │ │ │ +
210 DynamicMatrix<K> A;
│ │ │ │ +
211 };
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
213 template<typename T, bool tag>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
215 {};
│ │ │ │ +
│ │ │ │ +
216
│ │ │ │ +
217 template<typename T>
│ │ │ │ + │ │ │ │ +
219
│ │ │ │ +
220 // specialization for DynamicMatrix
│ │ │ │ +
221 template<class K, class Al, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
223 {
│ │ │ │ +
224 public:
│ │ │ │ + │ │ │ │ +
226 typedef typename X::field_type field_type;
│ │ │ │ +
227 typedef Y range_type;
│ │ │ │ +
228 typedef typename range_type::block_type block_type;
│ │ │ │ + │ │ │ │ +
230 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
│ │ │ │ +
238 OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_, const X& b_, Y& x_);
│ │ │ │ +
239
│ │ │ │ +
243 inline
│ │ │ │ +
244 void deallocate();
│ │ │ │ +
245
│ │ │ │ +
249 inline
│ │ │ │ +
250 void resetIndexForNextDomain();
│ │ │ │ +
251
│ │ │ │ +
256 inline
│ │ │ │ +
257 DynamicVector<field_type> & lhs();
│ │ │ │ +
258
│ │ │ │ +
263 inline
│ │ │ │ +
264 DynamicVector<field_type> & rhs();
│ │ │ │ +
265
│ │ │ │ +
270 inline
│ │ │ │ +
271 void relaxResult(field_type relax);
│ │ │ │ +
272
│ │ │ │ +
277 void operator()(const size_type& domainIndex);
│ │ │ │ +
278
│ │ │ │ +
286 inline
│ │ │ │ +
287 void assignResult(block_type& res);
│ │ │ │ +
288
│ │ │ │ +
289 private:
│ │ │ │ +
293 const matrix_type* mat;
│ │ │ │ +
295 // we need a pointer, because we have to avoid deep copies
│ │ │ │ +
296 DynamicVector<field_type> * rhs_;
│ │ │ │ +
298 // we need a pointer, because we have to avoid deep copies
│ │ │ │ +
299 DynamicVector<field_type> * lhs_;
│ │ │ │ +
301 const range_type* b;
│ │ │ │ +
303 range_type* x;
│ │ │ │ +
305 std::size_t i;
│ │ │ │ +
307 std::size_t maxlength_;
│ │ │ │ +
308 };
│ │ │ │ +
│ │ │ │ +
309
│ │ │ │ +
310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
311 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
313 {
│ │ │ │ + │ │ │ │ +
315 typedef typename S<BCRSMatrix<T, A>>::range_type range_type;
│ │ │ │ +
316 typedef typename range_type::field_type field_type;
│ │ │ │ +
317 typedef typename range_type::block_type block_type;
│ │ │ │ +
318
│ │ │ │ + │ │ │ │ +
320
│ │ │ │ +
321 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
│ │ │ │ +
322 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
│ │ │ │ +
330 OverlappingAssignerHelper(std::size_t maxlength, const matrix_type& mat,
│ │ │ │ +
331 const range_type& b, range_type& x);
│ │ │ │ +
337 void deallocate();
│ │ │ │ +
338
│ │ │ │ +
339 /*
│ │ │ │ +
340 * @brief Resets the local index to zero.
│ │ │ │ +
341 */
│ │ │ │ +
342 void resetIndexForNextDomain();
│ │ │ │ +
343
│ │ │ │ +
348 field_type* lhs();
│ │ │ │ +
349
│ │ │ │ +
354 field_type* rhs();
│ │ │ │ +
355
│ │ │ │ +
360 void relaxResult(field_type relax);
│ │ │ │ +
361
│ │ │ │ +
366 void operator()(const size_type& domain);
│ │ │ │ +
367
│ │ │ │ +
375 void assignResult(block_type& res);
│ │ │ │ +
376
│ │ │ │ +
377 private:
│ │ │ │ +
381 const matrix_type* mat;
│ │ │ │ +
383 field_type* rhs_;
│ │ │ │ +
385 field_type* lhs_;
│ │ │ │ +
387 const range_type* b;
│ │ │ │ +
389 range_type* x;
│ │ │ │ +
391 std::size_t i;
│ │ │ │ +
393 std::size_t maxlength_;
│ │ │ │ +
394 };
│ │ │ │ +
│ │ │ │ +
395
│ │ │ │ +
396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
397
│ │ │ │ +
398 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
400 {
│ │ │ │ +
401 public:
│ │ │ │ +
402 typedef M matrix_type;
│ │ │ │ +
403
│ │ │ │ +
404 typedef typename Y::field_type field_type;
│ │ │ │ +
405
│ │ │ │ +
406 typedef typename Y::block_type block_type;
│ │ │ │ +
407
│ │ │ │ +
408 typedef typename matrix_type::size_type size_type;
│ │ │ │ +
416 OverlappingAssignerILUBase(std::size_t maxlength, const M& mat,
│ │ │ │ +
417 const Y& b, X& x);
│ │ │ │ +
423 void deallocate();
│ │ │ │ +
424
│ │ │ │ + │ │ │ │ +
429
│ │ │ │ +
434 X& lhs();
│ │ │ │ +
435
│ │ │ │ +
440 Y& rhs();
│ │ │ │ +
441
│ │ │ │ +
446 void relaxResult(field_type relax);
│ │ │ │ +
447
│ │ │ │ +
452 void operator()(const size_type& domain);
│ │ │ │ +
453
│ │ │ │ +
461 void assignResult(block_type& res);
│ │ │ │ +
462
│ │ │ │ +
463 private:
│ │ │ │ +
467 const M* mat;
│ │ │ │ +
469 X* lhs_;
│ │ │ │ +
471 Y* rhs_;
│ │ │ │ +
473 const Y* b;
│ │ │ │ +
475 X* x;
│ │ │ │ +
477 size_type i;
│ │ │ │ +
478 };
│ │ │ │ +
│ │ │ │ +
479
│ │ │ │ +
480 // specialization for ILU0
│ │ │ │ +
481 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
483 : public OverlappingAssignerILUBase<M,X,Y>
│ │ │ │ +
484 {
│ │ │ │ +
485 public:
│ │ │ │ +
│ │ │ │ +
493 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
│ │ │ │ +
494 const Y& b, X& x)
│ │ │ │ +
495 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
│ │ │ │ +
496 {}
│ │ │ │ +
│ │ │ │ +
497 };
│ │ │ │ +
│ │ │ │ +
498
│ │ │ │ +
499 // specialization for ILUN
│ │ │ │ +
500 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
502 : public OverlappingAssignerILUBase<M,X,Y>
│ │ │ │ +
503 {
│ │ │ │ +
504 public:
│ │ │ │ +
│ │ │ │ +
512 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
│ │ │ │ +
513 const Y& b, X& x)
│ │ │ │ +
514 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
│ │ │ │ +
515 {}
│ │ │ │ +
│ │ │ │ +
516 };
│ │ │ │ +
│ │ │ │ +
517
│ │ │ │ +
518 template<typename S, typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
520 {};
│ │ │ │ +
│ │ │ │ +
521
│ │ │ │ +
522 template<typename S, typename T, typename A>
│ │ │ │ +
│ │ │ │ +
523 struct AdditiveAdder<S, BlockVector<T,A> >
│ │ │ │ +
524 {
│ │ │ │ +
525 typedef typename A::size_type size_type;
│ │ │ │ +
526 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
│ │ │ │ + │ │ │ │ +
528 OverlappingAssigner<S>& assigner, const field_type& relax_);
│ │ │ │ +
529 void operator()(const size_type& domain);
│ │ │ │ +
530 void axpy();
│ │ │ │ +
531 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
│ │ │ │ +
532
│ │ │ │ +
533 private:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
536 OverlappingAssigner<S>* assigner;
│ │ │ │ +
537 field_type relax;
│ │ │ │ +
538 };
│ │ │ │ +
│ │ │ │ +
539
│ │ │ │ +
540 template<typename S,typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
542 {};
│ │ │ │ +
│ │ │ │ +
543
│ │ │ │ +
544 template<typename S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
546 {
│ │ │ │ +
547 typedef typename A::size_type size_type;
│ │ │ │ +
548 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
│ │ │ │ + │ │ │ │ +
550 OverlappingAssigner<S>& assigner_, const field_type& relax_);
│ │ │ │ +
551 void operator()(const size_type& domain);
│ │ │ │ +
552 void axpy();
│ │ │ │ +
553 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
│ │ │ │ +
554
│ │ │ │ +
555 private:
│ │ │ │ + │ │ │ │ +
557 OverlappingAssigner<S>* assigner;
│ │ │ │ +
558 field_type relax;
│ │ │ │ +
559 };
│ │ │ │ +
│ │ │ │ +
560
│ │ │ │ +
570 template<typename T, class X, class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
572 {};
│ │ │ │ +
│ │ │ │ +
573
│ │ │ │ +
574 template<class X, class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
576 {
│ │ │ │ + │ │ │ │ +
578 };
│ │ │ │ +
│ │ │ │ +
579
│ │ │ │ +
580 template<class X, class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
582 {
│ │ │ │ + │ │ │ │ +
584 };
│ │ │ │ +
│ │ │ │ +
585
│ │ │ │ +
586 template<class X, class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
588 {
│ │ │ │ + │ │ │ │ +
590 };
│ │ │ │ +
│ │ │ │ +
591
│ │ │ │ +
603 template<typename T1, typename T2, bool forward>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
605 {
│ │ │ │ +
606 typedef T1 solver_vector;
│ │ │ │ +
607 typedef typename solver_vector::iterator solver_iterator;
│ │ │ │ + │ │ │ │ +
609 typedef typename subdomain_vector::const_iterator domain_iterator;
│ │ │ │ +
610
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
612 {
│ │ │ │ +
613 return sv.begin();
│ │ │ │ +
614 }
│ │ │ │ +
│ │ │ │ +
615
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
617 {
│ │ │ │ +
618 return sv.end();
│ │ │ │ +
619 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
621 {
│ │ │ │ +
622 return sv.begin();
│ │ │ │ +
623 }
│ │ │ │ +
│ │ │ │ +
624
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
626 {
│ │ │ │ +
627 return sv.end();
│ │ │ │ +
628 }
│ │ │ │ +
│ │ │ │ +
629 };
│ │ │ │ +
│ │ │ │ +
630
│ │ │ │ +
631 template<typename T1, typename T2>
│ │ │ │ +
│ │ │ │ +
632 struct IteratorDirectionSelector<T1,T2,false>
│ │ │ │ +
633 {
│ │ │ │ +
634 typedef T1 solver_vector;
│ │ │ │ +
635 typedef typename solver_vector::reverse_iterator solver_iterator;
│ │ │ │ + │ │ │ │ +
637 typedef typename subdomain_vector::const_reverse_iterator domain_iterator;
│ │ │ │ +
638
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
640 {
│ │ │ │ +
641 return sv.rbegin();
│ │ │ │ +
642 }
│ │ │ │ +
│ │ │ │ +
643
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
645 {
│ │ │ │ +
646 return sv.rend();
│ │ │ │ +
647 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
649 {
│ │ │ │ +
650 return sv.rbegin();
│ │ │ │ +
651 }
│ │ │ │ +
│ │ │ │ +
652
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
654 {
│ │ │ │ +
655 return sv.rend();
│ │ │ │ +
656 }
│ │ │ │ +
│ │ │ │ +
657 };
│ │ │ │ +
│ │ │ │ +
658
│ │ │ │ +
667 template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
669 {
│ │ │ │ +
670 typedef T smoother;
│ │ │ │ +
671 typedef typename smoother::range_type range_type;
│ │ │ │ +
672
│ │ │ │ +
│ │ │ │ +
673 static void apply(smoother& sm, range_type& v, const range_type& b)
│ │ │ │ +
674 {
│ │ │ │ +
675 sm.template apply<true>(v, b);
│ │ │ │ +
676 }
│ │ │ │ +
│ │ │ │ +
677 };
│ │ │ │ +
│ │ │ │ +
678
│ │ │ │ +
679 template<class M, class X, class TD, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
681 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
684
│ │ │ │ +
│ │ │ │ +
685 static void apply(smoother& sm, range_type& v, const range_type& b)
│ │ │ │ +
686 {
│ │ │ │ +
687 sm.template apply<true>(v, b);
│ │ │ │ +
688 sm.template apply<false>(v, b);
│ │ │ │ +
689 }
│ │ │ │ +
│ │ │ │ +
690 };
│ │ │ │ +
│ │ │ │ +
691
│ │ │ │ +
692 template<class T, bool tag>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
694 {};
│ │ │ │ +
│ │ │ │ +
695
│ │ │ │ +
696 template<class T>
│ │ │ │ + │ │ │ │ +
698
│ │ │ │ +
699 template<class K, class Al, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
701 {
│ │ │ │ + │ │ │ │ +
703 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
│ │ │ │ +
704 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ +
705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
│ │ │ │ +
706 Solvers& solvers, const SubDomains& domains,
│ │ │ │ +
707 bool onTheFly);
│ │ │ │ +
708 };
│ │ │ │ +
│ │ │ │ +
709
│ │ │ │ +
710 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
712 {
│ │ │ │ + │ │ │ │ +
714 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
│ │ │ │ +
715 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ +
716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
│ │ │ │ +
717 Solvers& solvers, const SubDomains& domains,
│ │ │ │ +
718 bool onTheFly);
│ │ │ │ +
719 };
│ │ │ │ +
│ │ │ │ +
720
│ │ │ │ +
721 template<class M,class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
723 {
│ │ │ │ +
724 typedef M matrix_type;
│ │ │ │ +
725 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ +
726 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
│ │ │ │ +
727 Solvers& solvers, const SubDomains& domains,
│ │ │ │ +
728 bool onTheFly);
│ │ │ │ +
729 };
│ │ │ │ +
│ │ │ │ +
730
│ │ │ │ +
731 template<class M,class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
734 {};
│ │ │ │ +
│ │ │ │ +
735
│ │ │ │ +
736 template<class M,class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
739 {};
│ │ │ │ +
│ │ │ │ +
740
│ │ │ │ +
751 template<class M, class X, class TM=AdditiveSchwarzMode,
│ │ │ │ +
752 class TD=ILU0SubdomainSolver<M,X,X>, class TA=std::allocator<X> >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
754 : public Preconditioner<X,X>
│ │ │ │ +
755 {
│ │ │ │ +
756 public:
│ │ │ │ +
760 typedef M matrix_type;
│ │ │ │ +
761
│ │ │ │ +
765 typedef X domain_type;
│ │ │ │ +
766
│ │ │ │ +
770 typedef X range_type;
│ │ │ │ +
771
│ │ │ │ +
778 typedef TM Mode;
│ │ │ │ +
779
│ │ │ │ +
783 typedef typename X::field_type field_type;
│ │ │ │ +
784
│ │ │ │ +
786 typedef typename matrix_type::size_type size_type;
│ │ │ │ +
787
│ │ │ │ +
789 typedef TA allocator;
│ │ │ │ +
790
│ │ │ │ +
792 typedef std::set<size_type, std::less<size_type>,
│ │ │ │ +
793 typename std::allocator_traits<TA>::template rebind_alloc<size_type> >
│ │ │ │ + │ │ │ │ +
795
│ │ │ │ +
797 typedef std::vector<subdomain_type, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_type> > subdomain_vector;
│ │ │ │ +
798
│ │ │ │ + │ │ │ │ +
801
│ │ │ │ +
803 typedef std::vector<subdomain_list, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_list> > rowtodomain_vector;
│ │ │ │ +
804
│ │ │ │ +
806 typedef TD slu;
│ │ │ │ +
807
│ │ │ │ +
809 typedef std::vector<slu, typename std::allocator_traits<TA>::template rebind_alloc<slu> > slu_vector;
│ │ │ │ +
810
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
825 field_type relaxationFactor=1, bool onTheFly_=true);
│ │ │ │ +
826
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
839 field_type relaxationFactor=1, bool onTheFly_=true);
│ │ │ │ +
840
│ │ │ │ +
│ │ │ │ +
846 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] X& b)
│ │ │ │ +
847 {}
│ │ │ │ +
│ │ │ │ +
848
│ │ │ │ +
│ │ │ │ +
854 virtual void apply (X& v, const X& d);
│ │ │ │ +
855
│ │ │ │ +
│ │ │ │ +
861 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ +
862 {}
│ │ │ │ +
│ │ │ │ +
863
│ │ │ │ +
864 template<bool forward>
│ │ │ │ +
│ │ │ │ +
865 void apply(X& v, const X& d);
│ │ │ │ +
866
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
869 {
│ │ │ │ + │ │ │ │ +
871 }
│ │ │ │ +
│ │ │ │ +
872
│ │ │ │ +
873 private:
│ │ │ │ +
874 const M& mat;
│ │ │ │ +
875 slu_vector solvers;
│ │ │ │ +
876 subdomain_vector subDomains;
│ │ │ │ +
877 field_type relax;
│ │ │ │ +
878
│ │ │ │ +
879 typename M::size_type maxlength;
│ │ │ │ +
880
│ │ │ │ +
881 bool onTheFly;
│ │ │ │ +
882 };
│ │ │ │ +
883
│ │ │ │ +
884
│ │ │ │ +
885
│ │ │ │ +
886 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
888 const IndexSet& idx,
│ │ │ │ +
889 const subdomain_vector& domains_)
│ │ │ │ +
890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_)
│ │ │ │ +
891 {}
│ │ │ │ +
│ │ │ │ +
892
│ │ │ │ +
893
│ │ │ │ +
894 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
896 {
│ │ │ │ +
897 typedef typename IndexSet::value_type::const_iterator iterator;
│ │ │ │ +
898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
│ │ │ │ +
899 (*initializers)[*domain].addRowNnz(row, domains[*domain]);
│ │ │ │ +
900 indexMaps[*domain].insert(row.index());
│ │ │ │ +
901 }
│ │ │ │ +
902 }
│ │ │ │ +
│ │ │ │ +
903
│ │ │ │ +
904 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
906 {
│ │ │ │ +
907 for(auto&& i: *initializers)
│ │ │ │ +
908 i.allocateMatrixStorage();
│ │ │ │ +
909 for(auto&& i: *initializers)
│ │ │ │ +
910 i.allocateMarker();
│ │ │ │ +
911 }
│ │ │ │ +
│ │ │ │ +
912
│ │ │ │ +
913 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
915 {
│ │ │ │ +
916 typedef typename IndexSet::value_type::const_iterator iterator;
│ │ │ │ +
917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
│ │ │ │ +
918 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
│ │ │ │ +
919 if(v!= indexMaps[*domain].end()) {
│ │ │ │ +
920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(col.index())->second);
│ │ │ │ +
921 }
│ │ │ │ +
922 }
│ │ │ │ +
923 }
│ │ │ │ +
│ │ │ │ +
924
│ │ │ │ +
925 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
927 {
│ │ │ │ +
928 for(auto&& i : *initializers)
│ │ │ │ +
929 i.calcColstart();
│ │ │ │ +
930 }
│ │ │ │ +
│ │ │ │ +
931
│ │ │ │ +
932 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
934 {
│ │ │ │ +
935 typedef typename IndexSet::value_type::const_iterator iterator;
│ │ │ │ +
936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices)[row.index()].end(); ++domain) {
│ │ │ │ +
937 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
│ │ │ │ +
938 if(v!= indexMaps[*domain].end()) {
│ │ │ │ +
939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index()));
│ │ │ │ +
940 (*initializers)[*domain].copyValue(col, indexMaps[*domain].find(row.index())->second,
│ │ │ │ +
941 v->second);
│ │ │ │ +
942 }
│ │ │ │ +
943 }
│ │ │ │ +
944 }
│ │ │ │ +
│ │ │ │ +
945
│ │ │ │ +
946 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
948 {
│ │ │ │ +
949 std::vector<IndexMap>().swap(indexMaps);
│ │ │ │ +
950 for(auto&& i: *initializers)
│ │ │ │ +
951 i.createMatrix();
│ │ │ │ +
952 }
│ │ │ │ +
│ │ │ │ +
953
│ │ │ │ +
954 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
956 : row(0)
│ │ │ │ +
957 {}
│ │ │ │ +
│ │ │ │ +
958
│ │ │ │ +
959 template<class I, class S, class D>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
961 {
│ │ │ │ +
962 assert(map_.find(grow)==map_.end());
│ │ │ │ +
963 map_.insert(std::make_pair(grow, row++));
│ │ │ │ +
964 }
│ │ │ │ +
│ │ │ │ +
965
│ │ │ │ +
966 template<class I, class S, class D>
│ │ │ │ +
967 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
969 {
│ │ │ │ +
970 return map_.find(grow);
│ │ │ │ +
971 }
│ │ │ │ +
│ │ │ │ +
972
│ │ │ │ +
973 template<class I, class S, class D>
│ │ │ │ +
974 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
976 {
│ │ │ │ +
977 return map_.find(grow);
│ │ │ │ +
978 }
│ │ │ │ +
│ │ │ │ +
979
│ │ │ │ +
980 template<class I, class S, class D>
│ │ │ │ +
981 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
983 {
│ │ │ │ +
984 return map_.end();
│ │ │ │ +
985 }
│ │ │ │ +
│ │ │ │ +
986
│ │ │ │ +
987 template<class I, class S, class D>
│ │ │ │ +
988 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
990 {
│ │ │ │ +
991 return map_.end();
│ │ │ │ +
992 }
│ │ │ │ +
│ │ │ │ +
993
│ │ │ │ +
994 template<class I, class S, class D>
│ │ │ │ +
995 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
997 {
│ │ │ │ +
998 return map_.begin();
│ │ │ │ +
999 }
│ │ │ │ +
│ │ │ │ +
1000
│ │ │ │ +
1001 template<class I, class S, class D>
│ │ │ │ +
1002 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1004 {
│ │ │ │ +
1005 return map_.begin();
│ │ │ │ +
1006 }
│ │ │ │ +
│ │ │ │ +
1007
│ │ │ │ +
1008 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1010 field_type relaxationFactor, bool fly)
│ │ │ │ +
1011 : mat(mat_), relax(relaxationFactor), onTheFly(fly)
│ │ │ │ +
1012 {
│ │ │ │ +
1013 typedef typename rowtodomain_vector::const_iterator RowDomainIterator;
│ │ │ │ +
1014 typedef typename subdomain_list::const_iterator DomainIterator;
│ │ │ │ +
1015#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1016 assert(rowToDomain.size()==mat.N());
│ │ │ │ +
1017 assert(rowToDomain.size()==mat.M());
│ │ │ │ +
1018
│ │ │ │ +
1019 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
│ │ │ │ +
1020 assert(iter->size()>0);
│ │ │ │ +
1021
│ │ │ │ +
1022#endif
│ │ │ │ +
1023 // calculate the number of domains
│ │ │ │ +
1024 size_type domains=0;
│ │ │ │ +
1025 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
│ │ │ │ +
1026 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
│ │ │ │ +
1027 domains=std::max(domains, *d);
│ │ │ │ +
1028 ++domains;
│ │ │ │ +
1029
│ │ │ │ +
1030 solvers.resize(domains);
│ │ │ │ +
1031 subDomains.resize(domains);
│ │ │ │ +
1032
│ │ │ │ +
1033 // initialize subdomains to row mapping from row to subdomain mapping
│ │ │ │ +
1034 size_type row=0;
│ │ │ │ +
1035 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter, ++row)
│ │ │ │ +
1036 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
│ │ │ │ +
1037 subDomains[*d].insert(row);
│ │ │ │ +
1038
│ │ │ │ +
1039#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1040 size_type i=0;
│ │ │ │ +
1041 typedef typename subdomain_vector::const_iterator iterator;
│ │ │ │ +
1042 for(iterator iter=subDomains.begin(); iter != subDomains.end(); ++iter) {
│ │ │ │ +
1043 typedef typename subdomain_type::const_iterator entry_iterator;
│ │ │ │ +
1044 Dune::dvverb<<"domain "<<i++<<":";
│ │ │ │ +
1045 for(entry_iterator entry = iter->begin(); entry != iter->end(); ++entry) {
│ │ │ │ +
1046 Dune::dvverb<<" "<<*entry;
│ │ │ │ +
1047 }
│ │ │ │ +
1048 Dune::dvverb<<std::endl;
│ │ │ │ +
1049 }
│ │ │ │ +
1050#endif
│ │ │ │ + │ │ │ │ +
1052 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
│ │ │ │ +
1053 }
│ │ │ │ +
│ │ │ │ +
1054
│ │ │ │ +
1055 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1057 const subdomain_vector& sd,
│ │ │ │ +
1058 field_type relaxationFactor,
│ │ │ │ +
1059 bool fly)
│ │ │ │ +
1060 : mat(mat_), solvers(sd.size()), subDomains(sd), relax(relaxationFactor),
│ │ │ │ +
1061 onTheFly(fly)
│ │ │ │ +
1062 {
│ │ │ │ +
1063 typedef typename subdomain_vector::const_iterator DomainIterator;
│ │ │ │ +
1064
│ │ │ │ +
1065#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
1066 size_type i=0;
│ │ │ │ +
1067
│ │ │ │ +
1068 for(DomainIterator d=sd.begin(); d != sd.end(); ++d,++i) {
│ │ │ │ +
1069 //std::cout<<i<<": "<<d->size()<<std::endl;
│ │ │ │ +
1070 assert(d->size()>0);
│ │ │ │ +
1071 typedef typename DomainIterator::value_type::const_iterator entry_iterator;
│ │ │ │ +
1072 Dune::dvverb<<"domain "<<i<<":";
│ │ │ │ +
1073 for(entry_iterator entry = d->begin(); entry != d->end(); ++entry) {
│ │ │ │ +
1074 Dune::dvverb<<" "<<*entry;
│ │ │ │ +
1075 }
│ │ │ │ +
1076 Dune::dvverb<<std::endl;
│ │ │ │ +
1077 }
│ │ │ │ +
1078
│ │ │ │ +
1079#endif
│ │ │ │ +
1080
│ │ │ │ +
1081 // Create a row to subdomain mapping
│ │ │ │ + │ │ │ │ +
1083
│ │ │ │ + │ │ │ │ +
1085
│ │ │ │ +
1086 for(DomainIterator domain=sd.begin(); domain != sd.end(); ++domain, ++domainId) {
│ │ │ │ +
1087 typedef typename subdomain_type::const_iterator iterator;
│ │ │ │ +
1088 for(iterator row=domain->begin(); row != domain->end(); ++row)
│ │ │ │ +
1089 rowToDomain[*row].push_back(domainId);
│ │ │ │ +
1090 }
│ │ │ │ +
1091
│ │ │ │ + │ │ │ │ +
1093 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
│ │ │ │ +
1094 }
│ │ │ │ +
│ │ │ │ +
1095
│ │ │ │ +
1102 template<class M>
│ │ │ │ + │ │ │ │ +
1104
│ │ │ │ +
1105 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1107 {
│ │ │ │ +
1108 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
│ │ │ │ +
1109 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
│ │ │ │ +
1110 template<class Domain>
│ │ │ │ +
│ │ │ │ +
1111 static int size(const Domain & d)
│ │ │ │ +
1112 {
│ │ │ │ +
1113 assert(n==m);
│ │ │ │ +
1114 return m*d.size();
│ │ │ │ +
1115 }
│ │ │ │ +
│ │ │ │ +
1116 };
│ │ │ │ +
│ │ │ │ +
1117
│ │ │ │ +
1118 template<class K, class Al, class X, class Y>
│ │ │ │ +
1119 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ +
1120 std::size_t
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
│ │ │ │ +
1123 [[maybe_unused]] const matrix_type& mat,
│ │ │ │ +
1124 [[maybe_unused]] Solvers& solvers,
│ │ │ │ +
1125 const SubDomains& subDomains,
│ │ │ │ +
1126 [[maybe_unused]] bool onTheFly)
│ │ │ │ +
1127 {
│ │ │ │ +
1128 typedef typename SubDomains::const_iterator DomainIterator;
│ │ │ │ +
1129 std::size_t maxlength = 0;
│ │ │ │ +
1130
│ │ │ │ +
1131 assert(onTheFly);
│ │ │ │ +
1132
│ │ │ │ +
1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
│ │ │ │ +
1134 maxlength=std::max(maxlength, domain->size());
│ │ │ │ +
1135 maxlength*=n;
│ │ │ │ +
1136
│ │ │ │ +
1137 return maxlength;
│ │ │ │ +
1138 }
│ │ │ │ +
│ │ │ │ +
1139
│ │ │ │ +
1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
1141 template<template<class> class S, typename T, typename A>
│ │ │ │ +
1142 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ +
│ │ │ │ +
1143 std::size_t SeqOverlappingSchwarzAssemblerHelper<S<BCRSMatrix<T,A>>,true>::assembleLocalProblems(const RowToDomain& rowToDomain,
│ │ │ │ +
1144 const matrix_type& mat,
│ │ │ │ +
1145 Solvers& solvers,
│ │ │ │ +
1146 const SubDomains& subDomains,
│ │ │ │ +
1147 bool onTheFly)
│ │ │ │ +
1148 {
│ │ │ │ +
1149 typedef typename S<BCRSMatrix<T,A>>::MatrixInitializer MatrixInitializer;
│ │ │ │ +
1150 typedef typename std::vector<MatrixInitializer>::iterator InitializerIterator;
│ │ │ │ +
1151 typedef typename SubDomains::const_iterator DomainIterator;
│ │ │ │ +
1152 typedef typename Solvers::iterator SolverIterator;
│ │ │ │ +
1153 std::size_t maxlength = 0;
│ │ │ │ +
1154
│ │ │ │ +
1155 if(onTheFly) {
│ │ │ │ +
1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
│ │ │ │ +
1157 maxlength=std::max(maxlength, domain->size());
│ │ │ │ +
1158 maxlength*=Impl::asMatrix(*mat[0].begin()).N();
│ │ │ │ +
1159 }else{
│ │ │ │ +
1160 // initialize the initializers
│ │ │ │ +
1161 DomainIterator domain=subDomains.begin();
│ │ │ │ +
1162
│ │ │ │ +
1163 // Create the initializers list.
│ │ │ │ +
1164 std::vector<MatrixInitializer> initializers(subDomains.size());
│ │ │ │ +
1165
│ │ │ │ +
1166 SolverIterator solver=solvers.begin();
│ │ │ │ +
1167 for(InitializerIterator initializer=initializers.begin(); initializer!=initializers.end();
│ │ │ │ +
1168 ++initializer, ++solver, ++domain) {
│ │ │ │ +
1169 solver->getInternalMatrix().N_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
│ │ │ │ +
1170 solver->getInternalMatrix().M_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
│ │ │ │ +
1171 //solver->setVerbosity(true);
│ │ │ │ +
1172 *initializer=MatrixInitializer(solver->getInternalMatrix());
│ │ │ │ +
1173 }
│ │ │ │ +
1174
│ │ │ │ +
1175 // Set up the supermatrices according to the subdomains
│ │ │ │ + │ │ │ │ +
1177 RowToDomain, SubDomains> Initializer;
│ │ │ │ +
1178
│ │ │ │ +
1179 Initializer initializer(initializers, rowToDomain, subDomains);
│ │ │ │ +
1180 copyToBCCSMatrix(initializer, mat);
│ │ │ │ +
1181
│ │ │ │ +
1182 // Calculate the LU decompositions
│ │ │ │ +
1183 for(auto&& s: solvers)
│ │ │ │ +
1184 s.decompose();
│ │ │ │ +
1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end(); ++solverIt)
│ │ │ │ +
1186 {
│ │ │ │ +
1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix().M());
│ │ │ │ +
1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N());
│ │ │ │ +
1189 }
│ │ │ │ +
1190 }
│ │ │ │ +
1191 return maxlength;
│ │ │ │ +
1192 }
│ │ │ │ +
│ │ │ │ +
1193
│ │ │ │ +
1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
1195
│ │ │ │ +
1196 template<class M,class X,class Y>
│ │ │ │ +
1197 template<class RowToDomain, class Solvers, class SubDomains>
│ │ │ │ +
│ │ │ │ +
1198 std::size_t SeqOverlappingSchwarzAssemblerILUBase<M,X,Y>::assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
│ │ │ │ +
1199 const matrix_type& mat,
│ │ │ │ +
1200 Solvers& solvers,
│ │ │ │ +
1201 const SubDomains& subDomains,
│ │ │ │ +
1202 bool onTheFly)
│ │ │ │ +
1203 {
│ │ │ │ +
1204 typedef typename SubDomains::const_iterator DomainIterator;
│ │ │ │ +
1205 typedef typename Solvers::iterator SolverIterator;
│ │ │ │ +
1206 std::size_t maxlength = 0;
│ │ │ │ +
1207
│ │ │ │ +
1208 if(onTheFly) {
│ │ │ │ +
1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
│ │ │ │ +
1210 maxlength=std::max(maxlength, domain->size());
│ │ │ │ +
1211 }else{
│ │ │ │ +
1212 // initialize the solvers of the local prolems.
│ │ │ │ +
1213 SolverIterator solver=solvers.begin();
│ │ │ │ +
1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();
│ │ │ │ +
1215 ++domain, ++solver) {
│ │ │ │ +
1216 solver->setSubMatrix(mat, *domain);
│ │ │ │ +
1217 maxlength=std::max(maxlength, domain->size());
│ │ │ │ +
1218 }
│ │ │ │ +
1219 }
│ │ │ │ +
1220
│ │ │ │ +
1221 return maxlength;
│ │ │ │ +
1222
│ │ │ │ +
1223 }
│ │ │ │ +
│ │ │ │ +
1224
│ │ │ │ +
1225
│ │ │ │ +
1226 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1228 {
│ │ │ │ + │ │ │ │ +
1230 }
│ │ │ │ +
│ │ │ │ +
1231
│ │ │ │ +
1232 template<class M, class X, class TM, class TD, class TA>
│ │ │ │ +
1233 template<bool forward>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1235 {
│ │ │ │ +
1236 typedef slu_vector solver_vector;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1239 domain_iterator;
│ │ │ │ +
1240
│ │ │ │ +
1241 OverlappingAssigner<TD> assigner(maxlength, mat, b, x);
│ │ │ │ +
1242
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1245 X v(x); // temporary for the update
│ │ │ │ +
1246 v=0;
│ │ │ │ +
1247
│ │ │ │ +
1248 typedef typename AdderSelector<TM,X,TD >::Adder Adder;
│ │ │ │ +
1249 Adder adder(v, x, assigner, relax);
│ │ │ │ +
1250
│ │ │ │ + │ │ │ │ +
1252 //Copy rhs to C-array for SuperLU
│ │ │ │ +
1253 std::for_each(domain->begin(), domain->end(), assigner);
│ │ │ │ +
1254 assigner.resetIndexForNextDomain();
│ │ │ │ +
1255 if(onTheFly) {
│ │ │ │ +
1256 // Create the subdomain solver
│ │ │ │ +
1257 slu sdsolver;
│ │ │ │ +
1258 sdsolver.setSubMatrix(mat, *domain);
│ │ │ │ +
1259 // Apply
│ │ │ │ +
1260 sdsolver.apply(assigner.lhs(), assigner.rhs());
│ │ │ │ +
1261 }else{
│ │ │ │ +
1262 solver->apply(assigner.lhs(), assigner.rhs());
│ │ │ │ +
1263 ++solver;
│ │ │ │ +
1264 }
│ │ │ │ +
1265
│ │ │ │ +
1266 //Add relaxed correction to from SuperLU to v
│ │ │ │ +
1267 std::for_each(domain->begin(), domain->end(), adder);
│ │ │ │ +
1268 assigner.resetIndexForNextDomain();
│ │ │ │ +
1269
│ │ │ │ +
1270 }
│ │ │ │ +
1271
│ │ │ │ +
1272 adder.axpy();
│ │ │ │ +
1273 assigner.deallocate();
│ │ │ │ +
1274 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
1275
│ │ │ │ +
1276 template<class K, class Al, class X, class Y>
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1278 ::OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_,
│ │ │ │ +
1279 const X& b_, Y& x_) :
│ │ │ │ +
1280 mat(&mat_),
│ │ │ │ +
1281 rhs_( new DynamicVector<field_type>(maxlength, 42) ),
│ │ │ │ +
1282 lhs_( new DynamicVector<field_type>(maxlength, -42) ),
│ │ │ │ +
1283 b(&b_),
│ │ │ │ +
1284 x(&x_),
│ │ │ │ +
1285 i(0),
│ │ │ │ +
1286 maxlength_(maxlength)
│ │ │ │ +
1287 {}
│ │ │ │ +
│ │ │ │ +
1288
│ │ │ │ +
1289 template<class K, class Al, class X, class Y>
│ │ │ │ +
1290 void
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1292 ::deallocate()
│ │ │ │ +
1293 {
│ │ │ │ +
1294 delete rhs_;
│ │ │ │ +
1295 delete lhs_;
│ │ │ │ +
1296 }
│ │ │ │ +
│ │ │ │ +
1297
│ │ │ │ +
1298 template<class K, class Al, class X, class Y>
│ │ │ │ +
1299 void
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1301 ::resetIndexForNextDomain()
│ │ │ │ +
1302 {
│ │ │ │ +
1303 i=0;
│ │ │ │ +
1304 }
│ │ │ │ +
│ │ │ │ +
1305
│ │ │ │ +
1306 template<class K, class Al, class X, class Y>
│ │ │ │ +
1307 DynamicVector<typename X::field_type> &
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1309 ::lhs()
│ │ │ │ +
1310 {
│ │ │ │ +
1311 return *lhs_;
│ │ │ │ +
1312 }
│ │ │ │ +
│ │ │ │ +
1313
│ │ │ │ +
1314 template<class K, class Al, class X, class Y>
│ │ │ │ +
1315 DynamicVector<typename X::field_type> &
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1317 ::rhs()
│ │ │ │ +
1318 {
│ │ │ │ +
1319 return *rhs_;
│ │ │ │ +
1320 }
│ │ │ │ +
│ │ │ │ +
1321
│ │ │ │ +
1322 template<class K, class Al, class X, class Y>
│ │ │ │ +
1323 void
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1325 ::relaxResult(field_type relax)
│ │ │ │ +
1326 {
│ │ │ │ +
1327 lhs() *= relax;
│ │ │ │ +
1328 }
│ │ │ │ +
│ │ │ │ +
1329
│ │ │ │ +
1330 template<class K, class Al, class X, class Y>
│ │ │ │ +
1331 void
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1333 ::operator()(const size_type& domainIndex)
│ │ │ │ +
1334 {
│ │ │ │ +
1335 lhs() = 0.0;
│ │ │ │ +
1336#if 0
│ │ │ │ +
1337 //assign right hand side of current domainindex block
│ │ │ │ +
1338 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1339 assert(i<maxlength_);
│ │ │ │ +
1340 rhs()[i]=(*b)[domainIndex][j];
│ │ │ │ +
1341 }
│ │ │ │ +
1342
│ │ │ │ +
1343 // loop over all Matrix row entries and calculate defect.
│ │ │ │ +
1344 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ +
1345
│ │ │ │ +
1346 // calculate defect for current row index block
│ │ │ │ +
1347 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ +
1348 block_type tmp(0.0);
│ │ │ │ +
1349 (*col).mv((*x)[col.index()], tmp);
│ │ │ │ +
1350 i-=n;
│ │ │ │ +
1351 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1352 assert(i<maxlength_);
│ │ │ │ +
1353 rhs()[i]-=tmp[j];
│ │ │ │ +
1354 }
│ │ │ │ +
1355 }
│ │ │ │ +
1356#else
│ │ │ │ +
1357 //assign right hand side of current domainindex block
│ │ │ │ +
1358 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1359 assert(i<maxlength_);
│ │ │ │ +
1360 rhs()[i]=Impl::asVector((*b)[domainIndex])[j];
│ │ │ │ +
1361
│ │ │ │ +
1362 // loop over all Matrix row entries and calculate defect.
│ │ │ │ +
1363 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ +
1364
│ │ │ │ +
1365 // calculate defect for current row index block
│ │ │ │ +
1366 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ +
1367 for(size_type k=0; k<n; ++k) {
│ │ │ │ +
1368 rhs()[i]-=Impl::asMatrix(*col)[j][k] * Impl::asVector((*x)[col.index()])[k];
│ │ │ │ +
1369 }
│ │ │ │ +
1370 }
│ │ │ │ +
1371 }
│ │ │ │ +
1372#endif
│ │ │ │ +
1373 }
│ │ │ │ +
│ │ │ │ +
1374
│ │ │ │ +
1375 template<class K, class Al, class X, class Y>
│ │ │ │ +
1376 void
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1378 ::assignResult(block_type& res)
│ │ │ │ +
1379 {
│ │ │ │ +
1380 // assign the result of the local solve to the global vector
│ │ │ │ +
1381 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1382 assert(i<maxlength_);
│ │ │ │ +
1383 Impl::asVector(res)[j]+=lhs()[i];
│ │ │ │ +
1384 }
│ │ │ │ +
1385 }
│ │ │ │ +
│ │ │ │ +
1386
│ │ │ │ +
1387#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
1388
│ │ │ │ +
1389 template<template<class> class S, typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1391 ::OverlappingAssignerHelper(std::size_t maxlength,
│ │ │ │ +
1392 const BCRSMatrix<T,A>& mat_,
│ │ │ │ +
1393 const range_type& b_,
│ │ │ │ +
1394 range_type& x_)
│ │ │ │ +
1395 : mat(&mat_),
│ │ │ │ +
1396 b(&b_),
│ │ │ │ +
1397 x(&x_), i(0), maxlength_(maxlength)
│ │ │ │ +
1398 {
│ │ │ │ +
1399 rhs_ = new field_type[maxlength];
│ │ │ │ +
1400 lhs_ = new field_type[maxlength];
│ │ │ │ +
1401
│ │ │ │ +
1402 }
│ │ │ │ +
│ │ │ │ +
1403
│ │ │ │ +
1404 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1406 {
│ │ │ │ +
1407 delete[] rhs_;
│ │ │ │ +
1408 delete[] lhs_;
│ │ │ │ +
1409 }
│ │ │ │ +
│ │ │ │ +
1410
│ │ │ │ +
1411 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1412 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::operator()(const size_type& domainIndex)
│ │ │ │ +
1413 {
│ │ │ │ +
1414 //assign right hand side of current domainindex block
│ │ │ │ +
1415 // rhs is an array of doubles!
│ │ │ │ +
1416 // rhs[starti] = b[domainindex]
│ │ │ │ +
1417 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1418 assert(i<maxlength_);
│ │ │ │ +
1419 rhs_[i]=Impl::asVector((*b)[domainIndex])[j];
│ │ │ │ +
1420 }
│ │ │ │ +
1421
│ │ │ │ +
1422
│ │ │ │ +
1423 // loop over all Matrix row entries and calculate defect.
│ │ │ │ +
1424 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ +
1425
│ │ │ │ +
1426 // calculate defect for current row index block
│ │ │ │ +
1427 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ +
1428 block_type tmp;
│ │ │ │ +
1429 Impl::asMatrix(*col).mv((*x)[col.index()], tmp);
│ │ │ │ +
1430 i-=n;
│ │ │ │ +
1431 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1432 assert(i<maxlength_);
│ │ │ │ +
1433 rhs_[i]-=Impl::asVector(tmp)[j];
│ │ │ │ +
1434 }
│ │ │ │ +
1435
│ │ │ │ +
1436 }
│ │ │ │ +
1437
│ │ │ │ +
1438 }
│ │ │ │ +
│ │ │ │ +
1439
│ │ │ │ +
1440 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1442 {
│ │ │ │ +
1443 for(size_type j=i+n; i<j; ++i) {
│ │ │ │ +
1444 assert(i<maxlength_);
│ │ │ │ +
1445 lhs_[i]*=relax;
│ │ │ │ +
1446 }
│ │ │ │ +
1447 i-=n;
│ │ │ │ +
1448 }
│ │ │ │ +
│ │ │ │ +
1449
│ │ │ │ +
1450 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1452 {
│ │ │ │ +
1453 // assign the result of the local solve to the global vector
│ │ │ │ +
1454 for(size_type j=0; j<n; ++j, ++i) {
│ │ │ │ +
1455 assert(i<maxlength_);
│ │ │ │ +
1456 Impl::asVector(res)[j]+=lhs_[i];
│ │ │ │ +
1457 }
│ │ │ │ +
1458 }
│ │ │ │ +
│ │ │ │ +
1459
│ │ │ │ +
1460 template<template<class> class S, typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1461 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::resetIndexForNextDomain()
│ │ │ │ +
1462 {
│ │ │ │ +
1463 i=0;
│ │ │ │ +
1464 }
│ │ │ │ +
│ │ │ │ +
1465
│ │ │ │ +
1466 template<template<class> class S, typename T, typename A>
│ │ │ │ +
1467 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1469 {
│ │ │ │ +
1470 return lhs_;
│ │ │ │ +
1471 }
│ │ │ │ +
│ │ │ │ +
1472
│ │ │ │ +
1473 template<template<class> class S, typename T, typename A>
│ │ │ │ +
1474 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1476 {
│ │ │ │ +
1477 return rhs_;
│ │ │ │ +
1478 }
│ │ │ │ +
│ │ │ │ +
1479
│ │ │ │ +
1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
│ │ │ │ +
1481
│ │ │ │ +
1482 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1484 const M& mat_,
│ │ │ │ +
1485 const Y& b_,
│ │ │ │ +
1486 X& x_)
│ │ │ │ +
1487 : mat(&mat_),
│ │ │ │ +
1488 b(&b_),
│ │ │ │ +
1489 x(&x_), i(0)
│ │ │ │ +
1490 {
│ │ │ │ +
1491 rhs_= new Y(maxlength);
│ │ │ │ +
1492 lhs_ = new X(maxlength);
│ │ │ │ +
1493 }
│ │ │ │ +
│ │ │ │ +
1494
│ │ │ │ +
1495 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1497 {
│ │ │ │ +
1498 delete rhs_;
│ │ │ │ +
1499 delete lhs_;
│ │ │ │ +
1500 }
│ │ │ │ +
│ │ │ │ +
1501
│ │ │ │ +
1502 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1504 {
│ │ │ │ +
1505 (*rhs_)[i]=(*b)[domainIndex];
│ │ │ │ +
1506
│ │ │ │ +
1507 // loop over all Matrix row entries and calculate defect.
│ │ │ │ +
1508 typedef typename matrix_type::ConstColIterator col_iterator;
│ │ │ │ +
1509
│ │ │ │ +
1510 // calculate defect for current row index block
│ │ │ │ +
1511 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
│ │ │ │ +
1512 Impl::asMatrix(*col).mmv((*x)[col.index()], (*rhs_)[i]);
│ │ │ │ +
1513 }
│ │ │ │ +
1514 // Goto next local index
│ │ │ │ +
1515 ++i;
│ │ │ │ +
1516 }
│ │ │ │ +
│ │ │ │ +
1517
│ │ │ │ +
1518 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1520 {
│ │ │ │ +
1521 (*lhs_)[i]*=relax;
│ │ │ │ +
1522 }
│ │ │ │ +
│ │ │ │ +
1523
│ │ │ │ +
1524 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1526 {
│ │ │ │ +
1527 res+=(*lhs_)[i++];
│ │ │ │ +
1528 }
│ │ │ │ +
│ │ │ │ +
1529
│ │ │ │ +
1530 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1532 {
│ │ │ │ +
1533 return *lhs_;
│ │ │ │ +
1534 }
│ │ │ │ +
│ │ │ │ +
1535
│ │ │ │ +
1536 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1538 {
│ │ │ │ +
1539 return *rhs_;
│ │ │ │ +
1540 }
│ │ │ │ +
│ │ │ │ +
1541
│ │ │ │ +
1542 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1544 {
│ │ │ │ +
1545 i=0;
│ │ │ │ +
1546 }
│ │ │ │ +
│ │ │ │ +
1547
│ │ │ │ +
1548 template<typename S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1550 BlockVector<T,A>& x_,
│ │ │ │ +
1551 OverlappingAssigner<S>& assigner_,
│ │ │ │ +
1552 const field_type& relax_)
│ │ │ │ +
1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_)
│ │ │ │ +
1554 {}
│ │ │ │ +
│ │ │ │ +
1555
│ │ │ │ +
1556 template<typename S, typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1557 void AdditiveAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
│ │ │ │ +
1558 {
│ │ │ │ +
1559 // add the result of the local solve to the current update
│ │ │ │ +
1560 assigner->assignResult((*v)[domainIndex]);
│ │ │ │ +
1561 }
│ │ │ │ +
│ │ │ │ +
1562
│ │ │ │ +
1563
│ │ │ │ +
1564 template<typename S, typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1566 {
│ │ │ │ +
1567 // relax the update and add it to the current guess.
│ │ │ │ +
1568 x->axpy(relax,*v);
│ │ │ │ +
1569 }
│ │ │ │ +
│ │ │ │ +
1570
│ │ │ │ +
1571
│ │ │ │ +
1572 template<typename S, typename T, typename A>
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
1574 ::MultiplicativeAdder([[maybe_unused]] BlockVector<T,A>& v_,
│ │ │ │ +
1575 BlockVector<T,A>& x_,
│ │ │ │ +
1576 OverlappingAssigner<S>& assigner_, const field_type& relax_)
│ │ │ │ +
1577 : x(&x_), assigner(&assigner_), relax(relax_)
│ │ │ │ +
1578 {}
│ │ │ │ +
│ │ │ │ +
1579
│ │ │ │ +
1580
│ │ │ │ +
1581 template<typename S,typename T, typename A>
│ │ │ │ +
│ │ │ │ +
1582 void MultiplicativeAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
│ │ │ │ +
1583 {
│ │ │ │ +
1584 // add the result of the local solve to the current guess
│ │ │ │ +
1585 assigner->relaxResult(relax);
│ │ │ │ +
1586 assigner->assignResult((*x)[domainIndex]);
│ │ │ │ +
1587 }
│ │ │ │ +
│ │ │ │ +
1588
│ │ │ │ +
1589
│ │ │ │ +
1590 template<typename S,typename T, typename A>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1592 {
│ │ │ │ +
1593 // nothing to do, as the corrections already relaxed and added in operator()
│ │ │ │ +
1594 }
│ │ │ │ +
│ │ │ │ +
1595
│ │ │ │ +
1596
│ │ │ │ +
1598}
│ │ │ │ +
1599
│ │ │ │ +
1600#endif
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
Classes for using SuperLU with ISTL matrices.
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
Classes for using UMFPack with ISTL matrices.
│ │ │ │ +
Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.
│ │ │ │ +
Define general preconditioner interface.
│ │ │ │
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
void addRowNnz(const Iter &row)
Definition overlappingschwarz.hh:895
│ │ │ │ +
void apply(X &v, const X &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition overlappingschwarz.hh:1234
│ │ │ │ +
X & lhs()
Get the local left hand side.
Definition overlappingschwarz.hh:1531
│ │ │ │ +
void calcColstart() const
Definition overlappingschwarz.hh:926
│ │ │ │ +
Y & rhs()
Get the local right hand side.
Definition overlappingschwarz.hh:1537
│ │ │ │ +
iterator end()
Definition overlappingschwarz.hh:989
│ │ │ │ +
void resetIndexForNextDomain()
Resets the local index to zero.
Definition overlappingschwarz.hh:1543
│ │ │ │ +
void copyValue(const Iter &row, const CIter &col) const
Definition overlappingschwarz.hh:933
│ │ │ │ +
void createMatrix() const
Definition overlappingschwarz.hh:947
│ │ │ │ +
iterator begin()
Definition overlappingschwarz.hh:1003
│ │ │ │ +
OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices, const subdomain_vector &domains)
Definition overlappingschwarz.hh:887
│ │ │ │ +
IndexMap()
Definition overlappingschwarz.hh:955
│ │ │ │ +
virtual void apply(X &v, const X &d)
Apply the precondtioner.
Definition overlappingschwarz.hh:1227
│ │ │ │ +
OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X &x)
Constructor.
Definition overlappingschwarz.hh:1483
│ │ │ │ +
const_iterator find(size_type grow) const
Definition overlappingschwarz.hh:968
│ │ │ │ +
void operator()(const size_type &domain)
calculate one entry of the local defect.
Definition overlappingschwarz.hh:1503
│ │ │ │ +
SeqOverlappingSchwarz(const matrix_type &mat, const subdomain_vector &subDomains, field_type relaxationFactor=1, bool onTheFly_=true)
Construct the overlapping Schwarz method.
Definition overlappingschwarz.hh:1056
│ │ │ │ +
void allocate()
Definition overlappingschwarz.hh:905
│ │ │ │ +
void deallocate()
Deallocates memory of the local vector.
Definition overlappingschwarz.hh:1496
│ │ │ │ +
void insert(size_type grow)
Definition overlappingschwarz.hh:960
│ │ │ │ +
void countEntries(const Iter &row, const CIter &col) const
Definition overlappingschwarz.hh:914
│ │ │ │ +
static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly)
Definition overlappingschwarz.hh:1198
│ │ │ │ +
void relaxResult(field_type relax)
relax the result.
Definition overlappingschwarz.hh:1519
│ │ │ │ +
void assignResult(block_type &res)
Assigns the block to the current local index. At the same time the local defect is calculated for the...
Definition overlappingschwarz.hh:1525
│ │ │ │ +
SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector &rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true)
Definition overlappingschwarz.hh:1009
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
Initializer for SuperLU Matrices representing the subdomains.
Definition overlappingschwarz.hh:47
│ │ │ │ +
Matrix::row_type::const_iterator CIter
Definition overlappingschwarz.hh:56
│ │ │ │ +
S IndexSet
Definition overlappingschwarz.hh:58
│ │ │ │ +
Matrix::const_iterator Iter
Definition overlappingschwarz.hh:55
│ │ │ │ +
IndexSet::size_type size_type
Definition overlappingschwarz.hh:59
│ │ │ │ +
I InitializerList
Definition overlappingschwarz.hh:52
│ │ │ │ +
AtomInitializer::Matrix Matrix
Definition overlappingschwarz.hh:54
│ │ │ │ +
InitializerList::value_type AtomInitializer
Definition overlappingschwarz.hh:53
│ │ │ │ +
D subdomain_vector
The vector type containing the subdomain to row index mapping.
Definition overlappingschwarz.hh:50
│ │ │ │
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
void endrowsizes()
indicate that size of all rows is defined
Definition bcrsmatrix.hh:1149
│ │ │ │ -
@ random
Build entries randomly.
Definition bcrsmatrix.hh:530
│ │ │ │ -
void addindex(size_type row, size_type col)
add index (row,col) to the matrix
Definition bcrsmatrix.hh:1191
│ │ │ │ -
void endindices()
indicate that all indices are defined, check consistency
Definition bcrsmatrix.hh:1248
│ │ │ │ -
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ -
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ -
BCRSMatrix & operator=(const BCRSMatrix &Mat)
assignment
Definition bcrsmatrix.hh:911
│ │ │ │ -
A block-tridiagonal matrix.
Definition btdmatrix.hh:31
│ │ │ │ -
static constexpr auto blocklevel
increment block level counter
Definition btdmatrix.hh:53
│ │ │ │ -
BTDMatrix(size_type size)
Definition btdmatrix.hh:58
│ │ │ │ -
void solve(V &x, const V &rhs) const
Use the Thomas algorithm to solve the system Ax=b in O(n) time.
Definition btdmatrix.hh:125
│ │ │ │ -
A::size_type size_type
implement row_type with compressed vector
Definition btdmatrix.hh:49
│ │ │ │ -
A allocator_type
export the allocator type
Definition btdmatrix.hh:43
│ │ │ │ -
B block_type
export the type representing the components
Definition btdmatrix.hh:40
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition btdmatrix.hh:37
│ │ │ │ -
BTDMatrix & operator=(const BTDMatrix &other)
assignment
Definition btdmatrix.hh:108
│ │ │ │ -
BTDMatrix()
Default constructor.
Definition btdmatrix.hh:56
│ │ │ │ -
void setSize(size_type size)
Resize the matrix. Invalidates the content!
Definition btdmatrix.hh:81
│ │ │ │ -
typename FieldTraits< field_type >::real_type real_type
Definition btdmatrix.hh:208
│ │ │ │ -
typename BTDMatrix< B, A >::field_type field_type
Definition btdmatrix.hh:207
│ │ │ │ +
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ +
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ +
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition bcrsmatrix.hh:741
│ │ │ │ +
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ +
Exact subdomain solver using ILU(p) with appropriate p.
Definition ilusubdomainsolver.hh:78
│ │ │ │ +
Definition ilusubdomainsolver.hh:111
│ │ │ │ +
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition overlappingschwarz.hh:783
│ │ │ │ +
SLList< size_type, typename std::allocator_traits< TA >::template rebind_alloc< size_type > > subdomain_list
The type for the row to subdomain mapping.
Definition overlappingschwarz.hh:800
│ │ │ │ +
std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc< slu > > slu_vector
The vector type containing subdomain solvers.
Definition overlappingschwarz.hh:809
│ │ │ │ +
M matrix_type
The type of the matrix to precondition.
Definition overlappingschwarz.hh:760
│ │ │ │ +
TM Mode
The mode (additive or multiplicative) of the Schwarz method.
Definition overlappingschwarz.hh:778
│ │ │ │ +
X range_type
The range type of the preconditioner.
Definition overlappingschwarz.hh:770
│ │ │ │ +
std::set< size_type, std::less< size_type >, typename std::allocator_traits< TA >::template rebind_alloc< size_type > > subdomain_type
The type for the subdomain to row index mapping.
Definition overlappingschwarz.hh:794
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition overlappingschwarz.hh:765
│ │ │ │ +
TD slu
The type for the subdomain solver in use.
Definition overlappingschwarz.hh:806
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition overlappingschwarz.hh:868
│ │ │ │ +
virtual void pre(X &x, X &b)
Prepare the preconditioner.
Definition overlappingschwarz.hh:846
│ │ │ │ +
virtual void post(X &x)
Postprocess the preconditioner.
Definition overlappingschwarz.hh:861
│ │ │ │ +
TA allocator
The allocator to use.
Definition overlappingschwarz.hh:789
│ │ │ │ +
std::vector< subdomain_type, typename std::allocator_traits< TA >::template rebind_alloc< subdomain_type > > subdomain_vector
The vector type containing the subdomain to row index mapping.
Definition overlappingschwarz.hh:797
│ │ │ │ +
std::vector< subdomain_list, typename std::allocator_traits< TA >::template rebind_alloc< subdomain_list > > rowtodomain_vector
The vector type containing the row index to subdomain mapping.
Definition overlappingschwarz.hh:803
│ │ │ │ +
matrix_type::size_type size_type
The return type of the size method.
Definition overlappingschwarz.hh:786
│ │ │ │ +
Definition overlappingschwarz.hh:694
│ │ │ │ +
Tag that the tells the Schwarz method to be additive.
Definition overlappingschwarz.hh:120
│ │ │ │ +
Tag that tells the Schwarz method to be multiplicative.
Definition overlappingschwarz.hh:126
│ │ │ │ +
Tag that tells the Schwarz method to be multiplicative and symmetric.
Definition overlappingschwarz.hh:133
│ │ │ │ +
Exact subdomain solver using Dune::DynamicMatrix<T>::solve.
Definition overlappingschwarz.hh:140
│ │ │ │ +
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition overlappingschwarz.hh:149
│ │ │ │ +
X::field_type field_type
Definition overlappingschwarz.hh:150
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition overlappingschwarz.hh:153
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition overlappingschwarz.hh:155
│ │ │ │ +
void setSubMatrix(const M &BCRS, S &rowset)
Set the data of the local problem.
Definition overlappingschwarz.hh:184
│ │ │ │ +
void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d)
Apply the subdomain solver.
Definition overlappingschwarz.hh:162
│ │ │ │ +
std::remove_const< M >::type rilu_type
Definition overlappingschwarz.hh:151
│ │ │ │ +
Definition overlappingschwarz.hh:215
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
S< BCRSMatrix< T, A > >::range_type range_type
Definition overlappingschwarz.hh:315
│ │ │ │ +
range_type::block_type block_type
Definition overlappingschwarz.hh:317
│ │ │ │ +
range_type::field_type field_type
Definition overlappingschwarz.hh:316
│ │ │ │ +
matrix_type::size_type size_type
Definition overlappingschwarz.hh:319
│ │ │ │ +
BCRSMatrix< T, A > matrix_type
Definition overlappingschwarz.hh:314
│ │ │ │ +
Definition overlappingschwarz.hh:400
│ │ │ │ +
matrix_type::size_type size_type
Definition overlappingschwarz.hh:408
│ │ │ │ +
Y::field_type field_type
Definition overlappingschwarz.hh:404
│ │ │ │ +
Y::block_type block_type
Definition overlappingschwarz.hh:406
│ │ │ │ +
M matrix_type
Definition overlappingschwarz.hh:402
│ │ │ │ +
OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
Constructor.
Definition overlappingschwarz.hh:493
│ │ │ │ +
OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
Constructor.
Definition overlappingschwarz.hh:512
│ │ │ │ +
Definition overlappingschwarz.hh:520
│ │ │ │ +
std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
Definition overlappingschwarz.hh:526
│ │ │ │ +
A::size_type size_type
Definition overlappingschwarz.hh:525
│ │ │ │ +
Definition overlappingschwarz.hh:542
│ │ │ │ +
A::size_type size_type
Definition overlappingschwarz.hh:547
│ │ │ │ +
std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
Definition overlappingschwarz.hh:548
│ │ │ │ +
template meta program for choosing how to add the correction.
Definition overlappingschwarz.hh:572
│ │ │ │ +
AdditiveAdder< S, X > Adder
Definition overlappingschwarz.hh:577
│ │ │ │ +
MultiplicativeAdder< S, X > Adder
Definition overlappingschwarz.hh:583
│ │ │ │ +
MultiplicativeAdder< S, X > Adder
Definition overlappingschwarz.hh:589
│ │ │ │ +
Helper template meta program for application of overlapping Schwarz.
Definition overlappingschwarz.hh:605
│ │ │ │ +
static solver_iterator begin(solver_vector &sv)
Definition overlappingschwarz.hh:611
│ │ │ │ +
solver_vector::iterator solver_iterator
Definition overlappingschwarz.hh:607
│ │ │ │ +
static domain_iterator end(const subdomain_vector &sv)
Definition overlappingschwarz.hh:625
│ │ │ │ +
subdomain_vector::const_iterator domain_iterator
Definition overlappingschwarz.hh:609
│ │ │ │ +
T1 solver_vector
Definition overlappingschwarz.hh:606
│ │ │ │ +
static domain_iterator begin(const subdomain_vector &sv)
Definition overlappingschwarz.hh:620
│ │ │ │ +
T2 subdomain_vector
Definition overlappingschwarz.hh:608
│ │ │ │ +
static solver_iterator end(solver_vector &sv)
Definition overlappingschwarz.hh:616
│ │ │ │ +
T2 subdomain_vector
Definition overlappingschwarz.hh:636
│ │ │ │ +
static solver_iterator end(solver_vector &sv)
Definition overlappingschwarz.hh:644
│ │ │ │ +
solver_vector::reverse_iterator solver_iterator
Definition overlappingschwarz.hh:635
│ │ │ │ +
subdomain_vector::const_reverse_iterator domain_iterator
Definition overlappingschwarz.hh:637
│ │ │ │ +
static solver_iterator begin(solver_vector &sv)
Definition overlappingschwarz.hh:639
│ │ │ │ +
T1 solver_vector
Definition overlappingschwarz.hh:634
│ │ │ │ +
static domain_iterator begin(const subdomain_vector &sv)
Definition overlappingschwarz.hh:648
│ │ │ │ +
static domain_iterator end(const subdomain_vector &sv)
Definition overlappingschwarz.hh:653
│ │ │ │ +
Helper template meta program for application of overlapping Schwarz.
Definition overlappingschwarz.hh:669
│ │ │ │ +
smoother::range_type range_type
Definition overlappingschwarz.hh:671
│ │ │ │ +
T smoother
Definition overlappingschwarz.hh:670
│ │ │ │ +
static void apply(smoother &sm, range_type &v, const range_type &b)
Definition overlappingschwarz.hh:673
│ │ │ │ +
static void apply(smoother &sm, range_type &v, const range_type &b)
Definition overlappingschwarz.hh:685
│ │ │ │ +
SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > smoother
Definition overlappingschwarz.hh:682
│ │ │ │ + │ │ │ │ + │ │ │ │ +
BCRSMatrix< T, A > matrix_type
Definition overlappingschwarz.hh:713
│ │ │ │ +
Definition overlappingschwarz.hh:723
│ │ │ │ +
M matrix_type
Definition overlappingschwarz.hh:724
│ │ │ │ +
Definition overlappingschwarz.hh:1103
│ │ │ │ +
static int size(const Domain &d)
Definition overlappingschwarz.hh:1111
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,288 +1,1878 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -btdmatrix.hh │ │ │ │ │ +overlappingschwarz.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_BTDMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_BTDMATRIX_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -19namespace _D_u_n_e { │ │ │ │ │ -29 template > │ │ │ │ │ -_3_0 class _B_T_D_M_a_t_r_i_x : public _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -31 { │ │ │ │ │ -32 public: │ │ │ │ │ -33 │ │ │ │ │ -34 //===== type definitions and constants │ │ │ │ │ -35 │ │ │ │ │ -_3_7 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ -38 │ │ │ │ │ -_4_0 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH │ │ │ │ │ +6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH │ │ │ │ │ +7#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +17#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h" │ │ │ │ │ +18#include "_s_u_p_e_r_l_u_._h_h" │ │ │ │ │ +19#include "_u_m_f_p_a_c_k_._h_h" │ │ │ │ │ +20#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ +21#include "_b_c_r_s_m_a_t_r_i_x_._h_h" │ │ │ │ │ +22#include "_i_l_u_s_u_b_d_o_m_a_i_n_s_o_l_v_e_r_._h_h" │ │ │ │ │ +23#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +24 │ │ │ │ │ +25namespace _D_u_n_e │ │ │ │ │ +26{ │ │ │ │ │ +27 │ │ │ │ │ +39 template │ │ │ │ │ +40 class SeqOverlappingSchwarz; │ │ │ │ │ 41 │ │ │ │ │ -_4_3 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -44 │ │ │ │ │ -46 //typedef BCRSMatrix::row_type row_type; │ │ │ │ │ -47 │ │ │ │ │ -_4_9 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -50 │ │ │ │ │ -52 [[deprecated("Use free blockLevel function. Will be removed after 2.8.")]] │ │ │ │ │ -_5_3 static constexpr auto _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ -54 │ │ │ │ │ -_5_6 _B_T_D_M_a_t_r_i_x() : _B_C_R_S_M_a_t_r_i_x() {} │ │ │ │ │ +45 template │ │ │ │ │ +_4_6 class _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +47 { │ │ │ │ │ +48 public: │ │ │ │ │ +_5_0 typedef D _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ +51 │ │ │ │ │ +_5_2 typedef I _I_n_i_t_i_a_l_i_z_e_r_L_i_s_t; │ │ │ │ │ +_5_3 typedef typename InitializerList::value_type _A_t_o_m_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ +_5_4 typedef typename AtomInitializer::Matrix _M_a_t_r_i_x; │ │ │ │ │ +_5_5 typedef typename Matrix::const_iterator _I_t_e_r; │ │ │ │ │ +_5_6 typedef typename Matrix::row_type::const_iterator _C_I_t_e_r; │ │ │ │ │ 57 │ │ │ │ │ -_5_8 explicit _B_T_D_M_a_t_r_i_x(_s_i_z_e___t_y_p_e size) │ │ │ │ │ -59 : _B_C_R_S_M_a_t_r_i_x(size, size, _B_C_R_S_M_a_t_r_i_x::_r_a_n_d_o_m) │ │ │ │ │ -60 { │ │ │ │ │ -61 // Set number of entries for each row │ │ │ │ │ -62 // All rows get three entries, except for the first and the last one │ │ │ │ │ -63 for (size_t i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 3 - (i==0) - (i==(size-1))); │ │ │ │ │ +_5_8 typedef S _I_n_d_e_x_S_e_t; │ │ │ │ │ +_5_9 typedef typename IndexSet::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +60 │ │ │ │ │ +61 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r(_I_n_i_t_i_a_l_i_z_e_r_L_i_s_t& il, │ │ │ │ │ +62 const _I_n_d_e_x_S_e_t& indices, │ │ │ │ │ +63 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& domains); │ │ │ │ │ +64 │ │ │ │ │ 65 │ │ │ │ │ -66 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ +66 void _a_d_d_R_o_w_N_n_z(const _I_t_e_r& row); │ │ │ │ │ 67 │ │ │ │ │ -68 // The actual entries for each row │ │ │ │ │ -69 for (size_t i=0; i0) │ │ │ │ │ -71 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i-1); │ │ │ │ │ -72 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i ); │ │ │ │ │ -73 if (i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i+1); │ │ │ │ │ -75 } │ │ │ │ │ -76 │ │ │ │ │ -77 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ -78 } │ │ │ │ │ -79 │ │ │ │ │ -_8_1 void _s_e_t_S_i_z_e(size_type size) │ │ │ │ │ -82 { │ │ │ │ │ -83 auto nonZeros = (size==0) ? 0 : size + 2*(size-1); │ │ │ │ │ -84 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_S_i_z_e(size, // rows │ │ │ │ │ -85 size, // columns │ │ │ │ │ -86 nonZeros); │ │ │ │ │ +68 void _a_l_l_o_c_a_t_e(); │ │ │ │ │ +69 │ │ │ │ │ +70 void _c_o_u_n_t_E_n_t_r_i_e_s(const _I_t_e_r& row, const _C_I_t_e_r& _c_o_l) const; │ │ │ │ │ +71 │ │ │ │ │ +72 void _c_a_l_c_C_o_l_s_t_a_r_t() const; │ │ │ │ │ +73 │ │ │ │ │ +74 void _c_o_p_y_V_a_l_u_e(const _I_t_e_r& row, const _C_I_t_e_r& _c_o_l) const; │ │ │ │ │ +75 │ │ │ │ │ +76 void _c_r_e_a_t_e_M_a_t_r_i_x() const; │ │ │ │ │ +77 private: │ │ │ │ │ +78 class IndexMap │ │ │ │ │ +79 { │ │ │ │ │ +80 public: │ │ │ │ │ +81 typedef typename S::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +82 typedef std::map Map; │ │ │ │ │ +83 typedef typename Map::iterator iterator; │ │ │ │ │ +84 typedef typename Map::const_iterator const_iterator; │ │ │ │ │ +85 │ │ │ │ │ +86 _I_n_d_e_x_M_a_p(); │ │ │ │ │ 87 │ │ │ │ │ -88 // Set number of entries for each row │ │ │ │ │ -89 // All rows get three entries, except for the first and the last one │ │ │ │ │ -90 for (size_t i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 3 - (i==0) - (i==(size-1))); │ │ │ │ │ -92 │ │ │ │ │ -93 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ -94 │ │ │ │ │ -95 // The actual entries for each row │ │ │ │ │ -96 for (size_t i=0; i0) │ │ │ │ │ -98 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i-1); │ │ │ │ │ -99 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i ); │ │ │ │ │ -100 if (i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i+1); │ │ │ │ │ -102 } │ │ │ │ │ -103 │ │ │ │ │ -104 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ -105 } │ │ │ │ │ +88 void _i_n_s_e_r_t(_s_i_z_e___t_y_p_e grow); │ │ │ │ │ +89 │ │ │ │ │ +90 const_iterator _f_i_n_d(_s_i_z_e___t_y_p_e grow) const; │ │ │ │ │ +91 │ │ │ │ │ +92 iterator _f_i_n_d(_s_i_z_e___t_y_p_e grow); │ │ │ │ │ +93 │ │ │ │ │ +94 iterator _b_e_g_i_n(); │ │ │ │ │ +95 │ │ │ │ │ +96 const_iterator _b_e_g_i_n() const; │ │ │ │ │ +97 │ │ │ │ │ +98 iterator _e_n_d(); │ │ │ │ │ +99 │ │ │ │ │ +100 const_iterator _e_n_d() const; │ │ │ │ │ +101 │ │ │ │ │ +102 private: │ │ │ │ │ +103 std::map map_; │ │ │ │ │ +104 _s_i_z_e___t_y_p_e row; │ │ │ │ │ +105 }; │ │ │ │ │ 106 │ │ │ │ │ -_1_0_8 _B_T_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _B_T_D_M_a_t_r_i_x& other) { │ │ │ │ │ -109 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(other); │ │ │ │ │ -110 return *this; │ │ │ │ │ -111 } │ │ │ │ │ -112 │ │ │ │ │ -_1_1_4 _B_T_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) { │ │ │ │ │ -115 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(k); │ │ │ │ │ -116 return *this; │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -124 template │ │ │ │ │ -_1_2_5 void _s_o_l_v_e (V& x, const V& rhs) const { │ │ │ │ │ -126 │ │ │ │ │ -127 // special handling for 1x1 matrices. The generic algorithm doesn't work │ │ │ │ │ -for them │ │ │ │ │ -128 if (this->_N()==1) { │ │ │ │ │ -129 auto&& x0 = Impl::asVector(x[0]); │ │ │ │ │ -130 auto&& rhs0 = Impl::asVector(rhs[0]); │ │ │ │ │ -131 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0); │ │ │ │ │ -132 return; │ │ │ │ │ -133 } │ │ │ │ │ +107 │ │ │ │ │ +108 typedef typename InitializerList::iterator InitIterator; │ │ │ │ │ +109 typedef typename IndexSet::const_iterator IndexIteratur; │ │ │ │ │ +110 _I_n_i_t_i_a_l_i_z_e_r_L_i_s_t* initializers; │ │ │ │ │ +111 const _I_n_d_e_x_S_e_t *indices; │ │ │ │ │ +112 mutable std::vector indexMaps; │ │ │ │ │ +113 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& domains; │ │ │ │ │ +114 }; │ │ │ │ │ +115 │ │ │ │ │ +_1_1_9 struct _A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +120 {}; │ │ │ │ │ +121 │ │ │ │ │ +_1_2_5 struct _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +126 {}; │ │ │ │ │ +127 │ │ │ │ │ +_1_3_2 struct _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +133 {}; │ │ │ │ │ 134 │ │ │ │ │ -135 // Make copies of the rhs and the right matrix band │ │ │ │ │ -136 V d = rhs; │ │ │ │ │ -137 std::vector c(this->_N()-1); │ │ │ │ │ -138 for (size_t i=0; i_N()-1; i++) │ │ │ │ │ -139 c[i] = (*this)[i][i+1]; │ │ │ │ │ -140 │ │ │ │ │ -141 /* Modify the coefficients. */ │ │ │ │ │ -142 _b_l_o_c_k___t_y_p_e a_00_inv = (*this)[0][0]; │ │ │ │ │ -143 Impl::asMatrix(a_00_inv).invert(); │ │ │ │ │ -144 │ │ │ │ │ -145 //c[0] /= (*this)[0][0]; /* Division by zero risk. */ │ │ │ │ │ -146 _b_l_o_c_k___t_y_p_e tmp = a_00_inv; │ │ │ │ │ -147 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0])); │ │ │ │ │ -148 c[0] = tmp; │ │ │ │ │ -149 │ │ │ │ │ -150 // d = a^{-1} d /* Division by zero would imply a singular matrix. */ │ │ │ │ │ -151 auto d_0_tmp = d[0]; │ │ │ │ │ -152 auto&& d_0 = Impl::asVector(d[0]); │ │ │ │ │ -153 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0); │ │ │ │ │ -154 │ │ │ │ │ -155 for (unsigned int i = 1; i < this->_N(); i++) { │ │ │ │ │ -156 │ │ │ │ │ -157 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1} │ │ │ │ │ -158 _b_l_o_c_k___t_y_p_e tmp; │ │ │ │ │ -159 tmp = (*this)[i][i-1]; │ │ │ │ │ -160 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1])); │ │ │ │ │ -161 │ │ │ │ │ -162 _b_l_o_c_k___t_y_p_e id = (*this)[i][i]; │ │ │ │ │ -163 id -= tmp; │ │ │ │ │ -164 Impl::asMatrix(id).invert(); /* Division by zero risk. */ │ │ │ │ │ -165 │ │ │ │ │ -166 if (i_N() - 1] = d[this->_N() - 1]; │ │ │ │ │ -179 for (int i = this->_N() - 2; i >= 0; i--) { │ │ │ │ │ -180 //x[i] = d[i] - c[i] * x[i + 1]; │ │ │ │ │ -181 x[i] = d[i]; │ │ │ │ │ -182 auto&& x_i = Impl::asVector(x[i]); │ │ │ │ │ -183 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i); │ │ │ │ │ -184 } │ │ │ │ │ -185 │ │ │ │ │ -186 } │ │ │ │ │ -187 │ │ │ │ │ -188 private: │ │ │ │ │ -189 │ │ │ │ │ -190 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ -//// │ │ │ │ │ -191 // The following methods from the base class should now actually be called │ │ │ │ │ -192 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ -//// │ │ │ │ │ -193 │ │ │ │ │ -194 // createbegin and createend should be in there, too, but I can't get it to │ │ │ │ │ -compile │ │ │ │ │ -195 // BCRSMatrix::CreateIterator createbegin () {} │ │ │ │ │ -196 // BCRSMatrix::CreateIterator createend () {} │ │ │ │ │ -197 void setrowsize (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s) {} │ │ │ │ │ -198 void incrementrowsize (_s_i_z_e___t_y_p_e i) {} │ │ │ │ │ -199 void endrowsizes () {} │ │ │ │ │ -200 void addindex (_s_i_z_e___t_y_p_e row, _s_i_z_e___t_y_p_e _c_o_l) {} │ │ │ │ │ -201 void endindices () {} │ │ │ │ │ -202 }; │ │ │ │ │ -203 │ │ │ │ │ -204 template │ │ │ │ │ -_2_0_5 struct FieldTraits< _B_T_D_M_a_t_r_i_x > │ │ │ │ │ -206 { │ │ │ │ │ -_2_0_7 using _f_i_e_l_d___t_y_p_e = typename _B_T_D_M_a_t_r_i_x_<_B_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_2_0_8 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ -209 }; │ │ │ │ │ -210 │ │ │ │ │ -213} // end namespace Dune │ │ │ │ │ -214 │ │ │ │ │ -215#endif │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ +139 template │ │ │ │ │ +_1_4_0 class _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r; │ │ │ │ │ +141 │ │ │ │ │ +142 // Specialization for BCRSMatrix │ │ │ │ │ +143 template │ │ │ │ │ +_1_4_4 class _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r< _B_C_R_S_M_a_t_r_i_x< K, Al>, X, Y > │ │ │ │ │ +145 { │ │ │ │ │ +146 typedef _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_> _M; │ │ │ │ │ +147 public: │ │ │ │ │ +_1_4_9 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_1_5_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_5_1 typedef typename std::remove_const::type _r_i_l_u___t_y_p_e; │ │ │ │ │ +_1_5_3 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_5_5 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_1_5_6 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ +157 │ │ │ │ │ +_1_6_2 void _a_p_p_l_y (DynamicVector& v, DynamicVector& d) │ │ │ │ │ +163 { │ │ │ │ │ +164 assert(v.size() > 0); │ │ │ │ │ +165 assert(v.size() == d.size()); │ │ │ │ │ +166 assert(A.rows() <= v.size()); │ │ │ │ │ +167 assert(A.cols() <= v.size()); │ │ │ │ │ +168 size_t sz = A.rows(); │ │ │ │ │ +169 v.resize(sz); │ │ │ │ │ +170 d.resize(sz); │ │ │ │ │ +171 A.solve(v,d); │ │ │ │ │ +172 v.resize(v.capacity()); │ │ │ │ │ +173 d.resize(d.capacity()); │ │ │ │ │ +174 } │ │ │ │ │ +175 │ │ │ │ │ +183 template │ │ │ │ │ +_1_8_4 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M& BCRS, S& rowset) │ │ │ │ │ +185 { │ │ │ │ │ +186 size_t sz = rowset.size(); │ │ │ │ │ +187 A.resize(sz*n,sz*n); │ │ │ │ │ +188 typedef typename S::const_iterator SIter; │ │ │ │ │ +189 size_t r = 0, c = 0; │ │ │ │ │ +190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end(); │ │ │ │ │ +191 rowIdx!= rowEnd; ++rowIdx, r++) │ │ │ │ │ +192 { │ │ │ │ │ +193 c = 0; │ │ │ │ │ +194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end(); │ │ │ │ │ +195 colIdx!= colEnd; ++colIdx, c++) │ │ │ │ │ +196 { │ │ │ │ │ +197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx]._e_n_d()) │ │ │ │ │ +198 continue; │ │ │ │ │ +199 for (size_t i=0; i A; │ │ │ │ │ +211 }; │ │ │ │ │ +212 │ │ │ │ │ +213 template │ │ │ │ │ +_2_1_4 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ +215 {}; │ │ │ │ │ +216 │ │ │ │ │ +217 template │ │ │ │ │ +_2_1_8 using _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r = _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_T_,_ _D_u_n_e_:_: │ │ │ │ │ +_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_T_>_:_:_v_a_l_u_e>; │ │ │ │ │ +219 │ │ │ │ │ +220 // specialization for DynamicMatrix │ │ │ │ │ +221 template │ │ │ │ │ +_2_2_2 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r< _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r< │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x, X, Y >,false> │ │ │ │ │ +223 { │ │ │ │ │ +224 public: │ │ │ │ │ +_2_2_5 typedef _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_2_2_6 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_2_7 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_2_2_8 typedef typename range_type::block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +_2_2_9 typedef typename _m_a_t_r_i_x___t_y_p_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +_2_3_0 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ +238 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const _B_C_R_S_M_a_t_r_i_x_<_K_,_ _A_l_>& │ │ │ │ │ +mat_, const X& b_, Y& x_); │ │ │ │ │ +239 │ │ │ │ │ +243 inline │ │ │ │ │ +244 void deallocate(); │ │ │ │ │ +245 │ │ │ │ │ +249 inline │ │ │ │ │ +250 void resetIndexForNextDomain(); │ │ │ │ │ +251 │ │ │ │ │ +256 inline │ │ │ │ │ +257 DynamicVector & lhs(); │ │ │ │ │ +258 │ │ │ │ │ +263 inline │ │ │ │ │ +264 DynamicVector & rhs(); │ │ │ │ │ +265 │ │ │ │ │ +270 inline │ │ │ │ │ +271 void relaxResult(_f_i_e_l_d___t_y_p_e relax); │ │ │ │ │ +272 │ │ │ │ │ +277 void operator()(const _s_i_z_e___t_y_p_e& domainIndex); │ │ │ │ │ +278 │ │ │ │ │ +286 inline │ │ │ │ │ +287 void assignResult(_b_l_o_c_k___t_y_p_e& res); │ │ │ │ │ +288 │ │ │ │ │ +289 private: │ │ │ │ │ +293 const _m_a_t_r_i_x___t_y_p_e* _m_a_t; │ │ │ │ │ +295 // we need a pointer, because we have to avoid deep copies │ │ │ │ │ +296 DynamicVector * rhs_; │ │ │ │ │ +298 // we need a pointer, because we have to avoid deep copies │ │ │ │ │ +299 DynamicVector * lhs_; │ │ │ │ │ +301 const _r_a_n_g_e___t_y_p_e* b; │ │ │ │ │ +303 _r_a_n_g_e___t_y_p_e* x; │ │ │ │ │ +305 std::size_t i; │ │ │ │ │ +307 std::size_t maxlength_; │ │ │ │ │ +308 }; │ │ │ │ │ +309 │ │ │ │ │ +310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +311 template class S, typename T, typename A> │ │ │ │ │ +_3_1_2 struct _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r>, true> │ │ │ │ │ +313 { │ │ │ │ │ +_3_1_4 typedef _B_C_R_S_M_a_t_r_i_x_<_T_,_ _A_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_3_1_5 typedef typename S>::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_3_1_6 typedef typename range_type::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_3_1_7 typedef typename range_type::block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +318 │ │ │ │ │ +_3_1_9 typedef typename _m_a_t_r_i_x___t_y_p_e_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +320 │ │ │ │ │ +_3_2_1 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ +_3_2_2 static constexpr size_t m = std::decay_t()))>::cols; │ │ │ │ │ +330 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +331 const _r_a_n_g_e___t_y_p_e& b, _r_a_n_g_e___t_y_p_e& x); │ │ │ │ │ +337 void deallocate(); │ │ │ │ │ +338 │ │ │ │ │ +339 /* │ │ │ │ │ +340 * @brief Resets the local index to zero. │ │ │ │ │ +341 */ │ │ │ │ │ +342 void resetIndexForNextDomain(); │ │ │ │ │ +343 │ │ │ │ │ +348 _f_i_e_l_d___t_y_p_e* lhs(); │ │ │ │ │ +349 │ │ │ │ │ +354 _f_i_e_l_d___t_y_p_e* rhs(); │ │ │ │ │ +355 │ │ │ │ │ +360 void relaxResult(_f_i_e_l_d___t_y_p_e relax); │ │ │ │ │ +361 │ │ │ │ │ +366 void operator()(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ +367 │ │ │ │ │ +375 void assignResult(_b_l_o_c_k___t_y_p_e& res); │ │ │ │ │ +376 │ │ │ │ │ +377 private: │ │ │ │ │ +381 const _m_a_t_r_i_x___t_y_p_e* _m_a_t; │ │ │ │ │ +383 _f_i_e_l_d___t_y_p_e* rhs_; │ │ │ │ │ +385 _f_i_e_l_d___t_y_p_e* lhs_; │ │ │ │ │ +387 const _r_a_n_g_e___t_y_p_e* b; │ │ │ │ │ +389 _r_a_n_g_e___t_y_p_e* x; │ │ │ │ │ +391 std::size_t i; │ │ │ │ │ +393 std::size_t maxlength_; │ │ │ │ │ +394 }; │ │ │ │ │ +395 │ │ │ │ │ +396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +397 │ │ │ │ │ +398 template │ │ │ │ │ +_3_9_9 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ +400 { │ │ │ │ │ +401 public: │ │ │ │ │ +_4_0_2 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +403 │ │ │ │ │ +_4_0_4 typedef typename Y::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +405 │ │ │ │ │ +_4_0_6 typedef typename Y::block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +407 │ │ │ │ │ +_4_0_8 typedef typename matrix_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +416 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(std::size_t maxlength, const M& mat, │ │ │ │ │ +417 const Y& b, X& x); │ │ │ │ │ +423 void _d_e_a_l_l_o_c_a_t_e(); │ │ │ │ │ +424 │ │ │ │ │ +428 void _r_e_s_e_t_I_n_d_e_x_F_o_r_N_e_x_t_D_o_m_a_i_n(); │ │ │ │ │ +429 │ │ │ │ │ +434 X& _l_h_s(); │ │ │ │ │ +435 │ │ │ │ │ +440 Y& _r_h_s(); │ │ │ │ │ +441 │ │ │ │ │ +446 void _r_e_l_a_x_R_e_s_u_l_t(_f_i_e_l_d___t_y_p_e relax); │ │ │ │ │ +447 │ │ │ │ │ +452 void _o_p_e_r_a_t_o_r_(_)(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ +453 │ │ │ │ │ +461 void _a_s_s_i_g_n_R_e_s_u_l_t(_b_l_o_c_k___t_y_p_e& res); │ │ │ │ │ +462 │ │ │ │ │ +463 private: │ │ │ │ │ +467 const M* mat; │ │ │ │ │ +469 X* lhs_; │ │ │ │ │ +471 Y* rhs_; │ │ │ │ │ +473 const Y* b; │ │ │ │ │ +475 X* x; │ │ │ │ │ +477 _s_i_z_e___t_y_p_e i; │ │ │ │ │ +478 }; │ │ │ │ │ +479 │ │ │ │ │ +480 // specialization for ILU0 │ │ │ │ │ +481 template │ │ │ │ │ +_4_8_2 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r<_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r, false> │ │ │ │ │ +483 : public _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ +484 { │ │ │ │ │ +485 public: │ │ │ │ │ +_4_9_3 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const M& _m_a_t, │ │ │ │ │ +494 const Y& b, X& x) │ │ │ │ │ +495 : _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(maxlength, _m_a_t,b,x) │ │ │ │ │ +496 {} │ │ │ │ │ +497 }; │ │ │ │ │ +498 │ │ │ │ │ +499 // specialization for ILUN │ │ │ │ │ +500 template │ │ │ │ │ +_5_0_1 class _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r<_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r,false> │ │ │ │ │ +502 : public _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ +503 { │ │ │ │ │ +504 public: │ │ │ │ │ +_5_1_2 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r(std::size_t maxlength, const M& _m_a_t, │ │ │ │ │ +513 const Y& b, X& x) │ │ │ │ │ +514 : _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(maxlength, _m_a_t,b,x) │ │ │ │ │ +515 {} │ │ │ │ │ +516 }; │ │ │ │ │ +517 │ │ │ │ │ +518 template │ │ │ │ │ +_5_1_9 struct _A_d_d_i_t_i_v_e_A_d_d_e_r │ │ │ │ │ +520 {}; │ │ │ │ │ +521 │ │ │ │ │ +522 template │ │ │ │ │ +_5_2_3 struct _A_d_d_i_t_i_v_e_A_d_d_e_r > │ │ │ │ │ +524 { │ │ │ │ │ +_5_2_5 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +_5_2_6 typedef typename std::decay_t │ │ │ │ │ +()))>::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +527 _A_d_d_i_t_i_v_e_A_d_d_e_r(_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v, _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x, │ │ │ │ │ +528 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner, const _f_i_e_l_d___t_y_p_e& relax_); │ │ │ │ │ +529 void operator()(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ +530 void axpy(); │ │ │ │ │ +_5_3_1 static constexpr size_t n = std::decay_t()))>::dimension; │ │ │ │ │ +532 │ │ │ │ │ +533 private: │ │ │ │ │ +534 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>* v; │ │ │ │ │ +535 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>* x; │ │ │ │ │ +536 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>* assigner; │ │ │ │ │ +537 _f_i_e_l_d___t_y_p_e relax; │ │ │ │ │ +538 }; │ │ │ │ │ +539 │ │ │ │ │ +540 template │ │ │ │ │ +_5_4_1 struct _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r │ │ │ │ │ +542 {}; │ │ │ │ │ +543 │ │ │ │ │ +544 template │ │ │ │ │ +_5_4_5 struct _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r > │ │ │ │ │ +546 { │ │ │ │ │ +_5_4_7 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +_5_4_8 typedef typename std::decay_t │ │ │ │ │ +()))>::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +549 _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r(_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v, _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x, │ │ │ │ │ +550 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner_, const _f_i_e_l_d___t_y_p_e& relax_); │ │ │ │ │ +551 void operator()(const _s_i_z_e___t_y_p_e& domain); │ │ │ │ │ +552 void axpy(); │ │ │ │ │ +_5_5_3 static constexpr size_t n = std::decay_t()))>::dimension; │ │ │ │ │ +554 │ │ │ │ │ +555 private: │ │ │ │ │ +556 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>* x; │ │ │ │ │ +557 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>* assigner; │ │ │ │ │ +558 _f_i_e_l_d___t_y_p_e relax; │ │ │ │ │ +559 }; │ │ │ │ │ +560 │ │ │ │ │ +570 template │ │ │ │ │ +_5_7_1 struct _A_d_d_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ +572 {}; │ │ │ │ │ +573 │ │ │ │ │ +574 template │ │ │ │ │ +_5_7_5 struct _A_d_d_e_r_S_e_l_e_c_t_o_r<_A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e,X,S> │ │ │ │ │ +576 { │ │ │ │ │ +_5_7_7 typedef _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_X_> _A_d_d_e_r; │ │ │ │ │ +578 }; │ │ │ │ │ +579 │ │ │ │ │ +580 template │ │ │ │ │ +_5_8_1 struct _A_d_d_e_r_S_e_l_e_c_t_o_r<_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e,X,S> │ │ │ │ │ +582 { │ │ │ │ │ +_5_8_3 typedef _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_X_> _A_d_d_e_r; │ │ │ │ │ +584 }; │ │ │ │ │ +585 │ │ │ │ │ +586 template │ │ │ │ │ +_5_8_7 struct _A_d_d_e_r_S_e_l_e_c_t_o_r<_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e,X,S> │ │ │ │ │ +588 { │ │ │ │ │ +_5_8_9 typedef _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_X_> _A_d_d_e_r; │ │ │ │ │ +590 }; │ │ │ │ │ +591 │ │ │ │ │ +603 template │ │ │ │ │ +_6_0_4 struct _I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r │ │ │ │ │ +605 { │ │ │ │ │ +_6_0_6 typedef T1 _s_o_l_v_e_r___v_e_c_t_o_r; │ │ │ │ │ +_6_0_7 typedef typename solver_vector::iterator _s_o_l_v_e_r___i_t_e_r_a_t_o_r; │ │ │ │ │ +_6_0_8 typedef T2 _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ +_6_0_9 typedef typename subdomain_vector::const_iterator _d_o_m_a_i_n___i_t_e_r_a_t_o_r; │ │ │ │ │ +610 │ │ │ │ │ +_6_1_1 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _b_e_g_i_n(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ +612 { │ │ │ │ │ +613 return sv.begin(); │ │ │ │ │ +614 } │ │ │ │ │ +615 │ │ │ │ │ +_6_1_6 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _e_n_d(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ +617 { │ │ │ │ │ +618 return sv.end(); │ │ │ │ │ +619 } │ │ │ │ │ +_6_2_0 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _b_e_g_i_n(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ +621 { │ │ │ │ │ +622 return sv.begin(); │ │ │ │ │ +623 } │ │ │ │ │ +624 │ │ │ │ │ +_6_2_5 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _e_n_d(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ +626 { │ │ │ │ │ +627 return sv.end(); │ │ │ │ │ +628 } │ │ │ │ │ +629 }; │ │ │ │ │ +630 │ │ │ │ │ +631 template │ │ │ │ │ +_6_3_2 struct _I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r │ │ │ │ │ +633 { │ │ │ │ │ +_6_3_4 typedef T1 _s_o_l_v_e_r___v_e_c_t_o_r; │ │ │ │ │ +_6_3_5 typedef typename solver_vector::reverse_iterator _s_o_l_v_e_r___i_t_e_r_a_t_o_r; │ │ │ │ │ +_6_3_6 typedef T2 _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ +_6_3_7 typedef typename subdomain_vector::const_reverse_iterator _d_o_m_a_i_n___i_t_e_r_a_t_o_r; │ │ │ │ │ +638 │ │ │ │ │ +_6_3_9 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _b_e_g_i_n(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ +640 { │ │ │ │ │ +641 return sv.rbegin(); │ │ │ │ │ +642 } │ │ │ │ │ +643 │ │ │ │ │ +_6_4_4 static _s_o_l_v_e_r___i_t_e_r_a_t_o_r _e_n_d(_s_o_l_v_e_r___v_e_c_t_o_r& sv) │ │ │ │ │ +645 { │ │ │ │ │ +646 return sv.rend(); │ │ │ │ │ +647 } │ │ │ │ │ +_6_4_8 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _b_e_g_i_n(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ +649 { │ │ │ │ │ +650 return sv.rbegin(); │ │ │ │ │ +651 } │ │ │ │ │ +652 │ │ │ │ │ +_6_5_3 static _d_o_m_a_i_n___i_t_e_r_a_t_o_r _e_n_d(const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& sv) │ │ │ │ │ +654 { │ │ │ │ │ +655 return sv.rend(); │ │ │ │ │ +656 } │ │ │ │ │ +657 }; │ │ │ │ │ +658 │ │ │ │ │ +667 template │ │ │ │ │ +_6_6_8 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r │ │ │ │ │ +669 { │ │ │ │ │ +_6_7_0 typedef T _s_m_o_o_t_h_e_r; │ │ │ │ │ +_6_7_1 typedef typename smoother::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +672 │ │ │ │ │ +_6_7_3 static void _a_p_p_l_y(_s_m_o_o_t_h_e_r& sm, _r_a_n_g_e___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& b) │ │ │ │ │ +674 { │ │ │ │ │ +675 sm.template apply(v, b); │ │ │ │ │ +676 } │ │ │ │ │ +677 }; │ │ │ │ │ +678 │ │ │ │ │ +679 template │ │ │ │ │ +_6_8_0 struct │ │ │ │ │ +_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +> │ │ │ │ │ +681 { │ │ │ │ │ +_6_8_2 typedef _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_T_D_,_T_A_> │ │ │ │ │ +_s_m_o_o_t_h_e_r; │ │ │ │ │ +_6_8_3 typedef typename _s_m_o_o_t_h_e_r_:_:_r_a_n_g_e___t_y_p_e _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +684 │ │ │ │ │ +_6_8_5 static void _a_p_p_l_y(_s_m_o_o_t_h_e_r& sm, _r_a_n_g_e___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& b) │ │ │ │ │ +686 { │ │ │ │ │ +687 sm.template apply(v, b); │ │ │ │ │ +688 sm.template apply(v, b); │ │ │ │ │ +689 } │ │ │ │ │ +690 }; │ │ │ │ │ +691 │ │ │ │ │ +692 template │ │ │ │ │ +_6_9_3 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ +694 {}; │ │ │ │ │ +695 │ │ │ │ │ +696 template │ │ │ │ │ +_6_9_7 using _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r = │ │ │ │ │ +_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_T_,_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_T_>_:_:_v_a_l_u_e>; │ │ │ │ │ +698 │ │ │ │ │ +699 template │ │ │ │ │ +_7_0_0 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r< _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r< │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x< K, Al>, X, Y >,false> │ │ │ │ │ +701 { │ │ │ │ │ +_7_0_2 typedef _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_7_0_3 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ +704 template │ │ │ │ │ +705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, │ │ │ │ │ +const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +706 Solvers& solvers, const SubDomains& domains, │ │ │ │ │ +707 bool onTheFly); │ │ │ │ │ +708 }; │ │ │ │ │ +709 │ │ │ │ │ +710 template class S, typename T, typename A> │ │ │ │ │ +_7_1_1 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r>,true> │ │ │ │ │ +712 { │ │ │ │ │ +_7_1_3 typedef _B_C_R_S_M_a_t_r_i_x_<_T_,_A_> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_7_1_4 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ +715 template │ │ │ │ │ +716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, │ │ │ │ │ +const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +717 Solvers& solvers, const SubDomains& domains, │ │ │ │ │ +718 bool onTheFly); │ │ │ │ │ +719 }; │ │ │ │ │ +720 │ │ │ │ │ +721 template │ │ │ │ │ +_7_2_2 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ +723 { │ │ │ │ │ +_7_2_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +725 template │ │ │ │ │ +726 static std::size_t _a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s(const RowToDomain& rowToDomain, │ │ │ │ │ +const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +727 Solvers& solvers, const SubDomains& domains, │ │ │ │ │ +728 bool onTheFly); │ │ │ │ │ +729 }; │ │ │ │ │ +730 │ │ │ │ │ +731 template │ │ │ │ │ +_7_3_2 struct │ │ │ │ │ +_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r,false> │ │ │ │ │ +733 : public _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ +734 {}; │ │ │ │ │ +735 │ │ │ │ │ +736 template │ │ │ │ │ +_7_3_7 struct │ │ │ │ │ +_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r,false> │ │ │ │ │ +738 : public _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ +739 {}; │ │ │ │ │ +740 │ │ │ │ │ +751 template, class TA=std::allocator > │ │ │ │ │ +_7_5_3 class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +754 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +755 { │ │ │ │ │ +756 public: │ │ │ │ │ +_7_6_0 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +761 │ │ │ │ │ +_7_6_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +766 │ │ │ │ │ +_7_7_0 typedef X _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +771 │ │ │ │ │ +_7_7_8 typedef _T_M _M_o_d_e; │ │ │ │ │ +779 │ │ │ │ │ +_7_8_3 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +784 │ │ │ │ │ +_7_8_6 typedef typename matrix_type::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +787 │ │ │ │ │ +_7_8_9 typedef _T_A _a_l_l_o_c_a_t_o_r; │ │ │ │ │ +790 │ │ │ │ │ +792 typedef std::set, │ │ │ │ │ +793 typename std::allocator_traits::template _r_e_b_i_n_d___a_l_l_o_c_<_s_i_z_e___t_y_p_e_> > │ │ │ │ │ +_7_9_4 _s_u_b_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +795 │ │ │ │ │ +_7_9_7 typedef std::vector:: │ │ │ │ │ +template _r_e_b_i_n_d___a_l_l_o_c_<_s_u_b_d_o_m_a_i_n___t_y_p_e_> > _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ +798 │ │ │ │ │ +_8_0_0 typedef _S_L_L_i_s_t_<_s_i_z_e___t_y_p_e_,_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_a_l_l_o_c_a_t_o_r___t_r_a_i_t_s_<_T_A_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_r_e_b_i_n_d___a_l_l_o_c_<_s_i_z_e___t_y_p_e_> > _s_u_b_d_o_m_a_i_n___l_i_s_t; │ │ │ │ │ +801 │ │ │ │ │ +_8_0_3 typedef std::vector:: │ │ │ │ │ +template _r_e_b_i_n_d___a_l_l_o_c_<_s_u_b_d_o_m_a_i_n___l_i_s_t_> > _r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r; │ │ │ │ │ +804 │ │ │ │ │ +_8_0_6 typedef _T_D _s_l_u; │ │ │ │ │ +807 │ │ │ │ │ +_8_0_9 typedef std::vector::template │ │ │ │ │ +_r_e_b_i_n_d___a_l_l_o_c_<_s_l_u_> > _s_l_u___v_e_c_t_o_r; │ │ │ │ │ +810 │ │ │ │ │ +_8_2_4 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const _m_a_t_r_i_x___t_y_p_e& mat, const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& │ │ │ │ │ +subDomains, │ │ │ │ │ +825 _f_i_e_l_d___t_y_p_e relaxationFactor=1, bool _o_n_T_h_e_F_l_y__=true); │ │ │ │ │ +826 │ │ │ │ │ +_8_3_8 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const _m_a_t_r_i_x___t_y_p_e& mat, const _r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r& │ │ │ │ │ +_r_o_w_T_o_D_o_m_a_i_n, │ │ │ │ │ +839 _f_i_e_l_d___t_y_p_e relaxationFactor=1, bool _o_n_T_h_e_F_l_y__=true); │ │ │ │ │ +840 │ │ │ │ │ +_8_4_6 virtual void _p_r_e ([[_m_a_y_b_e___u_n_u_s_e_d]] X& x, [[_m_a_y_b_e___u_n_u_s_e_d]] X& b) │ │ │ │ │ +847 {} │ │ │ │ │ +848 │ │ │ │ │ +_8_5_4 virtual void _a_p_p_l_y (X& v, const X& _d); │ │ │ │ │ +855 │ │ │ │ │ +_8_6_1 virtual void _p_o_s_t ([[_m_a_y_b_e___u_n_u_s_e_d]] X& x) │ │ │ │ │ +862 {} │ │ │ │ │ +863 │ │ │ │ │ +864 template │ │ │ │ │ +_8_6_5 void _a_p_p_l_y(X& v, const X& _d); │ │ │ │ │ +866 │ │ │ │ │ +_8_6_8 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +869 { │ │ │ │ │ +870 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +871 } │ │ │ │ │ +872 │ │ │ │ │ +873 private: │ │ │ │ │ +874 const M& mat; │ │ │ │ │ +875 _s_l_u___v_e_c_t_o_r solvers; │ │ │ │ │ +876 _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r subDomains; │ │ │ │ │ +877 _f_i_e_l_d___t_y_p_e relax; │ │ │ │ │ +878 │ │ │ │ │ +879 typename M::size_type maxlength; │ │ │ │ │ +880 │ │ │ │ │ +881 bool onTheFly; │ │ │ │ │ +882 }; │ │ │ │ │ +883 │ │ │ │ │ +884 │ │ │ │ │ +885 │ │ │ │ │ +886 template │ │ │ │ │ +_8_8_7 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +(_I_n_i_t_i_a_l_i_z_e_r_L_i_s_t& il, │ │ │ │ │ +888 const _I_n_d_e_x_S_e_t& idx, │ │ │ │ │ +889 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& domains_) │ │ │ │ │ +890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_) │ │ │ │ │ +891 {} │ │ │ │ │ +892 │ │ │ │ │ +893 │ │ │ │ │ +894 template │ │ │ │ │ +_8_9_5 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_a_d_d_R_o_w_N_n_z(const _I_t_e_r& row) │ │ │ │ │ +896 { │ │ │ │ │ +897 typedef typename IndexSet::value_type::const_iterator iterator; │ │ │ │ │ +898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices) │ │ │ │ │ +[row.index()].end(); ++domain) { │ │ │ │ │ +899 (*initializers)[*domain].addRowNnz(row, domains[*domain]); │ │ │ │ │ +900 indexMaps[*domain].insert(row.index()); │ │ │ │ │ +901 } │ │ │ │ │ +902 } │ │ │ │ │ +903 │ │ │ │ │ +904 template │ │ │ │ │ +_9_0_5 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_a_l_l_o_c_a_t_e() │ │ │ │ │ +906 { │ │ │ │ │ +907 for(auto&& i: *initializers) │ │ │ │ │ +908 i.allocateMatrixStorage(); │ │ │ │ │ +909 for(auto&& i: *initializers) │ │ │ │ │ +910 i.allocateMarker(); │ │ │ │ │ +911 } │ │ │ │ │ +912 │ │ │ │ │ +913 template │ │ │ │ │ +_9_1_4 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_o_u_n_t_E_n_t_r_i_e_s(const _I_t_e_r& row, │ │ │ │ │ +const _C_I_t_e_r& _c_o_l) const │ │ │ │ │ +915 { │ │ │ │ │ +916 typedef typename IndexSet::value_type::const_iterator iterator; │ │ │ │ │ +917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices) │ │ │ │ │ +[row.index()].end(); ++domain) { │ │ │ │ │ +918 typename std::map::const_iterator v = indexMaps │ │ │ │ │ +[*domain].find(_c_o_l.index()); │ │ │ │ │ +919 if(v!= indexMaps[*domain].end()) { │ │ │ │ │ +920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(_c_o_l.index())- │ │ │ │ │ +>second); │ │ │ │ │ +921 } │ │ │ │ │ +922 } │ │ │ │ │ +923 } │ │ │ │ │ +924 │ │ │ │ │ +925 template │ │ │ │ │ +_9_2_6 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_a_l_c_C_o_l_s_t_a_r_t() const │ │ │ │ │ +927 { │ │ │ │ │ +928 for(auto&& i : *initializers) │ │ │ │ │ +929 i.calcColstart(); │ │ │ │ │ +930 } │ │ │ │ │ +931 │ │ │ │ │ +932 template │ │ │ │ │ +_9_3_3 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_o_p_y_V_a_l_u_e(const _I_t_e_r& row, const │ │ │ │ │ +_C_I_t_e_r& _c_o_l) const │ │ │ │ │ +934 { │ │ │ │ │ +935 typedef typename IndexSet::value_type::const_iterator iterator; │ │ │ │ │ +936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices) │ │ │ │ │ +[row.index()].end(); ++domain) { │ │ │ │ │ +937 typename std::map::const_iterator v = indexMaps │ │ │ │ │ +[*domain].find(_c_o_l.index()); │ │ │ │ │ +938 if(v!= indexMaps[*domain].end()) { │ │ │ │ │ +939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index())); │ │ │ │ │ +940 (*initializers)[*domain].copyValue(_c_o_l, indexMaps[*domain].find(row.index │ │ │ │ │ +())->second, │ │ │ │ │ +941 v->second); │ │ │ │ │ +942 } │ │ │ │ │ +943 } │ │ │ │ │ +944 } │ │ │ │ │ +945 │ │ │ │ │ +946 template │ │ │ │ │ +_9_4_7 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_c_r_e_a_t_e_M_a_t_r_i_x() const │ │ │ │ │ +948 { │ │ │ │ │ +949 std::vector().swap(indexMaps); │ │ │ │ │ +950 for(auto&& i: *initializers) │ │ │ │ │ +951 i.createMatrix(); │ │ │ │ │ +952 } │ │ │ │ │ +953 │ │ │ │ │ +954 template │ │ │ │ │ +_9_5_5 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_I_n_d_e_x_M_a_p() │ │ │ │ │ +956 : row(0) │ │ │ │ │ +957 {} │ │ │ │ │ +958 │ │ │ │ │ +959 template │ │ │ │ │ +_9_6_0 void _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_i_n_s_e_r_t(size_type grow) │ │ │ │ │ +961 { │ │ │ │ │ +962 assert(map_.find(grow)==map_.end()); │ │ │ │ │ +963 map_.insert(std::make_pair(grow, row++)); │ │ │ │ │ +964 } │ │ │ │ │ +965 │ │ │ │ │ +966 template │ │ │ │ │ +967 typename OverlappingSchwarzInitializer::IndexMap::const_iterator │ │ │ │ │ +_9_6_8 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_f_i_n_d(size_type grow) const │ │ │ │ │ +969 { │ │ │ │ │ +970 return map_.find(grow); │ │ │ │ │ +971 } │ │ │ │ │ +972 │ │ │ │ │ +973 template │ │ │ │ │ +974 typename OverlappingSchwarzInitializer::IndexMap::iterator │ │ │ │ │ +_9_7_5 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_f_i_n_d(size_type grow) │ │ │ │ │ +976 { │ │ │ │ │ +977 return map_.find(grow); │ │ │ │ │ +978 } │ │ │ │ │ +979 │ │ │ │ │ +980 template │ │ │ │ │ +981 typename OverlappingSchwarzInitializer::IndexMap::const_iterator │ │ │ │ │ +_9_8_2 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_e_n_d() const │ │ │ │ │ +983 { │ │ │ │ │ +984 return map_.end(); │ │ │ │ │ +985 } │ │ │ │ │ +986 │ │ │ │ │ +987 template │ │ │ │ │ +988 typename OverlappingSchwarzInitializer::IndexMap::iterator │ │ │ │ │ +_9_8_9 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_e_n_d() │ │ │ │ │ +990 { │ │ │ │ │ +991 return map_.end(); │ │ │ │ │ +992 } │ │ │ │ │ +993 │ │ │ │ │ +994 template │ │ │ │ │ +995 typename OverlappingSchwarzInitializer::IndexMap::const_iterator │ │ │ │ │ +_9_9_6 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_b_e_g_i_n() const │ │ │ │ │ +997 { │ │ │ │ │ +998 return map_.begin(); │ │ │ │ │ +999 } │ │ │ │ │ +1000 │ │ │ │ │ +1001 template │ │ │ │ │ +1002 typename OverlappingSchwarzInitializer::IndexMap::iterator │ │ │ │ │ +_1_0_0_3 _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_I_,_S_,_D_>_:_:_I_n_d_e_x_M_a_p_:_:_b_e_g_i_n() │ │ │ │ │ +1004 { │ │ │ │ │ +1005 return map_.begin(); │ │ │ │ │ +1006 } │ │ │ │ │ +1007 │ │ │ │ │ +1008 template │ │ │ │ │ +_1_0_0_9 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const │ │ │ │ │ +_m_a_t_r_i_x___t_y_p_e& _m_a_t__, const _r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r& _r_o_w_T_o_D_o_m_a_i_n, │ │ │ │ │ +1010 _f_i_e_l_d___t_y_p_e relaxationFactor, bool _f_l_y) │ │ │ │ │ +1011 : _m_a_t(_m_a_t__), relax(relaxationFactor), onTheFly(_f_l_y) │ │ │ │ │ +1012 { │ │ │ │ │ +1013 typedef typename rowtodomain_vector::const_iterator _R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r; │ │ │ │ │ +1014 typedef typename subdomain_list::const_iterator _D_o_m_a_i_n_I_t_e_r_a_t_o_r; │ │ │ │ │ +1015#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1016 _a_s_s_e_r_t(_r_o_w_T_o_D_o_m_a_i_n.size()==mat.N()); │ │ │ │ │ +1017 _a_s_s_e_r_t(_r_o_w_T_o_D_o_m_a_i_n.size()==mat.M()); │ │ │ │ │ +1018 │ │ │ │ │ +1019 for(_R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r _i_t_e_r=_r_o_w_T_o_D_o_m_a_i_n.begin(); _i_t_e_r != _r_o_w_T_o_D_o_m_a_i_n.end(); │ │ │ │ │ +++_i_t_e_r) │ │ │ │ │ +1020 _a_s_s_e_r_t(_i_t_e_r->size()>0); │ │ │ │ │ +1021 │ │ │ │ │ +1022#endif │ │ │ │ │ +1023 // calculate the number of domains │ │ │ │ │ +1024 _s_i_z_e___t_y_p_e domains=0; │ │ │ │ │ +1025 for(_R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r _i_t_e_r=_r_o_w_T_o_D_o_m_a_i_n.begin(); _i_t_e_r != _r_o_w_T_o_D_o_m_a_i_n.end(); │ │ │ │ │ +++_i_t_e_r) │ │ │ │ │ +1026 for(_D_o_m_a_i_n_I_t_e_r_a_t_o_r _d=_i_t_e_r->begin(); _d != _i_t_e_r->end(); ++_d) │ │ │ │ │ +1027 domains=std::max(domains, *_d); │ │ │ │ │ +1028 ++domains; │ │ │ │ │ +1029 │ │ │ │ │ +1030 solvers.resize(domains); │ │ │ │ │ +1031 subDomains.resize(domains); │ │ │ │ │ +1032 │ │ │ │ │ +1033 // initialize subdomains to row mapping from row to subdomain mapping │ │ │ │ │ +1034 _s_i_z_e___t_y_p_e row=0; │ │ │ │ │ +1035 for(_R_o_w_D_o_m_a_i_n_I_t_e_r_a_t_o_r _i_t_e_r=_r_o_w_T_o_D_o_m_a_i_n.begin(); _i_t_e_r != _r_o_w_T_o_D_o_m_a_i_n.end(); │ │ │ │ │ +++_i_t_e_r, ++row) │ │ │ │ │ +1036 for(_D_o_m_a_i_n_I_t_e_r_a_t_o_r _d=_i_t_e_r->begin(); _d != _i_t_e_r->end(); ++_d) │ │ │ │ │ +1037 subDomains[*_d].insert(row); │ │ │ │ │ +1038 │ │ │ │ │ +1039#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1040 _s_i_z_e___t_y_p_e i=0; │ │ │ │ │ +1041 typedef typename subdomain_vector::const_iterator iterator; │ │ │ │ │ +1042 for(iterator _i_t_e_r=subDomains.begin(); _i_t_e_r != subDomains.end(); ++_i_t_e_r) { │ │ │ │ │ +1043 typedef typename subdomain_type::const_iterator _e_n_t_r_y___i_t_e_r_a_t_o_r; │ │ │ │ │ +1044 Dune::dvverb<<"domain "<begin(); entry != _i_t_e_r->end(); ++entry) { │ │ │ │ │ +1046 Dune::dvverb<<" "<<*entry; │ │ │ │ │ +1047 } │ │ │ │ │ +1048 Dune::dvverb< │ │ │ │ │ +1052_ _:_:_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s(_r_o_w_T_o_D_o_m_a_i_n, mat, solvers, subDomains, onTheFly); │ │ │ │ │ +1053 } │ │ │ │ │ +1054 │ │ │ │ │ +1055 template │ │ │ │ │ +_1_0_5_6 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z(const │ │ │ │ │ +_m_a_t_r_i_x___t_y_p_e& _m_a_t__, │ │ │ │ │ +1057 const _s_u_b_d_o_m_a_i_n___v_e_c_t_o_r& _s_d, │ │ │ │ │ +1058 _f_i_e_l_d___t_y_p_e relaxationFactor, │ │ │ │ │ +1059 bool _f_l_y) │ │ │ │ │ +1060 : _m_a_t(_m_a_t__), solvers(_s_d.size()), subDomains(_s_d), relax(relaxationFactor), │ │ │ │ │ +1061 onTheFly(_f_l_y) │ │ │ │ │ +1062 { │ │ │ │ │ +1063 typedef typename subdomain_vector::const_iterator _D_o_m_a_i_n_I_t_e_r_a_t_o_r; │ │ │ │ │ +1064 │ │ │ │ │ +1065#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +1066 _s_i_z_e___t_y_p_e i=0; │ │ │ │ │ +1067 │ │ │ │ │ +1068 for(_D_o_m_a_i_n_I_t_e_r_a_t_o_r _d=_s_d.begin(); _d != _s_d.end(); ++_d,++i) { │ │ │ │ │ +1069 //std::cout<size()<size()>0); │ │ │ │ │ +1071 typedef typename DomainIterator::value_type::const_iterator │ │ │ │ │ +_e_n_t_r_y___i_t_e_r_a_t_o_r; │ │ │ │ │ +1072 Dune::dvverb<<"domain "<begin(); entry != _d->end(); ++entry) { │ │ │ │ │ +1074 Dune::dvverb<<" "<<*entry; │ │ │ │ │ +1075 } │ │ │ │ │ +1076 Dune::dvverb<begin(); row != _d_o_m_a_i_n->end(); ++row) │ │ │ │ │ +1089 _r_o_w_T_o_D_o_m_a_i_n[*row].push_back(_d_o_m_a_i_n_I_d); │ │ │ │ │ +1090 } │ │ │ │ │ +1091 │ │ │ │ │ +1092 maxlength = _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_<_s_l_u_> │ │ │ │ │ +1093_ _:_:_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s(_r_o_w_T_o_D_o_m_a_i_n, mat, solvers, subDomains, onTheFly); │ │ │ │ │ +1094 } │ │ │ │ │ +1095 │ │ │ │ │ +1102 template │ │ │ │ │ +_1_1_0_3 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e {}; │ │ │ │ │ +1104 │ │ │ │ │ +1105 template │ │ │ │ │ +_1_1_0_6 struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +1107 { │ │ │ │ │ +_1_1_0_8 static constexpr size_t n = std::decay_t()))>::rows; │ │ │ │ │ +_1_1_0_9 static constexpr size_t m = std::decay_t()))>::cols; │ │ │ │ │ +1110 template │ │ │ │ │ +_1_1_1_1 static int _s_i_z_e(const Domain & d) │ │ │ │ │ +1112 { │ │ │ │ │ +1113 assert(n==m); │ │ │ │ │ +1114 return m*d.size(); │ │ │ │ │ +1115 } │ │ │ │ │ +1116 }; │ │ │ │ │ +1117 │ │ │ │ │ +1118 template │ │ │ │ │ +1119 template │ │ │ │ │ +1120 std::size_t │ │ │ │ │ +_1_1_2_1 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_< │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_>, X, Y >,false>:: │ │ │ │ │ +1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain, │ │ │ │ │ +1123 [[maybe_unused]] const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +1124 [[maybe_unused]] Solvers& solvers, │ │ │ │ │ +1125 const SubDomains& subDomains, │ │ │ │ │ +1126 [[maybe_unused]] bool onTheFly) │ │ │ │ │ +1127 { │ │ │ │ │ +1128 typedef typename SubDomains::const_iterator DomainIterator; │ │ │ │ │ +1129 std::size_t maxlength = 0; │ │ │ │ │ +1130 │ │ │ │ │ +1131 assert(onTheFly); │ │ │ │ │ +1132 │ │ │ │ │ +1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ +++domain) │ │ │ │ │ +1134 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ +1135 maxlength*=n; │ │ │ │ │ +1136 │ │ │ │ │ +1137 return maxlength; │ │ │ │ │ +1138 } │ │ │ │ │ +1139 │ │ │ │ │ +1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +1141 template class S, typename T, typename A> │ │ │ │ │ +1142 template │ │ │ │ │ +_1_1_4_3 std::size_t │ │ │ │ │ +_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>:: │ │ │ │ │ +assembleLocalProblems(const RowToDomain& rowToDomain, │ │ │ │ │ +1144 const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +1145 Solvers& solvers, │ │ │ │ │ +1146 const SubDomains& subDomains, │ │ │ │ │ +1147 bool onTheFly) │ │ │ │ │ +1148 { │ │ │ │ │ +1149 typedef typename S>::MatrixInitializer MatrixInitializer; │ │ │ │ │ +1150 typedef typename std::vector::iterator │ │ │ │ │ +InitializerIterator; │ │ │ │ │ +1151 typedef typename SubDomains::const_iterator DomainIterator; │ │ │ │ │ +1152 typedef typename Solvers::iterator SolverIterator; │ │ │ │ │ +1153 std::size_t maxlength = 0; │ │ │ │ │ +1154 │ │ │ │ │ +1155 if(onTheFly) { │ │ │ │ │ +1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ +++domain) │ │ │ │ │ +1157 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ +1158 maxlength*=Impl::asMatrix(*_m_a_t[0].begin()).N(); │ │ │ │ │ +1159 }else{ │ │ │ │ │ +1160 // initialize the initializers │ │ │ │ │ +1161 DomainIterator domain=subDomains.begin(); │ │ │ │ │ +1162 │ │ │ │ │ +1163 // Create the initializers list. │ │ │ │ │ +1164 std::vector initializers(subDomains.size()); │ │ │ │ │ +1165 │ │ │ │ │ +1166 SolverIterator solver=solvers.begin(); │ │ │ │ │ +1167 for(InitializerIterator initializer=initializers.begin(); │ │ │ │ │ +initializer!=initializers.end(); │ │ │ │ │ +1168 ++initializer, ++solver, ++domain) { │ │ │ │ │ +1169 solver->getInternalMatrix │ │ │ │ │ +().N_=_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_m_a_t_r_i_x___t_y_p_e_>_:_:_s_i_z_e(*domain); │ │ │ │ │ +1170 solver->getInternalMatrix │ │ │ │ │ +().M_=_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_m_a_t_r_i_x___t_y_p_e_>_:_:_s_i_z_e(*domain); │ │ │ │ │ +1171 //solver->setVerbosity(true); │ │ │ │ │ +1172 *initializer=MatrixInitializer(solver->getInternalMatrix()); │ │ │ │ │ +1173 } │ │ │ │ │ +1174 │ │ │ │ │ +1175 // Set up the supermatrices according to the subdomains │ │ │ │ │ +1176 typedef _O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_<_s_t_d_:_:_v_e_c_t_o_r_<_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_>, │ │ │ │ │ +1177 RowToDomain, SubDomains> Initializer; │ │ │ │ │ +1178 │ │ │ │ │ +1179 Initializer initializer(initializers, rowToDomain, subDomains); │ │ │ │ │ +1180 copyToBCCSMatrix(initializer, _m_a_t); │ │ │ │ │ +1181 │ │ │ │ │ +1182 // Calculate the LU decompositions │ │ │ │ │ +1183 for(auto&& s: solvers) │ │ │ │ │ +1184 s.decompose(); │ │ │ │ │ +1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end(); │ │ │ │ │ +++solverIt) │ │ │ │ │ +1186 { │ │ │ │ │ +1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix │ │ │ │ │ +().M()); │ │ │ │ │ +1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N()); │ │ │ │ │ +1189 } │ │ │ │ │ +1190 } │ │ │ │ │ +1191 return maxlength; │ │ │ │ │ +1192 } │ │ │ │ │ +1193 │ │ │ │ │ +1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +1195 │ │ │ │ │ +1196 template │ │ │ │ │ +1197 template │ │ │ │ │ +_1_1_9_8 std::size_t _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_: │ │ │ │ │ +_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s([[maybe_unused]] const RowToDomain& rowToDomain, │ │ │ │ │ +1199 const _m_a_t_r_i_x___t_y_p_e& _m_a_t, │ │ │ │ │ +1200 Solvers& solvers, │ │ │ │ │ +1201 const SubDomains& subDomains, │ │ │ │ │ +1202 bool onTheFly) │ │ │ │ │ +1203 { │ │ │ │ │ +1204 typedef typename SubDomains::const_iterator DomainIterator; │ │ │ │ │ +1205 typedef typename Solvers::iterator SolverIterator; │ │ │ │ │ +1206 std::size_t maxlength = 0; │ │ │ │ │ +1207 │ │ │ │ │ +1208 if(onTheFly) { │ │ │ │ │ +1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ +++domain) │ │ │ │ │ +1210 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ +1211 }else{ │ │ │ │ │ +1212 // initialize the solvers of the local prolems. │ │ │ │ │ +1213 SolverIterator solver=solvers.begin(); │ │ │ │ │ +1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); │ │ │ │ │ +1215 ++domain, ++solver) { │ │ │ │ │ +1216 solver->setSubMatrix(_m_a_t, *domain); │ │ │ │ │ +1217 maxlength=std::max(maxlength, domain->size()); │ │ │ │ │ +1218 } │ │ │ │ │ +1219 } │ │ │ │ │ +1220 │ │ │ │ │ +1221 return maxlength; │ │ │ │ │ +1222 │ │ │ │ │ +1223 } │ │ │ │ │ +1224 │ │ │ │ │ +1225 │ │ │ │ │ +1226 template │ │ │ │ │ +_1_2_2_7 void _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_a_p_p_l_y(X& x, const X& b) │ │ │ │ │ +1228 { │ │ │ │ │ +1229 _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_>_:_:_a_p_p_l_y(*this, x, b); │ │ │ │ │ +1230 } │ │ │ │ │ +1231 │ │ │ │ │ +1232 template │ │ │ │ │ +1233 template │ │ │ │ │ +_1_2_3_4 void _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_M_,_X_,_T_M_,_T_D_,_T_A_>_:_:_a_p_p_l_y(X& x, const X& b) │ │ │ │ │ +1235 { │ │ │ │ │ +1236 typedef _s_l_u___v_e_c_t_o_r solver_vector; │ │ │ │ │ +1237 typedef typename │ │ │ │ │ +_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_: │ │ │ │ │ +_s_o_l_v_e_r___i_t_e_r_a_t_o_r iterator; │ │ │ │ │ +1238 typedef typename │ │ │ │ │ +_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_: │ │ │ │ │ +_d_o_m_a_i_n___i_t_e_r_a_t_o_r │ │ │ │ │ +1239 domain_iterator; │ │ │ │ │ +1240 │ │ │ │ │ +1241 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_T_D_> assigner(maxlength, _m_a_t, b, x); │ │ │ │ │ +1242 │ │ │ │ │ +1243 domain_iterator │ │ │ │ │ +_d_o_m_a_i_n=_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_:_b_e_g_i_n │ │ │ │ │ +(subDomains); │ │ │ │ │ +1244 iterator solver = │ │ │ │ │ +_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_:_b_e_g_i_n │ │ │ │ │ +(solvers); │ │ │ │ │ +1245 X v(x); // temporary for the update │ │ │ │ │ +1246 v=0; │ │ │ │ │ +1247 │ │ │ │ │ +1248 typedef typename _A_d_d_e_r_S_e_l_e_c_t_o_r_<_T_M_,_X_,_T_D_ _>_:_:_A_d_d_e_r Adder; │ │ │ │ │ +1249 Adder adder(v, x, assigner, relax); │ │ │ │ │ +1250 │ │ │ │ │ +1251 for(; _d_o_m_a_i_n != │ │ │ │ │ +_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_s_o_l_v_e_r___v_e_c_t_o_r_,_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r_,_f_o_r_w_a_r_d_>_:_:_e_n_d │ │ │ │ │ +(subDomains); ++_d_o_m_a_i_n) { │ │ │ │ │ +1252 //Copy rhs to C-array for SuperLU │ │ │ │ │ +1253 std::for_each(_d_o_m_a_i_n->begin(), _d_o_m_a_i_n->end(), assigner); │ │ │ │ │ +1254 assigner.resetIndexForNextDomain(); │ │ │ │ │ +1255 if(onTheFly) { │ │ │ │ │ +1256 // Create the subdomain solver │ │ │ │ │ +1257 _s_l_u _s_d_s_o_l_v_e_r; │ │ │ │ │ +1258 _s_d_s_o_l_v_e_r.setSubMatrix(_m_a_t, *_d_o_m_a_i_n); │ │ │ │ │ +1259 // Apply │ │ │ │ │ +1260 _s_d_s_o_l_v_e_r.apply(assigner.lhs(), assigner.rhs()); │ │ │ │ │ +1261 }else{ │ │ │ │ │ +1262 solver->apply(assigner.lhs(), assigner.rhs()); │ │ │ │ │ +1263 ++solver; │ │ │ │ │ +1264 } │ │ │ │ │ +1265 │ │ │ │ │ +1266 //Add relaxed correction to from SuperLU to v │ │ │ │ │ +1267 std::for_each(_d_o_m_a_i_n->begin(), _d_o_m_a_i_n->end(), adder); │ │ │ │ │ +1268 assigner.resetIndexForNextDomain(); │ │ │ │ │ +1269 │ │ │ │ │ +1270 } │ │ │ │ │ +1271 │ │ │ │ │ +1272 adder.axpy(); │ │ │ │ │ +1273 assigner.deallocate(); │ │ │ │ │ +1274 } │ │ │ │ │ +1275 │ │ │ │ │ +1276 template │ │ │ │ │ +1277 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_2_7_8 ::OverlappingAssignerHelper(std::size_t maxlength, const _B_C_R_S_M_a_t_r_i_x_<_K_, │ │ │ │ │ +_A_l_>& mat_, │ │ │ │ │ +1279 const X& b_, Y& x_) : │ │ │ │ │ +1280 _m_a_t(&mat_), │ │ │ │ │ +1281 rhs_( new DynamicVector<_f_i_e_l_d___t_y_p_e>(maxlength, 42) ), │ │ │ │ │ +1282 lhs_( new DynamicVector<_f_i_e_l_d___t_y_p_e>(maxlength, -42) ), │ │ │ │ │ +1283 b(&b_), │ │ │ │ │ +1284 x(&x_), │ │ │ │ │ +1285 i(0), │ │ │ │ │ +1286 maxlength_(maxlength) │ │ │ │ │ +1287 {} │ │ │ │ │ +1288 │ │ │ │ │ +1289 template │ │ │ │ │ +1290 void │ │ │ │ │ +1291 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_2_9_2 ::deallocate() │ │ │ │ │ +1293 { │ │ │ │ │ +1294 delete rhs_; │ │ │ │ │ +1295 delete lhs_; │ │ │ │ │ +1296 } │ │ │ │ │ +1297 │ │ │ │ │ +1298 template │ │ │ │ │ +1299 void │ │ │ │ │ +1300 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_3_0_1 ::resetIndexForNextDomain() │ │ │ │ │ +1302 { │ │ │ │ │ +1303 i=0; │ │ │ │ │ +1304 } │ │ │ │ │ +1305 │ │ │ │ │ +1306 template │ │ │ │ │ +1307 DynamicVector & │ │ │ │ │ +1308 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_3_0_9 ::lhs() │ │ │ │ │ +1310 { │ │ │ │ │ +1311 return *lhs_; │ │ │ │ │ +1312 } │ │ │ │ │ +1313 │ │ │ │ │ +1314 template │ │ │ │ │ +1315 DynamicVector & │ │ │ │ │ +1316 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_3_1_7 ::rhs() │ │ │ │ │ +1318 { │ │ │ │ │ +1319 return *rhs_; │ │ │ │ │ +1320 } │ │ │ │ │ +1321 │ │ │ │ │ +1322 template │ │ │ │ │ +1323 void │ │ │ │ │ +1324 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_3_2_5 ::relaxResult(_f_i_e_l_d___t_y_p_e relax) │ │ │ │ │ +1326 { │ │ │ │ │ +1327 lhs() *= relax; │ │ │ │ │ +1328 } │ │ │ │ │ +1329 │ │ │ │ │ +1330 template │ │ │ │ │ +1331 void │ │ │ │ │ +1332 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_3_3_3 ::operator()(const _s_i_z_e___t_y_p_e& domainIndex) │ │ │ │ │ +1334 { │ │ │ │ │ +1335 lhs() = 0.0; │ │ │ │ │ +1336#if 0 │ │ │ │ │ +1337 //assign right hand side of current domainindex block │ │ │ │ │ +1338 for(_s_i_z_e___t_y_p_e j=0; j │ │ │ │ │ +1376 void │ │ │ │ │ +1377 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_>, X, Y >,false> │ │ │ │ │ +_1_3_7_8 ::assignResult(_b_l_o_c_k___t_y_p_e& res) │ │ │ │ │ +1379 { │ │ │ │ │ +1380 // assign the result of the local solve to the global vector │ │ │ │ │ +1381 for(_s_i_z_e___t_y_p_e j=0; j class S, typename T, typename A> │ │ │ │ │ +1390 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true> │ │ │ │ │ +_1_3_9_1 ::OverlappingAssignerHelper(std::size_t maxlength, │ │ │ │ │ +1392 const _B_C_R_S_M_a_t_r_i_x_<_T_,_A_>& mat_, │ │ │ │ │ +1393 const _r_a_n_g_e___t_y_p_e& b_, │ │ │ │ │ +1394 _r_a_n_g_e___t_y_p_e& x_) │ │ │ │ │ +1395 : _m_a_t(&mat_), │ │ │ │ │ +1396 b(&b_), │ │ │ │ │ +1397 x(&x_), i(0), maxlength_(maxlength) │ │ │ │ │ +1398 { │ │ │ │ │ +1399 rhs_ = new _f_i_e_l_d___t_y_p_e[maxlength]; │ │ │ │ │ +1400 lhs_ = new _f_i_e_l_d___t_y_p_e[maxlength]; │ │ │ │ │ +1401 │ │ │ │ │ +1402 } │ │ │ │ │ +1403 │ │ │ │ │ +1404 template class S, typename T, typename A> │ │ │ │ │ +_1_4_0_5 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_> >,true>::deallocate() │ │ │ │ │ +1406 { │ │ │ │ │ +1407 delete[] rhs_; │ │ │ │ │ +1408 delete[] lhs_; │ │ │ │ │ +1409 } │ │ │ │ │ +1410 │ │ │ │ │ +1411 template class S, typename T, typename A> │ │ │ │ │ +_1_4_1_2 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::operator()(const │ │ │ │ │ +_s_i_z_e___t_y_p_e& domainIndex) │ │ │ │ │ +1413 { │ │ │ │ │ +1414 //assign right hand side of current domainindex block │ │ │ │ │ +1415 // rhs is an array of doubles! │ │ │ │ │ +1416 // rhs[starti] = b[domainindex] │ │ │ │ │ +1417 for(_s_i_z_e___t_y_p_e j=0; j class S, typename T, typename A> │ │ │ │ │ +_1_4_4_1 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::relaxResult │ │ │ │ │ +(_f_i_e_l_d___t_y_p_e relax) │ │ │ │ │ +1442 { │ │ │ │ │ +1443 for(_s_i_z_e___t_y_p_e j=i+n; i class S, typename T, typename A> │ │ │ │ │ +_1_4_5_1 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::assignResult │ │ │ │ │ +(_b_l_o_c_k___t_y_p_e& res) │ │ │ │ │ +1452 { │ │ │ │ │ +1453 // assign the result of the local solve to the global vector │ │ │ │ │ +1454 for(_s_i_z_e___t_y_p_e j=0; j class S, typename T, typename A> │ │ │ │ │ +_1_4_6_1 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>:: │ │ │ │ │ +resetIndexForNextDomain() │ │ │ │ │ +1462 { │ │ │ │ │ +1463 i=0; │ │ │ │ │ +1464 } │ │ │ │ │ +1465 │ │ │ │ │ +1466 template class S, typename T, typename A> │ │ │ │ │ +1467 typename _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::field_type* │ │ │ │ │ +_1_4_6_8 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::lhs() │ │ │ │ │ +1469 { │ │ │ │ │ +1470 return lhs_; │ │ │ │ │ +1471 } │ │ │ │ │ +1472 │ │ │ │ │ +1473 template class S, typename T, typename A> │ │ │ │ │ +1474 typename _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::field_type* │ │ │ │ │ +_1_4_7_5 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_S_<_B_C_R_S_M_a_t_r_i_x_<_T_,_A_>>,true>::rhs() │ │ │ │ │ +1476 { │ │ │ │ │ +1477 return rhs_; │ │ │ │ │ +1478 } │ │ │ │ │ +1479 │ │ │ │ │ +1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK │ │ │ │ │ +1481 │ │ │ │ │ +1482 template │ │ │ │ │ +_1_4_8_3 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e(std::size_t │ │ │ │ │ +maxlength, │ │ │ │ │ +1484 const M& mat_, │ │ │ │ │ +1485 const Y& b_, │ │ │ │ │ +1486 X& x_) │ │ │ │ │ +1487 : _m_a_t(&mat_), │ │ │ │ │ +1488 b(&b_), │ │ │ │ │ +1489 x(&x_), i(0) │ │ │ │ │ +1490 { │ │ │ │ │ +1491 rhs_= new Y(maxlength); │ │ │ │ │ +1492 lhs_ = new X(maxlength); │ │ │ │ │ +1493 } │ │ │ │ │ +1494 │ │ │ │ │ +1495 template │ │ │ │ │ +_1_4_9_6 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_d_e_a_l_l_o_c_a_t_e() │ │ │ │ │ +1497 { │ │ │ │ │ +1498 delete rhs_; │ │ │ │ │ +1499 delete lhs_; │ │ │ │ │ +1500 } │ │ │ │ │ +1501 │ │ │ │ │ +1502 template │ │ │ │ │ +_1_5_0_3 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_o_p_e_r_a_t_o_r_(_)(const _s_i_z_e___t_y_p_e& │ │ │ │ │ +domainIndex) │ │ │ │ │ +1504 { │ │ │ │ │ +1505 (*rhs_)[i]=(*b)[domainIndex]; │ │ │ │ │ +1506 │ │ │ │ │ +1507 // loop over all Matrix row entries and calculate defect. │ │ │ │ │ +1508 typedef typename matrix_type::ConstColIterator col_iterator; │ │ │ │ │ +1509 │ │ │ │ │ +1510 // calculate defect for current row index block │ │ │ │ │ +1511 for(col_iterator _c_o_l=(*_m_a_t)[domainIndex].begin(); _c_o_l!=(*mat) │ │ │ │ │ +[domainIndex].end(); ++_c_o_l) { │ │ │ │ │ +1512 Impl::asMatrix(*col).mmv((*x)[_c_o_l.index()], (*rhs_)[i]); │ │ │ │ │ +1513 } │ │ │ │ │ +1514 // Goto next local index │ │ │ │ │ +1515 ++i; │ │ │ │ │ +1516 } │ │ │ │ │ +1517 │ │ │ │ │ +1518 template │ │ │ │ │ +_1_5_1_9 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_r_e_l_a_x_R_e_s_u_l_t(_f_i_e_l_d___t_y_p_e relax) │ │ │ │ │ +1520 { │ │ │ │ │ +1521 (*lhs_)[i]*=relax; │ │ │ │ │ +1522 } │ │ │ │ │ +1523 │ │ │ │ │ +1524 template │ │ │ │ │ +_1_5_2_5 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_a_s_s_i_g_n_R_e_s_u_l_t(_b_l_o_c_k___t_y_p_e& res) │ │ │ │ │ +1526 { │ │ │ │ │ +1527 res+=(*lhs_)[i++]; │ │ │ │ │ +1528 } │ │ │ │ │ +1529 │ │ │ │ │ +1530 template │ │ │ │ │ +_1_5_3_1 X& _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_l_h_s() │ │ │ │ │ +1532 { │ │ │ │ │ +1533 return *lhs_; │ │ │ │ │ +1534 } │ │ │ │ │ +1535 │ │ │ │ │ +1536 template │ │ │ │ │ +_1_5_3_7 Y& _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_r_h_s() │ │ │ │ │ +1538 { │ │ │ │ │ +1539 return *rhs_; │ │ │ │ │ +1540 } │ │ │ │ │ +1541 │ │ │ │ │ +1542 template │ │ │ │ │ +_1_5_4_3 void _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_<_M_,_X_,_Y_>_:_:_r_e_s_e_t_I_n_d_e_x_F_o_r_N_e_x_t_D_o_m_a_i_n() │ │ │ │ │ +1544 { │ │ │ │ │ +1545 i=0; │ │ │ │ │ +1546 } │ │ │ │ │ +1547 │ │ │ │ │ +1548 template │ │ │ │ │ +_1_5_4_9 _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::AdditiveAdder(_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v_, │ │ │ │ │ +1550 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x_, │ │ │ │ │ +1551 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner_, │ │ │ │ │ +1552 const _f_i_e_l_d___t_y_p_e& relax_) │ │ │ │ │ +1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_) │ │ │ │ │ +1554 {} │ │ │ │ │ +1555 │ │ │ │ │ +1556 template │ │ │ │ │ +_1_5_5_7 void _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::operator()(const _s_i_z_e___t_y_p_e& │ │ │ │ │ +domainIndex) │ │ │ │ │ +1558 { │ │ │ │ │ +1559 // add the result of the local solve to the current update │ │ │ │ │ +1560 assigner->assignResult((*v)[domainIndex]); │ │ │ │ │ +1561 } │ │ │ │ │ +1562 │ │ │ │ │ +1563 │ │ │ │ │ +1564 template │ │ │ │ │ +_1_5_6_5 void _A_d_d_i_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::axpy() │ │ │ │ │ +1566 { │ │ │ │ │ +1567 // relax the update and add it to the current guess. │ │ │ │ │ +1568 x->axpy(relax,*v); │ │ │ │ │ +1569 } │ │ │ │ │ +1570 │ │ │ │ │ +1571 │ │ │ │ │ +1572 template │ │ │ │ │ +1573 _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> > │ │ │ │ │ +_1_5_7_4 ::MultiplicativeAdder([[maybe_unused]] _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& v_, │ │ │ │ │ +1575 _B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_>& x_, │ │ │ │ │ +1576 _O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_<_S_>& assigner_, const _f_i_e_l_d___t_y_p_e& relax_) │ │ │ │ │ +1577 : x(&x_), assigner(&assigner_), relax(relax_) │ │ │ │ │ +1578 {} │ │ │ │ │ +1579 │ │ │ │ │ +1580 │ │ │ │ │ +1581 template │ │ │ │ │ +_1_5_8_2 void _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::operator()(const _s_i_z_e___t_y_p_e& │ │ │ │ │ +domainIndex) │ │ │ │ │ +1583 { │ │ │ │ │ +1584 // add the result of the local solve to the current guess │ │ │ │ │ +1585 assigner->relaxResult(relax); │ │ │ │ │ +1586 assigner->assignResult((*x)[domainIndex]); │ │ │ │ │ +1587 } │ │ │ │ │ +1588 │ │ │ │ │ +1589 │ │ │ │ │ +1590 template │ │ │ │ │ +_1_5_9_1 void _M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_S_,_B_l_o_c_k_V_e_c_t_o_r_<_T_,_A_> >::axpy() │ │ │ │ │ +1592 { │ │ │ │ │ +1593 // nothing to do, as the corrections already relaxed and added in operator │ │ │ │ │ +() │ │ │ │ │ +1594 } │ │ │ │ │ +1595 │ │ │ │ │ +1596 │ │ │ │ │ +1598} │ │ │ │ │ +1599 │ │ │ │ │ +1600#endif │ │ │ │ │ +_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_s_u_p_e_r_l_u_._h_h │ │ │ │ │ +Classes for using SuperLU with ISTL matrices. │ │ │ │ │ _b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ Implementation of the BCRSMatrix class. │ │ │ │ │ +_u_m_f_p_a_c_k_._h_h │ │ │ │ │ +Classes for using UMFPack with ISTL matrices. │ │ │ │ │ +_i_l_u_s_u_b_d_o_m_a_i_n_s_o_l_v_e_r_._h_h │ │ │ │ │ +Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ _c_o_l │ │ │ │ │ Col col │ │ │ │ │ DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_a_d_d_R_o_w_N_n_z │ │ │ │ │ +void addRowNnz(const Iter &row) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:895 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const X &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1234 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_l_h_s │ │ │ │ │ +X & lhs() │ │ │ │ │ +Get the local left hand side. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1531 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_a_l_c_C_o_l_s_t_a_r_t │ │ │ │ │ +void calcColstart() const │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:926 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_r_h_s │ │ │ │ │ +Y & rhs() │ │ │ │ │ +Get the local right hand side. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1537 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:989 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_r_e_s_e_t_I_n_d_e_x_F_o_r_N_e_x_t_D_o_m_a_i_n │ │ │ │ │ +void resetIndexForNextDomain() │ │ │ │ │ +Resets the local index to zero. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1543 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_o_p_y_V_a_l_u_e │ │ │ │ │ +void copyValue(const Iter &row, const CIter &col) const │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:933 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_r_e_a_t_e_M_a_t_r_i_x │ │ │ │ │ +void createMatrix() const │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:947 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1003 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices, │ │ │ │ │ +const subdomain_vector &domains) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:887 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_I_n_d_e_x_M_a_p │ │ │ │ │ +IndexMap() │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:955 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const X &d) │ │ │ │ │ +Apply the precondtioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1227 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ +OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X │ │ │ │ │ +&x) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1483 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_f_i_n_d │ │ │ │ │ +const_iterator find(size_type grow) const │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:968 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +void operator()(const size_type &domain) │ │ │ │ │ +calculate one entry of the local defect. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1503 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +SeqOverlappingSchwarz(const matrix_type &mat, const subdomain_vector │ │ │ │ │ +&subDomains, field_type relaxationFactor=1, bool onTheFly_=true) │ │ │ │ │ +Construct the overlapping Schwarz method. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1056 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_a_l_l_o_c_a_t_e │ │ │ │ │ +void allocate() │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:905 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_d_e_a_l_l_o_c_a_t_e │ │ │ │ │ +void deallocate() │ │ │ │ │ +Deallocates memory of the local vector. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1496 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_M_a_p_:_:_i_n_s_e_r_t │ │ │ │ │ +void insert(size_type grow) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:960 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_c_o_u_n_t_E_n_t_r_i_e_s │ │ │ │ │ +void countEntries(const Iter &row, const CIter &col) const │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:914 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_:_:_a_s_s_e_m_b_l_e_L_o_c_a_l_P_r_o_b_l_e_m_s │ │ │ │ │ +static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const │ │ │ │ │ +matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1198 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_r_e_l_a_x_R_e_s_u_l_t │ │ │ │ │ +void relaxResult(field_type relax) │ │ │ │ │ +relax the result. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1519 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_a_s_s_i_g_n_R_e_s_u_l_t │ │ │ │ │ +void assignResult(block_type &res) │ │ │ │ │ +Assigns the block to the current local index. At the same time the local defect │ │ │ │ │ +is calculated for the... │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1525 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector │ │ │ │ │ +&rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1009 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_C_I_t_e_r │ │ │ │ │ +Matrix::row_type::const_iterator CIter │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_d_e_x_S_e_t │ │ │ │ │ +S IndexSet │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_t_e_r │ │ │ │ │ +Matrix::const_iterator Iter │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +IndexSet::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_I_n_i_t_i_a_l_i_z_e_r_L_i_s_t │ │ │ │ │ +I InitializerList │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ +AtomInitializer::Matrix Matrix │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_A_t_o_m_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ +InitializerList::value_type AtomInitializer │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ +D subdomain_vector │ │ │ │ │ +The vector type containing the subdomain to row index mapping. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:50 │ │ │ │ │ _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ A sparse block matrix with compressed row storage. │ │ │ │ │ DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_r_o_w_s_i_z_e_s │ │ │ │ │ -void endrowsizes() │ │ │ │ │ -indicate that size of all rows is defined │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1149 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_a_n_d_o_m │ │ │ │ │ -@ random │ │ │ │ │ -Build entries randomly. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:530 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_a_d_d_i_n_d_e_x │ │ │ │ │ -void addindex(size_type row, size_type col) │ │ │ │ │ -add index (row,col) to the matrix │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1191 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_i_n_d_i_c_e_s │ │ │ │ │ -void endindices() │ │ │ │ │ -indicate that all indices are defined, check consistency │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1248 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ -Set the size of the matrix. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BCRSMatrix & operator=(const BCRSMatrix &Mat) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:911 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x │ │ │ │ │ -A block-tridiagonal matrix. │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr auto blocklevel │ │ │ │ │ -increment block level counter │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_B_T_D_M_a_t_r_i_x │ │ │ │ │ -BTDMatrix(size_type size) │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ -void solve(V &x, const V &rhs) const │ │ │ │ │ -Use the Thomas algorithm to solve the system Ax=b in O(n) time. │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +Iterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ A::size_type size_type │ │ │ │ │ -implement row_type with compressed vector │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -A allocator_type │ │ │ │ │ -export the allocator type │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -B block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BTDMatrix & operator=(const BTDMatrix &other) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_B_T_D_M_a_t_r_i_x │ │ │ │ │ -BTDMatrix() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_B_T_D_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(size_type size) │ │ │ │ │ -Resize the matrix. Invalidates the content! │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_T_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename BTDMatrix< B, A >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn btdmatrix.hh:207 │ │ │ │ │ +The type for the index access and the size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::ConstIterator ConstColIterator │ │ │ │ │ +Const iterator to the entries of a row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:741 │ │ │ │ │ +_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ +A vector of blocks with memory management. │ │ │ │ │ +DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +Exact subdomain solver using ILU(p) with appropriate p. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ +Sequential overlapping Schwarz preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:783 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_u_b_d_o_m_a_i_n___l_i_s_t │ │ │ │ │ +SLList< size_type, typename std::allocator_traits< TA >::template rebind_alloc< │ │ │ │ │ +size_type > > subdomain_list │ │ │ │ │ +The type for the row to subdomain mapping. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:800 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_l_u___v_e_c_t_o_r │ │ │ │ │ +std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc< │ │ │ │ │ +slu > > slu_vector │ │ │ │ │ +The vector type containing subdomain solvers. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:809 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The type of the matrix to precondition. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:760 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_M_o_d_e │ │ │ │ │ +TM Mode │ │ │ │ │ +The mode (additive or multiplicative) of the Schwarz method. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:778 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +X range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:770 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_u_b_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +std::set< size_type, std::less< size_type >, typename std::allocator_traits< TA │ │ │ │ │ +>::template rebind_alloc< size_type > > subdomain_type │ │ │ │ │ +The type for the subdomain to row index mapping. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:794 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:765 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_l_u │ │ │ │ │ +TD slu │ │ │ │ │ +The type for the subdomain solver in use. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:806 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:868 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, X &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:846 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Postprocess the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:861 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_a_l_l_o_c_a_t_o_r │ │ │ │ │ +TA allocator │ │ │ │ │ +The allocator to use. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:789 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ +std::vector< subdomain_type, typename std::allocator_traits< TA >::template │ │ │ │ │ +rebind_alloc< subdomain_type > > subdomain_vector │ │ │ │ │ +The vector type containing the subdomain to row index mapping. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:797 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_r_o_w_t_o_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ +std::vector< subdomain_list, typename std::allocator_traits< TA >::template │ │ │ │ │ +rebind_alloc< subdomain_list > > rowtodomain_vector │ │ │ │ │ +The vector type containing the row index to subdomain mapping. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:803 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +matrix_type::size_type size_type │ │ │ │ │ +The return type of the size method. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:786 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +Tag that the tells the Schwarz method to be additive. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +Tag that tells the Schwarz method to be multiplicative. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e │ │ │ │ │ +Tag that tells the Schwarz method to be multiplicative and symmetric. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +Exact subdomain solver using Dune::DynamicMatrix::solve. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ +void setSubMatrix(const M &BCRS, S &rowset) │ │ │ │ │ +Set the data of the local problem. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_a_p_p_l_y │ │ │ │ │ +void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d) │ │ │ │ │ +Apply the subdomain solver. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_:_:_r_i_l_u___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type rilu_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +matrix_type::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +BCRSMatrix< K, Al > matrix_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _B_C_R_S_M_a_t_r_i_x_<_ _K_, │ │ │ │ │ +_A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +range_type::block_type block_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +S< BCRSMatrix< T, A > >::range_type range_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:315 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +range_type::block_type block_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:317 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +range_type::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:316 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +matrix_type::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +BCRSMatrix< T, A > matrix_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:314 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:400 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +matrix_type::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:408 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +Y::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +Y::block_type block_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:406 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_I_L_U_B_a_s_e_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:402 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_: │ │ │ │ │ +_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ +OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X │ │ │ │ │ +&x) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:493 │ │ │ │ │ +_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r_<_ _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_: │ │ │ │ │ +_O_v_e_r_l_a_p_p_i_n_g_A_s_s_i_g_n_e_r_H_e_l_p_e_r │ │ │ │ │ +OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X │ │ │ │ │ +&x) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:512 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type │ │ │ │ │ +field_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_i_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:525 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:542 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:547 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_p_l_i_c_a_t_i_v_e_A_d_d_e_r_<_ _S_,_ _B_l_o_c_k_V_e_c_t_o_r_<_ _T_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type │ │ │ │ │ +field_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:548 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r │ │ │ │ │ +template meta program for choosing how to add the correction. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:572 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _A_d_d_i_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _>_:_:_A_d_d_e_r │ │ │ │ │ +AdditiveAdder< S, X > Adder │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:577 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _>_:_:_A_d_d_e_r │ │ │ │ │ +MultiplicativeAdder< S, X > Adder │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:583 │ │ │ │ │ +_D_u_n_e_:_:_A_d_d_e_r_S_e_l_e_c_t_o_r_<_ _S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _X_,_ _S_ _>_:_:_A_d_d_e_r │ │ │ │ │ +MultiplicativeAdder< S, X > Adder │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r │ │ │ │ │ +Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:605 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +static solver_iterator begin(solver_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:611 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_s_o_l_v_e_r___i_t_e_r_a_t_o_r │ │ │ │ │ +solver_vector::iterator solver_iterator │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:607 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ +static domain_iterator end(const subdomain_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:625 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_d_o_m_a_i_n___i_t_e_r_a_t_o_r │ │ │ │ │ +subdomain_vector::const_iterator domain_iterator │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:609 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_s_o_l_v_e_r___v_e_c_t_o_r │ │ │ │ │ +T1 solver_vector │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:606 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ +static domain_iterator begin(const subdomain_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:620 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ +T2 subdomain_vector │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:608 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ +static solver_iterator end(solver_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:616 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_s_u_b_d_o_m_a_i_n___v_e_c_t_o_r │ │ │ │ │ +T2 subdomain_vector │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:636 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_e_n_d │ │ │ │ │ +static solver_iterator end(solver_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:644 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_s_o_l_v_e_r___i_t_e_r_a_t_o_r │ │ │ │ │ +solver_vector::reverse_iterator solver_iterator │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:635 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_d_o_m_a_i_n___i_t_e_r_a_t_o_r │ │ │ │ │ +subdomain_vector::const_reverse_iterator domain_iterator │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:637 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_b_e_g_i_n │ │ │ │ │ +static solver_iterator begin(solver_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:639 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_s_o_l_v_e_r___v_e_c_t_o_r │ │ │ │ │ +T1 solver_vector │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:634 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_b_e_g_i_n │ │ │ │ │ +static domain_iterator begin(const subdomain_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:648 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_o_r_D_i_r_e_c_t_i_o_n_S_e_l_e_c_t_o_r_<_ _T_1_,_ _T_2_,_ _f_a_l_s_e_ _>_:_:_e_n_d │ │ │ │ │ +static domain_iterator end(const subdomain_vector &sv) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:653 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r │ │ │ │ │ +Helper template meta program for application of overlapping Schwarz. │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:669 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +smoother::range_type range_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:671 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_:_:_s_m_o_o_t_h_e_r │ │ │ │ │ +T smoother │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:670 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(smoother &sm, range_type &v, const range_type &b) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:673 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ +_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ +static void apply(smoother &sm, range_type &v, const range_type &b) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:685 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ +_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _>_:_:_s_m_o_o_t_h_e_r │ │ │ │ │ +SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > │ │ │ │ │ +smoother │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:682 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_p_p_l_i_e_r_<_ _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_<_ _M_,_ _X_, │ │ │ │ │ +_S_y_m_m_e_t_r_i_c_M_u_l_t_i_p_l_i_c_a_t_i_v_e_S_c_h_w_a_r_z_M_o_d_e_,_ _T_D_,_ _T_A_ _>_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +smoother::range_type range_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:683 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _D_y_n_a_m_i_c_M_a_t_r_i_x_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_< │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x_<_ _K_,_ _A_l_ _>_,_ _X_,_ _Y_ _>_,_ _f_a_l_s_e_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +BCRSMatrix< K, Al > matrix_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:702 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r_<_ _S_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_,_ _t_r_u_e_ _>_:_: │ │ │ │ │ +_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +BCRSMatrix< T, A > matrix_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:713 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:723 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_I_L_U_B_a_s_e_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:724 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1103 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_D_o_m_a_i_n_S_i_z_e_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_:_:_s_i_z_e │ │ │ │ │ +static int size(const Domain &d) │ │ │ │ │ +DDeeffiinniittiioonn overlappingschwarz.hh:1111 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00185.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: ilu.hh File Reference │ │ │ │ +dune-istl: bdmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,79 +71,45 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
ilu.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
bdmatrix.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

The incomplete LU factorization kernels. │ │ │ │ +

Implementation of the BDMatrix class. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <map>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ #include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/blocklevel.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::ILU::CRS< B, Alloc >
 a simple compressed row storage matrix class More...
class  Dune::BDMatrix< B, A >
 A block-diagonal matrix. More...
 
struct  Dune::FieldTraits< BDMatrix< B, A > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ILU
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class M >
void Dune::ILU::blockILU0Decomposition (M &A)
 compute ILU decomposition of A. A is overwritten by its decomposition
 
template<class M , class X , class Y >
void Dune::ILU::blockILUBacksolve (const M &A, X &v, const Y &d)
 LU backsolve with stored inverse.
 
template<class M >
M::field_type & Dune::ILU::firstMatrixElement (M &A, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
 
template<class K >
K & Dune::ILU::firstMatrixElement (K &A, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
 
template<class K , int n, int m>
K & Dune::ILU::firstMatrixElement (FieldMatrix< K, n, m > &A)
 
template<class M >
void Dune::ILU::blockILUDecomposition (const M &A, int n, M &ILU)
 
template<class M , class CRS , class InvVector >
void Dune::ILU::convertToCRS (const M &A, CRS &lower, CRS &upper, InvVector &inv)
 convert ILU decomposition into CRS format for lower and upper triangular and inverse.
 
template<class CRS , class InvVector , class X , class Y >
void Dune::ILU::blockILUBacksolve (const CRS &lower, const CRS &upper, const InvVector &inv, X &v, const Y &d)
 LU backsolve with stored inverse in CRS format for lower and upper triangular.
 
│ │ │ │

Detailed Description

│ │ │ │ -

The incomplete LU factorization kernels.

│ │ │ │ +

Implementation of the BDMatrix class.

│ │ │ │ +
Author
Oliver Sander
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,67 +1,30 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -ilu.hh File Reference │ │ │ │ │ -The incomplete LU factorization kernels. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +bdmatrix.hh File Reference │ │ │ │ │ +Implementation of the BDMatrix class. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_I_L_U_:_:_C_R_S_<_ _B_,_ _A_l_l_o_c_ _> │ │ │ │ │ -  a simple compressed row storage matrix class _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _> │ │ │ │ │ +  A block-diagonal matrix. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_I_L_U │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n (M &A) │ │ │ │ │ -  compute _I_L_U decomposition of A. A is overwritten by its │ │ │ │ │ - decomposition │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ -  LU backsolve with stored inverse. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -M::field_type &  _D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (M &A, typename std:: │ │ │ │ │ - enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - K &  _D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (K &A, typename std:: │ │ │ │ │ - enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - K &  _D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (_F_i_e_l_d_M_a_t_r_i_x< K, n, m > &A) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n (const M &A, int n, M &ILU) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S (const M &A, _C_R_S &lower, _C_R_S &upper, │ │ │ │ │ - InvVector &inv) │ │ │ │ │ -  convert _I_L_U decomposition into _C_R_S format for lower and upper │ │ │ │ │ - triangular and inverse. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const _C_R_S &lower, const _C_R_S │ │ │ │ │ - &upper, const InvVector &inv, X &v, const Y &d) │ │ │ │ │ -  LU backsolve with stored inverse in _C_R_S format for lower and │ │ │ │ │ - upper triangular. │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -The incomplete LU factorization kernels. │ │ │ │ │ +Implementation of the BDMatrix class. │ │ │ │ │ + Author │ │ │ │ │ + Oliver Sander │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: ilu.hh Source File │ │ │ │ +dune-istl: bdmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,475 +74,189 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
ilu.hh
│ │ │ │ +
bdmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_ILU_HH
│ │ │ │ -
6#define DUNE_ISTL_ILU_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_BDMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_BDMATRIX_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <complex>
│ │ │ │ -
10#include <map>
│ │ │ │ -
11#include <vector>
│ │ │ │ +
8#include <memory>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/rangeutilities.hh>
│ │ │ │ +
11#include <dune/common/scalarmatrixview.hh>
│ │ │ │
12
│ │ │ │ -
13#include <dune/common/fmatrix.hh>
│ │ │ │ -
14#include <dune/common/scalarvectorview.hh>
│ │ │ │ -
15#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -
16
│ │ │ │ -
17#include "istlexception.hh"
│ │ │ │ -
18
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24
│ │ │ │ -
│ │ │ │ -
29 namespace ILU {
│ │ │ │ -
30
│ │ │ │ -
32 template<class M>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34 {
│ │ │ │ -
35 // iterator types
│ │ │ │ -
36 typedef typename M::RowIterator rowiterator;
│ │ │ │ -
37 typedef typename M::ColIterator coliterator;
│ │ │ │ -
38 typedef typename M::block_type block;
│ │ │ │ -
39
│ │ │ │ -
40 // implement left looking variant with stored inverse
│ │ │ │ -
41 rowiterator endi=A.end();
│ │ │ │ -
42 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
43 {
│ │ │ │ -
44 // coliterator is diagonal after the following loop
│ │ │ │ -
45 coliterator endij=(*i).end(); // end of row i
│ │ │ │ -
46 coliterator ij;
│ │ │ │ -
47
│ │ │ │ -
48 // eliminate entries left of diagonal; store L factor
│ │ │ │ -
49 for (ij=(*i).begin(); ij.index()<i.index(); ++ij)
│ │ │ │ -
50 {
│ │ │ │ -
51 // find A_jj which eliminates A_ij
│ │ │ │ -
52 coliterator jj = A[ij.index()].find(ij.index());
│ │ │ │ -
53
│ │ │ │ -
54 // compute L_ij = A_jj^-1 * A_ij
│ │ │ │ -
55 Impl::asMatrix(*ij).rightmultiply(Impl::asMatrix(*jj));
│ │ │ │ + │ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
31 template <class B, class A=std::allocator<B> >
│ │ │ │ +
│ │ │ │ +
32 class BDMatrix : public BCRSMatrix<B,A>
│ │ │ │ +
33 {
│ │ │ │ +
34 public:
│ │ │ │ +
35
│ │ │ │ +
36 //===== type definitions and constants
│ │ │ │ +
37
│ │ │ │ +
39 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ +
40
│ │ │ │ +
42 typedef B block_type;
│ │ │ │ +
43
│ │ │ │ +
45 typedef A allocator_type;
│ │ │ │ +
46
│ │ │ │ +
48 //typedef BCRSMatrix<B,A>::row_type row_type;
│ │ │ │ +
49
│ │ │ │ +
51 typedef typename A::size_type size_type;
│ │ │ │ +
52
│ │ │ │ +
54 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
55 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │
56
│ │ │ │ -
57 // modify row
│ │ │ │ -
58 coliterator endjk=A[ij.index()].end(); // end of row j
│ │ │ │ -
59 coliterator jk=jj; ++jk;
│ │ │ │ -
60 coliterator ik=ij; ++ik;
│ │ │ │ -
61 while (ik!=endij && jk!=endjk)
│ │ │ │ -
62 if (ik.index()==jk.index())
│ │ │ │ -
63 {
│ │ │ │ -
64 block B(*jk);
│ │ │ │ -
65 Impl::asMatrix(B).leftmultiply(Impl::asMatrix(*ij));
│ │ │ │ -
66 *ik -= B;
│ │ │ │ -
67 ++ik; ++jk;
│ │ │ │ -
68 }
│ │ │ │ -
69 else
│ │ │ │ -
70 {
│ │ │ │ -
71 if (ik.index()<jk.index())
│ │ │ │ -
72 ++ik;
│ │ │ │ -
73 else
│ │ │ │ -
74 ++jk;
│ │ │ │ -
75 }
│ │ │ │ -
76 }
│ │ │ │ -
77
│ │ │ │ -
78 // invert pivot and store it in A
│ │ │ │ -
79 if (ij.index()!=i.index())
│ │ │ │ -
80 DUNE_THROW(ISTLError,"diagonal entry missing");
│ │ │ │ -
81 try {
│ │ │ │ -
82 Impl::asMatrix(*ij).invert(); // compute inverse of diagonal block
│ │ │ │ -
83 }
│ │ │ │ -
84 catch (Dune::FMatrixError & e) {
│ │ │ │ -
85 DUNE_THROW(MatrixBlockError, "ILU failed to invert matrix block A["
│ │ │ │ -
86 << i.index() << "][" << ij.index() << "]" << e.what();
│ │ │ │ -
87 th__ex.r=i.index(); th__ex.c=ij.index(););
│ │ │ │ -
88 }
│ │ │ │ -
89 }
│ │ │ │ -
90 }
│ │ │ │ -
│ │ │ │ -
91
│ │ │ │ -
93 template<class M, class X, class Y>
│ │ │ │ -
│ │ │ │ -
94 void blockILUBacksolve (const M& A, X& v, const Y& d)
│ │ │ │ -
95 {
│ │ │ │ -
96 // iterator types
│ │ │ │ -
97 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ -
98 typedef typename M::ConstColIterator coliterator;
│ │ │ │ -
99 typedef typename Y::block_type dblock;
│ │ │ │ -
100 typedef typename X::block_type vblock;
│ │ │ │ +
58 BDMatrix() : BCRSMatrix<B,A>() {}
│ │ │ │ +
59
│ │ │ │ +
│ │ │ │ +
60 explicit BDMatrix(int size)
│ │ │ │ +
61 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random) {
│ │ │ │ +
62
│ │ │ │ +
63 for (int i=0; i<size; i++)
│ │ │ │ + │ │ │ │ +
65
│ │ │ │ + │ │ │ │ +
67
│ │ │ │ +
68 for (int i=0; i<size; i++)
│ │ │ │ +
69 this->BCRSMatrix<B,A>::addindex(i, i);
│ │ │ │ +
70
│ │ │ │ + │ │ │ │ +
72
│ │ │ │ +
73 }
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
│ │ │ │ +
76 BDMatrix (std::initializer_list<B> const &list)
│ │ │ │ +
77 : BDMatrix(list.size())
│ │ │ │ +
78 {
│ │ │ │ +
79 size_t i=0;
│ │ │ │ +
80 for (auto it = list.begin(); it != list.end(); ++it, ++i)
│ │ │ │ +
81 (*this)[i][i] = *it;
│ │ │ │ +
82 }
│ │ │ │ +
│ │ │ │ +
83
│ │ │ │ +
│ │ │ │ +
85 void setSize(size_type size)
│ │ │ │ +
86 {
│ │ │ │ +
87 this->BCRSMatrix<B,A>::setSize(size, // rows
│ │ │ │ +
88 size, // columns
│ │ │ │ +
89 size); // nonzeros
│ │ │ │ +
90
│ │ │ │ +
91 for (auto i : range(size))
│ │ │ │ + │ │ │ │ +
93
│ │ │ │ + │ │ │ │ +
95
│ │ │ │ +
96 for (auto i : range(size))
│ │ │ │ +
97 this->BCRSMatrix<B,A>::addindex(i, i);
│ │ │ │ +
98
│ │ │ │ + │ │ │ │ +
100 }
│ │ │ │ +
│ │ │ │
101
│ │ │ │ -
102 // lower triangular solve
│ │ │ │ -
103 rowiterator endi=A.end();
│ │ │ │ -
104 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
105 {
│ │ │ │ -
106 // We need to be careful here: Directly using
│ │ │ │ -
107 // auto rhs = Impl::asVector(d[ i.index() ]);
│ │ │ │ -
108 // is not OK in case this is a proxy. Hence
│ │ │ │ -
109 // we first have to copy the value. Notice that
│ │ │ │ -
110 // this is still not OK, if the vector type itself returns
│ │ │ │ -
111 // proxy references.
│ │ │ │ -
112 dblock rhsValue(d[i.index()]);
│ │ │ │ -
113 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ -
114 for (coliterator j=(*i).begin(); j.index()<i.index(); ++j)
│ │ │ │ -
115 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
│ │ │ │ -
116 Impl::asVector(v[i.index()]) = rhs; // Lii = I
│ │ │ │ -
117 }
│ │ │ │ -
118
│ │ │ │ -
119 // upper triangular solve
│ │ │ │ -
120 rowiterator rendi=A.beforeBegin();
│ │ │ │ -
121 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
│ │ │ │ +
│ │ │ │ +
103 BDMatrix& operator= (const BDMatrix& other) {
│ │ │ │ +
104 this->BCRSMatrix<B,A>::operator=(other);
│ │ │ │ +
105 return *this;
│ │ │ │ +
106 }
│ │ │ │ +
│ │ │ │ +
107
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
111 return *this;
│ │ │ │ +
112 }
│ │ │ │ +
│ │ │ │ +
113
│ │ │ │ +
119 template <class V>
│ │ │ │ +
│ │ │ │ +
120 void solve (V& x, const V& rhs) const {
│ │ │ │ +
121 for (size_type i=0; i<this->N(); i++)
│ │ │ │
122 {
│ │ │ │ -
123 // We need to be careful here: Directly using
│ │ │ │ -
124 // auto rhs = Impl::asVector(v[ i.index() ]);
│ │ │ │ -
125 // is not OK in case this is a proxy. Hence
│ │ │ │ -
126 // we first have to copy the value. Notice that
│ │ │ │ -
127 // this is still not OK, if the vector type itself returns
│ │ │ │ -
128 // proxy references.
│ │ │ │ -
129 vblock rhsValue(v[i.index()]);
│ │ │ │ -
130 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ -
131 coliterator j;
│ │ │ │ -
132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
│ │ │ │ -
133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
│ │ │ │ -
134 auto&& vi = Impl::asVector(v[i.index()]);
│ │ │ │ -
135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse!
│ │ │ │ -
136 }
│ │ │ │ -
137 }
│ │ │ │ -
│ │ │ │ -
138
│ │ │ │ -
139 // recursive function template to access first entry of a matrix
│ │ │ │ -
140 template<class M>
│ │ │ │ -
│ │ │ │ -
141 typename M::field_type& firstMatrixElement (M& A,
│ │ │ │ -
142 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ -
143 {
│ │ │ │ -
144 return firstMatrixElement(*(A.begin()->begin()));
│ │ │ │ -
145 }
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
147 template<class K>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
149 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr)
│ │ │ │ -
150 {
│ │ │ │ -
151 return A;
│ │ │ │ -
152 }
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
154 template<class K, int n, int m>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 {
│ │ │ │ -
157 return A[0][0];
│ │ │ │ -
158 }
│ │ │ │ -
│ │ │ │ -
159
│ │ │ │ -
166 template<class M>
│ │ │ │ -
│ │ │ │ -
167 void blockILUDecomposition (const M& A, int n, M& ILU)
│ │ │ │ -
168 {
│ │ │ │ -
169 // iterator types
│ │ │ │ -
170 typedef typename M::ColIterator coliterator;
│ │ │ │ -
171 typedef typename M::ConstRowIterator crowiterator;
│ │ │ │ -
172 typedef typename M::ConstColIterator ccoliterator;
│ │ │ │ -
173 typedef typename M::CreateIterator createiterator;
│ │ │ │ -
174 typedef typename M::field_type K;
│ │ │ │ -
175 typedef std::map<size_t, int> map;
│ │ │ │ -
176 typedef typename map::iterator mapiterator;
│ │ │ │ -
177
│ │ │ │ -
178 // symbolic factorization phase, store generation number in first matrix element
│ │ │ │ -
179 crowiterator endi=A.end();
│ │ │ │ -
180 createiterator ci=ILU.createbegin();
│ │ │ │ -
181 for (crowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
182 {
│ │ │ │ -
183 map rowpattern; // maps column index to generation
│ │ │ │ -
184
│ │ │ │ -
185 // initialize pattern with row of A
│ │ │ │ -
186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)
│ │ │ │ -
187 rowpattern[j.index()] = 0;
│ │ │ │ -
188
│ │ │ │ -
189 // eliminate entries in row which are to the left of the diagonal
│ │ │ │ -
190 for (mapiterator ik=rowpattern.begin(); (*ik).first<i.index(); ++ik)
│ │ │ │ -
191 {
│ │ │ │ -
192 if ((*ik).second<n)
│ │ │ │ -
193 {
│ │ │ │ -
194 coliterator endk = ILU[(*ik).first].end(); // end of row k
│ │ │ │ -
195 coliterator kj = ILU[(*ik).first].find((*ik).first); // diagonal in k
│ │ │ │ -
196 for (++kj; kj!=endk; ++kj) // row k eliminates in row i
│ │ │ │ -
197 {
│ │ │ │ -
198 // we misuse the storage to store an int. If the field_type is std::complex, we have to access the real/abs part
│ │ │ │ -
199 // starting from C++11, we can use std::abs to always return a real value, even if it is double/float
│ │ │ │ -
200 using std::abs;
│ │ │ │ -
201 int generation = (int) Simd::lane(0, abs( firstMatrixElement(*kj) ));
│ │ │ │ -
202 if (generation<n)
│ │ │ │ -
203 {
│ │ │ │ -
204 mapiterator ij = rowpattern.find(kj.index());
│ │ │ │ -
205 if (ij==rowpattern.end())
│ │ │ │ -
206 {
│ │ │ │ -
207 rowpattern[kj.index()] = generation+1;
│ │ │ │ -
208 }
│ │ │ │ -
209 }
│ │ │ │ -
210 }
│ │ │ │ -
211 }
│ │ │ │ -
212 }
│ │ │ │ -
213
│ │ │ │ -
214 // create row
│ │ │ │ -
215 for (mapiterator ik=rowpattern.begin(); ik!=rowpattern.end(); ++ik)
│ │ │ │ -
216 ci.insert((*ik).first);
│ │ │ │ -
217 ++ci; // now row i exist
│ │ │ │ -
218
│ │ │ │ -
219 // write generation index into entries
│ │ │ │ -
220 coliterator endILUij = ILU[i.index()].end();;
│ │ │ │ -
221 for (coliterator ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
│ │ │ │ -
222 Simd::lane(0, firstMatrixElement(*ILUij)) = (Simd::Scalar<K>) rowpattern[ILUij.index()];
│ │ │ │ -
223 }
│ │ │ │ -
224
│ │ │ │ -
225 // copy entries of A
│ │ │ │ -
226 for (crowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ -
227 {
│ │ │ │ -
228 coliterator ILUij;
│ │ │ │ -
229 coliterator endILUij = ILU[i.index()].end();;
│ │ │ │ -
230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
│ │ │ │ -
231 (*ILUij) = 0; // clear row
│ │ │ │ -
232 ccoliterator Aij = (*i).begin();
│ │ │ │ -
233 ccoliterator endAij = (*i).end();
│ │ │ │ -
234 ILUij = ILU[i.index()].begin();
│ │ │ │ -
235 while (Aij!=endAij && ILUij!=endILUij)
│ │ │ │ -
236 {
│ │ │ │ -
237 if (Aij.index()==ILUij.index())
│ │ │ │ -
238 {
│ │ │ │ -
239 *ILUij = *Aij;
│ │ │ │ -
240 ++Aij; ++ILUij;
│ │ │ │ -
241 }
│ │ │ │ -
242 else
│ │ │ │ -
243 {
│ │ │ │ -
244 if (Aij.index()<ILUij.index())
│ │ │ │ -
245 ++Aij;
│ │ │ │ -
246 else
│ │ │ │ -
247 ++ILUij;
│ │ │ │ -
248 }
│ │ │ │ -
249 }
│ │ │ │ -
250 }
│ │ │ │ -
251
│ │ │ │ -
252 // call decomposition on pattern
│ │ │ │ - │ │ │ │ -
254 }
│ │ │ │ -
│ │ │ │ -
255
│ │ │ │ -
257 template <class B, class Alloc = std::allocator<B>>
│ │ │ │ -
│ │ │ │ -
258 struct CRS
│ │ │ │ -
259 {
│ │ │ │ -
260 typedef B block_type;
│ │ │ │ -
261 typedef size_t size_type;
│ │ │ │ -
262
│ │ │ │ -
263 CRS() : nRows_( 0 ) {}
│ │ │ │ -
264
│ │ │ │ -
265 size_type rows() const { return nRows_; }
│ │ │ │ -
266
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
268 {
│ │ │ │ -
269 assert( rows_[ rows() ] != size_type(-1) );
│ │ │ │ -
270 return rows_[ rows() ];
│ │ │ │ -
271 }
│ │ │ │ -
│ │ │ │ -
272
│ │ │ │ -
│ │ │ │ -
273 void resize( const size_type nRows )
│ │ │ │ -
274 {
│ │ │ │ -
275 if( nRows_ != nRows )
│ │ │ │ -
276 {
│ │ │ │ -
277 nRows_ = nRows ;
│ │ │ │ -
278 rows_.resize( nRows_+1, size_type(-1) );
│ │ │ │ -
279 }
│ │ │ │ -
280 }
│ │ │ │ -
│ │ │ │ -
281
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
283 {
│ │ │ │ -
284 const size_type needed = values_.size() + nonZeros ;
│ │ │ │ -
285 if( values_.capacity() < needed )
│ │ │ │ -
286 {
│ │ │ │ -
287 const size_type estimate = needed * 1.1;
│ │ │ │ -
288 values_.reserve( estimate );
│ │ │ │ -
289 cols_.reserve( estimate );
│ │ │ │ -
290 }
│ │ │ │ -
291 }
│ │ │ │ -
│ │ │ │ -
292
│ │ │ │ -
│ │ │ │ -
293 void push_back( const block_type& value, const size_type index )
│ │ │ │ -
294 {
│ │ │ │ -
295 values_.push_back( value );
│ │ │ │ -
296 cols_.push_back( index );
│ │ │ │ -
297 }
│ │ │ │ -
│ │ │ │ -
298
│ │ │ │ -
299 std::vector< size_type > rows_;
│ │ │ │ -
300 std::vector< block_type, Alloc> values_;
│ │ │ │ -
301 std::vector< size_type > cols_;
│ │ │ │ - │ │ │ │ -
303 };
│ │ │ │ -
│ │ │ │ -
304
│ │ │ │ -
306 template<class M, class CRS, class InvVector>
│ │ │ │ -
│ │ │ │ -
307 void convertToCRS(const M& A, CRS& lower, CRS& upper, InvVector& inv )
│ │ │ │ -
308 {
│ │ │ │ -
309 typedef typename M :: size_type size_type;
│ │ │ │ -
310
│ │ │ │ -
311 lower.resize( A.N() );
│ │ │ │ -
312 upper.resize( A.N() );
│ │ │ │ -
313 inv.resize( A.N() );
│ │ │ │ -
314
│ │ │ │ -
315 // lower and upper triangular should store half of non zeros minus diagonal
│ │ │ │ -
316 const size_t memEstimate = (A.nonzeroes() - A.N())/2;
│ │ │ │ -
317
│ │ │ │ -
318 assert( A.nonzeroes() != 0 );
│ │ │ │ -
319 lower.reserveAdditional( memEstimate );
│ │ │ │ -
320 upper.reserveAdditional( memEstimate );
│ │ │ │ -
321
│ │ │ │ -
322 const auto endi = A.end();
│ │ │ │ -
323 size_type row = 0;
│ │ │ │ -
324 size_type colcount = 0;
│ │ │ │ -
325 lower.rows_[ 0 ] = colcount;
│ │ │ │ -
326 for (auto i=A.begin(); i!=endi; ++i, ++row)
│ │ │ │ -
327 {
│ │ │ │ -
328 const size_type iIndex = i.index();
│ │ │ │ -
329
│ │ │ │ -
330 // store entries left of diagonal
│ │ │ │ -
331 for (auto j=(*i).begin(); j.index() < iIndex; ++j )
│ │ │ │ -
332 {
│ │ │ │ -
333 lower.push_back( (*j), j.index() );
│ │ │ │ -
334 ++colcount;
│ │ │ │ -
335 }
│ │ │ │ -
336 lower.rows_[ iIndex+1 ] = colcount;
│ │ │ │ -
337 }
│ │ │ │ -
338
│ │ │ │ -
339 const auto rendi = A.beforeBegin();
│ │ │ │ -
340 row = 0;
│ │ │ │ -
341 colcount = 0;
│ │ │ │ -
342 upper.rows_[ 0 ] = colcount ;
│ │ │ │ -
343
│ │ │ │ -
344 // NOTE: upper and inv store entries in reverse row and col order,
│ │ │ │ -
345 // reverse here relative to ILU
│ │ │ │ -
346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row )
│ │ │ │ -
347 {
│ │ │ │ -
348 const auto endij=(*i).beforeBegin(); // end of row i
│ │ │ │ -
349
│ │ │ │ -
350 const size_type iIndex = i.index();
│ │ │ │ -
351
│ │ │ │ -
352 // store in reverse row order for faster access during backsolve
│ │ │ │ -
353 for (auto j=(*i).beforeEnd(); j != endij; --j )
│ │ │ │ -
354 {
│ │ │ │ -
355 const size_type jIndex = j.index();
│ │ │ │ -
356 if( j.index() == iIndex )
│ │ │ │ -
357 {
│ │ │ │ -
358 inv[ row ] = (*j);
│ │ │ │ -
359 break; // assuming consecutive ordering of A
│ │ │ │ -
360 }
│ │ │ │ -
361 else if ( j.index() >= i.index() )
│ │ │ │ -
362 {
│ │ │ │ -
363 upper.push_back( (*j), jIndex );
│ │ │ │ -
364 ++colcount ;
│ │ │ │ -
365 }
│ │ │ │ -
366 }
│ │ │ │ -
367 upper.rows_[ row+1 ] = colcount;
│ │ │ │ -
368 }
│ │ │ │ -
369 } // end convertToCRS
│ │ │ │ -
│ │ │ │ -
370
│ │ │ │ -
372 template<class CRS, class InvVector, class X, class Y>
│ │ │ │ -
│ │ │ │ -
373 void blockILUBacksolve (const CRS& lower,
│ │ │ │ -
374 const CRS& upper,
│ │ │ │ -
375 const InvVector& inv,
│ │ │ │ -
376 X& v, const Y& d)
│ │ │ │ -
377 {
│ │ │ │ -
378 // iterator types
│ │ │ │ -
379 typedef typename Y :: block_type dblock;
│ │ │ │ -
380 typedef typename X :: block_type vblock;
│ │ │ │ -
381 typedef typename X :: size_type size_type ;
│ │ │ │ -
382
│ │ │ │ -
383 const size_type iEnd = lower.rows();
│ │ │ │ -
384 const size_type lastRow = iEnd - 1;
│ │ │ │ -
385 if( iEnd != upper.rows() )
│ │ │ │ -
386 {
│ │ │ │ -
387 DUNE_THROW(ISTLError,"ILU::blockILUBacksolve: lower and upper rows must be the same");
│ │ │ │ -
388 }
│ │ │ │ -
389
│ │ │ │ -
390 // lower triangular solve
│ │ │ │ -
391 for( size_type i=0; i<iEnd; ++ i )
│ │ │ │ -
392 {
│ │ │ │ -
393 dblock rhsValue( d[ i ] );
│ │ │ │ -
394 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ -
395 const size_type rowI = lower.rows_[ i ];
│ │ │ │ -
396 const size_type rowINext = lower.rows_[ i+1 ];
│ │ │ │ -
397
│ │ │ │ -
398 for( size_type col = rowI; col < rowINext; ++ col )
│ │ │ │ -
399 Impl::asMatrix(lower.values_[ col ]).mmv( Impl::asVector(v[ lower.cols_[ col ] ] ), rhs );
│ │ │ │ -
400
│ │ │ │ -
401 Impl::asVector(v[ i ]) = rhs; // Lii = I
│ │ │ │ -
402 }
│ │ │ │ -
403
│ │ │ │ -
404 // upper triangular solve
│ │ │ │ -
405 for( size_type i=0; i<iEnd; ++ i )
│ │ │ │ -
406 {
│ │ │ │ -
407 auto&& vBlock = Impl::asVector(v[ lastRow - i ]);
│ │ │ │ -
408 vblock rhsValue ( v[ lastRow - i ] );
│ │ │ │ -
409 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ -
410 const size_type rowI = upper.rows_[ i ];
│ │ │ │ -
411 const size_type rowINext = upper.rows_[ i+1 ];
│ │ │ │ -
412
│ │ │ │ -
413 for( size_type col = rowI; col < rowINext; ++ col )
│ │ │ │ -
414 Impl::asMatrix(upper.values_[ col ]).mmv( Impl::asVector(v[ upper.cols_[ col ] ]), rhs );
│ │ │ │ -
415
│ │ │ │ -
416 // apply inverse and store result
│ │ │ │ -
417 Impl::asMatrix(inv[ i ]).mv(rhs, vBlock);
│ │ │ │ -
418 }
│ │ │ │ -
419 }
│ │ │ │ -
│ │ │ │ -
420
│ │ │ │ -
421 } // end namespace ILU
│ │ │ │ -
│ │ │ │ -
422
│ │ │ │ -
425} // end namespace
│ │ │ │ -
426
│ │ │ │ -
427#endif
│ │ │ │ - │ │ │ │ +
123 auto&& xv = Impl::asVector(x[i]);
│ │ │ │ +
124 auto&& rhsv = Impl::asVector(rhs[i]);
│ │ │ │ +
125 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv);
│ │ │ │ +
126 }
│ │ │ │ +
127 }
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
│ │ │ │ +
130 void invert() {
│ │ │ │ +
131 for (size_type i=0; i<this->N(); i++)
│ │ │ │ +
132 Impl::asMatrix((*this)[i][i]).invert();
│ │ │ │ +
133 }
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
135 private:
│ │ │ │ +
136
│ │ │ │ +
137 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ +
138 // The following methods from the base class should now actually be called
│ │ │ │ +
139 // ////////////////////////////////////////////////////////////////////////////
│ │ │ │ +
140
│ │ │ │ +
141 // createbegin and createend should be in there, too, but I can't get it to compile
│ │ │ │ +
142 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
│ │ │ │ +
143 // BCRSMatrix<B,A>::CreateIterator createend () {}
│ │ │ │ +
144 void setrowsize (size_type i, size_type s) {}
│ │ │ │ +
145 void incrementrowsize (size_type i) {}
│ │ │ │ +
146 void endrowsizes () {}
│ │ │ │ +
147 void addindex (size_type row, size_type col) {}
│ │ │ │ +
148 void endindices () {}
│ │ │ │ +
149 };
│ │ │ │ +
│ │ │ │ +
150
│ │ │ │ +
151 template<typename B, typename A>
│ │ │ │ +
│ │ │ │ +
152 struct FieldTraits< BDMatrix<B, A> >
│ │ │ │ +
153 {
│ │ │ │ + │ │ │ │ +
155 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
156 };
│ │ │ │ +
│ │ │ │ +
159} // end namespace Dune
│ │ │ │ +
160
│ │ │ │ +
161#endif
│ │ │ │ +
Helper functions for determining the vector/matrix block level.
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv)
convert ILU decomposition into CRS format for lower and upper triangular and inverse.
Definition ilu.hh:307
│ │ │ │ -
void blockILUBacksolve(const M &A, X &v, const Y &d)
LU backsolve with stored inverse.
Definition ilu.hh:94
│ │ │ │ -
M::field_type & firstMatrixElement(M &A, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
Definition ilu.hh:141
│ │ │ │ -
void blockILU0Decomposition(M &A)
compute ILU decomposition of A. A is overwritten by its decomposition
Definition ilu.hh:33
│ │ │ │ -
void blockILUDecomposition(const M &A, int n, M &ILU)
Definition ilu.hh:167
│ │ │ │ -
a simple compressed row storage matrix class
Definition ilu.hh:259
│ │ │ │ -
std::vector< size_type > cols_
Definition ilu.hh:301
│ │ │ │ -
size_type nonZeros() const
Definition ilu.hh:267
│ │ │ │ -
void resize(const size_type nRows)
Definition ilu.hh:273
│ │ │ │ -
size_type rows() const
Definition ilu.hh:265
│ │ │ │ -
CRS()
Definition ilu.hh:263
│ │ │ │ -
void reserveAdditional(const size_type nonZeros)
Definition ilu.hh:282
│ │ │ │ -
B block_type
Definition ilu.hh:260
│ │ │ │ -
std::vector< block_type, Alloc > values_
Definition ilu.hh:300
│ │ │ │ -
size_type nRows_
Definition ilu.hh:302
│ │ │ │ -
size_t size_type
Definition ilu.hh:261
│ │ │ │ -
std::vector< size_type > rows_
Definition ilu.hh:299
│ │ │ │ -
void push_back(const block_type &value, const size_type index)
Definition ilu.hh:293
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
Error when performing an operation on a matrix block.
Definition istlexception.hh:52
│ │ │ │ -
Definition matrixutils.hh:27
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
void endrowsizes()
indicate that size of all rows is defined
Definition bcrsmatrix.hh:1149
│ │ │ │ +
@ random
Build entries randomly.
Definition bcrsmatrix.hh:530
│ │ │ │ +
void endindices()
indicate that all indices are defined, check consistency
Definition bcrsmatrix.hh:1248
│ │ │ │ +
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ +
void setSize(size_type rows, size_type columns, size_type nnz=0)
Set the size of the matrix.
Definition bcrsmatrix.hh:861
│ │ │ │ +
BCRSMatrix & operator=(const BCRSMatrix &Mat)
assignment
Definition bcrsmatrix.hh:911
│ │ │ │ +
A block-diagonal matrix.
Definition bdmatrix.hh:33
│ │ │ │ +
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bdmatrix.hh:39
│ │ │ │ +
A::size_type size_type
implement row_type with compressed vector
Definition bdmatrix.hh:51
│ │ │ │ +
BDMatrix()
Default constructor.
Definition bdmatrix.hh:58
│ │ │ │ +
BDMatrix(std::initializer_list< B > const &list)
Construct from a std::initializer_list.
Definition bdmatrix.hh:76
│ │ │ │ +
B block_type
export the type representing the components
Definition bdmatrix.hh:42
│ │ │ │ +
void solve(V &x, const V &rhs) const
Solve the system Ax=b in O(n) time.
Definition bdmatrix.hh:120
│ │ │ │ +
A allocator_type
export the allocator type
Definition bdmatrix.hh:45
│ │ │ │ +
BDMatrix(int size)
Definition bdmatrix.hh:60
│ │ │ │ +
BDMatrix & operator=(const BDMatrix &other)
assignment
Definition bdmatrix.hh:103
│ │ │ │ +
static constexpr unsigned int blocklevel
increment block level counter
Definition bdmatrix.hh:55
│ │ │ │ +
void setSize(size_type size)
Resize the matrix. Invalidates the content!
Definition bdmatrix.hh:85
│ │ │ │ +
void invert()
Inverts the matrix.
Definition bdmatrix.hh:130
│ │ │ │ +
typename BDMatrix< B, A >::field_type field_type
Definition bdmatrix.hh:154
│ │ │ │ +
typename FieldTraits< field_type >::real_type real_type
Definition bdmatrix.hh:155
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,499 +1,234 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -ilu.hh │ │ │ │ │ +bdmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_ILU_HH │ │ │ │ │ -6#define DUNE_ISTL_ILU_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_BDMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_BDMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -18 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ -24 │ │ │ │ │ -_2_9 namespace ILU { │ │ │ │ │ -30 │ │ │ │ │ -32 template │ │ │ │ │ -_3_3 void _b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n (M& A) │ │ │ │ │ -34 { │ │ │ │ │ -35 // iterator types │ │ │ │ │ -36 typedef typename M::RowIterator rowiterator; │ │ │ │ │ -37 typedef typename M::ColIterator coliterator; │ │ │ │ │ -38 typedef typename M::block_type block; │ │ │ │ │ -39 │ │ │ │ │ -40 // implement left looking variant with stored inverse │ │ │ │ │ -41 rowiterator endi=A.end(); │ │ │ │ │ -42 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -43 { │ │ │ │ │ -44 // coliterator is diagonal after the following loop │ │ │ │ │ -45 coliterator endij=(*i).end(); // end of row i │ │ │ │ │ -46 coliterator ij; │ │ │ │ │ -47 │ │ │ │ │ -48 // eliminate entries left of diagonal; store L factor │ │ │ │ │ -49 for (ij=(*i).begin(); ij.index() │ │ │ │ │ +14#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +21namespace _D_u_n_e { │ │ │ │ │ +31 template > │ │ │ │ │ +_3_2 class _B_D_M_a_t_r_i_x : public _B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +33 { │ │ │ │ │ +34 public: │ │ │ │ │ +35 │ │ │ │ │ +36 //===== type definitions and constants │ │ │ │ │ +37 │ │ │ │ │ +_3_9 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ +40 │ │ │ │ │ +_4_2 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +43 │ │ │ │ │ +_4_5 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ +46 │ │ │ │ │ +48 //typedef BCRSMatrix::row_type row_type; │ │ │ │ │ +49 │ │ │ │ │ +_5_1 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +52 │ │ │ │ │ +54 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]] │ │ │ │ │ +_5_5 static constexpr unsigned int _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ 56 │ │ │ │ │ -57 // modify row │ │ │ │ │ -58 coliterator endjk=A[ij.index()].end(); // end of row j │ │ │ │ │ -59 coliterator jk=jj; ++jk; │ │ │ │ │ -60 coliterator ik=ij; ++ik; │ │ │ │ │ -61 while (ik!=endij && jk!=endjk) │ │ │ │ │ -62 if (ik.index()==jk.index()) │ │ │ │ │ -63 { │ │ │ │ │ -64 block B(*jk); │ │ │ │ │ -65 Impl::asMatrix(B).leftmultiply(Impl::asMatrix(*ij)); │ │ │ │ │ -66 *ik -= B; │ │ │ │ │ -67 ++ik; ++jk; │ │ │ │ │ -68 } │ │ │ │ │ -69 else │ │ │ │ │ -70 { │ │ │ │ │ -71 if (ik.index() │ │ │ │ │ -_9_4 void _b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ -95 { │ │ │ │ │ -96 // iterator types │ │ │ │ │ -97 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ -98 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ -99 typedef typename Y::block_type dblock; │ │ │ │ │ -100 typedef typename X::block_type vblock; │ │ │ │ │ +_5_8 _B_D_M_a_t_r_i_x() : _B_C_R_S_M_a_t_r_i_x() {} │ │ │ │ │ +59 │ │ │ │ │ +_6_0 explicit _B_D_M_a_t_r_i_x(int size) │ │ │ │ │ +61 : _B_C_R_S_M_a_t_r_i_x(size, size, _B_C_R_S_M_a_t_r_i_x::_r_a_n_d_o_m) { │ │ │ │ │ +62 │ │ │ │ │ +63 for (int i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 1); │ │ │ │ │ +65 │ │ │ │ │ +66 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ +67 │ │ │ │ │ +68 for (int i=0; i_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i); │ │ │ │ │ +70 │ │ │ │ │ +71 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ +72 │ │ │ │ │ +73 } │ │ │ │ │ +74 │ │ │ │ │ +_7_6 _B_D_M_a_t_r_i_x (std::initializer_list const &list) │ │ │ │ │ +77 : _B_D_M_a_t_r_i_x(list.size()) │ │ │ │ │ +78 { │ │ │ │ │ +79 size_t i=0; │ │ │ │ │ +80 for (auto it = list.begin(); it != list.end(); ++it, ++i) │ │ │ │ │ +81 (*this)[i][i] = *it; │ │ │ │ │ +82 } │ │ │ │ │ +83 │ │ │ │ │ +_8_5 void _s_e_t_S_i_z_e(_s_i_z_e___t_y_p_e size) │ │ │ │ │ +86 { │ │ │ │ │ +87 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_S_i_z_e(size, // rows │ │ │ │ │ +88 size, // columns │ │ │ │ │ +89 size); // nonzeros │ │ │ │ │ +90 │ │ │ │ │ +91 for (auto i : range(size)) │ │ │ │ │ +92 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_s_e_t_r_o_w_s_i_z_e(i, 1); │ │ │ │ │ +93 │ │ │ │ │ +94 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_r_o_w_s_i_z_e_s(); │ │ │ │ │ +95 │ │ │ │ │ +96 for (auto i : range(size)) │ │ │ │ │ +97 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_a_d_d_i_n_d_e_x(i, i); │ │ │ │ │ +98 │ │ │ │ │ +99 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_e_n_d_i_n_d_i_c_e_s(); │ │ │ │ │ +100 } │ │ │ │ │ 101 │ │ │ │ │ -102 // lower triangular solve │ │ │ │ │ -103 rowiterator endi=A.end(); │ │ │ │ │ -104 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -105 { │ │ │ │ │ -106 // We need to be careful here: Directly using │ │ │ │ │ -107 // auto rhs = Impl::asVector(d[ i.index() ]); │ │ │ │ │ -108 // is not OK in case this is a proxy. Hence │ │ │ │ │ -109 // we first have to copy the value. Notice that │ │ │ │ │ -110 // this is still not OK, if the vector type itself returns │ │ │ │ │ -111 // proxy references. │ │ │ │ │ -112 dblock rhsValue(d[i.index()]); │ │ │ │ │ -113 auto&& rhs = Impl::asVector(rhsValue); │ │ │ │ │ -114 for (coliterator j=(*i).begin(); j.index()_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(other); │ │ │ │ │ +105 return *this; │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +_1_0_9 _B_D_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) { │ │ │ │ │ +110 this->_B_C_R_S_M_a_t_r_i_x_<_B_,_A_>_:_:_o_p_e_r_a_t_o_r_=(k); │ │ │ │ │ +111 return *this; │ │ │ │ │ +112 } │ │ │ │ │ +113 │ │ │ │ │ +119 template │ │ │ │ │ +_1_2_0 void _s_o_l_v_e (V& x, const V& rhs) const { │ │ │ │ │ +121 for (_s_i_z_e___t_y_p_e i=0; i_N(); i++) │ │ │ │ │ 122 { │ │ │ │ │ -123 // We need to be careful here: Directly using │ │ │ │ │ -124 // auto rhs = Impl::asVector(v[ i.index() ]); │ │ │ │ │ -125 // is not OK in case this is a proxy. Hence │ │ │ │ │ -126 // we first have to copy the value. Notice that │ │ │ │ │ -127 // this is still not OK, if the vector type itself returns │ │ │ │ │ -128 // proxy references. │ │ │ │ │ -129 vblock rhsValue(v[i.index()]); │ │ │ │ │ -130 auto&& rhs = Impl::asVector(rhsValue); │ │ │ │ │ -131 coliterator j; │ │ │ │ │ -132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j) │ │ │ │ │ -133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs); │ │ │ │ │ -134 auto&& vi = Impl::asVector(v[i.index()]); │ │ │ │ │ -135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse! │ │ │ │ │ -136 } │ │ │ │ │ -137 } │ │ │ │ │ -138 │ │ │ │ │ -139 // recursive function template to access first entry of a matrix │ │ │ │ │ -140 template │ │ │ │ │ -_1_4_1 typename M::field_type& _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (M& A, │ │ │ │ │ -142 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ -sfinae = nullptr) │ │ │ │ │ -143 { │ │ │ │ │ -144 return _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t(*(A.begin()->begin())); │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ -147 template │ │ │ │ │ -_1_4_8 K& _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (K& A, │ │ │ │ │ -149 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ -sfinae = nullptr) │ │ │ │ │ -150 { │ │ │ │ │ -151 return A; │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -154 template │ │ │ │ │ -_1_5_5 K& _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (_F_i_e_l_d_M_a_t_r_i_x_<_K_,_n_,_m_>& A) │ │ │ │ │ -156 { │ │ │ │ │ -157 return A[0][0]; │ │ │ │ │ -158 } │ │ │ │ │ -159 │ │ │ │ │ -166 template │ │ │ │ │ -_1_6_7 void _b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n (const M& A, int n, M& ILU) │ │ │ │ │ -168 { │ │ │ │ │ -169 // iterator types │ │ │ │ │ -170 typedef typename M::ColIterator coliterator; │ │ │ │ │ -171 typedef typename M::ConstRowIterator crowiterator; │ │ │ │ │ -172 typedef typename M::ConstColIterator ccoliterator; │ │ │ │ │ -173 typedef typename M::CreateIterator createiterator; │ │ │ │ │ -174 typedef typename M::field_type K; │ │ │ │ │ -175 typedef std::map map; │ │ │ │ │ -176 typedef typename map::iterator mapiterator; │ │ │ │ │ -177 │ │ │ │ │ -178 // symbolic factorization phase, store generation number in first matrix │ │ │ │ │ -element │ │ │ │ │ -179 crowiterator endi=A.end(); │ │ │ │ │ -180 createiterator ci=ILU.createbegin(); │ │ │ │ │ -181 for (crowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -182 { │ │ │ │ │ -183 map rowpattern; // maps column index to generation │ │ │ │ │ -184 │ │ │ │ │ -185 // initialize pattern with row of A │ │ │ │ │ -186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j) │ │ │ │ │ -187 rowpattern[j.index()] = 0; │ │ │ │ │ -188 │ │ │ │ │ -189 // eliminate entries in row which are to the left of the diagonal │ │ │ │ │ -190 for (mapiterator ik=rowpattern.begin(); (*ik).first) rowpattern │ │ │ │ │ -[ILUij.index()]; │ │ │ │ │ -223 } │ │ │ │ │ -224 │ │ │ │ │ -225 // copy entries of A │ │ │ │ │ -226 for (crowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ -227 { │ │ │ │ │ -228 coliterator ILUij; │ │ │ │ │ -229 coliterator endILUij = ILU[i.index()].end();; │ │ │ │ │ -230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij) │ │ │ │ │ -231 (*ILUij) = 0; // clear row │ │ │ │ │ -232 ccoliterator Aij = (*i).begin(); │ │ │ │ │ -233 ccoliterator endAij = (*i).end(); │ │ │ │ │ -234 ILUij = ILU[i.index()].begin(); │ │ │ │ │ -235 while (Aij!=endAij && ILUij!=endILUij) │ │ │ │ │ -236 { │ │ │ │ │ -237 if (Aij.index()==ILUij.index()) │ │ │ │ │ -238 { │ │ │ │ │ -239 *ILUij = *Aij; │ │ │ │ │ -240 ++Aij; ++ILUij; │ │ │ │ │ -241 } │ │ │ │ │ -242 else │ │ │ │ │ -243 { │ │ │ │ │ -244 if (Aij.index()> │ │ │ │ │ -_2_5_8 struct _C_R_S │ │ │ │ │ -259 { │ │ │ │ │ -_2_6_0 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -_2_6_1 typedef size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -262 │ │ │ │ │ -_2_6_3 _C_R_S() : _n_R_o_w_s__( 0 ) {} │ │ │ │ │ -264 │ │ │ │ │ -_2_6_5 _s_i_z_e___t_y_p_e _r_o_w_s() const { return _n_R_o_w_s__; } │ │ │ │ │ -266 │ │ │ │ │ -_2_6_7 _s_i_z_e___t_y_p_e _n_o_n_Z_e_r_o_s() const │ │ │ │ │ -268 { │ │ │ │ │ -269 assert( _r_o_w_s__[ _r_o_w_s() ] != _s_i_z_e___t_y_p_e(-1) ); │ │ │ │ │ -270 return _r_o_w_s__[ _r_o_w_s() ]; │ │ │ │ │ -271 } │ │ │ │ │ -272 │ │ │ │ │ -_2_7_3 void _r_e_s_i_z_e( const _s_i_z_e___t_y_p_e nRows ) │ │ │ │ │ -274 { │ │ │ │ │ -275 if( _n_R_o_w_s__ != nRows ) │ │ │ │ │ -276 { │ │ │ │ │ -277 _n_R_o_w_s__ = nRows ; │ │ │ │ │ -278 _r_o_w_s__.resize( _n_R_o_w_s__+1, _s_i_z_e___t_y_p_e(-1) ); │ │ │ │ │ -279 } │ │ │ │ │ -280 } │ │ │ │ │ -281 │ │ │ │ │ -_2_8_2 void _r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l( const _s_i_z_e___t_y_p_e _n_o_n_Z_e_r_o_s ) │ │ │ │ │ -283 { │ │ │ │ │ -284 const _s_i_z_e___t_y_p_e needed = _v_a_l_u_e_s__.size() + _n_o_n_Z_e_r_o_s ; │ │ │ │ │ -285 if( _v_a_l_u_e_s__.capacity() < needed ) │ │ │ │ │ -286 { │ │ │ │ │ -287 const _s_i_z_e___t_y_p_e estimate = needed * 1.1; │ │ │ │ │ -288 _v_a_l_u_e_s__.reserve( estimate ); │ │ │ │ │ -289 _c_o_l_s__.reserve( estimate ); │ │ │ │ │ -290 } │ │ │ │ │ -291 } │ │ │ │ │ -292 │ │ │ │ │ -_2_9_3 void _p_u_s_h___b_a_c_k( const _b_l_o_c_k___t_y_p_e& value, const _s_i_z_e___t_y_p_e index ) │ │ │ │ │ -294 { │ │ │ │ │ -295 _v_a_l_u_e_s__.push_back( value ); │ │ │ │ │ -296 _c_o_l_s__.push_back( index ); │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -_2_9_9 std::vector< size_type > _r_o_w_s__; │ │ │ │ │ -_3_0_0 std::vector< block_type, Alloc> _v_a_l_u_e_s__; │ │ │ │ │ -_3_0_1 std::vector< size_type > _c_o_l_s__; │ │ │ │ │ -_3_0_2 _s_i_z_e___t_y_p_e _n_R_o_w_s__; │ │ │ │ │ -303 }; │ │ │ │ │ -304 │ │ │ │ │ -306 template │ │ │ │ │ -_3_0_7 void _c_o_n_v_e_r_t_T_o_C_R_S(const M& A, _C_R_S& lower, _C_R_S& upper, InvVector& inv ) │ │ │ │ │ -308 { │ │ │ │ │ -309 typedef typename M :: size_type size_type; │ │ │ │ │ -310 │ │ │ │ │ -311 lower._r_e_s_i_z_e( A.N() ); │ │ │ │ │ -312 upper._r_e_s_i_z_e( A.N() ); │ │ │ │ │ -313 inv.resize( A.N() ); │ │ │ │ │ -314 │ │ │ │ │ -315 // lower and upper triangular should store half of non zeros minus diagonal │ │ │ │ │ -316 const size_t memEstimate = (A.nonzeroes() - A.N())/2; │ │ │ │ │ -317 │ │ │ │ │ -318 assert( A.nonzeroes() != 0 ); │ │ │ │ │ -319 lower._r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l( memEstimate ); │ │ │ │ │ -320 upper._r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l( memEstimate ); │ │ │ │ │ -321 │ │ │ │ │ -322 const auto endi = A.end(); │ │ │ │ │ -323 size_type row = 0; │ │ │ │ │ -324 size_type colcount = 0; │ │ │ │ │ -325 lower._r_o_w_s__[ 0 ] = colcount; │ │ │ │ │ -326 for (auto i=A.begin(); i!=endi; ++i, ++row) │ │ │ │ │ -327 { │ │ │ │ │ -328 const size_type iIndex = i.index(); │ │ │ │ │ -329 │ │ │ │ │ -330 // store entries left of diagonal │ │ │ │ │ -331 for (auto j=(*i).begin(); j.index() < iIndex; ++j ) │ │ │ │ │ -332 { │ │ │ │ │ -333 lower._p_u_s_h___b_a_c_k( (*j), j.index() ); │ │ │ │ │ -334 ++colcount; │ │ │ │ │ -335 } │ │ │ │ │ -336 lower._r_o_w_s__[ iIndex+1 ] = colcount; │ │ │ │ │ -337 } │ │ │ │ │ -338 │ │ │ │ │ -339 const auto rendi = A.beforeBegin(); │ │ │ │ │ -340 row = 0; │ │ │ │ │ -341 colcount = 0; │ │ │ │ │ -342 upper._r_o_w_s__[ 0 ] = colcount ; │ │ │ │ │ -343 │ │ │ │ │ -344 // NOTE: upper and inv store entries in reverse row and col order, │ │ │ │ │ -345 // reverse here relative to ILU │ │ │ │ │ -346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row ) │ │ │ │ │ -347 { │ │ │ │ │ -348 const auto endij=(*i).beforeBegin(); // end of row i │ │ │ │ │ -349 │ │ │ │ │ -350 const size_type iIndex = i.index(); │ │ │ │ │ -351 │ │ │ │ │ -352 // store in reverse row order for faster access during backsolve │ │ │ │ │ -353 for (auto j=(*i).beforeEnd(); j != endij; --j ) │ │ │ │ │ -354 { │ │ │ │ │ -355 const size_type jIndex = j.index(); │ │ │ │ │ -356 if( j.index() == iIndex ) │ │ │ │ │ -357 { │ │ │ │ │ -358 inv[ row ] = (*j); │ │ │ │ │ -359 break; // assuming consecutive ordering of A │ │ │ │ │ -360 } │ │ │ │ │ -361 else if ( j.index() >= i.index() ) │ │ │ │ │ -362 { │ │ │ │ │ -363 upper._p_u_s_h___b_a_c_k( (*j), jIndex ); │ │ │ │ │ -364 ++colcount ; │ │ │ │ │ -365 } │ │ │ │ │ -366 } │ │ │ │ │ -367 upper._r_o_w_s__[ row+1 ] = colcount; │ │ │ │ │ -368 } │ │ │ │ │ -369 } // end convertToCRS │ │ │ │ │ -370 │ │ │ │ │ -372 template │ │ │ │ │ -_3_7_3 void _b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const _C_R_S& lower, │ │ │ │ │ -374 const _C_R_S& upper, │ │ │ │ │ -375 const InvVector& inv, │ │ │ │ │ -376 X& v, const Y& d) │ │ │ │ │ -377 { │ │ │ │ │ -378 // iterator types │ │ │ │ │ -379 typedef typename Y :: block_type dblock; │ │ │ │ │ -380 typedef typename X :: block_type vblock; │ │ │ │ │ -381 typedef typename X :: size_type size_type ; │ │ │ │ │ -382 │ │ │ │ │ -383 const size_type iEnd = lower._r_o_w_s(); │ │ │ │ │ -384 const size_type lastRow = iEnd - 1; │ │ │ │ │ -385 if( iEnd != upper._r_o_w_s() ) │ │ │ │ │ -386 { │ │ │ │ │ -387 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"ILU::blockILUBacksolve: lower and upper rows must be │ │ │ │ │ -the same"); │ │ │ │ │ -388 } │ │ │ │ │ -389 │ │ │ │ │ -390 // lower triangular solve │ │ │ │ │ -391 for( size_type i=0; i_N(); i++) │ │ │ │ │ +132 Impl::asMatrix((*this)[i][i])._i_n_v_e_r_t(); │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +135 private: │ │ │ │ │ +136 │ │ │ │ │ +137 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ +//// │ │ │ │ │ +138 // The following methods from the base class should now actually be called │ │ │ │ │ +139 // //////////////////////////////////////////////////////////////////////// │ │ │ │ │ +//// │ │ │ │ │ +140 │ │ │ │ │ +141 // createbegin and createend should be in there, too, but I can't get it to │ │ │ │ │ +compile │ │ │ │ │ +142 // BCRSMatrix::CreateIterator createbegin () {} │ │ │ │ │ +143 // BCRSMatrix::CreateIterator createend () {} │ │ │ │ │ +144 void setrowsize (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e s) {} │ │ │ │ │ +145 void incrementrowsize (_s_i_z_e___t_y_p_e i) {} │ │ │ │ │ +146 void endrowsizes () {} │ │ │ │ │ +147 void addindex (_s_i_z_e___t_y_p_e row, _s_i_z_e___t_y_p_e _c_o_l) {} │ │ │ │ │ +148 void endindices () {} │ │ │ │ │ +149 }; │ │ │ │ │ +150 │ │ │ │ │ +151 template │ │ │ │ │ +_1_5_2 struct FieldTraits< _B_D_M_a_t_r_i_x > │ │ │ │ │ +153 { │ │ │ │ │ +_1_5_4 using _f_i_e_l_d___t_y_p_e = typename _B_D_M_a_t_r_i_x_<_B_,_ _A_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_5_5 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ +156 }; │ │ │ │ │ +159} // end namespace Dune │ │ │ │ │ +160 │ │ │ │ │ +161#endif │ │ │ │ │ +_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ +Helper functions for determining the vector/matrix block level. │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ _c_o_l │ │ │ │ │ Col col │ │ │ │ │ DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S │ │ │ │ │ -void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv) │ │ │ │ │ -convert ILU decomposition into CRS format for lower and upper triangular and │ │ │ │ │ -inverse. │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e │ │ │ │ │ -void blockILUBacksolve(const M &A, X &v, const Y &d) │ │ │ │ │ -LU backsolve with stored inverse. │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t │ │ │ │ │ -M::field_type & firstMatrixElement(M &A, typename std::enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void blockILU0Decomposition(M &A) │ │ │ │ │ -compute ILU decomposition of A. A is overwritten by its decomposition │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ -void blockILUDecomposition(const M &A, int n, M &ILU) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S │ │ │ │ │ -a simple compressed row storage matrix class │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:259 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_c_o_l_s__ │ │ │ │ │ -std::vector< size_type > cols_ │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_n_o_n_Z_e_r_o_s │ │ │ │ │ -size_type nonZeros() const │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:267 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(const size_type nRows) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:273 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_o_w_s │ │ │ │ │ -size_type rows() const │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:265 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_C_R_S │ │ │ │ │ -CRS() │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l │ │ │ │ │ -void reserveAdditional(const size_type nonZeros) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_r_o_w_s_i_z_e_s │ │ │ │ │ +void endrowsizes() │ │ │ │ │ +indicate that size of all rows is defined │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1149 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_r_a_n_d_o_m │ │ │ │ │ +@ random │ │ │ │ │ +Build entries randomly. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:530 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d_i_n_d_i_c_e_s │ │ │ │ │ +void endindices() │ │ │ │ │ +indicate that all indices are defined, check consistency │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1248 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of rows (counted in blocks) │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type rows, size_type columns, size_type nnz=0) │ │ │ │ │ +Set the size of the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:861 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +BCRSMatrix & operator=(const BCRSMatrix &Mat) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:911 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ +A block-diagonal matrix. │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +implement row_type with compressed vector │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ +BDMatrix() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ +BDMatrix(std::initializer_list< B > const &list) │ │ │ │ │ +Construct from a std::initializer_list. │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ B block_type │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_v_a_l_u_e_s__ │ │ │ │ │ -std::vector< block_type, Alloc > values_ │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_n_R_o_w_s__ │ │ │ │ │ -size_type nRows_ │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:302 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_o_w_s__ │ │ │ │ │ -std::vector< size_type > rows_ │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ -void push_back(const block_type &value, const size_type index) │ │ │ │ │ -DDeeffiinniittiioonn ilu.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ -Error when performing an operation on a matrix block. │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ +void solve(V &x, const V &rhs) const │ │ │ │ │ +Solve the system Ax=b in O(n) time. │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ +A allocator_type │ │ │ │ │ +export the allocator type │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_B_D_M_a_t_r_i_x │ │ │ │ │ +BDMatrix(int size) │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +BDMatrix & operator=(const BDMatrix &other) │ │ │ │ │ +assignment │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr unsigned int blocklevel │ │ │ │ │ +increment block level counter │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(size_type size) │ │ │ │ │ +Resize the matrix. Invalidates the content! │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_B_D_M_a_t_r_i_x_:_:_i_n_v_e_r_t │ │ │ │ │ +void invert() │ │ │ │ │ +Inverts the matrix. │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename BDMatrix< B, A >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_D_M_a_t_r_i_x_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn bdmatrix.hh:155 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00188.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: multitypeblockvector.hh File Reference │ │ │ │ +dune-istl: cholmod.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,60 +69,19 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
multitypeblockvector.hh File Reference
│ │ │ │ +
cholmod.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <dune/common/dotproduct.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include "gsetc.hh"
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::FieldTraits< MultiTypeBlockVector< Args... > >
 
class  Dune::MultiTypeBlockVector< Args >
 A Vector class to support different block types. More...
 
struct  std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > >
 Make std::tuple_element work for MultiTypeBlockVector. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 
namespace  std
 STL namespace.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

template<typename... Args>
std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockVector< Args... > &v)
 Send MultiTypeBlockVector to an outstream.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,42 +1,10 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -multitypeblockvector.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +cholmod.hh File Reference │ │ │ │ │ _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_i_e_l_d_T_r_a_i_t_s_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_ _> │ │ │ │ │ -  A Vector class to support different block types. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ │ -  Make std::tuple_element work for MultiTypeBlockVector. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  │ │ │ │ │ -namespace   _s_t_d │ │ │ │ │ -  STL namespace. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r< │ │ │ │ │ - Args... > &v) │ │ │ │ │ -  Send _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r to an outstream. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: multitypeblockvector.hh Source File │ │ │ │ +dune-istl: cholmod.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,354 +74,378 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
multitypeblockvector.hh
│ │ │ │ +
cholmod.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
│ │ │ │ -
6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <iostream>
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/dotproduct.hh>
│ │ │ │ -
13#include <dune/common/ftraits.hh>
│ │ │ │ -
14#include <dune/common/hybridutilities.hh>
│ │ │ │ -
15#include <dune/common/typetraits.hh>
│ │ │ │ -
16#include <dune/common/std/type_traits.hh>
│ │ │ │ +
3#pragma once
│ │ │ │ +
4
│ │ │ │ +
5#if HAVE_SUITESPARSE_CHOLMOD
│ │ │ │ +
6
│ │ │ │ +
7#include <dune/common/fmatrix.hh>
│ │ │ │ +
8#include <dune/common/fvector.hh>
│ │ │ │ + │ │ │ │ +
10#include <dune/istl/bvector.hh>
│ │ │ │ +
11#include<dune/istl/solver.hh>
│ │ │ │ + │ │ │ │ +
13#include <dune/istl/foreach.hh>
│ │ │ │ +
14
│ │ │ │ +
15#include <vector>
│ │ │ │ +
16#include <memory>
│ │ │ │
17
│ │ │ │ -
18#include "istlexception.hh"
│ │ │ │ +
18#include <cholmod.h>
│ │ │ │
19
│ │ │ │ -
20// forward declaration
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
22 template < typename... Args >
│ │ │ │ -
23 class MultiTypeBlockVector;
│ │ │ │ -
24}
│ │ │ │ -
25
│ │ │ │ -
26#include "gsetc.hh"
│ │ │ │ -
27
│ │ │ │ -
28namespace Dune {
│ │ │ │ -
29
│ │ │ │ -
41 template <typename... Args>
│ │ │ │ -
│ │ │ │ -
42 struct FieldTraits< MultiTypeBlockVector<Args...> >
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21
│ │ │ │ +
22namespace Impl{
│ │ │ │ +
23
│ │ │ │ +
32 struct NoIgnore
│ │ │ │ +
33 {
│ │ │ │ +
34 const NoIgnore& operator[](std::size_t) const { return *this; }
│ │ │ │ +
35 explicit operator bool() const { return false; }
│ │ │ │ +
36 static constexpr std::size_t size() { return 0; }
│ │ │ │ +
37
│ │ │ │ +
38 };
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
41 template<class BlockedVector, class FlatVector>
│ │ │ │ +
42 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector& flatVector)
│ │ │ │
43 {
│ │ │ │ -
44 using field_type = typename MultiTypeBlockVector<Args...>::field_type;
│ │ │ │ -
45 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
46 };
│ │ │ │ -
│ │ │ │ -
56 template < typename... Args >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
58 : public std::tuple<Args...>
│ │ │ │ -
59 {
│ │ │ │ -
61 typedef std::tuple<Args...> TupleType;
│ │ │ │ -
62 public:
│ │ │ │ -
63
│ │ │ │ -
65 using size_type = std::size_t;
│ │ │ │ -
66
│ │ │ │ -
70 using TupleType::TupleType;
│ │ │ │ +
44 // traverse the vector once just to compute the size
│ │ │ │ +
45 std::size_t len = flatVectorForEach(blockedVector, [&](auto&&, auto...){});
│ │ │ │ +
46 flatVector.resize(len);
│ │ │ │ +
47
│ │ │ │ +
48 flatVectorForEach(blockedVector, [&](auto&& entry, auto offset){
│ │ │ │ +
49 flatVector[offset] = entry;
│ │ │ │ +
50 });
│ │ │ │ +
51 }
│ │ │ │ +
52
│ │ │ │ +
53 // special (dummy) case for NoIgnore
│ │ │ │ +
54 template<class FlatVector>
│ │ │ │ +
55 void copyToFlatVector(const NoIgnore&, FlatVector&)
│ │ │ │ +
56 {
│ │ │ │ +
57 // just do nothing
│ │ │ │ +
58 return;
│ │ │ │ +
59 }
│ │ │ │ +
60
│ │ │ │ +
61 template<class FlatVector, class BlockedVector>
│ │ │ │ +
62 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector& blockedVector)
│ │ │ │ +
63 {
│ │ │ │ +
64 flatVectorForEach(blockedVector, [&](auto& entry, auto offset){
│ │ │ │ +
65 entry = flatVector[offset];
│ │ │ │ +
66 });
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
69
│ │ │ │ +
70} //namespace Impl
│ │ │ │
71
│ │ │ │ -
75 typedef MultiTypeBlockVector<Args...> type;
│ │ │ │ -
76
│ │ │ │ -
82 using field_type = Std::detected_t<std::common_type_t, typename FieldTraits< std::decay_t<Args> >::field_type...>;
│ │ │ │ -
83
│ │ │ │ -
84 // make sure that we have an std::common_type: using an assertion produces a more readable error message
│ │ │ │ -
85 // than a compiler template instantiation error
│ │ │ │ -
86 static_assert ( sizeof...(Args) == 0 or not std::is_same_v<field_type, Std::nonesuch>,
│ │ │ │ -
87 "No std::common_type implemented for the given field_types of the Args. Please provide an implementation and check that a FieldTraits class is present for your type.");
│ │ │ │ -
88
│ │ │ │ -
89
│ │ │ │ -
│ │ │ │ -
95 static constexpr size_type size()
│ │ │ │ -
96 {
│ │ │ │ -
97 return sizeof...(Args);
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
102 static constexpr size_type N()
│ │ │ │ -
103 {
│ │ │ │ -
104 return sizeof...(Args);
│ │ │ │ -
105 }
│ │ │ │ -
│ │ │ │ +
76template<class Vector>
│ │ │ │ +
77class Cholmod : public InverseOperator<Vector, Vector>
│ │ │ │ +
78{
│ │ │ │ +
79public:
│ │ │ │ +
80
│ │ │ │ +
86 Cholmod()
│ │ │ │ +
87 {
│ │ │ │ +
88 cholmod_start(&c_);
│ │ │ │ +
89 }
│ │ │ │ +
90
│ │ │ │ +
96 ~Cholmod()
│ │ │ │ +
97 {
│ │ │ │ +
98 if (L_)
│ │ │ │ +
99 cholmod_free_factor(&L_, &c_);
│ │ │ │ +
100 cholmod_finish(&c_);
│ │ │ │ +
101 }
│ │ │ │ +
102
│ │ │ │ +
103 // forbid copying to avoid freeing memory twice
│ │ │ │ +
104 Cholmod(const Cholmod&) = delete;
│ │ │ │ +
105 Cholmod& operator=(const Cholmod&) = delete;
│ │ │ │
106
│ │ │ │ -
113 [[deprecated("Use method 'N' instead")]]
│ │ │ │ -
│ │ │ │ -
114 int count() const
│ │ │ │ -
115 {
│ │ │ │ -
116 return sizeof...(Args);
│ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
121 {
│ │ │ │ -
122 size_type result = 0;
│ │ │ │ -
123 Hybrid::forEach(std::make_index_sequence<N()>{},
│ │ │ │ -
124 [&](auto i){result += std::get<i>(*this).dim();});
│ │ │ │ -
125
│ │ │ │ -
126 return result;
│ │ │ │ -
127 }
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
147 template< size_type index >
│ │ │ │ -
148 typename std::tuple_element<index,TupleType>::type&
│ │ │ │ -
│ │ │ │ -
149 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
│ │ │ │ -
150 {
│ │ │ │ -
151 return std::get<index>(*this);
│ │ │ │ -
152 }
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
159 template< size_type index >
│ │ │ │ -
160 const typename std::tuple_element<index,TupleType>::type&
│ │ │ │ -
│ │ │ │ -
161 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
│ │ │ │ -
162 {
│ │ │ │ -
163 return std::get<index>(*this);
│ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ +
107
│ │ │ │ +
110 void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
│ │ │ │ +
111 {
│ │ │ │ +
112 apply(x,b,res);
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
120 void apply(Vector& x, Vector& b, InverseOperatorResult& res)
│ │ │ │ +
121 {
│ │ │ │ +
122 // do nothing if N=0
│ │ │ │ +
123 if ( nIsZero_ )
│ │ │ │ +
124 {
│ │ │ │ +
125 return;
│ │ │ │ +
126 }
│ │ │ │ +
127
│ │ │ │ +
128 if (x.size() != b.size())
│ │ │ │ +
129 DUNE_THROW(Exception, "Error in apply(): sizes of x and b do not match!");
│ │ │ │ +
130
│ │ │ │ +
131 // cast to double array
│ │ │ │ +
132 auto b2 = std::make_unique<double[]>(L_->n);
│ │ │ │ +
133 auto x2 = std::make_unique<double[]>(L_->n);
│ │ │ │ +
134
│ │ │ │ +
135 // copy to cholmod
│ │ │ │ +
136 auto bp = b2.get();
│ │ │ │ +
137
│ │ │ │ +
138 flatVectorForEach(b, [&](auto&& entry, auto&& flatIndex){
│ │ │ │ +
139 if ( subIndices_.empty() )
│ │ │ │ +
140 bp[ flatIndex ] = entry;
│ │ │ │ +
141 else
│ │ │ │ +
142 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
│ │ │ │ +
143 bp[ subIndices_[ flatIndex ] ] = entry;
│ │ │ │ +
144 });
│ │ │ │ +
145
│ │ │ │ +
146 // create a cholmod dense object
│ │ │ │ +
147 auto b3 = make_cholmod_dense(cholmod_allocate_dense(L_->n, 1, L_->n, CHOLMOD_REAL, &c_), &c_);
│ │ │ │ +
148 // cast because void-ptr
│ │ │ │ +
149 auto b4 = static_cast<double*>(b3->x);
│ │ │ │ +
150 std::copy(b2.get(), b2.get() + L_->n, b4);
│ │ │ │ +
151
│ │ │ │ +
152 // solve for a cholmod x object
│ │ │ │ +
153 auto x3 = make_cholmod_dense(cholmod_solve(CHOLMOD_A, L_, b3.get(), &c_), &c_);
│ │ │ │ +
154 // cast because void-ptr
│ │ │ │ +
155 auto xp = static_cast<double*>(x3->x);
│ │ │ │ +
156
│ │ │ │ +
157 // copy into x
│ │ │ │ +
158 flatVectorForEach(x, [&](auto&& entry, auto&& flatIndex){
│ │ │ │ +
159 if ( subIndices_.empty() )
│ │ │ │ +
160 entry = xp[ flatIndex ];
│ │ │ │ +
161 else
│ │ │ │ +
162 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
│ │ │ │ +
163 entry = xp[ subIndices_[ flatIndex ] ];
│ │ │ │ +
164 });
│ │ │ │
165
│ │ │ │ -
168 template<typename T>
│ │ │ │ -
│ │ │ │ -
169 void operator= (const T& newval) {
│ │ │ │ -
170 Dune::Hybrid::forEach(*this, [&](auto&& entry) {
│ │ │ │ -
171 entry = newval;
│ │ │ │ -
172 });
│ │ │ │ -
173 }
│ │ │ │ -
│ │ │ │ -
174
│ │ │ │ -
│ │ │ │ -
178 void operator+= (const type& newv) {
│ │ │ │ -
179 using namespace Dune::Hybrid;
│ │ │ │ -
180 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
│ │ │ │ -
181 (*this)[i] += newv[i];
│ │ │ │ -
182 });
│ │ │ │ -
183 }
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
│ │ │ │ -
188 void operator-= (const type& newv) {
│ │ │ │ -
189 using namespace Dune::Hybrid;
│ │ │ │ -
190 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
│ │ │ │ -
191 (*this)[i] -= newv[i];
│ │ │ │ -
192 });
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ -
196 template<class T,
│ │ │ │ -
197 std::enable_if_t< IsNumber<T>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
198 void operator*= (const T& w) {
│ │ │ │ -
199 Hybrid::forEach(*this, [&](auto&& entry) {
│ │ │ │ -
200 entry *= w;
│ │ │ │ -
201 });
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
205 template<class T,
│ │ │ │ -
206 std::enable_if_t< IsNumber<T>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
207 void operator/= (const T& w) {
│ │ │ │ -
208 Hybrid::forEach(*this, [&](auto&& entry) {
│ │ │ │ -
209 entry /= w;
│ │ │ │ -
210 });
│ │ │ │ -
211 }
│ │ │ │ -
│ │ │ │ +
166 // statistics for a direct solver
│ │ │ │ +
167 res.iterations = 1;
│ │ │ │ +
168 res.converged = true;
│ │ │ │ +
169 }
│ │ │ │ +
170
│ │ │ │ +
171
│ │ │ │ +
177 template<class Matrix>
│ │ │ │ +
178 void setMatrix(const Matrix& matrix)
│ │ │ │ +
179 {
│ │ │ │ +
180 const Impl::NoIgnore* noIgnore = nullptr;
│ │ │ │ +
181 setMatrix(matrix, noIgnore);
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
198 template<class Matrix, class Ignore>
│ │ │ │ +
199 void setMatrix(const Matrix& matrix, const Ignore* ignore)
│ │ │ │ +
200 {
│ │ │ │ +
201 // count the number of entries and diagonal entries
│ │ │ │ +
202 int nonZeros = 0;
│ │ │ │ +
203 int numberOfIgnoredDofs = 0;
│ │ │ │ +
204
│ │ │ │ +
205
│ │ │ │ +
206 auto [flatRows,flatCols] = flatMatrixForEach( matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
│ │ │ │ +
207 if( flatRowIndex <= flatColIndex )
│ │ │ │ +
208 nonZeros++;
│ │ │ │ +
209 });
│ │ │ │ +
210
│ │ │ │ +
211 std::vector<bool> flatIgnore;
│ │ │ │
212
│ │ │ │ -
│ │ │ │ -
213 field_type operator* (const type& newv) const {
│ │ │ │ -
214 using namespace Dune::Hybrid;
│ │ │ │ -
215 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
│ │ │ │ -
216 return a + (*this)[i]*newv[i];
│ │ │ │ -
217 });
│ │ │ │ -
218 }
│ │ │ │ -
│ │ │ │ -
219
│ │ │ │ -
│ │ │ │ -
220 field_type dot (const type& newv) const {
│ │ │ │ -
221 using namespace Dune::Hybrid;
│ │ │ │ -
222 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
│ │ │ │ -
223 return a + (*this)[i].dot(newv[i]);
│ │ │ │ -
224 });
│ │ │ │ -
225 }
│ │ │ │ -
│ │ │ │ -
226
│ │ │ │ -
│ │ │ │ -
229 auto one_norm() const {
│ │ │ │ -
230 using namespace Dune::Hybrid;
│ │ │ │ -
231 return accumulate(*this, typename FieldTraits<field_type>::real_type(0), [&](auto&& a, auto&& entry) {
│ │ │ │ -
232 return a + entry.one_norm();
│ │ │ │ -
233 });
│ │ │ │ -
234 }
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
│ │ │ │ -
238 auto one_norm_real() const {
│ │ │ │ -
239 using namespace Dune::Hybrid;
│ │ │ │ -
240 return accumulate(*this, typename FieldTraits<field_type>::real_type(0), [&](auto&& a, auto&& entry) {
│ │ │ │ -
241 return a + entry.one_norm_real();
│ │ │ │ -
242 });
│ │ │ │ -
243 }
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ -
│ │ │ │ -
247 typename FieldTraits<field_type>::real_type two_norm2() const {
│ │ │ │ -
248 using namespace Dune::Hybrid;
│ │ │ │ -
249 return accumulate(*this, typename FieldTraits<field_type>::real_type(0), [&](auto&& a, auto&& entry) {
│ │ │ │ -
250 return a + entry.two_norm2();
│ │ │ │ -
251 });
│ │ │ │ -
252 }
│ │ │ │ -
│ │ │ │ +
213 if ( ignore )
│ │ │ │ +
214 {
│ │ │ │ +
215 Impl::copyToFlatVector(*ignore,flatIgnore);
│ │ │ │ +
216 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true);
│ │ │ │ +
217 }
│ │ │ │ +
218
│ │ │ │ +
219 // Total number of rows
│ │ │ │ +
220 int N = flatRows - numberOfIgnoredDofs;
│ │ │ │ +
221
│ │ │ │ +
222 nIsZero_ = (N <= 0);
│ │ │ │ +
223
│ │ │ │ +
224 if ( nIsZero_ )
│ │ │ │ +
225 {
│ │ │ │ +
226 return;
│ │ │ │ +
227 }
│ │ │ │ +
228
│ │ │ │ +
229 /*
│ │ │ │ +
230 * CHOLMOD uses compressed-column sparse matrices, but for symmetric
│ │ │ │ +
231 * matrices this is the same as the compressed-row sparse matrix used
│ │ │ │ +
232 * by DUNE. So we can just store Mᵀ instead of M (as M = Mᵀ).
│ │ │ │ +
233 */
│ │ │ │ +
234 const auto deleter = [c = &this->c_](auto* p) {
│ │ │ │ +
235 cholmod_free_sparse(&p, c);
│ │ │ │ +
236 };
│ │ │ │ +
237 auto M = std::unique_ptr<cholmod_sparse, decltype(deleter)>(
│ │ │ │ +
238 cholmod_allocate_sparse(N, // # rows
│ │ │ │ +
239 N, // # cols
│ │ │ │ +
240 nonZeros, // # of nonzeroes
│ │ │ │ +
241 1, // indices are sorted ( 1 = true)
│ │ │ │ +
242 1, // matrix is "packed" ( 1 = true)
│ │ │ │ +
243 -1, // stype of matrix ( -1 = consider the lower part only )
│ │ │ │ +
244 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex numbers)
│ │ │ │ +
245 &c_ // cholmod_common ptr
│ │ │ │ +
246 ), deleter);
│ │ │ │ +
247
│ │ │ │ +
248 // copy the data of BCRS matrix to Cholmod Sparse matrix
│ │ │ │ +
249 int* Ap = static_cast<int*>(M->p);
│ │ │ │ +
250 int* Ai = static_cast<int*>(M->i);
│ │ │ │ +
251 double* Ax = static_cast<double*>(M->x);
│ │ │ │ +
252
│ │ │ │
253
│ │ │ │ -
256 typename FieldTraits<field_type>::real_type two_norm() const {return sqrt(this->two_norm2());}
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ -
260 typename FieldTraits<field_type>::real_type infinity_norm() const
│ │ │ │ -
261 {
│ │ │ │ -
262 using namespace Dune::Hybrid;
│ │ │ │ -
263 using std::max;
│ │ │ │ -
264 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
265
│ │ │ │ -
266 real_type result = 0.0;
│ │ │ │ -
267 // Compute max norm tracking appearing nan values
│ │ │ │ -
268 // if the field type supports nan.
│ │ │ │ -
269 if constexpr (HasNaN<field_type>()) {
│ │ │ │ -
270 // This variable will preserve any nan value
│ │ │ │ -
271 real_type nanTracker = 1.0;
│ │ │ │ -
272 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
273 forEach(*this, [&](auto&& entry) {
│ │ │ │ -
274 real_type entryNorm = entry.infinity_norm();
│ │ │ │ -
275 result = max(entryNorm, result);
│ │ │ │ -
276 nanTracker += entryNorm;
│ │ │ │ -
277 });
│ │ │ │ -
278 // Incorporate possible nan value into result
│ │ │ │ -
279 result *= (nanTracker / nanTracker);
│ │ │ │ -
280 } else {
│ │ │ │ -
281 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
282 forEach(*this, [&](auto&& entry) {
│ │ │ │ -
283 result = max(entry.infinity_norm(), result);
│ │ │ │ -
284 });
│ │ │ │ -
285 }
│ │ │ │ -
286 return result;
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
│ │ │ │ -
291 typename FieldTraits<field_type>::real_type infinity_norm_real() const
│ │ │ │ -
292 {
│ │ │ │ -
293 using namespace Dune::Hybrid;
│ │ │ │ -
294 using std::max;
│ │ │ │ -
295 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
296
│ │ │ │ -
297 real_type result = 0.0;
│ │ │ │ -
298 // Compute max norm tracking appearing nan values
│ │ │ │ -
299 // if the field type supports nan.
│ │ │ │ -
300 if constexpr (HasNaN<field_type>()) {
│ │ │ │ -
301 // This variable will preserve any nan value
│ │ │ │ -
302 real_type nanTracker = 1.0;
│ │ │ │ -
303 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
304 forEach(*this, [&](auto&& entry) {
│ │ │ │ -
305 real_type entryNorm = entry.infinity_norm_real();
│ │ │ │ -
306 result = max(entryNorm, result);
│ │ │ │ -
307 nanTracker += entryNorm;
│ │ │ │ -
308 });
│ │ │ │ -
309 // Incorporate possible nan value into result
│ │ │ │ -
310 result *= (nanTracker / nanTracker);
│ │ │ │ -
311 } else {
│ │ │ │ -
312 using namespace Dune::Hybrid; // needed for icc, see issue #31
│ │ │ │ -
313 forEach(*this, [&](auto&& entry) {
│ │ │ │ -
314 result = max(entry.infinity_norm_real(), result);
│ │ │ │ -
315 });
│ │ │ │ -
316 }
│ │ │ │ -
317 return result;
│ │ │ │ -
318 }
│ │ │ │ -
│ │ │ │ +
254 if ( ignore )
│ │ │ │ +
255 {
│ │ │ │ +
256 // init the mapping
│ │ │ │ +
257 subIndices_.resize(flatRows,std::numeric_limits<std::size_t>::max());
│ │ │ │ +
258
│ │ │ │ +
259 std::size_t subIndexCounter = 0;
│ │ │ │ +
260
│ │ │ │ +
261 for ( std::size_t i=0; i<flatRows; i++ )
│ │ │ │ +
262 {
│ │ │ │ +
263 if ( not flatIgnore[ i ] )
│ │ │ │ +
264 {
│ │ │ │ +
265 subIndices_[ i ] = subIndexCounter++;
│ │ │ │ +
266 }
│ │ │ │ +
267 }
│ │ │ │ +
268 }
│ │ │ │ +
269
│ │ │ │ +
270 // at first, we need to compute the row starts "Ap"
│ │ │ │ +
271 // therefore, we count all (not ignored) entries in each row and in the end we accumulate everything
│ │ │ │ +
272 flatMatrixForEach(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
│ │ │ │ +
273
│ │ │ │ +
274 // stop if ignored
│ │ │ │ +
275 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
│ │ │ │ +
276 return;
│ │ │ │ +
277
│ │ │ │ +
278 // stop if in lower half
│ │ │ │ +
279 if ( flatRowIndex > flatColIndex )
│ │ │ │ +
280 return;
│ │ │ │ +
281
│ │ │ │ +
282 // ok, count the entry
│ │ │ │ +
283 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
│ │ │ │ +
284 Ap[idx+1]++;
│ │ │ │ +
285
│ │ │ │ +
286 });
│ │ │ │ +
287
│ │ │ │ +
288 // now accumulate
│ │ │ │ +
289 Ap[0] = 0;
│ │ │ │ +
290 for ( int i=0; i<N; i++ )
│ │ │ │ +
291 {
│ │ │ │ +
292 Ap[i+1] += Ap[i];
│ │ │ │ +
293 }
│ │ │ │ +
294
│ │ │ │ +
295 // we need a compressed row position counter
│ │ │ │ +
296 std::vector<std::size_t> rowPosition(N,0);
│ │ │ │ +
297
│ │ │ │ +
298 // now we can set the entries
│ │ │ │ +
299 flatMatrixForEach(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& flatColIndex){
│ │ │ │ +
300
│ │ │ │ +
301 // stop if ignored
│ │ │ │ +
302 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
│ │ │ │ +
303 return;
│ │ │ │ +
304
│ │ │ │ +
305 // stop if in lower half
│ │ │ │ +
306 if ( flatRowIndex > flatColIndex )
│ │ │ │ +
307 return;
│ │ │ │ +
308
│ │ │ │ +
309 // ok, set the entry
│ │ │ │ +
310 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
│ │ │ │ +
311 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex;
│ │ │ │ +
312 auto rowStart = Ap[rowIdx];
│ │ │ │ +
313 auto rowPos = rowPosition[rowIdx];
│ │ │ │ +
314 Ai[ rowStart + rowPos ] = colIdx;
│ │ │ │ +
315 Ax[ rowStart + rowPos ] = entry;
│ │ │ │ +
316 rowPosition[rowIdx]++;
│ │ │ │ +
317
│ │ │ │ +
318 });
│ │ │ │
319
│ │ │ │ -
324 template<typename Ta>
│ │ │ │ -
│ │ │ │ -
325 void axpy (const Ta& a, const type& y) {
│ │ │ │ -
326 using namespace Dune::Hybrid;
│ │ │ │ -
327 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
│ │ │ │ -
328 (*this)[i].axpy(a, y[i]);
│ │ │ │ -
329 });
│ │ │ │ -
330 }
│ │ │ │ -
│ │ │ │ +
320 // Now analyse the pattern and optimal row order
│ │ │ │ +
321 L_ = cholmod_analyze(M.get(), &c_);
│ │ │ │ +
322
│ │ │ │ +
323 // Do the factorization (this may take some time)
│ │ │ │ +
324 cholmod_factorize(M.get(), L_, &c_);
│ │ │ │ +
325 }
│ │ │ │ +
326
│ │ │ │ +
327 virtual SolverCategory::Category category() const
│ │ │ │ +
328 {
│ │ │ │ +
329 return SolverCategory::Category::sequential;
│ │ │ │ +
330 }
│ │ │ │
331
│ │ │ │ -
332 };
│ │ │ │ -
│ │ │ │ -
333
│ │ │ │ -
334
│ │ │ │ -
335
│ │ │ │ -
338 template <typename... Args>
│ │ │ │ -
│ │ │ │ -
339 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockVector<Args...>& v) {
│ │ │ │ -
340 using namespace Dune::Hybrid;
│ │ │ │ -
341 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) {
│ │ │ │ -
342 s << "\t(" << i << "):\n" << v[i] << "\n";
│ │ │ │ -
343 });
│ │ │ │ -
344 return s;
│ │ │ │ -
345 }
│ │ │ │ -
│ │ │ │ -
346
│ │ │ │ -
347} // end namespace Dune
│ │ │ │ -
348
│ │ │ │ -
349namespace std
│ │ │ │ -
350{
│ │ │ │ -
355 template <size_t i, typename... Args>
│ │ │ │ -
│ │ │ │ -
356 struct tuple_element<i,Dune::MultiTypeBlockVector<Args...> >
│ │ │ │ -
357 {
│ │ │ │ -
358 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
│ │ │ │ -
359 };
│ │ │ │ -
│ │ │ │ -
360}
│ │ │ │ -
361
│ │ │ │ -
362#endif
│ │ │ │ -
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ - │ │ │ │ -
void operator=(const T &newval)
Assignment operator.
Definition multitypeblockvector.hh:169
│ │ │ │ -
std::size_t size_type
Type used for vector sizes.
Definition multitypeblockvector.hh:65
│ │ │ │ -
typename FieldTraits< field_type >::real_type real_type
Definition multitypeblockvector.hh:45
│ │ │ │ -
int count() const
Definition multitypeblockvector.hh:114
│ │ │ │ -
static constexpr size_type N()
Number of elements.
Definition multitypeblockvector.hh:102
│ │ │ │ -
Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args > >::field_type... > field_type
The type used for scalars.
Definition multitypeblockvector.hh:82
│ │ │ │ -
static constexpr size_type size()
Return the number of non-zero vector entries.
Definition multitypeblockvector.hh:95
│ │ │ │ -
std::tuple_element< index, TupleType >::type & operator[](const std::integral_constant< size_type, index > indexVariable)
Random-access operator.
Definition multitypeblockvector.hh:149
│ │ │ │ -
FieldTraits< field_type >::real_type two_norm() const
Compute the Euclidean norm.
Definition multitypeblockvector.hh:256
│ │ │ │ -
typename MultiTypeBlockVector< Args... >::field_type field_type
Definition multitypeblockvector.hh:44
│ │ │ │ -
size_type dim() const
Number of scalar elements.
Definition multitypeblockvector.hh:120
│ │ │ │ -
field_type dot(const type &newv) const
Definition multitypeblockvector.hh:220
│ │ │ │ -
void operator*=(const T &w)
Multiplication with a scalar.
Definition multitypeblockvector.hh:198
│ │ │ │ -
void axpy(const Ta &a, const type &y)
Axpy operation on this vector (*this += a * y)
Definition multitypeblockvector.hh:325
│ │ │ │ -
void operator/=(const T &w)
Division by a scalar.
Definition multitypeblockvector.hh:207
│ │ │ │ -
MultiTypeBlockVector< Args... > type
Definition multitypeblockvector.hh:75
│ │ │ │ -
FieldTraits< field_type >::real_type infinity_norm_real() const
Compute the simplified maximum norm (uses 1-norm for complex values)
Definition multitypeblockvector.hh:291
│ │ │ │ -
auto one_norm() const
Compute the 1-norm.
Definition multitypeblockvector.hh:229
│ │ │ │ -
void operator-=(const type &newv)
Definition multitypeblockvector.hh:188
│ │ │ │ -
field_type operator*(const type &newv) const
Definition multitypeblockvector.hh:213
│ │ │ │ -
void operator+=(const type &newv)
Definition multitypeblockvector.hh:178
│ │ │ │ -
typename std::tuple_element< i, std::tuple< Args... > >::type type
Definition multitypeblockvector.hh:358
│ │ │ │ -
FieldTraits< field_type >::real_type infinity_norm() const
Compute the maximum norm.
Definition multitypeblockvector.hh:260
│ │ │ │ -
auto one_norm_real() const
Compute the simplified 1-norm (uses 1-norm also for complex values)
Definition multitypeblockvector.hh:238
│ │ │ │ -
FieldTraits< field_type >::real_type two_norm2() const
Compute the squared Euclidean norm.
Definition multitypeblockvector.hh:247
│ │ │ │ -
STL namespace.
│ │ │ │ +
337 cholmod_common& cholmodCommonObject()
│ │ │ │ +
338 {
│ │ │ │ +
339 return c_;
│ │ │ │ +
340 }
│ │ │ │ +
341
│ │ │ │ +
347 cholmod_factor& cholmodFactor()
│ │ │ │ +
348 {
│ │ │ │ +
349 return *L_;
│ │ │ │ +
350 }
│ │ │ │ +
351
│ │ │ │ +
357 const cholmod_factor& cholmodFactor() const
│ │ │ │ +
358 {
│ │ │ │ +
359 return *L_;
│ │ │ │ +
360 }
│ │ │ │ +
361private:
│ │ │ │ +
362
│ │ │ │ +
363 // create a std::unique_ptr to a cholmod_dense object with a deleter
│ │ │ │ +
364 // that calls the appropriate cholmod cleanup routine
│ │ │ │ +
365 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c)
│ │ │ │ +
366 {
│ │ │ │ +
367 const auto deleter = [c](auto* p) {
│ │ │ │ +
368 cholmod_free_dense(&p, c);
│ │ │ │ +
369 };
│ │ │ │ +
370 return std::unique_ptr<cholmod_dense, decltype(deleter)>(x, deleter);
│ │ │ │ +
371 }
│ │ │ │ +
372
│ │ │ │ +
373 cholmod_common c_;
│ │ │ │ +
374 cholmod_factor* L_ = nullptr;
│ │ │ │ +
375
│ │ │ │ +
376 // indicator for a 0x0 problem (due to ignore dof's)
│ │ │ │ +
377 bool nIsZero_ = false;
│ │ │ │ +
378
│ │ │ │ +
379 // vector mapping all indices in flat order to the not ignored indices
│ │ │ │ +
380 std::vector<std::size_t> subIndices_;
│ │ │ │ +
381};
│ │ │ │ +
382
│ │ │ │ +
383 struct CholmodCreator{
│ │ │ │ +
384 template<class F> struct isValidBlock : std::false_type{};
│ │ │ │ +
385 template<int k> struct isValidBlock<FieldVector<double,k>> : std::true_type{};
│ │ │ │ +
386 template<int k> struct isValidBlock<FieldVector<float,k>> : std::true_type{};
│ │ │ │ +
387
│ │ │ │ +
388 template<class TL, typename M>
│ │ │ │ +
389 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
390 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
391 operator()(TL /*tl*/, const M& mat, const Dune::ParameterTree& /*config*/,
│ │ │ │ +
392 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ +
393 {
│ │ │ │ +
394 using D = typename Dune::TypeListElement<1, TL>::type;
│ │ │ │ +
395 auto solver = std::make_shared<Dune::Cholmod<D>>();
│ │ │ │ +
396 solver->setMatrix(mat);
│ │ │ │ +
397 return solver;
│ │ │ │ +
398 }
│ │ │ │ +
399
│ │ │ │ +
400 // second version with SFINAE to validate the template parameters of Cholmod
│ │ │ │ +
401 template<typename TL, typename M>
│ │ │ │ +
402 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
│ │ │ │ +
403 typename Dune::TypeListElement<2, TL>::type>>
│ │ │ │ +
404 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
│ │ │ │ +
405 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
│ │ │ │ +
406 {
│ │ │ │ +
407 DUNE_THROW(UnsupportedType, "Unsupported Type in Cholmod");
│ │ │ │ +
408 }
│ │ │ │ +
409 };
│ │ │ │ +
410 DUNE_REGISTER_DIRECT_SOLVER("cholmod", Dune::CholmodCreator());
│ │ │ │ +
411
│ │ │ │ +
412} /* namespace Dune */
│ │ │ │ +
413
│ │ │ │ +
414#endif // HAVE_SUITESPARSE_CHOLMOD
│ │ │ │ +
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
│ │ │ │ +
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ + │ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ + │ │ │ │ +
Define general, extensible interface for inverse operators.
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
Send BlockVector to an output stream.
Definition bvector.hh:590
│ │ │ │ -
A Vector class to support different block types.
Definition multitypeblockvector.hh:59
│ │ │ │ +
std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, std::size_t rowOffset=0, std::size_t colOffset=0)
Traverse a blocked matrix and call a functor at each scalar entry.
Definition foreach.hh:132
│ │ │ │ +
std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)
Traverse a blocked vector and call a functor at each scalar entry.
Definition foreach.hh:95
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,393 +1,406 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -multitypeblockvector.hh │ │ │ │ │ +cholmod.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH │ │ │ │ │ -6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +3#pragma once │ │ │ │ │ +4 │ │ │ │ │ +5#if HAVE_SUITESPARSE_CHOLMOD │ │ │ │ │ +6 │ │ │ │ │ +7#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ +11#include<_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ +13#include <_d_u_n_e_/_i_s_t_l_/_f_o_r_e_a_c_h_._h_h> │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ -18#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +18#include │ │ │ │ │ 19 │ │ │ │ │ -20// forward declaration │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22 template < typename... Args > │ │ │ │ │ -23 class MultiTypeBlockVector; │ │ │ │ │ -24} │ │ │ │ │ -25 │ │ │ │ │ -26#include "_g_s_e_t_c_._h_h" │ │ │ │ │ -27 │ │ │ │ │ -28namespace _D_u_n_e { │ │ │ │ │ -29 │ │ │ │ │ -41 template │ │ │ │ │ -_4_2 struct FieldTraits< _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ +20namespace _D_u_n_e { │ │ │ │ │ +21 │ │ │ │ │ +22namespace Impl{ │ │ │ │ │ +23 │ │ │ │ │ +32 struct NoIgnore │ │ │ │ │ +33 { │ │ │ │ │ +34 const NoIgnore& operator[](std::size_t) const { return *this; } │ │ │ │ │ +35 explicit operator bool() const { return false; } │ │ │ │ │ +36 static constexpr std::size_t size() { return 0; } │ │ │ │ │ +37 │ │ │ │ │ +38 }; │ │ │ │ │ +39 │ │ │ │ │ +40 │ │ │ │ │ +41 template │ │ │ │ │ +42 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector& │ │ │ │ │ +flatVector) │ │ │ │ │ 43 { │ │ │ │ │ -_4_4 using _f_i_e_l_d___t_y_p_e = typename _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r::field_type; │ │ │ │ │ -_4_5 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ -46 }; │ │ │ │ │ -56 template < typename... Args > │ │ │ │ │ -_5_7 class _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -58 : public std::tuple │ │ │ │ │ -59 { │ │ │ │ │ -61 typedef std::tuple TupleType; │ │ │ │ │ -62 public: │ │ │ │ │ -63 │ │ │ │ │ -_6_5 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -66 │ │ │ │ │ -70 using TupleType::TupleType; │ │ │ │ │ +44 // traverse the vector once just to compute the size │ │ │ │ │ +45 std::size_t len = _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(blockedVector, [&](auto&&, auto...){}); │ │ │ │ │ +46 flatVector.resize(len); │ │ │ │ │ +47 │ │ │ │ │ +48 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(blockedVector, [&](auto&& entry, auto offset){ │ │ │ │ │ +49 flatVector[offset] = entry; │ │ │ │ │ +50 }); │ │ │ │ │ +51 } │ │ │ │ │ +52 │ │ │ │ │ +53 // special (dummy) case for NoIgnore │ │ │ │ │ +54 template │ │ │ │ │ +55 void copyToFlatVector(const NoIgnore&, FlatVector&) │ │ │ │ │ +56 { │ │ │ │ │ +57 // just do nothing │ │ │ │ │ +58 return; │ │ │ │ │ +59 } │ │ │ │ │ +60 │ │ │ │ │ +61 template │ │ │ │ │ +62 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector& │ │ │ │ │ +blockedVector) │ │ │ │ │ +63 { │ │ │ │ │ +64 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(blockedVector, [&](auto& entry, auto offset){ │ │ │ │ │ +65 entry = flatVector[offset]; │ │ │ │ │ +66 }); │ │ │ │ │ +67 } │ │ │ │ │ +68 │ │ │ │ │ +69 │ │ │ │ │ +70} //namespace Impl │ │ │ │ │ 71 │ │ │ │ │ -_7_5 typedef _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r _t_y_p_e; │ │ │ │ │ -76 │ │ │ │ │ -_8_2 using _f_i_e_l_d___t_y_p_e = Std::detected_t >_:_:_f_i_e_l_d___t_y_p_e...>; │ │ │ │ │ -83 │ │ │ │ │ -84 // make sure that we have an std::common_type: using an assertion produces a │ │ │ │ │ -more readable error message │ │ │ │ │ -85 // than a compiler template instantiation error │ │ │ │ │ -86 static_assert ( sizeof...(Args) == 0 or not std::is_same_v, │ │ │ │ │ -87 "No std::common_type implemented for the given field_types of the Args. │ │ │ │ │ -Please provide an implementation and check that a FieldTraits class is present │ │ │ │ │ -for your type."); │ │ │ │ │ -88 │ │ │ │ │ -89 │ │ │ │ │ -_9_5 static constexpr _s_i_z_e___t_y_p_e _s_i_z_e() │ │ │ │ │ -96 { │ │ │ │ │ -97 return sizeof...(Args); │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -_1_0_2 static constexpr _s_i_z_e___t_y_p_e _N() │ │ │ │ │ -103 { │ │ │ │ │ -104 return sizeof...(Args); │ │ │ │ │ -105 } │ │ │ │ │ +76template │ │ │ │ │ +77class Cholmod : public InverseOperator │ │ │ │ │ +78{ │ │ │ │ │ +79public: │ │ │ │ │ +80 │ │ │ │ │ +86 Cholmod() │ │ │ │ │ +87 { │ │ │ │ │ +88 cholmod_start(&c_); │ │ │ │ │ +89 } │ │ │ │ │ +90 │ │ │ │ │ +96 ~Cholmod() │ │ │ │ │ +97 { │ │ │ │ │ +98 if (L_) │ │ │ │ │ +99 cholmod_free_factor(&L_, &c_); │ │ │ │ │ +100 cholmod_finish(&c_); │ │ │ │ │ +101 } │ │ │ │ │ +102 │ │ │ │ │ +103 // forbid copying to avoid freeing memory twice │ │ │ │ │ +104 Cholmod(const Cholmod&) = delete; │ │ │ │ │ +105 Cholmod& operator=(const Cholmod&) = delete; │ │ │ │ │ 106 │ │ │ │ │ -113 [[deprecated("Use method 'N' instead")]] │ │ │ │ │ -_1_1_4 int _c_o_u_n_t() const │ │ │ │ │ -115 { │ │ │ │ │ -116 return sizeof...(Args); │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -_1_2_0 _s_i_z_e___t_y_p_e _d_i_m() const │ │ │ │ │ +107 │ │ │ │ │ +110 void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, │ │ │ │ │ +InverseOperatorResult& res) │ │ │ │ │ +111 { │ │ │ │ │ +112 apply(x,b,res); │ │ │ │ │ +113 } │ │ │ │ │ +114 │ │ │ │ │ +120 void apply(Vector& x, Vector& b, InverseOperatorResult& res) │ │ │ │ │ 121 { │ │ │ │ │ -122 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ -123 Hybrid::forEach(std::make_index_sequence<_N()>{}, │ │ │ │ │ -124 [&](auto i){result += std::get(*this).dim();}); │ │ │ │ │ -125 │ │ │ │ │ -126 return result; │ │ │ │ │ -127 } │ │ │ │ │ -128 │ │ │ │ │ -147 template< size_type index > │ │ │ │ │ -148 typename std::tuple_element::type& │ │ │ │ │ -_1_4_9 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ -> indexVariable) │ │ │ │ │ -150 { │ │ │ │ │ -151 return std::get(*this); │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -159 template< size_type index > │ │ │ │ │ -160 const typename std::tuple_element::type& │ │ │ │ │ -_1_6_1 _o_p_e_r_a_t_o_r_[_]_ ([[maybe_unused]] const std::integral_constant< size_type, index │ │ │ │ │ -> indexVariable) const │ │ │ │ │ -162 { │ │ │ │ │ -163 return std::get(*this); │ │ │ │ │ -164 } │ │ │ │ │ +122 // do nothing if N=0 │ │ │ │ │ +123 if ( nIsZero_ ) │ │ │ │ │ +124 { │ │ │ │ │ +125 return; │ │ │ │ │ +126 } │ │ │ │ │ +127 │ │ │ │ │ +128 if (x.size() != b.size()) │ │ │ │ │ +129 DUNE_THROW(Exception, "Error in apply(): sizes of x and b do not match!"); │ │ │ │ │ +130 │ │ │ │ │ +131 // cast to double array │ │ │ │ │ +132 auto b2 = std::make_unique(L_->n); │ │ │ │ │ +133 auto x2 = std::make_unique(L_->n); │ │ │ │ │ +134 │ │ │ │ │ +135 // copy to cholmod │ │ │ │ │ +136 auto bp = b2.get(); │ │ │ │ │ +137 │ │ │ │ │ +138 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(b, [&](auto&& entry, auto&& flatIndex){ │ │ │ │ │ +139 if ( subIndices_.empty() ) │ │ │ │ │ +140 bp[ flatIndex ] = entry; │ │ │ │ │ +141 else │ │ │ │ │ +142 if( subIndices_[ flatIndex ] != std::numeric_limits::max() ) │ │ │ │ │ +143 bp[ subIndices_[ flatIndex ] ] = entry; │ │ │ │ │ +144 }); │ │ │ │ │ +145 │ │ │ │ │ +146 // create a cholmod dense object │ │ │ │ │ +147 auto b3 = make_cholmod_dense(cholmod_allocate_dense(L_->n, 1, L_->n, │ │ │ │ │ +CHOLMOD_REAL, &c_), &c_); │ │ │ │ │ +148 // cast because void-ptr │ │ │ │ │ +149 auto b4 = static_cast(b3->x); │ │ │ │ │ +150 std::copy(b2.get(), b2.get() + L_->n, b4); │ │ │ │ │ +151 │ │ │ │ │ +152 // solve for a cholmod x object │ │ │ │ │ +153 auto x3 = make_cholmod_dense(cholmod_solve(CHOLMOD_A, L_, b3.get(), &c_), │ │ │ │ │ +&c_); │ │ │ │ │ +154 // cast because void-ptr │ │ │ │ │ +155 auto xp = static_cast(x3->x); │ │ │ │ │ +156 │ │ │ │ │ +157 // copy into x │ │ │ │ │ +158 _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(x, [&](auto&& entry, auto&& flatIndex){ │ │ │ │ │ +159 if ( subIndices_.empty() ) │ │ │ │ │ +160 entry = xp[ flatIndex ]; │ │ │ │ │ +161 else │ │ │ │ │ +162 if( subIndices_[ flatIndex ] != std::numeric_limits::max() ) │ │ │ │ │ +163 entry = xp[ subIndices_[ flatIndex ] ]; │ │ │ │ │ +164 }); │ │ │ │ │ 165 │ │ │ │ │ -168 template │ │ │ │ │ -_1_6_9 void _o_p_e_r_a_t_o_r_=_ (const T& newval) { │ │ │ │ │ -170 Dune::Hybrid::forEach(*this, [&](auto&& entry) { │ │ │ │ │ -171 entry = newval; │ │ │ │ │ -172 }); │ │ │ │ │ -173 } │ │ │ │ │ -174 │ │ │ │ │ -_1_7_8 void _o_p_e_r_a_t_o_r_+_=_ (const _t_y_p_e& newv) { │ │ │ │ │ -179 using namespace Dune::Hybrid; │ │ │ │ │ -180 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) { │ │ │ │ │ -181 (*this)[i] += newv[i]; │ │ │ │ │ -182 }); │ │ │ │ │ -183 } │ │ │ │ │ -184 │ │ │ │ │ -_1_8_8 void _o_p_e_r_a_t_o_r_-_=_ (const _t_y_p_e& newv) { │ │ │ │ │ -189 using namespace Dune::Hybrid; │ │ │ │ │ -190 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) { │ │ │ │ │ -191 (*this)[i] -= newv[i]; │ │ │ │ │ -192 }); │ │ │ │ │ -193 } │ │ │ │ │ -194 │ │ │ │ │ -196 template::value, int> = 0> │ │ │ │ │ -_1_9_8 void _o_p_e_r_a_t_o_r_*_=_ (const T& w) { │ │ │ │ │ -199 Hybrid::forEach(*this, [&](auto&& entry) { │ │ │ │ │ -200 entry *= w; │ │ │ │ │ -201 }); │ │ │ │ │ -202 } │ │ │ │ │ -203 │ │ │ │ │ -205 template::value, int> = 0> │ │ │ │ │ -_2_0_7 void _o_p_e_r_a_t_o_r_/_=_ (const T& w) { │ │ │ │ │ -208 Hybrid::forEach(*this, [&](auto&& entry) { │ │ │ │ │ -209 entry /= w; │ │ │ │ │ -210 }); │ │ │ │ │ -211 } │ │ │ │ │ +166 // statistics for a direct solver │ │ │ │ │ +167 res.iterations = 1; │ │ │ │ │ +168 res.converged = true; │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +171 │ │ │ │ │ +177 template │ │ │ │ │ +178 void setMatrix(const Matrix& matrix) │ │ │ │ │ +179 { │ │ │ │ │ +180 const Impl::NoIgnore* noIgnore = nullptr; │ │ │ │ │ +181 setMatrix(matrix, noIgnore); │ │ │ │ │ +182 } │ │ │ │ │ +183 │ │ │ │ │ +198 template │ │ │ │ │ +199 void setMatrix(const Matrix& matrix, const Ignore* ignore) │ │ │ │ │ +200 { │ │ │ │ │ +201 // count the number of entries and diagonal entries │ │ │ │ │ +202 int nonZeros = 0; │ │ │ │ │ +203 int numberOfIgnoredDofs = 0; │ │ │ │ │ +204 │ │ │ │ │ +205 │ │ │ │ │ +206 auto [flatRows,flatCols] = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h( matrix, [&](auto&& /*entry*/, │ │ │ │ │ +auto&& flatRowIndex, auto&& flatColIndex){ │ │ │ │ │ +207 if( flatRowIndex <= flatColIndex ) │ │ │ │ │ +208 nonZeros++; │ │ │ │ │ +209 }); │ │ │ │ │ +210 │ │ │ │ │ +211 std::vector flatIgnore; │ │ │ │ │ 212 │ │ │ │ │ -_2_1_3 _f_i_e_l_d___t_y_p_e _o_p_e_r_a_t_o_r_*_ (const _t_y_p_e& newv) const { │ │ │ │ │ -214 using namespace Dune::Hybrid; │ │ │ │ │ -215 return accumulate(integralRange(Hybrid::size(*this)), _f_i_e_l_d___t_y_p_e(0), [&] │ │ │ │ │ -(auto&& a, auto&& i) { │ │ │ │ │ -216 return a + (*this)[i]*newv[i]; │ │ │ │ │ -217 }); │ │ │ │ │ -218 } │ │ │ │ │ -219 │ │ │ │ │ -_2_2_0 _f_i_e_l_d___t_y_p_e _d_o_t (const _t_y_p_e& newv) const { │ │ │ │ │ -221 using namespace Dune::Hybrid; │ │ │ │ │ -222 return accumulate(integralRange(Hybrid::size(*this)), _f_i_e_l_d___t_y_p_e(0), [&] │ │ │ │ │ -(auto&& a, auto&& i) { │ │ │ │ │ -223 return a + (*this)[i].dot(newv[i]); │ │ │ │ │ -224 }); │ │ │ │ │ -225 } │ │ │ │ │ -226 │ │ │ │ │ -_2_2_9 auto _o_n_e___n_o_r_m() const { │ │ │ │ │ -230 using namespace Dune::Hybrid; │ │ │ │ │ -231 return accumulate(*this, typename FieldTraits::real_type(0), │ │ │ │ │ -[&](auto&& a, auto&& entry) { │ │ │ │ │ -232 return a + entry.one_norm(); │ │ │ │ │ -233 }); │ │ │ │ │ -234 } │ │ │ │ │ -235 │ │ │ │ │ -_2_3_8 auto _o_n_e___n_o_r_m___r_e_a_l() const { │ │ │ │ │ -239 using namespace Dune::Hybrid; │ │ │ │ │ -240 return accumulate(*this, typename FieldTraits::real_type(0), │ │ │ │ │ -[&](auto&& a, auto&& entry) { │ │ │ │ │ -241 return a + entry.one_norm_real(); │ │ │ │ │ -242 }); │ │ │ │ │ -243 } │ │ │ │ │ -244 │ │ │ │ │ -_2_4_7 typename FieldTraits::real_type _t_w_o___n_o_r_m_2() const { │ │ │ │ │ -248 using namespace Dune::Hybrid; │ │ │ │ │ -249 return accumulate(*this, typename FieldTraits::real_type(0), │ │ │ │ │ -[&](auto&& a, auto&& entry) { │ │ │ │ │ -250 return a + entry.two_norm2(); │ │ │ │ │ -251 }); │ │ │ │ │ -252 } │ │ │ │ │ +213 if ( ignore ) │ │ │ │ │ +214 { │ │ │ │ │ +215 Impl::copyToFlatVector(*ignore,flatIgnore); │ │ │ │ │ +216 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true); │ │ │ │ │ +217 } │ │ │ │ │ +218 │ │ │ │ │ +219 // Total number of rows │ │ │ │ │ +220 int N = flatRows - numberOfIgnoredDofs; │ │ │ │ │ +221 │ │ │ │ │ +222 nIsZero_ = (N <= 0); │ │ │ │ │ +223 │ │ │ │ │ +224 if ( nIsZero_ ) │ │ │ │ │ +225 { │ │ │ │ │ +226 return; │ │ │ │ │ +227 } │ │ │ │ │ +228 │ │ │ │ │ +229 /* │ │ │ │ │ +230 * CHOLMOD uses compressed-column sparse matrices, but for symmetric │ │ │ │ │ +231 * matrices this is the same as the compressed-row sparse matrix used │ │ │ │ │ +232 * by DUNE. So we can just store Mᵀ instead of M (as M = Mᵀ). │ │ │ │ │ +233 */ │ │ │ │ │ +234 const auto deleter = [c = &this->c_](auto* p) { │ │ │ │ │ +235 cholmod_free_sparse(&p, c); │ │ │ │ │ +236 }; │ │ │ │ │ +237 auto M = std::unique_ptr( │ │ │ │ │ +238 cholmod_allocate_sparse(N, // # rows │ │ │ │ │ +239 N, // # cols │ │ │ │ │ +240 nonZeros, // # of nonzeroes │ │ │ │ │ +241 1, // indices are sorted ( 1 = true) │ │ │ │ │ +242 1, // matrix is "packed" ( 1 = true) │ │ │ │ │ +243 -1, // stype of matrix ( -1 = consider the lower part only ) │ │ │ │ │ +244 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex │ │ │ │ │ +numbers) │ │ │ │ │ +245 &c_ // cholmod_common ptr │ │ │ │ │ +246 ), deleter); │ │ │ │ │ +247 │ │ │ │ │ +248 // copy the data of BCRS matrix to Cholmod Sparse matrix │ │ │ │ │ +249 int* Ap = static_cast(M->p); │ │ │ │ │ +250 int* Ai = static_cast(M->i); │ │ │ │ │ +251 double* Ax = static_cast(M->x); │ │ │ │ │ +252 │ │ │ │ │ 253 │ │ │ │ │ -_2_5_6 typename FieldTraits::real_type _t_w_o___n_o_r_m() const {return sqrt │ │ │ │ │ -(this->_t_w_o___n_o_r_m_2());} │ │ │ │ │ -257 │ │ │ │ │ -_2_6_0 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m() const │ │ │ │ │ -261 { │ │ │ │ │ -262 using namespace Dune::Hybrid; │ │ │ │ │ -263 using std::max; │ │ │ │ │ -264 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -265 │ │ │ │ │ -266 real_type result = 0.0; │ │ │ │ │ -267 // Compute max norm tracking appearing nan values │ │ │ │ │ -268 // if the field type supports nan. │ │ │ │ │ -269 if constexpr (HasNaN()) { │ │ │ │ │ -270 // This variable will preserve any nan value │ │ │ │ │ -271 real_type nanTracker = 1.0; │ │ │ │ │ -272 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -273 forEach(*this, [&](auto&& entry) { │ │ │ │ │ -274 real_type entryNorm = entry.infinity_norm(); │ │ │ │ │ -275 result = max(entryNorm, result); │ │ │ │ │ -276 nanTracker += entryNorm; │ │ │ │ │ -277 }); │ │ │ │ │ -278 // Incorporate possible nan value into result │ │ │ │ │ -279 result *= (nanTracker / nanTracker); │ │ │ │ │ -280 } else { │ │ │ │ │ -281 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -282 forEach(*this, [&](auto&& entry) { │ │ │ │ │ -283 result = max(entry.infinity_norm(), result); │ │ │ │ │ -284 }); │ │ │ │ │ -285 } │ │ │ │ │ -286 return result; │ │ │ │ │ -287 } │ │ │ │ │ -288 │ │ │ │ │ -_2_9_1 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const │ │ │ │ │ -292 { │ │ │ │ │ -293 using namespace Dune::Hybrid; │ │ │ │ │ -294 using std::max; │ │ │ │ │ -295 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -296 │ │ │ │ │ -297 real_type result = 0.0; │ │ │ │ │ -298 // Compute max norm tracking appearing nan values │ │ │ │ │ -299 // if the field type supports nan. │ │ │ │ │ -300 if constexpr (HasNaN()) { │ │ │ │ │ -301 // This variable will preserve any nan value │ │ │ │ │ -302 real_type nanTracker = 1.0; │ │ │ │ │ -303 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -304 forEach(*this, [&](auto&& entry) { │ │ │ │ │ -305 real_type entryNorm = entry.infinity_norm_real(); │ │ │ │ │ -306 result = max(entryNorm, result); │ │ │ │ │ -307 nanTracker += entryNorm; │ │ │ │ │ -308 }); │ │ │ │ │ -309 // Incorporate possible nan value into result │ │ │ │ │ -310 result *= (nanTracker / nanTracker); │ │ │ │ │ -311 } else { │ │ │ │ │ -312 using namespace Dune::Hybrid; // needed for icc, see issue #31 │ │ │ │ │ -313 forEach(*this, [&](auto&& entry) { │ │ │ │ │ -314 result = max(entry.infinity_norm_real(), result); │ │ │ │ │ -315 }); │ │ │ │ │ -316 } │ │ │ │ │ -317 return result; │ │ │ │ │ -318 } │ │ │ │ │ +254 if ( ignore ) │ │ │ │ │ +255 { │ │ │ │ │ +256 // init the mapping │ │ │ │ │ +257 subIndices_.resize(flatRows,std::numeric_limits::max()); │ │ │ │ │ +258 │ │ │ │ │ +259 std::size_t subIndexCounter = 0; │ │ │ │ │ +260 │ │ │ │ │ +261 for ( std::size_t i=0; i flatColIndex ) │ │ │ │ │ +280 return; │ │ │ │ │ +281 │ │ │ │ │ +282 // ok, count the entry │ │ │ │ │ +283 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex; │ │ │ │ │ +284 Ap[idx+1]++; │ │ │ │ │ +285 │ │ │ │ │ +286 }); │ │ │ │ │ +287 │ │ │ │ │ +288 // now accumulate │ │ │ │ │ +289 Ap[0] = 0; │ │ │ │ │ +290 for ( int i=0; i rowPosition(N,0); │ │ │ │ │ +297 │ │ │ │ │ +298 // now we can set the entries │ │ │ │ │ +299 _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& │ │ │ │ │ +flatColIndex){ │ │ │ │ │ +300 │ │ │ │ │ +301 // stop if ignored │ │ │ │ │ +302 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) ) │ │ │ │ │ +303 return; │ │ │ │ │ +304 │ │ │ │ │ +305 // stop if in lower half │ │ │ │ │ +306 if ( flatRowIndex > flatColIndex ) │ │ │ │ │ +307 return; │ │ │ │ │ +308 │ │ │ │ │ +309 // ok, set the entry │ │ │ │ │ +310 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex; │ │ │ │ │ +311 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex; │ │ │ │ │ +312 auto rowStart = Ap[rowIdx]; │ │ │ │ │ +313 auto rowPos = rowPosition[rowIdx]; │ │ │ │ │ +314 Ai[ rowStart + rowPos ] = colIdx; │ │ │ │ │ +315 Ax[ rowStart + rowPos ] = entry; │ │ │ │ │ +316 rowPosition[rowIdx]++; │ │ │ │ │ +317 │ │ │ │ │ +318 }); │ │ │ │ │ 319 │ │ │ │ │ -324 template │ │ │ │ │ -_3_2_5 void _a_x_p_y (const Ta& a, const _t_y_p_e& y) { │ │ │ │ │ -326 using namespace Dune::Hybrid; │ │ │ │ │ -327 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) { │ │ │ │ │ -328 (*this)[i].axpy(a, y[i]); │ │ │ │ │ -329 }); │ │ │ │ │ +320 // Now analyse the pattern and optimal row order │ │ │ │ │ +321 L_ = cholmod_analyze(M.get(), &c_); │ │ │ │ │ +322 │ │ │ │ │ +323 // Do the factorization (this may take some time) │ │ │ │ │ +324 cholmod_factorize(M.get(), L_, &c_); │ │ │ │ │ +325 } │ │ │ │ │ +326 │ │ │ │ │ +327 virtual SolverCategory::Category category() const │ │ │ │ │ +328 { │ │ │ │ │ +329 return SolverCategory::Category::sequential; │ │ │ │ │ 330 } │ │ │ │ │ 331 │ │ │ │ │ -332 }; │ │ │ │ │ -333 │ │ │ │ │ -334 │ │ │ │ │ -335 │ │ │ │ │ -338 template │ │ │ │ │ -_3_3_9 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ -_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_A_r_g_s_._._._>& v) { │ │ │ │ │ -340 using namespace Dune::Hybrid; │ │ │ │ │ -341 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) { │ │ │ │ │ -342 s << "\t(" << i << "):\n" << v[i] << "\n"; │ │ │ │ │ -343 }); │ │ │ │ │ -344 return s; │ │ │ │ │ -345 } │ │ │ │ │ -346 │ │ │ │ │ -347} // end namespace Dune │ │ │ │ │ -348 │ │ │ │ │ -349namespace _s_t_d │ │ │ │ │ -350{ │ │ │ │ │ -355 template │ │ │ │ │ -_3_5_6 struct tuple_element > │ │ │ │ │ -357 { │ │ │ │ │ -_3_5_8 using _t_y_p_e = typename std::tuple_element >::type; │ │ │ │ │ -359 }; │ │ │ │ │ -360} │ │ │ │ │ -361 │ │ │ │ │ -362#endif │ │ │ │ │ -_g_s_e_t_c_._h_h │ │ │ │ │ -Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ -generic way. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -void operator=(const T &newval) │ │ │ │ │ -Assignment operator. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for vector sizes. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_o_u_n_t │ │ │ │ │ -int count() const │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_N │ │ │ │ │ -static constexpr size_type N() │ │ │ │ │ -Number of elements. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args > │ │ │ │ │ ->::field_type... > field_type │ │ │ │ │ -The type used for scalars. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -static constexpr size_type size() │ │ │ │ │ -Return the number of non-zero vector entries. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -std::tuple_element< index, TupleType >::type & operator[](const std:: │ │ │ │ │ -integral_constant< size_type, index > indexVariable) │ │ │ │ │ -Random-access operator. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_t_w_o___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type two_norm() const │ │ │ │ │ -Compute the Euclidean norm. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:256 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename MultiTypeBlockVector< Args... >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_d_i_m │ │ │ │ │ -size_type dim() const │ │ │ │ │ -Number of scalar elements. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_d_o_t │ │ │ │ │ -field_type dot(const type &newv) const │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ -void operator*=(const T &w) │ │ │ │ │ -Multiplication with a scalar. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_a_x_p_y │ │ │ │ │ -void axpy(const Ta &a, const type &y) │ │ │ │ │ -Axpy operation on this vector (*this += a * y) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:325 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ -void operator/=(const T &w) │ │ │ │ │ -Division by a scalar. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_t_y_p_e │ │ │ │ │ -MultiTypeBlockVector< Args... > type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ -FieldTraits< field_type >::real_type infinity_norm_real() const │ │ │ │ │ -Compute the simplified maximum norm (uses 1-norm for complex values) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:291 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_n_e___n_o_r_m │ │ │ │ │ -auto one_norm() const │ │ │ │ │ -Compute the 1-norm. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -void operator-=(const type &newv) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -field_type operator*(const type &newv) const │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:213 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -void operator+=(const type &newv) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:178 │ │ │ │ │ -_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -typename std::tuple_element< i, std::tuple< Args... > >::type type │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:358 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type infinity_norm() const │ │ │ │ │ -Compute the maximum norm. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_n_e___n_o_r_m___r_e_a_l │ │ │ │ │ -auto one_norm_real() const │ │ │ │ │ -Compute the simplified 1-norm (uses 1-norm also for complex values) │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r_:_:_t_w_o___n_o_r_m_2 │ │ │ │ │ -FieldTraits< field_type >::real_type two_norm2() const │ │ │ │ │ -Compute the squared Euclidean norm. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:247 │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +337 cholmod_common& cholmodCommonObject() │ │ │ │ │ +338 { │ │ │ │ │ +339 return c_; │ │ │ │ │ +340 } │ │ │ │ │ +341 │ │ │ │ │ +347 cholmod_factor& cholmodFactor() │ │ │ │ │ +348 { │ │ │ │ │ +349 return *L_; │ │ │ │ │ +350 } │ │ │ │ │ +351 │ │ │ │ │ +357 const cholmod_factor& cholmodFactor() const │ │ │ │ │ +358 { │ │ │ │ │ +359 return *L_; │ │ │ │ │ +360 } │ │ │ │ │ +361private: │ │ │ │ │ +362 │ │ │ │ │ +363 // create a std::unique_ptr to a cholmod_dense object with a deleter │ │ │ │ │ +364 // that calls the appropriate cholmod cleanup routine │ │ │ │ │ +365 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c) │ │ │ │ │ +366 { │ │ │ │ │ +367 const auto deleter = [c](auto* p) { │ │ │ │ │ +368 cholmod_free_dense(&p, c); │ │ │ │ │ +369 }; │ │ │ │ │ +370 return std::unique_ptr(x, deleter); │ │ │ │ │ +371 } │ │ │ │ │ +372 │ │ │ │ │ +373 cholmod_common c_; │ │ │ │ │ +374 cholmod_factor* L_ = nullptr; │ │ │ │ │ +375 │ │ │ │ │ +376 // indicator for a 0x0 problem (due to ignore dof's) │ │ │ │ │ +377 bool nIsZero_ = false; │ │ │ │ │ +378 │ │ │ │ │ +379 // vector mapping all indices in flat order to the not ignored indices │ │ │ │ │ +380 std::vector subIndices_; │ │ │ │ │ +381}; │ │ │ │ │ +382 │ │ │ │ │ +383 struct CholmodCreator{ │ │ │ │ │ +384 template struct isValidBlock : std::false_type{}; │ │ │ │ │ +385 template struct isValidBlock> : std::true_type │ │ │ │ │ +{}; │ │ │ │ │ +386 template struct isValidBlock> : std::true_type │ │ │ │ │ +{}; │ │ │ │ │ +387 │ │ │ │ │ +388 template │ │ │ │ │ +389 std::shared_ptr::type, │ │ │ │ │ +390 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +391 operator()(TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& /*config*/, │ │ │ │ │ +392 std::enable_if_t::type:: │ │ │ │ │ +block_type>::value,int> = 0) const │ │ │ │ │ +393 { │ │ │ │ │ +394 using D = typename Dune::TypeListElement<1, TL>::type; │ │ │ │ │ +395 auto solver = std::make_shared>(); │ │ │ │ │ +396 solver->setMatrix(_m_a_t); │ │ │ │ │ +397 return solver; │ │ │ │ │ +398 } │ │ │ │ │ +399 │ │ │ │ │ +400 // second version with SFINAE to validate the template parameters of │ │ │ │ │ +Cholmod │ │ │ │ │ +401 template │ │ │ │ │ +402 std::shared_ptr::type, │ │ │ │ │ +403 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ +404 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ +*config*/, │ │ │ │ │ +405 std::enable_if_t:: │ │ │ │ │ +type::block_type>::value,int> = 0) const │ │ │ │ │ +406 { │ │ │ │ │ +407 DUNE_THROW(UnsupportedType, "Unsupported Type in Cholmod"); │ │ │ │ │ +408 } │ │ │ │ │ +409 }; │ │ │ │ │ +410 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("cholmod", Dune::CholmodCreator()); │ │ │ │ │ +411 │ │ │ │ │ +412} /* namespace Dune */ │ │ │ │ │ +413 │ │ │ │ │ +414#endif // HAVE_SUITESPARSE_CHOLMOD │ │ │ │ │ +_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ +#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ +_b_v_e_c_t_o_r_._h_h │ │ │ │ │ +This file implements a vector space as a tensor product of a given vector │ │ │ │ │ +space. The number of compon... │ │ │ │ │ +_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_f_o_r_e_a_c_h_._h_h │ │ │ │ │ +_s_o_l_v_e_r_._h_h │ │ │ │ │ +Define general, extensible interface for inverse operators. │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v) │ │ │ │ │ -Send BlockVector to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:590 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A Vector class to support different block types. │ │ │ │ │ -DDeeffiinniittiioonn multitypeblockvector.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h │ │ │ │ │ +std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, │ │ │ │ │ +std::size_t rowOffset=0, std::size_t colOffset=0) │ │ │ │ │ +Traverse a blocked matrix and call a functor at each scalar entry. │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h │ │ │ │ │ +std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0) │ │ │ │ │ +Traverse a blocked vector and call a functor at each scalar entry. │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:95 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00191.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: ldl.hh File Reference │ │ │ │ +dune-istl: foreach.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,66 +70,58 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ +
foreach.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Class for using LDL with ISTL matrices. │ │ │ │ -More...

│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ -#include <dune/istl/solvers.hh>
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ -#include <dune/istl/solverfactory.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ +#include <dune/istl/scaledidmatrix.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::LDL< Matrix >
 Use the LDL package to directly solve linear systems – empty default class. More...
 
class  Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > >
 The LDL direct sparse solver for matrices of type BCRSMatrix. More...
 
struct  Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
 
struct  Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
 
struct  Dune::LDLCreator
 
struct  Dune::LDLCreator::isValidBlock< F >
 
struct  Dune::LDLCreator::isValidBlock< FieldVector< double, k > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ForEach
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("ldl", Dune::LDLCreator())
 
template<class Matrix >
auto Dune::ForEach::rows (Matrix const &matrix)
 
template<class Matrix >
auto Dune::ForEach::cols (Matrix const &matrix)
 
template<class Vector >
auto Dune::ForEach::size (Vector const &vector)
 
template<class Vector , class F >
std::size_t Dune::flatVectorForEach (Vector &&vector, F &&f, std::size_t offset=0)
 Traverse a blocked vector and call a functor at each scalar entry.
 
template<class Matrix , class F >
std::pair< std::size_t, std::size_t > Dune::flatMatrixForEach (Matrix &&matrix, F &&f, std::size_t rowOffset=0, std::size_t colOffset=0)
 Traverse a blocked matrix and call a functor at each scalar entry.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Class for using LDL with ISTL matrices.

│ │ │ │ -
Author
Marco Agnese, Andrea Sacconi
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,50 +1,51 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -ldl.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ -Class for using LDL with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +foreach.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_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_:_:_L_D_L_<_ _M_a_t_r_i_x_ _> │ │ │ │ │ -  Use the LDL package to directly solve linear systems – empty default │ │ │ │ │ - class. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _> │ │ │ │ │ -  The LDL direct sparse solver for matrices of type _B_C_R_S_M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_, │ │ │ │ │ - _A_ _>_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _d_o_u_b_l_e_,_ _k_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_o_r_E_a_c_h │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("ldl", _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r()) │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_r_o_w_s (_M_a_t_r_i_x const │ │ │ │ │ + &matrix) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_c_o_l_s (_M_a_t_r_i_x const │ │ │ │ │ + &matrix) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_s_i_z_e (Vector const │ │ │ │ │ + &vector) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + std::size_t  _D_u_n_e_:_:_f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h (Vector │ │ │ │ │ + &&vector, F &&f, std::size_t offset=0) │ │ │ │ │ +  Traverse a blocked vector and call a │ │ │ │ │ + functor at each scalar entry. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::pair< std::size_t, std::size_t >  _D_u_n_e_:_:_f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h (_M_a_t_r_i_x │ │ │ │ │ + &&matrix, F &&f, std::size_t │ │ │ │ │ + rowOffset=0, std::size_t colOffset=0) │ │ │ │ │ +  Traverse a blocked matrix and call a │ │ │ │ │ + functor at each scalar entry. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Class for using LDL with ISTL matrices. │ │ │ │ │ - Author │ │ │ │ │ - Marco Agnese, Andrea Sacconi │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html │ │ │ │ @@ -21,4947 +21,2128 @@ │ │ │ │ 00000140: 2267 656e 6572 6174 6f72 2220 636f 6e74 "generator" cont │ │ │ │ 00000150: 656e 743d 2244 6f78 7967 656e 2031 2e39 ent="Doxygen 1.9 │ │ │ │ 00000160: 2e38 222f 3e0a 3c6d 6574 6120 6e61 6d65 .8"/>..dune-istl: ld │ │ │ │ -000001c0: 6c2e 6868 2053 6f75 7263 6520 4669 6c65 l.hh Source File │ │ │ │ -000001d0: 3c2f 7469 746c 653e 0a3c 6c69 6e6b 2068 ...< │ │ │ │ -00000280: 2f73 6372 6970 743e 0a3c 6c69 6e6b 2068 /script>...< │ │ │ │ -00000310: 7363 7269 7074 2074 7970 653d 2274 6578 script type="tex │ │ │ │ -00000320: 742f 6a61 7661 7363 7269 7074 2220 7372 t/javascript" sr │ │ │ │ -00000330: 633d 2273 6561 7263 682f 7365 6172 6368 c="search/search │ │ │ │ -00000340: 2e6a 7322 3e3c 2f73 6372 6970 743e 0a3c .js">.< │ │ │ │ -00000350: 6c69 6e6b 2068 7265 663d 2264 6f78 7967 link href="doxyg │ │ │ │ -00000360: 656e 2e63 7373 2220 7265 6c3d 2273 7479 en.css" rel="sty │ │ │ │ -00000370: 6c65 7368 6565 7422 2074 7970 653d 2274 lesheet" type="t │ │ │ │ -00000380: 6578 742f 6373 7322 202f 3e0a 3c2f 6865 ext/css" />...
.......
.
...
.
.
.
.
< │ │ │ │ +00000a20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
Loading │ │ │ │ +00000a50: 2e2e 2e3c 2f64 6976 3e0a 3c64 6976 2063 ...
.
S │ │ │ │ +00000a80: 6561 7263 6869 6e67 2e2e 2e3c 2f64 6976 earching...
.
No Matche │ │ │ │ +00000ac0: 733c 2f64 6976 3e0a 3c2f 6469 763e 0a3c s
.
.< │ │ │ │ +00000ad0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 2f64 /div>.
...
.
    . │ │ │ │ +00000b10: 3c6c 6920 636c 6173 733d 226e 6176 656c │ │ │ │ +00000b70: 3c6c 6920 636c 6173 733d 226e 6176 656c │ │ │ │ +00000bd0: 2020 3c2f 756c 3e0a 3c2f 6469 763e 0a3c
.
.< │ │ │ │ +00000be0: 2f64 6976 3e3c 212d 2d20 746f 7020 2d2d /div>. │ │ │ │ +00000c60: 3c64 6976 2063 6c61 7373 3d22 636f 6e74
.Go │ │ │ │ +00000c90: 746f 2074 6865 2064 6f63 756d 656e 7461 to the documenta │ │ │ │ +00000ca0: 7469 6f6e 206f 6620 7468 6973 2066 696c tion of this fil │ │ │ │ +00000cb0: 652e 3c2f 613e 3c64 6976 2063 6c61 7373 e.
< │ │ │ │ +00000d00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00000d10: 6e6f 223e 2020 2020 313c 2f73 7061 6e3e no"> 1 │ │ │ │ +00000d20: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // SPDX-Fi │ │ │ │ +00000d40: 6c65 436f 7079 7269 6768 7454 6578 743a leCopyrightText: │ │ │ │ +00000d50: 2043 6f70 7972 6967 6874 2028 4329 2044 Copyright (C) D │ │ │ │ +00000d60: 554e 4520 5072 6f6a 6563 7420 636f 6e74 UNE Project cont │ │ │ │ +00000d70: 7269 6275 746f 7273 2c20 7365 6520 6669 ributors, see fi │ │ │ │ +00000d80: 6c65 204c 4943 454e 5345 2e6d 6420 696e le LICENSE.md in │ │ │ │ +00000d90: 206d 6f64 756c 6520 726f 6f74 3c2f 7370 module root
.
2// SPDX-Lice │ │ │ │ +00000e20: 6e73 652d 4964 656e 7469 6669 6572 3a20 nse-Identifier: │ │ │ │ +00000e30: 4c69 6365 6e73 6552 6566 2d47 504c 2d32 LicenseRef-GPL-2 │ │ │ │ +00000e40: 2e30 2d6f 6e6c 792d 7769 7468 2d44 554e .0-only-with-DUN │ │ │ │ +00000e50: 452d 6578 6365 7074 696f 6e3c 2f73 7061 E-exception
.
3#pragma │ │ │ │ +00000ee0: 6f6e 6365 3c2f 7370 616e 3e3c 2f64 6976 once
.
4< │ │ │ │ +00000f40: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00000f60: 3c61 2069 643d 226c 3030 3030 3522 206e 5#in │ │ │ │ +00000fc0: 636c 7564 6526 6c74 3b74 7970 655f 7472 clude<type_tr │ │ │ │ +00000fd0: 6169 7473 2667 743b 3c2f 7370 616e 3e3c aits>< │ │ │ │ +00000fe0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00001030: 2020 363c 2f73 7061 6e3e 3c73 7061 6e20 6#include< │ │ │ │ +00001060: 3b75 7469 6c69 7479 2667 743b 3c2f 7370 ;utility>
.
7#includ │ │ │ │ +000010f0: 6526 6c74 3b63 6173 7365 7274 2667 743b e<cassert> │ │ │ │ +00001100: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00001120: 3c61 2069 643d 226c 3030 3030 3822 206e 8
.
9#includ │ │ │ │ +000011e0: 6526 6c74 3b64 756e 652f 636f 6d6d 6f6e e<dune/common │ │ │ │ +000011f0: 2f73 7464 2f74 7970 655f 7472 6169 7473 /std/type_traits │ │ │ │ +00001200: 2e68 6826 6774 3b3c 2f73 7061 6e3e 3c2f .hh>.
│ │ │ │ +00001260: 3130 3c2f 7370 616e 3e3c 7370 616e 2063 10#include< │ │ │ │ +00001290: 6475 6e65 2f63 6f6d 6d6f 6e2f 6469 6167 dune/common/diag │ │ │ │ +000012a0: 6f6e 616c 6d61 7472 6978 2e68 6826 6774 onalmatrix.hh> │ │ │ │ +000012b0: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +000012c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000012d0: 3e3c 6120 6964 3d22 6c30 3030 3131 2220 > 11
#i │ │ │ │ +00001330: 6e63 6c75 6465 266c 743b 6475 6e65 2f63 nclude<dune/c │ │ │ │ +00001340: 6f6d 6d6f 6e2f 6879 6272 6964 7574 696c ommon/hybridutil │ │ │ │ +00001350: 6974 6965 732e 6868 2667 743b 3c2f 7370 ities.hh>
.
12#includ │ │ │ │ +000013e0: 6526 6c74 3b64 756e 652f 636f 6d6d 6f6e e<dune/common │ │ │ │ +000013f0: 2f69 6e64 6963 6573 2e68 6826 6774 3b3c /indices.hh>< │ │ │ │ +00001400: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00001420: 6120 6964 3d22 6c30 3030 3133 2220 6e61 a id="l00013" na │ │ │ │ +00001430: 6d65 3d22 6c30 3030 3133 223e 3c2f 613e me="l00013"> │ │ │ │ +00001440: 3c73 7061 6e20 636c 6173 733d 226c 696e 13
.
14#include │ │ │ │ +000014e0: 266c 743b 3c61 2063 6c61 7373 3d22 636f <dune/istl │ │ │ │ +00001510: 2f62 6372 736d 6174 7269 782e 6868 3c2f /bcrsmatrix.hh>.
1 │ │ │ │ +00001580: 353c 2f73 7061 6e3e 3c73 7061 6e20 636c 5#include<< │ │ │ │ +000015b0: 6120 636c 6173 733d 2263 6f64 6522 2068 a class="code" h │ │ │ │ +000015c0: 7265 663d 2261 3030 3232 372e 6874 6d6c ref="a00227.html │ │ │ │ +000015d0: 223e 6475 6e65 2f69 7374 6c2f 7363 616c ">dune/istl/scal │ │ │ │ +000015e0: 6564 6964 6d61 7472 6978 2e68 683c 2f61 edidmatrix.hh>.
16 │ │ │ │ +00001650: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00001660: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00001670: 3e3c 6120 6964 3d22 6c30 3030 3137 2220 > 17namespa │ │ │ │ +000016d0: 6365 203c 2f73 7061 6e3e 3c61 2063 6c61 ce Dune{
.
18 < │ │ │ │ +00001770: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000017c0: 2031 393c 2f73 7061 6e3e 2020 3c73 7061 19 namespace Impl {
. │ │ │ │ 00001800: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +00001870: 2069 643d 226c 3030 3032 3122 206e 616d id="l00021" nam │ │ │ │ +00001880: 653d 226c 3030 3032 3122 3e3c 2f61 3e3c e="l00021">< │ │ │ │ 00001890: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000018a0: 6e6f 223e 2020 2032 323c 2f73 7061 6e3e no"> 22 │ │ │ │ -000018b0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ │ -000018d0: 7564 6520 266c 743b 6475 6e65 2f63 6f6d ude <dune/com │ │ │ │ -000018e0: 6d6f 6e2f 6578 6365 7074 696f 6e73 2e68 mon/exceptions.h │ │ │ │ -000018f0: 6826 6774 3b3c 2f73 7061 6e3e 3c2f 6469 h>.
23 │ │ │ │ -00001950: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -00001960: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001970: 3e3c 6120 6964 3d22 6c30 3030 3234 2220 > 24#i │ │ │ │ -000019d0: 6e63 6c75 6465 2026 6c74 3b3c 6120 636c nclude <du │ │ │ │ -00001a00: 6e65 2f69 7374 6c2f 6263 6373 6d61 7472 ne/istl/bccsmatr │ │ │ │ -00001a10: 6978 696e 6974 6961 6c69 7a65 722e 6868 ixinitializer.hh │ │ │ │ -00001a20: 3c2f 613e 2667 743b 3c2f 7370 616e 3e3c >< │ │ │ │ -00001a30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00001a80: 2032 353c 2f73 7061 6e3e 3c73 7061 6e20 25#include &l │ │ │ │ -00001ab0: 743b 3c61 2063 6c61 7373 3d22 636f 6465 t;dune/istl/s │ │ │ │ -00001ae0: 6f6c 7665 7273 2e68 683c 2f61 3e26 6774 olvers.hh> │ │ │ │ -00001af0: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ │ -00001b00: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001b10: 3e3c 6120 6964 3d22 6c30 3030 3236 2220 > 26#i │ │ │ │ -00001b70: 6e63 6c75 6465 2026 6c74 3b3c 6120 636c nclude <du │ │ │ │ -00001ba0: 6e65 2f69 7374 6c2f 736f 6c76 6572 7479 ne/istl/solverty │ │ │ │ -00001bb0: 7065 2e68 683c 2f61 3e26 6774 3b3c 2f73 pe.hh>
.
27< │ │ │ │ -00001c20: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ -00001c30: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor">#inclu │ │ │ │ -00001c40: 6465 2026 6c74 3b3c 6120 636c 6173 733d de <dune/i │ │ │ │ -00001c70: 7374 6c2f 736f 6c76 6572 6661 6374 6f72 stl/solverfactor │ │ │ │ -00001c80: 792e 6868 3c2f 613e 2667 743b 3c2f 7370 y.hh>
.
28 < │ │ │ │ -00001cf0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00001d40: 2032 393c 2f73 7061 6e3e 3c73 7061 6e20 29 │ │ │ │ -00001d60: 6e61 6d65 7370 6163 6520 3c2f 7370 616e namespace Dune {
.
41< │ │ │ │ -00001e00: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> // │ │ │ │ -00001e20: 2066 6f72 7761 7264 2064 6563 6c61 7261 forward declara │ │ │ │ -00001e30: 7469 6f6e 733c 2f73 7061 6e3e 3c2f 6469 tions.
42 │ │ │ │ -00001e90: 3c2f 7370 616e 3e20 203c 7370 616e 2063 t │ │ │ │ -00001eb0: 656d 706c 6174 653c 2f73 7061 6e3e 266c emplate&l │ │ │ │ -00001ec0: 743b 3c73 7061 6e20 636c 6173 733d 226b t;class M, cl │ │ │ │ -00001f00: 6173 733c 2f73 7061 6e3e 2054 2c20 3c73 ass T, class │ │ │ │ -00001f30: 2054 4d2c 203c 7370 616e 2063 6c61 7373 TM, class │ │ │ │ -00001f50: 3c2f 7370 616e 3e20 5444 2c20 3c73 7061 TD, class T │ │ │ │ -00001f80: 4126 6774 3b3c 2f64 6976 3e0a 3c64 6976 A>
.
< │ │ │ │ -00001fc0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00001fd0: 6e6f 223e 2020 2034 333c 2f73 7061 6e3e no"> 43 │ │ │ │ -00001fe0: 2020 3c73 7061 6e20 636c 6173 733d 226b class SeqOverlapp │ │ │ │ -00002010: 696e 6753 6368 7761 727a 3b3c 2f64 6976 ingSchwarz;
.
44< │ │ │ │ -00002070: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -00002090: 3c61 2069 643d 226c 3030 3034 3522 206e 45 templa │ │ │ │ -000020f0: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class │ │ │ │ -00002120: 542c 203c 7370 616e 2063 6c61 7373 3d22 T, boo │ │ │ │ -00002140: 6c3c 2f73 7061 6e3e 2074 6167 2667 743b l tag> │ │ │ │ -00002150: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -000021a0: 2020 3436 3c2f 7370 616e 3e20 203c 7370 46 struct SeqOverlappingS │ │ │ │ -000021e0: 6368 7761 727a 4173 7365 6d62 6c65 7248 chwarzAssemblerH │ │ │ │ -000021f0: 656c 7065 723b 3c2f 6469 763e 0a3c 6469 elper;
.< │ │ │ │ -00002210: 6120 6964 3d22 6c30 3030 3437 2220 6e61 a id="l00047" na │ │ │ │ -00002220: 6d65 3d22 6c30 3030 3437 223e 3c2f 613e me="l00047"> │ │ │ │ -00002230: 3c73 7061 6e20 636c 6173 733d 226c 696e 47
.
54 < │ │ │ │ -000022b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000022c0: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template<cl │ │ │ │ -000022f0: 6173 733c 2f73 7061 6e3e 204d 6174 7269 ass Matri │ │ │ │ -00002300: 7826 6774 3b3c 2f64 6976 3e0a 3c64 6976 x>
.
..< │ │ │ │ -00002440: 6120 6964 3d22 6c30 3030 3536 2220 6e61 a id="l00056" na │ │ │ │ -00002450: 6d65 3d22 6c30 3030 3536 223e 3c2f 613e me="l00056"> │ │ │ │ -00002460: 3c73 7061 6e20 636c 6173 733d 226c 696e 56 {};
..
5 │ │ │ │ -000024e0: 373c 2f73 7061 6e3e 203c 2f64 6976 3e0a 7
. │ │ │ │ -000024f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ -00002660: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ -000027d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00002800: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 73 : public < │ │ │ │ -00002850: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00002860: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ │ -00002870: 3237 3034 2e68 746d 6c22 3e49 6e76 6572 2704.html">Inver │ │ │ │ -00002880: 7365 4f70 6572 6174 6f72 3c2f 613e 266c seOperator&l │ │ │ │ -00002890: 743b 426c 6f63 6b56 6563 746f 7226 6c74 t;BlockVector< │ │ │ │ -000028a0: 3b46 6965 6c64 5665 6374 6f72 266c 743b ;FieldVector< │ │ │ │ -000028b0: 542c 6d26 6774 3b2c 2074 7970 656e 616d T,m>, typenam │ │ │ │ -000028c0: 6520 7374 643a 3a61 6c6c 6f63 6174 6f72 e std::allocator │ │ │ │ -000028d0: 5f74 7261 6974 7326 6c74 3b41 2667 743b _traits<A> │ │ │ │ -000028e0: 3a3a 7465 6d70 6c61 7465 2072 6562 696e ::template rebin │ │ │ │ -000028f0: 645f 616c 6c6f 6326 6c74 3b46 6965 6c64 d_alloc<Field │ │ │ │ -00002900: 5665 6374 6f72 266c 743b 542c 6d26 6774 Vector<T,m> │ │ │ │ -00002910: 3b20 2667 743b 2026 6774 3b2c 3c2f 6469 ; > >,.
74 │ │ │ │ -00002970: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ -00002980: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -00002990: 2020 2020 426c 6f63 6b56 6563 746f 7226 BlockVector& │ │ │ │ -000029a0: 6c74 3b46 6965 6c64 5665 6374 6f72 266c lt;FieldVector&l │ │ │ │ -000029b0: 743b 542c 6e26 6774 3b2c 2074 7970 656e t;T,n>, typen │ │ │ │ -000029c0: 616d 6520 7374 643a 3a61 6c6c 6f63 6174 ame std::allocat │ │ │ │ -000029d0: 6f72 5f74 7261 6974 7326 6c74 3b41 2667 or_traits<A&g │ │ │ │ -000029e0: 743b 3a3a 7465 6d70 6c61 7465 2072 6562 t;::template reb │ │ │ │ -000029f0: 696e 645f 616c 6c6f 6326 6c74 3b46 6965 ind_alloc<Fie │ │ │ │ -00002a00: 6c64 5665 6374 6f72 266c 743b 542c 6e26 ldVector<T,n& │ │ │ │ -00002a10: 6774 3b20 2667 743b 2026 6774 3b20 2667 gt; > > &g │ │ │ │ -00002a20: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
75 { │ │ │ │ -00002a80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00002ad0: 2020 3736 3c2f 7370 616e 3e20 2020 203c 76 < │ │ │ │ -00002ae0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00002af0: 6f72 6422 3e70 7562 6c69 633c 2f73 7061 ord">public:
.
78 typedef │ │ │ │ -00002bd0: 203c 6120 636c 6173 733d 2263 6f64 6520 Dun │ │ │ │ -00002c00: 653a 3a42 4352 534d 6174 7269 7826 6c74 e::BCRSMatrix< │ │ │ │ -00002c10: 3b46 6965 6c64 4d61 7472 6978 266c 743b ;FieldMatrix< │ │ │ │ -00002c20: 542c 6e2c 6d26 6774 3b3c 2f61 3e2c 4126 T,n,m>,A& │ │ │ │ -00002c30: 6774 3b20 3c61 2063 6c61 7373 3d22 636f gt; Matrix; │ │ │ │ -00002c90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
< │ │ │ │ -00002ce0: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -00002cf0: 7265 663d 2261 3030 3233 332e 6874 6d6c ref="a00233.html │ │ │ │ -00002d00: 2367 6139 3633 6435 3930 3334 3264 3537 #ga963d590342d57 │ │ │ │ -00002d10: 3936 6366 6366 6434 3631 3431 6262 6135 96cfcfd46141bba5 │ │ │ │ -00002d20: 3162 6522 3e20 2020 3739 3c2f 613e 3c2f 1be"> 79 t │ │ │ │ -00002d50: 7970 6564 6566 3c2f 7370 616e 3e20 3c61 ypedef Dune:: │ │ │ │ -00002d90: 4243 5253 4d61 7472 6978 266c 743b 4669 BCRSMatrix<Fi │ │ │ │ -00002da0: 656c 644d 6174 7269 7826 6c74 3b54 2c6e eldMatrix<T,n │ │ │ │ -00002db0: 2c6d 2667 743b 3c2f 613e 2c41 2667 743b ,m>,A> │ │ │ │ -00002dc0: 203c 6120 636c 6173 733d 2263 6f64 6520 matrix_type;
.
81 │ │ │ │ -00002ec0: 3c2f 7370 616e 3e20 2020 203c 7370 616e typedef │ │ │ │ -00002ef0: 4475 6e65 3a3a 4953 544c 3a3a 496d 706c Dune::ISTL::Impl │ │ │ │ -00002f00: 3a3a 4243 4353 4d61 7472 6978 266c 743b ::BCCSMatrix< │ │ │ │ -00002f10: 542c 696e 7426 6774 3b20 3c61 2063 6c61 T,int> LDLMa │ │ │ │ -00002f70: 7472 6978 3c2f 613e 3b3c 2f64 6976 3e0a trix;
. │ │ │ │ -00002f80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ -00002fb0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> │ │ │ │ -00003010: 2038 333c 2f61 3e3c 2f73 7061 6e3e 2020 83 │ │ │ │ -00003020: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef< │ │ │ │ -00003040: 2f73 7061 6e3e 2049 5354 4c3a 3a49 6d70 /span> ISTL::Imp │ │ │ │ -00003050: 6c3a 3a42 4343 534d 6174 7269 7849 6e69 l::BCCSMatrixIni │ │ │ │ -00003060: 7469 616c 697a 6572 266c 743b 4243 5253 tializer<BCRS │ │ │ │ -00003070: 4d61 7472 6978 266c 743b 4669 656c 644d Matrix<FieldM │ │ │ │ -00003080: 6174 7269 7826 6c74 3b54 2c6e 2c6d 2667 atrix<T,n,m&g │ │ │ │ -00003090: 743b 2c41 2667 743b 2c20 3c73 7061 6e20 t;,A>, int&g │ │ │ │ -000030c0: 743b 203c 6120 636c 6173 733d 2263 6f64 t; MatrixInitia │ │ │ │ -00003120: 6c69 7a65 723c 2f61 3e3b 3c2f 6469 763e lizer;
│ │ │ │ -00003130: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ -00003350: 6120 6964 3d22 6c30 3030 3837 2220 6e61 a id="l00087" na │ │ │ │ -00003360: 6d65 3d22 6c30 3030 3837 223e 3c2f 613e me="l00087"> │ │ │ │ -00003370: 3c73 7061 6e20 636c 6173 733d 226c 696e 87 │ │ │ │ -000033d0: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -000033e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000033f0: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord">typedef │ │ │ │ -00003430: 4475 6e65 3a3a 426c 6f63 6b56 6563 746f Dune::BlockVecto │ │ │ │ -00003440: 7226 6c74 3b46 6965 6c64 5665 6374 6f72 r<FieldVector │ │ │ │ -00003450: 266c 743b 542c 6e26 6774 3b3c 2f61 3e2c <T,n>, │ │ │ │ -00003460: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typename< │ │ │ │ -00003480: 2f73 7061 6e3e 2073 7464 3a3a 616c 6c6f /span> std::allo │ │ │ │ -00003490: 6361 746f 725f 7472 6169 7473 266c 743b cator_traits< │ │ │ │ -000034a0: 4126 6774 3b3a 3a74 656d 706c 6174 6520 A>::template │ │ │ │ -000034b0: 7265 6269 6e64 5f61 6c6c 6f63 266c 743b rebind_alloc< │ │ │ │ -000034c0: 4669 656c 6456 6563 746f 7226 6c74 3b54 FieldVector<T │ │ │ │ -000034d0: 2c6e 2667 743b 2026 6774 3b20 2667 743b ,n> > > │ │ │ │ -000034e0: 203c 6120 636c 6173 733d 2263 6f64 6520 range_type │ │ │ │ -00003540: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00003590: 2020 2038 383c 2f73 7061 6e3e 203c 2f64 88 .
.
90 virtual │ │ │ │ -000036b0: 203c 6120 636c 6173 733d 2263 6f64 6520 SolverCateg │ │ │ │ -00003710: 6f72 793a 3a43 6174 6567 6f72 793c 2f61 ory::Category category │ │ │ │ -00003780: 2829 3c73 7061 6e20 636c 6173 733d 226b () const
.
< │ │ │ │ -000037e0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000037f0: 6e6f 223e 2020 2039 313c 2f73 7061 6e3e no"> 91 │ │ │ │ -00003800: 3c73 7061 6e20 636c 6173 733d 226b 6579 {
.. │ │ │ │ -00003960: 3c61 2069 643d 226c 3030 3039 3322 206e 93 }
..
│ │ │ │ -00003a00: 3934 3c2f 7370 616e 3e20 3c2f 6469 763e 94
│ │ │ │ -00003a10: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
.
< │ │ │ │ -00003aa0: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -00003ab0: 7265 663d 2261 3030 3233 332e 6874 6d6c ref="a00233.html │ │ │ │ -00003ac0: 2367 6166 6663 3339 3130 3265 6233 6332 #gaffc39102eb3c2 │ │ │ │ -00003ad0: 3062 6130 3537 6332 3839 3762 3433 6264 0ba057c2897b43bd │ │ │ │ -00003ae0: 6136 6622 3e20 2031 3034 3c2f 613e 3c2f a6f"> 104 LDL(const Matrix& │ │ │ │ -00003bb0: 3b20 6d61 7472 6978 2c20 3c73 7061 6e20 ; matrix, int v │ │ │ │ -00003be0: 6572 626f 7365 3d30 2920 3a20 6d61 7472 erbose=0) : matr │ │ │ │ -00003bf0: 6978 4973 4c6f 6164 6564 5f28 6661 6c73 ixIsLoaded_(fals │ │ │ │ -00003c00: 6529 2c20 7665 7262 6f73 655f 2876 6572 e), verbose_(ver │ │ │ │ -00003c10: 626f 7365 293c 2f64 6976 3e0a 3c64 6976 bose)
.
< │ │ │ │ -00003c50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00003c60: 6e6f 223e 2020 3130 353c 2f73 7061 6e3e no"> 105 │ │ │ │ -00003c70: 2020 2020 7b3c 2f64 6976 3e0a 3c64 6976 {
.
< │ │ │ │ -00003cb0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00003cc0: 6e6f 223e 2020 3130 363c 2f73 7061 6e3e no"> 106 │ │ │ │ -00003cd0: 2020 2020 2020 3c73 7061 6e20 636c 6173 //ch │ │ │ │ -00003cf0: 6563 6b20 7768 6574 6865 7220 5420 6973 eck whether T is │ │ │ │ -00003d00: 2061 2073 7570 706f 7274 6564 2074 7970 a supported typ │ │ │ │ -00003d10: 653c 2f73 7061 6e3e 3c2f 6469 763e 0a3c e
.< │ │ │ │ -00003d20: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00003d30: 3e3c 6120 6964 3d22 6c30 3031 3037 2220 > 107 s │ │ │ │ -00003d90: 7461 7469 635f 6173 7365 7274 3c2f 7370 tatic_assert(std::is_same │ │ │ │ -00003db0: 266c 743b 542c 646f 7562 6c65 2667 743b <T,double> │ │ │ │ -00003dc0: 3a3a 7661 6c75 652c 3c73 7061 6e20 636c ::value,"Unsupp │ │ │ │ -00003df0: 6f72 7465 6420 5479 7065 2069 6e20 4c44 orted Type in LD │ │ │ │ -00003e00: 4c20 286f 6e6c 7920 646f 7562 6c65 2073 L (only double s │ │ │ │ -00003e10: 7570 706f 7274 6564 2926 7175 6f74 3b3c upported)"< │ │ │ │ -00003e20: 2f73 7061 6e3e 293b 3c2f 6469 763e 0a3c /span>);
.< │ │ │ │ -00003e30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00003e40: 3e3c 6120 6964 3d22 6c30 3031 3038 2220 > 108 setMatr │ │ │ │ -00003e90: 6978 286d 6174 7269 7829 3b3c 2f64 6976 ix(matrix);
.
109< │ │ │ │ -00003ef0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }
.
.
110 .
.
120 L │ │ │ │ -000040a0: 444c 3c2f 613e 283c 7370 616e 2063 6c61 DL(con │ │ │ │ -000040c0: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st Matrix │ │ │ │ -00004100: 2661 6d70 3b20 6d61 7472 6978 2c20 3c73 & matrix, int verbose, bool) : matrixIsLoa │ │ │ │ -00004170: 6465 645f 2866 616c 7365 292c 2076 6572 ded_(false), ver │ │ │ │ -00004180: 626f 7365 5f28 7665 7262 6f73 6529 3c2f bose_(verbose).
1 │ │ │ │ -000041e0: 3231 3c2f 7370 616e 3e20 2020 207b 3c2f 21 {.
1 │ │ │ │ -00004240: 3232 3c2f 7370 616e 3e20 2020 2020 203c 22 < │ │ │ │ -00004250: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ -00004260: 656e 7422 3e2f 2f63 6865 636b 2077 6865 ent">//check whe │ │ │ │ -00004270: 7468 6572 2054 2069 7320 6120 7375 7070 ther T is a supp │ │ │ │ -00004280: 6f72 7465 6420 7479 7065 3c2f 7370 616e orted type
.
│ │ │ │ -000042e0: 2020 3132 333c 2f73 7061 6e3e 2020 2020 123 │ │ │ │ -000042f0: 2020 3c73 7061 6e20 636c 6173 733d 226b static_a │ │ │ │ -00004310: 7373 6572 743c 2f73 7061 6e3e 2873 7464 ssert(std │ │ │ │ -00004320: 3a3a 6973 5f73 616d 6526 6c74 3b54 2c64 ::is_same<T,d │ │ │ │ -00004330: 6f75 626c 6526 6774 3b3a 3a76 616c 7565 ouble>::value │ │ │ │ -00004340: 2c3c 7370 616e 2063 6c61 7373 3d22 7374 ,&qu │ │ │ │ -00004360: 6f74 3b55 6e73 7570 706f 7274 6564 2054 ot;Unsupported T │ │ │ │ -00004370: 7970 6520 696e 204c 444c 2028 6f6e 6c79 ype in LDL (only │ │ │ │ -00004380: 2064 6f75 626c 6520 7375 7070 6f72 7465 double supporte │ │ │ │ -00004390: 6429 2671 756f 743b 3c2f 7370 616e 3e29 d)") │ │ │ │ -000043a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -000043f0: 2020 3132 343c 2f73 7061 6e3e 2020 2020 124 │ │ │ │ -00004400: 2020 7365 744d 6174 7269 7828 6d61 7472 setMatrix(matr │ │ │ │ -00004410: 6978 293b 3c2f 6469 763e 0a3c 6469 7620 ix);
.
125 │ │ │ │ -00004470: 2020 207d 3c2f 6469 763e 0a3c 2f64 6976 }
.
.
126< │ │ │ │ -000044d0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
..
136 LDL( │ │ │ │ -00004620: 3c73 7061 6e20 636c 6173 733d 226b 6579 const M │ │ │ │ -00004670: 6174 7269 783c 2f61 3e26 616d 703b 206d atrix& m │ │ │ │ -00004680: 6174 7269 782c 203c 7370 616e 2063 6c61 atrix, con │ │ │ │ -000046a0: 7374 3c2f 7370 616e 3e20 5061 7261 6d65 st Parame │ │ │ │ -000046b0: 7465 7254 7265 6526 616d 703b 2063 6f6e terTree& con │ │ │ │ -000046c0: 6669 6729 3c2f 6469 763e 0a3c 6469 7620 fig)
.
137 │ │ │ │ -00004720: 2020 2020 203a 203c 6120 636c 6173 733d : LDL(matri │ │ │ │ -00004760: 782c 2063 6f6e 6669 672e 3c61 2063 6c61 x, config.get<int>(" │ │ │ │ -000047f0: 7665 7262 6f73 6526 7175 6f74 3b3c 2f73 verbose", 0))
. │ │ │ │ -00004810: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 │ │ │ │ -00004870: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
.
│ │ │ │ -000048c0: 2020 3133 393c 2f73 7061 6e3e 203c 2f64 139 .
.
141 LD │ │ │ │ -00004a10: 4c3c 2f61 3e28 2920 3a20 6d61 7472 6978 L() : matrix │ │ │ │ -00004a20: 4973 4c6f 6164 6564 5f28 6661 6c73 6529 IsLoaded_(false) │ │ │ │ -00004a30: 2c20 7665 7262 6f73 655f 2830 293c 2f64 , verbose_(0).
14 │ │ │ │ -00004a90: 323c 2f73 7061 6e3e 2020 2020 7b7d 3c2f 2 {}.
.
< │ │ │ │ -00004ae0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00004af0: 6e6f 223e 2020 3134 333c 2f73 7061 6e3e no"> 143 │ │ │ │ -00004b00: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
. │ │ │ │ -00004b60: 3c61 2069 643d 226c 3030 3134 3522 206e 14 │ │ │ │ -00004be0: 353c 2f61 3e3c 2f73 7061 6e3e 2020 2020 5 │ │ │ │ -00004bf0: 3c73 7061 6e20 636c 6173 733d 226b 6579 virtual ~LDL( │ │ │ │ -00004c70: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ -00004cc0: 2020 3134 363c 2f73 7061 6e3e 2020 2020 146 │ │ │ │ -00004cd0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ -00004d20: 2020 3134 373c 2f73 7061 6e3e 2020 2020 147 │ │ │ │ -00004d30: 2020 3c73 7061 6e20 636c 6173 733d 226b if ((ldlMatri │ │ │ │ -00004d60: 785f 2e4e 2829 202b 206c 646c 4d61 7472 x_.N() + ldlMatr │ │ │ │ -00004d70: 6978 5f2e 4d28 2920 2667 743b 2030 2920 ix_.M() > 0) │ │ │ │ -00004d80: 7c7c 206d 6174 7269 7849 734c 6f61 6465 || matrixIsLoade │ │ │ │ -00004d90: 645f 293c 2f64 6976 3e0a 3c64 6976 2063 d_)
.
148 │ │ │ │ -00004df0: 2020 2020 2020 6672 6565 2829 3b3c 2f64 free();.
14 │ │ │ │ -00004e50: 393c 2f73 7061 6e3e 2020 2020 7d3c 2f64 9 }.
.
150 │ │ │ │ -00004ec0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -00004f20: 6120 6964 3d22 6c30 3031 3532 2220 6e61 a id="l00152" na │ │ │ │ -00004f30: 6d65 3d22 6c30 3031 3532 223e 3c2f 613e me="l00152"> │ │ │ │ -00004f40: 3c73 7061 6e20 636c 6173 733d 226c 696e 152 │ │ │ │ -00004fa0: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -00004fb0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00004fc0: 6f72 6422 3e76 6972 7475 616c 3c2f 7370 ord">virtual vo │ │ │ │ -00004ff0: 6964 3c2f 7370 616e 3e20 3c61 2063 6c61 id appl │ │ │ │ -00005050: 793c 2f61 3e28 3c61 2063 6c61 7373 3d22 y(domain_type& x, range_type │ │ │ │ -000050d0: 3c2f 613e 2661 6d70 3b20 622c 203c 6120 & b, Invers │ │ │ │ -00005110: 654f 7065 7261 746f 7252 6573 756c 743c eOperatorResult< │ │ │ │ -00005120: 2f61 3e26 616d 703b 2072 6573 293c 2f64 /a>& res).
15 │ │ │ │ -00005180: 333c 2f73 7061 6e3e 2020 2020 7b3c 2f64 3 {.
15 │ │ │ │ -000051e0: 343c 2f73 7061 6e3e 2020 2020 2020 3c73 4 const │ │ │ │ -00005210: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int dimMat(ldl │ │ │ │ -00005240: 4d61 7472 6978 5f2e 4e28 2929 3b3c 2f64 Matrix_.N());.
15 │ │ │ │ -000052a0: 353c 2f73 7061 6e3e 2020 2020 2020 6c64 5 ld │ │ │ │ -000052b0: 6c5f 7065 726d 2864 696d 4d61 742c 2059 l_perm(dimMat, Y │ │ │ │ -000052c0: 5f2c 203c 7370 616e 2063 6c61 7373 3d22 _, reinter │ │ │ │ -000052e0: 7072 6574 5f63 6173 7426 6c74 3b3c 2f73 pret_cast<do │ │ │ │ -00005310: 7562 6c65 3c2f 7370 616e 3e2a 3c73 7061 uble*>(&a │ │ │ │ -00005340: 6d70 3b62 5b30 5d29 2c20 505f 293b 3c2f mp;b[0]), P_);.
1 │ │ │ │ -000053a0: 3536 3c2f 7370 616e 3e20 2020 2020 206c 56 l │ │ │ │ -000053b0: 646c 5f6c 736f 6c76 6528 6469 6d4d 6174 dl_lsolve(dimMat │ │ │ │ -000053c0: 2c20 595f 2c20 4c70 5f2c 204c 695f 2c20 , Y_, Lp_, Li_, │ │ │ │ -000053d0: 4c78 5f29 3b3c 2f64 6976 3e0a 3c64 6976 Lx_);
.
< │ │ │ │ -00005410: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00005420: 6e6f 223e 2020 3135 373c 2f73 7061 6e3e no"> 157 │ │ │ │ -00005430: 2020 2020 2020 6c64 6c5f 6473 6f6c 7665 ldl_dsolve │ │ │ │ -00005440: 2864 696d 4d61 742c 2059 5f2c 2044 5f29 (dimMat, Y_, D_) │ │ │ │ -00005450: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -000054a0: 2020 3135 383c 2f73 7061 6e3e 2020 2020 158 │ │ │ │ -000054b0: 2020 6c64 6c5f 6c74 736f 6c76 6528 6469 ldl_ltsolve(di │ │ │ │ -000054c0: 6d4d 6174 2c20 595f 2c20 4c70 5f2c 204c mMat, Y_, Lp_, L │ │ │ │ -000054d0: 695f 2c20 4c78 5f29 3b3c 2f64 6976 3e0a i_, Lx_);
. │ │ │ │ -000054e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
160< │ │ │ │ -00005630: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> // this is a d │ │ │ │ -00005660: 6972 6563 7420 736f 6c76 6572 3c2f 7370 irect solver
.
161 │ │ │ │ -000056d0: 2020 2020 7265 732e 3c61 2063 6c61 7373 res.iterati │ │ │ │ -00005730: 6f6e 733c 2f61 3e20 3d20 313b 3c2f 6469 ons = 1;.
162 │ │ │ │ -00005790: 3c2f 7370 616e 3e20 2020 2020 2072 6573 res │ │ │ │ -000057a0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .converged │ │ │ │ -00005800: 3d20 3c73 7061 6e20 636c 6173 733d 226b = true;
.
163 │ │ │ │ -00005880: 2020 207d 3c2f 6469 763e 0a3c 2f64 6976 }
.
.
164< │ │ │ │ -000058e0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
..
21 │ │ │ │ +000018b0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // stole │ │ │ │ +000018d0: 6e20 6672 6f6d 2064 756e 652d 6675 6e63 n from dune-func │ │ │ │ +000018e0: 7469 6f6e 733a 2077 6520 6361 6c6c 2061 tions: we call a │ │ │ │ +000018f0: 2074 7970 6520 2671 756f 743b 7363 616c type "scal │ │ │ │ +00001900: 6172 2671 756f 743b 2069 6620 6974 2064 ar" if it d │ │ │ │ +00001910: 6f65 7320 6e6f 7420 7375 7070 6f72 7420 oes not support │ │ │ │ +00001920: 696e 6465 7820 6163 6365 7373 696e 673c index accessing< │ │ │ │ +00001930: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00001950: 6120 6964 3d22 6c30 3030 3232 2220 6e61 a id="l00022" na │ │ │ │ +00001960: 6d65 3d22 6c30 3030 3232 223e 3c2f 613e me="l00022"> │ │ │ │ +00001970: 3c73 7061 6e20 636c 6173 733d 226c 696e 22 templat │ │ │ │ +000019b0: 653c 2f73 7061 6e3e 266c 743b 3c73 7061 e<class C │ │ │ │ +000019e0: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
23 │ │ │ │ +00001a40: 203c 7370 616e 2063 6c61 7373 3d22 6b65 using StaticIndexA │ │ │ │ +00001a70: 6363 6573 7343 6f6e 6365 7074 203d 203c ccessConcept = < │ │ │ │ +00001a80: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00001a90: 6f72 6422 3e64 6563 6c74 7970 653c 2f73 ord">decltype(std::declva │ │ │ │ +00001ab0: 6c26 6c74 3b43 2667 743b 2829 5b44 756e l<C>()[Dun │ │ │ │ +00001ac0: 653a 3a49 6e64 6963 6573 3a3a 5f30 5d29 e::Indices::_0]) │ │ │ │ +00001ad0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00001b20: 2020 2032 343c 2f73 7061 6e3e 203c 2f64 24 .
2 │ │ │ │ +00001b80: 353c 2f73 7061 6e3e 2020 3c73 7061 6e20 5 │ │ │ │ +00001ba0: 7465 6d70 6c61 7465 3c2f 7370 616e 3e26 template& │ │ │ │ +00001bb0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class C>
.
26< │ │ │ │ +00001c30: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> us │ │ │ │ +00001c50: 696e 6720 3c2f 7370 616e 3e49 7353 6361 ing IsSca │ │ │ │ +00001c60: 6c61 7220 3d20 7374 643a 3a6e 6567 6174 lar = std::negat │ │ │ │ +00001c70: 696f 6e26 6c74 3b44 756e 653a 3a53 7464 ion<Dune::Std │ │ │ │ +00001c80: 3a3a 6973 5f64 6574 6563 7465 6426 6c74 ::is_detected< │ │ │ │ +00001c90: 3b53 7461 7469 6349 6e64 6578 4163 6365 ;StaticIndexAcce │ │ │ │ +00001ca0: 7373 436f 6e63 6570 742c 2073 7464 3a3a ssConcept, std:: │ │ │ │ +00001cb0: 7265 6d6f 7665 5f72 6566 6572 656e 6365 remove_reference │ │ │ │ +00001cc0: 5f74 266c 743b 4326 6774 3b26 6774 3b26 _t<C>>& │ │ │ │ +00001cd0: 6774 3b3b 3c2f 6469 763e 0a3c 6469 7620 gt;;
.
27 │ │ │ │ +00001d30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00001d80: 2020 3238 3c2f 7370 616e 3e20 203c 7370 28 // Type trait │ │ │ │ +00001db0: 2066 6f72 206d 6174 7269 7820 7479 7065 for matrix type │ │ │ │ +00001dc0: 7320 7468 6174 2073 7570 706f 7274 733c s that supports< │ │ │ │ +00001dd0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00001df0: 6120 6964 3d22 6c30 3030 3239 2220 6e61 a id="l00029" na │ │ │ │ +00001e00: 6d65 3d22 6c30 3030 3239 223e 3c2f 613e me="l00029"> │ │ │ │ +00001e10: 3c73 7061 6e20 636c 6173 733d 226c 696e 29 // - it │ │ │ │ +00001e50: 6572 6174 696f 6e20 646f 6e65 2072 6f77 eration done row │ │ │ │ +00001e60: 2d77 6973 653c 2f73 7061 6e3e 3c2f 6469 -wise.
30 │ │ │ │ +00001ec0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 / │ │ │ │ +00001ee0: 2f20 2d20 7370 6172 7365 2069 7465 7261 / - sparse itera │ │ │ │ +00001ef0: 7469 6f6e 206f 7665 7220 6e6f 6e7a 6572 tion over nonzer │ │ │ │ +00001f00: 6f20 656e 7472 6965 733c 2f73 7061 6e3e o entries │ │ │ │ +00001f10: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00001f60: 2020 3331 3c2f 7370 616e 3e20 203c 7370 31 template <cla │ │ │ │ +00001fb0: 7373 3c2f 7370 616e 3e20 5426 6774 3b3c ss T>< │ │ │ │ +00001fc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00002010: 2033 323c 2f73 7061 6e3e 2020 3c73 7061 32 struct │ │ │ │ +00002040: 4973 526f 774d 616a 6f72 5370 6172 7365 IsRowMajorSparse │ │ │ │ +00002050: 203a 2073 7464 3a3a 6661 6c73 655f 7479 : std::false_ty │ │ │ │ +00002060: 7065 207b 7d3b 3c2f 6469 763e 0a3c 6469 pe {};
.< │ │ │ │ +00002080: 6120 6964 3d22 6c30 3030 3333 2220 6e61 a id="l00033" na │ │ │ │ +00002090: 6d65 3d22 6c30 3030 3333 223e 3c2f 613e me="l00033"> │ │ │ │ +000020a0: 3c73 7061 6e20 636c 6173 733d 226c 696e 33
.
34 < │ │ │ │ +00002120: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00002130: 656e 7422 3e2f 2f20 5468 6973 2069 7320 ent">// This is │ │ │ │ +00002140: 7375 7070 6f72 7465 6420 6279 2074 6865 supported by the │ │ │ │ +00002150: 2066 6f6c 6c6f 7769 6e67 206d 6174 7269 following matri │ │ │ │ +00002160: 7820 7479 7065 733a 3c2f 7370 616e 3e3c x types:< │ │ │ │ +00002170: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000021c0: 2033 353c 2f73 7061 6e3e 2020 3c73 7061 35 template <clas │ │ │ │ +00002210: 733c 2f73 7061 6e3e 2042 2c20 3c73 7061 s B, class A │ │ │ │ +00002240: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
36 │ │ │ │ +000022a0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 struct IsRowMajorS │ │ │ │ +000022d0: 7061 7273 6526 6c74 3b42 4352 534d 6174 parse<BCRSMat │ │ │ │ +000022e0: 7269 7826 6c74 3b42 2c41 2667 743b 2667 rix<B,A>&g │ │ │ │ +000022f0: 743b 203a 2073 7464 3a3a 7472 7565 5f74 t; : std::true_t │ │ │ │ +00002300: 7970 6520 7b7d 3b3c 2f64 6976 3e0a 3c64 ype {};
. │ │ │ │ +00002320: 3c61 2069 643d 226c 3030 3033 3722 206e 37
.
38 │ │ │ │ +000023c0: 3c73 7061 6e20 636c 6173 733d 226b 6579 template < │ │ │ │ +00002400: 636c 6173 733c 2f73 7061 6e3e 204b 2c20 class K, │ │ │ │ +00002410: 3c73 7061 6e20 636c 6173 733d 226b 6579 int n>
│ │ │ │ +00002440: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00002470: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 39 str │ │ │ │ +000024b0: 7563 7420 3c2f 7370 616e 3e49 7352 6f77 uct IsRow │ │ │ │ +000024c0: 4d61 6a6f 7253 7061 7273 6526 6c74 3b44 MajorSparse<D │ │ │ │ +000024d0: 6961 676f 6e61 6c4d 6174 7269 7826 6c74 iagonalMatrix< │ │ │ │ +000024e0: 3b4b 2c6e 2667 743b 2667 743b 203a 2073 ;K,n>> : s │ │ │ │ +000024f0: 7464 3a3a 7472 7565 5f74 7970 6520 7b7d td::true_type {} │ │ │ │ +00002500: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00002550: 2020 2034 303c 2f73 7061 6e3e 203c 2f64 40 .
4 │ │ │ │ +000025b0: 313c 2f73 7061 6e3e 2020 3c73 7061 6e20 1 │ │ │ │ +000025d0: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template │ │ │ │ +000025e0: 266c 743b 3c73 7061 6e20 636c 6173 733d <class< │ │ │ │ +00002600: 2f73 7061 6e3e 204b 2c20 3c73 7061 6e20 /span> K, int n │ │ │ │ +00002630: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
42 │ │ │ │ +00002690: 203c 7370 616e 2063 6c61 7373 3d22 6b65 struct IsRowMajorS │ │ │ │ +000026c0: 7061 7273 6526 6c74 3b53 6361 6c65 6449 parse<ScaledI │ │ │ │ +000026d0: 6465 6e74 6974 794d 6174 7269 7826 6c74 dentityMatrix< │ │ │ │ +000026e0: 3b4b 2c6e 2667 743b 2667 743b 203a 2073 ;K,n>> : s │ │ │ │ +000026f0: 7464 3a3a 7472 7565 5f74 7970 6520 7b7d td::true_type {} │ │ │ │ +00002700: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00002750: 2020 2034 333c 2f73 7061 6e3e 203c 2f64 43 .
4 │ │ │ │ +000027b0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
. │ │ │ │ +000027c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +000027f0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 45 temp │ │ │ │ +00002830: 6c61 7465 3c2f 7370 616e 3e20 266c 743b late < │ │ │ │ +00002840: 3c73 7061 6e20 636c 6173 733d 226b 6579 class Matrix>.
4 │ │ │ │ +000028c0: 363c 2f73 7061 6e3e 2020 3c73 7061 6e20 6 │ │ │ │ +000028e0: 6175 746f 3c2f 7370 616e 3e20 726f 7773 auto rows │ │ │ │ +000028f0: 284d 6174 7269 7820 3c73 7061 6e20 636c (Matrix co │ │ │ │ +00002910: 6e73 743c 2f73 7061 6e3e 2661 6d70 3b20 nst& │ │ │ │ +00002920: 3c73 7061 6e20 636c 6173 733d 2263 6f6d /*matrix*/ │ │ │ │ +00002940: 3c2f 7370 616e 3e2c 2050 7269 6f72 6974 , Priorit │ │ │ │ +00002950: 7954 6167 266c 743b 3226 6774 3b29 202d yTag<2>) - │ │ │ │ +00002960: 2667 743b 2073 7464 3a3a 696e 7465 6772 > std::integr │ │ │ │ +00002970: 616c 5f63 6f6e 7374 616e 7426 6c74 3b73 al_constant<s │ │ │ │ +00002980: 7464 3a3a 7369 7a65 5f74 2c20 3c61 2063 td::size_t, Mat │ │ │ │ +000029e0: 7269 783a 3a4e 3c2f 613e 2829 2667 743b rix::N()> │ │ │ │ +000029f0: 207b 203c 7370 616e 2063 6c61 7373 3d22 { ret │ │ │ │ +00002a10: 7572 6e3c 2f73 7061 6e3e 207b 7d3b 207d urn {}; } │ │ │ │ +00002a20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00002a70: 2020 3437 3c2f 7370 616e 3e20 3c2f 6469 47 .
48 │ │ │ │ +00002ad0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 t │ │ │ │ +00002af0: 656d 706c 6174 653c 2f73 7061 6e3e 2026 emplate & │ │ │ │ +00002b00: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class Matrix> │ │ │ │ +00002b30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00002b80: 2020 3439 3c2f 7370 616e 3e20 203c 7370 49 auto c │ │ │ │ +00002bb0: 6f6c 7328 4d61 7472 6978 203c 7370 616e ols(Matrix const&am │ │ │ │ +00002be0: 703b 203c 7370 616e 2063 6c61 7373 3d22 p; /*matri │ │ │ │ +00002c00: 782a 2f3c 2f73 7061 6e3e 2c20 5072 696f x*/, Prio │ │ │ │ +00002c10: 7269 7479 5461 6726 6c74 3b32 2667 743b rityTag<2> │ │ │ │ +00002c20: 2920 2d26 6774 3b20 7374 643a 3a69 6e74 ) -> std::int │ │ │ │ +00002c30: 6567 7261 6c5f 636f 6e73 7461 6e74 266c egral_constant&l │ │ │ │ +00002c40: 743b 7374 643a 3a73 697a 655f 742c 203c t;std::size_t, < │ │ │ │ +00002c50: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00002c60: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +00002c70: 2261 3031 3436 302e 6874 6d6c 2361 6430 "a01460.html#ad0 │ │ │ │ +00002c80: 6332 3537 6236 6636 3166 3038 3232 6464 c257b6f61f0822dd │ │ │ │ +00002c90: 6637 6463 6435 6161 6339 6566 6437 223e f7dcd5aac9efd7"> │ │ │ │ +00002ca0: 4d61 7472 6978 3a3a 4d3c 2f61 3e28 2926 Matrix::M()& │ │ │ │ +00002cb0: 6774 3b20 7b20 3c73 7061 6e20 636c 6173 gt; { │ │ │ │ +00002cd0: 7265 7475 726e 3c2f 7370 616e 3e20 7b7d return {} │ │ │ │ +00002ce0: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
50 < │ │ │ │ +00002d40: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00002d90: 2035 313c 2f73 7061 6e3e 2020 3c73 7061 51 template <clas │ │ │ │ +00002de0: 733c 2f73 7061 6e3e 204d 6174 7269 7826 s Matrix& │ │ │ │ +00002df0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
52 │ │ │ │ +00002e50: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto rows(Matrix const │ │ │ │ +00002ea0: 2661 6d70 3b20 6d61 7472 6978 2c20 5072 & matrix, Pr │ │ │ │ +00002eb0: 696f 7269 7479 5461 6726 6c74 3b31 2667 iorityTag<1&g │ │ │ │ +00002ec0: 743b 2920 2d26 6774 3b20 3c73 7061 6e20 t;) -> │ │ │ │ +00002ee0: 6465 636c 7479 7065 3c2f 7370 616e 3e28 decltype( │ │ │ │ +00002ef0: 6d61 7472 6978 2e4e 2829 2920 7b20 3c73 matrix.N()) { return matrix.N() │ │ │ │ +00002f30: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
53 < │ │ │ │ +00002f90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00002fe0: 2035 343c 2f73 7061 6e3e 2020 3c73 7061 54 template <clas │ │ │ │ +00003030: 733c 2f73 7061 6e3e 204d 6174 7269 7826 s Matrix& │ │ │ │ +00003040: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
55 │ │ │ │ +000030a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto cols(Matrix const │ │ │ │ +000030f0: 2661 6d70 3b20 6d61 7472 6978 2c20 5072 & matrix, Pr │ │ │ │ +00003100: 696f 7269 7479 5461 6726 6c74 3b31 2667 iorityTag<1&g │ │ │ │ +00003110: 743b 2920 2d26 6774 3b20 3c73 7061 6e20 t;) -> │ │ │ │ +00003130: 6465 636c 7479 7065 3c2f 7370 616e 3e28 decltype( │ │ │ │ +00003140: 6d61 7472 6978 2e4d 2829 2920 7b20 3c73 matrix.M()) { return matrix.M() │ │ │ │ +00003180: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
56 < │ │ │ │ +000031e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00003230: 2035 373c 2f73 7061 6e3e 2020 3c73 7061 57 template <clas │ │ │ │ +00003280: 733c 2f73 7061 6e3e 2056 6563 746f 7226 s Vector& │ │ │ │ +00003290: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
58 │ │ │ │ +000032f0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto size(Vector const │ │ │ │ +00003340: 2661 6d70 3b20 3c73 7061 6e20 636c 6173 & /*ve │ │ │ │ +00003360: 6374 6f72 2a2f 3c2f 7370 616e 3e2c 2050 ctor*/, P │ │ │ │ +00003370: 7269 6f72 6974 7954 6167 266c 743b 3226 riorityTag<2& │ │ │ │ +00003380: 6774 3b29 202d 2667 743b 2073 7464 3a3a gt;) -> std:: │ │ │ │ +00003390: 696e 7465 6772 616c 5f63 6f6e 7374 616e integral_constan │ │ │ │ +000033a0: 7426 6c74 3b73 7464 3a3a 7369 7a65 5f74 t<std::size_t │ │ │ │ +000033b0: 2c20 5665 6374 6f72 3a3a 7369 7a65 2829 , Vector::size() │ │ │ │ +000033c0: 2667 743b 207b 203c 7370 616e 2063 6c61 > { return { │ │ │ │ +000033f0: 7d3b 207d 3c2f 6469 763e 0a3c 6469 7620 }; }
.
59 │ │ │ │ +00003450: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000034a0: 2020 3630 3c2f 7370 616e 3e20 203c 7370 60 template <cla │ │ │ │ +000034f0: 7373 3c2f 7370 616e 3e20 5665 6374 6f72 ss Vector │ │ │ │ +00003500: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
61 │ │ │ │ +00003560: 203c 7370 616e 2063 6c61 7373 3d22 6b65 auto size(Vector < │ │ │ │ +00003590: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000035a0: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const& vector, P │ │ │ │ +000035c0: 7269 6f72 6974 7954 6167 266c 743b 3126 riorityTag<1& │ │ │ │ +000035d0: 6774 3b29 202d 2667 743b 203c 7370 616e gt;) -> decltype │ │ │ │ +00003600: 2876 6563 746f 722e 7369 7a65 2829 2920 (vector.size()) │ │ │ │ +00003610: 7b20 3c73 7061 6e20 636c 6173 733d 226b { retu │ │ │ │ +00003630: 726e 3c2f 7370 616e 3e20 7665 6374 6f72 rn vector │ │ │ │ +00003640: 2e73 697a 6528 293b 207d 3c2f 6469 763e .size(); }
│ │ │ │ +00003650: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +000036c0: 6120 6964 3d22 6c30 3030 3633 2220 6e61 a id="l00063" na │ │ │ │ +000036d0: 6d65 3d22 6c30 3030 3633 223e 3c2f 613e me="l00063"> │ │ │ │ +000036e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 63
.
64 } │ │ │ │ +00003760: 203c 7370 616e 2063 6c61 7373 3d22 636f // end na │ │ │ │ +00003780: 6d65 7370 6163 6520 496d 706c 3c2f 7370 mespace Impl
.
65 < │ │ │ │ +000037f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ │ +00003870: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00003880: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 66 │ │ │ │ +000038b0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 nam │ │ │ │ +000038d0: 6573 7061 6365 203c 2f73 7061 6e3e 466f espace Fo │ │ │ │ +000038e0: 7245 6163 687b 3c2f 6469 763e 0a3c 6469 rEach{
.< │ │ │ │ +00003900: 6120 6964 3d22 6c30 3030 3637 2220 6e61 a id="l00067" na │ │ │ │ +00003910: 6d65 3d22 6c30 3030 3637 223e 3c2f 613e me="l00067"> │ │ │ │ +00003920: 3c73 7061 6e20 636c 6173 733d 226c 696e 67
.
68 < │ │ │ │ +000039a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000039b0: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template <c │ │ │ │ +000039e0: 6c61 7373 3c2f 7370 616e 3e20 4d61 7472 lass Matr │ │ │ │ +000039f0: 6978 2667 743b 3c2f 6469 763e 0a3c 6469 ix>
.< │ │ │ │ +00003a10: 6120 6964 3d22 6c30 3030 3639 2220 6e61 a id="l00069" na │ │ │ │ +00003a20: 6d65 3d22 6c30 3030 3639 223e 3c2f 613e me="l00069"> │ │ │ │ +00003a30: 3c73 7061 6e20 636c 6173 733d 226c 696e 69< │ │ │ │ +00003a90: 2f61 3e3c 2f73 7061 6e3e 2020 3c73 7061 /a> auto r │ │ │ │ +00003b10: 6f77 733c 2f61 3e28 3c61 2063 6c61 7373 ows(Matrix < │ │ │ │ +00003b50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00003b60: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const& matrix) { │ │ │ │ +00003b80: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur │ │ │ │ +00003ba0: 6e3c 2f73 7061 6e3e 2049 6d70 6c3a 3a72 n Impl::r │ │ │ │ +00003bb0: 6f77 7328 6d61 7472 6978 2c20 5072 696f ows(matrix, Prio │ │ │ │ +00003bc0: 7269 7479 5461 6726 6c74 3b35 2667 743b rityTag<5> │ │ │ │ +00003bd0: 7b7d 293b 207d 3c2f 6469 763e 0a3c 6469 {}); }
.< │ │ │ │ +00003bf0: 6120 6964 3d22 6c30 3030 3730 2220 6e61 a id="l00070" na │ │ │ │ +00003c00: 6d65 3d22 6c30 3030 3730 223e 3c2f 613e me="l00070"> │ │ │ │ +00003c10: 3c73 7061 6e20 636c 6173 733d 226c 696e 70
.
71 < │ │ │ │ +00003c90: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00003ca0: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template <c │ │ │ │ +00003cd0: 6c61 7373 3c2f 7370 616e 3e20 4d61 7472 lass Matr │ │ │ │ +00003ce0: 6978 2667 743b 3c2f 6469 763e 0a3c 6469 ix>
.< │ │ │ │ +00003d00: 6120 6964 3d22 6c30 3030 3732 2220 6e61 a id="l00072" na │ │ │ │ +00003d10: 6d65 3d22 6c30 3030 3732 223e 3c2f 613e me="l00072"> │ │ │ │ +00003d20: 3c73 7061 6e20 636c 6173 733d 226c 696e 72< │ │ │ │ +00003d80: 2f61 3e3c 2f73 7061 6e3e 2020 3c73 7061 /a> auto c │ │ │ │ +00003e00: 6f6c 733c 2f61 3e28 3c61 2063 6c61 7373 ols(Matrix < │ │ │ │ +00003e40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00003e50: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const& matrix) { │ │ │ │ +00003e70: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur │ │ │ │ +00003e90: 6e3c 2f73 7061 6e3e 2049 6d70 6c3a 3a63 n Impl::c │ │ │ │ +00003ea0: 6f6c 7328 6d61 7472 6978 2c20 5072 696f ols(matrix, Prio │ │ │ │ +00003eb0: 7269 7479 5461 6726 6c74 3b35 2667 743b rityTag<5> │ │ │ │ +00003ec0: 7b7d 293b 207d 3c2f 6469 763e 0a3c 6469 {}); }
.< │ │ │ │ +00003ee0: 6120 6964 3d22 6c30 3030 3733 2220 6e61 a id="l00073" na │ │ │ │ +00003ef0: 6d65 3d22 6c30 3030 3733 223e 3c2f 613e me="l00073"> │ │ │ │ +00003f00: 3c73 7061 6e20 636c 6173 733d 226c 696e 73
.
74 < │ │ │ │ +00003f80: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00003f90: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template <c │ │ │ │ +00003fc0: 6c61 7373 3c2f 7370 616e 3e20 5665 6374 lass Vect │ │ │ │ +00003fd0: 6f72 2667 743b 3c2f 6469 763e 0a3c 6469 or>
.< │ │ │ │ +00003ff0: 6120 6964 3d22 6c30 3030 3735 2220 6e61 a id="l00075" na │ │ │ │ +00004000: 6d65 3d22 6c30 3030 3735 223e 3c2f 613e me="l00075"> │ │ │ │ +00004010: 3c73 7061 6e20 636c 6173 733d 226c 696e 75< │ │ │ │ +00004070: 2f61 3e3c 2f73 7061 6e3e 2020 3c73 7061 /a> auto s │ │ │ │ +000040f0: 697a 653c 2f61 3e28 5665 6374 6f72 203c ize(Vector < │ │ │ │ +00004100: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00004110: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const& vector) { │ │ │ │ +00004130: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur │ │ │ │ +00004150: 6e3c 2f73 7061 6e3e 2049 6d70 6c3a 3a73 n Impl::s │ │ │ │ +00004160: 697a 6528 7665 6374 6f72 2c20 5072 696f ize(vector, Prio │ │ │ │ +00004170: 7269 7479 5461 6726 6c74 3b35 2667 743b rityTag<5> │ │ │ │ +00004180: 7b7d 293b 207d 3c2f 6469 763e 0a3c 6469 {}); }
.< │ │ │ │ +000041a0: 6120 6964 3d22 6c30 3030 3736 2220 6e61 a id="l00076" na │ │ │ │ +000041b0: 6d65 3d22 6c30 3030 3736 223e 3c2f 613e me="l00076"> │ │ │ │ +000041c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 76
.
77} < │ │ │ │ +00004240: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00004250: 656e 7422 3e2f 2f20 6e61 6d65 7370 6163 ent">// namespac │ │ │ │ +00004260: 6520 466f 7245 6163 683c 2f73 7061 6e3e e ForEach │ │ │ │ +00004270: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ │ +00004290: 3c61 2069 643d 226c 3030 3037 3822 206e 78
.
79 < │ │ │ │ +00004330: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00004380: 2038 303c 2f73 7061 6e3e 203c 2f64 6976 80
.
81< │ │ │ │ +000043e0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00004400: 3c61 2069 643d 226c 3030 3039 3422 206e 94template │ │ │ │ +00004460: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <class V │ │ │ │ +00004490: 6563 746f 722c 203c 7370 616e 2063 6c61 ector, cla │ │ │ │ +000044b0: 7373 3c2f 7370 616e 3e20 4626 6774 3b3c ss F>< │ │ │ │ +000044c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ │ +00004540: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00004550: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 95std::si │ │ │ │ +000045b0: 7a65 5f74 203c 6120 636c 6173 733d 2263 ze_t flatVector │ │ │ │ +00004610: 466f 7245 6163 683c 2f61 3e28 5665 6374 ForEach(Vect │ │ │ │ +00004620: 6f72 2661 6d70 3b26 616d 703b 2076 6563 or&& vec │ │ │ │ +00004630: 746f 722c 2046 2661 6d70 3b26 616d 703b tor, F&& │ │ │ │ +00004640: 2066 2c20 7374 643a 3a73 697a 655f 7420 f, std::size_t │ │ │ │ +00004650: 6f66 6673 6574 203d 2030 293c 2f64 6976 offset = 0)
.
96< │ │ │ │ +000046b0: 2f73 7061 6e3e 7b3c 2f64 6976 3e0a 3c64 /span>{
. │ │ │ │ +000046d0: 3c61 2069 643d 226c 3030 3039 3722 206e 97 using │ │ │ │ +00004730: 3c2f 7370 616e 3e56 203d 2073 7464 3a3a V = std:: │ │ │ │ +00004740: 6465 6361 795f 7426 6c74 3b56 6563 746f decay_t<Vecto │ │ │ │ +00004750: 7226 6774 3b3b 3c2f 6469 763e 0a3c 6469 r>;
.< │ │ │ │ +00004770: 6120 6964 3d22 6c30 3030 3938 2220 6e61 a id="l00098" na │ │ │ │ +00004780: 6d65 3d22 6c30 3030 3938 223e 3c2f 613e me="l00098"> │ │ │ │ +00004790: 3c73 7061 6e20 636c 6173 733d 226c 696e 98 if< │ │ │ │ +000047d0: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> con │ │ │ │ +000047f0: 7374 6578 7072 3c2f 7370 616e 3e28 2049 stexpr( I │ │ │ │ +00004800: 6d70 6c3a 3a49 7353 6361 6c61 7226 6c74 mpl::IsScalar< │ │ │ │ +00004810: 3b56 2667 743b 3a3a 7661 6c75 6520 293c ;V>::value )< │ │ │ │ +00004820: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00004870: 2039 393c 2f73 7061 6e3e 2020 7b3c 2f64 99 {.
10 │ │ │ │ +000048d0: 303c 2f73 7061 6e3e 2020 2020 6628 7665 0 f(ve │ │ │ │ +000048e0: 6374 6f72 2c20 6f66 6673 6574 293b 3c2f ctor, offset);.
1 │ │ │ │ +00004940: 3031 3c2f 7370 616e 3e20 2020 203c 7370 01 return 1;
. │ │ │ │ +00004990: 3c61 2069 643d 226c 3030 3130 3222 206e 102 }
.
< │ │ │ │ +00004a10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00004a20: 6e6f 223e 2020 3130 333c 2f73 7061 6e3e no"> 103 │ │ │ │ +00004a30: 2020 3c73 7061 6e20 636c 6173 733d 226b else │ │ │ │ +00004a50: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00004a70: 3c61 2069 643d 226c 3030 3130 3422 206e 104 {
.
< │ │ │ │ +00004af0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00004b00: 6e6f 223e 2020 3130 353c 2f73 7061 6e3e no"> 105 │ │ │ │ +00004b10: 2020 2020 7374 643a 3a73 697a 655f 7420 std::size_t │ │ │ │ +00004b20: 6964 7820 3d20 303b 3c2f 6469 763e 0a3c idx = 0;
.< │ │ │ │ +00004b30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00004b40: 3e3c 6120 6964 3d22 6c30 3031 3036 2220 > 106 Hybrid::f │ │ │ │ +00004b90: 6f72 4561 6368 2844 756e 653a 3a72 616e orEach(Dune::ran │ │ │ │ +00004ba0: 6765 283c 6120 636c 6173 733d 2263 6f64 ge(ForEach::siz │ │ │ │ +00004c00: 653c 2f61 3e28 7665 6374 6f72 2929 2c20 e(vector)), │ │ │ │ +00004c10: 5b26 616d 703b 5d28 3c73 7061 6e20 636c [&](au │ │ │ │ +00004c30: 746f 3c2f 7370 616e 3e20 6929 207b 3c2f to i) {.
1 │ │ │ │ +00004c90: 3037 3c2f 7370 616e 3e20 2020 2020 2069 07 i │ │ │ │ +00004ca0: 6478 202b 3d20 3c61 2063 6c61 7373 3d22 dx += flatVecto │ │ │ │ +00004d00: 7246 6f72 4561 6368 3c2f 613e 2876 6563 rForEach(vec │ │ │ │ +00004d10: 746f 725b 695d 2c20 662c 206f 6666 7365 tor[i], f, offse │ │ │ │ +00004d20: 7420 2b20 6964 7829 3b3c 2f64 6976 3e0a t + idx);
. │ │ │ │ +00004d30: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
109< │ │ │ │ +00004de0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> return idx;
.< │ │ │ │ +00004e30: 6120 6964 3d22 6c30 3031 3130 2220 6e61 a id="l00110" na │ │ │ │ +00004e40: 6d65 3d22 6c30 3031 3130 223e 3c2f 613e me="l00110"> │ │ │ │ +00004e50: 3c73 7061 6e20 636c 6173 733d 226c 696e 110 }
.
111} │ │ │ │ +00004ed0: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ │ +00004ef0: 3c61 2069 643d 226c 3030 3131 3222 206e 112
.
113 < │ │ │ │ +00004f90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00004fe0: 3133 313c 2f73 7061 6e3e 3c73 7061 6e20 131 │ │ │ │ +00005000: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template │ │ │ │ +00005010: 266c 743b 3c73 7061 6e20 636c 6173 733d <class< │ │ │ │ +00005030: 2f73 7061 6e3e 204d 6174 7269 782c 203c /span> Matrix, < │ │ │ │ +00005040: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00005050: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class F>
..
132std::pair<st │ │ │ │ +00005160: 643a 3a73 697a 655f 742c 7374 643a 3a73 d::size_t,std::s │ │ │ │ +00005170: 697a 655f 7426 6774 3b20 3c61 2063 6c61 ize_t> flatM │ │ │ │ +000051d0: 6174 7269 7846 6f72 4561 6368 3c2f 613e atrixForEach │ │ │ │ +000051e0: 283c 6120 636c 6173 733d 2263 6f64 6520 (Mat │ │ │ │ +00005210: 7269 783c 2f61 3e26 616d 703b 2661 6d70 rix&& │ │ │ │ +00005220: 3b20 6d61 7472 6978 2c20 4626 616d 703b ; matrix, F& │ │ │ │ +00005230: 2661 6d70 3b20 662c 2073 7464 3a3a 7369 & f, std::si │ │ │ │ +00005240: 7a65 5f74 2072 6f77 4f66 6673 6574 203d ze_t rowOffset = │ │ │ │ +00005250: 2030 2c20 7374 643a 3a73 697a 655f 7420 0, std::size_t │ │ │ │ +00005260: 636f 6c4f 6666 7365 7420 3d20 3029 3c2f colOffset = 0).
1 │ │ │ │ +000052c0: 3333 3c2f 7370 616e 3e7b 3c2f 6469 763e 33{
│ │ │ │ +000052d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00005300: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 134 usi │ │ │ │ +00005340: 6e67 203c 2f73 7061 6e3e 4d20 3d20 7374 ng M = st │ │ │ │ +00005350: 643a 3a64 6563 6179 5f74 266c 743b 4d61 d::decay_t<Ma │ │ │ │ +00005360: 7472 6978 2667 743b 3b3c 2f64 6976 3e0a trix>;
. │ │ │ │ +00005370: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
136 │ │ │ │ +00005490: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +000054e0: 2020 3133 373c 2f73 7061 6e3e 2020 2020 137 │ │ │ │ +000054f0: 6628 6d61 7472 6978 2c72 6f77 4f66 6673 f(matrix,rowOffs │ │ │ │ +00005500: 6574 2c63 6f6c 4f66 6673 6574 293b 3c2f et,colOffset);.
1 │ │ │ │ +00005560: 3338 3c2f 7370 616e 3e20 2020 203c 7370 38 return {1,1};
.
139< │ │ │ │ +000055f0: 2f73 7061 6e3e 2020 7d3c 2f64 6976 3e0a /span> }
. │ │ │ │ +00005600: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
141< │ │ │ │ +000056d0: 2f73 7061 6e3e 2020 7b3c 2f64 6976 3e0a /span> {
. │ │ │ │ +000056e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +00005800: 2031 3433 3c2f 7370 616e 3e20 2020 203c 143 < │ │ │ │ +00005810: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00005820: 656e 7422 3e2f 2f20 616e 6420 636f 6d70 ent">// and comp │ │ │ │ +00005830: 7574 6520 7468 6520 666c 6174 2072 6f77 ute the flat row │ │ │ │ +00005840: 2f63 6f6c 2073 697a 6520 6469 7265 6374 /col size direct │ │ │ │ +00005850: 6c79 3c2f 7370 616e 3e3c 2f64 6976 3e0a ly
. │ │ │ │ +00005860: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00005890: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 144 if constexpr ( Impl::IsRow │ │ │ │ +00005910: 4d61 6a6f 7253 7061 7273 6526 6c74 3b4d MajorSparse<M │ │ │ │ +00005920: 2667 743b 3a3a 7661 6c75 6520 293c 2f64 >::value ).
166 virt │ │ │ │ -000059f0: 7561 6c3c 2f73 7061 6e3e 203c 7370 616e ual void │ │ │ │ -00005a20: 203c 6120 636c 6173 733d 2263 6f64 6520 apply(domain_ │ │ │ │ -00005ab0: 7479 7065 3c2f 613e 2661 6d70 3b20 782c type& x, │ │ │ │ -00005ac0: 203c 6120 636c 6173 733d 2263 6f64 6520 ran │ │ │ │ -00005af0: 6765 5f74 7970 653c 2f61 3e26 616d 703b ge_type& │ │ │ │ -00005b00: 2062 2c20 5b5b 6d61 7962 655f 756e 7573 b, [[maybe_unus │ │ │ │ -00005b10: 6564 5d5d 203c 7370 616e 2063 6c61 7373 ed]] d │ │ │ │ -00005b30: 6f75 626c 653c 2f73 7061 6e3e 2072 6564 ouble red │ │ │ │ -00005b40: 7563 7469 6f6e 2c20 3c61 2063 6c61 7373 uction, InverseOper │ │ │ │ -00005b80: 6174 6f72 5265 7375 6c74 3c2f 613e 2661 atorResult&a │ │ │ │ -00005b90: 6d70 3b20 7265 7329 3c2f 6469 763e 0a3c mp; res)
.< │ │ │ │ -00005ba0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005bb0: 3e3c 6120 6964 3d22 6c30 3031 3637 2220 > 167 {
.< │ │ │ │ -00005c00: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005c10: 3e3c 6120 6964 3d22 6c30 3031 3638 2220 > 168 apply(x │ │ │ │ -00005c60: 2c62 2c72 6573 293b 3c2f 6469 763e 0a3c ,b,res);
.< │ │ │ │ -00005c70: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005c80: 3e3c 6120 6964 3d22 6c30 3031 3639 2220 > 169 }
.< │ │ │ │ -00005cd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00005d20: 3137 303c 2f73 7061 6e3e 203c 2f64 6976 170
.
.
│ │ │ │ -00005dc0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 176< │ │ │ │ -00005e10: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> void │ │ │ │ -00005e40: 3c61 2063 6c61 7373 3d22 636f 6465 2068 apply(T* x │ │ │ │ -00005ea0: 2c20 542a 2062 293c 2f64 6976 3e0a 3c64 , T* b)
. │ │ │ │ -00005ec0: 3c61 2069 643d 226c 3030 3137 3722 206e 177 {
. │ │ │ │ -00005f20: 3c61 2069 643d 226c 3030 3137 3822 206e 178 co │ │ │ │ -00005f80: 6e73 743c 2f73 7061 6e3e 203c 7370 616e nst int │ │ │ │ -00005fb0: 6469 6d4d 6174 286c 646c 4d61 7472 6978 dimMat(ldlMatrix │ │ │ │ -00005fc0: 5f2e 4e28 2929 3b3c 2f64 6976 3e0a 3c64 _.N());
. │ │ │ │ -00005fe0: 3c61 2069 643d 226c 3030 3137 3922 206e 179 ldl_perm │ │ │ │ -00006030: 2864 696d 4d61 742c 2059 5f2c 2062 2c20 (dimMat, Y_, b, │ │ │ │ -00006040: 505f 293b 3c2f 6469 763e 0a3c 6469 7620 P_);
.
180 │ │ │ │ -000060a0: 2020 2020 206c 646c 5f6c 736f 6c76 6528 ldl_lsolve( │ │ │ │ -000060b0: 6469 6d4d 6174 2c20 595f 2c20 4c70 5f2c dimMat, Y_, Lp_, │ │ │ │ -000060c0: 204c 695f 2c20 4c78 5f29 3b3c 2f64 6976 Li_, Lx_);
.
181< │ │ │ │ -00006120: 2f73 7061 6e3e 2020 2020 2020 6c64 6c5f /span> ldl_ │ │ │ │ -00006130: 6473 6f6c 7665 2864 696d 4d61 742c 2059 dsolve(dimMat, Y │ │ │ │ -00006140: 5f2c 2044 5f29 3b3c 2f64 6976 3e0a 3c64 _, D_);
. │ │ │ │ -00006160: 3c61 2069 643d 226c 3030 3138 3222 206e 182 ldl_ltso │ │ │ │ -000061b0: 6c76 6528 6469 6d4d 6174 2c20 595f 2c20 lve(dimMat, Y_, │ │ │ │ -000061c0: 4c70 5f2c 204c 695f 2c20 4c78 5f29 3b3c Lp_, Li_, Lx_);< │ │ │ │ -000061d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00006220: 3138 333c 2f73 7061 6e3e 2020 2020 2020 183 │ │ │ │ -00006230: 6c64 6c5f 7065 726d 7428 6469 6d4d 6174 ldl_permt(dimMat │ │ │ │ -00006240: 2c20 782c 2059 5f2c 2050 5f29 3b3c 2f64 , x, Y_, P_);.
18 │ │ │ │ -000062a0: 343c 2f73 7061 6e3e 2020 2020 7d3c 2f64 4 }.
.
185 │ │ │ │ -00006310: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -00006370: 6120 6964 3d22 6c30 3031 3836 2220 6e61 a id="l00186" na │ │ │ │ -00006380: 6d65 3d22 6c30 3031 3836 223e 3c2f 613e me="l00186"> │ │ │ │ -00006390: 3c73 7061 6e20 636c 6173 733d 226c 696e 186 │ │ │ │ -000063f0: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -00006400: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00006410: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void setOption │ │ │ │ -00006480: 3c2f 613e 285b 5b6d 6179 6265 5f75 6e75 ([[maybe_unu │ │ │ │ -00006490: 7365 645d 5d20 3c73 7061 6e20 636c 6173 sed]] │ │ │ │ -000064b0: 756e 7369 676e 6564 3c2f 7370 616e 3e20 unsigned │ │ │ │ -000064c0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int option, [[m │ │ │ │ -000064f0: 6179 6265 5f75 6e75 7365 645d 5d20 3c73 aybe_unused]] double value).
187 │ │ │ │ -00006580: 3c2f 7370 616e 3e20 2020 207b 7d3c 2f64 {}.
.
188 │ │ │ │ -000065f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -00006650: 6120 6964 3d22 6c30 3031 3930 2220 6e61 a id="l00190" na │ │ │ │ -00006660: 6d65 3d22 6c30 3031 3930 223e 3c2f 613e me="l00190"> │ │ │ │ -00006670: 3c73 7061 6e20 636c 6173 733d 226c 696e 190 │ │ │ │ -000066d0: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -000066e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000066f0: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void setMatrix │ │ │ │ -00006760: 3c2f 613e 283c 7370 616e 2063 6c61 7373 (const │ │ │ │ -00006780: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 Matrix&a │ │ │ │ -000067c0: 6d70 3b20 6d61 7472 6978 293c 2f64 6976 mp; matrix)
.
191< │ │ │ │ -00006820: 2f73 7061 6e3e 2020 2020 7b3c 2f64 6976 /span> {
.
192< │ │ │ │ -00006880: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> if │ │ │ │ -000068b0: 2828 6c64 6c4d 6174 7269 785f 2e4e 2829 ((ldlMatrix_.N() │ │ │ │ -000068c0: 202b 206c 646c 4d61 7472 6978 5f2e 4d28 + ldlMatrix_.M( │ │ │ │ -000068d0: 2920 2667 743b 2030 2920 7c7c 206d 6174 ) > 0) || mat │ │ │ │ -000068e0: 7269 7849 734c 6f61 6465 645f 293c 2f64 rixIsLoaded_).
19 │ │ │ │ -00006940: 333c 2f73 7061 6e3e 2020 2020 2020 2020 3 │ │ │ │ -00006950: 6672 6565 2829 3b3c 2f64 6976 3e0a 3c64 free();
. │ │ │ │ -00006970: 3c61 2069 643d 226c 3030 3139 3422 206e 194
.
195 │ │ │ │ -00006a10: 2020 2020 3c73 7061 6e20 636c 6173 733d if │ │ │ │ -00006a30: 3c2f 7370 616e 3e20 286c 646c 4d61 7472 (ldlMatr │ │ │ │ -00006a40: 6978 5f2e 4e28 2920 2b20 6c64 6c4d 6174 ix_.N() + ldlMat │ │ │ │ -00006a50: 7269 785f 2e4d 2829 202b 206c 646c 4d61 rix_.M() + ldlMa │ │ │ │ -00006a60: 7472 6978 5f2e 6e6f 6e7a 6572 6f65 7328 trix_.nonzeroes( │ │ │ │ -00006a70: 2920 213d 2030 293c 2f64 6976 3e0a 3c64 ) != 0)
. │ │ │ │ -00006a90: 3c61 2069 643d 226c 3030 3139 3622 206e 196 ldlMat │ │ │ │ -00006ae0: 7269 785f 2e66 7265 6528 293b 3c2f 6469 rix_.free();.
197 │ │ │ │ -00006b40: 3c2f 7370 616e 3e20 2020 2020 206c 646c ldl │ │ │ │ -00006b50: 4d61 7472 6978 5f2e 7365 7453 697a 6528 Matrix_.setSize( │ │ │ │ -00006b60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Mat │ │ │ │ -00006b90: 7269 7844 696d 656e 7369 6f6e 266c 743b rixDimension< │ │ │ │ -00006ba0: 4d61 7472 6978 2667 743b 3a3a 726f 7764 Matrix>::rowd │ │ │ │ -00006bb0: 696d 3c2f 613e 286d 6174 7269 7829 2c3c im(matrix),< │ │ │ │ -00006bc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00006c10: 3139 383c 2f73 7061 6e3e 2020 2020 2020 198 │ │ │ │ -00006c20: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -00006c30: 2020 203c 6120 636c 6173 733d 2263 6f64 │ │ │ │ -00006c60: 4d61 7472 6978 4469 6d65 6e73 696f 6e26 MatrixDimension& │ │ │ │ -00006c70: 6c74 3b4d 6174 7269 7826 6774 3b3a 3a63 lt;Matrix>::c │ │ │ │ -00006c80: 6f6c 6469 6d3c 2f61 3e28 6d61 7472 6978 oldim(matrix │ │ │ │ -00006c90: 2929 3b3c 2f64 6976 3e0a 3c64 6976 2063 ));
.
199 │ │ │ │ -00006cf0: 2020 2020 4953 544c 3a3a 496d 706c 3a3a ISTL::Impl:: │ │ │ │ -00006d00: 4243 4353 4d61 7472 6978 496e 6974 6961 BCCSMatrixInitia │ │ │ │ -00006d10: 6c69 7a65 7226 6c74 3b4d 6174 7269 782c lizer<Matrix, │ │ │ │ -00006d20: 2069 6e74 2667 743b 2069 6e69 7469 616c int> initial │ │ │ │ -00006d30: 697a 6572 286c 646c 4d61 7472 6978 5f29 izer(ldlMatrix_) │ │ │ │ -00006d40: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00006d90: 2020 3230 303c 2f73 7061 6e3e 203c 2f64 200 .
20 │ │ │ │ -00006df0: 313c 2f73 7061 6e3e 2020 2020 2020 636f 1 co │ │ │ │ -00006e00: 7079 546f 4243 4353 4d61 7472 6978 2869 pyToBCCSMatrix(i │ │ │ │ -00006e10: 6e69 7469 616c 697a 6572 2c20 6d61 7472 nitializer, matr │ │ │ │ -00006e20: 6978 293b 3c2f 6469 763e 0a3c 6469 7620 ix);
.
202 │ │ │ │ -00006e80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00006ed0: 2032 3033 3c2f 7370 616e 3e20 2020 2020 203 │ │ │ │ -00006ee0: 2064 6563 6f6d 706f 7365 2829 3b3c 2f64 decompose(); 14 │ │ │ │ +00005980: 353c 2f73 7061 6e3e 2020 2020 7b3c 2f64 5 {.
14 │ │ │ │ +000059e0: 363c 2f73 7061 6e3e 2020 2020 2020 3c73 6 using Block = std::de │ │ │ │ +00005a20: 6361 795f 7426 6c74 3b3c 7370 616e 2063 cay_t<d │ │ │ │ +00005a40: 6563 6c74 7970 653c 2f73 7061 6e3e 286d ecltype(m │ │ │ │ +00005a50: 6174 7269 785b 305d 5b30 5d29 2667 743b atrix[0][0])> │ │ │ │ +00005a60: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00005ab0: 2020 3134 373c 2f73 7061 6e3e 203c 2f64 147 .
14 │ │ │ │ +00005b10: 383c 2f73 7061 6e3e 2020 2020 2020 3c73 8 // find an e │ │ │ │ +00005b40: 7869 7374 696e 6720 626c 6f63 6b20 6f72 xisting block or │ │ │ │ +00005b50: 2061 7420 6c65 6173 7420 7472 7920 746f at least try to │ │ │ │ +00005b60: 2063 7265 6174 6520 6f6e 653c 2f73 7061 create one
.
149 │ │ │ │ +00005bd0: 2020 203c 7370 616e 2063 6c61 7373 3d22 auto block = [&a │ │ │ │ +00005c00: 6d70 3b5d 7b3c 2f64 6976 3e0a 3c64 6976 mp;]{
.
< │ │ │ │ +00005c40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00005c50: 6e6f 223e 2020 3135 303c 2f73 7061 6e3e no"> 150 │ │ │ │ +00005c60: 2020 2020 2020 2020 3c73 7061 6e20 636c for (auto │ │ │ │ +00005cb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const& row : ma │ │ │ │ +00005ce0: 7472 6978 293c 2f64 6976 3e0a 3c64 6976 trix)
.
< │ │ │ │ +00005d20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00005d30: 6e6f 223e 2020 3135 313c 2f73 7061 6e3e no"> 151 │ │ │ │ +00005d40: 2020 2020 2020 2020 2020 3c73 7061 6e20 for ( │ │ │ │ +00005d70: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto const& entry │ │ │ │ +00005dc0: 3a20 726f 7729 3c2f 6469 763e 0a3c 6469 : row)
.< │ │ │ │ +00005de0: 6120 6964 3d22 6c30 3031 3532 2220 6e61 a id="l00152" na │ │ │ │ +00005df0: 6d65 3d22 6c30 3031 3532 223e 3c2f 613e me="l00152"> │ │ │ │ +00005e00: 3c73 7061 6e20 636c 6173 733d 226c 696e 152 return
entry;
.
153< │ │ │ │ +00005eb0: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> return Block{};.
1 │ │ │ │ +00005f40: 3534 3c2f 7370 616e 3e20 2020 2020 207d 54 } │ │ │ │ +00005f50: 2829 3b3c 2f64 6976 3e0a 3c64 6976 2063 ();
.
155 < │ │ │ │ +00005fb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00006000: 3135 363c 2f73 7061 6e3e 2020 2020 2020 156 │ │ │ │ +00006010: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // compute │ │ │ │ +00006030: 2074 6865 2073 6361 6c61 7220 7369 7a65 the scalar size │ │ │ │ +00006040: 206f 6620 7468 6520 626c 6f63 6b3c 2f73 of the block
.
157 │ │ │ │ +000060b0: 2020 2020 203c 7370 616e 2063 6c61 7373 auto< │ │ │ │ +000060d0: 2f73 7061 6e3e 205b 626c 6f63 6b52 6f77 /span> [blockRow │ │ │ │ +000060e0: 732c 2062 6c6f 636b 436f 6c73 5d20 3d20 s, blockCols] = │ │ │ │ +000060f0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 flatMatrixForEa │ │ │ │ +00006150: 6368 3c2f 613e 2862 6c6f 636b 2c20 5b5d ch(block, [] │ │ │ │ +00006160: 282e 2e2e 297b 7d29 3b3c 2f64 6976 3e0a (...){});
. │ │ │ │ +00006170: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +00006200: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00006210: 6e6f 223e 2020 3135 393c 2f73 7061 6e3e no"> 159 │ │ │ │ +00006220: 2020 2020 2020 3c73 7061 6e20 636c 6173 // c │ │ │ │ +00006240: 6865 636b 2077 6865 7468 6572 2077 6520 heck whether we │ │ │ │ +00006250: 6861 7665 2076 616c 6964 2073 697a 6564 have valid sized │ │ │ │ +00006260: 2062 6c6f 636b 733c 2f73 7061 6e3e 3c2f blocks.
1 │ │ │ │ +000062c0: 3630 3c2f 7370 616e 3e20 2020 2020 2061 60 a │ │ │ │ +000062d0: 7373 6572 7428 2028 2062 6c6f 636b 526f ssert( ( blockRo │ │ │ │ +000062e0: 7773 213d 3020 6f72 2062 6c6f 636b 436f ws!=0 or blockCo │ │ │ │ +000062f0: 6c73 213d 3020 2920 616e 6420 3c73 7061 ls!=0 ) and "th │ │ │ │ +00006320: 6520 626c 6f63 6b20 7369 7a65 2063 616e e block size can │ │ │ │ +00006330: 2623 3339 3b74 2062 6520 7a65 726f 2671 't be zero&q │ │ │ │ +00006340: 756f 743b 3c2f 7370 616e 3e29 3b3c 2f64 uot;);.
16 │ │ │ │ +000063a0: 313c 2f73 7061 6e3e 203c 2f64 6976 3e0a 1
. │ │ │ │ +000063b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
163< │ │ │ │ +000064e0: 2f73 7061 6e3e 2020 2020 2020 7b3c 2f64 /span> {.
16 │ │ │ │ +00006540: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ │ +00006550: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto&& row │ │ │ │ +00006580: 3d20 2a72 6f77 4974 3b3c 2f64 6976 3e0a = *rowIt;
. │ │ │ │ +00006590: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +00006660: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00006670: 6e6f 223e 2020 3136 363c 2f73 7061 6e3e no"> 166 │ │ │ │ +00006680: 2020 2020 2020 2020 3c73 7061 6e20 636c for ( < │ │ │ │ +000066b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000066c0: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord">auto │ │ │ │ +000066d0: 2063 6f6c 4974 203d 2072 6f77 2e62 6567 colIt = row.beg │ │ │ │ +000066e0: 696e 2829 3b20 636f 6c49 7420 213d 2072 in(); colIt != r │ │ │ │ +000066f0: 6f77 2e65 6e64 2829 3b20 636f 6c49 742b ow.end(); colIt+ │ │ │ │ +00006700: 2b20 293c 2f64 6976 3e0a 3c64 6976 2063 + )
.
167 │ │ │ │ +00006760: 2020 2020 2020 7b3c 2f64 6976 3e0a 3c64 {
. │ │ │ │ +00006780: 3c61 2069 643d 226c 3030 3136 3822 206e 168 auto&am │ │ │ │ +000067f0: 703b 2661 6d70 3b20 656e 7472 7920 3d20 p;& entry = │ │ │ │ +00006800: 2a63 6f6c 4974 3b3c 2f64 6976 3e0a 3c64 *colIt;
. │ │ │ │ +00006820: 3c61 2069 643d 226c 3030 3136 3922 206e 169 auto co │ │ │ │ +00006890: 6c49 6478 203d 2063 6f6c 4974 2e69 6e64 lIdx = colIt.ind │ │ │ │ +000068a0: 6578 2829 3b3c 2f64 6976 3e0a 3c64 6976 ex();
.
< │ │ │ │ +000068e0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000068f0: 6e6f 223e 2020 3137 303c 2f73 7061 6e3e no"> 170 │ │ │ │ +00006900: 2020 2020 2020 2020 2020 3c73 7061 6e20 │ │ │ │ +00006920: 6175 746f 3c2f 7370 616e 3e20 5b20 6475 auto [ du │ │ │ │ +00006930: 6d6d 7952 6f77 732c 2064 756d 6d79 436f mmyRows, dummyCo │ │ │ │ +00006940: 6c73 205d 203d 203c 6120 636c 6173 733d ls ] = flatMatr │ │ │ │ +000069a0: 6978 466f 7245 6163 683c 2f61 3e28 656e ixForEach(en │ │ │ │ +000069b0: 7472 792c 2066 2c20 726f 774f 6666 7365 try, f, rowOffse │ │ │ │ +000069c0: 7420 2b20 726f 7749 6478 2a62 6c6f 636b t + rowIdx*block │ │ │ │ +000069d0: 526f 7773 2c20 636f 6c4f 6666 7365 7420 Rows, colOffset │ │ │ │ +000069e0: 2b20 636f 6c49 6478 2a62 6c6f 636b 436f + colIdx*blockCo │ │ │ │ +000069f0: 6c73 293b 3c2f 6469 763e 0a3c 6469 7620 ls);
.
171 │ │ │ │ +00006a50: 2020 2020 2020 2020 2061 7373 6572 7428 assert( │ │ │ │ +00006a60: 2064 756d 6d79 526f 7773 203d 3d20 626c dummyRows == bl │ │ │ │ +00006a70: 6f63 6b52 6f77 7320 616e 6420 6475 6d6d ockRows and dumm │ │ │ │ +00006a80: 7943 6f6c 7320 3d3d 2062 6c6f 636b 436f yCols == blockCo │ │ │ │ +00006a90: 6c73 2061 6e64 203c 7370 616e 2063 6c61 ls and "we need │ │ │ │ +00006ac0: 2074 6865 2073 616d 6520 7369 7a65 206f the same size o │ │ │ │ +00006ad0: 6620 6561 6368 2062 6c6f 636b 2069 6e20 f each block in │ │ │ │ +00006ae0: 7468 6973 206d 6174 7269 7820 7479 7065 this matrix type │ │ │ │ +00006af0: 2671 756f 743b 3c2f 7370 616e 3e29 3b3c ");< │ │ │ │ +00006b00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00006b50: 3137 323c 2f73 7061 6e3e 2020 2020 2020 172 │ │ │ │ +00006b60: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
.
173 │ │ │ │ +00006bc0: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +00006c00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00006c10: 6e6f 223e 2020 3137 343c 2f73 7061 6e3e no"> 174 │ │ │ │ +00006c20: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00006c70: 2020 3137 353c 2f73 7061 6e3e 2020 2020 175 │ │ │ │ +00006c80: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ │ +00006ca0: 726e 3c2f 7370 616e 3e20 7b20 6d61 7472 rn { matr │ │ │ │ +00006cb0: 6978 2e4e 2829 2a62 6c6f 636b 526f 7773 ix.N()*blockRows │ │ │ │ +00006cc0: 2c20 6d61 7472 6978 2e4d 2829 2a62 6c6f , matrix.M()*blo │ │ │ │ +00006cd0: 636b 436f 6c73 207d 3b3c 2f64 6976 3e0a ckCols };
. │ │ │ │ +00006ce0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +00006d40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +00006e10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00006e40: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 178 else.
17 │ │ │ │ +00006ee0: 393c 2f73 7061 6e3e 2020 2020 7b3c 2f64 9 {.
20 │ │ │ │ -00006f40: 343c 2f73 7061 6e3e 2020 2020 7d3c 2f64 4 }.
.
205 │ │ │ │ -00006fb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00007000: 2032 3036 3c2f 7370 616e 3e20 2020 203c 206 < │ │ │ │ -00007010: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00007020: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template<cl │ │ │ │ -00007050: 6173 733c 2f73 7061 6e3e 2053 2667 743b ass S> │ │ │ │ -00007060: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -000070c0: 6120 6964 3d22 6c30 3032 3037 2220 6e61 a id="l00207" na │ │ │ │ -000070d0: 6d65 3d22 6c30 3032 3037 223e 3c2f 613e me="l00207"> │ │ │ │ -000070e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 207 │ │ │ │ -00007140: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -00007150: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00007160: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void setSubMat │ │ │ │ -000071d0: 7269 783c 2f61 3e28 3c73 7061 6e20 636c rix(co │ │ │ │ -000071f0: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst Matrix& matrix, < │ │ │ │ -00007240: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00007250: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const S& rowInde │ │ │ │ -00007270: 7853 6574 293c 2f64 6976 3e0a 3c64 6976 xSet)
.
< │ │ │ │ -000072b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000072c0: 6e6f 223e 2020 3230 383c 2f73 7061 6e3e no"> 208 │ │ │ │ -000072d0: 2020 2020 7b3c 2f64 6976 3e0a 3c64 6976 {
.
< │ │ │ │ -00007310: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00007320: 6e6f 223e 2020 3230 393c 2f73 7061 6e3e no"> 209 │ │ │ │ -00007330: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ -00007350: 6966 3c2f 7370 616e 3e20 2828 6c64 6c4d if ((ldlM │ │ │ │ -00007360: 6174 7269 785f 2e4e 2829 202b 206c 646c atrix_.N() + ldl │ │ │ │ -00007370: 4d61 7472 6978 5f2e 4d28 2920 2667 743b Matrix_.M() > │ │ │ │ -00007380: 2030 2920 7c7c 206d 6174 7269 7849 734c 0) || matrixIsL │ │ │ │ -00007390: 6f61 6465 645f 293c 2f64 6976 3e0a 3c64 oaded_)
. │ │ │ │ -000073b0: 3c61 2069 643d 226c 3030 3231 3022 206e 210 free() │ │ │ │ -00007400: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00007450: 2020 3231 313c 2f73 7061 6e3e 203c 2f64 211 .
21 │ │ │ │ -000074b0: 323c 2f73 7061 6e3e 2020 2020 2020 3c73 2 if (ldlMatrix_.N( │ │ │ │ -000074f0: 2920 2b20 6c64 6c4d 6174 7269 785f 2e4d ) + ldlMatrix_.M │ │ │ │ -00007500: 2829 202b 206c 646c 4d61 7472 6978 5f2e () + ldlMatrix_. │ │ │ │ -00007510: 6e6f 6e7a 6572 6f65 7328 2920 213d 2030 nonzeroes() != 0 │ │ │ │ -00007520: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ -00007570: 2020 3231 333c 2f73 7061 6e3e 2020 2020 213 │ │ │ │ -00007580: 2020 2020 6c64 6c4d 6174 7269 785f 2e66 ldlMatrix_.f │ │ │ │ -00007590: 7265 6528 293b 3c2f 6469 763e 0a3c 6469 ree();
.< │ │ │ │ -000075b0: 6120 6964 3d22 6c30 3032 3134 2220 6e61 a id="l00214" na │ │ │ │ -000075c0: 6d65 3d22 6c30 3032 3134 223e 3c2f 613e me="l00214"> │ │ │ │ -000075d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 214
.
215 │ │ │ │ -00007650: 2020 206c 646c 4d61 7472 6978 5f2e 7365 ldlMatrix_.se │ │ │ │ -00007660: 7453 697a 6528 726f 7749 6e64 6578 5365 tSize(rowIndexSe │ │ │ │ -00007670: 742e 7369 7a65 2829 2a3c 6120 636c 6173 t.size()*MatrixDime │ │ │ │ -000076b0: 6e73 696f 6e26 6c74 3b4d 6174 7269 7826 nsion<Matrix& │ │ │ │ -000076c0: 6774 3b3a 3a72 6f77 6469 6d3c 2f61 3e28 gt;::rowdim( │ │ │ │ -000076d0: 6d61 7472 6978 2920 2f20 6d61 7472 6978 matrix) / matrix │ │ │ │ -000076e0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .N(),
│ │ │ │ -00007740: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00007770: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 216 │ │ │ │ -000077a0: 2020 2020 2020 2020 2020 2020 2020 726f ro │ │ │ │ -000077b0: 7749 6e64 6578 5365 742e 7369 7a65 2829 wIndexSet.size() │ │ │ │ -000077c0: 2a3c 6120 636c 6173 733d 2263 6f64 6520 *Ma │ │ │ │ -000077f0: 7472 6978 4469 6d65 6e73 696f 6e26 6c74 trixDimension< │ │ │ │ -00007800: 3b4d 6174 7269 7826 6774 3b3a 3a63 6f6c ;Matrix>::col │ │ │ │ -00007810: 6469 6d3c 2f61 3e28 6d61 7472 6978 2920 dim(matrix) │ │ │ │ -00007820: 2f20 6d61 7472 6978 2e3c 6120 636c 6173 / matrix.M( │ │ │ │ -00007880: 2929 3b3c 2f64 6976 3e0a 3c64 6976 2063 ));
.
217 │ │ │ │ -000078e0: 2020 2020 4953 544c 3a3a 496d 706c 3a3a ISTL::Impl:: │ │ │ │ -000078f0: 4243 4353 4d61 7472 6978 496e 6974 6961 BCCSMatrixInitia │ │ │ │ -00007900: 6c69 7a65 7226 6c74 3b4d 6174 7269 782c lizer<Matrix, │ │ │ │ -00007910: 2069 6e74 2667 743b 2069 6e69 7469 616c int> initial │ │ │ │ -00007920: 697a 6572 286c 646c 4d61 7472 6978 5f29 izer(ldlMatrix_) │ │ │ │ -00007930: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00007980: 2020 3231 383c 2f73 7061 6e3e 203c 2f64 218 .
21 │ │ │ │ -000079e0: 393c 2f73 7061 6e3e 2020 2020 2020 636f 9 co │ │ │ │ -000079f0: 7079 546f 4243 4353 4d61 7472 6978 2869 pyToBCCSMatrix(i │ │ │ │ -00007a00: 6e69 7469 616c 697a 6572 2c20 4953 544c nitializer, ISTL │ │ │ │ -00007a10: 3a3a 496d 706c 3a3a 4d61 7472 6978 526f ::Impl::MatrixRo │ │ │ │ -00007a20: 7753 7562 7365 7426 6c74 3b3c 6120 636c wSubset<Matrix,std::set<st │ │ │ │ -00007a70: 643a 3a73 697a 655f 7426 6774 3b20 2667 d::size_t> &g │ │ │ │ -00007a80: 743b 286d 6174 7269 782c 726f 7749 6e64 t;(matrix,rowInd │ │ │ │ -00007a90: 6578 5365 7429 293b 3c2f 6469 763e 0a3c exSet));
.< │ │ │ │ -00007aa0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00007ab0: 3e3c 6120 6964 3d22 6c30 3032 3230 2220 > 220
.
221 │ │ │ │ -00007b50: 2020 2020 2064 6563 6f6d 706f 7365 2829 decompose() │ │ │ │ -00007b60: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00007bb0: 2020 3232 323c 2f73 7061 6e3e 2020 2020 222 │ │ │ │ -00007bc0: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
.
.< │ │ │ │ -00007bd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00007be0: 3e3c 6120 6964 3d22 6c30 3032 3233 2220 > 223
.
│ │ │ │ -00007c70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00007ca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d │ │ │ │ -00007d00: 2032 3238 3c2f 613e 3c2f 7370 616e 3e20 228 │ │ │ │ -00007d10: 2020 203c 7370 616e 2063 6c61 7373 3d22 inline< │ │ │ │ -00007d30: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> void s │ │ │ │ -00007db0: 6574 5665 7262 6f73 6974 793c 2f61 3e28 etVerbosity( │ │ │ │ -00007dc0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int v)
. │ │ │ │ -00007e00: 3c61 2069 643d 226c 3030 3232 3922 206e 229 {
. │ │ │ │ -00007e60: 3c61 2069 643d 226c 3030 3233 3022 206e 230 verbose_ │ │ │ │ -00007eb0: 3d76 3b3c 2f64 6976 3e0a 3c64 6976 2063 =v;
.
231 │ │ │ │ -00007f10: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
.
│ │ │ │ -00007f20: 0a3c 6469 7620 636c 6173 733d 226c 696e ....< │ │ │ │ -00008170: 6120 6964 3d22 6c30 3032 3338 2220 6e61 a id="l00238" na │ │ │ │ -00008180: 6d65 3d22 6c30 3032 3338 223e 3c2f 613e me="l00238"> │ │ │ │ -00008190: 3c73 7061 6e20 636c 6173 733d 226c 696e 238 {
.< │ │ │ │ -000081d0: 6120 6964 3d22 6c30 3032 3339 2220 6e61 a id="l00239" na │ │ │ │ -000081e0: 6d65 3d22 6c30 3032 3339 223e 3c2f 613e me="l00239"> │ │ │ │ -000081f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 239 return l │ │ │ │ -00008240: 646c 4d61 7472 6978 5f3b 3c2f 6469 763e dlMatrix_;
│ │ │ │ -00008250: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ -000082b0: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
.
│ │ │ │ -00008300: 2020 3234 313c 2f73 7061 6e3e 203c 2f64 241 .
.
246 void free().
2 │ │ │ │ -000084d0: 3437 3c2f 7370 616e 3e20 2020 207b 3c2f 47 {.
2 │ │ │ │ -00008530: 3438 3c2f 7370 616e 3e20 2020 2020 203c 48 < │ │ │ │ -00008540: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00008550: 6f72 6422 3e64 656c 6574 653c 2f73 7061 ord">delete [] D_;
. │ │ │ │ -00008570: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
250 │ │ │ │ -00008650: 2020 2020 203c 7370 616e 2063 6c61 7373 delet │ │ │ │ -00008670: 653c 2f73 7061 6e3e 205b 5d20 4c70 5f3b e [] Lp_; │ │ │ │ -00008680: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -000086d0: 2032 3531 3c2f 7370 616e 3e20 2020 2020 251 │ │ │ │ -000086e0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 delete [] Lx_;.
252 │ │ │ │ -00008760: 3c2f 7370 616e 3e20 2020 2020 203c 7370 delete │ │ │ │ -00008790: 205b 5d20 4c69 5f3b 3c2f 6469 763e 0a3c [] Li_;
.< │ │ │ │ -000087a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -000087b0: 3e3c 6120 6964 3d22 6c30 3032 3533 2220 > 253 d │ │ │ │ -00008810: 656c 6574 653c 2f73 7061 6e3e 205b 5d20 elete [] │ │ │ │ -00008820: 505f 3b3c 2f64 6976 3e0a 3c64 6976 2063 P_;
.
254 │ │ │ │ -00008880: 2020 2020 3c73 7061 6e20 636c 6173 733d delete │ │ │ │ -000088a0: 3c2f 7370 616e 3e20 5b5d 2050 696e 765f [] Pinv_ │ │ │ │ -000088b0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00008900: 2020 3235 353c 2f73 7061 6e3e 2020 2020 255 │ │ │ │ -00008910: 2020 6c64 6c4d 6174 7269 785f 2e66 7265 ldlMatrix_.fre │ │ │ │ -00008920: 6528 293b 3c2f 6469 763e 0a3c 6469 7620 e();
.
256 │ │ │ │ -00008980: 2020 2020 206d 6174 7269 7849 734c 6f61 matrixIsLoa │ │ │ │ -00008990: 6465 645f 203d 203c 7370 616e 2063 6c61 ded_ = fal │ │ │ │ -000089b0: 7365 3c2f 7370 616e 3e3b 3c2f 6469 763e se;
│ │ │ │ -000089c0: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ -00008a20: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
.
│ │ │ │ -00008a70: 2020 3235 383c 2f73 7061 6e3e 203c 2f64 258 .
.
260 inline │ │ │ │ -00008b90: 3c73 7061 6e20 636c 6173 733d 226b 6579 const cha │ │ │ │ -00008bd0: 723c 2f73 7061 6e3e 2a20 3c61 2063 6c61 r* name │ │ │ │ -00008c30: 3c2f 613e 2829 3c2f 6469 763e 0a3c 6469 ()
.< │ │ │ │ -00008c50: 6120 6964 3d22 6c30 3032 3631 2220 6e61 a id="l00261" na │ │ │ │ -00008c60: 6d65 3d22 6c30 3032 3631 223e 3c2f 613e me="l00261"> │ │ │ │ -00008c70: 3c73 7061 6e20 636c 6173 733d 226c 696e 261 {
.< │ │ │ │ -00008cb0: 6120 6964 3d22 6c30 3032 3632 2220 6e61 a id="l00262" na │ │ │ │ -00008cc0: 6d65 3d22 6c30 3032 3632 223e 3c2f 613e me="l00262"> │ │ │ │ -00008cd0: 3c73 7061 6e20 636c 6173 733d 226c 696e 262 return < │ │ │ │ -00008d20: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ -00008d30: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ -00008d40: 3b4c 444c 2671 756f 743b 3c2f 7370 616e ;LDL";
.
263 │ │ │ │ -00008db0: 207d 3c2f 6469 763e 0a3c 2f64 6976 3e0a }
.
. │ │ │ │ -00008dc0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
.
│ │ │ │ -00008ef0: 2020 3236 393c 2f61 3e3c 2f73 7061 6e3e 269 │ │ │ │ -00008f00: 2020 2020 3c73 7061 6e20 636c 6173 733d inline │ │ │ │ -00008f20: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c double* │ │ │ │ -00008f50: 203c 6120 636c 6173 733d 2263 6f64 6520 getD().
27 │ │ │ │ -00009000: 303c 2f73 7061 6e3e 2020 2020 7b3c 2f64 0 {.
27 │ │ │ │ -00009060: 313c 2f73 7061 6e3e 2020 2020 2020 3c73 1 return D_;
. │ │ │ │ -000090a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ -00009100: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00009150: 2032 3733 3c2f 7370 616e 3e20 3c2f 6469 273 .
.
278 │ │ │ │ -00009240: 3c2f 7370 616e 3e20 2020 203c 7370 616e inline < │ │ │ │ -00009270: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00009280: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int* getLp │ │ │ │ -000092f0: 2829 3c2f 6469 763e 0a3c 6469 7620 636c ()
.
279 │ │ │ │ -00009350: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
280 │ │ │ │ -000093b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret │ │ │ │ -000093d0: 7572 6e3c 2f73 7061 6e3e 204c 705f 3b3c urn Lp_;< │ │ │ │ -000093e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00009430: 3238 313c 2f73 7061 6e3e 2020 2020 7d3c 281 }< │ │ │ │ -00009440: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
.< │ │ │ │ -00009460: 6120 6964 3d22 6c30 3032 3832 2220 6e61 a id="l00282" na │ │ │ │ -00009470: 6d65 3d22 6c30 3032 3832 223e 3c2f 613e me="l00282"> │ │ │ │ -00009480: 3c73 7061 6e20 636c 6173 733d 226c 696e 282
.
.< │ │ │ │ -000094f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00009500: 3e3c 6120 6964 3d22 6c30 3032 3837 2220 > 2 │ │ │ │ -00009580: 3837 3c2f 613e 3c2f 7370 616e 3e20 2020 87 │ │ │ │ -00009590: 203c 7370 616e 2063 6c61 7373 3d22 6b65 inline i │ │ │ │ -000095d0: 6e74 3c2f 7370 616e 3e2a 203c 6120 636c nt* get │ │ │ │ -00009630: 4c69 3c2f 613e 2829 3c2f 6469 763e 0a3c Li()
.< │ │ │ │ -00009640: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00009650: 3e3c 6120 6964 3d22 6c30 3032 3838 2220 > 288 {
.< │ │ │ │ -000096a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -000096b0: 3e3c 6120 6964 3d22 6c30 3032 3839 2220 > 289 return │ │ │ │ -00009720: 204c 695f 3b3c 2f64 6976 3e0a 3c64 6976 Li_;
.
< │ │ │ │ -00009760: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00009770: 6e6f 223e 2020 3239 303c 2f73 7061 6e3e no"> 290 │ │ │ │ -00009780: 2020 2020 7d3c 2f64 6976 3e0a 3c2f 6469 }
..
291 │ │ │ │ -000097e0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -000097f0: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ │ -00009800: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ │ -00009810: 6e30 3032 3936 2220 6461 7461 2d73 7461 n00296" data-sta │ │ │ │ -00009820: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ │ -00009830: 227d 223e 0a3c 6469 7620 636c 6173 733d "}">.
296 inl │ │ │ │ -000098f0: 696e 653c 2f73 7061 6e3e 203c 7370 616e ine double* getLx( │ │ │ │ -00009980: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ -000099d0: 2020 3239 373c 2f73 7061 6e3e 2020 2020 297 │ │ │ │ -000099e0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ -00009a30: 2020 3239 383c 2f73 7061 6e3e 2020 2020 298 │ │ │ │ -00009a40: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ │ -00009a60: 726e 3c2f 7370 616e 3e20 4c78 5f3b 3c2f rn Lx_;.
2 │ │ │ │ -00009ac0: 3939 3c2f 7370 616e 3e20 2020 207d 3c2f 99 }.
.
< │ │ │ │ -00009b10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00009b20: 6e6f 223e 2020 3330 303c 2f73 7061 6e3e no"> 300 │ │ │ │ -00009b30: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -00009b80: 2020 3330 313c 2f73 7061 6e3e 2020 2020 301 │ │ │ │ -00009b90: 3c73 7061 6e20 636c 6173 733d 226b 6579 private:
.
< │ │ │ │ -00009bf0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00009c00: 6e6f 223e 2020 3330 323c 2f73 7061 6e3e no"> 302 │ │ │ │ -00009c10: 2020 2020 3c73 7061 6e20 636c 6173 733d templa │ │ │ │ -00009c30: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class │ │ │ │ -00009c60: 4d2c 3c73 7061 6e20 636c 6173 733d 226b M,class X, cl │ │ │ │ -00009ca0: 6173 733c 2f73 7061 6e3e 2054 4d2c 203c ass TM, < │ │ │ │ -00009cb0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00009cc0: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class TD, clas │ │ │ │ -00009cf0: 733c 2f73 7061 6e3e 2054 3126 6774 3b3c s T1>< │ │ │ │ -00009d00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
303 fr │ │ │ │ -00009dc0: 6965 6e64 3c2f 7370 616e 3e20 3c73 7061 iend class < │ │ │ │ -00009df0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00009e00: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ │ -00009e10: 3134 3132 2e68 746d 6c22 3e53 6571 4f76 1412.html">SeqOv │ │ │ │ -00009e20: 6572 6c61 7070 696e 6753 6368 7761 727a erlappingSchwarz │ │ │ │ -00009e30: 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 6976 ;
.
< │ │ │ │ -00009e70: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00009e80: 6e6f 223e 2020 3330 343c 2f73 7061 6e3e no"> 304 │ │ │ │ -00009e90: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -00009ee0: 2020 3330 353c 2f73 7061 6e3e 2020 2020 305 │ │ │ │ -00009ef0: 3c73 7061 6e20 636c 6173 733d 226b 6579 friend struct │ │ │ │ -00009f30: 203c 2f73 7061 6e3e 3c61 2063 6c61 7373 SeqOverlapp │ │ │ │ -00009f70: 696e 6753 6368 7761 727a 4173 7365 6d62 ingSchwarzAssemb │ │ │ │ -00009f80: 6c65 7248 656c 7065 723c 2f61 3e26 6c74 lerHelper< │ │ │ │ -00009f90: 3b3c 6120 636c 6173 733d 2263 6f64 6520 ;LDL │ │ │ │ -00009fc0: 3c2f 613e 266c 743b 3c61 2063 6c61 7373 <Matrix&g │ │ │ │ -0000a000: 743b 2c74 7275 6526 6774 3b3b 3c2f 6469 t;,true>;.
306 │ │ │ │ -0000a060: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -0000a070: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000a080: 3e3c 6120 6964 3d22 6c30 3033 3038 2220 > 308 void dec │ │ │ │ -0000a0f0: 6f6d 706f 7365 2829 3c2f 6469 763e 0a3c ompose()
.< │ │ │ │ -0000a100: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000a110: 3e3c 6120 6964 3d22 6c30 3033 3039 2220 > 309 {
.< │ │ │ │ -0000a160: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000a170: 3e3c 6120 6964 3d22 6c30 3033 3130 2220 > 310 / │ │ │ │ -0000a1d0: 2f20 616c 6c6f 6361 7465 2076 6563 746f / allocate vecto │ │ │ │ -0000a1e0: 7273 3c2f 7370 616e 3e3c 2f64 6976 3e0a rs
. │ │ │ │ -0000a1f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ -0000a2b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ -0000a3b0: 2020 3331 333c 2f73 7061 6e3e 2020 2020 313 │ │ │ │ -0000a3c0: 2020 595f 203d 203c 7370 616e 2063 6c61 Y_ = new │ │ │ │ -0000a3e0: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c double │ │ │ │ -0000a410: 5b64 696d 4d61 745d 3b3c 2f64 6976 3e0a [dimMat];
. │ │ │ │ -0000a420: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
315 │ │ │ │ -0000a530: 2020 2020 5061 7265 6e74 5f20 3d20 3c73 Parent_ = new < │ │ │ │ -0000a560: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000a570: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int [dimMat];.
31 │ │ │ │ -0000a5e0: 363c 2f73 7061 6e3e 2020 2020 2020 4c6e 6 Ln │ │ │ │ -0000a5f0: 7a5f 203d 203c 7370 616e 2063 6c61 7373 z_ = new │ │ │ │ -0000a630: 696e 743c 2f73 7061 6e3e 205b 6469 6d4d int [dimM │ │ │ │ -0000a640: 6174 5d3b 3c2f 6469 763e 0a3c 6469 7620 at];
.
317 │ │ │ │ -0000a6a0: 2020 2020 2046 6c61 675f 203d 203c 7370 Flag_ = new int [dimMat];.
318 │ │ │ │ -0000a750: 3c2f 7370 616e 3e20 2020 2020 2050 6174 Pat │ │ │ │ -0000a760: 7465 726e 5f20 3d20 3c73 7061 6e20 636c tern_ = ne │ │ │ │ -0000a780: 773c 2f73 7061 6e3e 203c 7370 616e 2063 w int [d │ │ │ │ -0000a7b0: 696d 4d61 745d 3b3c 2f64 6976 3e0a 3c64 imMat];
. │ │ │ │ -0000a7d0: 3c61 2069 643d 226c 3030 3331 3922 206e 319 P_ = new int [dimMat];.
320 │ │ │ │ -0000a8c0: 3c2f 7370 616e 3e20 2020 2020 2050 696e Pin │ │ │ │ -0000a8d0: 765f 203d 203c 7370 616e 2063 6c61 7373 v_ = new │ │ │ │ -0000a910: 696e 743c 2f73 7061 6e3e 205b 6469 6d4d int [dimM │ │ │ │ -0000a920: 6174 5d3b 3c2f 6469 763e 0a3c 6469 7620 at];
.
321 │ │ │ │ -0000a980: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000a9d0: 2033 3232 3c2f 7370 616e 3e20 2020 2020 322 │ │ │ │ -0000a9e0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 doubl │ │ │ │ -0000aa00: 653c 2f73 7061 6e3e 2049 6e66 6f20 5b41 e Info [A │ │ │ │ -0000aa10: 4d44 5f49 4e46 4f5d 3b3c 2f64 6976 3e0a MD_INFO];
. │ │ │ │ -0000aa20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ -0000aa50: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 323 if(am │ │ │ │ -0000aaa0: 645f 6f72 6465 7220 2864 696d 4d61 742c d_order (dimMat, │ │ │ │ -0000aab0: 206c 646c 4d61 7472 6978 5f2e 6765 7443 ldlMatrix_.getC │ │ │ │ -0000aac0: 6f6c 5374 6172 7428 292c 206c 646c 4d61 olStart(), ldlMa │ │ │ │ -0000aad0: 7472 6978 5f2e 6765 7452 6f77 496e 6465 trix_.getRowInde │ │ │ │ -0000aae0: 7828 292c 2050 5f2c 2028 3c73 7061 6e20 x(), P_, (double *) NULL, Info) │ │ │ │ -0000ab20: 2026 6c74 3b20 414d 445f 4f4b 293c 2f64 < AMD_OK).
32 │ │ │ │ -0000ab80: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ │ -0000ab90: 4455 4e45 5f54 4852 4f57 2849 6e76 616c DUNE_THROW(Inval │ │ │ │ -0000aba0: 6964 5374 6174 6545 7863 6570 7469 6f6e idStateException │ │ │ │ -0000abb0: 2c3c 7370 616e 2063 6c61 7373 3d22 7374 ,&qu │ │ │ │ -0000abd0: 6f74 3b45 7272 6f72 3a20 414d 4420 6661 ot;Error: AMD fa │ │ │ │ -0000abe0: 696c 6564 2126 7175 6f74 3b3c 2f73 7061 iled!");
.
325 │ │ │ │ -0000ac50: 2020 2020 203c 7370 616e 2063 6c61 7373 i │ │ │ │ -0000ac70: 663c 2f73 7061 6e3e 2876 6572 626f 7365 f(verbose │ │ │ │ -0000ac80: 5f20 2667 743b 2030 293c 2f64 6976 3e0a _ > 0)
. │ │ │ │ -0000ac90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ -0000acc0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 326 amd_ │ │ │ │ -0000acf0: 696e 666f 2028 496e 666f 293b 3c2f 6469 info (Info);.
327 │ │ │ │ -0000ad50: 3c2f 7370 616e 3e20 2020 2020 203c 7370 // compute th │ │ │ │ -0000ad80: 6520 7379 6d62 6f6c 6963 2066 6163 746f e symbolic facto │ │ │ │ -0000ad90: 7269 7361 7469 6f6e 3c2f 7370 616e 3e3c risation< │ │ │ │ -0000ada0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000adf0: 3332 383c 2f73 7061 6e3e 2020 2020 2020 328 │ │ │ │ -0000ae00: 6c64 6c5f 7379 6d62 6f6c 6963 2864 696d ldl_symbolic(dim │ │ │ │ -0000ae10: 4d61 742c 206c 646c 4d61 7472 6978 5f2e Mat, ldlMatrix_. │ │ │ │ -0000ae20: 6765 7443 6f6c 5374 6172 7428 292c 206c getColStart(), l │ │ │ │ -0000ae30: 646c 4d61 7472 6978 5f2e 6765 7452 6f77 dlMatrix_.getRow │ │ │ │ -0000ae40: 496e 6465 7828 292c 204c 705f 2c20 5061 Index(), Lp_, Pa │ │ │ │ -0000ae50: 7265 6e74 5f2c 204c 6e7a 5f2c 2046 6c61 rent_, Lnz_, Fla │ │ │ │ -0000ae60: 675f 2c20 505f 2c20 5069 6e76 5f29 3b3c g_, P_, Pinv_);< │ │ │ │ -0000ae70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000aec0: 3332 393c 2f73 7061 6e3e 2020 2020 2020 329 │ │ │ │ -0000aed0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // initial │ │ │ │ -0000aef0: 6973 6520 7468 6f73 6520 656e 7472 6965 ise those entrie │ │ │ │ -0000af00: 7320 6f66 2061 6464 6974 696f 6e61 6c56 s of additionalV │ │ │ │ -0000af10: 6563 746f 7273 5f20 7768 6f73 6520 6469 ectors_ whose di │ │ │ │ -0000af20: 6d65 6e73 696f 6e20 6973 206b 6e6f 776e mension is known │ │ │ │ -0000af30: 206f 6e6c 7920 6e6f 773c 2f73 7061 6e3e only now │ │ │ │ -0000af40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000af90: 2033 3330 3c2f 7370 616e 3e20 2020 2020 330 │ │ │ │ -0000afa0: 204c 785f 203d 203c 7370 616e 2063 6c61 Lx_ = new │ │ │ │ -0000afc0: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c double │ │ │ │ -0000aff0: 5b4c 705f 5b64 696d 4d61 745d 5d3b 3c2f [Lp_[dimMat]];.
3 │ │ │ │ -0000b050: 3331 3c2f 7370 616e 3e20 2020 2020 204c 31 L │ │ │ │ -0000b060: 695f 203d 203c 7370 616e 2063 6c61 7373 i_ = new │ │ │ │ -0000b0a0: 696e 743c 2f73 7061 6e3e 205b 4c70 5f5b int [Lp_[ │ │ │ │ -0000b0b0: 6469 6d4d 6174 5d5d 3b3c 2f64 6976 3e0a dimMat]];
. │ │ │ │ -0000b0c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
333< │ │ │ │ -0000b1b0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> const < │ │ │ │ -0000b1e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000b1f0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int rank(ldl_num │ │ │ │ -0000b210: 6572 6963 2864 696d 4d61 742c 206c 646c eric(dimMat, ldl │ │ │ │ -0000b220: 4d61 7472 6978 5f2e 6765 7443 6f6c 5374 Matrix_.getColSt │ │ │ │ -0000b230: 6172 7428 292c 206c 646c 4d61 7472 6978 art(), ldlMatrix │ │ │ │ -0000b240: 5f2e 6765 7452 6f77 496e 6465 7828 292c _.getRowIndex(), │ │ │ │ -0000b250: 206c 646c 4d61 7472 6978 5f2e 6765 7456 ldlMatrix_.getV │ │ │ │ -0000b260: 616c 7565 7328 292c 3c2f 6469 763e 0a3c alues(),
.< │ │ │ │ -0000b270: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000b280: 3e3c 6120 6964 3d22 6c30 3033 3334 2220 > 334 │ │ │ │ -0000b2d0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000b2e0: 2020 2020 4c70 5f2c 2050 6172 656e 745f Lp_, Parent_ │ │ │ │ -0000b2f0: 2c20 4c6e 7a5f 2c20 4c69 5f2c 204c 785f , Lnz_, Li_, Lx_ │ │ │ │ -0000b300: 2c20 445f 2c20 595f 2c20 5061 7474 6572 , D_, Y_, Patter │ │ │ │ -0000b310: 6e5f 2c20 466c 6167 5f2c 2050 5f2c 2050 n_, Flag_, P_, P │ │ │ │ -0000b320: 696e 765f 2929 3b3c 2f64 6976 3e0a 3c64 inv_));
. │ │ │ │ -0000b340: 3c61 2069 643d 226c 3030 3333 3522 206e 335 // │ │ │ │ -0000b3a0: 2066 7265 6520 7465 6d70 6f72 6172 7920 free temporary │ │ │ │ -0000b3b0: 7665 6374 6f72 733c 2f73 7061 6e3e 3c2f vectors.
3 │ │ │ │ -0000b410: 3336 3c2f 7370 616e 3e20 2020 2020 203c 36 < │ │ │ │ -0000b420: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000b430: 6f72 6422 3e64 656c 6574 653c 2f73 7061 ord">delete [] Flag_;.
337 │ │ │ │ -0000b4a0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 delete │ │ │ │ -0000b4d0: 205b 5d20 5061 7474 6572 6e5f 3b3c 2f64 [] Pattern_;.
33 │ │ │ │ -0000b530: 383c 2f73 7061 6e3e 2020 2020 2020 3c73 8 delete [] Parent_;.
33 │ │ │ │ -0000b5c0: 393c 2f73 7061 6e3e 2020 2020 2020 3c73 9 delete [] Lnz_;
│ │ │ │ -0000b600: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ -0000b670: 6120 6964 3d22 6c30 3033 3431 2220 6e61 a id="l00341" na │ │ │ │ -0000b680: 6d65 3d22 6c30 3033 3431 223e 3c2f 613e me="l00341"> │ │ │ │ -0000b690: 3c73 7061 6e20 636c 6173 733d 226c 696e 341 if(rank! │ │ │ │ -0000b6e0: 3d64 696d 4d61 7429 3c2f 6469 763e 0a3c =dimMat)
.< │ │ │ │ -0000b6f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000b700: 3e3c 6120 6964 3d22 6c30 3033 3432 2220 > 342
DUNE_ │ │ │ │ -0000b750: 5448 524f 5728 496e 7661 6c69 6453 7461 THROW(InvalidSta │ │ │ │ -0000b760: 7465 4578 6365 7074 696f 6e2c 3c73 7061 teException,"Er │ │ │ │ -0000b790: 726f 723a 204c 444c 2066 6163 746f 7269 ror: LDL factori │ │ │ │ -0000b7a0: 7361 7469 6f6e 2066 6169 6c65 6421 2671 sation failed!&q │ │ │ │ -0000b7b0: 756f 743b 3c2f 7370 616e 3e29 3b3c 2f64 uot;);.
34 │ │ │ │ -0000b810: 333c 2f73 7061 6e3e 2020 2020 7d3c 2f64 3 }.
34 │ │ │ │ -0000b870: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
. │ │ │ │ -0000b880: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ -0000b8b0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 345 LDLMatri │ │ │ │ -0000b8e0: 7820 6c64 6c4d 6174 7269 785f 3b3c 2f64 x ldlMatrix_;.
34 │ │ │ │ -0000b940: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 bool matrixIsLoaded │ │ │ │ -0000b980: 5f3b 3c2f 6469 763e 0a3c 6469 7620 636c _;
.
347 │ │ │ │ -0000b9e0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int verbose_;< │ │ │ │ -0000ba10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000ba60: 3334 383c 2f73 7061 6e3e 2020 2020 3c73 348 int* Lp_;
.< │ │ │ │ -0000baa0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000bab0: 3e3c 6120 6964 3d22 6c30 3033 3439 2220 > 349 int* Par │ │ │ │ -0000bb20: 656e 745f 3b3c 2f64 6976 3e0a 3c64 6976 ent_;
.
< │ │ │ │ -0000bb60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000bb70: 6e6f 223e 2020 3335 303c 2f73 7061 6e3e no"> 350 │ │ │ │ -0000bb80: 2020 2020 3c73 7061 6e20 636c 6173 733d in │ │ │ │ -0000bba0: 743c 2f73 7061 6e3e 2a20 4c6e 7a5f 3b3c t* Lnz_;< │ │ │ │ -0000bbb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000bc00: 3335 313c 2f73 7061 6e3e 2020 2020 3c73 351 int* Flag_;
│ │ │ │ -0000bc40: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000bc70: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 352 int* P │ │ │ │ -0000bcc0: 6174 7465 726e 5f3b 3c2f 6469 763e 0a3c attern_;
.< │ │ │ │ -0000bcd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000bce0: 3e3c 6120 6964 3d22 6c30 3033 3533 2220 > 353 int* P_; │ │ │ │ -0000bd50: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000bda0: 2033 3534 3c2f 7370 616e 3e20 2020 203c 354 < │ │ │ │ -0000bdb0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000bdc0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int* Pinv_;
.
355< │ │ │ │ -0000be30: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> double* D_;
.< │ │ │ │ -0000be80: 6120 6964 3d22 6c30 3033 3536 2220 6e61 a id="l00356" na │ │ │ │ -0000be90: 6d65 3d22 6c30 3033 3536 223e 3c2f 613e me="l00356"> │ │ │ │ -0000bea0: 3c73 7061 6e20 636c 6173 733d 226c 696e 356 d │ │ │ │ -0000bee0: 6f75 626c 653c 2f73 7061 6e3e 2a20 595f ouble* Y_ │ │ │ │ -0000bef0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -0000bf40: 2020 3335 373c 2f73 7061 6e3e 2020 2020 357 │ │ │ │ -0000bf50: 3c73 7061 6e20 636c 6173 733d 226b 6579 double │ │ │ │ -0000bf70: 3c2f 7370 616e 3e2a 204c 785f 3b3c 2f64 * Lx_;.
35 │ │ │ │ -0000bfd0: 383c 2f73 7061 6e3e 2020 2020 3c73 7061 8 int │ │ │ │ -0000c000: 2a20 4c69 5f3b 3c2f 6469 763e 0a3c 6469 * Li_;
.< │ │ │ │ -0000c020: 6120 6964 3d22 6c30 3033 3539 2220 6e61 a id="l00359" na │ │ │ │ -0000c030: 6d65 3d22 6c30 3033 3539 223e 3c2f 613e me="l00359"> │ │ │ │ -0000c040: 3c73 7061 6e20 636c 6173 733d 226c 696e 359 };
..
360 │ │ │ │ -0000c0c0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -0000c0d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000c0e0: 3e3c 6120 6964 3d22 6c30 3033 3631 2220 > 361 templ │ │ │ │ -0000c140: 6174 653c 2f73 7061 6e3e 266c 743b 3c73 ate<typename T, typ │ │ │ │ -0000c190: 656e 616d 653c 2f73 7061 6e3e 2041 2c20 ename A, │ │ │ │ -0000c1a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int n, int m&g │ │ │ │ -0000c1f0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
. │ │ │ │ -0000c240: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
│ │ │ │ -0000c440: 2020 3336 333c 2f73 7061 6e3e 2020 7b3c 363 {< │ │ │ │ -0000c450: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
364< │ │ │ │ -0000c510: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ -0000c530: 656e 756d 3c2f 7370 616e 3e20 7b3c 6120 enum { │ │ │ │ -0000c5b0: 7661 6c75 653c 2f61 3e20 3d20 3c73 7061 value = true};< │ │ │ │ -0000c5e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000c630: 3336 353c 2f73 7061 6e3e 2020 7d3b 3c2f 365 };.
.
< │ │ │ │ -0000c680: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000c690: 6e6f 223e 2020 3336 363c 2f73 7061 6e3e no"> 366 │ │ │ │ -0000c6a0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -0000c6f0: 2020 3336 373c 2f73 7061 6e3e 2020 3c73 367 template<typ │ │ │ │ -0000c740: 656e 616d 653c 2f73 7061 6e3e 2054 2c20 ename T, │ │ │ │ -0000c750: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename A, int n, │ │ │ │ -0000c7a0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int m>
.
.
368 stru │ │ │ │ -0000c8b0: 6374 203c 2f73 7061 6e3e 3c61 2063 6c61 ct StoresCol │ │ │ │ -0000c8f0: 756d 6e43 6f6d 7072 6573 7365 643c 2f61 umnCompressed<LDL<BCRSMatr │ │ │ │ -0000c970: 6978 3c2f 613e 266c 743b 3c61 2063 6c61 ix<FieldMatri │ │ │ │ -0000c9b0: 783c 2f61 3e26 6c74 3b54 2c6e 2c6d 2667 x<T,n,m&g │ │ │ │ -0000c9c0: 743b 2c41 2667 743b 2026 6774 3b20 2667 t;,A> > &g │ │ │ │ -0000c9d0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
369 { │ │ │ │ -0000ca30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
< │ │ │ │ -0000ca80: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -0000ca90: 7265 663d 2261 3030 3233 332e 6874 6d6c ref="a00233.html │ │ │ │ -0000caa0: 2367 6761 3562 3266 3636 6561 3432 6332 #gga5b2f66ea42c2 │ │ │ │ -0000cab0: 3431 6561 6461 3164 3035 3535 3335 3163 41eada1d0555351c │ │ │ │ -0000cac0: 3636 6538 6136 3365 3238 3631 6234 3135 66e8a63e2861b415 │ │ │ │ -0000cad0: 3730 3938 6664 3164 3963 6334 3365 3236 7098fd1d9cc43e26 │ │ │ │ -0000cae0: 6633 3339 3922 3e20 2033 3730 3c2f 613e f3399"> 370 │ │ │ │ -0000caf0: 3c2f 7370 616e 3e20 2020 203c 7370 616e enum {value = true}; │ │ │ │ -0000cbc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000cc10: 2033 3731 3c2f 7370 616e 3e20 207d 3b3c 371 };< │ │ │ │ -0000cc20: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
.< │ │ │ │ -0000cc40: 6120 6964 3d22 6c30 3033 3732 2220 6e61 a id="l00372" na │ │ │ │ -0000cc50: 6d65 3d22 6c30 3033 3732 223e 3c2f 613e me="l00372"> │ │ │ │ -0000cc60: 3c73 7061 6e20 636c 6173 733d 226c 696e 372
.
. │ │ │ │ -0000ccd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ -0000cd00: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 373 │ │ │ │ -0000cd40: 3c2f 613e 3c2f 7370 616e 3e20 203c 7370 struct LD │ │ │ │ -0000cda0: 4c43 7265 6174 6f72 3c2f 613e 207b 3c2f LCreator {.
│ │ │ │ -0000ce20: 2020 3337 343c 2f61 3e3c 2f73 7061 6e3e 374 │ │ │ │ -0000ce30: 2020 2020 3c73 7061 6e20 636c 6173 733d templa │ │ │ │ -0000ce50: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class │ │ │ │ -0000ce80: 4626 6774 3b20 3c73 7061 6e20 636c 6173 F> stru │ │ │ │ -0000cea0: 6374 203c 2f73 7061 6e3e 3c61 2063 6c61 ct isValidBl │ │ │ │ -0000cee0: 6f63 6b3c 2f61 3e20 3a20 7374 643a 3a66 ock : std::f │ │ │ │ -0000cef0: 616c 7365 5f74 7970 657b 7d3b 3c2f 6469 alse_type{};.
│ │ │ │ -0000cf70: 3337 353c 2f61 3e3c 2f73 7061 6e3e 2020 375 │ │ │ │ -0000cf80: 2020 3c73 7061 6e20 636c 6173 733d 226b template │ │ │ │ -0000cfa0: 3c2f 7370 616e 3e26 6c74 3b3c 7370 616e <int │ │ │ │ -0000cfd0: 6b26 6774 3b20 3c73 7061 6e20 636c 6173 k> stru │ │ │ │ -0000cff0: 6374 203c 2f73 7061 6e3e 3c61 2063 6c61 ct isValidBl │ │ │ │ -0000d030: 6f63 6b3c 2f61 3e26 6c74 3b46 6965 6c64 ock<Field │ │ │ │ -0000d040: 5665 6374 6f72 266c 743b 646f 7562 6c65 Vector<double │ │ │ │ -0000d050: 2c6b 2667 743b 2667 743b 203a 2073 7464 ,k>> : std │ │ │ │ -0000d060: 3a3a 7472 7565 5f74 7970 657b 7d3b 3c2f ::true_type{};.
3 │ │ │ │ -0000d0c0: 3736 3c2f 7370 616e 3e20 3c2f 6469 763e 76
│ │ │ │ -0000d0d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000d100: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 377 t │ │ │ │ -0000d140: 656d 706c 6174 653c 2f73 7061 6e3e 266c emplate&l │ │ │ │ -0000d150: 743b 3c73 7061 6e20 636c 6173 733d 226b t;typename │ │ │ │ -0000d170: 3c2f 7370 616e 3e20 544c 2c20 3c73 7061 TL, typename M>
. │ │ │ │ -0000d1c0: 3c61 2069 643d 226c 3030 3337 3822 206e 378 std::share │ │ │ │ -0000d210: 645f 7074 7226 6c74 3b44 756e 653a 3a49 d_ptr<Dune::I │ │ │ │ -0000d220: 6e76 6572 7365 4f70 6572 6174 6f72 266c nverseOperator&l │ │ │ │ -0000d230: 743b 7479 7065 6e61 6d65 2044 756e 653a t;typename Dune: │ │ │ │ -0000d240: 3a54 7970 654c 6973 7445 6c65 6d65 6e74 :TypeListElement │ │ │ │ -0000d250: 266c 743b 312c 2054 4c26 6774 3b3a 3a74 <1, TL>::t │ │ │ │ -0000d260: 7970 652c 3c2f 6469 763e 0a3c 6469 7620 ype,
.
379 │ │ │ │ -0000d2c0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000d2d0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000d2e0: 2020 2020 2020 2020 203c 7370 616e 2063 t │ │ │ │ -0000d300: 7970 656e 616d 653c 2f73 7061 6e3e 2044 ypename D │ │ │ │ -0000d310: 756e 653a 3a54 7970 654c 6973 7445 6c65 une::TypeListEle │ │ │ │ -0000d320: 6d65 6e74 266c 743b 322c 2054 4c26 6774 ment<2, TL> │ │ │ │ -0000d330: 3b3a 3a74 7970 6526 6774 3b26 6774 3b3c ;::type>>< │ │ │ │ -0000d340: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ │ -0000d3c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000d3d0: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 380< │ │ │ │ -0000d420: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c61 /a> │ │ │ │ -0000d480: 6f70 6572 6174 6f72 2829 203c 2f61 3e28 operator() ( │ │ │ │ -0000d490: 544c 203c 7370 616e 2063 6c61 7373 3d22 TL /*tl*/< │ │ │ │ -0000d4b0: 2f73 7061 6e3e 2c20 3c73 7061 6e20 636c /span>, co │ │ │ │ -0000d4d0: 6e73 743c 2f73 7061 6e3e 204d 2661 6d70 nst M& │ │ │ │ -0000d4e0: 3b20 3c61 2063 6c61 7373 3d22 636f 6465 ; mat, const │ │ │ │ -0000d560: 4475 6e65 3a3a 5061 7261 6d65 7465 7254 Dune::ParameterT │ │ │ │ -0000d570: 7265 6526 616d 703b 2063 6f6e 6669 672c ree& config, │ │ │ │ -0000d580: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000d5d0: 2033 3831 3c2f 7370 616e 3e20 2020 2020 381 │ │ │ │ -0000d5e0: 2073 7464 3a3a 656e 6162 6c65 5f69 665f std::enable_if_ │ │ │ │ -0000d5f0: 7426 6c74 3b3c 2f64 6976 3e0a 3c64 6976 t<
.
< │ │ │ │ -0000d630: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000d640: 6e6f 223e 2020 3338 323c 2f73 7061 6e3e no"> 382 │ │ │ │ -0000d650: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000d660: 3c61 2063 6c61 7373 3d22 636f 6465 2068 isV │ │ │ │ -0000d690: 616c 6964 426c 6f63 6b3c 2f61 3e26 6c74 alidBlock< │ │ │ │ -0000d6a0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;typename< │ │ │ │ -0000d6c0: 2f73 7061 6e3e 2044 756e 653a 3a54 7970 /span> Dune::Typ │ │ │ │ -0000d6d0: 654c 6973 7445 6c65 6d65 6e74 266c 743b eListElement< │ │ │ │ -0000d6e0: 312c 2054 4c26 6774 3b3a 3a74 7970 653a 1, TL>::type: │ │ │ │ -0000d6f0: 3a62 6c6f 636b 5f74 7970 6526 6774 3b3a :block_type>: │ │ │ │ -0000d700: 3a76 616c 7565 2c3c 7370 616e 2063 6c61 :value,int> │ │ │ │ -0000d730: 3d20 3029 3c73 7061 6e20 636c 6173 733d = 0) const │ │ │ │ -0000d750: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -0000d770: 3c61 2069 643d 226c 3030 3338 3322 206e 383 {
.
384 │ │ │ │ -0000d830: 2020 2020 203c 7370 616e 2063 6c61 7373 i │ │ │ │ -0000d850: 6e74 3c2f 7370 616e 3e20 7665 7262 6f73 nt verbos │ │ │ │ -0000d860: 6520 3d20 636f 6e66 6967 2e67 6574 283c e = config.get(< │ │ │ │ -0000d870: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ -0000d880: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ -0000d890: 3b76 6572 626f 7365 2671 756f 743b 3c2f ;verbose", 0);
│ │ │ │ -0000d8b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000d8e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 385 return std::make_sha │ │ │ │ -0000d940: 7265 6426 6c74 3b44 756e 653a 3a4c 444c red<Dune::LDL │ │ │ │ -0000d950: 266c 743b 4d26 6774 3b26 6774 3b28 3c61 <M>>( │ │ │ │ -0000d9b0: 6d61 743c 2f61 3e2c 7665 7262 6f73 6529 mat,verbose) │ │ │ │ -0000d9c0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -0000da10: 2020 3338 363c 2f73 7061 6e3e 2020 2020 386 │ │ │ │ -0000da20: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
.
.< │ │ │ │ -0000da30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000da40: 3e3c 6120 6964 3d22 6c30 3033 3837 2220 > 387
.
388 │ │ │ │ -0000dae0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // seco │ │ │ │ -0000db00: 6e64 2076 6572 7369 6f6e 2077 6974 6820 nd version with │ │ │ │ -0000db10: 5346 494e 4145 2074 6f20 7661 6c69 6461 SFINAE to valida │ │ │ │ -0000db20: 7465 2074 6865 2074 656d 706c 6174 6520 te the template │ │ │ │ -0000db30: 7061 7261 6d65 7465 7273 206f 6620 4c44 parameters of LD │ │ │ │ -0000db40: 4c3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c L
.< │ │ │ │ -0000db50: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000db60: 3e3c 6120 6964 3d22 6c30 3033 3839 2220 > 389
tem │ │ │ │ -0000dbc0: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate< │ │ │ │ -0000dbd0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename TL, │ │ │ │ -0000dc10: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename │ │ │ │ -0000dc20: 4d26 6774 3b3c 2f64 6976 3e0a 3c64 6976 M>
.
< │ │ │ │ -0000dc60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000dc70: 6e6f 223e 2020 3339 303c 2f73 7061 6e3e no"> 390 │ │ │ │ -0000dc80: 2020 2020 7374 643a 3a73 6861 7265 645f std::shared_ │ │ │ │ -0000dc90: 7074 7226 6c74 3b44 756e 653a 3a49 6e76 ptr<Dune::Inv │ │ │ │ -0000dca0: 6572 7365 4f70 6572 6174 6f72 266c 743b erseOperator< │ │ │ │ -0000dcb0: 7479 7065 6e61 6d65 2044 756e 653a 3a54 typename Dune::T │ │ │ │ -0000dcc0: 7970 654c 6973 7445 6c65 6d65 6e74 266c ypeListElement&l │ │ │ │ -0000dcd0: 743b 312c 2054 4c26 6774 3b3a 3a74 7970 t;1, TL>::typ │ │ │ │ -0000dce0: 652c 3c2f 6469 763e 0a3c 6469 7620 636c e,
.
391 │ │ │ │ -0000dd40: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000dd50: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000dd60: 2020 2020 2020 203c 7370 616e 2063 6c61 typ │ │ │ │ -0000dd80: 656e 616d 653c 2f73 7061 6e3e 2044 756e ename Dun │ │ │ │ -0000dd90: 653a 3a54 7970 654c 6973 7445 6c65 6d65 e::TypeListEleme │ │ │ │ -0000dda0: 6e74 266c 743b 322c 2054 4c26 6774 3b3a nt<2, TL>: │ │ │ │ -0000ddb0: 3a74 7970 6526 6774 3b26 6774 3b3c 2f64 :type>>.
.
392 op │ │ │ │ -0000df00: 6572 6174 6f72 2829 203c 2f61 3e28 544c erator() (TL │ │ │ │ -0000df10: 203c 7370 616e 2063 6c61 7373 3d22 636f /*tl*/, cons │ │ │ │ -0000df50: 743c 2f73 7061 6e3e 204d 2661 6d70 3b20 t M& │ │ │ │ -0000df60: 3c73 7061 6e20 636c 6173 733d 2263 6f6d /*mat*/, cons │ │ │ │ -0000dfa0: 743c 2f73 7061 6e3e 2044 756e 653a 3a50 t Dune::P │ │ │ │ -0000dfb0: 6172 616d 6574 6572 5472 6565 2661 6d70 arameterTree& │ │ │ │ -0000dfc0: 3b20 3c73 7061 6e20 636c 6173 733d 2263 ; /*config │ │ │ │ -0000dfe0: 2a2f 3c2f 7370 616e 3e2c 3c2f 6469 763e */,
│ │ │ │ -0000dff0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000e020: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 393 std:: │ │ │ │ -0000e050: 656e 6162 6c65 5f69 665f 7426 6c74 3b3c enable_if_t<< │ │ │ │ -0000e060: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000e0b0: 3339 343c 2f73 7061 6e3e 2020 2020 2020 394 │ │ │ │ -0000e0c0: 2020 2020 2020 2020 2020 213c 6120 636c !isValidB │ │ │ │ -0000e100: 6c6f 636b 3c2f 613e 266c 743b 3c73 7061 lock<typename Dune::TypeList │ │ │ │ -0000e140: 456c 656d 656e 7426 6c74 3b31 2c20 544c Element<1, TL │ │ │ │ -0000e150: 2667 743b 3a3a 7479 7065 3a3a 626c 6f63 >::type::bloc │ │ │ │ -0000e160: 6b5f 7479 7065 2667 743b 3a3a 7661 6c75 k_type>::valu │ │ │ │ -0000e170: 652c 3c73 7061 6e20 636c 6173 733d 226b e,int< │ │ │ │ -0000e190: 2f73 7061 6e3e 2667 743b 203d 2030 293c /span>> = 0)< │ │ │ │ -0000e1a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000e1b0: 6f72 6422 3e20 636f 6e73 743c 2f73 7061 ord"> const
.
395 {< │ │ │ │ -0000e240: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000e290: 3339 363c 2f73 7061 6e3e 2020 2020 2020 396 │ │ │ │ -0000e2a0: 4455 4e45 5f54 4852 4f57 283c 6120 636c DUNE_THROW(Unsupport │ │ │ │ -0000e2e0: 6564 5479 7065 3c2f 613e 2c3c 2f64 6976 edType,
.
397< │ │ │ │ -0000e340: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> " │ │ │ │ -0000e370: 556e 7375 7070 6f72 7465 6420 5479 7065 Unsupported Type │ │ │ │ -0000e380: 2069 6e20 4c44 4c20 286f 6e6c 7920 646f in LDL (only do │ │ │ │ -0000e390: 7562 6c65 2061 6e64 2073 7464 3a3a 636f uble and std::co │ │ │ │ -0000e3a0: 6d70 6c65 7826 6c74 3b64 6f75 626c 6526 mplex<double& │ │ │ │ -0000e3b0: 6774 3b20 7375 7070 6f72 7465 6429 2671 gt; supported)&q │ │ │ │ -0000e3c0: 756f 743b 3c2f 7370 616e 3e29 3b3c 2f64 uot;);.
39 │ │ │ │ -0000e420: 383c 2f73 7061 6e3e 2020 2020 7d3c 2f64 8 }.
.
399 │ │ │ │ -0000e490: 207d 3b3c 2f64 6976 3e0a 3c2f 6469 763e };
.
│ │ │ │ -0000e4a0: 0a3c 6469 7620 636c 6173 733d 226c 696e .. │ │ │ │ -0000e630: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ -0000e6c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000e6d0: 6e6f 223e 2020 3430 323c 2f73 7061 6e3e no"> 402 │ │ │ │ -0000e6e0: 7d20 3c73 7061 6e20 636c 6173 733d 2263 } // end n │ │ │ │ -0000e700: 616d 6573 7061 6365 2044 756e 653c 2f73 amespace Dune
.
403 │ │ │ │ -0000e770: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000e7c0: 2034 3034 3c2f 7370 616e 3e20 3c2f 6469 404 .
405 │ │ │ │ -0000e820: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #endif │ │ │ │ -0000e850: 3c73 7061 6e20 636c 6173 733d 2263 6f6d //HAVE_SUI │ │ │ │ -0000e870: 5445 5350 4152 5345 5f4c 444c 3c2f 7370 TESPARSE_LDL
.
406#endif │ │ │ │ -0000e900: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 //D │ │ │ │ -0000e920: 554e 455f 4953 544c 5f4c 444c 5f48 483c UNE_ISTL_LDL_HH< │ │ │ │ -0000e930: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.
DU │ │ │ │ -0000e9d0: 4e45 5f52 4547 4953 5445 525f 4449 5245 NE_REGISTER_DIRE │ │ │ │ -0000e9e0: 4354 5f53 4f4c 5645 523c 2f61 3e3c 2f64 CT_SOLVER
#define D │ │ │ │ -0000ea10: 554e 455f 5245 4749 5354 4552 5f44 4952 UNE_REGISTER_DIR │ │ │ │ -0000ea20: 4543 545f 534f 4c56 4552 286e 616d 652c ECT_SOLVER(name, │ │ │ │ -0000ea30: 2e2e 2e29 3c2f 6469 763e 3c64 6976 2063 ...)
│ │ │ │ -0000ea50: 4465 6669 6e69 7469 6f6e 3c2f 623e 2073 Definition s │ │ │ │ -0000ea60: 6f6c 7665 7272 6567 6973 7472 792e 6868 olverregistry.hh │ │ │ │ -0000ea70: 3a31 333c 2f64 6976 3e3c 2f64 6976 3e0a :13
. │ │ │ │ -0000ea80: 3c64 6976 2063 6c61 7373 3d22 7474 6322
Implementati │ │ │ │ -0000eb00: 6f6e 7320 6f66 2074 6865 2069 6e76 6572 ons of the inver │ │ │ │ -0000eb10: 7365 206f 7065 7261 746f 7220 696e 7465 se operator inte │ │ │ │ -0000eb20: 7266 6163 652e 3c2f 6469 763e 3c2f 6469 rface.
. │ │ │ │ -0000eba0: 0a3c 6469 7620 636c 6173 733d 2274 7463 ..
Te │ │ │ │ -0000ec90: 6d70 6c61 7465 7320 6368 6172 6163 7465 mplates characte │ │ │ │ -0000eca0: 7269 7a69 6e67 2074 6865 2074 7970 6520 rizing the type │ │ │ │ -0000ecb0: 6f66 2061 2073 6f6c 7665 722e 3c2f 6469 of a solver.
.
Dun │ │ │ │ -0000edd0: 653a 3a42 6c6f 636b 5665 6374 6f72 266c e::BlockVector&l │ │ │ │ -0000ede0: 743b 2046 6965 6c64 5665 6374 6f72 266c t; FieldVector&l │ │ │ │ -0000edf0: 743b 2054 2c20 6d20 2667 743b 2c20 7479 t; T, m >, ty │ │ │ │ -0000ee00: 7065 6e61 6d65 2073 7464 3a3a 616c 6c6f pename std::allo │ │ │ │ -0000ee10: 6361 746f 725f 7472 6169 7473 266c 743b cator_traits< │ │ │ │ -0000ee20: 2041 2026 6774 3b3a 3a74 656d 706c 6174 A >::templat │ │ │ │ -0000ee30: 6520 7265 6269 6e64 5f61 6c6c 6f63 266c e rebind_alloc&l │ │ │ │ -0000ee40: 743b 2046 6965 6c64 5665 6374 6f72 266c t; FieldVector&l │ │ │ │ -0000ee50: 743b 2054 2c20 6d20 2667 743b 2026 6774 t; T, m > > │ │ │ │ -0000ee60: 3b20 2667 743b 2064 6f6d 6169 6e5f 7479 ; > domain_ty │ │ │ │ -0000ee70: 7065 3c2f 6469 763e 3c64 6976 2063 6c61 pe
│ │ │ │ -0000eef0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
│ │ │ │ -0000eff0: 4475 6e65 3a3a 4243 5253 4d61 7472 6978 Dune::BCRSMatrix │ │ │ │ -0000f000: 266c 743b 2046 6965 6c64 4d61 7472 6978 < FieldMatrix │ │ │ │ -0000f010: 266c 743b 2054 2c20 6e2c 206d 2026 6774 < T, n, m > │ │ │ │ -0000f020: 3b2c 2041 2026 6774 3b20 4d61 7472 6978 ;, A > Matrix │ │ │ │ -0000f030: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
The mat │ │ │ │ -0000f050: 7269 7820 7479 7065 2e3c 2f64 6976 3e3c rix type.
< │ │ │ │ -0000f060: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ │ -0000f070: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ │ -0000f080: 2f62 3e20 6c64 6c2e 6868 3a37 383c 2f64 /b> ldl.hh:78
.
│ │ │ │ -0000f0e0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
Dun │ │ │ │ -0000f130: 653a 3a4c 444c 266c 743b 2042 4352 534d e::LDL< BCRSM │ │ │ │ -0000f140: 6174 7269 7826 6c74 3b20 4669 656c 644d atrix< FieldM │ │ │ │ -0000f150: 6174 7269 7826 6c74 3b20 542c 206e 2c20 atrix< T, n, │ │ │ │ -0000f160: 6d20 2667 743b 2c20 4120 2667 743b 2026 m >, A > & │ │ │ │ -0000f170: 6774 3b3a 3a67 6574 4c70 3c2f 613e 3c2f gt;::getLp
int * ge │ │ │ │ -0000f1a0: 744c 7028 293c 2f64 6976 3e3c 6469 7620 tLp()
Ge │ │ │ │ -0000f1c0: 7420 6661 6374 6f72 697a 6174 696f 6e20 t factorization │ │ │ │ -0000f1d0: 4c70 2e3c 2f64 6976 3e3c 6469 7620 636c Lp.
D │ │ │ │ -0000f1f0: 6566 696e 6974 696f 6e3c 2f62 3e20 6c64 efinition ld │ │ │ │ -0000f200: 6c2e 6868 3a32 3738 3c2f 6469 763e 3c2f l.hh:278
.
< │ │ │ │ -0000f270: 6120 6872 6566 3d22 6130 3032 3333 2e68 a href="a00233.h │ │ │ │ -0000f280: 746d 6c23 6761 3330 3238 3931 3466 3339 tml#ga3028914f39 │ │ │ │ -0000f290: 3035 3033 6464 3862 3162 3666 3732 6331 0503dd8b1b6f72c1 │ │ │ │ -0000f2a0: 6234 6433 6565 223e 4475 6e65 3a3a 4c44 b4d3ee">Dune::LD │ │ │ │ -0000f2b0: 4c26 6c74 3b20 4243 5253 4d61 7472 6978 L< BCRSMatrix │ │ │ │ -0000f2c0: 266c 743b 2046 6965 6c64 4d61 7472 6978 < FieldMatrix │ │ │ │ -0000f2d0: 266c 743b 2054 2c20 6e2c 206d 2026 6774 < T, n, m > │ │ │ │ -0000f2e0: 3b2c 2041 2026 6774 3b20 2667 743b 3a3a ;, A > >:: │ │ │ │ -0000f2f0: 6765 7449 6e74 6572 6e61 6c4d 6174 7269 getInternalMatri │ │ │ │ -0000f300: 783c 2f61 3e3c 2f64 6976 3e3c 6469 7620 x
L │ │ │ │ -0000f320: 444c 4d61 7472 6978 2026 616d 703b 2067 DLMatrix & g │ │ │ │ -0000f330: 6574 496e 7465 726e 616c 4d61 7472 6978 etInternalMatrix │ │ │ │ -0000f340: 2829 3c2f 6469 763e 3c64 6976 2063 6c61 ()
Retur │ │ │ │ -0000f360: 6e20 7468 6520 636f 6c75 6d6e 2063 6f6d n the column com │ │ │ │ -0000f370: 7072 6573 7320 6d61 7472 6978 2e3c 2f64 press matrix.
Definit │ │ │ │ -0000f3a0: 696f 6e3c 2f62 3e20 6c64 6c2e 6868 3a32 ion ldl.hh:2 │ │ │ │ -0000f3b0: 3337 3c2f 6469 763e 3c2f 6469 763e 0a3c 37
.< │ │ │ │ -0000f3c0: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -0000f3d0: 6964 3d22 6161 3030 3233 335f 6874 6d6c id="aa00233_html │ │ │ │ -0000f3e0: 5f67 6134 3934 6637 3138 3235 3434 6561 _ga494f7182544ea │ │ │ │ -0000f3f0: 6663 3931 6266 3861 3035 3731 3533 3936 fc91bf8a05715396 │ │ │ │ -0000f400: 3862 3922 3e3c 6469 7620 636c 6173 733d 8b9">Dune::ISTL::Imp │ │ │ │ -0000f4d0: 6c3a 3a42 4343 534d 6174 7269 7826 6c74 l::BCCSMatrix< │ │ │ │ -0000f4e0: 3b20 542c 2069 6e74 2026 6774 3b20 4c44 ; T, int > LD │ │ │ │ -0000f4f0: 4c4d 6174 7269 783c 2f64 6976 3e3c 6469 LMatrix
│ │ │ │ -0000f510: 5468 6520 636f 7272 6573 706f 6e64 696e The correspondin │ │ │ │ -0000f520: 6720 5375 7065 724c 5520 4d61 7472 6978 g SuperLU Matrix │ │ │ │ -0000f530: 2074 7970 652e 3c2f 6469 763e 3c64 6976 type.
< │ │ │ │ -0000f550: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -0000f560: 206c 646c 2e68 683a 3831 3c2f 6469 763e ldl.hh:81
│ │ │ │ -0000f570: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
double * ge │ │ │ │ -0000f680: 744c 7828 293c 2f64 6976 3e3c 6469 7620 tLx()
Ge │ │ │ │ -0000f6a0: 7420 6661 6374 6f72 697a 6174 696f 6e20 t factorization │ │ │ │ -0000f6b0: 4c78 2e3c 2f64 6976 3e3c 6469 7620 636c Lx.
D │ │ │ │ -0000f6d0: 6566 696e 6974 696f 6e3c 2f62 3e20 6c64 efinition ld │ │ │ │ -0000f6e0: 6c2e 6868 3a32 3936 3c2f 6469 763e 3c2f l.hh:296
.
< │ │ │ │ -0000f750: 6120 6872 6566 3d22 6130 3032 3333 2e68 a href="a00233.h │ │ │ │ -0000f760: 746d 6c23 6761 3533 3232 3636 6263 3463 tml#ga532266bc4c │ │ │ │ -0000f770: 3030 6139 3833 3838 6437 6436 6431 3432 00a98388d7d6d142 │ │ │ │ -0000f780: 6462 6364 3336 223e 4475 6e65 3a3a 4c44 dbcd36">Dune::LD │ │ │ │ -0000f790: 4c26 6c74 3b20 4243 5253 4d61 7472 6978 L< BCRSMatrix │ │ │ │ -0000f7a0: 266c 743b 2046 6965 6c64 4d61 7472 6978 < FieldMatrix │ │ │ │ -0000f7b0: 266c 743b 2054 2c20 6e2c 206d 2026 6774 < T, n, m > │ │ │ │ -0000f7c0: 3b2c 2041 2026 6774 3b20 2667 743b 3a3a ;, A > >:: │ │ │ │ -0000f7d0: 7365 7456 6572 626f 7369 7479 3c2f 613e setVerbosity │ │ │ │ -0000f7e0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
void s │ │ │ │ -0000f800: 6574 5665 7262 6f73 6974 7928 696e 7420 etVerbosity(int │ │ │ │ -0000f810: 7629 3c2f 6469 763e 3c64 6976 2063 6c61 v)
Sets │ │ │ │ -0000f830: 7468 6520 7665 7262 6f73 6974 7920 6c65 the verbosity le │ │ │ │ -0000f840: 7665 6c20 666f 7220 7468 6520 736f 6c76 vel for the solv │ │ │ │ -0000f850: 6572 2e3c 2f64 6976 3e3c 6469 7620 636c er.
D │ │ │ │ -0000f870: 6566 696e 6974 696f 6e3c 2f62 3e20 6c64 efinition ld │ │ │ │ -0000f880: 6c2e 6868 3a32 3238 3c2f 6469 763e 3c2f l.hh:228
.
< │ │ │ │ -0000f8f0: 6120 6872 6566 3d22 6130 3032 3333 2e68 a href="a00233.h │ │ │ │ -0000f900: 746d 6c23 6761 3535 3263 3965 3237 3064 tml#ga552c9e270d │ │ │ │ -0000f910: 6135 6161 3233 3933 6630 6437 3136 3139 a5aa2393f0d71619 │ │ │ │ -0000f920: 3534 3435 3034 223e 4475 6e65 3a3a 4c44 544504">Dune::LD │ │ │ │ -0000f930: 4c26 6c74 3b20 4243 5253 4d61 7472 6978 L< BCRSMatrix │ │ │ │ -0000f940: 266c 743b 2046 6965 6c64 4d61 7472 6978 < FieldMatrix │ │ │ │ -0000f950: 266c 743b 2054 2c20 6e2c 206d 2026 6774 < T, n, m > │ │ │ │ -0000f960: 3b2c 2041 2026 6774 3b20 2667 743b 3a3a ;, A > >:: │ │ │ │ -0000f970: 6170 706c 793c 2f61 3e3c 2f64 6976 3e3c apply
< │ │ │ │ -0000f980: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ -0000f990: 6922 3e76 6f69 6420 6170 706c 7928 5420 i">void apply(T │ │ │ │ -0000f9a0: 2a78 2c20 5420 2a62 293c 2f64 6976 3e3c *x, T *b)
< │ │ │ │ -0000f9b0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -0000f9c0: 223e 4164 6469 7469 6f6e 616c 2061 7070 ">Additional app │ │ │ │ -0000f9d0: 6c79 206d 6574 686f 6420 7769 7468 2063 ly method with c │ │ │ │ -0000f9e0: 2d61 7272 6179 7320 696e 2061 6e61 6c6f -arrays in analo │ │ │ │ -0000f9f0: 6779 2074 6f20 7375 7065 726c 752e 3c2f gy to superlu.
Defini │ │ │ │ -0000fa20: 7469 6f6e 3c2f 623e 206c 646c 2e68 683a tion ldl.hh: │ │ │ │ -0000fa30: 3137 363c 2f64 6976 3e3c 2f64 6976 3e0a 176
. │ │ │ │ -0000fa40: 3c64 6976 2063 6c61 7373 3d22 7474 6322
vi │ │ │ │ -0000fb40: 7274 7561 6c20 766f 6964 2061 7070 6c79 rtual void apply │ │ │ │ -0000fb50: 2864 6f6d 6169 6e5f 7479 7065 2026 616d (domain_type &am │ │ │ │ -0000fb60: 703b 782c 2072 616e 6765 5f74 7970 6520 p;x, range_type │ │ │ │ -0000fb70: 2661 6d70 3b62 2c20 646f 7562 6c65 2072 &b, double r │ │ │ │ -0000fb80: 6564 7563 7469 6f6e 2c20 496e 7665 7273 eduction, Invers │ │ │ │ -0000fb90: 654f 7065 7261 746f 7252 6573 756c 7420 eOperatorResult │ │ │ │ -0000fba0: 2661 6d70 3b72 6573 293c 2f64 6976 3e3c &res)
< │ │ │ │ -0000fbb0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -0000fbc0: 223e 6170 706c 7920 696e 7665 7273 6520 ">apply inverse │ │ │ │ -0000fbd0: 6f70 6572 6174 6f72 2c20 7769 7468 2067 operator, with g │ │ │ │ -0000fbe0: 6976 656e 2063 6f6e 7665 7267 656e 6365 iven convergence │ │ │ │ -0000fbf0: 2063 7269 7465 7269 612e 3c2f 6469 763e criteria.
│ │ │ │ -0000fc00: 3c64 6976 2063 6c61 7373 3d22 7474 6465
Definition │ │ │ │ -0000fc20: 3c2f 623e 206c 646c 2e68 683a 3136 363c ldl.hh:166< │ │ │ │ -0000fc30: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
D │ │ │ │ -0000fd40: 756e 653a 3a42 6c6f 636b 5665 6374 6f72 une::BlockVector │ │ │ │ -0000fd50: 266c 743b 2046 6965 6c64 5665 6374 6f72 < FieldVector │ │ │ │ -0000fd60: 266c 743b 2054 2c20 6e20 2667 743b 2c20 < T, n >, │ │ │ │ -0000fd70: 7479 7065 6e61 6d65 2073 7464 3a3a 616c typename std::al │ │ │ │ -0000fd80: 6c6f 6361 746f 725f 7472 6169 7473 266c locator_traits&l │ │ │ │ -0000fd90: 743b 2041 2026 6774 3b3a 3a74 656d 706c t; A >::templ │ │ │ │ -0000fda0: 6174 6520 7265 6269 6e64 5f61 6c6c 6f63 ate rebind_alloc │ │ │ │ -0000fdb0: 266c 743b 2046 6965 6c64 5665 6374 6f72 < FieldVector │ │ │ │ -0000fdc0: 266c 743b 2054 2c20 6e20 2667 743b 2026 < T, n > & │ │ │ │ -0000fdd0: 6774 3b20 2667 743b 2072 616e 6765 5f74 gt; > range_t │ │ │ │ -0000fde0: 7970 653c 2f64 6976 3e3c 6469 7620 636c ype
The │ │ │ │ -0000fe00: 7479 7065 206f 6620 7468 6520 7261 6e67 type of the rang │ │ │ │ -0000fe10: 6520 6f66 2074 6865 2073 6f6c 7665 722e e of the solver. │ │ │ │ -0000fe20: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ -0000fe40: 6e69 7469 6f6e 3c2f 623e 206c 646c 2e68 nition ldl.h │ │ │ │ -0000fe50: 683a 3837 3c2f 6469 763e 3c2f 6469 763e h:87
│ │ │ │ -0000fe60: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
vi │ │ │ │ -0000ff60: 7274 7561 6c20 7e4c 444c 2829 3c2f 6469 rtual ~LDL()
Default con │ │ │ │ -0000ff90: 7374 7275 6374 6f72 2e3c 2f64 6976 3e3c structor.
< │ │ │ │ -0000ffa0: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ │ -0000ffb0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ │ -0000ffc0: 2f62 3e20 6c64 6c2e 6868 3a31 3435 3c2f /b> ldl.hh:145
.
Du │ │ │ │ -00010070: 6e65 3a3a 4c44 4c26 6c74 3b20 4243 5253 ne::LDL< BCRS │ │ │ │ -00010080: 4d61 7472 6978 266c 743b 2046 6965 6c64 Matrix< Field │ │ │ │ -00010090: 4d61 7472 6978 266c 743b 2054 2c20 6e2c Matrix< T, n, │ │ │ │ -000100a0: 206d 2026 6774 3b2c 2041 2026 6774 3b20 m >, A > │ │ │ │ -000100b0: 2667 743b 3a3a 6672 6565 3c2f 613e 3c2f >::free
void fre │ │ │ │ -000100e0: 6528 293c 2f64 6976 3e3c 6469 7620 636c e()
Free │ │ │ │ -00010100: 2061 6c6c 6f63 6174 6564 2073 7061 6365 allocated space │ │ │ │ -00010110: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ │ -00010130: 696e 6974 696f 6e3c 2f62 3e20 6c64 6c2e inition ldl. │ │ │ │ -00010140: 6868 3a32 3436 3c2f 6469 763e 3c2f 6469 hh:246
.
virtual void ap │ │ │ │ -00010260: 706c 7928 646f 6d61 696e 5f74 7970 6520 ply(domain_type │ │ │ │ -00010270: 2661 6d70 3b78 2c20 7261 6e67 655f 7479 &x, range_ty │ │ │ │ -00010280: 7065 2026 616d 703b 622c 2049 6e76 6572 pe &b, Inver │ │ │ │ -00010290: 7365 4f70 6572 6174 6f72 5265 7375 6c74 seOperatorResult │ │ │ │ -000102a0: 2026 616d 703b 7265 7329 3c2f 6469 763e &res)
│ │ │ │ -000102b0: 3c64 6976 2063 6c61 7373 3d22 7474 646f
Apply inverse │ │ │ │ -000102d0: 206f 7065 7261 746f 722c 2e3c 2f64 6976 operator,.
Definitio │ │ │ │ -00010300: 6e3c 2f62 3e20 6c64 6c2e 6868 3a31 3532 n ldl.hh:152 │ │ │ │ -00010310: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
int * │ │ │ │ -00010420: 2067 6574 4c69 2829 3c2f 6469 763e 3c64 getLi()
Get factorizati │ │ │ │ -00010450: 6f6e 204c 692e 3c2f 6469 763e 3c64 6976 on Li.
< │ │ │ │ -00010470: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -00010480: 206c 646c 2e68 683a 3238 373c 2f64 6976 ldl.hh:287
.
.
│ │ │ │ -00010710: 3c64 6976 2063 6c61 7373 3d22 7474 6465
void setMatr │ │ │ │ -00010730: 6978 2863 6f6e 7374 204d 6174 7269 7820 ix(const Matrix │ │ │ │ -00010740: 2661 6d70 3b6d 6174 7269 7829 3c2f 6469 &matrix)
Initialize │ │ │ │ -00010770: 6461 7461 2066 726f 6d20 6769 7665 6e20 data from given │ │ │ │ -00010780: 6d61 7472 6978 2e3c 2f64 6976 3e3c 6469 matrix.
│ │ │ │ -000107a0: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition ldl.hh:190
.
void │ │ │ │ -000108d0: 7365 744f 7074 696f 6e28 756e 7369 676e setOption(unsign │ │ │ │ -000108e0: 6564 2069 6e74 206f 7074 696f 6e2c 2064 ed int option, d │ │ │ │ -000108f0: 6f75 626c 6520 7661 6c75 6529 3c2f 6469 ouble value)
Definiti │ │ │ │ -00010920: 6f6e 3c2f 623e 206c 646c 2e68 683a 3138 on ldl.hh:18 │ │ │ │ -00010930: 363c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6
.
LDL(co │ │ │ │ -00010a40: 6e73 7420 4d61 7472 6978 2026 616d 703b nst Matrix & │ │ │ │ -00010a50: 6d61 7472 6978 2c20 696e 7420 7665 7262 matrix, int verb │ │ │ │ -00010a60: 6f73 652c 2062 6f6f 6c29 3c2f 6469 763e ose, bool)
│ │ │ │ -00010a70: 3c64 6976 2063 6c61 7373 3d22 7474 646f
Constructor f │ │ │ │ -00010a90: 6f72 2063 6f6d 7061 7469 6269 6c69 7479 or compatibility │ │ │ │ -00010aa0: 2077 6974 6820 5375 7065 724c 5520 7374 with SuperLU st │ │ │ │ -00010ab0: 616e 6461 7264 2063 6f6e 7374 7275 6374 andard construct │ │ │ │ -00010ac0: 6f72 2e3c 2f64 6976 3e3c 6469 7620 636c or.
D │ │ │ │ -00010ae0: 6566 696e 6974 696f 6e3c 2f62 3e20 6c64 efinition ld │ │ │ │ -00010af0: 6c2e 6868 3a31 3230 3c2f 6469 763e 3c2f l.hh:120
.
< │ │ │ │ -00010b60: 6120 6872 6566 3d22 6130 3032 3333 2e68 a href="a00233.h │ │ │ │ -00010b70: 746d 6c23 6761 6261 6333 3734 3764 3564 tml#gabac3747d5d │ │ │ │ -00010b80: 3761 3766 6433 3130 3731 6332 3234 6435 7a7fd31071c224d5 │ │ │ │ -00010b90: 3437 3238 6662 223e 4475 6e65 3a3a 4c44 4728fb">Dune::LD │ │ │ │ -00010ba0: 4c26 6c74 3b20 4243 5253 4d61 7472 6978 L< BCRSMatrix │ │ │ │ -00010bb0: 266c 743b 2046 6965 6c64 4d61 7472 6978 < FieldMatrix │ │ │ │ -00010bc0: 266c 743b 2054 2c20 6e2c 206d 2026 6774 < T, n, m > │ │ │ │ -00010bd0: 3b2c 2041 2026 6774 3b20 2667 743b 3a3a ;, A > >:: │ │ │ │ -00010be0: 6765 7444 3c2f 613e 3c2f 6469 763e 3c64 getD
double * getD( │ │ │ │ -00010c10: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
Get fa │ │ │ │ -00010c30: 6374 6f72 697a 6174 696f 6e20 6469 6167 ctorization diag │ │ │ │ -00010c40: 6f6e 616c 206d 6174 7269 7820 442e 3c2f onal matrix D.
Defini │ │ │ │ -00010c70: 7469 6f6e 3c2f 623e 206c 646c 2e68 683a tion ldl.hh: │ │ │ │ -00010c80: 3236 393c 2f64 6976 3e3c 2f64 6976 3e0a 269
. │ │ │ │ -00010c90: 3c64 6976 2063 6c61 7373 3d22 7474 6322
│ │ │ │ -00010dd0: 3c64 6976 2063 6c61 7373 3d22 7474 646f
Constructs th │ │ │ │ -00010df0: 6520 4c44 4c20 736f 6c76 6572 2e3c 2f64 e LDL solver.
Definit │ │ │ │ -00010e20: 696f 6e3c 2f62 3e20 6c64 6c2e 6868 3a31 ion ldl.hh:1 │ │ │ │ -00010e30: 3336 3c2f 6469 763e 3c2f 6469 763e 0a3c 36
.< │ │ │ │ -00010e40: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00010e50: 6964 3d22 6161 3030 3233 335f 6874 6d6c id="aa00233_html │ │ │ │ -00010e60: 5f67 6163 6230 6562 6632 3036 6164 6139 _gacb0ebf206ada9 │ │ │ │ -00010e70: 3861 6438 3139 3732 3062 3030 6537 6532 8ad819720b00e7e2 │ │ │ │ -00010e80: 3734 6122 3e3c 6469 7620 636c 6173 733d 74a">
│ │ │ │ -00010f40: 7669 7274 7561 6c20 536f 6c76 6572 4361 virtual SolverCa │ │ │ │ -00010f50: 7465 676f 7279 3a3a 4361 7465 676f 7279 tegory::Category │ │ │ │ -00010f60: 2063 6174 6567 6f72 7928 2920 636f 6e73 category() cons │ │ │ │ -00010f70: 743c 2f64 6976 3e3c 6469 7620 636c 6173 t
Catego │ │ │ │ -00010f90: 7279 206f 6620 7468 6520 736f 6c76 6572 ry of the solver │ │ │ │ -00010fa0: 2028 7365 6520 536f 6c76 6572 4361 7465 (see SolverCate │ │ │ │ -00010fb0: 676f 7279 3a3a 4361 7465 676f 7279 293c gory::Category)< │ │ │ │ -00010fc0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00010fe0: 6974 696f 6e3c 2f62 3e20 6c64 6c2e 6868 ition ldl.hh │ │ │ │ -00010ff0: 3a39 303c 2f64 6976 3e3c 2f64 6976 3e0a :90
. │ │ │ │ -00011000: 3c64 6976 2063 6c61 7373 3d22 7474 6322
ISTL:: │ │ │ │ -00011110: 496d 706c 3a3a 4243 4353 4d61 7472 6978 Impl::BCCSMatrix │ │ │ │ -00011120: 496e 6974 6961 6c69 7a65 7226 6c74 3b20 Initializer< │ │ │ │ -00011130: 4243 5253 4d61 7472 6978 266c 743b 2046 BCRSMatrix< F │ │ │ │ -00011140: 6965 6c64 4d61 7472 6978 266c 743b 2054 ieldMatrix< T │ │ │ │ -00011150: 2c20 6e2c 206d 2026 6774 3b2c 2041 2026 , n, m >, A & │ │ │ │ -00011160: 6774 3b2c 2069 6e74 2026 6774 3b20 4d61 gt;, int > Ma │ │ │ │ -00011170: 7472 6978 496e 6974 6961 6c69 7a65 723c trixInitializer< │ │ │ │ -00011180: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Type of │ │ │ │ -000111a0: 616e 2061 7373 6f63 6961 7465 6420 696e an associated in │ │ │ │ -000111b0: 6974 6961 6c69 7a65 7220 636c 6173 732e itializer class. │ │ │ │ -000111c0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ -000111e0: 6e69 7469 6f6e 3c2f 623e 206c 646c 2e68 nition ldl.h │ │ │ │ -000111f0: 683a 3833 3c2f 6469 763e 3c2f 6469 763e h:83
│ │ │ │ -00011200: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
st │ │ │ │ -000112d0: 643a 3a73 6861 7265 645f 7074 7226 6c74 d::shared_ptr< │ │ │ │ -000112e0: 3b20 4475 6e65 3a3a 496e 7665 7273 654f ; Dune::InverseO │ │ │ │ -000112f0: 7065 7261 746f 7226 6c74 3b20 7479 7065 perator< type │ │ │ │ -00011300: 6e61 6d65 2044 756e 653a 3a54 7970 654c name Dune::TypeL │ │ │ │ -00011310: 6973 7445 6c65 6d65 6e74 266c 743b 2031 istElement< 1 │ │ │ │ -00011320: 2c20 544c 2026 6774 3b3a 3a74 7970 652c , TL >::type, │ │ │ │ -00011330: 2074 7970 656e 616d 6520 4475 6e65 3a3a typename Dune:: │ │ │ │ -00011340: 5479 7065 4c69 7374 456c 656d 656e 7426 TypeListElement& │ │ │ │ -00011350: 6c74 3b20 322c 2054 4c20 2667 743b 3a3a lt; 2, TL >:: │ │ │ │ -00011360: 7479 7065 2026 6774 3b20 2667 743b 206f type > > o │ │ │ │ -00011370: 7065 7261 746f 7228 2928 544c 2c20 636f perator()(TL, co │ │ │ │ -00011380: 6e73 7420 4d20 2661 6d70 3b6d 6174 2c20 nst M &mat, │ │ │ │ -00011390: 636f 6e73 7420 4475 6e65 3a3a 5061 7261 const Dune::Para │ │ │ │ -000113a0: 6d65 7465 7254 7265 6520 2661 6d70 3b63 meterTree &c │ │ │ │ -000113b0: 6f6e 6669 672c 2073 7464 3a3a 656e 6162 onfig, std::enab │ │ │ │ -000113c0: 6c65 5f69 665f 7426 6c74 3b20 6973 5661 le_if_t< isVa │ │ │ │ -000113d0: 6c69 6442 6c6f 636b 266c 743b 2074 7970 lidBlock< typ │ │ │ │ -000113e0: 656e 616d 6520 4475 6e65 3a3a 5479 7065 ename Dune::Type │ │ │ │ -000113f0: 4c69 7374 456c 656d 656e 7426 6c74 3b20 ListElement< │ │ │ │ -00011400: 312c 2054 4c20 2667 743b 3a3a 7479 7065 1, TL >::type │ │ │ │ -00011410: 3a3a 626c 6f63 6b5f 7479 7065 2026 6774 ::block_type > │ │ │ │ -00011420: 3b3a 3a76 616c 7565 2c20 696e 7420 2667 ;::value, int &g │ │ │ │ -00011430: 743b 3d30 2920 636f 6e73 743c 2f64 6976 t;=0) const
Definitio │ │ │ │ -00011460: 6e3c 2f62 3e20 6c64 6c2e 6868 3a33 3830 n ldl.hh:380 │ │ │ │ -00011470: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
const │ │ │ │ -00011580: 6368 6172 202a 206e 616d 6528 293c 2f64 char * name()
Get method │ │ │ │ -000115b0: 206e 616d 652e 3c2f 6469 763e 3c64 6976 name.
< │ │ │ │ -000115d0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -000115e0: 206c 646c 2e68 683a 3236 303c 2f64 6976 ldl.hh:260
..
│ │ │ │ -00011880: 4c44 4c28 293c 2f64 6976 3e3c 6469 7620 LDL()
De │ │ │ │ -000118a0: 6661 756c 7420 636f 6e73 7472 7563 746f fault constructo │ │ │ │ -000118b0: 722e 3c2f 6469 763e 3c64 6976 2063 6c61 r.
De │ │ │ │ -000118d0: 6669 6e69 7469 6f6e 3c2f 623e 206c 646c finition ldl │ │ │ │ -000118e0: 2e68 683a 3134 313c 2f64 6976 3e3c 2f64 .hh:141
.
│ │ │ │ -000119f0: 4c44 4c28 636f 6e73 7420 4d61 7472 6978 LDL(const Matrix │ │ │ │ -00011a00: 2026 616d 703b 6d61 7472 6978 2c20 696e &matrix, in │ │ │ │ -00011a10: 7420 7665 7262 6f73 653d 3029 3c2f 6469 t verbose=0)
Construct a │ │ │ │ -00011a40: 2073 6f6c 7665 7220 6f62 6a65 6374 2066 solver object f │ │ │ │ -00011a50: 726f 6d20 6120 4243 5253 4d61 7472 6978 rom a BCRSMatrix │ │ │ │ -00011a60: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ │ -00011a80: 696e 6974 696f 6e3c 2f62 3e20 6c64 6c2e inition ldl. │ │ │ │ -00011a90: 6868 3a31 3034 3c2f 6469 763e 3c2f 6469 hh:104
.
mat
Matrix &a │ │ │ │ -00011b60: 6d70 3b20 6d61 743c 2f64 6976 3e3c 6469 mp; mat
│ │ │ │ -00011b80: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition matrixmatrix.h │ │ │ │ -00011ba0: 683a 3334 373c 2f64 6976 3e3c 2f64 6976 h:347
.
│ │ │ │ -00011c20: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition allocator.hh:1 │ │ │ │ -00011c40: 313c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 1
.
D │ │ │ │ -00011ce0: 756e 653a 3a67 6574 3c2f 613e 3c2f 6469 une::get
PropertyMa │ │ │ │ -00011d10: 7054 7970 6553 656c 6563 746f 7226 6c74 pTypeSelector< │ │ │ │ -00011d20: 3b20 416d 673a 3a56 6572 7465 7856 6973 ; Amg::VertexVis │ │ │ │ -00011d30: 6974 6564 5461 672c 2041 6d67 3a3a 5072 itedTag, Amg::Pr │ │ │ │ -00011d40: 6f70 6572 7469 6573 4772 6170 6826 6c74 opertiesGraph< │ │ │ │ -00011d50: 3b20 472c 2041 6d67 3a3a 5665 7274 6578 ; G, Amg::Vertex │ │ │ │ -00011d60: 5072 6f70 6572 7469 6573 2c20 4550 2c20 Properties, EP, │ │ │ │ -00011d70: 564d 2c20 454d 2026 6774 3b20 2667 743b VM, EM > > │ │ │ │ -00011d80: 3a3a 5479 7065 2067 6574 2863 6f6e 7374 ::Type get(const │ │ │ │ -00011d90: 2041 6d67 3a3a 5665 7274 6578 5669 7369 Amg::VertexVisi │ │ │ │ -00011da0: 7465 6454 6167 2026 616d 703b 7461 672c tedTag &tag, │ │ │ │ -00011db0: 2041 6d67 3a3a 5072 6f70 6572 7469 6573 Amg::Properties │ │ │ │ -00011dc0: 4772 6170 6826 6c74 3b20 472c 2041 6d67 Graph< G, Amg │ │ │ │ -00011dd0: 3a3a 5665 7274 6578 5072 6f70 6572 7469 ::VertexProperti │ │ │ │ -00011de0: 6573 2c20 4550 2c20 564d 2c20 454d 2026 es, EP, VM, EM & │ │ │ │ -00011df0: 6774 3b20 2661 6d70 3b67 7261 7068 293c gt; &graph)< │ │ │ │ -00011e00: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00011e20: 6974 696f 6e3c 2f62 3e20 6465 7065 6e64 ition depend │ │ │ │ -00011e30: 656e 6379 2e68 683a 3239 333c 2f64 6976 ency.hh:293
.
< │ │ │ │ -00011e80: 6120 6872 6566 3d22 6130 3131 3336 2e68 a href="a01136.h │ │ │ │ -00011e90: 746d 6c22 3e44 756e 653a 3a4d 6174 7269 tml">Dune::Matri │ │ │ │ -00011ea0: 7844 696d 656e 7369 6f6e 3c2f 613e 3c2f xDimension
Defini │ │ │ │ -00011ed0: 7469 6f6e 3c2f 623e 206d 6174 7269 7875 tion matrixu │ │ │ │ -00011ee0: 7469 6c73 2e68 683a 3231 313c 2f64 6976 tils.hh:211
.
< │ │ │ │ -00011f30: 6120 6872 6566 3d22 6130 3131 3532 2e68 a href="a01152.h │ │ │ │ -00011f40: 746d 6c22 3e44 756e 653a 3a42 4352 534d tml">Dune::BCRSM │ │ │ │ -00011f50: 6174 7269 783c 2f61 3e3c 2f64 6976 3e3c atrix
< │ │ │ │ -00011f60: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -00011f70: 223e 4120 7370 6172 7365 2062 6c6f 636b ">A sparse block │ │ │ │ -00011f80: 206d 6174 7269 7820 7769 7468 2063 6f6d matrix with com │ │ │ │ -00011f90: 7072 6573 7365 6420 726f 7720 7374 6f72 pressed row stor │ │ │ │ -00011fa0: 6167 652e 3c2f 6469 763e 3c64 6976 2063 age.
│ │ │ │ -00011fc0: 4465 6669 6e69 7469 6f6e 3c2f 623e 2062 Definition b │ │ │ │ -00011fd0: 6372 736d 6174 7269 782e 6868 3a34 3636 crsmatrix.hh:466 │ │ │ │ -00011fe0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
s │ │ │ │ -000120b0: 697a 655f 7479 7065 204d 2829 2063 6f6e ize_type M() con │ │ │ │ -000120c0: 7374 3c2f 6469 763e 3c64 6976 2063 6c61 st
numbe │ │ │ │ -000120e0: 7220 6f66 2063 6f6c 756d 6e73 2028 636f r of columns (co │ │ │ │ -000120f0: 756e 7465 6420 696e 2062 6c6f 636b 7329 unted in blocks) │ │ │ │ -00012100: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ -00012120: 6e69 7469 6f6e 3c2f 623e 2062 6372 736d nition bcrsm │ │ │ │ -00012130: 6174 7269 782e 6868 3a31 3937 383c 2f64 atrix.hh:1978
.
< │ │ │ │ -00012190: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ -000121a0: 6522 3e3c 6120 6872 6566 3d22 6130 3131 e">Dune: │ │ │ │ -000121e0: 3a42 4352 534d 6174 7269 783a 3a4e 3c2f :BCRSMatrix::N
size │ │ │ │ -00012210: 5f74 7970 6520 4e28 2920 636f 6e73 743c _type N() const< │ │ │ │ -00012220: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
number o │ │ │ │ -00012240: 6620 726f 7773 2028 636f 756e 7465 6420 f rows (counted │ │ │ │ -00012250: 696e 2062 6c6f 636b 7329 3c2f 6469 763e in blocks)
│ │ │ │ -00012260: 3c64 6976 2063 6c61 7373 3d22 7474 6465
Definition │ │ │ │ -00012280: 3c2f 623e 2062 6372 736d 6174 7269 782e bcrsmatrix. │ │ │ │ -00012290: 6868 3a31 3937 323c 2f64 6976 3e3c 2f64 hh:1972
.
A │ │ │ │ -00012320: 2076 6563 746f 7220 6f66 2062 6c6f 636b vector of block │ │ │ │ -00012330: 7320 7769 7468 206d 656d 6f72 7920 6d61 s with memory ma │ │ │ │ -00012340: 6e61 6765 6d65 6e74 2e3c 2f64 6976 3e3c nagement.
< │ │ │ │ -00012350: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ │ -00012360: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ │ -00012370: 2f62 3e20 6276 6563 746f 722e 6868 3a33 /b> bvector.hh:3 │ │ │ │ -00012380: 3935 3c2f 6469 763e 3c2f 6469 763e 0a3c 95
.< │ │ │ │ -00012390: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -000123a0: 6964 3d22 6161 3031 3431 325f 6874 6d6c id="aa01412_html │ │ │ │ -000123b0: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
Sequential o │ │ │ │ -00012420: 7665 726c 6170 7069 6e67 2053 6368 7761 verlapping Schwa │ │ │ │ -00012430: 727a 2070 7265 636f 6e64 6974 696f 6e65 rz preconditione │ │ │ │ -00012440: 722e 3c2f 6469 763e 3c64 6976 2063 6c61 r.
De │ │ │ │ -00012460: 6669 6e69 7469 6f6e 3c2f 623e 206f 7665 finition ove │ │ │ │ -00012470: 726c 6170 7069 6e67 7363 6877 6172 7a2e rlappingschwarz. │ │ │ │ -00012480: 6868 3a37 3535 3c2f 6469 763e 3c2f 6469 hh:755
.
│ │ │ │ -000124e0: 4475 6e65 3a3a 5365 714f 7665 726c 6170 Dune::SeqOverlap │ │ │ │ -000124f0: 7069 6e67 5363 6877 6172 7a41 7373 656d pingSchwarzAssem │ │ │ │ -00012500: 626c 6572 4865 6c70 6572 3c2f 613e 3c2f blerHelper
Defini │ │ │ │ -00012530: 7469 6f6e 3c2f 623e 206f 7665 726c 6170 tion overlap │ │ │ │ -00012540: 7069 6e67 7363 6877 6172 7a2e 6868 3a36 pingschwarz.hh:6 │ │ │ │ -00012550: 3934 3c2f 6469 763e 3c2f 6469 763e 0a3c 94
.< │ │ │ │ -00012560: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00012570: 6964 3d22 6161 3031 3432 305f 6874 6d6c id="aa01420_html │ │ │ │ -00012580: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">< │ │ │ │ -000125c0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -000125d0: 223e 5573 6520 7468 6520 4c44 4c20 7061 ">Use the LDL pa │ │ │ │ -000125e0: 636b 6167 6520 746f 2064 6972 6563 746c ckage to directl │ │ │ │ -000125f0: 7920 736f 6c76 6520 6c69 6e65 6172 2073 y solve linear s │ │ │ │ -00012600: 7973 7465 6d73 20e2 8093 2065 6d70 7479 ystems ... empty │ │ │ │ -00012610: 2064 6566 6175 6c74 2063 6c61 7373 2e3c default class.< │ │ │ │ -00012620: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00012640: 6974 696f 6e3c 2f62 3e20 6c64 6c2e 6868 ition ldl.hh │ │ │ │ -00012650: 3a35 363c 2f64 6976 3e3c 2f64 6976 3e0a :56
. │ │ │ │ -00012660: 3c64 6976 2063 6c61 7373 3d22 7474 6322
Def │ │ │ │ -000126e0: 696e 6974 696f 6e3c 2f62 3e20 6c64 6c2e inition ldl. │ │ │ │ -000126f0: 6868 3a33 3733 3c2f 6469 763e 3c2f 6469 hh:373
.
.
< │ │ │ │ -00012830: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -00012840: 206d 6174 7269 7875 7469 6c73 2e68 683a matrixutils.hh: │ │ │ │ -00012850: 3237 3c2f 6469 763e 3c2f 6469 763e 0a3c 27
.< │ │ │ │ -00012860: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00012870: 6964 3d22 6161 3032 3730 305f 6874 6d6c id="aa02700_html │ │ │ │ -00012880: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
Statistics a │ │ │ │ -000128f0: 626f 7574 2074 6865 2061 7070 6c69 6361 bout the applica │ │ │ │ -00012900: 7469 6f6e 206f 6620 616e 2069 6e76 6572 tion of an inver │ │ │ │ -00012910: 7365 206f 7065 7261 746f 722e 3c2f 6469 se operator.
Definiti │ │ │ │ -00012940: 6f6e 3c2f 623e 2073 6f6c 7665 722e 6868 on solver.hh │ │ │ │ -00012950: 3a34 383c 2f64 6976 3e3c 2f64 6976 3e0a :48
. │ │ │ │ -00012960: 3c64 6976 2063 6c61 7373 3d22 7474 6322
Dune::InverseOp │ │ │ │ -00012a00: 6572 6174 6f72 5265 7375 6c74 3a3a 6974 eratorResult::it │ │ │ │ -00012a10: 6572 6174 696f 6e73 3c2f 613e 3c2f 6469 erations
int iterat │ │ │ │ -00012a40: 696f 6e73 3c2f 6469 763e 3c64 6976 2063 ions
Num │ │ │ │ -00012a60: 6265 7220 6f66 2069 7465 7261 7469 6f6e ber of iteration │ │ │ │ -00012a70: 732e 3c2f 6469 763e 3c64 6976 2063 6c61 s.
De │ │ │ │ -00012a90: 6669 6e69 7469 6f6e 3c2f 623e 2073 6f6c finition sol │ │ │ │ -00012aa0: 7665 722e 6868 3a36 373c 2f64 6976 3e3c ver.hh:67
< │ │ │ │ -00012ab0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
< │ │ │ │ -00012b10: 6120 6872 6566 3d22 6130 3237 3030 2e68 a href="a02700.h │ │ │ │ -00012b20: 746d 6c23 6166 6566 6533 3636 6333 6333 tml#afefe366c3c3 │ │ │ │ -00012b30: 3661 3561 3961 3539 3963 3262 6134 6337 6a5a9a599c2ba4c7 │ │ │ │ -00012b40: 3131 6162 3622 3e44 756e 653a 3a49 6e76 11ab6">Dune::Inv │ │ │ │ -00012b50: 6572 7365 4f70 6572 6174 6f72 5265 7375 erseOperatorResu │ │ │ │ -00012b60: 6c74 3a3a 636f 6e76 6572 6765 643c 2f61 lt::converged
bool │ │ │ │ -00012b90: 636f 6e76 6572 6765 643c 2f64 6976 3e3c converged
< │ │ │ │ -00012ba0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -00012bb0: 223e 5472 7565 2069 6620 636f 6e76 6572 ">True if conver │ │ │ │ -00012bc0: 6765 6e63 6520 6372 6974 6572 696f 6e20 gence criterion │ │ │ │ -00012bd0: 6861 7320 6265 656e 206d 6574 2e3c 2f64 has been met.
Definit │ │ │ │ -00012c00: 696f 6e3c 2f62 3e20 736f 6c76 6572 2e68 ion solver.h │ │ │ │ -00012c10: 683a 3733 3c2f 6469 763e 3c2f 6469 763e h:73
│ │ │ │ -00012c20: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
│ │ │ │ -00012ca0: 4162 7374 7261 6374 2062 6173 6520 636c Abstract base cl │ │ │ │ -00012cb0: 6173 7320 666f 7220 616c 6c20 736f 6c76 ass for all solv │ │ │ │ -00012cc0: 6572 732e 3c2f 6469 763e 3c64 6976 2063 ers.
│ │ │ │ -00012ce0: 4465 6669 6e69 7469 6f6e 3c2f 623e 2073 Definition s │ │ │ │ -00012cf0: 6f6c 7665 722e 6868 3a39 393c 2f64 6976 olver.hh:99
.
Category
Definit │ │ │ │ -00012e00: 696f 6e3c 2f62 3e20 736f 6c76 6572 6361 ion solverca │ │ │ │ -00012e10: 7465 676f 7279 2e68 683a 3233 3c2f 6469 tegory.hh:23
.
< │ │ │ │ -00012e90: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ -00012ea0: 6522 3e3c 6120 6872 6566 3d22 6130 3237 e">Dune │ │ │ │ -00012f00: 3a3a 536f 6c76 6572 4361 7465 676f 7279 ::SolverCategory │ │ │ │ -00012f10: 3a3a 7365 7175 656e 7469 616c 3c2f 613e ::sequential │ │ │ │ -00012f20: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
@ sequ │ │ │ │ -00012f40: 656e 7469 616c 3c2f 6469 763e 3c64 6976 ential
C │ │ │ │ -00012f60: 6174 6567 6f72 7920 666f 7220 7365 7175 ategory for sequ │ │ │ │ -00012f70: 656e 7469 616c 2073 6f6c 7665 7273 2e3c ential solvers.< │ │ │ │ -00012f80: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00012fa0: 6974 696f 6e3c 2f62 3e20 736f 6c76 6572 ition solver │ │ │ │ -00012fb0: 6361 7465 676f 7279 2e68 683a 3235 3c2f category.hh:25
.
Def │ │ │ │ -00013050: 696e 6974 696f 6e3c 2f62 3e20 736f 6c76 inition solv │ │ │ │ -00013060: 6572 7265 6769 7374 7279 2e68 683a 3737 erregistry.hh:77 │ │ │ │ -00013070: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
. │ │ │ │ -000130a0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 .
│ │ │ │ -00013190: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
Dun │ │ │ │ -00013200: 653a 3a49 7344 6972 6563 7453 6f6c 7665 e::IsDirectSolve │ │ │ │ -00013210: 723a 3a76 616c 7565 3c2f 613e 3c2f 6469 r::value
@ value
Whether th │ │ │ │ -00013260: 6973 2069 7320 6120 6469 7265 6374 2073 is is a direct s │ │ │ │ -00013270: 6f6c 7665 722e 3c2f 6469 763e 3c64 6976 olver.
< │ │ │ │ -00013290: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -000132a0: 2073 6f6c 7665 7274 7970 652e 6868 3a32 solvertype.hh:2 │ │ │ │ -000132b0: 343c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 4
.
Definitio │ │ │ │ -00013350: 6e3c 2f62 3e20 736f 6c76 6572 7479 7065 n solvertype │ │ │ │ -00013360: 2e68 683a 3330 3c2f 6469 763e 3c2f 6469 .hh:30
.
Dune::Stor │ │ │ │ -00013450: 6573 436f 6c75 6d6e 436f 6d70 7265 7373 esColumnCompress │ │ │ │ -00013460: 6564 3a3a 7661 6c75 653c 2f61 3e3c 2f64 ed::value
@ value
whether t │ │ │ │ -000134b0: 6865 2073 6f6c 7665 7220 696e 7465 726e he solver intern │ │ │ │ -000134c0: 616c 6c79 2075 7365 7320 636f 6c75 6d6e ally uses column │ │ │ │ -000134d0: 2063 6f6d 7072 6573 7365 6420 7374 6f72 compressed stor │ │ │ │ -000134e0: 6167 653c 2f64 6976 3e3c 6469 7620 636c age
D │ │ │ │ -00013500: 6566 696e 6974 696f 6e3c 2f62 3e20 736f efinition so │ │ │ │ -00013510: 6c76 6572 7479 7065 2e68 683a 3336 3c2f lvertype.hh:36
.
...Generat │ │ │ │ -000135b0: 6564 2062 7926 2331 3630 3b3c 6120 6872 ed by doxyg
│ │ │ │ -00013630: 656e 222f 3e3c 2f61 3e20 312e 392e 380a  en 1.9.8. │ │ │ │ -00013640: 3c2f 736d 616c 6c3e 3c2f 6164 6472 6573 ... │ │ │ │ +00006f10: 3138 3022 206e 616d 653d 226c 3030 3138 180" name="l0018 │ │ │ │ +00006f20: 3022 3e3c 2f61 3e3c 7370 616e 2063 6c61 0"> 18 │ │ │ │ +00006f40: 303c 2f73 7061 6e3e 2020 2020 2020 7374 0 st │ │ │ │ +00006f50: 643a 3a73 697a 655f 7420 7220 3d20 302c d::size_t r = 0, │ │ │ │ +00006f60: 2063 203d 2030 3b3c 2f64 6976 3e0a 3c64 c = 0;
. │ │ │ │ +00006f80: 3c61 2069 643d 226c 3030 3138 3122 206e 181 std::siz │ │ │ │ +00006fd0: 655f 7420 6e52 6f77 732c 206e 436f 6c73 e_t nRows, nCols │ │ │ │ +00006fe0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00007030: 2020 3138 323c 2f73 7061 6e3e 203c 2f64 182 .
18 │ │ │ │ +00007090: 333c 2f73 7061 6e3e 2020 2020 2020 4879 3 Hy │ │ │ │ +000070a0: 6272 6964 3a3a 666f 7245 6163 6828 4475 brid::forEach(Du │ │ │ │ +000070b0: 6e65 3a3a 7261 6e67 6528 3c61 2063 6c61 ne::range(ForEa │ │ │ │ +00007110: 6368 3a3a 726f 7773 3c2f 613e 286d 6174 ch::rows(mat │ │ │ │ +00007120: 7269 7829 292c 205b 2661 6d70 3b5d 283c rix)), [&](< │ │ │ │ +00007130: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00007140: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord">auto │ │ │ │ +00007150: 2069 2920 7b3c 2f64 6976 3e0a 3c64 6976 i) {
.
< │ │ │ │ +00007190: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000071a0: 6e6f 223e 2020 3138 343c 2f73 7061 6e3e no"> 184 │ │ │ │ +000071b0: 2020 2020 2020 2020 6320 3d20 303b 3c2f c = 0;.
1 │ │ │ │ +00007210: 3835 3c2f 7370 616e 3e20 2020 2020 2020 85 │ │ │ │ +00007220: 2048 7962 7269 643a 3a66 6f72 4561 6368 Hybrid::forEach │ │ │ │ +00007230: 2844 756e 653a 3a72 616e 6765 283c 6120 (Dune::range(Fo │ │ │ │ +00007290: 7245 6163 683a 3a63 6f6c 733c 2f61 3e28 rEach::cols( │ │ │ │ +000072a0: 6d61 7472 6978 2929 2c20 5b26 616d 703b matrix)), [& │ │ │ │ +000072b0: 5d28 3c73 7061 6e20 636c 6173 733d 226b ](auto j) {
.< │ │ │ │ +000072e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000072f0: 3e3c 6120 6964 3d22 6c30 3031 3836 2220 > 186 std │ │ │ │ +00007340: 3a3a 7469 6528 6e52 6f77 732c 6e43 6f6c ::tie(nRows,nCol │ │ │ │ +00007350: 7329 203d 203c 6120 636c 6173 733d 2263 s) = flatMatrix │ │ │ │ +000073b0: 466f 7245 6163 683c 2f61 3e28 6d61 7472 ForEach(matr │ │ │ │ +000073c0: 6978 5b69 5d5b 6a5d 2c20 662c 2072 6f77 ix[i][j], f, row │ │ │ │ +000073d0: 4f66 6673 6574 202b 2072 2c20 636f 6c4f Offset + r, colO │ │ │ │ +000073e0: 6666 7365 7420 2b20 6329 3b3c 2f64 6976 ffset + c);
.
187< │ │ │ │ +00007440: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00007450: 6320 2b3d 206e 436f 6c73 3b3c 2f64 6976 c += nCols;
.
188< │ │ │ │ +000074b0: 2f73 7061 6e3e 2020 2020 2020 2020 7d29 /span> }) │ │ │ │ +000074c0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00007510: 2020 3138 393c 2f73 7061 6e3e 2020 2020 189 │ │ │ │ +00007520: 2020 2020 7220 2b3d 206e 526f 7773 3b3c r += nRows;< │ │ │ │ +00007530: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00007580: 3139 303c 2f73 7061 6e3e 2020 2020 2020 190 │ │ │ │ +00007590: 7d29 3b3c 2f64 6976 3e0a 3c64 6976 2063 });
.
191 │ │ │ │ +000075f0: 2020 2020 3c73 7061 6e20 636c 6173 733d re │ │ │ │ +00007610: 7475 726e 3c2f 7370 616e 3e20 7b72 2c63 turn {r,c │ │ │ │ +00007620: 7d3b 3c2f 6469 763e 0a3c 6469 7620 636c };
.
192 │ │ │ │ +00007680: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
193 } │ │ │ │ +000076e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00007730: 2031 3934 3c2f 7370 616e 3e7d 3c2f 6469 194}.
.
195 < │ │ │ │ +000077a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000077f0: 3139 363c 2f73 7061 6e3e 7d20 3c73 7061 196} // namespace D │ │ │ │ +00007820: 756e 653c 2f73 7061 6e3e 3c2f 6469 763e une
│ │ │ │ +00007830: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
bc │ │ │ │ +00007880: 7273 6d61 7472 6978 2e68 683c 2f61 3e3c rsmatrix.hh< │ │ │ │ +00007890: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Implemen │ │ │ │ +000078b0: 7461 7469 6f6e 206f 6620 7468 6520 4243 tation of the BC │ │ │ │ +000078c0: 5253 4d61 7472 6978 2063 6c61 7373 2e3c RSMatrix class.< │ │ │ │ +000078d0: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
< │ │ │ │ +00007900: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ +00007910: 6522 3e3c 6120 6872 6566 3d22 6130 3032 e">scaledi │ │ │ │ +00007930: 646d 6174 7269 782e 6868 3c2f 613e 3c2f dmatrix.hh
This file │ │ │ │ +00007960: 2069 6d70 6c65 6d65 6e74 7320 6120 7175 implements a qu │ │ │ │ +00007970: 6164 7261 7469 6320 6d61 7472 6978 206f adratic matrix o │ │ │ │ +00007980: 6620 6669 7865 6420 7369 7a65 2077 6869 f fixed size whi │ │ │ │ +00007990: 6368 2069 7320 6120 6d75 6c74 6970 6c65 ch is a multiple │ │ │ │ +000079a0: 206f 6620 7468 6520 6964 656e 7469 7479 of the identity │ │ │ │ +000079b0: 2e3c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 .
..
│ │ │ │ +00007b20: 7374 643a 3a70 6169 7226 6c74 3b20 7374 std::pair< st │ │ │ │ +00007b30: 643a 3a73 697a 655f 742c 2073 7464 3a3a d::size_t, std:: │ │ │ │ +00007b40: 7369 7a65 5f74 2026 6774 3b20 666c 6174 size_t > flat │ │ │ │ +00007b50: 4d61 7472 6978 466f 7245 6163 6828 4d61 MatrixForEach(Ma │ │ │ │ +00007b60: 7472 6978 2026 616d 703b 2661 6d70 3b6d trix &&m │ │ │ │ +00007b70: 6174 7269 782c 2046 2026 616d 703b 2661 atrix, F &&a │ │ │ │ +00007b80: 6d70 3b66 2c20 7374 643a 3a73 697a 655f mp;f, std::size_ │ │ │ │ +00007b90: 7420 726f 774f 6666 7365 743d 302c 2073 t rowOffset=0, s │ │ │ │ +00007ba0: 7464 3a3a 7369 7a65 5f74 2063 6f6c 4f66 td::size_t colOf │ │ │ │ +00007bb0: 6673 6574 3d30 293c 2f64 6976 3e3c 6469 fset=0)
│ │ │ │ +00007bd0: 5472 6176 6572 7365 2061 2062 6c6f 636b Traverse a block │ │ │ │ +00007be0: 6564 206d 6174 7269 7820 616e 6420 6361 ed matrix and ca │ │ │ │ +00007bf0: 6c6c 2061 2066 756e 6374 6f72 2061 7420 ll a functor at │ │ │ │ +00007c00: 6561 6368 2073 6361 6c61 7220 656e 7472 each scalar entr │ │ │ │ +00007c10: 792e 3c2f 6469 763e 3c64 6976 2063 6c61 y.
De │ │ │ │ +00007c30: 6669 6e69 7469 6f6e 3c2f 623e 2066 6f72 finition for │ │ │ │ +00007c40: 6561 6368 2e68 683a 3133 323c 2f64 6976 each.hh:132
.
st │ │ │ │ +00007d20: 643a 3a73 697a 655f 7420 666c 6174 5665 d::size_t flatVe │ │ │ │ +00007d30: 6374 6f72 466f 7245 6163 6828 5665 6374 ctorForEach(Vect │ │ │ │ +00007d40: 6f72 2026 616d 703b 2661 6d70 3b76 6563 or &&vec │ │ │ │ +00007d50: 746f 722c 2046 2026 616d 703b 2661 6d70 tor, F && │ │ │ │ +00007d60: 3b66 2c20 7374 643a 3a73 697a 655f 7420 ;f, std::size_t │ │ │ │ +00007d70: 6f66 6673 6574 3d30 293c 2f64 6976 3e3c offset=0)
< │ │ │ │ +00007d80: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ +00007d90: 223e 5472 6176 6572 7365 2061 2062 6c6f ">Traverse a blo │ │ │ │ +00007da0: 636b 6564 2076 6563 746f 7220 616e 6420 cked vector and │ │ │ │ +00007db0: 6361 6c6c 2061 2066 756e 6374 6f72 2061 call a functor a │ │ │ │ +00007dc0: 7420 6561 6368 2073 6361 6c61 7220 656e t each scalar en │ │ │ │ +00007dd0: 7472 792e 3c2f 6469 763e 3c64 6976 2063 try.
│ │ │ │ +00007df0: 4465 6669 6e69 7469 6f6e 3c2f 623e 2066 Definition f │ │ │ │ +00007e00: 6f72 6561 6368 2e68 683a 3935 3c2f 6469 oreach.hh:95
.
auto │ │ │ │ +00007ee0: 726f 7773 284d 6174 7269 7820 636f 6e73 rows(Matrix cons │ │ │ │ +00007ef0: 7420 2661 6d70 3b6d 6174 7269 7829 3c2f t &matrix)
Defini │ │ │ │ +00007f20: 7469 6f6e 3c2f 623e 2066 6f72 6561 6368 tion foreach │ │ │ │ +00007f30: 2e68 683a 3639 3c2f 6469 763e 3c2f 6469 .hh:69
.
auto cols(M │ │ │ │ +00008010: 6174 7269 7820 636f 6e73 7420 2661 6d70 atrix const & │ │ │ │ +00008020: 3b6d 6174 7269 7829 3c2f 6469 763e 3c64 ;matrix)
Definition foreach.hh:72 │ │ │ │ +00008060: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
a │ │ │ │ +00008130: 7574 6f20 7369 7a65 2856 6563 746f 7220 uto size(Vector │ │ │ │ +00008140: 636f 6e73 7420 2661 6d70 3b76 6563 746f const &vecto │ │ │ │ +00008150: 7229 3c2f 6469 763e 3c64 6976 2063 6c61 r)
De │ │ │ │ +00008170: 6669 6e69 7469 6f6e 3c2f 623e 2066 6f72 finition for │ │ │ │ +00008180: 6561 6368 2e68 683a 3735 3c2f 6469 763e each.hh:75
│ │ │ │ +00008190: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
A g │ │ │ │ +00008210: 656e 6572 6963 2064 796e 616d 6963 2064 eneric dynamic d │ │ │ │ +00008220: 656e 7365 206d 6174 7269 782e 3c2f 6469 ense matrix.
Definiti │ │ │ │ +00008250: 6f6e 3c2f 623e 206d 6174 7269 782e 6868 on matrix.hh │ │ │ │ +00008260: 3a35 3631 3c2f 6469 763e 3c2f 6469 763e :561
│ │ │ │ +00008270: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
s │ │ │ │ +00008330: 697a 655f 7479 7065 204d 2829 2063 6f6e ize_type M() con │ │ │ │ +00008340: 7374 3c2f 6469 763e 3c64 6976 2063 6c61 st
Retur │ │ │ │ +00008360: 6e20 7468 6520 6e75 6d62 6572 206f 6620 n the number of │ │ │ │ +00008370: 636f 6c75 6d6e 732e 3c2f 6469 763e 3c64 columns.
Definition matrix.hh:700 │ │ │ │ +000083b0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
size_ │ │ │ │ +00008480: 7479 7065 204e 2829 2063 6f6e 7374 3c2f type N() const
Return th │ │ │ │ +000084b0: 6520 6e75 6d62 6572 206f 6620 726f 7773 e number of rows │ │ │ │ +000084c0: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ │ +000084e0: 696e 6974 696f 6e3c 2f62 3e20 6d61 7472 inition matr │ │ │ │ +000084f0: 6978 2e68 683a 3639 353c 2f64 6976 3e3c ix.hh:695
< │ │ │ │ +00008500: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>.
.. │ │ │ │ +00008550: 3c68 7220 636c 6173 733d 2266 6f6f 7465
.Generated by │ │ │ │ +00008590: 2623 3136 303b 3c61 2068 7265 663d 2268  doxygen │ │ │ │ +00008610: 3c2f 613e 2031 2e39 2e38 0a3c 2f73 6d61 1.9.8.
... │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,535 +1,233 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -ldl.hh │ │ │ │ │ +foreach.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_LDL_HH │ │ │ │ │ -6#define DUNE_ISTL_LDL_HH │ │ │ │ │ -7 │ │ │ │ │ -8#if HAVE_SUITESPARSE_LDL || defined DOXYGEN │ │ │ │ │ -9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +3#pragma once │ │ │ │ │ +4 │ │ │ │ │ +5#include │ │ │ │ │ +6#include │ │ │ │ │ +7#include │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#ifdef __cplusplus │ │ │ │ │ -15extern "C" │ │ │ │ │ -16{ │ │ │ │ │ -17#include "ldl.h" │ │ │ │ │ -18#include "amd.h" │ │ │ │ │ -19} │ │ │ │ │ -20#endif │ │ │ │ │ -21 │ │ │ │ │ -22#include │ │ │ │ │ -23 │ │ │ │ │ -24#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -27#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ -28 │ │ │ │ │ -29namespace _D_u_n_e { │ │ │ │ │ -41 // forward declarations │ │ │ │ │ -42 template │ │ │ │ │ -43 class SeqOverlappingSchwarz; │ │ │ │ │ +14#include<_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +15#include<_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e{ │ │ │ │ │ +18 │ │ │ │ │ +19 namespace Impl { │ │ │ │ │ +20 │ │ │ │ │ +21 // stolen from dune-functions: we call a type "scalar" if it does not │ │ │ │ │ +support index accessing │ │ │ │ │ +22 template │ │ │ │ │ +23 using StaticIndexAccessConcept = decltype(std::declval()[Dune::Indices:: │ │ │ │ │ +_0]); │ │ │ │ │ +24 │ │ │ │ │ +25 template │ │ │ │ │ +26 using IsScalar = std::negation>>; │ │ │ │ │ +27 │ │ │ │ │ +28 // Type trait for matrix types that supports │ │ │ │ │ +29 // - iteration done row-wise │ │ │ │ │ +30 // - sparse iteration over nonzero entries │ │ │ │ │ +31 template │ │ │ │ │ +32 struct IsRowMajorSparse : std::false_type {}; │ │ │ │ │ +33 │ │ │ │ │ +34 // This is supported by the following matrix types: │ │ │ │ │ +35 template │ │ │ │ │ +36 struct IsRowMajorSparse> : std::true_type {}; │ │ │ │ │ +37 │ │ │ │ │ +38 template │ │ │ │ │ +39 struct IsRowMajorSparse> : std::true_type {}; │ │ │ │ │ +40 │ │ │ │ │ +41 template │ │ │ │ │ +42 struct IsRowMajorSparse> : std::true_type {}; │ │ │ │ │ +43 │ │ │ │ │ 44 │ │ │ │ │ -45 template │ │ │ │ │ -46 struct SeqOverlappingSchwarzAssemblerHelper; │ │ │ │ │ +45 template │ │ │ │ │ +46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std:: │ │ │ │ │ +integral_constant { return {}; } │ │ │ │ │ 47 │ │ │ │ │ -54 template │ │ │ │ │ -_5_5 class _L_D_L │ │ │ │ │ -56 {}; │ │ │ │ │ -57 │ │ │ │ │ -71 template │ │ │ │ │ -_7_2 class _L_D_L<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A > > │ │ │ │ │ -73 : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r, typename std:: │ │ │ │ │ -allocator_traits::template rebind_alloc > >, │ │ │ │ │ -74 BlockVector, typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc > > > │ │ │ │ │ -75 { │ │ │ │ │ -76 public: │ │ │ │ │ -_7_8 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ -_7_9 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_8_1 typedef Dune::ISTL::Impl::BCCSMatrix _L_D_L_M_a_t_r_i_x; │ │ │ │ │ -_8_3 typedef ISTL::Impl::BCCSMatrixInitializer,A>, │ │ │ │ │ -int> _M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -_8_5 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_T_,_m_>, typename std:: │ │ │ │ │ -allocator_traits::template rebind_alloc > > _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_8_7 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_T_,_n_>, typename std:: │ │ │ │ │ -allocator_traits::template rebind_alloc > > _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -88 │ │ │ │ │ -_9_0 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -91 { │ │ │ │ │ -92 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -93 } │ │ │ │ │ -94 │ │ │ │ │ -_1_0_4 _L_D_L(const _M_a_t_r_i_x& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_ │ │ │ │ │ -(verbose) │ │ │ │ │ -105 { │ │ │ │ │ -106 //check whether T is a supported type │ │ │ │ │ -107 static_assert(std::is_same::value,"Unsupported Type in LDL (only │ │ │ │ │ -double supported)"); │ │ │ │ │ -108 setMatrix(matrix); │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -_1_2_0 _L_D_L(const _M_a_t_r_i_x& matrix, int verbose, bool) : matrixIsLoaded_(false), │ │ │ │ │ -verbose_(verbose) │ │ │ │ │ -121 { │ │ │ │ │ -122 //check whether T is a supported type │ │ │ │ │ -123 static_assert(std::is_same::value,"Unsupported Type in LDL (only │ │ │ │ │ -double supported)"); │ │ │ │ │ -124 setMatrix(matrix); │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -_1_3_6 _L_D_L(const _M_a_t_r_i_x& matrix, const ParameterTree& config) │ │ │ │ │ -137 : _L_D_L(matrix, config._g_e_t("verbose", 0)) │ │ │ │ │ -138 {} │ │ │ │ │ -139 │ │ │ │ │ -_1_4_1 _L_D_L() : matrixIsLoaded_(false), verbose_(0) │ │ │ │ │ -142 {} │ │ │ │ │ -143 │ │ │ │ │ -_1_4_5 virtual _~_L_D_L() │ │ │ │ │ -146 { │ │ │ │ │ -147 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -148 free(); │ │ │ │ │ -149 } │ │ │ │ │ -150 │ │ │ │ │ -_1_5_2 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ -res) │ │ │ │ │ -153 { │ │ │ │ │ -154 const int dimMat(ldlMatrix_.N()); │ │ │ │ │ -155 ldl_perm(dimMat, Y_, reinterpret_cast(&b[0]), P_); │ │ │ │ │ -156 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_); │ │ │ │ │ -157 ldl_dsolve(dimMat, Y_, D_); │ │ │ │ │ -158 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_); │ │ │ │ │ -159 ldl_permt(dimMat, reinterpret_cast(&x[0]), Y_, P_); │ │ │ │ │ -160 // this is a direct solver │ │ │ │ │ -161 res._i_t_e_r_a_t_i_o_n_s = 1; │ │ │ │ │ -162 res._c_o_n_v_e_r_g_e_d = true; │ │ │ │ │ -163 } │ │ │ │ │ -164 │ │ │ │ │ -_1_6_6 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, [[maybe_unused]] double │ │ │ │ │ -reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +48 template │ │ │ │ │ +49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std:: │ │ │ │ │ +integral_constant { return {}; } │ │ │ │ │ +50 │ │ │ │ │ +51 template │ │ │ │ │ +52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N()) │ │ │ │ │ +{ return matrix.N(); } │ │ │ │ │ +53 │ │ │ │ │ +54 template │ │ │ │ │ +55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M()) │ │ │ │ │ +{ return matrix.M(); } │ │ │ │ │ +56 │ │ │ │ │ +57 template │ │ │ │ │ +58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std:: │ │ │ │ │ +integral_constant { return {}; } │ │ │ │ │ +59 │ │ │ │ │ +60 template │ │ │ │ │ +61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size()) │ │ │ │ │ +{ return vector.size(); } │ │ │ │ │ +62 │ │ │ │ │ +63 │ │ │ │ │ +64 } // end namespace Impl │ │ │ │ │ +65 │ │ │ │ │ +_6_6namespace ForEach{ │ │ │ │ │ +67 │ │ │ │ │ +68 template │ │ │ │ │ +_6_9 auto _r_o_w_s(_M_a_t_r_i_x const& matrix) { return Impl::rows(matrix, PriorityTag<5> │ │ │ │ │ +{}); } │ │ │ │ │ +70 │ │ │ │ │ +71 template │ │ │ │ │ +_7_2 auto _c_o_l_s(_M_a_t_r_i_x const& matrix) { return Impl::cols(matrix, PriorityTag<5> │ │ │ │ │ +{}); } │ │ │ │ │ +73 │ │ │ │ │ +74 template │ │ │ │ │ +_7_5 auto _s_i_z_e(Vector const& vector) { return Impl::size(vector, PriorityTag<5> │ │ │ │ │ +{}); } │ │ │ │ │ +76 │ │ │ │ │ +77} // namespace ForEach │ │ │ │ │ +78 │ │ │ │ │ +79 │ │ │ │ │ +80 │ │ │ │ │ +81 │ │ │ │ │ +94template │ │ │ │ │ +_9_5std::size_t _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(Vector&& vector, F&& f, std::size_t offset = 0) │ │ │ │ │ +96{ │ │ │ │ │ +97 using V = std::decay_t; │ │ │ │ │ +98 if constexpr( Impl::IsScalar::value ) │ │ │ │ │ +99 { │ │ │ │ │ +100 f(vector, offset); │ │ │ │ │ +101 return 1; │ │ │ │ │ +102 } │ │ │ │ │ +103 else │ │ │ │ │ +104 { │ │ │ │ │ +105 std::size_t idx = 0; │ │ │ │ │ +106 Hybrid::forEach(Dune::range(_F_o_r_E_a_c_h_:_:_s_i_z_e(vector)), [&](auto i) { │ │ │ │ │ +107 idx += _f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h(vector[i], f, offset + idx); │ │ │ │ │ +108 }); │ │ │ │ │ +109 return idx; │ │ │ │ │ +110 } │ │ │ │ │ +111} │ │ │ │ │ +112 │ │ │ │ │ +113 │ │ │ │ │ +131template │ │ │ │ │ +_1_3_2std::pair _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(_M_a_t_r_i_x&& matrix, F&& f, │ │ │ │ │ +std::size_t rowOffset = 0, std::size_t colOffset = 0) │ │ │ │ │ +133{ │ │ │ │ │ +134 using M = std::decay_t; │ │ │ │ │ +135 if constexpr ( Impl::IsScalar::value ) │ │ │ │ │ +136 { │ │ │ │ │ +137 f(matrix,rowOffset,colOffset); │ │ │ │ │ +138 return {1,1}; │ │ │ │ │ +139 } │ │ │ │ │ +140 else │ │ │ │ │ +141 { │ │ │ │ │ +142 // if M supports the IsRowMajorSparse type trait: iterate just over the │ │ │ │ │ +nonzero entries and │ │ │ │ │ +143 // and compute the flat row/col size directly │ │ │ │ │ +144 if constexpr ( Impl::IsRowMajorSparse::value ) │ │ │ │ │ +145 { │ │ │ │ │ +146 using Block = std::decay_t; │ │ │ │ │ +147 │ │ │ │ │ +148 // find an existing block or at least try to create one │ │ │ │ │ +149 auto block = [&]{ │ │ │ │ │ +150 for (auto const& row : matrix) │ │ │ │ │ +151 for (auto const& entry : row) │ │ │ │ │ +152 return entry; │ │ │ │ │ +153 return Block{}; │ │ │ │ │ +154 }(); │ │ │ │ │ +155 │ │ │ │ │ +156 // compute the scalar size of the block │ │ │ │ │ +157 auto [blockRows, blockCols] = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(block, [](...){}); │ │ │ │ │ +158 │ │ │ │ │ +159 // check whether we have valid sized blocks │ │ │ │ │ +160 assert( ( blockRows!=0 or blockCols!=0 ) and "the block size can't be │ │ │ │ │ +zero"); │ │ │ │ │ +161 │ │ │ │ │ +162 for ( auto rowIt = matrix.begin(); rowIt != matrix.end(); rowIt++ ) │ │ │ │ │ +163 { │ │ │ │ │ +164 auto&& row = *rowIt; │ │ │ │ │ +165 auto rowIdx = rowIt.index(); │ │ │ │ │ +166 for ( auto colIt = row.begin(); colIt != row.end(); colIt++ ) │ │ │ │ │ 167 { │ │ │ │ │ -168 apply(x,b,res); │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -_1_7_6 void _a_p_p_l_y(T* x, T* b) │ │ │ │ │ -177 { │ │ │ │ │ -178 const int dimMat(ldlMatrix_.N()); │ │ │ │ │ -179 ldl_perm(dimMat, Y_, b, P_); │ │ │ │ │ -180 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_); │ │ │ │ │ -181 ldl_dsolve(dimMat, Y_, D_); │ │ │ │ │ -182 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_); │ │ │ │ │ -183 ldl_permt(dimMat, x, Y_, P_); │ │ │ │ │ -184 } │ │ │ │ │ -185 │ │ │ │ │ -_1_8_6 void _s_e_t_O_p_t_i_o_n([[maybe_unused]] unsigned int option, [[maybe_unused]] │ │ │ │ │ -double value) │ │ │ │ │ -187 {} │ │ │ │ │ -188 │ │ │ │ │ -_1_9_0 void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& matrix) │ │ │ │ │ -191 { │ │ │ │ │ -192 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -193 free(); │ │ │ │ │ -194 │ │ │ │ │ -195 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0) │ │ │ │ │ -196 ldlMatrix_.free(); │ │ │ │ │ -197 ldlMatrix_.setSize(_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(matrix), │ │ │ │ │ -198 _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(matrix)); │ │ │ │ │ -199 ISTL::Impl::BCCSMatrixInitializer initializer(ldlMatrix_); │ │ │ │ │ -200 │ │ │ │ │ -201 copyToBCCSMatrix(initializer, matrix); │ │ │ │ │ -202 │ │ │ │ │ -203 decompose(); │ │ │ │ │ -204 } │ │ │ │ │ -205 │ │ │ │ │ -206 template │ │ │ │ │ -_2_0_7 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& matrix, const S& rowIndexSet) │ │ │ │ │ -208 { │ │ │ │ │ -209 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -210 free(); │ │ │ │ │ -211 │ │ │ │ │ -212 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0) │ │ │ │ │ -213 ldlMatrix_.free(); │ │ │ │ │ -214 │ │ │ │ │ -215 ldlMatrix_.setSize(rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m │ │ │ │ │ -(matrix) / matrix._N(), │ │ │ │ │ -216 rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(matrix) / matrix._M()); │ │ │ │ │ -217 ISTL::Impl::BCCSMatrixInitializer initializer(ldlMatrix_); │ │ │ │ │ -218 │ │ │ │ │ -219 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_M_a_t_r_i_x,std:: │ │ │ │ │ -set >(matrix,rowIndexSet)); │ │ │ │ │ -220 │ │ │ │ │ -221 decompose(); │ │ │ │ │ -222 } │ │ │ │ │ -223 │ │ │ │ │ -_2_2_8 inline void _s_e_t_V_e_r_b_o_s_i_t_y(int v) │ │ │ │ │ -229 { │ │ │ │ │ -230 verbose_=v; │ │ │ │ │ -231 } │ │ │ │ │ -232 │ │ │ │ │ -_2_3_7 inline _L_D_L_M_a_t_r_i_x& _g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x() │ │ │ │ │ -238 { │ │ │ │ │ -239 return ldlMatrix_; │ │ │ │ │ -240 } │ │ │ │ │ -241 │ │ │ │ │ -_2_4_6 void _f_r_e_e() │ │ │ │ │ -247 { │ │ │ │ │ -248 delete [] D_; │ │ │ │ │ -249 delete [] Y_; │ │ │ │ │ -250 delete [] Lp_; │ │ │ │ │ -251 delete [] Lx_; │ │ │ │ │ -252 delete [] Li_; │ │ │ │ │ -253 delete [] P_; │ │ │ │ │ -254 delete [] Pinv_; │ │ │ │ │ -255 ldlMatrix_.free(); │ │ │ │ │ -256 matrixIsLoaded_ = false; │ │ │ │ │ -257 } │ │ │ │ │ -258 │ │ │ │ │ -_2_6_0 inline const char* _n_a_m_e() │ │ │ │ │ -261 { │ │ │ │ │ -262 return "LDL"; │ │ │ │ │ -263 } │ │ │ │ │ -264 │ │ │ │ │ -_2_6_9 inline double* _g_e_t_D() │ │ │ │ │ -270 { │ │ │ │ │ -271 return D_; │ │ │ │ │ -272 } │ │ │ │ │ -273 │ │ │ │ │ -_2_7_8 inline int* _g_e_t_L_p() │ │ │ │ │ -279 { │ │ │ │ │ -280 return Lp_; │ │ │ │ │ -281 } │ │ │ │ │ -282 │ │ │ │ │ -_2_8_7 inline int* _g_e_t_L_i() │ │ │ │ │ -288 { │ │ │ │ │ -289 return Li_; │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -_2_9_6 inline double* _g_e_t_L_x() │ │ │ │ │ -297 { │ │ │ │ │ -298 return Lx_; │ │ │ │ │ -299 } │ │ │ │ │ -300 │ │ │ │ │ -301 private: │ │ │ │ │ -302 template │ │ │ │ │ -_3_0_3 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ -304 │ │ │ │ │ -305 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_L_D_L<_M_a_t_r_i_x>,true>; │ │ │ │ │ -306 │ │ │ │ │ -308 void decompose() │ │ │ │ │ -309 { │ │ │ │ │ -310 // allocate vectors │ │ │ │ │ -311 const int dimMat(ldlMatrix_.N()); │ │ │ │ │ -312 D_ = new double [dimMat]; │ │ │ │ │ -313 Y_ = new double [dimMat]; │ │ │ │ │ -314 Lp_ = new int [dimMat + 1]; │ │ │ │ │ -315 Parent_ = new int [dimMat]; │ │ │ │ │ -316 Lnz_ = new int [dimMat]; │ │ │ │ │ -317 Flag_ = new int [dimMat]; │ │ │ │ │ -318 Pattern_ = new int [dimMat]; │ │ │ │ │ -319 P_ = new int [dimMat]; │ │ │ │ │ -320 Pinv_ = new int [dimMat]; │ │ │ │ │ -321 │ │ │ │ │ -322 double Info [AMD_INFO]; │ │ │ │ │ -323 if(amd_order (dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), │ │ │ │ │ -P_, (double *) NULL, Info) < AMD_OK) │ │ │ │ │ -324 DUNE_THROW(InvalidStateException,"Error: AMD failed!"); │ │ │ │ │ -325 if(verbose_ > 0) │ │ │ │ │ -326 amd_info (Info); │ │ │ │ │ -327 // compute the symbolic factorisation │ │ │ │ │ -328 ldl_symbolic(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), │ │ │ │ │ -Lp_, Parent_, Lnz_, Flag_, P_, Pinv_); │ │ │ │ │ -329 // initialise those entries of additionalVectors_ whose dimension is known │ │ │ │ │ -only now │ │ │ │ │ -330 Lx_ = new double [Lp_[dimMat]]; │ │ │ │ │ -331 Li_ = new int [Lp_[dimMat]]; │ │ │ │ │ -332 // compute the numeric factorisation │ │ │ │ │ -333 const int rank(ldl_numeric(dimMat, ldlMatrix_.getColStart(), │ │ │ │ │ -ldlMatrix_.getRowIndex(), ldlMatrix_.getValues(), │ │ │ │ │ -334 Lp_, Parent_, Lnz_, Li_, Lx_, D_, Y_, Pattern_, Flag_, P_, Pinv_)); │ │ │ │ │ -335 // free temporary vectors │ │ │ │ │ -336 delete [] Flag_; │ │ │ │ │ -337 delete [] Pattern_; │ │ │ │ │ -338 delete [] Parent_; │ │ │ │ │ -339 delete [] Lnz_; │ │ │ │ │ -340 │ │ │ │ │ -341 if(rank!=dimMat) │ │ │ │ │ -342 DUNE_THROW(InvalidStateException,"Error: LDL factorisation failed!"); │ │ │ │ │ -343 } │ │ │ │ │ -344 │ │ │ │ │ -345 LDLMatrix ldlMatrix_; │ │ │ │ │ -346 bool matrixIsLoaded_; │ │ │ │ │ -347 int verbose_; │ │ │ │ │ -348 int* Lp_; │ │ │ │ │ -349 int* Parent_; │ │ │ │ │ -350 int* Lnz_; │ │ │ │ │ -351 int* Flag_; │ │ │ │ │ -352 int* Pattern_; │ │ │ │ │ -353 int* P_; │ │ │ │ │ -354 int* Pinv_; │ │ │ │ │ -355 double* D_; │ │ │ │ │ -356 double* Y_; │ │ │ │ │ -357 double* Lx_; │ │ │ │ │ -358 int* Li_; │ │ │ │ │ -359 }; │ │ │ │ │ -360 │ │ │ │ │ -361 template │ │ │ │ │ -_3_6_2 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r<_L_D_L<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > > │ │ │ │ │ -363 { │ │ │ │ │ -_3_6_4 enum {_v_a_l_u_e = true}; │ │ │ │ │ -365 }; │ │ │ │ │ -366 │ │ │ │ │ -367 template │ │ │ │ │ -_3_6_8 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d<_L_D_L<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A> > > │ │ │ │ │ -369 { │ │ │ │ │ -_3_7_0 enum {_v_a_l_u_e = true}; │ │ │ │ │ -371 }; │ │ │ │ │ -372 │ │ │ │ │ -_3_7_3 struct _L_D_L_C_r_e_a_t_o_r { │ │ │ │ │ -_3_7_4 template struct _i_s_V_a_l_i_d_B_l_o_c_k : std::false_type{}; │ │ │ │ │ -_3_7_5 template struct _i_s_V_a_l_i_d_B_l_o_c_k> : std::true_type │ │ │ │ │ -{}; │ │ │ │ │ -376 │ │ │ │ │ -377 template │ │ │ │ │ -378 std::shared_ptr::type, │ │ │ │ │ -379 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_3_8_0 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& config, │ │ │ │ │ -381 std::enable_if_t< │ │ │ │ │ -382 _i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ -value,int> = 0) const │ │ │ │ │ -383 { │ │ │ │ │ -384 int verbose = config.get("verbose", 0); │ │ │ │ │ -385 return std::make_shared>(_m_a_t,verbose); │ │ │ │ │ -386 } │ │ │ │ │ -387 │ │ │ │ │ -388 // second version with SFINAE to validate the template parameters of LDL │ │ │ │ │ -389 template │ │ │ │ │ -390 std::shared_ptr::type, │ │ │ │ │ -391 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_3_9_2 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ -*config*/, │ │ │ │ │ -393 std::enable_if_t< │ │ │ │ │ -394 !_i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ -value,int> = 0) const │ │ │ │ │ -395 { │ │ │ │ │ -396 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, │ │ │ │ │ -397 "Unsupported Type in LDL (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -398 } │ │ │ │ │ -399 }; │ │ │ │ │ -_4_0_0 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("ldl", _D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r()); │ │ │ │ │ -401 │ │ │ │ │ -402} // end namespace Dune │ │ │ │ │ -403 │ │ │ │ │ -404 │ │ │ │ │ -405#endif //HAVE_SUITESPARSE_LDL │ │ │ │ │ -406#endif //DUNE_ISTL_LDL_HH │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ -#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ -_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -Dune::BlockVector< FieldVector< T, m >, typename std::allocator_traits< A >:: │ │ │ │ │ -template rebind_alloc< FieldVector< T, m > > > domain_type │ │ │ │ │ -The type of the domain of the solver. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -The matrix type. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_L_p │ │ │ │ │ -int * getLp() │ │ │ │ │ -Get factorization Lp. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:278 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x │ │ │ │ │ -LDLMatrix & getInternalMatrix() │ │ │ │ │ -Return the column compress matrix. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:237 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_L_D_L_M_a_t_r_i_x │ │ │ │ │ -Dune::ISTL::Impl::BCCSMatrix< T, int > LDLMatrix │ │ │ │ │ -The corresponding SuperLU Matrix type. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_L_x │ │ │ │ │ -double * getLx() │ │ │ │ │ -Get factorization Lx. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_V_e_r_b_o_s_i_t_y │ │ │ │ │ -void setVerbosity(int v) │ │ │ │ │ -Sets the verbosity level for the solver. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -void apply(T *x, T *b) │ │ │ │ │ -Additional apply method with c-arrays in analogy to superlu. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &x, range_type &b, double reduction, │ │ │ │ │ -InverseOperatorResult &res) │ │ │ │ │ -apply inverse operator, with given convergence criteria. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:166 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Dune::BlockVector< FieldVector< T, n >, typename std::allocator_traits< A >:: │ │ │ │ │ -template rebind_alloc< FieldVector< T, n > > > range_type │ │ │ │ │ -The type of the range of the solver. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_~_L_D_L │ │ │ │ │ -virtual ~LDL() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_f_r_e_e │ │ │ │ │ -void free() │ │ │ │ │ -Free allocated space. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator,. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_L_i │ │ │ │ │ -int * getLi() │ │ │ │ │ -Get factorization Li. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:287 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -void setMatrix(const Matrix &matrix) │ │ │ │ │ -Initialize data from given matrix. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_O_p_t_i_o_n │ │ │ │ │ -void setOption(unsigned int option, double value) │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_L_D_L │ │ │ │ │ -LDL(const Matrix &matrix, int verbose, bool) │ │ │ │ │ -Constructor for compatibility with SuperLU standard constructor. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_D │ │ │ │ │ -double * getD() │ │ │ │ │ -Get factorization diagonal matrix D. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:269 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_L_D_L │ │ │ │ │ -LDL(const Matrix &matrix, const ParameterTree &config) │ │ │ │ │ -Constructs the LDL solver. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the solver (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int │ │ │ │ │ -> MatrixInitializer │ │ │ │ │ -Type of an associated initializer class. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL │ │ │ │ │ ->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const │ │ │ │ │ -M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< │ │ │ │ │ -typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:380 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_n_a_m_e │ │ │ │ │ -const char * name() │ │ │ │ │ -Get method name. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const Matrix &matrix, const S &rowIndexSet) │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_L_D_L │ │ │ │ │ -LDL() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_L_D_L │ │ │ │ │ -LDL(const Matrix &matrix, int verbose=0) │ │ │ │ │ -Construct a solver object from a BCRSMatrix. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:104 │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +168 auto&& entry = *colIt; │ │ │ │ │ +169 auto colIdx = colIt.index(); │ │ │ │ │ +170 auto [ dummyRows, dummyCols ] = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(entry, f, rowOffset + │ │ │ │ │ +rowIdx*blockRows, colOffset + colIdx*blockCols); │ │ │ │ │ +171 assert( dummyRows == blockRows and dummyCols == blockCols and "we need the │ │ │ │ │ +same size of each block in this matrix type"); │ │ │ │ │ +172 } │ │ │ │ │ +173 } │ │ │ │ │ +174 │ │ │ │ │ +175 return { matrix.N()*blockRows, matrix.M()*blockCols }; │ │ │ │ │ +176 } │ │ │ │ │ +177 // all other matrix types are accessed index-wise with dynamic flat row/col │ │ │ │ │ +counting │ │ │ │ │ +178 else │ │ │ │ │ +179 { │ │ │ │ │ +180 std::size_t r = 0, c = 0; │ │ │ │ │ +181 std::size_t nRows, nCols; │ │ │ │ │ +182 │ │ │ │ │ +183 Hybrid::forEach(Dune::range(_F_o_r_E_a_c_h_:_:_r_o_w_s(matrix)), [&](auto i) { │ │ │ │ │ +184 c = 0; │ │ │ │ │ +185 Hybrid::forEach(Dune::range(_F_o_r_E_a_c_h_:_:_c_o_l_s(matrix)), [&](auto j) { │ │ │ │ │ +186 std::tie(nRows,nCols) = _f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h(matrix[i][j], f, rowOffset + r, │ │ │ │ │ +colOffset + c); │ │ │ │ │ +187 c += nCols; │ │ │ │ │ +188 }); │ │ │ │ │ +189 r += nRows; │ │ │ │ │ +190 }); │ │ │ │ │ +191 return {r,c}; │ │ │ │ │ +192 } │ │ │ │ │ +193 } │ │ │ │ │ +194} │ │ │ │ │ +195 │ │ │ │ │ +196} // namespace Dune │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h │ │ │ │ │ +This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ +the identity. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ +_D_u_n_e_:_:_f_l_a_t_M_a_t_r_i_x_F_o_r_E_a_c_h │ │ │ │ │ +std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f, │ │ │ │ │ +std::size_t rowOffset=0, std::size_t colOffset=0) │ │ │ │ │ +Traverse a blocked matrix and call a functor at each scalar entry. │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_f_l_a_t_V_e_c_t_o_r_F_o_r_E_a_c_h │ │ │ │ │ +std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0) │ │ │ │ │ +Traverse a blocked vector and call a functor at each scalar entry. │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_r_o_w_s │ │ │ │ │ +auto rows(Matrix const &matrix) │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_c_o_l_s │ │ │ │ │ +auto cols(Matrix const &matrix) │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_o_r_E_a_c_h_:_:_s_i_z_e │ │ │ │ │ +auto size(Vector const &vector) │ │ │ │ │ +DDeeffiinniittiioonn foreach.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ size_type M() const │ │ │ │ │ -number of columns (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ +Return the number of columns. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -Sequential overlapping Schwarz preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L │ │ │ │ │ -Use the LDL package to directly solve linear systems – empty default class. │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:373 │ │ │ │ │ -_D_u_n_e_:_:_L_D_L_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k │ │ │ │ │ -DDeeffiinniittiioonn ldl.hh:374 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -int iterations │ │ │ │ │ -Number of iterations. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -Whether this is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -whether the solver internally uses column compressed storage │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ +Return the number of rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00194.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: operators.hh File Reference │ │ │ │ +dune-istl: spqr.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,51 +71,65 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Define general, extensible interface for operators. The available implementation wraps a matrix. │ │ │ │ +

Class for using SPQR with ISTL matrices. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <iomanip>
│ │ │ │ -#include <string>
│ │ │ │ +
#include <complex>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <SuiteSparseQR.hpp>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/shared_ptr.hh>
│ │ │ │ -#include "solvercategory.hh"
│ │ │ │ +#include <dune/istl/bccsmatrixinitializer.hh>
│ │ │ │ +#include <dune/istl/solvers.hh>
│ │ │ │ +#include <dune/istl/solvertype.hh>
│ │ │ │ +#include <dune/istl/solverfactory.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::LinearOperator< X, Y >
 A linear operator. More...
class  Dune::SPQR< Matrix >
 Use the SPQR package to directly solve linear systems – empty default class. More...
 
class  Dune::AssembledLinearOperator< M, X, Y >
 A linear operator exporting itself in matrix form. More...
class  Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > >
 The SPQR direct sparse solver for matrices of type BCRSMatrix. More...
 
class  Dune::MatrixAdapter< M, X, Y >
 Adapter to turn a matrix into a linear operator. More...
struct  Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > >
 
struct  Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > >
 
struct  Dune::SPQRCreator
 
struct  Dune::SPQRCreator::isValidBlock< class >
 
struct  Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("spqr", Dune::SPQRCreator())
 
│ │ │ │

Detailed Description

│ │ │ │ -

Define general, extensible interface for operators. The available implementation wraps a matrix.

│ │ │ │ +

Class for using SPQR with ISTL matrices.

│ │ │ │ +
Author
Marco Agnese, Andrea Sacconi
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,39 +1,49 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -operators.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _O_p_e_r_a_t_o_r │ │ │ │ │ -_c_o_n_c_e_p_t │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. _M_o_r_e_._._. │ │ │ │ │ -#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 │ │ │ │ │ +spqr.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) │ │ │ │ │ +Class for using SPQR with ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_ _X_,_ _Y_ _> │ │ │ │ │ -  A linear operator. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_S_P_Q_R_<_ _M_a_t_r_i_x_ _> │ │ │ │ │ +  Use the SPQR package to directly solve linear systems – empty default │ │ │ │ │ + class. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  A linear operator exporting itself in matrix form. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _> │ │ │ │ │ +  The SPQR direct sparse solver for matrices of type _B_C_R_S_M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ -  Adapter to turn a matrix into a linear operator. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _c_l_a_s_s_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _d_o_u_b_l_e_,_ _1_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R ("spqr", _D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r()) │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ +Class for using SPQR with ISTL matrices. │ │ │ │ │ + Author │ │ │ │ │ + Marco Agnese, Andrea Sacconi │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html │ │ │ │ @@ -21,2108 +21,4679 @@ │ │ │ │ 00000140: 2267 656e 6572 6174 6f72 2220 636f 6e74 "generator" cont │ │ │ │ 00000150: 656e 743d 2244 6f78 7967 656e 2031 2e39 ent="Doxygen 1.9 │ │ │ │ 00000160: 2e38 222f 3e0a 3c6d 6574 6120 6e61 6d65 .8"/>..dune-istl: op │ │ │ │ -000001c0: 6572 6174 6f72 732e 6868 2053 6f75 7263 erators.hh Sourc │ │ │ │ -000001d0: 6520 4669 6c65 3c2f 7469 746c 653e 0a3c e File.< │ │ │ │ -000001e0: 6c69 6e6b 2068 7265 663d 2274 6162 732e link href="tabs. │ │ │ │ -000001f0: 6373 7322 2072 656c 3d22 7374 796c 6573 css" rel="styles │ │ │ │ -00000200: 6865 6574 2220 7479 7065 3d22 7465 7874 heet" type="text │ │ │ │ -00000210: 2f63 7373 222f 3e0a 3c73 6372 6970 7420 /css"/>. │ │ │ │ -00000250: 0a3c 7363 7269 7074 2074 7970 653d 2274 ..< │ │ │ │ -00000290: 6c69 6e6b 2068 7265 663d 2273 6561 7263 link href="searc │ │ │ │ -000002a0: 682f 7365 6172 6368 2e63 7373 2220 7265 h/search.css" re │ │ │ │ -000002b0: 6c3d 2273 7479 6c65 7368 6565 7422 2074 l="stylesheet" t │ │ │ │ -000002c0: 7970 653d 2274 6578 742f 6373 7322 2f3e ype="text/css"/> │ │ │ │ -000002d0: 0a3c 7363 7269 7074 2074 7970 653d 2274 .../* @l │ │ │ │ -00000690: 6963 656e 7365 206d 6167 6e65 743a 3f78 icense magnet:?x │ │ │ │ -000006a0: 743d 7572 6e3a 6274 6968 3a64 3364 3961 t=urn:btih:d3d9a │ │ │ │ -000006b0: 3961 3635 3935 3532 3166 3936 3636 6135 9a6595521f9666a5 │ │ │ │ -000006c0: 6539 3463 6338 3330 6461 6238 3362 3635 e94cc830dab83b65 │ │ │ │ -000006d0: 3639 3926 616d 703b 646e 3d65 7870 6174 699&dn=expat │ │ │ │ -000006e0: 2e74 7874 204d 4954 202a 2f0a 2428 6675 .txt MIT */.$(fu │ │ │ │ -000006f0: 6e63 7469 6f6e 2829 207b 0a20 2069 6e69 nction() {. ini │ │ │ │ -00000700: 744d 656e 7528 2727 2c74 7275 652c 6661 tMenu('',true,fa │ │ │ │ -00000710: 6c73 652c 2773 6561 7263 682e 7068 7027 lse,'search.php' │ │ │ │ -00000720: 2c27 5365 6172 6368 2729 3b0a 2020 2428 ,'Search');. $( │ │ │ │ -00000730: 646f 6375 6d65 6e74 292e 7265 6164 7928 document).ready( │ │ │ │ -00000740: 6675 6e63 7469 6f6e 2829 207b 2069 6e69 function() { ini │ │ │ │ -00000750: 745f 7365 6172 6368 2829 3b20 7d29 3b0a t_search(); });. │ │ │ │ -00000760: 7d29 3b0a 2f2a 2040 6c69 6365 6e73 652d });./* @license- │ │ │ │ -00000770: 656e 6420 2a2f 0a3c 2f73 6372 6970 743e end */. │ │ │ │ -00000780: 0a3c 6469 7620 6964 3d22 6d61 696e 2d6e .
../* @l │ │ │ │ -000007c0: 6963 656e 7365 206d 6167 6e65 743a 3f78 icense magnet:?x │ │ │ │ -000007d0: 743d 7572 6e3a 6274 6968 3a64 3364 3961 t=urn:btih:d3d9a │ │ │ │ -000007e0: 3961 3635 3935 3532 3166 3936 3636 6135 9a6595521f9666a5 │ │ │ │ -000007f0: 6539 3463 6338 3330 6461 6238 3362 3635 e94cc830dab83b65 │ │ │ │ -00000800: 3639 3926 616d 703b 646e 3d65 7870 6174 699&dn=expat │ │ │ │ -00000810: 2e74 7874 204d 4954 202a 2f0a 2428 646f .txt MIT */.$(do │ │ │ │ -00000820: 6375 6d65 6e74 292e 7265 6164 7928 6675 cument).ready(fu │ │ │ │ -00000830: 6e63 7469 6f6e 2829 207b 2069 6e69 745f nction() { init_ │ │ │ │ -00000840: 636f 6465 666f 6c64 2830 293b 207d 293b codefold(0); }); │ │ │ │ -00000850: 0a2f 2a20 406c 6963 656e 7365 2d65 6e64 ./* @license-end │ │ │ │ -00000860: 202a 2f0a 3c2f 7363 7269 7074 3e0a 3c21 */...
.
...
.
.
.
.
.
Loadi │ │ │ │ -00000a50: 6e67 2e2e 2e3c 2f64 6976 3e0a 3c64 6976 ng...
.
Searching....
No Matc │ │ │ │ -00000ac0: 6865 733c 2f64 6976 3e0a 3c2f 6469 763e hes
.
│ │ │ │ -00000ad0: 0a3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c .
.
.< │ │ │ │ -00000ae0: 2f64 6976 3e0a 0a3c 6469 7620 6964 3d22 /div>.. │ │ │ │ -00000be0: 0a3c 2f64 6976 3e3c 212d 2d20 746f 7020 .
.
.
operators │ │ │ │ -00000c40: 2e68 683c 2f64 6976 3e3c 2f64 6976 3e0a .hh
. │ │ │ │ -00000c50: 3c2f 6469 763e 3c21 2d2d 6865 6164 6572
.
.Go to the docum │ │ │ │ -00000ca0: 656e 7461 7469 6f6e 206f 6620 7468 6973 entation of this │ │ │ │ -00000cb0: 2066 696c 652e 3c2f 613e 3c64 6976 2063 file.
│ │ │ │ -00000cd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ -00000dc0: 3c61 2069 643d 226c 3030 3030 3222 206e 2// SPDX- │ │ │ │ -00000e20: 4c69 6365 6e73 652d 4964 656e 7469 6669 License-Identifi │ │ │ │ -00000e30: 6572 3a20 4c69 6365 6e73 6552 6566 2d47 er: LicenseRef-G │ │ │ │ -00000e40: 504c 2d32 2e30 2d6f 6e6c 792d 7769 7468 PL-2.0-only-with │ │ │ │ -00000e50: 2d44 554e 452d 6578 6365 7074 696f 6e3c -DUNE-exception< │ │ │ │ -00000e60: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -00000e80: 6120 6964 3d22 6c30 3030 3033 2220 6e61 a id="l00003" na │ │ │ │ -00000e90: 6d65 3d22 6c30 3030 3033 223e 3c2f 613e me="l00003"> │ │ │ │ -00000ea0: 3c73 7061 6e20 636c 6173 733d 226c 696e 3// -*- ta │ │ │ │ -00000ee0: 622d 7769 6474 683a 2034 3b20 696e 6465 b-width: 4; inde │ │ │ │ -00000ef0: 6e74 2d74 6162 732d 6d6f 6465 3a20 6e69 nt-tabs-mode: ni │ │ │ │ -00000f00: 6c3b 2063 2d62 6173 6963 2d6f 6666 7365 l; c-basic-offse │ │ │ │ -00000f10: 743a 2032 202d 2a2d 3c2f 7370 616e 3e3c t: 2 -*-< │ │ │ │ -00000f20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00000f70: 2020 343c 2f73 7061 6e3e 3c73 7061 6e20 4 │ │ │ │ -00000f90: 2f2f 2076 693a 2073 6574 2065 7420 7473 // vi: set et ts │ │ │ │ -00000fa0: 3d34 2073 773d 3220 7374 733d 323a 3c2f =4 sw=2 sts=2:
.
< │ │ │ │ -00000ff0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00001000: 6e6f 223e 2020 2020 353c 2f73 7061 6e3e no"> 5 │ │ │ │ -00001010: 3c73 7061 6e20 636c 6173 733d 2270 7265 #ifnd │ │ │ │ -00001030: 6566 2044 554e 455f 4953 544c 5f4f 5045 ef DUNE_ISTL_OPE │ │ │ │ -00001040: 5241 544f 5253 5f48 483c 2f73 7061 6e3e RATORS_HH │ │ │ │ -00001050: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -000010a0: 2020 2036 3c2f 7370 616e 3e3c 7370 616e 6#define DU │ │ │ │ -000010d0: 4e45 5f49 5354 4c5f 4f50 4552 4154 4f52 NE_ISTL_OPERATOR │ │ │ │ -000010e0: 535f 4848 3c2f 7370 616e 3e3c 2f64 6976 S_HH
.
7< │ │ │ │ -00001140: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -00001160: 3c61 2069 643d 226c 3030 3030 3822 206e 8#in │ │ │ │ -000011c0: 636c 7564 6520 266c 743b 636d 6174 6826 clude <cmath& │ │ │ │ -000011d0: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
│ │ │ │ -000011e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00001210: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 9 │ │ │ │ -00001250: 2369 6e63 6c75 6465 2026 6c74 3b63 6f6d #include <com │ │ │ │ -00001260: 706c 6578 2667 743b 3c2f 7370 616e 3e3c plex>< │ │ │ │ -00001270: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -000012c0: 2031 303c 2f73 7061 6e3e 3c73 7061 6e20 10#include &l │ │ │ │ -000012f0: 743b 696f 7374 7265 616d 2667 743b 3c2f t;iostream>
.
< │ │ │ │ -00001340: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00001350: 6e6f 223e 2020 2031 313c 2f73 7061 6e3e no"> 11 │ │ │ │ -00001360: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ │ -00001380: 7564 6520 266c 743b 696f 6d61 6e69 7026 ude <iomanip& │ │ │ │ -00001390: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
│ │ │ │ -000013a0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -000013d0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 12 │ │ │ │ -00001410: 2369 6e63 6c75 6465 2026 6c74 3b73 7472 #include <str │ │ │ │ -00001420: 696e 6726 6774 3b3c 2f73 7061 6e3e 3c2f ing>.
│ │ │ │ -00001480: 3133 3c2f 7370 616e 3e20 3c2f 6469 763e 13
│ │ │ │ -00001490: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -000014c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 14 │ │ │ │ -00001500: 2369 6e63 6c75 6465 2026 6c74 3b64 756e #include <dun │ │ │ │ -00001510: 652f 636f 6d6d 6f6e 2f65 7863 6570 7469 e/common/excepti │ │ │ │ -00001520: 6f6e 732e 6868 2667 743b 3c2f 7370 616e ons.hh>
.
│ │ │ │ -00001580: 2020 2031 353c 2f73 7061 6e3e 3c73 7061 15#include │ │ │ │ -000015b0: 266c 743b 6475 6e65 2f63 6f6d 6d6f 6e2f <dune/common/ │ │ │ │ -000015c0: 7368 6172 6564 5f70 7472 2e68 6826 6774 shared_ptr.hh> │ │ │ │ -000015d0: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ │ -000015e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -000015f0: 3e3c 6120 6964 3d22 6c30 3030 3136 2220 > 16
.
17< │ │ │ │ -00001690: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ -000016a0: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor">#inclu │ │ │ │ -000016b0: 6465 2026 7175 6f74 3b3c 6120 636c 6173 de "solv │ │ │ │ -000016e0: 6572 6361 7465 676f 7279 2e68 683c 2f61 ercategory.hh".
│ │ │ │ -00001750: 3138 3c2f 7370 616e 3e20 3c2f 6469 763e 18
│ │ │ │ -00001760: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ -000017d0: 6120 6964 3d22 6c30 3030 3230 2220 6e61 a id="l00020" na │ │ │ │ -000017e0: 6d65 3d22 6c30 3030 3230 223e 3c2f 613e me="l00020"> │ │ │ │ -000017f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 20namespace │ │ │ │ -00001830: 203c 2f73 7061 6e3e 3c61 2063 6c61 7373 Dune │ │ │ │ -00001870: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
21 .
│ │ │ │ -00001920: 3434 3c2f 7370 616e 3e20 203c 7370 616e 44 //============= │ │ │ │ -00001950: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001960: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001970: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001980: 3d3d 3d3d 3d3d 3d3d 3c2f 7370 616e 3e3c ========< │ │ │ │ -00001990: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -000019e0: 2034 353c 2f73 7061 6e3e 2020 3c73 7061 45 // Abstract op │ │ │ │ -00001a10: 6572 6174 6f72 2069 6e74 6572 6661 6365 erator interface │ │ │ │ -00001a20: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -00001a40: 3c61 2069 643d 226c 3030 3034 3622 206e 46 //==== │ │ │ │ -00001aa0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001ab0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001ac0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001ad0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00001ae0: 3d3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c =
.< │ │ │ │ -00001af0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001b00: 3e3c 6120 6964 3d22 6c30 3030 3437 2220 > 47
.
48 │ │ │ │ -00001ba0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00001bf0: 2020 3636 3c2f 7370 616e 3e20 203c 7370 66 template<clas │ │ │ │ -00001c40: 733c 2f73 7061 6e3e 2058 2c20 3c73 7061 s X, class Y │ │ │ │ -00001c70: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
.
│ │ │ │ -00001d30: 3637 3c2f 613e 3c2f 7370 616e 3e20 203c 67 < │ │ │ │ -00001d40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00001d50: 6f72 6422 3e63 6c61 7373 203c 2f73 7061 ord">class Li │ │ │ │ -00001d90: 6e65 6172 4f70 6572 6174 6f72 3c2f 613e nearOperator │ │ │ │ -00001da0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
68 < │ │ │ │ -00001e00: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00001e10: 6f72 6422 3e70 7562 6c69 633c 2f73 7061 ord">public:
.
70 │ │ │ │ -00001ec0: 3c2f 7370 616e 3e20 2020 203c 7370 616e typedef │ │ │ │ -00001ef0: 5820 3c61 2063 6c61 7373 3d22 636f 6465 X domain_type;
.
72< │ │ │ │ -00001ff0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ -00002010: 7479 7065 6465 663c 2f73 7061 6e3e 2059 typedef Y │ │ │ │ -00002020: 203c 6120 636c 6173 733d 2263 6f64 6520 range_type; │ │ │ │ -00002080: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
< │ │ │ │ -000020d0: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -000020e0: 7265 663d 2261 3031 3834 302e 6874 6d6c ref="a01840.html │ │ │ │ -000020f0: 2361 3564 3532 3138 6539 6662 3637 3965 #a5d5218e9fb679e │ │ │ │ -00002100: 6364 3731 3063 3365 3938 6636 3939 3466 cd710c3e98f6994f │ │ │ │ -00002110: 3139 223e 2020 2037 343c 2f61 3e3c 2f73 19"> 74 ty │ │ │ │ -00002140: 7065 6465 663c 2f73 7061 6e3e 203c 7370 pedef typename X::field_type │ │ │ │ -00002180: 203c 6120 636c 6173 733d 2263 6f64 6520 field_type; │ │ │ │ -000021e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00002230: 2020 3735 3c2f 7370 616e 3e20 3c2f 6469 75 .
│ │ │ │ -000022d0: 2020 2038 303c 2f61 3e3c 2f73 7061 6e3e 80 │ │ │ │ -000022e0: 2020 2020 3c73 7061 6e20 636c 6173 733d virtua │ │ │ │ -00002300: 6c3c 2f73 7061 6e3e 203c 7370 616e 2063 l void < │ │ │ │ -00002330: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00002340: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ -00002350: 2261 3031 3834 302e 6874 6d6c 2361 6436 "a01840.html#ad6 │ │ │ │ -00002360: 6332 3066 3137 6366 3266 3334 3231 6364 c20f17cf2f3421cd │ │ │ │ -00002370: 3338 3862 3262 3630 6664 3066 6533 223e 388b2b60fd0fe3"> │ │ │ │ -00002380: 6170 706c 793c 2f61 3e20 283c 7370 616e apply (const X& │ │ │ │ -000023b0: 616d 703b 2078 2c20 5926 616d 703b 2079 amp; x, Y& y │ │ │ │ -000023c0: 2920 3c73 7061 6e20 636c 6173 733d 226b ) const = 0;
. │ │ │ │ -000023f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ -00002480: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00002490: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 83 virtual void │ │ │ │ -00002530: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 applysc │ │ │ │ -00002590: 616c 6561 6464 3c2f 613e 2028 3c61 2063 aleadd (fiel │ │ │ │ -000025f0: 645f 7479 7065 3c2f 613e 2061 6c70 6861 d_type alpha │ │ │ │ -00002600: 2c20 3c73 7061 6e20 636c 6173 733d 226b , const X& x, Y │ │ │ │ -00002630: 2661 6d70 3b20 7929 203c 7370 616e 2063 & y) c │ │ │ │ -00002650: 6f6e 7374 3c2f 7370 616e 3e20 3d20 303b onst = 0; │ │ │ │ -00002660: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -000026b0: 2020 3834 3c2f 7370 616e 3e20 3c2f 6469 84 .
│ │ │ │ -00002750: 2020 2038 363c 2f61 3e3c 2f73 7061 6e3e 86 │ │ │ │ -00002760: 2020 2020 3c73 7061 6e20 636c 6173 733d virtua │ │ │ │ -00002780: 6c3c 2f73 7061 6e3e 203c 6120 636c 6173 l ~Linea │ │ │ │ -000027e0: 724f 7065 7261 746f 723c 2f61 3e20 2829 rOperator () │ │ │ │ -000027f0: 207b 7d3c 2f64 6976 3e0a 3c64 6976 2063 {}
.
87 < │ │ │ │ -00002850: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..
90#if DUNE │ │ │ │ -00002a70: 5f49 5354 4c5f 5355 5050 4f52 545f 4f4c _ISTL_SUPPORT_OL │ │ │ │ -00002a80: 445f 4341 5445 474f 5259 5f49 4e54 4552 D_CATEGORY_INTER │ │ │ │ -00002a90: 4641 4345 3c2f 7370 616e 3e3c 2f64 6976 FACE
.
91< │ │ │ │ -00002af0: 2f73 7061 6e3e 2020 2020 7b3c 2f64 6976 /span> {
.
92< │ │ │ │ -00002b50: 2f73 7061 6e3e 2020 2020 2020 4455 4e45 /span> DUNE │ │ │ │ -00002b60: 5f54 4852 4f57 2844 756e 653a 3a45 7863 _THROW(Dune::Exc │ │ │ │ -00002b70: 6570 7469 6f6e 2c3c 7370 616e 2063 6c61 eption,"It is n │ │ │ │ -00002ba0: 6563 6573 7361 7279 2074 6f20 696d 706c ecessary to impl │ │ │ │ -00002bb0: 656d 656e 7420 7468 6520 6361 7465 676f ement the catego │ │ │ │ -00002bc0: 7279 206d 6574 686f 6420 696e 2061 2064 ry method in a d │ │ │ │ -00002bd0: 6572 6976 6564 2063 6c61 7373 6573 2c20 erived classes, │ │ │ │ -00002be0: 696e 2074 6865 2066 7574 7572 6520 7468 in the future th │ │ │ │ -00002bf0: 6973 206d 6574 686f 6420 7769 6c6c 2070 is method will p │ │ │ │ -00002c00: 7572 6520 7669 7274 7561 6c2e 2671 756f ure virtual.&quo │ │ │ │ -00002c10: 743b 3c2f 7370 616e 3e29 3b3c 2f64 6976 t;);
.
93< │ │ │ │ -00002c70: 2f73 7061 6e3e 2020 2020 7d3b 3c2f 6469 /span> };.
94 │ │ │ │ -00002cd0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #else.
│ │ │ │ -00002d50: 3935 3c2f 7370 616e 3e20 2020 203d 2030 95 = 0 │ │ │ │ -00002d60: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00002db0: 2020 2039 363c 2f73 7061 6e3e 3c73 7061 96#endif
.
97 │ │ │ │ -00002e40: 207d 3b3c 2f64 6976 3e0a 3c2f 6469 763e };
.
│ │ │ │ -00002e50: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ -00002ec0: 6120 6964 3d22 6c30 3030 3939 2220 6e61 a id="l00099" na │ │ │ │ -00002ed0: 6d65 3d22 6c30 3030 3939 223e 3c2f 613e me="l00099"> │ │ │ │ -00002ee0: 3c73 7061 6e20 636c 6173 733d 226c 696e 99
.
108 < │ │ │ │ -00002f60: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00002f70: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template<cl │ │ │ │ -00002fa0: 6173 733c 2f73 7061 6e3e 204d 2c20 3c73 ass M, class │ │ │ │ -00002fd0: 2058 2c20 3c73 7061 6e20 636c 6173 733d X, class< │ │ │ │ -00002ff0: 2f73 7061 6e3e 2059 2667 743b 3c2f 6469 /span> Y>.
.
109 cla │ │ │ │ -000030e0: 7373 203c 2f73 7061 6e3e 3c61 2063 6c61 ss AssembledL │ │ │ │ -00003120: 696e 6561 724f 7065 7261 746f 723c 2f61 inearOperator : public │ │ │ │ -00003150: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 LinearOperat │ │ │ │ -00003190: 6f72 3c2f 613e 266c 743b 582c 5926 6774 or<X,Y> │ │ │ │ -000031a0: 3b20 7b3c 2f64 6976 3e0a 3c64 6976 2063 ; {
.
110 │ │ │ │ -00003200: 3c73 7061 6e20 636c 6173 733d 226b 6579 public:
.
112 typedef │ │ │ │ -000032f0: 204d 203c 6120 636c 6173 733d 2263 6f64 M matrix_type;
.
113 │ │ │ │ -000033f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e typedef │ │ │ │ -00003420: 5820 3c61 2063 6c61 7373 3d22 636f 6465 X domain_type;
.
114< │ │ │ │ -00003520: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ -00003540: 7479 7065 6465 663c 2f73 7061 6e3e 2059 typedef Y │ │ │ │ -00003550: 203c 6120 636c 6173 733d 2263 6f64 6520 range_type; │ │ │ │ -000035b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
< │ │ │ │ -00003600: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -00003610: 7265 663d 2261 3031 3834 342e 6874 6d6c ref="a01844.html │ │ │ │ -00003620: 2361 3934 3438 6339 6536 3566 3462 3965 #a9448c9e65f4b9e │ │ │ │ -00003630: 6164 6664 3464 6563 3461 3063 6333 3762 adfd4dec4a0cc37b │ │ │ │ -00003640: 3536 223e 2020 3131 353c 2f61 3e3c 2f73 56"> 115 ty │ │ │ │ -00003670: 7065 6465 663c 2f73 7061 6e3e 203c 7370 pedef typename X::field_type │ │ │ │ -000036b0: 203c 6120 636c 6173 733d 2263 6f64 6520 field_type; │ │ │ │ -00003710: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00003760: 2031 3136 3c2f 7370 616e 3e20 3c2f 6469 116 .
│ │ │ │ -00003800: 2020 3131 383c 2f61 3e3c 2f73 7061 6e3e 118 │ │ │ │ -00003810: 2020 2020 3c73 7061 6e20 636c 6173 733d virtua │ │ │ │ -00003830: 6c3c 2f73 7061 6e3e 203c 7370 616e 2063 l c │ │ │ │ -00003850: 6f6e 7374 3c2f 7370 616e 3e20 4d26 616d onst M&am │ │ │ │ -00003860: 703b 203c 6120 636c 6173 733d 2263 6f64 p; getmat ( │ │ │ │ -000038c0: 2920 3c73 7061 6e20 636c 6173 733d 226b ) const = 0;
. │ │ │ │ -000038f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ -00003980: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00003990: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 121 virtual ~AssembledLin │ │ │ │ -00003a70: 6561 724f 7065 7261 746f 723c 2f61 3e20 earOperator │ │ │ │ -00003a80: 2829 207b 7d3c 2f64 6976 3e0a 3c64 6976 () {}
.
< │ │ │ │ -00003ac0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00003ad0: 6e6f 223e 2020 3132 323c 2f73 7061 6e3e no"> 122 │ │ │ │ -00003ae0: 2020 7d3b 3c2f 6469 763e 0a3c 2f64 6976 };
.
.
123< │ │ │ │ -00003b40: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -00003b60: 3c61 2069 643d 226c 3030 3132 3422 206e 124
.
125 < │ │ │ │ -00003c00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00003c50: 3132 363c 2f73 7061 6e3e 2020 3c73 7061 126 //============ │ │ │ │ -00003c80: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003c90: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003ca0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003cb0: 3d3d 3d3d 3d3d 3d3d 3d3c 2f73 7061 6e3e ========= │ │ │ │ -00003cc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00003d10: 2031 3237 3c2f 7370 616e 3e20 203c 7370 127 // Implementa │ │ │ │ -00003d40: 7469 6f6e 2066 6f72 2049 5354 4c2d 6d61 tion for ISTL-ma │ │ │ │ -00003d50: 7472 6978 2062 6173 6564 206f 7065 7261 trix based opera │ │ │ │ -00003d60: 746f 723c 2f73 7061 6e3e 3c2f 6469 763e tor
│ │ │ │ -00003d70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00003da0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 128 //= │ │ │ │ -00003de0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003df0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003e00: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003e10: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ -00003e20: 3d3d 3d3d 3c2f 7370 616e 3e3c 2f64 6976 ====
.
129< │ │ │ │ -00003e80: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -00003ea0: 3c61 2069 643d 226c 3030 3133 3522 206e 135 templa │ │ │ │ -00003f00: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class │ │ │ │ -00003f30: 4d2c 203c 7370 616e 2063 6c61 7373 3d22 M, class X, c │ │ │ │ -00003f70: 6c61 7373 3c2f 7370 616e 3e20 5926 6774 lass Y> │ │ │ │ -00003f80: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
.< │ │ │ │ -00003fd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00003fe0: 3e3c 6120 6964 3d22 6c30 3031 3336 2220 > 136< │ │ │ │ -00004040: 2f61 3e3c 2f73 7061 6e3e 2020 3c73 7061 /a> class < │ │ │ │ -00004070: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00004080: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ │ -00004090: 3138 3438 2e68 746d 6c22 3e4d 6174 7269 1848.html">Matri │ │ │ │ -000040a0: 7841 6461 7074 6572 3c2f 613e 203a 203c xAdapter : < │ │ │ │ -000040b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000040c0: 6f72 6422 3e70 7562 6c69 633c 2f73 7061 ord">public A │ │ │ │ -00004100: 7373 656d 626c 6564 4c69 6e65 6172 4f70 ssembledLinearOp │ │ │ │ -00004110: 6572 6174 6f72 3c2f 613e 266c 743b 4d2c erator<M, │ │ │ │ -00004120: 582c 5926 6774 3b3c 2f64 6976 3e0a 3c64 X,Y>
. │ │ │ │ -00004140: 3c61 2069 643d 226c 3030 3133 3722 206e 137 {
.
< │ │ │ │ -000041c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000041d0: 6e6f 223e 2020 3133 383c 2f73 7061 6e3e no"> 138 │ │ │ │ -000041e0: 2020 3c73 7061 6e20 636c 6173 733d 226b public:
.< │ │ │ │ -00004220: 6120 6964 3d22 6c30 3031 3430 2220 6e61 a id="l00140" na │ │ │ │ -00004230: 6d65 3d22 6c30 3031 3430 223e 3c2f 613e me="l00140"> │ │ │ │ -00004240: 3c73 7061 6e20 636c 6173 733d 226c 696e 140< │ │ │ │ -000042a0: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c73 /a> typedef M matrix_type │ │ │ │ -00004330: 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 6976 ;
.
< │ │ │ │ -00004370: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00004380: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 141 typedef X domain_type< │ │ │ │ -00004460: 2f61 3e3b 3c2f 6469 763e 0a3c 6469 7620 /a>;
.
142 typedef │ │ │ │ -00004530: 2059 203c 6120 636c 6173 733d 2263 6f64 Y range_type;
.
143< │ │ │ │ -00004630: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ -00004650: 7479 7065 6465 663c 2f73 7061 6e3e 203c typedef < │ │ │ │ -00004660: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00004670: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord">typename X::field_ty │ │ │ │ -00004690: 7065 203c 6120 636c 6173 733d 2263 6f64 pe field_type;
.
144 .
146 expl │ │ │ │ -00004810: 6963 6974 3c2f 7370 616e 3e20 3c61 2063 icit Mat │ │ │ │ -00004870: 7269 7841 6461 7074 6572 3c2f 613e 2028 rixAdapter ( │ │ │ │ -00004880: 3c73 7061 6e20 636c 6173 733d 226b 6579 const M& A) : _ │ │ │ │ -000048b0: 415f 2873 7461 636b 6f62 6a65 6374 5f74 A_(stackobject_t │ │ │ │ -000048c0: 6f5f 7368 6172 6564 5f70 7472 2841 2929 o_shared_ptr(A)) │ │ │ │ -000048d0: 207b 7d3c 2f64 6976 3e0a 3c64 6976 2063 {}
.
147 < │ │ │ │ -00004930: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
149 exp │ │ │ │ -000049f0: 6c69 6369 743c 2f73 7061 6e3e 203c 6120 licit Ma │ │ │ │ -00004a50: 7472 6978 4164 6170 7465 723c 2f61 3e20 trixAdapter │ │ │ │ -00004a60: 2873 7464 3a3a 7368 6172 6564 5f70 7472 (std::shared_ptr │ │ │ │ -00004a70: 266c 743b 636f 6e73 7420 4d26 6774 3b20 <const M> │ │ │ │ -00004a80: 4129 203a 205f 415f 2841 2920 7b7d 3c2f A) : _A_(A) {}.
1 │ │ │ │ -00004ae0: 3530 3c2f 7370 616e 3e20 3c2f 6469 763e 50
│ │ │ │ -00004af0: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
.
< │ │ │ │ -00004b80: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -00004b90: 7265 663d 2261 3031 3834 382e 6874 6d6c ref="a01848.html │ │ │ │ -00004ba0: 2361 6233 3937 3661 3230 6564 6139 6634 #ab3976a20eda9f4 │ │ │ │ -00004bb0: 3338 6631 6265 3066 6263 3961 6339 3365 38f1be0fbc9ac93e │ │ │ │ -00004bc0: 3562 223e 2020 3135 323c 2f61 3e3c 2f73 5b"> 152 void a │ │ │ │ -00004c50: 7070 6c79 3c2f 613e 2028 3c73 7061 6e20 pply ( │ │ │ │ -00004c70: 636f 6e73 743c 2f73 7061 6e3e 2058 2661 const X&a │ │ │ │ -00004c80: 6d70 3b20 782c 2059 2661 6d70 3b20 7929 mp; x, Y& y) │ │ │ │ -00004c90: 3c73 7061 6e20 636c 6173 733d 226b 6579 const ove │ │ │ │ -00004cb0: 7272 6964 653c 2f73 7061 6e3e 3c2f 6469 rride.
153 │ │ │ │ -00004d10: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 │ │ │ │ -00004d30: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
. │ │ │ │ -00004d40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
│ │ │ │ -00004db0: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ -00004e10: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
.
│ │ │ │ -00004e60: 2020 3135 363c 2f73 7061 6e3e 203c 2f64 156 .
.
158 │ │ │ │ -00004f50: 3c2f 7370 616e 3e20 2020 203c 7370 616e void │ │ │ │ -00004f80: 203c 6120 636c 6173 733d 2263 6f64 6520 applyscaleadd< │ │ │ │ -00004fe0: 2f61 3e20 283c 6120 636c 6173 733d 2263 /a> (field_type< │ │ │ │ -00005040: 2f61 3e20 616c 7068 612c 203c 7370 616e /a> alpha, const X& │ │ │ │ -00005070: 616d 703b 2078 2c20 5926 616d 703b 2079 amp; x, Y& y │ │ │ │ -00005080: 293c 7370 616e 2063 6c61 7373 3d22 6b65 ) const ov │ │ │ │ -000050a0: 6572 7269 6465 3c2f 7370 616e 3e3c 2f64 erride.
15 │ │ │ │ -00005100: 393c 2f73 7061 6e3e 3c73 7061 6e20 636c 9 │ │ │ │ -00005120: 2020 3c2f 7370 616e 3e7b 3c2f 6469 763e {
│ │ │ │ -00005130: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00005160: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 160 _A_-& │ │ │ │ -00005190: 6774 3b75 736d 7628 616c 7068 612c 782c gt;usmv(alpha,x, │ │ │ │ -000051a0: 7929 3b3c 2f64 6976 3e0a 3c64 6976 2063 y);
.
161 │ │ │ │ -00005200: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
.
│ │ │ │ -00005210: 0a3c 6469 7620 636c 6173 733d 226c 696e ...
│ │ │ │ -00005340: 2020 3136 343c 2f61 3e3c 2f73 7061 6e3e 164 │ │ │ │ -00005350: 2020 2020 3c73 7061 6e20 636c 6173 733d const< │ │ │ │ -00005370: 2f73 7061 6e3e 204d 2661 6d70 3b20 3c61 /span> M& g │ │ │ │ -000053d0: 6574 6d61 743c 2f61 3e20 2829 3c73 7061 etmat () const overrid │ │ │ │ -00005400: 653c 2f73 7061 6e3e 3c2f 6469 763e 0a3c e
.< │ │ │ │ -00005410: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005420: 3e3c 6120 6964 3d22 6c30 3031 3635 2220 > 165 {
.
< │ │ │ │ -000054c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000054d0: 6e6f 223e 2020 3136 363c 2f73 7061 6e3e no"> 166 │ │ │ │ -000054e0: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ -00005500: 7265 7475 726e 3c2f 7370 616e 3e20 2a5f return *_ │ │ │ │ -00005510: 415f 3b3c 2f64 6976 3e0a 3c64 6976 2063 A_;
.
167 │ │ │ │ -00005570: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
.
│ │ │ │ -00005580: 0a3c 6469 7620 636c 6173 733d 226c 696e ....
│ │ │ │ -00005810: 2031 3731 3c2f 7370 616e 3e3c 7370 616e 171 {..< │ │ │ │ -00005960: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005970: 3e3c 6120 6964 3d22 6c30 3031 3733 2220 > 173 }
.< │ │ │ │ -000059c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00005a10: 3137 343c 2f73 7061 6e3e 203c 2f64 6976 174
.
175< │ │ │ │ -00005a70: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> pr │ │ │ │ -00005a90: 6976 6174 653c 2f73 7061 6e3e 3a3c 2f64 ivate:.
17 │ │ │ │ -00005af0: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 const s │ │ │ │ -00005b20: 7464 3a3a 7368 6172 6564 5f70 7472 266c td::shared_ptr&l │ │ │ │ -00005b30: 743b 636f 6e73 7420 4d26 6774 3b20 5f41 t;const M> _A │ │ │ │ -00005b40: 5f3b 3c2f 6469 763e 0a3c 6469 7620 636c _;
.
177 } │ │ │ │ -00005ba0: 3b3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c ;
.
.< │ │ │ │ -00005bb0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005bc0: 3e3c 6120 6964 3d22 6c30 3031 3738 2220 > 178
.
181} │ │ │ │ -00005c60: 203c 7370 616e 2063 6c61 7373 3d22 636f // end na │ │ │ │ -00005c80: 6d65 7370 6163 653c 2f73 7061 6e3e 3c2f mespace.
1 │ │ │ │ -00005ce0: 3832 3c2f 7370 616e 3e20 3c2f 6469 763e 82
│ │ │ │ -00005cf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00005d20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 183 │ │ │ │ -00005d60: 2365 6e64 6966 3c2f 7370 616e 3e3c 2f64 #endif..< │ │ │ │ -00005e80: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00005e90: 6964 3d22 6161 3031 3834 305f 6874 6d6c id="aa01840_html │ │ │ │ -00005ea0: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
A l │ │ │ │ -00005f00: 696e 6561 7220 6f70 6572 6174 6f72 2e3c inear operator.< │ │ │ │ -00005f10: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00005f30: 6974 696f 6e3c 2f62 3e20 6f70 6572 6174 ition operat │ │ │ │ -00005f40: 6f72 732e 6868 3a36 373c 2f64 6976 3e3c ors.hh:67
< │ │ │ │ -00005f50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
< │ │ │ │ -00005fb0: 6120 6872 6566 3d22 6130 3138 3430 2e68 a href="a01840.h │ │ │ │ -00005fc0: 746d 6c23 6130 6535 6230 6438 3663 3937 tml#a0e5b0d86c97 │ │ │ │ -00005fd0: 6235 3964 3663 3735 3937 3731 3836 6530 b59d6c75977186e0 │ │ │ │ -00005fe0: 6335 3534 3022 3e44 756e 653a 3a4c 696e c5540">Dune::Lin │ │ │ │ -00005ff0: 6561 724f 7065 7261 746f 723a 3a7e 4c69 earOperator::~Li │ │ │ │ -00006000: 6e65 6172 4f70 6572 6174 6f72 3c2f 613e nearOperator │ │ │ │ -00006010: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
virtua │ │ │ │ -00006030: 6c20 7e4c 696e 6561 724f 7065 7261 746f l ~LinearOperato │ │ │ │ -00006040: 7228 293c 2f64 6976 3e3c 6469 7620 636c r()
ever │ │ │ │ -00006060: 7920 6162 7374 7261 6374 2062 6173 6520 y abstract base │ │ │ │ -00006070: 636c 6173 7320 6861 7320 6120 7669 7274 class has a virt │ │ │ │ -00006080: 7561 6c20 6465 7374 7275 6374 6f72 3c2f ual destructor
Defini │ │ │ │ -000060b0: 7469 6f6e 3c2f 623e 206f 7065 7261 746f tion operato │ │ │ │ -000060c0: 7273 2e68 683a 3836 3c2f 6469 763e 3c2f rs.hh:86
.
│ │ │ │ -00006190: 3c64 6976 2063 6c61 7373 3d22 7474 6465
X::field_typ │ │ │ │ -000061b0: 6520 6669 656c 645f 7479 7065 3c2f 6469 e field_type
The field t │ │ │ │ -000061e0: 7970 6520 6f66 2074 6865 206f 7065 7261 ype of the opera │ │ │ │ -000061f0: 746f 722e 3c2f 6469 763e 3c64 6976 2063 tor.
│ │ │ │ -00006210: 4465 6669 6e69 7469 6f6e 3c2f 623e 206f Definition o │ │ │ │ -00006220: 7065 7261 746f 7273 2e68 683a 3734 3c2f perators.hh:74
.
│ │ │ │ -00006280: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
vir │ │ │ │ -00006310: 7475 616c 2076 6f69 6420 6170 706c 7973 tual void applys │ │ │ │ -00006320: 6361 6c65 6164 6428 6669 656c 645f 7479 caleadd(field_ty │ │ │ │ -00006330: 7065 2061 6c70 6861 2c20 636f 6e73 7420 pe alpha, const │ │ │ │ -00006340: 5820 2661 6d70 3b78 2c20 5920 2661 6d70 X &x, Y & │ │ │ │ -00006350: 3b79 2920 636f 6e73 7420 3d30 3c2f 6469 ;y) const =0
apply opera │ │ │ │ -00006380: 746f 7220 746f 2078 2c20 7363 616c 6520 tor to x, scale │ │ │ │ -00006390: 616e 6420 6164 643a 3c2f 6469 763e 3c2f and add:
.
virtual Solver │ │ │ │ -00006480: 4361 7465 676f 7279 3a3a 4361 7465 676f Category::Catego │ │ │ │ -00006490: 7279 2063 6174 6567 6f72 7928 2920 636f ry category() co │ │ │ │ -000064a0: 6e73 7420 3d30 3c2f 6469 763e 3c64 6976 nst =0
C │ │ │ │ -000064c0: 6174 6567 6f72 7920 6f66 2074 6865 206c ategory of the l │ │ │ │ -000064d0: 696e 6561 7220 6f70 6572 6174 6f72 2028 inear operator ( │ │ │ │ -000064e0: 7365 6520 536f 6c76 6572 4361 7465 676f see SolverCatego │ │ │ │ -000064f0: 7279 3a3a 4361 7465 676f 7279 293c 2f64 ry::Category)
.
< │ │ │ │ -00006550: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ -00006560: 6522 3e3c 6120 6872 6566 3d22 6130 3138 e">Dune: │ │ │ │ -000065a0: 3a4c 696e 6561 724f 7065 7261 746f 723a :LinearOperator: │ │ │ │ -000065b0: 3a72 616e 6765 5f74 7970 653c 2f61 3e3c :range_type< │ │ │ │ -000065c0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Y range │ │ │ │ -000065e0: 5f74 7970 653c 2f64 6976 3e3c 6469 7620 _type
Th │ │ │ │ -00006600: 6520 7479 7065 206f 6620 7468 6520 7261 e type of the ra │ │ │ │ -00006610: 6e67 6520 6f66 2074 6865 206f 7065 7261 nge of the opera │ │ │ │ -00006620: 746f 722e 3c2f 6469 763e 3c64 6976 2063 tor.
│ │ │ │ -00006640: 4465 6669 6e69 7469 6f6e 3c2f 623e 206f Definition o │ │ │ │ -00006650: 7065 7261 746f 7273 2e68 683a 3732 3c2f perators.hh:72
.
│ │ │ │ -000066b0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
virtual voi │ │ │ │ -00006740: 6420 6170 706c 7928 636f 6e73 7420 5820 d apply(const X │ │ │ │ -00006750: 2661 6d70 3b78 2c20 5920 2661 6d70 3b79 &x, Y &y │ │ │ │ -00006760: 2920 636f 6e73 7420 3d30 3c2f 6469 763e ) const =0
│ │ │ │ -00006770: 3c64 6976 2063 6c61 7373 3d22 7474 646f
apply operato │ │ │ │ -00006790: 7220 746f 2078 3a20 2054 6865 2069 6e70 r to x: The inp │ │ │ │ -000067a0: 7574 2076 6563 746f 7220 6973 2063 6f6e ut vector is con │ │ │ │ -000067b0: 7369 7374 656e 7420 616e 6420 7468 6520 sistent and the │ │ │ │ -000067c0: 6f75 7470 7574 206d 7573 7420 616c 736f output must also │ │ │ │ -000067d0: 2062 6520 636f 6e73 6973 7465 6e74 206f be consistent o │ │ │ │ -000067e0: 6e20 7468 6520 696e 2e2e 2e3c 2f64 6976 n the in...
.
Dune::L │ │ │ │ -00006890: 696e 6561 724f 7065 7261 746f 723a 3a64 inearOperator::d │ │ │ │ -000068a0: 6f6d 6169 6e5f 7479 7065 3c2f 613e 3c2f omain_type
X domain │ │ │ │ -000068d0: 5f74 7970 653c 2f64 6976 3e3c 6469 7620 _type
Th │ │ │ │ -000068f0: 6520 7479 7065 206f 6620 7468 6520 646f e type of the do │ │ │ │ -00006900: 6d61 696e 206f 6620 7468 6520 6f70 6572 main of the oper │ │ │ │ -00006910: 6174 6f72 2e3c 2f64 6976 3e3c 6469 7620 ator.
Definition │ │ │ │ -00006940: 6f70 6572 6174 6f72 732e 6868 3a37 303c operators.hh:70< │ │ │ │ -00006950: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
< │ │ │ │ -00006980: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ -00006990: 6522 3e3c 6120 6872 6566 3d22 6130 3138 e">Dune::A │ │ │ │ -000069b0: 7373 656d 626c 6564 4c69 6e65 6172 4f70 ssembledLinearOp │ │ │ │ -000069c0: 6572 6174 6f72 3c2f 613e 3c2f 6469 763e erator
│ │ │ │ -000069d0: 3c64 6976 2063 6c61 7373 3d22 7474 646f
A linear oper │ │ │ │ -000069f0: 6174 6f72 2065 7870 6f72 7469 6e67 2069 ator exporting i │ │ │ │ -00006a00: 7473 656c 6620 696e 206d 6174 7269 7820 tself in matrix │ │ │ │ -00006a10: 666f 726d 2e3c 2f64 6976 3e3c 6469 7620 form.
Definition │ │ │ │ -00006a40: 6f70 6572 6174 6f72 732e 6868 3a31 3039 operators.hh:109 │ │ │ │ -00006a50: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.virtual const M │ │ │ │ -00006b40: 2026 616d 703b 2067 6574 6d61 7428 2920 & getmat() │ │ │ │ -00006b50: 636f 6e73 7420 3d30 3c2f 6469 763e 3c64 const =0
get matrix via │ │ │ │ -00006b80: 2a3c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 *
.
D │ │ │ │ -00006c20: 756e 653a 3a41 7373 656d 626c 6564 4c69 une::AssembledLi │ │ │ │ -00006c30: 6e65 6172 4f70 6572 6174 6f72 3a3a 646f nearOperator::do │ │ │ │ -00006c40: 6d61 696e 5f74 7970 653c 2f61 3e3c 2f64 main_type
X domain_ │ │ │ │ -00006c70: 7479 7065 3c2f 6469 763e 3c64 6976 2063 type
│ │ │ │ -00006c90: 4465 6669 6e69 7469 6f6e 3c2f 623e 206f Definition o │ │ │ │ -00006ca0: 7065 7261 746f 7273 2e68 683a 3131 333c perators.hh:113< │ │ │ │ -00006cb0: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
│ │ │ │ -00006d80: 3c64 6976 2063 6c61 7373 3d22 7474 6465
X::field_typ │ │ │ │ -00006da0: 6520 6669 656c 645f 7479 7065 3c2f 6469 e field_type
Definiti │ │ │ │ -00006dd0: 6f6e 3c2f 623e 206f 7065 7261 746f 7273 on operators │ │ │ │ -00006de0: 2e68 683a 3131 353c 2f64 6976 3e3c 2f64 .hh:115
.
. │ │ │ │ -00006f20: 3c64 6976 2063 6c61 7373 3d22 7474 6322
Dune::Assembled │ │ │ │ -00006fc0: 4c69 6e65 6172 4f70 6572 6174 6f72 3a3a LinearOperator:: │ │ │ │ -00006fd0: 6d61 7472 6978 5f74 7970 653c 2f61 3e3c matrix_type< │ │ │ │ -00006fe0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
M matri │ │ │ │ -00007000: 785f 7479 7065 3c2f 6469 763e 3c64 6976 x_type
e │ │ │ │ -00007020: 7870 6f72 7420 7479 7065 732c 2075 7375 xport types, usu │ │ │ │ -00007030: 616c 6c79 2074 6865 7920 636f 6d65 2066 ally they come f │ │ │ │ -00007040: 726f 6d20 7468 6520 6465 7269 7665 6420 rom the derived │ │ │ │ -00007050: 636c 6173 733c 2f64 6976 3e3c 6469 7620 class
Definition │ │ │ │ -00007080: 6f70 6572 6174 6f72 732e 6868 3a31 3132 operators.hh:112 │ │ │ │ -00007090: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.< │ │ │ │ -00007170: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ -00007180: 6922 3e76 6972 7475 616c 207e 4173 7365 i">virtual ~Asse │ │ │ │ -00007190: 6d62 6c65 644c 696e 6561 724f 7065 7261 mbledLinearOpera │ │ │ │ -000071a0: 746f 7228 293c 2f64 6976 3e3c 6469 7620 tor()
ev │ │ │ │ -000071c0: 6572 7920 6162 7374 7261 6374 2062 6173 ery abstract bas │ │ │ │ -000071d0: 6520 636c 6173 7320 6861 7320 6120 7669 e class has a vi │ │ │ │ -000071e0: 7274 7561 6c20 6465 7374 7275 6374 6f72 rtual destructor │ │ │ │ -000071f0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ -00007210: 6e69 7469 6f6e 3c2f 623e 206f 7065 7261 nition opera │ │ │ │ -00007220: 746f 7273 2e68 683a 3132 313c 2f64 6976 tors.hh:121
.
< │ │ │ │ -00007270: 6120 6872 6566 3d22 6130 3138 3438 2e68 a href="a01848.h │ │ │ │ -00007280: 746d 6c22 3e44 756e 653a 3a4d 6174 7269 tml">Dune::Matri │ │ │ │ -00007290: 7841 6461 7074 6572 3c2f 613e 3c2f 6469 xAdapter
Adapter to │ │ │ │ -000072c0: 7475 726e 2061 206d 6174 7269 7820 696e turn a matrix in │ │ │ │ -000072d0: 746f 2061 206c 696e 6561 7220 6f70 6572 to a linear oper │ │ │ │ -000072e0: 6174 6f72 2e3c 2f64 6976 3e3c 6469 7620 ator.
Definition │ │ │ │ -00007310: 6f70 6572 6174 6f72 732e 6868 3a31 3337 operators.hh:137 │ │ │ │ -00007320: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
Ma │ │ │ │ -00007400: 7472 6978 4164 6170 7465 7228 7374 643a trixAdapter(std: │ │ │ │ -00007410: 3a73 6861 7265 645f 7074 7226 6c74 3b20 :shared_ptr< │ │ │ │ -00007420: 636f 6e73 7420 4d20 2667 743b 2041 293c const M > A)< │ │ │ │ -00007430: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
construc │ │ │ │ -00007450: 746f 723a 2073 746f 7265 2061 6e20 7374 tor: store an st │ │ │ │ -00007460: 643a 3a73 6861 7265 645f 7074 7220 746f d::shared_ptr to │ │ │ │ -00007470: 2061 206d 6174 7269 783c 2f64 6976 3e3c a matrix
< │ │ │ │ -00007480: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ │ -00007490: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ │ -000074a0: 2f62 3e20 6f70 6572 6174 6f72 732e 6868 /b> operators.hh │ │ │ │ -000074b0: 3a31 3439 3c2f 6469 763e 3c2f 6469 763e :149
│ │ │ │ -000074c0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
MatrixAdapter( │ │ │ │ -000075a0: 636f 6e73 7420 4d20 2661 6d70 3b41 293c const M &A)< │ │ │ │ -000075b0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
construc │ │ │ │ -000075d0: 746f 723a 206a 7573 7420 7374 6f72 6520 tor: just store │ │ │ │ -000075e0: 6120 7265 6665 7265 6e63 6520 746f 2061 a reference to a │ │ │ │ -000075f0: 206d 6174 7269 783c 2f64 6976 3e3c 6469 matrix
│ │ │ │ -00007610: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition operators.hh:1 │ │ │ │ -00007630: 3436 3c2f 6469 763e 3c2f 6469 763e 0a3c 46
.< │ │ │ │ -00007640: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00007650: 6964 3d22 6161 3031 3834 385f 6874 6d6c id="aa01848_html │ │ │ │ -00007660: 5f61 3332 3235 3632 6434 3734 3239 3566 _a322562d474295f │ │ │ │ -00007670: 3430 6161 3031 6131 6631 3736 3963 3166 40aa01a1f1769c1f │ │ │ │ -00007680: 6135 223e 3c64 6976 2063 6c61 7373 3d22 a5">
│ │ │ │ -00007710: 766f 6964 2061 7070 6c79 7363 616c 6561 void applyscalea │ │ │ │ -00007720: 6464 2866 6965 6c64 5f74 7970 6520 616c dd(field_type al │ │ │ │ -00007730: 7068 612c 2063 6f6e 7374 2058 2026 616d pha, const X &am │ │ │ │ -00007740: 703b 782c 2059 2026 616d 703b 7929 2063 p;x, Y &y) c │ │ │ │ -00007750: 6f6e 7374 206f 7665 7272 6964 653c 2f64 onst override
apply oper │ │ │ │ -00007780: 6174 6f72 2074 6f20 782c 2073 6361 6c65 ator to x, scale │ │ │ │ -00007790: 2061 6e64 2061 6464 3a3c 2f64 6976 3e3c and add:
< │ │ │ │ -000077a0: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ │ -000077b0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ │ -000077c0: 2f62 3e20 6f70 6572 6174 6f72 732e 6868 /b> operators.hh │ │ │ │ -000077d0: 3a31 3538 3c2f 6469 763e 3c2f 6469 763e :158
│ │ │ │ -000077e0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
Y │ │ │ │ -000078b0: 2072 616e 6765 5f74 7970 653c 2f64 6976 range_type
Definitio │ │ │ │ -000078e0: 6e3c 2f62 3e20 6f70 6572 6174 6f72 732e n operators. │ │ │ │ -000078f0: 6868 3a31 3432 3c2f 6469 763e 3c2f 6469 hh:142
.
X domain_type< │ │ │ │ -000079e0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00007a00: 6974 696f 6e3c 2f62 3e20 6f70 6572 6174 ition operat │ │ │ │ -00007a10: 6f72 732e 6868 3a31 3431 3c2f 6469 763e ors.hh:141
│ │ │ │ -00007a20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
X::field_ty │ │ │ │ -00007b00: 7065 2066 6965 6c64 5f74 7970 653c 2f64 pe field_type
Definit │ │ │ │ -00007b30: 696f 6e3c 2f62 3e20 6f70 6572 6174 6f72 ion operator │ │ │ │ -00007b40: 732e 6868 3a31 3433 3c2f 6469 763e 3c2f s.hh:143
.
c │ │ │ │ -00007c20: 6f6e 7374 204d 2026 616d 703b 2067 6574 onst M & get │ │ │ │ -00007c30: 6d61 7428 2920 636f 6e73 7420 6f76 6572 mat() const over │ │ │ │ -00007c40: 7269 6465 3c2f 6469 763e 3c64 6976 2063 ride
get │ │ │ │ -00007c60: 206d 6174 7269 7820 7669 6120 2a3c 2f64 matrix via *
Definit │ │ │ │ -00007c90: 696f 6e3c 2f62 3e20 6f70 6572 6174 6f72 ion operator │ │ │ │ -00007ca0: 732e 6868 3a31 3634 3c2f 6469 763e 3c2f s.hh:164
dune-istl: sp │ │ │ │ +000001c0: 7172 2e68 6820 536f 7572 6365 2046 696c qr.hh Source Fil │ │ │ │ +000001d0: 653c 2f74 6974 6c65 3e0a 3c6c 696e 6b20 e... │ │ │ │ +00000280: 3c2f 7363 7269 7074 3e0a 3c6c 696e 6b20 ... │ │ │ │ +00000310: 3c73 6372 6970 7420 7479 7065 3d22 7465 . │ │ │ │ +00000350: 3c6c 696e 6b20 6872 6566 3d22 646f 7879 ...
.
. │ │ │ │ +00000420: 0a20 3c74 626f 6479 3e0a 203c 7472 2069 . . . │ │ │ │ +00000440: 2020 3c74 6420 6964 3d22 7072 6f6a 6563 . . │ │ │ │ +000004c0: 203c 2f74 626f 6479 3e0a 3c2f 7461 626c .....< │ │ │ │ +00000630: 7363 7269 7074 2074 7970 653d 2274 6578 script type="tex │ │ │ │ +00000640: 742f 6a61 7661 7363 7269 7074 2220 7372 t/javascript" sr │ │ │ │ +00000650: 633d 226d 656e 752e 6a73 223e 3c2f 7363 c="menu.js">..
.
dune-istl 2.9.0< │ │ │ │ +000004a0: 2f73 7061 6e3e 0a20 2020 3c2f 6469 763e /span>.
│ │ │ │ +000004b0: 0a20 203c 2f74 643e 0a20 3c2f 7472 3e0a .
│ │ │ │ -00000420: 0a20 3c74 626f 6479 3e0a 203c 7472 2069 . . . │ │ │ │ -00000440: 2020 3c74 6420 6964 3d22 7072 6f6a 6563 . . │ │ │ │ -000004c0: 203c 2f74 626f 6479 3e0a 3c2f 7461 626c .....< │ │ │ │ -00000630: 7363 7269 7074 2074 7970 653d 2274 6578 script type="tex │ │ │ │ -00000640: 742f 6a61 7661 7363 7269 7074 2220 7372 t/javascript" sr │ │ │ │ -00000650: 633d 226d 656e 752e 6a73 223e 3c2f 7363 c="menu.js">.. │ │ │ │ -00000ae0: 0a0a 3c64 6976 2069 643d 226e 6176 2d70 ....< │ │ │ │ -00000bf0: 6469 7620 636c 6173 733d 2268 6561 6465 div class="heade │ │ │ │ -00000c00: 7222 3e0a 2020 3c64 6976 2063 6c61 7373 r">.
< │ │ │ │ -00000c20: 6469 7620 636c 6173 733d 2274 6974 6c65 div class="title │ │ │ │ -00000c30: 223e 7370 7172 2e68 683c 2f64 6976 3e3c ">spqr.hh
< │ │ │ │ -00000c40: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>..
│ │ │ │ -00000c70: 0a3c 6120 6872 6566 3d22 6130 3031 3937 .Go to the │ │ │ │ -00000c90: 2064 6f63 756d 656e 7461 7469 6f6e 206f documentation o │ │ │ │ -00000ca0: 6620 7468 6973 2066 696c 652e 3c2f 613e f this file. │ │ │ │ -00000cb0: 3c64 6976 2063 6c61 7373 3d22 6672 6167
│ │ │ │ -00000d10: 2020 313c 2f73 7061 6e3e 3c73 7061 6e20 1 │ │ │ │ -00000d30: 2f2f 2053 5044 582d 4669 6c65 436f 7079 // SPDX-FileCopy │ │ │ │ -00000d40: 7269 6768 7454 6578 743a 2043 6f70 7972 rightText: Copyr │ │ │ │ -00000d50: 6967 6874 2028 4329 2044 554e 4520 5072 ight (C) DUNE Pr │ │ │ │ -00000d60: 6f6a 6563 7420 636f 6e74 7269 6275 746f oject contributo │ │ │ │ -00000d70: 7273 2c20 7365 6520 6669 6c65 204c 4943 rs, see file LIC │ │ │ │ -00000d80: 454e 5345 2e6d 6420 696e 206d 6f64 756c ENSE.md in modul │ │ │ │ -00000d90: 6520 726f 6f74 3c2f 7370 616e 3e3c 2f64 e root.
│ │ │ │ -00000df0: 323c 2f73 7061 6e3e 3c73 7061 6e20 636c 2// │ │ │ │ -00000e10: 2053 5044 582d 4c69 6365 6e73 652d 4964 SPDX-License-Id │ │ │ │ -00000e20: 656e 7469 6669 6572 3a20 4c69 6365 6e73 entifier: Licens │ │ │ │ -00000e30: 6552 6566 2d47 504c 2d32 2e30 2d6f 6e6c eRef-GPL-2.0-onl │ │ │ │ -00000e40: 792d 7769 7468 2d44 554e 452d 6578 6365 y-with-DUNE-exce │ │ │ │ -00000e50: 7074 696f 6e3c 2f73 7061 6e3e 3c2f 6469 ption.
3 │ │ │ │ -00000eb0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 // │ │ │ │ -00000ed0: 2d2a 2d20 7461 622d 7769 6474 683a 2034 -*- tab-width: 4 │ │ │ │ -00000ee0: 3b20 696e 6465 6e74 2d74 6162 732d 6d6f ; indent-tabs-mo │ │ │ │ -00000ef0: 6465 3a20 6e69 6c3b 2063 2d62 6173 6963 de: nil; c-basic │ │ │ │ -00000f00: 2d6f 6666 7365 743a 2032 202d 2a2d 3c2f -offset: 2 -*-
.
< │ │ │ │ -00000f50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00000f60: 6e6f 223e 2020 2020 343c 2f73 7061 6e3e no"> 4 │ │ │ │ -00000f70: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // vi: set │ │ │ │ -00000f90: 2065 7420 7473 3d34 2073 773d 3220 7374 et ts=4 sw=2 st │ │ │ │ -00000fa0: 733d 323a 3c2f 7370 616e 3e3c 2f64 6976 s=2:
.
5< │ │ │ │ -00001000: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#ifndef DUNE_IS │ │ │ │ -00001030: 544c 5f53 5051 525f 4848 3c2f 7370 616e TL_SPQR_HH
.
│ │ │ │ -00001090: 2020 2020 363c 2f73 7061 6e3e 3c73 7061 6#define D │ │ │ │ -000010c0: 554e 455f 4953 544c 5f53 5051 525f 4848 UNE_ISTL_SPQR_HH │ │ │ │ -000010d0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -000010f0: 3c61 2069 643d 226c 3030 3030 3722 206e 7
.
8#if HAV │ │ │ │ -000011b0: 455f 5355 4954 4553 5041 5253 455f 5350 E_SUITESPARSE_SP │ │ │ │ -000011c0: 5152 207c 7c20 6465 6669 6e65 6420 444f QR || defined DO │ │ │ │ -000011d0: 5859 4745 4e3c 2f73 7061 6e3e 3c2f 6469 XYGEN.
9 │ │ │ │ -00001230: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -00001240: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001250: 3e3c 6120 6964 3d22 6c30 3030 3130 2220 > 10
#i │ │ │ │ -000012b0: 6e63 6c75 6465 2026 6c74 3b63 6f6d 706c nclude <compl │ │ │ │ -000012c0: 6578 2667 743b 3c2f 7370 616e 3e3c 2f64 ex>.
1 │ │ │ │ -00001320: 313c 2f73 7061 6e3e 3c73 7061 6e20 636c 1#include < │ │ │ │ -00001350: 7479 7065 5f74 7261 6974 7326 6774 3b3c type_traits>< │ │ │ │ -00001360: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -00001380: 6120 6964 3d22 6c30 3030 3132 2220 6e61 a id="l00012" na │ │ │ │ -00001390: 6d65 3d22 6c30 3030 3132 223e 3c2f 613e me="l00012"> │ │ │ │ -000013a0: 3c73 7061 6e20 636c 6173 733d 226c 696e 12
.
13#include │ │ │ │ -00001440: 2026 6c74 3b53 7569 7465 5370 6172 7365 <SuiteSparse │ │ │ │ -00001450: 5152 2e68 7070 2667 743b 3c2f 7370 616e QR.hpp>
.
│ │ │ │ -000014b0: 2020 2031 343c 2f73 7061 6e3e 203c 2f64 14 .
1 │ │ │ │ -00001510: 353c 2f73 7061 6e3e 3c73 7061 6e20 636c 5#include < │ │ │ │ -00001540: 6475 6e65 2f63 6f6d 6d6f 6e2f 6578 6365 dune/common/exce │ │ │ │ -00001550: 7074 696f 6e73 2e68 6826 6774 3b3c 2f73 ptions.hh>
.
16 │ │ │ │ -000015c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00001610: 2020 3137 3c2f 7370 616e 3e3c 7370 616e 17#include & │ │ │ │ -00001640: 6c74 3b3c 6120 636c 6173 733d 2263 6f64 lt;dune/istl/ │ │ │ │ -00001670: 6263 6373 6d61 7472 6978 696e 6974 6961 bccsmatrixinitia │ │ │ │ -00001680: 6c69 7a65 722e 6868 3c2f 613e 2667 743b lizer.hh> │ │ │ │ -00001690: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -000016b0: 3c61 2069 643d 226c 3030 3031 3822 206e 18#in │ │ │ │ -00001710: 636c 7564 6520 266c 743b 3c61 2063 6c61 clude <dun │ │ │ │ -00001740: 652f 6973 746c 2f73 6f6c 7665 7273 2e68 e/istl/solvers.h │ │ │ │ -00001750: 683c 2f61 3e26 6774 3b3c 2f73 7061 6e3e h> │ │ │ │ -00001760: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -000017b0: 2020 3139 3c2f 7370 616e 3e3c 7370 616e 19#include & │ │ │ │ -000017e0: 6c74 3b3c 6120 636c 6173 733d 2263 6f64 lt;dune/istl/ │ │ │ │ -00001810: 736f 6c76 6572 7479 7065 2e68 683c 2f61 solvertype.hh>.
20 │ │ │ │ -00001880: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #include << │ │ │ │ -000018b0: 6120 636c 6173 733d 2263 6f64 6522 2068 a class="code" h │ │ │ │ -000018c0: 7265 663d 2261 3030 3137 392e 6874 6d6c ref="a00179.html │ │ │ │ -000018d0: 223e 6475 6e65 2f69 7374 6c2f 736f 6c76 ">dune/istl/solv │ │ │ │ -000018e0: 6572 6661 6374 6f72 792e 6868 3c2f 613e erfactory.hh │ │ │ │ -000018f0: 2667 743b 3c2f 7370 616e 3e3c 2f64 6976 >
.
21< │ │ │ │ -00001950: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -00001970: 3c61 2069 643d 226c 3030 3032 3222 206e 22namespac │ │ │ │ -000019d0: 6520 3c2f 7370 616e 3e3c 6120 636c 6173 e Dune {
.
34 │ │ │ │ -00001a70: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // forward │ │ │ │ -00001a90: 2064 6563 6c61 7261 7469 6f6e 733c 2f73 declarations
.
35 │ │ │ │ -00001b00: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template< │ │ │ │ -00001b20: 2f73 7061 6e3e 266c 743b 3c73 7061 6e20 /span>< │ │ │ │ -00001b40: 636c 6173 733c 2f73 7061 6e3e 204d 2c20 class M, │ │ │ │ -00001b50: 3c73 7061 6e20 636c 6173 733d 226b 6579 class T, clas │ │ │ │ -00001b90: 733c 2f73 7061 6e3e 2054 4d2c 203c 7370 s TM, class │ │ │ │ -00001bc0: 5444 2c20 3c73 7061 6e20 636c 6173 733d TD, class< │ │ │ │ -00001be0: 2f73 7061 6e3e 2054 4126 6774 3b3c 2f64 /span> TA>.
3 │ │ │ │ -00001c40: 363c 2f73 7061 6e3e 2020 3c73 7061 6e20 6 │ │ │ │ -00001c60: 636c 6173 7320 3c2f 7370 616e 3e53 6571 class Seq │ │ │ │ -00001c70: 4f76 6572 6c61 7070 696e 6753 6368 7761 OverlappingSchwa │ │ │ │ -00001c80: 727a 3b3c 2f64 6976 3e0a 3c64 6976 2063 rz;
.
37 < │ │ │ │ -00001ce0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00001d30: 2033 383c 2f73 7061 6e3e 2020 3c73 7061 38 template<class │ │ │ │ -00001d80: 3c2f 7370 616e 3e20 542c 203c 7370 616e T, bool │ │ │ │ -00001db0: 2074 6167 2667 743b 3c2f 6469 763e 0a3c tag>
.< │ │ │ │ -00001dc0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001dd0: 3e3c 6120 6964 3d22 6c30 3030 3339 2220 > 39
struc │ │ │ │ -00001e30: 7420 3c2f 7370 616e 3e53 6571 4f76 6572 t SeqOver │ │ │ │ -00001e40: 6c61 7070 696e 6753 6368 7761 727a 4173 lappingSchwarzAs │ │ │ │ -00001e50: 7365 6d62 6c65 7248 656c 7065 723b 3c2f semblerHelper;.
│ │ │ │ -00001eb0: 3430 3c2f 7370 616e 3e20 3c2f 6469 763e 40
│ │ │ │ -00001ec0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00001ef0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 46 tem │ │ │ │ -00001f30: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate< │ │ │ │ -00001f40: 3c73 7061 6e20 636c 6173 733d 226b 6579 class Matrix>.
.
47< │ │ │ │ -00002030: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> cl │ │ │ │ -00002050: 6173 7320 3c2f 7370 616e 3e3c 6120 636c ass SPQR< │ │ │ │ -00002090: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -000020e0: 2034 383c 2f73 7061 6e3e 2020 7b7d 3b3c 48 {};< │ │ │ │ -000020f0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
.< │ │ │ │ -00002110: 6120 6964 3d22 6c30 3030 3439 2220 6e61 a id="l00049" na │ │ │ │ -00002120: 6d65 3d22 6c30 3030 3439 223e 3c2f 613e me="l00049"> │ │ │ │ -00002130: 3c73 7061 6e20 636c 6173 733d 226c 696e 49
.
63 < │ │ │ │ -000021b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000021c0: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template<ty │ │ │ │ -000021f0: 7065 6e61 6d65 3c2f 7370 616e 3e20 542c pename T, │ │ │ │ -00002200: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typename< │ │ │ │ -00002220: 2f73 7061 6e3e 2041 2c20 3c73 7061 6e20 /span> A, int n │ │ │ │ -00002250: 2c20 3c73 7061 6e20 636c 6173 733d 226b , int< │ │ │ │ -00002270: 2f73 7061 6e3e 206d 2667 743b 3c2f 6469 /span> m>.
.
64 cla │ │ │ │ -00002360: 7373 203c 2f73 7061 6e3e 3c61 2063 6c61 ss SPQR&l │ │ │ │ -000023a0: 743b 3c61 2063 6c61 7373 3d22 636f 6465 t;BC │ │ │ │ -000023d0: 5253 4d61 7472 6978 3c2f 613e 266c 743b RSMatrix< │ │ │ │ -000023e0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel │ │ │ │ -00002410: 644d 6174 7269 783c 2f61 3e26 6c74 3b54 dMatrix<T │ │ │ │ -00002420: 2c6e 2c6d 2667 743b 2c41 2026 6774 3b20 ,n,m>,A > │ │ │ │ -00002430: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
65 │ │ │ │ -00002490: 2020 203a 203c 7370 616e 2063 6c61 7373 : publi │ │ │ │ -000024b0: 633c 2f73 7061 6e3e 203c 6120 636c 6173 c InverseOper │ │ │ │ -000024f0: 6174 6f72 3c2f 613e 266c 743b 426c 6f63 ator<Bloc │ │ │ │ -00002500: 6b56 6563 746f 7226 6c74 3b46 6965 6c64 kVector<Field │ │ │ │ -00002510: 5665 6374 6f72 266c 743b 542c 6d26 6774 Vector<T,m> │ │ │ │ -00002520: 3b2c 2074 7970 656e 616d 6520 7374 643a ;, typename std: │ │ │ │ -00002530: 3a61 6c6c 6f63 6174 6f72 5f74 7261 6974 :allocator_trait │ │ │ │ -00002540: 7326 6c74 3b41 2667 743b 3a3a 7465 6d70 s<A>::temp │ │ │ │ -00002550: 6c61 7465 2072 6562 696e 645f 616c 6c6f late rebind_allo │ │ │ │ -00002560: 6326 6c74 3b46 6965 6c64 5665 6374 6f72 c<FieldVector │ │ │ │ -00002570: 266c 743b 542c 6d26 6774 3b20 2667 743b <T,m> > │ │ │ │ -00002580: 2026 6774 3b2c 3c2f 6469 763e 0a3c 6469 >,
.< │ │ │ │ -000025a0: 6120 6964 3d22 6c30 3030 3636 2220 6e61 a id="l00066" na │ │ │ │ -000025b0: 6d65 3d22 6c30 3030 3636 223e 3c2f 613e me="l00066"> │ │ │ │ -000025c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 66 │ │ │ │ -000025f0: 2020 2020 2020 2020 2020 2020 2020 426c Bl │ │ │ │ -00002600: 6f63 6b56 6563 746f 7226 6c74 3b46 6965 ockVector<Fie │ │ │ │ -00002610: 6c64 5665 6374 6f72 266c 743b 542c 6e26 ldVector<T,n& │ │ │ │ -00002620: 6774 3b2c 2074 7970 656e 616d 6520 7374 gt;, typename st │ │ │ │ -00002630: 643a 3a61 6c6c 6f63 6174 6f72 5f74 7261 d::allocator_tra │ │ │ │ -00002640: 6974 7326 6c74 3b41 2667 743b 3a3a 7465 its<A>::te │ │ │ │ -00002650: 6d70 6c61 7465 2072 6562 696e 645f 616c mplate rebind_al │ │ │ │ -00002660: 6c6f 6326 6c74 3b46 6965 6c64 5665 6374 loc<FieldVect │ │ │ │ -00002670: 6f72 266c 743b 542c 6e26 6774 3b20 2667 or<T,n> &g │ │ │ │ -00002680: 743b 2026 6774 3b20 2667 743b 3c2f 6469 t; > >.
67 │ │ │ │ -000026e0: 3c2f 7370 616e 3e20 207b 3c2f 6469 763e {
│ │ │ │ -000026f0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00002720: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 68 p │ │ │ │ -00002760: 7562 6c69 633c 2f73 7061 6e3e 3a3c 2f64 ublic:. │ │ │ │ -00002900: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00002930: 3c2f 613e 3c73 7061 6e20 636c 6173 733d │ │ │ │ -00002990: 2020 3731 3c2f 613e 3c2f 7370 616e 3e20 71 │ │ │ │ -000029a0: 2020 203c 7370 616e 2063 6c61 7373 3d22 typedef │ │ │ │ -000029c0: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 Dune::BCRSMa │ │ │ │ -00002a00: 7472 6978 266c 743b 4669 656c 644d 6174 trix<FieldMat │ │ │ │ -00002a10: 7269 7826 6c74 3b54 2c6e 2c6d 2667 743b rix<T,n,m> │ │ │ │ -00002a20: 3c2f 613e 2c41 2667 743b 203c 6120 636c ,A> matr │ │ │ │ -00002a80: 6978 5f74 7970 653c 2f61 3e3b 3c2f 6469 ix_type;.
73 typed │ │ │ │ -00002b50: 6566 3c2f 7370 616e 3e20 4953 544c 3a3a ef ISTL:: │ │ │ │ -00002b60: 496d 706c 3a3a 4243 4353 4d61 7472 6978 Impl::BCCSMatrix │ │ │ │ -00002b70: 266c 743b 542c 696e 7426 6774 3b20 3c61 <T,int> S │ │ │ │ -00002bd0: 5051 524d 6174 7269 783c 2f61 3e3b 3c2f PQRMatrix;.
75 typ │ │ │ │ -00002ca0: 6564 6566 3c2f 7370 616e 3e20 4953 544c edef ISTL │ │ │ │ -00002cb0: 3a3a 496d 706c 3a3a 4243 4353 4d61 7472 ::Impl::BCCSMatr │ │ │ │ -00002cc0: 6978 496e 6974 6961 6c69 7a65 7226 6c74 ixInitializer< │ │ │ │ -00002cd0: 3b42 4352 534d 6174 7269 7826 6c74 3b46 ;BCRSMatrix<F │ │ │ │ -00002ce0: 6965 6c64 4d61 7472 6978 266c 743b 542c ieldMatrix<T, │ │ │ │ -00002cf0: 6e2c 6d26 6774 3b2c 4126 6774 3b2c 203c n,m>,A>, < │ │ │ │ -00002d00: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00002d10: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int> MatrixI │ │ │ │ -00002d80: 6e69 7469 616c 697a 6572 3c2f 613e 3b3c nitializer;< │ │ │ │ -00002d90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
77 ty │ │ │ │ -00002e50: 7065 6465 663c 2f73 7061 6e3e 203c 6120 pedef Dune::B │ │ │ │ -00002e90: 6c6f 636b 5665 6374 6f72 266c 743b 4669 lockVector<Fi │ │ │ │ -00002ea0: 656c 6456 6563 746f 7226 6c74 3b54 2c6d eldVector<T,m │ │ │ │ -00002eb0: 2667 743b 3c2f 613e 2c20 3c73 7061 6e20 >, │ │ │ │ -00002ed0: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename │ │ │ │ -00002ee0: 7374 643a 3a61 6c6c 6f63 6174 6f72 5f74 std::allocator_t │ │ │ │ -00002ef0: 7261 6974 7326 6c74 3b41 2667 743b 3a3a raits<A>:: │ │ │ │ -00002f00: 7465 6d70 6c61 7465 2072 6562 696e 645f template rebind_ │ │ │ │ -00002f10: 616c 6c6f 6326 6c74 3b46 6965 6c64 5665 alloc<FieldVe │ │ │ │ -00002f20: 6374 6f72 266c 743b 542c 6d26 6774 3b20 ctor<T,m> │ │ │ │ -00002f30: 2667 743b 2026 6774 3b20 3c61 2063 6c61 > > domai │ │ │ │ -00002f90: 6e5f 7479 7065 3c2f 613e 3b3c 2f64 6976 n_type;
.
│ │ │ │ -00003030: 2020 2037 393c 2f61 3e3c 2f73 7061 6e3e 79 │ │ │ │ -00003040: 2020 2020 3c73 7061 6e20 636c 6173 733d typede │ │ │ │ -00003060: 663c 2f73 7061 6e3e 203c 6120 636c 6173 f Dune::Block │ │ │ │ -000030a0: 5665 6374 6f72 266c 743b 4669 656c 6456 Vector<FieldV │ │ │ │ -000030b0: 6563 746f 7226 6c74 3b54 2c6e 2667 743b ector<T,n> │ │ │ │ -000030c0: 3c2f 613e 2c20 3c73 7061 6e20 636c 6173 , type │ │ │ │ -000030e0: 6e61 6d65 3c2f 7370 616e 3e20 7374 643a name std: │ │ │ │ -000030f0: 3a61 6c6c 6f63 6174 6f72 5f74 7261 6974 :allocator_trait │ │ │ │ -00003100: 7326 6c74 3b41 2667 743b 3a3a 7465 6d70 s<A>::temp │ │ │ │ -00003110: 6c61 7465 2072 6562 696e 645f 616c 6c6f late rebind_allo │ │ │ │ -00003120: 6326 6c74 3b46 6965 6c64 5665 6374 6f72 c<FieldVector │ │ │ │ -00003130: 266c 743b 542c 6e26 6774 3b20 2667 743b <T,n> > │ │ │ │ -00003140: 2026 6774 3b20 3c61 2063 6c61 7373 3d22 > range_typ │ │ │ │ -000031a0: 653c 2f61 3e3b 3c2f 6469 763e 0a3c 6469 e;
.< │ │ │ │ -000031c0: 6120 6964 3d22 6c30 3030 3830 2220 6e61 a id="l00080" na │ │ │ │ -000031d0: 6d65 3d22 6c30 3030 3830 223e 3c2f 613e me="l00080"> │ │ │ │ -000031e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 80
.
.< │ │ │ │ -00003250: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00003260: 3e3c 6120 6964 3d22 6c30 3030 3832 2220 > │ │ │ │ -000032e0: 3832 3c2f 613e 3c2f 7370 616e 3e20 2020 82 │ │ │ │ -000032f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 virtual Solver │ │ │ │ -00003370: 4361 7465 676f 7279 3a3a 4361 7465 676f Category::Catego │ │ │ │ -00003380: 7279 3c2f 613e 203c 6120 636c 6173 733d ry categor │ │ │ │ -000033e0: 793c 2f61 3e28 293c 7370 616e 2063 6c61 y() co │ │ │ │ -00003400: 6e73 743c 2f73 7061 6e3e 3c2f 6469 763e nst
│ │ │ │ -00003410: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00003440: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 83 < │ │ │ │ -00003480: 2f73 7061 6e3e 7b3c 2f64 6976 3e0a 3c64 /span>{
. │ │ │ │ -000034a0: 3c61 2069 643d 226c 3030 3038 3422 206e 84 return │ │ │ │ -00003510: 3c61 2063 6c61 7373 3d22 636f 6465 2068 SolverCategor │ │ │ │ -00003590: 793a 3a43 6174 6567 6f72 793a 3a73 6571 y::Category::seq │ │ │ │ -000035a0: 7565 6e74 6961 6c3c 2f61 3e3b 3c2f 6469 uential;.
85 │ │ │ │ -00003600: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
.
86 < │ │ │ │ -00003670: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
..
96< │ │ │ │ -000038d0: 2f73 7061 6e3e 2020 2020 7b3c 2f64 6976 /span> {
.
97< │ │ │ │ -00003930: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> //check whethe │ │ │ │ -00003960: 7220 5420 6973 2061 2073 7570 706f 7274 r T is a support │ │ │ │ -00003970: 6564 2074 7970 653c 2f73 7061 6e3e 3c2f ed type.
│ │ │ │ -000039d0: 3938 3c2f 7370 616e 3e20 2020 2020 203c 98 < │ │ │ │ -000039e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000039f0: 6f72 6422 3e73 7461 7469 635f 6173 7365 ord">static_asse │ │ │ │ -00003a00: 7274 3c2f 7370 616e 3e28 2873 7464 3a3a rt((std:: │ │ │ │ -00003a10: 6973 5f73 616d 6526 6c74 3b54 2c64 6f75 is_same<T,dou │ │ │ │ -00003a20: 626c 6526 6774 3b3a 3a76 616c 7565 2920 ble>::value) │ │ │ │ -00003a30: 7c7c 2028 7374 643a 3a69 735f 7361 6d65 || (std::is_same │ │ │ │ -00003a40: 266c 743b 542c 7374 643a 3a63 6f6d 706c <T,std::compl │ │ │ │ -00003a50: 6578 266c 743b 646f 7562 6c65 2667 743b ex<double> │ │ │ │ -00003a60: 2026 6774 3b3a 3a76 616c 7565 292c 3c2f >::value),.
│ │ │ │ -00003ac0: 3939 3c2f 7370 616e 3e20 2020 2020 2020 99 │ │ │ │ -00003ad0: 2020 2020 2020 2020 2020 2020 203c 7370 "U │ │ │ │ -00003b00: 6e73 7570 706f 7274 6564 2054 7970 6520 nsupported Type │ │ │ │ -00003b10: 696e 2053 5051 5220 286f 6e6c 7920 646f in SPQR (only do │ │ │ │ -00003b20: 7562 6c65 2061 6e64 2073 7464 3a3a 636f uble and std::co │ │ │ │ -00003b30: 6d70 6c65 7826 6c74 3b64 6f75 626c 6526 mplex<double& │ │ │ │ -00003b40: 6774 3b20 7375 7070 6f72 7465 6429 2671 gt; supported)&q │ │ │ │ -00003b50: 756f 743b 3c2f 7370 616e 3e29 3b3c 2f64 uot;);.
10 │ │ │ │ -00003bb0: 303c 2f73 7061 6e3e 2020 2020 2020 6363 0 cc │ │ │ │ -00003bc0: 5f20 3d20 3c73 7061 6e20 636c 6173 733d _ = new cholmod_com │ │ │ │ -00003bf0: 6d6f 6e28 293b 3c2f 6469 763e 0a3c 6469 mon();
.< │ │ │ │ -00003c10: 6120 6964 3d22 6c30 3031 3031 2220 6e61 a id="l00101" na │ │ │ │ -00003c20: 6d65 3d22 6c30 3031 3031 223e 3c2f 613e me="l00101"> │ │ │ │ -00003c30: 3c73 7061 6e20 636c 6173 733d 226c 696e 101 cholmod_l │ │ │ │ -00003c60: 5f73 7461 7274 2863 635f 293b 3c2f 6469 _start(cc_);.
102 │ │ │ │ -00003cc0: 3c2f 7370 616e 3e20 2020 2020 2073 6574 set │ │ │ │ -00003cd0: 4d61 7472 6978 286d 6174 7269 7829 3b3c Matrix(matrix);< │ │ │ │ -00003ce0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00003d30: 3130 333c 2f73 7061 6e3e 2020 2020 7d3c 103 }< │ │ │ │ -00003d40: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
.< │ │ │ │ -00003d60: 6120 6964 3d22 6c30 3031 3034 2220 6e61 a id="l00104" na │ │ │ │ -00003d70: 6d65 3d22 6c30 3031 3034 223e 3c2f 613e me="l00104"> │ │ │ │ -00003d80: 3c73 7061 6e20 636c 6173 733d 226c 696e 104
.
.< │ │ │ │ -00003df0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00003e00: 3e3c 6120 6964 3d22 6c30 3031 3133 2220 > 1 │ │ │ │ -00003e80: 3133 3c2f 613e 3c2f 7370 616e 3e20 2020 13 │ │ │ │ -00003e90: 203c 6120 636c 6173 733d 2263 6f64 6520 SPQR(const < │ │ │ │ -00003f10: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00003f20: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ │ -00003f30: 3131 3532 2e68 746d 6c22 3e4d 6174 7269 1152.html">Matri │ │ │ │ -00003f40: 783c 2f61 3e26 616d 703b 206d 6174 7269 x& matri │ │ │ │ -00003f50: 782c 203c 7370 616e 2063 6c61 7373 3d22 x, int │ │ │ │ -00003f70: 3c2f 7370 616e 3e20 7665 7262 6f73 652c verbose, │ │ │ │ -00003f80: 203c 7370 616e 2063 6c61 7373 3d22 6b65 bool< │ │ │ │ -00003fa0: 2f73 7061 6e3e 2920 3a20 6d61 7472 6978 /span>) : matrix │ │ │ │ -00003fb0: 4973 4c6f 6164 6564 5f28 6661 6c73 6529 IsLoaded_(false) │ │ │ │ -00003fc0: 2c20 7665 7262 6f73 655f 2876 6572 626f , verbose_(verbo │ │ │ │ -00003fd0: 7365 293c 2f64 6976 3e0a 3c64 6976 2063 se)
.
114 │ │ │ │ -00004030: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
115 │ │ │ │ -00004090: 2020 2020 3c73 7061 6e20 636c 6173 733d //chec │ │ │ │ -000040b0: 6b20 7768 6574 6865 7220 5420 6973 2061 k whether T is a │ │ │ │ -000040c0: 2073 7570 706f 7274 6564 2074 7970 653c supported type< │ │ │ │ -000040d0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -000040f0: 6120 6964 3d22 6c30 3031 3136 2220 6e61 a id="l00116" na │ │ │ │ -00004100: 6d65 3d22 6c30 3031 3136 223e 3c2f 613e me="l00116"> │ │ │ │ -00004110: 3c73 7061 6e20 636c 6173 733d 226c 696e 116 sta │ │ │ │ -00004150: 7469 635f 6173 7365 7274 3c2f 7370 616e tic_assert((std::is_same& │ │ │ │ -00004170: 6c74 3b54 2c64 6f75 626c 6526 6774 3b3a lt;T,double>: │ │ │ │ -00004180: 3a76 616c 7565 2920 7c7c 2028 7374 643a :value) || (std: │ │ │ │ -00004190: 3a69 735f 7361 6d65 266c 743b 542c 7374 :is_same<T,st │ │ │ │ -000041a0: 643a 3a63 6f6d 706c 6578 266c 743b 646f d::complex<do │ │ │ │ -000041b0: 7562 6c65 2667 743b 2026 6774 3b3a 3a76 uble> >::v │ │ │ │ -000041c0: 616c 7565 292c 3c2f 6469 763e 0a3c 6469 alue),
.< │ │ │ │ -000041e0: 6120 6964 3d22 6c30 3031 3137 2220 6e61 a id="l00117" na │ │ │ │ -000041f0: 6d65 3d22 6c30 3031 3137 223e 3c2f 613e me="l00117"> │ │ │ │ -00004200: 3c73 7061 6e20 636c 6173 733d 226c 696e 117 │ │ │ │ -00004230: 2020 2020 203c 7370 616e 2063 6c61 7373 "Unsupport │ │ │ │ -00004260: 6564 2054 7970 6520 696e 2053 5051 5220 ed Type in SPQR │ │ │ │ -00004270: 286f 6e6c 7920 646f 7562 6c65 2061 6e64 (only double and │ │ │ │ -00004280: 2073 7464 3a3a 636f 6d70 6c65 7826 6c74 std::complex< │ │ │ │ -00004290: 3b64 6f75 626c 6526 6774 3b20 7375 7070 ;double> supp │ │ │ │ -000042a0: 6f72 7465 6429 2671 756f 743b 3c2f 7370 orted)");
.
< │ │ │ │ -000042f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00004300: 6e6f 223e 2020 3131 383c 2f73 7061 6e3e no"> 118 │ │ │ │ -00004310: 2020 2020 2020 6363 5f20 3d20 3c73 7061 cc_ = new cho │ │ │ │ -00004340: 6c6d 6f64 5f63 6f6d 6d6f 6e28 293b 3c2f lmod_common();.
1 │ │ │ │ -000043a0: 3139 3c2f 7370 616e 3e20 2020 2020 2063 19 c │ │ │ │ -000043b0: 686f 6c6d 6f64 5f6c 5f73 7461 7274 2863 holmod_l_start(c │ │ │ │ -000043c0: 635f 293b 3c2f 6469 763e 0a3c 6469 7620 c_);
.
120 │ │ │ │ -00004420: 2020 2020 2073 6574 4d61 7472 6978 286d setMatrix(m │ │ │ │ -00004430: 6174 7269 7829 3b3c 2f64 6976 3e0a 3c64 atrix);
. │ │ │ │ -00004450: 3c61 2069 643d 226c 3030 3132 3122 206e 121
}
..
1 │ │ │ │ -000044f0: 3232 3c2f 7370 616e 3e20 3c2f 6469 763e 22
│ │ │ │ -00004500: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
.
< │ │ │ │ -00004590: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -000045a0: 7265 663d 2261 3030 3233 332e 6874 6d6c ref="a00233.html │ │ │ │ -000045b0: 2367 6162 3962 6664 6435 3531 3334 3765 #gab9bfdd551347e │ │ │ │ -000045c0: 6336 3064 6432 3265 6461 3533 3532 3933 c60dd22eda535293 │ │ │ │ -000045d0: 6536 3322 3e20 2031 3332 3c2f 613e 3c2f e63"> 132 SPQR< │ │ │ │ -00004640: 2f61 3e28 3c73 7061 6e20 636c 6173 733d /a>(const< │ │ │ │ -00004660: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> Matrix&am │ │ │ │ -000046a0: 703b 206d 6174 7269 782c 203c 7370 616e p; matrix, const Pa │ │ │ │ -000046d0: 7261 6d65 7465 7254 7265 6526 616d 703b rameterTree& │ │ │ │ -000046e0: 2063 6f6e 6669 6729 3c2f 6469 763e 0a3c config)
.< │ │ │ │ -000046f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00004700: 3e3c 6120 6964 3d22 6c30 3031 3333 2220 > 133 : SPQR( │ │ │ │ -00004780: 6d61 7472 6978 2c20 636f 6e66 6967 2e3c matrix, config.< │ │ │ │ -00004790: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -000047a0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ -000047b0: 2261 3030 3234 392e 6874 6d6c 2361 3334 "a00249.html#a34 │ │ │ │ -000047c0: 6637 3563 3538 6536 3536 3832 3362 3538 f75c58e656823b58 │ │ │ │ -000047d0: 6533 6166 3137 6330 3966 6230 3365 223e e3af17c09fb03e"> │ │ │ │ -000047e0: 6765 743c 2f61 3e26 6c74 3b69 6e74 2667 get<int&g │ │ │ │ -000047f0: 743b 283c 7370 616e 2063 6c61 7373 3d22 t;(& │ │ │ │ -00004810: 7175 6f74 3b76 6572 626f 7365 2671 756f quot;verbose&quo │ │ │ │ -00004820: 743b 3c2f 7370 616e 3e2c 2030 2929 3c2f t;, 0)).
1 │ │ │ │ -00004880: 3334 3c2f 7370 616e 3e20 2020 207b 7d3c 34 {}< │ │ │ │ -00004890: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
.< │ │ │ │ -000048b0: 6120 6964 3d22 6c30 3031 3335 2220 6e61 a id="l00135" na │ │ │ │ -000048c0: 6d65 3d22 6c30 3031 3335 223e 3c2f 613e me="l00135"> │ │ │ │ -000048d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 135
.
.< │ │ │ │ -00004940: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00004950: 3e3c 6120 6964 3d22 6c30 3031 3337 2220 > 1 │ │ │ │ -000049d0: 3337 3c2f 613e 3c2f 7370 616e 3e20 2020 37 │ │ │ │ -000049e0: 203c 6120 636c 6173 733d 2263 6f64 6520 SPQR() : │ │ │ │ -00004a40: 6d61 7472 6978 4973 4c6f 6164 6564 5f28 matrixIsLoaded_( │ │ │ │ -00004a50: 6661 6c73 6529 2c20 7665 7262 6f73 655f false), verbose_ │ │ │ │ -00004a60: 2830 293c 2f64 6976 3e0a 3c64 6976 2063 (0)
.
138 │ │ │ │ -00004ac0: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
139 │ │ │ │ -00004b20: 2020 2020 3c73 7061 6e20 636c 6173 733d //chec │ │ │ │ -00004b40: 6b20 7768 6574 6865 7220 5420 6973 2061 k whether T is a │ │ │ │ -00004b50: 2073 7570 706f 7274 6564 2074 7970 653c supported type< │ │ │ │ -00004b60: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -00004b80: 6120 6964 3d22 6c30 3031 3430 2220 6e61 a id="l00140" na │ │ │ │ -00004b90: 6d65 3d22 6c30 3031 3430 223e 3c2f 613e me="l00140"> │ │ │ │ -00004ba0: 3c73 7061 6e20 636c 6173 733d 226c 696e 140 sta │ │ │ │ -00004be0: 7469 635f 6173 7365 7274 3c2f 7370 616e tic_assert((std::is_same& │ │ │ │ -00004c00: 6c74 3b54 2c64 6f75 626c 6526 6774 3b3a lt;T,double>: │ │ │ │ -00004c10: 3a76 616c 7565 2920 7c7c 2028 7374 643a :value) || (std: │ │ │ │ -00004c20: 3a69 735f 7361 6d65 266c 743b 542c 7374 :is_same<T,st │ │ │ │ -00004c30: 643a 3a63 6f6d 706c 6578 266c 743b 646f d::complex<do │ │ │ │ -00004c40: 7562 6c65 2667 743b 2026 6774 3b3a 3a76 uble> >::v │ │ │ │ -00004c50: 616c 7565 292c 3c2f 6469 763e 0a3c 6469 alue),
.< │ │ │ │ -00004c70: 6120 6964 3d22 6c30 3031 3431 2220 6e61 a id="l00141" na │ │ │ │ -00004c80: 6d65 3d22 6c30 3031 3431 223e 3c2f 613e me="l00141"> │ │ │ │ -00004c90: 3c73 7061 6e20 636c 6173 733d 226c 696e 141 │ │ │ │ -00004cc0: 2020 2020 203c 7370 616e 2063 6c61 7373 "Unsupport │ │ │ │ -00004cf0: 6564 2054 7970 6520 696e 2053 5051 5220 ed Type in SPQR │ │ │ │ -00004d00: 286f 6e6c 7920 646f 7562 6c65 2061 6e64 (only double and │ │ │ │ -00004d10: 2073 7464 3a3a 636f 6d70 6c65 7826 6c74 std::complex< │ │ │ │ -00004d20: 3b64 6f75 626c 6526 6774 3b20 7375 7070 ;double> supp │ │ │ │ -00004d30: 6f72 7465 6429 2671 756f 743b 3c2f 7370 orted)");
.
< │ │ │ │ -00004d80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00004d90: 6e6f 223e 2020 3134 323c 2f73 7061 6e3e no"> 142 │ │ │ │ -00004da0: 2020 2020 2020 6363 5f20 3d20 3c73 7061 cc_ = new cho │ │ │ │ -00004dd0: 6c6d 6f64 5f63 6f6d 6d6f 6e28 293b 3c2f lmod_common();.
1 │ │ │ │ -00004e30: 3433 3c2f 7370 616e 3e20 2020 2020 2063 43 c │ │ │ │ -00004e40: 686f 6c6d 6f64 5f6c 5f73 7461 7274 2863 holmod_l_start(c │ │ │ │ -00004e50: 635f 293b 3c2f 6469 763e 0a3c 6469 7620 c_);
.
144 │ │ │ │ -00004eb0: 2020 207d 3c2f 6469 763e 0a3c 2f64 6976 }
.
.
145< │ │ │ │ -00004f10: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
..
147 virt │ │ │ │ -00005020: 7561 6c3c 2f73 7061 6e3e 203c 6120 636c ual ~SP │ │ │ │ -00005080: 5152 3c2f 613e 2829 3c2f 6469 763e 0a3c QR()
.< │ │ │ │ -00005090: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -000050a0: 3e3c 6120 6964 3d22 6c30 3031 3438 2220 > 148 {
.< │ │ │ │ -000050f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00005100: 3e3c 6120 6964 3d22 6c30 3031 3439 2220 > 149 if ((s │ │ │ │ -00005170: 7071 724d 6174 7269 785f 2e4e 2829 202b pqrMatrix_.N() + │ │ │ │ -00005180: 2073 7071 724d 6174 7269 785f 2e4d 2829 spqrMatrix_.M() │ │ │ │ -00005190: 2026 6774 3b20 3029 207c 7c20 6d61 7472 > 0) || matr │ │ │ │ -000051a0: 6978 4973 4c6f 6164 6564 5f29 3c2f 6469 ixIsLoaded_).
150 │ │ │ │ -00005200: 3c2f 7370 616e 3e20 2020 2020 2020 2066 f │ │ │ │ -00005210: 7265 6528 293b 3c2f 6469 763e 0a3c 6469 ree();
.< │ │ │ │ -00005230: 6120 6964 3d22 6c30 3031 3531 2220 6e61 a id="l00151" na │ │ │ │ -00005240: 6d65 3d22 6c30 3031 3531 223e 3c2f 613e me="l00151"> │ │ │ │ -00005250: 3c73 7061 6e20 636c 6173 733d 226c 696e 151 cholmod_l │ │ │ │ -00005280: 5f66 696e 6973 6828 6363 5f29 3b3c 2f64 _finish(cc_);.
15 │ │ │ │ -000052e0: 323c 2f73 7061 6e3e 2020 2020 7d3c 2f64 2 }.
.
153 │ │ │ │ -00005350: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -000053b0: 6120 6964 3d22 6c30 3031 3535 2220 6e61 a id="l00155" na │ │ │ │ -000053c0: 6d65 3d22 6c30 3031 3535 223e 3c2f 613e me="l00155"> │ │ │ │ -000053d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 155 │ │ │ │ -00005430: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -00005440: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00005450: 6f72 6422 3e76 6972 7475 616c 3c2f 7370 ord">virtual vo │ │ │ │ -00005480: 6964 3c2f 7370 616e 3e20 3c61 2063 6c61 id appl │ │ │ │ -000054e0: 793c 2f61 3e28 3c61 2063 6c61 7373 3d22 y(domain_type& x, range_type │ │ │ │ -00005560: 3c2f 613e 2661 6d70 3b20 622c 203c 6120 & b, Invers │ │ │ │ -000055a0: 654f 7065 7261 746f 7252 6573 756c 743c eOperatorResult< │ │ │ │ -000055b0: 2f61 3e26 616d 703b 2072 6573 293c 2f64 /a>& res).
15 │ │ │ │ -00005610: 363c 2f73 7061 6e3e 2020 2020 7b3c 2f64 6 {.
15 │ │ │ │ -00005670: 373c 2f73 7061 6e3e 2020 2020 2020 3c73 7 const │ │ │ │ -000056a0: 2073 7464 3a3a 7369 7a65 5f74 206e 756d std::size_t num │ │ │ │ -000056b0: 526f 7773 2873 7071 724d 6174 7269 785f Rows(spqrMatrix_ │ │ │ │ -000056c0: 2e4e 2829 293b 3c2f 6469 763e 0a3c 6469 .N());
.< │ │ │ │ -000056e0: 6120 6964 3d22 6c30 3031 3538 2220 6e61 a id="l00158" na │ │ │ │ -000056f0: 6d65 3d22 6c30 3031 3538 223e 3c2f 613e me="l00158"> │ │ │ │ -00005700: 3c73 7061 6e20 636c 6173 733d 226c 696e 158 // │ │ │ │ -00005740: 6669 6c6c 2042 3c2f 7370 616e 3e3c 2f64 fill B.
15 │ │ │ │ -000057a0: 393c 2f73 7061 6e3e 2020 2020 2020 3c73 9 for(std::size_t k │ │ │ │ -000057e0: 203d 2030 3b20 6b20 213d 206e 756d 526f = 0; k != numRo │ │ │ │ -000057f0: 7773 2f6e 3b20 2b2b 6b29 3c2f 6469 763e ws/n; ++k)
│ │ │ │ -00005800: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00005830: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 160 for (int │ │ │ │ -000058a0: 3c2f 7370 616e 3e20 6c20 3d20 303b 206c l = 0; l │ │ │ │ -000058b0: 2026 6c74 3b20 6e3b 202b 2b6c 293c 2f64 < n; ++l).
16 │ │ │ │ -00005910: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ -00005920: 2020 283c 7370 616e 2063 6c61 7373 3d22 (static_ │ │ │ │ -00005940: 6361 7374 266c 743b 3c2f 7370 616e 3e54 cast<T │ │ │ │ -00005950: 2a3c 7370 616e 2063 6c61 7373 3d22 6b65 *>(B_->x))[n* │ │ │ │ -00005980: 6b2b 6c5d 203d 2062 5b6b 5d5b 6c5d 3b3c k+l] = b[k][l];< │ │ │ │ -00005990: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -000059e0: 3136 323c 2f73 7061 6e3e 203c 2f64 6976 162
.
163< │ │ │ │ -00005a40: 2f73 7061 6e3e 2020 2020 2020 6368 6f6c /span> chol │ │ │ │ -00005a50: 6d6f 645f 6465 6e73 652a 2042 5465 6d70 mod_dense* BTemp │ │ │ │ -00005a60: 203d 2042 5f3b 3c2f 6469 763e 0a3c 6469 = B_;
.< │ │ │ │ -00005a80: 6120 6964 3d22 6c30 3031 3634 2220 6e61 a id="l00164" na │ │ │ │ -00005a90: 6d65 3d22 6c30 3031 3634 223e 3c2f 613e me="l00164"> │ │ │ │ -00005aa0: 3c73 7061 6e20 636c 6173 733d 226c 696e 164 B_ = Suit │ │ │ │ -00005ad0: 6553 7061 7273 6551 525f 716d 756c 7426 eSparseQR_qmult& │ │ │ │ -00005ae0: 6c74 3b54 2667 743b 2830 2c20 7370 7172 lt;T>(0, spqr │ │ │ │ -00005af0: 6661 6374 6f72 697a 6174 696f 6e5f 2c20 factorization_, │ │ │ │ -00005b00: 425f 2c20 6363 5f29 3b3c 2f64 6976 3e0a B_, cc_);
. │ │ │ │ -00005b10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
│ │ │ │ -00005bc0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00005bf0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 166 cholm │ │ │ │ -00005c20: 6f64 5f6c 5f66 7265 655f 6465 6e73 6528 od_l_free_dense( │ │ │ │ -00005c30: 2661 6d70 3b42 5465 6d70 2c20 6363 5f29 &BTemp, cc_) │ │ │ │ -00005c40: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00005c90: 2020 3136 373c 2f73 7061 6e3e 203c 2f64 167 .
16 │ │ │ │ -00005cf0: 383c 2f73 7061 6e3e 2020 2020 2020 3c73 8 const │ │ │ │ -00005d20: 2073 7464 3a3a 7369 7a65 5f74 206e 756d std::size_t num │ │ │ │ -00005d30: 436f 6c73 2873 7071 724d 6174 7269 785f Cols(spqrMatrix_ │ │ │ │ -00005d40: 2e4d 2829 293b 3c2f 6469 763e 0a3c 6469 .M());
.< │ │ │ │ -00005d60: 6120 6964 3d22 6c30 3031 3639 2220 6e61 a id="l00169" na │ │ │ │ -00005d70: 6d65 3d22 6c30 3031 3639 223e 3c2f 613e me="l00169"> │ │ │ │ -00005d80: 3c73 7061 6e20 636c 6173 733d 226c 696e 169 // │ │ │ │ -00005dc0: 6669 6c6c 2078 3c2f 7370 616e 3e3c 2f64 fill x.
17 │ │ │ │ -00005e20: 303c 2f73 7061 6e3e 2020 2020 2020 3c73 0 for(std::size_t k │ │ │ │ -00005e60: 203d 2030 3b20 6b20 213d 206e 756d 436f = 0; k != numCo │ │ │ │ -00005e70: 6c73 2f6d 3b20 2b2b 6b29 3c2f 6469 763e ls/m; ++k)
│ │ │ │ -00005e80: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00005eb0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 171 for (int │ │ │ │ -00005f20: 3c2f 7370 616e 3e20 6c20 3d20 303b 206c l = 0; l │ │ │ │ -00005f30: 2026 6c74 3b20 6d3b 202b 2b6c 293c 2f64 < m; ++l).
17 │ │ │ │ -00005f90: 323c 2f73 7061 6e3e 2020 2020 2020 2020 2 │ │ │ │ -00005fa0: 2020 785b 6b5d 5b6c 5d20 3d20 283c 7370 x[k][l] = (static_cast&l │ │ │ │ -00005fd0: 743b 3c2f 7370 616e 3e54 2a3c 7370 616e t;T*>(X-& │ │ │ │ -00006000: 6774 3b78 2929 5b6d 2a6b 2b6c 5d3b 3c2f gt;x))[m*k+l];.
1 │ │ │ │ -00006060: 3733 3c2f 7370 616e 3e20 3c2f 6469 763e 73
│ │ │ │ -00006070: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -000060a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 174 cholm │ │ │ │ -000060d0: 6f64 5f6c 5f66 7265 655f 6465 6e73 6528 od_l_free_dense( │ │ │ │ -000060e0: 2661 6d70 3b58 2c20 6363 5f29 3b3c 2f64 &X, cc_);.
17 │ │ │ │ -00006140: 353c 2f73 7061 6e3e 2020 2020 2020 3c73 5 // this is a │ │ │ │ -00006170: 2064 6972 6563 7420 736f 6c76 6572 3c2f direct solver
.
< │ │ │ │ -000061c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000061d0: 6e6f 223e 2020 3137 363c 2f73 7061 6e3e no"> 176 │ │ │ │ -000061e0: 2020 2020 2020 7265 732e 3c61 2063 6c61 res.itera │ │ │ │ -00006240: 7469 6f6e 733c 2f61 3e20 3d20 313b 3c2f tions = 1;.
1 │ │ │ │ -000062a0: 3737 3c2f 7370 616e 3e20 2020 2020 2072 77 r │ │ │ │ -000062b0: 6573 2e3c 6120 636c 6173 733d 2263 6f64 es.converged = true;
.< │ │ │ │ -00006350: 6120 6964 3d22 6c30 3031 3738 2220 6e61 a id="l00178" na │ │ │ │ -00006360: 6d65 3d22 6c30 3031 3738 223e 3c2f 613e me="l00178"> │ │ │ │ -00006370: 3c73 7061 6e20 636c 6173 733d 226c 696e 178 if(verbo │ │ │ │ -000063c0: 7365 5f20 2667 743b 2030 293c 2f64 6976 se_ > 0)
.
179< │ │ │ │ -00006420: 2f73 7061 6e3e 2020 2020 2020 7b3c 2f64 /span> {.
18 │ │ │ │ -00006480: 303c 2f73 7061 6e3e 2020 2020 2020 2020 0 │ │ │ │ -00006490: 7374 643a 3a63 6f75 7426 6c74 3b26 6c74 std::cout<< │ │ │ │ -000064a0: 3b73 7464 3a3a 656e 646c 266c 743b 266c ;std::endl<&l │ │ │ │ -000064b0: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ -000064d0: 756f 743b 536f 6c76 696e 6720 7769 7468 uot;Solving with │ │ │ │ -000064e0: 2053 7569 7465 5370 6172 7365 5152 2671 SuiteSparseQR&q │ │ │ │ -000064f0: 756f 743b 3c2f 7370 616e 3e26 6c74 3b26 uot;<& │ │ │ │ -00006500: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
18 │ │ │ │ -00006560: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ -00006570: 7374 643a 3a63 6f75 7426 6c74 3b26 6c74 std::cout<< │ │ │ │ -00006580: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ -000065a0: 6f74 3b46 6c6f 7073 2054 616b 656e 3a20 ot;Flops Taken: │ │ │ │ -000065b0: 2671 756f 743b 3c2f 7370 616e 3e26 6c74 "< │ │ │ │ -000065c0: 3b26 6c74 3b63 635f 2d26 6774 3b53 5051 ;<cc_->SPQ │ │ │ │ -000065d0: 525f 666c 6f70 636f 756e 7426 6c74 3b26 R_flopcount<& │ │ │ │ -000065e0: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
18 │ │ │ │ -00006640: 323c 2f73 7061 6e3e 2020 2020 2020 2020 2 │ │ │ │ -00006650: 7374 643a 3a63 6f75 7426 6c74 3b26 6c74 std::cout<< │ │ │ │ -00006660: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ -00006680: 6f74 3b41 6e61 6c79 7369 7320 5469 6d65 ot;Analysis Time │ │ │ │ -00006690: 3a20 2671 756f 743b 3c2f 7370 616e 3e26 : "& │ │ │ │ -000066a0: 6c74 3b26 6c74 3b63 635f 2d26 6774 3b53 lt;<cc_->S │ │ │ │ -000066b0: 5051 525f 616e 616c 797a 655f 7469 6d65 PQR_analyze_time │ │ │ │ -000066c0: 266c 743b 266c 743b 3c73 7061 6e20 636c <<" s&quo │ │ │ │ -000066f0: 743b 3c2f 7370 616e 3e26 6c74 3b26 6c74 t;<< │ │ │ │ -00006700: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
183< │ │ │ │ -00006760: 2f73 7061 6e3e 2020 2020 2020 2020 7374 /span> st │ │ │ │ -00006770: 643a 3a63 6f75 7426 6c74 3b26 6c74 3b3c d::cout<<< │ │ │ │ -00006780: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ -00006790: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ -000067a0: 3b46 6163 746f 7269 7a65 2054 696d 653a ;Factorize Time: │ │ │ │ -000067b0: 2026 7175 6f74 3b3c 2f73 7061 6e3e 266c "&l │ │ │ │ -000067c0: 743b 266c 743b 6363 5f2d 2667 743b 5350 t;<cc_->SP │ │ │ │ -000067d0: 5152 5f66 6163 746f 7269 7a65 5f74 696d QR_factorize_tim │ │ │ │ -000067e0: 6526 6c74 3b26 6c74 3b3c 7370 616e 2063 e<<" s&qu │ │ │ │ -00006810: 6f74 3b3c 2f73 7061 6e3e 266c 743b 266c ot;<&l │ │ │ │ -00006820: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
184 │ │ │ │ -00006880: 3c2f 7370 616e 3e20 2020 2020 2020 2073 s │ │ │ │ -00006890: 7464 3a3a 636f 7574 266c 743b 266c 743b td::cout<< │ │ │ │ -000068a0: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ -000068c0: 743b 4261 636b 736f 6c76 6520 5469 6d65 t;Backsolve Time │ │ │ │ -000068d0: 3a20 2671 756f 743b 3c2f 7370 616e 3e26 : "& │ │ │ │ -000068e0: 6c74 3b26 6c74 3b63 635f 2d26 6774 3b53 lt;<cc_->S │ │ │ │ -000068f0: 5051 525f 736f 6c76 655f 7469 6d65 266c PQR_solve_time&l │ │ │ │ -00006900: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<" s" │ │ │ │ -00006930: 3c2f 7370 616e 3e26 6c74 3b26 6c74 3b73 <<s │ │ │ │ -00006940: 7464 3a3a 656e 646c 3b3c 2f64 6976 3e0a td::endl;
. │ │ │ │ -00006950: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
│ │ │ │ -00006a70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00006aa0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 186 std │ │ │ │ -00006ad0: 3a3a 636f 7574 266c 743b 266c 743b 3c73 ::cout<<" │ │ │ │ -00006b00: 5261 6e6b 2045 7374 696d 6174 653a 2026 Rank Estimate: & │ │ │ │ -00006b10: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ -00006b20: 266c 743b 6363 5f2d 2667 743b 5350 5152 <cc_->SPQR │ │ │ │ -00006b30: 5f69 7374 6174 5b34 5d26 6c74 3b26 6c74 _istat[4]<< │ │ │ │ -00006b40: 3b73 7464 3a3a 656e 646c 266c 743b 266c ;std::endl<&l │ │ │ │ -00006b50: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
187 │ │ │ │ -00006bb0: 3c2f 7370 616e 3e20 2020 2020 207d 3c2f }.
1 │ │ │ │ -00006c10: 3838 3c2f 7370 616e 3e20 2020 207d 3c2f 88 }.
.
< │ │ │ │ -00006c60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00006c70: 6e6f 223e 2020 3138 393c 2f73 7061 6e3e no"> 189 │ │ │ │ -00006c80: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
. │ │ │ │ -00006ce0: 3c61 2069 643d 226c 3030 3139 3122 206e 19 │ │ │ │ -00006d60: 313c 2f61 3e3c 2f73 7061 6e3e 2020 2020 1 │ │ │ │ -00006d70: 3c73 7061 6e20 636c 6173 733d 226b 6579 virtual v │ │ │ │ -00006db0: 6f69 643c 2f73 7061 6e3e 203c 6120 636c oid app │ │ │ │ -00006e10: 6c79 3c2f 613e 2028 3c61 2063 6c61 7373 ly (domain_type< │ │ │ │ -00006e50: 2f61 3e26 616d 703b 2078 2c20 3c61 2063 /a>& x, range_ty │ │ │ │ -00006e90: 7065 3c2f 613e 2661 6d70 3b20 622c 205b pe& b, [ │ │ │ │ -00006ea0: 5b6d 6179 6265 5f75 6e75 7365 645d 5d20 [maybe_unused]] │ │ │ │ -00006eb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 double │ │ │ │ -00006ed0: 3c2f 7370 616e 3e20 7265 6475 6374 696f reductio │ │ │ │ -00006ee0: 6e2c 203c 6120 636c 6173 733d 2263 6f64 n, │ │ │ │ -00006f10: 496e 7665 7273 654f 7065 7261 746f 7252 InverseOperatorR │ │ │ │ -00006f20: 6573 756c 743c 2f61 3e26 616d 703b 2072 esult& r │ │ │ │ -00006f30: 6573 293c 2f64 6976 3e0a 3c64 6976 2063 es)
.
192 │ │ │ │ -00006f90: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
193 │ │ │ │ -00006ff0: 2020 2020 6170 706c 7928 782c 2062 2c20 apply(x, b, │ │ │ │ -00007000: 7265 7329 3b3c 2f64 6976 3e0a 3c64 6976 res);
.
< │ │ │ │ -00007040: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00007050: 6e6f 223e 2020 3139 343c 2f73 7061 6e3e no"> 194 │ │ │ │ -00007060: 2020 2020 7d3c 2f64 6976 3e0a 3c2f 6469 }
..
195 │ │ │ │ -000070c0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -000070d0: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ │ -000070e0: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ │ -000070f0: 6e30 3031 3936 2220 6461 7461 2d73 7461 n00196" data-sta │ │ │ │ -00007100: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ │ -00007110: 227d 223e 0a3c 6469 7620 636c 6173 733d "}">.
196 void s │ │ │ │ -00007230: 6574 4f70 7469 6f6e 3c2f 613e 285b 5b6d etOption([[m │ │ │ │ -00007240: 6179 6265 5f75 6e75 7365 645d 5d20 3c73 aybe_unused]] unsigned │ │ │ │ -00007270: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c int opt │ │ │ │ -000072a0: 696f 6e2c 205b 5b6d 6179 6265 5f75 6e75 ion, [[maybe_unu │ │ │ │ -000072b0: 7365 645d 5d20 3c73 7061 6e20 636c 6173 sed]] │ │ │ │ -000072d0: 646f 7562 6c65 3c2f 7370 616e 3e20 7661 double va │ │ │ │ -000072e0: 6c75 6529 3c2f 6469 763e 0a3c 6469 7620 lue)
.
197 │ │ │ │ -00007340: 2020 207b 7d3c 2f64 6976 3e0a 3c2f 6469 {}
..
198 │ │ │ │ -000073a0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -000073b0: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ │ -000073c0: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ │ -000073d0: 6e30 3032 3030 2220 6461 7461 2d73 7461 n00200" data-sta │ │ │ │ -000073e0: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ │ -000073f0: 227d 223e 0a3c 6469 7620 636c 6173 733d "}">.
200 void s │ │ │ │ -00007510: 6574 4d61 7472 6978 3c2f 613e 283c 7370 etMatrix(const │ │ │ │ -00007540: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Matr │ │ │ │ -00007570: 6978 3c2f 613e 2661 6d70 3b20 6d61 7472 ix& matr │ │ │ │ -00007580: 6978 293c 2f64 6976 3e0a 3c64 6976 2063 ix)
.
201 │ │ │ │ -000075e0: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
202 │ │ │ │ -00007640: 2020 2020 3c73 7061 6e20 636c 6173 733d if │ │ │ │ -00007660: 3c2f 7370 616e 3e20 2828 7370 7172 4d61 ((spqrMa │ │ │ │ -00007670: 7472 6978 5f2e 4e28 2920 2b20 7370 7172 trix_.N() + spqr │ │ │ │ -00007680: 4d61 7472 6978 5f2e 4d28 2920 2667 743b Matrix_.M() > │ │ │ │ -00007690: 2030 2920 7c7c 206d 6174 7269 7849 734c 0) || matrixIsL │ │ │ │ -000076a0: 6f61 6465 645f 293c 2f64 6976 3e0a 3c64 oaded_)
. │ │ │ │ -000076c0: 3c61 2069 643d 226c 3030 3230 3322 206e 203 free() │ │ │ │ -00007710: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00007760: 2020 3230 343c 2f73 7061 6e3e 203c 2f64 204 .
20 │ │ │ │ -000077c0: 353c 2f73 7061 6e3e 2020 2020 2020 3c73 5 if (spqrMatrix_.N │ │ │ │ -00007800: 2829 202b 2073 7071 724d 6174 7269 785f () + spqrMatrix_ │ │ │ │ -00007810: 2e4d 2829 202b 2073 7071 724d 6174 7269 .M() + spqrMatri │ │ │ │ -00007820: 785f 2e6e 6f6e 7a65 726f 6573 2829 2021 x_.nonzeroes() ! │ │ │ │ -00007830: 3d20 3029 3c2f 6469 763e 0a3c 6469 7620 = 0)
.
206 │ │ │ │ -00007890: 2020 2020 2020 2073 7071 724d 6174 7269 spqrMatri │ │ │ │ -000078a0: 785f 2e66 7265 6528 293b 3c2f 6469 763e x_.free();
│ │ │ │ -000078b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -000078e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 207 spqrM │ │ │ │ -00007910: 6174 7269 785f 2e73 6574 5369 7a65 283c atrix_.setSize(< │ │ │ │ -00007920: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00007930: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ │ -00007940: 3031 3133 362e 6874 6d6c 223e 4d61 7472 01136.html">Matr │ │ │ │ -00007950: 6978 4469 6d65 6e73 696f 6e26 6c74 3b4d ixDimension<M │ │ │ │ -00007960: 6174 7269 7826 6774 3b3a 3a72 6f77 6469 atrix>::rowdi │ │ │ │ -00007970: 6d3c 2f61 3e28 6d61 7472 6978 292c 3c2f m(matrix),.
2 │ │ │ │ -000079d0: 3038 3c2f 7370 616e 3e20 2020 2020 2020 08 │ │ │ │ -000079e0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -000079f0: 2020 203c 6120 636c 6173 733d 2263 6f64 │ │ │ │ -00007a20: 4d61 7472 6978 4469 6d65 6e73 696f 6e26 MatrixDimension& │ │ │ │ -00007a30: 6c74 3b4d 6174 7269 7826 6774 3b3a 3a63 lt;Matrix>::c │ │ │ │ -00007a40: 6f6c 6469 6d3c 2f61 3e28 6d61 7472 6978 oldim(matrix │ │ │ │ -00007a50: 2929 3b3c 2f64 6976 3e0a 3c64 6976 2063 ));
.
209 │ │ │ │ -00007ab0: 2020 2020 4953 544c 3a3a 496d 706c 3a3a ISTL::Impl:: │ │ │ │ -00007ac0: 4243 4353 4d61 7472 6978 496e 6974 6961 BCCSMatrixInitia │ │ │ │ -00007ad0: 6c69 7a65 7226 6c74 3b4d 6174 7269 782c lizer<Matrix, │ │ │ │ -00007ae0: 2069 6e74 2667 743b 2069 6e69 7469 616c int> initial │ │ │ │ -00007af0: 697a 6572 2873 7071 724d 6174 7269 785f izer(spqrMatrix_ │ │ │ │ -00007b00: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
210 .
2 │ │ │ │ -00007bb0: 3131 3c2f 7370 616e 3e20 2020 2020 2063 11 c │ │ │ │ -00007bc0: 6f70 7954 6f42 4343 534d 6174 7269 7828 opyToBCCSMatrix( │ │ │ │ -00007bd0: 696e 6974 6961 6c69 7a65 722c 206d 6174 initializer, mat │ │ │ │ -00007be0: 7269 7829 3b3c 2f64 6976 3e0a 3c64 6976 rix);
.
< │ │ │ │ -00007c20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00007c30: 6e6f 223e 2020 3231 323c 2f73 7061 6e3e no"> 212 │ │ │ │ -00007c40: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -00007c90: 2020 3231 333c 2f73 7061 6e3e 2020 2020 213 │ │ │ │ -00007ca0: 2020 6465 636f 6d70 6f73 6528 293b 3c2f decompose();.
2 │ │ │ │ -00007d00: 3134 3c2f 7370 616e 3e20 2020 207d 3c2f 14 }.
.
< │ │ │ │ -00007d50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00007d60: 6e6f 223e 2020 3231 353c 2f73 7061 6e3e no"> 215 │ │ │ │ -00007d70: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -00007dc0: 2020 3231 363c 2f73 7061 6e3e 2020 2020 216 │ │ │ │ -00007dd0: 3c73 7061 6e20 636c 6173 733d 226b 6579 template<c │ │ │ │ -00007e10: 6c61 7373 3c2f 7370 616e 3e20 5326 6774 lass S> │ │ │ │ -00007e20: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
. │ │ │ │ -00007e80: 3c61 2069 643d 226c 3030 3231 3722 206e 21 │ │ │ │ -00007f00: 373c 2f61 3e3c 2f73 7061 6e3e 2020 2020 7 │ │ │ │ -00007f10: 3c73 7061 6e20 636c 6173 733d 226b 6579 void setSubMa │ │ │ │ -00007f90: 7472 6978 3c2f 613e 283c 7370 616e 2063 trix(c │ │ │ │ -00007fb0: 6f6e 7374 3c2f 7370 616e 3e20 3c61 2063 onst Matrix& matrix, │ │ │ │ -00008000: 3c73 7061 6e20 636c 6173 733d 226b 6579 const S& rowInd │ │ │ │ -00008030: 6578 5365 7429 3c2f 6469 763e 0a3c 6469 exSet)
.< │ │ │ │ -00008050: 6120 6964 3d22 6c30 3032 3138 2220 6e61 a id="l00218" na │ │ │ │ -00008060: 6d65 3d22 6c30 3032 3138 223e 3c2f 613e me="l00218"> │ │ │ │ -00008070: 3c73 7061 6e20 636c 6173 733d 226c 696e 218 {
.< │ │ │ │ -000080b0: 6120 6964 3d22 6c30 3032 3139 2220 6e61 a id="l00219" na │ │ │ │ -000080c0: 6d65 3d22 6c30 3032 3139 223e 3c2f 613e me="l00219"> │ │ │ │ -000080d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 219 if ((spq │ │ │ │ -00008120: 724d 6174 7269 785f 2e4e 2829 202b 2073 rMatrix_.N() + s │ │ │ │ -00008130: 7071 724d 6174 7269 785f 2e4d 2829 2026 pqrMatrix_.M() & │ │ │ │ -00008140: 6774 3b20 3029 207c 7c20 6d61 7472 6978 gt; 0) || matrix │ │ │ │ -00008150: 4973 4c6f 6164 6564 5f29 3c2f 6469 763e IsLoaded_)
│ │ │ │ -00008160: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00008190: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 220 fre │ │ │ │ -000081c0: 6528 293b 3c2f 6469 763e 0a3c 6469 7620 e();
.
221 │ │ │ │ -00008220: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00008270: 2032 3232 3c2f 7370 616e 3e20 2020 2020 222 │ │ │ │ -00008280: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if (spqrMatrix │ │ │ │ -000082b0: 5f2e 4e28 2920 2b20 7370 7172 4d61 7472 _.N() + spqrMatr │ │ │ │ -000082c0: 6978 5f2e 4d28 2920 2b20 7370 7172 4d61 ix_.M() + spqrMa │ │ │ │ -000082d0: 7472 6978 5f2e 6e6f 6e7a 6572 6f65 7328 trix_.nonzeroes( │ │ │ │ -000082e0: 2920 213d 2030 293c 2f64 6976 3e0a 3c64 ) != 0)
. │ │ │ │ -00008300: 3c61 2069 643d 226c 3030 3232 3322 206e 223 spqrMa │ │ │ │ -00008350: 7472 6978 5f2e 6672 6565 2829 3b3c 2f64 trix_.free();.
22 │ │ │ │ -000083b0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
. │ │ │ │ -000083c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
226 │ │ │ │ -00008560: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -00008570: 2020 2020 2020 2072 6f77 496e 6465 7853 rowIndexS │ │ │ │ -00008580: 6574 2e73 697a 6528 292a 3c61 2063 6c61 et.size()*MatrixDim │ │ │ │ -000085c0: 656e 7369 6f6e 266c 743b 4d61 7472 6978 ension<Matrix │ │ │ │ -000085d0: 2667 743b 3a3a 636f 6c64 696d 3c2f 613e >::coldim │ │ │ │ -000085e0: 286d 6174 7269 7829 202f 206d 6174 7269 (matrix) / matri │ │ │ │ -000085f0: 782e 3c61 2063 6c61 7373 3d22 636f 6465 x.M());.
227 │ │ │ │ -000086a0: 3c2f 7370 616e 3e20 2020 2020 2049 5354 IST │ │ │ │ -000086b0: 4c3a 3a49 6d70 6c3a 3a42 4343 534d 6174 L::Impl::BCCSMat │ │ │ │ -000086c0: 7269 7849 6e69 7469 616c 697a 6572 266c rixInitializer&l │ │ │ │ -000086d0: 743b 4d61 7472 6978 2c20 696e 7426 6774 t;Matrix, int> │ │ │ │ -000086e0: 3b20 696e 6974 6961 6c69 7a65 7228 7370 ; initializer(sp │ │ │ │ -000086f0: 7172 4d61 7472 6978 5f29 3b3c 2f64 6976 qrMatrix_);
.
228< │ │ │ │ -00008750: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -00008770: 3c61 2069 643d 226c 3030 3232 3922 206e 229
copyToBC │ │ │ │ -000087c0: 4353 4d61 7472 6978 2869 6e69 7469 616c CSMatrix(initial │ │ │ │ -000087d0: 697a 6572 2c20 4953 544c 3a3a 496d 706c izer, ISTL::Impl │ │ │ │ -000087e0: 3a3a 4d61 7472 6978 526f 7753 7562 7365 ::MatrixRowSubse │ │ │ │ -000087f0: 7426 6c74 3b3c 6120 636c 6173 733d 2263 t<Matrix,std: │ │ │ │ -00008830: 3a73 6574 266c 743b 7374 643a 3a73 697a :set<std::siz │ │ │ │ -00008840: 655f 7426 6774 3b20 2667 743b 286d 6174 e_t> >(mat │ │ │ │ -00008850: 7269 782c 726f 7749 6e64 6578 5365 7429 rix,rowIndexSet) │ │ │ │ -00008860: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
230 .
2 │ │ │ │ -00008910: 3331 3c2f 7370 616e 3e20 2020 2020 2064 31 d │ │ │ │ -00008920: 6563 6f6d 706f 7365 2829 3b3c 2f64 6976 ecompose();
.
232< │ │ │ │ -00008980: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }
.
.
233 .
..
│ │ │ │ -00008c00: 2020 3233 393c 2f73 7061 6e3e 2020 2020 239 │ │ │ │ -00008c10: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ -00008c60: 2020 3234 303c 2f73 7061 6e3e 2020 2020 240 │ │ │ │ -00008c70: 2020 7665 7262 6f73 655f 3d76 3b3c 2f64 verbose_=v;.
24 │ │ │ │ -00008cd0: 313c 2f73 7061 6e3e 2020 2020 7d3c 2f64 1 }.
.
242 │ │ │ │ -00008d40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -00008da0: 6120 6964 3d22 6c30 3032 3437 2220 6e61 a id="l00247" na │ │ │ │ -00008db0: 6d65 3d22 6c30 3032 3437 223e 3c2f 613e me="l00247"> │ │ │ │ -00008dc0: 3c73 7061 6e20 636c 6173 733d 226c 696e 247 │ │ │ │ -00008e20: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -00008e30: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00008e40: 6f72 6422 3e69 6e6c 696e 653c 2f73 7061 ord">inline SuiteSparseQR │ │ │ │ -00008e60: 5f66 6163 746f 7269 7a61 7469 6f6e 266c _factorization&l │ │ │ │ -00008e70: 743b 5426 6774 3b2a 203c 6120 636c 6173 t;T>* getFa │ │ │ │ -00008ed0: 6374 6f72 697a 6174 696f 6e3c 2f61 3e28 ctorization( │ │ │ │ -00008ee0: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ -00008f30: 2020 3234 383c 2f73 7061 6e3e 2020 2020 248 │ │ │ │ -00008f40: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ -00008f90: 2020 3234 393c 2f73 7061 6e3e 2020 2020 249 │ │ │ │ -00008fa0: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ │ -00008fc0: 726e 3c2f 7370 616e 3e20 7370 7172 6661 rn spqrfa │ │ │ │ -00008fd0: 6374 6f72 697a 6174 696f 6e5f 3b3c 2f64 ctorization_;.
25 │ │ │ │ -00009030: 303c 2f73 7061 6e3e 2020 2020 7d3c 2f64 0 }.
.
251 │ │ │ │ -000090a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ -00009100: 6120 6964 3d22 6c30 3032 3536 2220 6e61 a id="l00256" na │ │ │ │ -00009110: 6d65 3d22 6c30 3032 3536 223e 3c2f 613e me="l00256"> │ │ │ │ -00009120: 3c73 7061 6e20 636c 6173 733d 226c 696e 256 │ │ │ │ -00009180: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ -00009190: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000091a0: 6f72 6422 3e69 6e6c 696e 653c 2f73 7061 ord">inline SPQRMatrix& getInt │ │ │ │ -00009270: 6572 6e61 6c4d 6174 7269 783c 2f61 3e28 ernalMatrix( │ │ │ │ -00009280: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ -000092d0: 2020 3235 373c 2f73 7061 6e3e 2020 2020 257 │ │ │ │ -000092e0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ -00009330: 2020 3235 383c 2f73 7061 6e3e 2020 2020 258 │ │ │ │ -00009340: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ │ -00009360: 726e 3c2f 7370 616e 3e20 7370 7172 4d61 rn spqrMa │ │ │ │ -00009370: 7472 6978 5f3b 3c2f 6469 763e 0a3c 6469 trix_;
.< │ │ │ │ -00009390: 6120 6964 3d22 6c30 3032 3539 2220 6e61 a id="l00259" na │ │ │ │ -000093a0: 6d65 3d22 6c30 3032 3539 223e 3c2f 613e me="l00259"> │ │ │ │ -000093b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 259 }
..
26 │ │ │ │ -00009430: 303c 2f73 7061 6e3e 203c 2f64 6976 3e0a 0
. │ │ │ │ -00009440: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
. │ │ │ │ -000095b0: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ -00009610: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00009640: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 267 cholm │ │ │ │ -00009670: 6f64 5f6c 5f66 7265 655f 7370 6172 7365 od_l_free_sparse │ │ │ │ -00009680: 2826 616d 703b 415f 2c20 6363 5f29 3b3c (&A_, cc_);< │ │ │ │ -00009690: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -000096e0: 3236 383c 2f73 7061 6e3e 2020 2020 2020 268 │ │ │ │ -000096f0: 6368 6f6c 6d6f 645f 6c5f 6672 6565 5f64 cholmod_l_free_d │ │ │ │ -00009700: 656e 7365 2826 616d 703b 425f 2c20 6363 ense(&B_, cc │ │ │ │ -00009710: 5f29 3b3c 2f64 6976 3e0a 3c64 6976 2063 _);
.
269 │ │ │ │ -00009770: 2020 2020 5375 6974 6553 7061 7273 6551 SuiteSparseQ │ │ │ │ -00009780: 525f 6672 6565 266c 743b 5426 6774 3b28 R_free<T>( │ │ │ │ -00009790: 2661 6d70 3b73 7071 7266 6163 746f 7269 &spqrfactori │ │ │ │ -000097a0: 7a61 7469 6f6e 5f2c 2063 635f 293b 3c2f zation_, cc_);.
2 │ │ │ │ -00009800: 3730 3c2f 7370 616e 3e20 2020 2020 2073 70 s │ │ │ │ -00009810: 7071 724d 6174 7269 785f 2e66 7265 6528 pqrMatrix_.free( │ │ │ │ -00009820: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
271 │ │ │ │ -00009880: 2020 206d 6174 7269 7849 734c 6f61 6465 matrixIsLoade │ │ │ │ -00009890: 645f 203d 203c 7370 616e 2063 6c61 7373 d_ = false │ │ │ │ -000098b0: 3c2f 7370 616e 3e3b 3c2f 6469 763e 0a3c ;
.< │ │ │ │ -000098c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -000098d0: 3e3c 6120 6964 3d22 6c30 3032 3732 2220 > 272
}
.< │ │ │ │ -00009920: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00009970: 3237 333c 2f73 7061 6e3e 203c 2f64 6976 273
.
.
│ │ │ │ -00009a10: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 275< │ │ │ │ -00009a60: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ -00009a80: 696e 6c69 6e65 3c2f 7370 616e 3e20 3c73 inline const │ │ │ │ -00009ab0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 char< │ │ │ │ -00009ad0: 2f73 7061 6e3e 2a20 3c61 2063 6c61 7373 /span>* name()
.
276 │ │ │ │ -00009b90: 2020 207b 3c2f 6469 763e 0a3c 6469 7620 {
.
277 │ │ │ │ -00009bf0: 2020 2020 203c 7370 616e 2063 6c61 7373 r │ │ │ │ -00009c10: 6574 7572 6e3c 2f73 7061 6e3e 203c 7370 eturn "S │ │ │ │ -00009c40: 5051 5226 7175 6f74 3b3c 2f73 7061 6e3e PQR" │ │ │ │ -00009c50: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -00009ca0: 2020 3237 383c 2f73 7061 6e3e 2020 2020 278 │ │ │ │ -00009cb0: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
.
.< │ │ │ │ -00009cc0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00009cd0: 3e3c 6120 6964 3d22 6c30 3032 3739 2220 > 279
.
280 │ │ │ │ -00009d70: 2020 203c 7370 616e 2063 6c61 7373 3d22 private │ │ │ │ -00009d90: 3c2f 7370 616e 3e3a 3c2f 6469 763e 0a3c :
.< │ │ │ │ -00009da0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00009db0: 3e3c 6120 6964 3d22 6c30 3032 3831 2220 > 281 tem │ │ │ │ -00009e10: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate< │ │ │ │ -00009e20: 3c73 7061 6e20 636c 6173 733d 226b 6579 class M,class │ │ │ │ -00009e60: 3c2f 7370 616e 3e20 582c 203c 7370 616e X, class TM │ │ │ │ -00009e90: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class TD, c │ │ │ │ -00009ed0: 6c61 7373 3c2f 7370 616e 3e20 5431 2667 lass T1&g │ │ │ │ -00009ee0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
282 │ │ │ │ -00009f80: 3c2f 7370 616e 3e20 2020 203c 7370 616e friend < │ │ │ │ -00009fb0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00009fc0: 6f72 6422 3e63 6c61 7373 203c 2f73 7061 ord">class Se │ │ │ │ -0000a000: 714f 7665 726c 6170 7069 6e67 5363 6877 qOverlappingSchw │ │ │ │ -0000a010: 6172 7a3c 2f61 3e3b 3c2f 6469 763e 0a3c arz;
.< │ │ │ │ -0000a020: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000a030: 3e3c 6120 6964 3d22 6c30 3032 3833 2220 > 283
.
284 │ │ │ │ -0000a0d0: 2020 203c 7370 616e 2063 6c61 7373 3d22 friend< │ │ │ │ -0000a0f0: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> str │ │ │ │ -0000a110: 7563 7420 3c2f 7370 616e 3e3c 6120 636c uct SeqOverl │ │ │ │ -0000a150: 6170 7069 6e67 5363 6877 6172 7a41 7373 appingSchwarzAss │ │ │ │ -0000a160: 656d 626c 6572 4865 6c70 6572 3c2f 613e emblerHelper │ │ │ │ -0000a170: 266c 743b 3c61 2063 6c61 7373 3d22 636f < │ │ │ │ -0000a1a0: 5350 5152 3c2f 613e 266c 743b 3c61 2063 SPQR<Matrix>,true>; │ │ │ │ -0000a1f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000a240: 2032 3835 3c2f 7370 616e 3e20 3c2f 6469 285 .
287 │ │ │ │ -0000a2a0: 3c2f 7370 616e 3e20 2020 203c 7370 616e void │ │ │ │ -0000a2d0: 2064 6563 6f6d 706f 7365 2829 3c2f 6469 decompose().
288 │ │ │ │ -0000a330: 3c2f 7370 616e 3e20 2020 207b 3c2f 6469 {.
289 │ │ │ │ -0000a390: 3c2f 7370 616e 3e20 2020 2020 203c 7370 const │ │ │ │ -0000a3c0: 7374 643a 3a73 697a 655f 7420 6e72 6f77 std::size_t nrow │ │ │ │ -0000a3d0: 7328 7370 7172 4d61 7472 6978 5f2e 4e28 s(spqrMatrix_.N( │ │ │ │ -0000a3e0: 2929 3b3c 2f64 6976 3e0a 3c64 6976 2063 ));
.
290 │ │ │ │ -0000a440: 2020 2020 3c73 7061 6e20 636c 6173 733d const< │ │ │ │ -0000a460: 2f73 7061 6e3e 2073 7464 3a3a 7369 7a65 /span> std::size │ │ │ │ -0000a470: 5f74 206e 636f 6c73 2873 7071 724d 6174 _t ncols(spqrMat │ │ │ │ -0000a480: 7269 785f 2e4d 2829 293b 3c2f 6469 763e rix_.M());
│ │ │ │ -0000a490: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000a4c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 291 const st │ │ │ │ -0000a510: 643a 3a73 697a 655f 7420 6e6e 7a28 7370 d::size_t nnz(sp │ │ │ │ -0000a520: 7172 4d61 7472 6978 5f2e 6765 7443 6f6c qrMatrix_.getCol │ │ │ │ -0000a530: 5374 6172 7428 295b 6e63 6f6c 735d 293b Start()[ncols]); │ │ │ │ -0000a540: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000a590: 2032 3932 3c2f 7370 616e 3e20 3c2f 6469 292 .
293 │ │ │ │ -0000a5f0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 // initialise │ │ │ │ -0000a620: 2074 6865 206d 6174 7269 7820 4120 2873 the matrix A (s │ │ │ │ -0000a630: 6f72 7465 642c 2070 6163 6b65 642c 2075 orted, packed, u │ │ │ │ -0000a640: 6e73 796d 6d65 7472 6963 2c20 7265 616c nsymmetric, real │ │ │ │ -0000a650: 2065 6e74 7269 6573 293c 2f73 7061 6e3e entries) │ │ │ │ -0000a660: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000a6b0: 2032 3934 3c2f 7370 616e 3e20 2020 2020 294 │ │ │ │ -0000a6c0: 2041 5f20 3d20 6368 6f6c 6d6f 645f 6c5f A_ = cholmod_l_ │ │ │ │ -0000a6d0: 616c 6c6f 6361 7465 5f73 7061 7273 6528 allocate_sparse( │ │ │ │ -0000a6e0: 6e72 6f77 732c 206e 636f 6c73 2c20 6e6e nrows, ncols, nn │ │ │ │ -0000a6f0: 7a2c 2031 2c20 312c 2030 2c20 312c 2063 z, 1, 1, 0, 1, c │ │ │ │ -0000a700: 635f 293b 3c2f 6469 763e 0a3c 6469 7620 c_);
.
295 │ │ │ │ -0000a760: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000a7b0: 2032 3936 3c2f 7370 616e 3e20 2020 2020 296 │ │ │ │ -0000a7c0: 203c 7370 616e 2063 6c61 7373 3d22 636f // copy a │ │ │ │ -0000a7e0: 6c6c 2074 6865 2065 6e74 7269 6573 206f ll the entries o │ │ │ │ -0000a7f0: 6620 4170 2c20 4169 2c20 4178 3c2f 7370 f Ap, Ai, Ax
.
297 │ │ │ │ -0000a860: 2020 2020 3c73 7061 6e20 636c 6173 733d fo │ │ │ │ -0000a880: 723c 2f73 7061 6e3e 2873 7464 3a3a 7369 r(std::si │ │ │ │ -0000a890: 7a65 5f74 206b 203d 2030 3b20 6b20 213d ze_t k = 0; k != │ │ │ │ -0000a8a0: 2028 6e63 6f6c 732b 3129 3b20 2b2b 6b29 (ncols+1); ++k) │ │ │ │ -0000a8b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000a900: 2032 3938 3c2f 7370 616e 3e20 2020 2020 298 │ │ │ │ -0000a910: 2020 2028 3c73 7061 6e20 636c 6173 733d (static │ │ │ │ -0000a930: 5f63 6173 7426 6c74 3b3c 2f73 7061 6e3e _cast< │ │ │ │ -0000a940: 3c73 7061 6e20 636c 6173 733d 226b 6579 long │ │ │ │ -0000a980: 696e 743c 2f73 7061 6e3e 202a 3c73 7061 int *>(A_ │ │ │ │ -0000a9b0: 2d26 6774 3b70 2929 5b6b 5d20 3d20 7370 ->p))[k] = sp │ │ │ │ -0000a9c0: 7172 4d61 7472 6978 5f2e 6765 7443 6f6c qrMatrix_.getCol │ │ │ │ -0000a9d0: 5374 6172 7428 295b 6b5d 3b3c 2f64 6976 Start()[k];
.
299< │ │ │ │ -0000aa30: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -0000aa50: 3c61 2069 643d 226c 3030 3330 3022 206e 300 for(std │ │ │ │ -0000aac0: 3a3a 7369 7a65 5f74 206b 203d 2030 3b20 ::size_t k = 0; │ │ │ │ -0000aad0: 6b20 213d 206e 6e7a 3b20 2b2b 6b29 3c2f k != nnz; ++k).
3 │ │ │ │ -0000ab30: 3031 3c2f 7370 616e 3e20 2020 2020 207b 01 { │ │ │ │ -0000ab40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000ab90: 2033 3032 3c2f 7370 616e 3e20 2020 2020 302 │ │ │ │ -0000aba0: 2020 2028 3c73 7061 6e20 636c 6173 733d (static │ │ │ │ -0000abc0: 5f63 6173 7426 6c74 3b3c 2f73 7061 6e3e _cast< │ │ │ │ -0000abd0: 3c73 7061 6e20 636c 6173 733d 226b 6579 long │ │ │ │ -0000ac10: 696e 743c 2f73 7061 6e3e 2a3c 7370 616e int*>(A_- │ │ │ │ -0000ac40: 2667 743b 6929 295b 6b5d 203d 2073 7071 >i))[k] = spq │ │ │ │ -0000ac50: 724d 6174 7269 785f 2e67 6574 526f 7749 rMatrix_.getRowI │ │ │ │ -0000ac60: 6e64 6578 2829 5b6b 5d3b 3c2f 6469 763e ndex()[k];
│ │ │ │ -0000ac70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000aca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 303 (static_cast& │ │ │ │ -0000acf0: 6c74 3b3c 2f73 7061 6e3e 542a 3c73 7061 lt;T*>(A_ │ │ │ │ -0000ad20: 2d26 6774 3b78 2929 5b6b 5d20 3d20 7370 ->x))[k] = sp │ │ │ │ -0000ad30: 7172 4d61 7472 6978 5f2e 6765 7456 616c qrMatrix_.getVal │ │ │ │ -0000ad40: 7565 7328 295b 6b5d 3b3c 2f64 6976 3e0a ues()[k];
. │ │ │ │ -0000ad50: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
305< │ │ │ │ -0000ae00: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -0000ae20: 3c61 2069 643d 226c 3030 3330 3622 206e 306 // │ │ │ │ -0000ae80: 2069 6e69 7469 616c 6973 6520 7468 6520 initialise the │ │ │ │ -0000ae90: 7665 6374 6f72 2042 3c2f 7370 616e 3e3c vector B< │ │ │ │ -0000aea0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000aef0: 3330 373c 2f73 7061 6e3e 2020 2020 2020 307 │ │ │ │ -0000af00: 425f 203d 2063 686f 6c6d 6f64 5f6c 5f61 B_ = cholmod_l_a │ │ │ │ -0000af10: 6c6c 6f63 6174 655f 6465 6e73 6528 6e72 llocate_dense(nr │ │ │ │ -0000af20: 6f77 732c 2031 2c20 6e72 6f77 732c 2041 ows, 1, nrows, A │ │ │ │ -0000af30: 5f2d 2667 743b 7874 7970 652c 2063 635f _->xtype, cc_ │ │ │ │ -0000af40: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
308 │ │ │ │ -0000afa0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // comp │ │ │ │ -0000afc0: 7574 6520 6661 6374 6f72 697a 6174 696f ute factorizatio │ │ │ │ -0000afd0: 6e20 6f66 2041 3c2f 7370 616e 3e3c 2f64 n of A.
30 │ │ │ │ -0000b030: 393c 2f73 7061 6e3e 2020 2020 2020 7370 9 sp │ │ │ │ -0000b040: 7172 6661 6374 6f72 697a 6174 696f 6e5f qrfactorization_ │ │ │ │ -0000b050: 3d53 7569 7465 5370 6172 7365 5152 5f66 =SuiteSparseQR_f │ │ │ │ -0000b060: 6163 746f 7269 7a65 266c 743b 5426 6774 actorize<T> │ │ │ │ -0000b070: 3b28 5350 5152 5f4f 5244 4552 494e 475f ;(SPQR_ORDERING_ │ │ │ │ -0000b080: 4445 4641 554c 542c 5350 5152 5f44 4546 DEFAULT,SPQR_DEF │ │ │ │ -0000b090: 4155 4c54 5f54 4f4c 2c41 5f2c 6363 5f29 AULT_TOL,A_,cc_) │ │ │ │ -0000b0a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -0000b0f0: 2020 3331 303c 2f73 7061 6e3e 2020 2020 310 │ │ │ │ -0000b100: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ -0000b150: 2020 3331 313c 2f73 7061 6e3e 203c 2f64 311 .
31 │ │ │ │ -0000b1b0: 323c 2f73 7061 6e3e 2020 2020 5350 5152 2 SPQR │ │ │ │ -0000b1c0: 4d61 7472 6978 2073 7071 724d 6174 7269 Matrix spqrMatri │ │ │ │ -0000b1d0: 785f 3b3c 2f64 6976 3e0a 3c64 6976 2063 x_;
.
313 │ │ │ │ -0000b230: 2020 3c73 7061 6e20 636c 6173 733d 226b bool │ │ │ │ -0000b250: 3c2f 7370 616e 3e20 6d61 7472 6978 4973 matrixIs │ │ │ │ -0000b260: 4c6f 6164 6564 5f3b 3c2f 6469 763e 0a3c Loaded_;
.< │ │ │ │ -0000b270: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000b280: 3e3c 6120 6964 3d22 6c30 3033 3134 2220 > 314 int verb │ │ │ │ -0000b2f0: 6f73 655f 3b3c 2f64 6976 3e0a 3c64 6976 ose_;
.
< │ │ │ │ -0000b330: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000b340: 6e6f 223e 2020 3331 353c 2f73 7061 6e3e no"> 315 │ │ │ │ -0000b350: 2020 2020 6368 6f6c 6d6f 645f 636f 6d6d cholmod_comm │ │ │ │ -0000b360: 6f6e 2a20 6363 5f3b 3c2f 6469 763e 0a3c on* cc_;
.< │ │ │ │ -0000b370: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000b380: 3e3c 6120 6964 3d22 6c30 3033 3136 2220 > 316 cholmod_s │ │ │ │ -0000b3d0: 7061 7273 652a 2041 5f3b 3c2f 6469 763e parse* A_;
│ │ │ │ -0000b3e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000b410: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 317 cholmod │ │ │ │ -0000b440: 5f64 656e 7365 2a20 425f 3b3c 2f64 6976 _dense* B_;
.
318< │ │ │ │ -0000b4a0: 2f73 7061 6e3e 2020 2020 5375 6974 6553 /span> SuiteS │ │ │ │ -0000b4b0: 7061 7273 6551 525f 6661 6374 6f72 697a parseQR_factoriz │ │ │ │ -0000b4c0: 6174 696f 6e26 6c74 3b54 2667 743b 2a20 ation<T>* │ │ │ │ -0000b4d0: 7370 7172 6661 6374 6f72 697a 6174 696f spqrfactorizatio │ │ │ │ -0000b4e0: 6e5f 3b3c 2f64 6976 3e0a 3c64 6976 2063 n_;
.
319 │ │ │ │ -0000b540: 7d3b 3c2f 6469 763e 0a3c 2f64 6976 3e0a };
.
. │ │ │ │ -0000b550: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ -0000b5e0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000b5f0: 6e6f 223e 2020 3332 313c 2f73 7061 6e3e no"> 321 │ │ │ │ -0000b600: 2020 3c73 7061 6e20 636c 6173 733d 226b template │ │ │ │ -0000b620: 3c2f 7370 616e 3e26 6c74 3b3c 7370 616e <typename │ │ │ │ -0000b650: 2054 2c20 3c73 7061 6e20 636c 6173 733d T, typena │ │ │ │ -0000b670: 6d65 3c2f 7370 616e 3e20 4126 6774 3b3c me A>< │ │ │ │ -0000b680: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.< │ │ │ │ -0000b6e0: 6120 6964 3d22 6c30 3033 3232 2220 6e61 a id="l00322" na │ │ │ │ -0000b6f0: 6d65 3d22 6c30 3033 3232 223e 3c2f 613e me="l00322"> │ │ │ │ -0000b700: 3c73 7061 6e20 636c 6173 733d 226c 696e 322 │ │ │ │ -0000b760: 7374 7275 6374 203c 2f73 7061 6e3e 3c61 struct IsDir │ │ │ │ -0000b7a0: 6563 7453 6f6c 7665 723c 2f61 3e26 6c74 ectSolver< │ │ │ │ -0000b7b0: 3b3c 6120 636c 6173 733d 2263 6f64 6520 ;SPQ │ │ │ │ -0000b7e0: 523c 2f61 3e26 6c74 3b3c 6120 636c 6173 R<BCRSMatrix< │ │ │ │ -0000b820: 2f61 3e26 6c74 3b54 2c41 2667 743b 2026 /a><T,A> & │ │ │ │ -0000b830: 6774 3b20 2667 743b 3c2f 6469 763e 0a3c gt; >
.< │ │ │ │ -0000b840: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000b850: 3e3c 6120 6964 3d22 6c30 3033 3233 2220 > 323 {
.< │ │ │ │ -0000b8b0: 6120 6964 3d22 6c30 3033 3234 2220 6e61 a id="l00324" na │ │ │ │ -0000b8c0: 6d65 3d22 6c30 3033 3234 223e 3c2f 613e me="l00324"> │ │ │ │ -0000b8d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 3 │ │ │ │ -0000b950: 3234 3c2f 613e 3c2f 7370 616e 3e20 2020 24 │ │ │ │ -0000b960: 203c 7370 616e 2063 6c61 7373 3d22 6b65 enum {value │ │ │ │ -0000ba00: 203d 203c 7370 616e 2063 6c61 7373 3d22 = true
};
.< │ │ │ │ -0000ba40: 6120 6964 3d22 6c30 3033 3235 2220 6e61 a id="l00325" na │ │ │ │ -0000ba50: 6d65 3d22 6c30 3033 3235 223e 3c2f 613e me="l00325"> │ │ │ │ -0000ba60: 3c73 7061 6e20 636c 6173 733d 226c 696e 325 };
..
326 │ │ │ │ -0000bae0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -0000baf0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000bb00: 3e3c 6120 6964 3d22 6c30 3033 3237 2220 > 327 templ │ │ │ │ -0000bb60: 6174 653c 2f73 7061 6e3e 266c 743b 3c73 ate<typename T, typ │ │ │ │ -0000bbb0: 656e 616d 653c 2f73 7061 6e3e 2041 2667 ename A&g │ │ │ │ -0000bbc0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
. │ │ │ │ -0000bc10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
329 │ │ │ │ -0000bde0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ -0000be30: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 330 enum {< │ │ │ │ -0000bed0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -0000bee0: 5f65 6e75 6d76 616c 7565 2220 6872 6566 _enumvalue" href │ │ │ │ -0000bef0: 3d22 6130 3238 3034 2e68 746d 6c23 6161 ="a02804.html#aa │ │ │ │ -0000bf00: 6130 3732 3235 3662 3638 3030 6263 3030 a072256b6800bc00 │ │ │ │ -0000bf10: 6362 6331 6534 3635 6239 3631 6361 6661 cbc1e465b961cafa │ │ │ │ -0000bf20: 6362 3732 3465 3138 6364 3839 6536 6366 cb724e18cd89e6cf │ │ │ │ -0000bf30: 3739 3765 6533 3230 3863 3362 6330 3063 797ee3208c3bc00c │ │ │ │ -0000bf40: 223e 7661 6c75 653c 2f61 3e20 3d20 3c73 ">value = true} │ │ │ │ -0000bf70: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -0000bfc0: 2020 3333 313c 2f73 7061 6e3e 2020 7d3b 331 }; │ │ │ │ -0000bfd0: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ │ -0000bff0: 3c61 2069 643d 226c 3030 3333 3222 206e 332
.
│ │ │ │ -0000c080: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
< │ │ │ │ -0000c1b0: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -0000c1c0: 7265 663d 2261 3032 3832 382e 6874 6d6c ref="a02828.html │ │ │ │ -0000c1d0: 223e 2020 3333 343c 2f61 3e3c 2f73 7061 "> 334 temp │ │ │ │ -0000c200: 6c61 7465 3c2f 7370 616e 3e26 6c74 3b3c late<< │ │ │ │ -0000c210: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000c220: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class> stru │ │ │ │ -0000c250: 6374 203c 2f73 7061 6e3e 3c61 2063 6c61 ct isValidBl │ │ │ │ -0000c290: 6f63 6b3c 2f61 3e20 3a20 7374 643a 3a66 ock : std::f │ │ │ │ -0000c2a0: 616c 7365 5f74 7970 657b 7d3b 3c2f 6469 alse_type{};.
335 │ │ │ │ -0000c300: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ -0000c310: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000c320: 3e3c 6120 6964 3d22 6c30 3033 3336 2220 > 336 tem │ │ │ │ -0000c380: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate< │ │ │ │ -0000c390: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename TL, │ │ │ │ -0000c3d0: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename │ │ │ │ -0000c3e0: 4d26 6774 3b3c 2f64 6976 3e0a 3c64 6976 M>
.
< │ │ │ │ -0000c420: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000c430: 6e6f 223e 2020 3333 373c 2f73 7061 6e3e no"> 337 │ │ │ │ -0000c440: 2020 2020 7374 643a 3a73 6861 7265 645f std::shared_ │ │ │ │ -0000c450: 7074 7226 6c74 3b44 756e 653a 3a49 6e76 ptr<Dune::Inv │ │ │ │ -0000c460: 6572 7365 4f70 6572 6174 6f72 266c 743b erseOperator< │ │ │ │ -0000c470: 7479 7065 6e61 6d65 2044 756e 653a 3a54 typename Dune::T │ │ │ │ -0000c480: 7970 654c 6973 7445 6c65 6d65 6e74 266c ypeListElement&l │ │ │ │ -0000c490: 743b 312c 2054 4c26 6774 3b3a 3a74 7970 t;1, TL>::typ │ │ │ │ -0000c4a0: 652c 3c2f 6469 763e 0a3c 6469 7620 636c e,
.
338 │ │ │ │ -0000c500: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000c510: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000c520: 2020 2020 2020 203c 7370 616e 2063 6c61 typ │ │ │ │ -0000c540: 656e 616d 653c 2f73 7061 6e3e 2044 756e ename Dun │ │ │ │ -0000c550: 653a 3a54 7970 654c 6973 7445 6c65 6d65 e::TypeListEleme │ │ │ │ -0000c560: 6e74 266c 743b 322c 2054 4c26 6774 3b3a nt<2, TL>: │ │ │ │ -0000c570: 3a74 7970 6526 6774 3b26 6774 3b3c 2f64 :type>>.
.
339 op │ │ │ │ -0000c6c0: 6572 6174 6f72 2829 203c 2f61 3e28 544c erator() (TL │ │ │ │ -0000c6d0: 203c 7370 616e 2063 6c61 7373 3d22 636f /*tl*/, cons │ │ │ │ -0000c710: 743c 2f73 7061 6e3e 204d 2661 6d70 3b20 t M& │ │ │ │ -0000c720: 3c61 2063 6c61 7373 3d22 636f 6465 2068 mat, const Du │ │ │ │ -0000c7a0: 6e65 3a3a 5061 7261 6d65 7465 7254 7265 ne::ParameterTre │ │ │ │ -0000c7b0: 6526 616d 703b 2063 6f6e 6669 672c 3c2f e& config,.
3 │ │ │ │ -0000c810: 3430 3c2f 7370 616e 3e20 2020 2020 2073 40 s │ │ │ │ -0000c820: 7464 3a3a 656e 6162 6c65 5f69 665f 7426 td::enable_if_t& │ │ │ │ -0000c830: 6c74 3b3c 2f64 6976 3e0a 3c64 6976 2063 lt;
.
341 │ │ │ │ -0000c890: 2020 2020 2020 2020 2020 2020 2020 3c61 isVal │ │ │ │ -0000c8d0: 6964 426c 6f63 6b3c 2f61 3e26 6c74 3b3c idBlock<< │ │ │ │ -0000c8e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -0000c8f0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord">typename Dune::TypeL │ │ │ │ -0000c910: 6973 7445 6c65 6d65 6e74 266c 743b 312c istElement<1, │ │ │ │ -0000c920: 2054 4c26 6774 3b3a 3a74 7970 653a 3a62 TL>::type::b │ │ │ │ -0000c930: 6c6f 636b 5f74 7970 6526 6774 3b3a 3a76 lock_type>::v │ │ │ │ -0000c940: 616c 7565 2c3c 7370 616e 2063 6c61 7373 alue,i │ │ │ │ -0000c960: 6e74 3c2f 7370 616e 3e26 6774 3b20 3d20 nt> = │ │ │ │ -0000c970: 3029 3c73 7061 6e20 636c 6173 733d 226b 0) const
.
< │ │ │ │ -0000c9d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000c9e0: 6e6f 223e 2020 3334 323c 2f73 7061 6e3e no"> 342 │ │ │ │ -0000c9f0: 3c73 7061 6e20 636c 6173 733d 226b 6579 {
.
343 │ │ │ │ -0000ca70: 2020 203c 7370 616e 2063 6c61 7373 3d22 int │ │ │ │ -0000ca90: 3c2f 7370 616e 3e20 7665 7262 6f73 6520 verbose │ │ │ │ -0000caa0: 3d20 636f 6e66 6967 2e67 6574 283c 7370 = config.get("v │ │ │ │ -0000cad0: 6572 626f 7365 2671 756f 743b 3c2f 7370 erbose", 0);
.< │ │ │ │ -0000caf0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000cb00: 3e3c 6120 6964 3d22 6c30 3033 3434 2220 > 344 return │ │ │ │ -0000cb70: 2073 7464 3a3a 6d61 6b65 5f73 6861 7265 std::make_share │ │ │ │ -0000cb80: 6426 6c74 3b44 756e 653a 3a53 5051 5226 d<Dune::SPQR& │ │ │ │ -0000cb90: 6c74 3b4d 2667 743b 2667 743b 283c 6120 lt;M>>(m │ │ │ │ -0000cbf0: 6174 3c2f 613e 2c76 6572 626f 7365 293b at,verbose); │ │ │ │ -0000cc00: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000cc50: 2033 3435 3c2f 7370 616e 3e20 2020 207d 345 } │ │ │ │ -0000cc60: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ │ -0000cc80: 3c61 2069 643d 226c 3030 3334 3622 206e 346
.
347 │ │ │ │ -0000cd20: 2020 3c73 7061 6e20 636c 6173 733d 2263 // secon │ │ │ │ -0000cd40: 6420 7665 7273 696f 6e20 7769 7468 2053 d version with S │ │ │ │ -0000cd50: 4649 4e41 4520 746f 2076 616c 6964 6174 FINAE to validat │ │ │ │ -0000cd60: 6520 7468 6520 7465 6d70 6c61 7465 2070 e the template p │ │ │ │ -0000cd70: 6172 616d 6574 6572 7320 6f66 2053 5051 arameters of SPQ │ │ │ │ -0000cd80: 523c 2f73 7061 6e3e 3c2f 6469 763e 0a3c R
.< │ │ │ │ -0000cd90: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -0000cda0: 3e3c 6120 6964 3d22 6c30 3033 3438 2220 > 348 tem │ │ │ │ -0000ce00: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate< │ │ │ │ -0000ce10: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename TL, │ │ │ │ -0000ce50: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename │ │ │ │ -0000ce60: 4d26 6774 3b3c 2f64 6976 3e0a 3c64 6976 M>
.
< │ │ │ │ -0000cea0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -0000ceb0: 6e6f 223e 2020 3334 393c 2f73 7061 6e3e no"> 349 │ │ │ │ -0000cec0: 2020 2020 7374 643a 3a73 6861 7265 645f std::shared_ │ │ │ │ -0000ced0: 7074 7226 6c74 3b44 756e 653a 3a49 6e76 ptr<Dune::Inv │ │ │ │ -0000cee0: 6572 7365 4f70 6572 6174 6f72 266c 743b erseOperator< │ │ │ │ -0000cef0: 7479 7065 6e61 6d65 2044 756e 653a 3a54 typename Dune::T │ │ │ │ -0000cf00: 7970 654c 6973 7445 6c65 6d65 6e74 266c ypeListElement&l │ │ │ │ -0000cf10: 743b 312c 2054 4c26 6774 3b3a 3a74 7970 t;1, TL>::typ │ │ │ │ -0000cf20: 652c 3c2f 6469 763e 0a3c 6469 7620 636c e,
.
350 │ │ │ │ -0000cf80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000cf90: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ -0000cfa0: 2020 2020 2020 203c 7370 616e 2063 6c61 typ │ │ │ │ -0000cfc0: 656e 616d 653c 2f73 7061 6e3e 2044 756e ename Dun │ │ │ │ -0000cfd0: 653a 3a54 7970 654c 6973 7445 6c65 6d65 e::TypeListEleme │ │ │ │ -0000cfe0: 6e74 266c 743b 322c 2054 4c26 6774 3b3a nt<2, TL>: │ │ │ │ -0000cff0: 3a74 7970 6526 6774 3b26 6774 3b3c 2f64 :type>>.
.
351 op │ │ │ │ -0000d140: 6572 6174 6f72 2829 203c 2f61 3e28 544c erator() (TL │ │ │ │ -0000d150: 203c 7370 616e 2063 6c61 7373 3d22 636f /*tl*/, cons │ │ │ │ -0000d190: 743c 2f73 7061 6e3e 204d 2661 6d70 3b20 t M& │ │ │ │ -0000d1a0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d /*mat*/, cons │ │ │ │ -0000d1e0: 743c 2f73 7061 6e3e 2044 756e 653a 3a50 t Dune::P │ │ │ │ -0000d1f0: 6172 616d 6574 6572 5472 6565 2661 6d70 arameterTree& │ │ │ │ -0000d200: 3b20 3c73 7061 6e20 636c 6173 733d 2263 ; /*config │ │ │ │ -0000d220: 2a2f 3c2f 7370 616e 3e2c 3c2f 6469 763e */,
│ │ │ │ -0000d230: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000d260: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 352 std:: │ │ │ │ -0000d290: 656e 6162 6c65 5f69 665f 7426 6c74 3b21 enable_if_t<! │ │ │ │ -0000d2a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 isV │ │ │ │ -0000d2d0: 616c 6964 426c 6f63 6b3c 2f61 3e26 6c74 alidBlock< │ │ │ │ -0000d2e0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;typename< │ │ │ │ -0000d300: 2f73 7061 6e3e 2044 756e 653a 3a54 7970 /span> Dune::Typ │ │ │ │ -0000d310: 654c 6973 7445 6c65 6d65 6e74 266c 743b eListElement< │ │ │ │ -0000d320: 312c 2054 4c26 6774 3b3a 3a74 7970 653a 1, TL>::type: │ │ │ │ -0000d330: 3a62 6c6f 636b 5f74 7970 6526 6774 3b3a :block_type>: │ │ │ │ -0000d340: 3a76 616c 7565 2c3c 7370 616e 2063 6c61 :value,int> │ │ │ │ -0000d370: 3d20 3029 3c73 7061 6e20 636c 6173 733d = 0) const │ │ │ │ -0000d390: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -0000d3b0: 3c61 2069 643d 226c 3030 3335 3322 206e 353 {
.
354 │ │ │ │ -0000d470: 2020 2020 2044 554e 455f 5448 524f 5728 DUNE_THROW( │ │ │ │ -0000d480: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Unsu │ │ │ │ -0000d4b0: 7070 6f72 7465 6454 7970 653c 2f61 3e2c pportedType, │ │ │ │ -0000d4c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -0000d510: 2033 3535 3c2f 7370 616e 3e20 2020 2020 355 │ │ │ │ -0000d520: 2020 203c 7370 616e 2063 6c61 7373 3d22 & │ │ │ │ -0000d540: 7175 6f74 3b55 6e73 7570 706f 7274 6564 quot;Unsupported │ │ │ │ -0000d550: 2054 7970 6520 696e 2053 5051 5220 286f Type in SPQR (o │ │ │ │ -0000d560: 6e6c 7920 646f 7562 6c65 2061 6e64 2073 nly double and s │ │ │ │ -0000d570: 7464 3a3a 636f 6d70 6c65 7826 6c74 3b64 td::complex<d │ │ │ │ -0000d580: 6f75 626c 6526 6774 3b20 7375 7070 6f72 ouble> suppor │ │ │ │ -0000d590: 7465 6429 2671 756f 743b 3c2f 7370 616e ted)");
.
356 │ │ │ │ -0000d600: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
.
│ │ │ │ -0000d610: 0a3c 6469 7620 636c 6173 733d 226c 696e .. │ │ │ │ -0000d670: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
< │ │ │ │ -0000d6c0: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ │ -0000d6d0: 7265 663d 2261 3032 3833 322e 6874 6d6c ref="a02832.html │ │ │ │ -0000d6e0: 223e 2020 3335 383c 2f61 3e3c 2f73 7061 "> 358 templa │ │ │ │ -0000d710: 7465 3c2f 7370 616e 3e26 6c74 3b26 6774 te<> │ │ │ │ -0000d720: 3b20 3c73 7061 6e20 636c 6173 733d 226b ; struct < │ │ │ │ -0000d740: 2f73 7061 6e3e 3c61 2063 6c61 7373 3d22 /span>SPQRCreator:: │ │ │ │ -0000d780: 6973 5661 6c69 6442 6c6f 636b 3c2f 613e isValidBlock │ │ │ │ -0000d790: 266c 743b 4669 656c 6456 6563 746f 7226 <FieldVector& │ │ │ │ -0000d7a0: 6c74 3b64 6f75 626c 652c 3126 6774 3b26 lt;double,1>& │ │ │ │ -0000d7b0: 6774 3b20 3a20 7374 643a 3a74 7275 655f gt; : std::true_ │ │ │ │ -0000d7c0: 7479 7065 7b7d 3b3c 2f64 6976 3e0a 3c64 type{};
. │ │ │ │ -0000d7e0: 3c61 2069 643d 226c 3030 3335 3922 206e 359 // std │ │ │ │ -0000d840: 3a3a 636f 6d70 6c65 7820 6973 2074 656d ::complex is tem │ │ │ │ -0000d850: 706f 7261 7279 2064 6973 6162 6c65 642c porary disabled, │ │ │ │ -0000d860: 2062 6563 6175 7365 2069 7420 6661 696c because it fail │ │ │ │ -0000d870: 7320 6966 206c 6962 632b 2b20 6973 2075 s if libc++ is u │ │ │ │ -0000d880: 7365 643c 2f73 7061 6e3e 3c2f 6469 763e sed
│ │ │ │ -0000d890: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -0000d8c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 360 //t │ │ │ │ -0000d900: 656d 706c 6174 6526 6c74 3b26 6774 3b20 emplate<> │ │ │ │ -0000d910: 7374 7275 6374 2053 5051 5243 7265 6174 struct SPQRCreat │ │ │ │ -0000d920: 6f72 3a3a 6973 5661 6c69 644d 6174 7269 or::isValidMatri │ │ │ │ -0000d930: 7842 6c6f 636b 266c 743b 4669 656c 644d xBlock<FieldM │ │ │ │ -0000d940: 6174 7269 7826 6c74 3b73 7464 3a3a 636f atrix<std::co │ │ │ │ -0000d950: 6d70 6c65 7826 6c74 3b64 6f75 626c 6526 mplex<double& │ │ │ │ -0000d960: 6774 3b2c 312c 3126 6774 3b26 6774 3b20 gt;,1,1>> │ │ │ │ -0000d970: 3a20 7374 643a 3a74 7275 655f 7479 7065 : std::true_type │ │ │ │ -0000d980: 7b7d 3b3c 2f73 7061 6e3e 3c2f 6469 763e {};
│ │ │ │ -0000d990: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
362< │ │ │ │ -0000db70: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ -0000db90: 3c61 2069 643d 226c 3030 3336 3322 206e 363} // end │ │ │ │ -0000dbf0: 206e 616d 6573 7061 6365 2044 756e 653c namespace Dune< │ │ │ │ -0000dc00: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -0000dc20: 6120 6964 3d22 6c30 3033 3634 2220 6e61 a id="l00364" na │ │ │ │ -0000dc30: 6d65 3d22 6c30 3033 3634 223e 3c2f 613e me="l00364"> │ │ │ │ -0000dc40: 3c73 7061 6e20 636c 6173 733d 226c 696e 364
.
365 .
3 │ │ │ │ -0000dd10: 3636 3c2f 7370 616e 3e3c 7370 616e 2063 66#endif //HAVE_S │ │ │ │ -0000dd60: 5549 5445 5350 4152 5345 5f53 5051 523c UITESPARSE_SPQR< │ │ │ │ -0000dd70: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -0000dd90: 6120 6964 3d22 6c30 3033 3637 2220 6e61 a id="l00367" na │ │ │ │ -0000dda0: 6d65 3d22 6c30 3033 3637 223e 3c2f 613e me="l00367"> │ │ │ │ -0000ddb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 367#end │ │ │ │ -0000ddf0: 6966 203c 2f73 7061 6e3e 3c73 7061 6e20 if │ │ │ │ -0000de10: 2f2f 4455 4e45 5f49 5354 4c5f 5350 5152 //DUNE_ISTL_SPQR │ │ │ │ -0000de20: 5f48 483c 2f73 7061 6e3e 3c2f 6469 763e _HH
│ │ │ │ -0000de30: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
#defi │ │ │ │ -0000df00: 6e65 2044 554e 455f 5245 4749 5354 4552 ne DUNE_REGISTER │ │ │ │ -0000df10: 5f44 4952 4543 545f 534f 4c56 4552 286e _DIRECT_SOLVER(n │ │ │ │ -0000df20: 616d 652c 2e2e 2e29 3c2f 6469 763e 3c64 ame,...)
Definition solverregistr │ │ │ │ -0000df60: 792e 6868 3a31 333c 2f64 6976 3e3c 2f64 y.hh:13
.
solvers.hh< │ │ │ │ -0000dfd0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Implemen │ │ │ │ -0000dff0: 7461 7469 6f6e 7320 6f66 2074 6865 2069 tations of the i │ │ │ │ -0000e000: 6e76 6572 7365 206f 7065 7261 746f 7220 nverse operator │ │ │ │ -0000e010: 696e 7465 7266 6163 652e 3c2f 6469 763e interface.
│ │ │ │ -0000e020: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.
.< │ │ │ │ -0000e170: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -0000e180: 223e 5465 6d70 6c61 7465 7320 6368 6172 ">Templates char │ │ │ │ -0000e190: 6163 7465 7269 7a69 6e67 2074 6865 2074 acterizing the t │ │ │ │ -0000e1a0: 7970 6520 6f66 2061 2073 6f6c 7665 722e ype of a solver. │ │ │ │ -0000e1b0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.Dune::BCRSMatr │ │ │ │ -0000e2d0: 6978 266c 743b 2046 6965 6c64 4d61 7472 ix< FieldMatr │ │ │ │ -0000e2e0: 6978 266c 743b 2054 2c20 6e2c 206d 2026 ix< T, n, m & │ │ │ │ -0000e2f0: 6774 3b2c 2041 2026 6774 3b20 6d61 7472 gt;, A > matr │ │ │ │ -0000e300: 6978 5f74 7970 653c 2f64 6976 3e3c 6469 ix_type
│ │ │ │ -0000e320: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition spqr.hh:71
.
< │ │ │ │ -0000e390: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ -0000e3a0: 6522 3e3c 6120 6872 6566 3d22 6130 3032 e">Dune │ │ │ │ -0000e3e0: 3a3a 5350 5152 266c 743b 2042 4352 534d ::SPQR< BCRSM │ │ │ │ -0000e3f0: 6174 7269 7826 6c74 3b20 4669 656c 644d atrix< FieldM │ │ │ │ -0000e400: 6174 7269 7826 6c74 3b20 542c 206e 2c20 atrix< T, n, │ │ │ │ -0000e410: 6d20 2667 743b 2c20 4120 2667 743b 2026 m >, A > & │ │ │ │ -0000e420: 6774 3b3a 3a7e 5350 5152 3c2f 613e 3c2f gt;::~SPQR
virtual │ │ │ │ -0000e450: 7e53 5051 5228 293c 2f64 6976 3e3c 6469 ~SPQR()
│ │ │ │ -0000e470: 4465 7374 7275 6374 6f72 2e3c 2f64 6976 Destructor.
Definitio │ │ │ │ -0000e4a0: 6e3c 2f62 3e20 7370 7172 2e68 683a 3134 n spqr.hh:14 │ │ │ │ -0000e4b0: 373c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 7
.
SPQR │ │ │ │ -0000e5c0: 2863 6f6e 7374 204d 6174 7269 7820 2661 (const Matrix &a │ │ │ │ -0000e5d0: 6d70 3b6d 6174 7269 782c 2069 6e74 2076 mp;matrix, int v │ │ │ │ -0000e5e0: 6572 626f 7365 2c20 626f 6f6c 293c 2f64 erbose, bool)
Constructo │ │ │ │ -0000e610: 7220 666f 7220 636f 6d70 6174 6962 696c r for compatibil │ │ │ │ -0000e620: 6974 7920 7769 7468 2053 7570 6572 4c55 ity with SuperLU │ │ │ │ -0000e630: 2073 7461 6e64 6172 6420 636f 6e73 7472 standard constr │ │ │ │ -0000e640: 7563 746f 722e 3c2f 6469 763e 3c64 6976 uctor.
< │ │ │ │ -0000e660: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -0000e670: 2073 7071 722e 6868 3a31 3133 3c2f 6469 spqr.hh:113
.
virtu │ │ │ │ -0000e790: 616c 2053 6f6c 7665 7243 6174 6567 6f72 al SolverCategor │ │ │ │ -0000e7a0: 793a 3a43 6174 6567 6f72 7920 6361 7465 y::Category cate │ │ │ │ -0000e7b0: 676f 7279 2829 2063 6f6e 7374 3c2f 6469 gory() const
Category of │ │ │ │ -0000e7e0: 2074 6865 2073 6f6c 7665 7220 2873 6565 the solver (see │ │ │ │ -0000e7f0: 2053 6f6c 7665 7243 6174 6567 6f72 793a SolverCategory: │ │ │ │ -0000e800: 3a43 6174 6567 6f72 7929 3c2f 6469 763e :Category)
│ │ │ │ -0000e810: 3c64 6976 2063 6c61 7373 3d22 7474 6465
Definition │ │ │ │ -0000e830: 3c2f 623e 2073 7071 722e 6868 3a38 323c spqr.hh:82< │ │ │ │ -0000e840: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
D │ │ │ │ -0000e8e0: 756e 653a 3a53 5051 5226 6c74 3b20 4243 une::SPQR< BC │ │ │ │ -0000e8f0: 5253 4d61 7472 6978 266c 743b 2046 6965 RSMatrix< Fie │ │ │ │ -0000e900: 6c64 4d61 7472 6978 266c 743b 2054 2c20 ldMatrix< T, │ │ │ │ -0000e910: 6e2c 206d 2026 6774 3b2c 2041 2026 6774 n, m >, A > │ │ │ │ -0000e920: 3b20 2667 743b 3a3a 6765 7449 6e74 6572 ; >::getInter │ │ │ │ -0000e930: 6e61 6c4d 6174 7269 783c 2f61 3e3c 2f64 nalMatrix
SPQRMatri │ │ │ │ -0000e960: 7820 2661 6d70 3b20 6765 7449 6e74 6572 x & getInter │ │ │ │ -0000e970: 6e61 6c4d 6174 7269 7828 293c 2f64 6976 nalMatrix()
Return the c │ │ │ │ -0000e9a0: 6f6c 756d 6e20 636f 7070 7265 7373 6564 olumn coppressed │ │ │ │ -0000e9b0: 206d 6174 7269 782e 3c2f 6469 763e 3c64 matrix.
Definition spqr.hh:256
.
vo │ │ │ │ -0000eb00: 6964 2073 6574 4d61 7472 6978 2863 6f6e id setMatrix(con │ │ │ │ -0000eb10: 7374 204d 6174 7269 7820 2661 6d70 3b6d st Matrix &m │ │ │ │ -0000eb20: 6174 7269 7829 3c2f 6469 763e 3c64 6976 atrix)
I │ │ │ │ -0000eb40: 6e69 7469 616c 697a 6520 6461 7461 2066 nitialize data f │ │ │ │ -0000eb50: 726f 6d20 6769 7665 6e20 6d61 7472 6978 rom given matrix │ │ │ │ -0000eb60: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ │ -0000eb80: 696e 6974 696f 6e3c 2f62 3e20 7370 7172 inition spqr │ │ │ │ -0000eb90: 2e68 683a 3230 303c 2f64 6976 3e3c 2f64 .hh:200
.
I │ │ │ │ -0000ecb0: 5354 4c3a 3a49 6d70 6c3a 3a42 4343 534d STL::Impl::BCCSM │ │ │ │ -0000ecc0: 6174 7269 7849 6e69 7469 616c 697a 6572 atrixInitializer │ │ │ │ -0000ecd0: 266c 743b 2042 4352 534d 6174 7269 7826 < BCRSMatrix& │ │ │ │ -0000ece0: 6c74 3b20 4669 656c 644d 6174 7269 7826 lt; FieldMatrix& │ │ │ │ -0000ecf0: 6c74 3b20 542c 206e 2c20 6d20 2667 743b lt; T, n, m > │ │ │ │ -0000ed00: 2c20 4120 2667 743b 2c20 696e 7420 2667 , A >, int &g │ │ │ │ -0000ed10: 743b 204d 6174 7269 7849 6e69 7469 616c t; MatrixInitial │ │ │ │ -0000ed20: 697a 6572 3c2f 6469 763e 3c64 6976 2063 izer
Typ │ │ │ │ -0000ed40: 6520 6f66 2061 6e20 6173 736f 6369 6174 e of an associat │ │ │ │ -0000ed50: 6564 2069 6e69 7469 616c 697a 6572 2063 ed initializer c │ │ │ │ -0000ed60: 6c61 7373 2e3c 2f64 6976 3e3c 6469 7620 lass.
Definition │ │ │ │ -0000ed90: 7370 7172 2e68 683a 3735 3c2f 6469 763e spqr.hh:75
│ │ │ │ -0000eda0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
Dune:: │ │ │ │ -0000ee40: 5350 5152 266c 743b 2042 4352 534d 6174 SPQR< BCRSMat │ │ │ │ -0000ee50: 7269 7826 6c74 3b20 4669 656c 644d 6174 rix< FieldMat │ │ │ │ -0000ee60: 7269 7826 6c74 3b20 542c 206e 2c20 6d20 rix< T, n, m │ │ │ │ -0000ee70: 2667 743b 2c20 4120 2667 743b 2026 6774 >, A > > │ │ │ │ -0000ee80: 3b3a 3a4d 6174 7269 783c 2f61 3e3c 2f64 ;::Matrix
Dune::BCR │ │ │ │ -0000eeb0: 534d 6174 7269 7826 6c74 3b20 4669 656c SMatrix< Fiel │ │ │ │ -0000eec0: 644d 6174 7269 7826 6c74 3b20 542c 206e dMatrix< T, n │ │ │ │ -0000eed0: 2c20 6d20 2667 743b 2c20 4120 2667 743b , m >, A > │ │ │ │ -0000eee0: 204d 6174 7269 783c 2f64 6976 3e3c 6469 Matrix
│ │ │ │ -0000ef00: 5468 6520 6d61 7472 6978 2074 7970 652e The matrix type. │ │ │ │ -0000ef10: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ -0000ef30: 6e69 7469 6f6e 3c2f 623e 2073 7071 722e nition spqr. │ │ │ │ -0000ef40: 6868 3a37 303c 2f64 6976 3e3c 2f64 6976 hh:70
.
│ │ │ │ -0000f050: 5350 5152 2829 3c2f 6469 763e 3c64 6976 SPQR()
D │ │ │ │ -0000f070: 6566 6175 6c74 2063 6f6e 7374 7275 6374 efault construct │ │ │ │ -0000f080: 6f72 2e3c 2f64 6976 3e3c 6469 7620 636c or.
D │ │ │ │ -0000f0a0: 6566 696e 6974 696f 6e3c 2f62 3e20 7370 efinition sp │ │ │ │ -0000f0b0: 7172 2e68 683a 3133 373c 2f64 6976 3e3c qr.hh:137
< │ │ │ │ -0000f0c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -0000f180: 3c64 6976 2063 6c61 7373 3d22 7474 6465
std::shared_ │ │ │ │ -0000f1a0: 7074 7226 6c74 3b20 4475 6e65 3a3a 496e ptr< Dune::In │ │ │ │ -0000f1b0: 7665 7273 654f 7065 7261 746f 7226 6c74 verseOperator< │ │ │ │ -0000f1c0: 3b20 7479 7065 6e61 6d65 2044 756e 653a ; typename Dune: │ │ │ │ -0000f1d0: 3a54 7970 654c 6973 7445 6c65 6d65 6e74 :TypeListElement │ │ │ │ -0000f1e0: 266c 743b 2031 2c20 544c 2026 6774 3b3a < 1, TL >: │ │ │ │ -0000f1f0: 3a74 7970 652c 2074 7970 656e 616d 6520 :type, typename │ │ │ │ -0000f200: 4475 6e65 3a3a 5479 7065 4c69 7374 456c Dune::TypeListEl │ │ │ │ -0000f210: 656d 656e 7426 6c74 3b20 322c 2054 4c20 ement< 2, TL │ │ │ │ -0000f220: 2667 743b 3a3a 7479 7065 2026 6774 3b20 >::type > │ │ │ │ -0000f230: 2667 743b 206f 7065 7261 746f 7228 2928 > operator()( │ │ │ │ -0000f240: 544c 2c20 636f 6e73 7420 4d20 2661 6d70 TL, const M & │ │ │ │ -0000f250: 3b6d 6174 2c20 636f 6e73 7420 4475 6e65 ;mat, const Dune │ │ │ │ -0000f260: 3a3a 5061 7261 6d65 7465 7254 7265 6520 ::ParameterTree │ │ │ │ -0000f270: 2661 6d70 3b63 6f6e 6669 672c 2073 7464 &config, std │ │ │ │ -0000f280: 3a3a 656e 6162 6c65 5f69 665f 7426 6c74 ::enable_if_t< │ │ │ │ -0000f290: 3b20 6973 5661 6c69 6442 6c6f 636b 266c ; isValidBlock&l │ │ │ │ -0000f2a0: 743b 2074 7970 656e 616d 6520 4475 6e65 t; typename Dune │ │ │ │ -0000f2b0: 3a3a 5479 7065 4c69 7374 456c 656d 656e ::TypeListElemen │ │ │ │ -0000f2c0: 7426 6c74 3b20 312c 2054 4c20 2667 743b t< 1, TL > │ │ │ │ -0000f2d0: 3a3a 7479 7065 3a3a 626c 6f63 6b5f 7479 ::type::block_ty │ │ │ │ -0000f2e0: 7065 2026 6774 3b3a 3a76 616c 7565 2c20 pe >::value, │ │ │ │ -0000f2f0: 696e 7420 2667 743b 3d30 2920 636f 6e73 int >=0) cons │ │ │ │ -0000f300: 743c 2f64 6976 3e3c 6469 7620 636c 6173 t
Def │ │ │ │ -0000f320: 696e 6974 696f 6e3c 2f62 3e20 7370 7172 inition spqr │ │ │ │ -0000f330: 2e68 683a 3333 393c 2f64 6976 3e3c 2f64 .hh:339
.
Ge │ │ │ │ -0000f470: 7420 6d65 7468 6f64 206e 616d 652e 3c2f t method name.
Defini │ │ │ │ -0000f4a0: 7469 6f6e 3c2f 623e 2073 7071 722e 6868 tion spqr.hh │ │ │ │ -0000f4b0: 3a32 3735 3c2f 6469 763e 3c2f 6469 763e :275
│ │ │ │ -0000f4c0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
Suite │ │ │ │ -0000f5d0: 5370 6172 7365 5152 5f66 6163 746f 7269 SparseQR_factori │ │ │ │ -0000f5e0: 7a61 7469 6f6e 266c 743b 2054 2026 6774 zation< T > │ │ │ │ -0000f5f0: 3b20 2a20 6765 7446 6163 746f 7269 7a61 ; * getFactoriza │ │ │ │ -0000f600: 7469 6f6e 2829 3c2f 6469 763e 3c64 6976 tion()
R │ │ │ │ -0000f620: 6574 7572 6e20 7468 6520 6d61 7472 6978 eturn the matrix │ │ │ │ -0000f630: 2066 6163 746f 7269 7a61 7469 6f6e 2e3c factorization.< │ │ │ │ -0000f640: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -0000f660: 6974 696f 6e3c 2f62 3e20 7370 7172 2e68 ition spqr.h │ │ │ │ -0000f670: 683a 3234 373c 2f64 6976 3e3c 2f64 6976 h:247
.
Dune::SPQR& │ │ │ │ -0000f720: 6c74 3b20 4243 5253 4d61 7472 6978 266c lt; BCRSMatrix&l │ │ │ │ -0000f730: 743b 2046 6965 6c64 4d61 7472 6978 266c t; FieldMatrix&l │ │ │ │ -0000f740: 743b 2054 2c20 6e2c 206d 2026 6774 3b2c t; T, n, m >, │ │ │ │ -0000f750: 2041 2026 6774 3b20 2667 743b 3a3a 7365 A > >::se │ │ │ │ -0000f760: 7456 6572 626f 7369 7479 3c2f 613e 3c2f tVerbosity
void set │ │ │ │ -0000f790: 5665 7262 6f73 6974 7928 696e 7420 7629 Verbosity(int v) │ │ │ │ -0000f7a0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Sets th │ │ │ │ -0000f7c0: 6520 7665 7262 6f73 6974 7920 6c65 7665 e verbosity leve │ │ │ │ -0000f7d0: 6c20 666f 7220 7468 6520 736f 6c76 6572 l for the solver │ │ │ │ -0000f7e0: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ │ -0000f800: 696e 6974 696f 6e3c 2f62 3e20 7370 7172 inition spqr │ │ │ │ -0000f810: 2e68 683a 3233 383c 2f64 6976 3e3c 2f64 .hh:238
.
Dune::SPQ │ │ │ │ -0000f8c0: 5226 6c74 3b20 4243 5253 4d61 7472 6978 R< BCRSMatrix │ │ │ │ -0000f8d0: 266c 743b 2046 6965 6c64 4d61 7472 6978 < FieldMatrix │ │ │ │ -0000f8e0: 266c 743b 2054 2c20 6e2c 206d 2026 6774 < T, n, m > │ │ │ │ -0000f8f0: 3b2c 2041 2026 6774 3b20 2667 743b 3a3a ;, A > >:: │ │ │ │ -0000f900: 5350 5152 4d61 7472 6978 3c2f 613e 3c2f SPQRMatrix
ISTL::Im │ │ │ │ -0000f930: 706c 3a3a 4243 4353 4d61 7472 6978 266c pl::BCCSMatrix&l │ │ │ │ -0000f940: 743b 2054 2c20 696e 7420 2667 743b 2053 t; T, int > S │ │ │ │ -0000f950: 5051 524d 6174 7269 783c 2f64 6976 3e3c PQRMatrix
< │ │ │ │ -0000f960: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -0000f970: 223e 5468 6520 636f 7272 6573 706f 6e64 ">The correspond │ │ │ │ -0000f980: 696e 6720 5375 7065 724c 5520 4d61 7472 ing SuperLU Matr │ │ │ │ -0000f990: 6978 2074 7970 652e 3c2f 6469 763e 3c64 ix type.
Definition spqr.hh:73
.
│ │ │ │ -0000fa20: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
Dun │ │ │ │ -0000fa70: 653a 3a53 5051 5226 6c74 3b20 4243 5253 e::SPQR< BCRS │ │ │ │ -0000fa80: 4d61 7472 6978 266c 743b 2046 6965 6c64 Matrix< Field │ │ │ │ -0000fa90: 4d61 7472 6978 266c 743b 2054 2c20 6e2c Matrix< T, n, │ │ │ │ -0000faa0: 206d 2026 6774 3b2c 2041 2026 6774 3b20 m >, A > │ │ │ │ -0000fab0: 2667 743b 3a3a 6170 706c 793c 2f61 3e3c >::apply< │ │ │ │ -0000fac0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
virtual │ │ │ │ -0000fae0: 2076 6f69 6420 6170 706c 7928 646f 6d61 void apply(doma │ │ │ │ -0000faf0: 696e 5f74 7970 6520 2661 6d70 3b78 2c20 in_type &x, │ │ │ │ -0000fb00: 7261 6e67 655f 7479 7065 2026 616d 703b range_type & │ │ │ │ -0000fb10: 622c 2064 6f75 626c 6520 7265 6475 6374 b, double reduct │ │ │ │ -0000fb20: 696f 6e2c 2049 6e76 6572 7365 4f70 6572 ion, InverseOper │ │ │ │ -0000fb30: 6174 6f72 5265 7375 6c74 2026 616d 703b atorResult & │ │ │ │ -0000fb40: 7265 7329 3c2f 6469 763e 3c64 6976 2063 res)
app │ │ │ │ -0000fb60: 6c79 2069 6e76 6572 7365 206f 7065 7261 ly inverse opera │ │ │ │ -0000fb70: 746f 722c 2077 6974 6820 6769 7665 6e20 tor, with given │ │ │ │ -0000fb80: 636f 6e76 6572 6765 6e63 6520 6372 6974 convergence crit │ │ │ │ -0000fb90: 6572 6961 2e3c 2f64 6976 3e3c 6469 7620 eria.
Definition │ │ │ │ -0000fbc0: 7370 7172 2e68 683a 3139 313c 2f64 6976 spqr.hh:191
.
Dune: │ │ │ │ -0000fc70: 3a53 5051 5226 6c74 3b20 4243 5253 4d61 :SPQR< BCRSMa │ │ │ │ -0000fc80: 7472 6978 266c 743b 2046 6965 6c64 4d61 trix< FieldMa │ │ │ │ -0000fc90: 7472 6978 266c 743b 2054 2c20 6e2c 206d trix< T, n, m │ │ │ │ -0000fca0: 2026 6774 3b2c 2041 2026 6774 3b20 2667 >, A > &g │ │ │ │ -0000fcb0: 743b 3a3a 6672 6565 3c2f 613e 3c2f 6469 t;::free
void free( │ │ │ │ -0000fce0: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
Free a │ │ │ │ -0000fd00: 6c6c 6f63 6174 6564 2073 7061 6365 2e3c llocated space.< │ │ │ │ -0000fd10: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -0000fd30: 6974 696f 6e3c 2f62 3e20 7370 7172 2e68 ition spqr.h │ │ │ │ -0000fd40: 683a 3236 353c 2f64 6976 3e3c 2f64 6976 h:265
.
│ │ │ │ -0000fe50: 5350 5152 2863 6f6e 7374 204d 6174 7269 SPQR(const Matri │ │ │ │ -0000fe60: 7820 2661 6d70 3b6d 6174 7269 782c 2063 x &matrix, c │ │ │ │ -0000fe70: 6f6e 7374 2050 6172 616d 6574 6572 5472 onst ParameterTr │ │ │ │ -0000fe80: 6565 2026 616d 703b 636f 6e66 6967 293c ee &config)< │ │ │ │ -0000fe90: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Construc │ │ │ │ -0000feb0: 7473 2074 6865 2053 5051 5220 736f 6c76 ts the SPQR solv │ │ │ │ -0000fec0: 6572 2e3c 2f64 6976 3e3c 6469 7620 636c er.
D │ │ │ │ -0000fee0: 6566 696e 6974 696f 6e3c 2f62 3e20 7370 efinition sp │ │ │ │ -0000fef0: 7172 2e68 683a 3133 323c 2f64 6976 3e3c qr.hh:132
< │ │ │ │ -0000ff00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
Dune:: │ │ │ │ -00010010: 426c 6f63 6b56 6563 746f 7226 6c74 3b20 BlockVector< │ │ │ │ -00010020: 4669 656c 6456 6563 746f 7226 6c74 3b20 FieldVector< │ │ │ │ -00010030: 542c 206e 2026 6774 3b2c 2074 7970 656e T, n >, typen │ │ │ │ -00010040: 616d 6520 7374 643a 3a61 6c6c 6f63 6174 ame std::allocat │ │ │ │ -00010050: 6f72 5f74 7261 6974 7326 6c74 3b20 4120 or_traits< A │ │ │ │ -00010060: 2667 743b 3a3a 7465 6d70 6c61 7465 2072 >::template r │ │ │ │ -00010070: 6562 696e 645f 616c 6c6f 6326 6c74 3b20 ebind_alloc< │ │ │ │ -00010080: 4669 656c 6456 6563 746f 7226 6c74 3b20 FieldVector< │ │ │ │ -00010090: 542c 206e 2026 6774 3b20 2667 743b 2026 T, n > > & │ │ │ │ -000100a0: 6774 3b20 7261 6e67 655f 7479 7065 3c2f gt; range_type
The type │ │ │ │ -000100d0: 6f66 2074 6865 2072 616e 6765 206f 6620 of the range of │ │ │ │ -000100e0: 7468 6520 736f 6c76 6572 2e3c 2f64 6976 the solver.
Definitio │ │ │ │ -00010110: 6e3c 2f62 3e20 7370 7172 2e68 683a 3739 n spqr.hh:79 │ │ │ │ -00010120: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.< │ │ │ │ -00010220: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ -00010230: 6922 3e76 6f69 6420 7365 7453 7562 4d61 i">void setSubMa │ │ │ │ -00010240: 7472 6978 2863 6f6e 7374 204d 6174 7269 trix(const Matri │ │ │ │ -00010250: 7820 2661 6d70 3b6d 6174 7269 782c 2063 x &matrix, c │ │ │ │ -00010260: 6f6e 7374 2053 2026 616d 703b 726f 7749 onst S &rowI │ │ │ │ -00010270: 6e64 6578 5365 7429 3c2f 6469 763e 3c64 ndexSet)
Definition spqr.hh:217
.
│ │ │ │ -000103c0: 4475 6e65 3a3a 426c 6f63 6b56 6563 746f Dune::BlockVecto │ │ │ │ -000103d0: 7226 6c74 3b20 4669 656c 6456 6563 746f r< FieldVecto │ │ │ │ -000103e0: 7226 6c74 3b20 542c 206d 2026 6774 3b2c r< T, m >, │ │ │ │ -000103f0: 2074 7970 656e 616d 6520 7374 643a 3a61 typename std::a │ │ │ │ -00010400: 6c6c 6f63 6174 6f72 5f74 7261 6974 7326 llocator_traits& │ │ │ │ -00010410: 6c74 3b20 4120 2667 743b 3a3a 7465 6d70 lt; A >::temp │ │ │ │ -00010420: 6c61 7465 2072 6562 696e 645f 616c 6c6f late rebind_allo │ │ │ │ -00010430: 6326 6c74 3b20 4669 656c 6456 6563 746f c< FieldVecto │ │ │ │ -00010440: 7226 6c74 3b20 542c 206d 2026 6774 3b20 r< T, m > │ │ │ │ -00010450: 2667 743b 2026 6774 3b20 646f 6d61 696e > > domain │ │ │ │ -00010460: 5f74 7970 653c 2f64 6976 3e3c 6469 7620 _type
Th │ │ │ │ -00010480: 6520 7479 7065 206f 6620 7468 6520 646f e type of the do │ │ │ │ -00010490: 6d61 696e 206f 6620 7468 6520 736f 6c76 main of the solv │ │ │ │ -000104a0: 6572 2e3c 2f64 6976 3e3c 6469 7620 636c er.
D │ │ │ │ -000104c0: 6566 696e 6974 696f 6e3c 2f62 3e20 7370 efinition sp │ │ │ │ -000104d0: 7172 2e68 683a 3737 3c2f 6469 763e 3c2f qr.hh:77
.
< │ │ │ │ -00010540: 6120 6872 6566 3d22 6130 3032 3333 2e68 a href="a00233.h │ │ │ │ -00010550: 746d 6c23 6761 6539 6366 6430 3932 6630 tml#gae9cfd092f0 │ │ │ │ -00010560: 6561 3965 6361 3131 6537 3831 3038 3162 ea9eca11e781081b │ │ │ │ -00010570: 6631 6236 3666 223e 4475 6e65 3a3a 5350 f1b66f">Dune::SP │ │ │ │ -00010580: 5152 266c 743b 2042 4352 534d 6174 7269 QR< BCRSMatri │ │ │ │ -00010590: 7826 6c74 3b20 4669 656c 644d 6174 7269 x< FieldMatri │ │ │ │ -000105a0: 7826 6c74 3b20 542c 206e 2c20 6d20 2667 x< T, n, m &g │ │ │ │ -000105b0: 743b 2c20 4120 2667 743b 2026 6774 3b3a t;, A > >: │ │ │ │ -000105c0: 3a61 7070 6c79 3c2f 613e 3c2f 6469 763e :apply
│ │ │ │ -000105d0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
virtual void │ │ │ │ -000105f0: 2061 7070 6c79 2864 6f6d 6169 6e5f 7479 apply(domain_ty │ │ │ │ -00010600: 7065 2026 616d 703b 782c 2072 616e 6765 pe &x, range │ │ │ │ -00010610: 5f74 7970 6520 2661 6d70 3b62 2c20 496e _type &b, In │ │ │ │ -00010620: 7665 7273 654f 7065 7261 746f 7252 6573 verseOperatorRes │ │ │ │ -00010630: 756c 7420 2661 6d70 3b72 6573 293c 2f64 ult &res)
Apply inve │ │ │ │ -00010660: 7273 6520 6f70 6572 6174 6f72 2c2e 3c2f rse operator,.
Defini │ │ │ │ -00010690: 7469 6f6e 3c2f 623e 2073 7071 722e 6868 tion spqr.hh │ │ │ │ -000106a0: 3a31 3535 3c2f 6469 763e 3c2f 6469 763e :155
│ │ │ │ -000106b0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
│ │ │ │ -000107a0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
void setOpti │ │ │ │ -000107c0: 6f6e 2875 6e73 6967 6e65 6420 696e 7420 on(unsigned int │ │ │ │ -000107d0: 6f70 7469 6f6e 2c20 646f 7562 6c65 2076 option, double v │ │ │ │ -000107e0: 616c 7565 293c 2f64 6976 3e3c 6469 7620 alue)
Definition │ │ │ │ -00010810: 7370 7172 2e68 683a 3139 363c 2f64 6976 spqr.hh:196
.
Dune: │ │ │ │ -000108c0: 3a53 5051 5226 6c74 3b20 4243 5253 4d61 :SPQR< BCRSMa │ │ │ │ -000108d0: 7472 6978 266c 743b 2046 6965 6c64 4d61 trix< FieldMa │ │ │ │ -000108e0: 7472 6978 266c 743b 2054 2c20 6e2c 206d trix< T, n, m │ │ │ │ -000108f0: 2026 6774 3b2c 2041 2026 6774 3b20 2667 >, A > &g │ │ │ │ -00010900: 743b 3a3a 5350 5152 3c2f 613e 3c2f 6469 t;::SPQR
SPQR(const │ │ │ │ -00010930: 204d 6174 7269 7820 2661 6d70 3b6d 6174 Matrix &mat │ │ │ │ -00010940: 7269 782c 2069 6e74 2076 6572 626f 7365 rix, int verbose │ │ │ │ -00010950: 3d30 293c 2f64 6976 3e3c 6469 7620 636c =0)
Cons │ │ │ │ -00010970: 7472 7563 7420 6120 736f 6c76 6572 206f truct a solver o │ │ │ │ -00010980: 626a 6563 7420 6672 6f6d 2061 2042 4352 bject from a BCR │ │ │ │ -00010990: 534d 6174 7269 782e 3c2f 6469 763e 3c64 SMatrix.
Definition spqr.hh:95
.
│ │ │ │ -00010a20: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
Ma │ │ │ │ -00010a90: 7472 6978 2026 616d 703b 206d 6174 3c2f trix & mat
Defini │ │ │ │ -00010ac0: 7469 6f6e 3c2f 623e 206d 6174 7269 786d tion matrixm │ │ │ │ -00010ad0: 6174 7269 782e 6868 3a33 3437 3c2f 6469 atrix.hh:347
.
│ │ │ │ -00010b20: 3c61 2068 7265 663d 2261 3030 3234 392e Dune
Defini │ │ │ │ -00010b60: 7469 6f6e 3c2f 623e 2061 6c6c 6f63 6174 tion allocat │ │ │ │ -00010b70: 6f72 2e68 683a 3131 3c2f 6469 763e 3c2f or.hh:11
.
Pro │ │ │ │ -00010c40: 7065 7274 794d 6170 5479 7065 5365 6c65 pertyMapTypeSele │ │ │ │ -00010c50: 6374 6f72 266c 743b 2041 6d67 3a3a 5665 ctor< Amg::Ve │ │ │ │ -00010c60: 7274 6578 5669 7369 7465 6454 6167 2c20 rtexVisitedTag, │ │ │ │ -00010c70: 416d 673a 3a50 726f 7065 7274 6965 7347 Amg::PropertiesG │ │ │ │ -00010c80: 7261 7068 266c 743b 2047 2c20 416d 673a raph< G, Amg: │ │ │ │ -00010c90: 3a56 6572 7465 7850 726f 7065 7274 6965 :VertexPropertie │ │ │ │ -00010ca0: 732c 2045 502c 2056 4d2c 2045 4d20 2667 s, EP, VM, EM &g │ │ │ │ -00010cb0: 743b 2026 6774 3b3a 3a54 7970 6520 6765 t; >::Type ge │ │ │ │ -00010cc0: 7428 636f 6e73 7420 416d 673a 3a56 6572 t(const Amg::Ver │ │ │ │ -00010cd0: 7465 7856 6973 6974 6564 5461 6720 2661 texVisitedTag &a │ │ │ │ -00010ce0: 6d70 3b74 6167 2c20 416d 673a 3a50 726f mp;tag, Amg::Pro │ │ │ │ -00010cf0: 7065 7274 6965 7347 7261 7068 266c 743b pertiesGraph< │ │ │ │ -00010d00: 2047 2c20 416d 673a 3a56 6572 7465 7850 G, Amg::VertexP │ │ │ │ -00010d10: 726f 7065 7274 6965 732c 2045 502c 2056 roperties, EP, V │ │ │ │ -00010d20: 4d2c 2045 4d20 2667 743b 2026 616d 703b M, EM > & │ │ │ │ -00010d30: 6772 6170 6829 3c2f 6469 763e 3c64 6976 graph)
.< │ │ │ │ -00010d80: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00010d90: 6964 3d22 6161 3031 3133 365f 6874 6d6c id="aa01136_html │ │ │ │ -00010da0: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
Definition │ │ │ │ -00010e10: 6d61 7472 6978 7574 696c 732e 6868 3a32 matrixutils.hh:2 │ │ │ │ -00010e20: 3131 3c2f 6469 763e 3c2f 6469 763e 0a3c 11
.< │ │ │ │ -00010e30: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00010e40: 6964 3d22 6161 3031 3135 325f 6874 6d6c id="aa01152_html │ │ │ │ -00010e50: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
Dune │ │ │ │ -00010e80: 3a3a 4243 5253 4d61 7472 6978 3c2f 613e ::BCRSMatrix │ │ │ │ -00010e90: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
A spars │ │ │ │ -00010eb0: 6520 626c 6f63 6b20 6d61 7472 6978 2077 e block matrix w │ │ │ │ -00010ec0: 6974 6820 636f 6d70 7265 7373 6564 2072 ith compressed r │ │ │ │ -00010ed0: 6f77 2073 746f 7261 6765 2e3c 2f64 6976 ow storage.
Definitio │ │ │ │ -00010f00: 6e3c 2f62 3e20 6263 7273 6d61 7472 6978 n bcrsmatrix │ │ │ │ -00010f10: 2e68 683a 3436 363c 2f64 6976 3e3c 2f64 .hh:466
.
Dune::BCRSM │ │ │ │ -00010fc0: 6174 7269 783a 3a4d 3c2f 613e 3c2f 6469 atrix::M
size_type │ │ │ │ -00010ff0: 4d28 2920 636f 6e73 743c 2f64 6976 3e3c M() const
< │ │ │ │ -00011000: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -00011010: 223e 6e75 6d62 6572 206f 6620 636f 6c75 ">number of colu │ │ │ │ -00011020: 6d6e 7320 2863 6f75 6e74 6564 2069 6e20 mns (counted in │ │ │ │ -00011030: 626c 6f63 6b73 293c 2f64 6976 3e3c 6469 blocks)
│ │ │ │ -00011050: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition bcrsmatrix.hh: │ │ │ │ -00011070: 3139 3738 3c2f 6469 763e 3c2f 6469 763e 1978
│ │ │ │ -00011080: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
< │ │ │ │ -00011130: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ -00011140: 6922 3e73 697a 655f 7479 7065 204e 2829 i">size_type N() │ │ │ │ -00011150: 2063 6f6e 7374 3c2f 6469 763e 3c64 6976 const
n │ │ │ │ -00011170: 756d 6265 7220 6f66 2072 6f77 7320 2863 umber of rows (c │ │ │ │ -00011180: 6f75 6e74 6564 2069 6e20 626c 6f63 6b73 ounted in blocks │ │ │ │ -00011190: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
Def │ │ │ │ -000111b0: 696e 6974 696f 6e3c 2f62 3e20 6263 7273 inition bcrs │ │ │ │ -000111c0: 6d61 7472 6978 2e68 683a 3139 3732 3c2f matrix.hh:1972
.
Dune::Bl │ │ │ │ -00011230: 6f63 6b56 6563 746f 723c 2f61 3e3c 2f64 ockVector
A vector o │ │ │ │ -00011260: 6620 626c 6f63 6b73 2077 6974 6820 6d65 f blocks with me │ │ │ │ -00011270: 6d6f 7279 206d 616e 6167 656d 656e 742e mory management. │ │ │ │ -00011280: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ -000112a0: 6e69 7469 6f6e 3c2f 623e 2062 7665 6374 nition bvect │ │ │ │ -000112b0: 6f72 2e68 683a 3339 353c 2f64 6976 3e3c or.hh:395
< │ │ │ │ -000112c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..
Definition │ │ │ │ -00011470: 6f76 6572 6c61 7070 696e 6773 6368 7761 overlappingschwa │ │ │ │ -00011480: 727a 2e68 683a 3639 343c 2f64 6976 3e3c rz.hh:694
< │ │ │ │ -00011490: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
Definition matrixutils.h │ │ │ │ -00011530: 683a 3237 3c2f 6469 763e 3c2f 6469 763e h:27
│ │ │ │ -00011540: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
Du │ │ │ │ -00011590: 6e65 3a3a 496e 7665 7273 654f 7065 7261 ne::InverseOpera │ │ │ │ -000115a0: 746f 7252 6573 756c 743c 2f61 3e3c 2f64 torResult
Statistics │ │ │ │ -000115d0: 2061 626f 7574 2074 6865 2061 7070 6c69 about the appli │ │ │ │ -000115e0: 6361 7469 6f6e 206f 6620 616e 2069 6e76 cation of an inv │ │ │ │ -000115f0: 6572 7365 206f 7065 7261 746f 722e 3c2f erse operator.
Defini │ │ │ │ -00011620: 7469 6f6e 3c2f 623e 2073 6f6c 7665 722e tion solver. │ │ │ │ -00011630: 6868 3a34 383c 2f64 6976 3e3c 2f64 6976 hh:48
.
Dune::Inverse │ │ │ │ -000116e0: 4f70 6572 6174 6f72 5265 7375 6c74 3a3a OperatorResult:: │ │ │ │ -000116f0: 6974 6572 6174 696f 6e73 3c2f 613e 3c2f iterations
int iter │ │ │ │ -00011720: 6174 696f 6e73 3c2f 6469 763e 3c64 6976 ations
N │ │ │ │ -00011740: 756d 6265 7220 6f66 2069 7465 7261 7469 umber of iterati │ │ │ │ -00011750: 6f6e 732e 3c2f 6469 763e 3c64 6976 2063 ons.
│ │ │ │ -00011770: 4465 6669 6e69 7469 6f6e 3c2f 623e 2073 Definition s │ │ │ │ -00011780: 6f6c 7665 722e 6868 3a36 373c 2f64 6976 olver.hh:67
.
True if conv │ │ │ │ -000118a0: 6572 6765 6e63 6520 6372 6974 6572 696f ergence criterio │ │ │ │ -000118b0: 6e20 6861 7320 6265 656e 206d 6574 2e3c n has been met.< │ │ │ │ -000118c0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -000118e0: 6974 696f 6e3c 2f62 3e20 736f 6c76 6572 ition solver │ │ │ │ -000118f0: 2e68 683a 3733 3c2f 6469 763e 3c2f 6469 .hh:73
.
< │ │ │ │ -00011970: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -00011980: 223e 4162 7374 7261 6374 2062 6173 6520 ">Abstract base │ │ │ │ -00011990: 636c 6173 7320 666f 7220 616c 6c20 736f class for all so │ │ │ │ -000119a0: 6c76 6572 732e 3c2f 6469 763e 3c64 6976 lvers.
< │ │ │ │ -000119c0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ │ -000119d0: 2073 6f6c 7665 722e 6868 3a39 393c 2f64 solver.hh:99
.
< │ │ │ │ -00011a30: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ -00011a40: 6522 3e3c 6120 6872 6566 3d22 6130 3237 e">Dune: │ │ │ │ -00011a80: 3a53 6f6c 7665 7243 6174 6567 6f72 793a :SolverCategory: │ │ │ │ -00011a90: 3a43 6174 6567 6f72 793c 2f61 3e3c 2f64 :Category. │ │ │ │ -00011cd0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
.< │ │ │ │ -00011d60: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ -00011d70: 6964 3d22 6161 3032 3830 305f 6874 6d6c id="aa02800_html │ │ │ │ -00011d80: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
│ │ │ │ -00011de0: 4465 6669 6e69 7469 6f6e 3c2f 623e 2073 Definition s │ │ │ │ -00011df0: 6f6c 7665 7274 7970 652e 6868 3a31 363c olvertype.hh:16< │ │ │ │ -00011e00: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
D │ │ │ │ -00011ee0: 756e 653a 3a49 7344 6972 6563 7453 6f6c une::IsDirectSol │ │ │ │ -00011ef0: 7665 723a 3a76 616c 7565 3c2f 613e 3c2f ver::value
@ value< │ │ │ │ -00011f20: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Whether │ │ │ │ -00011f40: 7468 6973 2069 7320 6120 6469 7265 6374 this is a direct │ │ │ │ -00011f50: 2073 6f6c 7665 722e 3c2f 6469 763e 3c64 solver.
Definition solvertype.hh │ │ │ │ -00011f90: 3a32 343c 2f64 6976 3e3c 2f64 6976 3e0a :24
. │ │ │ │ -00011fa0: 3c64 6976 2063 6c61 7373 3d22 7474 6322
Dun │ │ │ │ -00011ff0: 653a 3a53 746f 7265 7343 6f6c 756d 6e43 e::StoresColumnC │ │ │ │ -00012000: 6f6d 7072 6573 7365 643c 2f61 3e3c 2f64 ompressed
Definit │ │ │ │ -00012030: 696f 6e3c 2f62 3e20 736f 6c76 6572 7479 ion solverty │ │ │ │ -00012040: 7065 2e68 683a 3330 3c2f 6469 763e 3c2f pe.hh:30
.
< │ │ │ │ -000120d0: 6120 6872 6566 3d22 6130 3238 3034 2e68 a href="a02804.h │ │ │ │ -000120e0: 746d 6c23 6161 6130 3732 3235 3662 3638 tml#aaa072256b68 │ │ │ │ -000120f0: 3030 6263 3030 6362 6331 6534 3635 6239 00bc00cbc1e465b9 │ │ │ │ -00012100: 3631 6361 6661 6362 3732 3465 3138 6364 61cafacb724e18cd │ │ │ │ -00012110: 3839 6536 6366 3739 3765 6533 3230 3863 89e6cf797ee3208c │ │ │ │ -00012120: 3362 6330 3063 223e 4475 6e65 3a3a 5374 3bc00c">Dune::St │ │ │ │ -00012130: 6f72 6573 436f 6c75 6d6e 436f 6d70 7265 oresColumnCompre │ │ │ │ -00012140: 7373 6564 3a3a 7661 6c75 653c 2f61 3e3c ssed::value< │ │ │ │ -00012150: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
@ value │ │ │ │ -00012170: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
whether │ │ │ │ -00012190: 2074 6865 2073 6f6c 7665 7220 696e 7465 the solver inte │ │ │ │ -000121a0: 726e 616c 6c79 2075 7365 7320 636f 6c75 rnally uses colu │ │ │ │ -000121b0: 6d6e 2063 6f6d 7072 6573 7365 6420 7374 mn compressed st │ │ │ │ -000121c0: 6f72 6167 653c 2f64 6976 3e3c 6469 7620 orage
Definition │ │ │ │ -000121f0: 736f 6c76 6572 7479 7065 2e68 683a 3336 solvertype.hh:36 │ │ │ │ -00012200: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
. │ │ │ │ -00012230: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 Use the SPQR pa │ │ │ │ -00012290: 636b 6167 6520 746f 2064 6972 6563 746c ckage to directl │ │ │ │ -000122a0: 7920 736f 6c76 6520 6c69 6e65 6172 2073 y solve linear s │ │ │ │ -000122b0: 7973 7465 6d73 20e2 8093 2065 6d70 7479 ystems ... empty │ │ │ │ -000122c0: 2064 6566 6175 6c74 2063 6c61 7373 2e3c default class.< │ │ │ │ -000122d0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -000122f0: 6974 696f 6e3c 2f62 3e20 7370 7172 2e68 ition spqr.h │ │ │ │ -00012300: 683a 3438 3c2f 6469 763e 3c2f 6469 763e h:48
│ │ │ │ -00012310: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
..
.
reparti │ │ │ │ +00000c40: 7469 6f6e 2e68 683c 2f64 6976 3e3c 2f64 tion.hh
.
.
.< │ │ │ │ +00000c80: 6120 6872 6566 3d22 6130 3031 3937 2e68 a href="a00197.h │ │ │ │ +00000c90: 746d 6c22 3e47 6f20 746f 2074 6865 2064 tml">Go to the d │ │ │ │ +00000ca0: 6f63 756d 656e 7461 7469 6f6e 206f 6620 ocumentation of │ │ │ │ +00000cb0: 7468 6973 2066 696c 652e 3c2f 613e 3c64 this file.
│ │ │ │ +00000d20: 313c 2f73 7061 6e3e 3c73 7061 6e20 636c 1// │ │ │ │ +00000d40: 2053 5044 582d 4669 6c65 436f 7079 7269 SPDX-FileCopyri │ │ │ │ +00000d50: 6768 7454 6578 743a 2043 6f70 7972 6967 ghtText: Copyrig │ │ │ │ +00000d60: 6874 2028 4329 2044 554e 4520 5072 6f6a ht (C) DUNE Proj │ │ │ │ +00000d70: 6563 7420 636f 6e74 7269 6275 746f 7273 ect contributors │ │ │ │ +00000d80: 2c20 7365 6520 6669 6c65 204c 4943 454e , see file LICEN │ │ │ │ +00000d90: 5345 2e6d 6420 696e 206d 6f64 756c 6520 SE.md in module │ │ │ │ +00000da0: 726f 6f74 3c2f 7370 616e 3e3c 2f64 6976 root
.
2< │ │ │ │ +00000e00: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>// S │ │ │ │ +00000e20: 5044 582d 4c69 6365 6e73 652d 4964 656e PDX-License-Iden │ │ │ │ +00000e30: 7469 6669 6572 3a20 4c69 6365 6e73 6552 tifier: LicenseR │ │ │ │ +00000e40: 6566 2d47 504c 2d32 2e30 2d6f 6e6c 792d ef-GPL-2.0-only- │ │ │ │ +00000e50: 7769 7468 2d44 554e 452d 6578 6365 7074 with-DUNE-except │ │ │ │ +00000e60: 696f 6e3c 2f73 7061 6e3e 3c2f 6469 763e ion
│ │ │ │ +00000e70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00000ea0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 3// -* │ │ │ │ +00000ee0: 2d20 7461 622d 7769 6474 683a 2034 3b20 - tab-width: 4; │ │ │ │ +00000ef0: 696e 6465 6e74 2d74 6162 732d 6d6f 6465 indent-tabs-mode │ │ │ │ +00000f00: 3a20 6e69 6c3b 2063 2d62 6173 6963 2d6f : nil; c-basic-o │ │ │ │ +00000f10: 6666 7365 743a 2032 202d 2a2d 3c2f 7370 ffset: 2 -*-
.
4// vi: set e │ │ │ │ +00000fa0: 7420 7473 3d34 2073 773d 3220 7374 733d t ts=4 sw=2 sts= │ │ │ │ +00000fb0: 323a 3c2f 7370 616e 3e3c 2f64 6976 3e0a 2:
. │ │ │ │ +00000fc0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .< │ │ │ │ +00001070: 6120 6964 3d22 6c30 3030 3036 2220 6e61 a id="l00006" na │ │ │ │ +00001080: 6d65 3d22 6c30 3030 3036 223e 3c2f 613e me="l00006"> │ │ │ │ +00001090: 3c73 7061 6e20 636c 6173 733d 226c 696e 6#def │ │ │ │ +000010d0: 696e 6520 4455 4e45 5f49 5354 4c5f 5245 ine DUNE_ISTL_RE │ │ │ │ +000010e0: 5041 5254 4954 494f 4e5f 4848 3c2f 7370 PARTITION_HH
.
7 < │ │ │ │ +00001150: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000011a0: 2020 383c 2f73 7061 6e3e 3c73 7061 6e20 8#include &l │ │ │ │ +000011d0: 743b 6361 7373 6572 7426 6774 3b3c 2f73 t;cassert>
.
9< │ │ │ │ +00001240: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00001250: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor">#inclu │ │ │ │ +00001260: 6465 2026 6c74 3b6d 6170 2667 743b 3c2f de <map>
.
< │ │ │ │ +000012b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000012c0: 6e6f 223e 2020 2031 303c 2f73 7061 6e3e no"> 10 │ │ │ │ +000012d0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ │ +000012f0: 7564 6520 266c 743b 7574 696c 6974 7926 ude <utility& │ │ │ │ +00001300: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
│ │ │ │ +00001310: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00001340: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 11 │ │ │ │ +00001380: 2369 6e63 6c75 6465 2026 6c74 3b63 6d61 #include <cma │ │ │ │ +00001390: 7468 2667 743b 3c2f 7370 616e 3e3c 2f64 th>.
1 │ │ │ │ +000013f0: 323c 2f73 7061 6e3e 203c 2f64 6976 3e0a 2
. │ │ │ │ +00001400: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +000014a0: 3c61 2069 643d 226c 3030 3031 3422 206e 14// Expli │ │ │ │ +00001500: 6369 746c 7920 7573 6520 4320 6c69 6e6b citly use C link │ │ │ │ +00001510: 6167 6520 6173 2073 636f 7463 6820 646f age as scotch do │ │ │ │ +00001520: 6573 206e 6f74 2065 7874 6572 6e20 2671 es not extern &q │ │ │ │ +00001530: 756f 743b 4326 7175 6f74 3b20 696e 2069 uot;C" in i │ │ │ │ +00001540: 7473 2068 6561 6465 7273 2e3c 2f73 7061 ts headers.
.
15// Works beca │ │ │ │ +000015d0: 7573 6520 5061 724d 4554 4953 2f4d 4554 use ParMETIS/MET │ │ │ │ +000015e0: 4953 2063 6865 636b 7320 7768 6574 6865 IS checks whethe │ │ │ │ +000015f0: 7220 636f 6d70 696c 6572 2069 7320 432b r compiler is C+ │ │ │ │ +00001600: 2b20 616e 6420 6f74 6865 7277 6973 653c + and otherwise< │ │ │ │ +00001610: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00001630: 6120 6964 3d22 6c30 3030 3136 2220 6e61 a id="l00016" na │ │ │ │ +00001640: 6d65 3d22 6c30 3030 3136 223e 3c2f 613e me="l00016"> │ │ │ │ +00001650: 3c73 7061 6e20 636c 6173 733d 226c 696e 16// does n │ │ │ │ +00001690: 6f74 2075 7365 2065 7874 6572 6e20 2671 ot use extern &q │ │ │ │ +000016a0: 756f 743b 4326 7175 6f74 3b2e 2054 6865 uot;C". The │ │ │ │ +000016b0: 7266 6f72 6520 6e6f 206e 6573 7465 6420 rfore no nested │ │ │ │ +000016c0: 6578 7465 726e 2026 7175 6f74 3b43 2671 extern "C&q │ │ │ │ +000016d0: 756f 743b 2077 696c 6c20 6265 2063 7265 uot; will be cre │ │ │ │ +000016e0: 6174 6564 3c2f 7370 616e 3e3c 2f64 6976 ated
.
17< │ │ │ │ +00001740: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>exte │ │ │ │ +00001760: 726e 3c2f 7370 616e 3e20 3c73 7061 6e20 rn "C&qu │ │ │ │ +00001790: 6f74 3b3c 2f73 7061 6e3e 3c2f 6469 763e ot;
│ │ │ │ +000017a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00001810: 6120 6964 3d22 6c30 3030 3139 2220 6e61 a id="l00019" na │ │ │ │ +00001820: 6d65 3d22 6c30 3030 3139 223e 3c2f 613e me="l00019"> │ │ │ │ +00001830: 3c73 7061 6e20 636c 6173 733d 226c 696e 19#inc │ │ │ │ +00001870: 6c75 6465 2026 6c74 3b70 6172 6d65 7469 lude <parmeti │ │ │ │ +00001880: 732e 6826 6774 3b3c 2f73 7061 6e3e 3c2f s.h>.
│ │ │ │ +000018e0: 3230 3c2f 7370 616e 3e7d 3c2f 6469 763e 20}
│ │ │ │ +000018f0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00001920: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 21 │ │ │ │ +00001960: 2365 6e64 6966 3c2f 7370 616e 3e3c 2f64 #endif.
2 │ │ │ │ +000019c0: 323c 2f73 7061 6e3e 203c 2f64 6976 3e0a 2
. │ │ │ │ +000019d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
24< │ │ │ │ +00001ac0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#include <du │ │ │ │ +00001af0: 6e65 2f63 6f6d 6d6f 6e2f 656e 756d 7365 ne/common/enumse │ │ │ │ +00001b00: 742e 6868 2667 743b 3c2f 7370 616e 3e3c t.hh>< │ │ │ │ +00001b10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00001b60: 2032 353c 2f73 7061 6e3e 3c73 7061 6e20 25#include &l │ │ │ │ +00001b90: 743b 6475 6e65 2f63 6f6d 6d6f 6e2f 7374 t;dune/common/st │ │ │ │ +00001ba0: 6473 7472 6561 6d73 2e68 6826 6774 3b3c dstreams.hh>< │ │ │ │ +00001bb0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00001bd0: 6120 6964 3d22 6c30 3030 3236 2220 6e61 a id="l00026" na │ │ │ │ +00001be0: 6d65 3d22 6c30 3030 3236 223e 3c2f 613e me="l00026"> │ │ │ │ +00001bf0: 3c73 7061 6e20 636c 6173 733d 226c 696e 26#inc │ │ │ │ +00001c30: 6c75 6465 2026 6c74 3b64 756e 652f 636f lude <dune/co │ │ │ │ +00001c40: 6d6d 6f6e 2f70 6172 616c 6c65 6c2f 6d70 mmon/parallel/mp │ │ │ │ +00001c50: 6974 7261 6974 732e 6868 2667 743b 3c2f itraits.hh>
.
< │ │ │ │ +00001ca0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00001cb0: 6e6f 223e 2020 2032 373c 2f73 7061 6e3e no"> 27 │ │ │ │ +00001cc0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ │ +00001ce0: 7564 6520 266c 743b 6475 6e65 2f63 6f6d ude <dune/com │ │ │ │ +00001cf0: 6d6f 6e2f 7061 7261 6c6c 656c 2f63 6f6d mon/parallel/com │ │ │ │ +00001d00: 6d75 6e69 6361 746f 722e 6868 2667 743b municator.hh> │ │ │ │ +00001d10: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00001d30: 3c61 2069 643d 226c 3030 3032 3822 206e 28#in │ │ │ │ +00001d90: 636c 7564 6520 266c 743b 6475 6e65 2f63 clude <dune/c │ │ │ │ +00001da0: 6f6d 6d6f 6e2f 7061 7261 6c6c 656c 2f69 ommon/parallel/i │ │ │ │ +00001db0: 6e64 6578 7365 742e 6868 2667 743b 3c2f ndexset.hh>
.
< │ │ │ │ +00001e00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00001e10: 6e6f 223e 2020 2032 393c 2f73 7061 6e3e no"> 29 │ │ │ │ +00001e20: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ │ +00001e40: 7564 6520 266c 743b 6475 6e65 2f63 6f6d ude <dune/com │ │ │ │ +00001e50: 6d6f 6e2f 7061 7261 6c6c 656c 2f69 6e64 mon/parallel/ind │ │ │ │ +00001e60: 6963 6573 7379 6e63 6572 2e68 6826 6774 icessyncer.hh> │ │ │ │ +00001e70: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +00001e80: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00001e90: 3e3c 6120 6964 3d22 6c30 3030 3330 2220 > 30#i │ │ │ │ +00001ef0: 6e63 6c75 6465 2026 6c74 3b64 756e 652f nclude <dune/ │ │ │ │ +00001f00: 636f 6d6d 6f6e 2f70 6172 616c 6c65 6c2f common/parallel/ │ │ │ │ +00001f10: 7265 6d6f 7465 696e 6469 6365 732e 6868 remoteindices.hh │ │ │ │ +00001f20: 2667 743b 3c2f 7370 616e 3e3c 2f64 6976 >
.
31< │ │ │ │ +00001f80: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#include <du │ │ │ │ +00001fb0: 6e65 2f63 6f6d 6d6f 6e2f 7261 6e67 6575 ne/common/rangeu │ │ │ │ +00001fc0: 7469 6c69 7469 6573 2e68 6826 6774 3b3c tilities.hh>< │ │ │ │ +00001fd0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00001ff0: 6120 6964 3d22 6c30 3030 3332 2220 6e61 a id="l00032" na │ │ │ │ +00002000: 6d65 3d22 6c30 3030 3332 223e 3c2f 613e me="l00032"> │ │ │ │ +00002010: 3c73 7061 6e20 636c 6173 733d 226c 696e 32
.
.
34< │ │ │ │ +00002160: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00002170: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor">#inclu │ │ │ │ +00002180: 6465 2026 6c74 3b3c 6120 636c 6173 733d de <dune/i │ │ │ │ +000021b0: 7374 6c2f 7061 616d 672f 6772 6170 682e stl/paamg/graph. │ │ │ │ +000021c0: 6868 3c2f 613e 2667 743b 3c2f 7370 616e hh>
.
│ │ │ │ +00002220: 2020 2033 353c 2f73 7061 6e3e 203c 2f64 35 .
4 │ │ │ │ +00002280: 343c 2f73 7061 6e3e 3c73 7061 6e20 636c 4na │ │ │ │ +000022a0: 6d65 7370 6163 6520 3c2f 7370 616e 3e3c mespace < │ │ │ │ +000022b0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +000022c0: 5f6e 616d 6573 7061 6365 2220 6872 6566 _namespace" href │ │ │ │ +000022d0: 3d22 6130 3032 3439 2e68 746d 6c22 3e44 ="a00249.html">D │ │ │ │ +000022e0: 756e 653c 2f61 3e3c 2f64 6976 3e0a 3c64 une
. │ │ │ │ +00002300: 3c61 2069 643d 226c 3030 3034 3522 206e 45{
.
. │ │ │ │ +00002390: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ +00002440: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ +000024b0: 3c61 2069 643d 226c 3030 3034 3822 206e 48 // E │ │ │ │ +00002510: 7870 6c69 6369 746c 7920 7370 6563 6966 xplicitly specif │ │ │ │ +00002520: 7920 6120 7265 616c 5f74 2061 6e64 2069 y a real_t and i │ │ │ │ +00002530: 6478 5f74 2066 6f72 206f 6c64 6572 2028 dx_t for older ( │ │ │ │ +00002540: 5061 7229 4d45 5449 5320 7665 7273 696f Par)METIS versio │ │ │ │ +00002550: 6e73 2074 6861 7420 646f 206e 6f74 3c2f ns that do not
.
< │ │ │ │ +000025a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000025b0: 6e6f 223e 2020 2034 393c 2f73 7061 6e3e no"> 49 │ │ │ │ +000025c0: 2020 2020 3c73 7061 6e20 636c 6173 733d // pro │ │ │ │ +000025e0: 7669 6465 2074 6865 7365 2074 7970 6564 vide these typed │ │ │ │ +000025f0: 6566 733c 2f73 7061 6e3e 3c2f 6469 763e efs
│ │ │ │ +00002600: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00002630: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 50 │ │ │ │ +00002670: 2369 6620 4841 5645 5f50 4152 4d45 5449 #if HAVE_PARMETI │ │ │ │ +00002680: 5320 2661 6d70 3b26 616d 703b 2064 6566 S && def │ │ │ │ +00002690: 696e 6564 2852 4541 4c54 5950 4557 4944 ined(REALTYPEWID │ │ │ │ +000026a0: 5448 293c 2f73 7061 6e3e 3c2f 6469 763e TH)
│ │ │ │ +000026b0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00002800: 6120 6964 3d22 6c30 3030 3532 2220 6e61 a id="l00052" na │ │ │ │ +00002810: 6d65 3d22 6c30 3030 3532 223e 3c2f 613e me="l00052"> │ │ │ │ +00002820: 3c73 7061 6e20 636c 6173 733d 226c 696e 52#els │ │ │ │ +00002860: 653c 2f73 7061 6e3e 3c2f 6469 763e 0a3c e
.< │ │ │ │ +00002870: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00002880: 3e3c 6120 6964 3d22 6c30 3030 3533 2220 > 5 │ │ │ │ +00002900: 333c 2f61 3e3c 2f73 7061 6e3e 2020 2020 3 │ │ │ │ +00002910: 3c73 7061 6e20 636c 6173 733d 226b 6579 using real_t = │ │ │ │ +00002990: 666c 6f61 743b 3c2f 6469 763e 0a3c 6469 float;
.< │ │ │ │ +000029b0: 6120 6964 3d22 6c30 3030 3534 2220 6e61 a id="l00054" na │ │ │ │ +000029c0: 6d65 3d22 6c30 3030 3534 223e 3c2f 613e me="l00054"> │ │ │ │ +000029d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 54#end │ │ │ │ +00002a10: 6966 3c2f 7370 616e 3e3c 2f64 6976 3e0a if
. │ │ │ │ +00002a20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +00002ab0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00002ac0: 6e6f 223e 2020 2035 363c 2f73 7061 6e3e no"> 56 │ │ │ │ +00002ad0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #if H │ │ │ │ +00002af0: 4156 455f 5041 524d 4554 4953 2026 616d AVE_PARMETIS &am │ │ │ │ +00002b00: 703b 2661 6d70 3b20 6465 6669 6e65 6428 p;& defined( │ │ │ │ +00002b10: 4944 5854 5950 4557 4944 5448 293c 2f73 IDXTYPEWIDTH)
.
57 │ │ │ │ +00002b80: 2020 203c 7370 616e 2063 6c61 7373 3d22 using < │ │ │ │ +00002ba0: 2f73 7061 6e3e 3c61 2063 6c61 7373 3d22 /span>idx_t │ │ │ │ +00002c00: 3d20 3c61 2063 6c61 7373 3d22 636f 6465 = ::idx_t;.
│ │ │ │ +00002cb0: 3538 3c2f 7370 616e 3e3c 7370 616e 2063 58#elif HAVE_P │ │ │ │ +00002ce0: 4152 4d45 5449 5320 2661 6d70 3b26 616d ARMETIS &&am │ │ │ │ +00002cf0: 703b 2064 6566 696e 6564 2848 4156 455f p; defined(HAVE_ │ │ │ │ +00002d00: 5343 4f54 4348 5f4e 554d 5f54 5950 4529 SCOTCH_NUM_TYPE) │ │ │ │ +00002d10: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00002d30: 3c61 2069 643d 226c 3030 3035 3922 206e 59 usin │ │ │ │ +00002d90: 6720 3c2f 7370 616e 3e3c 6120 636c 6173 g idx_t = SCOTCH_Num; │ │ │ │ +00002e00: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00002e50: 2020 3630 3c2f 7370 616e 3e3c 7370 616e 60#elif HAVE │ │ │ │ +00002e80: 5f50 4152 4d45 5449 533c 2f73 7061 6e3e _PARMETIS │ │ │ │ +00002e90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00002ee0: 2020 3631 3c2f 7370 616e 3e20 2020 203c 61 < │ │ │ │ +00002ef0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00002f00: 6f72 6422 3e75 7369 6e67 203c 2f73 7061 ord">using idx_t = in │ │ │ │ +00002f70: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
62#else
.
63 using < │ │ │ │ +000030c0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +000030d0: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +000030e0: 6130 3032 3635 2e68 746d 6c23 6162 3162 a00265.html#ab1b │ │ │ │ +000030f0: 3837 3965 6562 6435 6433 3237 3031 6337 879eebd5d32701c7 │ │ │ │ +00003100: 6235 3837 3962 6265 3634 6131 3722 3e69 b5879bbe64a17">i │ │ │ │ +00003110: 6478 5f74 3c2f 613e 203d 2073 7464 3a3a dx_t = std:: │ │ │ │ +00003120: 7369 7a65 5f74 3b3c 2f64 6976 3e0a 3c64 size_t;
. │ │ │ │ +00003140: 3c61 2069 643d 226c 3030 3036 3422 206e 64#en │ │ │ │ +000031a0: 6469 663c 2f73 7061 6e3e 3c2f 6469 763e dif
│ │ │ │ +000031b0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00003210: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00003260: 2036 363c 2f73 7061 6e3e 203c 2f64 6976 66
.
67< │ │ │ │ +000032c0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +000032e0: 3c61 2069 643d 226c 3030 3036 3822 206e 68#if │ │ │ │ +00003340: 2048 4156 455f 4d50 493c 2f73 7061 6e3e HAVE_MPI │ │ │ │ +00003350: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000033a0: 2020 3832 3c2f 7370 616e 3e20 203c 7370 82 template<clas │ │ │ │ +000033f0: 733c 2f73 7061 6e3e 2047 2c20 3c73 7061 s G, class T │ │ │ │ +00003420: 312c 203c 7370 616e 2063 6c61 7373 3d22 1, class T2>.
.
83< │ │ │ │ +00003530: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> void f │ │ │ │ +000035b0: 696c 6c49 6e64 6578 5365 7448 6f6c 6573 illIndexSetHoles │ │ │ │ +000035c0: 3c2f 613e 283c 7370 616e 2063 6c61 7373 (const │ │ │ │ +000035e0: 3c2f 7370 616e 3e20 4726 616d 703b 2067 G& g │ │ │ │ +000035f0: 7261 7068 2c20 3c61 2063 6c61 7373 3d22 raph, Dune::OwnerOve │ │ │ │ +00003630: 726c 6170 436f 7079 436f 6d6d 756e 6963 rlapCopyCommunic │ │ │ │ +00003640: 6174 696f 6e26 6c74 3b54 312c 5432 2667 ation<T1,T2&g │ │ │ │ +00003650: 743b 3c2f 613e 2661 6d70 3b20 6f6f 636f t;& ooco │ │ │ │ +00003660: 6d6d 293c 2f64 6976 3e0a 3c64 6976 2063 mm)
.
84 │ │ │ │ +000036c0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +00003710: 2020 2038 353c 2f73 7061 6e3e 2020 2020 85 │ │ │ │ +00003720: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef typen │ │ │ │ +00003760: 616d 653c 2f73 7061 6e3e 203c 6120 636c ame Dune: │ │ │ │ +000037c0: 3a4f 776e 6572 4f76 6572 6c61 7043 6f70 :OwnerOverlapCop │ │ │ │ +000037d0: 7943 6f6d 6d75 6e69 6361 7469 6f6e 266c yCommunication&l │ │ │ │ +000037e0: 743b 5431 2c54 3226 6774 3b3a 3a50 6172 t;T1,T2>::Par │ │ │ │ +000037f0: 616c 6c65 6c49 6e64 6578 5365 743c 2f61 allelIndexSet IndexSet;
.
86< │ │ │ │ +00003860: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ +00003880: 7479 7065 6465 663c 2f73 7061 6e3e 203c typedef < │ │ │ │ +00003890: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000038a0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord">typename IndexSet::L │ │ │ │ +000038c0: 6f63 616c 496e 6465 783a 3a41 7474 7269 ocalIndex::Attri │ │ │ │ +000038d0: 6275 7465 2041 7474 7269 6275 7465 3b3c bute Attribute;< │ │ │ │ +000038e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00003930: 2038 373c 2f73 7061 6e3e 203c 2f64 6976 87
.
88< │ │ │ │ +00003990: 2f73 7061 6e3e 2020 2020 496e 6465 7853 /span> IndexS │ │ │ │ +000039a0: 6574 2661 6d70 3b20 696e 6465 7853 6574 et& indexSet │ │ │ │ +000039b0: 203d 206f 6f63 6f6d 6d2e 3c61 2063 6c61 = oocomm.index │ │ │ │ +00003a10: 5365 743c 2f61 3e28 293b 3c2f 6469 763e Set();
│ │ │ │ +00003a20: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
< │ │ │ │ +00003c10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00003c20: 6e6f 223e 2020 2039 303c 2f73 7061 6e3e no"> 90 │ │ │ │ +00003c30: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00003c80: 2020 2039 313c 2f73 7061 6e3e 2020 2020 91 │ │ │ │ +00003c90: 7374 643a 3a73 697a 655f 7420 7375 6d3d std::size_t sum= │ │ │ │ +00003ca0: 302c 206e 6565 6465 6420 3d20 6772 6170 0, needed = grap │ │ │ │ +00003cb0: 682e 6e6f 5665 7274 6963 6573 2829 2d69 h.noVertices()-i │ │ │ │ +00003cc0: 6e64 6578 5365 742e 7369 7a65 2829 3b3c ndexSet.size();< │ │ │ │ +00003cd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00003d20: 2039 323c 2f73 7061 6e3e 2020 2020 7374 92 st │ │ │ │ +00003d30: 643a 3a76 6563 746f 7226 6c74 3b73 7464 d::vector<std │ │ │ │ +00003d40: 3a3a 7369 7a65 5f74 2667 743b 206e 6565 ::size_t> nee │ │ │ │ +00003d50: 6465 6461 6c6c 286f 6f63 6f6d 6d2e 3c61 dedall(oocomm.c │ │ │ │ +00003db0: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +00003dc0: 292e 7369 7a65 2829 2c20 3029 3b3c 2f64 ).size(), 0);.
9 │ │ │ │ +00003e20: 333c 2f73 7061 6e3e 203c 2f64 6976 3e0a 3
. │ │ │ │ +00003e30: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00003e60: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 94 MPI_Allg │ │ │ │ +00003e90: 6174 6865 7228 2661 6d70 3b6e 6565 6465 ather(&neede │ │ │ │ +00003ea0: 642c 2031 2c20 4d50 4954 7261 6974 7326 d, 1, MPITraits& │ │ │ │ +00003eb0: 6c74 3b73 7464 3a3a 7369 7a65 5f74 2667 lt;std::size_t&g │ │ │ │ +00003ec0: 743b 3a3a 6765 7454 7970 6528 2920 2c20 t;::getType() , │ │ │ │ +00003ed0: 2661 6d70 3b28 6e65 6564 6564 616c 6c5b &(neededall[ │ │ │ │ +00003ee0: 305d 292c 2031 2c20 4d50 4954 7261 6974 0]), 1, MPITrait │ │ │ │ +00003ef0: 7326 6c74 3b73 7464 3a3a 7369 7a65 5f74 s<std::size_t │ │ │ │ +00003f00: 2667 743b 3a3a 6765 7454 7970 6528 292c >::getType(), │ │ │ │ +00003f10: 206f 6f63 6f6d 6d2e 3c61 2063 6c61 7373 oocomm.communi │ │ │ │ +00003f70: 6361 746f 723c 2f61 3e28 2929 3b3c 2f64 cator());.
9 │ │ │ │ +00003fd0: 353c 2f73 7061 6e3e 2020 2020 3c73 7061 5 for │ │ │ │ +00004000: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (int i=0; i< │ │ │ │ +00004030: 6f6f 636f 6d6d 2e3c 6120 636c 6173 733d oocomm.communic │ │ │ │ +00004090: 6174 6f72 3c2f 613e 2829 2e73 697a 6528 ator().size( │ │ │ │ +000040a0: 293b 202b 2b69 293c 2f64 6976 3e0a 3c64 ); ++i)
. │ │ │ │ +000040c0: 3c61 2069 643d 226c 3030 3039 3622 206e 96 sum=sum+ │ │ │ │ +00004110: 6e65 6564 6564 616c 6c5b 695d 3b20 2020 neededall[i]; │ │ │ │ +00004120: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // MAke th │ │ │ │ +00004140: 6973 2066 6f72 2067 656e 6572 6963 3c2f is for generic
.
< │ │ │ │ +00004190: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000041a0: 6e6f 223e 2020 2039 373c 2f73 7061 6e3e no"> 97 │ │ │ │ +000041b0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00004200: 2020 2039 383c 2f73 7061 6e3e 2020 2020 98 │ │ │ │ +00004210: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(sum==0)
.
99< │ │ │ │ +00004290: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> // Nothing to │ │ │ │ +000042c0: 646f 3c2f 7370 616e 3e3c 2f64 6976 3e0a do
. │ │ │ │ +000042d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
101 .
1 │ │ │ │ +00004400: 3032 3c2f 7370 616e 3e20 2020 203c 7370 02 //Compute Max │ │ │ │ +00004430: 696d 756d 2047 6c6f 6261 6c20 496e 6465 imum Global Inde │ │ │ │ +00004440: 783c 2f73 7061 6e3e 3c2f 6469 763e 0a3c x
.< │ │ │ │ +00004450: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00004460: 3e3c 6120 6964 3d22 6c30 3031 3033 2220 > 103 T1 maxgi= │ │ │ │ +000044b0: 303b 3c2f 6469 763e 0a3c 6469 7620 636c 0;
.
104 │ │ │ │ +00004510: 203c 7370 616e 2063 6c61 7373 3d22 6b65 auto end = indexSe │ │ │ │ +00004540: 742e 656e 6428 293b 3c2f 6469 763e 0a3c t.end();
.< │ │ │ │ +00004550: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00004560: 3e3c 6120 6964 3d22 6c30 3031 3035 2220 > 105 for(auto it │ │ │ │ +000045f0: 203d 2069 6e64 6578 5365 742e 6265 6769 = indexSet.begi │ │ │ │ +00004600: 6e28 293b 2069 7420 213d 2065 6e64 3b20 n(); it != end; │ │ │ │ +00004610: 2b2b 6974 293c 2f64 6976 3e0a 3c64 6976 ++it)
.
< │ │ │ │ +00004650: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00004660: 6e6f 223e 2020 3130 363c 2f73 7061 6e3e no"> 106 │ │ │ │ +00004670: 2020 2020 2020 6d61 7867 693d 7374 643a maxgi=std: │ │ │ │ +00004680: 3a6d 6178 286d 6178 6769 2c69 742d 2667 :max(maxgi,it-&g │ │ │ │ +00004690: 743b 676c 6f62 616c 2829 293b 3c2f 6469 t;global());.
107 │ │ │ │ +000046f0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00004700: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00004710: 3e3c 6120 6964 3d22 6c30 3031 3038 2220 > 108 //P │ │ │ │ +00004770: 726f 6365 7373 2070 2063 7265 6174 6573 rocess p creates │ │ │ │ +00004780: 2067 6c6f 6261 6c20 696e 6469 6365 7320 global indices │ │ │ │ +00004790: 636f 6e73 6563 7574 6976 656c 793c 2f73 consecutively
.
109 │ │ │ │ +00004800: 2020 203c 7370 616e 2063 6c61 7373 3d22 //start │ │ │ │ +00004820: 696e 6720 6174 6d61 7867 692b 5c73 756d ing atmaxgi+\sum │ │ │ │ +00004830: 5f7b 693d 317d 5e70 206e 6565 6465 6461 _{i=1}^p neededa │ │ │ │ +00004840: 6c6c 5b69 5d3c 2f73 7061 6e3e 3c2f 6469 ll[i].
110 │ │ │ │ +000048a0: 3c2f 7370 616e 3e20 2020 203c 7370 616e // All created │ │ │ │ +000048d0: 696e 6469 6365 7320 6172 6520 6f77 6e65 indices are owne │ │ │ │ +000048e0: 6420 6279 2074 6865 2070 726f 6365 7373 d by the process │ │ │ │ +000048f0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00004910: 3c61 2069 643d 226c 3030 3131 3122 206e 111 maxgi=ooco │ │ │ │ +00004960: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +000049c0: 3c2f 613e 2829 2e6d 6178 286d 6178 6769 ().max(maxgi │ │ │ │ +000049d0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
112 │ │ │ │ +00004a30: 202b 2b6d 6178 6769 3b20 203c 7370 616e ++maxgi; //Sart with the │ │ │ │ +00004a60: 206e 6578 7420 6672 6565 2069 6e64 6578 next free index │ │ │ │ +00004a70: 2e3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c .
.< │ │ │ │ +00004a80: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00004a90: 3e3c 6120 6964 3d22 6c30 3031 3133 2220 > 113
.
114 │ │ │ │ +00004b30: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +00004b50: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (int i=0 │ │ │ │ +00004b80: 3b20 6926 6c74 3b6f 6f63 6f6d 6d2e 3c61 ; i<oocomm.c │ │ │ │ +00004be0: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +00004bf0: 292e 7261 6e6b 2829 3b20 2b2b 6929 3c2f ).rank(); ++i).
1 │ │ │ │ +00004c50: 3135 3c2f 7370 616e 3e20 2020 2020 206d 15 m │ │ │ │ +00004c60: 6178 6769 3d6d 6178 6769 2b6e 6565 6465 axgi=maxgi+neede │ │ │ │ +00004c70: 6461 6c6c 5b69 5d3b 2020 203c 7370 616e dall[i]; // TODO: make t │ │ │ │ +00004ca0: 6869 7320 6d6f 7265 2067 656e 6572 6963 his more generic │ │ │ │ +00004cb0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00004cd0: 3c61 2069 643d 226c 3030 3131 3622 206e 116
.
117 │ │ │ │ +00004d70: 2020 3c73 7061 6e20 636c 6173 733d 2263 // Store │ │ │ │ +00004d90: 2074 6865 2067 6c6f 6261 6c20 696e 6465 the global inde │ │ │ │ +00004da0: 7820 696e 666f 726d 6174 696f 6e20 666f x information fo │ │ │ │ +00004db0: 7220 7265 7061 6972 696e 6720 7468 6520 r repairing the │ │ │ │ +00004dc0: 7265 6d6f 7465 2069 6e64 6578 2069 6e66 remote index inf │ │ │ │ +00004dd0: 6f72 6d61 7469 6f6e 3c2f 7370 616e 3e3c ormation< │ │ │ │ +00004de0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00004e30: 3131 383c 2f73 7061 6e3e 2020 2020 7374 118 st │ │ │ │ +00004e40: 643a 3a6d 6170 266c 743b 696e 742c 534c d::map<int,SL │ │ │ │ +00004e50: 4c69 7374 266c 743b 7374 643a 3a70 6169 List<std::pai │ │ │ │ +00004e60: 7226 6c74 3b54 312c 4174 7472 6962 7574 r<T1,Attribut │ │ │ │ +00004e70: 6526 6774 3b20 2667 743b 2026 6774 3b20 e> > > │ │ │ │ +00004e80: 676c 6f62 616c 496e 6469 6365 733b 3c2f globalIndices;.
1 │ │ │ │ +00004ee0: 3139 3c2f 7370 616e 3e20 2020 2073 746f 19 sto │ │ │ │ +00004ef0: 7265 476c 6f62 616c 496e 6469 6365 734f reGlobalIndicesO │ │ │ │ +00004f00: 6652 656d 6f74 6549 6e64 6963 6573 2867 fRemoteIndices(g │ │ │ │ +00004f10: 6c6f 6261 6c49 6e64 6963 6573 2c20 6f6f lobalIndices, oo │ │ │ │ +00004f20: 636f 6d6d 2e3c 6120 636c 6173 733d 2263 comm.remoteIndi │ │ │ │ +00004f80: 6365 733c 2f61 3e28 2929 3b3c 2f64 6976 ces());
.
120< │ │ │ │ +00004fe0: 2f73 7061 6e3e 2020 2020 696e 6465 7853 /span> indexS │ │ │ │ +00004ff0: 6574 2e62 6567 696e 5265 7369 7a65 2829 et.beginResize() │ │ │ │ +00005000: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00005050: 2020 3132 313c 2f73 7061 6e3e 203c 2f64 121 .
12 │ │ │ │ +000050b0: 323c 2f73 7061 6e3e 2020 2020 3c73 7061 2 for │ │ │ │ +000050e0: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (auto vertex = grap │ │ │ │ +00005110: 682e 6265 6769 6e28 292c 2076 656e 643d h.begin(), vend= │ │ │ │ +00005120: 6772 6170 682e 656e 6428 293b 2076 6572 graph.end(); ver │ │ │ │ +00005130: 7465 7820 213d 2076 656e 643b 202b 2b76 tex != vend; ++v │ │ │ │ +00005140: 6572 7465 7829 207b 3c2f 6469 763e 0a3c ertex) {
.< │ │ │ │ +00005150: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00005160: 3e3c 6120 6964 3d22 6c30 3031 3233 2220 > 123 c │ │ │ │ +000051c0: 6f6e 7374 3c2f 7370 616e 3e20 3c73 7061 onst typename IndexSet::Inde │ │ │ │ +00005200: 7850 6169 722a 2070 6169 723d 6c6f 6f6b xPair* pair=look │ │ │ │ +00005210: 7570 2e70 6169 7228 2a76 6572 7465 7829 up.pair(*vertex) │ │ │ │ +00005220: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00005270: 2020 3132 343c 2f73 7061 6e3e 2020 2020 124 │ │ │ │ +00005280: 2020 3c73 7061 6e20 636c 6173 733d 226b if(pair==0) { │ │ │ │ +000052b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00005300: 2031 3235 3c2f 7370 616e 3e20 2020 2020 125 │ │ │ │ +00005310: 2020 203c 7370 616e 2063 6c61 7373 3d22 // No i │ │ │ │ +00005330: 6e64 6578 2079 6574 2c20 6164 6420 6e65 ndex yet, add ne │ │ │ │ +00005340: 7720 6f6e 653c 2f73 7061 6e3e 3c2f 6469 w one.
126 │ │ │ │ +000053a0: 3c2f 7370 616e 3e20 2020 2020 2020 2069 i │ │ │ │ +000053b0: 6e64 6578 5365 742e 6164 6428 6d61 7867 ndexSet.add(maxg │ │ │ │ +000053c0: 692c 203c 7370 616e 2063 6c61 7373 3d22 i, typenam │ │ │ │ +000053e0: 653c 2f73 7061 6e3e 2049 6e64 6578 5365 e IndexSe │ │ │ │ +000053f0: 743a 3a4c 6f63 616c 496e 6465 7828 2a76 t::LocalIndex(*v │ │ │ │ +00005400: 6572 7465 782c 203c 6120 636c 6173 733d ertex, OwnerO │ │ │ │ +00005480: 7665 726c 6170 436f 7079 4174 7472 6962 verlapCopyAttrib │ │ │ │ +00005490: 7574 6553 6574 3a3a 6f77 6e65 723c 2f61 uteSet::owner, false));
.< │ │ │ │ +000054d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000054e0: 3e3c 6120 6964 3d22 6c30 3031 3237 2220 > 127 ++max │ │ │ │ +00005530: 6769 3b3c 2f64 6976 3e0a 3c64 6976 2063 gi;
.
128 │ │ │ │ +00005590: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +000055d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000055e0: 6e6f 223e 2020 3132 393c 2f73 7061 6e3e no"> 129 │ │ │ │ +000055f0: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +00005630: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00005640: 6e6f 223e 2020 3133 303c 2f73 7061 6e3e no"> 130 │ │ │ │ +00005650: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +000056a0: 2020 3133 313c 2f73 7061 6e3e 2020 2020 131 │ │ │ │ +000056b0: 696e 6465 7853 6574 2e65 6e64 5265 7369 indexSet.endResi │ │ │ │ +000056c0: 7a65 2829 3b3c 2f64 6976 3e0a 3c64 6976 ze();
.
< │ │ │ │ +00005700: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00005710: 6e6f 223e 2020 3133 323c 2f73 7061 6e3e no"> 132 │ │ │ │ +00005720: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00005770: 2020 3133 333c 2f73 7061 6e3e 2020 2020 133 │ │ │ │ +00005780: 7265 7061 6972 4c6f 6361 6c49 6e64 6578 repairLocalIndex │ │ │ │ +00005790: 506f 696e 7465 7273 2867 6c6f 6261 6c49 Pointers(globalI │ │ │ │ +000057a0: 6e64 6963 6573 2c20 6f6f 636f 6d6d 2e3c ndices, oocomm.< │ │ │ │ +000057b0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +000057c0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +000057d0: 2261 3031 3938 342e 6874 6d6c 2361 6365 "a01984.html#ace │ │ │ │ +000057e0: 6530 3265 6464 3532 3261 6636 3762 6663 e02edd522af67bfc │ │ │ │ +000057f0: 3630 3130 3533 6261 3737 3664 6333 223e 601053ba776dc3"> │ │ │ │ +00005800: 7265 6d6f 7465 496e 6469 6365 733c 2f61 remoteIndices(), indexSet);< │ │ │ │ +00005820: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00005870: 3133 343c 2f73 7061 6e3e 203c 2f64 6976 134
.
135< │ │ │ │ +000058d0: 2f73 7061 6e3e 2020 2020 6f6f 636f 6d6d /span> oocomm │ │ │ │ +000058e0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .freeGlobalLook │ │ │ │ +00005940: 7570 3c2f 613e 2829 3b3c 2f64 6976 3e0a up();
. │ │ │ │ +00005950: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +00005a20: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00005a30: 3e3c 6120 6964 3d22 6c30 3031 3337 2220 > 137#i │ │ │ │ +00005a90: 6664 6566 2044 4542 5547 5f52 4550 4152 fdef DEBUG_REPAR │ │ │ │ +00005aa0: 543c 2f73 7061 6e3e 3c2f 6469 763e 0a3c T
.< │ │ │ │ +00005ab0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00005ac0: 3e3c 6120 6964 3d22 6c30 3031 3338 2220 > 138 std::cout │ │ │ │ +00005b10: 266c 743b 266c 743b 3c73 7061 6e20 636c <<"Holes │ │ │ │ +00005b40: 6172 6520 6669 6c6c 6564 2126 7175 6f74 are filled!" │ │ │ │ +00005b50: 3b3c 2f73 7061 6e3e 266c 743b 266c 743b ;<< │ │ │ │ +00005b60: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +00005b70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00005ba0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 139 std::co │ │ │ │ +00005bd0: 7574 266c 743b 266c 743b 6f6f 636f 6d6d ut<<oocomm │ │ │ │ +00005be0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .communicator().rank()<& │ │ │ │ +00005c50: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +00005c70: 7175 6f74 3b3a 2026 7175 6f74 3b3c 2f73 quot;: "<<ooco │ │ │ │ +00005c90: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.indexSet │ │ │ │ +00005cf0: 2829 266c 743b 266c 743b 7374 643a 3a65 ()<<std::e │ │ │ │ +00005d00: 6e64 6c3b 3c2f 6469 763e 0a3c 6469 7620 ndl;
.
140< │ │ │ │ +00005d60: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00005d70: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor">#endif │ │ │ │ +00005d80: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00005da0: 3c61 2069 643d 226c 3030 3134 3122 206e 141 }
..
142 │ │ │ │ +00005e40: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00005e50: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00005e60: 3e3c 6120 6964 3d22 6c30 3031 3433 2220 > 143 names │ │ │ │ +00005ec0: 7061 6365 3c2f 7370 616e 3e3c 2f64 6976 pace
.
144< │ │ │ │ +00005f20: 2f73 7061 6e3e 2020 7b3c 2f64 6976 3e0a /span> {
. │ │ │ │ +00005f30: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +00005fc0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00005fd0: 6e6f 223e 2020 3134 363c 2f73 7061 6e3e no"> 146 │ │ │ │ +00005fe0: 2020 2020 3c73 7061 6e20 636c 6173 733d class │ │ │ │ +00006000: 3c2f 7370 616e 3e50 6172 6d65 7469 7344 ParmetisD │ │ │ │ +00006010: 756e 6549 6e64 6578 4d61 703c 2f64 6976 uneIndexMap
.
147< │ │ │ │ +00006070: 2f73 7061 6e3e 2020 2020 7b3c 2f64 6976 /span> {
.
148< │ │ │ │ +000060d0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ +000060f0: 7075 626c 6963 3c2f 7370 616e 3e3a 3c2f public:.
1 │ │ │ │ +00006150: 3439 3c2f 7370 616e 3e20 2020 2020 203c 49 < │ │ │ │ +00006160: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00006170: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template<cl │ │ │ │ +000061a0: 6173 733c 2f73 7061 6e3e 2047 7261 7068 ass Graph │ │ │ │ +000061b0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class OOComm>< │ │ │ │ +000061e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00006230: 3135 303c 2f73 7061 6e3e 2020 2020 2020 150 │ │ │ │ +00006240: 5061 726d 6574 6973 4475 6e65 496e 6465 ParmetisDuneInde │ │ │ │ +00006250: 784d 6170 283c 7370 616e 2063 6c61 7373 xMap(const │ │ │ │ +00006270: 3c2f 7370 616e 3e20 4772 6170 6826 616d Graph&am │ │ │ │ +00006280: 703b 2067 7261 7068 2c20 3c73 7061 6e20 p; graph, │ │ │ │ +000062a0: 636f 6e73 743c 2f73 7061 6e3e 204f 4f43 const OOC │ │ │ │ +000062b0: 6f6d 6d26 616d 703b 2063 6f6d 293b 3c2f omm& com);.
1 │ │ │ │ +00006310: 3531 3c2f 7370 616e 3e20 2020 2020 203c 51 < │ │ │ │ +00006320: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00006330: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int toParmetis(< │ │ │ │ +00006350: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00006360: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int i) con │ │ │ │ +00006390: 7374 3c2f 7370 616e 3e3c 2f64 6976 3e0a st
. │ │ │ │ +000063a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .< │ │ │ │ +00006420: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00006430: 3e3c 6120 6964 3d22 6c30 3031 3533 2220 > 153 return duneToParmeti │ │ │ │ +000064b0: 735b 695d 3b3c 2f64 6976 3e0a 3c64 6976 s[i];
.
< │ │ │ │ +000064f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00006500: 6e6f 223e 2020 3135 343c 2f73 7061 6e3e no"> 154 │ │ │ │ +00006510: 2020 2020 2020 7d3c 2f64 6976 3e0a 3c64 }
. │ │ │ │ +00006530: 3c61 2069 643d 226c 3030 3135 3522 206e 155 int toL │ │ │ │ +000065a0: 6f63 616c 5061 726d 6574 6973 283c 7370 ocalParmetis(int i) const │ │ │ │ +000065f0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00006610: 3c61 2069 643d 226c 3030 3135 3622 206e 156 {
.< │ │ │ │ +00006690: 6120 6964 3d22 6c30 3031 3537 2220 6e61 a id="l00157" na │ │ │ │ +000066a0: 6d65 3d22 6c30 3031 3537 223e 3c2f 613e me="l00157"> │ │ │ │ +000066b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 157 return │ │ │ │ +00006700: 2064 756e 6554 6f50 6172 6d65 7469 735b duneToParmetis[ │ │ │ │ +00006710: 695d 2d62 6173 655f 3b3c 2f64 6976 3e0a i]-base_;
. │ │ │ │ +00006720: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
159< │ │ │ │ +000067d0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> int │ │ │ │ +00006800: 206f 7065 7261 746f 725b 5d28 3c73 7061 operator[](int │ │ │ │ +00006830: 2069 293c 7370 616e 2063 6c61 7373 3d22 i) const< │ │ │ │ +00006850: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00006870: 6120 6964 3d22 6c30 3031 3630 2220 6e61 a id="l00160" na │ │ │ │ +00006880: 6d65 3d22 6c30 3031 3630 223e 3c2f 613e me="l00160"> │ │ │ │ +00006890: 3c73 7061 6e20 636c 6173 733d 226c 696e 160
{
.
< │ │ │ │ +00006910: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00006920: 6e6f 223e 2020 3136 313c 2f73 7061 6e3e no"> 161 │ │ │ │ +00006930: 2020 2020 2020 2020 3c73 7061 6e20 636c return │ │ │ │ +00006960: 6475 6e65 546f 5061 726d 6574 6973 5b69 duneToParmetis[i │ │ │ │ +00006970: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
.
162 │ │ │ │ +000069d0: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
163 │ │ │ │ +00006a30: 2020 2020 203c 7370 616e 2063 6c61 7373 i │ │ │ │ +00006a50: 6e74 3c2f 7370 616e 3e20 746f 4475 6e65 nt toDune │ │ │ │ +00006a60: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (int i) c │ │ │ │ +00006aa0: 6f6e 7374 3c2f 7370 616e 3e3c 2f64 6976 onst
.
164< │ │ │ │ +00006b00: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> │ │ │ │ +00006b20: 2020 3c2f 7370 616e 3e7b 3c2f 6469 763e {
│ │ │ │ +00006b30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00006b60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 165 return parmetisToD │ │ │ │ +00006bc0: 756e 655b 695d 3b3c 2f64 6976 3e0a 3c64 une[i];
. │ │ │ │ +00006be0: 3c61 2069 643d 226c 3030 3136 3622 206e 166 }
. │ │ │ │ +00006c30: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00006c60: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 167 std::v │ │ │ │ +00006c90: 6563 746f 7226 6c74 3b69 6e74 2667 743b ector<int> │ │ │ │ +00006ca0: 3a3a 7369 7a65 5f74 7970 6520 6e75 6d4f ::size_type numO │ │ │ │ +00006cb0: 664f 776e 5674 7828 293c 7370 616e 2063 fOwnVtx() │ │ │ │ +00006cd0: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
168 │ │ │ │ +00006d30: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 │ │ │ │ +00006d50: 2020 203c 2f73 7061 6e3e 7b3c 2f64 6976 {
.
169< │ │ │ │ +00006db0: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> return parmetisTo │ │ │ │ +00006df0: 4475 6e65 2e73 697a 6528 293b 3c2f 6469 Dune.size();.
170 │ │ │ │ +00006e50: 3c2f 7370 616e 3e20 2020 2020 207d 3c2f }.
1 │ │ │ │ +00006eb0: 3731 3c2f 7370 616e 3e20 2020 2020 203c 71 < │ │ │ │ +00006ec0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00006ed0: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +00006ee0: 6130 3032 3635 2e68 746d 6c23 6162 3162 a00265.html#ab1b │ │ │ │ +00006ef0: 3837 3965 6562 6435 6433 3237 3031 6337 879eebd5d32701c7 │ │ │ │ +00006f00: 6235 3837 3962 6265 3634 6131 3722 3e4d b5879bbe64a17">M │ │ │ │ +00006f10: 6574 6973 3a3a 6964 785f 743c 2f61 3e2a etis::idx_t* │ │ │ │ +00006f20: 2076 7478 4469 7374 2829 3c2f 6469 763e vtxDist()
│ │ │ │ +00006f30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00006f60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 172 {.
173 │ │ │ │ +00006fe0: 3c2f 7370 616e 3e20 2020 2020 2020 203c < │ │ │ │ +00006ff0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00007000: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ │ +00007010: 2f73 7061 6e3e 2026 616d 703b 7674 7844 /span> &vtxD │ │ │ │ +00007020: 6973 745f 5b30 5d3b 3c2f 6469 763e 0a3c ist_[0];
.< │ │ │ │ +00007030: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00007040: 3e3c 6120 6964 3d22 6c30 3031 3734 2220 > 174 }
│ │ │ │ +00007090: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
176 │ │ │ │ +00007220: 203c 7370 616e 2063 6c61 7373 3d22 6b65 private:
.< │ │ │ │ +00007260: 6120 6964 3d22 6c30 3031 3737 2220 6e61 a id="l00177" na │ │ │ │ +00007270: 6d65 3d22 6c30 3031 3737 223e 3c2f 613e me="l00177"> │ │ │ │ +00007280: 3c73 7061 6e20 636c 6173 733d 226c 696e 177 int base │ │ │ │ +000072d0: 5f3b 3c2f 6469 763e 0a3c 6469 7620 636c _;
.
178 │ │ │ │ +00007330: 2020 2073 7464 3a3a 7665 6374 6f72 266c std::vector&l │ │ │ │ +00007340: 743b 696e 7426 6774 3b20 6475 6e65 546f t;int> duneTo │ │ │ │ +00007350: 5061 726d 6574 6973 3b3c 2f64 6976 3e0a Parmetis;
. │ │ │ │ +00007360: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +00007430: 2031 3830 3c2f 7370 616e 3e20 2020 2020 180 │ │ │ │ +00007440: 203c 7370 616e 2063 6c61 7373 3d22 636f // range │ │ │ │ +00007460: 6f66 2076 6572 7469 6365 7320 666f 7220 of vertices for │ │ │ │ +00007470: 7072 6f63 6573 736f 7220 693a 2076 7478 processor i: vtx │ │ │ │ +00007480: 6469 7374 5b69 5d20 746f 2076 7478 6469 dist[i] to vtxdi │ │ │ │ +00007490: 7374 5b69 2b31 5d20 2870 6172 6d65 7469 st[i+1] (parmeti │ │ │ │ +000074a0: 7320 676c 6f62 616c 293c 2f73 7061 6e3e s global) │ │ │ │ +000074b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00007500: 2031 3831 3c2f 7370 616e 3e20 2020 2020 181 │ │ │ │ +00007510: 2073 7464 3a3a 7665 6374 6f72 266c 743b std::vector< │ │ │ │ +00007520: 4d65 7469 733a 3a69 6478 5f74 2667 743b Metis::idx_t> │ │ │ │ +00007530: 2076 7478 4469 7374 5f3b 3c2f 6469 763e vtxDist_;
│ │ │ │ +00007540: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
183< │ │ │ │ +000075f0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00007610: 3c61 2069 643d 226c 3030 3138 3422 206e 184 temp │ │ │ │ +00007670: 6c61 7465 3c2f 7370 616e 3e26 6c74 3b3c late<< │ │ │ │ +00007680: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00007690: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class G, class │ │ │ │ +000076c0: 3c2f 7370 616e 3e20 4f4f 436f 6d6d 2667 OOComm&g │ │ │ │ +000076d0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
185 │ │ │ │ +00007730: 2050 6172 6d65 7469 7344 756e 6549 6e64 ParmetisDuneInd │ │ │ │ +00007740: 6578 4d61 703a 3a50 6172 6d65 7469 7344 exMap::ParmetisD │ │ │ │ +00007750: 756e 6549 6e64 6578 4d61 7028 3c73 7061 uneIndexMap(const G │ │ │ │ +00007780: 2661 6d70 3b20 6772 6170 682c 203c 7370 & graph, const │ │ │ │ +000077b0: 4f4f 436f 6d6d 2661 6d70 3b20 6f6f 636f OOComm& ooco │ │ │ │ +000077c0: 6d6d 293c 2f64 6976 3e0a 3c64 6976 2063 mm)
.
186 │ │ │ │ +00007820: 2020 2020 3a20 6475 6e65 546f 5061 726d : duneToParm │ │ │ │ +00007830: 6574 6973 2867 7261 7068 2e6e 6f56 6572 etis(graph.noVer │ │ │ │ +00007840: 7469 6365 7328 292c 202d 3129 2c20 7674 tices(), -1), vt │ │ │ │ +00007850: 7844 6973 745f 286f 6f63 6f6d 6d2e 636f xDist_(oocomm.co │ │ │ │ +00007860: 6d6d 756e 6963 6174 6f72 2829 2e73 697a mmunicator().siz │ │ │ │ +00007870: 6528 292b 3129 3c2f 6469 763e 0a3c 6469 e()+1)
.< │ │ │ │ +00007890: 6120 6964 3d22 6c30 3031 3837 2220 6e61 a id="l00187" na │ │ │ │ +000078a0: 6d65 3d22 6c30 3031 3837 223e 3c2f 613e me="l00187"> │ │ │ │ +000078b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 187 {
.< │ │ │ │ +000078f0: 6120 6964 3d22 6c30 3031 3838 2220 6e61 a id="l00188" na │ │ │ │ +00007900: 6d65 3d22 6c30 3031 3838 223e 3c2f 613e me="l00188"> │ │ │ │ +00007910: 3c73 7061 6e20 636c 6173 733d 226c 696e 188 int npes │ │ │ │ +00007960: 3d6f 6f63 6f6d 6d2e 636f 6d6d 756e 6963 =oocomm.communic │ │ │ │ +00007970: 6174 6f72 2829 2e73 697a 6528 292c 206d ator().size(), m │ │ │ │ +00007980: 7970 653d 6f6f 636f 6d6d 2e63 6f6d 6d75 ype=oocomm.commu │ │ │ │ +00007990: 6e69 6361 746f 7228 292e 7261 6e6b 2829 nicator().rank() │ │ │ │ +000079a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +000079f0: 2020 3138 393c 2f73 7061 6e3e 203c 2f64 189 .
19 │ │ │ │ +00007a50: 303c 2f73 7061 6e3e 2020 2020 2020 3c73 0 typedef typenam │ │ │ │ +00007aa0: 653c 2f73 7061 6e3e 204f 4f43 6f6d 6d3a e OOComm: │ │ │ │ +00007ab0: 3a4f 776e 6572 5365 7420 4f77 6e65 7253 :OwnerSet OwnerS │ │ │ │ +00007ac0: 6574 3b3c 2f64 6976 3e0a 3c64 6976 2063 et;
.
191 < │ │ │ │ +00007b20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00007b70: 3139 323c 2f73 7061 6e3e 2020 2020 2020 192 │ │ │ │ +00007b80: 3c73 7061 6e20 636c 6173 733d 226b 6579 int numOfOwnVtx │ │ │ │ +00007bb0: 3d30 3b3c 2f64 6976 3e0a 3c64 6976 2063 =0;
.
193 │ │ │ │ +00007c10: 2020 2020 3c73 7061 6e20 636c 6173 733d auto end = ooco │ │ │ │ +00007c40: 6d6d 2e69 6e64 6578 5365 7428 292e 656e mm.indexSet().en │ │ │ │ +00007c50: 6428 293b 3c2f 6469 763e 0a3c 6469 7620 d();
.
194 │ │ │ │ +00007cb0: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +00007cd0: 6f72 3c2f 7370 616e 3e28 3c73 7061 6e20 or( │ │ │ │ +00007cf0: 6175 746f 3c2f 7370 616e 3e20 696e 6465 auto inde │ │ │ │ +00007d00: 7820 3d20 6f6f 636f 6d6d 2e69 6e64 6578 x = oocomm.index │ │ │ │ +00007d10: 5365 7428 292e 6265 6769 6e28 293b 2069 Set().begin(); i │ │ │ │ +00007d20: 6e64 6578 2021 3d20 656e 643b 202b 2b69 ndex != end; ++i │ │ │ │ +00007d30: 6e64 6578 2920 7b3c 2f64 6976 3e0a 3c64 ndex) {
. │ │ │ │ +00007d50: 3c61 2069 643d 226c 3030 3139 3522 206e 195 if (O │ │ │ │ +00007dc0: 776e 6572 5365 743a 3a63 6f6e 7461 696e wnerSet::contain │ │ │ │ +00007dd0: 7328 696e 6465 782d 2667 743b 6c6f 6361 s(index->loca │ │ │ │ +00007de0: 6c28 292e 6174 7472 6962 7574 6528 2929 l().attribute()) │ │ │ │ +00007df0: 2920 7b3c 2f64 6976 3e0a 3c64 6976 2063 ) {
.
196 │ │ │ │ +00007e50: 2020 2020 2020 2020 6e75 6d4f 664f 776e numOfOwn │ │ │ │ +00007e60: 5674 782b 2b3b 3c2f 6469 763e 0a3c 6469 Vtx++;
.< │ │ │ │ +00007e80: 6120 6964 3d22 6c30 3031 3937 2220 6e61 a id="l00197" na │ │ │ │ +00007e90: 6d65 3d22 6c30 3031 3937 223e 3c2f 613e me="l00197"> │ │ │ │ +00007ea0: 3c73 7061 6e20 636c 6173 733d 226c 696e 197 }
│ │ │ │ +00007ed0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00007f00: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 198 }.
199 │ │ │ │ +00007f80: 3c2f 7370 616e 3e20 2020 2020 2070 6172 par │ │ │ │ +00007f90: 6d65 7469 7354 6f44 756e 652e 7265 7369 metisToDune.resi │ │ │ │ +00007fa0: 7a65 286e 756d 4f66 4f77 6e56 7478 293b ze(numOfOwnVtx); │ │ │ │ +00007fb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00008000: 2032 3030 3c2f 7370 616e 3e20 2020 2020 200 │ │ │ │ +00008010: 2073 7464 3a3a 7665 6374 6f72 266c 743b std::vector< │ │ │ │ +00008020: 696e 7426 6774 3b20 676c 6f62 616c 4e75 int> globalNu │ │ │ │ +00008030: 6d4f 6656 7478 286e 7065 7329 3b3c 2f64 mOfVtx(npes);.
20 │ │ │ │ +00008090: 313c 2f73 7061 6e3e 2020 2020 2020 3c73 1 // make this │ │ │ │ +000080c0: 206e 756d 6265 7220 6176 6169 6c61 626c number availabl │ │ │ │ +000080d0: 6520 746f 2061 6c6c 2070 726f 6365 7373 e to all process │ │ │ │ +000080e0: 6573 3c2f 7370 616e 3e3c 2f64 6976 3e0a es
. │ │ │ │ +000080f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
203 < │ │ │ │ +00008210: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00008260: 3230 343c 2f73 7061 6e3e 2020 2020 2020 204 │ │ │ │ +00008270: 3c73 7061 6e20 636c 6173 733d 226b 6579 int base=0;.
205 │ │ │ │ +000082f0: 3c2f 7370 616e 3e20 2020 2020 2076 7478 vtx │ │ │ │ +00008300: 4469 7374 5f5b 305d 203d 2030 3b3c 2f64 Dist_[0] = 0;.
20 │ │ │ │ +00008360: 363c 2f73 7061 6e3e 2020 2020 2020 3c73 6 for(int │ │ │ │ +000083b0: 3c2f 7370 616e 3e20 693d 303b 2069 266c i=0; i&l │ │ │ │ +000083c0: 743b 6e70 6573 3b20 692b 2b29 207b 3c2f t;npes; i++) {.
2 │ │ │ │ +00008420: 3037 3c2f 7370 616e 3e20 2020 2020 2020 07 │ │ │ │ +00008430: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if (i<mype) │ │ │ │ +00008460: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
208 │ │ │ │ +000084c0: 2020 2020 2020 2062 6173 6520 2b3d 2067 base += g │ │ │ │ +000084d0: 6c6f 6261 6c4e 756d 4f66 5674 785b 695d lobalNumOfVtx[i] │ │ │ │ +000084e0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00008530: 2020 3230 393c 2f73 7061 6e3e 2020 2020 209 │ │ │ │ +00008540: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +00008580: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00008590: 6e6f 223e 2020 3231 303c 2f73 7061 6e3e no"> 210 │ │ │ │ +000085a0: 2020 2020 2020 2020 7674 7844 6973 745f vtxDist_ │ │ │ │ +000085b0: 5b69 2b31 5d20 3d20 7674 7844 6973 745f [i+1] = vtxDist_ │ │ │ │ +000085c0: 5b69 5d20 2b20 676c 6f62 616c 4e75 6d4f [i] + globalNumO │ │ │ │ +000085d0: 6656 7478 5b69 5d3b 3c2f 6469 763e 0a3c fVtx[i];
.< │ │ │ │ +000085e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000085f0: 3e3c 6120 6964 3d22 6c30 3032 3131 2220 > 211 }
│ │ │ │ +00008640: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
213 │ │ │ │ +00008770: 2020 2020 6261 7365 5f3d 6261 7365 3b3c base_=base;< │ │ │ │ +00008780: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000087d0: 3231 343c 2f73 7061 6e3e 203c 2f64 6976 214
.
215< │ │ │ │ +00008830: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#ifdef DEBUG_RE │ │ │ │ +00008860: 5041 5254 3c2f 7370 616e 3e3c 2f64 6976 PART
.
216< │ │ │ │ +000088c0: 2f73 7061 6e3e 2020 2020 2020 7374 643a /span> std: │ │ │ │ +000088d0: 3a63 6f75 7420 266c 743b 266c 743b 206f :cout << o │ │ │ │ +000088e0: 6f63 6f6d 6d2e 636f 6d6d 756e 6963 6174 ocomm.communicat │ │ │ │ +000088f0: 6f72 2829 2e72 616e 6b28 2926 6c74 3b26 or().rank()<& │ │ │ │ +00008900: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +00008920: 7175 6f74 3b20 7674 7844 6973 743a 2026 quot; vtxDist: & │ │ │ │ +00008930: 7175 6f74 3b3c 2f73 7061 6e3e 3b3c 2f64 quot;;.
21 │ │ │ │ +00008990: 373c 2f73 7061 6e3e 2020 2020 2020 3c73 7 for(int │ │ │ │ +000089e0: 3c2f 7370 616e 3e20 693d 303b 2069 266c i=0; i&l │ │ │ │ +000089f0: 743b 3d20 6e70 6573 3b20 2b2b 6929 3c2f t;= npes; ++i).
2 │ │ │ │ +00008a50: 3138 3c2f 7370 616e 3e20 2020 2020 2020 18 │ │ │ │ +00008a60: 2073 7464 3a3a 636f 7574 2026 6c74 3b26 std::cout <& │ │ │ │ +00008a70: 6c74 3b20 7674 7844 6973 745f 5b69 5d26 lt; vtxDist_[i]& │ │ │ │ +00008a80: 6c74 3b26 6c74 3b3c 7370 616e 2063 6c61 lt;<" " │ │ │ │ +00008ab0: 3c2f 7370 616e 3e3b 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +00008ac0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00008ad0: 3e3c 6120 6964 3d22 6c30 3032 3139 2220 > 219 std::co │ │ │ │ +00008b20: 7574 266c 743b 266c 743b 7374 643a 3a65 ut<<std::e │ │ │ │ +00008b30: 6e64 6c3b 3c2f 6469 763e 0a3c 6469 7620 ndl;
.
220< │ │ │ │ +00008b90: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00008ba0: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor">#endif │ │ │ │ +00008bb0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00008bd0: 3c61 2069 643d 226c 3030 3232 3122 206e 221
.
222 │ │ │ │ +00008c70: 2020 2020 3c73 7061 6e20 636c 6173 733d // Tra │ │ │ │ +00008c90: 7665 7273 6520 7468 6520 6772 6170 6820 verse the graph │ │ │ │ +00008ca0: 616e 6420 6173 7369 676e 2061 206e 6577 and assign a new │ │ │ │ +00008cb0: 2063 6f6e 7365 6375 7469 7665 206e 756d consecutive num │ │ │ │ +00008cc0: 6265 722f 696e 6465 783c 2f73 7061 6e3e ber/index │ │ │ │ +00008cd0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00008d20: 2032 3233 3c2f 7370 616e 3e20 2020 2020 223 │ │ │ │ +00008d30: 203c 7370 616e 2063 6c61 7373 3d22 636f // starti │ │ │ │ +00008d50: 6e67 2062 7920 2671 756f 743b 6261 7365 ng by "base │ │ │ │ +00008d60: 2671 756f 743b 2074 6f20 616c 6c20 6f77 " to all ow │ │ │ │ +00008d70: 6e65 7220 7665 7274 6963 6573 2e3c 2f73 ner vertices.
.
224 │ │ │ │ +00008de0: 2020 2020 203c 7370 616e 2063 6c61 7373 // Th │ │ │ │ +00008e00: 6520 6e65 7720 696e 6465 7820 6973 2075 e new index is u │ │ │ │ +00008e10: 7365 6420 6173 2074 6865 2050 6172 4d45 sed as the ParME │ │ │ │ +00008e20: 5449 5320 676c 6f62 616c 2069 6e64 6578 TIS global index │ │ │ │ +00008e30: 2061 6e64 2069 733c 2f73 7061 6e3e 3c2f and is.
2 │ │ │ │ +00008e90: 3235 3c2f 7370 616e 3e20 2020 2020 203c 25 < │ │ │ │ +00008ea0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00008eb0: 656e 7422 3e2f 2f20 7374 6f72 6564 2069 ent">// stored i │ │ │ │ +00008ec0: 6e20 7468 6520 7665 6374 6f72 2026 7175 n the vector &qu │ │ │ │ +00008ed0: 6f74 3b64 756e 6554 6f50 6172 6d65 7469 ot;duneToParmeti │ │ │ │ +00008ee0: 7326 7175 6f74 3b3c 2f73 7061 6e3e 3c2f s".
2 │ │ │ │ +00008f40: 3236 3c2f 7370 616e 3e20 2020 2020 203c 26 < │ │ │ │ +00008f50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00008f60: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord">auto │ │ │ │ +00008f70: 2076 656e 6420 3d20 6772 6170 682e 656e vend = graph.en │ │ │ │ +00008f80: 6428 293b 3c2f 6469 763e 0a3c 6469 7620 d();
.
227 │ │ │ │ +00008fe0: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +00009000: 6f72 3c2f 7370 616e 3e28 3c73 7061 6e20 or( │ │ │ │ +00009020: 6175 746f 3c2f 7370 616e 3e20 7665 7274 auto vert │ │ │ │ +00009030: 6578 203d 2067 7261 7068 2e62 6567 696e ex = graph.begin │ │ │ │ +00009040: 2829 3b20 7665 7274 6578 2021 3d20 7665 (); vertex != ve │ │ │ │ +00009050: 6e64 3b20 2b2b 7665 7274 6578 2920 7b3c nd; ++vertex) {< │ │ │ │ +00009060: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000090b0: 3232 383c 2f73 7061 6e3e 2020 2020 2020 228 │ │ │ │ +000090c0: 2020 3c73 7061 6e20 636c 6173 733d 226b const typen │ │ │ │ +00009100: 616d 653c 2f73 7061 6e3e 204f 4f43 6f6d ame OOCom │ │ │ │ +00009110: 6d3a 3a50 6172 616c 6c65 6c49 6e64 6578 m::ParallelIndex │ │ │ │ +00009120: 5365 743a 3a49 6e64 6578 5061 6972 2a20 Set::IndexPair* │ │ │ │ +00009130: 696e 6465 783d 6f6f 636f 6d6d 2e67 6c6f index=oocomm.glo │ │ │ │ +00009140: 6261 6c4c 6f6f 6b75 7028 292e 7061 6972 balLookup().pair │ │ │ │ +00009150: 282a 7665 7274 6578 293b 3c2f 6469 763e (*vertex);
│ │ │ │ +00009160: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00009190: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 229 ass │ │ │ │ +000091c0: 6572 7428 696e 6465 7829 3b3c 2f64 6976 ert(index);
.
230< │ │ │ │ +00009220: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> if (OwnerSet::con │ │ │ │ +00009260: 7461 696e 7328 696e 6465 782d 2667 743b tains(index-> │ │ │ │ +00009270: 6c6f 6361 6c28 292e 6174 7472 6962 7574 local().attribut │ │ │ │ +00009280: 6528 2929 2920 7b3c 2f64 6976 3e0a 3c64 e())) {
. │ │ │ │ +000092a0: 3c61 2069 643d 226c 3030 3233 3122 206e 231 // assign and │ │ │ │ +00009310: 636f 756e 7420 7468 6520 696e 6465 783c count the index< │ │ │ │ +00009320: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00009340: 6120 6964 3d22 6c30 3032 3332 2220 6e61 a id="l00232" na │ │ │ │ +00009350: 6d65 3d22 6c30 3032 3332 223e 3c2f 613e me="l00232"> │ │ │ │ +00009360: 3c73 7061 6e20 636c 6173 733d 226c 696e 232 parme │ │ │ │ +00009390: 7469 7354 6f44 756e 655b 6261 7365 2d62 tisToDune[base-b │ │ │ │ +000093a0: 6173 655f 5d3d 696e 6465 782d 2667 743b ase_]=index-> │ │ │ │ +000093b0: 6c6f 6361 6c28 293b 3c2f 6469 763e 0a3c local();
.< │ │ │ │ +000093c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000093d0: 3e3c 6120 6964 3d22 6c30 3032 3333 2220 > 233 dun │ │ │ │ +00009420: 6554 6f50 6172 6d65 7469 735b 696e 6465 eToParmetis[inde │ │ │ │ +00009430: 782d 2667 743b 6c6f 6361 6c28 295d 203d x->local()] = │ │ │ │ +00009440: 2062 6173 652b 2b3b 3c2f 6469 763e 0a3c base++;
.< │ │ │ │ +00009450: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00009460: 3e3c 6120 6964 3d22 6c30 3032 3334 2220 > 234
}.
235 │ │ │ │ +00009500: 3c2f 7370 616e 3e20 2020 2020 207d 3c2f }.
2 │ │ │ │ +00009560: 3336 3c2f 7370 616e 3e20 3c2f 6469 763e 36
│ │ │ │ +00009570: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000095a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 237 // At this poin │ │ │ │ +000095f0: 742c 2065 7665 7279 2070 726f 6365 7373 t, every process │ │ │ │ +00009600: 206b 6e6f 7773 2074 6865 2050 6172 4d45 knows the ParME │ │ │ │ +00009610: 5449 5320 676c 6f62 616c 2069 6e64 6578 TIS global index │ │ │ │ +00009620: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00009640: 3c61 2069 643d 226c 3030 3233 3822 206e 238 // │ │ │ │ +000096a0: 206f 6620 6974 2623 3339 3b73 206f 776e of it's own │ │ │ │ +000096b0: 6572 2076 6572 7469 6365 732e 2054 6865 er vertices. The │ │ │ │ +000096c0: 206e 6578 7420 7374 6570 2069 7320 746f next step is to │ │ │ │ +000096d0: 2067 6574 2074 6865 3c2f 7370 616e 3e3c get the< │ │ │ │ +000096e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00009730: 3233 393c 2f73 7061 6e3e 2020 2020 2020 239 │ │ │ │ +00009740: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // ParMETI │ │ │ │ +00009760: 5320 676c 6f62 616c 2069 6e64 6578 206f S global index o │ │ │ │ +00009770: 6620 7468 6520 6f76 6572 6c61 7020 7665 f the overlap ve │ │ │ │ +00009780: 7274 6963 6573 2066 726f 6d20 7468 653c rtices from the< │ │ │ │ +00009790: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +000097b0: 6120 6964 3d22 6c30 3032 3430 2220 6e61 a id="l00240" na │ │ │ │ +000097c0: 6d65 3d22 6c30 3032 3430 223e 3c2f 613e me="l00240"> │ │ │ │ +000097d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 240 // │ │ │ │ +00009810: 6173 736f 6369 6174 6564 2070 726f 6365 associated proce │ │ │ │ +00009820: 7373 6573 2e20 546f 2064 6f20 7468 6973 sses. To do this │ │ │ │ +00009830: 2c20 7468 6520 4475 6e65 3a3a 496e 7465 , the Dune::Inte │ │ │ │ +00009840: 7266 6163 6520 636c 6173 733c 2f73 7061 rface class
.
241 │ │ │ │ +000098b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // is u │ │ │ │ +000098d0: 7365 642e 3c2f 7370 616e 3e3c 2f64 6976 sed.
.
242< │ │ │ │ +00009930: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#ifdef DEBUG_RE │ │ │ │ +00009960: 5041 5254 3c2f 7370 616e 3e3c 2f64 6976 PART
.
243< │ │ │ │ +000099c0: 2f73 7061 6e3e 2020 2020 2020 7374 643a /span> std: │ │ │ │ +000099d0: 3a63 6f75 7420 266c 743b 266c 743b 6f6f :cout <<oo │ │ │ │ +000099e0: 636f 6d6d 2e63 6f6d 6d75 6e69 6361 746f comm.communicato │ │ │ │ +000099f0: 7228 292e 7261 6e6b 2829 266c 743b 266c r().rank()<&l │ │ │ │ +00009a00: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +00009a20: 756f 743b 3a20 6265 666f 7265 2026 7175 uot;: before &qu │ │ │ │ +00009a30: 6f74 3b3c 2f73 7061 6e3e 3b3c 2f64 6976 ot;;
.
244< │ │ │ │ +00009a90: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> for │ │ │ │ +00009ac0: 2873 7464 3a3a 7369 7a65 5f74 2069 3d30 (std::size_t i=0 │ │ │ │ +00009ad0: 3b20 6926 6c74 3b64 756e 6554 6f50 6172 ; i<duneToPar │ │ │ │ +00009ae0: 6d65 7469 732e 7369 7a65 2829 3b20 2b2b metis.size(); ++ │ │ │ │ +00009af0: 6929 3c2f 6469 763e 0a3c 6469 7620 636c i)
.
245 │ │ │ │ +00009b50: 2020 2020 2073 7464 3a3a 636f 7574 266c std::cout&l │ │ │ │ +00009b60: 743b 266c 743b 6475 6e65 546f 5061 726d t;<duneToParm │ │ │ │ +00009b70: 6574 6973 5b69 5d26 6c74 3b26 6c74 3b3c etis[i]<<< │ │ │ │ +00009b80: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +00009b90: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +00009ba0: 3b20 2671 756f 743b 3c2f 7370 616e 3e3b ; "; │ │ │ │ +00009bb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00009c00: 2032 3436 3c2f 7370 616e 3e20 2020 2020 246 │ │ │ │ +00009c10: 2073 7464 3a3a 636f 7574 266c 743b 266c std::cout<&l │ │ │ │ +00009c20: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
247 │ │ │ │ +00009c80: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #endif< │ │ │ │ +00009cb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00009d00: 3234 383c 2f73 7061 6e3e 2020 2020 2020 248 │ │ │ │ +00009d10: 6f6f 636f 6d6d 2e63 6f70 794f 776e 6572 oocomm.copyOwner │ │ │ │ +00009d20: 546f 416c 6c28 6475 6e65 546f 5061 726d ToAll(duneToParm │ │ │ │ +00009d30: 6574 6973 2c64 756e 6554 6f50 6172 6d65 etis,duneToParme │ │ │ │ +00009d40: 7469 7329 3b3c 2f64 6976 3e0a 3c64 6976 tis);
.
< │ │ │ │ +00009d80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00009d90: 6e6f 223e 2020 3234 393c 2f73 7061 6e3e no"> 249 │ │ │ │ +00009da0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #ifde │ │ │ │ +00009dc0: 6620 4445 4255 475f 5245 5041 5254 3c2f f DEBUG_REPART
.
< │ │ │ │ +00009e10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00009e20: 6e6f 223e 2020 3235 303c 2f73 7061 6e3e no"> 250 │ │ │ │ +00009e30: 2020 2020 2020 7374 643a 3a63 6f75 7420 std::cout │ │ │ │ +00009e40: 266c 743b 266c 743b 6f6f 636f 6d6d 2e63 <<oocomm.c │ │ │ │ +00009e50: 6f6d 6d75 6e69 6361 746f 7228 292e 7261 ommunicator().ra │ │ │ │ +00009e60: 6e6b 2829 266c 743b 266c 743b 3c73 7061 nk()<<": │ │ │ │ +00009e90: 6166 7465 7220 2671 756f 743b 3c2f 7370 after ";
.
251 │ │ │ │ +00009f00: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +00009f20: 6f72 3c2f 7370 616e 3e28 7374 643a 3a73 or(std::s │ │ │ │ +00009f30: 697a 655f 7420 693d 303b 2069 266c 743b ize_t i=0; i< │ │ │ │ +00009f40: 6475 6e65 546f 5061 726d 6574 6973 2e73 duneToParmetis.s │ │ │ │ +00009f50: 697a 6528 293b 202b 2b69 293c 2f64 6976 ize(); ++i)
.
252< │ │ │ │ +00009fb0: 2f73 7061 6e3e 2020 2020 2020 2020 7374 /span> st │ │ │ │ +00009fc0: 643a 3a63 6f75 7426 6c74 3b26 6c74 3b64 d::cout<<d │ │ │ │ +00009fd0: 756e 6554 6f50 6172 6d65 7469 735b 695d uneToParmetis[i] │ │ │ │ +00009fe0: 266c 743b 266c 743b 3c73 7061 6e20 636c <<" " │ │ │ │ +0000a010: 3b3c 2f73 7061 6e3e 3b3c 2f64 6976 3e0a ;;
. │ │ │ │ +0000a020: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0000a0d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000a0e0: 6e6f 223e 2020 3235 343c 2f73 7061 6e3e no"> 254 │ │ │ │ +0000a0f0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #endi │ │ │ │ +0000a110: 663c 2f73 7061 6e3e 3c2f 6469 763e 0a3c f
.< │ │ │ │ +0000a120: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000a130: 3e3c 6120 6964 3d22 6c30 3032 3535 2220 > 255 }
.< │ │ │ │ +0000a180: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000a190: 3e3c 6120 6964 3d22 6c30 3032 3536 2220 > 256 }
.< │ │ │ │ +0000a1f0: 6120 6964 3d22 6c30 3032 3537 2220 6e61 a id="l00257" na │ │ │ │ +0000a200: 6d65 3d22 6c30 3032 3537 223e 3c2f 613e me="l00257"> │ │ │ │ +0000a210: 3c73 7061 6e20 636c 6173 733d 226c 696e 257
.
. │ │ │ │ +0000a280: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ +0000a380: 3c61 2069 643d 226c 3030 3235 3922 206e 259 : pu │ │ │ │ +0000a3e0: 626c 6963 3c2f 7370 616e 3e20 496e 7465 blic Inte │ │ │ │ +0000a3f0: 7266 6163 653c 2f64 6976 3e0a 3c64 6976 rface
.
< │ │ │ │ +0000a430: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000a440: 6e6f 223e 2020 3236 303c 2f73 7061 6e3e no"> 260 │ │ │ │ +0000a450: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
. │ │ │ │ +0000a4a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0000a4d0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 2 │ │ │ │ +0000a530: 3631 3c2f 613e 3c2f 7370 616e 3e20 2020 61 │ │ │ │ +0000a540: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ │ +0000a560: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> setCommu │ │ │ │ +0000a5c0: 6e69 6361 746f 723c 2f61 3e28 4d50 495f nicator(MPI_ │ │ │ │ +0000a5d0: 436f 6d6d 2063 6f6d 6d29 3c2f 6469 763e Comm comm)
│ │ │ │ +0000a5e0: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +0000a640: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000a670: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 263 commu │ │ │ │ +0000a6a0: 6e69 6361 746f 725f 3d63 6f6d 6d3b 3c2f nicator_=comm;.
2 │ │ │ │ +0000a700: 3634 3c2f 7370 616e 3e20 2020 207d 3c2f 64 }.
.
< │ │ │ │ +0000a750: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000a760: 6e6f 223e 2020 3236 353c 2f73 7061 6e3e no"> 265 │ │ │ │ +0000a770: 2020 2020 3c73 7061 6e20 636c 6173 733d templa │ │ │ │ +0000a790: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class │ │ │ │ +0000a7c0: 466c 6167 732c 3c73 7061 6e20 636c 6173 Flags,clas │ │ │ │ +0000a7e0: 733c 2f73 7061 6e3e 2049 5326 6774 3b3c s IS>< │ │ │ │ +0000a7f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ │ +0000a870: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000a880: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 266 void buildSendInt │ │ │ │ +0000a960: 6572 6661 6365 3c2f 613e 283c 7370 616e erface(const st │ │ │ │ +0000a990: 643a 3a76 6563 746f 7226 6c74 3b69 6e74 d::vector<int │ │ │ │ +0000a9a0: 2667 743b 2661 6d70 3b20 746f 5061 7274 >& toPart │ │ │ │ +0000a9b0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , const IS& idx │ │ │ │ +0000a9e0: 7365 7429 3c2f 6469 763e 0a3c 6469 7620 set)
.
267 │ │ │ │ +0000aa40: 2020 207b 3c2f 6469 763e 0a3c 6469 7620 {
.
268 │ │ │ │ +0000aaa0: 2020 2020 2073 7464 3a3a 6d61 7026 6c74 std::map< │ │ │ │ +0000aab0: 3b69 6e74 2c69 6e74 2667 743b 2073 697a ;int,int> siz │ │ │ │ +0000aac0: 6573 3b3c 2f64 6976 3e0a 3c64 6976 2063 es;
.
269 < │ │ │ │ +0000ab20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000ab70: 3237 303c 2f73 7061 6e3e 2020 2020 2020 270 │ │ │ │ +0000ab80: 3c73 7061 6e20 636c 6173 733d 226b 6579 for(auto< │ │ │ │ +0000abc0: 2f73 7061 6e3e 2069 3d69 6478 7365 742e /span> i=idxset. │ │ │ │ +0000abd0: 6265 6769 6e28 292c 2065 6e64 3d69 6478 begin(), end=idx │ │ │ │ +0000abe0: 7365 742e 656e 6428 293b 2069 213d 656e set.end(); i!=en │ │ │ │ +0000abf0: 643b 202b 2b69 293c 2f64 6976 3e0a 3c64 d; ++i)
. │ │ │ │ +0000ac10: 3c61 2069 643d 226c 3030 3237 3122 206e 271 if(Fl │ │ │ │ +0000ac80: 6167 733a 3a63 6f6e 7461 696e 7328 692d ags::contains(i- │ │ │ │ +0000ac90: 2667 743b 6c6f 6361 6c28 292e 6174 7472 >local().attr │ │ │ │ +0000aca0: 6962 7574 6528 2929 293c 2f64 6976 3e0a ibute()))
. │ │ │ │ +0000acb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0000ace0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 272 ++ │ │ │ │ +0000ad10: 7369 7a65 735b 746f 5061 7274 5b69 2d26 sizes[toPart[i-& │ │ │ │ +0000ad20: 6774 3b6c 6f63 616c 2829 5d5d 3b3c 2f64 gt;local()]];.
27 │ │ │ │ +0000ad80: 333c 2f73 7061 6e3e 203c 2f64 6976 3e0a 3
. │ │ │ │ +0000ad90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +0000ae40: 6120 6964 3d22 6c30 3032 3735 2220 6e61 a id="l00275" na │ │ │ │ +0000ae50: 6d65 3d22 6c30 3032 3735 223e 3c2f 613e me="l00275"> │ │ │ │ +0000ae60: 3c73 7061 6e20 636c 6173 733d 226c 696e 275 for(auto i= │ │ │ │ +0000aed0: 7369 7a65 732e 6265 6769 6e28 292c 2065 sizes.begin(), e │ │ │ │ +0000aee0: 6e64 3d73 697a 6573 2e65 6e64 2829 3b20 nd=sizes.end(); │ │ │ │ +0000aef0: 6921 3d65 6e64 3b20 2b2b 6929 3c2f 6469 i!=end; ++i).
276 │ │ │ │ +0000af50: 3c2f 7370 616e 3e20 2020 2020 2020 2069 i │ │ │ │ +0000af60: 6e74 6572 6661 6365 7328 295b 692d 2667 nterfaces()[i-&g │ │ │ │ +0000af70: 743b 6669 7273 745d 2e66 6972 7374 2e72 t;first].first.r │ │ │ │ +0000af80: 6573 6572 7665 2869 2d26 6774 3b73 6563 eserve(i->sec │ │ │ │ +0000af90: 6f6e 6429 3b3c 2f64 6976 3e0a 3c64 6976 ond);
.
< │ │ │ │ +0000afd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000afe0: 6e6f 223e 2020 3237 373c 2f73 7061 6e3e no"> 277 │ │ │ │ +0000aff0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +0000b040: 2020 3237 383c 2f73 7061 6e3e 2020 2020 278 │ │ │ │ +0000b050: 2020 3c73 7061 6e20 636c 6173 733d 2263 //Insert │ │ │ │ +0000b070: 2074 6865 2069 6e74 6572 6661 6365 2069 the interface i │ │ │ │ +0000b080: 6e66 6f72 6d61 7469 6f6e 3c2f 7370 616e nformation
.
│ │ │ │ +0000b0e0: 2020 3237 393c 2f73 7061 6e3e 2020 2020 279 │ │ │ │ +0000b0f0: 2020 3c73 7061 6e20 636c 6173 733d 226b for< │ │ │ │ +0000b110: 2f73 7061 6e3e 283c 7370 616e 2063 6c61 /span>(aut │ │ │ │ +0000b130: 6f3c 2f73 7061 6e3e 2069 3d69 6478 7365 o i=idxse │ │ │ │ +0000b140: 742e 6265 6769 6e28 292c 2065 6e64 3d69 t.begin(), end=i │ │ │ │ +0000b150: 6478 7365 742e 656e 6428 293b 2069 213d dxset.end(); i!= │ │ │ │ +0000b160: 656e 643b 202b 2b69 293c 2f64 6976 3e0a end; ++i)
. │ │ │ │ +0000b170: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
281< │ │ │ │ +0000b270: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0000b280: 696e 7465 7266 6163 6573 2829 5b74 6f50 interfaces()[toP │ │ │ │ +0000b290: 6172 745b 692d 2667 743b 6c6f 6361 6c28 art[i->local( │ │ │ │ +0000b2a0: 295d 5d2e 6669 7273 742e 6164 6428 692d )]].first.add(i- │ │ │ │ +0000b2b0: 2667 743b 6c6f 6361 6c28 2929 3b3c 2f64 >local());.
28 │ │ │ │ +0000b310: 323c 2f73 7061 6e3e 2020 2020 7d3c 2f64 2 }.
.
283 │ │ │ │ +0000b380: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ │ +0000b3e0: 6120 6964 3d22 6c30 3032 3834 2220 6e61 a id="l00284" na │ │ │ │ +0000b3f0: 6d65 3d22 6c30 3032 3834 223e 3c2f 613e me="l00284"> │ │ │ │ +0000b400: 3c73 7061 6e20 636c 6173 733d 226c 696e 284< │ │ │ │ +0000b460: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c73 /a> void reserveSpac │ │ │ │ +0000b4f0: 6546 6f72 5265 6365 6976 6549 6e74 6572 eForReceiveInter │ │ │ │ +0000b500: 6661 6365 3c2f 613e 283c 7370 616e 2063 face(int pr │ │ │ │ +0000b530: 6f63 2c20 3c73 7061 6e20 636c 6173 733d oc, in │ │ │ │ +0000b550: 743c 2f73 7061 6e3e 2073 697a 6529 3c2f t size).
2 │ │ │ │ +0000b5b0: 3835 3c2f 7370 616e 3e20 2020 207b 3c2f 85 {.
2 │ │ │ │ +0000b610: 3836 3c2f 7370 616e 3e20 2020 2020 2069 86 i │ │ │ │ +0000b620: 6e74 6572 6661 6365 7328 295b 7072 6f63 nterfaces()[proc │ │ │ │ +0000b630: 5d2e 7365 636f 6e64 2e72 6573 6572 7665 ].second.reserve │ │ │ │ +0000b640: 2873 697a 6529 3b3c 2f64 6976 3e0a 3c64 (size);
. │ │ │ │ +0000b660: 3c61 2069 643d 226c 3030 3238 3722 206e 287 }
..
.
288 void addReceiveInd │ │ │ │ +0000b820: 6578 3c2f 613e 283c 7370 616e 2063 6c61 ex(int proc │ │ │ │ +0000b850: 2c20 7374 643a 3a73 697a 655f 7420 6964 , std::size_t id │ │ │ │ +0000b860: 7829 3c2f 6469 763e 0a3c 6469 7620 636c x)
.
289 │ │ │ │ +0000b8c0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
290 │ │ │ │ +0000b920: 2020 2069 6e74 6572 6661 6365 7328 295b interfaces()[ │ │ │ │ +0000b930: 7072 6f63 5d2e 7365 636f 6e64 2e61 6464 proc].second.add │ │ │ │ +0000b940: 2869 6478 293b 3c2f 6469 763e 0a3c 6469 (idx);
.< │ │ │ │ +0000b960: 6120 6964 3d22 6c30 3032 3931 2220 6e61 a id="l00291" na │ │ │ │ +0000b970: 6d65 3d22 6c30 3032 3931 223e 3c2f 613e me="l00291"> │ │ │ │ +0000b980: 3c73 7061 6e20 636c 6173 733d 226c 696e 291 }
..
29 │ │ │ │ +0000ba00: 323c 2f73 7061 6e3e 2020 2020 3c73 7061 2 template<typen │ │ │ │ +0000ba50: 616d 653c 2f73 7061 6e3e 2054 4726 6774 ame TG> │ │ │ │ +0000ba60: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
. │ │ │ │ +0000bac0: 3c61 2069 643d 226c 3030 3239 3322 206e 293 │ │ │ │ +0000bb40: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c < │ │ │ │ +0000bb50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0000bb60: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void buildRecei │ │ │ │ +0000bbd0: 7665 496e 7465 7266 6163 653c 2f61 3e28 veInterface( │ │ │ │ +0000bbe0: 7374 643a 3a76 6563 746f 7226 6c74 3b73 std::vector<s │ │ │ │ +0000bbf0: 7464 3a3a 7061 6972 266c 743b 5447 2c69 td::pair<TG,i │ │ │ │ +0000bc00: 6e74 2667 743b 2026 6774 3b26 616d 703b nt> >& │ │ │ │ +0000bc10: 2069 6e64 6963 6573 293c 2f64 6976 3e0a indices)
. │ │ │ │ +0000bc20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +0000bc80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
│ │ │ │ +0000bcf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000bd20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 296 for( │ │ │ │ +0000bd70: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto idx=indices.be │ │ │ │ +0000bda0: 6769 6e28 293b 2069 6478 213d 2069 6e64 gin(); idx!= ind │ │ │ │ +0000bdb0: 6963 6573 2e65 6e64 2829 3b20 2b2b 6964 ices.end(); ++id │ │ │ │ +0000bdc0: 7829 207b 3c2f 6469 763e 0a3c 6469 7620 x) {
.
297 │ │ │ │ +0000be20: 2020 2020 2020 2069 6e74 6572 6661 6365 interface │ │ │ │ +0000be30: 7328 295b 6964 782d 2667 743b 7365 636f s()[idx->seco │ │ │ │ +0000be40: 6e64 5d2e 7365 636f 6e64 2e61 6464 2869 nd].second.add(i │ │ │ │ +0000be50: 2b2b 293b 3c2f 6469 763e 0a3c 6469 7620 ++);
.
298 │ │ │ │ +0000beb0: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +0000bed0: 6120 6964 3d22 6c30 3032 3939 2220 6e61 a id="l00299" na │ │ │ │ +0000bee0: 6d65 3d22 6c30 3032 3939 223e 3c2f 613e me="l00299"> │ │ │ │ +0000bef0: 3c73 7061 6e20 636c 6173 733d 226c 696e 299 }
..
30 │ │ │ │ +0000bf70: 303c 2f73 7061 6e3e 203c 2f64 6976 3e0a 0
. │ │ │ │ +0000bf80: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
..
302 │ │ │ │ +0000c130: 2020 207b 7d3c 2f64 6976 3e0a 3c2f 6469 {}
..
303 │ │ │ │ +0000c190: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +0000c1a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000c1b0: 3e3c 6120 6964 3d22 6c30 3033 3034 2220 > 304 };
..
3 │ │ │ │ +0000c250: 3035 3c2f 7370 616e 3e20 3c2f 6469 763e 05
│ │ │ │ +0000c260: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000c290: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 306 nam │ │ │ │ +0000c2d0: 6573 7061 6365 3c2f 7370 616e 3e3c 2f64 espace.
30 │ │ │ │ +0000c330: 373c 2f73 7061 6e3e 2020 7b3c 2f64 6976 7 {
.
317< │ │ │ │ +0000c390: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ +0000c3b0: 7465 6d70 6c61 7465 3c2f 7370 616e 3e26 template& │ │ │ │ +0000c3c0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class GI>.
318 │ │ │ │ +0000c440: 3c2f 7370 616e 3e20 2020 203c 7370 616e void │ │ │ │ +0000c470: 2063 7265 6174 6553 656e 6442 7566 2873 createSendBuf(s │ │ │ │ +0000c480: 7464 3a3a 7665 6374 6f72 266c 743b 4749 td::vector<GI │ │ │ │ +0000c490: 2667 743b 2661 6d70 3b20 6f77 6e65 7256 >& ownerV │ │ │ │ +0000c4a0: 6563 2c20 7374 643a 3a73 6574 266c 743b ec, std::set< │ │ │ │ +0000c4b0: 4749 2667 743b 2661 6d70 3b20 6f76 6572 GI>& over │ │ │ │ +0000c4c0: 6c61 7056 6563 2c20 7374 643a 3a73 6574 lapVec, std::set │ │ │ │ +0000c4d0: 266c 743b 696e 7426 6774 3b26 616d 703b <int>& │ │ │ │ +0000c4e0: 206e 6569 6768 626f 7273 2c20 3c73 7061 neighbors, char *sendBuf, int │ │ │ │ +0000c540: 2062 7566 6665 7273 697a 652c 204d 5049 buffersize, MPI │ │ │ │ +0000c550: 5f43 6f6d 6d20 636f 6d6d 2920 7b3c 2f64 _Comm comm) {.
31 │ │ │ │ +0000c5b0: 393c 2f73 7061 6e3e 2020 2020 2020 3c73 9 // Pack owne │ │ │ │ +0000c5e0: 7220 7665 7274 6963 6573 3c2f 7370 616e r vertices
.
│ │ │ │ +0000c640: 2020 3332 303c 2f73 7061 6e3e 2020 2020 320 │ │ │ │ +0000c650: 2020 7374 643a 3a73 697a 655f 7420 733d std::size_t s= │ │ │ │ +0000c660: 6f77 6e65 7256 6563 2e73 697a 6528 293b ownerVec.size(); │ │ │ │ +0000c670: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000c6c0: 2033 3231 3c2f 7370 616e 3e20 2020 2020 321 │ │ │ │ +0000c6d0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int pos=0;.
322 │ │ │ │ +0000c750: 3c2f 7370 616e 3e20 2020 2020 203c 7370 if │ │ │ │ +0000c780: 2873 3d3d 3029 3c2f 6469 763e 0a3c 6469 (s==0)
.< │ │ │ │ +0000c7a0: 6120 6964 3d22 6c30 3033 3233 2220 6e61 a id="l00323" na │ │ │ │ +0000c7b0: 6d65 3d22 6c30 3033 3233 223e 3c2f 613e me="l00323"> │ │ │ │ +0000c7c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 323 ownerVe │ │ │ │ +0000c7f0: 632e 7265 7369 7a65 2831 293b 203c 7370 c.resize(1); // otherwise │ │ │ │ +0000c820: 776f 756c 6420 7265 6164 2062 6579 6f6e would read beyon │ │ │ │ +0000c830: 6420 7468 6520 6d65 6d6f 7279 2062 6f75 d the memory bou │ │ │ │ +0000c840: 6e64 3c2f 7370 616e 3e3c 2f64 6976 3e0a nd
. │ │ │ │ +0000c850: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0000c880: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 324 MPI_Pa │ │ │ │ +0000c8b0: 636b 2826 616d 703b 732c 2031 2c20 4d50 ck(&s, 1, MP │ │ │ │ +0000c8c0: 4954 7261 6974 7326 6c74 3b73 7464 3a3a ITraits<std:: │ │ │ │ +0000c8d0: 7369 7a65 5f74 2667 743b 3a3a 6765 7454 size_t>::getT │ │ │ │ +0000c8e0: 7970 6528 292c 2073 656e 6442 7566 2c20 ype(), sendBuf, │ │ │ │ +0000c8f0: 6275 6666 6572 7369 7a65 2c20 2661 6d70 buffersize, & │ │ │ │ +0000c900: 3b70 6f73 2c20 636f 6d6d 293b 3c2f 6469 ;pos, comm);.
325 │ │ │ │ +0000c960: 3c2f 7370 616e 3e20 2020 2020 204d 5049 MPI │ │ │ │ +0000c970: 5f50 6163 6b28 2661 6d70 3b28 6f77 6e65 _Pack(&(owne │ │ │ │ +0000c980: 7256 6563 5b30 5d29 2c20 732c 204d 5049 rVec[0]), s, MPI │ │ │ │ +0000c990: 5472 6169 7473 266c 743b 4749 2667 743b Traits<GI> │ │ │ │ +0000c9a0: 3a3a 6765 7454 7970 6528 292c 2073 656e ::getType(), sen │ │ │ │ +0000c9b0: 6442 7566 2c20 6275 6666 6572 7369 7a65 dBuf, buffersize │ │ │ │ +0000c9c0: 2c20 2661 6d70 3b70 6f73 2c20 636f 6d6d , &pos, comm │ │ │ │ +0000c9d0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
326 │ │ │ │ +0000ca30: 2020 2073 203d 206f 7665 726c 6170 5665 s = overlapVe │ │ │ │ +0000ca40: 632e 7369 7a65 2829 3b3c 2f64 6976 3e0a c.size();
. │ │ │ │ +0000ca50: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0000ca80: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 327 MPI_Pa │ │ │ │ +0000cab0: 636b 2826 616d 703b 732c 2031 2c20 4d50 ck(&s, 1, MP │ │ │ │ +0000cac0: 4954 7261 6974 7326 6c74 3b73 7464 3a3a ITraits<std:: │ │ │ │ +0000cad0: 7369 7a65 5f74 2667 743b 3a3a 6765 7454 size_t>::getT │ │ │ │ +0000cae0: 7970 6528 292c 2073 656e 6442 7566 2c20 ype(), sendBuf, │ │ │ │ +0000caf0: 6275 6666 6572 7369 7a65 2c20 2661 6d70 buffersize, & │ │ │ │ +0000cb00: 3b70 6f73 2c20 636f 6d6d 293b 3c2f 6469 ;pos, comm);.
328 │ │ │ │ +0000cb60: 3c2f 7370 616e 3e20 2020 2020 203c 7370 for(auto i=overlapVec │ │ │ │ +0000cbc0: 2e62 6567 696e 2829 2c20 656e 643d 206f .begin(), end= o │ │ │ │ +0000cbd0: 7665 726c 6170 5665 632e 656e 6428 293b verlapVec.end(); │ │ │ │ +0000cbe0: 2069 2021 3d20 656e 643b 202b 2b69 293c i != end; ++i)< │ │ │ │ +0000cbf0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000cc40: 3332 393c 2f73 7061 6e3e 2020 2020 2020 329 │ │ │ │ +0000cc50: 2020 4d50 495f 5061 636b 283c 7370 616e MPI_Pack(const_cast<< │ │ │ │ +0000cc80: 2f73 7061 6e3e 4749 2a3c 7370 616e 2063 /span>GI*& │ │ │ │ +0000cca0: 6774 3b3c 2f73 7061 6e3e 2826 616d 703b gt;(& │ │ │ │ +0000ccb0: 282a 6929 292c 2031 2c20 4d50 4954 7261 (*i)), 1, MPITra │ │ │ │ +0000ccc0: 6974 7326 6c74 3b47 4926 6774 3b3a 3a67 its<GI>::g │ │ │ │ +0000ccd0: 6574 5479 7065 2829 2c20 7365 6e64 4275 etType(), sendBu │ │ │ │ +0000cce0: 662c 2062 7566 6665 7273 697a 652c 2026 f, buffersize, & │ │ │ │ +0000ccf0: 616d 703b 706f 732c 2063 6f6d 6d29 3b3c amp;pos, comm);< │ │ │ │ +0000cd00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000cd50: 3333 303c 2f73 7061 6e3e 203c 2f64 6976 330
.
331< │ │ │ │ +0000cdb0: 2f73 7061 6e3e 2020 2020 2020 733d 6e65 /span> s=ne │ │ │ │ +0000cdc0: 6967 6862 6f72 732e 7369 7a65 2829 3b3c ighbors.size();< │ │ │ │ +0000cdd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000ce20: 3333 323c 2f73 7061 6e3e 2020 2020 2020 332 │ │ │ │ +0000ce30: 4d50 495f 5061 636b 2826 616d 703b 732c MPI_Pack(&s, │ │ │ │ +0000ce40: 2031 2c20 4d50 4954 7261 6974 7326 6c74 1, MPITraits< │ │ │ │ +0000ce50: 3b73 7464 3a3a 7369 7a65 5f74 2667 743b ;std::size_t> │ │ │ │ +0000ce60: 3a3a 6765 7454 7970 6528 292c 2073 656e ::getType(), sen │ │ │ │ +0000ce70: 6442 7566 2c20 6275 6666 6572 7369 7a65 dBuf, buffersize │ │ │ │ +0000ce80: 2c20 2661 6d70 3b70 6f73 2c20 636f 6d6d , &pos, comm │ │ │ │ +0000ce90: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
333 .
3 │ │ │ │ +0000cf40: 3334 3c2f 7370 616e 3e20 2020 2020 203c 34 < │ │ │ │ +0000cf50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0000cf60: 6f72 6466 6c6f 7722 3e66 6f72 3c2f 7370 ordflow">for(auto i=neighbor │ │ │ │ +0000cfa0: 732e 6265 6769 6e28 292c 2065 6e64 3d20 s.begin(), end= │ │ │ │ +0000cfb0: 6e65 6967 6862 6f72 732e 656e 6428 293b neighbors.end(); │ │ │ │ +0000cfc0: 2069 2021 3d20 656e 643b 202b 2b69 293c i != end; ++i)< │ │ │ │ +0000cfd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000d020: 3333 353c 2f73 7061 6e3e 2020 2020 2020 335 │ │ │ │ +0000d030: 2020 4d50 495f 5061 636b 283c 7370 616e MPI_Pack(const_cast<< │ │ │ │ +0000d060: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> │ │ │ │ +0000d080: 696e 743c 2f73 7061 6e3e 2a3c 7370 616e int*>(&am │ │ │ │ +0000d0b0: 703b 282a 6929 292c 2031 2c20 4d50 495f p;(*i)), 1, MPI_ │ │ │ │ +0000d0c0: 494e 542c 2073 656e 6442 7566 2c20 6275 INT, sendBuf, bu │ │ │ │ +0000d0d0: 6666 6572 7369 7a65 2c20 2661 6d70 3b70 ffersize, &p │ │ │ │ +0000d0e0: 6f73 2c20 636f 6d6d 293b 3c2f 6469 763e os, comm);
│ │ │ │ +0000d0f0: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +0000d150: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000d180: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 345 t │ │ │ │ +0000d1c0: 656d 706c 6174 653c 2f73 7061 6e3e 266c emplate&l │ │ │ │ +0000d1d0: 743b 3c73 7061 6e20 636c 6173 733d 226b t;class GI>
.
346< │ │ │ │ +0000d250: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> void │ │ │ │ +0000d280: 7361 7665 5265 6376 4275 6628 3c73 7061 saveRecvBuf(char *recvBuf, int │ │ │ │ +0000d2e0: 2062 7566 6665 7253 697a 652c 2073 7464 bufferSize, std │ │ │ │ +0000d2f0: 3a3a 7665 6374 6f72 266c 743b 7374 643a ::vector<std: │ │ │ │ +0000d300: 3a70 6169 7226 6c74 3b47 492c 696e 7426 :pair<GI,int& │ │ │ │ +0000d310: 6774 3b20 2667 743b 2661 6d70 3b20 6f77 gt; >& ow │ │ │ │ +0000d320: 6e65 7256 6563 2c3c 2f64 6976 3e0a 3c64 nerVec,
. │ │ │ │ +0000d340: 3c61 2069 643d 226c 3030 3334 3722 206e 347 │ │ │ │ +0000d390: 2020 2020 2020 2073 7464 3a3a 7365 7426 std::set& │ │ │ │ +0000d3a0: 6c74 3b47 4926 6774 3b26 616d 703b 206f lt;GI>& o │ │ │ │ +0000d3b0: 7665 726c 6170 5665 632c 2073 7464 3a3a verlapVec, std:: │ │ │ │ +0000d3c0: 7365 7426 6c74 3b69 6e74 2667 743b 2661 set<int>&a │ │ │ │ +0000d3d0: 6d70 3b20 6e65 6967 6862 6f72 732c 2052 mp; neighbors, R │ │ │ │ +0000d3e0: 6564 6973 7472 6962 7574 6549 6e74 6572 edistributeInter │ │ │ │ +0000d3f0: 6661 6365 2661 6d70 3b20 696e 662c 203c face& inf, < │ │ │ │ +0000d400: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0000d410: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int from, MPI_Co │ │ │ │ +0000d430: 6d6d 2063 6f6d 6d29 207b 3c2f 6469 763e mm comm) {
│ │ │ │ +0000d440: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000d470: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 348 std:: │ │ │ │ +0000d4a0: 7369 7a65 5f74 2073 697a 653b 3c2f 6469 size_t size;.
349 │ │ │ │ +0000d500: 3c2f 7370 616e 3e20 2020 2020 203c 7370 int pos=0;
.< │ │ │ │ +0000d540: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000d550: 3e3c 6120 6964 3d22 6c30 3033 3530 2220 > 350 / │ │ │ │ +0000d5b0: 2f20 756e 7061 636b 206f 776e 6572 2076 / unpack owner v │ │ │ │ +0000d5c0: 6572 7469 6365 733c 2f73 7061 6e3e 3c2f ertices.
3 │ │ │ │ +0000d620: 3531 3c2f 7370 616e 3e20 2020 2020 204d 51 M │ │ │ │ +0000d630: 5049 5f55 6e70 6163 6b28 7265 6376 4275 PI_Unpack(recvBu │ │ │ │ +0000d640: 662c 2062 7566 6665 7253 697a 652c 2026 f, bufferSize, & │ │ │ │ +0000d650: 616d 703b 706f 732c 2026 616d 703b 7369 amp;pos, &si │ │ │ │ +0000d660: 7a65 2c20 312c 204d 5049 5472 6169 7473 ze, 1, MPITraits │ │ │ │ +0000d670: 266c 743b 7374 643a 3a73 697a 655f 7426 <std::size_t& │ │ │ │ +0000d680: 6774 3b3a 3a67 6574 5479 7065 2829 2c20 gt;::getType(), │ │ │ │ +0000d690: 636f 6d6d 293b 3c2f 6469 763e 0a3c 6469 comm);
.< │ │ │ │ +0000d6b0: 6120 6964 3d22 6c30 3033 3532 2220 6e61 a id="l00352" na │ │ │ │ +0000d6c0: 6d65 3d22 6c30 3033 3532 223e 3c2f 613e me="l00352"> │ │ │ │ +0000d6d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 352 inf.reser │ │ │ │ +0000d700: 7665 5370 6163 6546 6f72 5265 6365 6976 veSpaceForReceiv │ │ │ │ +0000d710: 6549 6e74 6572 6661 6365 2866 726f 6d2c eInterface(from, │ │ │ │ +0000d720: 2073 697a 6529 3b3c 2f64 6976 3e0a 3c64 size);
. │ │ │ │ +0000d740: 3c61 2069 643d 226c 3030 3335 3322 206e 353
ownerVec │ │ │ │ +0000d790: 2e72 6573 6572 7665 286f 776e 6572 5665 .reserve(ownerVe │ │ │ │ +0000d7a0: 632e 7369 7a65 2829 2b73 697a 6529 3b3c c.size()+size);< │ │ │ │ +0000d7b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000d800: 3335 343c 2f73 7061 6e3e 2020 2020 2020 354 │ │ │ │ +0000d810: 3c73 7061 6e20 636c 6173 733d 226b 6579 for(; size!=0; │ │ │ │ +0000d840: 2d2d 7369 7a65 2920 7b3c 2f64 6976 3e0a --size) {
. │ │ │ │ +0000d850: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
356 │ │ │ │ +0000d910: 2020 2020 204d 5049 5f55 6e70 6163 6b28 MPI_Unpack( │ │ │ │ +0000d920: 7265 6376 4275 662c 2062 7566 6665 7253 recvBuf, bufferS │ │ │ │ +0000d930: 697a 652c 2026 616d 703b 706f 732c 2026 ize, &pos, & │ │ │ │ +0000d940: 616d 703b 6769 2c20 312c 204d 5049 5472 amp;gi, 1, MPITr │ │ │ │ +0000d950: 6169 7473 266c 743b 4749 2667 743b 3a3a aits<GI>:: │ │ │ │ +0000d960: 6765 7454 7970 6528 292c 2063 6f6d 6d29 getType(), comm) │ │ │ │ +0000d970: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0000d9c0: 2020 3335 373c 2f73 7061 6e3e 2020 2020 357 │ │ │ │ +0000d9d0: 2020 2020 6f77 6e65 7256 6563 2e70 7573 ownerVec.pus │ │ │ │ +0000d9e0: 685f 6261 636b 2873 7464 3a3a 6d61 6b65 h_back(std::make │ │ │ │ +0000d9f0: 5f70 6169 7228 6769 2c66 726f 6d29 293b _pair(gi,from)); │ │ │ │ +0000da00: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000da50: 2033 3538 3c2f 7370 616e 3e20 2020 2020 358 │ │ │ │ +0000da60: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
359 │ │ │ │ +0000dac0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // unpa │ │ │ │ +0000dae0: 636b 206f 7665 726c 6170 2076 6572 7469 ck overlap verti │ │ │ │ +0000daf0: 6365 733c 2f73 7061 6e3e 3c2f 6469 763e ces
│ │ │ │ +0000db00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000db30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 360 MPI_U │ │ │ │ +0000db60: 6e70 6163 6b28 7265 6376 4275 662c 2062 npack(recvBuf, b │ │ │ │ +0000db70: 7566 6665 7253 697a 652c 2026 616d 703b ufferSize, & │ │ │ │ +0000db80: 706f 732c 2026 616d 703b 7369 7a65 2c20 pos, &size, │ │ │ │ +0000db90: 312c 204d 5049 5472 6169 7473 266c 743b 1, MPITraits< │ │ │ │ +0000dba0: 7374 643a 3a73 697a 655f 7426 6774 3b3a std::size_t>: │ │ │ │ +0000dbb0: 3a67 6574 5479 7065 2829 2c20 636f 6d6d :getType(), comm │ │ │ │ +0000dbc0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
361 │ │ │ │ +0000dc20: 2020 203c 7370 616e 2063 6c61 7373 3d22 typenam │ │ │ │ +0000dc40: 653c 2f73 7061 6e3e 2073 7464 3a3a 7365 e std::se │ │ │ │ +0000dc50: 7426 6c74 3b47 4926 6774 3b3a 3a69 7465 t<GI>::ite │ │ │ │ +0000dc60: 7261 746f 7220 6970 6f73 203d 206f 7665 rator ipos = ove │ │ │ │ +0000dc70: 726c 6170 5665 632e 6265 6769 6e28 293b rlapVec.begin(); │ │ │ │ +0000dc80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000dcd0: 2033 3632 3c2f 7370 616e 3e20 2020 2020 362 │ │ │ │ +0000dce0: 2044 756e 653a 3a64 7665 7262 2026 6c74 Dune::dverb < │ │ │ │ +0000dcf0: 3b26 6c74 3b20 3c73 7061 6e20 636c 6173 ;< "unpackin │ │ │ │ +0000dd20: 6720 2671 756f 743b 3c2f 7370 616e 3e26 g "& │ │ │ │ +0000dd30: 6c74 3b26 6c74 3b73 697a 6526 6c74 3b26 lt;<size<& │ │ │ │ +0000dd40: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +0000dd60: 7175 6f74 3b20 6f76 6572 6c61 7026 7175 quot; overlap&qu │ │ │ │ +0000dd70: 6f74 3b3c 2f73 7061 6e3e 266c 743b 266c ot;<&l │ │ │ │ +0000dd80: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
363 │ │ │ │ +0000dde0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 for(; size!=0; --s │ │ │ │ +0000de20: 697a 6529 207b 3c2f 6469 763e 0a3c 6469 ize) {
.< │ │ │ │ +0000de40: 6120 6964 3d22 6c30 3033 3634 2220 6e61 a id="l00364" na │ │ │ │ +0000de50: 6d65 3d22 6c30 3033 3634 223e 3c2f 613e me="l00364"> │ │ │ │ +0000de60: 3c73 7061 6e20 636c 6173 733d 226c 696e 364 GI gi;< │ │ │ │ +0000de90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0000dee0: 3336 353c 2f73 7061 6e3e 2020 2020 2020 365 │ │ │ │ +0000def0: 2020 4d50 495f 556e 7061 636b 2872 6563 MPI_Unpack(rec │ │ │ │ +0000df00: 7642 7566 2c20 6275 6666 6572 5369 7a65 vBuf, bufferSize │ │ │ │ +0000df10: 2c20 2661 6d70 3b70 6f73 2c20 2661 6d70 , &pos, & │ │ │ │ +0000df20: 3b67 692c 2031 2c20 4d50 4954 7261 6974 ;gi, 1, MPITrait │ │ │ │ +0000df30: 7326 6c74 3b47 4926 6774 3b3a 3a67 6574 s<GI>::get │ │ │ │ +0000df40: 5479 7065 2829 2c20 636f 6d6d 293b 3c2f Type(), comm);.
3 │ │ │ │ +0000dfa0: 3636 3c2f 7370 616e 3e20 2020 2020 2020 66 │ │ │ │ +0000dfb0: 2069 706f 733d 6f76 6572 6c61 7056 6563 ipos=overlapVec │ │ │ │ +0000dfc0: 2e69 6e73 6572 7428 6970 6f73 2c20 6769 .insert(ipos, gi │ │ │ │ +0000dfd0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
367 │ │ │ │ +0000e030: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
368 │ │ │ │ +0000e090: 2020 2020 203c 7370 616e 2063 6c61 7373 //unp │ │ │ │ +0000e0b0: 6163 6b20 6e65 6967 6862 6f72 733c 2f73 ack neighbors
.
369 │ │ │ │ +0000e120: 2020 2020 204d 5049 5f55 6e70 6163 6b28 MPI_Unpack( │ │ │ │ +0000e130: 7265 6376 4275 662c 2062 7566 6665 7253 recvBuf, bufferS │ │ │ │ +0000e140: 697a 652c 2026 616d 703b 706f 732c 2026 ize, &pos, & │ │ │ │ +0000e150: 616d 703b 7369 7a65 2c20 312c 2020 4d50 amp;size, 1, MP │ │ │ │ +0000e160: 4954 7261 6974 7326 6c74 3b73 7464 3a3a ITraits<std:: │ │ │ │ +0000e170: 7369 7a65 5f74 2667 743b 3a3a 6765 7454 size_t>::getT │ │ │ │ +0000e180: 7970 6528 292c 2063 6f6d 6d29 3b3c 2f64 ype(), comm);.
37 │ │ │ │ +0000e1e0: 303c 2f73 7061 6e3e 2020 2020 2020 4475 0 Du │ │ │ │ +0000e1f0: 6e65 3a3a 6476 6572 6220 266c 743b 266c ne::dverb <&l │ │ │ │ +0000e200: 743b 203c 7370 616e 2063 6c61 7373 3d22 t; & │ │ │ │ +0000e220: 7175 6f74 3b75 6e70 6163 6b69 6e67 2026 quot;unpacking & │ │ │ │ +0000e230: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ +0000e240: 266c 743b 7369 7a65 266c 743b 266c 743b <size<< │ │ │ │ +0000e250: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +0000e270: 743b 206e 6569 6768 626f 7273 2671 756f t; neighbors&quo │ │ │ │ +0000e280: 743b 3c2f 7370 616e 3e26 6c74 3b26 6c74 t;<< │ │ │ │ +0000e290: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
371< │ │ │ │ +0000e2f0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> typename std::set<in │ │ │ │ +0000e330: 7426 6774 3b3a 3a69 7465 7261 746f 7220 t>::iterator │ │ │ │ +0000e340: 6e70 6f73 203d 206e 6569 6768 626f 7273 npos = neighbors │ │ │ │ +0000e350: 2e62 6567 696e 2829 3b3c 2f64 6976 3e0a .begin();
. │ │ │ │ +0000e360: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
373 │ │ │ │ +0000e450: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +0000e470: 696e 743c 2f73 7061 6e3e 206e 3b3c 2f64 int n;.
37 │ │ │ │ +0000e4d0: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ │ +0000e4e0: 4d50 495f 556e 7061 636b 2872 6563 7642 MPI_Unpack(recvB │ │ │ │ +0000e4f0: 7566 2c20 6275 6666 6572 5369 7a65 2c20 uf, bufferSize, │ │ │ │ +0000e500: 2661 6d70 3b70 6f73 2c20 2661 6d70 3b6e &pos, &n │ │ │ │ +0000e510: 2c20 312c 204d 5049 5f49 4e54 2c20 636f , 1, MPI_INT, co │ │ │ │ +0000e520: 6d6d 293b 3c2f 6469 763e 0a3c 6469 7620 mm);
.
375 │ │ │ │ +0000e580: 2020 2020 2020 206e 706f 733d 6e65 6967 npos=neig │ │ │ │ +0000e590: 6862 6f72 732e 696e 7365 7274 286e 706f hbors.insert(npo │ │ │ │ +0000e5a0: 732c 206e 293b 3c2f 6469 763e 0a3c 6469 s, n);
.< │ │ │ │ +0000e5c0: 6120 6964 3d22 6c30 3033 3736 2220 6e61 a id="l00376" na │ │ │ │ +0000e5d0: 6d65 3d22 6c30 3033 3736 223e 3c2f 613e me="l00376"> │ │ │ │ +0000e5e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 376 }
.< │ │ │ │ +0000e610: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000e620: 3e3c 6120 6964 3d22 6c30 3033 3737 2220 > 377 }
.< │ │ │ │ +0000e670: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000e680: 3e3c 6120 6964 3d22 6c30 3033 3738 2220 > 378
.
392 │ │ │ │ +0000e720: 2020 203c 7370 616e 2063 6c61 7373 3d22 templat │ │ │ │ +0000e740: 653c 2f73 7061 6e3e 266c 743b 3c73 7061 e<typename T>
. │ │ │ │ +0000e790: 3c61 2069 643d 226c 3030 3339 3322 206e 393 │ │ │ │ +0000e7f0: 766f 6964 3c2f 7370 616e 3e20 6765 7444 void getD │ │ │ │ +0000e800: 6f6d 6169 6e28 3c73 7061 6e20 636c 6173 omain(cons │ │ │ │ +0000e820: 743c 2f73 7061 6e3e 204d 5049 5f43 6f6d t MPI_Com │ │ │ │ +0000e830: 6d26 616d 703b 2063 6f6d 6d2c 2054 202a m& comm, T * │ │ │ │ +0000e840: 7061 7274 2c20 3c73 7061 6e20 636c 6173 part, │ │ │ │ +0000e860: 696e 743c 2f73 7061 6e3e 206e 756d 4f66 int numOf │ │ │ │ +0000e870: 4f77 6e56 7478 2c20 3c73 7061 6e20 636c OwnVtx, int npa │ │ │ │ +0000e8a0: 7274 732c 203c 7370 616e 2063 6c61 7373 rts, i │ │ │ │ +0000e8c0: 6e74 3c2f 7370 616e 3e20 2a6d 7944 6f6d nt *myDom │ │ │ │ +0000e8d0: 6169 6e2c 2073 7464 3a3a 7665 6374 6f72 ain, std::vector │ │ │ │ +0000e8e0: 266c 743b 696e 7426 6774 3b20 2661 6d70 <int> & │ │ │ │ +0000e8f0: 3b64 6f6d 6169 6e4d 6170 7069 6e67 2920 ;domainMapping) │ │ │ │ +0000e900: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +0000e950: 2020 3339 343c 2f73 7061 6e3e 2020 2020 394 │ │ │ │ +0000e960: 2020 3c73 7061 6e20 636c 6173 733d 226b int< │ │ │ │ +0000e980: 2f73 7061 6e3e 206e 7065 732c 206d 7970 /span> npes, myp │ │ │ │ +0000e990: 653b 3c2f 6469 763e 0a3c 6469 7620 636c e;
.
395 │ │ │ │ +0000e9f0: 2020 204d 5049 5f43 6f6d 6d5f 7369 7a65 MPI_Comm_size │ │ │ │ +0000ea00: 2863 6f6d 6d2c 2026 616d 703b 6e70 6573 (comm, &npes │ │ │ │ +0000ea10: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
396 │ │ │ │ +0000ea70: 2020 204d 5049 5f43 6f6d 6d5f 7261 6e6b MPI_Comm_rank │ │ │ │ +0000ea80: 2863 6f6d 6d2c 2026 616d 703b 6d79 7065 (comm, &mype │ │ │ │ +0000ea90: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
397 │ │ │ │ +0000eaf0: 2020 204d 5049 5f53 7461 7475 7320 7374 MPI_Status st │ │ │ │ +0000eb00: 6174 7573 3b3c 2f64 6976 3e0a 3c64 6976 atus;
.
< │ │ │ │ +0000eb40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000eb50: 6e6f 223e 2020 3339 383c 2f73 7061 6e3e no"> 398 │ │ │ │ +0000eb60: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +0000ebb0: 2020 3339 393c 2f73 7061 6e3e 2020 2020 399 │ │ │ │ +0000ebc0: 2020 2a6d 7944 6f6d 6169 6e20 3d20 2d31 *myDomain = -1 │ │ │ │ +0000ebd0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0000ec20: 2020 3430 303c 2f73 7061 6e3e 2020 2020 400 │ │ │ │ +0000ec30: 2020 3c73 7061 6e20 636c 6173 733d 226b int< │ │ │ │ +0000ec50: 2f73 7061 6e3e 2069 3d30 3b3c 2f64 6976 /span> i=0;
.
401< │ │ │ │ +0000ecb0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> int │ │ │ │ +0000ece0: 206a 3d30 3b3c 2f64 6976 3e0a 3c64 6976 j=0;
.
< │ │ │ │ +0000ed20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000ed30: 6e6f 223e 2020 3430 323c 2f73 7061 6e3e no"> 402 │ │ │ │ +0000ed40: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +0000ed90: 2020 3430 333c 2f73 7061 6e3e 2020 2020 403 │ │ │ │ +0000eda0: 2020 7374 643a 3a76 6563 746f 7226 6c74 std::vector< │ │ │ │ +0000edb0: 3b69 6e74 2667 743b 2064 6f6d 6169 6e28 ;int> domain( │ │ │ │ +0000edc0: 6e70 6172 7473 2c20 3029 3b3c 2f64 6976 nparts, 0);
.
404< │ │ │ │ +0000ee20: 2f73 7061 6e3e 2020 2020 2020 7374 643a /span> std: │ │ │ │ +0000ee30: 3a76 6563 746f 7226 6c74 3b69 6e74 2667 :vector<int&g │ │ │ │ +0000ee40: 743b 2061 7373 6967 6e65 6428 6e70 6573 t; assigned(npes │ │ │ │ +0000ee50: 2c20 3029 3b3c 2f64 6976 3e0a 3c64 6976 , 0);
.
< │ │ │ │ +0000ee90: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000eea0: 6e6f 223e 2020 3430 353c 2f73 7061 6e3e no"> 405 │ │ │ │ +0000eeb0: 2020 2020 2020 3c73 7061 6e20 636c 6173 // i │ │ │ │ +0000eed0: 6e69 7420 646f 6d61 696e 204d 6170 7069 nit domain Mappi │ │ │ │ +0000eee0: 6e67 3c2f 7370 616e 3e3c 2f64 6976 3e0a ng
. │ │ │ │ +0000eef0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +0000ef80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0000f010: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000f020: 6e6f 223e 2020 3430 383c 2f73 7061 6e3e no"> 408 │ │ │ │ +0000f030: 2020 2020 2020 3c73 7061 6e20 636c 6173 // c │ │ │ │ +0000f050: 6f75 6e74 2074 6865 206f 6363 7572 7265 ount the occurre │ │ │ │ +0000f060: 6e63 6520 6f66 2064 6f6d 6169 6e73 3c2f nce of domains
.
< │ │ │ │ +0000f0b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000f0c0: 6e6f 223e 2020 3430 393c 2f73 7061 6e3e no"> 409 │ │ │ │ +0000f0d0: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +0000f0f0: 666f 723c 2f73 7061 6e3e 2028 693d 303b for (i=0; │ │ │ │ +0000f100: 2069 266c 743b 6e75 6d4f 664f 776e 5674 i<numOfOwnVt │ │ │ │ +0000f110: 783b 2069 2b2b 2920 7b3c 2f64 6976 3e0a x; i++) {
. │ │ │ │ +0000f120: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0000f150: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 410 doma │ │ │ │ +0000f180: 696e 5b70 6172 745b 695d 5d2b 2b3b 3c2f in[part[i]]++;.
4 │ │ │ │ +0000f1e0: 3131 3c2f 7370 616e 3e20 2020 2020 207d 11 } │ │ │ │ +0000f1f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000f240: 2034 3132 3c2f 7370 616e 3e20 3c2f 6469 412 .
413 │ │ │ │ +0000f2a0: 3c2f 7370 616e 3e20 2020 2020 2073 7464 std │ │ │ │ +0000f2b0: 3a3a 7665 6374 6f72 266c 743b 696e 7426 ::vector<int& │ │ │ │ +0000f2c0: 6774 3b20 646f 6d61 696e 4d61 7472 6978 gt; domainMatrix │ │ │ │ +0000f2d0: 286e 7065 7320 2a20 6e70 6172 7473 2c20 (npes * nparts, │ │ │ │ +0000f2e0: 2d31 293b 3c2f 6469 763e 0a3c 6469 7620 -1);
.
414 │ │ │ │ +0000f340: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000f390: 2034 3135 3c2f 7370 616e 3e20 2020 2020 415 │ │ │ │ +0000f3a0: 203c 7370 616e 2063 6c61 7373 3d22 636f // init b │ │ │ │ +0000f3c0: 7566 6665 7220 7769 7468 2074 6865 206f uffer with the o │ │ │ │ +0000f3d0: 776e 2064 6f6d 6169 6e3c 2f73 7061 6e3e wn domain │ │ │ │ +0000f3e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000f430: 2034 3136 3c2f 7370 616e 3e20 2020 2020 416 │ │ │ │ +0000f440: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int *buf = new int[nparts];
.
417< │ │ │ │ +0000f510: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> for │ │ │ │ +0000f540: 2028 693d 303b 2069 266c 743b 6e70 6172 (i=0; i<npar │ │ │ │ +0000f550: 7473 3b20 692b 2b29 207b 3c2f 6469 763e ts; i++) {
│ │ │ │ +0000f560: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0000f590: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 418 buf │ │ │ │ +0000f5c0: 5b69 5d20 3d20 646f 6d61 696e 5b69 5d3b [i] = domain[i]; │ │ │ │ +0000f5d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0000f620: 2034 3139 3c2f 7370 616e 3e20 2020 2020 419 │ │ │ │ +0000f630: 2020 2064 6f6d 6169 6e4d 6174 7269 785b domainMatrix[ │ │ │ │ +0000f640: 6d79 7065 2a6e 7061 7274 732b 695d 203d mype*nparts+i] = │ │ │ │ +0000f650: 2064 6f6d 6169 6e5b 695d 3b3c 2f64 6976 domain[i];
.
420< │ │ │ │ +0000f6b0: 2f73 7061 6e3e 2020 2020 2020 7d3c 2f64 /span> }.
42 │ │ │ │ +0000f710: 313c 2f73 7061 6e3e 2020 2020 2020 3c73 1 int pe=0;
.< │ │ │ │ +0000f750: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0000f760: 3e3c 6120 6964 3d22 6c30 3034 3232 2220 > 422 int sr │ │ │ │ +0000f7d0: 6320 3d20 286d 7970 652d 312b 6e70 6573 c = (mype-1+npes │ │ │ │ +0000f7e0: 2925 6e70 6573 3b3c 2f64 6976 3e0a 3c64 )%npes;
. │ │ │ │ +0000f800: 3c61 2069 643d 226c 3030 3432 3322 206e 423 int des │ │ │ │ +0000f870: 7420 3d20 286d 7970 652b 3129 256e 7065 t = (mype+1)%npe │ │ │ │ +0000f880: 733b 3c2f 6469 763e 0a3c 6469 7620 636c s;
.
424 │ │ │ │ +0000f8e0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // ring │ │ │ │ +0000f900: 2063 6f6d 6d75 6e69 6361 7469 6f6e 2c20 communication, │ │ │ │ +0000f910: 7765 206e 6565 6420 6e2d 3120 636f 6d6d we need n-1 comm │ │ │ │ +0000f920: 756e 6963 6174 696f 6e73 2066 6f72 206e unications for n │ │ │ │ +0000f930: 2070 726f 6365 7373 6f72 733c 2f73 7061 processors
.
425 │ │ │ │ +0000f9a0: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +0000f9c0: 3c2f 7370 616e 3e20 2869 3d30 3b20 6926 (i=0; i& │ │ │ │ +0000f9d0: 6c74 3b6e 7065 732d 313b 2069 2b2b 2920 lt;npes-1; i++) │ │ │ │ +0000f9e0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +0000fa30: 2020 3432 363c 2f73 7061 6e3e 2020 2020 426 │ │ │ │ +0000fa40: 2020 2020 4d50 495f 5365 6e64 7265 6376 MPI_Sendrecv │ │ │ │ +0000fa50: 5f72 6570 6c61 6365 2862 7566 2c20 6e70 _replace(buf, np │ │ │ │ +0000fa60: 6172 7473 2c20 4d50 495f 494e 542c 2064 arts, MPI_INT, d │ │ │ │ +0000fa70: 6573 742c 2030 2c20 7372 632c 2030 2c20 est, 0, src, 0, │ │ │ │ +0000fa80: 636f 6d6d 2c20 2661 6d70 3b73 7461 7475 comm, &statu │ │ │ │ +0000fa90: 7329 3b3c 2f64 6976 3e0a 3c64 6976 2063 s);
.
427 │ │ │ │ +0000faf0: 2020 2020 2020 3c73 7061 6e20 636c 6173 // p │ │ │ │ +0000fb10: 6520 6973 2074 6865 2070 726f 6365 7373 e is the process │ │ │ │ +0000fb20: 206f 6620 7468 6520 6163 7475 616c 2072 of the actual r │ │ │ │ +0000fb30: 6563 6569 7665 6420 6275 6666 6572 3c2f eceived buffer
.
< │ │ │ │ +0000fb80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000fb90: 6e6f 223e 2020 3432 383c 2f73 7061 6e3e no"> 428 │ │ │ │ +0000fba0: 2020 2020 2020 2020 7065 203d 2028 286d pe = ((m │ │ │ │ +0000fbb0: 7970 652d 312d 6929 2b6e 7065 7329 256e ype-1-i)+npes)%n │ │ │ │ +0000fbc0: 7065 733b 3c2f 6469 763e 0a3c 6469 7620 pes;
.
429 │ │ │ │ +0000fc20: 2020 2020 2020 203c 7370 616e 2063 6c61 for(j=0; │ │ │ │ +0000fc50: 206a 266c 743b 6e70 6172 7473 3b20 6a2b j<nparts; j+ │ │ │ │ +0000fc60: 2b29 207b 3c2f 6469 763e 0a3c 6469 7620 +) {
.
430 │ │ │ │ +0000fcc0: 2020 2020 2020 2020 203c 7370 616e 2063 / │ │ │ │ +0000fce0: 2f20 7361 7665 2074 6865 2076 616c 7565 / save the value │ │ │ │ +0000fcf0: 7320 746f 2074 6865 2064 6f6d 6169 6e20 s to the domain │ │ │ │ +0000fd00: 6d61 7472 6978 3c2f 7370 616e 3e3c 2f64 matrix.
43 │ │ │ │ +0000fd60: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ +0000fd70: 2020 646f 6d61 696e 4d61 7472 6978 5b70 domainMatrix[p │ │ │ │ +0000fd80: 652a 6e70 6172 7473 2b6a 5d20 3d20 6275 e*nparts+j] = bu │ │ │ │ +0000fd90: 665b 6a5d 3b3c 2f64 6976 3e0a 3c64 6976 f[j];
.
< │ │ │ │ +0000fdd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0000fde0: 6e6f 223e 2020 3433 323c 2f73 7061 6e3e no"> 432 │ │ │ │ +0000fdf0: 2020 2020 2020 2020 7d3c 2f64 6976 3e0a }
. │ │ │ │ +0000fe00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
434< │ │ │ │ +0000feb0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> delete[ │ │ │ │ +0000fee0: 5d20 6275 663b 3c2f 6469 763e 0a3c 6469 ] buf;
.< │ │ │ │ +0000ff00: 6120 6964 3d22 6c30 3034 3335 2220 6e61 a id="l00435" na │ │ │ │ +0000ff10: 6d65 3d22 6c30 3034 3335 223e 3c2f 613e me="l00435"> │ │ │ │ +0000ff20: 3c73 7061 6e20 636c 6173 733d 226c 696e 435
.
436 │ │ │ │ +0000ffa0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // Star │ │ │ │ +0000ffc0: 7420 7468 6520 646f 6d61 696e 2063 616c t the domain cal │ │ │ │ +0000ffd0: 6375 6c61 7469 6f6e 2e3c 2f73 7061 6e3e culation. │ │ │ │ +0000ffe0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00010030: 2034 3337 3c2f 7370 616e 3e20 2020 2020 437 │ │ │ │ +00010040: 203c 7370 616e 2063 6c61 7373 3d22 636f // The pr │ │ │ │ +00010060: 6f63 6573 7320 7768 6963 6820 636f 6e74 ocess which cont │ │ │ │ +00010070: 6169 6e73 2074 6865 206d 6178 696d 756d ains the maximum │ │ │ │ +00010080: 206e 756d 6265 7220 6f66 2076 6572 7469 number of verti │ │ │ │ +00010090: 6365 7320 6f66 2061 3c2f 7370 616e 3e3c ces of a< │ │ │ │ +000100a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000100f0: 3433 383c 2f73 7061 6e3e 2020 2020 2020 438 │ │ │ │ +00010100: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // particu │ │ │ │ +00010120: 6c61 7220 646f 6d61 696e 2069 7320 7365 lar domain is se │ │ │ │ +00010130: 6c65 6374 6564 2074 6f20 6368 6f6f 7365 lected to choose │ │ │ │ +00010140: 2069 7426 2333 393b 7320 6661 766f 7261 it's favora │ │ │ │ +00010150: 7465 2064 6f6d 6169 6e3c 2f73 7061 6e3e te domain │ │ │ │ +00010160: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000101b0: 2034 3339 3c2f 7370 616e 3e20 2020 2020 439 │ │ │ │ +000101c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int maxOccuran │ │ │ │ +000101f0: 6365 203d 2030 3b3c 2f64 6976 3e0a 3c64 ce = 0;
. │ │ │ │ +00010210: 3c61 2069 643d 226c 3030 3434 3022 206e 440 pe = -1; │ │ │ │ +00010260: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000102b0: 2034 3431 3c2f 7370 616e 3e20 2020 2020 441 │ │ │ │ +000102c0: 2073 7464 3a3a 7365 7426 6c74 3b73 7464 std::set<std │ │ │ │ +000102d0: 3a3a 7369 7a65 5f74 2667 743b 2075 6e61 ::size_t> una │ │ │ │ +000102e0: 7373 6967 6e65 643b 3c2f 6469 763e 0a3c ssigned;
.< │ │ │ │ +000102f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00010300: 3e3c 6120 6964 3d22 6c30 3034 3432 2220 > 442
.
443 │ │ │ │ +000103a0: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +000103c0: 6f72 3c2f 7370 616e 3e28 693d 303b 2069 or(i=0; i │ │ │ │ +000103d0: 266c 743b 6e70 6172 7473 3b20 692b 2b29 <nparts; i++) │ │ │ │ +000103e0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
444 │ │ │ │ +00010440: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +00010460: 6f72 3c2f 7370 616e 3e28 6a3d 303b 206a or(j=0; j │ │ │ │ +00010470: 266c 743b 6e70 6573 3b20 6a2b 2b29 207b <npes; j++) { │ │ │ │ +00010480: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000104d0: 2034 3435 3c2f 7370 616e 3e20 2020 2020 445 │ │ │ │ +000104e0: 2020 2020 203c 7370 616e 2063 6c61 7373 // pr │ │ │ │ +00010500: 6f63 6573 7320 6861 7320 6e6f 2064 6f6d ocess has no dom │ │ │ │ +00010510: 6169 6e20 6173 7369 676e 6564 3c2f 7370 ain assigned
.
446 │ │ │ │ +00010580: 2020 2020 2020 2020 3c73 7061 6e20 636c if (ass │ │ │ │ +000105b0: 6967 6e65 645b 6a5d 3d3d 3029 207b 3c2f igned[j]==0) {.
4 │ │ │ │ +00010610: 3437 3c2f 7370 616e 3e20 2020 2020 2020 47 │ │ │ │ +00010620: 2020 2020 203c 7370 616e 2063 6c61 7373 i │ │ │ │ +00010640: 663c 2f73 7061 6e3e 2028 6d61 784f 6363 f (maxOcc │ │ │ │ +00010650: 7572 616e 6365 2026 6c74 3b20 646f 6d61 urance < doma │ │ │ │ +00010660: 696e 4d61 7472 6978 5b6a 2a6e 7061 7274 inMatrix[j*npart │ │ │ │ +00010670: 732b 695d 2920 7b3c 2f64 6976 3e0a 3c64 s+i]) {
. │ │ │ │ +00010690: 3c61 2069 643d 226c 3030 3434 3822 206e 448 │ │ │ │ +000106e0: 6d61 784f 6363 7572 616e 6365 203d 2064 maxOccurance = d │ │ │ │ +000106f0: 6f6d 6169 6e4d 6174 7269 785b 6a2a 6e70 omainMatrix[j*np │ │ │ │ +00010700: 6172 7473 2b69 5d3b 3c2f 6469 763e 0a3c arts+i];
.< │ │ │ │ +00010710: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00010720: 3e3c 6120 6964 3d22 6c30 3034 3439 2220 > 449 │ │ │ │ +00010770: 2070 6520 3d20 6a3b 3c2f 6469 763e 0a3c pe = j;
.< │ │ │ │ +00010780: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00010790: 3e3c 6120 6964 3d22 6c30 3034 3530 2220 > 450 } │ │ │ │ +000107e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00010830: 2034 3531 3c2f 7370 616e 3e20 2020 2020 451 │ │ │ │ +00010840: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +00010860: 6120 6964 3d22 6c30 3034 3532 2220 6e61 a id="l00452" na │ │ │ │ +00010870: 6d65 3d22 6c30 3034 3532 223e 3c2f 613e me="l00452"> │ │ │ │ +00010880: 3c73 7061 6e20 636c 6173 733d 226c 696e 452
.
453 │ │ │ │ +00010900: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +00010920: 6120 6964 3d22 6c30 3034 3534 2220 6e61 a id="l00454" na │ │ │ │ +00010930: 6d65 3d22 6c30 3034 3534 223e 3c2f 613e me="l00454"> │ │ │ │ +00010940: 3c73 7061 6e20 636c 6173 733d 226c 696e 454 if (pe │ │ │ │ +00010990: 213d 2d31 2920 7b3c 2f64 6976 3e0a 3c64 !=-1) {
. │ │ │ │ +000109b0: 3c61 2069 643d 226c 3030 3435 3522 206e 455 // process got │ │ │ │ +00010a20: 2061 2064 6f6d 6169 6e2c 202e 2e2e 3c2f a domain, ...
.
< │ │ │ │ +00010a70: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00010a80: 6e6f 223e 2020 3435 363c 2f73 7061 6e3e no"> 456 │ │ │ │ +00010a90: 2020 2020 2020 2020 2020 646f 6d61 696e domain │ │ │ │ +00010aa0: 4d61 7070 696e 675b 695d 203d 2070 653b Mapping[i] = pe; │ │ │ │ +00010ab0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00010b00: 2034 3537 3c2f 7370 616e 3e20 2020 2020 457 │ │ │ │ +00010b10: 2020 2020 203c 7370 616e 2063 6c61 7373 // .. │ │ │ │ +00010b30: 2e6d 6172 6b20 6173 2061 7373 6967 6e65 .mark as assigne │ │ │ │ +00010b40: 643c 2f73 7061 6e3e 3c2f 6469 763e 0a3c d
.< │ │ │ │ +00010b50: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00010b60: 3e3c 6120 6964 3d22 6c30 3034 3538 2220 > 458 ass │ │ │ │ +00010bb0: 6967 6e65 645b 7065 5d20 3d20 313b 3c2f igned[pe] = 1;.
4 │ │ │ │ +00010c10: 3539 3c2f 7370 616e 3e20 2020 2020 2020 59 │ │ │ │ +00010c20: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +00010c40: 2f73 7061 6e3e 2028 7065 3d3d 6d79 7065 /span> (pe==mype │ │ │ │ +00010c50: 2920 7b3c 2f64 6976 3e0a 3c64 6976 2063 ) {
.
460 │ │ │ │ +00010cb0: 2020 2020 2020 2020 2020 2a6d 7944 6f6d *myDom │ │ │ │ +00010cc0: 6169 6e20 3d20 693b 3c2f 6469 763e 0a3c ain = i;
.< │ │ │ │ +00010cd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00010ce0: 3e3c 6120 6964 3d22 6c30 3034 3631 2220 > 461 }.
4 │ │ │ │ +00010d80: 3632 3c2f 7370 616e 3e20 2020 2020 2020 62 │ │ │ │ +00010d90: 2020 2070 6520 3d20 2d31 3b3c 2f64 6976 pe = -1;
.
463< │ │ │ │ +00010df0: 2f73 7061 6e3e 2020 2020 2020 2020 7d3c /span> }< │ │ │ │ +00010e00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00010e50: 3436 343c 2f73 7061 6e3e 2020 2020 2020 464 │ │ │ │ +00010e60: 2020 3c73 7061 6e20 636c 6173 733d 226b else │ │ │ │ +00010e80: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00010ea0: 3c61 2069 643d 226c 3030 3436 3522 206e 465 {
.
466< │ │ │ │ +00010f40: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00010f50: 756e 6173 7369 676e 6564 2e69 6e73 6572 unassigned.inser │ │ │ │ +00010f60: 7428 6929 3b3c 2f64 6976 3e0a 3c64 6976 t(i);
.
< │ │ │ │ +00010fa0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00010fb0: 6e6f 223e 2020 3436 373c 2f73 7061 6e3e no"> 467 │ │ │ │ +00010fc0: 2020 2020 2020 2020 7d3c 2f64 6976 3e0a }
. │ │ │ │ +00010fd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00011000: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 468 maxO │ │ │ │ +00011030: 6363 7572 616e 6365 203d 2030 3b3c 2f64 ccurance = 0;.
46 │ │ │ │ +00011090: 393c 2f73 7061 6e3e 2020 2020 2020 7d3c 9 }< │ │ │ │ +000110a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000110f0: 3437 303c 2f73 7061 6e3e 203c 2f64 6976 470
.
471< │ │ │ │ +00011150: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> typename std::vector< │ │ │ │ +00011190: 3b69 6e74 2667 743b 3a3a 6974 6572 6174 ;int>::iterat │ │ │ │ +000111a0: 6f72 206e 6578 745f 6672 6565 203d 2061 or next_free = a │ │ │ │ +000111b0: 7373 6967 6e65 642e 6265 6769 6e28 293b ssigned.begin(); │ │ │ │ +000111c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00011210: 2034 3732 3c2f 7370 616e 3e20 3c2f 6469 472 .
473 │ │ │ │ +00011270: 3c2f 7370 616e 3e20 2020 2020 203c 7370 for(auto udomain = un │ │ │ │ +000112d0: 6173 7369 676e 6564 2e62 6567 696e 2829 assigned.begin() │ │ │ │ +000112e0: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
.
│ │ │ │ +00011330: 2020 3437 343c 2f73 7061 6e3e 2020 2020 474 │ │ │ │ +00011340: 2020 2020 2020 2020 656e 6420 3d20 756e end = un │ │ │ │ +00011350: 6173 7369 676e 6564 2e65 6e64 2829 3b20 assigned.end(); │ │ │ │ +00011360: 7564 6f6d 6169 6e20 213d 2065 6e64 3b20 udomain != end; │ │ │ │ +00011370: 2b2b 7564 6f6d 6169 6e29 3c2f 6469 763e ++udomain)
│ │ │ │ +00011380: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000113b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 475 {.
476 │ │ │ │ +00011430: 3c2f 7370 616e 3e20 2020 2020 2020 206e n │ │ │ │ +00011440: 6578 745f 6672 6565 203d 2073 7464 3a3a ext_free = std:: │ │ │ │ +00011450: 6669 6e64 5f69 6628 6e65 7874 5f66 7265 find_if(next_fre │ │ │ │ +00011460: 652c 2061 7373 6967 6e65 642e 656e 6428 e, assigned.end( │ │ │ │ +00011470: 292c 2073 7464 3a3a 6269 6e64 2873 7464 ), std::bind(std │ │ │ │ +00011480: 3a3a 6c65 7373 266c 743b 696e 7426 6774 ::less<int> │ │ │ │ +00011490: 3b28 292c 2073 7464 3a3a 706c 6163 6568 ;(), std::placeh │ │ │ │ +000114a0: 6f6c 6465 7273 3a3a 5f31 2c20 3129 293b olders::_1, 1)); │ │ │ │ +000114b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00011500: 2034 3737 3c2f 7370 616e 3e20 2020 2020 477 │ │ │ │ +00011510: 2020 2061 7373 6572 7428 6e65 7874 5f66 assert(next_f │ │ │ │ +00011520: 7265 6520 213d 2020 6173 7369 676e 6564 ree != assigned │ │ │ │ +00011530: 2e65 6e64 2829 293b 3c2f 6469 763e 0a3c .end());
.< │ │ │ │ +00011540: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00011550: 3e3c 6120 6964 3d22 6c30 3034 3738 2220 > 478 domai │ │ │ │ +000115a0: 6e4d 6170 7069 6e67 5b2a 7564 6f6d 6169 nMapping[*udomai │ │ │ │ +000115b0: 6e5d 203d 206e 6578 745f 6672 6565 2d61 n] = next_free-a │ │ │ │ +000115c0: 7373 6967 6e65 642e 6265 6769 6e28 293b ssigned.begin(); │ │ │ │ +000115d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00011620: 2034 3739 3c2f 7370 616e 3e20 2020 2020 479 │ │ │ │ +00011630: 2020 202a 6e65 7874 5f66 7265 6520 3d20 *next_free = │ │ │ │ +00011640: 313b 3c2f 6469 763e 0a3c 6469 7620 636c 1;
.
480 │ │ │ │ +000116a0: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
481 │ │ │ │ +00011700: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
482 │ │ │ │ +00011760: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000117b0: 2034 3833 3c2f 7370 616e 3e20 2020 203c 483 < │ │ │ │ +000117c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000117d0: 6f72 6422 3e73 7472 7563 7420 3c2f 7370 ord">struct SortFirst.
484 │ │ │ │ +00011840: 3c2f 7370 616e 3e20 2020 207b 3c2f 6469 {.
485 │ │ │ │ +000118a0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 template<clas │ │ │ │ +000118f0: 733c 2f73 7061 6e3e 2054 2667 743b 3c2f s T>.
4 │ │ │ │ +00011950: 3836 3c2f 7370 616e 3e20 2020 2020 203c 86 < │ │ │ │ +00011960: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00011970: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype">bool operator()( │ │ │ │ +00011990: 3c73 7061 6e20 636c 6173 733d 226b 6579 const T& t1, const │ │ │ │ +000119e0: 2054 2661 6d70 3b20 7432 293c 7370 616e T& t2) const.
4 │ │ │ │ +00011a60: 3837 3c2f 7370 616e 3e3c 7370 616e 2063 87 │ │ │ │ +00011a80: 2020 2020 203c 2f73 7061 6e3e 7b3c 2f64 {.
48 │ │ │ │ +00011ae0: 383c 2f73 7061 6e3e 2020 2020 2020 2020 8 │ │ │ │ +00011af0: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ │ +00011b10: 3c2f 7370 616e 3e20 7431 266c 743b 7432 t1<t2 │ │ │ │ +00011b20: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00011b70: 2020 3438 393c 2f73 7061 6e3e 2020 2020 489 │ │ │ │ +00011b80: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
.
490 │ │ │ │ +00011be0: 2020 7d3b 3c2f 6469 763e 0a3c 6469 7620 };
.
491 │ │ │ │ +00011c40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00011c90: 2034 3932 3c2f 7370 616e 3e20 3c2f 6469 492 .
503 │ │ │ │ +00011cf0: 3c2f 7370 616e 3e20 2020 203c 7370 616e template │ │ │ │ +00011d20: 266c 743b 3c73 7061 6e20 636c 6173 733d <class< │ │ │ │ +00011d40: 2f73 7061 6e3e 2047 4926 6774 3b3c 2f64 /span> GI>.
50 │ │ │ │ +00011da0: 343c 2f73 7061 6e3e 2020 2020 3c73 7061 4 void mergeVec(std:: │ │ │ │ +00011de0: 7665 6374 6f72 266c 743b 7374 643a 3a70 vector<std::p │ │ │ │ +00011df0: 6169 7226 6c74 3b47 492c 2069 6e74 2667 air<GI, int&g │ │ │ │ +00011e00: 743b 2026 6774 3b26 616d 703b 206f 776e t; >& own │ │ │ │ +00011e10: 6572 5665 632c 2073 7464 3a3a 7365 7426 erVec, std::set& │ │ │ │ +00011e20: 6c74 3b47 4926 6774 3b26 616d 703b 206f lt;GI>& o │ │ │ │ +00011e30: 7665 726c 6170 5365 7429 207b 3c2f 6469 verlapSet) {.
505 │ │ │ │ +00011e90: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00011ea0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00011eb0: 3e3c 6120 6964 3d22 6c30 3035 3036 2220 > 506#i │ │ │ │ +00011f10: 6664 6566 2044 4542 5547 5f52 4550 4152 fdef DEBUG_REPAR │ │ │ │ +00011f20: 543c 2f73 7061 6e3e 3c2f 6469 763e 0a3c T
.< │ │ │ │ +00011f30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00011f40: 3e3c 6120 6964 3d22 6c30 3035 3037 2220 > 507 / │ │ │ │ +00011fa0: 2f20 5361 6665 7479 2063 6865 636b 2066 / Safety check f │ │ │ │ +00011fb0: 6f72 2064 7570 6c69 6361 7465 732e 3c2f or duplicates.
.
< │ │ │ │ +00012000: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00012010: 6e6f 223e 2020 3530 383c 2f73 7061 6e3e no"> 508 │ │ │ │ +00012020: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +00012040: 6966 3c2f 7370 616e 3e28 6f77 6e65 7256 if(ownerV │ │ │ │ +00012050: 6563 2e73 697a 6528 2926 6774 3b30 293c ec.size()>0)< │ │ │ │ +00012060: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000120b0: 3530 393c 2f73 7061 6e3e 2020 2020 2020 509 │ │ │ │ +000120c0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +00012110: 2020 3531 303c 2f73 7061 6e3e 2020 2020 510 │ │ │ │ +00012120: 2020 2020 3c73 7061 6e20 636c 6173 733d auto old=ownerV │ │ │ │ +00012150: 6563 2e62 6567 696e 2829 3b3c 2f64 6976 ec.begin();
.
511< │ │ │ │ +000121b0: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> for(auto i=old+1, en │ │ │ │ +00012210: 643d 6f77 6e65 7256 6563 2e65 6e64 2829 d=ownerVec.end() │ │ │ │ +00012220: 3b20 6920 213d 2065 6e64 3b20 6f6c 643d ; i != end; old= │ │ │ │ +00012230: 692b 2b29 3c2f 6469 763e 0a3c 6469 7620 i++)
.
512 │ │ │ │ +00012290: 2020 2020 2020 207b 3c2f 6469 763e 0a3c {
.< │ │ │ │ +000122a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000122b0: 3e3c 6120 6964 3d22 6c30 3035 3133 2220 > 513 if │ │ │ │ +00012320: 2869 2d26 6774 3b66 6972 7374 3d3d 6f6c (i->first==ol │ │ │ │ +00012330: 642d 2667 743b 6669 7273 7429 3c2f 6469 d->first).
514 │ │ │ │ +00012390: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000123a0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
515 │ │ │ │ +00012400: 2020 2020 2020 2020 2073 7464 3a3a 6365 std::ce │ │ │ │ +00012410: 7272 266c 743b 266c 743b 3c73 7061 6e20 rr<<"Valu │ │ │ │ +00012440: 6520 6174 2069 6e64 6573 2671 756f 743b e at indes" │ │ │ │ +00012450: 3c2f 7370 616e 3e26 6c74 3b26 6c74 3b6f <<o │ │ │ │ +00012460: 6c64 2d6f 776e 6572 5665 632e 6265 6769 ld-ownerVec.begi │ │ │ │ +00012470: 6e28 2926 6c74 3b26 6c74 3b3c 7370 616e n()<<" is │ │ │ │ +000124a0: 2074 6865 2073 616d 6520 6173 2061 7420 the same as at │ │ │ │ +000124b0: 696e 6465 7820 2671 756f 743b 3c2f 7370 index "
.
516 │ │ │ │ +00012520: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00012530: 2020 2026 6c74 3b26 6c74 3b69 2d6f 776e <<i-own │ │ │ │ +00012540: 6572 5665 632e 6265 6769 6e28 2926 6c74 erVec.begin()< │ │ │ │ +00012550: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<" ["< │ │ │ │ +00012580: 2f73 7061 6e3e 266c 743b 266c 743b 6f6c /span><<ol │ │ │ │ +00012590: 642d 2667 743b 6669 7273 7426 6c74 3b26 d->first<& │ │ │ │ +000125a0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +000125c0: 7175 6f74 3b2c 2671 756f 743b 3c2f 7370 quot;,"<<old-& │ │ │ │ +000125e0: 6774 3b73 6563 6f6e 6426 6c74 3b26 6c74 gt;second<< │ │ │ │ +000125f0: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ +00012610: 6f74 3b5d 3d3d 5b26 7175 6f74 3b3c 2f73 ot;]==["
.
517 │ │ │ │ +00012680: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00012690: 2020 2020 266c 743b 266c 743b 692d 2667 <<i-&g │ │ │ │ +000126a0: 743b 6669 7273 7426 6c74 3b26 6c74 3b3c t;first<<< │ │ │ │ +000126b0: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +000126c0: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +000126d0: 3b2c 2671 756f 743b 3c2f 7370 616e 3e26 ;,"& │ │ │ │ +000126e0: 6c74 3b26 6c74 3b69 2d26 6774 3b73 6563 lt;<i->sec │ │ │ │ +000126f0: 6f6e 6426 6c74 3b26 6c74 3b3c 7370 616e ond<<"]&q │ │ │ │ +00012720: 756f 743b 3c2f 7370 616e 3e26 6c74 3b26 uot;<& │ │ │ │ +00012730: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
51 │ │ │ │ +00012790: 383c 2f73 7061 6e3e 2020 2020 2020 2020 8 │ │ │ │ +000127a0: 2020 2020 3c73 7061 6e20 636c 6173 733d th │ │ │ │ +000127c0: 726f 773c 2f73 7061 6e3e 203c 7370 616e row "Huc │ │ │ │ +000127f0: 6821 2671 756f 743b 3c2f 7370 616e 3e3b h!"; │ │ │ │ +00012800: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00012850: 2035 3139 3c2f 7370 616e 3e20 2020 2020 519 │ │ │ │ +00012860: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +00012880: 6120 6964 3d22 6c30 3035 3230 2220 6e61 a id="l00520" na │ │ │ │ +00012890: 6d65 3d22 6c30 3035 3230 223e 3c2f 613e me="l00520"> │ │ │ │ +000128a0: 3c73 7061 6e20 636c 6173 733d 226c 696e 520 }
│ │ │ │ +000128d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00012900: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 521 }.
522 │ │ │ │ +00012980: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00012990: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000129a0: 3e3c 6120 6964 3d22 6c30 3035 3233 2220 > 523#e │ │ │ │ +00012a00: 6e64 6966 3c2f 7370 616e 3e3c 2f64 6976 ndif
.
524< │ │ │ │ +00012a60: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00012a80: 3c61 2069 643d 226c 3030 3532 3522 206e 525 au │ │ │ │ +00012ae0: 746f 3c2f 7370 616e 3e20 763d 6f77 6e65 to v=owne │ │ │ │ +00012af0: 7256 6563 2e62 6567 696e 2829 2c20 7665 rVec.begin(), ve │ │ │ │ +00012b00: 6e64 3d6f 776e 6572 5665 632e 656e 6428 nd=ownerVec.end( │ │ │ │ +00012b10: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
526 │ │ │ │ +00012b70: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +00012b90: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (au │ │ │ │ +00012bb0: 746f 3c2f 7370 616e 3e20 733d 6f76 6572 to s=over │ │ │ │ +00012bc0: 6c61 7053 6574 2e62 6567 696e 2829 2c20 lapSet.begin(), │ │ │ │ +00012bd0: 7365 6e64 3d6f 7665 726c 6170 5365 742e send=overlapSet. │ │ │ │ +00012be0: 656e 6428 293b 2073 213d 7365 6e64 3b29 end(); s!=send;) │ │ │ │ +00012bf0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00012c40: 2035 3237 3c2f 7370 616e 3e20 2020 2020 527 │ │ │ │ +00012c50: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
528 │ │ │ │ +00012cb0: 2020 2020 203c 7370 616e 2063 6c61 7373 w │ │ │ │ +00012cd0: 6869 6c65 3c2f 7370 616e 3e28 7621 3d76 hile(v!=v │ │ │ │ +00012ce0: 656e 6420 2661 6d70 3b26 616d 703b 2076 end && v │ │ │ │ +00012cf0: 2d26 6774 3b66 6972 7374 266c 743b 2a73 ->first<*s │ │ │ │ +00012d00: 2920 2b2b 763b 3c2f 6469 763e 0a3c 6469 ) ++v;
.< │ │ │ │ +00012d20: 6120 6964 3d22 6c30 3035 3239 2220 6e61 a id="l00529" na │ │ │ │ +00012d30: 6d65 3d22 6c30 3035 3239 223e 3c2f 613e me="l00529"> │ │ │ │ +00012d40: 3c73 7061 6e20 636c 6173 733d 226c 696e 529 if(v!= │ │ │ │ +00012d90: 7665 6e64 2026 616d 703b 2661 6d70 3b20 vend && │ │ │ │ +00012da0: 762d 2667 743b 6669 7273 743d 3d2a 7329 v->first==*s) │ │ │ │ +00012db0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
530 │ │ │ │ +00012e10: 2020 2020 2020 203c 7370 616e 2063 6c61 // │ │ │ │ +00012e30: 4d6f 7665 2074 6f20 7468 6520 6e65 7874 Move to the next │ │ │ │ +00012e40: 2065 6c65 6d65 6e74 2062 6566 6f72 6520 element before │ │ │ │ +00012e50: 6572 6173 696e 673c 2f73 7061 6e3e 3c2f erasing.
5 │ │ │ │ +00012eb0: 3331 3c2f 7370 616e 3e20 2020 2020 2020 31 │ │ │ │ +00012ec0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // thus │ │ │ │ +00012ee0: 2073 2073 7461 7973 2076 616c 6964 213c s stays valid!< │ │ │ │ +00012ef0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00012f10: 6120 6964 3d22 6c30 3035 3332 2220 6e61 a id="l00532" na │ │ │ │ +00012f20: 6d65 3d22 6c30 3035 3332 223e 3c2f 613e me="l00532"> │ │ │ │ +00012f30: 3c73 7061 6e20 636c 6173 733d 226c 696e 532 auto tmp │ │ │ │ +00012f80: 3d73 3b3c 2f64 6976 3e0a 3c64 6976 2063 =s;
.
533 │ │ │ │ +00012fe0: 2020 2020 2020 2020 2b2b 733b 3c2f 6469 ++s;.
534 │ │ │ │ +00013040: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00013050: 206f 7665 726c 6170 5365 742e 6572 6173 overlapSet.eras │ │ │ │ +00013060: 6528 746d 7029 3b3c 2f64 6976 3e0a 3c64 e(tmp);
. │ │ │ │ +00013080: 3c61 2069 643d 226c 3030 3533 3522 206e 535 }else │ │ │ │ +000130f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00013140: 2035 3336 3c2f 7370 616e 3e20 2020 2020 536 │ │ │ │ +00013150: 2020 2020 202b 2b73 3b3c 2f64 6976 3e0a ++s;
. │ │ │ │ +00013160: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
538< │ │ │ │ +00013210: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }
.
539< │ │ │ │ +00013270: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00013290: 3c61 2069 643d 226c 3030 3534 3022 206e 540
.
554 │ │ │ │ +00013330: 2020 3c73 7061 6e20 636c 6173 733d 226b template │ │ │ │ +00013350: 3c2f 7370 616e 3e26 6c74 3b3c 7370 616e <class Ow │ │ │ │ +00013380: 6e65 7253 6574 2c20 3c73 7061 6e20 636c nerSet, cl │ │ │ │ +000133a0: 6173 733c 2f73 7061 6e3e 2047 7261 7068 ass Graph │ │ │ │ +000133b0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class IS, c │ │ │ │ +000133f0: 6c61 7373 3c2f 7370 616e 3e20 4749 2667 lass GI&g │ │ │ │ +00013400: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
555 │ │ │ │ +00013460: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ │ +00013480: 2f73 7061 6e3e 2067 6574 4e65 6967 6862 /span> getNeighb │ │ │ │ +00013490: 6f72 283c 7370 616e 2063 6c61 7373 3d22 or(const Graph& │ │ │ │ +000134c0: 2067 2c20 7374 643a 3a76 6563 746f 7226 g, std::vector& │ │ │ │ +000134d0: 6c74 3b69 6e74 2667 743b 2661 6d70 3b20 lt;int>& │ │ │ │ +000134e0: 7061 7274 2c3c 2f64 6976 3e0a 3c64 6976 part,
.
< │ │ │ │ +00013520: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00013530: 6e6f 223e 2020 3535 363c 2f73 7061 6e3e no"> 556 │ │ │ │ +00013540: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00013550: 2020 2020 203c 7370 616e 2063 6c61 7373 typen │ │ │ │ +00013570: 616d 653c 2f73 7061 6e3e 2047 7261 7068 ame Graph │ │ │ │ +00013580: 3a3a 5665 7274 6578 4465 7363 7269 7074 ::VertexDescript │ │ │ │ +00013590: 6f72 2076 7478 2c20 3c73 7061 6e20 636c or vtx, co │ │ │ │ +000135b0: 6e73 743c 2f73 7061 6e3e 2049 5326 616d nst IS&am │ │ │ │ +000135c0: 703b 2069 6e64 6578 5365 742c 3c2f 6469 p; indexSet,.
557 │ │ │ │ +00013620: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00013630: 2020 2020 2020 2020 2020 2020 3c73 7061 int │ │ │ │ +00013660: 2074 6f50 652c 2073 7464 3a3a 7365 7426 toPe, std::set& │ │ │ │ +00013670: 6c74 3b47 4926 6774 3b26 616d 703b 206e lt;GI>& n │ │ │ │ +00013680: 6569 6768 626f 722c 2073 7464 3a3a 7365 eighbor, std::se │ │ │ │ +00013690: 7426 6c74 3b69 6e74 2667 743b 2661 6d70 t<int>& │ │ │ │ +000136a0: 3b20 6e65 6967 6862 6f72 5072 6f63 7329 ; neighborProcs) │ │ │ │ +000136b0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
558 │ │ │ │ +00013710: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +00013730: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (au │ │ │ │ +00013750: 746f 3c2f 7370 616e 3e20 6564 6765 3d67 to edge=g │ │ │ │ +00013760: 2e62 6567 696e 4564 6765 7328 7674 7829 .beginEdges(vtx) │ │ │ │ +00013770: 2c20 656e 643d 672e 656e 6445 6467 6573 , end=g.endEdges │ │ │ │ +00013780: 2876 7478 293b 2065 6467 6521 3d65 6e64 (vtx); edge!=end │ │ │ │ +00013790: 3b20 2b2b 6564 6765 293c 2f64 6976 3e0a ; ++edge)
. │ │ │ │ +000137a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
560< │ │ │ │ +00013850: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> const │ │ │ │ +00013880: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typename< │ │ │ │ +000138a0: 2f73 7061 6e3e 2049 533a 3a49 6e64 6578 /span> IS::Index │ │ │ │ +000138b0: 5061 6972 2a20 7069 6e64 6578 203d 2069 Pair* pindex = i │ │ │ │ +000138c0: 6e64 6578 5365 742e 7061 6972 2865 6467 ndexSet.pair(edg │ │ │ │ +000138d0: 652e 7461 7267 6574 2829 293b 3c2f 6469 e.target());.
561 │ │ │ │ +00013930: 3c2f 7370 616e 3e20 2020 2020 2020 2061 a │ │ │ │ +00013940: 7373 6572 7428 7069 6e64 6578 293b 3c2f ssert(pindex);.
5 │ │ │ │ +000139a0: 3632 3c2f 7370 616e 3e20 2020 2020 2020 62 │ │ │ │ +000139b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if(part[pindex │ │ │ │ +000139e0: 2d26 6774 3b6c 6f63 616c 2829 5d21 3d74 ->local()]!=t │ │ │ │ +000139f0: 6f50 6520 7c7c 2021 4f77 6e65 7253 6574 oPe || !OwnerSet │ │ │ │ +00013a00: 3a3a 636f 6e74 6169 6e73 2870 696e 6465 ::contains(pinde │ │ │ │ +00013a10: 782d 2667 743b 6c6f 6361 6c28 292e 6174 x->local().at │ │ │ │ +00013a20: 7472 6962 7574 6528 2929 293c 2f64 6976 tribute()))
.
563< │ │ │ │ +00013a80: 2f73 7061 6e3e 2020 2020 2020 2020 7b3c /span> {< │ │ │ │ +00013a90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00013ae0: 3536 343c 2f73 7061 6e3e 2020 2020 2020 564 │ │ │ │ +00013af0: 2020 2020 3c73 7061 6e20 636c 6173 733d // is │ │ │ │ +00013b10: 7365 6e74 2074 6f20 616e 6f74 6865 7220 sent to another │ │ │ │ +00013b20: 7072 6f63 6573 7320 616e 6420 7468 6572 process and ther │ │ │ │ +00013b30: 6566 6f72 6520 6265 636f 6d65 7320 6f76 efore becomes ov │ │ │ │ +00013b40: 6572 6c61 703c 2f73 7061 6e3e 3c2f 6469 erlap.
565 │ │ │ │ +00013ba0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00013bb0: 206e 6569 6768 626f 722e 696e 7365 7274 neighbor.insert │ │ │ │ +00013bc0: 2870 696e 6465 782d 2667 743b 676c 6f62 (pindex->glob │ │ │ │ +00013bd0: 616c 2829 293b 3c2f 6469 763e 0a3c 6469 al());
.< │ │ │ │ +00013bf0: 6120 6964 3d22 6c30 3035 3636 2220 6e61 a id="l00566" na │ │ │ │ +00013c00: 6d65 3d22 6c30 3035 3636 223e 3c2f 613e me="l00566"> │ │ │ │ +00013c10: 3c73 7061 6e20 636c 6173 733d 226c 696e 566 neigh │ │ │ │ +00013c40: 626f 7250 726f 6373 2e69 6e73 6572 7428 borProcs.insert( │ │ │ │ +00013c50: 7061 7274 5b70 696e 6465 782d 2667 743b part[pindex-> │ │ │ │ +00013c60: 6c6f 6361 6c28 295d 293b 3c2f 6469 763e local()]);
│ │ │ │ +00013c70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00013ca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 567 }.
5 │ │ │ │ +00013d20: 3638 3c2f 7370 616e 3e20 2020 2020 207d 68 } │ │ │ │ +00013d30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00013d80: 2035 3639 3c2f 7370 616e 3e20 2020 207d 569 } │ │ │ │ +00013d90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00013de0: 2035 3730 3c2f 7370 616e 3e20 3c2f 6469 570 .
571 │ │ │ │ +00013e40: 3c2f 7370 616e 3e20 2020 203c 7370 616e template │ │ │ │ +00013e70: 266c 743b 3c73 7061 6e20 636c 6173 733d <class< │ │ │ │ +00013e90: 2f73 7061 6e3e 2054 2c20 3c73 7061 6e20 /span> T, │ │ │ │ +00013eb0: 636c 6173 733c 2f73 7061 6e3e 2049 2667 class I&g │ │ │ │ +00013ec0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
572 │ │ │ │ +00013f20: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ │ +00013f40: 2f73 7061 6e3e 206d 795f 7075 7368 5f62 /span> my_push_b │ │ │ │ +00013f50: 6163 6b28 7374 643a 3a76 6563 746f 7226 ack(std::vector& │ │ │ │ +00013f60: 6c74 3b54 2667 743b 2661 6d70 3b20 6f77 lt;T>& ow │ │ │ │ +00013f70: 6e65 7256 6563 2c20 3c73 7061 6e20 636c nerVec, co │ │ │ │ +00013f90: 6e73 743c 2f73 7061 6e3e 2049 2661 6d70 nst I& │ │ │ │ +00013fa0: 3b20 696e 6465 782c 205b 5b6d 6179 6265 ; index, [[maybe │ │ │ │ +00013fb0: 5f75 6e75 7365 645d 5d20 3c73 7061 6e20 _unused]] int p │ │ │ │ +00013fe0: 726f 6329 3c2f 6469 763e 0a3c 6469 7620 roc)
.
573 │ │ │ │ +00014040: 2020 207b 3c2f 6469 763e 0a3c 6469 7620 {
.
574 │ │ │ │ +000140a0: 2020 2020 206f 776e 6572 5665 632e 7075 ownerVec.pu │ │ │ │ +000140b0: 7368 5f62 6163 6b28 696e 6465 7829 3b3c sh_back(index);< │ │ │ │ +000140c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00014110: 3537 353c 2f73 7061 6e3e 2020 2020 7d3c 575 }< │ │ │ │ +00014120: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00014170: 3537 363c 2f73 7061 6e3e 203c 2f64 6976 576
.
577< │ │ │ │ +000141d0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ +000141f0: 7465 6d70 6c61 7465 3c2f 7370 616e 3e26 template& │ │ │ │ +00014200: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class T, c │ │ │ │ +00014240: 6c61 7373 3c2f 7370 616e 3e20 4926 6774 lass I> │ │ │ │ +00014250: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +000142a0: 2020 3537 383c 2f73 7061 6e3e 2020 2020 578 │ │ │ │ +000142b0: 3c73 7061 6e20 636c 6173 733d 226b 6579 void my_push_ba │ │ │ │ +000142e0: 636b 2873 7464 3a3a 7665 6374 6f72 266c ck(std::vector&l │ │ │ │ +000142f0: 743b 7374 643a 3a70 6169 7226 6c74 3b54 t;std::pair<T │ │ │ │ +00014300: 2c69 6e74 2667 743b 2026 6774 3b26 616d ,int> >&am │ │ │ │ +00014310: 703b 206f 776e 6572 5665 632c 203c 7370 p; ownerVec, const │ │ │ │ +00014340: 4926 616d 703b 2069 6e64 6578 2c20 3c73 I& index, int proc)
.< │ │ │ │ +00014380: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00014390: 3e3c 6120 6964 3d22 6c30 3035 3739 2220 > 579 {
.< │ │ │ │ +000143e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000143f0: 3e3c 6120 6964 3d22 6c30 3035 3830 2220 > 580 ownerVe │ │ │ │ +00014440: 632e 7075 7368 5f62 6163 6b28 7374 643a c.push_back(std: │ │ │ │ +00014450: 3a6d 616b 655f 7061 6972 2869 6e64 6578 :make_pair(index │ │ │ │ +00014460: 2c70 726f 6329 293b 3c2f 6469 763e 0a3c ,proc));
.< │ │ │ │ +00014470: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00014480: 3e3c 6120 6964 3d22 6c30 3035 3831 2220 > 581 }
.< │ │ │ │ +000144d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000144e0: 3e3c 6120 6964 3d22 6c30 3035 3832 2220 > 582 tem │ │ │ │ +00014540: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate< │ │ │ │ +00014550: 3c73 7061 6e20 636c 6173 733d 226b 6579 class T>
.< │ │ │ │ +00014580: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00014590: 3e3c 6120 6964 3d22 6c30 3035 3833 2220 > 583 void res │ │ │ │ +00014600: 6572 7665 2873 7464 3a3a 7665 6374 6f72 erve(std::vector │ │ │ │ +00014610: 266c 743b 5426 6774 3b26 616d 703b 2c20 <T>&, │ │ │ │ +00014620: 5265 6469 7374 7269 6275 7465 496e 7465 RedistributeInte │ │ │ │ +00014630: 7266 6163 6526 616d 703b 2c20 3c73 7061 rface&, int │ │ │ │ +00014660: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +000146b0: 2020 3538 343c 2f73 7061 6e3e 2020 2020 584 │ │ │ │ +000146c0: 7b7d 3c2f 6469 763e 0a3c 6469 7620 636c {}
.
585 │ │ │ │ +00014720: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template< │ │ │ │ +00014740: 2f73 7061 6e3e 266c 743b 3c73 7061 6e20 /span>< │ │ │ │ +00014760: 636c 6173 733c 2f73 7061 6e3e 2054 2667 class T&g │ │ │ │ +00014770: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
586 │ │ │ │ +000147d0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ │ +000147f0: 2f73 7061 6e3e 2072 6573 6572 7665 2873 /span> reserve(s │ │ │ │ +00014800: 7464 3a3a 7665 6374 6f72 266c 743b 7374 td::vector<st │ │ │ │ +00014810: 643a 3a70 6169 7226 6c74 3b54 2c69 6e74 d::pair<T,int │ │ │ │ +00014820: 2667 743b 2026 6774 3b26 616d 703b 206f > >& o │ │ │ │ +00014830: 776e 6572 5665 632c 2052 6564 6973 7472 wnerVec, Redistr │ │ │ │ +00014840: 6962 7574 6549 6e74 6572 6661 6365 2661 ibuteInterface&a │ │ │ │ +00014850: 6d70 3b20 7265 6469 7374 2c20 3c73 7061 mp; redist, int │ │ │ │ +00014880: 2070 726f 6329 3c2f 6469 763e 0a3c 6469 proc)
.< │ │ │ │ +000148a0: 6120 6964 3d22 6c30 3035 3837 2220 6e61 a id="l00587" na │ │ │ │ +000148b0: 6d65 3d22 6c30 3035 3837 223e 3c2f 613e me="l00587"> │ │ │ │ +000148c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 587 {
.< │ │ │ │ +00014900: 6120 6964 3d22 6c30 3035 3838 2220 6e61 a id="l00588" na │ │ │ │ +00014910: 6d65 3d22 6c30 3035 3838 223e 3c2f 613e me="l00588"> │ │ │ │ +00014920: 3c73 7061 6e20 636c 6173 733d 226c 696e 588 redist.re │ │ │ │ +00014950: 7365 7276 6553 7061 6365 466f 7252 6563 serveSpaceForRec │ │ │ │ +00014960: 6569 7665 496e 7465 7266 6163 6528 7072 eiveInterface(pr │ │ │ │ +00014970: 6f63 2c20 6f77 6e65 7256 6563 2e73 697a oc, ownerVec.siz │ │ │ │ +00014980: 6528 2929 3b3c 2f64 6976 3e0a 3c64 6976 e());
.
< │ │ │ │ +000149c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000149d0: 6e6f 223e 2020 3538 393c 2f73 7061 6e3e no"> 589 │ │ │ │ +000149e0: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +00014a20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00014a30: 6e6f 223e 2020 3539 303c 2f73 7061 6e3e no"> 590 │ │ │ │ +00014a40: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00014a90: 2020 3539 313c 2f73 7061 6e3e 203c 2f64 591 .
60 │ │ │ │ +00014af0: 393c 2f73 7061 6e3e 2020 2020 3c73 7061 9 template<class │ │ │ │ +00014b40: 3c2f 7370 616e 3e20 4f77 6e65 7253 6574 OwnerSet │ │ │ │ +00014b50: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class G, cl │ │ │ │ +00014b90: 6173 733c 2f73 7061 6e3e 2049 532c 203c ass IS, < │ │ │ │ +00014ba0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00014bb0: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class T, class │ │ │ │ +00014be0: 3c2f 7370 616e 3e20 4749 2667 743b 3c2f GI>.
6 │ │ │ │ +00014c40: 3130 3c2f 7370 616e 3e20 2020 203c 7370 10 void getOwnerOverl │ │ │ │ +00014c80: 6170 5665 6328 3c73 7061 6e20 636c 6173 apVec(cons │ │ │ │ +00014ca0: 743c 2f73 7061 6e3e 2047 2661 6d70 3b20 t G& │ │ │ │ +00014cb0: 6772 6170 682c 2073 7464 3a3a 7665 6374 graph, std::vect │ │ │ │ +00014cc0: 6f72 266c 743b 696e 7426 6774 3b26 616d or<int>&am │ │ │ │ +00014cd0: 703b 2070 6172 742c 2049 5326 616d 703b p; part, IS& │ │ │ │ +00014ce0: 2069 6e64 6578 5365 742c 3c2f 6469 763e indexSet,
│ │ │ │ +00014cf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00014d20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 611 │ │ │ │ +00014d50: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00014d60: 205b 5b6d 6179 6265 5f75 6e75 7365 645d [[maybe_unused] │ │ │ │ +00014d70: 5d20 3c73 7061 6e20 636c 6173 733d 226b ] int< │ │ │ │ +00014d90: 2f73 7061 6e3e 206d 7950 652c 203c 7370 /span> myPe, int toPe, std::vec │ │ │ │ +00014dd0: 746f 7226 6c74 3b54 2667 743b 2661 6d70 tor<T>& │ │ │ │ +00014de0: 3b20 6f77 6e65 7256 6563 2c20 7374 643a ; ownerVec, std: │ │ │ │ +00014df0: 3a73 6574 266c 743b 4749 2667 743b 2661 :set<GI>&a │ │ │ │ +00014e00: 6d70 3b20 6f76 6572 6c61 7053 6574 2c3c mp; overlapSet,< │ │ │ │ +00014e10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00014e60: 3631 323c 2f73 7061 6e3e 2020 2020 2020 612 │ │ │ │ +00014e70: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00014e80: 2020 2020 2020 5265 6469 7374 7269 6275 Redistribu │ │ │ │ +00014e90: 7465 496e 7465 7266 6163 6526 616d 703b teInterface& │ │ │ │ +00014ea0: 2072 6564 6973 742c 2073 7464 3a3a 7365 redist, std::se │ │ │ │ +00014eb0: 7426 6c74 3b69 6e74 2667 743b 2661 6d70 t<int>& │ │ │ │ +00014ec0: 3b20 6e65 6967 6862 6f72 5072 6f63 7329 ; neighborProcs) │ │ │ │ +00014ed0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
613 │ │ │ │ +00014f30: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +00014f50: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (au │ │ │ │ +00014f70: 746f 3c2f 7370 616e 3e20 696e 6465 7820 to index │ │ │ │ +00014f80: 3d20 696e 6465 7853 6574 2e62 6567 696e = indexSet.begin │ │ │ │ +00014f90: 2829 3b20 696e 6465 7820 213d 2069 6e64 (); index != ind │ │ │ │ +00014fa0: 6578 5365 742e 656e 6428 293b 202b 2b69 exSet.end(); ++i │ │ │ │ +00014fb0: 6e64 6578 2920 7b3c 2f64 6976 3e0a 3c64 ndex) {
. │ │ │ │ +00014fd0: 3c61 2069 643d 226c 3030 3631 3422 206e 614 │ │ │ │ +00015030: 2f2f 204f 6e6c 7920 5072 6f63 6573 7320 // Only Process │ │ │ │ +00015040: 6f77 6e65 7220 7665 7274 6963 6573 2c20 owner vertices, │ │ │ │ +00015050: 7468 6520 6f74 6865 7273 2061 7265 206e the others are n │ │ │ │ +00015060: 6f74 2069 6e20 7468 6520 7061 726d 6574 ot in the parmet │ │ │ │ +00015070: 6973 2067 7261 7068 2e3c 2f73 7061 6e3e is graph. │ │ │ │ +00015080: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000150d0: 2036 3135 3c2f 7370 616e 3e20 2020 2020 615 │ │ │ │ +000150e0: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +00015100: 2f73 7061 6e3e 284f 776e 6572 5365 743a /span>(OwnerSet: │ │ │ │ +00015110: 3a63 6f6e 7461 696e 7328 696e 6465 782d :contains(index- │ │ │ │ +00015120: 2667 743b 6c6f 6361 6c28 292e 6174 7472 >local().attr │ │ │ │ +00015130: 6962 7574 6528 2929 293c 2f64 6976 3e0a ibute()))
. │ │ │ │ +00015140: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00015170: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 616 {.
61 │ │ │ │ +000151f0: 373c 2f73 7061 6e3e 2020 2020 2020 2020 7 │ │ │ │ +00015200: 2020 3c73 7061 6e20 636c 6173 733d 226b if(part[index │ │ │ │ +00015230: 2d26 6774 3b6c 6f63 616c 2829 5d3d 3d74 ->local()]==t │ │ │ │ +00015240: 6f50 6529 3c2f 6469 763e 0a3c 6469 7620 oPe)
.
618 │ │ │ │ +000152a0: 2020 2020 2020 2020 207b 3c2f 6469 763e {
│ │ │ │ +000152b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000152e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 619 │ │ │ │ +00015310: 2067 6574 4e65 6967 6862 6f72 266c 743b getNeighbor< │ │ │ │ +00015320: 4f77 6e65 7253 6574 2667 743b 2867 7261 OwnerSet>(gra │ │ │ │ +00015330: 7068 2c20 7061 7274 2c20 696e 6465 782d ph, part, index- │ │ │ │ +00015340: 2667 743b 6c6f 6361 6c28 292c 2069 6e64 >local(), ind │ │ │ │ +00015350: 6578 5365 742c 3c2f 6469 763e 0a3c 6469 exSet,
.< │ │ │ │ +00015370: 6120 6964 3d22 6c30 3036 3230 2220 6e61 a id="l00620" na │ │ │ │ +00015380: 6d65 3d22 6c30 3036 3230 223e 3c2f 613e me="l00620"> │ │ │ │ +00015390: 3c73 7061 6e20 636c 6173 733d 226c 696e 620 │ │ │ │ +000153c0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000153d0: 2020 2074 6f50 652c 206f 7665 726c 6170 toPe, overlap │ │ │ │ +000153e0: 5365 742c 206e 6569 6768 626f 7250 726f Set, neighborPro │ │ │ │ +000153f0: 6373 293b 3c2f 6469 763e 0a3c 6469 7620 cs);
.
621 │ │ │ │ +00015450: 2020 2020 2020 2020 2020 206d 795f 7075 my_pu │ │ │ │ +00015460: 7368 5f62 6163 6b28 6f77 6e65 7256 6563 sh_back(ownerVec │ │ │ │ +00015470: 2c20 696e 6465 782d 2667 743b 676c 6f62 , index->glob │ │ │ │ +00015480: 616c 2829 2c20 746f 5065 293b 3c2f 6469 al(), toPe);.
622 │ │ │ │ +000154e0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000154f0: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
623 │ │ │ │ +00015550: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +00015570: 6120 6964 3d22 6c30 3036 3234 2220 6e61 a id="l00624" na │ │ │ │ +00015580: 6d65 3d22 6c30 3036 3234 223e 3c2f 613e me="l00624"> │ │ │ │ +00015590: 3c73 7061 6e20 636c 6173 733d 226c 696e 624 }
.< │ │ │ │ +000155c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000155d0: 3e3c 6120 6964 3d22 6c30 3036 3235 2220 > 625 reserve │ │ │ │ +00015620: 286f 776e 6572 5665 632c 2072 6564 6973 (ownerVec, redis │ │ │ │ +00015630: 742c 2074 6f50 6529 3b3c 2f64 6976 3e0a t, toPe);
. │ │ │ │ +00015640: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +000156d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000156e0: 6e6f 223e 2020 3632 373c 2f73 7061 6e3e no"> 627 │ │ │ │ +000156f0: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +00015730: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00015740: 6e6f 223e 2020 3632 383c 2f73 7061 6e3e no"> 628 │ │ │ │ +00015750: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +000157a0: 2020 3632 393c 2f73 7061 6e3e 203c 2f64 629 .
63 │ │ │ │ +00015800: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 template<class │ │ │ │ +00015850: 3c2f 7370 616e 3e20 462c 203c 7370 616e F, class IS │ │ │ │ +00015880: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
637 │ │ │ │ +000158e0: 2020 203c 7370 616e 2063 6c61 7373 3d22 inline< │ │ │ │ +00015900: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> bool isO │ │ │ │ +00015930: 776e 6572 2849 5326 616d 703b 2069 6e64 wner(IS& ind │ │ │ │ +00015940: 6578 5365 742c 203c 7370 616e 2063 6c61 exSet, int inde │ │ │ │ +00015970: 7829 207b 3c2f 6469 763e 0a3c 6469 7620 x) {
.
638 │ │ │ │ +000159d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00015a20: 2036 3339 3c2f 7370 616e 3e20 2020 2020 639 │ │ │ │ +00015a30: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const typena │ │ │ │ +00015a70: 6d65 3c2f 7370 616e 3e20 4953 3a3a 496e me IS::In │ │ │ │ +00015a80: 6465 7850 6169 722a 2070 696e 6465 783d dexPair* pindex= │ │ │ │ +00015a90: 696e 6465 7853 6574 2e70 6169 7228 696e indexSet.pair(in │ │ │ │ +00015aa0: 6465 7829 3b3c 2f64 6976 3e0a 3c64 6976 dex);
.
< │ │ │ │ +00015ae0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00015af0: 6e6f 223e 2020 3634 303c 2f73 7061 6e3e no"> 640 │ │ │ │ +00015b00: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00015b50: 2020 3634 313c 2f73 7061 6e3e 2020 2020 641 │ │ │ │ +00015b60: 2020 6173 7365 7274 2870 696e 6465 7829 assert(pindex) │ │ │ │ +00015b70: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00015bc0: 2020 3634 323c 2f73 7061 6e3e 2020 2020 642 │ │ │ │ +00015bd0: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ │ +00015bf0: 726e 3c2f 7370 616e 3e20 463a 3a63 6f6e rn F::con │ │ │ │ +00015c00: 7461 696e 7328 7069 6e64 6578 2d26 6774 tains(pindex-> │ │ │ │ +00015c10: 3b6c 6f63 616c 2829 2e61 7474 7269 6275 ;local().attribu │ │ │ │ +00015c20: 7465 2829 293b 3c2f 6469 763e 0a3c 6469 te());
.< │ │ │ │ +00015c40: 6120 6964 3d22 6c30 3036 3433 2220 6e61 a id="l00643" na │ │ │ │ +00015c50: 6d65 3d22 6c30 3036 3433 223e 3c2f 613e me="l00643"> │ │ │ │ +00015c60: 3c73 7061 6e20 636c 6173 733d 226c 696e 643 }
.< │ │ │ │ +00015ca0: 6120 6964 3d22 6c30 3036 3434 2220 6e61 a id="l00644" na │ │ │ │ +00015cb0: 6d65 3d22 6c30 3036 3434 223e 3c2f 613e me="l00644"> │ │ │ │ +00015cc0: 3c73 7061 6e20 636c 6173 733d 226c 696e 644
.
645 .
6 │ │ │ │ +00015d90: 3436 3c2f 7370 616e 3e20 2020 203c 7370 46 class │ │ │ │ +00015dc0: 4261 7365 4564 6765 4675 6e63 746f 723c BaseEdgeFunctor< │ │ │ │ +00015dd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00015e20: 3634 373c 2f73 7061 6e3e 2020 2020 7b3c 647 {< │ │ │ │ +00015e30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00015e80: 3634 383c 2f73 7061 6e3e 2020 2020 3c73 648 public:
.
649 │ │ │ │ +00015f10: 2020 2042 6173 6545 6467 6546 756e 6374 BaseEdgeFunct │ │ │ │ +00015f20: 6f72 284d 6574 6973 3a3a 6964 785f 742a or(Metis::idx_t* │ │ │ │ +00015f30: 2061 646a 2c3c 7370 616e 2063 6c61 7373 adj,const │ │ │ │ +00015f50: 3c2f 7370 616e 3e20 5061 726d 6574 6973 Parmetis │ │ │ │ +00015f60: 4475 6e65 496e 6465 784d 6170 2661 6d70 DuneIndexMap& │ │ │ │ +00015f70: 3b20 6461 7461 293c 2f64 6976 3e0a 3c64 ; data)
. │ │ │ │ +00015f90: 3c61 2069 643d 226c 3030 3635 3022 206e 650 : i_() │ │ │ │ +00015fe0: 2c20 6164 6a5f 2861 646a 292c 2064 6174 , adj_(adj), dat │ │ │ │ +00015ff0: 615f 2864 6174 6129 3c2f 6469 763e 0a3c a_(data)
.< │ │ │ │ +00016000: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00016010: 3e3c 6120 6964 3d22 6c30 3036 3531 2220 > 651
{}
.
652< │ │ │ │ +000160b0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +000160d0: 3c61 2069 643d 226c 3030 3635 3322 206e 653
te │ │ │ │ +00016130: 6d70 6c61 7465 3c2f 7370 616e 3e26 6c74 mplate< │ │ │ │ +00016140: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class T>
. │ │ │ │ +00016170: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 │ │ │ │ +00016230: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00016260: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 655 {.
656 │ │ │ │ +000162e0: 3c2f 7370 616e 3e20 2020 2020 2020 203c < │ │ │ │ +000162f0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00016300: 656e 7422 3e2f 2f20 4765 7420 7468 6520 ent">// Get the │ │ │ │ +00016310: 6567 6465 2077 6569 6768 743c 2f73 7061 egde weight
.
657 │ │ │ │ +00016380: 2020 2020 203c 7370 616e 2063 6c61 7373 // co │ │ │ │ +000163a0: 6e73 7420 5765 6967 6874 2661 6d70 3b20 nst Weight& │ │ │ │ +000163b0: 7765 6967 6874 3d65 6467 652e 7765 6967 weight=edge.weig │ │ │ │ +000163c0: 6874 2829 3b3c 2f73 7061 6e3e 3c2f 6469 ht();.
658 │ │ │ │ +00016420: 3c2f 7370 616e 3e20 2020 2020 2020 2061 a │ │ │ │ +00016430: 646a 5f5b 695f 5d20 3d20 6461 7461 5f2e dj_[i_] = data_. │ │ │ │ +00016440: 746f 5061 726d 6574 6973 2865 6467 652e toParmetis(edge. │ │ │ │ +00016450: 7461 7267 6574 2829 293b 3c2f 6469 763e target());
│ │ │ │ +00016460: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00016490: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 659 i_+ │ │ │ │ +000164c0: 2b3b 3c2f 6469 763e 0a3c 6469 7620 636c +;
.
660 │ │ │ │ +00016520: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
661 │ │ │ │ +00016580: 2020 2020 2073 7464 3a3a 7369 7a65 5f74 std::size_t │ │ │ │ +00016590: 2069 6e64 6578 2829 3c2f 6469 763e 0a3c index()
.< │ │ │ │ +000165a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000165b0: 3e3c 6120 6964 3d22 6c30 3036 3632 2220 > 662 {
│ │ │ │ +00016600: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00016690: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000166a0: 3e3c 6120 6964 3d22 6c30 3036 3634 2220 > 664 }
│ │ │ │ +000166f0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00016760: 6120 6964 3d22 6c30 3036 3636 2220 6e61 a id="l00666" na │ │ │ │ +00016770: 6d65 3d22 6c30 3036 3636 223e 3c2f 613e me="l00666"> │ │ │ │ +00016780: 3c73 7061 6e20 636c 6173 733d 226c 696e 666 priva │ │ │ │ +000167c0: 7465 3c2f 7370 616e 3e3a 3c2f 6469 763e te:
│ │ │ │ +000167d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00016800: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 667 std:: │ │ │ │ +00016830: 7369 7a65 5f74 2069 5f3b 3c2f 6469 763e size_t i_;
│ │ │ │ +00016840: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00016870: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 668 Metis │ │ │ │ +000168a0: 3a3a 6964 785f 742a 2061 646a 5f3b 3c2f ::idx_t* adj_;.
6 │ │ │ │ +00016900: 3639 3c2f 7370 616e 3e20 2020 2020 203c 69 < │ │ │ │ +00016910: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00016920: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const ParmetisDuneIn │ │ │ │ +00016940: 6465 784d 6170 2661 6d70 3b20 6461 7461 dexMap& data │ │ │ │ +00016950: 5f3b 3c2f 6469 763e 0a3c 6469 7620 636c _;
.
670 │ │ │ │ +000169b0: 207d 3b3c 2f64 6976 3e0a 3c64 6976 2063 };
.
671 < │ │ │ │ +00016a10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00016a60: 3637 323c 2f73 7061 6e3e 2020 2020 3c73 672 template<typ │ │ │ │ +00016ab0: 656e 616d 653c 2f73 7061 6e3e 2047 2667 ename G&g │ │ │ │ +00016ac0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
673 │ │ │ │ +00016b20: 203c 7370 616e 2063 6c61 7373 3d22 6b65 struct EdgeFunctor │ │ │ │ +00016b50: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00016ba0: 2036 3734 3c2f 7370 616e 3e20 2020 2020 674 │ │ │ │ +00016bb0: 203a 203c 7370 616e 2063 6c61 7373 3d22 : public< │ │ │ │ +00016bd0: 2f73 7061 6e3e 2042 6173 6545 6467 6546 /span> BaseEdgeF │ │ │ │ +00016be0: 756e 6374 6f72 3c2f 6469 763e 0a3c 6469 unctor
.< │ │ │ │ +00016c00: 6120 6964 3d22 6c30 3036 3735 2220 6e61 a id="l00675" na │ │ │ │ +00016c10: 6d65 3d22 6c30 3036 3735 223e 3c2f 613e me="l00675"> │ │ │ │ +00016c20: 3c73 7061 6e20 636c 6173 733d 226c 696e 675 {
.< │ │ │ │ +00016c60: 6120 6964 3d22 6c30 3036 3736 2220 6e61 a id="l00676" na │ │ │ │ +00016c70: 6d65 3d22 6c30 3036 3736 223e 3c2f 613e me="l00676"> │ │ │ │ +00016c80: 3c73 7061 6e20 636c 6173 733d 226c 696e 676 EdgeFunct │ │ │ │ +00016cb0: 6f72 284d 6574 6973 3a3a 6964 785f 742a or(Metis::idx_t* │ │ │ │ +00016cc0: 2061 646a 2c20 3c73 7061 6e20 636c 6173 adj, cons │ │ │ │ +00016ce0: 743c 2f73 7061 6e3e 2050 6172 6d65 7469 t Parmeti │ │ │ │ +00016cf0: 7344 756e 6549 6e64 6578 4d61 7026 616d sDuneIndexMap&am │ │ │ │ +00016d00: 703b 2064 6174 612c 2073 7464 3a3a 7369 p; data, std::si │ │ │ │ +00016d10: 7a65 5f74 293c 2f64 6976 3e0a 3c64 6976 ze_t)
.
< │ │ │ │ +00016d50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00016d60: 6e6f 223e 2020 3637 373c 2f73 7061 6e3e no"> 677 │ │ │ │ +00016d70: 2020 2020 2020 2020 3a20 4261 7365 4564 : BaseEd │ │ │ │ +00016d80: 6765 4675 6e63 746f 7228 6164 6a2c 2064 geFunctor(adj, d │ │ │ │ +00016d90: 6174 6129 3c2f 6469 763e 0a3c 6469 7620 ata)
.
678 │ │ │ │ +00016df0: 2020 2020 207b 7d3c 2f64 6976 3e0a 3c64 {}
. │ │ │ │ +00016e10: 3c61 2069 643d 226c 3030 3637 3922 206e 679
.
680 │ │ │ │ +00016eb0: 2020 2020 4d65 7469 733a 3a69 6478 5f74 Metis::idx_t │ │ │ │ +00016ec0: 2a20 6765 7457 6569 6768 7473 2829 3c2f * getWeights().
6 │ │ │ │ +00016f20: 3831 3c2f 7370 616e 3e20 2020 2020 207b 81 { │ │ │ │ +00016f30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00016f80: 2036 3832 3c2f 7370 616e 3e20 2020 2020 682 │ │ │ │ +00016f90: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret │ │ │ │ +00016fb0: 7572 6e3c 2f73 7061 6e3e 204e 554c 4c3b urn NULL; │ │ │ │ +00016fc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00017010: 2036 3833 3c2f 7370 616e 3e20 2020 2020 683 │ │ │ │ +00017020: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
684 │ │ │ │ +00017080: 2020 203c 7370 616e 2063 6c61 7373 3d22 voi │ │ │ │ +000170a0: 643c 2f73 7061 6e3e 2066 7265 6528 297b d free(){ │ │ │ │ +000170b0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ +00017100: 2020 3638 353c 2f73 7061 6e3e 2020 2020 685 │ │ │ │ +00017110: 7d3b 3c2f 6469 763e 0a3c 6469 7620 636c };
.
686 .
6 │ │ │ │ +000171c0: 3837 3c2f 7370 616e 3e20 2020 203c 7370 87 template<clas │ │ │ │ +00017210: 733c 2f73 7061 6e3e 2047 2c20 3c73 7061 s G, class V │ │ │ │ +00017240: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class E, cl │ │ │ │ +00017280: 6173 733c 2f73 7061 6e3e 2056 4d2c 203c ass VM, < │ │ │ │ +00017290: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000172a0: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class EM>
.< │ │ │ │ +000172c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000172d0: 3e3c 6120 6964 3d22 6c30 3036 3838 2220 > 688 cla │ │ │ │ +00017330: 7373 203c 2f73 7061 6e3e 4564 6765 4675 ss EdgeFu │ │ │ │ +00017340: 6e63 746f 7226 6c74 3b3c 6120 636c 6173 nctor<Dune::Amg::Properti │ │ │ │ +00017390: 6573 4772 6170 6826 6c74 3b47 2c56 2c45 esGraph<G,V,E │ │ │ │ +000173a0: 2c56 4d2c 454d 2667 743b 2026 6774 3b3c ,VM,EM> >< │ │ │ │ +000173b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00017400: 3638 393c 2f73 7061 6e3e 2020 2020 2020 689 │ │ │ │ +00017410: 3a20 203c 7370 616e 2063 6c61 7373 3d22 : public< │ │ │ │ +00017430: 2f73 7061 6e3e 2042 6173 6545 6467 6546 /span> BaseEdgeF │ │ │ │ +00017440: 756e 6374 6f72 3c2f 6469 763e 0a3c 6469 unctor
.< │ │ │ │ +00017460: 6120 6964 3d22 6c30 3036 3930 2220 6e61 a id="l00690" na │ │ │ │ +00017470: 6d65 3d22 6c30 3036 3930 223e 3c2f 613e me="l00690"> │ │ │ │ +00017480: 3c73 7061 6e20 636c 6173 733d 226c 696e 690 {
.< │ │ │ │ +000174c0: 6120 6964 3d22 6c30 3036 3931 2220 6e61 a id="l00691" na │ │ │ │ +000174d0: 6d65 3d22 6c30 3036 3931 223e 3c2f 613e me="l00691"> │ │ │ │ +000174e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 691 publi │ │ │ │ +00017520: 633c 2f73 7061 6e3e 3a3c 2f64 6976 3e0a c:
. │ │ │ │ +00017530: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
│ │ │ │ +00017600: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00017630: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 693 : B │ │ │ │ +00017660: 6173 6545 6467 6546 756e 6374 6f72 2861 aseEdgeFunctor(a │ │ │ │ +00017670: 646a 2c20 6461 7461 293c 2f64 6976 3e0a dj, data)
. │ │ │ │ +00017680: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
695< │ │ │ │ +00017730: 2f73 7061 6e3e 2020 2020 2020 2020 7765 /span> we │ │ │ │ +00017740: 6967 6874 5f3d 3c73 7061 6e20 636c 6173 ight_=new< │ │ │ │ +00017760: 2f73 7061 6e3e 204d 6574 6973 3a3a 6964 /span> Metis::id │ │ │ │ +00017770: 785f 745b 735d 3b3c 2f64 6976 3e0a 3c64 x_t[s];
. │ │ │ │ +00017790: 3c61 2069 643d 226c 3030 3639 3622 206e 696 }
. │ │ │ │ +000177e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +00017870: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00017880: 6e6f 223e 2020 3639 383c 2f73 7061 6e3e no"> 698 │ │ │ │ +00017890: 2020 2020 2020 3c73 7061 6e20 636c 6173 temp │ │ │ │ +000178b0: 6c61 7465 3c2f 7370 616e 3e26 6c74 3b3c late<< │ │ │ │ +000178c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000178d0: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class T>
. │ │ │ │ +00017900: 3c61 2069 643d 226c 3030 3639 3922 206e 699 void op │ │ │ │ +00017970: 6572 6174 6f72 2829 283c 7370 616e 2063 erator()(c │ │ │ │ +00017990: 6f6e 7374 3c2f 7370 616e 3e20 5426 616d onst T&am │ │ │ │ +000179a0: 703b 2065 6467 6529 3c2f 6469 763e 0a3c p; edge)
.< │ │ │ │ +000179b0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000179c0: 3e3c 6120 6964 3d22 6c30 3037 3030 2220 > 700 {
│ │ │ │ +00017a10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00017a40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 701 wei │ │ │ │ +00017a70: 6768 745f 5b69 6e64 6578 2829 5d3d 6564 ght_[index()]=ed │ │ │ │ +00017a80: 6765 2e70 726f 7065 7274 6965 7328 292e ge.properties(). │ │ │ │ +00017a90: 6465 7065 6e64 7328 2920 3f20 3320 3a20 depends() ? 3 : │ │ │ │ +00017aa0: 313b 3c2f 6469 763e 0a3c 6469 7620 636c 1;
.
702 │ │ │ │ +00017b00: 2020 2020 2042 6173 6545 6467 6546 756e BaseEdgeFun │ │ │ │ +00017b10: 6374 6f72 3a3a 6f70 6572 6174 6f72 2829 ctor::operator() │ │ │ │ +00017b20: 2865 6467 6529 3b3c 2f64 6976 3e0a 3c64 (edge);
. │ │ │ │ +00017b40: 3c61 2069 643d 226c 3030 3730 3322 206e 703 }
. │ │ │ │ +00017b90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
705 │ │ │ │ +00017c60: 2020 2020 207b 3c2f 6469 763e 0a3c 6469 {
.< │ │ │ │ +00017c80: 6120 6964 3d22 6c30 3037 3036 2220 6e61 a id="l00706" na │ │ │ │ +00017c90: 6d65 3d22 6c30 3037 3036 223e 3c2f 613e me="l00706"> │ │ │ │ +00017ca0: 3c73 7061 6e20 636c 6173 733d 226c 696e 706 return │ │ │ │ +00017cf0: 2077 6569 6768 745f 3b3c 2f64 6976 3e0a weight_;
. │ │ │ │ +00017d00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
708< │ │ │ │ +00017db0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> void free(){
. │ │ │ │ +00017df0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00017e20: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 709 if( │ │ │ │ +00017e70: 7765 6967 6874 5f21 3d30 2920 7b3c 2f64 weight_!=0) {.
71 │ │ │ │ +00017ed0: 303c 2f73 7061 6e3e 2020 2020 2020 2020 0 │ │ │ │ +00017ee0: 2020 3c73 7061 6e20 636c 6173 733d 226b delete weight_;.
7 │ │ │ │ +00017f60: 3131 3c2f 7370 616e 3e20 2020 2020 2020 11 │ │ │ │ +00017f70: 2020 2077 6569 6768 745f 3d30 3b3c 2f64 weight_=0;.
71 │ │ │ │ +00017fd0: 323c 2f73 7061 6e3e 2020 2020 2020 2020 2 │ │ │ │ +00017fe0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ +00018030: 2020 3731 333c 2f73 7061 6e3e 2020 2020 713 │ │ │ │ +00018040: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
.
714 │ │ │ │ +000180a0: 2020 3c73 7061 6e20 636c 6173 733d 226b private< │ │ │ │ +000180c0: 2f73 7061 6e3e 3a3c 2f64 6976 3e0a 3c64 /span>:
. │ │ │ │ +000180e0: 3c61 2069 643d 226c 3030 3731 3522 206e 715 Metis::i │ │ │ │ +00018130: 6478 5f74 2a20 7765 6967 6874 5f3b 3c2f dx_t* weight_;.
7 │ │ │ │ +00018190: 3136 3c2f 7370 616e 3e20 2020 207d 3b3c 16 };< │ │ │ │ +000181a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +000181f0: 3731 373c 2f73 7061 6e3e 203c 2f64 6976 717
.
718< │ │ │ │ +00018250: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00018270: 3c61 2069 643d 226c 3030 3731 3922 206e 719
.
733 │ │ │ │ +00018310: 2020 3c73 7061 6e20 636c 6173 733d 226b template │ │ │ │ +00018330: 3c2f 7370 616e 3e26 6c74 3b3c 7370 616e <class F, │ │ │ │ +00018360: 203c 7370 616e 2063 6c61 7373 3d22 6b65 class G, cla │ │ │ │ +000183a0: 7373 3c2f 7370 616e 3e20 4953 2c20 3c73 ss IS, class │ │ │ │ +000183d0: 2045 5726 6774 3b3c 2f64 6976 3e0a 3c64 EW>
. │ │ │ │ +000183f0: 3c61 2069 643d 226c 3030 3733 3422 206e 734 │ │ │ │ +00018450: 766f 6964 3c2f 7370 616e 3e20 6765 7441 void getA │ │ │ │ +00018460: 646a 4172 7261 7973 2847 2661 6d70 3b20 djArrays(G& │ │ │ │ +00018470: 6772 6170 682c 2049 5326 616d 703b 2069 graph, IS& i │ │ │ │ +00018480: 6e64 6578 5365 742c 204d 6574 6973 3a3a ndexSet, Metis:: │ │ │ │ +00018490: 6964 785f 7420 2a78 6164 6a2c 3c2f 6469 idx_t *xadj,.
735 │ │ │ │ +000184f0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00018500: 2020 2020 2020 2020 2020 2020 2045 5726 EW& │ │ │ │ +00018510: 616d 703b 2065 7729 3c2f 6469 763e 0a3c amp; ew)
.< │ │ │ │ +00018520: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00018530: 3e3c 6120 6964 3d22 6c30 3037 3336 2220 > 736 {
.< │ │ │ │ +00018580: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00018590: 3e3c 6120 6964 3d22 6c30 3037 3337 2220 > 737 int j= │ │ │ │ +00018600: 303b 3c2f 6469 763e 0a3c 6469 7620 636c 0;
.
738 │ │ │ │ +00018660: 2020 203c 7370 616e 2063 6c61 7373 3d22 auto vend = grap │ │ │ │ +00018690: 682e 656e 6428 293b 3c2f 6469 763e 0a3c h.end();
.< │ │ │ │ +000186a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000186b0: 3e3c 6120 6964 3d22 6c30 3037 3339 2220 > 739
.
740 │ │ │ │ +00018750: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +00018770: 6f72 3c2f 7370 616e 3e28 3c73 7061 6e20 or( │ │ │ │ +00018790: 6175 746f 3c2f 7370 616e 3e20 7665 7274 auto vert │ │ │ │ +000187a0: 6578 203d 2067 7261 7068 2e62 6567 696e ex = graph.begin │ │ │ │ +000187b0: 2829 3b20 7665 7274 6578 2021 3d20 7665 (); vertex != ve │ │ │ │ +000187c0: 6e64 3b20 2b2b 7665 7274 6578 2920 7b3c nd; ++vertex) {< │ │ │ │ +000187d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00018820: 3734 313c 2f73 7061 6e3e 2020 2020 2020 741 │ │ │ │ +00018830: 2020 3c73 7061 6e20 636c 6173 733d 226b if (isOwner&l │ │ │ │ +00018860: 743b 4626 6774 3b28 696e 6465 7853 6574 t;F>(indexSet │ │ │ │ +00018870: 2c2a 7665 7274 6578 2929 207b 3c2f 6469 ,*vertex)) {.
742 │ │ │ │ +000188d0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000188e0: 203c 7370 616e 2063 6c61 7373 3d22 636f // The ty │ │ │ │ +00018900: 7065 206f 6620 636f 6e73 7420 6564 6765 pe of const edge │ │ │ │ +00018910: 2069 7465 7261 746f 722e 3c2f 7370 616e iterator.
.
│ │ │ │ +00018970: 2020 3734 333c 2f73 7061 6e3e 2020 2020 743 │ │ │ │ +00018980: 2020 2020 2020 3c73 7061 6e20 636c 6173 auto │ │ │ │ +000189a0: 3c2f 7370 616e 3e20 6565 6e64 203d 2076 eend = v │ │ │ │ +000189b0: 6572 7465 782e 656e 6428 293b 3c2f 6469 ertex.end();.
744 │ │ │ │ +00018a10: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00018a20: 2078 6164 6a5b 6a5d 203d 2065 772e 696e xadj[j] = ew.in │ │ │ │ +00018a30: 6465 7828 293b 3c2f 6469 763e 0a3c 6469 dex();
.< │ │ │ │ +00018a50: 6120 6964 3d22 6c30 3037 3435 2220 6e61 a id="l00745" na │ │ │ │ +00018a60: 6d65 3d22 6c30 3037 3435 223e 3c2f 613e me="l00745"> │ │ │ │ +00018a70: 3c73 7061 6e20 636c 6173 733d 226c 696e 745 j++;< │ │ │ │ +00018aa0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00018af0: 3734 363c 2f73 7061 6e3e 2020 2020 2020 746 │ │ │ │ +00018b00: 2020 2020 3c73 7061 6e20 636c 6173 733d fo │ │ │ │ +00018b20: 723c 2f73 7061 6e3e 283c 7370 616e 2063 r(a │ │ │ │ +00018b40: 7574 6f3c 2f73 7061 6e3e 2065 6467 6520 uto edge │ │ │ │ +00018b50: 3d20 7665 7274 6578 2e62 6567 696e 2829 = vertex.begin() │ │ │ │ +00018b60: 3b20 6564 6765 2021 3d20 6565 6e64 3b20 ; edge != eend; │ │ │ │ +00018b70: 2b2b 6564 6765 2920 7b3c 2f64 6976 3e0a ++edge) {
. │ │ │ │ +00018b80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +00018bf0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00018c20: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 748 }< │ │ │ │ +00018c50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00018ca0: 3734 393c 2f73 7061 6e3e 2020 2020 2020 749 │ │ │ │ +00018cb0: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
.
750 │ │ │ │ +00018d10: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +00018d50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00018d60: 6e6f 223e 2020 3735 313c 2f73 7061 6e3e no"> 751 │ │ │ │ +00018d70: 2020 2020 2020 7861 646a 5b6a 5d20 3d20 xadj[j] = │ │ │ │ +00018d80: 6577 2e69 6e64 6578 2829 3b3c 2f64 6976 ew.index();
.
752< │ │ │ │ +00018de0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }
.
753< │ │ │ │ +00018e40: 2f73 7061 6e3e 2020 7d20 3c73 7061 6e20 /span> } │ │ │ │ +00018e60: 2f2f 2065 6e64 2061 6e6f 6e79 6d6f 7573 // end anonymous │ │ │ │ +00018e70: 206e 616d 6573 7061 6365 3c2f 7370 616e namespace
.
│ │ │ │ +00018ed0: 2020 3735 343c 2f73 7061 6e3e 203c 2f64 754 .
75 │ │ │ │ +00018f30: 353c 2f73 7061 6e3e 2020 3c73 7061 6e20 5 │ │ │ │ +00018f50: 7465 6d70 6c61 7465 3c2f 7370 616e 3e26 template& │ │ │ │ +00018f60: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class G, c │ │ │ │ +00018fa0: 6c61 7373 3c2f 7370 616e 3e20 5431 2c20 lass T1, │ │ │ │ +00018fb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 class T2>
. │ │ │ │ +00018fe0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
757< │ │ │ │ +00019170: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00019180: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00019190: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Dune │ │ │ │ +000191c0: 3a3a 4f77 6e65 724f 7665 726c 6170 436f ::OwnerOverlapCo │ │ │ │ +000191d0: 7079 436f 6d6d 756e 6963 6174 696f 6e26 pyCommunication& │ │ │ │ +000191e0: 6c74 3b54 312c 5432 2667 743b 3c2f 613e lt;T1,T2> │ │ │ │ +000191f0: 2661 6d70 3b20 6f6f 636f 6d6d 2c3c 2f64 & oocomm,.
75 │ │ │ │ +00019250: 383c 2f73 7061 6e3e 2020 2020 2020 2020 8 │ │ │ │ +00019260: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00019270: 2020 7374 643a 3a73 6861 7265 645f 7074 std::shared_pt │ │ │ │ +00019280: 7226 6c74 3b3c 6120 636c 6173 733d 2263 r<Dune::OwnerOver │ │ │ │ +000192c0: 6c61 7043 6f70 7943 6f6d 6d75 6e69 6361 lapCopyCommunica │ │ │ │ +000192d0: 7469 6f6e 266c 743b 5431 2c54 3226 6774 tion<T1,T2> │ │ │ │ +000192e0: 3b3c 2f61 3e26 6774 3b26 616d 703b 206f ;>& o │ │ │ │ +000192f0: 7574 636f 6d6d 2c3c 2f64 6976 3e0a 3c64 utcomm,
. │ │ │ │ +00019310: 3c61 2069 643d 226c 3030 3735 3922 206e 759 │ │ │ │ +00019360: 2020 2020 2020 2020 2020 2020 5265 6469 Redi │ │ │ │ +00019370: 7374 7269 6275 7465 496e 7465 7266 6163 stributeInterfac │ │ │ │ +00019380: 6526 616d 703b 2072 6564 6973 7449 6e66 e& redistInf │ │ │ │ +00019390: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
.
│ │ │ │ +000193e0: 2020 3736 303c 2f73 7061 6e3e 2020 2020 760 │ │ │ │ +000193f0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00019400: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +00019420: 626f 6f6c 3c2f 7370 616e 3e20 7665 7262 bool verb │ │ │ │ +00019430: 6f73 653d 3c73 7061 6e20 636c 6173 733d ose=false< │ │ │ │ +00019450: 2f73 7061 6e3e 293b 3c2f 6469 763e 0a3c /span>);
.< │ │ │ │ +00019460: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00019470: 3e3c 6120 6964 3d22 6c30 3037 3631 2220 > 761#i │ │ │ │ +000194d0: 6620 4841 5645 5f50 4152 4d45 5449 533c f HAVE_PARMETIS< │ │ │ │ +000194e0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00019500: 6120 6964 3d22 6c30 3037 3632 2220 6e61 a id="l00762" na │ │ │ │ +00019510: 6d65 3d22 6c30 3037 3632 223e 3c2f 613e me="l00762"> │ │ │ │ +00019520: 3c73 7061 6e20 636c 6173 733d 226c 696e 762#ifn │ │ │ │ +00019560: 6465 6620 4d45 5449 535f 5645 525f 4d41 def METIS_VER_MA │ │ │ │ +00019570: 4a4f 523c 2f73 7061 6e3e 3c2f 6469 763e JOR
│ │ │ │ +00019580: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000195b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 763 ext │ │ │ │ +000195f0: 6572 6e3c 2f73 7061 6e3e 203c 7370 616e ern "C&q │ │ │ │ +00019620: 756f 743b 3c2f 7370 616e 3e3c 2f64 6976 uot;
.
764< │ │ │ │ +00019680: 2f73 7061 6e3e 2020 7b3c 2f64 6976 3e0a /span> {
. │ │ │ │ +00019690: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +00019750: 6120 6964 3d22 6c30 3037 3636 2220 6e61 a id="l00766" na │ │ │ │ +00019760: 6d65 3d22 6c30 3037 3636 223e 3c2f 613e me="l00766"> │ │ │ │ +00019770: 3c73 7061 6e20 636c 6173 733d 226c 696e 766 v │ │ │ │ +000197b0: 6f69 643c 2f73 7061 6e3e 204d 4554 4953 oid METIS │ │ │ │ +000197c0: 5f50 6172 7447 7261 7068 4b77 6179 283c _PartGraphKway(< │ │ │ │ +000197d0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000197e0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int *nvtxs, Meti │ │ │ │ +00019800: 733a 3a69 6478 5f74 202a 7861 646a 2c20 s::idx_t *xadj, │ │ │ │ +00019810: 4d65 7469 733a 3a69 6478 5f74 202a 6164 Metis::idx_t *ad │ │ │ │ +00019820: 6a6e 6379 2c20 4d65 7469 733a 3a69 6478 jncy, Metis::idx │ │ │ │ +00019830: 5f74 202a 7677 6774 2c3c 2f64 6976 3e0a _t *vwgt,
. │ │ │ │ +00019840: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
768 │ │ │ │ +000199b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000199c0: 2020 2020 2020 2020 2020 3c73 7061 6e20 int * │ │ │ │ +000199f0: 6f70 7469 6f6e 732c 203c 7370 616e 2063 options, int *e │ │ │ │ +00019a20: 6467 6563 7574 2c20 4d65 7469 733a 3a69 dgecut, Metis::i │ │ │ │ +00019a30: 6478 5f74 202a 7061 7274 293b 3c2f 6469 dx_t *part);.
769 │ │ │ │ +00019a90: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00019aa0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00019ab0: 3e3c 6120 6964 3d22 6c30 3037 3730 2220 > 770 void MET │ │ │ │ +00019b20: 4953 5f50 6172 7447 7261 7068 5265 6375 IS_PartGraphRecu │ │ │ │ +00019b30: 7273 6976 6528 3c73 7061 6e20 636c 6173 rsive( │ │ │ │ +00019b50: 696e 743c 2f73 7061 6e3e 202a 6e76 7478 int *nvtx │ │ │ │ +00019b60: 732c 204d 6574 6973 3a3a 6964 785f 7420 s, Metis::idx_t │ │ │ │ +00019b70: 2a78 6164 6a2c 204d 6574 6973 3a3a 6964 *xadj, Metis::id │ │ │ │ +00019b80: 785f 7420 2a61 646a 6e63 792c 204d 6574 x_t *adjncy, Met │ │ │ │ +00019b90: 6973 3a3a 6964 785f 7420 2a76 7767 742c is::idx_t *vwgt, │ │ │ │ +00019ba0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00019bf0: 2037 3731 3c2f 7370 616e 3e20 2020 2020 771 │ │ │ │ +00019c00: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00019c10: 2020 2020 2020 2020 2020 2020 204d 6574 Met │ │ │ │ +00019c20: 6973 3a3a 6964 785f 7420 2a61 646a 7767 is::idx_t *adjwg │ │ │ │ +00019c30: 742c 203c 7370 616e 2063 6c61 7373 3d22 t, int │ │ │ │ +00019c50: 3c2f 7370 616e 3e20 2a77 6774 666c 6167 *wgtflag │ │ │ │ +00019c60: 2c20 3c73 7061 6e20 636c 6173 733d 226b , int< │ │ │ │ +00019c80: 2f73 7061 6e3e 202a 6e75 6d66 6c61 672c /span> *numflag, │ │ │ │ +00019c90: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int *nparts,.
7 │ │ │ │ +00019d10: 3732 3c2f 7370 616e 3e20 2020 2020 2020 72 │ │ │ │ +00019d20: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00019d30: 2020 2020 2020 2020 2020 203c 7370 616e int │ │ │ │ +00019d60: 2a6f 7074 696f 6e73 2c20 3c73 7061 6e20 *options, int * │ │ │ │ +00019d90: 6564 6765 6375 742c 204d 6574 6973 3a3a edgecut, Metis:: │ │ │ │ +00019da0: 6964 785f 7420 2a70 6172 7429 3b3c 2f64 idx_t *part);.
77 │ │ │ │ +00019e00: 333c 2f73 7061 6e3e 2020 7d3c 2f64 6976 3 }
.
774< │ │ │ │ +00019e60: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#endif.
7 │ │ │ │ +00019ee0: 3735 3c2f 7370 616e 3e3c 7370 616e 2063 75#endif // HAVE_ │ │ │ │ +00019f30: 5041 524d 4554 4953 3c2f 7370 616e 3e3c PARMETIS< │ │ │ │ +00019f40: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00019f90: 3737 363c 2f73 7061 6e3e 203c 2f64 6976 776
.
777< │ │ │ │ +00019ff0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> te │ │ │ │ +0001a010: 6d70 6c61 7465 3c2f 7370 616e 3e26 6c74 mplate< │ │ │ │ +0001a020: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class S, cla │ │ │ │ +0001a060: 7373 3c2f 7370 616e 3e20 5426 6774 3b3c ss T>< │ │ │ │ +0001a070: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ │ +0001a0f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001a100: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 778 inline < │ │ │ │ +0001a180: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0001a190: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void print_carr │ │ │ │ +0001a200: 6179 3c2f 613e 2853 2661 6d70 3b20 6f73 ay(S& os │ │ │ │ +0001a210: 2c20 542a 2061 7272 6179 2c20 7374 643a , T* array, std: │ │ │ │ +0001a220: 3a73 697a 655f 7420 6c29 3c2f 6469 763e :size_t l)
│ │ │ │ +0001a230: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +0001a290: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0001a2a0: 3e3c 6120 6964 3d22 6c30 3037 3830 2220 > 780 for(T *c │ │ │ │ +0001a310: 7572 3d61 7272 6179 2c20 2a65 6e64 3d61 ur=array, *end=a │ │ │ │ +0001a320: 7272 6179 2b6c 3b20 6375 7221 3d65 6e64 rray+l; cur!=end │ │ │ │ +0001a330: 3b20 2b2b 6375 7229 3c2f 6469 763e 0a3c ; ++cur)
.< │ │ │ │ +0001a340: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0001a350: 3e3c 6120 6964 3d22 6c30 3037 3831 2220 > 781 os<& │ │ │ │ +0001a3a0: 6c74 3b2a 6375 7226 6c74 3b26 6c74 3b3c lt;*cur<<< │ │ │ │ +0001a3b0: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +0001a3c0: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +0001a3d0: 3b20 2671 756f 743b 3c2f 7370 616e 3e3b ; "; │ │ │ │ +0001a3e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001a430: 2037 3832 3c2f 7370 616e 3e20 207d 3c2f 782 }.
.
< │ │ │ │ +0001a480: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001a490: 6e6f 223e 2020 3738 333c 2f73 7061 6e3e no"> 783 │ │ │ │ +0001a4a0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +0001a4f0: 2020 3738 343c 2f73 7061 6e3e 2020 3c73 784 template<cla │ │ │ │ +0001a540: 7373 3c2f 7370 616e 3e20 532c 203c 7370 ss S, class │ │ │ │ +0001a570: 5426 6774 3b3c 2f64 6976 3e0a 3c64 6976 T>
.
.
│ │ │ │ +0001a650: 2037 3835 3c2f 613e 3c2f 7370 616e 3e20 785 │ │ │ │ +0001a660: 203c 7370 616e 2063 6c61 7373 3d22 6b65 inline b │ │ │ │ +0001a6a0: 6f6f 6c3c 2f73 7061 6e3e 203c 6120 636c ool isVa │ │ │ │ +0001a700: 6c69 6447 7261 7068 3c2f 613e 2873 7464 lidGraph(std │ │ │ │ +0001a710: 3a3a 7369 7a65 5f74 206e 6f56 7478 2c20 ::size_t noVtx, │ │ │ │ +0001a720: 7374 643a 3a73 697a 655f 7420 676e 6f56 std::size_t gnoV │ │ │ │ +0001a730: 7478 2c20 5320 6e6f 4564 6765 732c 2054 tx, S noEdges, T │ │ │ │ +0001a740: 2a20 7861 646a 2c3c 2f64 6976 3e0a 3c64 * xadj,
. │ │ │ │ +0001a760: 3c61 2069 643d 226c 3030 3738 3622 206e 786 │ │ │ │ +0001a7b0: 2020 2020 2020 2020 2020 2020 2054 2a20 T* │ │ │ │ +0001a7c0: 6164 6a6e 6379 2c20 3c73 7061 6e20 636c adjncy, bool ch │ │ │ │ +0001a7f0: 6563 6b53 796d 6d65 7472 7929 3c2f 6469 eckSymmetry).
787 │ │ │ │ +0001a850: 3c2f 7370 616e 3e20 207b 3c2f 6469 763e {
│ │ │ │ +0001a860: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001a890: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 788 bool c │ │ │ │ +0001a8e0: 6f72 7265 6374 3d3c 7370 616e 2063 6c61 orrect=tru │ │ │ │ +0001a900: 653c 2f73 7061 6e3e 3b3c 2f64 6976 3e0a e;
. │ │ │ │ +0001a910: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0001a9a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001a9b0: 6e6f 223e 2020 3739 303c 2f73 7061 6e3e no"> 790 │ │ │ │ +0001a9c0: 2020 2020 3c73 7061 6e20 636c 6173 733d using │ │ │ │ +0001a9e0: 3c2f 7370 616e 3e73 7464 3a3a 7369 676e std::sign │ │ │ │ +0001a9f0: 6269 743b 3c2f 6469 763e 0a3c 6469 7620 bit;
.
791 │ │ │ │ +0001aa50: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +0001aa70: 3c2f 7370 616e 3e28 3c61 2063 6c61 7373 (Metis::i │ │ │ │ +0001aad0: 6478 5f74 3c2f 613e 2076 7478 3d30 3b20 dx_t vtx=0; │ │ │ │ +0001aae0: 7674 7826 6c74 3b28 3c61 2063 6c61 7373 vtx<(Metis::i │ │ │ │ +0001ab40: 6478 5f74 3c2f 613e 296e 6f56 7478 3b20 dx_t)noVtx; │ │ │ │ +0001ab50: 2b2b 7674 7829 207b 3c2f 6469 763e 0a3c ++vtx) {
.< │ │ │ │ +0001ab60: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0001ab70: 3e3c 6120 6964 3d22 6c30 3037 3932 2220 > 792 if(static_cast&l │ │ │ │ +0001ac00: 743b 3c2f 7370 616e 3e53 3c73 7061 6e20 t;S │ │ │ │ +0001ac20: 2667 743b 3c2f 7370 616e 3e28 7861 646a >(xadj │ │ │ │ +0001ac30: 5b76 7478 5d29 2667 743b 6e6f 4564 6765 [vtx])>noEdge │ │ │ │ +0001ac40: 7320 7c7c 2073 6967 6e62 6974 2878 6164 s || signbit(xad │ │ │ │ +0001ac50: 6a5b 7674 785d 2929 207b 3c2f 6469 763e j[vtx])) {
│ │ │ │ +0001ac60: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001ac90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 793 std │ │ │ │ +0001acc0: 3a3a 6365 7272 2026 6c74 3b26 6c74 3b3c ::cerr <<< │ │ │ │ +0001acd0: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +0001ace0: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +0001acf0: 3b43 6865 636b 2067 7261 7068 3a20 7861 ;Check graph: xa │ │ │ │ +0001ad00: 646a 5b26 7175 6f74 3b3c 2f73 7061 6e3e dj[" │ │ │ │ +0001ad10: 266c 743b 266c 743b 7674 7826 6c74 3b26 <<vtx<& │ │ │ │ +0001ad20: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +0001ad40: 7175 6f74 3b5d 3d26 7175 6f74 3b3c 2f73 quot;]="<<xadj │ │ │ │ +0001ad60: 5b76 7478 5d26 6c74 3b26 6c74 3b3c 7370 [vtx]<<" │ │ │ │ +0001ad90: 2826 6774 3b26 7175 6f74 3b3c 2f73 7061 (>"
.
794 │ │ │ │ +0001ae00: 2020 2020 2020 2020 2020 2020 2020 2026 & │ │ │ │ +0001ae10: 6c74 3b26 6c74 3b6e 6f45 6467 6573 266c lt;<noEdges&l │ │ │ │ +0001ae20: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<") out of │ │ │ │ +0001ae50: 2072 616e 6765 2126 7175 6f74 3b3c 2f73 range!"<<std: │ │ │ │ +0001ae70: 3a65 6e64 6c3b 3c2f 6469 763e 0a3c 6469 :endl;
.< │ │ │ │ +0001ae90: 6120 6964 3d22 6c30 3037 3935 2220 6e61 a id="l00795" na │ │ │ │ +0001aea0: 6d65 3d22 6c30 3037 3935 223e 3c2f 613e me="l00795"> │ │ │ │ +0001aeb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 795 correct │ │ │ │ +0001aee0: 3d3c 7370 616e 2063 6c61 7373 3d22 6b65 =false;
.
796 │ │ │ │ +0001af60: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +0001af80: 6120 6964 3d22 6c30 3037 3937 2220 6e61 a id="l00797" na │ │ │ │ +0001af90: 6d65 3d22 6c30 3037 3937 223e 3c2f 613e me="l00797"> │ │ │ │ +0001afa0: 3c73 7061 6e20 636c 6173 733d 226c 696e 797 if(static_cast< │ │ │ │ +0001b010: 3c2f 7370 616e 3e53 3c73 7061 6e20 636c S&g │ │ │ │ +0001b030: 743b 3c2f 7370 616e 3e28 7861 646a 5b76 t;(xadj[v │ │ │ │ +0001b040: 7478 2b31 5d29 2667 743b 6e6f 4564 6765 tx+1])>noEdge │ │ │ │ +0001b050: 7320 7c7c 2073 6967 6e62 6974 2878 6164 s || signbit(xad │ │ │ │ +0001b060: 6a5b 7674 782b 315d 2929 207b 3c2f 6469 j[vtx+1])) {.
798 │ │ │ │ +0001b0c0: 3c2f 7370 616e 3e20 2020 2020 2020 2073 s │ │ │ │ +0001b0d0: 7464 3a3a 6365 7272 2026 6c74 3b26 6c74 td::cerr << │ │ │ │ +0001b0e0: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ +0001b100: 6f74 3b43 6865 636b 2067 7261 7068 3a20 ot;Check graph: │ │ │ │ +0001b110: 7861 646a 5b26 7175 6f74 3b3c 2f73 7061 xadj["<<vtx+1& │ │ │ │ +0001b130: 6c74 3b26 6c74 3b3c 7370 616e 2063 6c61 lt;<"]=" │ │ │ │ +0001b160: 3b3c 2f73 7061 6e3e 266c 743b 266c 743b ;<< │ │ │ │ +0001b170: 7861 646a 5b76 7478 2b31 5d26 6c74 3b26 xadj[vtx+1]<& │ │ │ │ +0001b180: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +0001b1a0: 7175 6f74 3b20 2826 6774 3b26 7175 6f74 quot; (>" │ │ │ │ +0001b1b0: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +0001b1c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0001b1d0: 3e3c 6120 6964 3d22 6c30 3037 3939 2220 > 799 │ │ │ │ +0001b220: 2020 2020 2026 6c74 3b26 6c74 3b6e 6f45 <<noE │ │ │ │ +0001b230: 6467 6573 266c 743b 266c 743b 3c73 7061 dges<<") │ │ │ │ +0001b260: 6f75 7420 6f66 2072 616e 6765 2126 7175 out of range!&qu │ │ │ │ +0001b270: 6f74 3b3c 2f73 7061 6e3e 266c 743b 266c ot;<&l │ │ │ │ +0001b280: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
800 │ │ │ │ +0001b2e0: 3c2f 7370 616e 3e20 2020 2020 2020 2063 c │ │ │ │ +0001b2f0: 6f72 7265 6374 3d3c 7370 616e 2063 6c61 orrect=fal │ │ │ │ +0001b310: 7365 3c2f 7370 616e 3e3b 3c2f 6469 763e se;
│ │ │ │ +0001b320: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001b350: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 801 }.
802 │ │ │ │ +0001b3d0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 // Check numb │ │ │ │ +0001b400: 6572 7320 696e 2061 646a 6e63 793c 2f73 ers in adjncy
.
803 │ │ │ │ +0001b470: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +0001b490: 6f72 3c2f 7370 616e 3e28 3c61 2063 6c61 or(Metis: │ │ │ │ +0001b4f0: 3a69 6478 5f74 3c2f 613e 2069 3d78 6164 :idx_t i=xad │ │ │ │ +0001b500: 6a5b 7674 785d 3b20 6926 6c74 3b20 7861 j[vtx]; i< xa │ │ │ │ +0001b510: 646a 5b76 7478 2b31 5d3b 202b 2b69 2920 dj[vtx+1]; ++i) │ │ │ │ +0001b520: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +0001b570: 2020 3830 343c 2f73 7061 6e3e 2020 2020 804 │ │ │ │ +0001b580: 2020 2020 3c73 7061 6e20 636c 6173 733d if │ │ │ │ +0001b5a0: 3c2f 7370 616e 3e28 7369 676e 6269 7428 (signbit( │ │ │ │ +0001b5b0: 6164 6a6e 6379 5b69 5d29 207c 7c20 2828 adjncy[i]) || (( │ │ │ │ +0001b5c0: 7374 643a 3a73 697a 655f 7429 6164 6a6e std::size_t)adjn │ │ │ │ +0001b5d0: 6379 5b69 5d29 2667 743b 676e 6f56 7478 cy[i])>gnoVtx │ │ │ │ +0001b5e0: 2920 7b3c 2f64 6976 3e0a 3c64 6976 2063 ) {
.
805 │ │ │ │ +0001b640: 2020 2020 2020 2020 7374 643a 3a63 6572 std::cer │ │ │ │ +0001b650: 7226 6c74 3b26 6c74 3b3c 7370 616e 2063 r<<" Edge │ │ │ │ +0001b680: 2026 7175 6f74 3b3c 2f73 7061 6e3e 266c "&l │ │ │ │ +0001b690: 743b 266c 743b 6164 6a6e 6379 5b69 5d26 t;<adjncy[i]& │ │ │ │ +0001b6a0: 6c74 3b26 6c74 3b3c 7370 616e 2063 6c61 lt;<" out of │ │ │ │ +0001b6d0: 2072 616e 6765 205b 2671 756f 743b 3c2f range ["<<0&l │ │ │ │ +0001b6f0: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<","< │ │ │ │ +0001b720: 2f73 7061 6e3e 266c 743b 266c 743b 6e6f /span><<no │ │ │ │ +0001b730: 5674 7826 6c74 3b26 6c74 3b3c 7370 616e Vtx<<")&q │ │ │ │ +0001b760: 756f 743b 3c2f 7370 616e 3e3c 2f64 6976 uot;
.
806< │ │ │ │ +0001b7c0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0001b7d0: 2020 2020 2020 2020 2026 6c74 3b26 6c74 << │ │ │ │ +0001b7e0: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
807< │ │ │ │ +0001b840: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0001b850: 636f 7272 6563 743d 3c73 7061 6e20 636c correct=fa │ │ │ │ +0001b870: 6c73 653c 2f73 7061 6e3e 3b3c 2f64 6976 lse;
.
808< │ │ │ │ +0001b8d0: 2f73 7061 6e3e 2020 2020 2020 2020 7d3c /span> }< │ │ │ │ +0001b8e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001b930: 3830 393c 2f73 7061 6e3e 2020 2020 2020 809 │ │ │ │ +0001b940: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ +0001b990: 2020 3831 303c 2f73 7061 6e3e 2020 2020 810 │ │ │ │ +0001b9a0: 2020 3c73 7061 6e20 636c 6173 733d 226b if(checkSymme │ │ │ │ +0001b9d0: 7472 7929 207b 3c2f 6469 763e 0a3c 6469 try) {
.< │ │ │ │ +0001b9f0: 6120 6964 3d22 6c30 3038 3131 2220 6e61 a id="l00811" na │ │ │ │ +0001ba00: 6d65 3d22 6c30 3038 3131 223e 3c2f 613e me="l00811"> │ │ │ │ +0001ba10: 3c73 7061 6e20 636c 6173 733d 226c 696e 811 for(Me │ │ │ │ +0001bab0: 7469 733a 3a69 6478 5f74 3c2f 613e 2069 tis::idx_t i │ │ │ │ +0001bac0: 3d78 6164 6a5b 7674 785d 3b20 6926 6c74 =xadj[vtx]; i< │ │ │ │ +0001bad0: 3b20 7861 646a 5b76 7478 2b31 5d3b 202b ; xadj[vtx+1]; + │ │ │ │ +0001bae0: 2b69 2920 7b3c 2f64 6976 3e0a 3c64 6976 +i) {
.
< │ │ │ │ +0001bb20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001bb30: 6e6f 223e 2020 3831 323c 2f73 7061 6e3e no"> 812 │ │ │ │ +0001bb40: 2020 2020 2020 2020 2020 3c61 2063 6c61 Metis: │ │ │ │ +0001bba0: 3a69 6478 5f74 3c2f 613e 2074 6172 6765 :idx_t targe │ │ │ │ +0001bbb0: 743d 6164 6a6e 6379 5b69 5d3b 3c2f 6469 t=adjncy[i];.
813 │ │ │ │ +0001bc10: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +0001bc20: 203c 7370 616e 2063 6c61 7373 3d22 636f // search │ │ │ │ +0001bc40: 2066 6f72 2073 796d 6d65 7472 6963 2065 for symmetric e │ │ │ │ +0001bc50: 6467 653c 2f73 7061 6e3e 3c2f 6469 763e dge
│ │ │ │ +0001bc60: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001bc90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 814 < │ │ │ │ +0001bcc0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0001bcd0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int found=0;.
815 │ │ │ │ +0001bd40: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +0001bd50: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for(Metis::idx │ │ │ │ +0001bdd0: 5f74 3c2f 613e 206a 3d78 6164 6a5b 7461 _t j=xadj[ta │ │ │ │ +0001bde0: 7267 6574 5d3b 206a 266c 743b 2078 6164 rget]; j< xad │ │ │ │ +0001bdf0: 6a5b 7461 7267 6574 2b31 5d3b 202b 2b6a j[target+1]; ++j │ │ │ │ +0001be00: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +0001be50: 2020 3831 363c 2f73 7061 6e3e 2020 2020 816 │ │ │ │ +0001be60: 2020 2020 2020 2020 3c73 7061 6e20 636c if(adjn │ │ │ │ +0001be90: 6379 5b6a 5d3d 3d76 7478 293c 2f64 6976 cy[j]==vtx)
.
817< │ │ │ │ +0001bef0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0001bf00: 2020 2020 666f 756e 642b 2b3b 3c2f 6469 found++;.
818 │ │ │ │ +0001bf60: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +0001bf70: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if(found!=1) { │ │ │ │ +0001bfa0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001bff0: 2038 3139 3c2f 7370 616e 3e20 2020 2020 819 │ │ │ │ +0001c000: 2020 2020 2020 2073 7464 3a3a 6365 7272 std::cerr │ │ │ │ +0001c010: 266c 743b 266c 743b 3c73 7061 6e20 636c <<"Edge ( │ │ │ │ +0001c040: 2671 756f 743b 3c2f 7370 616e 3e26 6c74 "< │ │ │ │ +0001c050: 3b26 6c74 3b74 6172 6765 7426 6c74 3b26 ;<target<& │ │ │ │ +0001c060: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +0001c080: 7175 6f74 3b2c 2671 756f 743b 3c2f 7370 quot;,"<<vtx&l │ │ │ │ +0001c0a0: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<") " │ │ │ │ +0001c0d0: 3c2f 7370 616e 3e26 6c74 3b26 6c74 3b69 <<i │ │ │ │ +0001c0e0: 266c 743b 266c 743b 3c73 7061 6e20 636c <<" time& │ │ │ │ +0001c110: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ +0001c120: 266c 743b 7374 643a 3a65 6e64 6c3b 3c2f <std::endl;.
8 │ │ │ │ +0001c180: 3230 3c2f 7370 616e 3e20 2020 2020 2020 20 │ │ │ │ +0001c190: 2020 2020 2063 6f72 7265 6374 3d3c 7370 correct=false; │ │ │ │ +0001c1c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001c210: 2038 3231 3c2f 7370 616e 3e20 2020 2020 821 │ │ │ │ +0001c220: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +0001c240: 6120 6964 3d22 6c30 3038 3232 2220 6e61 a id="l00822" na │ │ │ │ +0001c250: 6d65 3d22 6c30 3038 3232 223e 3c2f 613e me="l00822"> │ │ │ │ +0001c260: 3c73 7061 6e20 636c 6173 733d 226c 696e 822 }
│ │ │ │ +0001c290: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001c2c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 823 }.
824 │ │ │ │ +0001c340: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
825 │ │ │ │ +0001c3a0: 3c2f 7370 616e 3e20 2020 203c 7370 616e return correct;
.
826< │ │ │ │ +0001c430: 2f73 7061 6e3e 2020 7d3c 2f64 6976 3e0a /span> }
. │ │ │ │ +0001c440: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001c490: 2038 3237 3c2f 7370 616e 3e20 3c2f 6469 827 .
828 │ │ │ │ +0001c4f0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 t │ │ │ │ +0001c510: 656d 706c 6174 653c 2f73 7061 6e3e 266c emplate&l │ │ │ │ +0001c520: 743b 3c73 7061 6e20 636c 6173 733d 226b t;class M, cl │ │ │ │ +0001c560: 6173 733c 2f73 7061 6e3e 2054 312c 203c ass T1, < │ │ │ │ +0001c570: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0001c580: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord">class T2>
.< │ │ │ │ +0001c5a0: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ │ +0001c5b0: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ │ +0001c5c0: 6e30 3038 3239 2220 6461 7461 2d73 7461 n00829" data-sta │ │ │ │ +0001c5d0: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ │ +0001c5e0: 227d 223e 0a3c 6469 7620 636c 6173 733d "}">..< │ │ │ │ +0001c820: 6120 6964 3d22 6c30 3038 3330 2220 6e61 a id="l00830" na │ │ │ │ +0001c830: 6d65 3d22 6c30 3038 3330 223e 3c2f 613e me="l00830"> │ │ │ │ +0001c840: 3c73 7061 6e20 636c 6173 733d 226c 696e 830 │ │ │ │ +0001c870: 2020 2020 2020 2020 2020 2020 203c 6120 Met │ │ │ │ +0001c8d0: 6973 3a3a 6964 785f 743c 2f61 3e20 6e70 is::idx_t np │ │ │ │ +0001c8e0: 6172 7473 2c3c 2f64 6976 3e0a 3c64 6976 arts,
.
< │ │ │ │ +0001c920: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001c930: 6e6f 223e 2020 3833 313c 2f73 7061 6e3e no"> 831 │ │ │ │ +0001c940: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0001c950: 2020 2020 2020 2020 2020 2020 7374 643a std: │ │ │ │ +0001c960: 3a73 6861 7265 645f 7074 7226 6c74 3b3c :shared_ptr<< │ │ │ │ +0001c970: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +0001c980: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ │ +0001c990: 3139 3834 2e68 746d 6c22 3e44 756e 653a 1984.html">Dune: │ │ │ │ +0001c9a0: 3a4f 776e 6572 4f76 6572 6c61 7043 6f70 :OwnerOverlapCop │ │ │ │ +0001c9b0: 7943 6f6d 6d75 6e69 6361 7469 6f6e 266c yCommunication&l │ │ │ │ +0001c9c0: 743b 5431 2c54 3226 6774 3b3c 2f61 3e26 t;T1,T2>& │ │ │ │ +0001c9d0: 6774 3b26 616d 703b 206f 7574 636f 6d6d gt;& outcomm │ │ │ │ +0001c9e0: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
.
│ │ │ │ +0001ca30: 2020 3833 323c 2f73 7061 6e3e 2020 2020 832 │ │ │ │ +0001ca40: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0001ca50: 2020 2020 2020 2020 3c61 2063 6c61 7373 Redistribut │ │ │ │ +0001ca90: 6549 6e74 6572 6661 6365 3c2f 613e 2661 eInterface&a │ │ │ │ +0001caa0: 6d70 3b20 7265 6469 7374 496e 662c 3c2f mp; redistInf,.
8 │ │ │ │ +0001cb00: 3333 3c2f 7370 616e 3e20 2020 2020 2020 33 │ │ │ │ +0001cb10: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0001cb20: 2020 2020 203c 7370 616e 2063 6c61 7373 b │ │ │ │ +0001cb40: 6f6f 6c3c 2f73 7061 6e3e 2076 6572 626f ool verbo │ │ │ │ +0001cb50: 7365 3d3c 7370 616e 2063 6c61 7373 3d22 se=false)
.< │ │ │ │ +0001cb90: 6120 6964 3d22 6c30 3038 3334 2220 6e61 a id="l00834" na │ │ │ │ +0001cba0: 6d65 3d22 6c30 3038 3334 223e 3c2f 613e me="l00834"> │ │ │ │ +0001cbb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 834 {
.
835 │ │ │ │ +0001cc30: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +0001cc50: 2f73 7061 6e3e 2876 6572 626f 7365 2026 /span>(verbose & │ │ │ │ +0001cc60: 616d 703b 2661 6d70 3b20 6f6f 636f 6d6d amp;& oocomm │ │ │ │ +0001cc70: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .communicator().rank()==0)< │ │ │ │ +0001cce0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001cd30: 3833 363c 2f73 7061 6e3e 2020 2020 2020 836 │ │ │ │ +0001cd40: 7374 643a 3a63 6f75 7426 6c74 3b26 6c74 std::cout<< │ │ │ │ +0001cd50: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ +0001cd70: 6f74 3b52 6570 6172 7469 7469 6f6e 696e ot;Repartitionin │ │ │ │ +0001cd80: 6720 6672 6f6d 2026 7175 6f74 3b3c 2f73 g from "<<ooco │ │ │ │ +0001cda0: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +0001ce00: 3c2f 613e 2829 2e73 697a 6528 293c 2f64 ().size().
83 │ │ │ │ +0001ce60: 373c 2f73 7061 6e3e 2020 2020 2020 2020 7 │ │ │ │ +0001ce70: 2020 2020 2020 2026 6c74 3b26 6c74 3b3c <<< │ │ │ │ +0001ce80: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +0001ce90: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +0001cea0: 3b20 746f 2026 7175 6f74 3b3c 2f73 7061 ; to "<<nparts │ │ │ │ +0001cec0: 266c 743b 266c 743b 3c73 7061 6e20 636c <<" parts │ │ │ │ +0001cef0: 2671 756f 743b 3c2f 7370 616e 3e26 6c74 "< │ │ │ │ +0001cf00: 3b26 6c74 3b73 7464 3a3a 656e 646c 3b3c ;<std::endl;< │ │ │ │ +0001cf10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001cf60: 3833 383c 2f73 7061 6e3e 2020 2020 5469 838 Ti │ │ │ │ +0001cf70: 6d65 7220 7469 6d65 3b3c 2f64 6976 3e0a mer time;
. │ │ │ │ +0001cf80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .< │ │ │ │ +0001d090: 6120 6964 3d22 6c30 3038 3430 2220 6e61 a id="l00840" na │ │ │ │ +0001d0a0: 6d65 3d22 6c30 3038 3430 223e 3c2f 613e me="l00840"> │ │ │ │ +0001d0b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 840#if │ │ │ │ +0001d0f0: 2148 4156 455f 5041 524d 4554 4953 3c2f !HAVE_PARMETIS
.
< │ │ │ │ +0001d140: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001d150: 6e6f 223e 2020 3834 313c 2f73 7061 6e3e no"> 841 │ │ │ │ +0001d160: 2020 2020 3c73 7061 6e20 636c 6173 733d in │ │ │ │ +0001d180: 743c 2f73 7061 6e3e 2a20 7061 7274 203d t* part = │ │ │ │ +0001d190: 203c 7370 616e 2063 6c61 7373 3d22 6b65 new int< │ │ │ │ +0001d1d0: 2f73 7061 6e3e 5b31 5d3b 3c2f 6469 763e /span>[1];
│ │ │ │ +0001d1e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001d210: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 842 part[0] │ │ │ │ +0001d240: 3d30 3b3c 2f64 6976 3e0a 3c64 6976 2063 =0;
.
843#else
.
< │ │ │ │ +0001d300: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001d310: 6e6f 223e 2020 3834 343c 2f73 7061 6e3e no"> 844 │ │ │ │ +0001d320: 2020 2020 3c61 2063 6c61 7373 3d22 636f Metis::idx_t │ │ │ │ +0001d380: 3c2f 613e 2a20 7061 7274 203d 203c 7370 * part = new Me │ │ │ │ +0001d400: 7469 733a 3a69 6478 5f74 3c2f 613e 5b31 tis::idx_t[1 │ │ │ │ +0001d410: 5d3b 203c 7370 616e 2063 6c61 7373 3d22 ]; // wher │ │ │ │ +0001d430: 6520 616c 6c20 6f75 7220 6461 7461 206d e all our data m │ │ │ │ +0001d440: 6f76 6573 2074 6f3c 2f73 7061 6e3e 3c2f oves to.
8 │ │ │ │ +0001d4a0: 3435 3c2f 7370 616e 3e20 3c2f 6469 763e 45
│ │ │ │ +0001d4b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001d4e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 846 if(npa │ │ │ │ +0001d530: 7274 7326 6774 3b31 2920 7b3c 2f64 6976 rts>1) {
.
847< │ │ │ │ +0001d590: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +0001d5b0: 3c61 2069 643d 226c 3030 3834 3822 206e 848 part[0]= │ │ │ │ +0001d600: 7261 6e6b 3b3c 2f64 6976 3e0a 3c64 6976 rank;
.
< │ │ │ │ +0001d640: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001d650: 6e6f 223e 2020 3834 393c 2f73 7061 6e3e no"> 849 │ │ │ │ +0001d660: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +0001d6b0: 2020 3835 303c 2f73 7061 6e3e 2020 2020 850 │ │ │ │ +0001d6c0: 2020 7b20 3c73 7061 6e20 636c 6173 733d { // sub │ │ │ │ +0001d6e0: 6c6f 636b 2066 6f72 2061 7574 6f6d 6174 lock for automat │ │ │ │ +0001d6f0: 6963 206d 656d 6f72 7920 6465 6c65 7469 ic memory deleti │ │ │ │ +0001d700: 6f6e 3c2f 7370 616e 3e3c 2f64 6976 3e0a on
. │ │ │ │ +0001d710: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0001d7a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001d7b0: 6e6f 223e 2020 3835 323c 2f73 7061 6e3e no"> 852 │ │ │ │ +0001d7c0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0001d7e0: 2042 7569 6c64 2074 6865 2067 7261 7068 Build the graph │ │ │ │ +0001d7f0: 206f 6620 7468 6520 636f 6d6d 756e 6963 of the communic │ │ │ │ +0001d800: 6174 696f 6e20 7363 6865 6d65 2061 6e64 ation scheme and │ │ │ │ +0001d810: 2063 7265 6174 6520 616e 2061 7070 726f create an appro │ │ │ │ +0001d820: 7072 6961 7465 2069 6e64 6578 7365 742e priate indexset. │ │ │ │ +0001d830: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0001d850: 3c61 2069 643d 226c 3030 3835 3322 206e 853 │ │ │ │ +0001d8b0: 2f2f 2063 616c 6375 6c61 7465 2074 6865 // calculate the │ │ │ │ +0001d8c0: 206e 6569 6768 626f 7572 2076 6572 7469 neighbour verti │ │ │ │ +0001d8d0: 6365 733c 2f73 7061 6e3e 3c2f 6469 763e ces
│ │ │ │ +0001d8e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001d910: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 854 int noNeighbours = │ │ │ │ +0001d970: 206f 6f63 6f6d 6d2e 3c61 2063 6c61 7373 oocomm.remoteI │ │ │ │ +0001d9d0: 6e64 6963 6573 3c2f 613e 2829 2e6e 6569 ndices().nei │ │ │ │ +0001d9e0: 6768 626f 7572 7328 293b 3c2f 6469 763e ghbours();
│ │ │ │ +0001d9f0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +0001da60: 6120 6964 3d22 6c30 3038 3536 2220 6e61 a id="l00856" na │ │ │ │ +0001da70: 6d65 3d22 6c30 3038 3536 223e 3c2f 613e me="l00856"> │ │ │ │ +0001da80: 3c73 7061 6e20 636c 6173 733d 226c 696e 856 for(auto │ │ │ │ +0001daf0: 6e3d 206f 6f63 6f6d 6d2e 3c61 2063 6c61 n= oocomm.remot │ │ │ │ +0001db50: 6549 6e64 6963 6573 3c2f 613e 2829 2e62 eIndices().b │ │ │ │ +0001db60: 6567 696e 2829 3b20 6e20 213d 2020 6f6f egin(); n != oo │ │ │ │ +0001db70: 636f 6d6d 2e3c 6120 636c 6173 733d 2263 comm.remoteIndi │ │ │ │ +0001dbd0: 6365 733c 2f61 3e28 292e 656e 6428 293b ces().end(); │ │ │ │ +0001dbe0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001dc30: 2038 3537 3c2f 7370 616e 3e20 2020 2020 857 │ │ │ │ +0001dc40: 2020 2020 2020 202b 2b6e 293c 2f64 6976 ++n)
.
858< │ │ │ │ +0001dca0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0001dcb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(n->first= │ │ │ │ +0001dce0: 3d72 616e 6b29 207b 3c2f 6469 763e 0a3c =rank) {
.< │ │ │ │ +0001dcf0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0001dd00: 3e3c 6120 6964 3d22 6c30 3038 3539 2220 > 859 < │ │ │ │ +0001dd50: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +0001dd60: 656e 7422 3e2f 2f64 6f20 6e6f 7420 696e ent">//do not in │ │ │ │ +0001dd70: 636c 7564 6520 6f75 7273 656c 7665 732e clude ourselves. │ │ │ │ +0001dd80: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0001dda0: 3c61 2069 643d 226c 3030 3836 3022 206e 860 -- │ │ │ │ +0001ddf0: 6e6f 4e65 6967 6862 6f75 7273 3b3c 2f64 noNeighbours;.
86 │ │ │ │ +0001de50: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ +0001de60: 2020 2020 3c73 7061 6e20 636c 6173 733d br │ │ │ │ +0001de80: 6561 6b3c 2f73 7061 6e3e 3b3c 2f64 6976 eak;
.
862< │ │ │ │ +0001dee0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0001def0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ +0001df40: 2020 3836 333c 2f73 7061 6e3e 203c 2f64 863 .
86 │ │ │ │ +0001dfa0: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ │ +0001dfb0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // A parme │ │ │ │ +0001dfd0: 7469 7320 6772 6170 6820 7265 7072 6573 tis graph repres │ │ │ │ +0001dfe0: 656e 7469 6e67 2074 6865 2063 6f6d 6d75 enting the commu │ │ │ │ +0001dff0: 6e69 6361 7469 6f6e 2067 7261 7068 2e3c nication graph.< │ │ │ │ +0001e000: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0001e020: 6120 6964 3d22 6c30 3038 3635 2220 6e61 a id="l00865" na │ │ │ │ +0001e030: 6d65 3d22 6c30 3038 3635 223e 3c2f 613e me="l00865"> │ │ │ │ +0001e040: 3c73 7061 6e20 636c 6173 733d 226c 696e 865 / │ │ │ │ +0001e080: 2f20 5468 6520 6469 6167 6f6e 616c 2065 / The diagonal e │ │ │ │ +0001e090: 6e74 7269 6573 2061 7265 2074 6865 206e ntries are the n │ │ │ │ +0001e0a0: 756d 6265 7220 6f66 206e 6f64 6573 206f umber of nodes o │ │ │ │ +0001e0b0: 6e20 7468 6520 7072 6f63 6573 732e 3c2f n the process.
.
< │ │ │ │ +0001e100: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001e110: 6e6f 223e 2020 3836 363c 2f73 7061 6e3e no"> 866 │ │ │ │ +0001e120: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0001e140: 2054 6865 206f 6666 6469 6167 6f6e 616c The offdiagonal │ │ │ │ +0001e150: 2065 6e74 7269 6573 2061 7265 2074 6865 entries are the │ │ │ │ +0001e160: 206e 756d 6265 7220 6f66 2065 6467 6573 number of edges │ │ │ │ +0001e170: 206c 6561 6469 6e67 2074 6f20 6f74 6865 leading to othe │ │ │ │ +0001e180: 7220 7072 6f63 6573 7365 732e 3c2f 7370 r processes.
.
867 < │ │ │ │ +0001e1f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001e240: 3836 383c 2f73 7061 6e3e 2020 2020 2020 868 │ │ │ │ +0001e250: 2020 3c61 2063 6c61 7373 3d22 636f 6465 Metis::idx_t *xadj=n │ │ │ │ +0001e2d0: 6577 3c2f 7370 616e 3e20 3c61 2063 6c61 ew Metis: │ │ │ │ +0001e330: 3a69 6478 5f74 3c2f 613e 5b32 5d3b 3c2f :idx_t[2];.
8 │ │ │ │ +0001e390: 3639 3c2f 7370 616e 3e20 2020 2020 2020 69 │ │ │ │ +0001e3a0: 203c 6120 636c 6173 733d 2263 6f64 6520 Metis::idx_t *vtxdist=new Meti │ │ │ │ +0001e480: 733a 3a69 6478 5f74 3c2f 613e 5b6f 6f63 s::idx_t[ooc │ │ │ │ +0001e490: 6f6d 6d2e 3c61 2063 6c61 7373 3d22 636f omm.communicato │ │ │ │ +0001e4f0: 723c 2f61 3e28 292e 7369 7a65 2829 2b31 r().size()+1 │ │ │ │ +0001e500: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
.
870 │ │ │ │ +0001e560: 2020 2020 203c 6120 636c 6173 733d 2263 Metis::idx_ │ │ │ │ +0001e5c0: 743c 2f61 3e20 2a61 646a 6e63 793d 3c73 t *adjncy=new < │ │ │ │ +0001e5f0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +0001e600: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +0001e610: 6130 3032 3635 2e68 746d 6c23 6162 3162 a00265.html#ab1b │ │ │ │ +0001e620: 3837 3965 6562 6435 6433 3237 3031 6337 879eebd5d32701c7 │ │ │ │ +0001e630: 6235 3837 3962 6265 3634 6131 3722 3e4d b5879bbe64a17">M │ │ │ │ +0001e640: 6574 6973 3a3a 6964 785f 743c 2f61 3e5b etis::idx_t[ │ │ │ │ +0001e650: 6e6f 4e65 6967 6862 6f75 7273 5d3b 3c2f noNeighbours];.
8 │ │ │ │ +0001e6b0: 3731 3c2f 7370 616e 3e3c 7370 616e 2063 71#ifdef USE_W │ │ │ │ +0001e6e0: 4549 4748 5453 3c2f 7370 616e 3e3c 2f64 EIGHTS.
87 │ │ │ │ +0001e740: 323c 2f73 7061 6e3e 2020 2020 2020 2020 2 │ │ │ │ +0001e750: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ +0001e7a0: 4d65 7469 733a 3a69 6478 5f74 3c2f 613e Metis::idx_t │ │ │ │ +0001e7b0: 202a 7677 6774 203d 2030 3b3c 2f64 6976 *vwgt = 0;
.
873< │ │ │ │ +0001e810: 2f73 7061 6e3e 2020 2020 2020 2020 3c61 /span> Me │ │ │ │ +0001e870: 7469 733a 3a69 6478 5f74 3c2f 613e 202a tis::idx_t * │ │ │ │ +0001e880: 6164 6a77 6774 203d 2030 3b3c 2f64 6976 adjwgt = 0;
.
874< │ │ │ │ +0001e8e0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#endif.
8 │ │ │ │ +0001e960: 3735 3c2f 7370 616e 3e20 3c2f 6469 763e 75
│ │ │ │ +0001e970: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001e9a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 876 // each proce │ │ │ │ +0001e9f0: 7373 2068 6173 2065 7861 6374 6c79 206f ss has exactly o │ │ │ │ +0001ea00: 6e65 2076 6572 7465 7821 3c2f 7370 616e ne vertex!
.
│ │ │ │ +0001ea60: 2020 3837 373c 2f73 7061 6e3e 2020 2020 877 │ │ │ │ +0001ea70: 2020 2020 3c73 7061 6e20 636c 6173 733d fo │ │ │ │ +0001ea90: 723c 2f73 7061 6e3e 283c 7370 616e 2063 r(int i= │ │ │ │ +0001eac0: 303b 2069 266c 743b 6f6f 636f 6d6d 2e3c 0; i<oocomm.< │ │ │ │ +0001ead0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +0001eae0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +0001eaf0: 2261 3031 3938 342e 6874 6d6c 2361 6164 "a01984.html#aad │ │ │ │ +0001eb00: 3033 6530 3438 3135 3232 6138 3262 6330 03e0481522a82bc0 │ │ │ │ +0001eb10: 6232 3132 6361 6431 6462 3736 6638 223e b212cad1db76f8"> │ │ │ │ +0001eb20: 636f 6d6d 756e 6963 6174 6f72 3c2f 613e communicator │ │ │ │ +0001eb30: 2829 2e73 697a 6528 293b 202b 2b69 293c ().size(); ++i)< │ │ │ │ +0001eb40: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001eb90: 3837 383c 2f73 7061 6e3e 2020 2020 2020 878 │ │ │ │ +0001eba0: 2020 2020 7674 7864 6973 745b 695d 3d69 vtxdist[i]=i │ │ │ │ +0001ebb0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0001ec00: 2020 3837 393c 2f73 7061 6e3e 2020 2020 879 │ │ │ │ +0001ec10: 2020 2020 7674 7864 6973 745b 6f6f 636f vtxdist[ooco │ │ │ │ +0001ec20: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +0001ec80: 3c2f 613e 2829 2e73 697a 6528 295d 3d6f ().size()]=o │ │ │ │ +0001ec90: 6f63 6f6d 6d2e 3c61 2063 6c61 7373 3d22 ocomm.communica │ │ │ │ +0001ecf0: 746f 723c 2f61 3e28 292e 7369 7a65 2829 tor().size() │ │ │ │ +0001ed00: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0001ed50: 2020 3838 303c 2f73 7061 6e3e 203c 2f64 880 .
88 │ │ │ │ +0001edb0: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ +0001edc0: 7861 646a 5b30 5d3d 303b 3c2f 6469 763e xadj[0]=0;
│ │ │ │ +0001edd0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001ee00: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 882 xad │ │ │ │ +0001ee30: 6a5b 315d 3d6e 6f4e 6569 6768 626f 7572 j[1]=noNeighbour │ │ │ │ +0001ee40: 733b 3c2f 6469 763e 0a3c 6469 7620 636c s;
.
883 .
8 │ │ │ │ +0001eef0: 3834 3c2f 7370 616e 3e20 2020 2020 2020 84 │ │ │ │ +0001ef00: 203c 7370 616e 2063 6c61 7373 3d22 636f // count │ │ │ │ +0001ef20: 6564 6765 7320 746f 206f 7468 6572 2070 edges to other p │ │ │ │ +0001ef30: 726f 6365 7373 6f72 3c2f 7370 616e 3e3c rocessor< │ │ │ │ +0001ef40: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001ef90: 3838 353c 2f73 7061 6e3e 2020 2020 2020 885 │ │ │ │ +0001efa0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // a vec │ │ │ │ +0001efc0: 746f 7220 6d61 7070 696e 6720 7468 6520 tor mapping the │ │ │ │ +0001efd0: 696e 6465 7820 746f 2074 6865 206f 776e index to the own │ │ │ │ +0001efe0: 6572 3c2f 7370 616e 3e3c 2f64 6976 3e0a er
. │ │ │ │ +0001eff0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +0001f100: 2038 3837 3c2f 7370 616e 3e20 2020 2020 887 │ │ │ │ +0001f110: 2020 203c 7370 616e 2063 6c61 7373 3d22 // for( │ │ │ │ +0001f130: 4e65 6967 6862 6f75 7249 7465 7261 746f NeighbourIterato │ │ │ │ +0001f140: 7220 6e3d 206f 6f63 6f6d 6d2e 7265 6d6f r n= oocomm.remo │ │ │ │ +0001f150: 7465 496e 6469 6365 7328 292e 6265 6769 teIndices().begi │ │ │ │ +0001f160: 6e28 293b 206e 2021 3d20 206f 6f63 6f6d n(); n != oocom │ │ │ │ +0001f170: 6d2e 7265 6d6f 7465 496e 6469 6365 7328 m.remoteIndices( │ │ │ │ +0001f180: 292e 656e 6428 293b 3c2f 7370 616e 3e3c ).end();< │ │ │ │ +0001f190: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001f1e0: 3838 383c 2f73 7061 6e3e 2020 2020 2020 888 │ │ │ │ +0001f1f0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // + │ │ │ │ +0001f210: 2b6e 293c 2f73 7061 6e3e 3c2f 6469 763e +n)
│ │ │ │ +0001f220: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001f250: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 889 // { │ │ │ │ +0001f2a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001f2f0: 2038 3930 3c2f 7370 616e 3e20 2020 2020 890 │ │ │ │ +0001f300: 2020 203c 7370 616e 2063 6c61 7373 3d22 // │ │ │ │ +0001f320: 6966 286e 2d26 6774 3b66 6972 7374 213d if(n->first!= │ │ │ │ +0001f330: 6f6f 636f 6d6d 2e63 6f6d 6d75 6e69 6361 oocomm.communica │ │ │ │ +0001f340: 746f 7228 292e 7261 6e6b 2829 297b 3c2f tor().rank()){
.
< │ │ │ │ +0001f390: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001f3a0: 6e6f 223e 2020 3839 313c 2f73 7061 6e3e no"> 891 │ │ │ │ +0001f3b0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0001f3d0: 2020 2020 2020 2074 7970 6564 6566 2074 typedef t │ │ │ │ +0001f3e0: 7970 656e 616d 6520 5265 6d6f 7465 496e ypename RemoteIn │ │ │ │ +0001f3f0: 6469 6365 733a 3a52 656d 6f74 6549 6e64 dices::RemoteInd │ │ │ │ +0001f400: 6578 4c69 7374 2052 494c 6973 743b 3c2f exList RIList;
.
< │ │ │ │ +0001f450: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001f460: 6e6f 223e 2020 3839 323c 2f73 7061 6e3e no"> 892 │ │ │ │ +0001f470: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0001f490: 2020 2020 2020 2063 6f6e 7374 2052 494c const RIL │ │ │ │ +0001f4a0: 6973 7426 616d 703b 2072 6c69 7374 203d ist& rlist = │ │ │ │ +0001f4b0: 202a 286e 2d26 6774 3b73 6563 6f6e 642e *(n->second. │ │ │ │ +0001f4c0: 6669 7273 7429 3b3c 2f73 7061 6e3e 3c2f first);.
8 │ │ │ │ +0001f520: 3933 3c2f 7370 616e 3e20 2020 2020 2020 93 │ │ │ │ +0001f530: 203c 7370 616e 2063 6c61 7373 3d22 636f // │ │ │ │ +0001f550: 7479 7065 6465 6620 7479 7065 6e61 6d65 typedef typename │ │ │ │ +0001f560: 2052 494c 6973 743a 3a63 6f6e 7374 5f69 RIList::const_i │ │ │ │ +0001f570: 7465 7261 746f 7220 4c49 7465 723b 3c2f terator LIter;
.
< │ │ │ │ +0001f5c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001f5d0: 6e6f 223e 2020 3839 343c 2f73 7061 6e3e no"> 894 │ │ │ │ +0001f5e0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0001f600: 2020 2020 2020 2066 6f72 284c 4974 6572 for(LIter │ │ │ │ +0001f610: 2065 6e74 7279 3d72 6c69 7374 2e62 6567 entry=rlist.beg │ │ │ │ +0001f620: 696e 2829 3b20 656e 7472 7921 3d72 6c69 in(); entry!=rli │ │ │ │ +0001f630: 7374 2e65 6e64 2829 3b20 2b2b 656e 7472 st.end(); ++entr │ │ │ │ +0001f640: 7929 7b3c 2f73 7061 6e3e 3c2f 6469 763e y){
│ │ │ │ +0001f650: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001f680: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 895 // if │ │ │ │ +0001f6d0: 2865 6e74 7279 2d26 6774 3b61 7474 7269 (entry->attri │ │ │ │ +0001f6e0: 6275 7465 2829 3d3d 4f77 6e65 724f 7665 bute()==OwnerOve │ │ │ │ +0001f6f0: 726c 6170 436f 7079 4174 7472 6962 7574 rlapCopyAttribut │ │ │ │ +0001f700: 6553 6574 3a3a 6f77 6e65 7229 3c2f 7370 eSet::owner)
.
896 │ │ │ │ +0001f770: 2020 2020 2020 3c73 7061 6e20 636c 6173 // │ │ │ │ +0001f790: 2020 2020 2020 2020 206f 776e 6572 5b65 owner[e │ │ │ │ +0001f7a0: 6e74 7279 2d26 6774 3b6c 6f63 616c 496e ntry->localIn │ │ │ │ +0001f7b0: 6465 7850 6169 7228 292e 6c6f 6361 6c28 dexPair().local( │ │ │ │ +0001f7c0: 295d 203d 206e 2d26 6774 3b66 6972 7374 )] = n->first │ │ │ │ +0001f7d0: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +0001f7e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0001f7f0: 3e3c 6120 6964 3d22 6c30 3038 3937 2220 > 897 // }
.
898 │ │ │ │ +0001f8c0: 2020 2020 203c 7370 616e 2063 6c61 7373 // │ │ │ │ +0001f8e0: 2020 7d3c 2f73 7061 6e3e 3c2f 6469 763e }
│ │ │ │ +0001f8f0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001f920: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 899 // } │ │ │ │ +0001f970: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001f9c0: 2039 3030 3c2f 7370 616e 3e20 3c2f 6469 900 .
901 │ │ │ │ +0001fa20: 3c2f 7370 616e 3e20 2020 2020 2020 203c < │ │ │ │ +0001fa30: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +0001fa40: 656e 7422 3e2f 2f20 7374 643a 3a6d 6170 ent">// std::map │ │ │ │ +0001fa50: 266c 743b 696e 742c 4d65 7469 733a 3a69 <int,Metis::i │ │ │ │ +0001fa60: 6478 5f74 2667 743b 2065 6467 6563 6f75 dx_t> edgecou │ │ │ │ +0001fa70: 6e74 3b20 2f2f 2065 6467 6573 2074 6f20 nt; // edges to │ │ │ │ +0001fa80: 6f74 6865 7220 7072 6f63 6573 736f 7273 other processors │ │ │ │ +0001fa90: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0001fab0: 3c61 2069 643d 226c 3030 3930 3222 206e 902 │ │ │ │ +0001fb10: 2f2f 2074 7970 6564 6566 2074 7970 656e // typedef typen │ │ │ │ +0001fb20: 616d 6520 4d3a 3a43 6f6e 7374 526f 7749 ame M::ConstRowI │ │ │ │ +0001fb30: 7465 7261 746f 7220 5249 7465 723b 3c2f terator RIter;
.
< │ │ │ │ +0001fb80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0001fb90: 6e6f 223e 2020 3930 333c 2f73 7061 6e3e no"> 903 │ │ │ │ +0001fba0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0001fbc0: 2074 7970 6564 6566 2074 7970 656e 616d typedef typenam │ │ │ │ +0001fbd0: 6520 4d3a 3a43 6f6e 7374 436f 6c49 7465 e M::ConstColIte │ │ │ │ +0001fbe0: 7261 746f 7220 4349 7465 723b 3c2f 7370 rator CIter;
.
904 < │ │ │ │ +0001fc50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +0001fca0: 3930 353c 2f73 7061 6e3e 2020 2020 2020 905 │ │ │ │ +0001fcb0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // // ca │ │ │ │ +0001fcd0: 6c63 756c 6174 6520 6564 6765 2063 6f75 lculate edge cou │ │ │ │ +0001fce0: 6e74 3c2f 7370 616e 3e3c 2f64 6976 3e0a nt
. │ │ │ │ +0001fcf0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 │ │ │ │ +0001fdb0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001fde0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 907 // if(owner │ │ │ │ +0001fe30: 5b72 6f77 2e69 6e64 6578 2829 5d3d 3d4f [row.index()]==O │ │ │ │ +0001fe40: 776e 6572 4f76 6572 6c61 7043 6f70 7941 wnerOverlapCopyA │ │ │ │ +0001fe50: 7474 7269 6275 7465 5365 743a 3a6f 776e ttributeSet::own │ │ │ │ +0001fe60: 6572 293c 2f73 7061 6e3e 3c2f 6469 763e er)
│ │ │ │ +0001fe70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0001fea0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 908 // for(CI │ │ │ │ +0001fef0: 7465 7220 656e 7472 793d 2072 6f77 2d26 ter entry= row-& │ │ │ │ +0001ff00: 6774 3b62 6567 696e 2829 2c20 656e 6465 gt;begin(), ende │ │ │ │ +0001ff10: 203d 2072 6f77 2d26 6774 3b65 6e64 2829 = row->end() │ │ │ │ +0001ff20: 3b20 656e 7472 7920 213d 2065 6e64 653b ; entry != ende; │ │ │ │ +0001ff30: 202b 2b65 6e74 7279 293c 2f73 7061 6e3e ++entry) │ │ │ │ +0001ff40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0001ff90: 2039 3039 3c2f 7370 616e 3e20 2020 2020 909 │ │ │ │ +0001ffa0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // │ │ │ │ +0001ffc0: 2020 2b2b 6564 6765 636f 756e 745b 6f77 ++edgecount[ow │ │ │ │ +0001ffd0: 6e65 725b 656e 7472 792e 696e 6465 7828 ner[entry.index( │ │ │ │ +0001ffe0: 295d 5d3b 3c2f 7370 616e 3e3c 2f64 6976 )]];
.
910< │ │ │ │ +00020040: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00020060: 3c61 2069 643d 226c 3030 3931 3122 206e 911 │ │ │ │ +000200c0: 2f2f 2073 6574 7570 2065 6467 6520 616e // setup edge an │ │ │ │ +000200d0: 6420 7765 6967 6874 2070 6174 7465 726e d weight pattern │ │ │ │ +000200e0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00020100: 3c61 2069 643d 226c 3030 3931 3222 206e 912
.
913 │ │ │ │ +000201a0: 2020 2020 2020 3c61 2063 6c61 7373 3d22 Metis::idx │ │ │ │ +00020200: 5f74 3c2f 613e 2a20 6164 6a70 3d61 646a _t* adjp=adj │ │ │ │ +00020210: 6e63 793b 3c2f 6469 763e 0a3c 6469 7620 ncy;
.
914 │ │ │ │ +00020270: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000202c0: 2039 3135 3c2f 7370 616e 3e3c 7370 616e 915#ifdef USE │ │ │ │ +000202f0: 5f57 4549 4748 5453 3c2f 7370 616e 3e3c _WEIGHTS< │ │ │ │ +00020300: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00020350: 3931 363c 2f73 7061 6e3e 2020 2020 2020 916 │ │ │ │ +00020360: 2020 7677 6774 2020 203d 203c 7370 616e vwgt = new Meti │ │ │ │ +000203e0: 733a 3a69 6478 5f74 3c2f 613e 5b31 5d3b s::idx_t[1]; │ │ │ │ +000203f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00020440: 2039 3137 3c2f 7370 616e 3e20 2020 2020 917 │ │ │ │ +00020450: 2020 2076 7767 745b 305d 3d20 3c61 2063 vwgt[0]= ma │ │ │ │ +000204b0: 743c 2f61 3e2e 4e28 293b 203c 7370 616e t.N(); // weight is nu │ │ │ │ +000204e0: 6d65 7220 6f66 2072 6f77 7320 544f 444f mer of rows TODO │ │ │ │ +000204f0: 3a20 5368 6f75 6c64 2061 6374 7561 6c6c : Should actuall │ │ │ │ +00020500: 7920 6265 2074 6865 206e 6f6e 7a65 726f y be the nonzero │ │ │ │ +00020510: 732e 3c2f 7370 616e 3e3c 2f64 6976 3e0a s.
. │ │ │ │ +00020520: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +000205b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000205c0: 6e6f 223e 2020 3931 393c 2f73 7061 6e3e no"> 919 │ │ │ │ +000205d0: 2020 2020 2020 2020 6164 6a77 6774 203d adjwgt = │ │ │ │ +000205e0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 new Metis::idx_t[noNeighbours] │ │ │ │ +00020670: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +000206c0: 2020 3932 303c 2f73 7061 6e3e 2020 2020 920 │ │ │ │ +000206d0: 2020 2020 3c61 2063 6c61 7373 3d22 636f Metis::idx_t │ │ │ │ +00020730: 3c2f 613e 2a20 6164 6a77 703d 6164 6a77 * adjwp=adjw │ │ │ │ +00020740: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
921#endif< │ │ │ │ +000207c0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +000207e0: 6120 6964 3d22 6c30 3039 3232 2220 6e61 a id="l00922" na │ │ │ │ +000207f0: 6d65 3d22 6c30 3039 3232 223e 3c2f 613e me="l00922"> │ │ │ │ +00020800: 3c73 7061 6e20 636c 6173 733d 226c 696e 922
.
923 │ │ │ │ +00020880: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +000208a0: 6f72 3c2f 7370 616e 3e28 3c73 7061 6e20 or( │ │ │ │ +000208c0: 6175 746f 3c2f 7370 616e 3e20 6e3d 206f auto n= o │ │ │ │ +000208d0: 6f63 6f6d 6d2e 3c61 2063 6c61 7373 3d22 ocomm.remoteInd │ │ │ │ +00020930: 6963 6573 3c2f 613e 2829 2e62 6567 696e ices().begin │ │ │ │ +00020940: 2829 3b20 6e20 213d 2020 6f6f 636f 6d6d (); n != oocomm │ │ │ │ +00020950: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .remoteIndices< │ │ │ │ +000209b0: 2f61 3e28 292e 656e 6428 293b 3c2f 6469 /a>().end();.
924 │ │ │ │ +00020a10: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00020a20: 2020 202b 2b6e 293c 2f64 6976 3e0a 3c64 ++n)
. │ │ │ │ +00020a40: 3c61 2069 643d 226c 3030 3932 3522 206e 925
if( │ │ │ │ +00020ab0: 6e2d 2667 743b 6669 7273 7420 213d 2072 n->first != r │ │ │ │ +00020ac0: 616e 6b29 207b 3c2f 6469 763e 0a3c 6469 ank) {
.< │ │ │ │ +00020ae0: 6120 6964 3d22 6c30 3039 3236 2220 6e61 a id="l00926" na │ │ │ │ +00020af0: 6d65 3d22 6c30 3039 3236 223e 3c2f 613e me="l00926"> │ │ │ │ +00020b00: 3c73 7061 6e20 636c 6173 733d 226c 696e 926 *ad │ │ │ │ +00020b30: 6a70 3d6e 2d26 6774 3b66 6972 7374 3b3c jp=n->first;< │ │ │ │ +00020b40: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00020b90: 3932 373c 2f73 7061 6e3e 2020 2020 2020 927 │ │ │ │ +00020ba0: 2020 2020 2020 2b2b 6164 6a70 3b3c 2f64 ++adjp;.
92 │ │ │ │ +00020c00: 383c 2f73 7061 6e3e 3c73 7061 6e20 636c 8#ifdef USE_WE │ │ │ │ +00020c30: 4947 4854 533c 2f73 7061 6e3e 3c2f 6469 IGHTS.
929 │ │ │ │ +00020c90: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00020ca0: 2020 202a 6164 6a77 703d 313b 203c 7370 *adjwp=1; //edgecount[n │ │ │ │ +00020cd0: 2d26 6774 3b66 6972 7374 5d3b 3c2f 7370 ->first];
.
930 │ │ │ │ +00020d40: 2020 2020 2020 2020 2020 2b2b 6164 6a77 ++adjw │ │ │ │ +00020d50: 703b 3c2f 6469 763e 0a3c 6469 7620 636c p;
.
931#endif
.
< │ │ │ │ +00020e10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00020e20: 6e6f 223e 2020 3933 323c 2f73 7061 6e3e no"> 932 │ │ │ │ +00020e30: 2020 2020 2020 2020 2020 7d3c 2f64 6976 }
.
933< │ │ │ │ +00020e90: 2f73 7061 6e3e 2020 2020 2020 2020 6173 /span> as │ │ │ │ +00020ea0: 7365 7274 283c 6120 636c 6173 733d 2263 sert(isValidGra │ │ │ │ +00020f00: 7068 3c2f 613e 2876 7478 6469 7374 5b72 ph(vtxdist[r │ │ │ │ +00020f10: 616e 6b2b 315d 2d76 7478 6469 7374 5b72 ank+1]-vtxdist[r │ │ │ │ +00020f20: 616e 6b5d 2c3c 2f64 6976 3e0a 3c64 6976 ank],
.
< │ │ │ │ +00020f60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00020f70: 6e6f 223e 2020 3933 343c 2f73 7061 6e3e no"> 934 │ │ │ │ +00020f80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00020f90: 2020 2020 2020 2020 2020 2020 7674 7864 vtxd │ │ │ │ +00020fa0: 6973 745b 6f6f 636f 6d6d 2e3c 6120 636c ist[oocomm.comm │ │ │ │ +00021000: 756e 6963 6174 6f72 3c2f 613e 2829 2e73 unicator().s │ │ │ │ +00021010: 697a 6528 295d 2c3c 2f64 6976 3e0a 3c64 ize()],
. │ │ │ │ +00021030: 3c61 2069 643d 226c 3030 3933 3522 206e 935 │ │ │ │ +00021080: 2020 2020 2020 2020 2020 2020 2020 6e6f no │ │ │ │ +00021090: 4e65 6967 6862 6f75 7273 2c20 7861 646a Neighbours, xadj │ │ │ │ +000210a0: 2c20 6164 6a6e 6379 2c20 3c73 7061 6e20 , adjncy, │ │ │ │ +000210c0: 6661 6c73 653c 2f73 7061 6e3e 2929 3b3c false));< │ │ │ │ +000210d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00021120: 3933 363c 2f73 7061 6e3e 203c 2f64 6976 936
.
937< │ │ │ │ +00021180: 2f73 7061 6e3e 2020 2020 2020 2020 5b5b /span> [[ │ │ │ │ +00021190: 6d61 7962 655f 756e 7573 6564 5d5d 203c maybe_unused]] < │ │ │ │ +000211a0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +000211b0: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +000211c0: 6130 3032 3635 2e68 746d 6c23 6162 3162 a00265.html#ab1b │ │ │ │ +000211d0: 3837 3965 6562 6435 6433 3237 3031 6337 879eebd5d32701c7 │ │ │ │ +000211e0: 6235 3837 3962 6265 3634 6131 3722 3e4d b5879bbe64a17">M │ │ │ │ +000211f0: 6574 6973 3a3a 6964 785f 743c 2f61 3e20 etis::idx_t │ │ │ │ +00021200: 7767 7466 6c61 673d 303b 3c2f 6469 763e wgtflag=0;
│ │ │ │ +00021210: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +000212e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000212f0: 3e3c 6120 6964 3d22 6c30 3039 3339 2220 > 939 Metis │ │ │ │ +00021390: 3a3a 6964 785f 743c 2f61 3e20 6564 6765 ::idx_t edge │ │ │ │ +000213a0: 6375 743b 3c2f 6469 763e 0a3c 6469 7620 cut;
.
940< │ │ │ │ +00021400: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00021410: 726f 6365 7373 6f72 223e 2369 6664 6566 rocessor">#ifdef │ │ │ │ +00021420: 2055 5345 5f57 4549 4748 5453 3c2f 7370 USE_WEIGHTS
.
941 │ │ │ │ +00021490: 2020 2020 2020 7767 7466 6c61 673d 333b wgtflag=3; │ │ │ │ +000214a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000214f0: 2039 3432 3c2f 7370 616e 3e3c 7370 616e 942#endif
.
943 │ │ │ │ +00021580: 2020 2020 2020 3c61 2063 6c61 7373 3d22 Metis::rea │ │ │ │ +000215e0: 6c5f 743c 2f61 3e20 2a74 7077 6774 7320 l_t *tpwgts │ │ │ │ +000215f0: 3d20 3c73 7061 6e20 636c 6173 733d 226b = new Metis::real_t │ │ │ │ +00021670: 3c2f 613e 5b6e 7061 7274 735d 3b3c 2f64 [nparts];.
94 │ │ │ │ +000216d0: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ │ +000216e0: 3c73 7061 6e20 636c 6173 733d 226b 6579 for(i │ │ │ │ +00021720: 6e74 3c2f 7370 616e 3e20 693d 303b 2069 nt i=0; i │ │ │ │ +00021730: 266c 743b 6e70 6172 7473 3b20 2b2b 6929 <nparts; ++i) │ │ │ │ +00021740: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00021790: 2039 3435 3c2f 7370 616e 3e20 2020 2020 945 │ │ │ │ +000217a0: 2020 2020 2074 7077 6774 735b 695d 3d31 tpwgts[i]=1 │ │ │ │ +000217b0: 2e30 2f6e 7061 7274 733b 3c2f 6469 763e .0/nparts;
│ │ │ │ +000217c0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000217f0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 946 MPI │ │ │ │ +00021820: 5f43 6f6d 6d20 636f 6d6d 3d6f 6f63 6f6d _Comm comm=oocom │ │ │ │ +00021830: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +00021890: 2f61 3e28 293b 3c2f 6469 763e 0a3c 6469 /a>();
.< │ │ │ │ +000218b0: 6120 6964 3d22 6c30 3039 3437 2220 6e61 a id="l00947" na │ │ │ │ +000218c0: 6d65 3d22 6c30 3039 3437 223e 3c2f 613e me="l00947"> │ │ │ │ +000218d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 947
.
948 │ │ │ │ +00021950: 2020 2020 2044 756e 653a 3a64 696e 666f Dune::dinfo │ │ │ │ +00021960: 266c 743b 266c 743b 7261 6e6b 266c 743b <<rank< │ │ │ │ +00021970: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00021990: 2671 756f 743b 2076 7478 6469 7374 3a20 " vtxdist: │ │ │ │ +000219a0: 2671 756f 743b 3c2f 7370 616e 3e3b 3c2f ";.
9 │ │ │ │ +00021a00: 3439 3c2f 7370 616e 3e20 2020 2020 2020 49 │ │ │ │ +00021a10: 203c 6120 636c 6173 733d 2263 6f64 6520 print_carray(Dune::dinfo, │ │ │ │ +00021a80: 7674 7864 6973 742c 206f 6f63 6f6d 6d2e vtxdist, oocomm. │ │ │ │ +00021a90: 3c61 2063 6c61 7373 3d22 636f 6465 2068 communicator().size()+1);.
9 │ │ │ │ +00021b50: 3530 3c2f 7370 616e 3e20 2020 2020 2020 50 │ │ │ │ +00021b60: 2044 756e 653a 3a64 696e 666f 266c 743b Dune::dinfo< │ │ │ │ +00021b70: 266c 743b 7374 643a 3a65 6e64 6c26 6c74 <std::endl< │ │ │ │ +00021b80: 3b26 6c74 3b72 616e 6b26 6c74 3b26 6c74 ;<rank<< │ │ │ │ +00021b90: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ +00021bb0: 6f74 3b20 7861 646a 3a20 2671 756f 743b ot; xadj: " │ │ │ │ +00021bc0: 3c2f 7370 616e 3e3b 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +00021bd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00021be0: 3e3c 6120 6964 3d22 6c30 3039 3531 2220 > 951 prin │ │ │ │ +00021c80: 745f 6361 7272 6179 3c2f 613e 2844 756e t_carray(Dun │ │ │ │ +00021c90: 653a 3a64 696e 666f 2c20 7861 646a 2c20 e::dinfo, xadj, │ │ │ │ +00021ca0: 3229 3b3c 2f64 6976 3e0a 3c64 6976 2063 2);
.
952 │ │ │ │ +00021d00: 2020 2020 2020 4475 6e65 3a3a 6469 6e66 Dune::dinf │ │ │ │ +00021d10: 6f26 6c74 3b26 6c74 3b73 7464 3a3a 656e o<<std::en │ │ │ │ +00021d20: 646c 266c 743b 266c 743b 7261 6e6b 266c dl<<rank&l │ │ │ │ +00021d30: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<" adjncy: │ │ │ │ +00021d60: 2026 7175 6f74 3b3c 2f73 7061 6e3e 3b3c ";< │ │ │ │ +00021d70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.. │ │ │ │ +00021e70: 3c61 2069 643d 226c 3030 3935 3422 206e 954
.
955#ifdef │ │ │ │ +00021f30: 5553 455f 5745 4947 4854 533c 2f73 7061 USE_WEIGHTS
.
956 │ │ │ │ +00021fa0: 2020 2020 2044 756e 653a 3a64 696e 666f Dune::dinfo │ │ │ │ +00021fb0: 266c 743b 266c 743b 7374 643a 3a65 6e64 <<std::end │ │ │ │ +00021fc0: 6c26 6c74 3b26 6c74 3b72 616e 6b26 6c74 l<<rank< │ │ │ │ +00021fd0: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<" vwgt: &q │ │ │ │ +00022000: 756f 743b 3c2f 7370 616e 3e3b 3c2f 6469 uot;;.
957 │ │ │ │ +00022060: 3c2f 7370 616e 3e20 2020 2020 2020 203c < │ │ │ │ +00022070: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00022080: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +00022090: 2261 3030 3234 392e 6874 6d6c 2361 3866 "a00249.html#a8f │ │ │ │ +000220a0: 6430 3765 6133 6632 3263 6234 3732 3735 d07ea3f22cb47275 │ │ │ │ +000220b0: 3835 3964 3339 6437 6264 6666 6566 223e 859d39d7bdffef"> │ │ │ │ +000220c0: 7072 696e 745f 6361 7272 6179 3c2f 613e print_carray │ │ │ │ +000220d0: 2844 756e 653a 3a64 696e 666f 2c20 7677 (Dune::dinfo, vw │ │ │ │ +000220e0: 6774 2c20 3129 3b3c 2f64 6976 3e0a 3c64 gt, 1);
. │ │ │ │ +00022100: 3c61 2069 643d 226c 3030 3935 3822 206e 958
Dune:: │ │ │ │ +00022150: 6469 6e66 6f26 6c74 3b26 6c74 3b73 7464 dinfo<<std │ │ │ │ +00022160: 3a3a 656e 646c 266c 743b 266c 743b 7261 ::endl<<ra │ │ │ │ +00022170: 6e6b 266c 743b 266c 743b 3c73 7061 6e20 nk<<" adw │ │ │ │ +000221a0: 6774 3a20 2671 756f 743b 3c2f 7370 616e gt: ";
.
959 │ │ │ │ +00022210: 2020 2020 203c 6120 636c 6173 733d 2263 print_carr │ │ │ │ +00022270: 6179 3c2f 613e 2844 756e 653a 3a64 696e ay(Dune::din │ │ │ │ +00022280: 666f 2c20 6164 6a77 6774 2c20 6e6f 4e65 fo, adjwgt, noNe │ │ │ │ +00022290: 6967 6862 6f75 7273 293b 3c2f 6469 763e ighbours);
│ │ │ │ +000222a0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000222d0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 960 │ │ │ │ +00022310: 2365 6e64 6966 3c2f 7370 616e 3e3c 2f64 #endif.
96 │ │ │ │ +00022370: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ +00022380: 4475 6e65 3a3a 6469 6e66 6f26 6c74 3b26 Dune::dinfo<& │ │ │ │ +00022390: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
96 │ │ │ │ +000223f0: 323c 2f73 7061 6e3e 2020 2020 2020 2020 2 │ │ │ │ +00022400: 6f6f 636f 6d6d 2e3c 6120 636c 6173 733d oocomm.communic │ │ │ │ +00022460: 6174 6f72 3c2f 613e 2829 2e62 6172 7269 ator().barri │ │ │ │ +00022470: 6572 2829 3b3c 2f64 6976 3e0a 3c64 6976 er();
.
< │ │ │ │ +000224b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000224c0: 6e6f 223e 2020 3936 333c 2f73 7061 6e3e no"> 963 │ │ │ │ +000224d0: 2020 2020 2020 2020 3c73 7061 6e20 636c if(verb │ │ │ │ +00022500: 6f73 6520 2661 6d70 3b26 616d 703b 206f ose && o │ │ │ │ +00022510: 6f63 6f6d 6d2e 3c61 2063 6c61 7373 3d22 ocomm.communica │ │ │ │ +00022570: 746f 723c 2f61 3e28 292e 7261 6e6b 2829 tor().rank() │ │ │ │ +00022580: 3d3d 3029 3c2f 6469 763e 0a3c 6469 7620 ==0)
.
964 │ │ │ │ +000225e0: 2020 2020 2020 2020 2073 7464 3a3a 636f std::co │ │ │ │ +000225f0: 7574 266c 743b 266c 743b 3c73 7061 6e20 ut<<"Crea │ │ │ │ +00022620: 7469 6e67 2063 6f6d 6d20 6772 6170 6820 ting comm graph │ │ │ │ +00022630: 746f 6f6b 2026 7175 6f74 3b3c 2f73 7061 took "<<time.e │ │ │ │ +00022650: 6c61 7073 6564 2829 266c 743b 266c 743b lapsed()<< │ │ │ │ +00022660: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +00022670: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000226a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 965 tim │ │ │ │ +000226d0: 652e 7265 7365 7428 293b 3c2f 6469 763e e.reset();
│ │ │ │ +000226e0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00022750: 6120 6964 3d22 6c30 3039 3637 2220 6e61 a id="l00967" na │ │ │ │ +00022760: 6d65 3d22 6c30 3039 3637 223e 3c2f 613e me="l00967"> │ │ │ │ +00022770: 3c73 7061 6e20 636c 6173 733d 226c 696e 967#ifd │ │ │ │ +000227b0: 6566 2050 4152 414c 4c45 4c5f 5041 5254 ef PARALLEL_PART │ │ │ │ +000227c0: 4954 494f 4e3c 2f73 7061 6e3e 3c2f 6469 ITION.
968 │ │ │ │ +00022820: 3c2f 7370 616e 3e20 2020 2020 2020 203c < │ │ │ │ +00022830: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00022840: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +00022850: 6130 3032 3635 2e68 746d 6c23 6138 3966 a00265.html#a89f │ │ │ │ +00022860: 6232 3165 6231 3030 3932 3937 6136 3464 b21eb1009297a64d │ │ │ │ +00022870: 6232 3530 3365 3463 6461 3231 6522 3e4d b2503e4cda21e">M │ │ │ │ +00022880: 6574 6973 3a3a 7265 616c 5f74 3c2f 613e etis::real_t │ │ │ │ +00022890: 2075 6276 6563 203d 2031 2e31 353b 3c2f ubvec = 1.15;.
9 │ │ │ │ +000228f0: 3639 3c2f 7370 616e 3e20 2020 2020 2020 69 │ │ │ │ +00022900: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int ncon=1;.
97 │ │ │ │ +00022980: 303c 2f73 7061 6e3e 2020 2020 2020 2020 0 │ │ │ │ +00022990: 3c73 7061 6e20 636c 6173 733d 226b 6579 int options[5] │ │ │ │ +000229c0: 3d7b 2030 2c31 2c31 352c 302c 307d 3b3c ={ 0,1,15,0,0};< │ │ │ │ +000229d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00022a20: 3937 313c 2f73 7061 6e3e 203c 2f64 6976 971
.
972< │ │ │ │ +00022a80: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> //========== │ │ │ │ +00022ab0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00022ac0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00022ad0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3c 2f73 =============
.
973 │ │ │ │ +00022b40: 2020 2020 2020 203c 7370 616e 2063 6c61 // │ │ │ │ +00022b60: 5061 724d 4554 4953 5f56 335f 5061 7274 ParMETIS_V3_Part │ │ │ │ +00022b70: 4b77 6179 3c2f 7370 616e 3e3c 2f64 6976 Kway
.
974< │ │ │ │ +00022bd0: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> //========== │ │ │ │ +00022c00: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00022c10: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00022c20: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3c 2f73 =============
.
975 │ │ │ │ +00022c90: 2020 2020 2020 2050 6172 4d45 5449 535f ParMETIS_ │ │ │ │ +00022ca0: 5633 5f50 6172 744b 7761 7928 7674 7864 V3_PartKway(vtxd │ │ │ │ +00022cb0: 6973 742c 2078 6164 6a2c 2061 646a 6e63 ist, xadj, adjnc │ │ │ │ +00022cc0: 792c 3c2f 6469 763e 0a3c 6469 7620 636c y,
.
976 │ │ │ │ +00022d20: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00022d30: 2020 2020 2020 2020 2020 7677 6774 2c20 vwgt, │ │ │ │ +00022d40: 6164 6a77 6774 2c20 2661 6d70 3b77 6774 adjwgt, &wgt │ │ │ │ +00022d50: 666c 6167 2c3c 2f64 6976 3e0a 3c64 6976 flag,
.
< │ │ │ │ +00022d90: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00022da0: 6e6f 223e 2020 3937 373c 2f73 7061 6e3e no"> 977 │ │ │ │ +00022db0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00022dc0: 2020 2020 2020 2020 2020 2020 2026 616d &am │ │ │ │ +00022dd0: 703b 6e75 6d66 6c61 672c 2026 616d 703b p;numflag, & │ │ │ │ +00022de0: 6e63 6f6e 2c20 2661 6d70 3b6e 7061 7274 ncon, &npart │ │ │ │ +00022df0: 732c 2074 7077 6774 732c 2026 616d 703b s, tpwgts, & │ │ │ │ +00022e00: 7562 7665 632c 206f 7074 696f 6e73 2c20 ubvec, options, │ │ │ │ +00022e10: 2661 6d70 3b65 6467 6563 7574 2c20 7061 &edgecut, pa │ │ │ │ +00022e20: 7274 2c3c 2f64 6976 3e0a 3c64 6976 2063 rt,
.
978 │ │ │ │ +00022e80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00022e90: 2020 2020 2020 2020 2020 2026 616d 703b & │ │ │ │ +00022ea0: 636f 6d6d 293b 3c2f 6469 763e 0a3c 6469 comm);
.< │ │ │ │ +00022ec0: 6120 6964 3d22 6c30 3039 3739 2220 6e61 a id="l00979" na │ │ │ │ +00022ed0: 6d65 3d22 6c30 3039 3739 223e 3c2f 613e me="l00979"> │ │ │ │ +00022ee0: 3c73 7061 6e20 636c 6173 733d 226c 696e 979 if(ver │ │ │ │ +00022f30: 626f 7365 2026 616d 703b 2661 6d70 3b20 bose && │ │ │ │ +00022f40: 6f6f 636f 6d6d 2e3c 6120 636c 6173 733d oocomm.communic │ │ │ │ +00022fa0: 6174 6f72 3c2f 613e 2829 2e72 616e 6b28 ator().rank( │ │ │ │ +00022fb0: 293d 3d30 293c 2f64 6976 3e0a 3c64 6976 )==0)
.
< │ │ │ │ +00022ff0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00023000: 6e6f 223e 2020 3938 303c 2f73 7061 6e3e no"> 980 │ │ │ │ +00023010: 2020 2020 2020 2020 2020 7374 643a 3a63 std::c │ │ │ │ +00023020: 6f75 7426 6c74 3b26 6c74 3b3c 7370 616e out<<"Par │ │ │ │ +00023050: 4d45 5449 5320 746f 6f6b 2026 7175 6f74 METIS took " │ │ │ │ +00023060: 3b3c 2f73 7061 6e3e 266c 743b 266c 743b ;<< │ │ │ │ +00023070: 7469 6d65 2e65 6c61 7073 6564 2829 266c time.elapsed()&l │ │ │ │ +00023080: 743b 266c 743b 7374 643a 3a65 6e64 6c3b t;<std::endl; │ │ │ │ +00023090: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000230e0: 2039 3831 3c2f 7370 616e 3e20 2020 2020 981 │ │ │ │ +000230f0: 2020 2074 696d 652e 7265 7365 7428 293b time.reset(); │ │ │ │ +00023100: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00023150: 2039 3832 3c2f 7370 616e 3e3c 7370 616e 982#else
.
983 │ │ │ │ +000231e0: 2020 2020 2054 696d 6572 2074 696d 6531 Timer time1 │ │ │ │ +000231f0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00023240: 2020 3938 343c 2f73 7061 6e3e 2020 2020 984 │ │ │ │ +00023250: 2020 2020 7374 643a 3a73 697a 655f 7420 std::size_t │ │ │ │ +00023260: 676e 6f65 6467 6573 3d30 3b3c 2f64 6976 gnoedges=0;
.
985< │ │ │ │ +000232c0: 2f73 7061 6e3e 2020 2020 2020 2020 3c73 /span> int* noedges = 0; │ │ │ │ +00023300: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00023350: 2039 3836 3c2f 7370 616e 3e20 2020 2020 986 │ │ │ │ +00023360: 2020 206e 6f65 6467 6573 203d 203c 7370 noedges = new int[oocomm.commu │ │ │ │ +00023410: 6e69 6361 746f 723c 2f61 3e28 292e 7369 nicator().si │ │ │ │ +00023420: 7a65 2829 5d3b 3c2f 6469 763e 0a3c 6469 ze()];
.< │ │ │ │ +00023440: 6120 6964 3d22 6c30 3039 3837 2220 6e61 a id="l00987" na │ │ │ │ +00023450: 6d65 3d22 6c30 3039 3837 223e 3c2f 613e me="l00987"> │ │ │ │ +00023460: 3c73 7061 6e20 636c 6173 733d 226c 696e 987 Dune::d │ │ │ │ +00023490: 7665 7262 266c 743b 266c 743b 3c73 7061 verb<<"no │ │ │ │ +000234c0: 4e65 6967 6862 6f75 7273 3a20 2671 756f Neighbours: &quo │ │ │ │ +000234d0: 743b 3c2f 7370 616e 3e26 6c74 3b26 6c74 t;<< │ │ │ │ +000234e0: 3b6e 6f4e 6569 6768 626f 7572 7326 6c74 ;noNeighbours< │ │ │ │ +000234f0: 3b26 6c74 3b73 7464 3a3a 656e 646c 3b3c ;<std::endl;< │ │ │ │ +00023500: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00023550: 3938 383c 2f73 7061 6e3e 2020 2020 2020 988 │ │ │ │ +00023560: 2020 3c73 7061 6e20 636c 6173 733d 2263 // gathe │ │ │ │ +00023580: 7220 6e75 6d62 6572 206f 6620 6564 6765 r number of edge │ │ │ │ +00023590: 7320 666f 7220 6561 6368 2076 6572 7465 s for each verte │ │ │ │ +000235a0: 782e 3c2f 7370 616e 3e3c 2f64 6976 3e0a x.
. │ │ │ │ +000235b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +000236f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00023700: 6e6f 223e 2020 3939 303c 2f73 7061 6e3e no"> 990 │ │ │ │ +00023710: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00023760: 2020 3939 313c 2f73 7061 6e3e 2020 2020 991 │ │ │ │ +00023770: 2020 2020 3c73 7061 6e20 636c 6173 733d if │ │ │ │ +00023790: 3c2f 7370 616e 3e28 7665 7262 6f73 6520 (verbose │ │ │ │ +000237a0: 2661 6d70 3b26 616d 703b 206f 6f63 6f6d && oocom │ │ │ │ +000237b0: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +00023810: 2f61 3e28 292e 7261 6e6b 2829 3d3d 3029 /a>().rank()==0) │ │ │ │ +00023820: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00023870: 2039 3932 3c2f 7370 616e 3e20 2020 2020 992 │ │ │ │ +00023880: 2020 2020 2073 7464 3a3a 636f 7574 266c std::cout&l │ │ │ │ +00023890: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<"Gatherin │ │ │ │ +000238c0: 6720 6e6f 6564 6765 7320 746f 6f6b 2026 g noedges took & │ │ │ │ +000238d0: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ +000238e0: 266c 743b 7469 6d65 312e 656c 6170 7365 <time1.elapse │ │ │ │ +000238f0: 6428 2926 6c74 3b26 6c74 3b73 7464 3a3a d()<<std:: │ │ │ │ +00023900: 656e 646c 3b3c 2f64 6976 3e0a 3c64 6976 endl;
.
< │ │ │ │ +00023940: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00023950: 6e6f 223e 2020 3939 333c 2f73 7061 6e3e no"> 993 │ │ │ │ +00023960: 2020 2020 2020 2020 7469 6d65 312e 7265 time1.re │ │ │ │ +00023970: 7365 7428 293b 3c2f 6469 763e 0a3c 6469 set();
.< │ │ │ │ +00023990: 6120 6964 3d22 6c30 3039 3934 2220 6e61 a id="l00994" na │ │ │ │ +000239a0: 6d65 3d22 6c30 3039 3934 223e 3c2f 613e me="l00994"> │ │ │ │ +000239b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 994
.
995 │ │ │ │ +00023a30: 2020 2020 203c 6120 636c 6173 733d 2263 Metis::idx_ │ │ │ │ +00023a90: 743c 2f61 3e20 6e6f 5665 7274 6963 6573 t noVertices │ │ │ │ +00023aa0: 203d 2076 7478 6469 7374 5b6f 6f63 6f6d = vtxdist[oocom │ │ │ │ +00023ab0: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +00023b10: 2f61 3e28 292e 7369 7a65 2829 5d3b 3c2f /a>().size()];.
9 │ │ │ │ +00023b70: 3936 3c2f 7370 616e 3e20 2020 2020 2020 96 │ │ │ │ +00023b80: 203c 6120 636c 6173 733d 2263 6f64 6520 Metis::idx_t *gxadj = 0;.
99 │ │ │ │ +00023c40: 373c 2f73 7061 6e3e 2020 2020 2020 2020 7 │ │ │ │ +00023c50: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ +00023ca0: 4d65 7469 733a 3a69 6478 5f74 3c2f 613e Metis::idx_t │ │ │ │ +00023cb0: 202a 6776 7767 7420 3d20 303b 3c2f 6469 *gvwgt = 0;.
998 │ │ │ │ +00023d10: 3c2f 7370 616e 3e20 2020 2020 2020 203c < │ │ │ │ +00023d20: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00023d30: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +00023d40: 6130 3032 3635 2e68 746d 6c23 6162 3162 a00265.html#ab1b │ │ │ │ +00023d50: 3837 3965 6562 6435 6433 3237 3031 6337 879eebd5d32701c7 │ │ │ │ +00023d60: 6235 3837 3962 6265 3634 6131 3722 3e4d b5879bbe64a17">M │ │ │ │ +00023d70: 6574 6973 3a3a 6964 785f 743c 2f61 3e20 etis::idx_t │ │ │ │ +00023d80: 2a67 6164 6a6e 6379 203d 2030 3b3c 2f64 *gadjncy = 0;.
99 │ │ │ │ +00023de0: 393c 2f73 7061 6e3e 2020 2020 2020 2020 9 │ │ │ │ +00023df0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ +00023e40: 4d65 7469 733a 3a69 6478 5f74 3c2f 613e Metis::idx_t │ │ │ │ +00023e50: 202a 6761 646a 7767 7420 3d20 303b 3c2f *gadjwgt = 0;.
10 │ │ │ │ +00023eb0: 3030 3c2f 7370 616e 3e20 2020 2020 2020 00 │ │ │ │ +00023ec0: 203c 6120 636c 6173 733d 2263 6f64 6520 Metis::idx_t *gpart = 0;.
100 │ │ │ │ +00023f80: 313c 2f73 7061 6e3e 2020 2020 2020 2020 1 │ │ │ │ +00023f90: 3c73 7061 6e20 636c 6173 733d 226b 6579 int* displ = 0; │ │ │ │ +00023fc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00024010: 3130 3032 3c2f 7370 616e 3e20 2020 2020 1002 │ │ │ │ +00024020: 2020 203c 7370 616e 2063 6c61 7373 3d22 int │ │ │ │ +00024040: 3c2f 7370 616e 3e2a 206e 6f78 7320 3d20 * noxs = │ │ │ │ +00024050: 303b 3c2f 6469 763e 0a3c 6469 7620 636c 0;
.
1003 │ │ │ │ +000240b0: 2020 2020 203c 7370 616e 2063 6c61 7373 i │ │ │ │ +000240d0: 6e74 3c2f 7370 616e 3e2a 2078 6469 7370 nt* xdisp │ │ │ │ +000240e0: 6c20 3d20 303b 2020 3c73 7061 6e20 636c l = 0; // │ │ │ │ +00024100: 2064 6973 706c 6163 656d 656e 7420 666f displacement fo │ │ │ │ +00024110: 7220 7861 646a 3c2f 7370 616e 3e3c 2f64 r xadj.
100 │ │ │ │ +00024170: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ │ +00024180: 3c73 7061 6e20 636c 6173 733d 226b 6579 int* novs = 0;< │ │ │ │ +000241b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00024200: 3030 353c 2f73 7061 6e3e 2020 2020 2020 005 │ │ │ │ +00024210: 2020 3c73 7061 6e20 636c 6173 733d 226b int< │ │ │ │ +00024230: 2f73 7061 6e3e 2a20 7664 6973 706c 3d30 /span>* vdispl=0 │ │ │ │ +00024240: 3b20 3c73 7061 6e20 636c 6173 733d 2263 ; // real │ │ │ │ +00024260: 7665 7274 6578 2064 6973 706c 6163 656d vertex displacem │ │ │ │ +00024270: 656e 743c 2f73 7061 6e3e 3c2f 6469 763e ent
│ │ │ │ +00024280: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000242b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1006 │ │ │ │ +000242f0: 2369 6664 6566 2055 5345 5f57 4549 4748 #ifdef USE_WEIGH │ │ │ │ +00024300: 5453 3c2f 7370 616e 3e3c 2f64 6976 3e0a TS
. │ │ │ │ +00024310: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +000243f0: 2031 3030 383c 2f73 7061 6e3e 3c73 7061 1008#endif
.
1009 │ │ │ │ +00024480: 2020 2020 2020 2073 7464 3a3a 7369 7a65 std::size │ │ │ │ +00024490: 5f74 2067 7861 646a 6c65 6e20 3d20 7674 _t gxadjlen = vt │ │ │ │ +000244a0: 7864 6973 745b 6f6f 636f 6d6d 2e3c 6120 xdist[oocomm.co │ │ │ │ +00024500: 6d6d 756e 6963 6174 6f72 3c2f 613e 2829 mmunicator() │ │ │ │ +00024510: 2e73 697a 6528 295d 2d76 7478 6469 7374 .size()]-vtxdist │ │ │ │ +00024520: 5b30 5d2b 6f6f 636f 6d6d 2e3c 6120 636c [0]+oocomm.comm │ │ │ │ +00024580: 756e 6963 6174 6f72 3c2f 613e 2829 2e73 unicator().s │ │ │ │ +00024590: 697a 6528 293b 3c2f 6469 763e 0a3c 6469 ize();
.< │ │ │ │ +000245b0: 6120 6964 3d22 6c30 3130 3130 2220 6e61 a id="l01010" na │ │ │ │ +000245c0: 6d65 3d22 6c30 3130 3130 223e 3c2f 613e me="l01010"> │ │ │ │ +000245d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1010
.
1011 │ │ │ │ +00024650: 2020 2020 207b 3c2f 6469 763e 0a3c 6469 {
.< │ │ │ │ +00024670: 6120 6964 3d22 6c30 3130 3132 2220 6e61 a id="l01012" na │ │ │ │ +00024680: 6d65 3d22 6c30 3130 3132 223e 3c2f 613e me="l01012"> │ │ │ │ +00024690: 3c73 7061 6e20 636c 6173 733d 226c 696e 1012 Dune: │ │ │ │ +000246c0: 3a64 696e 666f 266c 743b 266c 743b 3c73 :dinfo<<" │ │ │ │ +000246f0: 6e6f 6564 6765 733a 2026 7175 6f74 3b3c noedges: "< │ │ │ │ +00024700: 2f73 7061 6e3e 3b3c 2f64 6976 3e0a 3c64 /span>;
. │ │ │ │ +00024720: 3c61 2069 643d 226c 3031 3031 3322 206e 1013 pri │ │ │ │ +000247c0: 6e74 5f63 6172 7261 793c 2f61 3e28 4475 nt_carray(Du │ │ │ │ +000247d0: 6e65 3a3a 6469 6e66 6f2c 206e 6f65 6467 ne::dinfo, noedg │ │ │ │ +000247e0: 6573 2c20 6f6f 636f 6d6d 2e3c 6120 636c es, oocomm.comm │ │ │ │ +00024840: 756e 6963 6174 6f72 3c2f 613e 2829 2e73 unicator().s │ │ │ │ +00024850: 697a 6528 2929 3b3c 2f64 6976 3e0a 3c64 ize());
. │ │ │ │ +00024870: 3c61 2069 643d 226c 3031 3031 3422 206e 1014 Dune │ │ │ │ +000248c0: 3a3a 6469 6e66 6f26 6c74 3b26 6c74 3b73 ::dinfo<<s │ │ │ │ +000248d0: 7464 3a3a 656e 646c 3b3c 2f64 6976 3e0a td::endl;
. │ │ │ │ +000248e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00024910: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1015 di │ │ │ │ +00024940: 7370 6c20 3d20 3c73 7061 6e20 636c 6173 spl = new< │ │ │ │ +00024960: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> int[ooco │ │ │ │ +00024990: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +000249f0: 3c2f 613e 2829 2e73 697a 6528 295d 3b3c ().size()];< │ │ │ │ +00024a00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00024a50: 3031 363c 2f73 7061 6e3e 2020 2020 2020 016 │ │ │ │ +00024a60: 2020 2020 7864 6973 706c 203d 203c 7370 xdispl = new int[oocomm.commu │ │ │ │ +00024b10: 6e69 6361 746f 723c 2f61 3e28 292e 7369 nicator().si │ │ │ │ +00024b20: 7a65 2829 5d3b 3c2f 6469 763e 0a3c 6469 ze()];
.< │ │ │ │ +00024b40: 6120 6964 3d22 6c30 3130 3137 2220 6e61 a id="l01017" na │ │ │ │ +00024b50: 6d65 3d22 6c30 3130 3137 223e 3c2f 613e me="l01017"> │ │ │ │ +00024b60: 3c73 7061 6e20 636c 6173 733d 226c 696e 1017 noxs │ │ │ │ +00024b90: 3d20 3c73 7061 6e20 636c 6173 733d 226b = new int │ │ │ │ +00024bd0: 3c2f 7370 616e 3e5b 6f6f 636f 6d6d 2e3c [oocomm.< │ │ │ │ +00024be0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00024bf0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +00024c00: 2261 3031 3938 342e 6874 6d6c 2361 6164 "a01984.html#aad │ │ │ │ +00024c10: 3033 6530 3438 3135 3232 6138 3262 6330 03e0481522a82bc0 │ │ │ │ +00024c20: 6232 3132 6361 6431 6462 3736 6638 223e b212cad1db76f8"> │ │ │ │ +00024c30: 636f 6d6d 756e 6963 6174 6f72 3c2f 613e communicator │ │ │ │ +00024c40: 2829 2e73 697a 6528 295d 3b3c 2f64 6976 ().size()];
.
1018< │ │ │ │ +00024ca0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00024cb0: 7664 6973 706c 203d 203c 7370 616e 2063 vdispl = n │ │ │ │ +00024cd0: 6577 3c2f 7370 616e 3e20 3c73 7061 6e20 ew int[o │ │ │ │ +00024d00: 6f63 6f6d 6d2e 3c61 2063 6c61 7373 3d22 ocomm.communica │ │ │ │ +00024d60: 746f 723c 2f61 3e28 292e 7369 7a65 2829 tor().size() │ │ │ │ +00024d70: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
.
1019 │ │ │ │ +00024dd0: 2020 2020 2020 206e 6f76 7320 3d20 3c73 novs = new < │ │ │ │ +00024e00: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00024e10: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int[oocomm.comm │ │ │ │ +00024e80: 756e 6963 6174 6f72 3c2f 613e 2829 2e73 unicator().s │ │ │ │ +00024e90: 697a 6528 295d 3b3c 2f64 6976 3e0a 3c64 ize()];
. │ │ │ │ +00024eb0: 3c61 2069 643d 226c 3031 3032 3022 206e 1020
.
1021 │ │ │ │ +00024f50: 2020 2020 2020 2020 3c73 7061 6e20 636c for(int i=0; i < oo │ │ │ │ +00024fb0: 636f 6d6d 2e3c 6120 636c 6173 733d 2263 comm.communicat │ │ │ │ +00025010: 6f72 3c2f 613e 2829 2e73 697a 6528 293b or().size(); │ │ │ │ +00025020: 202b 2b69 2920 7b3c 2f64 6976 3e0a 3c64 ++i) {
. │ │ │ │ +00025040: 3c61 2069 643d 226c 3031 3032 3222 206e 1022 no │ │ │ │ +00025090: 7873 5b69 5d3d 7674 7864 6973 745b 692b xs[i]=vtxdist[i+ │ │ │ │ +000250a0: 315d 2d76 7478 6469 7374 5b69 5d2b 313b 1]-vtxdist[i]+1; │ │ │ │ +000250b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00025100: 3130 3233 3c2f 7370 616e 3e20 2020 2020 1023 │ │ │ │ +00025110: 2020 2020 2020 206e 6f76 735b 695d 3d76 novs[i]=v │ │ │ │ +00025120: 7478 6469 7374 5b69 2b31 5d2d 7674 7864 txdist[i+1]-vtxd │ │ │ │ +00025130: 6973 745b 695d 3b3c 2f64 6976 3e0a 3c64 ist[i];
. │ │ │ │ +00025150: 3c61 2069 643d 226c 3031 3032 3422 206e 1024 }.
102 │ │ │ │ +000251f0: 353c 2f73 7061 6e3e 203c 2f64 6976 3e0a 5
. │ │ │ │ +00025200: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00025230: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1026 Me │ │ │ │ +000252b0: 7469 733a 3a69 6478 5f74 3c2f 613e 202a tis::idx_t * │ │ │ │ +000252c0: 736f 3d20 7674 7864 6973 743b 3c2f 6469 so= vtxdist;.
1027 │ │ │ │ +00025320: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00025330: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int offset = 0 │ │ │ │ +00025360: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +000253b0: 2031 3032 383c 2f73 7061 6e3e 2020 2020 1028 │ │ │ │ +000253c0: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +000253e0: 666f 723c 2f73 7061 6e3e 283c 7370 616e for(int │ │ │ │ +00025410: 2a78 6375 7272 203d 2078 6469 7370 6c2c *xcurr = xdispl, │ │ │ │ +00025420: 202a 7663 7572 7220 3d20 7664 6973 706c *vcurr = vdispl │ │ │ │ +00025430: 2c20 2a65 6e64 3d76 6469 7370 6c2b 6f6f , *end=vdispl+oo │ │ │ │ +00025440: 636f 6d6d 2e3c 6120 636c 6173 733d 2263 comm.communicat │ │ │ │ +000254a0: 6f72 3c2f 613e 2829 2e73 697a 6528 293b or().size(); │ │ │ │ +000254b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00025500: 3130 3239 3c2f 7370 616e 3e20 2020 2020 1029 │ │ │ │ +00025510: 2020 2020 2020 2020 2076 6375 7272 213d vcurr!= │ │ │ │ +00025520: 656e 643b 202b 2b76 6375 7272 2c20 2b2b end; ++vcurr, ++ │ │ │ │ +00025530: 7863 7572 722c 202b 2b73 6f2c 202b 2b6f xcurr, ++so, ++o │ │ │ │ +00025540: 6666 7365 7429 207b 3c2f 6469 763e 0a3c ffset) {
.< │ │ │ │ +00025550: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00025560: 3e3c 6120 6964 3d22 6c30 3130 3330 2220 > 1030 * │ │ │ │ +000255b0: 7663 7572 7220 3d20 2a73 6f3b 3c2f 6469 vcurr = *so;.
1031 │ │ │ │ +00025610: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00025620: 2020 202a 7863 7572 7220 3d20 6f66 6673 *xcurr = offs │ │ │ │ +00025630: 6574 202b 202a 736f 3b3c 2f64 6976 3e0a et + *so;
. │ │ │ │ +00025640: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00025670: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1032 }< │ │ │ │ +000256a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +000256f0: 3033 333c 2f73 7061 6e3e 203c 2f64 6976 033
.
1034< │ │ │ │ +00025750: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00025760: 3c73 7061 6e20 636c 6173 733d 226b 6579 int *pdispl =di │ │ │ │ +00025790: 7370 6c3b 3c2f 6469 763e 0a3c 6469 7620 spl;
.
1035 │ │ │ │ +000257f0: 2020 2020 2020 2020 203c 7370 616e 2063 int cd │ │ │ │ +00025820: 6973 706c 203d 2030 3b3c 2f64 6976 3e0a ispl = 0;
. │ │ │ │ +00025830: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 │ │ │ │ +000258a0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000258d0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1037 < │ │ │ │ +00025900: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00025910: 6f72 6466 6c6f 7722 3e66 6f72 3c2f 7370 ordflow">for(in │ │ │ │ +00025940: 743c 2f73 7061 6e3e 202a 6375 7272 3d6e t *curr=n │ │ │ │ +00025950: 6f65 6467 6573 2c20 2a65 6e64 3d6e 6f65 oedges, *end=noe │ │ │ │ +00025960: 6467 6573 2b6f 6f63 6f6d 6d2e 3c61 2063 dges+oocomm.com │ │ │ │ +000259c0: 6d75 6e69 6361 746f 723c 2f61 3e28 292e municator(). │ │ │ │ +000259d0: 7369 7a65 2829 2d31 3b3c 2f64 6976 3e0a size()-1;
. │ │ │ │ +000259e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +00025a70: 6120 6964 3d22 6c30 3130 3339 2220 6e61 a id="l01039" na │ │ │ │ +00025a80: 6d65 3d22 6c30 3130 3339 223e 3c2f 613e me="l01039"> │ │ │ │ +00025a90: 3c73 7061 6e20 636c 6173 733d 226c 696e 1039 ++p │ │ │ │ +00025ac0: 6469 7370 6c3b 203c 7370 616e 2063 6c61 displ; // │ │ │ │ +00025ae0: 6e65 7874 2064 6973 706c 6163 656d 656e next displacemen │ │ │ │ +00025af0: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
.< │ │ │ │ +00025b00: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00025b10: 3e3c 6120 6964 3d22 6c30 3130 3430 2220 > 1040 c │ │ │ │ +00025b60: 6469 7370 6c20 2b3d 202a 6375 7272 3b20 displ += *curr; │ │ │ │ +00025b70: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // next va │ │ │ │ +00025b90: 6c75 653c 2f73 7061 6e3e 3c2f 6469 763e lue
│ │ │ │ +00025ba0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00025bd0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1041 │ │ │ │ +00025c00: 202a 7064 6973 706c 203d 2063 6469 7370 *pdispl = cdisp │ │ │ │ +00025c10: 6c3b 3c2f 6469 763e 0a3c 6469 7620 636c l;
.
1042 │ │ │ │ +00025c70: 2020 2020 2020 207d 3c2f 6469 763e 0a3c }
.< │ │ │ │ +00025c80: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00025c90: 3e3c 6120 6964 3d22 6c30 3130 3433 2220 > 1043 Dun │ │ │ │ +00025ce0: 653a 3a64 696e 666f 266c 743b 266c 743b e::dinfo<< │ │ │ │ +00025cf0: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +00025d10: 743b 6469 7370 6c3a 2026 7175 6f74 3b3c t;displ: "< │ │ │ │ +00025d20: 2f73 7061 6e3e 3b3c 2f64 6976 3e0a 3c64 /span>;
. │ │ │ │ +00025d40: 3c61 2069 643d 226c 3031 3034 3422 206e 1044 pri │ │ │ │ +00025de0: 6e74 5f63 6172 7261 793c 2f61 3e28 4475 nt_carray(Du │ │ │ │ +00025df0: 6e65 3a3a 6469 6e66 6f2c 2064 6973 706c ne::dinfo, displ │ │ │ │ +00025e00: 2c20 6f6f 636f 6d6d 2e3c 6120 636c 6173 , oocomm.commun │ │ │ │ +00025e60: 6963 6174 6f72 3c2f 613e 2829 2e73 697a icator().siz │ │ │ │ +00025e70: 6528 2929 3b3c 2f64 6976 3e0a 3c64 6976 e());
.
< │ │ │ │ +00025eb0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00025ec0: 6e6f 223e 2031 3034 353c 2f73 7061 6e3e no"> 1045 │ │ │ │ +00025ed0: 2020 2020 2020 2020 2020 4475 6e65 3a3a Dune:: │ │ │ │ +00025ee0: 6469 6e66 6f26 6c74 3b26 6c74 3b73 7464 dinfo<<std │ │ │ │ +00025ef0: 3a3a 656e 646c 3b3c 2f64 6976 3e0a 3c64 ::endl;
. │ │ │ │ +00025f10: 3c61 2069 643d 226c 3031 3034 3622 206e 1046
.
1047 │ │ │ │ +00025fb0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +00025fd0: 2063 616c 6375 6c61 7465 2067 6c6f 6261 calculate globa │ │ │ │ +00025fe0: 6c20 6e75 6d62 6572 206f 6620 6564 6765 l number of edge │ │ │ │ +00025ff0: 733c 2f73 7061 6e3e 3c2f 6469 763e 0a3c s
.< │ │ │ │ +00026000: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00026010: 3e3c 6120 6964 3d22 6c30 3130 3438 2220 > 1048 // It is bigg │ │ │ │ +00026080: 6572 2074 6861 6e20 7468 6520 6163 7475 er than the actu │ │ │ │ +00026090: 616c 206f 6e65 2061 7320 7765 2068 6162 al one as we hab │ │ │ │ +000260a0: 6520 7369 7a65 2d31 2061 6464 6974 696f e size-1 additio │ │ │ │ +000260b0: 6e61 6c20 656e 6420 656e 7472 6965 733c nal end entries< │ │ │ │ +000260c0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +000260e0: 6120 6964 3d22 6c30 3130 3439 2220 6e61 a id="l01049" na │ │ │ │ +000260f0: 6d65 3d22 6c30 3130 3439 223e 3c2f 613e me="l01049"> │ │ │ │ +00026100: 3c73 7061 6e20 636c 6173 733d 226c 696e 1049 for( │ │ │ │ +00026150: 3c73 7061 6e20 636c 6173 733d 226b 6579 int
*curr=noedg │ │ │ │ +00026180: 6573 2c20 2a65 6e64 3d6e 6f65 6467 6573 es, *end=noedges │ │ │ │ +00026190: 2b6f 6f63 6f6d 6d2e 3c61 2063 6c61 7373 +oocomm.communi │ │ │ │ +000261f0: 6361 746f 723c 2f61 3e28 292e 7369 7a65 cator().size │ │ │ │ +00026200: 2829 3b3c 2f64 6976 3e0a 3c64 6976 2063 ();
.
1050 │ │ │ │ +00026260: 2020 2020 2020 2020 2020 2020 6375 7272 curr │ │ │ │ +00026270: 213d 656e 643b 202b 2b63 7572 7229 3c2f !=end; ++curr).
10 │ │ │ │ +000262d0: 3531 3c2f 7370 616e 3e20 2020 2020 2020 51 │ │ │ │ +000262e0: 2020 2020 2067 6e6f 6564 6765 7320 2b3d gnoedges += │ │ │ │ +000262f0: 202a 6375 7272 3b3c 2f64 6976 3e0a 3c64 *curr;
. │ │ │ │ +00026310: 3c61 2069 643d 226c 3031 3035 3222 206e 1052
.
1053 │ │ │ │ +000263b0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +000263d0: 2061 6c6f 6361 7465 2067 6f62 616c 2067 alocate gobal g │ │ │ │ +000263e0: 7261 7068 3c2f 7370 616e 3e3c 2f64 6976 raph
.
1054< │ │ │ │ +00026440: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00026450: 4475 6e65 3a3a 6469 6e66 6f26 6c74 3b26 Dune::dinfo<& │ │ │ │ +00026460: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +00026480: 7175 6f74 3b67 7861 646a 6c65 6e3a 2026 quot;gxadjlen: & │ │ │ │ +00026490: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ +000264a0: 266c 743b 6778 6164 6a6c 656e 266c 743b <gxadjlen< │ │ │ │ +000264b0: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +000264d0: 2671 756f 743b 206e 6f56 6572 7469 6365 " noVertice │ │ │ │ +000264e0: 733a 2026 7175 6f74 3b3c 2f73 7061 6e3e s: " │ │ │ │ +000264f0: 266c 743b 266c 743b 6e6f 5665 7274 6963 <<noVertic │ │ │ │ +00026500: 6573 3c2f 6469 763e 0a3c 6469 7620 636c es
.
1055 │ │ │ │ +00026560: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00026570: 2020 266c 743b 266c 743b 3c73 7061 6e20 <<" gno │ │ │ │ +000265a0: 6564 6765 733a 2026 7175 6f74 3b3c 2f73 edges: "<<gnoe │ │ │ │ +000265c0: 6467 6573 266c 743b 266c 743b 7374 643a dges<<std: │ │ │ │ +000265d0: 3a65 6e64 6c3b 3c2f 6469 763e 0a3c 6469 :endl;
.< │ │ │ │ +000265f0: 6120 6964 3d22 6c30 3130 3536 2220 6e61 a id="l01056" na │ │ │ │ +00026600: 6d65 3d22 6c30 3130 3536 223e 3c2f 613e me="l01056"> │ │ │ │ +00026610: 3c73 7061 6e20 636c 6173 733d 226c 696e 1056 gxadj │ │ │ │ +00026640: 203d 203c 7370 616e 2063 6c61 7373 3d22 = new Metis::idx_t │ │ │ │ +000266c0: 3c2f 613e 5b67 7861 646a 6c65 6e5d 3b3c [gxadjlen];< │ │ │ │ +000266d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00026720: 3035 373c 2f73 7061 6e3e 2020 2020 2020 057 │ │ │ │ +00026730: 2020 2020 6770 6172 7420 3d20 3c73 7061 gpart = new Met │ │ │ │ +000267b0: 6973 3a3a 6964 785f 743c 2f61 3e5b 6e6f is::idx_t[no │ │ │ │ +000267c0: 5665 7274 6963 6573 5d3b 3c2f 6469 763e Vertices];
│ │ │ │ +000267d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00026800: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1058 │ │ │ │ +00026840: 2369 6664 6566 2055 5345 5f57 4549 4748 #ifdef USE_WEIGH │ │ │ │ +00026850: 5453 3c2f 7370 616e 3e3c 2f64 6976 3e0a TS
. │ │ │ │ +00026860: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1060 │ │ │ │ +000269b0: 2020 2020 2020 2020 2067 6164 6a77 6774 gadjwgt │ │ │ │ +000269c0: 203d 203c 7370 616e 2063 6c61 7373 3d22 = new Metis::idx_t │ │ │ │ +00026a40: 3c2f 613e 5b67 6e6f 6564 6765 735d 3b3c [gnoedges];< │ │ │ │ +00026a50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00026aa0: 3036 313c 2f73 7061 6e3e 3c73 7061 6e20 061#endif
.
1062 │ │ │ │ +00026b30: 2020 2020 2020 2067 6164 6a6e 6379 203d gadjncy = │ │ │ │ +00026b40: 203c 7370 616e 2063 6c61 7373 3d22 6b65 new Metis::idx_t[gnoedges];.
106 │ │ │ │ +00026c20: 333c 2f73 7061 6e3e 2020 2020 2020 2020 3 │ │ │ │ +00026c30: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ +00026c80: 2031 3036 343c 2f73 7061 6e3e 203c 2f64 1064 .
106 │ │ │ │ +00026ce0: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 │ │ │ │ +00026cf0: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(verbose & │ │ │ │ +00026d20: 3b26 616d 703b 206f 6f63 6f6d 6d2e 3c61 ;& oocomm.c │ │ │ │ +00026d80: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +00026d90: 292e 7261 6e6b 2829 3d3d 3029 3c2f 6469 ).rank()==0).
1066 │ │ │ │ +00026df0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00026e00: 2073 7464 3a3a 636f 7574 266c 743b 266c std::cout<&l │ │ │ │ +00026e10: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +00026e30: 756f 743b 5072 6570 6172 696e 6720 676c uot;Preparing gl │ │ │ │ +00026e40: 6f62 616c 2067 7261 7068 2074 6f6f 6b20 obal graph took │ │ │ │ +00026e50: 2671 756f 743b 3c2f 7370 616e 3e26 6c74 "< │ │ │ │ +00026e60: 3b26 6c74 3b74 696d 6531 2e65 6c61 7073 ;<time1.elaps │ │ │ │ +00026e70: 6564 2829 266c 743b 266c 743b 7374 643a ed()<<std: │ │ │ │ +00026e80: 3a65 6e64 6c3b 3c2f 6469 763e 0a3c 6469 :endl;
.< │ │ │ │ +00026ea0: 6120 6964 3d22 6c30 3130 3637 2220 6e61 a id="l01067" na │ │ │ │ +00026eb0: 6d65 3d22 6c30 3130 3637 223e 3c2f 613e me="l01067"> │ │ │ │ +00026ec0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1067 time1.r │ │ │ │ +00026ef0: 6573 6574 2829 3b3c 2f64 6976 3e0a 3c64 eset();
. │ │ │ │ +00026f10: 3c61 2069 643d 226c 3031 3036 3822 206e 1068 │ │ │ │ +00026f70: 2f2f 2043 6f6d 6d75 6e69 6361 7465 2064 // Communicate d │ │ │ │ +00026f80: 6174 613c 2f73 7061 6e3e 3c2f 6469 763e ata
│ │ │ │ +00026f90: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00027000: 6120 6964 3d22 6c30 3130 3730 2220 6e61 a id="l01070" na │ │ │ │ +00027010: 6d65 3d22 6c30 3130 3730 223e 3c2f 613e me="l01070"> │ │ │ │ +00027020: 3c73 7061 6e20 636c 6173 733d 226c 696e 1070 MPI_All │ │ │ │ +00027050: 6761 7468 6572 7628 7861 646a 2c32 2c4d gatherv(xadj,2,M │ │ │ │ +00027060: 5049 5472 6169 7473 266c 743b 4d65 7469 PITraits<Meti │ │ │ │ +00027070: 733a 3a69 6478 5f74 2667 743b 3a3a 6765 s::idx_t>::ge │ │ │ │ +00027080: 7454 7970 6528 292c 3c2f 6469 763e 0a3c tType(),
.< │ │ │ │ +00027090: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000270a0: 3e3c 6120 6964 3d22 6c30 3130 3731 2220 > 1071 │ │ │ │ +000270f0: 2020 2020 2020 2020 2020 6778 6164 6a2c gxadj, │ │ │ │ +00027100: 6e6f 7873 2c78 6469 7370 6c2c 4d50 4954 noxs,xdispl,MPIT │ │ │ │ +00027110: 7261 6974 7326 6c74 3b4d 6574 6973 3a3a raits<Metis:: │ │ │ │ +00027120: 6964 785f 7426 6774 3b3a 3a67 6574 5479 idx_t>::getTy │ │ │ │ +00027130: 7065 2829 2c3c 2f64 6976 3e0a 3c64 6976 pe(),
.
< │ │ │ │ +00027170: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00027180: 6e6f 223e 2031 3037 323c 2f73 7061 6e3e no"> 1072 │ │ │ │ +00027190: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000271a0: 2020 2020 2020 2063 6f6d 6d29 3b3c 2f64 comm);.
107 │ │ │ │ +00027200: 333c 2f73 7061 6e3e 2020 2020 2020 2020 3 │ │ │ │ +00027210: 4d50 495f 416c 6c67 6174 6865 7276 2861 MPI_Allgatherv(a │ │ │ │ +00027220: 646a 6e63 792c 6e6f 4e65 6967 6862 6f75 djncy,noNeighbou │ │ │ │ +00027230: 7273 2c4d 5049 5472 6169 7473 266c 743b rs,MPITraits< │ │ │ │ +00027240: 4d65 7469 733a 3a69 6478 5f74 2667 743b Metis::idx_t> │ │ │ │ +00027250: 3a3a 6765 7454 7970 6528 292c 3c2f 6469 ::getType(),.
1074 │ │ │ │ +000272b0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000272c0: 2020 2020 2020 2020 2020 2020 2020 6761 ga │ │ │ │ +000272d0: 646a 6e63 792c 6e6f 6564 6765 732c 6469 djncy,noedges,di │ │ │ │ +000272e0: 7370 6c2c 4d50 4954 7261 6974 7326 6c74 spl,MPITraits< │ │ │ │ +000272f0: 3b4d 6574 6973 3a3a 6964 785f 7426 6774 ;Metis::idx_t> │ │ │ │ +00027300: 3b3a 3a67 6574 5479 7065 2829 2c3c 2f64 ;::getType(),.
107 │ │ │ │ +00027360: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 │ │ │ │ +00027370: 2020 2020 2020 2020 2020 2020 2020 2063 c │ │ │ │ +00027380: 6f6d 6d29 3b3c 2f64 6976 3e0a 3c64 6976 omm);
.
< │ │ │ │ +000273c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000273d0: 6e6f 223e 2031 3037 363c 2f73 7061 6e3e no"> 1076 │ │ │ │ +000273e0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #ifde │ │ │ │ +00027400: 6620 5553 455f 5745 4947 4854 533c 2f73 f USE_WEIGHTS
.
1077 │ │ │ │ +00027470: 2020 2020 2020 204d 5049 5f41 6c6c 6761 MPI_Allga │ │ │ │ +00027480: 7468 6572 7628 6164 6a77 6774 2c6e 6f4e therv(adjwgt,noN │ │ │ │ +00027490: 6569 6768 626f 7572 732c 4d50 4954 7261 eighbours,MPITra │ │ │ │ +000274a0: 6974 7326 6c74 3b4d 6574 6973 3a3a 6964 its<Metis::id │ │ │ │ +000274b0: 785f 7426 6774 3b3a 3a67 6574 5479 7065 x_t>::getType │ │ │ │ +000274c0: 2829 2c3c 2f64 6976 3e0a 3c64 6976 2063 (),
.
1078 │ │ │ │ +00027520: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00027530: 2020 2020 2067 6164 6a77 6774 2c6e 6f65 gadjwgt,noe │ │ │ │ +00027540: 6467 6573 2c64 6973 706c 2c4d 5049 5472 dges,displ,MPITr │ │ │ │ +00027550: 6169 7473 266c 743b 4d65 7469 733a 3a69 aits<Metis::i │ │ │ │ +00027560: 6478 5f74 2667 743b 3a3a 6765 7454 7970 dx_t>::getTyp │ │ │ │ +00027570: 6528 292c 3c2f 6469 763e 0a3c 6469 7620 e(),
.
1079 │ │ │ │ +000275d0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000275e0: 2020 2020 2020 636f 6d6d 293b 3c2f 6469 comm);.
1080 │ │ │ │ +00027640: 3c2f 7370 616e 3e20 2020 2020 2020 204d M │ │ │ │ +00027650: 5049 5f41 6c6c 6761 7468 6572 7628 7677 PI_Allgatherv(vw │ │ │ │ +00027660: 6774 2c6c 6f63 616c 4e6f 5674 782c 4d50 gt,localNoVtx,MP │ │ │ │ +00027670: 4954 7261 6974 7326 6c74 3b4d 6574 6973 ITraits<Metis │ │ │ │ +00027680: 3a3a 6964 785f 7426 6774 3b3a 3a67 6574 ::idx_t>::get │ │ │ │ +00027690: 5479 7065 2829 2c3c 2f64 6976 3e0a 3c64 Type(),
. │ │ │ │ +000276b0: 3c61 2069 643d 226c 3031 3038 3122 206e 1081 │ │ │ │ +00027700: 2020 2020 2020 2020 2067 7677 6774 2c6e gvwgt,n │ │ │ │ +00027710: 6f76 732c 7664 6973 706c 2c4d 5049 5472 ovs,vdispl,MPITr │ │ │ │ +00027720: 6169 7473 266c 743b 4d65 7469 733a 3a69 aits<Metis::i │ │ │ │ +00027730: 6478 5f74 2667 743b 3a3a 6765 7454 7970 dx_t>::getTyp │ │ │ │ +00027740: 6528 292c 3c2f 6469 763e 0a3c 6469 7620 e(),
.
1082 │ │ │ │ +000277a0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000277b0: 2020 2020 2020 636f 6d6d 293b 3c2f 6469 comm);.
1083 │ │ │ │ +00027810: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #endif< │ │ │ │ +00027840: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00027890: 3038 343c 2f73 7061 6e3e 2020 2020 2020 084 │ │ │ │ +000278a0: 2020 3c73 7061 6e20 636c 6173 733d 226b if(verbose &a │ │ │ │ +000278d0: 6d70 3b26 616d 703b 206f 6f63 6f6d 6d2e mp;& oocomm. │ │ │ │ +000278e0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 communicator().rank()==0).
10 │ │ │ │ +000279a0: 3835 3c2f 7370 616e 3e20 2020 2020 2020 85 │ │ │ │ +000279b0: 2020 2073 7464 3a3a 636f 7574 266c 743b std::cout< │ │ │ │ +000279c0: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +000279e0: 2671 756f 743b 4761 7468 6572 696e 6720 "Gathering │ │ │ │ +000279f0: 676c 6f62 616c 2067 7261 7068 2064 6174 global graph dat │ │ │ │ +00027a00: 6120 746f 6f6b 2026 7175 6f74 3b3c 2f73 a took "<<time │ │ │ │ +00027a20: 312e 656c 6170 7365 6428 2926 6c74 3b26 1.elapsed()<& │ │ │ │ +00027a30: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
108 │ │ │ │ +00027a90: 363c 2f73 7061 6e3e 2020 2020 2020 2020 6 │ │ │ │ +00027aa0: 7469 6d65 312e 7265 7365 7428 293b 3c2f time1.reset();.
10 │ │ │ │ +00027b00: 3837 3c2f 7370 616e 3e20 3c2f 6469 763e 87
│ │ │ │ +00027b10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00027b40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1088 {.
10 │ │ │ │ +00027bc0: 3839 3c2f 7370 616e 3e20 2020 2020 2020 89 │ │ │ │ +00027bd0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // crea │ │ │ │ +00027bf0: 7465 2074 6865 2072 6561 6c20 6778 6164 te the real gxad │ │ │ │ +00027c00: 6a20 6172 7261 793c 2f73 7061 6e3e 3c2f j array.
10 │ │ │ │ +00027c60: 3930 3c2f 7370 616e 3e20 2020 2020 2020 90 │ │ │ │ +00027c70: 2020 203c 7370 616e 2063 6c61 7373 3d22 // i.e. │ │ │ │ +00027c90: 2073 6869 6674 2065 6e74 7269 6573 2061 shift entries a │ │ │ │ +00027ca0: 6e64 2061 6464 2064 6973 706c 6163 656d nd add displacem │ │ │ │ +00027cb0: 656e 7473 2e3c 2f73 7061 6e3e 3c2f 6469 ents..
1091 │ │ │ │ +00027d10: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00027d20: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00027d30: 3e3c 6120 6964 3d22 6c30 3130 3932 2220 > 1092 pr │ │ │ │ +00027dd0: 696e 745f 6361 7272 6179 3c2f 613e 2844 int_carray(D │ │ │ │ +00027de0: 756e 653a 3a64 696e 666f 2c20 6778 6164 une::dinfo, gxad │ │ │ │ +00027df0: 6a2c 2067 7861 646a 6c65 6e29 3b3c 2f64 j, gxadjlen);.
109 │ │ │ │ +00027e50: 333c 2f73 7061 6e3e 203c 2f64 6976 3e0a 3
. │ │ │ │ +00027e60: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00027e90: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1094 int offset = 0;.
10 │ │ │ │ +00027f40: 3935 3c2f 7370 616e 3e20 2020 2020 2020 95 │ │ │ │ +00027f50: 2020 203c 6120 636c 6173 733d 2263 6f64 Metis::idx_t< │ │ │ │ +00027fb0: 2f61 3e20 696e 6372 656d 656e 7420 3d20 /a> increment = │ │ │ │ +00027fc0: 7674 7864 6973 745b 315d 3b3c 2f64 6976 vtxdist[1];
.
1096< │ │ │ │ +00028020: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00028030: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ +00028080: 4d65 7469 733a 3a69 6478 5f74 3c2f 613e Metis::idx_t │ │ │ │ +00028090: 202a 7374 6172 743d 6778 6164 6a2b 313b *start=gxadj+1; │ │ │ │ +000280a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000280f0: 3130 3937 3c2f 7370 616e 3e20 2020 2020 1097 │ │ │ │ +00028100: 2020 2020 203c 7370 616e 2063 6c61 7373 f │ │ │ │ +00028120: 6f72 3c2f 7370 616e 3e28 3c73 7061 6e20 or(int i │ │ │ │ +00028150: 3d31 3b20 6926 6c74 3b6f 6f63 6f6d 6d2e =1; i<oocomm. │ │ │ │ +00028160: 3c61 2063 6c61 7373 3d22 636f 6465 2068 communicator().size(); ++i) │ │ │ │ +000281d0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
1098 │ │ │ │ +00028230: 2020 2020 2020 2020 206f 6666 7365 742b offset+ │ │ │ │ +00028240: 3d31 3b3c 2f64 6976 3e0a 3c64 6976 2063 =1;
.
1099 │ │ │ │ +000282a0: 2020 2020 2020 2020 2020 3c73 7061 6e20 int l │ │ │ │ +000282d0: 7072 6576 203d 2076 7478 6469 7374 5b69 prev = vtxdist[i │ │ │ │ +000282e0: 5d2d 7674 7864 6973 745b 692d 315d 3b3c ]-vtxdist[i-1];< │ │ │ │ +000282f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00028340: 3130 303c 2f73 7061 6e3e 2020 2020 2020 100 │ │ │ │ +00028350: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +00028370: 696e 743c 2f73 7061 6e3e 206c 203d 2076 int l = v │ │ │ │ +00028380: 7478 6469 7374 5b69 2b31 5d2d 7674 7864 txdist[i+1]-vtxd │ │ │ │ +00028390: 6973 745b 695d 3b3c 2f64 6976 3e0a 3c64 ist[i];
. │ │ │ │ +000283b0: 3c61 2069 643d 226c 3031 3130 3122 206e 1101 st │ │ │ │ +00028400: 6172 742b 3d6c 7072 6576 3b3c 2f64 6976 art+=lprev;
.
1102< │ │ │ │ +00028460: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00028470: 2020 6173 7365 7274 2828 7374 6172 742b assert((start+ │ │ │ │ +00028480: 6c2b 6f66 6673 6574 292d 6778 6164 6a26 l+offset)-gxadj& │ │ │ │ +00028490: 6c74 3b3d 3c73 7061 6e20 636c 6173 733d lt;=static │ │ │ │ +000284b0: 5f63 6173 7426 6c74 3b3c 2f73 7061 6e3e _cast< │ │ │ │ +000284c0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ +00028510: 4d65 7469 733a 3a69 6478 5f74 3c2f 613e Metis::idx_t │ │ │ │ +00028520: 3c73 7061 6e20 636c 6173 733d 226b 6579 >(gxadjlen));.
110 │ │ │ │ +000285a0: 333c 2f73 7061 6e3e 2020 2020 2020 2020 3 │ │ │ │ +000285b0: 2020 2020 696e 6372 656d 656e 7420 3d20 increment = │ │ │ │ +000285c0: 2a28 7374 6172 742d 3129 3b3c 2f64 6976 *(start-1);
.
1104< │ │ │ │ +00028620: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00028630: 2020 7374 643a 3a74 7261 6e73 666f 726d std::transform │ │ │ │ +00028640: 2873 7461 7274 2b6f 6666 7365 742c 2073 (start+offset, s │ │ │ │ +00028650: 7461 7274 2b6c 2b6f 6666 7365 742c 2073 tart+l+offset, s │ │ │ │ +00028660: 7461 7274 2c20 7374 643a 3a62 696e 6428 tart, std::bind( │ │ │ │ +00028670: 7374 643a 3a70 6c75 7326 6c74 3b4d 6574 std::plus<Met │ │ │ │ +00028680: 6973 3a3a 6964 785f 7426 6774 3b28 292c is::idx_t>(), │ │ │ │ +00028690: 2073 7464 3a3a 706c 6163 6568 6f6c 6465 std::placeholde │ │ │ │ +000286a0: 7273 3a3a 5f31 2c20 696e 6372 656d 656e rs::_1, incremen │ │ │ │ +000286b0: 7429 293b 3c2f 6469 763e 0a3c 6469 7620 t));
.
1105 │ │ │ │ +00028710: 2020 2020 2020 2020 207d 3c2f 6469 763e }
│ │ │ │ +00028720: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00028750: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1106 D │ │ │ │ +00028780: 756e 653a 3a64 696e 666f 266c 743b 266c une::dinfo<&l │ │ │ │ +00028790: 743b 7374 643a 3a65 6e64 6c26 6c74 3b26 t;std::endl<& │ │ │ │ +000287a0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +000287c0: 7175 6f74 3b73 6869 6674 6564 2078 6164 quot;shifted xad │ │ │ │ +000287d0: 6a3a 2671 756f 743b 3c2f 7370 616e 3e3b j:"; │ │ │ │ +000287e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00028830: 3131 3037 3c2f 7370 616e 3e20 2020 2020 1107 │ │ │ │ +00028840: 2020 2020 203c 6120 636c 6173 733d 2263 print_carr │ │ │ │ +000288a0: 6179 3c2f 613e 2844 756e 653a 3a64 696e ay(Dune::din │ │ │ │ +000288b0: 666f 2c20 6778 6164 6a2c 206e 6f56 6572 fo, gxadj, noVer │ │ │ │ +000288c0: 7469 6365 732b 3129 3b3c 2f64 6976 3e0a tices+1);
. │ │ │ │ +000288d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00028900: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1108 Du │ │ │ │ +00028930: 6e65 3a3a 6469 6e66 6f26 6c74 3b26 6c74 ne::dinfo<< │ │ │ │ +00028940: 3b73 7464 3a3a 656e 646c 266c 743b 266c ;std::endl<&l │ │ │ │ +00028950: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +00028970: 756f 743b 2067 6164 6a6e 6379 3a20 2671 uot; gadjncy: &q │ │ │ │ +00028980: 756f 743b 3c2f 7370 616e 3e3b 3c2f 6469 uot;;.
1109 │ │ │ │ +000289e0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000289f0: 203c 6120 636c 6173 733d 2263 6f64 6520 print_carray(Dune::dinfo, │ │ │ │ +00028a60: 6761 646a 6e63 792c 2067 6e6f 6564 6765 gadjncy, gnoedge │ │ │ │ +00028a70: 7329 3b3c 2f64 6976 3e0a 3c64 6976 2063 s);
.
1110#ifdef │ │ │ │ +00028af0: 5553 455f 5745 4947 4854 533c 2f73 7061 USE_WEIGHTS
.
1111 │ │ │ │ +00028b60: 2020 2020 2020 2044 756e 653a 3a64 696e Dune::din │ │ │ │ +00028b70: 666f 266c 743b 266c 743b 7374 643a 3a65 fo<<std::e │ │ │ │ +00028b80: 6e64 6c26 6c74 3b26 6c74 3b3c 7370 616e ndl<<" gv │ │ │ │ +00028bb0: 7767 743a 2026 7175 6f74 3b3c 2f73 7061 wgt: ";
.
1112 │ │ │ │ +00028c20: 2020 2020 2020 2020 3c61 2063 6c61 7373 print_c │ │ │ │ +00028c80: 6172 7261 793c 2f61 3e28 4475 6e65 3a3a array(Dune:: │ │ │ │ +00028c90: 6469 6e66 6f2c 2067 7677 6774 2c20 6e6f dinfo, gvwgt, no │ │ │ │ +00028ca0: 5665 7274 6963 6573 293b 3c2f 6469 763e Vertices);
│ │ │ │ +00028cb0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00028ce0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1113 D │ │ │ │ +00028d10: 756e 653a 3a64 696e 666f 266c 743b 266c une::dinfo<&l │ │ │ │ +00028d20: 743b 7374 643a 3a65 6e64 6c26 6c74 3b26 t;std::endl<& │ │ │ │ +00028d30: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +00028d50: 7175 6f74 3b61 646a 7767 743a 2026 7175 quot;adjwgt: &qu │ │ │ │ +00028d60: 6f74 3b3c 2f73 7061 6e3e 3b3c 2f64 6976 ot;;
.
1114< │ │ │ │ +00028dc0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00028dd0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 print_carray(Dune::dinfo, g │ │ │ │ +00028e40: 6164 6a77 6774 2c20 676e 6f65 6467 6573 adjwgt, gnoedges │ │ │ │ +00028e50: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1115 │ │ │ │ +00028eb0: 2020 2020 2020 2044 756e 653a 3a64 696e Dune::din │ │ │ │ +00028ec0: 666f 266c 743b 266c 743b 7374 643a 3a65 fo<<std::e │ │ │ │ +00028ed0: 6e64 6c3b 3c2f 6469 763e 0a3c 6469 7620 ndl;
.
1116< │ │ │ │ +00028f30: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00028f40: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor">#endif │ │ │ │ +00028f50: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00028f70: 3c61 2069 643d 226c 3031 3131 3722 206e 1117 // everything │ │ │ │ +00028fe0: 7368 6f75 6c64 2062 6520 6669 6e65 206e should be fine n │ │ │ │ +00028ff0: 6f77 2121 213c 2f73 7061 6e3e 3c2f 6469 ow!!!.
1118 │ │ │ │ +00029050: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +00029060: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if(verbose &am │ │ │ │ +00029090: 703b 2661 6d70 3b20 6f6f 636f 6d6d 2e3c p;& oocomm.< │ │ │ │ +000290a0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +000290b0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +000290c0: 2261 3031 3938 342e 6874 6d6c 2361 6164 "a01984.html#aad │ │ │ │ +000290d0: 3033 6530 3438 3135 3232 6138 3262 6330 03e0481522a82bc0 │ │ │ │ +000290e0: 6232 3132 6361 6431 6462 3736 6638 223e b212cad1db76f8"> │ │ │ │ +000290f0: 636f 6d6d 756e 6963 6174 6f72 3c2f 613e communicator │ │ │ │ +00029100: 2829 2e72 616e 6b28 293d 3d30 293c 2f64 ().rank()==0).
111 │ │ │ │ +00029160: 393c 2f73 7061 6e3e 2020 2020 2020 2020 9 │ │ │ │ +00029170: 2020 2020 7374 643a 3a63 6f75 7426 6c74 std::cout< │ │ │ │ +00029180: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<"Postproce │ │ │ │ +000291b0: 7369 6e67 2067 6c6f 6261 6c20 6772 6170 sing global grap │ │ │ │ +000291c0: 6820 6461 7461 2074 6f6f 6b20 2671 756f h data took &quo │ │ │ │ +000291d0: 743b 3c2f 7370 616e 3e26 6c74 3b26 6c74 t;<< │ │ │ │ +000291e0: 3b74 696d 6531 2e65 6c61 7073 6564 2829 ;time1.elapsed() │ │ │ │ +000291f0: 266c 743b 266c 743b 7374 643a 3a65 6e64 <<std::end │ │ │ │ +00029200: 6c3b 3c2f 6469 763e 0a3c 6469 7620 636c l;
.
1120 │ │ │ │ +00029260: 2020 2020 2020 2074 696d 6531 2e72 6573 time1.res │ │ │ │ +00029270: 6574 2829 3b3c 2f64 6976 3e0a 3c64 6976 et();
.
< │ │ │ │ +000292b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000292c0: 6e6f 223e 2031 3132 313c 2f73 7061 6e3e no"> 1121 │ │ │ │ +000292d0: 3c73 7061 6e20 636c 6173 733d 2270 7265 #ifnd │ │ │ │ +000292f0: 6566 204e 4445 4255 473c 2f73 7061 6e3e ef NDEBUG │ │ │ │ +00029300: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00029350: 3131 3232 3c2f 7370 616e 3e20 2020 2020 1122 │ │ │ │ +00029360: 2020 2020 2061 7373 6572 7428 3c61 2063 assert(isV │ │ │ │ +000293c0: 616c 6964 4772 6170 683c 2f61 3e28 6e6f alidGraph(no │ │ │ │ +000293d0: 5665 7274 6963 6573 2c20 6e6f 5665 7274 Vertices, noVert │ │ │ │ +000293e0: 6963 6573 2c20 676e 6f65 6467 6573 2c3c ices, gnoedges,< │ │ │ │ +000293f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00029440: 3132 333c 2f73 7061 6e3e 2020 2020 2020 123 │ │ │ │ +00029450: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00029460: 2020 2020 2020 2020 6778 6164 6a2c 2067 gxadj, g │ │ │ │ +00029470: 6164 6a6e 6379 2c20 3c73 7061 6e20 636c adjncy, tr │ │ │ │ +00029490: 7565 3c2f 7370 616e 3e29 293b 3c2f 6469 ue));.
1124 │ │ │ │ +000294f0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #endif< │ │ │ │ +00029520: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00029570: 3132 353c 2f73 7061 6e3e 203c 2f64 6976 125
.
1126< │ │ │ │ +000295d0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +000295e0: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(verbose & │ │ │ │ +00029610: 3b26 616d 703b 206f 6f63 6f6d 6d2e 3c61 ;& oocomm.c │ │ │ │ +00029670: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +00029680: 292e 7261 6e6b 2829 3d3d 3029 3c2f 6469 ).rank()==0).
1127 │ │ │ │ +000296e0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000296f0: 2020 2073 7464 3a3a 636f 7574 266c 743b std::cout< │ │ │ │ +00029700: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00029720: 2671 756f 743b 4372 6561 7469 6e67 2067 "Creating g │ │ │ │ +00029730: 7261 6820 6f6e 6520 3120 7072 6f63 6573 rah one 1 proces │ │ │ │ +00029740: 7320 746f 6f6b 2026 7175 6f74 3b3c 2f73 s took "<<time │ │ │ │ +00029760: 2e65 6c61 7073 6564 2829 266c 743b 266c .elapsed()<&l │ │ │ │ +00029770: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
1128 │ │ │ │ +000297d0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000297e0: 2074 696d 652e 7265 7365 7428 293b 3c2f time.reset();.
11 │ │ │ │ +00029840: 3239 3c2f 7370 616e 3e3c 7370 616e 2063 29#if METIS_VE │ │ │ │ +00029870: 525f 4d41 4a4f 5220 2667 743b 3d20 353c R_MAJOR >= 5< │ │ │ │ +00029880: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +000298a0: 6120 6964 3d22 6c30 3131 3330 2220 6e61 a id="l01130" na │ │ │ │ +000298b0: 6d65 3d22 6c30 3131 3330 223e 3c2f 613e me="l01130"> │ │ │ │ +000298c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1130 Metis │ │ │ │ +00029940: 3a3a 6964 785f 743c 2f61 3e20 6e63 6f6e ::idx_t ncon │ │ │ │ +00029950: 203d 2031 3b3c 2f64 6976 3e0a 3c64 6976 = 1;
.
< │ │ │ │ +00029990: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000299a0: 6e6f 223e 2031 3133 313c 2f73 7061 6e3e no"> 1131 │ │ │ │ +000299b0: 2020 2020 2020 2020 2020 3c61 2063 6c61 Metis: │ │ │ │ +00029a10: 3a69 6478 5f74 3c2f 613e 206d 6f70 7469 :idx_t mopti │ │ │ │ +00029a20: 6f6e 735b 4d45 5449 535f 4e4f 5054 494f ons[METIS_NOPTIO │ │ │ │ +00029a30: 4e53 5d3b 3c2f 6469 763e 0a3c 6469 7620 NS];
.
1132 │ │ │ │ +00029a90: 2020 2020 2020 2020 204d 4554 4953 5f53 METIS_S │ │ │ │ +00029aa0: 6574 4465 6661 756c 744f 7074 696f 6e73 etDefaultOptions │ │ │ │ +00029ab0: 286d 6f70 7469 6f6e 7329 3b3c 2f64 6976 (moptions);
.
1133< │ │ │ │ +00029b10: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00029b20: 6d6f 7074 696f 6e73 5b4d 4554 4953 5f4f moptions[METIS_O │ │ │ │ +00029b30: 5054 494f 4e5f 4e55 4d42 4552 494e 475d PTION_NUMBERING] │ │ │ │ +00029b40: 203d 206e 756d 666c 6167 3b3c 2f64 6976 = numflag;
.
1134< │ │ │ │ +00029ba0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00029bb0: 4d45 5449 535f 5061 7274 4772 6170 6852 METIS_PartGraphR │ │ │ │ +00029bc0: 6563 7572 7369 7665 2826 616d 703b 6e6f ecursive(&no │ │ │ │ +00029bd0: 5665 7274 6963 6573 2c20 2661 6d70 3b6e Vertices, &n │ │ │ │ +00029be0: 636f 6e2c 2067 7861 646a 2c20 6761 646a con, gxadj, gadj │ │ │ │ +00029bf0: 6e63 792c 2067 7677 6774 2c20 4e55 4c4c ncy, gvwgt, NULL │ │ │ │ +00029c00: 2c20 6761 646a 7767 742c 3c2f 6469 763e , gadjwgt,
│ │ │ │ +00029c10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00029c40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1135 │ │ │ │ +00029c70: 2020 2020 2020 2020 2020 2020 2020 2661 &a │ │ │ │ +00029c80: 6d70 3b6e 7061 7274 732c 204e 554c 4c2c mp;nparts, NULL, │ │ │ │ +00029c90: 204e 554c 4c2c 206d 6f70 7469 6f6e 732c NULL, moptions, │ │ │ │ +00029ca0: 2026 616d 703b 6564 6765 6375 742c 2067 &edgecut, g │ │ │ │ +00029cb0: 7061 7274 293b 3c2f 6469 763e 0a3c 6469 part);
.< │ │ │ │ +00029cd0: 6120 6964 3d22 6c30 3131 3336 2220 6e61 a id="l01136" na │ │ │ │ +00029ce0: 6d65 3d22 6c30 3131 3336 223e 3c2f 613e me="l01136"> │ │ │ │ +00029cf0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1136#els │ │ │ │ +00029d30: 653c 2f73 7061 6e3e 3c2f 6469 763e 0a3c e
.< │ │ │ │ +00029d40: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00029d50: 3e3c 6120 6964 3d22 6c30 3131 3337 2220 > 1137 int options[5] = { │ │ │ │ +00029dd0: 302c 2031 2c20 312c 2033 2c20 337d 3b3c 0, 1, 1, 3, 3};< │ │ │ │ +00029de0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00029e30: 3133 383c 2f73 7061 6e3e 2020 2020 2020 138 │ │ │ │ +00029e40: 2020 2020 3c73 7061 6e20 636c 6173 733d // Cal │ │ │ │ +00029e60: 6c20 6d65 7469 733c 2f73 7061 6e3e 3c2f l metis.
11 │ │ │ │ +00029ec0: 3339 3c2f 7370 616e 3e20 2020 2020 2020 39 │ │ │ │ +00029ed0: 2020 204d 4554 4953 5f50 6172 7447 7261 METIS_PartGra │ │ │ │ +00029ee0: 7068 5265 6375 7273 6976 6528 2661 6d70 phRecursive(& │ │ │ │ +00029ef0: 3b6e 6f56 6572 7469 6365 732c 2067 7861 ;noVertices, gxa │ │ │ │ +00029f00: 646a 2c20 6761 646a 6e63 792c 2067 7677 dj, gadjncy, gvw │ │ │ │ +00029f10: 6774 2c20 6761 646a 7767 742c 2026 616d gt, gadjwgt, &am │ │ │ │ +00029f20: 703b 7767 7466 6c61 672c 3c2f 6469 763e p;wgtflag,
│ │ │ │ +00029f30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00029f60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1140 │ │ │ │ +00029f90: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00029fa0: 2020 2020 2020 2020 2661 6d70 3b6e 756d &num │ │ │ │ +00029fb0: 666c 6167 2c20 2661 6d70 3b6e 7061 7274 flag, &npart │ │ │ │ +00029fc0: 732c 206f 7074 696f 6e73 2c20 2661 6d70 s, options, & │ │ │ │ +00029fd0: 3b65 6467 6563 7574 2c20 6770 6172 7429 ;edgecut, gpart) │ │ │ │ +00029fe0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0002a030: 2031 3134 313c 2f73 7061 6e3e 3c73 7061 1141#endif
.
1142 │ │ │ │ +0002a0c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002a110: 3131 3433 3c2f 7370 616e 3e20 2020 2020 1143 │ │ │ │ +0002a120: 2020 2020 203c 7370 616e 2063 6c61 7373 i │ │ │ │ +0002a140: 663c 2f73 7061 6e3e 2876 6572 626f 7365 f(verbose │ │ │ │ +0002a150: 2026 616d 703b 2661 6d70 3b20 6f6f 636f && ooco │ │ │ │ +0002a160: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +0002a1c0: 3c2f 613e 2829 2e72 616e 6b28 293d 3d30 ().rank()==0 │ │ │ │ +0002a1d0: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +0002a220: 2031 3134 343c 2f73 7061 6e3e 2020 2020 1144 │ │ │ │ +0002a230: 2020 2020 2020 2020 7374 643a 3a63 6f75 std::cou │ │ │ │ +0002a240: 7426 6c74 3b26 6c74 3b3c 7370 616e 2063 t<<"METIS │ │ │ │ +0002a270: 2074 6f6f 6b20 2671 756f 743b 3c2f 7370 took "<<time. │ │ │ │ +0002a290: 656c 6170 7365 6428 2926 6c74 3b26 6c74 elapsed()<< │ │ │ │ +0002a2a0: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
1145< │ │ │ │ +0002a300: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0002a310: 7469 6d65 2e72 6573 6574 2829 3b3c 2f64 time.reset();.
114 │ │ │ │ +0002a370: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
. │ │ │ │ +0002a380: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +0002a450: 3c61 2069 643d 226c 3031 3134 3822 206e 1148 pri │ │ │ │ +0002a4f0: 6e74 5f63 6172 7261 793c 2f61 3e28 4475 nt_carray(Du │ │ │ │ +0002a500: 6e65 3a3a 6469 6e66 6f2c 2067 7061 7274 ne::dinfo, gpart │ │ │ │ +0002a510: 2c20 6e6f 5665 7274 6963 6573 293b 3c2f , noVertices);.
11 │ │ │ │ +0002a570: 3439 3c2f 7370 616e 3e20 3c2f 6469 763e 49
│ │ │ │ +0002a580: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002a5b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1150 < │ │ │ │ +0002a5e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0002a5f0: 6f72 6422 3e64 656c 6574 653c 2f73 7061 ord">delete[] gxadj;
.
1151< │ │ │ │ +0002a660: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0002a670: 3c73 7061 6e20 636c 6173 733d 226b 6579 delete[] gadjncy;.
11 │ │ │ │ +0002a6f0: 3532 3c2f 7370 616e 3e3c 7370 616e 2063 52#ifdef USE_W │ │ │ │ +0002a720: 4549 4748 5453 3c2f 7370 616e 3e3c 2f64 EIGHTS.
115 │ │ │ │ +0002a780: 333c 2f73 7061 6e3e 2020 2020 2020 2020 3 │ │ │ │ +0002a790: 2020 3c73 7061 6e20 636c 6173 733d 226b delete[] gvwgt;.
11 │ │ │ │ +0002a810: 3534 3c2f 7370 616e 3e20 2020 2020 2020 54 │ │ │ │ +0002a820: 2020 203c 7370 616e 2063 6c61 7373 3d22 delete< │ │ │ │ +0002a840: 2f73 7061 6e3e 5b5d 2067 6164 6a77 6774 /span>[] gadjwgt │ │ │ │ +0002a850: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0002a8a0: 2031 3135 353c 2f73 7061 6e3e 3c73 7061 1155#endif
.
1156 │ │ │ │ +0002a930: 2020 2020 2020 207d 3c2f 6469 763e 0a3c }
.< │ │ │ │ +0002a940: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002a950: 3e3c 6120 6964 3d22 6c30 3131 3537 2220 > 1157 // Scatter resu │ │ │ │ +0002a9c0: 6c74 3c2f 7370 616e 3e3c 2f64 6976 3e0a lt
. │ │ │ │ +0002a9d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
1159 │ │ │ │ +0002aad0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0002aae0: 2020 204d 5049 5472 6169 7473 266c 743b MPITraits< │ │ │ │ +0002aaf0: 4d65 7469 733a 3a69 6478 5f74 2667 743b Metis::idx_t> │ │ │ │ +0002ab00: 3a3a 6765 7454 7970 6528 292c 2030 2c20 ::getType(), 0, │ │ │ │ +0002ab10: 636f 6d6d 293b 3c2f 6469 763e 0a3c 6469 comm);
.< │ │ │ │ +0002ab30: 6120 6964 3d22 6c30 3131 3630 2220 6e61 a id="l01160" na │ │ │ │ +0002ab40: 6d65 3d22 6c30 3131 3630 223e 3c2f 613e me="l01160"> │ │ │ │ +0002ab50: 3c73 7061 6e20 636c 6173 733d 226c 696e 1160
.
1161 │ │ │ │ +0002abd0: 2020 2020 207b 3c2f 6469 763e 0a3c 6469 {
.< │ │ │ │ +0002abf0: 6120 6964 3d22 6c30 3131 3632 2220 6e61 a id="l01162" na │ │ │ │ +0002ac00: 6d65 3d22 6c30 3131 3632 223e 3c2f 613e me="l01162"> │ │ │ │ +0002ac10: 3c73 7061 6e20 636c 6173 733d 226c 696e 1162 // release rema │ │ │ │ +0002ac60: 696e 696e 6720 6d65 6d6f 7279 3c2f 7370 ining memory
.
1163 │ │ │ │ +0002acd0: 2020 2020 2020 2020 3c73 7061 6e20 636c de │ │ │ │ +0002acf0: 6c65 7465 3c2f 7370 616e 3e5b 5d20 6770 lete[] gp │ │ │ │ +0002ad00: 6172 743b 3c2f 6469 763e 0a3c 6469 7620 art;
.
1164 │ │ │ │ +0002ad60: 2020 2020 2020 2020 203c 7370 616e 2063 d │ │ │ │ +0002ad80: 656c 6574 653c 2f73 7061 6e3e 5b5d 206e elete[] n │ │ │ │ +0002ad90: 6f65 6467 6573 3b3c 2f64 6976 3e0a 3c64 oedges;
. │ │ │ │ +0002adb0: 3c61 2069 643d 226c 3031 3136 3522 206e 1165 delete[ │ │ │ │ +0002ae20: 5d20 6469 7370 6c3b 3c2f 6469 763e 0a3c ] displ;
.< │ │ │ │ +0002ae30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002ae40: 3e3c 6120 6964 3d22 6c30 3131 3636 2220 > 1166 }.
1167 │ │ │ │ +0002aee0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +0002aef0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002af00: 3e3c 6120 6964 3d22 6c30 3131 3638 2220 > 1168
.
1169< │ │ │ │ +0002afa0: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +0002afb0: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor">#endif │ │ │ │ +0002afc0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0002afe0: 3c61 2069 643d 226c 3031 3137 3022 206e 1170 │ │ │ │ +0002b040: 6465 6c65 7465 3c2f 7370 616e 3e5b 5d20 delete[] │ │ │ │ +0002b050: 7861 646a 3b3c 2f64 6976 3e0a 3c64 6976 xadj;
.
< │ │ │ │ +0002b090: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002b0a0: 6e6f 223e 2031 3137 313c 2f73 7061 6e3e no"> 1171 │ │ │ │ +0002b0b0: 2020 2020 2020 2020 3c73 7061 6e20 636c de │ │ │ │ +0002b0d0: 6c65 7465 3c2f 7370 616e 3e5b 5d20 7674 lete[] vt │ │ │ │ +0002b0e0: 7864 6973 743b 3c2f 6469 763e 0a3c 6469 xdist;
.< │ │ │ │ +0002b100: 6120 6964 3d22 6c30 3131 3732 2220 6e61 a id="l01172" na │ │ │ │ +0002b110: 6d65 3d22 6c30 3131 3732 223e 3c2f 613e me="l01172"> │ │ │ │ +0002b120: 3c73 7061 6e20 636c 6173 733d 226c 696e 1172 d │ │ │ │ +0002b160: 656c 6574 653c 2f73 7061 6e3e 5b5d 2061 elete[] a │ │ │ │ +0002b170: 646a 6e63 793b 3c2f 6469 763e 0a3c 6469 djncy;
.< │ │ │ │ +0002b190: 6120 6964 3d22 6c30 3131 3733 2220 6e61 a id="l01173" na │ │ │ │ +0002b1a0: 6d65 3d22 6c30 3131 3733 223e 3c2f 613e me="l01173"> │ │ │ │ +0002b1b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1173#ifd │ │ │ │ +0002b1f0: 6566 2055 5345 5f57 4549 4748 5453 3c2f ef USE_WEIGHTS
.
< │ │ │ │ +0002b240: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002b250: 6e6f 223e 2031 3137 343c 2f73 7061 6e3e no"> 1174 │ │ │ │ +0002b260: 2020 2020 2020 2020 3c73 7061 6e20 636c de │ │ │ │ +0002b280: 6c65 7465 3c2f 7370 616e 3e5b 5d20 7677 lete[] vw │ │ │ │ +0002b290: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
1175 │ │ │ │ +0002b2f0: 2020 2020 2020 3c73 7061 6e20 636c 6173 dele │ │ │ │ +0002b310: 7465 3c2f 7370 616e 3e5b 5d20 6164 6a77 te[] adjw │ │ │ │ +0002b320: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
1176#endif< │ │ │ │ +0002b3a0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0002b3c0: 6120 6964 3d22 6c30 3131 3737 2220 6e61 a id="l01177" na │ │ │ │ +0002b3d0: 6d65 3d22 6c30 3131 3737 223e 3c2f 613e me="l01177"> │ │ │ │ +0002b3e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1177 d │ │ │ │ +0002b420: 656c 6574 653c 2f73 7061 6e3e 5b5d 2074 elete[] t │ │ │ │ +0002b430: 7077 6774 733b 3c2f 6469 763e 0a3c 6469 pwgts;
.< │ │ │ │ +0002b450: 6120 6964 3d22 6c30 3131 3738 2220 6e61 a id="l01178" na │ │ │ │ +0002b460: 6d65 3d22 6c30 3131 3738 223e 3c2f 613e me="l01178"> │ │ │ │ +0002b470: 3c73 7061 6e20 636c 6173 733d 226c 696e 1178 }
.< │ │ │ │ +0002b4a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002b4b0: 3e3c 6120 6964 3d22 6c30 3131 3739 2220 > 1179 }else{.
11 │ │ │ │ +0002b570: 3830 3c2f 7370 616e 3e20 2020 2020 2070 80 p │ │ │ │ +0002b580: 6172 745b 305d 3d30 3b3c 2f64 6976 3e0a art[0]=0;
. │ │ │ │ +0002b590: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +0002b5f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0002b620: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1182# │ │ │ │ +0002b660: 656e 6469 663c 2f73 7061 6e3e 3c2f 6469 endif.
1183 │ │ │ │ +0002b6c0: 3c2f 7370 616e 3e20 2020 2044 756e 653a Dune: │ │ │ │ +0002b6d0: 3a64 696e 666f 266c 743b 266c 743b 3c73 :dinfo<<" │ │ │ │ +0002b700: 2072 6570 6172 7420 2671 756f 743b 3c2f repart "<<ran │ │ │ │ +0002b720: 6b20 266c 743b 266c 743b 3c73 7061 6e20 k <<" -&g │ │ │ │ +0002b750: 743b 2026 7175 6f74 3b3c 2f73 7061 6e3e t; " │ │ │ │ +0002b760: 266c 743b 266c 743b 2070 6172 745b 305d << part[0] │ │ │ │ +0002b770: 266c 743b 266c 743b 7374 643a 3a65 6e64 <<std::end │ │ │ │ +0002b780: 6c3b 3c2f 6469 763e 0a3c 6469 7620 636c l;
.
1184 .
11 │ │ │ │ +0002b830: 3835 3c2f 7370 616e 3e20 2020 2073 7464 85 std │ │ │ │ +0002b840: 3a3a 7665 6374 6f72 266c 743b 696e 7426 ::vector<int& │ │ │ │ +0002b850: 6774 3b20 7265 616c 7061 7274 283c 6120 gt; realpart(m │ │ │ │ +0002b8b0: 6174 3c2f 613e 2e4e 2829 2c20 7061 7274 at.N(), part │ │ │ │ +0002b8c0: 5b30 5d29 3b3c 2f64 6976 3e0a 3c64 6976 [0]);
.
< │ │ │ │ +0002b900: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002b910: 6e6f 223e 2031 3138 363c 2f73 7061 6e3e no"> 1186 │ │ │ │ +0002b920: 2020 2020 3c73 7061 6e20 636c 6173 733d delete │ │ │ │ +0002b940: 3c2f 7370 616e 3e5b 5d20 7061 7274 3b3c [] part;< │ │ │ │ +0002b950: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002b9a0: 3138 373c 2f73 7061 6e3e 203c 2f64 6976 187
.
1188< │ │ │ │ +0002ba00: 2f73 7061 6e3e 2020 2020 6f6f 636f 6d6d /span> oocomm │ │ │ │ +0002ba10: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .copyOwnerToAll │ │ │ │ +0002ba70: 3c2f 613e 2872 6561 6c70 6172 742c 2072 (realpart, r │ │ │ │ +0002ba80: 6561 6c70 6172 7429 3b3c 2f64 6976 3e0a ealpart);
. │ │ │ │ +0002ba90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0002bb20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002bb30: 6e6f 223e 2031 3139 303c 2f73 7061 6e3e no"> 1190 │ │ │ │ +0002bb40: 2020 2020 3c73 7061 6e20 636c 6173 733d if │ │ │ │ +0002bb60: 3c2f 7370 616e 3e28 7665 7262 6f73 6520 (verbose │ │ │ │ +0002bb70: 2661 6d70 3b26 616d 703b 206f 6f63 6f6d && oocom │ │ │ │ +0002bb80: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +0002bbe0: 2f61 3e28 292e 7261 6e6b 2829 3d3d 3029 /a>().rank()==0) │ │ │ │ +0002bbf0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002bc40: 3131 3931 3c2f 7370 616e 3e20 2020 2020 1191 │ │ │ │ +0002bc50: 2073 7464 3a3a 636f 7574 266c 743b 266c std::cout<&l │ │ │ │ +0002bc60: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +0002bc80: 756f 743b 5363 6174 7465 7269 6e67 2072 uot;Scattering r │ │ │ │ +0002bc90: 6570 6172 7469 7469 6f6e 696e 6720 746f epartitioning to │ │ │ │ +0002bca0: 6f6b 2026 7175 6f74 3b3c 2f73 7061 6e3e ok " │ │ │ │ +0002bcb0: 266c 743b 266c 743b 7469 6d65 2e65 6c61 <<time.ela │ │ │ │ +0002bcc0: 7073 6564 2829 266c 743b 266c 743b 7374 psed()<<st │ │ │ │ +0002bcd0: 643a 3a65 6e64 6c3b 3c2f 6469 763e 0a3c d::endl;
.< │ │ │ │ +0002bce0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002bcf0: 3e3c 6120 6964 3d22 6c30 3131 3932 2220 > 1192 time.rese │ │ │ │ +0002bd40: 7428 293b 3c2f 6469 763e 0a3c 6469 7620 t();
.
1193 │ │ │ │ +0002bda0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002bdf0: 3131 3934 3c2f 7370 616e 3e20 3c2f 6469 1194 .
1195 │ │ │ │ +0002be50: 3c2f 7370 616e 3e20 2020 206f 6f63 6f6d oocom │ │ │ │ +0002be60: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.buildGlobalLo │ │ │ │ +0002bec0: 6f6b 7570 3c2f 613e 283c 6120 636c 6173 okup(mat.N());
.< │ │ │ │ +0002bf30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002bf40: 3e3c 6120 6964 3d22 6c30 3131 3936 2220 > 1196 Dune::Amg::Ma │ │ │ │ +0002bfc0: 7472 6978 4772 6170 6826 6c74 3b4d 2667 trixGraph<M&g │ │ │ │ +0002bfd0: 743b 3c2f 613e 2067 7261 7068 283c 7370 t; graph(const_cast< │ │ │ │ +0002c000: 3b3c 2f73 7061 6e3e 4d26 616d 703b 3c73 ;M&>( │ │ │ │ +0002c030: 3c61 2063 6c61 7373 3d22 636f 6465 2068 mat));.
1197 │ │ │ │ +0002c0e0: 3c2f 7370 616e 3e20 2020 203c 6120 636c fill │ │ │ │ +0002c140: 496e 6465 7853 6574 486f 6c65 733c 2f61 IndexSetHoles(graph, oocomm) │ │ │ │ +0002c160: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0002c1b0: 2031 3139 383c 2f73 7061 6e3e 2020 2020 1198 │ │ │ │ +0002c1c0: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(verbose & │ │ │ │ +0002c1f0: 3b26 616d 703b 206f 6f63 6f6d 6d2e 3c61 ;& oocomm.c │ │ │ │ +0002c250: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +0002c260: 292e 7261 6e6b 2829 3d3d 3029 3c2f 6469 ).rank()==0).
1199 │ │ │ │ +0002c2c0: 3c2f 7370 616e 3e20 2020 2020 2073 7464 std │ │ │ │ +0002c2d0: 3a3a 636f 7574 266c 743b 266c 743b 3c73 ::cout<<" │ │ │ │ +0002c300: 4669 6c6c 696e 6720 696e 6465 7820 7365 Filling index se │ │ │ │ +0002c310: 7420 746f 6f6b 2026 7175 6f74 3b3c 2f73 t took "<<time │ │ │ │ +0002c330: 2e65 6c61 7073 6564 2829 266c 743b 266c .elapsed()<&l │ │ │ │ +0002c340: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
1200 │ │ │ │ +0002c3a0: 3c2f 7370 616e 3e20 2020 2074 696d 652e time. │ │ │ │ +0002c3b0: 7265 7365 7428 293b 3c2f 6469 763e 0a3c reset();
.< │ │ │ │ +0002c3c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002c3d0: 3e3c 6120 6964 3d22 6c30 3132 3031 2220 > 1201
.
1202 │ │ │ │ +0002c470: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +0002c490: 2f73 7061 6e3e 2876 6572 626f 7365 2920 /span>(verbose) │ │ │ │ +0002c4a0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +0002c4f0: 2031 3230 333c 2f73 7061 6e3e 2020 2020 1203 │ │ │ │ +0002c500: 2020 3c73 7061 6e20 636c 6173 733d 226b int< │ │ │ │ +0002c520: 2f73 7061 6e3e 206e 6f4e 6569 6768 626f /span> noNeighbo │ │ │ │ +0002c530: 7572 733d 6f6f 636f 6d6d 2e3c 6120 636c urs=oocomm.remo │ │ │ │ +0002c590: 7465 496e 6469 6365 733c 2f61 3e28 292e teIndices(). │ │ │ │ +0002c5a0: 6e65 6967 6862 6f75 7273 2829 3b3c 2f64 neighbours();.
120 │ │ │ │ +0002c600: 343c 2f73 7061 6e3e 2020 2020 2020 6e6f 4 no │ │ │ │ +0002c610: 4e65 6967 6862 6f75 7273 203d 206f 6f63 Neighbours = ooc │ │ │ │ +0002c620: 6f6d 6d2e 3c61 2063 6c61 7373 3d22 636f omm.communicato │ │ │ │ +0002c680: 723c 2f61 3e28 292e 7375 6d28 6e6f 4e65 r().sum(noNe │ │ │ │ +0002c690: 6967 6862 6f75 7273 293c 2f64 6976 3e0a ighbours)
. │ │ │ │ +0002c6a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0002c6d0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1205 │ │ │ │ +0002c700: 2020 2020 2020 2020 202f 206f 6f63 6f6d / oocom │ │ │ │ +0002c710: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +0002c770: 2f61 3e28 292e 7369 7a65 2829 3b3c 2f64 /a>().size();.
120 │ │ │ │ +0002c7d0: 363c 2f73 7061 6e3e 2020 2020 2020 3c73 6 if(oocomm.commun │ │ │ │ +0002c860: 6963 6174 6f72 3c2f 613e 2829 2e72 616e icator().ran │ │ │ │ +0002c870: 6b28 293d 3d30 293c 2f64 6976 3e0a 3c64 k()==0)
. │ │ │ │ +0002c890: 3c61 2069 643d 226c 3031 3230 3722 206e 1207 std::c │ │ │ │ +0002c8e0: 6f75 7426 6c74 3b26 6c74 3b3c 7370 616e out<<"Ave │ │ │ │ +0002c910: 7261 6765 206e 6f20 6e65 6967 6862 6f75 rage no neighbou │ │ │ │ +0002c920: 7273 2077 6173 2026 7175 6f74 3b3c 2f73 rs was "<<noNe │ │ │ │ +0002c940: 6967 6862 6f75 7273 266c 743b 266c 743b ighbours<< │ │ │ │ +0002c950: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +0002c960: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +0002c9c0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002c9f0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1209 bool r │ │ │ │ +0002ca40: 6574 203d 203c 6120 636c 6173 733d 2263 et = buildCommu │ │ │ │ +0002caa0: 6e69 6361 7469 6f6e 3c2f 613e 2867 7261 nication(gra │ │ │ │ +0002cab0: 7068 2c20 7265 616c 7061 7274 2c20 6f6f ph, realpart, oo │ │ │ │ +0002cac0: 636f 6d6d 2c20 6f75 7463 6f6d 6d2c 2072 comm, outcomm, r │ │ │ │ +0002cad0: 6564 6973 7449 6e66 2c3c 2f64 6976 3e0a edistInf,
. │ │ │ │ +0002cae0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0002cb10: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1210 │ │ │ │ +0002cb40: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0002cb50: 2020 2020 2020 7665 7262 6f73 6529 3b3c verbose);< │ │ │ │ +0002cb60: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002cbb0: 3231 313c 2f73 7061 6e3e 2020 2020 3c73 211 if(verbose && │ │ │ │ +0002cbf0: 616d 703b 206f 6f63 6f6d 6d2e 3c61 2063 amp; oocomm.com │ │ │ │ +0002cc50: 6d75 6e69 6361 746f 723c 2f61 3e28 292e municator(). │ │ │ │ +0002cc60: 7261 6e6b 2829 3d3d 3029 3c2f 6469 763e rank()==0)
│ │ │ │ +0002cc70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002cca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1212 std:: │ │ │ │ +0002ccd0: 636f 7574 266c 743b 266c 743b 3c73 7061 cout<<"Bu │ │ │ │ +0002cd00: 696c 6469 6e67 2069 6e64 6578 2073 6574 ilding index set │ │ │ │ +0002cd10: 7320 746f 6f6b 2026 7175 6f74 3b3c 2f73 s took "<<time │ │ │ │ +0002cd30: 2e65 6c61 7073 6564 2829 266c 743b 266c .elapsed()<&l │ │ │ │ +0002cd40: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
1213 │ │ │ │ +0002cda0: 3c2f 7370 616e 3e20 2020 2074 696d 652e time. │ │ │ │ +0002cdb0: 7265 7365 7428 293b 3c2f 6469 763e 0a3c reset();
.< │ │ │ │ +0002cdc0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002cdd0: 3e3c 6120 6964 3d22 6c30 3132 3134 2220 > 1214
.
1215 │ │ │ │ +0002ce70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002cec0: 3132 3136 3c2f 7370 616e 3e20 2020 203c 1216 < │ │ │ │ +0002ced0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0002cee0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ │ +0002cef0: 2f73 7061 6e3e 2072 6574 3b3c 2f64 6976 /span> ret;
.
1217< │ │ │ │ +0002cf50: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +0002cf70: 3c61 2069 643d 226c 3031 3231 3822 206e 1218 }
..
1219 │ │ │ │ +0002d010: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +0002d020: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002d030: 3e3c 6120 6964 3d22 6c30 3132 3334 2220 > 1234 templ │ │ │ │ +0002d090: 6174 653c 2f73 7061 6e3e 266c 743b 3c73 ate<class │ │ │ │ +0002d0c0: 2047 2c20 3c73 7061 6e20 636c 6173 733d G, class< │ │ │ │ +0002d0e0: 2f73 7061 6e3e 2054 312c 203c 7370 616e /span> T1, class T2 │ │ │ │ +0002d110: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
.
│ │ │ │ +0002d160: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
1236 │ │ │ │ +0002d3f0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0002d400: 2020 2020 2020 7374 643a 3a73 6861 7265 std::share │ │ │ │ +0002d410: 645f 7074 7226 6c74 3b3c 6120 636c 6173 d_ptr<Dune::Owner │ │ │ │ +0002d450: 4f76 6572 6c61 7043 6f70 7943 6f6d 6d75 OverlapCopyCommu │ │ │ │ +0002d460: 6e69 6361 7469 6f6e 266c 743b 5431 2c54 nication<T1,T │ │ │ │ +0002d470: 3226 6774 3b3c 2f61 3e26 6774 3b26 616d 2>>&am │ │ │ │ +0002d480: 703b 206f 7574 636f 6d6d 2c3c 2f64 6976 p; outcomm,
.
1237< │ │ │ │ +0002d4e0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +0002d4f0: 2020 2020 2020 2020 2020 2020 2020 3c61 Redis │ │ │ │ +0002d530: 7472 6962 7574 6549 6e74 6572 6661 6365 tributeInterface │ │ │ │ +0002d540: 3c2f 613e 2661 6d70 3b20 7265 6469 7374 & redist │ │ │ │ +0002d550: 496e 662c 3c2f 6469 763e 0a3c 6469 7620 Inf,
.
1238 │ │ │ │ +0002d5b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0002d5c0: 2020 2020 2020 203c 7370 616e 2063 6c61 bool ver │ │ │ │ +0002d5f0: 626f 7365 3d3c 7370 616e 2063 6c61 7373 bose=false │ │ │ │ +0002d610: 3c2f 7370 616e 3e29 3c2f 6469 763e 0a3c )
.< │ │ │ │ +0002d620: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002d630: 3e3c 6120 6964 3d22 6c30 3132 3339 2220 > 1239 {
.< │ │ │ │ +0002d690: 6120 6964 3d22 6c30 3132 3430 2220 6e61 a id="l01240" na │ │ │ │ +0002d6a0: 6d65 3d22 6c30 3132 3430 223e 3c2f 613e me="l01240"> │ │ │ │ +0002d6b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1240 Timer time; │ │ │ │ +0002d6e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002d730: 3132 3431 3c2f 7370 616e 3e20 3c2f 6469 1241 .
1242 │ │ │ │ +0002d790: 3c2f 7370 616e 3e20 2020 204d 5049 5f43 MPI_C │ │ │ │ +0002d7a0: 6f6d 6d20 636f 6d6d 3d6f 6f63 6f6d 6d2e omm comm=oocomm. │ │ │ │ +0002d7b0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 communicator();
.
1243 │ │ │ │ +0002d870: 2020 206f 6f63 6f6d 6d2e 3c61 2063 6c61 oocomm.build │ │ │ │ +0002d8d0: 476c 6f62 616c 4c6f 6f6b 7570 3c2f 613e GlobalLookup │ │ │ │ +0002d8e0: 2867 7261 7068 2e6e 6f56 6572 7469 6365 (graph.noVertice │ │ │ │ +0002d8f0: 7328 2929 3b3c 2f64 6976 3e0a 3c64 6976 s());
.
< │ │ │ │ +0002d930: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002d940: 6e6f 223e 2031 3234 343c 2f73 7061 6e3e no"> 1244 │ │ │ │ +0002d950: 2020 2020 3c61 2063 6c61 7373 3d22 636f fillIndexSe │ │ │ │ +0002d9b0: 7448 6f6c 6573 3c2f 613e 2867 7261 7068 tHoles(graph │ │ │ │ +0002d9c0: 2c20 6f6f 636f 6d6d 293b 3c2f 6469 763e , oocomm);
│ │ │ │ +0002d9d0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +0002da40: 6120 6964 3d22 6c30 3132 3436 2220 6e61 a id="l01246" na │ │ │ │ +0002da50: 6d65 3d22 6c30 3132 3436 223e 3c2f 613e me="l01246"> │ │ │ │ +0002da60: 3c73 7061 6e20 636c 6173 733d 226c 696e 1246 i │ │ │ │ +0002daa0: 663c 2f73 7061 6e3e 2876 6572 626f 7365 f(verbose │ │ │ │ +0002dab0: 2026 616d 703b 2661 6d70 3b20 6f6f 636f && ooco │ │ │ │ +0002dac0: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +0002db20: 3c2f 613e 2829 2e72 616e 6b28 293d 3d30 ().rank()==0 │ │ │ │ +0002db30: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +0002db80: 2031 3234 373c 2f73 7061 6e3e 2020 2020 1247 │ │ │ │ +0002db90: 2020 7374 643a 3a63 6f75 7426 6c74 3b26 std::cout<& │ │ │ │ +0002dba0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +0002dbc0: 7175 6f74 3b46 696c 6c69 6e67 2068 6f6c quot;Filling hol │ │ │ │ +0002dbd0: 6573 2074 6f6f 6b20 2671 756f 743b 3c2f es took "<<tim │ │ │ │ +0002dbf0: 652e 656c 6170 7365 6428 2926 6c74 3b26 e.elapsed()<& │ │ │ │ +0002dc00: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
124 │ │ │ │ +0002dc60: 383c 2f73 7061 6e3e 2020 2020 7469 6d65 8 time │ │ │ │ +0002dc70: 2e72 6573 6574 2829 3b3c 2f64 6976 3e0a .reset();
. │ │ │ │ +0002dc80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0002dd10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002dd20: 6e6f 223e 2031 3235 303c 2f73 7061 6e3e no"> 1250 │ │ │ │ +0002dd30: 2020 2020 3c73 7061 6e20 636c 6173 733d // sim │ │ │ │ +0002dd50: 706c 6520 7072 6563 6f6e 6469 7469 6f6e ple precondition │ │ │ │ +0002dd60: 2063 6865 636b 733c 2f73 7061 6e3e 3c2f checks.
12 │ │ │ │ +0002ddc0: 3531 3c2f 7370 616e 3e20 3c2f 6469 763e 51
│ │ │ │ +0002ddd0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002de00: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1252 │ │ │ │ +0002de40: 2369 6664 6566 2050 4552 465f 5245 5041 #ifdef PERF_REPA │ │ │ │ +0002de50: 5254 3c2f 7370 616e 3e3c 2f64 6976 3e0a RT
. │ │ │ │ +0002de60: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1254< │ │ │ │ +0002df40: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> double t1=0.0, t2=0.0 │ │ │ │ +0002df80: 2c20 7433 3d30 2e30 2c20 7434 3d30 2e30 , t3=0.0, t4=0.0 │ │ │ │ +0002df90: 2c20 7453 756d 3d30 2e30 3b3c 2f64 6976 , tSum=0.0;
.
1255< │ │ │ │ +0002dff0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#endif.
12 │ │ │ │ +0002e070: 3536 3c2f 7370 616e 3e20 3c2f 6469 763e 56
│ │ │ │ +0002e080: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +0002e0f0: 6120 6964 3d22 6c30 3132 3538 2220 6e61 a id="l01258" na │ │ │ │ +0002e100: 6d65 3d22 6c30 3132 3538 223e 3c2f 613e me="l01258"> │ │ │ │ +0002e110: 3c73 7061 6e20 636c 6173 733d 226c 696e 1258 // MP │ │ │ │ +0002e150: 4920 7661 7269 6162 6c65 733c 2f73 7061 I variables
.
1259 │ │ │ │ +0002e1c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int mype = ooc │ │ │ │ +0002e1f0: 6f6d 6d2e 3c61 2063 6c61 7373 3d22 636f omm.communicato │ │ │ │ +0002e250: 723c 2f61 3e28 292e 7261 6e6b 2829 3b3c r().rank();< │ │ │ │ +0002e260: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002e2b0: 3236 303c 2f73 7061 6e3e 203c 2f64 6976 260
.
1261< │ │ │ │ +0002e310: 2f73 7061 6e3e 2020 2020 6173 7365 7274 /span> assert │ │ │ │ +0002e320: 286e 7061 7274 7326 6c74 3b3d 3c73 7061 (nparts<=static_cast< │ │ │ │ +0002e350: 3b3c 2f73 7061 6e3e 3c61 2063 6c61 7373 ;Metis::i │ │ │ │ +0002e3b0: 6478 5f74 3c2f 613e 3c73 7061 6e20 636c dx_t&g │ │ │ │ +0002e3d0: 743b 3c2f 7370 616e 3e28 6f6f 636f 6d6d t;(oocomm │ │ │ │ +0002e3e0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .communicator().size()));.
12 │ │ │ │ +0002e4a0: 3632 3c2f 7370 616e 3e20 3c2f 6469 763e 62
│ │ │ │ +0002e4b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002e4e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1263 int my │ │ │ │ +0002e530: 446f 6d61 696e 203d 202d 313b 3c2f 6469 Domain = -1;.
1264 │ │ │ │ +0002e590: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +0002e5a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002e5b0: 3e3c 6120 6964 3d22 6c30 3132 3635 2220 > 1265 //< │ │ │ │ +0002e610: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0002e630: 6120 6964 3d22 6c30 3132 3636 2220 6e61 a id="l01266" na │ │ │ │ +0002e640: 6d65 3d22 6c30 3132 3636 223e 3c2f 613e me="l01266"> │ │ │ │ +0002e650: 3c73 7061 6e20 636c 6173 733d 226c 696e 1266 // 1) │ │ │ │ +0002e690: 2050 7265 7061 7265 2074 6865 2072 6571 Prepare the req │ │ │ │ +0002e6a0: 7569 7265 6420 7061 7261 6d65 7465 7273 uired parameters │ │ │ │ +0002e6b0: 2066 6f72 2075 7369 6e67 2050 6172 4d45 for using ParME │ │ │ │ +0002e6c0: 5449 533c 2f73 7061 6e3e 3c2f 6469 763e TIS
│ │ │ │ +0002e6d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002e700: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1267 / │ │ │ │ +0002e740: 2f20 2020 2045 7370 6563 6961 6c6c 7920 / Especially │ │ │ │ +0002e750: 7468 6520 6172 7261 7973 2074 6861 7420 the arrays that │ │ │ │ +0002e760: 7265 7072 6573 656e 7420 7468 6520 6772 represent the gr │ │ │ │ +0002e770: 6170 6820 6d75 7374 2062 653c 2f73 7061 aph must be
.
1268 │ │ │ │ +0002e7e0: 203c 7370 616e 2063 6c61 7373 3d22 636f // gen │ │ │ │ +0002e800: 6572 6174 6564 2062 7920 7468 6520 4455 erated by the DU │ │ │ │ +0002e810: 4e45 2047 7261 7068 2061 6e64 2049 6e64 NE Graph and Ind │ │ │ │ +0002e820: 6578 5365 7420 696e 7075 7420 7661 7269 exSet input vari │ │ │ │ +0002e830: 6162 6c65 732e 3c2f 7370 616e 3e3c 2f64 ables..
126 │ │ │ │ +0002e890: 393c 2f73 7061 6e3e 2020 2020 3c73 7061 9 // These ar │ │ │ │ +0002e8c0: 6520 7468 6520 6172 7261 7973 3a3c 2f73 e the arrays:
.
1270 │ │ │ │ +0002e930: 2020 203c 7370 616e 2063 6c61 7373 3d22 // - │ │ │ │ +0002e950: 2076 7478 6469 7374 3c2f 7370 616e 3e3c vtxdist< │ │ │ │ +0002e960: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002e9b0: 3237 313c 2f73 7061 6e3e 2020 2020 3c73 271 // - xadj │ │ │ │ +0002e9e0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0002ea00: 3c61 2069 643d 226c 3031 3237 3222 206e 1272 // │ │ │ │ +0002ea60: 2020 2d20 6164 6a6e 6379 3c2f 7370 616e - adjncy
.
│ │ │ │ +0002eac0: 2031 3237 333c 2f73 7061 6e3e 2020 2020 1273 │ │ │ │ +0002ead0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d //< │ │ │ │ +0002eaf0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002eb40: 3237 343c 2f73 7061 6e3e 2020 2020 3c73 274 //.
127 │ │ │ │ +0002ebc0: 353c 2f73 7061 6e3e 3c73 7061 6e20 636c 5#ifdef PERF_R │ │ │ │ +0002ebf0: 4550 4152 543c 2f73 7061 6e3e 3c2f 6469 EPART.
1276 │ │ │ │ +0002ec50: 3c2f 7370 616e 3e20 2020 203c 7370 616e // reset timer │ │ │ │ +0002ec80: 666f 7220 7374 6570 2031 293c 2f73 7061 for step 1)
.
1277 │ │ │ │ +0002ecf0: 2074 313d 4d50 495f 5774 696d 6528 293b t1=MPI_Wtime(); │ │ │ │ +0002ed00: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002ed50: 3132 3738 3c2f 7370 616e 3e3c 7370 616e 1278#endif
.
1279 < │ │ │ │ +0002ede0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002ee30: 3238 303c 2f73 7061 6e3e 203c 2f64 6976 280
.
1281< │ │ │ │ +0002ee90: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ +0002eeb0: 7479 7065 6465 663c 2f73 7061 6e3e 203c typedef < │ │ │ │ +0002eec0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0002eed0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord">typename Dune::OwnerOve │ │ │ │ +0002ef20: 726c 6170 436f 7079 436f 6d6d 756e 6963 rlapCopyCommunic │ │ │ │ +0002ef30: 6174 696f 6e26 6c74 3b54 312c 5432 2667 ation<T1,T2&g │ │ │ │ +0002ef40: 743b 3c2f 613e 204f 4f43 6f6d 6d3b 3c2f t; OOComm;.
12 │ │ │ │ +0002efa0: 3832 3c2f 7370 616e 3e20 2020 203c 7370 82 typedef typename │ │ │ │ +0002eff0: 3c2f 7370 616e 3e20 204f 4f43 6f6d 6d3a OOComm: │ │ │ │ +0002f000: 3a4f 776e 6572 5365 7420 4f77 6e65 7253 :OwnerSet OwnerS │ │ │ │ +0002f010: 6574 3b3c 2f64 6976 3e0a 3c64 6976 2063 et;
.
1283 < │ │ │ │ +0002f070: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0002f0c0: 3238 343c 2f73 7061 6e3e 2020 2020 3c73 284 // Create th │ │ │ │ +0002f0f0: 6520 7674 7864 6973 7420 6172 7261 7920 e vtxdist array │ │ │ │ +0002f100: 616e 6420 7061 726d 6574 6973 5674 784d and parmetisVtxM │ │ │ │ +0002f110: 6170 7069 6e67 2e3c 2f73 7061 6e3e 3c2f apping..
12 │ │ │ │ +0002f170: 3835 3c2f 7370 616e 3e20 2020 203c 7370 85 // Global com │ │ │ │ +0002f1a0: 6d75 6e69 6361 7469 6f6e 7320 6172 6520 munications are │ │ │ │ +0002f1b0: 6e65 6365 7373 6172 793c 2f73 7061 6e3e necessary │ │ │ │ +0002f1c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0002f210: 3132 3836 3c2f 7370 616e 3e20 2020 203c 1286 < │ │ │ │ +0002f220: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +0002f230: 656e 7422 3e2f 2f20 5468 6520 7061 726d ent">// The parm │ │ │ │ +0002f240: 6574 6973 2067 6c6f 6261 6c20 6964 656e etis global iden │ │ │ │ +0002f250: 7469 6669 6572 7320 666f 7220 7468 6520 tifiers for the │ │ │ │ +0002f260: 6f77 6e65 7220 7665 7274 6963 6573 2e3c owner vertices.< │ │ │ │ +0002f270: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0002f290: 6120 6964 3d22 6c30 3132 3837 2220 6e61 a id="l01287" na │ │ │ │ +0002f2a0: 6d65 3d22 6c30 3132 3837 223e 3c2f 613e me="l01287"> │ │ │ │ +0002f2b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1287 ParmetisDun │ │ │ │ +0002f2e0: 6549 6e64 6578 4d61 7020 696e 6465 784d eIndexMap indexM │ │ │ │ +0002f2f0: 6170 2867 7261 7068 2c6f 6f63 6f6d 6d29 ap(graph,oocomm) │ │ │ │ +0002f300: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0002f350: 2031 3238 383c 2f73 7061 6e3e 2020 2020 1288 │ │ │ │ +0002f360: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ +0002f3b0: 4d65 7469 733a 3a69 6478 5f74 3c2f 613e Metis::idx_t │ │ │ │ +0002f3c0: 202a 7061 7274 203d 203c 7370 616e 2063 *part = n │ │ │ │ +0002f3e0: 6577 3c2f 7370 616e 3e20 3c61 2063 6c61 ew Metis: │ │ │ │ +0002f440: 3a69 6478 5f74 3c2f 613e 5b69 6e64 6578 :idx_t[index │ │ │ │ +0002f450: 4d61 702e 6e75 6d4f 664f 776e 5674 7828 Map.numOfOwnVtx( │ │ │ │ +0002f460: 295d 3b3c 2f64 6976 3e0a 3c64 6976 2063 )];
.
1289 │ │ │ │ +0002f4c0: 2020 3c73 7061 6e20 636c 6173 733d 226b for< │ │ │ │ +0002f4e0: 2f73 7061 6e3e 2873 7464 3a3a 7369 7a65 /span>(std::size │ │ │ │ +0002f4f0: 5f74 2069 3d30 3b20 6920 266c 743b 2069 _t i=0; i < i │ │ │ │ +0002f500: 6e64 6578 4d61 702e 6e75 6d4f 664f 776e ndexMap.numOfOwn │ │ │ │ +0002f510: 5674 7828 293b 202b 2b69 293c 2f64 6976 Vtx(); ++i)
.
1290< │ │ │ │ +0002f570: 2f73 7061 6e3e 2020 2020 2020 7061 7274 /span> part │ │ │ │ +0002f580: 5b69 5d3d 6d79 7065 3b3c 2f64 6976 3e0a [i]=mype;
. │ │ │ │ +0002f590: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0002f620: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0002f630: 6e6f 223e 2031 3239 323c 2f73 7061 6e3e no"> 1292 │ │ │ │ +0002f640: 3c73 7061 6e20 636c 6173 733d 2270 7265 #if ! │ │ │ │ +0002f660: 4841 5645 5f50 4152 4d45 5449 533c 2f73 HAVE_PARMETIS
.
1293 │ │ │ │ +0002f6d0: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +0002f6f0: 2f73 7061 6e3e 286f 6f63 6f6d 6d2e 3c61 /span>(oocomm.c │ │ │ │ +0002f750: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +0002f760: 292e 7261 6e6b 2829 3d3d 3020 2661 6d70 ).rank()==0 & │ │ │ │ +0002f770: 3b26 616d 703b 206e 7061 7274 7326 6774 ;& nparts> │ │ │ │ +0002f780: 3b31 293c 2f64 6976 3e0a 3c64 6976 2063 ;1)
.
1294 │ │ │ │ +0002f7e0: 2020 2020 7374 643a 3a63 6572 7226 6c74 std::cerr< │ │ │ │ +0002f7f0: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<"ParMETIS │ │ │ │ +0002f820: 6e6f 7420 6163 7469 7661 7465 642e 2057 not activated. W │ │ │ │ +0002f830: 696c 6c20 7265 7061 7274 6974 696f 6e20 ill repartition │ │ │ │ +0002f840: 746f 2031 2064 6f6d 6169 6e20 696e 7374 to 1 domain inst │ │ │ │ +0002f850: 6561 6420 6f66 2072 6571 7565 7374 6564 ead of requested │ │ │ │ +0002f860: 2026 7175 6f74 3b3c 2f73 7061 6e3e 3c2f ".
12 │ │ │ │ +0002f8c0: 3935 3c2f 7370 616e 3e20 2020 2020 2020 95 │ │ │ │ +0002f8d0: 2020 2020 2020 2020 266c 743b 266c 743b << │ │ │ │ +0002f8e0: 6e70 6172 7473 266c 743b 266c 743b 3c73 nparts<<" │ │ │ │ +0002f910: 2064 6f6d 6169 6e73 2e26 7175 6f74 3b3c domains."< │ │ │ │ +0002f920: 2f73 7061 6e3e 266c 743b 266c 743b 7374 /span><<st │ │ │ │ +0002f930: 643a 3a65 6e64 6c3b 3c2f 6469 763e 0a3c d::endl;
.< │ │ │ │ +0002f940: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002f950: 3e3c 6120 6964 3d22 6c30 3132 3936 2220 > 1296
nparts=1; │ │ │ │ +0002f9a0: 203c 7370 616e 2063 6c61 7373 3d22 636f // No par │ │ │ │ +0002f9c0: 6d65 7469 7320 6176 6169 6c61 626c 652c metis available, │ │ │ │ +0002f9d0: 2066 616c 6c62 6163 6b20 746f 2061 6767 fallback to agg │ │ │ │ +0002f9e0: 6c6f 6d65 7261 7469 6e67 2074 6f20 3120 lomerating to 1 │ │ │ │ +0002f9f0: 7072 6f63 6573 733c 2f73 7061 6e3e 3c2f process.
12 │ │ │ │ +0002fa50: 3937 3c2f 7370 616e 3e20 3c2f 6469 763e 97
│ │ │ │ +0002fa60: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0002fa90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1298 │ │ │ │ +0002fad0: 2365 6c73 653c 2f73 7061 6e3e 3c2f 6469 #else.
1299 │ │ │ │ +0002fb30: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +0002fb40: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0002fb50: 3e3c 6120 6964 3d22 6c30 3133 3030 2220 > 1300 if(npart │ │ │ │ +0002fbc0: 7326 6774 3b31 2920 7b3c 2f64 6976 3e0a s>1) {
. │ │ │ │ +0002fbd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1302< │ │ │ │ +0002fcc0: 2f73 7061 6e3e 2020 2020 2020 3c61 2063 /span> Meti │ │ │ │ +0002fd20: 733a 3a69 6478 5f74 3c2f 613e 202a 7861 s::idx_t *xa │ │ │ │ +0002fd30: 646a 203d 203c 7370 616e 2063 6c61 7373 dj = new Metis::id │ │ │ │ +0002fdb0: 785f 743c 2f61 3e5b 696e 6465 784d 6170 x_t[indexMap │ │ │ │ +0002fdc0: 2e6e 756d 4f66 4f77 6e56 7478 2829 2b31 .numOfOwnVtx()+1 │ │ │ │ +0002fdd0: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
.
1303 │ │ │ │ +0002fe30: 2020 203c 6120 636c 6173 733d 2263 6f64 Metis::idx_t< │ │ │ │ +0002fe90: 2f61 3e20 2a61 646a 6e63 7920 3d20 3c73 /a> *adjncy = new < │ │ │ │ +0002fec0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +0002fed0: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef" href=" │ │ │ │ +0002fee0: 6130 3032 3635 2e68 746d 6c23 6162 3162 a00265.html#ab1b │ │ │ │ +0002fef0: 3837 3965 6562 6435 6433 3237 3031 6337 879eebd5d32701c7 │ │ │ │ +0002ff00: 6235 3837 3962 6265 3634 6131 3722 3e4d b5879bbe64a17">M │ │ │ │ +0002ff10: 6574 6973 3a3a 6964 785f 743c 2f61 3e5b etis::idx_t[ │ │ │ │ +0002ff20: 6772 6170 682e 6e6f 4564 6765 7328 295d graph.noEdges()] │ │ │ │ +0002ff30: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0002ff80: 2031 3330 343c 2f73 7061 6e3e 2020 2020 1304 │ │ │ │ +0002ff90: 2020 4564 6765 4675 6e63 746f 7226 6c74 EdgeFunctor< │ │ │ │ +0002ffa0: 3b47 2667 743b 2065 6628 6164 6a6e 6379 ;G> ef(adjncy │ │ │ │ +0002ffb0: 2c20 696e 6465 784d 6170 2c20 6772 6170 , indexMap, grap │ │ │ │ +0002ffc0: 682e 6e6f 4564 6765 7328 2929 3b3c 2f64 h.noEdges());.
130 │ │ │ │ +00030020: 353c 2f73 7061 6e3e 2020 2020 2020 6765 5 ge │ │ │ │ +00030030: 7441 646a 4172 7261 7973 266c 743b 4f77 tAdjArrays<Ow │ │ │ │ +00030040: 6e65 7253 6574 2667 743b 2867 7261 7068 nerSet>(graph │ │ │ │ +00030050: 2c20 6f6f 636f 6d6d 2e3c 6120 636c 6173 , oocomm.global │ │ │ │ +000300b0: 4c6f 6f6b 7570 3c2f 613e 2829 2c20 7861 Lookup(), xa │ │ │ │ +000300c0: 646a 2c20 6566 293b 3c2f 6469 763e 0a3c dj, ef);
.< │ │ │ │ +000300d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000300e0: 3e3c 6120 6964 3d22 6c30 3133 3036 2220 > 1306
.
1307 │ │ │ │ +00030180: 2020 2020 203c 7370 616e 2063 6c61 7373 //
.
1308 │ │ │ │ +00030200: 2020 2020 203c 7370 616e 2063 6c61 7373 // 2) │ │ │ │ +00030220: 2043 616c 6c20 5061 724d 4554 4953 3c2f Call ParMETIS
.
< │ │ │ │ +00030270: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00030280: 6e6f 223e 2031 3330 393c 2f73 7061 6e3e no"> 1309 │ │ │ │ +00030290: 2020 2020 2020 3c73 7061 6e20 636c 6173 //
.
< │ │ │ │ +000302f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00030300: 6e6f 223e 2031 3331 303c 2f73 7061 6e3e no"> 1310 │ │ │ │ +00030310: 2020 2020 2020 3c73 7061 6e20 636c 6173 //
.
< │ │ │ │ +00030370: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00030380: 6e6f 223e 2031 3331 313c 2f73 7061 6e3e no"> 1311 │ │ │ │ +00030390: 2020 2020 2020 3c61 2063 6c61 7373 3d22 Metis::idx │ │ │ │ +000303f0: 5f74 3c2f 613e 206e 756d 666c 6167 3d30 _t numflag=0 │ │ │ │ +00030400: 2c20 7767 7466 6c61 673d 302c 206f 7074 , wgtflag=0, opt │ │ │ │ +00030410: 696f 6e73 5b33 5d2c 2065 6467 6563 7574 ions[3], edgecut │ │ │ │ +00030420: 3d30 2c20 6e63 6f6e 3d31 3b3c 2f64 6976 =0, ncon=1;
.
1312< │ │ │ │ +00030480: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> //float *tpwgt │ │ │ │ +000304b0: 7320 3d20 4e55 4c4c 3b3c 2f73 7061 6e3e s = NULL; │ │ │ │ +000304c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00030510: 3133 3133 3c2f 7370 616e 3e20 2020 2020 1313 │ │ │ │ +00030520: 203c 6120 636c 6173 733d 2263 6f64 6520 Metis::real_t *tpwgts = new Me │ │ │ │ +00030600: 7469 733a 3a72 6561 6c5f 743c 2f61 3e5b tis::real_t[ │ │ │ │ +00030610: 6e70 6172 7473 5d3b 3c2f 6469 763e 0a3c nparts];
.< │ │ │ │ +00030620: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00030630: 3e3c 6120 6964 3d22 6c30 3133 3134 2220 > 1314 for(int i=0; i<npa │ │ │ │ +000306d0: 7274 733b 202b 2b69 293c 2f64 6976 3e0a rts; ++i)
. │ │ │ │ +000306e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
│ │ │ │ +000307a0: 2031 3331 363c 2f73 7061 6e3e 2020 2020 1316 │ │ │ │ +000307b0: 2020 3c61 2063 6c61 7373 3d22 636f 6465 Metis::real_t< │ │ │ │ +00030810: 2f61 3e20 7562 7665 635b 315d 3b3c 2f64 /a> ubvec[1];.
131 │ │ │ │ +00030870: 373c 2f73 7061 6e3e 2020 2020 2020 6f70 7 op │ │ │ │ +00030880: 7469 6f6e 735b 305d 203d 2030 3b20 3c73 tions[0] = 0; // 0=default │ │ │ │ +000308b0: 2c20 313d 6f70 7469 6f6e 7320 6172 6520 , 1=options are │ │ │ │ +000308c0: 6465 6669 6e65 6420 696e 205b 315d 2b5b defined in [1]+[ │ │ │ │ +000308d0: 325d 3c2f 7370 616e 3e3c 2f64 6976 3e0a 2]
. │ │ │ │ +000308e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ +00030970: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +00030a60: 2031 3332 303c 2f73 7061 6e3e 3c73 7061 1320#else
.
1321 │ │ │ │ +00030af0: 2020 2020 6f70 7469 6f6e 735b 315d 203d options[1] = │ │ │ │ +00030b00: 2030 3b20 3c73 7061 6e20 636c 6173 733d 0; // sho │ │ │ │ +00030b20: 7720 696e 666f 3a20 303d 6e6f 206d 6573 w info: 0=no mes │ │ │ │ +00030b30: 7361 6765 3c2f 7370 616e 3e3c 2f64 6976 sage
.
1322< │ │ │ │ +00030b90: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#endif.
13 │ │ │ │ +00030c10: 3233 3c2f 7370 616e 3e20 2020 2020 206f 23 o │ │ │ │ +00030c20: 7074 696f 6e73 5b32 5d20 3d20 313b 203c ptions[2] = 1; < │ │ │ │ +00030c30: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00030c40: 656e 7422 3e2f 2f20 7261 6e64 6f6d 206e ent">// random n │ │ │ │ +00030c50: 756d 6265 7220 7365 6564 2c20 6465 6661 umber seed, defa │ │ │ │ +00030c60: 756c 7420 6973 2031 353c 2f73 7061 6e3e ult is 15 │ │ │ │ +00030c70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00030cc0: 3133 3234 3c2f 7370 616e 3e20 2020 2020 1324 │ │ │ │ +00030cd0: 2077 6774 666c 6167 203d 2028 6566 2e67 wgtflag = (ef.g │ │ │ │ +00030ce0: 6574 5765 6967 6874 7328 2921 3d4e 554c etWeights()!=NUL │ │ │ │ +00030cf0: 4c29 203f 2031 203a 2030 3b3c 2f64 6976 L) ? 1 : 0;
.
1325< │ │ │ │ +00030d50: 2f73 7061 6e3e 2020 2020 2020 6e75 6d66 /span> numf │ │ │ │ +00030d60: 6c61 6720 3d20 303b 3c2f 6469 763e 0a3c lag = 0;
.< │ │ │ │ +00030d70: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00030d80: 3e3c 6120 6964 3d22 6c30 3133 3236 2220 > 1326 edgecut │ │ │ │ +00030dd0: 203d 2030 3b3c 2f64 6976 3e0a 3c64 6976 = 0;
.
< │ │ │ │ +00030e10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00030e20: 6e6f 223e 2031 3332 373c 2f73 7061 6e3e no"> 1327 │ │ │ │ +00030e30: 2020 2020 2020 6e63 6f6e 3d31 3b3c 2f64 ncon=1;.
132 │ │ │ │ +00030e90: 383c 2f73 7061 6e3e 2020 2020 2020 7562 8 ub │ │ │ │ +00030ea0: 7665 635b 305d 3d31 2e30 353b 203c 7370 vec[0]=1.05; // recommende │ │ │ │ +00030ed0: 6420 6279 2050 6172 4d45 5449 533c 2f73 d by ParMETIS
.
1329 │ │ │ │ +00030f40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00030f90: 3133 3330 3c2f 7370 616e 3e3c 7370 616e 1330#ifdef DEB │ │ │ │ +00030fc0: 5547 5f52 4550 4152 543c 2f73 7061 6e3e UG_REPART │ │ │ │ +00030fd0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00031020: 3133 3331 3c2f 7370 616e 3e20 2020 2020 1331 │ │ │ │ +00031030: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if (mype == 0) │ │ │ │ +00031060: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
1332 │ │ │ │ +000310c0: 2020 2020 2073 7464 3a3a 636f 7574 266c std::cout&l │ │ │ │ +000310d0: 743b 266c 743b 7374 643a 3a65 6e64 6c3b t;<std::endl; │ │ │ │ +000310e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00031130: 3133 3333 3c2f 7370 616e 3e20 2020 2020 1333 │ │ │ │ +00031140: 2020 2073 7464 3a3a 636f 7574 266c 743b std::cout< │ │ │ │ +00031150: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00031170: 2671 756f 743b 5465 7374 696e 6720 5061 "Testing Pa │ │ │ │ +00031180: 724d 4554 4953 5f56 335f 5061 7274 4b77 rMETIS_V3_PartKw │ │ │ │ +00031190: 6179 2077 6974 6820 6f70 7469 6f6e 735b ay with options[ │ │ │ │ +000311a0: 312d 325d 203d 207b 2671 756f 743b 3c2f 1-2] = {"
.
< │ │ │ │ +000311f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00031200: 6e6f 223e 2031 3333 343c 2f73 7061 6e3e no"> 1334 │ │ │ │ +00031210: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00031220: 2026 6c74 3b26 6c74 3b6f 7074 696f 6e73 <<options │ │ │ │ +00031230: 5b31 5d26 6c74 3b26 6c74 3b3c 7370 616e [1]<<" &q │ │ │ │ +00031260: 756f 743b 3c2f 7370 616e 3e26 6c74 3b26 uot;<& │ │ │ │ +00031270: 6c74 3b6f 7074 696f 6e73 5b32 5d26 6c74 lt;options[2]< │ │ │ │ +00031280: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<"}, Ncon: │ │ │ │ +000312b0: 2671 756f 743b 3c2f 7370 616e 3e3c 2f64 ".
133 │ │ │ │ +00031310: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 │ │ │ │ +00031320: 2020 2020 2020 2020 2026 6c74 3b26 6c74 << │ │ │ │ +00031330: 3b6e 636f 6e26 6c74 3b26 6c74 3b3c 7370 ;ncon<<", │ │ │ │ +00031360: 204e 7061 7274 733a 2026 7175 6f74 3b3c Nparts: "< │ │ │ │ +00031370: 2f73 7061 6e3e 266c 743b 266c 743b 6e70 /span><<np │ │ │ │ +00031380: 6172 7473 266c 743b 266c 743b 7374 643a arts<<std: │ │ │ │ +00031390: 3a65 6e64 6c3b 3c2f 6469 763e 0a3c 6469 :endl;
.< │ │ │ │ +000313b0: 6120 6964 3d22 6c30 3133 3336 2220 6e61 a id="l01336" na │ │ │ │ +000313c0: 6d65 3d22 6c30 3133 3336 223e 3c2f 613e me="l01336"> │ │ │ │ +000313d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1336 }
.< │ │ │ │ +00031400: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00031410: 3e3c 6120 6964 3d22 6c30 3133 3337 2220 > 1337#e │ │ │ │ +00031470: 6e64 6966 3c2f 7370 616e 3e3c 2f64 6976 ndif
.
1338< │ │ │ │ +000314d0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#ifdef PERF_REP │ │ │ │ +00031500: 4152 543c 2f73 7061 6e3e 3c2f 6469 763e ART
│ │ │ │ +00031510: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00031540: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1339 // stop the tim │ │ │ │ +00031590: 6520 666f 7220 7374 6570 2031 293c 2f73 e for step 1)
.
1340 │ │ │ │ +00031600: 2020 2020 2074 313d 4d50 495f 5774 696d t1=MPI_Wtim │ │ │ │ +00031610: 6528 292d 7431 3b3c 2f64 6976 3e0a 3c64 e()-t1;
. │ │ │ │ +00031630: 3c61 2069 643d 226c 3031 3334 3122 206e 1341 // │ │ │ │ +00031690: 2072 6573 6574 2074 696d 6572 2066 6f72 reset timer for │ │ │ │ +000316a0: 2073 7465 7020 3229 3c2f 7370 616e 3e3c step 2)< │ │ │ │ +000316b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00031700: 3334 323c 2f73 7061 6e3e 2020 2020 2020 342 │ │ │ │ +00031710: 7432 3d4d 5049 5f57 7469 6d65 2829 3b3c t2=MPI_Wtime();< │ │ │ │ +00031720: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00031770: 3334 333c 2f73 7061 6e3e 3c73 7061 6e20 343#endif
.
1344 .
13 │ │ │ │ +00031850: 3435 3c2f 7370 616e 3e20 2020 2020 203c 45 < │ │ │ │ +00031860: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00031870: 6f72 6466 6c6f 7722 3e69 663c 2f73 7061 ordflow">if(verbose) {.
134 │ │ │ │ +000318e0: 363c 2f73 7061 6e3e 2020 2020 2020 2020 6 │ │ │ │ +000318f0: 6f6f 636f 6d6d 2e3c 6120 636c 6173 733d oocomm.communic │ │ │ │ +00031950: 6174 6f72 3c2f 613e 2829 2e62 6172 7269 ator().barri │ │ │ │ +00031960: 6572 2829 3b3c 2f64 6976 3e0a 3c64 6976 er();
.
< │ │ │ │ +000319a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000319b0: 6e6f 223e 2031 3334 373c 2f73 7061 6e3e no"> 1347 │ │ │ │ +000319c0: 2020 2020 2020 2020 3c73 7061 6e20 636c if(ooco │ │ │ │ +000319f0: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +00031a50: 3c2f 613e 2829 2e72 616e 6b28 293d 3d30 ().rank()==0 │ │ │ │ +00031a60: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +00031ab0: 2031 3334 383c 2f73 7061 6e3e 2020 2020 1348 │ │ │ │ +00031ac0: 2020 2020 2020 7374 643a 3a63 6f75 7426 std::cout& │ │ │ │ +00031ad0: 6c74 3b26 6c74 3b3c 7370 616e 2063 6c61 lt;<"Prepari │ │ │ │ +00031b00: 6e67 2066 6f72 2070 6172 6d65 7469 7320 ng for parmetis │ │ │ │ +00031b10: 746f 6f6b 2026 7175 6f74 3b3c 2f73 7061 took "<<time.e │ │ │ │ +00031b30: 6c61 7073 6564 2829 266c 743b 266c 743b lapsed()<< │ │ │ │ +00031b40: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +00031b50: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00031b80: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1349 }.
1350 │ │ │ │ +00031c00: 3c2f 7370 616e 3e20 2020 2020 2074 696d tim │ │ │ │ +00031c10: 652e 7265 7365 7428 293b 3c2f 6469 763e e.reset();
│ │ │ │ +00031c20: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00031c90: 6120 6964 3d22 6c30 3133 3532 2220 6e61 a id="l01352" na │ │ │ │ +00031ca0: 6d65 3d22 6c30 3133 3532 223e 3c2f 613e me="l01352"> │ │ │ │ +00031cb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1352 //= │ │ │ │ +00031cf0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00031d00: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00031d10: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00031d20: 3d3d 3d3d 3d3d 3c2f 7370 616e 3e3c 2f64 ======.
135 │ │ │ │ +00031d80: 333c 2f73 7061 6e3e 2020 2020 2020 3c73 3 // ParMETIS_ │ │ │ │ +00031db0: 5633 5f50 6172 744b 7761 793c 2f73 7061 V3_PartKway
.
1354 │ │ │ │ +00031e20: 2020 203c 7370 616e 2063 6c61 7373 3d22 //===== │ │ │ │ +00031e40: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00031e50: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00031e60: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ │ +00031e70: 3d3d 3c2f 7370 616e 3e3c 2f64 6976 3e0a ==
. │ │ │ │ +00031e80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +00031f60: 3133 3536 3c2f 7370 616e 3e20 2020 2020 1356 │ │ │ │ +00031f70: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00031f80: 2020 2020 2020 4e55 4c4c 2c20 6566 2e67 NULL, ef.g │ │ │ │ +00031f90: 6574 5765 6967 6874 7328 292c 2026 616d etWeights(), &am │ │ │ │ +00031fa0: 703b 7767 7466 6c61 672c 3c2f 6469 763e p;wgtflag,
│ │ │ │ +00031fb0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00031fe0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1357 │ │ │ │ +00032010: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00032020: 2661 6d70 3b6e 756d 666c 6167 2c20 2661 &numflag, &a │ │ │ │ +00032030: 6d70 3b6e 636f 6e2c 2026 616d 703b 6e70 mp;ncon, &np │ │ │ │ +00032040: 6172 7473 2c20 7470 7767 7473 2c20 7562 arts, tpwgts, ub │ │ │ │ +00032050: 7665 632c 206f 7074 696f 6e73 2c20 2661 vec, options, &a │ │ │ │ +00032060: 6d70 3b65 6467 6563 7574 2c20 7061 7274 mp;edgecut, part │ │ │ │ +00032070: 2c20 2661 6d70 3b3c 7370 616e 2063 6c61 , &con │ │ │ │ +00032090: 7374 5f63 6173 7426 6c74 3b3c 2f73 7061 st_cast<MPI_Comm&< │ │ │ │ +000320b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000320c0: 6f72 6422 3e26 6774 3b3c 2f73 7061 6e3e ord">> │ │ │ │ +000320d0: 2863 6f6d 6d29 293b 3c2f 6469 763e 0a3c (comm));
.< │ │ │ │ +000320e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000320f0: 3e3c 6120 6964 3d22 6c30 3133 3538 2220 > 1358
.
1359 │ │ │ │ +00032190: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000321e0: 3133 3630 3c2f 7370 616e 3e20 2020 2020 1360 │ │ │ │ +000321f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 delete[] xadj;.
1361 │ │ │ │ +00032270: 3c2f 7370 616e 3e20 2020 2020 203c 7370 delete │ │ │ │ +000322a0: 5b5d 2061 646a 6e63 793b 3c2f 6469 763e [] adjncy;
│ │ │ │ +000322b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000322e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1362 delete[] │ │ │ │ +00032330: 2074 7077 6774 733b 3c2f 6469 763e 0a3c tpwgts;
.< │ │ │ │ +00032340: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00032350: 3e3c 6120 6964 3d22 6c30 3133 3633 2220 > 1363
.
1364 │ │ │ │ +000323f0: 2020 2020 2065 662e 6672 6565 2829 3b3c ef.free();< │ │ │ │ +00032400: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00032450: 3336 353c 2f73 7061 6e3e 203c 2f64 6976 365
.
1366< │ │ │ │ +000324b0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#ifdef DEBUG_RE │ │ │ │ +000324e0: 5041 5254 3c2f 7370 616e 3e3c 2f64 6976 PART
.
1367< │ │ │ │ +00032540: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> if │ │ │ │ +00032570: 286d 7970 6520 3d3d 2030 2920 7b3c 2f64 (mype == 0) {.
136 │ │ │ │ +000325d0: 383c 2f73 7061 6e3e 2020 2020 2020 2020 8 │ │ │ │ +000325e0: 7374 643a 3a63 6f75 7426 6c74 3b26 6c74 std::cout<< │ │ │ │ +000325f0: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
1369< │ │ │ │ +00032650: 2f73 7061 6e3e 2020 2020 2020 2020 7374 /span> st │ │ │ │ +00032660: 643a 3a63 6f75 7426 6c74 3b26 6c74 3b3c d::cout<<< │ │ │ │ +00032670: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +00032680: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +00032690: 3b50 6172 4d45 5449 535f 5633 5f50 6172 ;ParMETIS_V3_Par │ │ │ │ +000326a0: 744b 7761 7920 7265 706f 7274 6564 2061 tKway reported a │ │ │ │ +000326b0: 2063 7574 206f 6620 2671 756f 743b 3c2f cut of "<<edg │ │ │ │ +000326d0: 6563 7574 266c 743b 266c 743b 7374 643a ecut<<std: │ │ │ │ +000326e0: 3a65 6e64 6c3b 3c2f 6469 763e 0a3c 6469 :endl;
.< │ │ │ │ +00032700: 6120 6964 3d22 6c30 3133 3730 2220 6e61 a id="l01370" na │ │ │ │ +00032710: 6d65 3d22 6c30 3133 3730 223e 3c2f 613e me="l01370"> │ │ │ │ +00032720: 3c73 7061 6e20 636c 6173 733d 226c 696e 1370 std::co │ │ │ │ +00032750: 7574 266c 743b 266c 743b 7374 643a 3a65 ut<<std::e │ │ │ │ +00032760: 6e64 6c3b 3c2f 6469 763e 0a3c 6469 7620 ndl;
.
1371 │ │ │ │ +000327c0: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
.< │ │ │ │ +000327e0: 6120 6964 3d22 6c30 3133 3732 2220 6e61 a id="l01372" na │ │ │ │ +000327f0: 6d65 3d22 6c30 3133 3732 223e 3c2f 613e me="l01372"> │ │ │ │ +00032800: 3c73 7061 6e20 636c 6173 733d 226c 696e 1372 std::cout │ │ │ │ +00032830: 266c 743b 266c 743b 6d79 7065 266c 743b <<mype< │ │ │ │ +00032840: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00032860: 2671 756f 743b 3a20 5041 524d 4554 4953 ": PARMETIS │ │ │ │ +00032870: 2d52 6573 756c 743a 2026 7175 6f74 3b3c -Result: "< │ │ │ │ +00032880: 2f73 7061 6e3e 3b3c 2f64 6976 3e0a 3c64 /span>;
. │ │ │ │ +000328a0: 3c61 2069 643d 226c 3031 3337 3322 206e 1373 for(int i=0; i < in │ │ │ │ +00032940: 6465 784d 6170 2e76 7478 4469 7374 2829 dexMap.vtxDist() │ │ │ │ +00032950: 5b6d 7970 652b 315d 2d69 6e64 6578 4d61 [mype+1]-indexMa │ │ │ │ +00032960: 702e 7674 7844 6973 7428 295b 6d79 7065 p.vtxDist()[mype │ │ │ │ +00032970: 5d3b 202b 2b69 2920 7b3c 2f64 6976 3e0a ]; ++i) {
. │ │ │ │ +00032980: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +000329b0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1374 std: │ │ │ │ +000329e0: 3a63 6f75 7426 6c74 3b26 6c74 3b70 6172 :cout<<par │ │ │ │ +000329f0: 745b 695d 266c 743b 266c 743b 3c73 7061 t[i]<<" & │ │ │ │ +00032a20: 7175 6f74 3b3c 2f73 7061 6e3e 3b3c 2f64 quot;;.
137 │ │ │ │ +00032a80: 353c 2f73 7061 6e3e 2020 2020 2020 7d3c 5 }< │ │ │ │ +00032a90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00032ae0: 3337 363c 2f73 7061 6e3e 2020 2020 2020 376 │ │ │ │ +00032af0: 7374 643a 3a63 6f75 7426 6c74 3b26 6c74 std::cout<< │ │ │ │ +00032b00: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
1377< │ │ │ │ +00032b60: 2f73 7061 6e3e 2020 2020 2020 7374 643a /span> std: │ │ │ │ +00032b70: 3a63 6f75 7426 6c74 3b26 6c74 3b3c 7370 :cout<<"T │ │ │ │ +00032ba0: 6573 7469 6e67 2050 6172 4d45 5449 535f esting ParMETIS_ │ │ │ │ +00032bb0: 5633 5f50 6172 744b 7761 7920 7769 7468 V3_PartKway with │ │ │ │ +00032bc0: 206f 7074 696f 6e73 5b31 2d32 5d20 3d20 options[1-2] = │ │ │ │ +00032bd0: 7b26 7175 6f74 3b3c 2f73 7061 6e3e 3c2f {".
13 │ │ │ │ +00032c30: 3738 3c2f 7370 616e 3e20 2020 2020 2020 78 │ │ │ │ +00032c40: 2020 2020 2020 2020 266c 743b 266c 743b << │ │ │ │ +00032c50: 6f70 7469 6f6e 735b 315d 266c 743b 266c options[1]<&l │ │ │ │ +00032c60: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +00032c80: 756f 743b 2026 7175 6f74 3b3c 2f73 7061 uot; "<<option │ │ │ │ +00032ca0: 735b 325d 266c 743b 266c 743b 3c73 7061 s[2]<<"}, │ │ │ │ +00032cd0: 204e 636f 6e3a 2026 7175 6f74 3b3c 2f73 Ncon: "
.
1379 │ │ │ │ +00032d40: 2020 2020 2020 2020 2020 2020 2020 266c &l │ │ │ │ +00032d50: 743b 266c 743b 6e63 6f6e 266c 743b 266c t;<ncon<&l │ │ │ │ +00032d60: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +00032d80: 756f 743b 2c20 4e70 6172 7473 3a20 2671 uot;, Nparts: &q │ │ │ │ +00032d90: 756f 743b 3c2f 7370 616e 3e26 6c74 3b26 uot;<& │ │ │ │ +00032da0: 6c74 3b6e 7061 7274 7326 6c74 3b26 6c74 lt;nparts<< │ │ │ │ +00032db0: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
1380< │ │ │ │ +00032e10: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#endif.
13 │ │ │ │ +00032e90: 3831 3c2f 7370 616e 3e3c 7370 616e 2063 81#ifdef PERF_ │ │ │ │ +00032ec0: 5245 5041 5254 3c2f 7370 616e 3e3c 2f64 REPART.
138 │ │ │ │ +00032f20: 323c 2f73 7061 6e3e 2020 2020 2020 3c73 2 // stop the │ │ │ │ +00032f50: 7469 6d65 2066 6f72 2073 7465 7020 3229 time for step 2) │ │ │ │ +00032f60: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00032f80: 3c61 2069 643d 226c 3031 3338 3322 206e 1383 t2=MPI_W │ │ │ │ +00032fd0: 7469 6d65 2829 2d74 323b 3c2f 6469 763e time()-t2;
│ │ │ │ +00032fe0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00033010: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1384 // reset timer │ │ │ │ +00033060: 666f 7220 7374 6570 2033 293c 2f73 7061 for step 3)
.
1385 │ │ │ │ +000330d0: 2020 2074 333d 4d50 495f 5774 696d 6528 t3=MPI_Wtime( │ │ │ │ +000330e0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1386#endif
.
< │ │ │ │ +000331a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000331b0: 6e6f 223e 2031 3338 373c 2f73 7061 6e3e no"> 1387 │ │ │ │ +000331c0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00033210: 2031 3338 383c 2f73 7061 6e3e 203c 2f64 1388 .
138 │ │ │ │ +00033270: 393c 2f73 7061 6e3e 2020 2020 2020 3c73 9 if(verbose) {.
1390 │ │ │ │ +00033300: 3c2f 7370 616e 3e20 2020 2020 2020 206f o │ │ │ │ +00033310: 6f63 6f6d 6d2e 3c61 2063 6c61 7373 3d22 ocomm.communica │ │ │ │ +00033370: 746f 723c 2f61 3e28 292e 6261 7272 6965 tor().barrie │ │ │ │ +00033380: 7228 293b 3c2f 6469 763e 0a3c 6469 7620 r();
.
1391 │ │ │ │ +000333e0: 2020 2020 2020 203c 7370 616e 2063 6c61 if(oocom │ │ │ │ +00033410: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +00033470: 2f61 3e28 292e 7261 6e6b 2829 3d3d 3029 /a>().rank()==0) │ │ │ │ +00033480: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000334d0: 3133 3932 3c2f 7370 616e 3e20 2020 2020 1392 │ │ │ │ +000334e0: 2020 2020 2073 7464 3a3a 636f 7574 266c std::cout&l │ │ │ │ +000334f0: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<"Parmetis │ │ │ │ +00033520: 2074 6f6f 6b20 2671 756f 743b 3c2f 7370 took "<<time. │ │ │ │ +00033540: 656c 6170 7365 6428 2926 6c74 3b26 6c74 elapsed()<< │ │ │ │ +00033550: 3b73 7464 3a3a 656e 646c 3b3c 2f64 6976 ;std::endl;
.
1393< │ │ │ │ +000335b0: 2f73 7061 6e3e 2020 2020 2020 7d3c 2f64 /span> }.
139 │ │ │ │ +00033610: 343c 2f73 7061 6e3e 2020 2020 2020 7469 4 ti │ │ │ │ +00033620: 6d65 2e72 6573 6574 2829 3b3c 2f64 6976 me.reset();
.
1395< │ │ │ │ +00033680: 2f73 7061 6e3e 2020 2020 7d3c 7370 616e /span> }else │ │ │ │ +000336b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00033700: 3133 3936 3c2f 7370 616e 3e3c 7370 616e 1396#endif
.
1397 │ │ │ │ +00033790: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
1398 │ │ │ │ +000337f0: 2020 2020 3c73 7061 6e20 636c 6173 733d // Eve │ │ │ │ +00033810: 7279 7468 696e 6720 676f 6573 2074 6f20 rything goes to │ │ │ │ +00033820: 7072 6f63 6573 7320 3021 3c2f 7370 616e process 0!
.
│ │ │ │ +00033880: 2031 3339 393c 2f73 7061 6e3e 2020 2020 1399 │ │ │ │ +00033890: 2020 3c73 7061 6e20 636c 6173 733d 226b for< │ │ │ │ +000338b0: 2f73 7061 6e3e 2873 7464 3a3a 7369 7a65 /span>(std::size │ │ │ │ +000338c0: 5f74 2069 3d30 3b20 6926 6c74 3b69 6e64 _t i=0; i<ind │ │ │ │ +000338d0: 6578 4d61 702e 6e75 6d4f 664f 776e 5674 exMap.numOfOwnVt │ │ │ │ +000338e0: 7828 293b 202b 2b69 293c 2f64 6976 3e0a x(); ++i)
. │ │ │ │ +000338f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +00033970: 6120 6964 3d22 6c30 3134 3031 2220 6e61 a id="l01401" na │ │ │ │ +00033980: 6d65 3d22 6c30 3134 3031 223e 3c2f 613e me="l01401"> │ │ │ │ +00033990: 3c73 7061 6e20 636c 6173 733d 226c 696e 1401 }
.< │ │ │ │ +000339d0: 6120 6964 3d22 6c30 3134 3032 2220 6e61 a id="l01402" na │ │ │ │ +000339e0: 6d65 3d22 6c30 3134 3032 223e 3c2f 613e me="l01402"> │ │ │ │ +000339f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1402
.
1403 .
14 │ │ │ │ +00033ac0: 3034 3c2f 7370 616e 3e20 2020 203c 7370 04 //.
1405 │ │ │ │ +00033b40: 3c2f 7370 616e 3e20 2020 203c 7370 616e // 3) Find a op │ │ │ │ +00033b70: 7469 6d61 6c20 646f 6d61 696e 2062 6173 timal domain bas │ │ │ │ +00033b80: 6564 206f 6e20 7468 6520 5061 724d 4554 ed on the ParMET │ │ │ │ +00033b90: 4953 2072 6570 6172 7469 7469 6f6e 696e IS repartitionin │ │ │ │ +00033ba0: 673c 2f73 7061 6e3e 3c2f 6469 763e 0a3c g
.< │ │ │ │ +00033bb0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00033bc0: 3e3c 6120 6964 3d22 6c30 3134 3036 2220 > 1406
// │ │ │ │ +00033c20: 2020 2072 6573 756c 743c 2f73 7061 6e3e result │ │ │ │ +00033c30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00033c80: 3134 3037 3c2f 7370 616e 3e20 2020 203c 1407 < │ │ │ │ +00033c90: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00033ca0: 656e 7422 3e2f 2f3c 2f73 7061 6e3e 3c2f ent">//.
14 │ │ │ │ +00033d00: 3038 3c2f 7370 616e 3e20 3c2f 6469 763e 08
│ │ │ │ +00033d10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00033d40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1409 std::ve │ │ │ │ +00033d70: 6374 6f72 266c 743b 696e 7426 6774 3b20 ctor<int> │ │ │ │ +00033d80: 646f 6d61 696e 4d61 7070 696e 6728 6e70 domainMapping(np │ │ │ │ +00033d90: 6172 7473 293b 3c2f 6469 763e 0a3c 6469 arts);
.< │ │ │ │ +00033db0: 6120 6964 3d22 6c30 3134 3130 2220 6e61 a id="l01410" na │ │ │ │ +00033dc0: 6d65 3d22 6c30 3134 3130 223e 3c2f 613e me="l01410"> │ │ │ │ +00033dd0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1410 i │ │ │ │ +00033e10: 663c 2f73 7061 6e3e 286e 7061 7274 7326 f(nparts& │ │ │ │ +00033e20: 6774 3b31 293c 2f64 6976 3e0a 3c64 6976 gt;1)
.
< │ │ │ │ +00033e60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00033e70: 6e6f 223e 2031 3431 313c 2f73 7061 6e3e no"> 1411 │ │ │ │ +00033e80: 2020 2020 2020 6765 7444 6f6d 6169 6e28 getDomain( │ │ │ │ +00033e90: 636f 6d6d 2c20 7061 7274 2c20 696e 6465 comm, part, inde │ │ │ │ +00033ea0: 784d 6170 2e6e 756d 4f66 4f77 6e56 7478 xMap.numOfOwnVtx │ │ │ │ +00033eb0: 2829 2c20 6e70 6172 7473 2c20 2661 6d70 (), nparts, & │ │ │ │ +00033ec0: 3b6d 7944 6f6d 6169 6e2c 2064 6f6d 6169 ;myDomain, domai │ │ │ │ +00033ed0: 6e4d 6170 7069 6e67 293b 3c2f 6469 763e nMapping);
│ │ │ │ +00033ee0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00033f10: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1412 else.
14 │ │ │ │ +00033fb0: 3133 3c2f 7370 616e 3e20 2020 2020 2064 13 d │ │ │ │ +00033fc0: 6f6d 6169 6e4d 6170 7069 6e67 5b30 5d3d omainMapping[0]= │ │ │ │ +00033fd0: 303b 3c2f 6469 763e 0a3c 6469 7620 636c 0;
.
1414 .
14 │ │ │ │ +00034080: 3135 3c2f 7370 616e 3e3c 7370 616e 2063 15#ifdef DEBUG │ │ │ │ +000340b0: 5f52 4550 4152 543c 2f73 7061 6e3e 3c2f _REPART.
14 │ │ │ │ +00034110: 3136 3c2f 7370 616e 3e20 2020 2073 7464 16 std │ │ │ │ +00034120: 3a3a 636f 7574 266c 743b 266c 743b 6d79 ::cout<<my │ │ │ │ +00034130: 7065 266c 743b 266c 743b 3c73 7061 6e20 pe<<": my │ │ │ │ +00034160: 446f 6d61 696e 3a20 2671 756f 743b 3c2f Domain: "<<myD │ │ │ │ +00034180: 6f6d 6169 6e26 6c74 3b26 6c74 3b73 7464 omain<<std │ │ │ │ +00034190: 3a3a 656e 646c 3b3c 2f64 6976 3e0a 3c64 ::endl;
. │ │ │ │ +000341b0: 3c61 2069 643d 226c 3031 3431 3722 206e 1417 std::cout& │ │ │ │ +00034200: 6c74 3b26 6c74 3b6d 7970 6526 6c74 3b26 lt;<mype<& │ │ │ │ +00034210: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +00034230: 7175 6f74 3b3a 2044 6f6d 6169 6e4d 6170 quot;: DomainMap │ │ │ │ +00034240: 7069 6e67 3a20 2671 756f 743b 3c2f 7370 ping: ";
.
1418 │ │ │ │ +000342b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +000342d0: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (au │ │ │ │ +000342f0: 746f 3c2f 7370 616e 3e20 6a20 3a20 7261 to j : ra │ │ │ │ +00034300: 6e67 6528 6e70 6172 7473 2929 207b 3c2f nge(nparts)) {.
14 │ │ │ │ +00034360: 3139 3c2f 7370 616e 3e20 2020 2020 2073 19 s │ │ │ │ +00034370: 7464 3a3a 636f 7574 266c 743b 266c 743b td::cout<< │ │ │ │ +00034380: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +000343a0: 743b 2064 6f3a 2026 7175 6f74 3b3c 2f73 t; do: "<<j< │ │ │ │ +000343c0: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<" pe: &quo │ │ │ │ +000343f0: 743b 3c2f 7370 616e 3e26 6c74 3b26 6c74 t;<< │ │ │ │ +00034400: 3b64 6f6d 6169 6e4d 6170 7069 6e67 5b6a ;domainMapping[j │ │ │ │ +00034410: 5d26 6c74 3b26 6c74 3b3c 7370 616e 2063 ]<<" &quo │ │ │ │ +00034440: 743b 3c2f 7370 616e 3e3b 3c2f 6469 763e t;;
│ │ │ │ +00034450: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +000344b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000344e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1421 std::co │ │ │ │ +00034510: 7574 266c 743b 266c 743b 7374 643a 3a65 ut<<std::e │ │ │ │ +00034520: 6e64 6c3b 3c2f 6469 763e 0a3c 6469 7620 ndl;
.
1422< │ │ │ │ +00034580: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +00034590: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor">#endif │ │ │ │ +000345a0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +000345c0: 3c61 2069 643d 226c 3031 3432 3322 206e 1423
.
1424 │ │ │ │ +00034660: 2020 3c73 7061 6e20 636c 6173 733d 2263 // Make │ │ │ │ +00034680: 6120 646f 6d61 696e 206d 6170 7069 6e67 a domain mapping │ │ │ │ +00034690: 2066 6f72 2074 6865 2069 6e64 6578 7365 for the indexse │ │ │ │ +000346a0: 7420 616e 6420 7472 616e 736c 6174 653c t and translate< │ │ │ │ +000346b0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +000346d0: 6120 6964 3d22 6c30 3134 3235 2220 6e61 a id="l01425" na │ │ │ │ +000346e0: 6d65 3d22 6c30 3134 3235 223e 3c2f 613e me="l01425"> │ │ │ │ +000346f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1425 //dom │ │ │ │ +00034730: 6169 6e20 6e75 6d62 6572 2074 6f20 7265 ain number to re │ │ │ │ +00034740: 616c 2070 726f 6365 7373 206e 756d 6265 al process numbe │ │ │ │ +00034750: 723c 2f73 7061 6e3e 3c2f 6469 763e 0a3c r
.< │ │ │ │ +00034760: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00034770: 3e3c 6120 6964 3d22 6c30 3134 3236 2220 > 1426 // │ │ │ │ +000347d0: 646f 6d61 696e 4d61 7070 696e 6720 6973 domainMapping is │ │ │ │ +000347e0: 2074 6865 206f 6e65 206f 6620 7061 726d the one of parm │ │ │ │ +000347f0: 6574 6973 2c20 7468 6174 2069 7320 7769 etis, that is wi │ │ │ │ +00034800: 7468 6f75 743c 2f73 7061 6e3e 3c2f 6469 thout.
1427 │ │ │ │ +00034860: 3c2f 7370 616e 3e20 2020 203c 7370 616e // the overlap/ │ │ │ │ +00034890: 636f 7079 2076 6572 7469 6365 733c 2f73 copy vertices
.
1428 │ │ │ │ +00034900: 2020 2073 7464 3a3a 7665 6374 6f72 266c std::vector&l │ │ │ │ +00034910: 743b 696e 7426 6774 3b20 7365 7450 6172 t;int> setPar │ │ │ │ +00034920: 7469 7469 6f6e 286f 6f63 6f6d 6d2e 3c61 tition(oocomm.i │ │ │ │ +00034980: 6e64 6578 5365 743c 2f61 3e28 292e 7369 ndexSet().si │ │ │ │ +00034990: 7a65 2829 2c20 2d31 293b 3c2f 6469 763e ze(), -1);
│ │ │ │ +000349a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00034a10: 6120 6964 3d22 6c30 3134 3330 2220 6e61 a id="l01430" na │ │ │ │ +00034a20: 6d65 3d22 6c30 3134 3330 223e 3c2f 613e me="l01430"> │ │ │ │ +00034a30: 3c73 7061 6e20 636c 6173 733d 226c 696e 1430 std::size_t │ │ │ │ +00034a60: 2069 3d30 3b20 3c73 7061 6e20 636c 6173 i=0; // p │ │ │ │ +00034a80: 6172 6d65 7469 7320 696e 6465 783c 2f73 armetis index
.
1431 │ │ │ │ +00034af0: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +00034b10: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (au │ │ │ │ +00034b30: 746f 3c2f 7370 616e 3e20 696e 6465 7820 to index │ │ │ │ +00034b40: 3d20 6f6f 636f 6d6d 2e3c 6120 636c 6173 = oocomm.indexS │ │ │ │ +00034ba0: 6574 3c2f 613e 2829 2e62 6567 696e 2829 et().begin() │ │ │ │ +00034bb0: 3b20 696e 6465 7820 213d 206f 6f63 6f6d ; index != oocom │ │ │ │ +00034bc0: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.indexSet( │ │ │ │ +00034c20: 292e 656e 6428 293b 202b 2b69 6e64 6578 ).end(); ++index │ │ │ │ +00034c30: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +00034c80: 2031 3433 323c 2f73 7061 6e3e 2020 2020 1432 │ │ │ │ +00034c90: 2020 3c73 7061 6e20 636c 6173 733d 226b if(OwnerSet:: │ │ │ │ +00034cc0: 636f 6e74 6169 6e73 2869 6e64 6578 2d26 contains(index-& │ │ │ │ +00034cd0: 6774 3b6c 6f63 616c 2829 2e61 7474 7269 gt;local().attri │ │ │ │ +00034ce0: 6275 7465 2829 2929 207b 3c2f 6469 763e bute())) {
│ │ │ │ +00034cf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00034d20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1433 set │ │ │ │ +00034d50: 5061 7274 6974 696f 6e5b 696e 6465 782d Partition[index- │ │ │ │ +00034d60: 2667 743b 6c6f 6361 6c28 295d 3d64 6f6d >local()]=dom │ │ │ │ +00034d70: 6169 6e4d 6170 7069 6e67 5b70 6172 745b ainMapping[part[ │ │ │ │ +00034d80: 692b 2b5d 5d3b 3c2f 6469 763e 0a3c 6469 i++]];
.< │ │ │ │ +00034da0: 6120 6964 3d22 6c30 3134 3334 2220 6e61 a id="l01434" na │ │ │ │ +00034db0: 6d65 3d22 6c30 3134 3334 223e 3c2f 613e me="l01434"> │ │ │ │ +00034dc0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1434 }
.< │ │ │ │ +00034df0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00034e00: 3e3c 6120 6964 3d22 6c30 3134 3335 2220 > 1435
.
1436 │ │ │ │ +00034ea0: 2020 203c 7370 616e 2063 6c61 7373 3d22 delete< │ │ │ │ +00034ec0: 2f73 7061 6e3e 5b5d 2070 6172 743b 3c2f /span>[] part;.
14 │ │ │ │ +00034f20: 3337 3c2f 7370 616e 3e20 2020 206f 6f63 37 ooc │ │ │ │ +00034f30: 6f6d 6d2e 3c61 2063 6c61 7373 3d22 636f omm.copyOwnerTo │ │ │ │ +00034f90: 416c 6c3c 2f61 3e28 7365 7450 6172 7469 All(setParti │ │ │ │ +00034fa0: 7469 6f6e 2c20 7365 7450 6172 7469 7469 tion, setPartiti │ │ │ │ +00034fb0: 6f6e 293b 3c2f 6469 763e 0a3c 6469 7620 on);
.
1438 │ │ │ │ +00035010: 2020 203c 7370 616e 2063 6c61 7373 3d22 // comm │ │ │ │ +00035030: 756e 6963 6174 696f 6e20 6f6e 6c79 206e unication only n │ │ │ │ +00035040: 6565 6465 6420 666f 7220 414c 553c 2f73 eeded for ALU
.
1439 │ │ │ │ +000350b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // (gho │ │ │ │ +000350d0: 7374 7320 7769 7468 2073 616d 6520 676c sts with same gl │ │ │ │ +000350e0: 6f62 616c 2069 6420 6173 206f 776e 6572 obal id as owner │ │ │ │ +000350f0: 7320 6f6e 2074 6865 2073 616d 6520 7072 s on the same pr │ │ │ │ +00035100: 6f63 6573 7329 3c2f 7370 616e 3e3c 2f64 ocess).
144 │ │ │ │ +00035160: 303c 2f73 7061 6e3e 2020 2020 3c73 7061 0 if │ │ │ │ +00035190: 2853 6f6c 7665 7243 6174 6567 6f72 793a (SolverCategory: │ │ │ │ +000351a0: 3a63 6174 6567 6f72 7928 6f6f 636f 6d6d :category(oocomm │ │ │ │ +000351b0: 2920 3d3d 3c2f 6469 763e 0a3c 6469 7620 ) ==
.
1441 │ │ │ │ +00035210: 2020 2020 2020 203c 7370 616e 2063 6c61 sta │ │ │ │ +00035230: 7469 635f 6361 7374 266c 743b 3c2f 7370 tic_cast<int │ │ │ │ +00035260: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 > │ │ │ │ +00035280: 3b3c 2f73 7061 6e3e 2853 6f6c 7665 7243 ;(SolverC │ │ │ │ +00035290: 6174 6567 6f72 793a 3a6e 6f6e 6f76 6572 ategory::nonover │ │ │ │ +000352a0: 6c61 7070 696e 6729 293c 2f64 6976 3e0a lapping))
. │ │ │ │ +000352b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
│ │ │ │ +000353e0: 3134 3433 3c2f 7370 616e 3e20 2020 203c 1443 < │ │ │ │ +000353f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00035400: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype">bool ret = buil │ │ │ │ +00035470: 6443 6f6d 6d75 6e69 6361 7469 6f6e 3c2f dCommunication(graph, setPar │ │ │ │ +00035490: 7469 7469 6f6e 2c20 6f6f 636f 6d6d 2c20 tition, oocomm, │ │ │ │ +000354a0: 6f75 7463 6f6d 6d2c 2072 6564 6973 7449 outcomm, redistI │ │ │ │ +000354b0: 6e66 2c3c 2f64 6976 3e0a 3c64 6976 2063 nf,
.
1444 │ │ │ │ +00035510: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00035520: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00035530: 7665 7262 6f73 6529 3b3c 2f64 6976 3e0a verbose);
. │ │ │ │ +00035540: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +000355e0: 6120 6964 3d22 6c30 3134 3436 2220 6e61 a id="l01446" na │ │ │ │ +000355f0: 6d65 3d22 6c30 3134 3436 223e 3c2f 613e me="l01446"> │ │ │ │ +00035600: 3c73 7061 6e20 636c 6173 733d 226c 696e 1446 oocomm.c │ │ │ │ +00035680: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +00035690: 292e 6261 7272 6965 7228 293b 3c2f 6469 ).barrier();.
1447 │ │ │ │ +000356f0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 if │ │ │ │ +00035720: 286f 6f63 6f6d 6d2e 3c61 2063 6c61 7373 (oocomm.communi │ │ │ │ +00035780: 6361 746f 723c 2f61 3e28 292e 7261 6e6b cator().rank │ │ │ │ +00035790: 2829 3d3d 3029 3c2f 6469 763e 0a3c 6469 ()==0)
.< │ │ │ │ +000357b0: 6120 6964 3d22 6c30 3134 3438 2220 6e61 a id="l01448" na │ │ │ │ +000357c0: 6d65 3d22 6c30 3134 3438 223e 3c2f 613e me="l01448"> │ │ │ │ +000357d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1448 std::co │ │ │ │ +00035800: 7574 266c 743b 266c 743b 3c73 7061 6e20 ut<<"Crea │ │ │ │ +00035830: 7469 6e67 2069 6e64 6578 7365 7473 2074 ting indexsets t │ │ │ │ +00035840: 6f6f 6b20 2671 756f 743b 3c2f 7370 616e ook "<<time.el │ │ │ │ +00035860: 6170 7365 6428 2926 6c74 3b26 6c74 3b73 apsed()<<s │ │ │ │ +00035870: 7464 3a3a 656e 646c 3b3c 2f64 6976 3e0a td::endl;
. │ │ │ │ +00035880: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +000358e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1451 │ │ │ │ +000359c0: 207d 3c2f 6469 763e 0a3c 2f64 6976 3e0a }
.
. │ │ │ │ +000359d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +00035a60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00035a70: 6e6f 223e 2031 3435 333c 2f73 7061 6e3e no"> 1453 │ │ │ │ +00035a80: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +00035ad0: 2031 3435 343c 2f73 7061 6e3e 203c 2f64 1454 .
145 │ │ │ │ +00035b30: 353c 2f73 7061 6e3e 2020 3c73 7061 6e20 5 │ │ │ │ +00035b50: 7465 6d70 6c61 7465 3c2f 7370 616e 3e26 template& │ │ │ │ +00035b60: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class G, c │ │ │ │ +00035ba0: 6c61 7373 3c2f 7370 616e 3e20 5431 2c20 lass T1, │ │ │ │ +00035bb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 class T2>
. │ │ │ │ +00035be0: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
..
1457 │ │ │ │ +00035de0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00035df0: 2020 2020 2020 2020 7374 643a 3a76 6563 std::vec │ │ │ │ +00035e00: 746f 7226 6c74 3b69 6e74 2667 743b 2661 tor<int>&a │ │ │ │ +00035e10: 6d70 3b20 7365 7450 6172 7469 7469 6f6e mp; setPartition │ │ │ │ +00035e20: 2c20 3c61 2063 6c61 7373 3d22 636f 6465 , Du │ │ │ │ +00035e50: 6e65 3a3a 4f77 6e65 724f 7665 726c 6170 ne::OwnerOverlap │ │ │ │ +00035e60: 436f 7079 436f 6d6d 756e 6963 6174 696f CopyCommunicatio │ │ │ │ +00035e70: 6e26 6c74 3b54 312c 5432 2667 743b 3c2f n<T1,T2>& oocomm,< │ │ │ │ +00035e90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00035ee0: 3435 383c 2f73 7061 6e3e 2020 2020 2020 458 │ │ │ │ +00035ef0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00035f00: 2020 2020 7374 643a 3a73 6861 7265 645f std::shared_ │ │ │ │ +00035f10: 7074 7226 6c74 3b3c 6120 636c 6173 733d ptr<Dune::OwnerOv │ │ │ │ +00035f50: 6572 6c61 7043 6f70 7943 6f6d 6d75 6e69 erlapCopyCommuni │ │ │ │ +00035f60: 6361 7469 6f6e 266c 743b 5431 2c54 3226 cation<T1,T2& │ │ │ │ +00035f70: 6774 3b3c 2f61 3e26 6774 3b26 616d 703b gt;>& │ │ │ │ +00035f80: 206f 7574 636f 6d6d 2c3c 2f64 6976 3e0a outcomm,
. │ │ │ │ +00035f90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1460 │ │ │ │ +000360b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000360c0: 2020 2020 2020 2020 203c 7370 616e 2063 bool v │ │ │ │ +000360f0: 6572 626f 7365 293c 2f64 6976 3e0a 3c64 erbose)
. │ │ │ │ +00036110: 3c61 2069 643d 226c 3031 3436 3122 206e 1461 {
.
< │ │ │ │ +00036190: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000361a0: 6e6f 223e 2031 3436 323c 2f73 7061 6e3e no"> 1462 │ │ │ │ +000361b0: 2020 2020 3c73 7061 6e20 636c 6173 733d typede │ │ │ │ +000361d0: 663c 2f73 7061 6e3e 203c 7370 616e 2063 f t │ │ │ │ +000361f0: 7970 656e 616d 653c 2f73 7061 6e3e 2020 ypename │ │ │ │ +00036200: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Dune │ │ │ │ +00036230: 3a3a 4f77 6e65 724f 7665 726c 6170 436f ::OwnerOverlapCo │ │ │ │ +00036240: 7079 436f 6d6d 756e 6963 6174 696f 6e26 pyCommunication& │ │ │ │ +00036250: 6c74 3b54 312c 5432 2667 743b 3c2f 613e lt;T1,T2> │ │ │ │ +00036260: 204f 4f43 6f6d 6d3b 3c2f 6469 763e 0a3c OOComm;
.< │ │ │ │ +00036270: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00036280: 3e3c 6120 6964 3d22 6c30 3134 3633 2220 > 1463 typ │ │ │ │ +000362e0: 6564 6566 3c2f 7370 616e 3e20 3c73 7061 edef typename OOComm::Owner │ │ │ │ +00036320: 5365 7420 4f77 6e65 7253 6574 3b3c 2f64 Set OwnerSet;.
146 │ │ │ │ +00036380: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
. │ │ │ │ +00036390: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1466 < │ │ │ │ +00036450: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +000364a0: 3436 373c 2f73 7061 6e3e 2020 2020 3c73 467 // Build the │ │ │ │ +000364d0: 2073 656e 6420 696e 7465 7266 6163 653c send interface< │ │ │ │ +000364e0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00036500: 6120 6964 3d22 6c30 3134 3638 2220 6e61 a id="l01468" na │ │ │ │ +00036510: 6d65 3d22 6c30 3134 3638 223e 3c2f 613e me="l01468"> │ │ │ │ +00036520: 3c73 7061 6e20 636c 6173 733d 226c 696e 1468 redistInf.< │ │ │ │ +00036550: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +00036560: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +00036570: 2261 3032 3634 302e 6874 6d6c 2361 3935 "a02640.html#a95 │ │ │ │ +00036580: 3039 6434 6464 3736 3330 6233 3539 3464 09d4dd7630b3594d │ │ │ │ +00036590: 6162 6139 3039 3661 6330 3339 3365 223e aba9096ac0393e"> │ │ │ │ +000365a0: 6275 696c 6453 656e 6449 6e74 6572 6661 buildSendInterfa │ │ │ │ +000365b0: 6365 3c2f 613e 266c 743b 4f77 6e65 7253 ce<OwnerS │ │ │ │ +000365c0: 6574 2667 743b 2873 6574 5061 7274 6974 et>(setPartit │ │ │ │ +000365d0: 696f 6e2c 206f 6f63 6f6d 6d2e 3c61 2063 ion, oocomm.ind │ │ │ │ +00036630: 6578 5365 743c 2f61 3e28 2929 3b3c 2f64 exSet());.
146 │ │ │ │ +00036690: 393c 2f73 7061 6e3e 203c 2f64 6976 3e0a 9
. │ │ │ │ +000366a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.< │ │ │ │ +00036730: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00036740: 3e3c 6120 6964 3d22 6c30 3134 3731 2220 > 1471
// │ │ │ │ +000367a0: 7374 6f70 2074 6865 2074 696d 6520 666f stop the time fo │ │ │ │ +000367b0: 7220 7374 6570 2033 293c 2f73 7061 6e3e r step 3) │ │ │ │ +000367c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00036810: 3134 3732 3c2f 7370 616e 3e20 2020 2074 1472 t │ │ │ │ +00036820: 333d 4d50 495f 5774 696d 6528 292d 7433 3=MPI_Wtime()-t3 │ │ │ │ +00036830: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00036880: 2031 3437 333c 2f73 7061 6e3e 2020 2020 1473 │ │ │ │ +00036890: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // reset t │ │ │ │ +000368b0: 696d 6572 2066 6f72 2073 7465 7020 3429 imer for step 4) │ │ │ │ +000368c0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +000368e0: 3c61 2069 643d 226c 3031 3437 3422 206e 1474 t4=MPI_Wti │ │ │ │ +00036930: 6d65 2829 3b3c 2f64 6976 3e0a 3c64 6976 me();
.
< │ │ │ │ +00036970: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00036980: 6e6f 223e 2031 3437 353c 2f73 7061 6e3e no"> 1475 │ │ │ │ +00036990: 3c73 7061 6e20 636c 6173 733d 2270 7265 #endi │ │ │ │ +000369b0: 663c 2f73 7061 6e3e 3c2f 6469 763e 0a3c f
.< │ │ │ │ +000369c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000369d0: 3e3c 6120 6964 3d22 6c30 3134 3736 2220 > 1476
.
1477 │ │ │ │ +00036a70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00036ac0: 3134 3738 3c2f 7370 616e 3e20 2020 203c 1478 < │ │ │ │ +00036ad0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00036ae0: 656e 7422 3e2f 2f3c 2f73 7061 6e3e 3c2f ent">//.
14 │ │ │ │ +00036b40: 3739 3c2f 7370 616e 3e20 2020 203c 7370 79 // 4) Create │ │ │ │ +00036b70: 7468 6520 6f75 7470 7574 2049 6e64 6578 the output Index │ │ │ │ +00036b80: 5365 7420 616e 6420 5265 6d6f 7465 496e Set and RemoteIn │ │ │ │ +00036b90: 6469 6365 733c 2f73 7061 6e3e 3c2f 6469 dices.
1480 │ │ │ │ +00036bf0: 3c2f 7370 616e 3e20 2020 203c 7370 616e // 4.1) Dete │ │ │ │ +00036c20: 726d 696e 6520 7468 6520 2671 756f 743b rmine the " │ │ │ │ +00036c30: 7365 6e64 2074 6f26 7175 6f74 3b20 616e send to" an │ │ │ │ +00036c40: 6420 2671 756f 743b 7265 6365 6976 6520 d "receive │ │ │ │ +00036c50: 6672 6f6d 2671 756f 743b 2072 656c 6174 from" relat │ │ │ │ +00036c60: 696f 6e3c 2f73 7061 6e3e 3c2f 6469 763e ion
│ │ │ │ +00036c70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00036ca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1481 / │ │ │ │ +00036ce0: 2f20 2020 2020 2020 2020 6163 636f 7264 / accord │ │ │ │ +00036cf0: 696e 6720 746f 2074 6865 206e 6577 2070 ing to the new p │ │ │ │ +00036d00: 6172 7469 7469 6f6e 2075 7369 6e67 2061 artition using a │ │ │ │ +00036d10: 204d 5049 2072 696e 673c 2f73 7061 6e3e MPI ring │ │ │ │ +00036d20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00036d70: 3134 3832 3c2f 7370 616e 3e20 2020 203c 1482 < │ │ │ │ +00036d80: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00036d90: 656e 7422 3e2f 2f20 2020 2020 2020 2020 ent">// │ │ │ │ +00036da0: 636f 6d6d 756e 6963 6174 696f 6e2e 3c2f communication.
.
< │ │ │ │ +00036df0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00036e00: 6e6f 223e 2031 3438 333c 2f73 7061 6e3e no"> 1483 │ │ │ │ +00036e10: 2020 2020 3c73 7061 6e20 636c 6173 733d //
.
1484 │ │ │ │ +00036e90: 2020 3c73 7061 6e20 636c 6173 733d 2263 // 4. │ │ │ │ +00036eb0: 3229 2044 6570 656e 6473 206f 6e20 7468 2) Depends on th │ │ │ │ +00036ec0: 6520 2671 756f 743b 7365 6e64 2074 6f26 e "send to& │ │ │ │ +00036ed0: 7175 6f74 3b20 616e 6420 2671 756f 743b quot; and " │ │ │ │ +00036ee0: 7265 6365 6976 6520 6672 6f6d 2671 756f receive from&quo │ │ │ │ +00036ef0: 743b 2076 6563 746f 722c 3c2f 7370 616e t; vector,
.
│ │ │ │ +00036f50: 2031 3438 353c 2f73 7061 6e3e 2020 2020 1485 │ │ │ │ +00036f60: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // │ │ │ │ +00036f80: 2074 6865 2070 726f 6365 7373 6573 2077 the processes w │ │ │ │ +00036f90: 696c 6c20 6578 6368 616e 6765 2074 6865 ill exchange the │ │ │ │ +00036fa0: 2076 6572 7469 6365 7320 6561 6368 206f vertices each o │ │ │ │ +00036fb0: 7468 6572 3c2f 7370 616e 3e3c 2f64 6976 ther
.
1486< │ │ │ │ +00037010: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ │ +00037030: 2f2f 3c2f 7370 616e 3e3c 2f64 6976 3e0a //
. │ │ │ │ +00037040: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1488 │ │ │ │ +00037150: 203c 7370 616e 2063 6c61 7373 3d22 636f // │ │ │ │ +00037170: 2020 636f 6d6d 756e 6963 6174 6f72 3c2f communicator
.
< │ │ │ │ +000371c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +000371d0: 6e6f 223e 2031 3438 393c 2f73 7061 6e3e no"> 1489 │ │ │ │ +000371e0: 2020 2020 3c73 7061 6e20 636c 6173 733d //
.
1490 < │ │ │ │ +00037260: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +000372b0: 3439 313c 2f73 7061 6e3e 2020 2020 3c73 491 //.
149 │ │ │ │ +00037330: 323c 2f73 7061 6e3e 2020 2020 3c73 7061 2 // 4.1) Let │ │ │ │ +00037360: 393b 7320 7374 6172 742e 2e2e 3c2f 7370 9;s start...
.
1493 │ │ │ │ +000373d0: 2020 3c73 7061 6e20 636c 6173 733d 2263 //
.
│ │ │ │ +00037440: 2031 3439 343c 2f73 7061 6e3e 2020 2020 1494 │ │ │ │ +00037450: 3c73 7061 6e20 636c 6173 733d 226b 6579 int npes = ooco │ │ │ │ +00037480: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +000374e0: 3c2f 613e 2829 2e73 697a 6528 293b 3c2f ().size();.
14 │ │ │ │ +00037540: 3935 3c2f 7370 616e 3e20 2020 203c 7370 95 int *sendTo = 0;.
14 │ │ │ │ +000375d0: 3936 3c2f 7370 616e 3e20 2020 203c 7370 96 int noSendTo = 0;< │ │ │ │ +00037610: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00037660: 3439 373c 2f73 7061 6e3e 2020 2020 7374 497 st │ │ │ │ +00037670: 643a 3a73 6574 266c 743b 696e 7426 6774 d::set<int> │ │ │ │ +00037680: 3b20 7265 6376 4672 6f6d 3b3c 2f64 6976 ; recvFrom;
.
1498< │ │ │ │ +000376e0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00037700: 3c61 2069 643d 226c 3031 3439 3922 206e 1499 // t │ │ │ │ +00037760: 6865 206d 6178 206e 756d 6265 7220 6f66 he max number of │ │ │ │ +00037770: 2076 6572 7469 6365 7320 6973 2073 746f vertices is sto │ │ │ │ +00037780: 7265 6420 696e 2074 6865 2073 656e 6454 red in the sendT │ │ │ │ +00037790: 6f20 6275 6666 6572 2c3c 2f73 7061 6e3e o buffer, │ │ │ │ +000377a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000377f0: 3135 3030 3c2f 7370 616e 3e20 2020 203c 1500 < │ │ │ │ +00037800: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +00037810: 656e 7422 3e2f 2f20 6e6f 7420 7468 6520 ent">// not the │ │ │ │ +00037820: 6e75 6d62 6572 206f 6620 7665 7274 6963 number of vertic │ │ │ │ +00037830: 6573 2074 6f20 7365 6e64 2120 4265 6361 es to send! Beca │ │ │ │ +00037840: 7573 6520 7468 6520 6d61 7820 6e75 6d62 use the max numb │ │ │ │ +00037850: 6572 206f 6620 5674 783c 2f73 7061 6e3e er of Vtx │ │ │ │ +00037860: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000378b0: 3135 3031 3c2f 7370 616e 3e20 2020 203c 1501 < │ │ │ │ +000378c0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ +000378d0: 656e 7422 3e2f 2f20 6973 2075 7365 6420 ent">// is used │ │ │ │ +000378e0: 6173 2074 6865 2066 6978 6564 2062 7566 as the fixed buf │ │ │ │ +000378f0: 6665 7220 7369 7a65 2062 7920 7468 6520 fer size by the │ │ │ │ +00037900: 4d50 4920 7365 6e64 2f72 6563 6569 7665 MPI send/receive │ │ │ │ +00037910: 2063 616c 6c73 3c2f 7370 616e 3e3c 2f64 calls.
150 │ │ │ │ +00037970: 323c 2f73 7061 6e3e 203c 2f64 6976 3e0a 2
. │ │ │ │ +00037980: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .< │ │ │ │ +00037a90: 6120 6964 3d22 6c30 3135 3034 2220 6e61 a id="l01504" na │ │ │ │ +00037aa0: 6d65 3d22 6c30 3135 3034 223e 3c2f 613e me="l01504"> │ │ │ │ +00037ab0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1504
.
1505 │ │ │ │ +00037b30: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
1506 │ │ │ │ +00037b90: 2020 2073 7464 3a3a 7365 7426 6c74 3b69 std::set<i │ │ │ │ +00037ba0: 6e74 2667 743b 2074 7365 6e64 546f 3b3c nt> tsendTo;< │ │ │ │ +00037bb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00037c00: 3530 373c 2f73 7061 6e3e 2020 2020 2020 507 │ │ │ │ +00037c10: 3c73 7061 6e20 636c 6173 733d 226b 6579 for(auto< │ │ │ │ +00037c50: 2f73 7061 6e3e 2069 3d73 6574 5061 7274 /span> i=setPart │ │ │ │ +00037c60: 6974 696f 6e2e 6265 6769 6e28 292c 2069 ition.begin(), i │ │ │ │ +00037c70: 656e 6420 3d20 7365 7450 6172 7469 7469 end = setPartiti │ │ │ │ +00037c80: 6f6e 2e65 6e64 2829 3b20 6921 3d69 656e on.end(); i!=ien │ │ │ │ +00037c90: 643b 202b 2b69 293c 2f64 6976 3e0a 3c64 d; ++i)
. │ │ │ │ +00037cb0: 3c61 2069 643d 226c 3031 3530 3822 206e 1508 tsendT │ │ │ │ +00037d00: 6f2e 696e 7365 7274 282a 6929 3b3c 2f64 o.insert(*i);.
150 │ │ │ │ +00037d60: 393c 2f73 7061 6e3e 203c 2f64 6976 3e0a 9
. │ │ │ │ +00037d70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
1511 │ │ │ │ +00037e40: 2020 2020 2073 656e 6454 6f20 3d20 3c73 sendTo = new < │ │ │ │ +00037e70: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00037e80: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int[noSendTo];.
15 │ │ │ │ +00037ef0: 3132 3c2f 7370 616e 3e20 2020 2020 203c 12 < │ │ │ │ +00037f00: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00037f10: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int idx=0;
│ │ │ │ +00037f30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00037f60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1513 for( │ │ │ │ +00037fb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto i=tsendTo.begi │ │ │ │ +00037fe0: 6e28 293b 2069 2021 3d20 7473 656e 6454 n(); i != tsendT │ │ │ │ +00037ff0: 6f2e 656e 6428 293b 202b 2b69 2c20 2b2b o.end(); ++i, ++ │ │ │ │ +00038000: 6964 7829 3c2f 6469 763e 0a3c 6469 7620 idx)
.
1514 │ │ │ │ +00038060: 2020 2020 2020 2073 656e 6454 6f5b 6964 sendTo[id │ │ │ │ +00038070: 785d 3d2a 693b 3c2f 6469 763e 0a3c 6469 x]=*i;
.< │ │ │ │ +00038090: 6120 6964 3d22 6c30 3135 3135 2220 6e61 a id="l01515" na │ │ │ │ +000380a0: 6d65 3d22 6c30 3135 3135 223e 3c2f 613e me="l01515"> │ │ │ │ +000380b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1515 }
.< │ │ │ │ +000380f0: 6120 6964 3d22 6c30 3135 3136 2220 6e61 a id="l01516" na │ │ │ │ +00038100: 6d65 3d22 6c30 3135 3136 223e 3c2f 613e me="l01516"> │ │ │ │ +00038110: 3c73 7061 6e20 636c 6173 733d 226c 696e 1516
.
1517 │ │ │ │ +00038190: 203c 7370 616e 2063 6c61 7373 3d22 636f // │ │ │ │ +000381b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00038200: 3135 3138 3c2f 7370 616e 3e20 2020 203c 1518 < │ │ │ │ +00038210: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00038220: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int* gnoSend= new < │ │ │ │ +00038260: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00038270: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int[oocomm.comm │ │ │ │ +000382e0: 756e 6963 6174 6f72 3c2f 613e 2829 2e73 unicator().s │ │ │ │ +000382f0: 697a 6528 295d 3b3c 2f64 6976 3e0a 3c64 ize()];
. │ │ │ │ +00038310: 3c61 2069 643d 226c 3031 3531 3922 206e 1519 │ │ │ │ +00038370: 696e 743c 2f73 7061 6e3e 2a20 6773 656e int* gsen │ │ │ │ +00038380: 6454 6f44 6973 706c 203d 2020 3c73 7061 dToDispl = new int[oocomm.commun │ │ │ │ +00038430: 6963 6174 6f72 3c2f 613e 2829 2e73 697a icator().siz │ │ │ │ +00038440: 6528 292b 315d 3b3c 2f64 6976 3e0a 3c64 e()+1];
. │ │ │ │ +00038460: 3c61 2069 643d 226c 3031 3532 3022 206e 1520
.
1521 │ │ │ │ +00038500: 2020 4d50 495f 416c 6c67 6174 6865 7228 MPI_Allgather( │ │ │ │ +00038510: 2661 6d70 3b6e 6f53 656e 6454 6f2c 2031 &noSendTo, 1 │ │ │ │ +00038520: 2c20 4d50 495f 494e 542c 2067 6e6f 5365 , MPI_INT, gnoSe │ │ │ │ +00038530: 6e64 2c20 312c 3c2f 6469 763e 0a3c 6469 nd, 1,
.< │ │ │ │ +00038550: 6120 6964 3d22 6c30 3135 3232 2220 6e61 a id="l01522" na │ │ │ │ +00038560: 6d65 3d22 6c30 3135 3232 223e 3c2f 613e me="l01522"> │ │ │ │ +00038570: 3c73 7061 6e20 636c 6173 733d 226c 696e 1522 │ │ │ │ +000385a0: 2020 204d 5049 5f49 4e54 2c20 6f6f 636f MPI_INT, ooco │ │ │ │ +000385b0: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +00038610: 3c2f 613e 2829 293b 3c2f 6469 763e 0a3c ());
.< │ │ │ │ +00038620: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00038630: 3e3c 6120 6964 3d22 6c30 3135 3233 2220 > 1523
.
1524 │ │ │ │ +000386d0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // calc │ │ │ │ +000386f0: 756c 6174 6520 746f 7461 6c20 7265 6365 ulate total rece │ │ │ │ +00038700: 6976 6520 6d65 7373 6167 6520 7369 7a65 ive message size │ │ │ │ +00038710: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +00038730: 3c61 2069 643d 226c 3031 3532 3522 206e 1525 │ │ │ │ +00038790: 696e 743c 2f73 7061 6e3e 2074 6f74 616c int total │ │ │ │ +000387a0: 4e6f 5265 6376 203d 2030 3b3c 2f64 6976 NoRecv = 0;
.
1526< │ │ │ │ +00038800: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> for(< │ │ │ │ +00038830: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00038840: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int i=0; i<np │ │ │ │ +00038860: 6573 3b20 2b2b 6929 3c2f 6469 763e 0a3c es; ++i)
.< │ │ │ │ +00038870: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00038880: 3e3c 6120 6964 3d22 6c30 3135 3237 2220 > 1527 totalNo │ │ │ │ +000388d0: 5265 6376 202b 3d20 676e 6f53 656e 645b Recv += gnoSend[ │ │ │ │ +000388e0: 695d 3b3c 2f64 6976 3e0a 3c64 6976 2063 i];
.
1528 < │ │ │ │ +00038940: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00038990: 3532 393c 2f73 7061 6e3e 2020 2020 3c73 529 int *gsendTo = new < │ │ │ │ +000389f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00038a00: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int[totalNoRecv] │ │ │ │ +00038a20: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00038a70: 2031 3533 303c 2f73 7061 6e3e 203c 2f64 1530 .
153 │ │ │ │ +00038ad0: 313c 2f73 7061 6e3e 2020 2020 3c73 7061 1 // calculate d │ │ │ │ +00038b00: 6973 706c 6163 656d 656e 7420 666f 7220 isplacement for │ │ │ │ +00038b10: 616c 6c67 6174 6865 7276 3c2f 7370 616e allgatherv
.
│ │ │ │ +00038b70: 2031 3533 323c 2f73 7061 6e3e 2020 2020 1532 │ │ │ │ +00038b80: 6773 656e 6454 6f44 6973 706c 5b30 5d3d gsendToDispl[0]= │ │ │ │ +00038b90: 303b 3c2f 6469 763e 0a3c 6469 7620 636c 0;
.
1533 │ │ │ │ +00038bf0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for( │ │ │ │ +00038c30: 696e 743c 2f73 7061 6e3e 2069 3d30 3b20 int i=0; │ │ │ │ +00038c40: 6926 6c74 3b6e 7065 733b 202b 2b69 293c i<npes; ++i)< │ │ │ │ +00038c50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00038ca0: 3533 343c 2f73 7061 6e3e 2020 2020 2020 534 │ │ │ │ +00038cb0: 6773 656e 6454 6f44 6973 706c 5b69 2b31 gsendToDispl[i+1 │ │ │ │ +00038cc0: 5d3d 6773 656e 6454 6f44 6973 706c 5b69 ]=gsendToDispl[i │ │ │ │ +00038cd0: 5d2b 676e 6f53 656e 645b 695d 3b3c 2f64 ]+gnoSend[i];.
153 │ │ │ │ +00038d30: 353c 2f73 7061 6e3e 203c 2f64 6976 3e0a 5
. │ │ │ │ +00038d40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +00038de0: 3c61 2069 643d 226c 3031 3533 3722 206e 1537 MPI_Allgat │ │ │ │ +00038e30: 6865 7276 2873 656e 6454 6f2c 206e 6f53 herv(sendTo, noS │ │ │ │ +00038e40: 656e 6454 6f2c 204d 5049 5f49 4e54 2c20 endTo, MPI_INT, │ │ │ │ +00038e50: 6773 656e 6454 6f2c 2067 6e6f 5365 6e64 gsendTo, gnoSend │ │ │ │ +00038e60: 2c20 6773 656e 6454 6f44 6973 706c 2c3c , gsendToDispl,< │ │ │ │ +00038e70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00038ec0: 3533 383c 2f73 7061 6e3e 2020 2020 2020 538 │ │ │ │ +00038ed0: 2020 2020 2020 2020 2020 2020 204d 5049 MPI │ │ │ │ +00038ee0: 5f49 4e54 2c20 6f6f 636f 6d6d 2e3c 6120 _INT, oocomm.co │ │ │ │ +00038f40: 6d6d 756e 6963 6174 6f72 3c2f 613e 2829 mmunicator() │ │ │ │ +00038f50: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1539 .
15 │ │ │ │ +00039000: 3430 3c2f 7370 616e 3e20 2020 203c 7370 40 // Extract fr │ │ │ │ +00039030: 6f6d 2077 6869 6368 2070 726f 6365 7373 om which process │ │ │ │ +00039040: 6573 2077 6520 7769 6c6c 2072 6563 6569 es we will recei │ │ │ │ +00039050: 7665 2064 6174 613c 2f73 7061 6e3e 3c2f ve data.
15 │ │ │ │ +000390b0: 3431 3c2f 7370 616e 3e20 2020 203c 7370 41 for(int< │ │ │ │ +00039100: 2f73 7061 6e3e 2070 726f 633d 303b 2070 /span> proc=0; p │ │ │ │ +00039110: 726f 6320 266c 743b 206e 7065 733b 202b roc < npes; + │ │ │ │ +00039120: 2b70 726f 6329 3c2f 6469 763e 0a3c 6469 +proc)
.< │ │ │ │ +00039140: 6120 6964 3d22 6c30 3135 3432 2220 6e61 a id="l01542" na │ │ │ │ +00039150: 6d65 3d22 6c30 3135 3432 223e 3c2f 613e me="l01542"> │ │ │ │ +00039160: 3c73 7061 6e20 636c 6173 733d 226c 696e 1542 for(int │ │ │ │ +000391d0: 2069 3d67 7365 6e64 546f 4469 7370 6c5b i=gsendToDispl[ │ │ │ │ +000391e0: 7072 6f63 5d3b 2069 2026 6c74 3b20 6773 proc]; i < gs │ │ │ │ +000391f0: 656e 6454 6f44 6973 706c 5b70 726f 632b endToDispl[proc+ │ │ │ │ +00039200: 315d 3b20 2b2b 6929 3c2f 6469 763e 0a3c 1]; ++i)
.< │ │ │ │ +00039210: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00039220: 3e3c 6120 6964 3d22 6c30 3135 3433 2220 > 1543 if(g │ │ │ │ +00039290: 7365 6e64 546f 5b69 5d3d 3d6d 7970 6529 sendTo[i]==mype) │ │ │ │ +000392a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000392f0: 3135 3434 3c2f 7370 616e 3e20 2020 2020 1544 │ │ │ │ +00039300: 2020 2020 2072 6563 7646 726f 6d2e 696e recvFrom.in │ │ │ │ +00039310: 7365 7274 2870 726f 6329 3b3c 2f64 6976 sert(proc);
.
1545< │ │ │ │ +00039370: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00039390: 3c61 2069 643d 226c 3031 3534 3622 206e 1546 │ │ │ │ +000393f0: 626f 6f6c 3c2f 7370 616e 3e20 6578 6973 bool exis │ │ │ │ +00039400: 7465 6e74 4f6e 4e65 7874 4c65 7665 6c20 tentOnNextLevel │ │ │ │ +00039410: 3d20 7265 6376 4672 6f6d 2e73 697a 6528 = recvFrom.size( │ │ │ │ +00039420: 2926 6774 3b30 3b3c 2f64 6976 3e0a 3c64 )>0;
. │ │ │ │ +00039440: 3c61 2069 643d 226c 3031 3534 3722 206e 1547
.
1548 │ │ │ │ +000394e0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // Delet │ │ │ │ +00039500: 6520 6d65 6d6f 7279 3c2f 7370 616e 3e3c e memory< │ │ │ │ +00039510: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00039560: 3534 393c 2f73 7061 6e3e 2020 2020 3c73 549 delete[] gnoSend;.
1550 │ │ │ │ +000395f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e delete[] │ │ │ │ +00039620: 2067 7365 6e64 546f 4469 7370 6c3b 3c2f gsendToDispl;.
15 │ │ │ │ +00039680: 3531 3c2f 7370 616e 3e20 2020 203c 7370 51 delete │ │ │ │ +000396b0: 5b5d 2067 7365 6e64 546f 3b3c 2f64 6976 [] gsendTo;
.
1552< │ │ │ │ +00039710: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00039730: 3c61 2069 643d 226c 3031 3535 3322 206e 1553
.
1554#ifdef │ │ │ │ +000397f0: 4445 4255 475f 5245 5041 5254 3c2f 7370 DEBUG_REPART
.
1555 │ │ │ │ +00039860: 2020 3c73 7061 6e20 636c 6173 733d 226b if(recvFrom.s │ │ │ │ +00039890: 697a 6528 2929 207b 3c2f 6469 763e 0a3c ize()) {
.< │ │ │ │ +000398a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000398b0: 3e3c 6120 6964 3d22 6c30 3135 3536 2220 > 1556 std::co │ │ │ │ +00039900: 7574 266c 743b 266c 743b 6d79 7065 266c ut<<mype&l │ │ │ │ +00039910: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<": recvFr │ │ │ │ +00039940: 6f6d 3a20 2671 756f 743b 3c2f 7370 616e om: ";
.
1557 │ │ │ │ +000399b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 for │ │ │ │ +000399d0: 3c2f 7370 616e 3e28 3c73 7061 6e20 636c (au │ │ │ │ +000399f0: 746f 3c2f 7370 616e 3e20 693d 7265 6376 to i=recv │ │ │ │ +00039a00: 4672 6f6d 2e62 6567 696e 2829 3b20 6921 From.begin(); i! │ │ │ │ +00039a10: 3d20 7265 6376 4672 6f6d 2e65 6e64 2829 = recvFrom.end() │ │ │ │ +00039a20: 3b20 2b2b 6929 207b 3c2f 6469 763e 0a3c ; ++i) {
.< │ │ │ │ +00039a30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00039a40: 3e3c 6120 6964 3d22 6c30 3135 3538 2220 > 1558
std:: │ │ │ │ +00039a90: 636f 7574 266c 743b 266c 743b 2a69 266c cout<<*i&l │ │ │ │ +00039aa0: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<" "< │ │ │ │ +00039ad0: 2f73 7061 6e3e 3b3c 2f64 6976 3e0a 3c64 /span>;
. │ │ │ │ +00039af0: 3c61 2069 643d 226c 3031 3535 3922 206e 1559 }
. │ │ │ │ +00039b40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ +00039ba0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ │ +00039c30: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00039c40: 6e6f 223e 2031 3536 323c 2f73 7061 6e3e no"> 1562 │ │ │ │ +00039c50: 2020 2020 7374 643a 3a63 6f75 7426 6c74 std::cout< │ │ │ │ +00039c60: 3b26 6c74 3b73 7464 3a3a 656e 646c 266c ;<std::endl&l │ │ │ │ +00039c70: 743b 266c 743b 7374 643a 3a65 6e64 6c3b t;<std::endl; │ │ │ │ +00039c80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00039cd0: 3135 3633 3c2f 7370 616e 3e20 2020 2073 1563 s │ │ │ │ +00039ce0: 7464 3a3a 636f 7574 266c 743b 266c 743b td::cout<< │ │ │ │ +00039cf0: 6d79 7065 266c 743b 266c 743b 3c73 7061 mype<<": │ │ │ │ +00039d20: 7365 6e64 546f 3a20 2671 756f 743b 3c2f sendTo: ";
.< │ │ │ │ +00039d50: 6120 6964 3d22 6c30 3135 3634 2220 6e61 a id="l01564" na │ │ │ │ +00039d60: 6d65 3d22 6c30 3135 3634 223e 3c2f 613e me="l01564"> │ │ │ │ +00039d70: 3c73 7061 6e20 636c 6173 733d 226c 696e 1564 f │ │ │ │ +00039db0: 6f72 3c2f 7370 616e 3e28 3c73 7061 6e20 or(int i │ │ │ │ +00039de0: 3d30 3b20 6926 6c74 3b6e 6f53 656e 6454 =0; i<noSendT │ │ │ │ +00039df0: 6f3b 2069 2b2b 2920 7b3c 2f64 6976 3e0a o; i++) {
. │ │ │ │ +00039e00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00039e30: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1565 std::c │ │ │ │ +00039e60: 6f75 7426 6c74 3b26 6c74 3b73 656e 6454 out<<sendT │ │ │ │ +00039e70: 6f5b 695d 266c 743b 266c 743b 3c73 7061 o[i]<<" & │ │ │ │ +00039ea0: 7175 6f74 3b3c 2f73 7061 6e3e 3b3c 2f64 quot;;.
156 │ │ │ │ +00039f00: 363c 2f73 7061 6e3e 2020 2020 7d3c 2f64 6 }.
156 │ │ │ │ +00039f60: 373c 2f73 7061 6e3e 2020 2020 7374 643a 7 std: │ │ │ │ +00039f70: 3a63 6f75 7426 6c74 3b26 6c74 3b73 7464 :cout<<std │ │ │ │ +00039f80: 3a3a 656e 646c 266c 743b 266c 743b 7374 ::endl<<st │ │ │ │ +00039f90: 643a 3a65 6e64 6c3b 3c2f 6469 763e 0a3c d::endl;
.< │ │ │ │ +00039fa0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00039fb0: 3e3c 6120 6964 3d22 6c30 3135 3638 2220 > 1568#e │ │ │ │ +0003a010: 6e64 6966 3c2f 7370 616e 3e3c 2f64 6976 ndif
.
1569< │ │ │ │ +0003a070: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +0003a090: 3c61 2069 643d 226c 3031 3537 3022 206e 1570 │ │ │ │ +0003a0f0: 6966 3c2f 7370 616e 3e28 7665 7262 6f73 if(verbos │ │ │ │ +0003a100: 6529 3c2f 6469 763e 0a3c 6469 7620 636c e)
.
1571 │ │ │ │ +0003a160: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +0003a180: 2f73 7061 6e3e 286f 6f63 6f6d 6d2e 3c61 /span>(oocomm.c │ │ │ │ +0003a1e0: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +0003a1f0: 292e 7261 6e6b 2829 3d3d 3029 3c2f 6469 ).rank()==0).
1572 │ │ │ │ +0003a250: 3c2f 7370 616e 3e20 2020 2020 2020 2073 s │ │ │ │ +0003a260: 7464 3a3a 636f 7574 266c 743b 266c 743b td::cout<< │ │ │ │ +0003a270: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +0003a290: 743b 2043 6f6d 6d75 6e69 6361 7469 6e67 t; Communicating │ │ │ │ +0003a2a0: 2074 6865 2072 6563 6569 7665 2069 6e66 the receive inf │ │ │ │ +0003a2b0: 6f72 6d61 7469 6f6e 2074 6f6f 6b20 2671 ormation took &q │ │ │ │ +0003a2c0: 756f 743b 3c2f 7370 616e 3e26 6c74 3b26 uot;<& │ │ │ │ +0003a2d0: 6c74 3b3c 2f64 6976 3e0a 3c64 6976 2063 lt;
.
1573 │ │ │ │ +0003a330: 2020 2020 2020 7469 6d65 2e65 6c61 7073 time.elaps │ │ │ │ +0003a340: 6564 2829 266c 743b 266c 743b 7374 643a ed()<<std: │ │ │ │ +0003a350: 3a65 6e64 6c3b 3c2f 6469 763e 0a3c 6469 :endl;
.< │ │ │ │ +0003a370: 6120 6964 3d22 6c30 3135 3734 2220 6e61 a id="l01574" na │ │ │ │ +0003a380: 6d65 3d22 6c30 3135 3734 223e 3c2f 613e me="l01574"> │ │ │ │ +0003a390: 3c73 7061 6e20 636c 6173 733d 226c 696e 1574 time.reset( │ │ │ │ +0003a3c0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1575 .
15 │ │ │ │ +0003a470: 3736 3c2f 7370 616e 3e20 2020 203c 7370 76 //.
1577 │ │ │ │ +0003a4f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e // 4.2) Start t │ │ │ │ +0003a520: 6865 2063 6f6d 6d75 6e69 6361 7469 6f6e he communication │ │ │ │ +0003a530: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0003a550: 3c61 2069 643d 226c 3031 3537 3822 206e 1578 //
.
< │ │ │ │ +0003a5f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003a600: 6e6f 223e 2031 3537 393c 2f73 7061 6e3e no"> 1579 │ │ │ │ +0003a610: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ +0003a660: 2031 3538 303c 2f73 7061 6e3e 2020 2020 1580 │ │ │ │ +0003a670: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // Get all │ │ │ │ +0003a690: 2074 6865 206f 776e 6572 2061 6e64 206f the owner and o │ │ │ │ +0003a6a0: 7665 726c 6170 2076 6572 7469 6365 7320 verlap vertices │ │ │ │ +0003a6b0: 666f 7220 6d79 7365 6c66 2061 6e73 2073 for myself ans s │ │ │ │ +0003a6c0: 6176 653c 2f73 7061 6e3e 3c2f 6469 763e ave
│ │ │ │ +0003a6d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003a700: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1581 / │ │ │ │ +0003a740: 2f20 6974 2069 6e20 7468 6520 7665 6374 / it in the vect │ │ │ │ +0003a750: 6f72 7320 6d79 4f77 6e65 7256 6563 2061 ors myOwnerVec a │ │ │ │ +0003a760: 6e64 206d 794f 7665 726c 6170 5665 632e nd myOverlapVec. │ │ │ │ +0003a770: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0003a790: 3c61 2069 643d 226c 3031 3538 3222 206e 1582
// T │ │ │ │ +0003a7f0: 6865 2072 6563 6569 7665 6420 7665 7274 he received vert │ │ │ │ +0003a800: 6963 6573 2066 726f 6d20 7468 6520 6f74 ices from the ot │ │ │ │ +0003a810: 6865 7220 7072 6f63 6573 7365 7320 6172 her processes ar │ │ │ │ +0003a820: 6520 7369 6d70 6c65 3c2f 7370 616e 3e3c e simple< │ │ │ │ +0003a830: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003a880: 3538 333c 2f73 7061 6e3e 2020 2020 3c73 583 // added to │ │ │ │ +0003a8b0: 7468 6573 6520 7665 6374 6f72 2e3c 2f73 these vector.
.
1584 │ │ │ │ +0003a920: 2020 203c 7370 616e 2063 6c61 7373 3d22 //
.
1585 .
15 │ │ │ │ +0003a9f0: 3836 3c2f 7370 616e 3e20 3c2f 6469 763e 86
│ │ │ │ +0003aa00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003aa30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1587 t │ │ │ │ +0003aa70: 7970 6564 6566 3c2f 7370 616e 3e20 3c73 ypedef typename OOComm::Para │ │ │ │ +0003aab0: 6c6c 656c 496e 6465 7853 6574 3a3a 476c llelIndexSet::Gl │ │ │ │ +0003aac0: 6f62 616c 496e 6465 7820 4749 3b3c 2f64 obalIndex GI;.
158 │ │ │ │ +0003ab20: 383c 2f73 7061 6e3e 2020 2020 3c73 7061 8 typedef │ │ │ │ +0003ab50: 2073 7464 3a3a 7665 6374 6f72 266c 743b std::vector< │ │ │ │ +0003ab60: 4749 2667 743b 2047 6c6f 6261 6c56 6563 GI> GlobalVec │ │ │ │ +0003ab70: 746f 723b 3c2f 6469 763e 0a3c 6469 7620 tor;
.
1589 │ │ │ │ +0003abd0: 2020 2073 7464 3a3a 7665 6374 6f72 266c std::vector&l │ │ │ │ +0003abe0: 743b 7374 643a 3a70 6169 7226 6c74 3b47 t;std::pair<G │ │ │ │ +0003abf0: 492c 696e 7426 6774 3b20 2667 743b 206d I,int> > m │ │ │ │ +0003ac00: 794f 776e 6572 5665 633b 3c2f 6469 763e yOwnerVec;
│ │ │ │ +0003ac10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003ac40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1590 std::se │ │ │ │ +0003ac70: 7426 6c74 3b47 4926 6774 3b20 6d79 4f76 t<GI> myOv │ │ │ │ +0003ac80: 6572 6c61 7053 6574 3b3c 2f64 6976 3e0a erlapSet;
. │ │ │ │ +0003ac90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1592 │ │ │ │ +0003ad60: 2073 7464 3a3a 7365 7426 6c74 3b47 4926 std::set<GI& │ │ │ │ +0003ad70: 6774 3b20 7365 6e64 4f76 6572 6c61 7053 gt; sendOverlapS │ │ │ │ +0003ad80: 6574 3b3c 2f64 6976 3e0a 3c64 6976 2063 et;
.
1593 │ │ │ │ +0003ade0: 2020 7374 643a 3a73 6574 266c 743b 696e std::set<in │ │ │ │ +0003adf0: 7426 6774 3b20 6d79 4e65 6967 6862 6f72 t> myNeighbor │ │ │ │ +0003ae00: 733b 3c2f 6469 763e 0a3c 6469 7620 636c s;
.
1594 .
15 │ │ │ │ +0003aeb0: 3935 3c2f 7370 616e 3e20 2020 203c 7370 95 // getOwne │ │ │ │ +0003aee0: 724f 7665 726c 6170 5665 6326 6c74 3b4f rOverlapVec<O │ │ │ │ +0003aef0: 776e 6572 5365 7426 6774 3b28 6772 6170 wnerSet>(grap │ │ │ │ +0003af00: 682c 2073 6574 5061 7274 6974 696f 6e2c h, setPartition, │ │ │ │ +0003af10: 206f 6f63 6f6d 6d2e 676c 6f62 616c 4c6f oocomm.globalLo │ │ │ │ +0003af20: 6f6b 7570 2829 2c3c 2f73 7061 6e3e 3c2f okup(),.
15 │ │ │ │ +0003af80: 3936 3c2f 7370 616e 3e20 2020 203c 7370 96 // │ │ │ │ +0003afb0: 2020 2020 6d79 7065 2c20 6d79 7065 2c20 mype, mype, │ │ │ │ +0003afc0: 6d79 4f77 6e65 7256 6563 2c20 6d79 4f76 myOwnerVec, myOv │ │ │ │ +0003afd0: 6572 6c61 7053 6574 2c20 7265 6469 7374 erlapSet, redist │ │ │ │ +0003afe0: 496e 662c 206d 794e 6569 6768 626f 7273 Inf, myNeighbors │ │ │ │ +0003aff0: 293b 3c2f 7370 616e 3e3c 2f64 6976 3e0a );
. │ │ │ │ +0003b000: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0003b090: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003b0a0: 6e6f 223e 2031 3539 383c 2f73 7061 6e3e no"> 1598 │ │ │ │ +0003b0b0: 2020 2020 3c73 7061 6e20 636c 6173 733d ch │ │ │ │ +0003b0d0: 6172 3c2f 7370 616e 3e20 2a2a 7365 6e64 ar **send │ │ │ │ +0003b0e0: 4275 6666 6572 733d 3c73 7061 6e20 636c Buffers=ne │ │ │ │ +0003b100: 773c 2f73 7061 6e3e 203c 7370 616e 2063 w char*[ │ │ │ │ +0003b130: 6e6f 5365 6e64 546f 5d3b 3c2f 6469 763e noSendTo];
│ │ │ │ +0003b140: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003b170: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1599 MPI_Req │ │ │ │ +0003b1a0: 7565 7374 202a 7265 7175 6573 7473 203d uest *requests = │ │ │ │ +0003b1b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 new MPI_Request[no │ │ │ │ +0003b1e0: 5365 6e64 546f 5d3b 3c2f 6469 763e 0a3c SendTo];
.< │ │ │ │ +0003b1f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003b200: 3e3c 6120 6964 3d22 6c30 3136 3030 2220 > 1600
.
1601 │ │ │ │ +0003b2a0: 2020 203c 7370 616e 2063 6c61 7373 3d22 // Crea │ │ │ │ +0003b2c0: 7465 2061 6c6c 206d 6573 7361 6765 7320 te all messages │ │ │ │ +0003b2d0: 746f 2062 6520 7365 6e74 3c2f 7370 616e to be sent
.
│ │ │ │ +0003b330: 2031 3630 323c 2f73 7061 6e3e 2020 2020 1602 │ │ │ │ +0003b340: 3c73 7061 6e20 636c 6173 733d 226b 6579 for(i │ │ │ │ +0003b380: 6e74 3c2f 7370 616e 3e20 693d 303b 2069 nt i=0; i │ │ │ │ +0003b390: 2026 6c74 3b20 6e6f 5365 6e64 546f 3b20 < noSendTo; │ │ │ │ +0003b3a0: 2b2b 6929 207b 3c2f 6469 763e 0a3c 6469 ++i) {
.< │ │ │ │ +0003b3c0: 6120 6964 3d22 6c30 3136 3033 2220 6e61 a id="l01603" na │ │ │ │ +0003b3d0: 6d65 3d22 6c30 3136 3033 223e 3c2f 613e me="l01603"> │ │ │ │ +0003b3e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1603 // │ │ │ │ +0003b420: 636c 6561 7220 7468 6520 7665 6374 6f72 clear the vector │ │ │ │ +0003b430: 2066 6f72 2073 656e 6469 6e67 3c2f 7370 for sending
.
1604 │ │ │ │ +0003b4a0: 2020 2020 7365 6e64 4f77 6e65 7256 6563 sendOwnerVec │ │ │ │ +0003b4b0: 2e63 6c65 6172 2829 3b3c 2f64 6976 3e0a .clear();
. │ │ │ │ +0003b4c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ │ +0003b580: 2031 3630 363c 2f73 7061 6e3e 2020 2020 1606 │ │ │ │ +0003b590: 2020 3c73 7061 6e20 636c 6173 733d 2263 // get a │ │ │ │ +0003b5b0: 6c6c 206f 776e 6572 2061 6e64 206f 7665 ll owner and ove │ │ │ │ +0003b5c0: 726c 6170 2076 6572 7469 6365 7320 666f rlap vertices fo │ │ │ │ +0003b5d0: 7220 7072 6f63 6573 7320 6a20 616e 6420 r process j and │ │ │ │ +0003b5e0: 7361 7665 2074 6865 7365 3c2f 7370 616e save these
.
│ │ │ │ +0003b640: 2031 3630 373c 2f73 7061 6e3e 2020 2020 1607 │ │ │ │ +0003b650: 2020 3c73 7061 6e20 636c 6173 733d 2263 // in th │ │ │ │ +0003b670: 6520 7665 6374 6f72 7320 7365 6e64 4f77 e vectors sendOw │ │ │ │ +0003b680: 6e65 7256 6563 2061 6e64 2073 656e 644f nerVec and sendO │ │ │ │ +0003b690: 7665 726c 6170 5365 743c 2f73 7061 6e3e verlapSet │ │ │ │ +0003b6a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003b6f0: 3136 3038 3c2f 7370 616e 3e20 2020 2020 1608 │ │ │ │ +0003b700: 2073 7464 3a3a 7365 7426 6c74 3b69 6e74 std::set<int │ │ │ │ +0003b710: 2667 743b 206e 6569 6768 626f 7273 3b3c > neighbors;< │ │ │ │ +0003b720: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003b770: 3630 393c 2f73 7061 6e3e 2020 2020 2020 609 │ │ │ │ +0003b780: 6765 744f 776e 6572 4f76 6572 6c61 7056 getOwnerOverlapV │ │ │ │ +0003b790: 6563 266c 743b 4f77 6e65 7253 6574 2667 ec<OwnerSet&g │ │ │ │ +0003b7a0: 743b 2867 7261 7068 2c20 7365 7450 6172 t;(graph, setPar │ │ │ │ +0003b7b0: 7469 7469 6f6e 2c20 6f6f 636f 6d6d 2e3c tition, oocomm.< │ │ │ │ +0003b7c0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +0003b7d0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +0003b7e0: 2261 3031 3938 342e 6874 6d6c 2361 3031 "a01984.html#a01 │ │ │ │ +0003b7f0: 6435 3034 6435 6264 3165 6161 3365 3536 d504d5bd1eaa3e56 │ │ │ │ +0003b800: 6561 3632 3063 6265 3463 6230 3534 223e ea620cbe4cb054"> │ │ │ │ +0003b810: 676c 6f62 616c 4c6f 6f6b 7570 3c2f 613e globalLookup │ │ │ │ +0003b820: 2829 2c3c 2f64 6976 3e0a 3c64 6976 2063 (),
.
1610 │ │ │ │ +0003b880: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0003b890: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0003b8a0: 206d 7970 652c 2073 656e 6454 6f5b 695d mype, sendTo[i] │ │ │ │ +0003b8b0: 2c20 7365 6e64 4f77 6e65 7256 6563 2c20 , sendOwnerVec, │ │ │ │ +0003b8c0: 7365 6e64 4f76 6572 6c61 7053 6574 2c20 sendOverlapSet, │ │ │ │ +0003b8d0: 7265 6469 7374 496e 662c 3c2f 6469 763e redistInf,
│ │ │ │ +0003b8e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003b910: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1611 │ │ │ │ +0003b940: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +0003b950: 2020 2020 2020 2020 6e65 6967 6862 6f72 neighbor │ │ │ │ +0003b960: 7329 3b3c 2f64 6976 3e0a 3c64 6976 2063 s);
.
1612 │ │ │ │ +0003b9c0: 2020 2020 3c73 7061 6e20 636c 6173 733d // +2, │ │ │ │ +0003b9e0: 2077 6520 6e65 6564 2032 2069 6e74 6567 we need 2 integ │ │ │ │ +0003b9f0: 6572 206d 6f72 6520 666f 7220 7468 6520 er more for the │ │ │ │ +0003ba00: 6c65 6e67 7468 206f 6620 6561 6368 2070 length of each p │ │ │ │ +0003ba10: 6172 743c 2f73 7061 6e3e 3c2f 6469 763e art
│ │ │ │ +0003ba20: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003ba50: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1613 // (owner/overl │ │ │ │ +0003baa0: 6170 2920 6f66 2074 6865 2061 7272 6179 ap) of the array │ │ │ │ +0003bab0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ +0003bad0: 3c61 2069 643d 226c 3031 3631 3422 206e 1614 int buf │ │ │ │ +0003bb40: 6665 7273 697a 653d 303b 3c2f 6469 763e fersize=0;
│ │ │ │ +0003bb50: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003bb80: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1615 int │ │ │ │ +0003bbd0: 7473 697a 653b 3c2f 6469 763e 0a3c 6469 tsize;
.< │ │ │ │ +0003bbf0: 6120 6964 3d22 6c30 3136 3136 2220 6e61 a id="l01616" na │ │ │ │ +0003bc00: 6d65 3d22 6c30 3136 3136 223e 3c2f 613e me="l01616"> │ │ │ │ +0003bc10: 3c73 7061 6e20 636c 6173 733d 226c 696e 1616 MPI_Pack_ │ │ │ │ +0003bc40: 7369 7a65 2831 2c20 4d50 4954 7261 6974 size(1, MPITrait │ │ │ │ +0003bc50: 7326 6c74 3b73 7464 3a3a 7369 7a65 5f74 s<std::size_t │ │ │ │ +0003bc60: 2667 743b 3a3a 6765 7454 7970 6528 292c >::getType(), │ │ │ │ +0003bc70: 206f 6f63 6f6d 6d2e 3c61 2063 6c61 7373 oocomm.communi │ │ │ │ +0003bcd0: 6361 746f 723c 2f61 3e28 292c 2026 616d cator(), &am │ │ │ │ +0003bce0: 703b 6275 6666 6572 7369 7a65 293b 3c2f p;buffersize);.
16 │ │ │ │ +0003bd40: 3137 3c2f 7370 616e 3e20 2020 2020 204d 17 M │ │ │ │ +0003bd50: 5049 5f50 6163 6b5f 7369 7a65 2873 656e PI_Pack_size(sen │ │ │ │ +0003bd60: 644f 776e 6572 5665 632e 7369 7a65 2829 dOwnerVec.size() │ │ │ │ +0003bd70: 2c20 4d50 4954 7261 6974 7326 6c74 3b47 , MPITraits<G │ │ │ │ +0003bd80: 4926 6774 3b3a 3a67 6574 5479 7065 2829 I>::getType() │ │ │ │ +0003bd90: 2c20 6f6f 636f 6d6d 2e3c 6120 636c 6173 , oocomm.commun │ │ │ │ +0003bdf0: 6963 6174 6f72 3c2f 613e 2829 2c20 2661 icator(), &a │ │ │ │ +0003be00: 6d70 3b74 7369 7a65 293b 3c2f 6469 763e mp;tsize);
│ │ │ │ +0003be10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003be40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1618 buffe │ │ │ │ +0003be70: 7273 697a 6520 2b3d 7473 697a 653b 3c2f rsize +=tsize;.
16 │ │ │ │ +0003bed0: 3139 3c2f 7370 616e 3e20 2020 2020 204d 19 M │ │ │ │ +0003bee0: 5049 5f50 6163 6b5f 7369 7a65 2831 2c20 PI_Pack_size(1, │ │ │ │ +0003bef0: 4d50 4954 7261 6974 7326 6c74 3b73 7464 MPITraits<std │ │ │ │ +0003bf00: 3a3a 7369 7a65 5f74 2667 743b 3a3a 6765 ::size_t>::ge │ │ │ │ +0003bf10: 7454 7970 6528 292c 206f 6f63 6f6d 6d2e tType(), oocomm. │ │ │ │ +0003bf20: 3c61 2063 6c61 7373 3d22 636f 6465 2068 communicator(), &tsize) │ │ │ │ +0003bf90: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0003bfe0: 2031 3632 303c 2f73 7061 6e3e 2020 2020 1620 │ │ │ │ +0003bff0: 2020 6275 6666 6572 7369 7a65 202b 3d74 buffersize +=t │ │ │ │ +0003c000: 7369 7a65 3b3c 2f64 6976 3e0a 3c64 6976 size;
.
< │ │ │ │ +0003c040: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003c050: 6e6f 223e 2031 3632 313c 2f73 7061 6e3e no"> 1621 │ │ │ │ +0003c060: 2020 2020 2020 4d50 495f 5061 636b 5f73 MPI_Pack_s │ │ │ │ +0003c070: 697a 6528 7365 6e64 4f76 6572 6c61 7053 ize(sendOverlapS │ │ │ │ +0003c080: 6574 2e73 697a 6528 292c 204d 5049 5472 et.size(), MPITr │ │ │ │ +0003c090: 6169 7473 266c 743b 4749 2667 743b 3a3a aits<GI>:: │ │ │ │ +0003c0a0: 6765 7454 7970 6528 292c 206f 6f63 6f6d getType(), oocom │ │ │ │ +0003c0b0: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +0003c110: 2f61 3e28 292c 2026 616d 703b 7473 697a /a>(), &tsiz │ │ │ │ +0003c120: 6529 3b3c 2f64 6976 3e0a 3c64 6976 2063 e);
.
1622 │ │ │ │ +0003c180: 2020 2020 6275 6666 6572 7369 7a65 202b buffersize + │ │ │ │ +0003c190: 3d20 7473 697a 653b 3c2f 6469 763e 0a3c = tsize;
.< │ │ │ │ +0003c1a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003c1b0: 3e3c 6120 6964 3d22 6c30 3136 3233 2220 > 1623 MPI_Pac │ │ │ │ +0003c200: 6b5f 7369 7a65 2831 2c20 4d50 4954 7261 k_size(1, MPITra │ │ │ │ +0003c210: 6974 7326 6c74 3b73 7464 3a3a 7369 7a65 its<std::size │ │ │ │ +0003c220: 5f74 2667 743b 3a3a 6765 7454 7970 6528 _t>::getType( │ │ │ │ +0003c230: 292c 206f 6f63 6f6d 6d2e 3c61 2063 6c61 ), oocomm.commu │ │ │ │ +0003c290: 6e69 6361 746f 723c 2f61 3e28 292c 2026 nicator(), & │ │ │ │ +0003c2a0: 616d 703b 7473 697a 6529 3b3c 2f64 6976 amp;tsize);
.
1624< │ │ │ │ +0003c300: 2f73 7061 6e3e 2020 2020 2020 6275 6666 /span> buff │ │ │ │ +0003c310: 6572 7369 7a65 202b 3d20 7473 697a 653b ersize += tsize; │ │ │ │ +0003c320: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003c370: 3136 3235 3c2f 7370 616e 3e20 2020 2020 1625 │ │ │ │ +0003c380: 204d 5049 5f50 6163 6b5f 7369 7a65 286e MPI_Pack_size(n │ │ │ │ +0003c390: 6569 6768 626f 7273 2e73 697a 6528 292c eighbors.size(), │ │ │ │ +0003c3a0: 204d 5049 5f49 4e54 2c20 6f6f 636f 6d6d MPI_INT, oocomm │ │ │ │ +0003c3b0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .communicator(), &tsize │ │ │ │ +0003c420: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1626 │ │ │ │ +0003c480: 2020 2062 7566 6665 7273 697a 6520 2b3d buffersize += │ │ │ │ +0003c490: 2074 7369 7a65 3b3c 2f64 6976 3e0a 3c64 tsize;
. │ │ │ │ +0003c4b0: 3c61 2069 643d 226c 3031 3632 3722 206e 1627
.
1628 │ │ │ │ +0003c550: 2020 2020 7365 6e64 4275 6666 6572 735b sendBuffers[ │ │ │ │ +0003c560: 695d 203d 203c 7370 616e 2063 6c61 7373 i] = new │ │ │ │ +0003c5a0: 6368 6172 3c2f 7370 616e 3e5b 6275 6666 char[buff │ │ │ │ +0003c5b0: 6572 7369 7a65 5d3b 3c2f 6469 763e 0a3c ersize];
.< │ │ │ │ +0003c5c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003c5d0: 3e3c 6120 6964 3d22 6c30 3136 3239 2220 > 1629
.
1630< │ │ │ │ +0003c670: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ +0003c680: 726f 6365 7373 6f72 223e 2369 6664 6566 rocessor">#ifdef │ │ │ │ +0003c690: 2044 4542 5547 5f52 4550 4152 543c 2f73 DEBUG_REPART
.
1631 │ │ │ │ +0003c700: 2020 2020 2073 7464 3a3a 636f 7574 266c std::cout&l │ │ │ │ +0003c710: 743b 266c 743b 6d79 7065 266c 743b 266c t;<mype<&l │ │ │ │ +0003c720: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +0003c740: 756f 743b 2073 656e 6469 6e67 2026 7175 uot; sending &qu │ │ │ │ +0003c750: 6f74 3b3c 2f73 7061 6e3e 266c 743b 266c ot;<&l │ │ │ │ +0003c760: 743b 7365 6e64 4f77 6e65 7256 6563 2e73 t;sendOwnerVec.s │ │ │ │ +0003c770: 697a 6528 2926 6c74 3b26 6c74 3b3c 7370 ize()<<" │ │ │ │ +0003c7a0: 6f77 6e65 7220 616e 6420 2671 756f 743b owner and " │ │ │ │ +0003c7b0: 3c2f 7370 616e 3e26 6c74 3b26 6c74 3b3c <<< │ │ │ │ +0003c7c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003c810: 3633 323c 2f73 7061 6e3e 2020 2020 2020 632 │ │ │ │ +0003c820: 7365 6e64 4f76 6572 6c61 7053 6574 2e73 sendOverlapSet.s │ │ │ │ +0003c830: 697a 6528 2926 6c74 3b26 6c74 3b3c 7370 ize()<<" │ │ │ │ +0003c860: 6f76 6572 6c61 7020 746f 2026 7175 6f74 overlap to " │ │ │ │ +0003c870: 3b3c 2f73 7061 6e3e 266c 743b 266c 743b ;<< │ │ │ │ +0003c880: 7365 6e64 546f 5b69 5d26 6c74 3b26 6c74 sendTo[i]<< │ │ │ │ +0003c890: 3b3c 7370 616e 2063 6c61 7373 3d22 7374 ;&qu │ │ │ │ +0003c8b0: 6f74 3b20 6275 6666 6572 7369 7a65 3d26 ot; buffersize=& │ │ │ │ +0003c8c0: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ +0003c8d0: 266c 743b 6275 6666 6572 7369 7a65 266c <buffersize&l │ │ │ │ +0003c8e0: 743b 266c 743b 7374 643a 3a65 6e64 6c3b t;<std::endl; │ │ │ │ +0003c8f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003c940: 3136 3333 3c2f 7370 616e 3e3c 7370 616e 1633#endif
.
1634 │ │ │ │ +0003c9d0: 2020 2020 6372 6561 7465 5365 6e64 4275 createSendBu │ │ │ │ +0003c9e0: 6628 7365 6e64 4f77 6e65 7256 6563 2c20 f(sendOwnerVec, │ │ │ │ +0003c9f0: 7365 6e64 4f76 6572 6c61 7053 6574 2c20 sendOverlapSet, │ │ │ │ +0003ca00: 6e65 6967 6862 6f72 732c 2073 656e 6442 neighbors, sendB │ │ │ │ +0003ca10: 7566 6665 7273 5b69 5d2c 2062 7566 6665 uffers[i], buffe │ │ │ │ +0003ca20: 7273 697a 652c 206f 6f63 6f6d 6d2e 3c61 rsize, oocomm.c │ │ │ │ +0003ca80: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +0003ca90: 2929 3b3c 2f64 6976 3e0a 3c64 6976 2063 ));
.
1635 │ │ │ │ +0003caf0: 2020 2020 4d50 495f 4973 7365 6e64 2873 MPI_Issend(s │ │ │ │ +0003cb00: 656e 6442 7566 6665 7273 5b69 5d2c 2062 endBuffers[i], b │ │ │ │ +0003cb10: 7566 6665 7273 697a 652c 204d 5049 5f50 uffersize, MPI_P │ │ │ │ +0003cb20: 4143 4b45 442c 2073 656e 6454 6f5b 695d ACKED, sendTo[i] │ │ │ │ +0003cb30: 2c20 3939 2c20 6f6f 636f 6d6d 2e3c 6120 , 99, oocomm.co │ │ │ │ +0003cb90: 6d6d 756e 6963 6174 6f72 3c2f 613e 2829 mmunicator() │ │ │ │ +0003cba0: 2c20 7265 7175 6573 7473 2b69 293b 3c2f , requests+i);.
16 │ │ │ │ +0003cc00: 3336 3c2f 7370 616e 3e20 2020 207d 3c2f 36 }.
16 │ │ │ │ +0003cc60: 3337 3c2f 7370 616e 3e20 3c2f 6469 763e 37
│ │ │ │ +0003cc70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003cca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1638 if(ver │ │ │ │ +0003ccf0: 626f 7365 2920 7b3c 2f64 6976 3e0a 3c64 bose) {
. │ │ │ │ +0003cd10: 3c61 2069 643d 226c 3031 3633 3922 206e 1639 oocomm.< │ │ │ │ +0003cd60: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ +0003cd70: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ +0003cd80: 2261 3031 3938 342e 6874 6d6c 2361 6164 "a01984.html#aad │ │ │ │ +0003cd90: 3033 6530 3438 3135 3232 6138 3262 6330 03e0481522a82bc0 │ │ │ │ +0003cda0: 6232 3132 6361 6431 6462 3736 6638 223e b212cad1db76f8"> │ │ │ │ +0003cdb0: 636f 6d6d 756e 6963 6174 6f72 3c2f 613e communicator │ │ │ │ +0003cdc0: 2829 2e62 6172 7269 6572 2829 3b3c 2f64 ().barrier();.
164 │ │ │ │ +0003ce20: 303c 2f73 7061 6e3e 2020 2020 2020 3c73 0 if(oocomm.commun │ │ │ │ +0003ceb0: 6963 6174 6f72 3c2f 613e 2829 2e72 616e icator().ran │ │ │ │ +0003cec0: 6b28 293d 3d30 293c 2f64 6976 3e0a 3c64 k()==0)
. │ │ │ │ +0003cee0: 3c61 2069 643d 226c 3031 3634 3122 206e 1641 std::c │ │ │ │ +0003cf30: 6f75 7426 6c74 3b26 6c74 3b3c 7370 616e out<<" Cr │ │ │ │ +0003cf60: 6561 7469 6e67 2073 656e 6473 2074 6f6f eating sends too │ │ │ │ +0003cf70: 6b20 2671 756f 743b 3c2f 7370 616e 3e26 k "& │ │ │ │ +0003cf80: 6c74 3b26 6c74 3b3c 2f64 6976 3e0a 3c64 lt;<
. │ │ │ │ +0003cfa0: 3c61 2069 643d 226c 3031 3634 3222 206e 1642 time.e │ │ │ │ +0003cff0: 6c61 7073 6564 2829 266c 743b 266c 743b lapsed()<< │ │ │ │ +0003d000: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +0003d010: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +0003d070: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003d0a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1644 time.re │ │ │ │ +0003d0d0: 7365 7428 293b 3c2f 6469 763e 0a3c 6469 set();
.< │ │ │ │ +0003d0f0: 6120 6964 3d22 6c30 3136 3435 2220 6e61 a id="l01645" na │ │ │ │ +0003d100: 6d65 3d22 6c30 3136 3435 223e 3c2f 613e me="l01645"> │ │ │ │ +0003d110: 3c73 7061 6e20 636c 6173 733d 226c 696e 1645
.
1646 │ │ │ │ +0003d190: 203c 7370 616e 2063 6c61 7373 3d22 636f // Receiv │ │ │ │ +0003d1b0: 6520 4d65 7373 6167 6573 3c2f 7370 616e e Messages
.
│ │ │ │ +0003d210: 2031 3634 373c 2f73 7061 6e3e 2020 2020 1647 │ │ │ │ +0003d220: 3c73 7061 6e20 636c 6173 733d 226b 6579 int noRecv = re │ │ │ │ +0003d250: 6376 4672 6f6d 2e73 697a 6528 293b 3c2f cvFrom.size();.
16 │ │ │ │ +0003d2b0: 3438 3c2f 7370 616e 3e20 2020 203c 7370 48 int oldbuffersize= │ │ │ │ +0003d2f0: 303b 3c2f 6469 763e 0a3c 6469 7620 636c 0;
.
1649 │ │ │ │ +0003d350: 203c 7370 616e 2063 6c61 7373 3d22 6b65 char< │ │ │ │ +0003d370: 2f73 7061 6e3e 2a20 7265 6376 4275 6620 /span>* recvBuf │ │ │ │ +0003d380: 3d20 303b 3c2f 6469 763e 0a3c 6469 7620 = 0;
.
1650 │ │ │ │ +0003d3e0: 2020 203c 7370 616e 2063 6c61 7373 3d22 whi │ │ │ │ +0003d400: 6c65 3c2f 7370 616e 3e28 6e6f 5265 6376 le(noRecv │ │ │ │ +0003d410: 2667 743b 3029 207b 3c2f 6469 763e 0a3c >0) {
.< │ │ │ │ +0003d420: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003d430: 3e3c 6120 6964 3d22 6c30 3136 3531 2220 > 1651 / │ │ │ │ +0003d490: 2f20 7072 6f62 6520 666f 7220 616e 2069 / probe for an i │ │ │ │ +0003d4a0: 6e63 6f6d 696e 6720 6d65 7373 6167 653c ncoming message< │ │ │ │ +0003d4b0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0003d4d0: 6120 6964 3d22 6c30 3136 3532 2220 6e61 a id="l01652" na │ │ │ │ +0003d4e0: 6d65 3d22 6c30 3136 3532 223e 3c2f 613e me="l01652"> │ │ │ │ +0003d4f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1652 MPI_Statu │ │ │ │ +0003d520: 7320 7374 6174 3b3c 2f64 6976 3e0a 3c64 s stat;
. │ │ │ │ +0003d540: 3c61 2069 643d 226c 3031 3635 3322 206e 1653 MPI_Prob │ │ │ │ +0003d590: 6528 4d50 495f 414e 595f 534f 5552 4345 e(MPI_ANY_SOURCE │ │ │ │ +0003d5a0: 2c20 3939 2c20 206f 6f63 6f6d 6d2e 3c61 , 99, oocomm.c │ │ │ │ +0003d600: 6f6d 6d75 6e69 6361 746f 723c 2f61 3e28 ommunicator( │ │ │ │ +0003d610: 292c 2026 616d 703b 7374 6174 293b 3c2f ), &stat);.
16 │ │ │ │ +0003d670: 3534 3c2f 7370 616e 3e20 2020 2020 203c 54 < │ │ │ │ +0003d680: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0003d690: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int buffersize;< │ │ │ │ +0003d6b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003d700: 3635 353c 2f73 7061 6e3e 2020 2020 2020 655 │ │ │ │ +0003d710: 4d50 495f 4765 745f 636f 756e 7428 2661 MPI_Get_count(&a │ │ │ │ +0003d720: 6d70 3b73 7461 742c 204d 5049 5f50 4143 mp;stat, MPI_PAC │ │ │ │ +0003d730: 4b45 442c 2026 616d 703b 6275 6666 6572 KED, &buffer │ │ │ │ +0003d740: 7369 7a65 293b 3c2f 6469 763e 0a3c 6469 size);
.< │ │ │ │ +0003d760: 6120 6964 3d22 6c30 3136 3536 2220 6e61 a id="l01656" na │ │ │ │ +0003d770: 6d65 3d22 6c30 3136 3536 223e 3c2f 613e me="l01656"> │ │ │ │ +0003d780: 3c73 7061 6e20 636c 6173 733d 226c 696e 1656
.
1657 │ │ │ │ +0003d800: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +0003d820: 2f73 7061 6e3e 286f 6c64 6275 6666 6572 /span>(oldbuffer │ │ │ │ +0003d830: 7369 7a65 266c 743b 6275 6666 6572 7369 size<buffersi │ │ │ │ +0003d840: 7a65 2920 7b3c 2f64 6976 3e0a 3c64 6976 ze) {
.
< │ │ │ │ +0003d880: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003d890: 6e6f 223e 2031 3635 383c 2f73 7061 6e3e no"> 1658 │ │ │ │ +0003d8a0: 2020 2020 2020 2020 3c73 7061 6e20 636c // │ │ │ │ +0003d8c0: 2062 7566 6665 7220 746f 6f20 736d 616c buffer too smal │ │ │ │ +0003d8d0: 6c2c 2072 6561 6c6c 6f63 6174 653c 2f73 l, reallocate
.
1659 │ │ │ │ +0003d940: 2020 2020 2020 203c 7370 616e 2063 6c61 del │ │ │ │ +0003d960: 6574 653c 2f73 7061 6e3e 5b5d 2072 6563 ete[] rec │ │ │ │ +0003d970: 7642 7566 3b3c 2f64 6976 3e0a 3c64 6976 vBuf;
.
< │ │ │ │ +0003d9b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003d9c0: 6e6f 223e 2031 3636 303c 2f73 7061 6e3e no"> 1660 │ │ │ │ +0003d9d0: 2020 2020 2020 2020 7265 6376 4275 6620 recvBuf │ │ │ │ +0003d9e0: 3d20 3c73 7061 6e20 636c 6173 733d 226b = new cha │ │ │ │ +0003da20: 723c 2f73 7061 6e3e 5b62 7566 6665 7273 r[buffers │ │ │ │ +0003da30: 697a 655d 3b3c 2f64 6976 3e0a 3c64 6976 ize];
.
< │ │ │ │ +0003da70: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003da80: 6e6f 223e 2031 3636 313c 2f73 7061 6e3e no"> 1661 │ │ │ │ +0003da90: 2020 2020 2020 2020 6f6c 6462 7566 6665 oldbuffe │ │ │ │ +0003daa0: 7273 697a 6520 3d20 6275 6666 6572 7369 rsize = buffersi │ │ │ │ +0003dab0: 7a65 3b3c 2f64 6976 3e0a 3c64 6976 2063 ze;
.
1662 │ │ │ │ +0003db10: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
.
< │ │ │ │ +0003db50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003db60: 6e6f 223e 2031 3636 333c 2f73 7061 6e3e no"> 1663 │ │ │ │ +0003db70: 2020 2020 2020 4d50 495f 5265 6376 2872 MPI_Recv(r │ │ │ │ +0003db80: 6563 7642 7566 2c20 6275 6666 6572 7369 ecvBuf, buffersi │ │ │ │ +0003db90: 7a65 2c20 4d50 495f 5041 434b 4544 2c20 ze, MPI_PACKED, │ │ │ │ +0003dba0: 7374 6174 2e4d 5049 5f53 4f55 5243 452c stat.MPI_SOURCE, │ │ │ │ +0003dbb0: 2039 392c 206f 6f63 6f6d 6d2e 3c61 2063 99, oocomm.com │ │ │ │ +0003dc10: 6d75 6e69 6361 746f 723c 2f61 3e28 292c municator(), │ │ │ │ +0003dc20: 2026 616d 703b 7374 6174 293b 3c2f 6469 &stat);.
1664 │ │ │ │ +0003dc80: 3c2f 7370 616e 3e20 2020 2020 2073 6176 sav │ │ │ │ +0003dc90: 6552 6563 7642 7566 2872 6563 7642 7566 eRecvBuf(recvBuf │ │ │ │ +0003dca0: 2c20 6275 6666 6572 7369 7a65 2c20 6d79 , buffersize, my │ │ │ │ +0003dcb0: 4f77 6e65 7256 6563 2c20 6d79 4f76 6572 OwnerVec, myOver │ │ │ │ +0003dcc0: 6c61 7053 6574 2c20 6d79 4e65 6967 6862 lapSet, myNeighb │ │ │ │ +0003dcd0: 6f72 732c 2072 6564 6973 7449 6e66 2c3c ors, redistInf,< │ │ │ │ +0003dce0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003dd30: 3636 353c 2f73 7061 6e3e 2020 2020 2020 665 │ │ │ │ +0003dd40: 2020 2020 2020 2020 2020 2020 7374 6174 stat │ │ │ │ +0003dd50: 2e4d 5049 5f53 4f55 5243 452c 206f 6f63 .MPI_SOURCE, ooc │ │ │ │ +0003dd60: 6f6d 6d2e 3c61 2063 6c61 7373 3d22 636f omm.communicato │ │ │ │ +0003ddc0: 723c 2f61 3e28 2929 3b3c 2f64 6976 3e0a r());
. │ │ │ │ +0003ddd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1667 │ │ │ │ +0003de90: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
.
1668 < │ │ │ │ +0003def0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003df40: 3636 393c 2f73 7061 6e3e 2020 2020 3c73 669 if(recvBuf)
│ │ │ │ +0003df80: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003dfb0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1670 delete[] │ │ │ │ +0003e000: 2072 6563 7642 7566 3b3c 2f64 6976 3e0a recvBuf;
. │ │ │ │ +0003e010: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0003e0a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003e0b0: 6e6f 223e 2031 3637 323c 2f73 7061 6e3e no"> 1672 │ │ │ │ +0003e0c0: 2020 2020 7469 6d65 2e72 6573 6574 2829 time.reset() │ │ │ │ +0003e0d0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0003e120: 2031 3637 333c 2f73 7061 6e3e 2020 2020 1673 │ │ │ │ +0003e130: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // Wait fo │ │ │ │ +0003e150: 7220 7365 6e64 696e 6720 6d65 7373 6167 r sending messag │ │ │ │ +0003e160: 6573 2074 6f20 636f 6d70 6c65 7465 3c2f es to complete
.
< │ │ │ │ +0003e1b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003e1c0: 6e6f 223e 2031 3637 343c 2f73 7061 6e3e no"> 1674 │ │ │ │ +0003e1d0: 2020 2020 4d50 495f 5374 6174 7573 202a MPI_Status * │ │ │ │ +0003e1e0: 7374 6174 7573 6573 203d 203c 7370 616e statuses = new MPI_ │ │ │ │ +0003e210: 5374 6174 7573 5b6e 6f53 656e 6454 6f5d Status[noSendTo] │ │ │ │ +0003e220: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0003e270: 2031 3637 353c 2f73 7061 6e3e 2020 2020 1675 │ │ │ │ +0003e280: 3c73 7061 6e20 636c 6173 733d 226b 6579 int send = MPI_ │ │ │ │ +0003e2b0: 5761 6974 616c 6c28 6e6f 5365 6e64 546f Waitall(noSendTo │ │ │ │ +0003e2c0: 2c20 7265 7175 6573 7473 2c20 7374 6174 , requests, stat │ │ │ │ +0003e2d0: 7573 6573 293b 3c2f 6469 763e 0a3c 6469 uses);
.< │ │ │ │ +0003e2f0: 6120 6964 3d22 6c30 3136 3736 2220 6e61 a id="l01676" na │ │ │ │ +0003e300: 6d65 3d22 6c30 3136 3736 223e 3c2f 613e me="l01676"> │ │ │ │ +0003e310: 3c73 7061 6e20 636c 6173 733d 226c 696e 1676
.
1677 │ │ │ │ +0003e390: 203c 7370 616e 2063 6c61 7373 3d22 636f // check │ │ │ │ +0003e3b0: 666f 7220 6572 726f 7273 3c2f 7370 616e for errors
.
│ │ │ │ +0003e410: 2031 3637 383c 2f73 7061 6e3e 2020 2020 1678 │ │ │ │ +0003e420: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(send==MPI_ER │ │ │ │ +0003e450: 525f 494e 5f53 5441 5455 5329 207b 3c2f R_IN_STATUS) {.
16 │ │ │ │ +0003e4b0: 3739 3c2f 7370 616e 3e20 2020 2020 2073 79 s │ │ │ │ +0003e4c0: 7464 3a3a 6365 7272 266c 743b 266c 743b td::cerr<< │ │ │ │ +0003e4d0: 6d79 7065 266c 743b 266c 743b 3c73 7061 mype<<": │ │ │ │ +0003e500: 4572 726f 7220 696e 2073 656e 6469 6e67 Error in sending │ │ │ │ +0003e510: 203a 2671 756f 743b 3c2f 7370 616e 3e26 :"& │ │ │ │ +0003e520: 6c74 3b26 6c74 3b73 7464 3a3a 656e 646c lt;<std::endl │ │ │ │ +0003e530: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0003e580: 2031 3638 303c 2f73 7061 6e3e 2020 2020 1680 │ │ │ │ +0003e590: 2020 3c73 7061 6e20 636c 6173 733d 2263 // Searc │ │ │ │ +0003e5b0: 6820 666f 7220 7468 6520 6572 726f 723c h for the error< │ │ │ │ +0003e5c0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0003e5e0: 6120 6964 3d22 6c30 3136 3831 2220 6e61 a id="l01681" na │ │ │ │ +0003e5f0: 6d65 3d22 6c30 3136 3831 223e 3c2f 613e me="l01681"> │ │ │ │ +0003e600: 3c73 7061 6e20 636c 6173 733d 226c 696e 1681 for(int
│ │ │ │ +0003e670: 2069 3d30 3b20 6926 6c74 3b20 6e6f 5365 i=0; i< noSe │ │ │ │ +0003e680: 6e64 546f 3b20 692b 2b29 3c2f 6469 763e ndTo; i++)
│ │ │ │ +0003e690: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003e6c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1682 if │ │ │ │ +0003e710: 2873 7461 7475 7365 735b 695d 2e4d 5049 (statuses[i].MPI │ │ │ │ +0003e720: 5f45 5252 4f52 213d 4d50 495f 5355 4343 _ERROR!=MPI_SUCC │ │ │ │ +0003e730: 4553 5329 207b 3c2f 6469 763e 0a3c 6469 ESS) {
.< │ │ │ │ +0003e750: 6120 6964 3d22 6c30 3136 3833 2220 6e61 a id="l01683" na │ │ │ │ +0003e760: 6d65 3d22 6c30 3136 3833 223e 3c2f 613e me="l01683"> │ │ │ │ +0003e770: 3c73 7061 6e20 636c 6173 733d 226c 696e 1683 char │ │ │ │ +0003e7c0: 206d 6573 7361 6765 5b33 3030 5d3b 3c2f message[300];.
16 │ │ │ │ +0003e820: 3834 3c2f 7370 616e 3e20 2020 2020 2020 84 │ │ │ │ +0003e830: 2020 203c 7370 616e 2063 6c61 7373 3d22 int │ │ │ │ +0003e850: 3c2f 7370 616e 3e20 6d65 7373 6167 654c messageL │ │ │ │ +0003e860: 656e 6774 683b 3c2f 6469 763e 0a3c 6469 ength;
.< │ │ │ │ +0003e880: 6120 6964 3d22 6c30 3136 3835 2220 6e61 a id="l01685" na │ │ │ │ +0003e890: 6d65 3d22 6c30 3136 3835 223e 3c2f 613e me="l01685"> │ │ │ │ +0003e8a0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1685 MPI_E │ │ │ │ +0003e8d0: 7272 6f72 5f73 7472 696e 6728 7374 6174 rror_string(stat │ │ │ │ +0003e8e0: 7573 6573 5b69 5d2e 4d50 495f 4552 524f uses[i].MPI_ERRO │ │ │ │ +0003e8f0: 522c 206d 6573 7361 6765 2c20 2661 6d70 R, message, & │ │ │ │ +0003e900: 3b6d 6573 7361 6765 4c65 6e67 7468 293b ;messageLength); │ │ │ │ +0003e910: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003e960: 3136 3836 3c2f 7370 616e 3e20 2020 2020 1686 │ │ │ │ +0003e970: 2020 2020 2073 7464 3a3a 6365 7272 266c std::cerr&l │ │ │ │ +0003e980: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<" source= │ │ │ │ +0003e9b0: 2671 756f 743b 3c2f 7370 616e 3e26 6c74 "< │ │ │ │ +0003e9c0: 3b26 6c74 3b73 7461 7475 7365 735b 695d ;<statuses[i] │ │ │ │ +0003e9d0: 2e4d 5049 5f53 4f55 5243 4526 6c74 3b26 .MPI_SOURCE<& │ │ │ │ +0003e9e0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +0003ea00: 7175 6f74 3b20 6d65 7373 6167 653a 2026 quot; message: & │ │ │ │ +0003ea10: 7175 6f74 3b3c 2f73 7061 6e3e 3b3c 2f64 quot;;.
168 │ │ │ │ +0003ea70: 373c 2f73 7061 6e3e 2020 2020 2020 2020 7 │ │ │ │ +0003ea80: 2020 3c73 7061 6e20 636c 6173 733d 226b for< │ │ │ │ +0003eaa0: 2f73 7061 6e3e 283c 7370 616e 2063 6c61 /span>(int j = │ │ │ │ +0003ead0: 303b 206a 2026 6c74 3b20 6d65 7373 6167 0; j < messag │ │ │ │ +0003eae0: 654c 656e 6774 683b 206a 2b2b 293c 2f64 eLength; j++).
168 │ │ │ │ +0003eb40: 383c 2f73 7061 6e3e 2020 2020 2020 2020 8 │ │ │ │ +0003eb50: 2020 2020 7374 643a 3a63 6f75 7426 6c74 std::cout< │ │ │ │ +0003eb60: 3b26 6c74 3b6d 6573 7361 6765 5b6a 5d3b ;<message[j]; │ │ │ │ +0003eb70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003ebc0: 3136 3839 3c2f 7370 616e 3e20 2020 2020 1689 │ │ │ │ +0003ebd0: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
1690 │ │ │ │ +0003ec30: 2020 2020 2073 7464 3a3a 6365 7272 266c std::cerr&l │ │ │ │ +0003ec40: 743b 266c 743b 7374 643a 3a65 6e64 6c3b t;<std::endl; │ │ │ │ +0003ec50: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003eca0: 3136 3931 3c2f 7370 616e 3e20 2020 207d 1691 } │ │ │ │ +0003ecb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003ed00: 3136 3932 3c2f 7370 616e 3e20 3c2f 6469 1692 .
1693 │ │ │ │ +0003ed60: 3c2f 7370 616e 3e20 2020 203c 7370 616e if(v │ │ │ │ +0003ed90: 6572 626f 7365 2920 7b3c 2f64 6976 3e0a erbose) {
. │ │ │ │ +0003eda0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0003edd0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1694 oocomm │ │ │ │ +0003ee00: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .communicator().barrier();< │ │ │ │ +0003ee70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003eec0: 3639 353c 2f73 7061 6e3e 2020 2020 2020 695 │ │ │ │ +0003eed0: 3c73 7061 6e20 636c 6173 733d 226b 6579 if(oocomm.comm │ │ │ │ +0003ef50: 756e 6963 6174 6f72 3c2f 613e 2829 2e72 unicator().r │ │ │ │ +0003ef60: 616e 6b28 293d 3d30 293c 2f64 6976 3e0a ank()==0)
. │ │ │ │ +0003ef70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0003efa0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1696 std: │ │ │ │ +0003efd0: 3a63 6f75 7426 6c74 3b26 6c74 3b3c 7370 :cout<<" │ │ │ │ +0003f000: 5265 6365 6976 696e 6720 616e 6420 7361 Receiving and sa │ │ │ │ +0003f010: 7669 6e67 2074 6f6f 6b20 2671 756f 743b ving took " │ │ │ │ +0003f020: 3c2f 7370 616e 3e26 6c74 3b26 6c74 3b3c <<< │ │ │ │ +0003f030: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003f080: 3639 373c 2f73 7061 6e3e 2020 2020 2020 697 │ │ │ │ +0003f090: 2020 7469 6d65 2e65 6c61 7073 6564 2829 time.elapsed() │ │ │ │ +0003f0a0: 266c 743b 266c 743b 7374 643a 3a65 6e64 <<std::end │ │ │ │ +0003f0b0: 6c3b 3c2f 6469 763e 0a3c 6469 7620 636c l;
.
1698 │ │ │ │ +0003f110: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
1699 │ │ │ │ +0003f170: 2074 696d 652e 7265 7365 7428 293b 3c2f time.reset();.
17 │ │ │ │ +0003f1d0: 3030 3c2f 7370 616e 3e20 3c2f 6469 763e 00
│ │ │ │ +0003f1e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +0003f210: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1701 for(int i=0; i < n │ │ │ │ +0003f290: 6f53 656e 6454 6f3b 202b 2b69 293c 2f64 oSendTo; ++i).
170 │ │ │ │ +0003f2f0: 323c 2f73 7061 6e3e 2020 2020 2020 3c73 2 delete[] sendBuffers[ │ │ │ │ +0003f330: 695d 3b3c 2f64 6976 3e0a 3c64 6976 2063 i];
.
1703 < │ │ │ │ +0003f390: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003f3e0: 3730 343c 2f73 7061 6e3e 2020 2020 3c73 704 delete[] sendBuffers; │ │ │ │ +0003f420: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +0003f470: 3137 3035 3c2f 7370 616e 3e20 2020 203c 1705 < │ │ │ │ +0003f480: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +0003f490: 6f72 6422 3e64 656c 6574 653c 2f73 7061 ord">delete[] statuses;.
17 │ │ │ │ +0003f500: 3036 3c2f 7370 616e 3e20 2020 203c 7370 06 delete │ │ │ │ +0003f530: 5b5d 2072 6571 7565 7374 733b 3c2f 6469 [] requests;.
1707 │ │ │ │ +0003f590: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +0003f5a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003f5b0: 3e3c 6120 6964 3d22 6c30 3137 3038 2220 > 1708
redistInf │ │ │ │ +0003f600: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .setCommunicato │ │ │ │ +0003f660: 723c 2f61 3e28 6f6f 636f 6d6d 2e3c 6120 r(oocomm.co │ │ │ │ +0003f6c0: 6d6d 756e 6963 6174 6f72 3c2f 613e 2829 mmunicator() │ │ │ │ +0003f6d0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1709 .
17 │ │ │ │ +0003f780: 3130 3c2f 7370 616e 3e20 2020 203c 7370 10 //.
1711 │ │ │ │ +0003f800: 3c2f 7370 616e 3e20 2020 203c 7370 616e // 4.2) Create │ │ │ │ +0003f830: 7468 6520 496e 6465 7853 6574 2065 7463 the IndexSet etc │ │ │ │ +0003f840: 2e3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c .
.< │ │ │ │ +0003f850: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003f860: 3e3c 6120 6964 3d22 6c30 3137 3132 2220 > 1712
//< │ │ │ │ +0003f8c0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +0003f8e0: 6120 6964 3d22 6c30 3137 3133 2220 6e61 a id="l01713" na │ │ │ │ +0003f8f0: 6d65 3d22 6c30 3137 3133 223e 3c2f 613e me="l01713"> │ │ │ │ +0003f900: 3c73 7061 6e20 636c 6173 733d 226c 696e 1713
.
1714 │ │ │ │ +0003f980: 203c 7370 616e 2063 6c61 7373 3d22 636f // build │ │ │ │ +0003f9a0: 7468 6520 6e65 7720 6f75 7470 7574 496e the new outputIn │ │ │ │ +0003f9b0: 6465 7853 6574 3c2f 7370 616e 3e3c 2f64 dexSet.
171 │ │ │ │ +0003fa10: 353c 2f73 7061 6e3e 203c 2f64 6976 3e0a 5
. │ │ │ │ +0003fa20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +0003fab0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +0003fac0: 6e6f 223e 2031 3731 373c 2f73 7061 6e3e no"> 1717 │ │ │ │ +0003fad0: 2020 2020 3c73 7061 6e20 636c 6173 733d in │ │ │ │ +0003faf0: 743c 2f73 7061 6e3e 2063 6f6c 6f72 3d30 t color=0 │ │ │ │ +0003fb00: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +0003fb50: 2031 3731 383c 2f73 7061 6e3e 203c 2f64 1718 .
171 │ │ │ │ +0003fbb0: 393c 2f73 7061 6e3e 2020 2020 3c73 7061 9 if │ │ │ │ +0003fbe0: 2821 6578 6973 7465 6e74 4f6e 4e65 7874 (!existentOnNext │ │ │ │ +0003fbf0: 4c65 7665 6c29 207b 3c2f 6469 763e 0a3c Level) {
.< │ │ │ │ +0003fc00: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +0003fc10: 3e3c 6120 6964 3d22 6c30 3137 3230 2220 > 1720 / │ │ │ │ +0003fc70: 2f20 7468 6973 2070 726f 6365 7373 2069 / this process i │ │ │ │ +0003fc80: 7320 6e6f 7420 7573 6564 2061 6e79 6d6f s not used anymo │ │ │ │ +0003fc90: 7265 3c2f 7370 616e 3e3c 2f64 6976 3e0a re
. │ │ │ │ +0003fca0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +0003fcd0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1721 color= │ │ │ │ +0003fd00: 204d 5049 5f55 4e44 4546 494e 4544 3b3c MPI_UNDEFINED;< │ │ │ │ +0003fd10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003fd60: 3732 323c 2f73 7061 6e3e 2020 2020 7d3c 722 }< │ │ │ │ +0003fd70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +0003fdc0: 3732 333c 2f73 7061 6e3e 2020 2020 4d50 723 MP │ │ │ │ +0003fdd0: 495f 436f 6d6d 206f 7574 7075 7443 6f6d I_Comm outputCom │ │ │ │ +0003fde0: 6d3b 3c2f 6469 763e 0a3c 6469 7620 636c m;
.
1724 .
17 │ │ │ │ +0003fe90: 3235 3c2f 7370 616e 3e20 2020 204d 5049 25 MPI │ │ │ │ +0003fea0: 5f43 6f6d 6d5f 7370 6c69 7428 6f6f 636f _Comm_split(ooco │ │ │ │ +0003feb0: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +0003ff10: 3c2f 613e 2829 2c20 636f 6c6f 722c 206f (), color, o │ │ │ │ +0003ff20: 6f63 6f6d 6d2e 3c61 2063 6c61 7373 3d22 ocomm.communica │ │ │ │ +0003ff80: 746f 723c 2f61 3e28 292e 7261 6e6b 2829 tor().rank() │ │ │ │ +0003ff90: 2c20 2661 6d70 3b6f 7574 7075 7443 6f6d , &outputCom │ │ │ │ +0003ffa0: 6d29 3b3c 2f64 6976 3e0a 3c64 6976 2063 m);
.
1726 │ │ │ │ +00040000: 2020 6f75 7463 6f6d 6d20 3d20 7374 643a outcomm = std: │ │ │ │ +00040010: 3a6d 616b 655f 7368 6172 6564 266c 743b :make_shared< │ │ │ │ +00040020: 4f4f 436f 6d6d 2667 743b 286f 7574 7075 OOComm>(outpu │ │ │ │ +00040030: 7443 6f6d 6d2c 536f 6c76 6572 4361 7465 tComm,SolverCate │ │ │ │ +00040040: 676f 7279 3a3a 6361 7465 676f 7279 286f gory::category(o │ │ │ │ +00040050: 6f63 6f6d 6d29 2c3c 7370 616e 2063 6c61 ocomm),tru │ │ │ │ +00040070: 653c 2f73 7061 6e3e 293b 3c2f 6469 763e e);
│ │ │ │ +00040080: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +000400f0: 6120 6964 3d22 6c30 3137 3238 2220 6e61 a id="l01728" na │ │ │ │ +00040100: 6d65 3d22 6c30 3137 3238 223e 3c2f 613e me="l01728"> │ │ │ │ +00040110: 3c73 7061 6e20 636c 6173 733d 226c 696e 1728 // tr │ │ │ │ +00040150: 616e 736c 6174 6520 6e65 6967 6862 6f72 anslate neighbor │ │ │ │ +00040160: 2072 616e 6b73 2e3c 2f73 7061 6e3e 3c2f ranks..
17 │ │ │ │ +000401c0: 3239 3c2f 7370 616e 3e20 2020 203c 7370 29 int newrank=outcom │ │ │ │ +00040200: 6d2d 2667 743b 636f 6d6d 756e 6963 6174 m->communicat │ │ │ │ +00040210: 6f72 2829 2e72 616e 6b28 293b 3c2f 6469 or().rank();.
1730 │ │ │ │ +00040270: 3c2f 7370 616e 3e20 2020 203c 7370 616e int │ │ │ │ +000402a0: 2a6e 6577 7261 6e6b 733d 3c73 7061 6e20 *newranks= │ │ │ │ +000402c0: 6e65 773c 2f73 7061 6e3e 203c 7370 616e new int[ │ │ │ │ +000402f0: 6f6f 636f 6d6d 2e3c 6120 636c 6173 733d oocomm.communic │ │ │ │ +00040350: 6174 6f72 3c2f 613e 2829 2e73 697a 6528 ator().size( │ │ │ │ +00040360: 295d 3b3c 2f64 6976 3e0a 3c64 6976 2063 )];
.
1731 │ │ │ │ +000403c0: 2020 7374 643a 3a76 6563 746f 7226 6c74 std::vector< │ │ │ │ +000403d0: 3b69 6e74 2667 743b 2074 6e65 6967 6862 ;int> tneighb │ │ │ │ +000403e0: 6f72 733b 3c2f 6469 763e 0a3c 6469 7620 ors;
.
1732 │ │ │ │ +00040440: 2020 2074 6e65 6967 6862 6f72 732e 7265 tneighbors.re │ │ │ │ +00040450: 7365 7276 6528 6d79 4e65 6967 6862 6f72 serve(myNeighbor │ │ │ │ +00040460: 732e 7369 7a65 2829 293b 3c2f 6469 763e s.size());
│ │ │ │ +00040470: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +000404e0: 6120 6964 3d22 6c30 3137 3334 2220 6e61 a id="l01734" na │ │ │ │ +000404f0: 6d65 3d22 6c30 3137 3334 223e 3c2f 613e me="l01734"> │ │ │ │ +00040500: 3c73 7061 6e20 636c 6173 733d 226c 696e 1734 typen │ │ │ │ +00040540: 616d 653c 2f73 7061 6e3e 204f 4f43 6f6d ame OOCom │ │ │ │ +00040550: 6d3a 3a50 6172 616c 6c65 6c49 6e64 6578 m::ParallelIndex │ │ │ │ +00040560: 5365 7426 616d 703b 206f 7574 7075 7449 Set& outputI │ │ │ │ +00040570: 6e64 6578 5365 7420 3d20 6f75 7463 6f6d ndexSet = outcom │ │ │ │ +00040580: 6d2d 2667 743b 696e 6465 7853 6574 2829 m->indexSet() │ │ │ │ +00040590: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +000405e0: 2031 3733 353c 2f73 7061 6e3e 203c 2f64 1735 .
173 │ │ │ │ +00040640: 363c 2f73 7061 6e3e 2020 2020 4d50 495f 6 MPI_ │ │ │ │ +00040650: 416c 6c67 6174 6865 7228 2661 6d70 3b6e Allgather(&n │ │ │ │ +00040660: 6577 7261 6e6b 2c20 312c 204d 5049 5f49 ewrank, 1, MPI_I │ │ │ │ +00040670: 4e54 2c20 6e65 7772 616e 6b73 2c20 312c NT, newranks, 1, │ │ │ │ +00040680: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000406d0: 3137 3337 3c2f 7370 616e 3e20 2020 2020 1737 │ │ │ │ +000406e0: 2020 2020 2020 2020 2020 2020 204d 5049 MPI │ │ │ │ +000406f0: 5f49 4e54 2c20 6f6f 636f 6d6d 2e3c 6120 _INT, oocomm.co │ │ │ │ +00040750: 6d6d 756e 6963 6174 6f72 3c2f 613e 2829 mmunicator() │ │ │ │ +00040760: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
1738 .
17 │ │ │ │ +00040810: 3339 3c2f 7370 616e 3e3c 7370 616e 2063 39#ifdef DEBUG │ │ │ │ +00040840: 5f52 4550 4152 543c 2f73 7061 6e3e 3c2f _REPART.
17 │ │ │ │ +000408a0: 3430 3c2f 7370 616e 3e20 2020 2073 7464 40 std │ │ │ │ +000408b0: 3a3a 636f 7574 266c 743b 266c 743b 6f6f ::cout<<oo │ │ │ │ +000408c0: 636f 6d6d 2e3c 6120 636c 6173 733d 2263 comm.communicat │ │ │ │ +00040920: 6f72 3c2f 613e 2829 2e72 616e 6b28 2926 or().rank()& │ │ │ │ +00040930: 6c74 3b26 6c74 3b3c 7370 616e 2063 6c61 lt;<" " │ │ │ │ +00040960: 3c2f 7370 616e 3e3b 3c2f 6469 763e 0a3c ;
.< │ │ │ │ +00040970: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00040980: 3e3c 6120 6964 3d22 6c30 3137 3431 2220 > 1741 for(auto i= │ │ │ │ +00040a10: 6d79 4e65 6967 6862 6f72 732e 6265 6769 myNeighbors.begi │ │ │ │ +00040a20: 6e28 292c 2065 6e64 3d6d 794e 6569 6768 n(), end=myNeigh │ │ │ │ +00040a30: 626f 7273 2e65 6e64 2829 3b3c 2f64 6976 bors.end();
.
1742< │ │ │ │ +00040a90: 2f73 7061 6e3e 2020 2020 2020 2020 6921 /span> i! │ │ │ │ +00040aa0: 3d65 6e64 3b20 2b2b 6929 207b 3c2f 6469 =end; ++i) {.
1743 │ │ │ │ +00040b00: 3c2f 7370 616e 3e20 2020 2020 2061 7373 ass │ │ │ │ +00040b10: 6572 7428 6e65 7772 616e 6b73 5b2a 695d ert(newranks[*i] │ │ │ │ +00040b20: 2667 743b 3d30 293b 3c2f 6469 763e 0a3c >=0);
.< │ │ │ │ +00040b30: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00040b40: 3e3c 6120 6964 3d22 6c30 3137 3434 2220 > 1744 std::co │ │ │ │ +00040b90: 7574 266c 743b 266c 743b 2a69 266c 743b ut<<*i< │ │ │ │ +00040ba0: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00040bc0: 2671 756f 743b 2d26 6774 3b26 7175 6f74 "->" │ │ │ │ +00040bd0: 3b3c 2f73 7061 6e3e 266c 743b 266c 743b ;<< │ │ │ │ +00040be0: 6e65 7772 616e 6b73 5b2a 695d 266c 743b newranks[*i]< │ │ │ │ +00040bf0: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00040c10: 2671 756f 743b 2026 7175 6f74 3b3c 2f73 " "
;
.
< │ │ │ │ +00040c60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00040c70: 6e6f 223e 2031 3734 353c 2f73 7061 6e3e no"> 1745 │ │ │ │ +00040c80: 2020 2020 2020 746e 6569 6768 626f 7273 tneighbors │ │ │ │ +00040c90: 2e70 7573 685f 6261 636b 286e 6577 7261 .push_back(newra │ │ │ │ +00040ca0: 6e6b 735b 2a69 5d29 3b3c 2f64 6976 3e0a nks[*i]);
. │ │ │ │ +00040cb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ +00040d10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1748#else
.
< │ │ │ │ +00040e40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00040e50: 6e6f 223e 2031 3734 393c 2f73 7061 6e3e no"> 1749 │ │ │ │ +00040e60: 2020 2020 3c73 7061 6e20 636c 6173 733d fo │ │ │ │ +00040e80: 723c 2f73 7061 6e3e 283c 7370 616e 2063 r(a │ │ │ │ +00040ea0: 7574 6f3c 2f73 7061 6e3e 2069 3d6d 794e uto i=myN │ │ │ │ +00040eb0: 6569 6768 626f 7273 2e62 6567 696e 2829 eighbors.begin() │ │ │ │ +00040ec0: 2c20 656e 643d 6d79 4e65 6967 6862 6f72 , end=myNeighbor │ │ │ │ +00040ed0: 732e 656e 6428 293b 3c2f 6469 763e 0a3c s.end();
.< │ │ │ │ +00040ee0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00040ef0: 3e3c 6120 6964 3d22 6c30 3137 3530 2220 > 1750 i!=en │ │ │ │ +00040f40: 643b 202b 2b69 2920 7b3c 2f64 6976 3e0a d; ++i) {
. │ │ │ │ +00040f50: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00040f80: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1751 tneigh │ │ │ │ +00040fb0: 626f 7273 2e70 7573 685f 6261 636b 286e bors.push_back(n │ │ │ │ +00040fc0: 6577 7261 6e6b 735b 2a69 5d29 3b3c 2f64 ewranks[*i]);.
175 │ │ │ │ +00041020: 323c 2f73 7061 6e3e 2020 2020 7d3c 2f64 2 }.
175 │ │ │ │ +00041080: 333c 2f73 7061 6e3e 3c73 7061 6e20 636c 3#endif │ │ │ │ +000410b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00041100: 3137 3534 3c2f 7370 616e 3e20 2020 203c 1754 < │ │ │ │ +00041110: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +00041120: 6f72 6422 3e64 656c 6574 653c 2f73 7061 ord">delete[] newranks;.
17 │ │ │ │ +00041190: 3535 3c2f 7370 616e 3e20 2020 206d 794e 55 myN │ │ │ │ +000411a0: 6569 6768 626f 7273 2e63 6c65 6172 2829 eighbors.clear() │ │ │ │ +000411b0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00041200: 2031 3735 363c 2f73 7061 6e3e 203c 2f64 1756 .
175 │ │ │ │ +00041260: 373c 2f73 7061 6e3e 2020 2020 3c73 7061 7 if( │ │ │ │ +00041290: 7665 7262 6f73 6529 207b 3c2f 6469 763e verbose) {
│ │ │ │ +000412a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
│ │ │ │ +000413c0: 3137 3539 3c2f 7370 616e 3e20 2020 2020 1759 │ │ │ │ +000413d0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if(oocomm.com │ │ │ │ +00041450: 6d75 6e69 6361 746f 723c 2f61 3e28 292e municator(). │ │ │ │ +00041460: 7261 6e6b 2829 3d3d 3029 3c2f 6469 763e rank()==0)
│ │ │ │ +00041470: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000414a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1760 std │ │ │ │ +000414d0: 3a3a 636f 7574 266c 743b 266c 743b 3c73 ::cout<<" │ │ │ │ +00041500: 2043 616c 6375 6c61 7469 6e67 206e 6577 Calculating new │ │ │ │ +00041510: 206e 6569 6768 626f 7572 7320 2826 7175 neighbours (&qu │ │ │ │ +00041520: 6f74 3b3c 2f73 7061 6e3e 266c 743b 266c ot;<&l │ │ │ │ +00041530: 743b 746e 6569 6768 626f 7273 2e73 697a t;tneighbors.siz │ │ │ │ +00041540: 6528 2926 6c74 3b26 6c74 3b3c 7370 616e e()<<") t │ │ │ │ +00041570: 6f6f 6b20 2671 756f 743b 3c2f 7370 616e ook "<<
. │ │ │ │ +00041590: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +000415c0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1761 time │ │ │ │ +000415f0: 2e65 6c61 7073 6564 2829 266c 743b 266c .elapsed()<&l │ │ │ │ +00041600: 743b 7374 643a 3a65 6e64 6c3b 3c2f 6469 t;std::endl;.
1762 │ │ │ │ +00041660: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
1763 │ │ │ │ +000416c0: 3c2f 7370 616e 3e20 2020 2074 696d 652e time. │ │ │ │ +000416d0: 7265 7365 7428 293b 3c2f 6469 763e 0a3c reset();
.< │ │ │ │ +000416e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000416f0: 3e3c 6120 6964 3d22 6c30 3137 3634 2220 > 1764
.
1765 │ │ │ │ +00041790: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000417e0: 3137 3636 3c2f 7370 616e 3e20 2020 206f 1766 o │ │ │ │ +000417f0: 7574 7075 7449 6e64 6578 5365 742e 6265 utputIndexSet.be │ │ │ │ +00041800: 6769 6e52 6573 697a 6528 293b 3c2f 6469 ginResize();.
1767 │ │ │ │ +00041860: 3c2f 7370 616e 3e20 2020 203c 7370 616e // 1) add the o │ │ │ │ +00041890: 776e 6572 2076 6572 7469 6365 733c 2f73 wner vertices
.
1768 │ │ │ │ +00041900: 2020 203c 7370 616e 2063 6c61 7373 3d22 // Sort │ │ │ │ +00041920: 2074 6865 206f 776e 6572 733c 2f73 7061 the owners
.
1769 │ │ │ │ +00041990: 2073 7464 3a3a 736f 7274 286d 794f 776e std::sort(myOwn │ │ │ │ +000419a0: 6572 5665 632e 6265 6769 6e28 292c 206d erVec.begin(), m │ │ │ │ +000419b0: 794f 776e 6572 5665 632e 656e 6428 292c yOwnerVec.end(), │ │ │ │ +000419c0: 2053 6f72 7446 6972 7374 2829 293b 3c2f SortFirst());.
17 │ │ │ │ +00041a20: 3730 3c2f 7370 616e 3e20 2020 203c 7370 70 // The owners │ │ │ │ +00041a50: 2061 7265 2073 6f72 7465 6420 6163 636f are sorted acco │ │ │ │ +00041a60: 7264 696e 6720 746f 2074 6865 7265 2067 rding to there g │ │ │ │ +00041a70: 6c6f 6261 6c20 696e 6465 783c 2f73 7061 lobal index
.
1771 │ │ │ │ +00041ae0: 203c 7370 616e 2063 6c61 7373 3d22 636f // Theref │ │ │ │ +00041b00: 6f72 6520 7468 6520 656e 7472 6965 7320 ore the entries │ │ │ │ +00041b10: 6f66 206f 776e 6572 5665 6320 6172 6520 of ownerVec are │ │ │ │ +00041b20: 7468 6520 7361 6d65 2061 7320 7468 653c the same as the< │ │ │ │ +00041b30: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +00041b50: 6120 6964 3d22 6c30 3137 3732 2220 6e61 a id="l01772" na │ │ │ │ +00041b60: 6d65 3d22 6c30 3137 3732 223e 3c2f 613e me="l01772"> │ │ │ │ +00041b70: 3c73 7061 6e20 636c 6173 733d 226c 696e 1772 // on │ │ │ │ +00041bb0: 6573 2069 6e20 7468 6520 7265 7375 6c74 es in the result │ │ │ │ +00041bc0: 696e 6720 696e 6465 7820 7365 742e 3c2f ing index set.
.
< │ │ │ │ +00041c10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00041c20: 6e6f 223e 2031 3737 333c 2f73 7061 6e3e no"> 1773 │ │ │ │ +00041c30: 2020 2020 3c73 7061 6e20 636c 6173 733d in │ │ │ │ +00041c50: 743c 2f73 7061 6e3e 2069 3d30 3b3c 2f64 t i=0;.
177 │ │ │ │ +00041cb0: 343c 2f73 7061 6e3e 2020 2020 3c73 7061 4 using L │ │ │ │ +00041ce0: 6f63 616c 496e 6465 7854 203d 203c 7370 ocalIndexT = typename OOComm::Paral │ │ │ │ +00041d20: 6c65 6c49 6e64 6578 5365 743a 3a4c 6f63 lelIndexSet::Loc │ │ │ │ +00041d30: 616c 496e 6465 783b 3c2f 6469 763e 0a3c alIndex;
.< │ │ │ │ +00041d40: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00041d50: 3e3c 6120 6964 3d22 6c30 3137 3735 2220 > 1775 for(auto g= │ │ │ │ +00041de0: 6d79 4f77 6e65 7256 6563 2e62 6567 696e myOwnerVec.begin │ │ │ │ +00041df0: 2829 2c20 656e 6420 3d6d 794f 776e 6572 (), end =myOwner │ │ │ │ +00041e00: 5665 632e 656e 6428 293b 2067 213d 656e Vec.end(); g!=en │ │ │ │ +00041e10: 643b 202b 2b67 2c20 2b2b 6920 2920 7b3c d; ++g, ++i ) {< │ │ │ │ +00041e20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00041e70: 3737 363c 2f73 7061 6e3e 2020 2020 2020 776 │ │ │ │ +00041e80: 6f75 7470 7574 496e 6465 7853 6574 2e61 outputIndexSet.a │ │ │ │ +00041e90: 6464 2867 2d26 6774 3b66 6972 7374 2c4c dd(g->first,L │ │ │ │ +00041ea0: 6f63 616c 496e 6465 7854 2869 2c20 4f77 ocalIndexT(i, Ow │ │ │ │ +00041eb0: 6e65 724f 7665 726c 6170 436f 7079 4174 nerOverlapCopyAt │ │ │ │ +00041ec0: 7472 6962 7574 6553 6574 3a3a 6f77 6e65 tributeSet::owne │ │ │ │ +00041ed0: 722c 203c 7370 616e 2063 6c61 7373 3d22 r, true));
. │ │ │ │ +00041f10: 3c61 2069 643d 226c 3031 3737 3722 206e 1777 redistIn │ │ │ │ +00041f60: 662e 3c61 2063 6c61 7373 3d22 636f 6465 f.addReceiveInd │ │ │ │ +00041fc0: 6578 3c2f 613e 2867 2d26 6774 3b73 6563 ex(g->sec │ │ │ │ +00041fd0: 6f6e 642c 2069 293b 3c2f 6469 763e 0a3c ond, i);
.< │ │ │ │ +00041fe0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00041ff0: 3e3c 6120 6964 3d22 6c30 3137 3738 2220 > 1778 }
.< │ │ │ │ +00042040: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00042050: 3e3c 6120 6964 3d22 6c30 3137 3739 2220 > 1779
.
1780 │ │ │ │ +000420f0: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ +00042110: 2f73 7061 6e3e 2876 6572 626f 7365 2920 /span>(verbose) │ │ │ │ +00042120: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ │ +00042170: 2031 3738 313c 2f73 7061 6e3e 2020 2020 1781 │ │ │ │ +00042180: 2020 6f6f 636f 6d6d 2e3c 6120 636c 6173 oocomm.commun │ │ │ │ +000421e0: 6963 6174 6f72 3c2f 613e 2829 2e62 6172 icator().bar │ │ │ │ +000421f0: 7269 6572 2829 3b3c 2f64 6976 3e0a 3c64 rier();
. │ │ │ │ +00042210: 3c61 2069 643d 226c 3031 3738 3222 206e 1782 if(ooco │ │ │ │ +00042280: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +000422e0: 3c2f 613e 2829 2e72 616e 6b28 293d 3d30 ().rank()==0 │ │ │ │ +000422f0: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ │ +00042340: 2031 3738 333c 2f73 7061 6e3e 2020 2020 1783 │ │ │ │ +00042350: 2020 2020 7374 643a 3a63 6f75 7426 6c74 std::cout< │ │ │ │ +00042360: 3b26 6c74 3b3c 7370 616e 2063 6c61 7373 ;<" Adding o │ │ │ │ +00042390: 776e 6572 2069 6e64 6963 6573 2074 6f6f wner indices too │ │ │ │ +000423a0: 6b20 2671 756f 743b 3c2f 7370 616e 3e26 k "& │ │ │ │ +000423b0: 6c74 3b26 6c74 3b3c 2f64 6976 3e0a 3c64 lt;<
. │ │ │ │ +000423d0: 3c61 2069 643d 226c 3031 3738 3422 206e 1784 time.e │ │ │ │ +00042420: 6c61 7073 6564 2829 266c 743b 266c 743b lapsed()<< │ │ │ │ +00042430: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +00042440: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +000424a0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000424d0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1786 time.re │ │ │ │ +00042500: 7365 7428 293b 3c2f 6469 763e 0a3c 6469 set();
.< │ │ │ │ +00042520: 6120 6964 3d22 6c30 3137 3837 2220 6e61 a id="l01787" na │ │ │ │ +00042530: 6d65 3d22 6c30 3137 3837 223e 3c2f 613e me="l01787"> │ │ │ │ +00042540: 3c73 7061 6e20 636c 6173 733d 226c 696e 1787
.
1788 .
17 │ │ │ │ +00042610: 3839 3c2f 7370 616e 3e20 2020 203c 7370 89 // After all │ │ │ │ +00042640: 7468 6520 7665 7274 6963 6573 2061 7265 the vertices are │ │ │ │ +00042650: 2072 6563 6569 7665 642c 2074 6865 2076 received, the v │ │ │ │ +00042660: 6563 746f 7273 206d 7573 743c 2f73 7061 ectors must
.
1790 │ │ │ │ +000426d0: 203c 7370 616e 2063 6c61 7373 3d22 636f // be &qu │ │ │ │ +000426f0: 6f74 3b6d 6572 6765 6426 7175 6f74 3b20 ot;merged" │ │ │ │ +00042700: 746f 6765 7468 6572 2074 6f20 6372 6561 together to crea │ │ │ │ +00042710: 7465 2074 6865 2066 696e 616c 2076 6563 te the final vec │ │ │ │ +00042720: 746f 7273 2e3c 2f73 7061 6e3e 3c2f 6469 tors..
1791 │ │ │ │ +00042780: 3c2f 7370 616e 3e20 2020 203c 7370 616e // Because some │ │ │ │ +000427b0: 2076 6572 7469 6365 7320 7468 6174 2061 vertices that a │ │ │ │ +000427c0: 7265 2073 656e 7420 6173 206f 7665 726c re sent as overl │ │ │ │ +000427d0: 6170 2063 6f75 6c64 206e 6f77 3c2f 7370 ap could now
.
1792 │ │ │ │ +00042840: 2020 3c73 7061 6e20 636c 6173 733d 2263 // alrea │ │ │ │ +00042860: 6479 2069 6e63 6c75 6465 6420 6173 206f dy included as o │ │ │ │ +00042870: 776e 6572 2076 6572 7469 6563 7320 696e wner vertiecs in │ │ │ │ +00042880: 2074 6865 206e 6577 2070 6172 7469 7469 the new partiti │ │ │ │ +00042890: 6f6e 3c2f 7370 616e 3e3c 2f64 6976 3e0a on
. │ │ │ │ +000428a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
1794< │ │ │ │ +00042970: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ │ +00042990: 3c61 2069 643d 226c 3031 3739 3522 206e 1795 // T │ │ │ │ +000429f0: 7269 636b 2074 6f20 6672 6565 206d 656d rick to free mem │ │ │ │ +00042a00: 6f72 793c 2f73 7061 6e3e 3c2f 6469 763e ory
│ │ │ │ +00042a10: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00042a40: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1796 myOwner │ │ │ │ +00042a70: 5665 632e 636c 6561 7228 293b 3c2f 6469 Vec.clear();.
1797 │ │ │ │ +00042ad0: 3c2f 7370 616e 3e20 2020 206d 794f 776e myOwn │ │ │ │ +00042ae0: 6572 5665 632e 7377 6170 286d 794f 776e erVec.swap(myOwn │ │ │ │ +00042af0: 6572 5665 6329 3b3c 2f64 6976 3e0a 3c64 erVec);
. │ │ │ │ +00042b10: 3c61 2069 643d 226c 3031 3739 3822 206e 1798
.
1799 │ │ │ │ +00042bb0: 2020 3c73 7061 6e20 636c 6173 733d 226b if(verbose) { │ │ │ │ +00042be0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00042c30: 3138 3030 3c2f 7370 616e 3e20 2020 2020 1800 │ │ │ │ +00042c40: 206f 6f63 6f6d 6d2e 3c61 2063 6c61 7373 oocomm.communi │ │ │ │ +00042ca0: 6361 746f 723c 2f61 3e28 292e 6261 7272 cator().barr │ │ │ │ +00042cb0: 6965 7228 293b 3c2f 6469 763e 0a3c 6469 ier();
.< │ │ │ │ +00042cd0: 6120 6964 3d22 6c30 3138 3031 2220 6e61 a id="l01801" na │ │ │ │ +00042ce0: 6d65 3d22 6c30 3138 3031 223e 3c2f 613e me="l01801"> │ │ │ │ +00042cf0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1801 if(oocom │ │ │ │ +00042d40: 6d2e 3c61 2063 6c61 7373 3d22 636f 6465 m.communicator< │ │ │ │ +00042da0: 2f61 3e28 292e 7261 6e6b 2829 3d3d 3029 /a>().rank()==0) │ │ │ │ +00042db0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00042e00: 3138 3032 3c2f 7370 616e 3e20 2020 2020 1802 │ │ │ │ +00042e10: 2020 2073 7464 3a3a 636f 7574 266c 743b std::cout< │ │ │ │ +00042e20: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00042e40: 2671 756f 743b 204d 6572 6769 6e67 2069 " Merging i │ │ │ │ +00042e50: 6e64 6963 6573 2074 6f6f 6b20 2671 756f ndices took &quo │ │ │ │ +00042e60: 743b 3c2f 7370 616e 3e26 6c74 3b26 6c74 t;<< │ │ │ │ +00042e70: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00042ec0: 2031 3830 333c 2f73 7061 6e3e 2020 2020 1803 │ │ │ │ +00042ed0: 2020 2020 7469 6d65 2e65 6c61 7073 6564 time.elapsed │ │ │ │ +00042ee0: 2829 266c 743b 266c 743b 7374 643a 3a65 ()<<std::e │ │ │ │ +00042ef0: 6e64 6c3b 3c2f 6469 763e 0a3c 6469 7620 ndl;
.
1804 │ │ │ │ +00042f50: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
.
1805 │ │ │ │ +00042fb0: 2020 2074 696d 652e 7265 7365 7428 293b time.reset(); │ │ │ │ +00042fc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00043010: 3138 3036 3c2f 7370 616e 3e20 3c2f 6469 1806 .
1807 │ │ │ │ +00043070: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ │ +00043080: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00043090: 3e3c 6120 6964 3d22 6c30 3138 3038 2220 > 1808 // │ │ │ │ +000430f0: 3229 2061 6464 2074 6865 206f 7665 726c 2) add the overl │ │ │ │ +00043100: 6170 2076 6572 7469 6365 733c 2f73 7061 ap vertices
.
1809 │ │ │ │ +00043170: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for(auto │ │ │ │ +000431b0: 3c2f 7370 616e 3e20 673d 6d79 4f76 6572 g=myOver │ │ │ │ +000431c0: 6c61 7053 6574 2e62 6567 696e 2829 2c20 lapSet.begin(), │ │ │ │ +000431d0: 656e 643d 6d79 4f76 6572 6c61 7053 6574 end=myOverlapSet │ │ │ │ +000431e0: 2e65 6e64 2829 3b20 6721 3d65 6e64 3b20 .end(); g!=end; │ │ │ │ +000431f0: 2b2b 672c 2069 2b2b 2920 7b3c 2f64 6976 ++g, i++) {
.
1810< │ │ │ │ +00043250: 2f73 7061 6e3e 2020 2020 2020 6f75 7470 /span> outp │ │ │ │ +00043260: 7574 496e 6465 7853 6574 2e61 6464 282a utIndexSet.add(* │ │ │ │ +00043270: 672c 4c6f 6361 6c49 6e64 6578 5428 692c g,LocalIndexT(i, │ │ │ │ +00043280: 204f 776e 6572 4f76 6572 6c61 7043 6f70 OwnerOverlapCop │ │ │ │ +00043290: 7941 7474 7269 6275 7465 5365 743a 3a63 yAttributeSet::c │ │ │ │ +000432a0: 6f70 792c 203c 7370 616e 2063 6c61 7373 opy, true< │ │ │ │ +000432c0: 2f73 7061 6e3e 2929 3b3c 2f64 6976 3e0a /span>));
. │ │ │ │ +000432d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +00043330: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ +00043360: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1812 myOverla │ │ │ │ +00043390: 7053 6574 2e63 6c65 6172 2829 3b3c 2f64 pSet.clear();.
181 │ │ │ │ +000433f0: 333c 2f73 7061 6e3e 2020 2020 6f75 7470 3 outp │ │ │ │ +00043400: 7574 496e 6465 7853 6574 2e65 6e64 5265 utIndexSet.endRe │ │ │ │ +00043410: 7369 7a65 2829 3b3c 2f64 6976 3e0a 3c64 size();
. │ │ │ │ +00043430: 3c61 2069 643d 226c 3031 3831 3422 206e 1814
.
1815#ifdef │ │ │ │ +000434f0: 4455 4e45 5f49 5354 4c5f 5749 5448 5f43 DUNE_ISTL_WITH_C │ │ │ │ +00043500: 4845 434b 494e 473c 2f73 7061 6e3e 3c2f HECKING.
18 │ │ │ │ +00043560: 3136 3c2f 7370 616e 3e20 2020 203c 7370 16 int numOfOwnVtx =0 │ │ │ │ +000435a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +000435f0: 2031 3831 373c 2f73 7061 6e3e 2020 2020 1817 │ │ │ │ +00043600: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto end = outputIn │ │ │ │ +00043630: 6465 7853 6574 2e65 6e64 2829 3b3c 2f64 dexSet.end();.
181 │ │ │ │ +00043690: 383c 2f73 7061 6e3e 2020 2020 3c73 7061 8 for │ │ │ │ +000436c0: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (auto index = outpu │ │ │ │ +000436f0: 7449 6e64 6578 5365 742e 6265 6769 6e28 tIndexSet.begin( │ │ │ │ +00043700: 293b 2069 6e64 6578 2021 3d20 656e 643b ); index != end; │ │ │ │ +00043710: 202b 2b69 6e64 6578 2920 7b3c 2f64 6976 ++index) {
.
1819< │ │ │ │ +00043770: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> if │ │ │ │ +000437a0: 284f 776e 6572 5365 743a 3a63 6f6e 7461 (OwnerSet::conta │ │ │ │ +000437b0: 696e 7328 696e 6465 782d 2667 743b 6c6f ins(index->lo │ │ │ │ +000437c0: 6361 6c28 292e 6174 7472 6962 7574 6528 cal().attribute( │ │ │ │ +000437d0: 2929 2920 7b3c 2f64 6976 3e0a 3c64 6976 ))) {
.
< │ │ │ │ +00043810: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00043820: 6e6f 223e 2031 3832 303c 2f73 7061 6e3e no"> 1820 │ │ │ │ +00043830: 2020 2020 2020 2020 6e75 6d4f 664f 776e numOfOwn │ │ │ │ +00043840: 5674 782b 2b3b 3c2f 6469 763e 0a3c 6469 Vtx++;
.< │ │ │ │ +00043860: 6120 6964 3d22 6c30 3138 3231 2220 6e61 a id="l01821" na │ │ │ │ +00043870: 6d65 3d22 6c30 3138 3231 223e 3c2f 613e me="l01821"> │ │ │ │ +00043880: 3c73 7061 6e20 636c 6173 733d 226c 696e 1821 }
.< │ │ │ │ +000438b0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +000438c0: 3e3c 6120 6964 3d22 6c30 3138 3232 2220 > 1822
}
.< │ │ │ │ +00043910: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00043920: 3e3c 6120 6964 3d22 6c30 3138 3233 2220 > 1823 numOfOwnV │ │ │ │ +00043970: 7478 203d 206f 6f63 6f6d 6d2e 3c61 2063 tx = oocomm.com │ │ │ │ +000439d0: 6d75 6e69 6361 746f 723c 2f61 3e28 292e municator(). │ │ │ │ +000439e0: 7375 6d28 6e75 6d4f 664f 776e 5674 7829 sum(numOfOwnVtx) │ │ │ │ +000439f0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00043a40: 2031 3832 343c 2f73 7061 6e3e 2020 2020 1824 │ │ │ │ +00043a50: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // if(numO │ │ │ │ +00043a70: 664f 776e 5674 7821 3d69 6e64 6578 4d61 fOwnVtx!=indexMa │ │ │ │ +00043a80: 702e 676c 6f62 616c 4f77 6e65 7256 6572 p.globalOwnerVer │ │ │ │ +00043a90: 7469 6365 7329 3c2f 7370 616e 3e3c 2f64 tices).
182 │ │ │ │ +00043af0: 353c 2f73 7061 6e3e 2020 2020 3c73 7061 5 // {< │ │ │ │ +00043b20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00043b70: 3832 363c 2f73 7061 6e3e 2020 2020 3c73 826 // std:: │ │ │ │ +00043ba0: 6365 7272 266c 743b 266c 743b 6e75 6d4f cerr<<numO │ │ │ │ +00043bb0: 664f 776e 5674 7826 6c74 3b26 6c74 3b26 fOwnVtx<<& │ │ │ │ +00043bc0: 7175 6f74 3b21 3d26 7175 6f74 3b26 6c74 quot;!="< │ │ │ │ +00043bd0: 3b26 6c74 3b69 6e64 6578 4d61 702e 676c ;<indexMap.gl │ │ │ │ +00043be0: 6f62 616c 4f77 6e65 7256 6572 7469 6365 obalOwnerVertice │ │ │ │ +00043bf0: 7326 6c74 3b26 6c74 3b26 7175 6f74 3b20 s<<" │ │ │ │ +00043c00: 6f77 6e65 7273 206d 6973 7369 6e67 206f owners missing o │ │ │ │ +00043c10: 7220 6164 6469 7469 6f6e 616c 206f 6e65 r additional one │ │ │ │ +00043c20: 7321 2671 756f 743b 266c 743b 266c 743b s!"<< │ │ │ │ +00043c30: 7374 643a 3a65 6e64 6c3b 3c2f 7370 616e std::endl;
.
│ │ │ │ +00043c90: 2031 3832 373c 2f73 7061 6e3e 2020 2020 1827 │ │ │ │ +00043ca0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // DUN │ │ │ │ +00043cc0: 455f 5448 524f 5728 4953 544c 4572 726f E_THROW(ISTLErro │ │ │ │ +00043cd0: 722c 206e 756d 4f66 4f77 6e56 7478 266c r, numOfOwnVtx&l │ │ │ │ +00043ce0: 743b 266c 743b 2671 756f 743b 213d 2671 t;<"!=&q │ │ │ │ +00043cf0: 756f 743b 266c 743b 266c 743b 696e 6465 uot;<<inde │ │ │ │ +00043d00: 784d 6170 2e67 6c6f 6261 6c4f 776e 6572 xMap.globalOwner │ │ │ │ +00043d10: 5665 7274 6963 6573 266c 743b 266c 743b Vertices<< │ │ │ │ +00043d20: 2671 756f 743b 206f 776e 6572 7320 6d69 " owners mi │ │ │ │ +00043d30: 7373 696e 6720 6f72 2061 6464 6974 696f ssing or additio │ │ │ │ +00043d40: 6e61 6c20 6f6e 6573 2671 756f 743b 3c2f nal ones"
.
< │ │ │ │ +00043d90: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00043da0: 6e6f 223e 2031 3832 383c 2f73 7061 6e3e no"> 1828 │ │ │ │ +00043db0: 2020 2020 3c73 7061 6e20 636c 6173 733d // │ │ │ │ +00043dd0: 2020 2020 2020 2020 2026 6c74 3b26 6c74 << │ │ │ │ +00043de0: 3b26 7175 6f74 3b20 6475 7269 6e67 2072 ;" during r │ │ │ │ +00043df0: 6570 6172 7469 7469 6f6e 696e 672e 2671 epartitioning.&q │ │ │ │ +00043e00: 756f 743b 293b 3c2f 7370 616e 3e3c 2f64 uot;);.
182 │ │ │ │ +00043e60: 393c 2f73 7061 6e3e 2020 2020 3c73 7061 9 // }< │ │ │ │ +00043e90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00043ee0: 3833 303c 2f73 7061 6e3e 2020 2020 7374 830 st │ │ │ │ +00043ef0: 643a 3a69 735f 736f 7274 6564 286f 7574 d::is_sorted(out │ │ │ │ +00043f00: 7075 7449 6e64 6578 5365 742e 6265 6769 putIndexSet.begi │ │ │ │ +00043f10: 6e28 292c 206f 7574 7075 7449 6e64 6578 n(), outputIndex │ │ │ │ +00043f20: 5365 742e 656e 6428 292c 3c2f 6469 763e Set.end(),
│ │ │ │ +00043f30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00043f60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1831 │ │ │ │ +00043f90: 2020 2020 2020 2020 5b5d 283c 7370 616e [](const auto& │ │ │ │ +00043fe0: 616d 703b 2076 312c 203c 7370 616e 2063 amp; v1, c │ │ │ │ +00044000: 6f6e 7374 3c2f 7370 616e 3e20 3c73 7061 onst auto&am │ │ │ │ +00044030: 703b 2076 3229 7b20 7265 7475 726e 2076 p; v2){ return v │ │ │ │ +00044040: 312e 676c 6f62 616c 2829 2026 6c74 3b20 1.global() < │ │ │ │ +00044050: 7632 2e67 6c6f 6261 6c28 293b 7d29 3b3c v2.global();});< │ │ │ │ +00044060: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +000440b0: 3833 323c 2f73 7061 6e3e 3c73 7061 6e20 832#endif
.
1833 │ │ │ │ +00044140: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if(verbose) {< │ │ │ │ +00044170: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +000441c0: 3833 343c 2f73 7061 6e3e 2020 2020 2020 834 │ │ │ │ +000441d0: 6f6f 636f 6d6d 2e3c 6120 636c 6173 733d oocomm.communic │ │ │ │ +00044230: 6174 6f72 3c2f 613e 2829 2e62 6172 7269 ator().barri │ │ │ │ +00044240: 6572 2829 3b3c 2f64 6976 3e0a 3c64 6976 er();
.
< │ │ │ │ +00044280: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00044290: 6e6f 223e 2031 3833 353c 2f73 7061 6e3e no"> 1835 │ │ │ │ +000442a0: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ │ +000442c0: 6966 3c2f 7370 616e 3e28 6f6f 636f 6d6d if(oocomm │ │ │ │ +000442d0: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .communicator().rank()==0)< │ │ │ │ +00044340: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00044390: 3833 363c 2f73 7061 6e3e 2020 2020 2020 836 │ │ │ │ +000443a0: 2020 7374 643a 3a63 6f75 7426 6c74 3b26 std::cout<& │ │ │ │ +000443b0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;& │ │ │ │ +000443d0: 7175 6f74 3b20 4164 6469 6e67 206f 7665 quot; Adding ove │ │ │ │ +000443e0: 726c 6170 2069 6e64 6963 6573 2074 6f6f rlap indices too │ │ │ │ +000443f0: 6b20 2671 756f 743b 3c2f 7370 616e 3e26 k "& │ │ │ │ +00044400: 6c74 3b26 6c74 3b3c 2f64 6976 3e0a 3c64 lt;<
. │ │ │ │ +00044420: 3c61 2069 643d 226c 3031 3833 3722 206e 1837 time.e │ │ │ │ +00044470: 6c61 7073 6564 2829 266c 743b 266c 743b lapsed()<< │ │ │ │ +00044480: 7374 643a 3a65 6e64 6c3b 3c2f 6469 763e std::endl;
│ │ │ │ +00044490: 0a3c 6469 7620 636c 6173 733d 226c 696e . │ │ │ │ +000444f0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00044520: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1839 time.re │ │ │ │ +00044550: 7365 7428 293b 3c2f 6469 763e 0a3c 6469 set();
.< │ │ │ │ +00044570: 6120 6964 3d22 6c30 3138 3430 2220 6e61 a id="l01840" na │ │ │ │ +00044580: 6d65 3d22 6c30 3138 3430 223e 3c2f 613e me="l01840"> │ │ │ │ +00044590: 3c73 7061 6e20 636c 6173 733d 226c 696e 1840
.
1841 .
18 │ │ │ │ +00044660: 3432 3c2f 7370 616e 3e20 2020 203c 7370 42 if │ │ │ │ +00044690: 2863 6f6c 6f72 2021 3d20 4d50 495f 554e (color != MPI_UN │ │ │ │ +000446a0: 4445 4649 4e45 4429 207b 3c2f 6469 763e DEFINED) {
│ │ │ │ +000446b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000446e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1843 outco │ │ │ │ +00044710: 6d6d 2d26 6774 3b72 656d 6f74 6549 6e64 mm->remoteInd │ │ │ │ +00044720: 6963 6573 2829 2e73 6574 4e65 6967 6862 ices().setNeighb │ │ │ │ +00044730: 6f75 7273 2874 6e65 6967 6862 6f72 7329 ours(tneighbors) │ │ │ │ +00044740: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00044790: 2031 3834 343c 2f73 7061 6e3e 2020 2020 1844 │ │ │ │ +000447a0: 2020 6f75 7463 6f6d 6d2d 2667 743b 7265 outcomm->re │ │ │ │ +000447b0: 6d6f 7465 496e 6469 6365 7328 292e 7465 moteIndices().te │ │ │ │ +000447c0: 6d70 6c61 7465 2072 6562 7569 6c64 266c mplate rebuild&l │ │ │ │ +000447d0: 743b 7472 7565 2667 743b 2829 3b3c 2f64 t;true>();.
184 │ │ │ │ +00044830: 353c 2f73 7061 6e3e 203c 2f64 6976 3e0a 5
. │ │ │ │ +00044840: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ │ +000448a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ +00044930: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ +00044940: 6e6f 223e 2031 3834 383c 2f73 7061 6e3e no"> 1848 │ │ │ │ +00044950: 2020 2020 3c73 7061 6e20 636c 6173 733d // rel │ │ │ │ +00044970: 6561 7365 2074 6865 206d 656d 6f72 793c ease the memory< │ │ │ │ +00044980: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ +000449a0: 6120 6964 3d22 6c30 3138 3439 2220 6e61 a id="l01849" na │ │ │ │ +000449b0: 6d65 3d22 6c30 3138 3439 223e 3c2f 613e me="l01849"> │ │ │ │ +000449c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 1849 delet │ │ │ │ +00044a00: 653c 2f73 7061 6e3e 5b5d 2073 656e 6454 e[] sendT │ │ │ │ +00044a10: 6f3b 3c2f 6469 763e 0a3c 6469 7620 636c o;
.
1850 .
18 │ │ │ │ +00044ac0: 3531 3c2f 7370 616e 3e20 2020 203c 7370 51 if │ │ │ │ +00044af0: 2876 6572 626f 7365 2920 7b3c 2f64 6976 (verbose) {
.
1852< │ │ │ │ +00044b50: 2f73 7061 6e3e 2020 2020 2020 6f6f 636f /span> ooco │ │ │ │ +00044b60: 6d6d 2e3c 6120 636c 6173 733d 2263 6f64 mm.communicator │ │ │ │ +00044bc0: 3c2f 613e 2829 2e62 6172 7269 6572 2829 ().barrier() │ │ │ │ +00044bd0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00044c20: 2031 3835 333c 2f73 7061 6e3e 2020 2020 1853 │ │ │ │ +00044c30: 2020 3c73 7061 6e20 636c 6173 733d 226b if(oocomm.co │ │ │ │ +00044cb0: 6d6d 756e 6963 6174 6f72 3c2f 613e 2829 mmunicator() │ │ │ │ +00044cc0: 2e72 616e 6b28 293d 3d30 293c 2f64 6976 .rank()==0)
.
1854< │ │ │ │ +00044d20: 2f73 7061 6e3e 2020 2020 2020 2020 7374 /span> st │ │ │ │ +00044d30: 643a 3a63 6f75 7426 6c74 3b26 6c74 3b3c d::cout<<< │ │ │ │ +00044d40: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ +00044d50: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ +00044d60: 3b20 5374 6f72 696e 6720 696e 6465 7873 ; Storing indexs │ │ │ │ +00044d70: 6574 7320 746f 6f6b 2026 7175 6f74 3b3c ets took "< │ │ │ │ +00044d80: 2f73 7061 6e3e 266c 743b 266c 743b 3c2f /span><<.
18 │ │ │ │ +00044de0: 3535 3c2f 7370 616e 3e20 2020 2020 2020 55 │ │ │ │ +00044df0: 2074 696d 652e 656c 6170 7365 6428 2926 time.elapsed()& │ │ │ │ +00044e00: 6c74 3b26 6c74 3b73 7464 3a3a 656e 646c lt;<std::endl │ │ │ │ +00044e10: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ +00044e60: 2031 3835 363c 2f73 7061 6e3e 2020 2020 1856 │ │ │ │ +00044e70: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ +00044ec0: 2031 3835 373c 2f73 7061 6e3e 203c 2f64 1857 .
185 │ │ │ │ +00044f20: 383c 2f73 7061 6e3e 3c73 7061 6e20 636c 8#ifdef PERF_R │ │ │ │ +00044f50: 4550 4152 543c 2f73 7061 6e3e 3c2f 6469 EPART.
1859 │ │ │ │ +00044fb0: 3c2f 7370 616e 3e20 2020 203c 7370 616e // stop the tim │ │ │ │ +00044fe0: 6520 666f 7220 7374 6570 2034 2920 616e e for step 4) an │ │ │ │ +00044ff0: 6420 7072 696e 7420 7468 6520 7265 7375 d print the resu │ │ │ │ +00045000: 6c74 733c 2f73 7061 6e3e 3c2f 6469 763e lts
│ │ │ │ +00045010: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +00045040: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1860 t4=MPI_ │ │ │ │ +00045070: 5774 696d 6528 292d 7434 3b3c 2f64 6976 Wtime()-t4;
.
1861< │ │ │ │ +000450d0: 2f73 7061 6e3e 2020 2020 7453 756d 203d /span> tSum = │ │ │ │ +000450e0: 2074 3120 2b20 7432 202b 2074 3320 2b20 t1 + t2 + t3 + │ │ │ │ +000450f0: 7434 3b3c 2f64 6976 3e0a 3c64 6976 2063 t4;
.
1862 │ │ │ │ +00045150: 2020 7374 643a 3a63 6f75 7426 6c74 3b26 std::cout<& │ │ │ │ +00045160: 6c74 3b73 7464 3a3a 656e 646c 3c2f 6469 lt;std::endl.
1863 │ │ │ │ +000451c0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ │ +000451d0: 2020 2020 266c 743b 266c 743b 6d79 7065 <<mype │ │ │ │ +000451e0: 266c 743b 266c 743b 3c73 7061 6e20 636c <<": WTim │ │ │ │ +00045210: 6520 666f 7220 7374 6570 2031 293a 2026 e for step 1): & │ │ │ │ +00045220: 7175 6f74 3b3c 2f73 7061 6e3e 266c 743b quot;< │ │ │ │ +00045230: 266c 743b 7431 3c2f 6469 763e 0a3c 6469 <t1
.< │ │ │ │ +00045250: 6120 6964 3d22 6c30 3138 3634 2220 6e61 a id="l01864" na │ │ │ │ +00045260: 6d65 3d22 6c30 3138 3634 223e 3c2f 613e me="l01864"> │ │ │ │ +00045270: 3c73 7061 6e20 636c 6173 733d 226c 696e 1864 &l │ │ │ │ +000452a0: 743b 266c 743b 3c73 7061 6e20 636c 6173 t;<" 2): &qu │ │ │ │ +000452d0: 6f74 3b3c 2f73 7061 6e3e 266c 743b 266c ot;<&l │ │ │ │ +000452e0: 743b 7432 3c2f 6469 763e 0a3c 6469 7620 t;t2
.
1865 │ │ │ │ +00045340: 2020 2020 2020 2020 2020 2020 266c 743b < │ │ │ │ +00045350: 266c 743b 3c73 7061 6e20 636c 6173 733d < │ │ │ │ +00045370: 2671 756f 743b 2033 293a 2026 7175 6f74 " 3): " │ │ │ │ +00045380: 3b3c 2f73 7061 6e3e 266c 743b 266c 743b ;<< │ │ │ │ +00045390: 7433 3c2f 6469 763e 0a3c 6469 7620 636c t3
.
1866 │ │ │ │ +000453f0: 2020 2020 2020 2020 2020 266c 743b 266c <&l │ │ │ │ +00045400: 743b 3c73 7061 6e20 636c 6173 733d 2273 t;&q │ │ │ │ +00045420: 756f 743b 2034 293a 2026 7175 6f74 3b3c uot; 4): "< │ │ │ │ +00045430: 2f73 7061 6e3e 266c 743b 266c 743b 7434 /span><<t4 │ │ │ │ +00045440: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00045490: 3138 3637 3c2f 7370 616e 3e20 2020 2020 1867 │ │ │ │ +000454a0: 2020 2020 2020 2020 266c 743b 266c 743b << │ │ │ │ +000454b0: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +000454d0: 743b 2074 6f74 616c 3a20 2671 756f 743b t; total: " │ │ │ │ +000454e0: 3c2f 7370 616e 3e26 6c74 3b26 6c74 3b74 <<t │ │ │ │ +000454f0: 5375 6d3c 2f64 6976 3e0a 3c64 6976 2063 Sum
.
1868 │ │ │ │ +00045550: 2020 2020 2020 2020 2020 2026 6c74 3b26 <& │ │ │ │ +00045560: 6c74 3b73 7464 3a3a 656e 646c 3b3c 2f64 lt;std::endl;.
186 │ │ │ │ +000455c0: 393c 2f73 7061 6e3e 3c73 7061 6e20 636c 9#endif │ │ │ │ +000455f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00045640: 3138 3730 3c2f 7370 616e 3e20 3c2f 6469 1870 .
1871 │ │ │ │ +000456a0: 3c2f 7370 616e 3e20 2020 203c 7370 616e return color!=MPI_UN │ │ │ │ +000456e0: 4445 4649 4e45 443b 3c2f 6469 763e 0a3c DEFINED;
.< │ │ │ │ +000456f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ +00045700: 3e3c 6120 6964 3d22 6c30 3138 3732 2220 > 1872
.
1873 │ │ │ │ +000457a0: 207d 3c2f 6469 763e 0a3c 2f64 6976 3e0a }
.
. │ │ │ │ +000457b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
1875< │ │ │ │ +00045880: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> te │ │ │ │ +000458a0: 6d70 6c61 7465 3c2f 7370 616e 3e26 6c74 mplate< │ │ │ │ +000458b0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class G, cla │ │ │ │ +000458f0: 7373 3c2f 7370 616e 3e20 502c 3c73 7061 ss P,class T │ │ │ │ +00045920: 312c 203c 7370 616e 2063 6c61 7373 3d22 1, class T2, │ │ │ │ +00045960: 636c 6173 733c 2f73 7061 6e3e 2052 2667 class R&g │ │ │ │ +00045970: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
1876 < │ │ │ │ +000459d0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ +000459e0: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype">bool graphRepart │ │ │ │ +00045a00: 6974 696f 6e28 3c73 7061 6e20 636c 6173 ition(cons │ │ │ │ +00045a20: 743c 2f73 7061 6e3e 2047 2661 6d70 3b20 t G& │ │ │ │ +00045a30: 6772 6170 682c 2050 2661 6d70 3b20 6f6f graph, P& oo │ │ │ │ +00045a40: 636f 6d6d 2c20 3c73 7061 6e20 636c 6173 comm, │ │ │ │ +00045a60: 696e 743c 2f73 7061 6e3e 206e 7061 7274 int npart │ │ │ │ +00045a70: 732c 3c2f 6469 763e 0a3c 6469 7620 636c s,
.
1877 │ │ │ │ +00045ad0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00045ae0: 2020 2020 2073 7464 3a3a 7368 6172 6564 std::shared │ │ │ │ +00045af0: 5f70 7472 266c 743b 5026 6774 3b26 616d _ptr<P>&am │ │ │ │ +00045b00: 703b 206f 7574 636f 6d6d 2c3c 2f64 6976 p; outcomm,
.
1878< │ │ │ │ +00045b60: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00045b70: 2020 2020 2020 2020 2020 2020 2020 5226 R& │ │ │ │ +00045b80: 616d 703b 2072 6564 6973 7449 6e66 2c3c amp; redistInf,< │ │ │ │ +00045b90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
1 │ │ │ │ +00045be0: 3837 393c 2f73 7061 6e3e 2020 2020 2020 879 │ │ │ │ +00045bf0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00045c00: 2020 3c73 7061 6e20 636c 6173 733d 226b bool │ │ │ │ +00045c20: 3c2f 7370 616e 3e20 763d 3c73 7061 6e20 v= │ │ │ │ +00045c40: 6661 6c73 653c 2f73 7061 6e3e 293c 2f64 false).
188 │ │ │ │ +00045ca0: 303c 2f73 7061 6e3e 2020 7b3c 2f64 6976 0 {
.
1881< │ │ │ │ +00045d00: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> if(np │ │ │ │ +00045d30: 6172 7473 213d 6f6f 636f 6d6d 2e73 697a arts!=oocomm.siz │ │ │ │ +00045d40: 6528 2929 3c2f 6469 763e 0a3c 6469 7620 e())
.
1882 │ │ │ │ +00045da0: 2020 2020 2044 554e 455f 5448 524f 5728 DUNE_THROW( │ │ │ │ +00045db0: 4e6f 7449 6d70 6c65 6d65 6e74 6564 2c20 NotImplemented, │ │ │ │ +00045dc0: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +00045de0: 743b 6f6e 6c79 2061 7661 696c 6162 6c65 t;only available │ │ │ │ +00045df0: 2066 6f72 204d 5049 2070 726f 6772 616d for MPI program │ │ │ │ +00045e00: 7326 7175 6f74 3b3c 2f73 7061 6e3e 293b s"); │ │ │ │ +00045e10: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +00045e60: 3138 3833 3c2f 7370 616e 3e20 207d 3c2f 1883 }.
18 │ │ │ │ +00045ec0: 3834 3c2f 7370 616e 3e20 3c2f 6469 763e 84
│ │ │ │ +00045ed0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ │ +00045f40: 6120 6964 3d22 6c30 3138 3836 2220 6e61 a id="l01886" na │ │ │ │ +00045f50: 6d65 3d22 6c30 3138 3836 223e 3c2f 613e me="l01886"> │ │ │ │ +00045f60: 3c73 7061 6e20 636c 6173 733d 226c 696e 1886 templat │ │ │ │ +00045fa0: 653c 2f73 7061 6e3e 266c 743b 3c73 7061 e<class G │ │ │ │ +00045fd0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class
P,cla │ │ │ │ +00046010: 7373 3c2f 7370 616e 3e20 5431 2c20 3c73 ss T1, class │ │ │ │ +00046040: 2054 322c 203c 7370 616e 2063 6c61 7373 T2, class │ │ │ │ +00046060: 3c2f 7370 616e 3e20 5226 6774 3b3c 2f64 R>.
188 │ │ │ │ +000460c0: 373c 2f73 7061 6e3e 2020 3c73 7061 6e20 7 bool │ │ │ │ +000460f0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 commGraphRepart │ │ │ │ +00046150: 6974 696f 6e3c 2f61 3e28 3c73 7061 6e20 ition( │ │ │ │ +00046170: 636f 6e73 743c 2f73 7061 6e3e 2047 2661 const G&a │ │ │ │ +00046180: 6d70 3b20 6772 6170 682c 2050 2661 6d70 mp; graph, P& │ │ │ │ +00046190: 3b20 6f6f 636f 6d6d 2c20 3c73 7061 6e20 ; oocomm, int n │ │ │ │ +000461c0: 7061 7274 732c 3c2f 6469 763e 0a3c 6469 parts,
.< │ │ │ │ +000461e0: 6120 6964 3d22 6c30 3138 3838 2220 6e61 a id="l01888" na │ │ │ │ +000461f0: 6d65 3d22 6c30 3138 3838 223e 3c2f 613e me="l01888"> │ │ │ │ +00046200: 3c73 7061 6e20 636c 6173 733d 226c 696e 1888 │ │ │ │ +00046230: 2020 2020 2020 2020 2020 2020 2073 7464 std │ │ │ │ +00046240: 3a3a 7368 6172 6564 5f70 7472 266c 743b ::shared_ptr< │ │ │ │ +00046250: 5026 6774 3b26 616d 703b 206f 7574 636f P>& outco │ │ │ │ +00046260: 6d6d 2c3c 2f64 6976 3e0a 3c64 6976 2063 mm,
.
1889 │ │ │ │ +000462c0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +000462d0: 2020 2020 2020 2020 2020 5226 616d 703b R& │ │ │ │ +000462e0: 2072 6564 6973 7449 6e66 2c3c 2f64 6976 redistInf,
.
1890< │ │ │ │ +00046340: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> │ │ │ │ +00046350: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ │ +00046360: 2020 3c73 7061 6e20 636c 6173 733d 226b bool │ │ │ │ +00046380: 3c2f 7370 616e 3e20 763d 3c73 7061 6e20 v= │ │ │ │ +000463a0: 6661 6c73 653c 2f73 7061 6e3e 293c 2f64 false).
189 │ │ │ │ +00046400: 313c 2f73 7061 6e3e 2020 7b3c 2f64 6976 1 {
.
1892< │ │ │ │ +00046460: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> if(np │ │ │ │ +00046490: 6172 7473 213d 6f6f 636f 6d6d 2e73 697a arts!=oocomm.siz │ │ │ │ +000464a0: 6528 2929 3c2f 6469 763e 0a3c 6469 7620 e())
.
1893 │ │ │ │ +00046500: 2020 2020 2044 554e 455f 5448 524f 5728 DUNE_THROW( │ │ │ │ +00046510: 4e6f 7449 6d70 6c65 6d65 6e74 6564 2c20 NotImplemented, │ │ │ │ +00046520: 3c73 7061 6e20 636c 6173 733d 2273 7472 &quo │ │ │ │ +00046540: 743b 6f6e 6c79 2061 7661 696c 6162 6c65 t;only available │ │ │ │ +00046550: 2066 6f72 204d 5049 2070 726f 6772 616d for MPI program │ │ │ │ +00046560: 7326 7175 6f74 3b3c 2f73 7061 6e3e 293b s"); │ │ │ │ +00046570: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ +000465c0: 3138 3934 3c2f 7370 616e 3e20 207d 3c2f 1894 }.
18 │ │ │ │ +00046620: 3935 3c2f 7370 616e 3e3c 7370 616e 2063 95#endif // HAVE_ │ │ │ │ +00046670: 4d50 493c 2f73 7061 6e3e 3c2f 6469 763e MPI
│ │ │ │ +00046680: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ +000466b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1896} // │ │ │ │ +000466f0: 656e 6420 6f66 206e 616d 6573 7061 6365 end of namespace │ │ │ │ +00046700: 2044 756e 653c 2f73 7061 6e3e 3c2f 6469 Dune.
1897 │ │ │ │ +00046760: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #endif< │ │ │ │ +00046790: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ +00046800: 3c64 6976 2063 6c61 7373 3d22 7474 646f
Classes provi │ │ │ │ +00046820: 6469 6e67 2063 6f6d 6d75 6e69 6361 7469 ding communicati │ │ │ │ +00046830: 6f6e 2069 6e74 6572 6661 6365 7320 666f on interfaces fo │ │ │ │ +00046840: 7220 6f76 6572 6c61 7070 696e 6720 5363 r overlapping Sc │ │ │ │ +00046850: 6877 6172 7a20 6d65 7468 6f64 732e 3c2f hwarz methods.
.
Pro │ │ │ │ +000468e0: 7669 6465 7320 636c 6173 7365 7320 666f vides classes fo │ │ │ │ +000468f0: 7220 6275 696c 6469 6e67 2074 6865 206d r building the m │ │ │ │ +00046900: 6174 7269 7820 6772 6170 682e 3c2f 6469 atrix graph.
.
int g │ │ │ │ +000469e0: 6c6f 6261 6c4f 776e 6572 5665 7274 6963 lobalOwnerVertic │ │ │ │ +000469f0: 6573 3c2f 6469 763e 3c64 6976 2063 6c61 es
De │ │ │ │ +00046a10: 6669 6e69 7469 6f6e 3c2f 623e 2072 6570 finition rep │ │ │ │ +00046a20: 6172 7469 7469 6f6e 2e68 683a 3137 353c artition.hh:175< │ │ │ │ +00046a30: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
│ │ │ │ +00046af0: 4d61 7472 6978 2026 616d 703b 206d 6174 Matrix & mat │ │ │ │ +00046b00: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ +00046b20: 6e69 7469 6f6e 3c2f 623e 206d 6174 7269 nition matri │ │ │ │ +00046b30: 786d 6174 7269 782e 6868 3a33 3437 3c2f xmatrix.hh:347
.
Dune │ │ │ │ +00046ba0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ │ +00046bc0: 6e69 7469 6f6e 3c2f 623e 2061 6c6c 6f63 nition alloc │ │ │ │ +00046bd0: 6174 6f72 2e68 683a 3131 3c2f 6469 763e ator.hh:11
│ │ │ │ +00046be0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
bo │ │ │ │ +00046cb0: 6f6c 2062 7569 6c64 436f 6d6d 756e 6963 ol buildCommunic │ │ │ │ +00046cc0: 6174 696f 6e28 636f 6e73 7420 4720 2661 ation(const G &a │ │ │ │ +00046cd0: 6d70 3b67 7261 7068 2c20 7374 643a 3a76 mp;graph, std::v │ │ │ │ +00046ce0: 6563 746f 7226 6c74 3b20 696e 7420 2667 ector< int &g │ │ │ │ +00046cf0: 743b 2026 616d 703b 7265 616c 7061 7274 t; &realpart │ │ │ │ +00046d00: 732c 2044 756e 653a 3a4f 776e 6572 4f76 s, Dune::OwnerOv │ │ │ │ +00046d10: 6572 6c61 7043 6f70 7943 6f6d 6d75 6e69 erlapCopyCommuni │ │ │ │ +00046d20: 6361 7469 6f6e 266c 743b 2054 312c 2054 cation< T1, T │ │ │ │ +00046d30: 3220 2667 743b 2026 616d 703b 6f6f 636f 2 > &ooco │ │ │ │ +00046d40: 6d6d 2c20 7374 643a 3a73 6861 7265 645f mm, std::shared_ │ │ │ │ +00046d50: 7074 7226 6c74 3b20 4475 6e65 3a3a 4f77 ptr< Dune::Ow │ │ │ │ +00046d60: 6e65 724f 7665 726c 6170 436f 7079 436f nerOverlapCopyCo │ │ │ │ +00046d70: 6d6d 756e 6963 6174 696f 6e26 6c74 3b20 mmunication< │ │ │ │ +00046d80: 5431 2c20 5432 2026 6774 3b20 2667 743b T1, T2 > > │ │ │ │ +00046d90: 2026 616d 703b 6f75 7463 6f6d 6d2c 2052 &outcomm, R │ │ │ │ +00046da0: 6564 6973 7472 6962 7574 6549 6e74 6572 edistributeInter │ │ │ │ +00046db0: 6661 6365 2026 616d 703b 7265 6469 7374 face &redist │ │ │ │ +00046dc0: 496e 662c 2062 6f6f 6c20 7665 7262 6f73 Inf, bool verbos │ │ │ │ +00046dd0: 653d 6661 6c73 6529 3c2f 6469 763e 3c64 e=false)
Definition repartition.h │ │ │ │ +00046e10: 683a 3134 3536 3c2f 6469 763e 3c2f 6469 h:1456
.
Dune::fillIn │ │ │ │ +00046ec0: 6465 7853 6574 486f 6c65 733c 2f61 3e3c dexSetHoles< │ │ │ │ +00046ed0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
void fi │ │ │ │ +00046ef0: 6c6c 496e 6465 7853 6574 486f 6c65 7328 llIndexSetHoles( │ │ │ │ +00046f00: 636f 6e73 7420 4720 2661 6d70 3b67 7261 const G &gra │ │ │ │ +00046f10: 7068 2c20 4475 6e65 3a3a 4f77 6e65 724f ph, Dune::OwnerO │ │ │ │ +00046f20: 7665 726c 6170 436f 7079 436f 6d6d 756e verlapCopyCommun │ │ │ │ +00046f30: 6963 6174 696f 6e26 6c74 3b20 5431 2c20 ication< T1, │ │ │ │ +00046f40: 5432 2026 6774 3b20 2661 6d70 3b6f 6f63 T2 > &ooc │ │ │ │ +00046f50: 6f6d 6d29 3c2f 6469 763e 3c64 6976 2063 omm)
Fil │ │ │ │ +00046f70: 6c73 2074 6865 2068 6f6c 6573 2069 6e20 ls the holes in │ │ │ │ +00046f80: 616e 2069 6e64 6578 2073 6574 2e3c 2f64 an index set.
Definit │ │ │ │ +00046fb0: 696f 6e3c 2f62 3e20 7265 7061 7274 6974 ion repartit │ │ │ │ +00046fc0: 696f 6e2e 6868 3a38 333c 2f64 6976 3e3c ion.hh:83
< │ │ │ │ +00046fd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
< │ │ │ │ +00047030: 6120 6872 6566 3d22 6130 3032 3439 2e68 a href="a00249.h │ │ │ │ +00047040: 746d 6c23 6136 3936 6461 3165 6131 3037 tml#a696da1ea107 │ │ │ │ +00047050: 3434 3233 3864 6534 3638 3537 3863 3633 44238de468578c63 │ │ │ │ +00047060: 6635 3864 3722 3e44 756e 653a 3a63 6f6d f58d7">Dune::com │ │ │ │ +00047070: 6d47 7261 7068 5265 7061 7274 6974 696f mGraphRepartitio │ │ │ │ +00047080: 6e3c 2f61 3e3c 2f64 6976 3e3c 6469 7620 n
b │ │ │ │ +000470a0: 6f6f 6c20 636f 6d6d 4772 6170 6852 6570 ool commGraphRep │ │ │ │ +000470b0: 6172 7469 7469 6f6e 2863 6f6e 7374 204d artition(const M │ │ │ │ +000470c0: 2026 616d 703b 6d61 742c 2044 756e 653a &mat, Dune: │ │ │ │ +000470d0: 3a4f 776e 6572 4f76 6572 6c61 7043 6f70 :OwnerOverlapCop │ │ │ │ +000470e0: 7943 6f6d 6d75 6e69 6361 7469 6f6e 266c yCommunication&l │ │ │ │ +000470f0: 743b 2054 312c 2054 3220 2667 743b 2026 t; T1, T2 > & │ │ │ │ +00047100: 616d 703b 6f6f 636f 6d6d 2c20 4d65 7469 amp;oocomm, Meti │ │ │ │ +00047110: 733a 3a69 6478 5f74 206e 7061 7274 732c s::idx_t nparts, │ │ │ │ +00047120: 2073 7464 3a3a 7368 6172 6564 5f70 7472 std::shared_ptr │ │ │ │ +00047130: 266c 743b 2044 756e 653a 3a4f 776e 6572 < Dune::Owner │ │ │ │ +00047140: 4f76 6572 6c61 7043 6f70 7943 6f6d 6d75 OverlapCopyCommu │ │ │ │ +00047150: 6e69 6361 7469 6f6e 266c 743b 2054 312c nication< T1, │ │ │ │ +00047160: 2054 3220 2667 743b 2026 6774 3b20 2661 T2 > > &a │ │ │ │ +00047170: 6d70 3b6f 7574 636f 6d6d 2c20 5265 6469 mp;outcomm, Redi │ │ │ │ +00047180: 7374 7269 6275 7465 496e 7465 7266 6163 stributeInterfac │ │ │ │ +00047190: 6520 2661 6d70 3b72 6564 6973 7449 6e66 e &redistInf │ │ │ │ +000471a0: 2c20 626f 6f6c 2076 6572 626f 7365 3d66 , bool verbose=f │ │ │ │ +000471b0: 616c 7365 293c 2f64 6976 3e3c 6469 7620 alse)
Definition │ │ │ │ +000471e0: 7265 7061 7274 6974 696f 6e2e 6868 3a38 repartition.hh:8 │ │ │ │ +000471f0: 3239 3c2f 6469 763e 3c2f 6469 763e 0a3c 29
.< │ │ │ │ +00047200: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ +00047210: 6964 3d22 6161 3030 3234 395f 6874 6d6c id="aa00249_html │ │ │ │ +00047220: 5f61 3866 6430 3765 6133 6632 3263 6234 _a8fd07ea3f22cb4 │ │ │ │ +00047230: 3732 3735 3835 3964 3339 6437 6264 6666 7275859d39d7bdff │ │ │ │ +00047240: 6566 223e 3c64 6976 2063 6c61 7373 3d22 ef">
│ │ │ │ +000472c0: 766f 6964 2070 7269 6e74 5f63 6172 7261 void print_carra │ │ │ │ +000472d0: 7928 5320 2661 6d70 3b6f 732c 2054 202a y(S &os, T * │ │ │ │ +000472e0: 6172 7261 792c 2073 7464 3a3a 7369 7a65 array, std::size │ │ │ │ +000472f0: 5f74 206c 293c 2f64 6976 3e3c 6469 7620 _t l)
Definition │ │ │ │ +00047320: 7265 7061 7274 6974 696f 6e2e 6868 3a37 repartition.hh:7 │ │ │ │ +00047330: 3738 3c2f 6469 763e 3c2f 6469 763e 0a3c 78
.< │ │ │ │ +00047340: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ +00047350: 6964 3d22 6161 3030 3234 395f 6874 6d6c id="aa00249_html │ │ │ │ +00047360: 5f61 6137 3534 6665 3536 6530 3738 6562 _aa754fe56e078eb │ │ │ │ +00047370: 3162 3530 6462 3461 6365 3165 3766 6331 1b50db4ace1e7fc1 │ │ │ │ +00047380: 6231 223e 3c64 6976 2063 6c61 7373 3d22 b1">
│ │ │ │ +00047400: 626f 6f6c 2069 7356 616c 6964 4772 6170 bool isValidGrap │ │ │ │ +00047410: 6828 7374 643a 3a73 697a 655f 7420 6e6f h(std::size_t no │ │ │ │ +00047420: 5674 782c 2073 7464 3a3a 7369 7a65 5f74 Vtx, std::size_t │ │ │ │ +00047430: 2067 6e6f 5674 782c 2053 206e 6f45 6467 gnoVtx, S noEdg │ │ │ │ +00047440: 6573 2c20 5420 2a78 6164 6a2c 2054 202a es, T *xadj, T * │ │ │ │ +00047450: 6164 6a6e 6379 2c20 626f 6f6c 2063 6865 adjncy, bool che │ │ │ │ +00047460: 636b 5379 6d6d 6574 7279 293c 2f64 6976 ckSymmetry)
Definitio │ │ │ │ +00047490: 6e3c 2f62 3e20 7265 7061 7274 6974 696f n repartitio │ │ │ │ +000474a0: 6e2e 6868 3a37 3835 3c2f 6469 763e 3c2f n.hh:785
.
Dune::grap │ │ │ │ +00047550: 6852 6570 6172 7469 7469 6f6e 3c2f 613e hRepartition │ │ │ │ +00047560: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
bool g │ │ │ │ +00047580: 7261 7068 5265 7061 7274 6974 696f 6e28 raphRepartition( │ │ │ │ +00047590: 636f 6e73 7420 4720 2661 6d70 3b67 7261 const G &gra │ │ │ │ +000475a0: 7068 2c20 4475 6e65 3a3a 4f77 6e65 724f ph, Dune::OwnerO │ │ │ │ +000475b0: 7665 726c 6170 436f 7079 436f 6d6d 756e verlapCopyCommun │ │ │ │ +000475c0: 6963 6174 696f 6e26 6c74 3b20 5431 2c20 ication< T1, │ │ │ │ +000475d0: 5432 2026 6774 3b20 2661 6d70 3b6f 6f63 T2 > &ooc │ │ │ │ +000475e0: 6f6d 6d2c 204d 6574 6973 3a3a 6964 785f omm, Metis::idx_ │ │ │ │ +000475f0: 7420 6e70 6172 7473 2c20 7374 643a 3a73 t nparts, std::s │ │ │ │ +00047600: 6861 7265 645f 7074 7226 6c74 3b20 4475 hared_ptr< Du │ │ │ │ +00047610: 6e65 3a3a 4f77 6e65 724f 7665 726c 6170 ne::OwnerOverlap │ │ │ │ +00047620: 436f 7079 436f 6d6d 756e 6963 6174 696f CopyCommunicatio │ │ │ │ +00047630: 6e26 6c74 3b20 5431 2c20 5432 2026 6774 n< T1, T2 > │ │ │ │ +00047640: 3b20 2667 743b 2026 616d 703b 6f75 7463 ; > &outc │ │ │ │ +00047650: 6f6d 6d2c 2052 6564 6973 7472 6962 7574 omm, Redistribut │ │ │ │ +00047660: 6549 6e74 6572 6661 6365 2026 616d 703b eInterface & │ │ │ │ +00047670: 7265 6469 7374 496e 662c 2062 6f6f 6c20 redistInf, bool │ │ │ │ +00047680: 7665 7262 6f73 653d 6661 6c73 6529 3c2f verbose=false)
execute a │ │ │ │ +000476b0: 2067 7261 7068 2072 6570 6172 7469 7469 graph repartiti │ │ │ │ +000476c0: 6f6e 2066 6f72 2061 2067 6976 696e 6720 on for a giving │ │ │ │ +000476d0: 6772 6170 6820 616e 6420 696e 6465 7873 graph and indexs │ │ │ │ +000476e0: 6574 2e3c 2f64 6976 3e3c 6469 7620 636c et.
D │ │ │ │ +00047700: 6566 696e 6974 696f 6e3c 2f62 3e20 7265 efinition re │ │ │ │ +00047710: 7061 7274 6974 696f 6e2e 6868 3a31 3233 partition.hh:123 │ │ │ │ +00047720: 353c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 5
.
│ │ │ │ +000477f0: 666c 6f61 7420 7265 616c 5f74 3c2f 6469 float real_t
Definiti │ │ │ │ +00047820: 6f6e 3c2f 623e 2072 6570 6172 7469 7469 on repartiti │ │ │ │ +00047830: 6f6e 2e68 683a 3533 3c2f 6469 763e 3c2f on.hh:53
.
Dune::Meti │ │ │ │ +000478e0: 733a 3a69 6478 5f74 3c2f 613e 3c2f 6469 s::idx_t
std::size_ │ │ │ │ +00047910: 7420 6964 785f 743c 2f64 6976 3e3c 6469 t idx_t
│ │ │ │ +00047930: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition repartition.hh │ │ │ │ +00047950: 3a36 333c 2f64 6976 3e3c 2f64 6976 3e0a :63
. │ │ │ │ +00047960: 3c64 6976 2063 6c61 7373 3d22 7474 6322
@ owne │ │ │ │ +00047a80: 723c 2f64 6976 3e3c 6469 7620 636c 6173 r
Def │ │ │ │ +00047aa0: 696e 6974 696f 6e3c 2f62 3e20 6f77 6e65 inition owne │ │ │ │ +00047ab0: 726f 7665 726c 6170 636f 7079 2e68 683a roverlapcopy.hh: │ │ │ │ +00047ac0: 3631 3c2f 6469 763e 3c2f 6469 763e 0a3c 61
.< │ │ │ │ +00047ad0: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ │ +00047ae0: 6964 3d22 6161 3031 3938 345f 6874 6d6c id="aa01984_html │ │ │ │ +00047af0: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">.
< │ │ │ │ +00047ce0: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ +00047cf0: 6922 3e63 6f6e 7374 2047 6c6f 6261 6c4c i">const GlobalL │ │ │ │ +00047d00: 6f6f 6b75 7049 6e64 6578 5365 7420 2661 ookupIndexSet &a │ │ │ │ +00047d10: 6d70 3b20 676c 6f62 616c 4c6f 6f6b 7570 mp; globalLookup │ │ │ │ +00047d20: 2829 2063 6f6e 7374 3c2f 6469 763e 3c64 () const
Definition owneroverlapc │ │ │ │ +00047d60: 6f70 792e 6868 3a35 3236 3c2f 6469 763e opy.hh:526
│ │ │ │ +00047d70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
< │ │ │ │ +00047e40: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ +00047e50: 6922 3e63 6f6e 7374 2050 6172 616c 6c65 i">const Paralle │ │ │ │ +00047e60: 6c49 6e64 6578 5365 7420 2661 6d70 3b20 lIndexSet & │ │ │ │ +00047e70: 696e 6465 7853 6574 2829 2063 6f6e 7374 indexSet() const │ │ │ │ +00047e80: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Get the │ │ │ │ +00047ea0: 2075 6e64 6572 6c79 696e 6720 7061 7261 underlying para │ │ │ │ +00047eb0: 6c6c 656c 2069 6e64 6578 2073 6574 2e3c llel index set.< │ │ │ │ +00047ec0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ +00047ee0: 6974 696f 6e3c 2f62 3e20 6f77 6e65 726f ition ownero │ │ │ │ +00047ef0: 7665 726c 6170 636f 7079 2e68 683a 3436 verlapcopy.hh:46 │ │ │ │ +00047f00: 323c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 2
.
v │ │ │ │ +00047ff0: 6f69 6420 636f 7079 436f 7079 546f 416c oid copyCopyToAl │ │ │ │ +00048000: 6c28 636f 6e73 7420 5420 2661 6d70 3b73 l(const T &s │ │ │ │ +00048010: 6f75 7263 652c 2054 2026 616d 703b 6465 ource, T &de │ │ │ │ +00048020: 7374 2920 636f 6e73 743c 2f64 6976 3e3c st) const
< │ │ │ │ +00048030: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ +00048040: 223e 436f 6d6d 756e 6963 6174 6520 7661 ">Communicate va │ │ │ │ +00048050: 6c75 6573 2066 726f 6d20 636f 7079 2064 lues from copy d │ │ │ │ +00048060: 6174 6120 706f 696e 7473 2074 6f20 616c ata points to al │ │ │ │ +00048070: 6c20 6f74 6865 7220 6461 7461 2070 6f69 l other data poi │ │ │ │ +00048080: 6e74 732e 3c2f 6469 763e 3c64 6976 2063 nts.
│ │ │ │ +000480a0: 4465 6669 6e69 7469 6f6e 3c2f 623e 206f Definition o │ │ │ │ +000480b0: 776e 6572 6f76 6572 6c61 7063 6f70 792e wneroverlapcopy. │ │ │ │ +000480c0: 6868 3a33 3238 3c2f 6469 763e 3c2f 6469 hh:328
.
Dune: │ │ │ │ +000481c0: 3a47 6c6f 6261 6c4c 6f6f 6b75 7049 6e64 :GlobalLookupInd │ │ │ │ +000481d0: 6578 5365 7426 6c74 3b20 5061 7261 6c6c exSet< Parall │ │ │ │ +000481e0: 656c 496e 6465 7853 6574 2026 6774 3b20 elIndexSet > │ │ │ │ +000481f0: 476c 6f62 616c 4c6f 6f6b 7570 496e 6465 GlobalLookupInde │ │ │ │ +00048200: 7853 6574 3c2f 6469 763e 3c64 6976 2063 xSet
The │ │ │ │ +00048220: 2074 7970 6520 6f66 2074 6865 2072 6576 type of the rev │ │ │ │ +00048230: 6572 7365 206c 6f6f 6b75 7020 6f66 2069 erse lookup of i │ │ │ │ +00048240: 6e64 6963 6573 2e3c 2f64 6976 3e3c 6469 ndices.
│ │ │ │ +00048260: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition owneroverlapco │ │ │ │ +00048280: 7079 2e68 683a 3435 363c 2f64 6976 3e3c py.hh:456
< │ │ │ │ +00048290: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
< │ │ │ │ +000482f0: 6120 6872 6566 3d22 6130 3139 3834 2e68 a href="a01984.h │ │ │ │ +00048300: 746d 6c23 6139 3139 3135 3032 3763 6232 tml#a91915027cb2 │ │ │ │ +00048310: 3461 3731 3264 6164 3732 6132 3532 3961 4a712dad72a2529a │ │ │ │ +00048320: 6661 6437 6322 3e44 756e 653a 3a4f 776e fad7c">Dune::Own │ │ │ │ +00048330: 6572 4f76 6572 6c61 7043 6f70 7943 6f6d erOverlapCopyCom │ │ │ │ +00048340: 6d75 6e69 6361 7469 6f6e 3a3a 6275 696c munication::buil │ │ │ │ +00048350: 6447 6c6f 6261 6c4c 6f6f 6b75 703c 2f61 dGlobalLookup
void │ │ │ │ +00048380: 6275 696c 6447 6c6f 6261 6c4c 6f6f 6b75 buildGlobalLooku │ │ │ │ +00048390: 7028 293c 2f64 6976 3e3c 6469 7620 636c p()
D │ │ │ │ +000483b0: 6566 696e 6974 696f 6e3c 2f62 3e20 6f77 efinition ow │ │ │ │ +000483c0: 6e65 726f 7665 726c 6170 636f 7079 2e68 neroverlapcopy.h │ │ │ │ +000483d0: 683a 3439 353c 2f64 6976 3e3c 2f64 6976 h:495
.
const Communic │ │ │ │ +000484d0: 6174 696f 6e26 6c74 3b20 4d50 495f 436f ation< MPI_Co │ │ │ │ +000484e0: 6d6d 2026 6774 3b20 2661 6d70 3b20 636f mm > & co │ │ │ │ +000484f0: 6d6d 756e 6963 6174 6f72 2829 2063 6f6e mmunicator() con │ │ │ │ +00048500: 7374 3c2f 6469 763e 3c64 6976 2063 6c61 st
De │ │ │ │ +00048520: 6669 6e69 7469 6f6e 3c2f 623e 206f 776e finition own │ │ │ │ +00048530: 6572 6f76 6572 6c61 7063 6f70 792e 6868 eroverlapcopy.hh │ │ │ │ +00048540: 3a32 3939 3c2f 6469 763e 3c2f 6469 763e :299
│ │ │ │ +00048550: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
< │ │ │ │ +00048620: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ │ +00048630: 6922 3e76 6f69 6420 636f 7079 4f77 6e65 i">void copyOwne │ │ │ │ +00048640: 7254 6f41 6c6c 2863 6f6e 7374 2054 2026 rToAll(const T & │ │ │ │ +00048650: 616d 703b 736f 7572 6365 2c20 5420 2661 amp;source, T &a │ │ │ │ +00048660: 6d70 3b64 6573 7429 2063 6f6e 7374 3c2f mp;dest) const
Communica │ │ │ │ +00048690: 7465 2076 616c 7565 7320 6672 6f6d 206f te values from o │ │ │ │ +000486a0: 776e 6572 2064 6174 6120 706f 696e 7473 wner data points │ │ │ │ +000486b0: 2074 6f20 616c 6c20 6f74 6865 7220 6461 to all other da │ │ │ │ +000486c0: 7461 2070 6f69 6e74 732e 3c2f 6469 763e ta points.
│ │ │ │ +000486d0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
Definition │ │ │ │ +000486f0: 3c2f 623e 206f 776e 6572 6f76 6572 6c61 owneroverla │ │ │ │ +00048700: 7063 6f70 792e 6868 3a33 3131 3c2f 6469 pcopy.hh:311
.
const │ │ │ │ +00048800: 5265 6d6f 7465 496e 6469 6365 7320 2661 RemoteIndices &a │ │ │ │ +00048810: 6d70 3b20 7265 6d6f 7465 496e 6469 6365 mp; remoteIndice │ │ │ │ +00048820: 7328 2920 636f 6e73 743c 2f64 6976 3e3c s() const
< │ │ │ │ +00048830: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ +00048840: 223e 4765 7420 7468 6520 756e 6465 726c ">Get the underl │ │ │ │ +00048850: 7969 6e67 2072 656d 6f74 6520 696e 6469 ying remote indi │ │ │ │ +00048860: 6365 732e 3c2f 6469 763e 3c64 6976 2063 ces.
│ │ │ │ +00048880: 4465 6669 6e69 7469 6f6e 3c2f 623e 206f Definition o │ │ │ │ +00048890: 776e 6572 6f76 6572 6c61 7063 6f70 792e wneroverlapcopy. │ │ │ │ +000488a0: 6868 3a34 3731 3c2f 6469 763e 3c2f 6469 hh:471
.
Dune::OwnerO │ │ │ │ +00048950: 7665 726c 6170 436f 7079 436f 6d6d 756e verlapCopyCommun │ │ │ │ +00048960: 6963 6174 696f 6e3a 3a66 7265 6547 6c6f ication::freeGlo │ │ │ │ +00048970: 6261 6c4c 6f6f 6b75 703c 2f61 3e3c 2f64 balLookup
void free │ │ │ │ +000489a0: 476c 6f62 616c 4c6f 6f6b 7570 2829 3c2f GlobalLookup()
Defini │ │ │ │ +000489d0: 7469 6f6e 3c2f 623e 206f 776e 6572 6f76 tion ownerov │ │ │ │ +000489e0: 6572 6c61 7063 6f70 792e 6868 3a35 3230 erlapcopy.hh:520 │ │ │ │ +000489f0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.Dune::ParallelI │ │ │ │ +00048af0: 6e64 6578 5365 7426 6c74 3b20 476c 6f62 ndexSet< Glob │ │ │ │ +00048b00: 616c 4964 5479 7065 2c20 4c49 2c20 3531 alIdType, LI, 51 │ │ │ │ +00048b10: 3220 2667 743b 2050 6172 616c 6c65 6c49 2 > ParallelI │ │ │ │ +00048b20: 6e64 6578 5365 743c 2f64 6976 3e3c 6469 ndexSet
│ │ │ │ +00048b40: 5468 6520 7479 7065 206f 6620 7468 6520 The type of the │ │ │ │ +00048b50: 7061 7261 6c6c 656c 2069 6e64 6578 2073 parallel index s │ │ │ │ +00048b60: 6574 2e3c 2f64 6976 3e3c 6469 7620 636c et.
D │ │ │ │ +00048b80: 6566 696e 6974 696f 6e3c 2f62 3e20 6f77 efinition ow │ │ │ │ +00048b90: 6e65 726f 7665 726c 6170 636f 7079 2e68 neroverlapcopy.h │ │ │ │ +00048ba0: 683a 3434 393c 2f64 6976 3e3c 2f64 6976 h:449
.
< │ │ │ │ +00048c20: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ +00048c30: 223e 5468 6520 2875 6e64 6972 6563 7465 ">The (undirecte │ │ │ │ +00048c40: 6429 2067 7261 7068 206f 6620 6120 6d61 d) graph of a ma │ │ │ │ +00048c50: 7472 6978 2e3c 2f64 6976 3e3c 6469 7620 trix.
Definition │ │ │ │ +00048c80: 6772 6170 682e 6868 3a35 313c 2f64 6976 graph.hh:51
.
< │ │ │ │ +00048cd0: 6120 6872 6566 3d22 6130 3236 3430 2e68 a href="a02640.h │ │ │ │ +00048ce0: 746d 6c22 3e44 756e 653a 3a52 6564 6973 tml">Dune::Redis │ │ │ │ +00048cf0: 7472 6962 7574 6549 6e74 6572 6661 6365 tributeInterface │ │ │ │ +00048d00: 3c2f 613e 3c2f 6469 763e 3c64 6976 2063
│ │ │ │ +00048d20: 4465 6669 6e69 7469 6f6e 3c2f 623e 2072 Definition r │ │ │ │ +00048d30: 6570 6172 7469 7469 6f6e 2e68 683a 3236 epartition.hh:26 │ │ │ │ +00048d40: 303c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 0
.
D │ │ │ │ +00048de0: 756e 653a 3a52 6564 6973 7472 6962 7574 une::Redistribut │ │ │ │ +00048df0: 6549 6e74 6572 6661 6365 3a3a 7265 7365 eInterface::rese │ │ │ │ +00048e00: 7276 6553 7061 6365 466f 7252 6563 6569 rveSpaceForRecei │ │ │ │ +00048e10: 7665 496e 7465 7266 6163 653c 2f61 3e3c veInterface< │ │ │ │ +00048e20: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
void re │ │ │ │ +00048e40: 7365 7276 6553 7061 6365 466f 7252 6563 serveSpaceForRec │ │ │ │ +00048e50: 6569 7665 496e 7465 7266 6163 6528 696e eiveInterface(in │ │ │ │ +00048e60: 7420 7072 6f63 2c20 696e 7420 7369 7a65 t proc, int size │ │ │ │ +00048e70: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
Def │ │ │ │ +00048e90: 696e 6974 696f 6e3c 2f62 3e20 7265 7061 inition repa │ │ │ │ +00048ea0: 7274 6974 696f 6e2e 6868 3a32 3834 3c2f rtition.hh:284
..
│ │ │ │ +00049120: 7e52 6564 6973 7472 6962 7574 6549 6e74 ~RedistributeInt │ │ │ │ +00049130: 6572 6661 6365 2829 3c2f 6469 763e 3c64 erface()
Definition repartition.h │ │ │ │ +00049170: 683a 3330 313c 2f64 6976 3e3c 2f64 6976 h:301
.
.
< │ │ │ │ +00049310: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ │ +00049320: 6522 3e3c 6120 6872 6566 3d22 6130 3236 e">Dune: │ │ │ │ +00049360: 3a52 6564 6973 7472 6962 7574 6549 6e74 :RedistributeInt │ │ │ │ +00049370: 6572 6661 6365 3a3a 6275 696c 6453 656e erface::buildSen │ │ │ │ +00049380: 6449 6e74 6572 6661 6365 3c2f 613e 3c2f dInterface
void bui │ │ │ │ +000493b0: 6c64 5365 6e64 496e 7465 7266 6163 6528 ldSendInterface( │ │ │ │ +000493c0: 636f 6e73 7420 7374 643a 3a76 6563 746f const std::vecto │ │ │ │ +000493d0: 7226 6c74 3b20 696e 7420 2667 743b 2026 r< int > & │ │ │ │ +000493e0: 616d 703b 746f 5061 7274 2c20 636f 6e73 amp;toPart, cons │ │ │ │ +000493f0: 7420 4953 2026 616d 703b 6964 7873 6574 t IS &idxset │ │ │ │ +00049400: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
Def │ │ │ │ +00049420: 696e 6974 696f 6e3c 2f62 3e20 7265 7061 inition repa │ │ │ │ +00049430: 7274 6974 696f 6e2e 6868 3a32 3636 3c2f rtition.hh:266
.
│ │ │ │ +00049490: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
Dune │ │ │ │ +000494e0: 3a3a 5265 6469 7374 7269 6275 7465 496e ::RedistributeIn │ │ │ │ +000494f0: 7465 7266 6163 653a 3a61 6464 5265 6365 terface::addRece │ │ │ │ +00049500: 6976 6549 6e64 6578 3c2f 613e 3c2f 6469 iveIndex
void addRe │ │ │ │ +00049530: 6365 6976 6549 6e64 6578 2869 6e74 2070 ceiveIndex(int p │ │ │ │ +00049540: 726f 632c 2073 7464 3a3a 7369 7a65 5f74 roc, std::size_t │ │ │ │ +00049550: 2069 6478 293c 2f64 6976 3e3c 6469 7620 idx)
Definition │ │ │ │ +00049580: 7265 7061 7274 6974 696f 6e2e 6868 3a32 repartition.hh:2 │ │ │ │ +00049590: 3838 3c2f 6469 763e 3c2f 6469 763e 0a3c 88
.< │ │ │ │ +000495a0: 2f64 6976 3e3c 212d 2d20 6672 6167 6d65 /div>
..
.Gen │ │ │ │ +00049620: 6572 6174 6564 2062 7926 2331 3630 3b3c erated by < │ │ │ │ +00049630: 6120 6872 6566 3d22 6874 7470 733a 2f2f a href="https:// │ │ │ │ +00049640: 7777 772e 646f 7879 6765 6e2e 6f72 672f www.doxygen.org/ │ │ │ │ +00049650: 696e 6465 782e 6874 6d6c 223e 3c69 6d67 index.html">d
│ │ │ │ +000496a0: 6f78 7967 656e 222f 3e3c 2f61 3e20 312e  oxygen 1. │ │ │ │ +000496b0: 392e 380a 3c2f 736d 616c 6c3e 3c2f 6164 9.8...< │ │ │ │ +000496d0: 2f68 746d 6c3e 0a /html>. │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,502 +1,1986 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -spqr.hh │ │ │ │ │ +repartition.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SPQR_HH │ │ │ │ │ -6#define DUNE_ISTL_SPQR_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_REPARTITION_HH │ │ │ │ │ +6#define DUNE_ISTL_REPARTITION_HH │ │ │ │ │ 7 │ │ │ │ │ -8#if HAVE_SUITESPARSE_SPQR || defined DOXYGEN │ │ │ │ │ -9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -34 // forward declarations │ │ │ │ │ -35 template │ │ │ │ │ -36 class SeqOverlappingSchwarz; │ │ │ │ │ -37 │ │ │ │ │ -38 template │ │ │ │ │ -39 struct SeqOverlappingSchwarzAssemblerHelper; │ │ │ │ │ -40 │ │ │ │ │ -46 template │ │ │ │ │ -_4_7 class _S_P_Q_R │ │ │ │ │ -48 {}; │ │ │ │ │ -49 │ │ │ │ │ -63 template │ │ │ │ │ -_6_4 class _S_P_Q_R<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A > > │ │ │ │ │ -65 : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r, typename std:: │ │ │ │ │ -allocator_traits::template rebind_alloc > >, │ │ │ │ │ -66 BlockVector, typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc > > > │ │ │ │ │ -67 { │ │ │ │ │ -68 public: │ │ │ │ │ -_7_0 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ -_7_1 typedef _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ -_7_3 typedef ISTL::Impl::BCCSMatrix _S_P_Q_R_M_a_t_r_i_x; │ │ │ │ │ -_7_5 typedef ISTL::Impl::BCCSMatrixInitializer,A>, │ │ │ │ │ -int> _M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -_7_7 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_T_,_m_>, typename std:: │ │ │ │ │ -allocator_traits::template rebind_alloc > > _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -_7_9 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_F_i_e_l_d_V_e_c_t_o_r_<_T_,_n_>, typename std:: │ │ │ │ │ -allocator_traits::template rebind_alloc > > _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -80 │ │ │ │ │ -_8_2 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -83 { │ │ │ │ │ -84 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -_9_5 _S_P_Q_R(const _M_a_t_r_i_x& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_ │ │ │ │ │ -(verbose) │ │ │ │ │ -96 { │ │ │ │ │ -97 //check whether T is a supported type │ │ │ │ │ -98 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -99 "Unsupported Type in SPQR (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -100 cc_ = new cholmod_common(); │ │ │ │ │ -101 cholmod_l_start(cc_); │ │ │ │ │ -102 setMatrix(matrix); │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -_1_1_3 _S_P_Q_R(const _M_a_t_r_i_x& matrix, int verbose, bool) : matrixIsLoaded_(false), │ │ │ │ │ -verbose_(verbose) │ │ │ │ │ -114 { │ │ │ │ │ -115 //check whether T is a supported type │ │ │ │ │ -116 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -117 "Unsupported Type in SPQR (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -118 cc_ = new cholmod_common(); │ │ │ │ │ -119 cholmod_l_start(cc_); │ │ │ │ │ -120 setMatrix(matrix); │ │ │ │ │ -121 } │ │ │ │ │ -122 │ │ │ │ │ -_1_3_2 _S_P_Q_R(const _M_a_t_r_i_x& matrix, const ParameterTree& config) │ │ │ │ │ -133 : _S_P_Q_R(matrix, config._g_e_t("verbose", 0)) │ │ │ │ │ -134 {} │ │ │ │ │ -135 │ │ │ │ │ -_1_3_7 _S_P_Q_R() : matrixIsLoaded_(false), verbose_(0) │ │ │ │ │ -138 { │ │ │ │ │ -139 //check whether T is a supported type │ │ │ │ │ -140 static_assert((std::is_same::value) || (std::is_same >::value), │ │ │ │ │ -141 "Unsupported Type in SPQR (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -142 cc_ = new cholmod_common(); │ │ │ │ │ -143 cholmod_l_start(cc_); │ │ │ │ │ -144 } │ │ │ │ │ +13#if HAVE_PARMETIS │ │ │ │ │ +14// Explicitly use C linkage as scotch does not extern "C" in its headers. │ │ │ │ │ +15// Works because ParMETIS/METIS checks whether compiler is C++ and otherwise │ │ │ │ │ +16// does not use extern "C". Therfore no nested extern "C" will be created │ │ │ │ │ +17extern "C" │ │ │ │ │ +18{ │ │ │ │ │ +19#include │ │ │ │ │ +20} │ │ │ │ │ +21#endif │ │ │ │ │ +22 │ │ │ │ │ +23#include │ │ │ │ │ +24#include │ │ │ │ │ +25#include │ │ │ │ │ +26#include │ │ │ │ │ +27#include │ │ │ │ │ +28#include │ │ │ │ │ +29#include │ │ │ │ │ +30#include │ │ │ │ │ +31#include │ │ │ │ │ +32 │ │ │ │ │ +33#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ +34#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_r_a_p_h_._h_h> │ │ │ │ │ +35 │ │ │ │ │ +44namespace _D_u_n_e │ │ │ │ │ +45{ │ │ │ │ │ +_4_6 namespace Metis │ │ │ │ │ +47 { │ │ │ │ │ +48 // Explicitly specify a real_t and idx_t for older (Par)METIS versions that │ │ │ │ │ +do not │ │ │ │ │ +49 // provide these typedefs │ │ │ │ │ +50#if HAVE_PARMETIS && defined(REALTYPEWIDTH) │ │ │ │ │ +51 using _r_e_a_l___t = _:_:_r_e_a_l___t; │ │ │ │ │ +52#else │ │ │ │ │ +_5_3 using _r_e_a_l___t = float; │ │ │ │ │ +54#endif │ │ │ │ │ +55 │ │ │ │ │ +56#if HAVE_PARMETIS && defined(IDXTYPEWIDTH) │ │ │ │ │ +57 using _i_d_x___t = _:_:_i_d_x___t; │ │ │ │ │ +58#elif HAVE_PARMETIS && defined(HAVE_SCOTCH_NUM_TYPE) │ │ │ │ │ +59 using _i_d_x___t = SCOTCH_Num; │ │ │ │ │ +60#elif HAVE_PARMETIS │ │ │ │ │ +61 using _i_d_x___t = int; │ │ │ │ │ +62#else │ │ │ │ │ +_6_3 using _i_d_x___t = std::size_t; │ │ │ │ │ +64#endif │ │ │ │ │ +65 } │ │ │ │ │ +66 │ │ │ │ │ +67 │ │ │ │ │ +68#if HAVE_MPI │ │ │ │ │ +82 template │ │ │ │ │ +_8_3 void _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(const G& graph, _D_u_n_e_:_: │ │ │ │ │ +_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm) │ │ │ │ │ +84 { │ │ │ │ │ +85 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>_:_: │ │ │ │ │ +_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t IndexSet; │ │ │ │ │ +86 typedef typename IndexSet::LocalIndex::Attribute Attribute; │ │ │ │ │ +87 │ │ │ │ │ +88 IndexSet& indexSet = oocomm._i_n_d_e_x_S_e_t(); │ │ │ │ │ +89 const typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>_:_: │ │ │ │ │ +_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& lookup =oocomm._g_l_o_b_a_l_L_o_o_k_u_p(); │ │ │ │ │ +90 │ │ │ │ │ +91 std::size_t sum=0, needed = graph.noVertices()-indexSet.size(); │ │ │ │ │ +92 std::vector neededall(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size(), 0); │ │ │ │ │ +93 │ │ │ │ │ +94 MPI_Allgather(&needed, 1, MPITraits::getType() , &(neededall │ │ │ │ │ +[0]), 1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +95 for(int i=0; iglobal()); │ │ │ │ │ +107 │ │ │ │ │ +108 //Process p creates global indices consecutively │ │ │ │ │ +109 //starting atmaxgi+\sum_{i=1}^p neededall[i] │ │ │ │ │ +110 // All created indices are owned by the process │ │ │ │ │ +111 maxgi=oocomm._c_o_m_m_u_n_i_c_a_t_o_r().max(maxgi); │ │ │ │ │ +112 ++maxgi; //Sart with the next free index. │ │ │ │ │ +113 │ │ │ │ │ +114 for(int i=0; i > > globalIndices; │ │ │ │ │ +119 storeGlobalIndicesOfRemoteIndices(globalIndices, oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s()); │ │ │ │ │ +120 indexSet.beginResize(); │ │ │ │ │ +121 │ │ │ │ │ +122 for(auto vertex = graph.begin(), vend=graph.end(); vertex != vend; │ │ │ │ │ +++vertex) { │ │ │ │ │ +123 const typename IndexSet::IndexPair* pair=lookup.pair(*vertex); │ │ │ │ │ +124 if(pair==0) { │ │ │ │ │ +125 // No index yet, add new one │ │ │ │ │ +126 indexSet.add(maxgi, typename IndexSet::LocalIndex(*vertex, │ │ │ │ │ +_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r, false)); │ │ │ │ │ +127 ++maxgi; │ │ │ │ │ +128 } │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +131 indexSet.endResize(); │ │ │ │ │ +132 │ │ │ │ │ +133 repairLocalIndexPointers(globalIndices, oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s(), indexSet); │ │ │ │ │ +134 │ │ │ │ │ +135 oocomm._f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p(); │ │ │ │ │ +136 oocomm._b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(); │ │ │ │ │ +137#ifdef DEBUG_REPART │ │ │ │ │ +138 std::cout<<"Holes are filled!"< 0) || matrixIsLoaded_) │ │ │ │ │ -150 free(); │ │ │ │ │ -151 cholmod_l_finish(cc_); │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -_1_5_5 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ -res) │ │ │ │ │ +146 class ParmetisDuneIndexMap │ │ │ │ │ +147 { │ │ │ │ │ +148 public: │ │ │ │ │ +149 template │ │ │ │ │ +150 ParmetisDuneIndexMap(const Graph& graph, const OOComm& com); │ │ │ │ │ +151 int toParmetis(int i) const │ │ │ │ │ +152 { │ │ │ │ │ +153 return duneToParmetis[i]; │ │ │ │ │ +154 } │ │ │ │ │ +155 int toLocalParmetis(int i) const │ │ │ │ │ 156 { │ │ │ │ │ -157 const std::size_t numRows(spqrMatrix_.N()); │ │ │ │ │ -158 // fill B │ │ │ │ │ -159 for(std::size_t k = 0; k != numRows/n; ++k) │ │ │ │ │ -160 for (int l = 0; l < n; ++l) │ │ │ │ │ -161 (static_cast(B_->x))[n*k+l] = b[k][l]; │ │ │ │ │ -162 │ │ │ │ │ -163 cholmod_dense* BTemp = B_; │ │ │ │ │ -164 B_ = SuiteSparseQR_qmult(0, spqrfactorization_, B_, cc_); │ │ │ │ │ -165 cholmod_dense* X = SuiteSparseQR_solve(1, spqrfactorization_, B_, cc_); │ │ │ │ │ -166 cholmod_l_free_dense(&BTemp, cc_); │ │ │ │ │ -167 │ │ │ │ │ -168 const std::size_t numCols(spqrMatrix_.M()); │ │ │ │ │ -169 // fill x │ │ │ │ │ -170 for(std::size_t k = 0; k != numCols/m; ++k) │ │ │ │ │ -171 for (int l = 0; l < m; ++l) │ │ │ │ │ -172 x[k][l] = (static_cast(X->x))[m*k+l]; │ │ │ │ │ -173 │ │ │ │ │ -174 cholmod_l_free_dense(&X, cc_); │ │ │ │ │ -175 // this is a direct solver │ │ │ │ │ -176 res._i_t_e_r_a_t_i_o_n_s = 1; │ │ │ │ │ -177 res._c_o_n_v_e_r_g_e_d = true; │ │ │ │ │ -178 if(verbose_ > 0) │ │ │ │ │ -179 { │ │ │ │ │ -180 std::cout<SPQR_flopcount<SPQR_analyze_time<<" s"<SPQR_factorize_time<<" s"<SPQR_solve_time<<" s"<memory_usage<<" bytes"<SPQR_istat[4]<::size_type numOfOwnVtx() const │ │ │ │ │ +168 { │ │ │ │ │ +169 return parmetisToDune.size(); │ │ │ │ │ +170 } │ │ │ │ │ +171 _M_e_t_i_s_:_:_i_d_x___t* vtxDist() │ │ │ │ │ +172 { │ │ │ │ │ +173 return &vtxDist_[0]; │ │ │ │ │ +174 } │ │ │ │ │ +_1_7_5 int _g_l_o_b_a_l_O_w_n_e_r_V_e_r_t_i_c_e_s; │ │ │ │ │ +176 private: │ │ │ │ │ +177 int base_; │ │ │ │ │ +178 std::vector duneToParmetis; │ │ │ │ │ +179 std::vector parmetisToDune; │ │ │ │ │ +180 // range of vertices for processor i: vtxdist[i] to vtxdist[i+1] (parmetis │ │ │ │ │ +global) │ │ │ │ │ +181 std::vector vtxDist_; │ │ │ │ │ +182 }; │ │ │ │ │ +183 │ │ │ │ │ +184 template │ │ │ │ │ +185 ParmetisDuneIndexMap::ParmetisDuneIndexMap(const G& graph, const OOComm& │ │ │ │ │ +oocomm) │ │ │ │ │ +186 : duneToParmetis(graph.noVertices(), -1), vtxDist_(oocomm.communicator │ │ │ │ │ +().size()+1) │ │ │ │ │ +187 { │ │ │ │ │ +188 int npes=oocomm.communicator().size(), mype=oocomm.communicator().rank(); │ │ │ │ │ 189 │ │ │ │ │ -_1_9_1 virtual void _a_p_p_l_y (_d_o_m_a_i_n___t_y_p_e& x, _r_a_n_g_e___t_y_p_e& b, [[maybe_unused]] double │ │ │ │ │ -reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ -192 { │ │ │ │ │ -193 apply(x, b, res); │ │ │ │ │ -194 } │ │ │ │ │ -195 │ │ │ │ │ -_1_9_6 void _s_e_t_O_p_t_i_o_n([[maybe_unused]] unsigned int option, [[maybe_unused]] │ │ │ │ │ -double value) │ │ │ │ │ -197 {} │ │ │ │ │ -198 │ │ │ │ │ -_2_0_0 void _s_e_t_M_a_t_r_i_x(const _M_a_t_r_i_x& matrix) │ │ │ │ │ -201 { │ │ │ │ │ -202 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -203 free(); │ │ │ │ │ -204 │ │ │ │ │ -205 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0) │ │ │ │ │ -206 spqrMatrix_.free(); │ │ │ │ │ -207 spqrMatrix_.setSize(_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_r_o_w_d_i_m(matrix), │ │ │ │ │ -208 _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(matrix)); │ │ │ │ │ -209 ISTL::Impl::BCCSMatrixInitializer initializer(spqrMatrix_); │ │ │ │ │ -210 │ │ │ │ │ -211 copyToBCCSMatrix(initializer, matrix); │ │ │ │ │ -212 │ │ │ │ │ -213 decompose(); │ │ │ │ │ -214 } │ │ │ │ │ -215 │ │ │ │ │ -216 template │ │ │ │ │ -_2_1_7 void _s_e_t_S_u_b_M_a_t_r_i_x(const _M_a_t_r_i_x& matrix, const S& rowIndexSet) │ │ │ │ │ -218 { │ │ │ │ │ -219 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_) │ │ │ │ │ -220 free(); │ │ │ │ │ +190 typedef typename OOComm::OwnerSet OwnerSet; │ │ │ │ │ +191 │ │ │ │ │ +192 int numOfOwnVtx=0; │ │ │ │ │ +193 auto end = oocomm.indexSet().end(); │ │ │ │ │ +194 for(auto index = oocomm.indexSet().begin(); index != end; ++index) { │ │ │ │ │ +195 if (OwnerSet::contains(index->local().attribute())) { │ │ │ │ │ +196 numOfOwnVtx++; │ │ │ │ │ +197 } │ │ │ │ │ +198 } │ │ │ │ │ +199 parmetisToDune.resize(numOfOwnVtx); │ │ │ │ │ +200 std::vector globalNumOfVtx(npes); │ │ │ │ │ +201 // make this number available to all processes │ │ │ │ │ +202 MPI_Allgather(&numOfOwnVtx, 1, MPI_INT, &(globalNumOfVtx[0]), 1, MPI_INT, │ │ │ │ │ +oocomm.communicator()); │ │ │ │ │ +203 │ │ │ │ │ +204 int base=0; │ │ │ │ │ +205 vtxDist_[0] = 0; │ │ │ │ │ +206 for(int i=0; i_:_:_r_o_w_d_i_m │ │ │ │ │ -(matrix) / matrix._N(), │ │ │ │ │ -226 rowIndexSet.size()*_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_M_a_t_r_i_x_>_:_:_c_o_l_d_i_m(matrix) / matrix._M()); │ │ │ │ │ -227 ISTL::Impl::BCCSMatrixInitializer initializer(spqrMatrix_); │ │ │ │ │ -228 │ │ │ │ │ -229 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_M_a_t_r_i_x,std:: │ │ │ │ │ -set >(matrix,rowIndexSet)); │ │ │ │ │ -230 │ │ │ │ │ -231 decompose(); │ │ │ │ │ -232 } │ │ │ │ │ -233 │ │ │ │ │ -_2_3_8 inline void _s_e_t_V_e_r_b_o_s_i_t_y(int v) │ │ │ │ │ -239 { │ │ │ │ │ -240 verbose_=v; │ │ │ │ │ -241 } │ │ │ │ │ -242 │ │ │ │ │ -_2_4_7 inline SuiteSparseQR_factorization* _g_e_t_F_a_c_t_o_r_i_z_a_t_i_o_n() │ │ │ │ │ -248 { │ │ │ │ │ -249 return spqrfactorization_; │ │ │ │ │ -250 } │ │ │ │ │ -251 │ │ │ │ │ -_2_5_6 inline _S_P_Q_R_M_a_t_r_i_x& _g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x() │ │ │ │ │ -257 { │ │ │ │ │ -258 return spqrMatrix_; │ │ │ │ │ -259 } │ │ │ │ │ -260 │ │ │ │ │ -_2_6_5 void _f_r_e_e() │ │ │ │ │ -266 { │ │ │ │ │ -267 cholmod_l_free_sparse(&A_, cc_); │ │ │ │ │ -268 cholmod_l_free_dense(&B_, cc_); │ │ │ │ │ -269 SuiteSparseQR_free(&spqrfactorization_, cc_); │ │ │ │ │ -270 spqrMatrix_.free(); │ │ │ │ │ -271 matrixIsLoaded_ = false; │ │ │ │ │ -272 } │ │ │ │ │ +222 // Traverse the graph and assign a new consecutive number/index │ │ │ │ │ +223 // starting by "base" to all owner vertices. │ │ │ │ │ +224 // The new index is used as the ParMETIS global index and is │ │ │ │ │ +225 // stored in the vector "duneToParmetis" │ │ │ │ │ +226 auto vend = graph.end(); │ │ │ │ │ +227 for(auto vertex = graph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ +228 const typename OOComm::ParallelIndexSet::IndexPair* │ │ │ │ │ +index=oocomm.globalLookup().pair(*vertex); │ │ │ │ │ +229 assert(index); │ │ │ │ │ +230 if (OwnerSet::contains(index->local().attribute())) { │ │ │ │ │ +231 // assign and count the index │ │ │ │ │ +232 parmetisToDune[base-base_]=index->local(); │ │ │ │ │ +233 duneToParmetis[index->local()] = base++; │ │ │ │ │ +234 } │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +237 // At this point, every process knows the ParMETIS global index │ │ │ │ │ +238 // of it's owner vertices. The next step is to get the │ │ │ │ │ +239 // ParMETIS global index of the overlap vertices from the │ │ │ │ │ +240 // associated processes. To do this, the Dune::Interface class │ │ │ │ │ +241 // is used. │ │ │ │ │ +242#ifdef DEBUG_REPART │ │ │ │ │ +243 std::cout < │ │ │ │ │ +_2_6_6 void _b_u_i_l_d_S_e_n_d_I_n_t_e_r_f_a_c_e(const std::vector& toPart, const IS& idxset) │ │ │ │ │ +267 { │ │ │ │ │ +268 std::map sizes; │ │ │ │ │ +269 │ │ │ │ │ +270 for(auto i=idxset.begin(), end=idxset.end(); i!=end; ++i) │ │ │ │ │ +271 if(Flags::contains(i->local().attribute())) │ │ │ │ │ +272 ++sizes[toPart[i->local()]]; │ │ │ │ │ 273 │ │ │ │ │ -_2_7_5 inline const char* _n_a_m_e() │ │ │ │ │ -276 { │ │ │ │ │ -277 return "SPQR"; │ │ │ │ │ -278 } │ │ │ │ │ -279 │ │ │ │ │ -280 private: │ │ │ │ │ -281 template │ │ │ │ │ -_2_8_2 friend class _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z; │ │ │ │ │ +274 // Allocate the necessary space │ │ │ │ │ +275 for(auto i=sizes.begin(), end=sizes.end(); i!=end; ++i) │ │ │ │ │ +276 interfaces()[i->first].first.reserve(i->second); │ │ │ │ │ +277 │ │ │ │ │ +278 //Insert the interface information │ │ │ │ │ +279 for(auto i=idxset.begin(), end=idxset.end(); i!=end; ++i) │ │ │ │ │ +280 if(Flags::contains(i->local().attribute())) │ │ │ │ │ +281 interfaces()[toPart[i->local()]].first.add(i->local()); │ │ │ │ │ +282 } │ │ │ │ │ 283 │ │ │ │ │ -284 friend struct _S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r<_S_P_Q_R<_M_a_t_r_i_x>,true>; │ │ │ │ │ -285 │ │ │ │ │ -287 void decompose() │ │ │ │ │ -288 { │ │ │ │ │ -289 const std::size_t nrows(spqrMatrix_.N()); │ │ │ │ │ -290 const std::size_t ncols(spqrMatrix_.M()); │ │ │ │ │ -291 const std::size_t nnz(spqrMatrix_.getColStart()[ncols]); │ │ │ │ │ -292 │ │ │ │ │ -293 // initialise the matrix A (sorted, packed, unsymmetric, real entries) │ │ │ │ │ -294 A_ = cholmod_l_allocate_sparse(nrows, ncols, nnz, 1, 1, 0, 1, cc_); │ │ │ │ │ -295 │ │ │ │ │ -296 // copy all the entries of Ap, Ai, Ax │ │ │ │ │ -297 for(std::size_t k = 0; k != (ncols+1); ++k) │ │ │ │ │ -298 (static_cast(A_->p))[k] = spqrMatrix_.getColStart()[k]; │ │ │ │ │ -299 │ │ │ │ │ -300 for(std::size_t k = 0; k != nnz; ++k) │ │ │ │ │ -301 { │ │ │ │ │ -302 (static_cast(A_->i))[k] = spqrMatrix_.getRowIndex()[k]; │ │ │ │ │ -303 (static_cast(A_->x))[k] = spqrMatrix_.getValues()[k]; │ │ │ │ │ -304 } │ │ │ │ │ +_2_8_4 void _r_e_s_e_r_v_e_S_p_a_c_e_F_o_r_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e(int proc, int size) │ │ │ │ │ +285 { │ │ │ │ │ +286 interfaces()[proc].second.reserve(size); │ │ │ │ │ +287 } │ │ │ │ │ +_2_8_8 void _a_d_d_R_e_c_e_i_v_e_I_n_d_e_x(int proc, std::size_t idx) │ │ │ │ │ +289 { │ │ │ │ │ +290 interfaces()[proc].second.add(idx); │ │ │ │ │ +291 } │ │ │ │ │ +292 template │ │ │ │ │ +_2_9_3 void _b_u_i_l_d_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e(std::vector >& indices) │ │ │ │ │ +294 { │ │ │ │ │ +295 std::size_t i=0; │ │ │ │ │ +296 for(auto idx=indices.begin(); idx!= indices.end(); ++idx) { │ │ │ │ │ +297 interfaces()[idx->second].second.add(i++); │ │ │ │ │ +298 } │ │ │ │ │ +299 } │ │ │ │ │ +300 │ │ │ │ │ +_3_0_1 _~_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e() │ │ │ │ │ +302 {} │ │ │ │ │ +303 │ │ │ │ │ +304 }; │ │ │ │ │ 305 │ │ │ │ │ -306 // initialise the vector B │ │ │ │ │ -307 B_ = cholmod_l_allocate_dense(nrows, 1, nrows, A_->xtype, cc_); │ │ │ │ │ -308 // compute factorization of A │ │ │ │ │ -309 spqrfactorization_=SuiteSparseQR_factorize │ │ │ │ │ -(SPQR_ORDERING_DEFAULT,SPQR_DEFAULT_TOL,A_,cc_); │ │ │ │ │ -310 } │ │ │ │ │ -311 │ │ │ │ │ -312 SPQRMatrix spqrMatrix_; │ │ │ │ │ -313 bool matrixIsLoaded_; │ │ │ │ │ -314 int verbose_; │ │ │ │ │ -315 cholmod_common* cc_; │ │ │ │ │ -316 cholmod_sparse* A_; │ │ │ │ │ -317 cholmod_dense* B_; │ │ │ │ │ -318 SuiteSparseQR_factorization* spqrfactorization_; │ │ │ │ │ -319 }; │ │ │ │ │ -320 │ │ │ │ │ -321 template │ │ │ │ │ -_3_2_2 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r<_S_P_Q_R<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ -323 { │ │ │ │ │ -_3_2_4 enum {_v_a_l_u_e = true}; │ │ │ │ │ -325 }; │ │ │ │ │ -326 │ │ │ │ │ -327 template │ │ │ │ │ -_3_2_8 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d<_S_P_Q_R<_B_C_R_S_M_a_t_r_i_x > > │ │ │ │ │ -329 { │ │ │ │ │ -_3_3_0 enum {_v_a_l_u_e = true}; │ │ │ │ │ -331 }; │ │ │ │ │ -332 │ │ │ │ │ -_3_3_3 struct _S_P_Q_R_C_r_e_a_t_o_r { │ │ │ │ │ -_3_3_4 template struct _i_s_V_a_l_i_d_B_l_o_c_k : std::false_type{}; │ │ │ │ │ -335 │ │ │ │ │ -336 template │ │ │ │ │ -337 std::shared_ptr::type, │ │ │ │ │ -338 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_3_3_9 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& _m_a_t, const Dune::ParameterTree& config, │ │ │ │ │ -340 std::enable_if_t< │ │ │ │ │ -341 _i_s_V_a_l_i_d_B_l_o_c_k::type::block_type>:: │ │ │ │ │ -value,int> = 0) const │ │ │ │ │ -342 { │ │ │ │ │ -343 int verbose = config.get("verbose", 0); │ │ │ │ │ -344 return std::make_shared>(_m_a_t,verbose); │ │ │ │ │ -345 } │ │ │ │ │ -346 │ │ │ │ │ -347 // second version with SFINAE to validate the template parameters of SPQR │ │ │ │ │ -348 template │ │ │ │ │ -349 std::shared_ptr::type, │ │ │ │ │ -350 typename Dune::TypeListElement<2, TL>::type>> │ │ │ │ │ -_3_5_1 _o_p_e_r_a_t_o_r_(_)_ (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& / │ │ │ │ │ -*config*/, │ │ │ │ │ -352 std::enable_if_t:: │ │ │ │ │ -type::block_type>::value,int> = 0) const │ │ │ │ │ -353 { │ │ │ │ │ -354 DUNE_THROW(_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e, │ │ │ │ │ -355 "Unsupported Type in SPQR (only double and std::complex │ │ │ │ │ -supported)"); │ │ │ │ │ -356 } │ │ │ │ │ -357 }; │ │ │ │ │ -_3_5_8 template<> struct _S_P_Q_R_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k> : std:: │ │ │ │ │ -true_type{}; │ │ │ │ │ -359 // std::complex is temporary disabled, because it fails if libc++ is used │ │ │ │ │ -360 //template<> struct SPQRCreator::isValidMatrixBlock,1,1>> : std::true_type{}; │ │ │ │ │ -_3_6_1 _D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R("spqr", _D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r()); │ │ │ │ │ -362 │ │ │ │ │ -363} // end namespace Dune │ │ │ │ │ -364 │ │ │ │ │ -365 │ │ │ │ │ -366#endif //HAVE_SUITESPARSE_SPQR │ │ │ │ │ -367#endif //DUNE_ISTL_SPQR_HH │ │ │ │ │ -_D_U_N_E___R_E_G_I_S_T_E_R___D_I_R_E_C_T___S_O_L_V_E_R │ │ │ │ │ -#define DUNE_REGISTER_DIRECT_SOLVER(name,...) │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:13 │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_s_o_l_v_e_r_f_a_c_t_o_r_y_._h_h │ │ │ │ │ -_b_c_c_s_m_a_t_r_i_x_i_n_i_t_i_a_l_i_z_e_r_._h_h │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ -Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_~_S_P_Q_R │ │ │ │ │ -virtual ~SPQR() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_S_P_Q_R │ │ │ │ │ -SPQR(const Matrix &matrix, int verbose, bool) │ │ │ │ │ -Constructor for compatibility with SuperLU standard constructor. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const │ │ │ │ │ -Category of the solver (see SolverCategory::Category) │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_I_n_t_e_r_n_a_l_M_a_t_r_i_x │ │ │ │ │ -SPQRMatrix & getInternalMatrix() │ │ │ │ │ -Return the column coppressed matrix. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:256 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -void setMatrix(const Matrix &matrix) │ │ │ │ │ -Initialize data from given matrix. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:200 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int │ │ │ │ │ -> MatrixInitializer │ │ │ │ │ -Type of an associated initializer class. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ -Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ -The matrix type. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_S_P_Q_R │ │ │ │ │ -SPQR() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL │ │ │ │ │ ->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const │ │ │ │ │ -M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< │ │ │ │ │ -typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:339 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_n_a_m_e │ │ │ │ │ -const char * name() │ │ │ │ │ -Get method name. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_g_e_t_F_a_c_t_o_r_i_z_a_t_i_o_n │ │ │ │ │ -SuiteSparseQR_factorization< T > * getFactorization() │ │ │ │ │ -Return the matrix factorization. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:247 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_V_e_r_b_o_s_i_t_y │ │ │ │ │ -void setVerbosity(int v) │ │ │ │ │ -Sets the verbosity level for the solver. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_S_P_Q_R_M_a_t_r_i_x │ │ │ │ │ -ISTL::Impl::BCCSMatrix< T, int > SPQRMatrix │ │ │ │ │ -The corresponding SuperLU Matrix type. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &x, range_type &b, double reduction, │ │ │ │ │ -InverseOperatorResult &res) │ │ │ │ │ -apply inverse operator, with given convergence criteria. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_f_r_e_e │ │ │ │ │ -void free() │ │ │ │ │ -Free allocated space. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:265 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_S_P_Q_R │ │ │ │ │ -SPQR(const Matrix &matrix, const ParameterTree &config) │ │ │ │ │ -Constructs the SPQR solver. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Dune::BlockVector< FieldVector< T, n >, typename std::allocator_traits< A >:: │ │ │ │ │ -template rebind_alloc< FieldVector< T, n > > > range_type │ │ │ │ │ -The type of the range of the solver. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ -void setSubMatrix(const Matrix &matrix, const S &rowIndexSet) │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:217 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -Dune::BlockVector< FieldVector< T, m >, typename std::allocator_traits< A >:: │ │ │ │ │ -template rebind_alloc< FieldVector< T, m > > > domain_type │ │ │ │ │ -The type of the domain of the solver. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res) │ │ │ │ │ -Apply inverse operator,. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_s_e_t_O_p_t_i_o_n │ │ │ │ │ -void setOption(unsigned int option, double value) │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _m_ _>_,_ _A_ _>_ _>_:_:_S_P_Q_R │ │ │ │ │ -SPQR(const Matrix &matrix, int verbose=0) │ │ │ │ │ -Construct a solver object from a BCRSMatrix. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:95 │ │ │ │ │ +306 namespace │ │ │ │ │ +307 { │ │ │ │ │ +317 template │ │ │ │ │ +318 void createSendBuf(std::vector& ownerVec, std::set& overlapVec, │ │ │ │ │ +std::set& neighbors, char *sendBuf, int buffersize, MPI_Comm comm) { │ │ │ │ │ +319 // Pack owner vertices │ │ │ │ │ +320 std::size_t s=ownerVec.size(); │ │ │ │ │ +321 int pos=0; │ │ │ │ │ +322 if(s==0) │ │ │ │ │ +323 ownerVec.resize(1); // otherwise would read beyond the memory bound │ │ │ │ │ +324 MPI_Pack(&s, 1, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ +&pos, comm); │ │ │ │ │ +325 MPI_Pack(&(ownerVec[0]), s, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ +&pos, comm); │ │ │ │ │ +326 s = overlapVec.size(); │ │ │ │ │ +327 MPI_Pack(&s, 1, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ +&pos, comm); │ │ │ │ │ +328 for(auto i=overlapVec.begin(), end= overlapVec.end(); i != end; ++i) │ │ │ │ │ +329 MPI_Pack(const_cast(&(*i)), 1, MPITraits::getType(), sendBuf, │ │ │ │ │ +buffersize, &pos, comm); │ │ │ │ │ +330 │ │ │ │ │ +331 s=neighbors.size(); │ │ │ │ │ +332 MPI_Pack(&s, 1, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ +&pos, comm); │ │ │ │ │ +333 │ │ │ │ │ +334 for(auto i=neighbors.begin(), end= neighbors.end(); i != end; ++i) │ │ │ │ │ +335 MPI_Pack(const_cast(&(*i)), 1, MPI_INT, sendBuf, buffersize, &pos, │ │ │ │ │ +comm); │ │ │ │ │ +336 } │ │ │ │ │ +345 template │ │ │ │ │ +346 void saveRecvBuf(char *recvBuf, int bufferSize, std::vector >& ownerVec, │ │ │ │ │ +347 std::set& overlapVec, std::set& neighbors, RedistributeInterface& │ │ │ │ │ +inf, int from, MPI_Comm comm) { │ │ │ │ │ +348 std::size_t size; │ │ │ │ │ +349 int pos=0; │ │ │ │ │ +350 // unpack owner vertices │ │ │ │ │ +351 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits:: │ │ │ │ │ +getType(), comm); │ │ │ │ │ +352 inf.reserveSpaceForReceiveInterface(from, size); │ │ │ │ │ +353 ownerVec.reserve(ownerVec.size()+size); │ │ │ │ │ +354 for(; size!=0; --size) { │ │ │ │ │ +355 GI gi; │ │ │ │ │ +356 MPI_Unpack(recvBuf, bufferSize, &pos, &gi, 1, MPITraits::getType(), │ │ │ │ │ +comm); │ │ │ │ │ +357 ownerVec.push_back(std::make_pair(gi,from)); │ │ │ │ │ +358 } │ │ │ │ │ +359 // unpack overlap vertices │ │ │ │ │ +360 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits:: │ │ │ │ │ +getType(), comm); │ │ │ │ │ +361 typename std::set::iterator ipos = overlapVec.begin(); │ │ │ │ │ +362 Dune::dverb << "unpacking "<::getType(), │ │ │ │ │ +comm); │ │ │ │ │ +366 ipos=overlapVec.insert(ipos, gi); │ │ │ │ │ +367 } │ │ │ │ │ +368 //unpack neighbors │ │ │ │ │ +369 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits:: │ │ │ │ │ +getType(), comm); │ │ │ │ │ +370 Dune::dverb << "unpacking "<::iterator npos = neighbors.begin(); │ │ │ │ │ +372 for(; size!=0; --size) { │ │ │ │ │ +373 int n; │ │ │ │ │ +374 MPI_Unpack(recvBuf, bufferSize, &pos, &n, 1, MPI_INT, comm); │ │ │ │ │ +375 npos=neighbors.insert(npos, n); │ │ │ │ │ +376 } │ │ │ │ │ +377 } │ │ │ │ │ +378 │ │ │ │ │ +392 template │ │ │ │ │ +393 void getDomain(const MPI_Comm& comm, T *part, int numOfOwnVtx, int nparts, │ │ │ │ │ +int *myDomain, std::vector &domainMapping) { │ │ │ │ │ +394 int npes, mype; │ │ │ │ │ +395 MPI_Comm_size(comm, &npes); │ │ │ │ │ +396 MPI_Comm_rank(comm, &mype); │ │ │ │ │ +397 MPI_Status status; │ │ │ │ │ +398 │ │ │ │ │ +399 *myDomain = -1; │ │ │ │ │ +400 int i=0; │ │ │ │ │ +401 int j=0; │ │ │ │ │ +402 │ │ │ │ │ +403 std::vector domain(nparts, 0); │ │ │ │ │ +404 std::vector assigned(npes, 0); │ │ │ │ │ +405 // init domain Mapping │ │ │ │ │ +406 domainMapping.assign(domainMapping.size(), -1); │ │ │ │ │ +407 │ │ │ │ │ +408 // count the occurrence of domains │ │ │ │ │ +409 for (i=0; i domainMatrix(npes * nparts, -1); │ │ │ │ │ +414 │ │ │ │ │ +415 // init buffer with the own domain │ │ │ │ │ +416 int *buf = new int[nparts]; │ │ │ │ │ +417 for (i=0; i unassigned; │ │ │ │ │ +442 │ │ │ │ │ +443 for(i=0; i::iterator next_free = assigned.begin(); │ │ │ │ │ +472 │ │ │ │ │ +473 for(auto udomain = unassigned.begin(), │ │ │ │ │ +474 end = unassigned.end(); udomain != end; ++udomain) │ │ │ │ │ +475 { │ │ │ │ │ +476 next_free = std::find_if(next_free, assigned.end(), std::bind(std:: │ │ │ │ │ +less(), std::placeholders::_1, 1)); │ │ │ │ │ +477 assert(next_free != assigned.end()); │ │ │ │ │ +478 domainMapping[*udomain] = next_free-assigned.begin(); │ │ │ │ │ +479 *next_free = 1; │ │ │ │ │ +480 } │ │ │ │ │ +481 } │ │ │ │ │ +482 │ │ │ │ │ +483 struct SortFirst │ │ │ │ │ +484 { │ │ │ │ │ +485 template │ │ │ │ │ +486 bool operator()(const T& t1, const T& t2) const │ │ │ │ │ +487 { │ │ │ │ │ +488 return t1 │ │ │ │ │ +504 void mergeVec(std::vector >& ownerVec, std::set& │ │ │ │ │ +overlapSet) { │ │ │ │ │ +505 │ │ │ │ │ +506#ifdef DEBUG_REPART │ │ │ │ │ +507 // Safety check for duplicates. │ │ │ │ │ +508 if(ownerVec.size()>0) │ │ │ │ │ +509 { │ │ │ │ │ +510 auto old=ownerVec.begin(); │ │ │ │ │ +511 for(auto i=old+1, end=ownerVec.end(); i != end; old=i++) │ │ │ │ │ +512 { │ │ │ │ │ +513 if(i->first==old->first) │ │ │ │ │ +514 { │ │ │ │ │ +515 std::cerr<<"Value at indes"<first<<","<second<<"]==[" │ │ │ │ │ +517 <first<<","<second<<"]"<first<*s) ++v; │ │ │ │ │ +529 if(v!=vend && v->first==*s) { │ │ │ │ │ +530 // Move to the next element before erasing │ │ │ │ │ +531 // thus s stays valid! │ │ │ │ │ +532 auto tmp=s; │ │ │ │ │ +533 ++s; │ │ │ │ │ +534 overlapSet.erase(tmp); │ │ │ │ │ +535 }else │ │ │ │ │ +536 ++s; │ │ │ │ │ +537 } │ │ │ │ │ +538 } │ │ │ │ │ +539 │ │ │ │ │ +540 │ │ │ │ │ +554 template │ │ │ │ │ +555 void getNeighbor(const Graph& g, std::vector& part, │ │ │ │ │ +556 typename Graph::VertexDescriptor vtx, const IS& indexSet, │ │ │ │ │ +557 int toPe, std::set& neighbor, std::set& neighborProcs) { │ │ │ │ │ +558 for(auto edge=g.beginEdges(vtx), end=g.endEdges(vtx); edge!=end; ++edge) │ │ │ │ │ +559 { │ │ │ │ │ +560 const typename IS::IndexPair* pindex = indexSet.pair(edge.target()); │ │ │ │ │ +561 assert(pindex); │ │ │ │ │ +562 if(part[pindex->local()]!=toPe || !OwnerSet::contains(pindex->local │ │ │ │ │ +().attribute())) │ │ │ │ │ +563 { │ │ │ │ │ +564 // is sent to another process and therefore becomes overlap │ │ │ │ │ +565 neighbor.insert(pindex->global()); │ │ │ │ │ +566 neighborProcs.insert(part[pindex->local()]); │ │ │ │ │ +567 } │ │ │ │ │ +568 } │ │ │ │ │ +569 } │ │ │ │ │ +570 │ │ │ │ │ +571 template │ │ │ │ │ +572 void my_push_back(std::vector& ownerVec, const I& index, [ │ │ │ │ │ +[maybe_unused]] int proc) │ │ │ │ │ +573 { │ │ │ │ │ +574 ownerVec.push_back(index); │ │ │ │ │ +575 } │ │ │ │ │ +576 │ │ │ │ │ +577 template │ │ │ │ │ +578 void my_push_back(std::vector >& ownerVec, const I& index, │ │ │ │ │ +int proc) │ │ │ │ │ +579 { │ │ │ │ │ +580 ownerVec.push_back(std::make_pair(index,proc)); │ │ │ │ │ +581 } │ │ │ │ │ +582 template │ │ │ │ │ +583 void reserve(std::vector&, RedistributeInterface&, int) │ │ │ │ │ +584 {} │ │ │ │ │ +585 template │ │ │ │ │ +586 void reserve(std::vector >& ownerVec, │ │ │ │ │ +RedistributeInterface& redist, int proc) │ │ │ │ │ +587 { │ │ │ │ │ +588 redist.reserveSpaceForReceiveInterface(proc, ownerVec.size()); │ │ │ │ │ +589 } │ │ │ │ │ +590 │ │ │ │ │ +591 │ │ │ │ │ +609 template │ │ │ │ │ +610 void getOwnerOverlapVec(const G& graph, std::vector& part, IS& │ │ │ │ │ +indexSet, │ │ │ │ │ +611 [[maybe_unused]] int myPe, int toPe, std::vector& ownerVec, std:: │ │ │ │ │ +set& overlapSet, │ │ │ │ │ +612 RedistributeInterface& redist, std::set& neighborProcs) { │ │ │ │ │ +613 for(auto index = indexSet.begin(); index != indexSet.end(); ++index) { │ │ │ │ │ +614 // Only Process owner vertices, the others are not in the parmetis graph. │ │ │ │ │ +615 if(OwnerSet::contains(index->local().attribute())) │ │ │ │ │ +616 { │ │ │ │ │ +617 if(part[index->local()]==toPe) │ │ │ │ │ +618 { │ │ │ │ │ +619 getNeighbor(graph, part, index->local(), indexSet, │ │ │ │ │ +620 toPe, overlapSet, neighborProcs); │ │ │ │ │ +621 my_push_back(ownerVec, index->global(), toPe); │ │ │ │ │ +622 } │ │ │ │ │ +623 } │ │ │ │ │ +624 } │ │ │ │ │ +625 reserve(ownerVec, redist, toPe); │ │ │ │ │ +626 │ │ │ │ │ +627 } │ │ │ │ │ +628 │ │ │ │ │ +629 │ │ │ │ │ +636 template │ │ │ │ │ +637 inline bool isOwner(IS& indexSet, int index) { │ │ │ │ │ +638 │ │ │ │ │ +639 const typename IS::IndexPair* pindex=indexSet.pair(index); │ │ │ │ │ +640 │ │ │ │ │ +641 assert(pindex); │ │ │ │ │ +642 return F::contains(pindex->local().attribute()); │ │ │ │ │ +643 } │ │ │ │ │ +644 │ │ │ │ │ +645 │ │ │ │ │ +646 class BaseEdgeFunctor │ │ │ │ │ +647 { │ │ │ │ │ +648 public: │ │ │ │ │ +649 BaseEdgeFunctor(Metis::idx_t* adj,const ParmetisDuneIndexMap& data) │ │ │ │ │ +650 : i_(), adj_(adj), data_(data) │ │ │ │ │ +651 {} │ │ │ │ │ +652 │ │ │ │ │ +653 template │ │ │ │ │ +654 void operator()(const T& edge) │ │ │ │ │ +655 { │ │ │ │ │ +656 // Get the egde weight │ │ │ │ │ +657 // const Weight& weight=edge.weight(); │ │ │ │ │ +658 adj_[i_] = data_.toParmetis(edge.target()); │ │ │ │ │ +659 i_++; │ │ │ │ │ +660 } │ │ │ │ │ +661 std::size_t index() │ │ │ │ │ +662 { │ │ │ │ │ +663 return i_; │ │ │ │ │ +664 } │ │ │ │ │ +665 │ │ │ │ │ +666 private: │ │ │ │ │ +667 std::size_t i_; │ │ │ │ │ +668 Metis::idx_t* adj_; │ │ │ │ │ +669 const ParmetisDuneIndexMap& data_; │ │ │ │ │ +670 }; │ │ │ │ │ +671 │ │ │ │ │ +672 template │ │ │ │ │ +673 struct EdgeFunctor │ │ │ │ │ +674 : public BaseEdgeFunctor │ │ │ │ │ +675 { │ │ │ │ │ +676 EdgeFunctor(Metis::idx_t* adj, const ParmetisDuneIndexMap& data, std:: │ │ │ │ │ +size_t) │ │ │ │ │ +677 : BaseEdgeFunctor(adj, data) │ │ │ │ │ +678 {} │ │ │ │ │ +679 │ │ │ │ │ +680 Metis::idx_t* getWeights() │ │ │ │ │ +681 { │ │ │ │ │ +682 return NULL; │ │ │ │ │ +683 } │ │ │ │ │ +684 void free(){} │ │ │ │ │ +685 }; │ │ │ │ │ +686 │ │ │ │ │ +687 template │ │ │ │ │ +688 class EdgeFunctor<_D_u_n_e::Amg::PropertiesGraph > │ │ │ │ │ +689 : public BaseEdgeFunctor │ │ │ │ │ +690 { │ │ │ │ │ +691 public: │ │ │ │ │ +692 EdgeFunctor(Metis::idx_t* adj, const ParmetisDuneIndexMap& data, std:: │ │ │ │ │ +size_t s) │ │ │ │ │ +693 : BaseEdgeFunctor(adj, data) │ │ │ │ │ +694 { │ │ │ │ │ +695 weight_=new Metis::idx_t[s]; │ │ │ │ │ +696 } │ │ │ │ │ +697 │ │ │ │ │ +698 template │ │ │ │ │ +699 void operator()(const T& edge) │ │ │ │ │ +700 { │ │ │ │ │ +701 weight_[index()]=edge.properties().depends() ? 3 : 1; │ │ │ │ │ +702 BaseEdgeFunctor::operator()(edge); │ │ │ │ │ +703 } │ │ │ │ │ +704 Metis::idx_t* getWeights() │ │ │ │ │ +705 { │ │ │ │ │ +706 return weight_; │ │ │ │ │ +707 } │ │ │ │ │ +708 void free(){ │ │ │ │ │ +709 if(weight_!=0) { │ │ │ │ │ +710 delete weight_; │ │ │ │ │ +711 weight_=0; │ │ │ │ │ +712 } │ │ │ │ │ +713 } │ │ │ │ │ +714 private: │ │ │ │ │ +715 Metis::idx_t* weight_; │ │ │ │ │ +716 }; │ │ │ │ │ +717 │ │ │ │ │ +718 │ │ │ │ │ +719 │ │ │ │ │ +733 template │ │ │ │ │ +734 void getAdjArrays(G& graph, IS& indexSet, Metis::idx_t *xadj, │ │ │ │ │ +735 EW& ew) │ │ │ │ │ +736 { │ │ │ │ │ +737 int j=0; │ │ │ │ │ +738 auto vend = graph.end(); │ │ │ │ │ +739 │ │ │ │ │ +740 for(auto vertex = graph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ +741 if (isOwner(indexSet,*vertex)) { │ │ │ │ │ +742 // The type of const edge iterator. │ │ │ │ │ +743 auto eend = vertex.end(); │ │ │ │ │ +744 xadj[j] = ew.index(); │ │ │ │ │ +745 j++; │ │ │ │ │ +746 for(auto edge = vertex.begin(); edge != eend; ++edge) { │ │ │ │ │ +747 ew(edge); │ │ │ │ │ +748 } │ │ │ │ │ +749 } │ │ │ │ │ +750 } │ │ │ │ │ +751 xadj[j] = ew.index(); │ │ │ │ │ +752 } │ │ │ │ │ +753 } // end anonymous namespace │ │ │ │ │ +754 │ │ │ │ │ +755 template │ │ │ │ │ +756 bool _b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n(const G& graph, std::vector& realparts, │ │ │ │ │ +757 _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, │ │ │ │ │ +758 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ +759 RedistributeInterface& redistInf, │ │ │ │ │ +760 bool verbose=false); │ │ │ │ │ +761#if HAVE_PARMETIS │ │ │ │ │ +762#ifndef METIS_VER_MAJOR │ │ │ │ │ +763 extern "C" │ │ │ │ │ +764 { │ │ │ │ │ +765 // backwards compatibility to parmetis < 4.0.0 │ │ │ │ │ +766 void METIS_PartGraphKway(int *nvtxs, Metis::idx_t *xadj, Metis::idx_t │ │ │ │ │ +*adjncy, Metis::idx_t *vwgt, │ │ │ │ │ +767 Metis::idx_t *adjwgt, int *wgtflag, int *numflag, int *nparts, │ │ │ │ │ +768 int *options, int *edgecut, Metis::idx_t *part); │ │ │ │ │ +769 │ │ │ │ │ +770 void METIS_PartGraphRecursive(int *nvtxs, Metis::idx_t *xadj, Metis::idx_t │ │ │ │ │ +*adjncy, Metis::idx_t *vwgt, │ │ │ │ │ +771 Metis::idx_t *adjwgt, int *wgtflag, int *numflag, int *nparts, │ │ │ │ │ +772 int *options, int *edgecut, Metis::idx_t *part); │ │ │ │ │ +773 } │ │ │ │ │ +774#endif │ │ │ │ │ +775#endif // HAVE_PARMETIS │ │ │ │ │ +776 │ │ │ │ │ +777 template │ │ │ │ │ +_7_7_8 inline void _p_r_i_n_t___c_a_r_r_a_y(S& os, T* array, std::size_t l) │ │ │ │ │ +779 { │ │ │ │ │ +780 for(T *cur=array, *end=array+l; cur!=end; ++cur) │ │ │ │ │ +781 os<<*cur<<" "; │ │ │ │ │ +782 } │ │ │ │ │ +783 │ │ │ │ │ +784 template │ │ │ │ │ +_7_8_5 inline bool _i_s_V_a_l_i_d_G_r_a_p_h(std::size_t noVtx, std::size_t gnoVtx, S noEdges, │ │ │ │ │ +T* xadj, │ │ │ │ │ +786 T* adjncy, bool checkSymmetry) │ │ │ │ │ +787 { │ │ │ │ │ +788 bool correct=true; │ │ │ │ │ +789 │ │ │ │ │ +790 using std::signbit; │ │ │ │ │ +791 for(_M_e_t_i_s_:_:_i_d_x___t vtx=0; vtx<(_M_e_t_i_s_:_:_i_d_x___t)noVtx; ++vtx) { │ │ │ │ │ +792 if(static_cast(xadj[vtx])>noEdges || signbit(xadj[vtx])) { │ │ │ │ │ +793 std::cerr <<"Check graph: xadj["<" │ │ │ │ │ +794 <(xadj[vtx+1])>noEdges || signbit(xadj[vtx+1])) { │ │ │ │ │ +798 std::cerr <<"Check graph: xadj["<" │ │ │ │ │ +799 <gnoVtx) { │ │ │ │ │ +805 std::cerr<<" Edge "< │ │ │ │ │ +_8_2_9 bool _c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(const M& _m_a_t, _D_u_n_e_:_: │ │ │ │ │ +_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, │ │ │ │ │ +830 _M_e_t_i_s_:_:_i_d_x___t nparts, │ │ │ │ │ +831 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ +832 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& redistInf, │ │ │ │ │ +833 bool verbose=false) │ │ │ │ │ +834 { │ │ │ │ │ +835 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +836 std::cout<<"Repartitioning from "<1) { │ │ │ │ │ +847 │ │ │ │ │ +848 part[0]=rank; │ │ │ │ │ +849 │ │ │ │ │ +850 { // sublock for automatic memory deletion │ │ │ │ │ +851 │ │ │ │ │ +852 // Build the graph of the communication scheme and create an appropriate │ │ │ │ │ +indexset. │ │ │ │ │ +853 // calculate the neighbour vertices │ │ │ │ │ +854 int noNeighbours = oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().neighbours(); │ │ │ │ │ +855 │ │ │ │ │ +856 for(auto n= oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().begin(); n != oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().end │ │ │ │ │ +(); │ │ │ │ │ +857 ++n) │ │ │ │ │ +858 if(n->first==rank) { │ │ │ │ │ +859 //do not include ourselves. │ │ │ │ │ +860 --noNeighbours; │ │ │ │ │ +861 break; │ │ │ │ │ +862 } │ │ │ │ │ +863 │ │ │ │ │ +864 // A parmetis graph representing the communication graph. │ │ │ │ │ +865 // The diagonal entries are the number of nodes on the process. │ │ │ │ │ +866 // The offdiagonal entries are the number of edges leading to other │ │ │ │ │ +processes. │ │ │ │ │ +867 │ │ │ │ │ +868 _M_e_t_i_s_:_:_i_d_x___t *xadj=new _M_e_t_i_s_:_:_i_d_x___t[2]; │ │ │ │ │ +869 _M_e_t_i_s_:_:_i_d_x___t *vtxdist=new _M_e_t_i_s_:_:_i_d_x___t[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()+1]; │ │ │ │ │ +870 _M_e_t_i_s_:_:_i_d_x___t *adjncy=new _M_e_t_i_s_:_:_i_d_x___t[noNeighbours]; │ │ │ │ │ +871#ifdef USE_WEIGHTS │ │ │ │ │ +872 _M_e_t_i_s_:_:_i_d_x___t *vwgt = 0; │ │ │ │ │ +873 _M_e_t_i_s_:_:_i_d_x___t *adjwgt = 0; │ │ │ │ │ +874#endif │ │ │ │ │ +875 │ │ │ │ │ +876 // each process has exactly one vertex! │ │ │ │ │ +877 for(int i=0; i owner(mat.N(), oocomm.communicator().rank()); │ │ │ │ │ +887 // for(NeighbourIterator n= oocomm.remoteIndices().begin(); n != │ │ │ │ │ +oocomm.remoteIndices().end(); │ │ │ │ │ +888 // ++n) │ │ │ │ │ +889 // { │ │ │ │ │ +890 // if(n->first!=oocomm.communicator().rank()){ │ │ │ │ │ +891 // typedef typename RemoteIndices::RemoteIndexList RIList; │ │ │ │ │ +892 // const RIList& rlist = *(n->second.first); │ │ │ │ │ +893 // typedef typename RIList::const_iterator LIter; │ │ │ │ │ +894 // for(LIter entry=rlist.begin(); entry!=rlist.end(); ++entry){ │ │ │ │ │ +895 // if(entry->attribute()==OwnerOverlapCopyAttributeSet::owner) │ │ │ │ │ +896 // owner[entry->localIndexPair().local()] = n->first; │ │ │ │ │ +897 // } │ │ │ │ │ +898 // } │ │ │ │ │ +899 // } │ │ │ │ │ +900 │ │ │ │ │ +901 // std::map edgecount; // edges to other processors │ │ │ │ │ +902 // typedef typename M::ConstRowIterator RIter; │ │ │ │ │ +903 // typedef typename M::ConstColIterator CIter; │ │ │ │ │ +904 │ │ │ │ │ +905 // // calculate edge count │ │ │ │ │ +906 // for(RIter row=mat.begin(), endr=mat.end(); row != endr; ++row) │ │ │ │ │ +907 // if(owner[row.index()]==OwnerOverlapCopyAttributeSet::owner) │ │ │ │ │ +908 // for(CIter entry= row->begin(), ende = row->end(); entry != ende; │ │ │ │ │ +++entry) │ │ │ │ │ +909 // ++edgecount[owner[entry.index()]]; │ │ │ │ │ +910 │ │ │ │ │ +911 // setup edge and weight pattern │ │ │ │ │ +912 │ │ │ │ │ +913 _M_e_t_i_s_:_:_i_d_x___t* adjp=adjncy; │ │ │ │ │ +914 │ │ │ │ │ +915#ifdef USE_WEIGHTS │ │ │ │ │ +916 vwgt = new _M_e_t_i_s_:_:_i_d_x___t[1]; │ │ │ │ │ +917 vwgt[0]= _m_a_t.N(); // weight is numer of rows TODO: Should actually be the │ │ │ │ │ +nonzeros. │ │ │ │ │ +918 │ │ │ │ │ +919 adjwgt = new _M_e_t_i_s_:_:_i_d_x___t[noNeighbours]; │ │ │ │ │ +920 _M_e_t_i_s_:_:_i_d_x___t* adjwp=adjwgt; │ │ │ │ │ +921#endif │ │ │ │ │ +922 │ │ │ │ │ +923 for(auto n= oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().begin(); n != oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().end │ │ │ │ │ +(); │ │ │ │ │ +924 ++n) │ │ │ │ │ +925 if(n->first != rank) { │ │ │ │ │ +926 *adjp=n->first; │ │ │ │ │ +927 ++adjp; │ │ │ │ │ +928#ifdef USE_WEIGHTS │ │ │ │ │ +929 *adjwp=1; //edgecount[n->first]; │ │ │ │ │ +930 ++adjwp; │ │ │ │ │ +931#endif │ │ │ │ │ +932 } │ │ │ │ │ +933 assert(_i_s_V_a_l_i_d_G_r_a_p_h(vtxdist[rank+1]-vtxdist[rank], │ │ │ │ │ +934 vtxdist[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()], │ │ │ │ │ +935 noNeighbours, xadj, adjncy, false)); │ │ │ │ │ +936 │ │ │ │ │ +937 [[maybe_unused]] _M_e_t_i_s_:_:_i_d_x___t wgtflag=0; │ │ │ │ │ +938 _M_e_t_i_s_:_:_i_d_x___t numflag=0; │ │ │ │ │ +939 _M_e_t_i_s_:_:_i_d_x___t edgecut; │ │ │ │ │ +940#ifdef USE_WEIGHTS │ │ │ │ │ +941 wgtflag=3; │ │ │ │ │ +942#endif │ │ │ │ │ +943 _M_e_t_i_s_:_:_r_e_a_l___t *tpwgts = new _M_e_t_i_s_:_:_r_e_a_l___t[nparts]; │ │ │ │ │ +944 for(int i=0; i::getType(), │ │ │ │ │ +1071 gxadj,noxs,xdispl,MPITraits::getType(), │ │ │ │ │ +1072 comm); │ │ │ │ │ +1073 MPI_Allgatherv(adjncy,noNeighbours,MPITraits::getType(), │ │ │ │ │ +1074 gadjncy,noedges,displ,MPITraits::getType(), │ │ │ │ │ +1075 comm); │ │ │ │ │ +1076#ifdef USE_WEIGHTS │ │ │ │ │ +1077 MPI_Allgatherv(adjwgt,noNeighbours,MPITraits::getType(), │ │ │ │ │ +1078 gadjwgt,noedges,displ,MPITraits::getType(), │ │ │ │ │ +1079 comm); │ │ │ │ │ +1080 MPI_Allgatherv(vwgt,localNoVtx,MPITraits::getType(), │ │ │ │ │ +1081 gvwgt,novs,vdispl,MPITraits::getType(), │ │ │ │ │ +1082 comm); │ │ │ │ │ +1083#endif │ │ │ │ │ +1084 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1085 std::cout<<"Gathering global graph data took "<(gxadjlen)); │ │ │ │ │ +1103 increment = *(start-1); │ │ │ │ │ +1104 std::transform(start+offset, start+l+offset, start, std::bind(std:: │ │ │ │ │ +plus(), std::placeholders::_1, increment)); │ │ │ │ │ +1105 } │ │ │ │ │ +1106 Dune::dinfo<= 5 │ │ │ │ │ +1130 _M_e_t_i_s_:_:_i_d_x___t ncon = 1; │ │ │ │ │ +1131 _M_e_t_i_s_:_:_i_d_x___t moptions[METIS_NOPTIONS]; │ │ │ │ │ +1132 METIS_SetDefaultOptions(moptions); │ │ │ │ │ +1133 moptions[METIS_OPTION_NUMBERING] = numflag; │ │ │ │ │ +1134 METIS_PartGraphRecursive(&noVertices, &ncon, gxadj, gadjncy, gvwgt, NULL, │ │ │ │ │ +gadjwgt, │ │ │ │ │ +1135 &nparts, NULL, NULL, moptions, &edgecut, gpart); │ │ │ │ │ +1136#else │ │ │ │ │ +1137 int options[5] = {0, 1, 1, 3, 3}; │ │ │ │ │ +1138 // Call metis │ │ │ │ │ +1139 METIS_PartGraphRecursive(&noVertices, gxadj, gadjncy, gvwgt, gadjwgt, │ │ │ │ │ +&wgtflag, │ │ │ │ │ +1140 &numflag, &nparts, options, &edgecut, gpart); │ │ │ │ │ +1141#endif │ │ │ │ │ +1142 │ │ │ │ │ +1143 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1144 std::cout<<"METIS took "<::getType(), part, 1, │ │ │ │ │ +1159 MPITraits::getType(), 0, comm); │ │ │ │ │ +1160 │ │ │ │ │ +1161 { │ │ │ │ │ +1162 // release remaining memory │ │ │ │ │ +1163 delete[] gpart; │ │ │ │ │ +1164 delete[] noedges; │ │ │ │ │ +1165 delete[] displ; │ │ │ │ │ +1166 } │ │ │ │ │ +1167 │ │ │ │ │ +1168 │ │ │ │ │ +1169#endif │ │ │ │ │ +1170 delete[] xadj; │ │ │ │ │ +1171 delete[] vtxdist; │ │ │ │ │ +1172 delete[] adjncy; │ │ │ │ │ +1173#ifdef USE_WEIGHTS │ │ │ │ │ +1174 delete[] vwgt; │ │ │ │ │ +1175 delete[] adjwgt; │ │ │ │ │ +1176#endif │ │ │ │ │ +1177 delete[] tpwgts; │ │ │ │ │ +1178 } │ │ │ │ │ +1179 }else{ │ │ │ │ │ +1180 part[0]=0; │ │ │ │ │ +1181 } │ │ │ │ │ +1182#endif │ │ │ │ │ +1183 Dune::dinfo<<" repart "< "<< part[0]< realpart(_m_a_t.N(), part[0]); │ │ │ │ │ +1186 delete[] part; │ │ │ │ │ +1187 │ │ │ │ │ +1188 oocomm._c_o_p_y_O_w_n_e_r_T_o_A_l_l(realpart, realpart); │ │ │ │ │ +1189 │ │ │ │ │ +1190 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1191 std::cout<<"Scattering repartitioning took "< graph(const_cast(_m_a_t)); │ │ │ │ │ +1197 _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(graph, oocomm); │ │ │ │ │ +1198 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1199 std::cout<<"Filling index set took "< │ │ │ │ │ +_1_2_3_5 bool _g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(const G& graph, _D_u_n_e_:_: │ │ │ │ │ +_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, _M_e_t_i_s_:_:_i_d_x___t nparts, │ │ │ │ │ +1236 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ +1237 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& redistInf, │ │ │ │ │ +1238 bool verbose=false) │ │ │ │ │ +1239 { │ │ │ │ │ +1240 Timer time; │ │ │ │ │ +1241 │ │ │ │ │ +1242 MPI_Comm comm=oocomm._c_o_m_m_u_n_i_c_a_t_o_r(); │ │ │ │ │ +1243 oocomm._b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(graph.noVertices()); │ │ │ │ │ +1244 _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(graph, oocomm); │ │ │ │ │ +1245 │ │ │ │ │ +1246 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1247 std::cout<<"Filling holes took "<(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size())); │ │ │ │ │ +1262 │ │ │ │ │ +1263 int myDomain = -1; │ │ │ │ │ +1264 │ │ │ │ │ +1265 // │ │ │ │ │ +1266 // 1) Prepare the required parameters for using ParMETIS │ │ │ │ │ +1267 // Especially the arrays that represent the graph must be │ │ │ │ │ +1268 // generated by the DUNE Graph and IndexSet input variables. │ │ │ │ │ +1269 // These are the arrays: │ │ │ │ │ +1270 // - vtxdist │ │ │ │ │ +1271 // - xadj │ │ │ │ │ +1272 // - adjncy │ │ │ │ │ +1273 // │ │ │ │ │ +1274 // │ │ │ │ │ +1275#ifdef PERF_REPART │ │ │ │ │ +1276 // reset timer for step 1) │ │ │ │ │ +1277 t1=MPI_Wtime(); │ │ │ │ │ +1278#endif │ │ │ │ │ +1279 │ │ │ │ │ +1280 │ │ │ │ │ +1281 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> OOComm; │ │ │ │ │ +1282 typedef typename OOComm::OwnerSet OwnerSet; │ │ │ │ │ +1283 │ │ │ │ │ +1284 // Create the vtxdist array and parmetisVtxMapping. │ │ │ │ │ +1285 // Global communications are necessary │ │ │ │ │ +1286 // The parmetis global identifiers for the owner vertices. │ │ │ │ │ +1287 ParmetisDuneIndexMap indexMap(graph,oocomm); │ │ │ │ │ +1288 _M_e_t_i_s_:_:_i_d_x___t *part = new _M_e_t_i_s_:_:_i_d_x___t[indexMap.numOfOwnVtx()]; │ │ │ │ │ +1289 for(std::size_t i=0; i < indexMap.numOfOwnVtx(); ++i) │ │ │ │ │ +1290 part[i]=mype; │ │ │ │ │ +1291 │ │ │ │ │ +1292#if !HAVE_PARMETIS │ │ │ │ │ +1293 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0 && nparts>1) │ │ │ │ │ +1294 std::cerr<<"ParMETIS not activated. Will repartition to 1 domain instead │ │ │ │ │ +of requested " │ │ │ │ │ +1295 <1) { │ │ │ │ │ +1301 // Create the xadj and adjncy arrays │ │ │ │ │ +1302 _M_e_t_i_s_:_:_i_d_x___t *xadj = new _M_e_t_i_s_:_:_i_d_x___t[indexMap.numOfOwnVtx()+1]; │ │ │ │ │ +1303 _M_e_t_i_s_:_:_i_d_x___t *adjncy = new _M_e_t_i_s_:_:_i_d_x___t[graph.noEdges()]; │ │ │ │ │ +1304 EdgeFunctor ef(adjncy, indexMap, graph.noEdges()); │ │ │ │ │ +1305 getAdjArrays(graph, oocomm._g_l_o_b_a_l_L_o_o_k_u_p(), xadj, ef); │ │ │ │ │ +1306 │ │ │ │ │ +1307 // │ │ │ │ │ +1308 // 2) Call ParMETIS │ │ │ │ │ +1309 // │ │ │ │ │ +1310 // │ │ │ │ │ +1311 _M_e_t_i_s_:_:_i_d_x___t numflag=0, wgtflag=0, options[3], edgecut=0, ncon=1; │ │ │ │ │ +1312 //float *tpwgts = NULL; │ │ │ │ │ +1313 _M_e_t_i_s_:_:_r_e_a_l___t *tpwgts = new _M_e_t_i_s_:_:_r_e_a_l___t[nparts]; │ │ │ │ │ +1314 for(int i=0; i(comm)); │ │ │ │ │ +1358 │ │ │ │ │ +1359 │ │ │ │ │ +1360 delete[] xadj; │ │ │ │ │ +1361 delete[] adjncy; │ │ │ │ │ +1362 delete[] tpwgts; │ │ │ │ │ +1363 │ │ │ │ │ +1364 ef.free(); │ │ │ │ │ +1365 │ │ │ │ │ +1366#ifdef DEBUG_REPART │ │ │ │ │ +1367 if (mype == 0) { │ │ │ │ │ +1368 std::cout< domainMapping(nparts); │ │ │ │ │ +1410 if(nparts>1) │ │ │ │ │ +1411 getDomain(comm, part, indexMap.numOfOwnVtx(), nparts, &myDomain, │ │ │ │ │ +domainMapping); │ │ │ │ │ +1412 else │ │ │ │ │ +1413 domainMapping[0]=0; │ │ │ │ │ +1414 │ │ │ │ │ +1415#ifdef DEBUG_REPART │ │ │ │ │ +1416 std::cout< setPartition(oocomm._i_n_d_e_x_S_e_t().size(), -1); │ │ │ │ │ +1429 │ │ │ │ │ +1430 std::size_t i=0; // parmetis index │ │ │ │ │ +1431 for(auto index = oocomm._i_n_d_e_x_S_e_t().begin(); index != oocomm._i_n_d_e_x_S_e_t().end │ │ │ │ │ +(); ++index) │ │ │ │ │ +1432 if(OwnerSet::contains(index->local().attribute())) { │ │ │ │ │ +1433 setPartition[index->local()]=domainMapping[part[i++]]; │ │ │ │ │ +1434 } │ │ │ │ │ +1435 │ │ │ │ │ +1436 delete[] part; │ │ │ │ │ +1437 oocomm._c_o_p_y_O_w_n_e_r_T_o_A_l_l(setPartition, setPartition); │ │ │ │ │ +1438 // communication only needed for ALU │ │ │ │ │ +1439 // (ghosts with same global id as owners on the same process) │ │ │ │ │ +1440 if (SolverCategory::category(oocomm) == │ │ │ │ │ +1441 static_cast(SolverCategory::nonoverlapping)) │ │ │ │ │ +1442 oocomm._c_o_p_y_C_o_p_y_T_o_A_l_l(setPartition, setPartition); │ │ │ │ │ +1443 bool ret = _b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n(graph, setPartition, oocomm, outcomm, │ │ │ │ │ +redistInf, │ │ │ │ │ +1444 verbose); │ │ │ │ │ +1445 if(verbose) { │ │ │ │ │ +1446 oocomm._c_o_m_m_u_n_i_c_a_t_o_r().barrier(); │ │ │ │ │ +1447 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1448 std::cout<<"Creating indexsets took "< │ │ │ │ │ +_1_4_5_6 bool _b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n(const G& graph, │ │ │ │ │ +1457 std::vector& setPartition, _D_u_n_e_:_: │ │ │ │ │ +_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, │ │ │ │ │ +1458 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ +1459 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& redistInf, │ │ │ │ │ +1460 bool verbose) │ │ │ │ │ +1461 { │ │ │ │ │ +1462 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> OOComm; │ │ │ │ │ +1463 typedef typename OOComm::OwnerSet OwnerSet; │ │ │ │ │ +1464 │ │ │ │ │ +1465 Timer time; │ │ │ │ │ +1466 │ │ │ │ │ +1467 // Build the send interface │ │ │ │ │ +1468 redistInf._b_u_i_l_d_S_e_n_d_I_n_t_e_r_f_a_c_e(setPartition, oocomm._i_n_d_e_x_S_e_t()); │ │ │ │ │ +1469 │ │ │ │ │ +1470#ifdef PERF_REPART │ │ │ │ │ +1471 // stop the time for step 3) │ │ │ │ │ +1472 t3=MPI_Wtime()-t3; │ │ │ │ │ +1473 // reset timer for step 4) │ │ │ │ │ +1474 t4=MPI_Wtime(); │ │ │ │ │ +1475#endif │ │ │ │ │ +1476 │ │ │ │ │ +1477 │ │ │ │ │ +1478 // │ │ │ │ │ +1479 // 4) Create the output IndexSet and RemoteIndices │ │ │ │ │ +1480 // 4.1) Determine the "send to" and "receive from" relation │ │ │ │ │ +1481 // according to the new partition using a MPI ring │ │ │ │ │ +1482 // communication. │ │ │ │ │ +1483 // │ │ │ │ │ +1484 // 4.2) Depends on the "send to" and "receive from" vector, │ │ │ │ │ +1485 // the processes will exchange the vertices each other │ │ │ │ │ +1486 // │ │ │ │ │ +1487 // 4.3) Create the IndexSet, RemoteIndices and the new MPI │ │ │ │ │ +1488 // communicator │ │ │ │ │ +1489 // │ │ │ │ │ +1490 │ │ │ │ │ +1491 // │ │ │ │ │ +1492 // 4.1) Let's start... │ │ │ │ │ +1493 // │ │ │ │ │ +1494 int npes = oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size(); │ │ │ │ │ +1495 int *sendTo = 0; │ │ │ │ │ +1496 int noSendTo = 0; │ │ │ │ │ +1497 std::set recvFrom; │ │ │ │ │ +1498 │ │ │ │ │ +1499 // the max number of vertices is stored in the sendTo buffer, │ │ │ │ │ +1500 // not the number of vertices to send! Because the max number of Vtx │ │ │ │ │ +1501 // is used as the fixed buffer size by the MPI send/receive calls │ │ │ │ │ +1502 │ │ │ │ │ +1503 int mype = oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank(); │ │ │ │ │ +1504 │ │ │ │ │ +1505 { │ │ │ │ │ +1506 std::set tsendTo; │ │ │ │ │ +1507 for(auto i=setPartition.begin(), iend = setPartition.end(); i!=iend; ++i) │ │ │ │ │ +1508 tsendTo.insert(*i); │ │ │ │ │ +1509 │ │ │ │ │ +1510 noSendTo = tsendTo.size(); │ │ │ │ │ +1511 sendTo = new int[noSendTo]; │ │ │ │ │ +1512 int idx=0; │ │ │ │ │ +1513 for(auto i=tsendTo.begin(); i != tsendTo.end(); ++i, ++idx) │ │ │ │ │ +1514 sendTo[idx]=*i; │ │ │ │ │ +1515 } │ │ │ │ │ +1516 │ │ │ │ │ +1517 // │ │ │ │ │ +1518 int* gnoSend= new int[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()]; │ │ │ │ │ +1519 int* gsendToDispl = new int[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()+1]; │ │ │ │ │ +1520 │ │ │ │ │ +1521 MPI_Allgather(&noSendTo, 1, MPI_INT, gnoSend, 1, │ │ │ │ │ +1522 MPI_INT, oocomm._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +1523 │ │ │ │ │ +1524 // calculate total receive message size │ │ │ │ │ +1525 int totalNoRecv = 0; │ │ │ │ │ +1526 for(int i=0; i0; │ │ │ │ │ +1547 │ │ │ │ │ +1548 // Delete memory │ │ │ │ │ +1549 delete[] gnoSend; │ │ │ │ │ +1550 delete[] gsendToDispl; │ │ │ │ │ +1551 delete[] gsendTo; │ │ │ │ │ +1552 │ │ │ │ │ +1553 │ │ │ │ │ +1554#ifdef DEBUG_REPART │ │ │ │ │ +1555 if(recvFrom.size()) { │ │ │ │ │ +1556 std::cout< GlobalVector; │ │ │ │ │ +1589 std::vector > myOwnerVec; │ │ │ │ │ +1590 std::set myOverlapSet; │ │ │ │ │ +1591 GlobalVector sendOwnerVec; │ │ │ │ │ +1592 std::set sendOverlapSet; │ │ │ │ │ +1593 std::set myNeighbors; │ │ │ │ │ +1594 │ │ │ │ │ +1595 // getOwnerOverlapVec(graph, setPartition, oocomm.globalLookup │ │ │ │ │ +(), │ │ │ │ │ +1596 // mype, mype, myOwnerVec, myOverlapSet, redistInf, myNeighbors); │ │ │ │ │ +1597 │ │ │ │ │ +1598 char **sendBuffers=new char*[noSendTo]; │ │ │ │ │ +1599 MPI_Request *requests = new MPI_Request[noSendTo]; │ │ │ │ │ +1600 │ │ │ │ │ +1601 // Create all messages to be sent │ │ │ │ │ +1602 for(int i=0; i < noSendTo; ++i) { │ │ │ │ │ +1603 // clear the vector for sending │ │ │ │ │ +1604 sendOwnerVec.clear(); │ │ │ │ │ +1605 sendOverlapSet.clear(); │ │ │ │ │ +1606 // get all owner and overlap vertices for process j and save these │ │ │ │ │ +1607 // in the vectors sendOwnerVec and sendOverlapSet │ │ │ │ │ +1608 std::set neighbors; │ │ │ │ │ +1609 getOwnerOverlapVec(graph, setPartition, oocomm._g_l_o_b_a_l_L_o_o_k_u_p(), │ │ │ │ │ +1610 mype, sendTo[i], sendOwnerVec, sendOverlapSet, redistInf, │ │ │ │ │ +1611 neighbors); │ │ │ │ │ +1612 // +2, we need 2 integer more for the length of each part │ │ │ │ │ +1613 // (owner/overlap) of the array │ │ │ │ │ +1614 int buffersize=0; │ │ │ │ │ +1615 int tsize; │ │ │ │ │ +1616 MPI_Pack_size(1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), │ │ │ │ │ +&buffersize); │ │ │ │ │ +1617 MPI_Pack_size(sendOwnerVec.size(), MPITraits::getType(), │ │ │ │ │ +oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +1618 buffersize +=tsize; │ │ │ │ │ +1619 MPI_Pack_size(1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), │ │ │ │ │ +&tsize); │ │ │ │ │ +1620 buffersize +=tsize; │ │ │ │ │ +1621 MPI_Pack_size(sendOverlapSet.size(), MPITraits::getType(), │ │ │ │ │ +oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +1622 buffersize += tsize; │ │ │ │ │ +1623 MPI_Pack_size(1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), │ │ │ │ │ +&tsize); │ │ │ │ │ +1624 buffersize += tsize; │ │ │ │ │ +1625 MPI_Pack_size(neighbors.size(), MPI_INT, oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ +1626 buffersize += tsize; │ │ │ │ │ +1627 │ │ │ │ │ +1628 sendBuffers[i] = new char[buffersize]; │ │ │ │ │ +1629 │ │ │ │ │ +1630#ifdef DEBUG_REPART │ │ │ │ │ +1631 std::cout<0) { │ │ │ │ │ +1651 // probe for an incoming message │ │ │ │ │ +1652 MPI_Status stat; │ │ │ │ │ +1653 MPI_Probe(MPI_ANY_SOURCE, 99, oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &stat); │ │ │ │ │ +1654 int buffersize; │ │ │ │ │ +1655 MPI_Get_count(&stat, MPI_PACKED, &buffersize); │ │ │ │ │ +1656 │ │ │ │ │ +1657 if(oldbuffersize(outputComm,SolverCategory::category │ │ │ │ │ +(oocomm),true); │ │ │ │ │ +1727 │ │ │ │ │ +1728 // translate neighbor ranks. │ │ │ │ │ +1729 int newrank=outcomm->communicator().rank(); │ │ │ │ │ +1730 int *newranks=new int[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()]; │ │ │ │ │ +1731 std::vector tneighbors; │ │ │ │ │ +1732 tneighbors.reserve(myNeighbors.size()); │ │ │ │ │ +1733 │ │ │ │ │ +1734 typename OOComm::ParallelIndexSet& outputIndexSet = outcomm->indexSet(); │ │ │ │ │ +1735 │ │ │ │ │ +1736 MPI_Allgather(&newrank, 1, MPI_INT, newranks, 1, │ │ │ │ │ +1737 MPI_INT, oocomm._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ +1738 │ │ │ │ │ +1739#ifdef DEBUG_REPART │ │ │ │ │ +1740 std::cout<=0); │ │ │ │ │ +1744 std::cout<<*i<<"->"<first,LocalIndexT(i, OwnerOverlapCopyAttributeSet:: │ │ │ │ │ +owner, true)); │ │ │ │ │ +1777 redistInf._a_d_d_R_e_c_e_i_v_e_I_n_d_e_x(g->second, i); │ │ │ │ │ +1778 } │ │ │ │ │ +1779 │ │ │ │ │ +1780 if(verbose) { │ │ │ │ │ +1781 oocomm._c_o_m_m_u_n_i_c_a_t_o_r().barrier(); │ │ │ │ │ +1782 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1783 std::cout<<" Adding owner indices took "<< │ │ │ │ │ +1784 time.elapsed()<local().attribute())) { │ │ │ │ │ +1820 numOfOwnVtx++; │ │ │ │ │ +1821 } │ │ │ │ │ +1822 } │ │ │ │ │ +1823 numOfOwnVtx = oocomm._c_o_m_m_u_n_i_c_a_t_o_r().sum(numOfOwnVtx); │ │ │ │ │ +1824 // if(numOfOwnVtx!=indexMap.globalOwnerVertices) │ │ │ │ │ +1825 // { │ │ │ │ │ +1826 // std::cerr<remoteIndices().setNeighbours(tneighbors); │ │ │ │ │ +1844 outcomm->remoteIndices().template rebuild(); │ │ │ │ │ +1845 │ │ │ │ │ +1846 } │ │ │ │ │ +1847 │ │ │ │ │ +1848 // release the memory │ │ │ │ │ +1849 delete[] sendTo; │ │ │ │ │ +1850 │ │ │ │ │ +1851 if(verbose) { │ │ │ │ │ +1852 oocomm._c_o_m_m_u_n_i_c_a_t_o_r().barrier(); │ │ │ │ │ +1853 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ +1854 std::cout<<" Storing indexsets took "<< │ │ │ │ │ +1855 time.elapsed()< │ │ │ │ │ +1876 bool graphRepartition(const G& graph, P& oocomm, int nparts, │ │ │ │ │ +1877 std::shared_ptr

& outcomm, │ │ │ │ │ +1878 R& redistInf, │ │ │ │ │ +1879 bool v=false) │ │ │ │ │ +1880 { │ │ │ │ │ +1881 if(nparts!=oocomm.size()) │ │ │ │ │ +1882 DUNE_THROW(NotImplemented, "only available for MPI programs"); │ │ │ │ │ +1883 } │ │ │ │ │ +1884 │ │ │ │ │ +1885 │ │ │ │ │ +1886 template │ │ │ │ │ +1887 bool _c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(const G& graph, P& oocomm, int nparts, │ │ │ │ │ +1888 std::shared_ptr

& outcomm, │ │ │ │ │ +1889 R& redistInf, │ │ │ │ │ +1890 bool v=false) │ │ │ │ │ +1891 { │ │ │ │ │ +1892 if(nparts!=oocomm.size()) │ │ │ │ │ +1893 DUNE_THROW(NotImplemented, "only available for MPI programs"); │ │ │ │ │ +1894 } │ │ │ │ │ +1895#endif // HAVE_MPI │ │ │ │ │ +1896} // end of namespace Dune │ │ │ │ │ +1897#endif │ │ │ │ │ +_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ +Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ +_g_r_a_p_h_._h_h │ │ │ │ │ +Provides classes for building the matrix graph. │ │ │ │ │ +_g_l_o_b_a_l_O_w_n_e_r_V_e_r_t_i_c_e_s │ │ │ │ │ +int globalOwnerVertices │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:175 │ │ │ │ │ _m_a_t │ │ │ │ │ Matrix & mat │ │ │ │ │ DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ │ -PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ -VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ -Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ -DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -number of columns (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z │ │ │ │ │ -Sequential overlapping Schwarz preconditioner. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:755 │ │ │ │ │ -_D_u_n_e_:_:_S_e_q_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_A_s_s_e_m_b_l_e_r_H_e_l_p_e_r │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:694 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ -DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ -int iterations │ │ │ │ │ -Number of iterations. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ -bool converged │ │ │ │ │ -True if convergence criterion has been met. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ -Abstract base class for all solvers. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_U_n_s_u_p_p_o_r_t_e_d_T_y_p_e │ │ │ │ │ -DDeeffiinniittiioonn solverregistry.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -Whether this is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -whether the solver internally uses column compressed storage │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R │ │ │ │ │ -Use the SPQR package to directly solve linear systems – empty default class. │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:333 │ │ │ │ │ -_D_u_n_e_:_:_S_P_Q_R_C_r_e_a_t_o_r_:_:_i_s_V_a_l_i_d_B_l_o_c_k │ │ │ │ │ -DDeeffiinniittiioonn spqr.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +bool buildCommunication(const G &graph, std::vector< int > &realparts, Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > &oocomm, std::shared_ptr< Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ +&redistInf, bool verbose=false) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:1456 │ │ │ │ │ +_D_u_n_e_:_:_f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s │ │ │ │ │ +void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, │ │ │ │ │ +T2 > &oocomm) │ │ │ │ │ +Fills the holes in an index set. │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ +bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< │ │ │ │ │ +T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ +&redistInf, bool verbose=false) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:829 │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t___c_a_r_r_a_y │ │ │ │ │ +void print_carray(S &os, T *array, std::size_t l) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:778 │ │ │ │ │ +_D_u_n_e_:_:_i_s_V_a_l_i_d_G_r_a_p_h │ │ │ │ │ +bool isValidGraph(std::size_t noVtx, std::size_t gnoVtx, S noEdges, T *xadj, T │ │ │ │ │ +*adjncy, bool checkSymmetry) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:785 │ │ │ │ │ +_D_u_n_e_:_:_g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ +bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, │ │ │ │ │ +T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ +OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ +&redistInf, bool verbose=false) │ │ │ │ │ +execute a graph repartition for a giving graph and indexset. │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:1235 │ │ │ │ │ +_D_u_n_e_:_:_M_e_t_i_s_:_:_r_e_a_l___t │ │ │ │ │ +float real_t │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_M_e_t_i_s_:_:_i_d_x___t │ │ │ │ │ +std::size_t idx_t │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r │ │ │ │ │ +@ owner │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ +A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ +owner/overlap/copy sema... │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_g_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +const GlobalLookupIndexSet & globalLookup() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ +const ParallelIndexSet & indexSet() const │ │ │ │ │ +Get the underlying parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:462 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_C_o_p_y_T_o_A_l_l │ │ │ │ │ +void copyCopyToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from copy data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet │ │ │ │ │ +The type of the reverse lookup of indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:456 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void buildGlobalLookup() │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:495 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +const Communication< MPI_Comm > & communicator() const │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ +void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ +Communicate values from owner data points to all other data points. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ +const RemoteIndices & remoteIndices() const │ │ │ │ │ +Get the underlying remote indices. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ +void freeGlobalLookup() │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ +Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ +The type of the parallel index set. │ │ │ │ │ +DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ +The (undirected) graph of a matrix. │ │ │ │ │ +DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_r_e_s_e_r_v_e_S_p_a_c_e_F_o_r_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void reserveSpaceForReceiveInterface(int proc, int size) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_b_u_i_l_d_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildReceiveInterface(std::vector< std::pair< TG, int > > &indices) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_~_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ +~RedistributeInterface() │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_s_e_t_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ +void setCommunicator(MPI_Comm comm) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_b_u_i_l_d_S_e_n_d_I_n_t_e_r_f_a_c_e │ │ │ │ │ +void buildSendInterface(const std::vector< int > &toPart, const IS &idxset) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_a_d_d_R_e_c_e_i_v_e_I_n_d_e_x │ │ │ │ │ +void addReceiveIndex(int proc, std::size_t idx) │ │ │ │ │ +DDeeffiinniittiioonn repartition.hh:288 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00200.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bccsmatrixinitializer.hh File Reference │ │ │ │ +dune-istl: basearray.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,32 +71,37 @@ │ │ │ │

│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Namespaces
│ │ │ │ -
bccsmatrixinitializer.hh File Reference
│ │ │ │ +
basearray.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <limits>
│ │ │ │ -#include <set>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/scalarmatrixview.hh>
│ │ │ │ -#include <dune/istl/bccsmatrix.hh>
│ │ │ │ + │ │ │ │ +

Implements several basic array containers. │ │ │ │ +More...

│ │ │ │ +
#include "assert.h"
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │
.
dune-istl 2.9.0< │ │ │ │ -000004a0: 2f73 7061 6e3e 0a20 2020 3c2f 6469 763e /span>.
│ │ │ │ -000004b0: 0a20 203c 2f74 643e 0a20 3c2f 7472 3e0a .
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ISTL
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Implements several basic array containers.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,21 +1,24 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -bccsmatrixinitializer.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +basearray.hh File Reference │ │ │ │ │ +Implements several basic array containers. _M_o_r_e_._._. │ │ │ │ │ +#include "assert.h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_t_i_o_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_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_I_S_T_L │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Implements several basic array containers. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bccsmatrixinitializer.hh Source File │ │ │ │ +dune-istl: basearray.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,335 +74,427 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
bccsmatrixinitializer.hh
│ │ │ │ +
basearray.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
│ │ │ │ -
6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_BASEARRAY_HH
│ │ │ │ +
6#define DUNE_ISTL_BASEARRAY_HH
│ │ │ │
7
│ │ │ │ -
8#include <limits>
│ │ │ │ -
9#include <set>
│ │ │ │ -
10
│ │ │ │ -
11#include <dune/common/typetraits.hh>
│ │ │ │ -
12#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
8#include "assert.h"
│ │ │ │ +
9#include <cmath>
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <memory>
│ │ │ │ +
12#include <algorithm>
│ │ │ │
13
│ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16namespace Dune
│ │ │ │ -
17{
│ │ │ │ -
18 template<class I, class S, class D>
│ │ │ │ -
19 class OverlappingSchwarzInitializer;
│ │ │ │ -
20}
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune::ISTL::Impl
│ │ │ │ -
23{
│ │ │ │ -
31 template<class M, class S>
│ │ │ │ -
32 class MatrixRowSubset
│ │ │ │ -
33 {
│ │ │ │ -
34 public:
│ │ │ │ -
36 typedef M Matrix;
│ │ │ │ -
38 typedef S RowIndexSet;
│ │ │ │ -
39
│ │ │ │ -
45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s)
│ │ │ │ -
46 : m_(m), s_(s)
│ │ │ │ -
47 {}
│ │ │ │ -
48
│ │ │ │ -
49 const Matrix& matrix() const
│ │ │ │ -
50 {
│ │ │ │ -
51 return m_;
│ │ │ │ -
52 }
│ │ │ │ -
53
│ │ │ │ -
54 const RowIndexSet& rowIndexSet() const
│ │ │ │ -
55 {
│ │ │ │ -
56 return s_;
│ │ │ │ -
57 }
│ │ │ │ -
58
│ │ │ │ -
60 class const_iterator
│ │ │ │ -
61 : public ForwardIteratorFacade<const_iterator, const typename Matrix::row_type>
│ │ │ │ -
62 {
│ │ │ │ -
63 public:
│ │ │ │ -
64 const_iterator(typename Matrix::const_iterator firstRow,
│ │ │ │ -
65 typename RowIndexSet::const_iterator pos)
│ │ │ │ -
66 : firstRow_(firstRow), pos_(pos)
│ │ │ │ -
67 {}
│ │ │ │ +
14#include "istlexception.hh"
│ │ │ │ +
15#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
16
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
22
│ │ │ │ +
24namespace Imp {
│ │ │ │ +
25
│ │ │ │ +
50 template<class B, class A=std::allocator<B> >
│ │ │ │ +
51 class base_array_unmanaged
│ │ │ │ +
52 {
│ │ │ │ +
53 public:
│ │ │ │ +
54
│ │ │ │ +
55 //===== type definitions and constants
│ │ │ │ +
56
│ │ │ │ +
58 typedef B member_type;
│ │ │ │ +
59
│ │ │ │ +
61 typedef A allocator_type;
│ │ │ │ +
62
│ │ │ │ +
64 typedef typename A::size_type size_type;
│ │ │ │ +
65
│ │ │ │ +
67 using reference = B&;
│ │ │ │
68
│ │ │ │ -
69
│ │ │ │ -
70 const typename Matrix::row_type& dereference() const
│ │ │ │ -
71 {
│ │ │ │ -
72 return *(firstRow_+ *pos_);
│ │ │ │ -
73 }
│ │ │ │ -
74 bool equals(const const_iterator& o) const
│ │ │ │ -
75 {
│ │ │ │ -
76 return pos_==o.pos_;
│ │ │ │ -
77 }
│ │ │ │ -
78 void increment()
│ │ │ │ -
79 {
│ │ │ │ -
80 ++pos_;
│ │ │ │ -
81 }
│ │ │ │ -
82 typename RowIndexSet::value_type index() const
│ │ │ │ -
83 {
│ │ │ │ -
84 return *pos_;
│ │ │ │ -
85 }
│ │ │ │ -
86
│ │ │ │ -
87 private:
│ │ │ │ -
89 typename Matrix::const_iterator firstRow_;
│ │ │ │ -
91 typename RowIndexSet::const_iterator pos_;
│ │ │ │ -
92 };
│ │ │ │ -
93
│ │ │ │ -
95 const_iterator begin() const
│ │ │ │ -
96 {
│ │ │ │ -
97 return const_iterator(m_.begin(), s_.begin());
│ │ │ │ -
98 }
│ │ │ │ -
100 const_iterator end() const
│ │ │ │ -
101 {
│ │ │ │ -
102 return const_iterator(m_.begin(), s_.end());
│ │ │ │ -
103 }
│ │ │ │ -
104
│ │ │ │ -
105 private:
│ │ │ │ -
107 const Matrix& m_;
│ │ │ │ -
109 const RowIndexSet& s_;
│ │ │ │ -
110 };
│ │ │ │ -
111
│ │ │ │ -
118 template<class M, class I = typename M::size_type>
│ │ │ │ -
119 class BCCSMatrixInitializer
│ │ │ │ -
120 {
│ │ │ │ -
121 template<class IList, class S, class D>
│ │ │ │ - │ │ │ │ -
123 public:
│ │ │ │ -
124 using Matrix = M;
│ │ │ │ -
125 using Index = I;
│ │ │ │ -
126 typedef Dune::ISTL::Impl::BCCSMatrix<typename Matrix::field_type, I> OutputMatrix;
│ │ │ │ -
127 typedef typename Matrix::size_type size_type;
│ │ │ │ -
128
│ │ │ │ -
131 BCCSMatrixInitializer(OutputMatrix& mat_)
│ │ │ │ -
132 : mat(&mat_), cols(mat_.M())
│ │ │ │ -
133 {
│ │ │ │ -
134 if constexpr (Dune::IsNumber<typename M::block_type>::value)
│ │ │ │ -
135 {
│ │ │ │ -
136 n = m = 1;
│ │ │ │ -
137 }
│ │ │ │ -
138 else
│ │ │ │ -
139 {
│ │ │ │ -
140 // WARNING: This assumes that all blocks are dense and identical
│ │ │ │ -
141 n = M::block_type::rows;
│ │ │ │ -
142 m = M::block_type::cols;
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ -
145 mat->Nnz_=0;
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
148 BCCSMatrixInitializer()
│ │ │ │ -
149 : mat(0), cols(0), n(0), m(0)
│ │ │ │ -
150 {}
│ │ │ │ -
151
│ │ │ │ -
152 virtual ~BCCSMatrixInitializer()
│ │ │ │ -
153 {}
│ │ │ │ -
154
│ │ │ │ -
155 template<typename Iter>
│ │ │ │ -
156 void addRowNnz(const Iter& row) const
│ │ │ │ -
157 {
│ │ │ │ -
158 mat->Nnz_+=row->getsize();
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ -
161 template<typename Iter, typename FullMatrixIndex>
│ │ │ │ -
162 void addRowNnz(const Iter& row, const std::set<FullMatrixIndex>& indices) const
│ │ │ │ -
163 {
│ │ │ │ -
164 auto siter =indices.begin();
│ │ │ │ -
165 for (auto entry=row->begin(); entry!=row->end(); ++entry)
│ │ │ │ -
166 {
│ │ │ │ -
167 for(; siter!=indices.end() && *siter<entry.index(); ++siter) ;
│ │ │ │ -
168 if(siter==indices.end())
│ │ │ │ -
169 break;
│ │ │ │ -
170 if(*siter==entry.index())
│ │ │ │ -
171 // index is in subdomain
│ │ │ │ -
172 ++mat->Nnz_;
│ │ │ │ -
173 }
│ │ │ │ -
174 }
│ │ │ │ -
175
│ │ │ │ -
176 template<typename Iter, typename SubMatrixIndex>
│ │ │ │ -
177 void addRowNnz(const Iter& row, const std::vector<SubMatrixIndex>& indices) const
│ │ │ │ -
178 {
│ │ │ │ -
179 for (auto entry=row->begin(); entry!=row->end(); ++entry)
│ │ │ │ -
180 if (indices[entry.index()]!=std::numeric_limits<SubMatrixIndex>::max())
│ │ │ │ -
181 ++mat->Nnz_;
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
184 void allocate()
│ │ │ │ -
185 {
│ │ │ │ -
186 allocateMatrixStorage();
│ │ │ │ -
187 allocateMarker();
│ │ │ │ -
188 }
│ │ │ │ -
189
│ │ │ │ -
190 template<typename Iter, typename CIter>
│ │ │ │ -
191 void countEntries([[maybe_unused]] const Iter& row, const CIter& col) const
│ │ │ │ -
192 {
│ │ │ │ -
193 countEntries(col.index());
│ │ │ │ -
194 }
│ │ │ │ -
195
│ │ │ │ -
196 void countEntries(size_type colindex) const
│ │ │ │ -
197 {
│ │ │ │ -
198 for(size_type i=0; i < m; ++i)
│ │ │ │ -
199 {
│ │ │ │ -
200 assert(colindex*m+i<cols);
│ │ │ │ -
201 marker[colindex*m+i]+=n;
│ │ │ │ -
202 }
│ │ │ │ -
203 }
│ │ │ │ -
204
│ │ │ │ -
205 void calcColstart() const
│ │ │ │ -
206 {
│ │ │ │ -
207 mat->colstart[0]=0;
│ │ │ │ -
208 for(size_type i=0; i < cols; ++i) {
│ │ │ │ -
209 assert(i<cols);
│ │ │ │ -
210 mat->colstart[i+1]=mat->colstart[i]+marker[i];
│ │ │ │ -
211 marker[i]=mat->colstart[i];
│ │ │ │ -
212 }
│ │ │ │ -
213 }
│ │ │ │ -
214
│ │ │ │ -
215 template<typename Iter, typename CIter>
│ │ │ │ -
216 void copyValue(const Iter& row, const CIter& col) const
│ │ │ │ -
217 {
│ │ │ │ -
218 copyValue(col, row.index(), col.index());
│ │ │ │ -
219 }
│ │ │ │ -
220
│ │ │ │ -
221 template<typename CIter>
│ │ │ │ -
222 void copyValue(const CIter& col, size_type rowindex, size_type colindex) const
│ │ │ │ -
223 {
│ │ │ │ -
224 for(size_type i=0; i<n; i++) {
│ │ │ │ -
225 for(size_type j=0; j<m; j++) {
│ │ │ │ -
226 assert(colindex*m+j<cols-1 || (size_type)marker[colindex*m+j]<(size_type)mat->colstart[colindex*m+j+1]);
│ │ │ │ -
227 assert((size_type)marker[colindex*m+j]<mat->Nnz_);
│ │ │ │ -
228 mat->rowindex[marker[colindex*m+j]]=rowindex*n+i;
│ │ │ │ -
229 mat->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*col)[i][j];
│ │ │ │ -
230 ++marker[colindex*m+j]; // index for next entry in column
│ │ │ │ -
231 }
│ │ │ │ -
232 }
│ │ │ │ +
70 using const_reference = const B&;
│ │ │ │ +
71
│ │ │ │ +
72 //===== access to components
│ │ │ │ +
73
│ │ │ │ +
75 reference operator[] (size_type i)
│ │ │ │ +
76 {
│ │ │ │ +
77#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
78 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
79#endif
│ │ │ │ +
80 return p[i];
│ │ │ │ +
81 }
│ │ │ │ +
82
│ │ │ │ +
84 const_reference operator[] (size_type i) const
│ │ │ │ +
85 {
│ │ │ │ +
86#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
87 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ +
88#endif
│ │ │ │ +
89 return p[i];
│ │ │ │ +
90 }
│ │ │ │ +
91
│ │ │ │ +
93 template<class T>
│ │ │ │ +
94 class RealIterator
│ │ │ │ +
95 : public RandomAccessIteratorFacade<RealIterator<T>, T>
│ │ │ │ +
96 {
│ │ │ │ +
97 public:
│ │ │ │ +
99 typedef typename std::remove_const<T>::type ValueType;
│ │ │ │ +
100
│ │ │ │ +
101 friend class RandomAccessIteratorFacade<RealIterator<const ValueType>, const ValueType>;
│ │ │ │ +
102 friend class RandomAccessIteratorFacade<RealIterator<ValueType>, ValueType>;
│ │ │ │ +
103 friend class RealIterator<const ValueType>;
│ │ │ │ +
104 friend class RealIterator<ValueType>;
│ │ │ │ +
105
│ │ │ │ +
107 RealIterator ()
│ │ │ │ +
108 : p(0), i(0)
│ │ │ │ +
109 {}
│ │ │ │ +
110
│ │ │ │ +
111 RealIterator (const B* _p, B* _i) : p(_p), i(_i)
│ │ │ │ +
112 { }
│ │ │ │ +
113
│ │ │ │ +
114 RealIterator(const RealIterator<ValueType>& it)
│ │ │ │ +
115 : p(it.p), i(it.i)
│ │ │ │ +
116 {}
│ │ │ │ +
117
│ │ │ │ +
119 size_type index () const
│ │ │ │ +
120 {
│ │ │ │ +
121 return i-p;
│ │ │ │ +
122 }
│ │ │ │ +
123
│ │ │ │ +
125 bool equals (const RealIterator<ValueType>& other) const
│ │ │ │ +
126 {
│ │ │ │ +
127 assert(other.p==p);
│ │ │ │ +
128 return i==other.i;
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
132 bool equals (const RealIterator<const ValueType>& other) const
│ │ │ │ +
133 {
│ │ │ │ +
134 assert(other.p==p);
│ │ │ │ +
135 return i==other.i;
│ │ │ │ +
136 }
│ │ │ │ +
137
│ │ │ │ +
138 std::ptrdiff_t distanceTo(const RealIterator& o) const
│ │ │ │ +
139 {
│ │ │ │ +
140 return o.i-i;
│ │ │ │ +
141 }
│ │ │ │ +
142
│ │ │ │ +
143 private:
│ │ │ │ +
145 void increment()
│ │ │ │ +
146 {
│ │ │ │ +
147 ++i;
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ +
151 void decrement()
│ │ │ │ +
152 {
│ │ │ │ +
153 --i;
│ │ │ │ +
154 }
│ │ │ │ +
155
│ │ │ │ +
156 // Needed for operator[] of the iterator
│ │ │ │ +
157 reference elementAt (std::ptrdiff_t offset) const
│ │ │ │ +
158 {
│ │ │ │ +
159 return *(i+offset);
│ │ │ │ +
160 }
│ │ │ │ +
161
│ │ │ │ +
163 reference dereference () const
│ │ │ │ +
164 {
│ │ │ │ +
165 return *i;
│ │ │ │ +
166 }
│ │ │ │ +
167
│ │ │ │ +
168 void advance(std::ptrdiff_t d)
│ │ │ │ +
169 {
│ │ │ │ +
170 i+=d;
│ │ │ │ +
171 }
│ │ │ │ +
172
│ │ │ │ +
173 const B* p;
│ │ │ │ +
174 B* i;
│ │ │ │ +
175 };
│ │ │ │ +
176
│ │ │ │ +
178 typedef RealIterator<B> iterator;
│ │ │ │ +
179
│ │ │ │ +
180
│ │ │ │ +
182 iterator begin ()
│ │ │ │ +
183 {
│ │ │ │ +
184 return iterator(p,p);
│ │ │ │ +
185 }
│ │ │ │ +
186
│ │ │ │ +
188 iterator end ()
│ │ │ │ +
189 {
│ │ │ │ +
190 return iterator(p,p+n);
│ │ │ │ +
191 }
│ │ │ │ +
192
│ │ │ │ +
195 iterator beforeEnd ()
│ │ │ │ +
196 {
│ │ │ │ +
197 return iterator(p,p+n-1);
│ │ │ │ +
198 }
│ │ │ │ +
199
│ │ │ │ +
202 iterator beforeBegin ()
│ │ │ │ +
203 {
│ │ │ │ +
204 return iterator(p,p-1);
│ │ │ │ +
205 }
│ │ │ │ +
206
│ │ │ │ +
208 iterator find (size_type i)
│ │ │ │ +
209 {
│ │ │ │ +
210 return iterator(p,p+std::min(i,n));
│ │ │ │ +
211 }
│ │ │ │ +
212
│ │ │ │ +
214 typedef RealIterator<const B> const_iterator;
│ │ │ │ +
215
│ │ │ │ +
217 const_iterator begin () const
│ │ │ │ +
218 {
│ │ │ │ +
219 return const_iterator(p,p+0);
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ +
223 const_iterator end () const
│ │ │ │ +
224 {
│ │ │ │ +
225 return const_iterator(p,p+n);
│ │ │ │ +
226 }
│ │ │ │ +
227
│ │ │ │ +
230 const_iterator beforeEnd () const
│ │ │ │ +
231 {
│ │ │ │ +
232 return const_iterator(p,p+n-1);
│ │ │ │
233 }
│ │ │ │
234
│ │ │ │ -
235 virtual void createMatrix() const
│ │ │ │ -
236 {
│ │ │ │ -
237 marker.clear();
│ │ │ │ -
238 }
│ │ │ │ -
239
│ │ │ │ -
240 protected:
│ │ │ │ +
237 const_iterator beforeBegin () const
│ │ │ │ +
238 {
│ │ │ │ +
239 return const_iterator(p,p-1);
│ │ │ │ +
240 }
│ │ │ │
241
│ │ │ │ -
242 void allocateMatrixStorage() const
│ │ │ │ -
243 {
│ │ │ │ -
244 mat->Nnz_*=n*m;
│ │ │ │ -
245 // initialize data
│ │ │ │ -
246 mat->values=new typename M::field_type[mat->Nnz_];
│ │ │ │ -
247 mat->rowindex=new I[mat->Nnz_];
│ │ │ │ -
248 mat->colstart=new I[cols+1];
│ │ │ │ -
249 }
│ │ │ │ +
243 const_iterator find (size_type i) const
│ │ │ │ +
244 {
│ │ │ │ +
245 return const_iterator(p,p+std::min(i,n));
│ │ │ │ +
246 }
│ │ │ │ +
247
│ │ │ │ +
248
│ │ │ │ +
249 //===== sizes
│ │ │ │
250
│ │ │ │ -
251 void allocateMarker()
│ │ │ │ -
252 {
│ │ │ │ -
253 marker.resize(cols);
│ │ │ │ -
254 std::fill(marker.begin(), marker.end(), 0);
│ │ │ │ +
252 size_type size () const
│ │ │ │ +
253 {
│ │ │ │ +
254 return n;
│ │ │ │
255 }
│ │ │ │
256
│ │ │ │ -
257 OutputMatrix* mat;
│ │ │ │ -
258 size_type cols;
│ │ │ │ -
259
│ │ │ │ -
260 // Number of rows/columns of the matrix entries
│ │ │ │ -
261 // (assumed to be scalars or dense matrices)
│ │ │ │ -
262 size_type n, m;
│ │ │ │ -
263
│ │ │ │ -
264 mutable std::vector<size_type> marker;
│ │ │ │ -
265 };
│ │ │ │ -
266
│ │ │ │ -
267 template<class F, class Matrix>
│ │ │ │ -
268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix)
│ │ │ │ -
269 {
│ │ │ │ -
270 for (auto row=matrix.begin(); row!= matrix.end(); ++row)
│ │ │ │ -
271 initializer.addRowNnz(row);
│ │ │ │ -
272
│ │ │ │ -
273 initializer.allocate();
│ │ │ │ -
274
│ │ │ │ -
275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
│ │ │ │ -
276
│ │ │ │ -
277 for (auto col=row->begin(); col != row->end(); ++col)
│ │ │ │ -
278 initializer.countEntries(row, col);
│ │ │ │ -
279 }
│ │ │ │ -
280
│ │ │ │ -
281 initializer.calcColstart();
│ │ │ │ +
258 const B* data() const
│ │ │ │ +
259 {
│ │ │ │ +
260 return p;
│ │ │ │ +
261 }
│ │ │ │ +
262
│ │ │ │ +
264 B* data()
│ │ │ │ +
265 {
│ │ │ │ +
266 return p;
│ │ │ │ +
267 }
│ │ │ │ +
268
│ │ │ │ +
269 protected:
│ │ │ │ +
271 base_array_unmanaged ()
│ │ │ │ +
272 : n(0), p(0)
│ │ │ │ +
273 {}
│ │ │ │ +
275 base_array_unmanaged (size_type n_, B* p_)
│ │ │ │ +
276 : n(n_), p(p_)
│ │ │ │ +
277 {}
│ │ │ │ +
278 size_type n; // number of elements in array
│ │ │ │ +
279 B *p; // pointer to dynamically allocated built-in array
│ │ │ │ +
280 };
│ │ │ │ +
281
│ │ │ │
282
│ │ │ │ -
283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
│ │ │ │ -
284 for (auto col=row->begin(); col != row->end(); ++col) {
│ │ │ │ -
285 initializer.copyValue(row, col);
│ │ │ │ -
286 }
│ │ │ │ -
287
│ │ │ │ -
288 }
│ │ │ │ -
289 initializer.createMatrix();
│ │ │ │ -
290 }
│ │ │ │ -
291
│ │ │ │ -
292 template<class F, class M,class S>
│ │ │ │ -
293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset<M,S>& mrs)
│ │ │ │ -
294 {
│ │ │ │ -
295 typedef MatrixRowSubset<M,S> MRS;
│ │ │ │ -
296 typedef typename MRS::RowIndexSet SIS;
│ │ │ │ -
297 typedef typename SIS::const_iterator SIter;
│ │ │ │ -
298 typedef typename MRS::const_iterator Iter;
│ │ │ │ -
299 typedef typename std::iterator_traits<Iter>::value_type row_type;
│ │ │ │ -
300 typedef typename row_type::const_iterator CIter;
│ │ │ │ -
301
│ │ │ │ -
302 typedef typename MRS::Matrix::size_type size_type;
│ │ │ │ -
303
│ │ │ │ -
304 // A vector containing the corresponding indices in
│ │ │ │ -
305 // the to create submatrix.
│ │ │ │ -
306 // If an entry is the maximum of size_type then this index will not appear in
│ │ │ │ -
307 // the submatrix.
│ │ │ │ -
308 std::vector<size_type> subMatrixIndex(mrs.matrix().N(),
│ │ │ │ -
309 std::numeric_limits<size_type>::max());
│ │ │ │ -
310 size_type s=0;
│ │ │ │ -
311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end(); ++index)
│ │ │ │ -
312 subMatrixIndex[*index]=s++;
│ │ │ │ -
313
│ │ │ │ -
314 // Calculate upper Bound for nonzeros
│ │ │ │ -
315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
│ │ │ │ -
316 initializer.addRowNnz(row, subMatrixIndex);
│ │ │ │ +
283
│ │ │ │ +
305 template<class B, class A=std::allocator<B> >
│ │ │ │ +
306 class compressed_base_array_unmanaged
│ │ │ │ +
307 {
│ │ │ │ +
308 public:
│ │ │ │ +
309
│ │ │ │ +
310 //===== type definitions and constants
│ │ │ │ +
311
│ │ │ │ +
313 typedef B member_type;
│ │ │ │ +
314
│ │ │ │ +
316 typedef A allocator_type;
│ │ │ │
317
│ │ │ │ -
318 initializer.allocate();
│ │ │ │ -
319
│ │ │ │ -
320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
│ │ │ │ -
321 for(CIter col=row->begin(); col != row->end(); ++col) {
│ │ │ │ -
322 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
│ │ │ │ -
323 // This column is in our subset (use submatrix column index)
│ │ │ │ -
324 initializer.countEntries(subMatrixIndex[col.index()]);
│ │ │ │ -
325 }
│ │ │ │ +
319 typedef typename A::size_type size_type;
│ │ │ │ +
320
│ │ │ │ +
322 using reference = B&;
│ │ │ │ +
323
│ │ │ │ +
325 using const_reference = const B&;
│ │ │ │
326
│ │ │ │ -
327 initializer.calcColstart();
│ │ │ │ +
327 //===== access to components
│ │ │ │
328
│ │ │ │ -
329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
│ │ │ │ -
330 for(CIter col=row->begin(); col != row->end(); ++col) {
│ │ │ │ -
331 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
│ │ │ │ -
332 // This value is in our submatrix -> copy (use submatrix indices
│ │ │ │ -
333 initializer.copyValue(col, subMatrixIndex[row.index()], subMatrixIndex[col.index()]);
│ │ │ │ -
334 }
│ │ │ │ -
335 initializer.createMatrix();
│ │ │ │ -
336 }
│ │ │ │ +
330 reference operator[] (size_type i)
│ │ │ │ +
331 {
│ │ │ │ +
332 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ +
333 if (lb == j+n || *lb != i)
│ │ │ │ +
334 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
│ │ │ │ +
335 return p[lb-j];
│ │ │ │ +
336 }
│ │ │ │
337
│ │ │ │ -
338}
│ │ │ │ -
339#endif
│ │ │ │ - │ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ -
std::size_t countEntries(const BlockVector< T, A > &vector)
Definition matrixmarket.hh:1076
│ │ │ │ +
339 const_reference operator[] (size_type i) const
│ │ │ │ +
340 {
│ │ │ │ +
341 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ +
342 if (lb == j+n || *lb != i)
│ │ │ │ +
343 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
│ │ │ │ +
344 return p[lb-j];
│ │ │ │ +
345 }
│ │ │ │ +
346
│ │ │ │ +
348 template<class T>
│ │ │ │ +
349 class RealIterator
│ │ │ │ +
350 : public BidirectionalIteratorFacade<RealIterator<T>, T>
│ │ │ │ +
351 {
│ │ │ │ +
352 public:
│ │ │ │ +
354 typedef typename std::remove_const<T>::type ValueType;
│ │ │ │ +
355
│ │ │ │ +
356 friend class BidirectionalIteratorFacade<RealIterator<const ValueType>, const ValueType>;
│ │ │ │ +
357 friend class BidirectionalIteratorFacade<RealIterator<ValueType>, ValueType>;
│ │ │ │ +
358 friend class RealIterator<const ValueType>;
│ │ │ │ +
359 friend class RealIterator<ValueType>;
│ │ │ │ +
360
│ │ │ │ +
362 RealIterator ()
│ │ │ │ +
363 : p(0), j(0), i(0)
│ │ │ │ +
364 {}
│ │ │ │ +
365
│ │ │ │ +
367 RealIterator (B* _p, size_type* _j, size_type _i)
│ │ │ │ +
368 : p(_p), j(_j), i(_i)
│ │ │ │ +
369 { }
│ │ │ │ +
370
│ │ │ │ +
374 RealIterator(const RealIterator<ValueType>& it)
│ │ │ │ +
375 : p(it.p), j(it.j), i(it.i)
│ │ │ │ +
376 {}
│ │ │ │ +
377
│ │ │ │ +
378
│ │ │ │ +
380 bool equals (const RealIterator<ValueType>& it) const
│ │ │ │ +
381 {
│ │ │ │ +
382 assert(p==it.p);
│ │ │ │ +
383 return (i)==(it.i);
│ │ │ │ +
384 }
│ │ │ │ +
385
│ │ │ │ +
387 bool equals (const RealIterator<const ValueType>& it) const
│ │ │ │ +
388 {
│ │ │ │ +
389 assert(p==it.p);
│ │ │ │ +
390 return (i)==(it.i);
│ │ │ │ +
391 }
│ │ │ │ +
392
│ │ │ │ +
393
│ │ │ │ +
395 size_type index () const
│ │ │ │ +
396 {
│ │ │ │ +
397 return j[i];
│ │ │ │ +
398 }
│ │ │ │ +
399
│ │ │ │ +
401 void setindex (size_type k)
│ │ │ │ +
402 {
│ │ │ │ +
403 return j[i] = k;
│ │ │ │ +
404 }
│ │ │ │ +
405
│ │ │ │ +
413 size_type offset () const
│ │ │ │ +
414 {
│ │ │ │ +
415 return i;
│ │ │ │ +
416 }
│ │ │ │ +
417
│ │ │ │ +
418 private:
│ │ │ │ +
420 void increment()
│ │ │ │ +
421 {
│ │ │ │ +
422 ++i;
│ │ │ │ +
423 }
│ │ │ │ +
424
│ │ │ │ +
426 void decrement()
│ │ │ │ +
427 {
│ │ │ │ +
428 --i;
│ │ │ │ +
429 }
│ │ │ │ +
430
│ │ │ │ +
432 reference dereference () const
│ │ │ │ +
433 {
│ │ │ │ +
434 return p[i];
│ │ │ │ +
435 }
│ │ │ │ +
436
│ │ │ │ +
437 B* p;
│ │ │ │ +
438 size_type* j;
│ │ │ │ +
439 size_type i;
│ │ │ │ +
440 };
│ │ │ │ +
441
│ │ │ │ +
443 typedef RealIterator<B> iterator;
│ │ │ │ +
444
│ │ │ │ +
446 iterator begin ()
│ │ │ │ +
447 {
│ │ │ │ +
448 return iterator(p,j,0);
│ │ │ │ +
449 }
│ │ │ │ +
450
│ │ │ │ +
452 iterator end ()
│ │ │ │ +
453 {
│ │ │ │ +
454 return iterator(p,j,n);
│ │ │ │ +
455 }
│ │ │ │ +
456
│ │ │ │ +
459 iterator beforeEnd ()
│ │ │ │ +
460 {
│ │ │ │ +
461 return iterator(p,j,n-1);
│ │ │ │ +
462 }
│ │ │ │ +
463
│ │ │ │ +
466 iterator beforeBegin ()
│ │ │ │ +
467 {
│ │ │ │ +
468 return iterator(p,j,-1);
│ │ │ │ +
469 }
│ │ │ │ +
470
│ │ │ │ +
472 iterator find (size_type i)
│ │ │ │ +
473 {
│ │ │ │ +
474 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ +
475 return (lb != j+n && *lb == i)
│ │ │ │ +
476 ? iterator(p,j,lb-j)
│ │ │ │ +
477 : end();
│ │ │ │ +
478 }
│ │ │ │ +
479
│ │ │ │ +
481 typedef RealIterator<const B> const_iterator;
│ │ │ │ +
482
│ │ │ │ +
484 const_iterator begin () const
│ │ │ │ +
485 {
│ │ │ │ +
486 return const_iterator(p,j,0);
│ │ │ │ +
487 }
│ │ │ │ +
488
│ │ │ │ +
490 const_iterator end () const
│ │ │ │ +
491 {
│ │ │ │ +
492 return const_iterator(p,j,n);
│ │ │ │ +
493 }
│ │ │ │ +
494
│ │ │ │ +
497 const_iterator beforeEnd () const
│ │ │ │ +
498 {
│ │ │ │ +
499 return const_iterator(p,j,n-1);
│ │ │ │ +
500 }
│ │ │ │ +
501
│ │ │ │ +
504 const_iterator beforeBegin () const
│ │ │ │ +
505 {
│ │ │ │ +
506 return const_iterator(p,j,-1);
│ │ │ │ +
507 }
│ │ │ │ +
508
│ │ │ │ +
510 const_iterator find (size_type i) const
│ │ │ │ +
511 {
│ │ │ │ +
512 const size_type* lb = std::lower_bound(j, j+n, i);
│ │ │ │ +
513 return (lb != j+n && *lb == i)
│ │ │ │ +
514 ? const_iterator(p,j,lb-j)
│ │ │ │ +
515 : end();
│ │ │ │ +
516 }
│ │ │ │ +
517
│ │ │ │ +
518 //===== sizes
│ │ │ │ +
519
│ │ │ │ +
521 size_type size () const
│ │ │ │ +
522 {
│ │ │ │ +
523 return n;
│ │ │ │ +
524 }
│ │ │ │ +
525
│ │ │ │ +
526 protected:
│ │ │ │ +
528 compressed_base_array_unmanaged ()
│ │ │ │ +
529 : n(0), p(0), j(0)
│ │ │ │ +
530 {}
│ │ │ │ +
531
│ │ │ │ +
532 size_type n; // number of elements in array
│ │ │ │ +
533 B *p; // pointer to dynamically allocated built-in array
│ │ │ │ +
534 size_type* j; // the index set
│ │ │ │ +
535 };
│ │ │ │ +
536
│ │ │ │ +
537} // end namespace Imp
│ │ │ │ +
538
│ │ │ │ +
539} // end namespace
│ │ │ │ +
540
│ │ │ │ +
541#endif
│ │ │ │ + │ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Initializer for SuperLU Matrices representing the subdomains.
Definition overlappingschwarz.hh:47
│ │ │ │ -
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ -
MatrixImp::DenseMatrixBase< T, A >::window_type row_type
The type implementing a matrix row.
Definition matrix.hh:574
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,353 +1,426 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -bccsmatrixinitializer.hh │ │ │ │ │ +basearray.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH │ │ │ │ │ -6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_BASEARRAY_HH │ │ │ │ │ +6#define DUNE_ISTL_BASEARRAY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +8#include "assert.h" │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include <_d_u_n_e_/_i_s_t_l_/_b_c_c_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e │ │ │ │ │ -17{ │ │ │ │ │ -18 template │ │ │ │ │ -19 class OverlappingSchwarzInitializer; │ │ │ │ │ -20} │ │ │ │ │ -21 │ │ │ │ │ -22namespace Dune::ISTL::Impl │ │ │ │ │ -23{ │ │ │ │ │ -31 template │ │ │ │ │ -32 class MatrixRowSubset │ │ │ │ │ -33 { │ │ │ │ │ -34 public: │ │ │ │ │ -36 typedef M Matrix; │ │ │ │ │ -38 typedef S RowIndexSet; │ │ │ │ │ -39 │ │ │ │ │ -45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s) │ │ │ │ │ -46 : m_(m), s_(s) │ │ │ │ │ -47 {} │ │ │ │ │ -48 │ │ │ │ │ -49 const Matrix& matrix() const │ │ │ │ │ -50 { │ │ │ │ │ -51 return m_; │ │ │ │ │ -52 } │ │ │ │ │ -53 │ │ │ │ │ -54 const RowIndexSet& rowIndexSet() const │ │ │ │ │ -55 { │ │ │ │ │ -56 return s_; │ │ │ │ │ -57 } │ │ │ │ │ -58 │ │ │ │ │ -60 class const_iterator │ │ │ │ │ -61 : public ForwardIteratorFacade │ │ │ │ │ -62 { │ │ │ │ │ -63 public: │ │ │ │ │ -64 const_iterator(typename Matrix::const_iterator firstRow, │ │ │ │ │ -65 typename RowIndexSet::const_iterator pos) │ │ │ │ │ -66 : firstRow_(firstRow), pos_(pos) │ │ │ │ │ -67 {} │ │ │ │ │ +14#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +21namespace _D_u_n_e { │ │ │ │ │ +22 │ │ │ │ │ +24namespace Imp { │ │ │ │ │ +25 │ │ │ │ │ +50 template > │ │ │ │ │ +51 class base_array_unmanaged │ │ │ │ │ +52 { │ │ │ │ │ +53 public: │ │ │ │ │ +54 │ │ │ │ │ +55 //===== type definitions and constants │ │ │ │ │ +56 │ │ │ │ │ +58 typedef B member_type; │ │ │ │ │ +59 │ │ │ │ │ +61 typedef A allocator_type; │ │ │ │ │ +62 │ │ │ │ │ +64 typedef typename A::size_type size_type; │ │ │ │ │ +65 │ │ │ │ │ +67 using reference = B&; │ │ │ │ │ 68 │ │ │ │ │ -69 │ │ │ │ │ -70 const typename _M_a_t_r_i_x_:_:_r_o_w___t_y_p_e& dereference() const │ │ │ │ │ -71 { │ │ │ │ │ -72 return *(firstRow_+ *pos_); │ │ │ │ │ -73 } │ │ │ │ │ -74 bool equals(const const_iterator& o) const │ │ │ │ │ -75 { │ │ │ │ │ -76 return pos_==o.pos_; │ │ │ │ │ -77 } │ │ │ │ │ -78 void increment() │ │ │ │ │ -79 { │ │ │ │ │ -80 ++pos_; │ │ │ │ │ +70 using const_reference = const B&; │ │ │ │ │ +71 │ │ │ │ │ +72 //===== access to components │ │ │ │ │ +73 │ │ │ │ │ +75 reference operator[] (size_type i) │ │ │ │ │ +76 { │ │ │ │ │ +77#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +78 if (i>=n) DUNE_THROW(ISTLError,"index out of range"); │ │ │ │ │ +79#endif │ │ │ │ │ +80 return p[i]; │ │ │ │ │ 81 } │ │ │ │ │ -82 typename RowIndexSet::value_type index() const │ │ │ │ │ -83 { │ │ │ │ │ -84 return *pos_; │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -87 private: │ │ │ │ │ -89 typename Matrix::const_iterator firstRow_; │ │ │ │ │ -91 typename RowIndexSet::const_iterator pos_; │ │ │ │ │ -92 }; │ │ │ │ │ -93 │ │ │ │ │ -95 const_iterator begin() const │ │ │ │ │ +82 │ │ │ │ │ +84 const_reference operator[] (size_type i) const │ │ │ │ │ +85 { │ │ │ │ │ +86#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +87 if (i>=n) DUNE_THROW(ISTLError,"index out of range"); │ │ │ │ │ +88#endif │ │ │ │ │ +89 return p[i]; │ │ │ │ │ +90 } │ │ │ │ │ +91 │ │ │ │ │ +93 template │ │ │ │ │ +94 class RealIterator │ │ │ │ │ +95 : public RandomAccessIteratorFacade, T> │ │ │ │ │ 96 { │ │ │ │ │ -97 return const_iterator(m_.begin(), s_.begin()); │ │ │ │ │ -98 } │ │ │ │ │ -100 const_iterator end() const │ │ │ │ │ -101 { │ │ │ │ │ -102 return const_iterator(m_.begin(), s_.end()); │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -105 private: │ │ │ │ │ -107 const Matrix& m_; │ │ │ │ │ -109 const RowIndexSet& s_; │ │ │ │ │ -110 }; │ │ │ │ │ -111 │ │ │ │ │ -118 template │ │ │ │ │ -119 class BCCSMatrixInitializer │ │ │ │ │ +97 public: │ │ │ │ │ +99 typedef typename std::remove_const::type ValueType; │ │ │ │ │ +100 │ │ │ │ │ +101 friend class RandomAccessIteratorFacade, │ │ │ │ │ +const ValueType>; │ │ │ │ │ +102 friend class RandomAccessIteratorFacade, │ │ │ │ │ +ValueType>; │ │ │ │ │ +103 friend class RealIterator; │ │ │ │ │ +104 friend class RealIterator; │ │ │ │ │ +105 │ │ │ │ │ +107 RealIterator () │ │ │ │ │ +108 : p(0), i(0) │ │ │ │ │ +109 {} │ │ │ │ │ +110 │ │ │ │ │ +111 RealIterator (const B* _p, B* _i) : p(_p), i(_i) │ │ │ │ │ +112 { } │ │ │ │ │ +113 │ │ │ │ │ +114 RealIterator(const RealIterator& it) │ │ │ │ │ +115 : p(it.p), i(it.i) │ │ │ │ │ +116 {} │ │ │ │ │ +117 │ │ │ │ │ +119 size_type index () const │ │ │ │ │ 120 { │ │ │ │ │ -121 template │ │ │ │ │ -122 friend class _D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r; │ │ │ │ │ -123 public: │ │ │ │ │ -124 using Matrix = M; │ │ │ │ │ -125 using Index = I; │ │ │ │ │ -126 typedef Dune::ISTL::Impl::BCCSMatrix │ │ │ │ │ -OutputMatrix; │ │ │ │ │ -127 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e size_type; │ │ │ │ │ -128 │ │ │ │ │ -131 BCCSMatrixInitializer(OutputMatrix& mat_) │ │ │ │ │ -132 : _m_a_t(&mat_), cols(mat_.M()) │ │ │ │ │ +121 return i-p; │ │ │ │ │ +122 } │ │ │ │ │ +123 │ │ │ │ │ +125 bool equals (const RealIterator& other) const │ │ │ │ │ +126 { │ │ │ │ │ +127 assert(other.p==p); │ │ │ │ │ +128 return i==other.i; │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +132 bool equals (const RealIterator& other) const │ │ │ │ │ 133 { │ │ │ │ │ -134 if constexpr (Dune::IsNumber::value) │ │ │ │ │ -135 { │ │ │ │ │ -136 n = m = 1; │ │ │ │ │ -137 } │ │ │ │ │ -138 else │ │ │ │ │ +134 assert(other.p==p); │ │ │ │ │ +135 return i==other.i; │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +138 std::ptrdiff_t distanceTo(const RealIterator& o) const │ │ │ │ │ 139 { │ │ │ │ │ -140 // WARNING: This assumes that all blocks are dense and identical │ │ │ │ │ -141 n = M::block_type::rows; │ │ │ │ │ -142 m = M::block_type::cols; │ │ │ │ │ -143 } │ │ │ │ │ -144 │ │ │ │ │ -145 _m_a_t->Nnz_=0; │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -148 BCCSMatrixInitializer() │ │ │ │ │ -149 : _m_a_t(0), cols(0), n(0), m(0) │ │ │ │ │ -150 {} │ │ │ │ │ -151 │ │ │ │ │ -152 virtual ~BCCSMatrixInitializer() │ │ │ │ │ -153 {} │ │ │ │ │ -154 │ │ │ │ │ -155 template │ │ │ │ │ -156 void addRowNnz(const Iter& row) const │ │ │ │ │ -157 { │ │ │ │ │ -158 _m_a_t->Nnz_+=row->getsize(); │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -161 template │ │ │ │ │ -162 void addRowNnz(const Iter& row, const std::set& indices) │ │ │ │ │ -const │ │ │ │ │ -163 { │ │ │ │ │ -164 auto siter =indices.begin(); │ │ │ │ │ -165 for (auto entry=row->begin(); entry!=row->end(); ++entry) │ │ │ │ │ -166 { │ │ │ │ │ -167 for(; siter!=indices.end() && *siterNnz_; │ │ │ │ │ -173 } │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -176 template │ │ │ │ │ -177 void addRowNnz(const Iter& row, const std::vector& indices) │ │ │ │ │ -const │ │ │ │ │ -178 { │ │ │ │ │ -179 for (auto entry=row->begin(); entry!=row->end(); ++entry) │ │ │ │ │ -180 if (indices[entry.index()]!=std::numeric_limits::max()) │ │ │ │ │ -181 ++_m_a_t->Nnz_; │ │ │ │ │ -182 } │ │ │ │ │ -183 │ │ │ │ │ -184 void allocate() │ │ │ │ │ -185 { │ │ │ │ │ -186 allocateMatrixStorage(); │ │ │ │ │ -187 allocateMarker(); │ │ │ │ │ -188 } │ │ │ │ │ -189 │ │ │ │ │ -190 template │ │ │ │ │ -191 void _c_o_u_n_t_E_n_t_r_i_e_s([[maybe_unused]] const Iter& row, const CIter& _c_o_l) const │ │ │ │ │ -192 { │ │ │ │ │ -193 _c_o_u_n_t_E_n_t_r_i_e_s(_c_o_l.index()); │ │ │ │ │ -194 } │ │ │ │ │ -195 │ │ │ │ │ -196 void _c_o_u_n_t_E_n_t_r_i_e_s(size_type colindex) const │ │ │ │ │ -197 { │ │ │ │ │ -198 for(size_type i=0; i < m; ++i) │ │ │ │ │ -199 { │ │ │ │ │ -200 assert(colindex*m+icolstart[0]=0; │ │ │ │ │ -208 for(size_type i=0; i < cols; ++i) { │ │ │ │ │ -209 assert(icolstart[i+1]=_m_a_t->colstart[i]+marker[i]; │ │ │ │ │ -211 marker[i]=_m_a_t->colstart[i]; │ │ │ │ │ -212 } │ │ │ │ │ -213 } │ │ │ │ │ -214 │ │ │ │ │ -215 template │ │ │ │ │ -216 void copyValue(const Iter& row, const CIter& _c_o_l) const │ │ │ │ │ -217 { │ │ │ │ │ -218 copyValue(_c_o_l, row.index(), _c_o_l.index()); │ │ │ │ │ -219 } │ │ │ │ │ -220 │ │ │ │ │ -221 template │ │ │ │ │ -222 void copyValue(const CIter& _c_o_l, size_type rowindex, size_type colindex) │ │ │ │ │ -const │ │ │ │ │ -223 { │ │ │ │ │ -224 for(size_type i=0; icolstart[colindex*m+j+1]); │ │ │ │ │ -227 assert((size_type)marker[colindex*m+j]<_m_a_t->Nnz_); │ │ │ │ │ -228 _m_a_t->rowindex[marker[colindex*m+j]]=rowindex*n+i; │ │ │ │ │ -229 _m_a_t->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*_c_o_l)[i][j]; │ │ │ │ │ -230 ++marker[colindex*m+j]; // index for next entry in column │ │ │ │ │ -231 } │ │ │ │ │ -232 } │ │ │ │ │ +140 return o.i-i; │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +143 private: │ │ │ │ │ +145 void increment() │ │ │ │ │ +146 { │ │ │ │ │ +147 ++i; │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +151 void decrement() │ │ │ │ │ +152 { │ │ │ │ │ +153 --i; │ │ │ │ │ +154 } │ │ │ │ │ +155 │ │ │ │ │ +156 // Needed for operator[] of the iterator │ │ │ │ │ +157 reference elementAt (std::ptrdiff_t offset) const │ │ │ │ │ +158 { │ │ │ │ │ +159 return *(i+offset); │ │ │ │ │ +160 } │ │ │ │ │ +161 │ │ │ │ │ +163 reference dereference () const │ │ │ │ │ +164 { │ │ │ │ │ +165 return *i; │ │ │ │ │ +166 } │ │ │ │ │ +167 │ │ │ │ │ +168 void advance(std::ptrdiff_t d) │ │ │ │ │ +169 { │ │ │ │ │ +170 i+=d; │ │ │ │ │ +171 } │ │ │ │ │ +172 │ │ │ │ │ +173 const B* p; │ │ │ │ │ +174 B* i; │ │ │ │ │ +175 }; │ │ │ │ │ +176 │ │ │ │ │ +178 typedef RealIterator iterator; │ │ │ │ │ +179 │ │ │ │ │ +180 │ │ │ │ │ +182 iterator begin () │ │ │ │ │ +183 { │ │ │ │ │ +184 return iterator(p,p); │ │ │ │ │ +185 } │ │ │ │ │ +186 │ │ │ │ │ +188 iterator end () │ │ │ │ │ +189 { │ │ │ │ │ +190 return iterator(p,p+n); │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +195 iterator beforeEnd () │ │ │ │ │ +196 { │ │ │ │ │ +197 return iterator(p,p+n-1); │ │ │ │ │ +198 } │ │ │ │ │ +199 │ │ │ │ │ +202 iterator beforeBegin () │ │ │ │ │ +203 { │ │ │ │ │ +204 return iterator(p,p-1); │ │ │ │ │ +205 } │ │ │ │ │ +206 │ │ │ │ │ +208 iterator find (size_type i) │ │ │ │ │ +209 { │ │ │ │ │ +210 return iterator(p,p+std::min(i,n)); │ │ │ │ │ +211 } │ │ │ │ │ +212 │ │ │ │ │ +214 typedef RealIterator const_iterator; │ │ │ │ │ +215 │ │ │ │ │ +217 const_iterator begin () const │ │ │ │ │ +218 { │ │ │ │ │ +219 return const_iterator(p,p+0); │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +223 const_iterator end () const │ │ │ │ │ +224 { │ │ │ │ │ +225 return const_iterator(p,p+n); │ │ │ │ │ +226 } │ │ │ │ │ +227 │ │ │ │ │ +230 const_iterator beforeEnd () const │ │ │ │ │ +231 { │ │ │ │ │ +232 return const_iterator(p,p+n-1); │ │ │ │ │ 233 } │ │ │ │ │ 234 │ │ │ │ │ -235 virtual void createMatrix() const │ │ │ │ │ -236 { │ │ │ │ │ -237 marker.clear(); │ │ │ │ │ -238 } │ │ │ │ │ -239 │ │ │ │ │ -240 protected: │ │ │ │ │ +237 const_iterator beforeBegin () const │ │ │ │ │ +238 { │ │ │ │ │ +239 return const_iterator(p,p-1); │ │ │ │ │ +240 } │ │ │ │ │ 241 │ │ │ │ │ -242 void allocateMatrixStorage() const │ │ │ │ │ -243 { │ │ │ │ │ -244 _m_a_t->Nnz_*=n*m; │ │ │ │ │ -245 // initialize data │ │ │ │ │ -246 _m_a_t->values=new typename M::field_type[_m_a_t->Nnz_]; │ │ │ │ │ -247 _m_a_t->rowindex=new I[_m_a_t->Nnz_]; │ │ │ │ │ -248 _m_a_t->colstart=new I[cols+1]; │ │ │ │ │ -249 } │ │ │ │ │ +243 const_iterator find (size_type i) const │ │ │ │ │ +244 { │ │ │ │ │ +245 return const_iterator(p,p+std::min(i,n)); │ │ │ │ │ +246 } │ │ │ │ │ +247 │ │ │ │ │ +248 │ │ │ │ │ +249 //===== sizes │ │ │ │ │ 250 │ │ │ │ │ -251 void allocateMarker() │ │ │ │ │ -252 { │ │ │ │ │ -253 marker.resize(cols); │ │ │ │ │ -254 std::fill(marker.begin(), marker.end(), 0); │ │ │ │ │ +252 size_type size () const │ │ │ │ │ +253 { │ │ │ │ │ +254 return n; │ │ │ │ │ 255 } │ │ │ │ │ 256 │ │ │ │ │ -257 OutputMatrix* _m_a_t; │ │ │ │ │ -258 size_type cols; │ │ │ │ │ -259 │ │ │ │ │ -260 // Number of rows/columns of the matrix entries │ │ │ │ │ -261 // (assumed to be scalars or dense matrices) │ │ │ │ │ -262 size_type n, m; │ │ │ │ │ -263 │ │ │ │ │ -264 mutable std::vector marker; │ │ │ │ │ -265 }; │ │ │ │ │ -266 │ │ │ │ │ -267 template │ │ │ │ │ -268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix) │ │ │ │ │ -269 { │ │ │ │ │ -270 for (auto row=matrix.begin(); row!= matrix.end(); ++row) │ │ │ │ │ -271 initializer.addRowNnz(row); │ │ │ │ │ -272 │ │ │ │ │ -273 initializer.allocate(); │ │ │ │ │ -274 │ │ │ │ │ -275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) { │ │ │ │ │ -276 │ │ │ │ │ -277 for (auto _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) │ │ │ │ │ -278 initializer.countEntries(row, _c_o_l); │ │ │ │ │ -279 } │ │ │ │ │ -280 │ │ │ │ │ -281 initializer.calcColstart(); │ │ │ │ │ +258 const B* data() const │ │ │ │ │ +259 { │ │ │ │ │ +260 return p; │ │ │ │ │ +261 } │ │ │ │ │ +262 │ │ │ │ │ +264 B* data() │ │ │ │ │ +265 { │ │ │ │ │ +266 return p; │ │ │ │ │ +267 } │ │ │ │ │ +268 │ │ │ │ │ +269 protected: │ │ │ │ │ +271 base_array_unmanaged () │ │ │ │ │ +272 : n(0), p(0) │ │ │ │ │ +273 {} │ │ │ │ │ +275 base_array_unmanaged (size_type n_, B* p_) │ │ │ │ │ +276 : n(n_), p(p_) │ │ │ │ │ +277 {} │ │ │ │ │ +278 size_type n; // number of elements in array │ │ │ │ │ +279 B *p; // pointer to dynamically allocated built-in array │ │ │ │ │ +280 }; │ │ │ │ │ +281 │ │ │ │ │ 282 │ │ │ │ │ -283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) { │ │ │ │ │ -284 for (auto _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) { │ │ │ │ │ -285 initializer.copyValue(row, _c_o_l); │ │ │ │ │ -286 } │ │ │ │ │ -287 │ │ │ │ │ -288 } │ │ │ │ │ -289 initializer.createMatrix(); │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -292 template │ │ │ │ │ -293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset& mrs) │ │ │ │ │ -294 { │ │ │ │ │ -295 typedef MatrixRowSubset MRS; │ │ │ │ │ -296 typedef typename MRS::RowIndexSet SIS; │ │ │ │ │ -297 typedef typename SIS::const_iterator SIter; │ │ │ │ │ -298 typedef typename MRS::const_iterator Iter; │ │ │ │ │ -299 typedef typename std::iterator_traits::value_type row_type; │ │ │ │ │ -300 typedef typename row_type::const_iterator CIter; │ │ │ │ │ -301 │ │ │ │ │ -302 typedef typename MRS::Matrix::size_type size_type; │ │ │ │ │ -303 │ │ │ │ │ -304 // A vector containing the corresponding indices in │ │ │ │ │ -305 // the to create submatrix. │ │ │ │ │ -306 // If an entry is the maximum of size_type then this index will not appear │ │ │ │ │ -in │ │ │ │ │ -307 // the submatrix. │ │ │ │ │ -308 std::vector subMatrixIndex(mrs.matrix().N(), │ │ │ │ │ -309 std::numeric_limits::max()); │ │ │ │ │ -310 size_type s=0; │ │ │ │ │ -311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end │ │ │ │ │ -(); ++index) │ │ │ │ │ -312 subMatrixIndex[*index]=s++; │ │ │ │ │ -313 │ │ │ │ │ -314 // Calculate upper Bound for nonzeros │ │ │ │ │ -315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row) │ │ │ │ │ -316 initializer.addRowNnz(row, subMatrixIndex); │ │ │ │ │ +283 │ │ │ │ │ +305 template > │ │ │ │ │ +306 class compressed_base_array_unmanaged │ │ │ │ │ +307 { │ │ │ │ │ +308 public: │ │ │ │ │ +309 │ │ │ │ │ +310 //===== type definitions and constants │ │ │ │ │ +311 │ │ │ │ │ +313 typedef B member_type; │ │ │ │ │ +314 │ │ │ │ │ +316 typedef A allocator_type; │ │ │ │ │ 317 │ │ │ │ │ -318 initializer.allocate(); │ │ │ │ │ -319 │ │ │ │ │ -320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row) │ │ │ │ │ -321 for(CIter _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) { │ │ │ │ │ -322 if(subMatrixIndex[_c_o_l.index()]!=std::numeric_limits::max()) │ │ │ │ │ -323 // This column is in our subset (use submatrix column index) │ │ │ │ │ -324 initializer.countEntries(subMatrixIndex[_c_o_l.index()]); │ │ │ │ │ -325 } │ │ │ │ │ +319 typedef typename A::size_type size_type; │ │ │ │ │ +320 │ │ │ │ │ +322 using reference = B&; │ │ │ │ │ +323 │ │ │ │ │ +325 using const_reference = const B&; │ │ │ │ │ 326 │ │ │ │ │ -327 initializer.calcColstart(); │ │ │ │ │ +327 //===== access to components │ │ │ │ │ 328 │ │ │ │ │ -329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row) │ │ │ │ │ -330 for(CIter _c_o_l=row->begin(); _c_o_l != row->end(); ++_c_o_l) { │ │ │ │ │ -331 if(subMatrixIndex[_c_o_l.index()]!=std::numeric_limits::max()) │ │ │ │ │ -332 // This value is in our submatrix -> copy (use submatrix indices │ │ │ │ │ -333 initializer.copyValue(_c_o_l, subMatrixIndex[row.index()], subMatrixIndex │ │ │ │ │ -[_c_o_l.index()]); │ │ │ │ │ -334 } │ │ │ │ │ -335 initializer.createMatrix(); │ │ │ │ │ +330 reference operator[] (size_type i) │ │ │ │ │ +331 { │ │ │ │ │ +332 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ +333 if (lb == j+n || *lb != i) │ │ │ │ │ +334 DUNE_THROW(ISTLError,"index "< &vector) │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1076 │ │ │ │ │ +339 const_reference operator[] (size_type i) const │ │ │ │ │ +340 { │ │ │ │ │ +341 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ +342 if (lb == j+n || *lb != i) │ │ │ │ │ +343 DUNE_THROW(ISTLError,"index "< │ │ │ │ │ +349 class RealIterator │ │ │ │ │ +350 : public BidirectionalIteratorFacade, T> │ │ │ │ │ +351 { │ │ │ │ │ +352 public: │ │ │ │ │ +354 typedef typename std::remove_const::type ValueType; │ │ │ │ │ +355 │ │ │ │ │ +356 friend class BidirectionalIteratorFacade, │ │ │ │ │ +const ValueType>; │ │ │ │ │ +357 friend class BidirectionalIteratorFacade, │ │ │ │ │ +ValueType>; │ │ │ │ │ +358 friend class RealIterator; │ │ │ │ │ +359 friend class RealIterator; │ │ │ │ │ +360 │ │ │ │ │ +362 RealIterator () │ │ │ │ │ +363 : p(0), j(0), i(0) │ │ │ │ │ +364 {} │ │ │ │ │ +365 │ │ │ │ │ +367 RealIterator (B* _p, size_type* _j, size_type _i) │ │ │ │ │ +368 : p(_p), j(_j), i(_i) │ │ │ │ │ +369 { } │ │ │ │ │ +370 │ │ │ │ │ +374 RealIterator(const RealIterator& it) │ │ │ │ │ +375 : p(it.p), j(it.j), i(it.i) │ │ │ │ │ +376 {} │ │ │ │ │ +377 │ │ │ │ │ +378 │ │ │ │ │ +380 bool equals (const RealIterator& it) const │ │ │ │ │ +381 { │ │ │ │ │ +382 assert(p==it.p); │ │ │ │ │ +383 return (i)==(it.i); │ │ │ │ │ +384 } │ │ │ │ │ +385 │ │ │ │ │ +387 bool equals (const RealIterator& it) const │ │ │ │ │ +388 { │ │ │ │ │ +389 assert(p==it.p); │ │ │ │ │ +390 return (i)==(it.i); │ │ │ │ │ +391 } │ │ │ │ │ +392 │ │ │ │ │ +393 │ │ │ │ │ +395 size_type index () const │ │ │ │ │ +396 { │ │ │ │ │ +397 return j[i]; │ │ │ │ │ +398 } │ │ │ │ │ +399 │ │ │ │ │ +401 void setindex (size_type k) │ │ │ │ │ +402 { │ │ │ │ │ +403 return j[i] = k; │ │ │ │ │ +404 } │ │ │ │ │ +405 │ │ │ │ │ +413 size_type offset () const │ │ │ │ │ +414 { │ │ │ │ │ +415 return i; │ │ │ │ │ +416 } │ │ │ │ │ +417 │ │ │ │ │ +418 private: │ │ │ │ │ +420 void increment() │ │ │ │ │ +421 { │ │ │ │ │ +422 ++i; │ │ │ │ │ +423 } │ │ │ │ │ +424 │ │ │ │ │ +426 void decrement() │ │ │ │ │ +427 { │ │ │ │ │ +428 --i; │ │ │ │ │ +429 } │ │ │ │ │ +430 │ │ │ │ │ +432 reference dereference () const │ │ │ │ │ +433 { │ │ │ │ │ +434 return p[i]; │ │ │ │ │ +435 } │ │ │ │ │ +436 │ │ │ │ │ +437 B* p; │ │ │ │ │ +438 size_type* j; │ │ │ │ │ +439 size_type i; │ │ │ │ │ +440 }; │ │ │ │ │ +441 │ │ │ │ │ +443 typedef RealIterator iterator; │ │ │ │ │ +444 │ │ │ │ │ +446 iterator begin () │ │ │ │ │ +447 { │ │ │ │ │ +448 return iterator(p,j,0); │ │ │ │ │ +449 } │ │ │ │ │ +450 │ │ │ │ │ +452 iterator end () │ │ │ │ │ +453 { │ │ │ │ │ +454 return iterator(p,j,n); │ │ │ │ │ +455 } │ │ │ │ │ +456 │ │ │ │ │ +459 iterator beforeEnd () │ │ │ │ │ +460 { │ │ │ │ │ +461 return iterator(p,j,n-1); │ │ │ │ │ +462 } │ │ │ │ │ +463 │ │ │ │ │ +466 iterator beforeBegin () │ │ │ │ │ +467 { │ │ │ │ │ +468 return iterator(p,j,-1); │ │ │ │ │ +469 } │ │ │ │ │ +470 │ │ │ │ │ +472 iterator find (size_type i) │ │ │ │ │ +473 { │ │ │ │ │ +474 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ +475 return (lb != j+n && *lb == i) │ │ │ │ │ +476 ? iterator(p,j,lb-j) │ │ │ │ │ +477 : end(); │ │ │ │ │ +478 } │ │ │ │ │ +479 │ │ │ │ │ +481 typedef RealIterator const_iterator; │ │ │ │ │ +482 │ │ │ │ │ +484 const_iterator begin () const │ │ │ │ │ +485 { │ │ │ │ │ +486 return const_iterator(p,j,0); │ │ │ │ │ +487 } │ │ │ │ │ +488 │ │ │ │ │ +490 const_iterator end () const │ │ │ │ │ +491 { │ │ │ │ │ +492 return const_iterator(p,j,n); │ │ │ │ │ +493 } │ │ │ │ │ +494 │ │ │ │ │ +497 const_iterator beforeEnd () const │ │ │ │ │ +498 { │ │ │ │ │ +499 return const_iterator(p,j,n-1); │ │ │ │ │ +500 } │ │ │ │ │ +501 │ │ │ │ │ +504 const_iterator beforeBegin () const │ │ │ │ │ +505 { │ │ │ │ │ +506 return const_iterator(p,j,-1); │ │ │ │ │ +507 } │ │ │ │ │ +508 │ │ │ │ │ +510 const_iterator find (size_type i) const │ │ │ │ │ +511 { │ │ │ │ │ +512 const size_type* lb = std::lower_bound(j, j+n, i); │ │ │ │ │ +513 return (lb != j+n && *lb == i) │ │ │ │ │ +514 ? const_iterator(p,j,lb-j) │ │ │ │ │ +515 : end(); │ │ │ │ │ +516 } │ │ │ │ │ +517 │ │ │ │ │ +518 //===== sizes │ │ │ │ │ +519 │ │ │ │ │ +521 size_type size () const │ │ │ │ │ +522 { │ │ │ │ │ +523 return n; │ │ │ │ │ +524 } │ │ │ │ │ +525 │ │ │ │ │ +526 protected: │ │ │ │ │ +528 compressed_base_array_unmanaged () │ │ │ │ │ +529 : n(0), p(0), j(0) │ │ │ │ │ +530 {} │ │ │ │ │ +531 │ │ │ │ │ +532 size_type n; // number of elements in array │ │ │ │ │ +533 B *p; // pointer to dynamically allocated built-in array │ │ │ │ │ +534 size_type* j; // the index set │ │ │ │ │ +535 }; │ │ │ │ │ +536 │ │ │ │ │ +537} // end namespace Imp │ │ │ │ │ +538 │ │ │ │ │ +539} // end namespace │ │ │ │ │ +540 │ │ │ │ │ +541#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_O_v_e_r_l_a_p_p_i_n_g_S_c_h_w_a_r_z_I_n_i_t_i_a_l_i_z_e_r │ │ │ │ │ -Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ │ -DDeeffiinniittiioonn overlappingschwarz.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -Type for indices and sizes. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -MatrixImp::DenseMatrixBase< T, A >::window_type row_type │ │ │ │ │ -The type implementing a matrix row. │ │ │ │ │ -DDeeffiinniittiioonn matrix.hh:574 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00203.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: vbvector.hh File Reference │ │ │ │ +dune-istl: ilusubdomainsolver.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,51 +72,48 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
vbvector.hh File Reference
│ │ │ │ +
ilusubdomainsolver.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

??? │ │ │ │ +

Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include "bvector.hh"
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ +
#include <map>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/istl/preconditioners.hh>
│ │ │ │ +#include "matrix.hh"
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cstdlib>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::VariableBlockVector< B, A >
 A Vector of blocks with different blocksizes. More...
class  Dune::ILUSubdomainSolver< M, X, Y >
 base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver. More...
 
class  Dune::VariableBlockVector< B, A >::CreateIterator
 Iterator class for sequential creation of blocks. More...
class  Dune::ILU0SubdomainSolver< M, X, Y >
 Exact subdomain solver using ILU(p) with appropriate p. More...
 
class  Dune::VariableBlockVector< B, A >::RealIterator< T, R >
 Iterator class for sequential access. More...
class  Dune::ILUNSubdomainSolver< M, X, Y >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
│ │ │ │

Detailed Description

│ │ │ │ -

???

│ │ │ │ +

Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,36 +1,35 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -vbvector.hh File Reference │ │ │ │ │ -??? _M_o_r_e_._._. │ │ │ │ │ +ilusubdomainsolver.hh File Reference │ │ │ │ │ +Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +#include "_m_a_t_r_i_x_._h_h" │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._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_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _> │ │ │ │ │ -  A Vector of blocks with different blocksizes. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  base class encapsulating common algorithms of _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r and │ │ │ │ │ + _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -  Iterator class for sequential creation of blocks. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  Exact subdomain solver using _I_L_U_(_p_) with appropriate p. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_:_:_R_e_a_l_I_t_e_r_a_t_o_r_<_ _T_,_ _R_ _> │ │ │ │ │ -  Iterator class for sequential access. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -??? │ │ │ │ │ +Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: vbvector.hh Source File │ │ │ │ +dune-istl: ilusubdomainsolver.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,853 +74,235 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
vbvector.hh
│ │ │ │ +
ilusubdomainsolver.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_VBVECTOR_HH
│ │ │ │ -
6#define DUNE_ISTL_VBVECTOR_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
│ │ │ │ +
6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <complex>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <iterator>
│ │ │ │ -
12#include <memory>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/iteratorfacades.hh>
│ │ │ │ -
15#include "istlexception.hh"
│ │ │ │ -
16#include "bvector.hh"
│ │ │ │ -
17
│ │ │ │ - │ │ │ │ -
19
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25
│ │ │ │ -
41 template<class B, class A=std::allocator<B> >
│ │ │ │ -
│ │ │ │ -
42 class VariableBlockVector : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ -
43 // this derivation gives us all the blas level 1 and norms
│ │ │ │ -
44 // on the large array. However, access operators have to be
│ │ │ │ -
45 // overwritten.
│ │ │ │ -
46 {
│ │ │ │ -
47 // just a shorthand
│ │ │ │ -
48 typedef Imp::BlockVectorWindow<B,A> window_type;
│ │ │ │ -
49
│ │ │ │ -
50 public:
│ │ │ │ -
51
│ │ │ │ -
52 //===== type definitions and constants
│ │ │ │ -
53
│ │ │ │ -
55 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
56
│ │ │ │ -
58 typedef A allocator_type;
│ │ │ │ -
59
│ │ │ │ -
64 typedef window_type& reference;
│ │ │ │ -
65
│ │ │ │ -
70 typedef const window_type& const_reference;
│ │ │ │ -
71
│ │ │ │ -
73 typedef typename A::size_type size_type;
│ │ │ │ -
74
│ │ │ │ - │ │ │ │ -
81
│ │ │ │ - │ │ │ │ -
85
│ │ │ │ -
89 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
90 static constexpr auto blocklevel = blockLevel<B>()+2;
│ │ │ │ -
91
│ │ │ │ -
92 //===== constructors and such
│ │ │ │ -
93
│ │ │ │ -
│ │ │ │ -
97 VariableBlockVector () : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ -
98 {
│ │ │ │ -
99 // nothing is known ...
│ │ │ │ -
100 nblocks = 0;
│ │ │ │ -
101 block = nullptr;
│ │ │ │ -
102 initialized = false;
│ │ │ │ -
103 }
│ │ │ │ -
│ │ │ │ -
104
│ │ │ │ -
│ │ │ │ -
108 explicit VariableBlockVector (size_type _nblocks) : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ -
109 {
│ │ │ │ -
110 // we can allocate the windows now
│ │ │ │ -
111 nblocks = _nblocks;
│ │ │ │ -
112 if (nblocks>0)
│ │ │ │ -
113 {
│ │ │ │ -
114 block = windowAllocator_.allocate(nblocks);
│ │ │ │ -
115 new (block) window_type[nblocks];
│ │ │ │ -
116 }
│ │ │ │ -
117 else
│ │ │ │ -
118 {
│ │ │ │ -
119 nblocks = 0;
│ │ │ │ -
120 block = nullptr;
│ │ │ │ -
121 }
│ │ │ │ -
122
│ │ │ │ -
123 // Note: memory in base class still not allocated
│ │ │ │ -
124 // the vector not usable
│ │ │ │ -
125 initialized = false;
│ │ │ │ -
126 }
│ │ │ │ -
│ │ │ │ -
127
│ │ │ │ -
│ │ │ │ -
134 VariableBlockVector (size_type _nblocks, size_type m) : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ -
135 {
│ │ │ │ -
136 // and we can allocate the big array in the base class
│ │ │ │ -
137 this->n = _nblocks*m;
│ │ │ │ -
138 if (this->n>0)
│ │ │ │ -
139 {
│ │ │ │ -
140 this->p = allocator_.allocate(this->n);
│ │ │ │ -
141 new (this->p)B[this->n];
│ │ │ │ -
142 }
│ │ │ │ -
143 else
│ │ │ │ -
144 {
│ │ │ │ -
145 this->n = 0;
│ │ │ │ -
146 this->p = nullptr;
│ │ │ │ -
147 }
│ │ │ │ +
8#include <map>
│ │ │ │ +
9#include <dune/common/typetraits.hh>
│ │ │ │ + │ │ │ │ +
11#include "matrix.hh"
│ │ │ │ +
12#include <cmath>
│ │ │ │ +
13#include <cstdlib>
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16
│ │ │ │ +
35 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
37 public:
│ │ │ │ +
39 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ +
41 typedef X domain_type;
│ │ │ │ +
43 typedef Y range_type;
│ │ │ │ +
44
│ │ │ │ +
51 virtual void apply (X& v, const Y& d) =0;
│ │ │ │ +
52
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
54 {}
│ │ │ │ +
│ │ │ │ +
55
│ │ │ │ +
56 protected:
│ │ │ │ +
62 template<class S>
│ │ │ │ +
63 std::size_t copyToLocalMatrix(const M& A, S& rowset);
│ │ │ │ +
64
│ │ │ │ +
66 // for ILUN
│ │ │ │ + │ │ │ │ +
68 };
│ │ │ │ +
│ │ │ │ +
69
│ │ │ │ +
76 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
78 : public ILUSubdomainSolver<M,X,Y>{
│ │ │ │ +
79 public:
│ │ │ │ +
81 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ +
82 typedef typename std::remove_const<M>::type rilu_type;
│ │ │ │ +
84 typedef X domain_type;
│ │ │ │ +
86 typedef Y range_type;
│ │ │ │ +
87
│ │ │ │ +
88
│ │ │ │ +
│ │ │ │ +
93 void apply (X& v, const Y& d)
│ │ │ │ +
94 {
│ │ │ │ +
95 ILU::blockILUBacksolve(this->ILU,v,d);
│ │ │ │ +
96 }
│ │ │ │ +
│ │ │ │ +
104 template<class S>
│ │ │ │ +
105 void setSubMatrix(const M& A, S& rowset);
│ │ │ │ +
106
│ │ │ │ +
107 };
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
109 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
111 : public ILUSubdomainSolver<M,X,Y>{
│ │ │ │ +
112 public:
│ │ │ │ +
114 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ +
115 typedef typename std::remove_const<M>::type rilu_type;
│ │ │ │ +
117 typedef X domain_type;
│ │ │ │ +
119 typedef Y range_type;
│ │ │ │ +
120
│ │ │ │ +
│ │ │ │ +
125 void apply (X& v, const Y& d)
│ │ │ │ +
126 {
│ │ │ │ +
127 ILU::blockILUBacksolve(RILU,v,d);
│ │ │ │ +
128 }
│ │ │ │ +
│ │ │ │ +
129
│ │ │ │ +
137 template<class S>
│ │ │ │ +
138 void setSubMatrix(const M& A, S& rowset);
│ │ │ │ +
139
│ │ │ │ +
140 private:
│ │ │ │ +
144 rilu_type RILU;
│ │ │ │ +
145 };
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
147
│ │ │ │
148
│ │ │ │ -
149 // we can allocate the windows now
│ │ │ │ -
150 nblocks = _nblocks;
│ │ │ │ -
151 if (nblocks>0)
│ │ │ │ -
152 {
│ │ │ │ -
153 // allocate and construct the windows
│ │ │ │ -
154 block = windowAllocator_.allocate(nblocks);
│ │ │ │ -
155 new (block) window_type[nblocks];
│ │ │ │ -
156
│ │ │ │ -
157 // set the windows into the big array
│ │ │ │ -
158 for (size_type i=0; i<nblocks; ++i)
│ │ │ │ -
159 block[i].set(m,this->p+(i*m));
│ │ │ │ -
160 }
│ │ │ │ -
161 else
│ │ │ │ -
162 {
│ │ │ │ -
163 nblocks = 0;
│ │ │ │ -
164 block = nullptr;
│ │ │ │ -
165 }
│ │ │ │ -
166
│ │ │ │ -
167 // and the vector is usable
│ │ │ │ -
168 initialized = true;
│ │ │ │ -
169 }
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
173 {
│ │ │ │ -
174 // allocate the big array in the base class
│ │ │ │ -
175 this->n = a.n;
│ │ │ │ -
176 if (this->n>0)
│ │ │ │ -
177 {
│ │ │ │ -
178 // allocate and construct objects
│ │ │ │ -
179 this->p = allocator_.allocate(this->n);
│ │ │ │ -
180 new (this->p)B[this->n];
│ │ │ │ -
181
│ │ │ │ -
182 // copy data
│ │ │ │ -
183 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ -
184 }
│ │ │ │ -
185 else
│ │ │ │ -
186 {
│ │ │ │ -
187 this->n = 0;
│ │ │ │ -
188 this->p = nullptr;
│ │ │ │ -
189 }
│ │ │ │ -
190
│ │ │ │ -
191 // we can allocate the windows now
│ │ │ │ -
192 nblocks = a.nblocks;
│ │ │ │ -
193 if (nblocks>0)
│ │ │ │ -
194 {
│ │ │ │ -
195 // alloc
│ │ │ │ -
196 block = windowAllocator_.allocate(nblocks);
│ │ │ │ -
197 new (block) window_type[nblocks];
│ │ │ │ +
149 template<class M, class X, class Y>
│ │ │ │ +
150 template<class S>
│ │ │ │ +
│ │ │ │ +
151 std::size_t ILUSubdomainSolver<M,X,Y>::copyToLocalMatrix(const M& A, S& rowSet)
│ │ │ │ +
152 {
│ │ │ │ +
153 // Calculate consecutive indices for local problem
│ │ │ │ +
154 // while perserving the ordering
│ │ │ │ +
155 typedef typename M::size_type size_type;
│ │ │ │ +
156 typedef std::map<typename S::value_type,size_type> IndexMap;
│ │ │ │ +
157 typedef typename IndexMap::iterator IMIter;
│ │ │ │ +
158 IndexMap indexMap;
│ │ │ │ +
159 IMIter guess = indexMap.begin();
│ │ │ │ +
160 size_type localIndex=0;
│ │ │ │ +
161
│ │ │ │ +
162 typedef typename S::const_iterator SIter;
│ │ │ │ +
163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
│ │ │ │ +
164 rowIdx!= rowEnd; ++rowIdx, ++localIndex)
│ │ │ │ +
165 guess = indexMap.insert(guess,
│ │ │ │ +
166 std::make_pair(*rowIdx,localIndex));
│ │ │ │ +
167
│ │ │ │ +
168
│ │ │ │ +
169 // Build Matrix for local subproblem
│ │ │ │ +
170 ILU.setSize(rowSet.size(),rowSet.size());
│ │ │ │ +
171 ILU.setBuildMode(matrix_type::row_wise);
│ │ │ │ +
172
│ │ │ │ +
173 // Create sparsity pattern
│ │ │ │ +
174 typedef typename matrix_type::CreateIterator CIter;
│ │ │ │ +
175 CIter rowCreator = ILU.createbegin();
│ │ │ │ +
176 std::size_t offset=0;
│ │ │ │ +
177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
│ │ │ │ +
178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) {
│ │ │ │ +
179 // See which row entries are in our subset and add them to
│ │ │ │ +
180 // the sparsity pattern
│ │ │ │ +
181 guess = indexMap.begin();
│ │ │ │ +
182
│ │ │ │ +
183 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
│ │ │ │ +
184 endcol=A[*rowIdx].end(); col != endcol; ++col) {
│ │ │ │ +
185 // search for the entry in the row set
│ │ │ │ +
186 guess = indexMap.find(col.index());
│ │ │ │ +
187 if(guess!=indexMap.end()) {
│ │ │ │ +
188 // add local index to row
│ │ │ │ +
189 rowCreator.insert(guess->second);
│ │ │ │ +
190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second-rowCreator.index())));
│ │ │ │ +
191 }
│ │ │ │ +
192 }
│ │ │ │ +
193
│ │ │ │ +
194 }
│ │ │ │ +
195
│ │ │ │ +
196 // Insert the matrix values for the local problem
│ │ │ │ +
197 typename matrix_type::iterator iluRow=ILU.begin();
│ │ │ │
198
│ │ │ │ -
199 // and we must set the windows
│ │ │ │ -
200 block[0].set(a.block[0].getsize(),this->p); // first block
│ │ │ │ -
201 for (size_type i=1; i<nblocks; ++i) // and the rest
│ │ │ │ -
202 block[i].set(a.block[i].getsize(),block[i-1].getptr()+block[i-1].getsize());
│ │ │ │ -
203 }
│ │ │ │ -
204 else
│ │ │ │ -
205 {
│ │ │ │ -
206 nblocks = 0;
│ │ │ │ -
207 block = nullptr;
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
210 // and we have a usable vector
│ │ │ │ -
211 initialized = true;
│ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
213
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
216 {
│ │ │ │ -
217 if (this->n>0) {
│ │ │ │ -
218 size_type i=this->n;
│ │ │ │ -
219 while (i)
│ │ │ │ -
220 this->p[--i].~B();
│ │ │ │ -
221 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
222 }
│ │ │ │ -
223 if (nblocks>0) {
│ │ │ │ -
224 size_type i=nblocks;
│ │ │ │ -
225 while (i)
│ │ │ │ -
226 block[--i].~window_type();
│ │ │ │ -
227 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ -
228 }
│ │ │ │ -
229
│ │ │ │ -
230 }
│ │ │ │ -
│ │ │ │ -
231
│ │ │ │ -
232
│ │ │ │ -
│ │ │ │ -
234 void resize (size_type _nblocks)
│ │ │ │ -
235 {
│ │ │ │ -
236 // deconstruct objects and deallocate memory if necessary
│ │ │ │ -
237 if (this->n>0) {
│ │ │ │ -
238 size_type i=this->n;
│ │ │ │ -
239 while (i)
│ │ │ │ -
240 this->p[--i].~B();
│ │ │ │ -
241 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
242 }
│ │ │ │ -
243 if (nblocks>0) {
│ │ │ │ -
244 size_type i=nblocks;
│ │ │ │ -
245 while (i)
│ │ │ │ -
246 block[--i].~window_type();
│ │ │ │ -
247 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ -
248 }
│ │ │ │ -
249 this->n = 0;
│ │ │ │ -
250 this->p = nullptr;
│ │ │ │ -
251
│ │ │ │ -
252 // we can allocate the windows now
│ │ │ │ -
253 nblocks = _nblocks;
│ │ │ │ -
254 if (nblocks>0)
│ │ │ │ -
255 {
│ │ │ │ -
256 block = windowAllocator_.allocate(nblocks);
│ │ │ │ -
257 new (block) window_type[nblocks];
│ │ │ │ -
258 }
│ │ │ │ -
259 else
│ │ │ │ -
260 {
│ │ │ │ -
261 nblocks = 0;
│ │ │ │ -
262 block = nullptr;
│ │ │ │ -
263 }
│ │ │ │ -
264
│ │ │ │ -
265 // and the vector not fully usable
│ │ │ │ -
266 initialized = false;
│ │ │ │ -
267 }
│ │ │ │ -
│ │ │ │ -
268
│ │ │ │ -
│ │ │ │ -
270 void resize (size_type _nblocks, size_type m)
│ │ │ │ -
271 {
│ │ │ │ -
272 // deconstruct objects and deallocate memory if necessary
│ │ │ │ -
273 if (this->n>0) {
│ │ │ │ -
274 size_type i=this->n;
│ │ │ │ -
275 while (i)
│ │ │ │ -
276 this->p[--i].~B();
│ │ │ │ -
277 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
278 }
│ │ │ │ -
279 if (nblocks>0) {
│ │ │ │ -
280 size_type i=nblocks;
│ │ │ │ -
281 while (i)
│ │ │ │ -
282 block[--i].~window_type();
│ │ │ │ -
283 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ -
284 }
│ │ │ │ -
285
│ │ │ │ -
286 // and we can allocate the big array in the base class
│ │ │ │ -
287 this->n = _nblocks*m;
│ │ │ │ -
288 if (this->n>0)
│ │ │ │ -
289 {
│ │ │ │ -
290 this->p = allocator_.allocate(this->n);
│ │ │ │ -
291 new (this->p)B[this->n];
│ │ │ │ -
292 }
│ │ │ │ -
293 else
│ │ │ │ -
294 {
│ │ │ │ -
295 this->n = 0;
│ │ │ │ -
296 this->p = nullptr;
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
299 // we can allocate the windows now
│ │ │ │ -
300 nblocks = _nblocks;
│ │ │ │ -
301 if (nblocks>0)
│ │ │ │ -
302 {
│ │ │ │ -
303 // allocate and construct objects
│ │ │ │ -
304 block = windowAllocator_.allocate(nblocks);
│ │ │ │ -
305 new (block) window_type[nblocks];
│ │ │ │ -
306
│ │ │ │ -
307 // set the windows into the big array
│ │ │ │ -
308 for (size_type i=0; i<nblocks; ++i)
│ │ │ │ -
309 block[i].set(m,this->p+(i*m));
│ │ │ │ -
310 }
│ │ │ │ -
311 else
│ │ │ │ -
312 {
│ │ │ │ -
313 nblocks = 0;
│ │ │ │ -
314 block = nullptr;
│ │ │ │ -
315 }
│ │ │ │ -
316
│ │ │ │ -
317 // and the vector is usable
│ │ │ │ -
318 initialized = true;
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
323 {
│ │ │ │ -
324 if (&a!=this) // check if this and a are different objects
│ │ │ │ -
325 {
│ │ │ │ -
326 // reallocate arrays if necessary
│ │ │ │ -
327 // Note: still the block sizes may vary !
│ │ │ │ -
328 if (this->n!=a.n || nblocks!=a.nblocks)
│ │ │ │ -
329 {
│ │ │ │ -
330 // deconstruct objects and deallocate memory if necessary
│ │ │ │ -
331 if (this->n>0) {
│ │ │ │ -
332 size_type i=this->n;
│ │ │ │ -
333 while (i)
│ │ │ │ -
334 this->p[--i].~B();
│ │ │ │ -
335 allocator_.deallocate(this->p,this->n);
│ │ │ │ -
336 }
│ │ │ │ -
337 if (nblocks>0) {
│ │ │ │ -
338 size_type i=nblocks;
│ │ │ │ -
339 while (i)
│ │ │ │ -
340 block[--i].~window_type();
│ │ │ │ -
341 windowAllocator_.deallocate(block,nblocks);
│ │ │ │ -
342 }
│ │ │ │ -
343
│ │ │ │ -
344 // allocate the big array in the base class
│ │ │ │ -
345 this->n = a.n;
│ │ │ │ -
346 if (this->n>0)
│ │ │ │ -
347 {
│ │ │ │ -
348 // allocate and construct objects
│ │ │ │ -
349 this->p = allocator_.allocate(this->n);
│ │ │ │ -
350 new (this->p)B[this->n];
│ │ │ │ -
351 }
│ │ │ │ -
352 else
│ │ │ │ -
353 {
│ │ │ │ -
354 this->n = 0;
│ │ │ │ -
355 this->p = nullptr;
│ │ │ │ -
356 }
│ │ │ │ -
357
│ │ │ │ -
358 // we can allocate the windows now
│ │ │ │ -
359 nblocks = a.nblocks;
│ │ │ │ -
360 if (nblocks>0)
│ │ │ │ -
361 {
│ │ │ │ -
362 // alloc
│ │ │ │ -
363 block = windowAllocator_.allocate(nblocks);
│ │ │ │ -
364 new (block) window_type[nblocks];
│ │ │ │ -
365 }
│ │ │ │ -
366 else
│ │ │ │ -
367 {
│ │ │ │ -
368 nblocks = 0;
│ │ │ │ -
369 block = nullptr;
│ │ │ │ -
370 }
│ │ │ │ -
371 }
│ │ │ │ -
372
│ │ │ │ -
373 // copy block structure, might be different although
│ │ │ │ -
374 // sizes are the same !
│ │ │ │ -
375 if (nblocks>0)
│ │ │ │ -
376 {
│ │ │ │ -
377 block[0].set(a.block[0].getsize(),this->p); // first block
│ │ │ │ -
378 for (size_type i=1; i<nblocks; ++i) // and the rest
│ │ │ │ -
379 block[i].set(a.block[i].getsize(),block[i-1].getptr()+block[i-1].getsize());
│ │ │ │ -
380 }
│ │ │ │ -
381
│ │ │ │ -
382 // and copy the data
│ │ │ │ -
383 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ -
384 }
│ │ │ │ -
385
│ │ │ │ -
386 // and we have a usable vector
│ │ │ │ -
387 initialized = true;
│ │ │ │ -
388
│ │ │ │ -
389 return *this; // Gebe Referenz zurueck damit a=b=c; klappt
│ │ │ │ -
390 }
│ │ │ │ -
│ │ │ │ -
391
│ │ │ │ -
392
│ │ │ │ -
393 //===== assignment from scalar
│ │ │ │ -
394
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
397 {
│ │ │ │ -
398 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ -
399 return *this;
│ │ │ │ -
400 }
│ │ │ │ -
│ │ │ │ -
401
│ │ │ │ -
402
│ │ │ │ -
403 //===== the creation interface
│ │ │ │ -
404
│ │ │ │ -
405 class CreateIterator;
│ │ │ │ -
406
│ │ │ │ -
407#ifndef DOXYGEN
│ │ │ │ -
408
│ │ │ │ -
409 // The window_type does not hand out a reference to its size,
│ │ │ │ -
410 // so in order to provide a valid iterator, we need a workaround
│ │ │ │ -
411 // to make assignment possible. This proxy enables just that by
│ │ │ │ -
412 // implicitly converting to the stored size for read access and
│ │ │ │ -
413 // tunneling assignment to the accessor method of the window.
│ │ │ │ -
414 struct SizeProxy
│ │ │ │ -
415 {
│ │ │ │ -
416
│ │ │ │ -
417 operator size_type() const
│ │ │ │ -
418 {
│ │ │ │ -
419 return target->getsize();
│ │ │ │ -
420 }
│ │ │ │ -
421
│ │ │ │ -
422 SizeProxy& operator=(size_type size)
│ │ │ │ -
423 {
│ │ │ │ -
424 target->setsize(size);
│ │ │ │ -
425 return *this;
│ │ │ │ -
426 }
│ │ │ │ -
427
│ │ │ │ -
428 private:
│ │ │ │ -
429
│ │ │ │ -
430 friend class CreateIterator;
│ │ │ │ -
431
│ │ │ │ -
432 SizeProxy(window_type& t)
│ │ │ │ -
433 : target(&t)
│ │ │ │ -
434 {}
│ │ │ │ -
435
│ │ │ │ -
436 window_type* target;
│ │ │ │ -
437 };
│ │ │ │ -
438
│ │ │ │ -
439#endif // DOXYGEN
│ │ │ │ -
440
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
443 {
│ │ │ │ -
444 public:
│ │ │ │ -
446 using iterator_category = std::output_iterator_tag;
│ │ │ │ -
447
│ │ │ │ - │ │ │ │ -
450
│ │ │ │ -
457 using difference_type = void;
│ │ │ │ -
458
│ │ │ │ - │ │ │ │ -
461
│ │ │ │ -
463 using reference = SizeProxy;
│ │ │ │ -
464
│ │ │ │ -
│ │ │ │ -
466 CreateIterator (VariableBlockVector& _v, int _i, bool _isEnd) :
│ │ │ │ -
467 v(_v),
│ │ │ │ -
468 i(_i),
│ │ │ │ -
469 isEnd(_isEnd) {}
│ │ │ │ -
│ │ │ │ -
470
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
472 // When the iterator gets destructed, we allocate the memory
│ │ │ │ -
473 // for the VariableBlockVector if
│ │ │ │ -
474 // 1. the current iterator was not created as enditerator
│ │ │ │ -
475 // 2. we're at the last block
│ │ │ │ -
476 // 3. the vector hasn't been initialized earlier
│ │ │ │ -
477 if (not isEnd && i==v.nblocks && not v.initialized)
│ │ │ │ -
478 v.allocate();
│ │ │ │ -
479 }
│ │ │ │ -
│ │ │ │ -
480
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
483 {
│ │ │ │ -
484 // go to next block
│ │ │ │ -
485 ++i;
│ │ │ │ -
486
│ │ │ │ -
487 return *this;
│ │ │ │ -
488 }
│ │ │ │ -
│ │ │ │ -
489
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
492 {
│ │ │ │ -
493 CreateIterator tmp(*this);
│ │ │ │ -
494 this->operator++();
│ │ │ │ -
495 return tmp;
│ │ │ │ -
496 }
│ │ │ │ -
│ │ │ │ -
497
│ │ │ │ -
│ │ │ │ -
499 bool operator!= (const CreateIterator& it) const
│ │ │ │ -
500 {
│ │ │ │ -
501 return (i!=it.i) || (&v!=&it.v);
│ │ │ │ -
502 }
│ │ │ │ -
│ │ │ │ -
503
│ │ │ │ -
│ │ │ │ -
505 bool operator== (const CreateIterator& it) const
│ │ │ │ -
506 {
│ │ │ │ -
507 return (i==it.i) && (&v==&it.v);
│ │ │ │ -
508 }
│ │ │ │ -
│ │ │ │ -
509
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
512 {
│ │ │ │ -
513 return i;
│ │ │ │ -
514 }
│ │ │ │ -
│ │ │ │ -
515
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
518 {
│ │ │ │ -
519 v.block[i].setsize(_k);
│ │ │ │ -
520 }
│ │ │ │ -
│ │ │ │ -
521
│ │ │ │ -
523#ifdef DOXYGEN
│ │ │ │ -
524 size_type&
│ │ │ │ -
525#else
│ │ │ │ -
526 SizeProxy
│ │ │ │ -
527#endif
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
529 {
│ │ │ │ -
530 return {v.block[i]};
│ │ │ │ -
531 }
│ │ │ │ -
│ │ │ │ -
532
│ │ │ │ -
533 private:
│ │ │ │ -
534 VariableBlockVector& v; // my vector
│ │ │ │ -
535 size_type i; // current block to be defined
│ │ │ │ -
536 const bool isEnd; // flag if this object was created as the end iterator.
│ │ │ │ -
537 };
│ │ │ │ -
│ │ │ │ -
538
│ │ │ │ -
539 // CreateIterator wants to set all the arrays ...
│ │ │ │ -
540 friend class CreateIterator;
│ │ │ │ -
541
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
544 {
│ │ │ │ -
545#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
546 if (initialized) DUNE_THROW(ISTLError,"no CreateIterator in initialized state");
│ │ │ │ -
547#endif
│ │ │ │ -
548 return CreateIterator(*this,0, false);
│ │ │ │ -
549 }
│ │ │ │ -
│ │ │ │ -
550
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
553 {
│ │ │ │ -
554 return CreateIterator(*this,nblocks, true);
│ │ │ │ -
555 }
│ │ │ │ -
│ │ │ │ -
556
│ │ │ │ -
557
│ │ │ │ -
558 //===== access to components
│ │ │ │ -
559 // has to be overwritten from base class because it must
│ │ │ │ -
560 // return access to the windows
│ │ │ │ -
561
│ │ │ │ -
│ │ │ │ -
563 window_type& operator[] (size_type i)
│ │ │ │ -
564 {
│ │ │ │ -
565#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
566 if (i>=nblocks) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
567#endif
│ │ │ │ -
568 return block[i];
│ │ │ │ -
569 }
│ │ │ │ -
│ │ │ │ -
570
│ │ │ │ -
│ │ │ │ -
572 const window_type& operator[] (size_type i) const
│ │ │ │ -
573 {
│ │ │ │ -
574#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
575 if (i<0 || i>=nblocks) DUNE_THROW(ISTLError,"index out of range");
│ │ │ │ -
576#endif
│ │ │ │ -
577 return block[i];
│ │ │ │ -
578 }
│ │ │ │ -
│ │ │ │ -
579
│ │ │ │ -
581 template <class T, class R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
583 : public RandomAccessIteratorFacade<RealIterator<T,R>, T, R>
│ │ │ │ -
584 {
│ │ │ │ -
585 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
588 {
│ │ │ │ -
589 p = nullptr;
│ │ │ │ -
590 i = 0;
│ │ │ │ -
591 }
│ │ │ │ -
│ │ │ │ -
592
│ │ │ │ -
│ │ │ │ -
594 RealIterator (window_type* _p, size_type _i)
│ │ │ │ -
595 : p(_p), i(_i)
│ │ │ │ -
596 {}
│ │ │ │ -
│ │ │ │ -
597
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
600 {
│ │ │ │ -
601 ++i;
│ │ │ │ -
602 }
│ │ │ │ -
│ │ │ │ -
603
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
606 {
│ │ │ │ -
607 --i;
│ │ │ │ -
608 }
│ │ │ │ -
│ │ │ │ -
609
│ │ │ │ -
│ │ │ │ -
611 bool equals (const RealIterator& it) const
│ │ │ │ -
612 {
│ │ │ │ -
613 return (p+i)==(it.p+it.i);
│ │ │ │ -
614 }
│ │ │ │ -
│ │ │ │ -
615
│ │ │ │ -
│ │ │ │ -
617 window_type& dereference () const
│ │ │ │ -
618 {
│ │ │ │ -
619 return p[i];
│ │ │ │ -
620 }
│ │ │ │ -
│ │ │ │ -
621
│ │ │ │ -
│ │ │ │ -
622 void advance(std::ptrdiff_t d)
│ │ │ │ -
623 {
│ │ │ │ -
624 i+=d;
│ │ │ │ -
625 }
│ │ │ │ -
│ │ │ │ -
626
│ │ │ │ -
│ │ │ │ -
627 std::ptrdiff_t distanceTo(const RealIterator& o) const
│ │ │ │ -
628 {
│ │ │ │ -
629 return o.i-i;
│ │ │ │ -
630 }
│ │ │ │ -
│ │ │ │ -
631
│ │ │ │ -
632 // Needed for operator[] of the iterator
│ │ │ │ -
│ │ │ │ -
633 window_type& elementAt (std::ptrdiff_t offset) const
│ │ │ │ -
634 {
│ │ │ │ -
635 return p[i+offset];
│ │ │ │ -
636 }
│ │ │ │ -
│ │ │ │ -
637
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
640 {
│ │ │ │ -
641 return i;
│ │ │ │ -
642 }
│ │ │ │ -
│ │ │ │ -
643
│ │ │ │ -
644 private:
│ │ │ │ -
645 window_type* p;
│ │ │ │ -
646 size_type i;
│ │ │ │ -
647 };
│ │ │ │ -
│ │ │ │ -
648
│ │ │ │ - │ │ │ │ -
650
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
653 {
│ │ │ │ -
654 return Iterator(block,0);
│ │ │ │ -
655 }
│ │ │ │ -
│ │ │ │ -
656
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
659 {
│ │ │ │ -
660 return Iterator(block,nblocks);
│ │ │ │ -
661 }
│ │ │ │ -
│ │ │ │ -
662
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
666 {
│ │ │ │ -
667 return Iterator(block,nblocks-1);
│ │ │ │ -
668 }
│ │ │ │ -
│ │ │ │ -
669
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
673 {
│ │ │ │ -
674 return Iterator(block,-1);
│ │ │ │ -
675 }
│ │ │ │ -
│ │ │ │ -
676
│ │ │ │ - │ │ │ │ -
679
│ │ │ │ - │ │ │ │ -
682
│ │ │ │ - │ │ │ │ -
685
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
688 {
│ │ │ │ -
689 return ConstIterator(block,0);
│ │ │ │ -
690 }
│ │ │ │ -
│ │ │ │ -
691
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
694 {
│ │ │ │ -
695 return ConstIterator(block,nblocks);
│ │ │ │ -
696 }
│ │ │ │ -
│ │ │ │ -
697
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
701 {
│ │ │ │ -
702 return ConstIterator(block,nblocks-1);
│ │ │ │ -
703 }
│ │ │ │ -
│ │ │ │ -
704
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
707 {
│ │ │ │ -
708 return ConstIterator(block,-1);
│ │ │ │ -
709 }
│ │ │ │ -
│ │ │ │ -
710
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
713 {
│ │ │ │ -
714 return Iterator(block,std::min(i,nblocks));
│ │ │ │ -
715 }
│ │ │ │ -
│ │ │ │ -
716
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
719 {
│ │ │ │ -
720 return ConstIterator(block,std::min(i,nblocks));
│ │ │ │ -
721 }
│ │ │ │ -
│ │ │ │ -
722
│ │ │ │ -
723 //===== sizes
│ │ │ │ -
724
│ │ │ │ -
│ │ │ │ -
726 size_type N () const
│ │ │ │ -
727 {
│ │ │ │ -
728 return nblocks;
│ │ │ │ -
729 }
│ │ │ │ -
│ │ │ │ -
730
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
736 {
│ │ │ │ -
737 return nblocks;
│ │ │ │ -
738 }
│ │ │ │ -
│ │ │ │ -
739
│ │ │ │ -
740
│ │ │ │ -
741 private:
│ │ │ │ -
742
│ │ │ │ -
743 void allocate() {
│ │ │ │ -
744 if (this->initialized)
│ │ │ │ -
745 DUNE_THROW(ISTLError, "Attempt to re-allocate already initialized VariableBlockVector");
│ │ │ │ -
746
│ │ │ │ -
747 // calculate space needed:
│ │ │ │ -
748 this->n=0;
│ │ │ │ -
749 for(size_type i = 0; i < nblocks; i++) {
│ │ │ │ -
750 this->n += block[i].size();
│ │ │ │ -
751 }
│ │ │ │ -
752
│ │ │ │ -
753 // now we can allocate the big array in the base class of v
│ │ │ │ -
754 if (this->n>0)
│ │ │ │ -
755 {
│ │ │ │ -
756 // allocate and construct objects
│ │ │ │ -
757 this->p = allocator_.allocate(this->n);
│ │ │ │ -
758 new (this->p)B[this->n];
│ │ │ │ -
759 }
│ │ │ │ -
760 else
│ │ │ │ -
761 {
│ │ │ │ -
762 this->p = nullptr;
│ │ │ │ -
763 }
│ │ │ │ -
764
│ │ │ │ -
765 // and we set the window pointers
│ │ │ │ -
766 this->block[0].setptr(this->p); // pointer to first block
│ │ │ │ -
767 for (size_type j=1; j<nblocks; ++j) // and the rest
│ │ │ │ -
768 block[j].setptr(block[j-1].getptr()+block[j-1].getsize());
│ │ │ │ -
769
│ │ │ │ -
770 // and the vector is ready
│ │ │ │ -
771 this->initialized = true;
│ │ │ │ -
772 }
│ │ │ │ -
773
│ │ │ │ -
774 size_type nblocks; // number of blocks in vector
│ │ │ │ -
775 window_type* block; // array of blocks pointing to the array in the base class
│ │ │ │ -
776 bool initialized; // true if vector has been initialized
│ │ │ │ -
777
│ │ │ │ -
778 A allocator_;
│ │ │ │ -
779
│ │ │ │ -
780 typename std::allocator_traits<A>::template rebind_alloc<window_type> windowAllocator_;
│ │ │ │ -
781 };
│ │ │ │ -
│ │ │ │ -
782
│ │ │ │ -
783
│ │ │ │ -
784
│ │ │ │ -
787} // end namespace
│ │ │ │ -
788
│ │ │ │ -
789#endif
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ +
199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
│ │ │ │ +
200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) {
│ │ │ │ +
201 // See which row entries are in our subset and add them to
│ │ │ │ +
202 // the sparsity pattern
│ │ │ │ +
203 typename matrix_type::ColIterator localCol=iluRow->begin();
│ │ │ │ +
204 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
│ │ │ │ +
205 endcol=A[*rowIdx].end(); col != endcol; ++col) {
│ │ │ │ +
206 // search for the entry in the row set
│ │ │ │ +
207 guess = indexMap.find(col.index());
│ │ │ │ +
208 if(guess!=indexMap.end()) {
│ │ │ │ +
209 // set local value
│ │ │ │ +
210 (*localCol)=(*col);
│ │ │ │ +
211 ++localCol;
│ │ │ │ +
212 }
│ │ │ │ +
213 }
│ │ │ │ +
214 }
│ │ │ │ +
215 return offset;
│ │ │ │ +
216 }
│ │ │ │ +
│ │ │ │ +
217
│ │ │ │ +
218
│ │ │ │ +
219 template<class M, class X, class Y>
│ │ │ │ +
220 template<class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
222 {
│ │ │ │ +
223 this->copyToLocalMatrix(A,rowSet);
│ │ │ │ + │ │ │ │ +
225 }
│ │ │ │ +
│ │ │ │ +
226
│ │ │ │ +
227 template<class M, class X, class Y>
│ │ │ │ +
228 template<class S>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
230 {
│ │ │ │ +
231 std::size_t offset=copyToLocalMatrix(A,rowSet);
│ │ │ │ +
232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size());
│ │ │ │ +
233 RILU.setBuildMode(matrix_type::row_wise);
│ │ │ │ +
234 ILU::blockILUDecomposition(this->ILU, (offset+1)/2, RILU);
│ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ +
238} // end name space DUNE
│ │ │ │ +
239
│ │ │ │ +
240
│ │ │ │ +
241#endif
│ │ │ │ +
A dynamic dense block matrix class.
│ │ │ │ +
Define general preconditioner interface.
│ │ │ │ +
std::size_t copyToLocalMatrix(const M &A, S &rowset)
Copy the local part of the global matrix to ILU.
Definition ilusubdomainsolver.hh:151
│ │ │ │ +
void setSubMatrix(const M &A, S &rowset)
Set the data of the local problem.
Definition ilusubdomainsolver.hh:229
│ │ │ │ +
void setSubMatrix(const M &A, S &rowset)
Set the data of the local problem.
Definition ilusubdomainsolver.hh:221
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
A Vector of blocks with different blocksizes.
Definition vbvector.hh:46
│ │ │ │ -
RealIterator< value_type, window_type & > Iterator
Definition vbvector.hh:649
│ │ │ │ -
VariableBlockVector()
Definition vbvector.hh:97
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition vbvector.hh:55
│ │ │ │ -
A allocator_type
export the allocator type
Definition vbvector.hh:58
│ │ │ │ -
VariableBlockVector(size_type _nblocks, size_type m)
Definition vbvector.hh:134
│ │ │ │ -
size_type size() const
Definition vbvector.hh:735
│ │ │ │ -
size_type N() const
number of blocks in the vector (are of variable size here)
Definition vbvector.hh:726
│ │ │ │ -
VariableBlockVector(const VariableBlockVector &a)
copy constructor, has copy semantics
Definition vbvector.hh:172
│ │ │ │ -
VariableBlockVector(size_type _nblocks)
Definition vbvector.hh:108
│ │ │ │ -
~VariableBlockVector()
free dynamic memory
Definition vbvector.hh:215
│ │ │ │ -
window_type & operator[](size_type i)
random access to blocks
Definition vbvector.hh:563
│ │ │ │ -
CreateIterator createend()
get create iterator pointing to one after the last block
Definition vbvector.hh:552
│ │ │ │ -
Iterator beforeBegin() const
Definition vbvector.hh:672
│ │ │ │ -
CreateIterator createbegin()
get initial create iterator
Definition vbvector.hh:543
│ │ │ │ -
VariableBlockVector & operator=(const VariableBlockVector &a)
assignment
Definition vbvector.hh:322
│ │ │ │ -
static constexpr auto blocklevel
Definition vbvector.hh:90
│ │ │ │ -
ConstIterator rend() const
end ConstIterator
Definition vbvector.hh:706
│ │ │ │ -
A::size_type size_type
The size type for the index access.
Definition vbvector.hh:73
│ │ │ │ -
ConstIterator find(size_type i) const
random access returning iterator (end if not contained)
Definition vbvector.hh:718
│ │ │ │ -
ConstIterator beforeEnd() const
Definition vbvector.hh:700
│ │ │ │ -
Iterator find(size_type i)
random access returning iterator (end if not contained)
Definition vbvector.hh:712
│ │ │ │ -
const window_type & const_reference
Export type used for const references to container entries.
Definition vbvector.hh:70
│ │ │ │ -
RealIterator< const value_type, const window_type & > ConstIterator
Const iterator.
Definition vbvector.hh:681
│ │ │ │ -
Iterator end()
end Iterator
Definition vbvector.hh:658
│ │ │ │ -
ConstIterator begin() const
begin ConstIterator
Definition vbvector.hh:687
│ │ │ │ -
BlockVector< B, A > value_type
Type of the elements of the outer vector, i.e., dynamic vectors of B.
Definition vbvector.hh:80
│ │ │ │ -
ConstIterator end() const
end ConstIterator
Definition vbvector.hh:693
│ │ │ │ -
BlockVector< B, A > block_type
Same as value_type, here for historical reasons.
Definition vbvector.hh:84
│ │ │ │ -
void resize(size_type _nblocks, size_type m)
same effect as constructor with same argument
Definition vbvector.hh:270
│ │ │ │ -
window_type & reference
Export type used for references to container entries.
Definition vbvector.hh:64
│ │ │ │ -
void resize(size_type _nblocks)
same effect as constructor with same argument
Definition vbvector.hh:234
│ │ │ │ -
Iterator beforeEnd()
Definition vbvector.hh:665
│ │ │ │ -
Iterator begin()
begin Iterator
Definition vbvector.hh:652
│ │ │ │ -
Iterator class for sequential creation of blocks.
Definition vbvector.hh:443
│ │ │ │ -
bool operator==(const CreateIterator &it) const
equality
Definition vbvector.hh:505
│ │ │ │ -
size_type index() const
dereferencing
Definition vbvector.hh:511
│ │ │ │ -
SizeProxy reference
reference type
Definition vbvector.hh:463
│ │ │ │ -
size_type * pointer
pointer type
Definition vbvector.hh:460
│ │ │ │ -
bool operator!=(const CreateIterator &it) const
inequality
Definition vbvector.hh:499
│ │ │ │ -
~CreateIterator()
Definition vbvector.hh:471
│ │ │ │ -
size_type value_type
value type
Definition vbvector.hh:449
│ │ │ │ -
CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd)
constructor
Definition vbvector.hh:466
│ │ │ │ -
void setblocksize(size_type _k)
set size of current block
Definition vbvector.hh:517
│ │ │ │ -
size_type & operator*()
Access size of current block.
Definition vbvector.hh:528
│ │ │ │ -
std::output_iterator_tag iterator_category
iterator category
Definition vbvector.hh:446
│ │ │ │ -
CreateIterator & operator++()
prefix increment
Definition vbvector.hh:482
│ │ │ │ -
void difference_type
difference type (unused)
Definition vbvector.hh:457
│ │ │ │ -
Iterator class for sequential access.
Definition vbvector.hh:584
│ │ │ │ -
RealIterator(window_type *_p, size_type _i)
constructor
Definition vbvector.hh:594
│ │ │ │ -
bool equals(const RealIterator &it) const
equality
Definition vbvector.hh:611
│ │ │ │ -
size_type index() const
Return the index of the entry this iterator is pointing to.
Definition vbvector.hh:639
│ │ │ │ -
window_type & elementAt(std::ptrdiff_t offset) const
Definition vbvector.hh:633
│ │ │ │ -
void decrement()
prefix decrement
Definition vbvector.hh:605
│ │ │ │ -
void advance(std::ptrdiff_t d)
Definition vbvector.hh:622
│ │ │ │ -
void increment()
prefix increment
Definition vbvector.hh:599
│ │ │ │ -
RealIterator()
constructor, no arguments
Definition vbvector.hh:587
│ │ │ │ -
std::ptrdiff_t distanceTo(const RealIterator &o) const
Definition vbvector.hh:627
│ │ │ │ -
window_type & dereference() const
dereferencing
Definition vbvector.hh:617
│ │ │ │ +
void blockILUBacksolve(const M &A, X &v, const Y &d)
LU backsolve with stored inverse.
Definition ilu.hh:94
│ │ │ │ +
void blockILU0Decomposition(M &A)
compute ILU decomposition of A. A is overwritten by its decomposition
Definition ilu.hh:33
│ │ │ │ +
void blockILUDecomposition(const M &A, int n, M &ILU)
Definition ilu.hh:167
│ │ │ │ +
base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver.
Definition ilusubdomainsolver.hh:36
│ │ │ │ +
matrix_type ILU
The ILU0 decomposition of the matrix, or the local matrix.
Definition ilusubdomainsolver.hh:67
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition ilusubdomainsolver.hh:41
│ │ │ │ +
virtual ~ILUSubdomainSolver()
Definition ilusubdomainsolver.hh:53
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition ilusubdomainsolver.hh:43
│ │ │ │ +
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition ilusubdomainsolver.hh:39
│ │ │ │ +
virtual void apply(X &v, const Y &d)=0
Apply the subdomain solver.
│ │ │ │ +
Exact subdomain solver using ILU(p) with appropriate p.
Definition ilusubdomainsolver.hh:78
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition ilusubdomainsolver.hh:84
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition ilusubdomainsolver.hh:86
│ │ │ │ +
std::remove_const< M >::type rilu_type
Definition ilusubdomainsolver.hh:82
│ │ │ │ +
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition ilusubdomainsolver.hh:81
│ │ │ │ +
void apply(X &v, const Y &d)
Apply the subdomain solver.
Definition ilusubdomainsolver.hh:93
│ │ │ │ +
Definition ilusubdomainsolver.hh:111
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition ilusubdomainsolver.hh:117
│ │ │ │ +
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition ilusubdomainsolver.hh:114
│ │ │ │ +
std::remove_const< M >::type rilu_type
Definition ilusubdomainsolver.hh:115
│ │ │ │ +
void apply(X &v, const Y &d)
Apply the subdomain solver.
Definition ilusubdomainsolver.hh:125
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition ilusubdomainsolver.hh:119
│ │ │ │ +
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,930 +1,288 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -vbvector.hh │ │ │ │ │ +ilusubdomainsolver.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_VBVECTOR_HH │ │ │ │ │ -6#define DUNE_ISTL_VBVECTOR_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH │ │ │ │ │ +6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -16#include "_b_v_e_c_t_o_r_._h_h" │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -19 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25 │ │ │ │ │ -41 template > │ │ │ │ │ -_4_2 class _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r : public Imp::block_vector_unmanaged │ │ │ │ │ -43 // this derivation gives us all the blas level 1 and norms │ │ │ │ │ -44 // on the large array. However, access operators have to be │ │ │ │ │ -45 // overwritten. │ │ │ │ │ -46 { │ │ │ │ │ -47 // just a shorthand │ │ │ │ │ -48 typedef Imp::BlockVectorWindow window_type; │ │ │ │ │ -49 │ │ │ │ │ -50 public: │ │ │ │ │ -51 │ │ │ │ │ -52 //===== type definitions and constants │ │ │ │ │ -53 │ │ │ │ │ -_5_5 using _f_i_e_l_d___t_y_p_e = typename Imp::BlockTraits::field_type; │ │ │ │ │ -56 │ │ │ │ │ -_5_8 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -59 │ │ │ │ │ -_6_4 typedef window_type& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -65 │ │ │ │ │ -_7_0 typedef const window_type& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -71 │ │ │ │ │ -_7_3 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -74 │ │ │ │ │ -_8_0 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -81 │ │ │ │ │ -_8_4 typedef _B_l_o_c_k_V_e_c_t_o_r_<_B_,_A_> _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -85 │ │ │ │ │ -89 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]] │ │ │ │ │ -_9_0 static constexpr auto _b_l_o_c_k_l_e_v_e_l = blockLevel()+2; │ │ │ │ │ -91 │ │ │ │ │ -92 //===== constructors and such │ │ │ │ │ -93 │ │ │ │ │ -_9_7 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r () : Imp::block_vector_unmanaged() │ │ │ │ │ -98 { │ │ │ │ │ -99 // nothing is known ... │ │ │ │ │ -100 nblocks = 0; │ │ │ │ │ -101 block = nullptr; │ │ │ │ │ -102 initialized = false; │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -_1_0_8 explicit _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _nblocks) : Imp:: │ │ │ │ │ -block_vector_unmanaged() │ │ │ │ │ -109 { │ │ │ │ │ -110 // we can allocate the windows now │ │ │ │ │ -111 nblocks = _nblocks; │ │ │ │ │ -112 if (nblocks>0) │ │ │ │ │ -113 { │ │ │ │ │ -114 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ -115 new (block) window_type[nblocks]; │ │ │ │ │ -116 } │ │ │ │ │ -117 else │ │ │ │ │ -118 { │ │ │ │ │ -119 nblocks = 0; │ │ │ │ │ -120 block = nullptr; │ │ │ │ │ -121 } │ │ │ │ │ -122 │ │ │ │ │ -123 // Note: memory in base class still not allocated │ │ │ │ │ -124 // the vector not usable │ │ │ │ │ -125 initialized = false; │ │ │ │ │ -126 } │ │ │ │ │ -127 │ │ │ │ │ -_1_3_4 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _nblocks, _s_i_z_e___t_y_p_e m) : Imp:: │ │ │ │ │ -block_vector_unmanaged() │ │ │ │ │ -135 { │ │ │ │ │ -136 // and we can allocate the big array in the base class │ │ │ │ │ -137 this->n = _nblocks*m; │ │ │ │ │ -138 if (this->n>0) │ │ │ │ │ -139 { │ │ │ │ │ -140 this->p = allocator_.allocate(this->n); │ │ │ │ │ -141 new (this->p)B[this->n]; │ │ │ │ │ -142 } │ │ │ │ │ -143 else │ │ │ │ │ -144 { │ │ │ │ │ -145 this->n = 0; │ │ │ │ │ -146 this->p = nullptr; │ │ │ │ │ -147 } │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include <_d_u_n_e_/_i_s_t_l_/_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h> │ │ │ │ │ +11#include "_m_a_t_r_i_x_._h_h" │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e { │ │ │ │ │ +16 │ │ │ │ │ +35 template │ │ │ │ │ +_3_6 class _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r { │ │ │ │ │ +37 public: │ │ │ │ │ +_3_9 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_4_1 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_4_3 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +44 │ │ │ │ │ +_5_1 virtual void _a_p_p_l_y (X& v, const Y& d) =0; │ │ │ │ │ +52 │ │ │ │ │ +_5_3 virtual _~_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r() │ │ │ │ │ +54 {} │ │ │ │ │ +55 │ │ │ │ │ +56 protected: │ │ │ │ │ +62 template │ │ │ │ │ +63 std::size_t _c_o_p_y_T_o_L_o_c_a_l_M_a_t_r_i_x(const M& A, S& rowset); │ │ │ │ │ +64 │ │ │ │ │ +66 // for ILUN │ │ │ │ │ +_6_7 _m_a_t_r_i_x___t_y_p_e _I_L_U; │ │ │ │ │ +68 }; │ │ │ │ │ +69 │ │ │ │ │ +76 template │ │ │ │ │ +_7_7 class _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +78 : public _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r{ │ │ │ │ │ +79 public: │ │ │ │ │ +_8_1 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_8_2 typedef typename std::remove_const::type _r_i_l_u___t_y_p_e; │ │ │ │ │ +_8_4 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_8_6 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +87 │ │ │ │ │ +88 │ │ │ │ │ +_9_3 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +94 { │ │ │ │ │ +95 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e(this->_I_L_U,v,d); │ │ │ │ │ +96 } │ │ │ │ │ +104 template │ │ │ │ │ +105 void _s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowset); │ │ │ │ │ +106 │ │ │ │ │ +107 }; │ │ │ │ │ +108 │ │ │ │ │ +109 template │ │ │ │ │ +_1_1_0 class _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +111 : public _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r{ │ │ │ │ │ +112 public: │ │ │ │ │ +_1_1_4 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_1_1_5 typedef typename std::remove_const::type _r_i_l_u___t_y_p_e; │ │ │ │ │ +_1_1_7 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_1_9 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +120 │ │ │ │ │ +_1_2_5 void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +126 { │ │ │ │ │ +127 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e(RILU,v,d); │ │ │ │ │ +128 } │ │ │ │ │ +129 │ │ │ │ │ +137 template │ │ │ │ │ +138 void _s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowset); │ │ │ │ │ +139 │ │ │ │ │ +140 private: │ │ │ │ │ +144 _r_i_l_u___t_y_p_e RILU; │ │ │ │ │ +145 }; │ │ │ │ │ +146 │ │ │ │ │ +147 │ │ │ │ │ 148 │ │ │ │ │ -149 // we can allocate the windows now │ │ │ │ │ -150 nblocks = _nblocks; │ │ │ │ │ -151 if (nblocks>0) │ │ │ │ │ +149 template │ │ │ │ │ +150 template │ │ │ │ │ +_1_5_1 std::size_t _I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_M_,_X_,_Y_>_:_:_c_o_p_y_T_o_L_o_c_a_l_M_a_t_r_i_x(const M& A, S& │ │ │ │ │ +rowSet) │ │ │ │ │ 152 { │ │ │ │ │ -153 // allocate and construct the windows │ │ │ │ │ -154 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ -155 new (block) window_type[nblocks]; │ │ │ │ │ -156 │ │ │ │ │ -157 // set the windows into the big array │ │ │ │ │ -158 for (_s_i_z_e___t_y_p_e i=0; ip+(i*m)); │ │ │ │ │ -160 } │ │ │ │ │ -161 else │ │ │ │ │ -162 { │ │ │ │ │ -163 nblocks = 0; │ │ │ │ │ -164 block = nullptr; │ │ │ │ │ -165 } │ │ │ │ │ -166 │ │ │ │ │ -167 // and the vector is usable │ │ │ │ │ -168 initialized = true; │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -_1_7_2 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r (const _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& a) │ │ │ │ │ -173 { │ │ │ │ │ -174 // allocate the big array in the base class │ │ │ │ │ -175 this->n = a.n; │ │ │ │ │ -176 if (this->n>0) │ │ │ │ │ -177 { │ │ │ │ │ -178 // allocate and construct objects │ │ │ │ │ -179 this->p = allocator_.allocate(this->n); │ │ │ │ │ -180 new (this->p)B[this->n]; │ │ │ │ │ -181 │ │ │ │ │ -182 // copy data │ │ │ │ │ -183 for (_s_i_z_e___t_y_p_e i=0; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ -184 } │ │ │ │ │ -185 else │ │ │ │ │ -186 { │ │ │ │ │ -187 this->n = 0; │ │ │ │ │ -188 this->p = nullptr; │ │ │ │ │ -189 } │ │ │ │ │ -190 │ │ │ │ │ -191 // we can allocate the windows now │ │ │ │ │ -192 nblocks = a.nblocks; │ │ │ │ │ -193 if (nblocks>0) │ │ │ │ │ -194 { │ │ │ │ │ -195 // alloc │ │ │ │ │ -196 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ -197 new (block) window_type[nblocks]; │ │ │ │ │ +153 // Calculate consecutive indices for local problem │ │ │ │ │ +154 // while perserving the ordering │ │ │ │ │ +155 typedef typename M::size_type size_type; │ │ │ │ │ +156 typedef std::map IndexMap; │ │ │ │ │ +157 typedef typename IndexMap::iterator IMIter; │ │ │ │ │ +158 IndexMap indexMap; │ │ │ │ │ +159 IMIter guess = indexMap.begin(); │ │ │ │ │ +160 size_type localIndex=0; │ │ │ │ │ +161 │ │ │ │ │ +162 typedef typename S::const_iterator SIter; │ │ │ │ │ +163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end(); │ │ │ │ │ +164 rowIdx!= rowEnd; ++rowIdx, ++localIndex) │ │ │ │ │ +165 guess = indexMap.insert(guess, │ │ │ │ │ +166 std::make_pair(*rowIdx,localIndex)); │ │ │ │ │ +167 │ │ │ │ │ +168 │ │ │ │ │ +169 // Build Matrix for local subproblem │ │ │ │ │ +170 ILU.setSize(rowSet.size(),rowSet.size()); │ │ │ │ │ +171 ILU.setBuildMode(matrix_type::row_wise); │ │ │ │ │ +172 │ │ │ │ │ +173 // Create sparsity pattern │ │ │ │ │ +174 typedef typename matrix_type::CreateIterator CIter; │ │ │ │ │ +175 CIter rowCreator = ILU.createbegin(); │ │ │ │ │ +176 std::size_t offset=0; │ │ │ │ │ +177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end(); │ │ │ │ │ +178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) { │ │ │ │ │ +179 // See which row entries are in our subset and add them to │ │ │ │ │ +180 // the sparsity pattern │ │ │ │ │ +181 guess = indexMap.begin(); │ │ │ │ │ +182 │ │ │ │ │ +183 for(typename matrix_type::ConstColIterator _c_o_l=A[*rowIdx].begin(), │ │ │ │ │ +184 endcol=A[*rowIdx]._e_n_d(); _c_o_l != endcol; ++_c_o_l) { │ │ │ │ │ +185 // search for the entry in the row set │ │ │ │ │ +186 guess = indexMap.find(_c_o_l.index()); │ │ │ │ │ +187 if(guess!=indexMap.end()) { │ │ │ │ │ +188 // add local index to row │ │ │ │ │ +189 rowCreator.insert(guess->second); │ │ │ │ │ +190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second- │ │ │ │ │ +rowCreator.index()))); │ │ │ │ │ +191 } │ │ │ │ │ +192 } │ │ │ │ │ +193 │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +196 // Insert the matrix values for the local problem │ │ │ │ │ +197 typename matrix_type::iterator iluRow=ILU.begin(); │ │ │ │ │ 198 │ │ │ │ │ -199 // and we must set the windows │ │ │ │ │ -200 block[0].set(a.block[0].getsize(),this->p); // first block │ │ │ │ │ -201 for (_s_i_z_e___t_y_p_e i=1; ibegin(); │ │ │ │ │ +204 for(typename matrix_type::ConstColIterator _c_o_l=A[*rowIdx].begin(), │ │ │ │ │ +205 endcol=A[*rowIdx]._e_n_d(); _c_o_l != endcol; ++_c_o_l) { │ │ │ │ │ +206 // search for the entry in the row set │ │ │ │ │ +207 guess = indexMap.find(_c_o_l.index()); │ │ │ │ │ +208 if(guess!=indexMap.end()) { │ │ │ │ │ +209 // set local value │ │ │ │ │ +210 (*localCol)=(*col); │ │ │ │ │ +211 ++localCol; │ │ │ │ │ 212 } │ │ │ │ │ -213 │ │ │ │ │ -_2_1_5 _~_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r () │ │ │ │ │ -216 { │ │ │ │ │ -217 if (this->n>0) { │ │ │ │ │ -218 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -219 while (i) │ │ │ │ │ -220 this->p[--i].~B(); │ │ │ │ │ -221 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -222 } │ │ │ │ │ -223 if (nblocks>0) { │ │ │ │ │ -224 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ -225 while (i) │ │ │ │ │ -226 block[--i].~window_type(); │ │ │ │ │ -227 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ -228 } │ │ │ │ │ -229 │ │ │ │ │ -230 } │ │ │ │ │ -231 │ │ │ │ │ -232 │ │ │ │ │ -_2_3_4 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e _nblocks) │ │ │ │ │ -235 { │ │ │ │ │ -236 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ -237 if (this->n>0) { │ │ │ │ │ -238 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -239 while (i) │ │ │ │ │ -240 this->p[--i].~B(); │ │ │ │ │ -241 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -242 } │ │ │ │ │ -243 if (nblocks>0) { │ │ │ │ │ -244 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ -245 while (i) │ │ │ │ │ -246 block[--i].~window_type(); │ │ │ │ │ -247 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ -248 } │ │ │ │ │ -249 this->n = 0; │ │ │ │ │ -250 this->p = nullptr; │ │ │ │ │ -251 │ │ │ │ │ -252 // we can allocate the windows now │ │ │ │ │ -253 nblocks = _nblocks; │ │ │ │ │ -254 if (nblocks>0) │ │ │ │ │ -255 { │ │ │ │ │ -256 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ -257 new (block) window_type[nblocks]; │ │ │ │ │ -258 } │ │ │ │ │ -259 else │ │ │ │ │ -260 { │ │ │ │ │ -261 nblocks = 0; │ │ │ │ │ -262 block = nullptr; │ │ │ │ │ -263 } │ │ │ │ │ -264 │ │ │ │ │ -265 // and the vector not fully usable │ │ │ │ │ -266 initialized = false; │ │ │ │ │ -267 } │ │ │ │ │ -268 │ │ │ │ │ -_2_7_0 void _r_e_s_i_z_e (_s_i_z_e___t_y_p_e _nblocks, _s_i_z_e___t_y_p_e m) │ │ │ │ │ -271 { │ │ │ │ │ -272 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ -273 if (this->n>0) { │ │ │ │ │ -274 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -275 while (i) │ │ │ │ │ -276 this->p[--i].~B(); │ │ │ │ │ -277 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -278 } │ │ │ │ │ -279 if (nblocks>0) { │ │ │ │ │ -280 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ -281 while (i) │ │ │ │ │ -282 block[--i].~window_type(); │ │ │ │ │ -283 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ -284 } │ │ │ │ │ -285 │ │ │ │ │ -286 // and we can allocate the big array in the base class │ │ │ │ │ -287 this->n = _nblocks*m; │ │ │ │ │ -288 if (this->n>0) │ │ │ │ │ -289 { │ │ │ │ │ -290 this->p = allocator_.allocate(this->n); │ │ │ │ │ -291 new (this->p)B[this->n]; │ │ │ │ │ -292 } │ │ │ │ │ -293 else │ │ │ │ │ -294 { │ │ │ │ │ -295 this->n = 0; │ │ │ │ │ -296 this->p = nullptr; │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -299 // we can allocate the windows now │ │ │ │ │ -300 nblocks = _nblocks; │ │ │ │ │ -301 if (nblocks>0) │ │ │ │ │ -302 { │ │ │ │ │ -303 // allocate and construct objects │ │ │ │ │ -304 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ -305 new (block) window_type[nblocks]; │ │ │ │ │ -306 │ │ │ │ │ -307 // set the windows into the big array │ │ │ │ │ -308 for (_s_i_z_e___t_y_p_e i=0; ip+(i*m)); │ │ │ │ │ -310 } │ │ │ │ │ -311 else │ │ │ │ │ -312 { │ │ │ │ │ -313 nblocks = 0; │ │ │ │ │ -314 block = nullptr; │ │ │ │ │ -315 } │ │ │ │ │ -316 │ │ │ │ │ -317 // and the vector is usable │ │ │ │ │ -318 initialized = true; │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -_3_2_2 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& a) │ │ │ │ │ -323 { │ │ │ │ │ -324 if (&a!=this) // check if this and a are different objects │ │ │ │ │ -325 { │ │ │ │ │ -326 // reallocate arrays if necessary │ │ │ │ │ -327 // Note: still the block sizes may vary ! │ │ │ │ │ -328 if (this->n!=a.n || nblocks!=a.nblocks) │ │ │ │ │ -329 { │ │ │ │ │ -330 // deconstruct objects and deallocate memory if necessary │ │ │ │ │ -331 if (this->n>0) { │ │ │ │ │ -332 _s_i_z_e___t_y_p_e i=this->n; │ │ │ │ │ -333 while (i) │ │ │ │ │ -334 this->p[--i].~B(); │ │ │ │ │ -335 allocator_.deallocate(this->p,this->n); │ │ │ │ │ -336 } │ │ │ │ │ -337 if (nblocks>0) { │ │ │ │ │ -338 _s_i_z_e___t_y_p_e i=nblocks; │ │ │ │ │ -339 while (i) │ │ │ │ │ -340 block[--i].~window_type(); │ │ │ │ │ -341 windowAllocator_.deallocate(block,nblocks); │ │ │ │ │ -342 } │ │ │ │ │ -343 │ │ │ │ │ -344 // allocate the big array in the base class │ │ │ │ │ -345 this->n = a.n; │ │ │ │ │ -346 if (this->n>0) │ │ │ │ │ -347 { │ │ │ │ │ -348 // allocate and construct objects │ │ │ │ │ -349 this->p = allocator_.allocate(this->n); │ │ │ │ │ -350 new (this->p)B[this->n]; │ │ │ │ │ -351 } │ │ │ │ │ -352 else │ │ │ │ │ -353 { │ │ │ │ │ -354 this->n = 0; │ │ │ │ │ -355 this->p = nullptr; │ │ │ │ │ -356 } │ │ │ │ │ -357 │ │ │ │ │ -358 // we can allocate the windows now │ │ │ │ │ -359 nblocks = a.nblocks; │ │ │ │ │ -360 if (nblocks>0) │ │ │ │ │ -361 { │ │ │ │ │ -362 // alloc │ │ │ │ │ -363 block = windowAllocator_.allocate(nblocks); │ │ │ │ │ -364 new (block) window_type[nblocks]; │ │ │ │ │ -365 } │ │ │ │ │ -366 else │ │ │ │ │ -367 { │ │ │ │ │ -368 nblocks = 0; │ │ │ │ │ -369 block = nullptr; │ │ │ │ │ -370 } │ │ │ │ │ -371 } │ │ │ │ │ -372 │ │ │ │ │ -373 // copy block structure, might be different although │ │ │ │ │ -374 // sizes are the same ! │ │ │ │ │ -375 if (nblocks>0) │ │ │ │ │ -376 { │ │ │ │ │ -377 block[0].set(a.block[0].getsize(),this->p); // first block │ │ │ │ │ -378 for (_s_i_z_e___t_y_p_e i=1; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ -384 } │ │ │ │ │ -385 │ │ │ │ │ -386 // and we have a usable vector │ │ │ │ │ -387 initialized = true; │ │ │ │ │ -388 │ │ │ │ │ -389 return *this; // Gebe Referenz zurueck damit a=b=c; klappt │ │ │ │ │ -390 } │ │ │ │ │ -391 │ │ │ │ │ -392 │ │ │ │ │ -393 //===== assignment from scalar │ │ │ │ │ -394 │ │ │ │ │ -_3_9_6 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -397 { │ │ │ │ │ -398 (static_cast&>(*this)) = k; │ │ │ │ │ -399 return *this; │ │ │ │ │ -400 } │ │ │ │ │ -401 │ │ │ │ │ -402 │ │ │ │ │ -403 //===== the creation interface │ │ │ │ │ -404 │ │ │ │ │ -405 class CreateIterator; │ │ │ │ │ -406 │ │ │ │ │ -407#ifndef DOXYGEN │ │ │ │ │ -408 │ │ │ │ │ -409 // The window_type does not hand out a reference to its size, │ │ │ │ │ -410 // so in order to provide a valid iterator, we need a workaround │ │ │ │ │ -411 // to make assignment possible. This proxy enables just that by │ │ │ │ │ -412 // implicitly converting to the stored size for read access and │ │ │ │ │ -413 // tunneling assignment to the accessor method of the window. │ │ │ │ │ -414 struct SizeProxy │ │ │ │ │ -415 { │ │ │ │ │ -416 │ │ │ │ │ -417 operator size_type() const │ │ │ │ │ -418 { │ │ │ │ │ -419 return target->getsize(); │ │ │ │ │ -420 } │ │ │ │ │ -421 │ │ │ │ │ -422 SizeProxy& operator=(size_type size) │ │ │ │ │ -423 { │ │ │ │ │ -424 target->setsize(size); │ │ │ │ │ -425 return *this; │ │ │ │ │ -426 } │ │ │ │ │ -427 │ │ │ │ │ -428 private: │ │ │ │ │ -429 │ │ │ │ │ -430 friend class CreateIterator; │ │ │ │ │ -431 │ │ │ │ │ -432 SizeProxy(window_type& t) │ │ │ │ │ -433 : target(&t) │ │ │ │ │ -434 {} │ │ │ │ │ -435 │ │ │ │ │ -436 window_type* target; │ │ │ │ │ -437 }; │ │ │ │ │ -438 │ │ │ │ │ -439#endif // DOXYGEN │ │ │ │ │ -440 │ │ │ │ │ -_4_4_2 class _C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -443 { │ │ │ │ │ -444 public: │ │ │ │ │ -_4_4_6 using _i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y = std::output_iterator_tag; │ │ │ │ │ -447 │ │ │ │ │ -_4_4_9 using _v_a_l_u_e___t_y_p_e = _s_i_z_e___t_y_p_e; │ │ │ │ │ -450 │ │ │ │ │ -_4_5_7 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = void; │ │ │ │ │ -458 │ │ │ │ │ -_4_6_0 using _p_o_i_n_t_e_r = _s_i_z_e___t_y_p_e*; │ │ │ │ │ -461 │ │ │ │ │ -_4_6_3 using _r_e_f_e_r_e_n_c_e = SizeProxy; │ │ │ │ │ -464 │ │ │ │ │ -_4_6_6 _C_r_e_a_t_e_I_t_e_r_a_t_o_r (_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& _v, int _i, bool _isEnd) : │ │ │ │ │ -467 v(_v), │ │ │ │ │ -468 i(_i), │ │ │ │ │ -469 isEnd(_isEnd) {} │ │ │ │ │ -470 │ │ │ │ │ -_4_7_1 _~_C_r_e_a_t_e_I_t_e_r_a_t_o_r() { │ │ │ │ │ -472 // When the iterator gets destructed, we allocate the memory │ │ │ │ │ -473 // for the VariableBlockVector if │ │ │ │ │ -474 // 1. the current iterator was not created as enditerator │ │ │ │ │ -475 // 2. we're at the last block │ │ │ │ │ -476 // 3. the vector hasn't been initialized earlier │ │ │ │ │ -477 if (not isEnd && i==v.nblocks && not v.initialized) │ │ │ │ │ -478 v.allocate(); │ │ │ │ │ -479 } │ │ │ │ │ -480 │ │ │ │ │ -_4_8_2 _C_r_e_a_t_e_I_t_e_r_a_t_o_r& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -483 { │ │ │ │ │ -484 // go to next block │ │ │ │ │ -485 ++i; │ │ │ │ │ -486 │ │ │ │ │ -487 return *this; │ │ │ │ │ -488 } │ │ │ │ │ -489 │ │ │ │ │ -_4_9_1 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _o_p_e_r_a_t_o_r_+_+_ (int) │ │ │ │ │ -492 { │ │ │ │ │ -493 _C_r_e_a_t_e_I_t_e_r_a_t_o_r tmp(*this); │ │ │ │ │ -494 this->_o_p_e_r_a_t_o_r_+_+(); │ │ │ │ │ -495 return tmp; │ │ │ │ │ -496 } │ │ │ │ │ -497 │ │ │ │ │ -_4_9_9 bool _o_p_e_r_a_t_o_r_!_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -500 { │ │ │ │ │ -501 return (i!=it.i) || (&v!=&it.v); │ │ │ │ │ -502 } │ │ │ │ │ -503 │ │ │ │ │ -_5_0_5 bool _o_p_e_r_a_t_o_r_=_=_ (const _C_r_e_a_t_e_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -506 { │ │ │ │ │ -507 return (i==it.i) && (&v==&it.v); │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -_5_1_1 _s_i_z_e___t_y_p_e _i_n_d_e_x () const │ │ │ │ │ -512 { │ │ │ │ │ -513 return i; │ │ │ │ │ -514 } │ │ │ │ │ -515 │ │ │ │ │ -_5_1_7 void _s_e_t_b_l_o_c_k_s_i_z_e (_s_i_z_e___t_y_p_e _k) │ │ │ │ │ -518 { │ │ │ │ │ -519 v.block[i].setsize(_k); │ │ │ │ │ -520 } │ │ │ │ │ -521 │ │ │ │ │ -523#ifdef DOXYGEN │ │ │ │ │ -524 _s_i_z_e___t_y_p_e& │ │ │ │ │ -525#else │ │ │ │ │ -526 SizeProxy │ │ │ │ │ -527#endif │ │ │ │ │ -_5_2_8 _o_p_e_r_a_t_o_r_*() │ │ │ │ │ -529 { │ │ │ │ │ -530 return {v.block[i]}; │ │ │ │ │ -531 } │ │ │ │ │ -532 │ │ │ │ │ -533 private: │ │ │ │ │ -534 _V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r& v; // my vector │ │ │ │ │ -535 _s_i_z_e___t_y_p_e i; // current block to be defined │ │ │ │ │ -536 const bool isEnd; // flag if this object was created as the end iterator. │ │ │ │ │ -537 }; │ │ │ │ │ -538 │ │ │ │ │ -539 // CreateIterator wants to set all the arrays ... │ │ │ │ │ -_5_4_0 friend class _C_r_e_a_t_e_I_t_e_r_a_t_o_r; │ │ │ │ │ -541 │ │ │ │ │ -_5_4_3 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_b_e_g_i_n () │ │ │ │ │ -544 { │ │ │ │ │ -545#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -546 if (initialized) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"no CreateIterator in initialized │ │ │ │ │ -state"); │ │ │ │ │ -547#endif │ │ │ │ │ -548 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,0, false); │ │ │ │ │ -549 } │ │ │ │ │ -550 │ │ │ │ │ -_5_5_2 _C_r_e_a_t_e_I_t_e_r_a_t_o_r _c_r_e_a_t_e_e_n_d () │ │ │ │ │ -553 { │ │ │ │ │ -554 return _C_r_e_a_t_e_I_t_e_r_a_t_o_r(*this,nblocks, true); │ │ │ │ │ -555 } │ │ │ │ │ -556 │ │ │ │ │ -557 │ │ │ │ │ -558 //===== access to components │ │ │ │ │ -559 // has to be overwritten from base class because it must │ │ │ │ │ -560 // return access to the windows │ │ │ │ │ -561 │ │ │ │ │ -_5_6_3 window_type& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ -564 { │ │ │ │ │ -565#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -566 if (i>=nblocks) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ -567#endif │ │ │ │ │ -568 return block[i]; │ │ │ │ │ -569 } │ │ │ │ │ -570 │ │ │ │ │ -_5_7_2 const window_type& _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -573 { │ │ │ │ │ -574#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -575 if (i<0 || i>=nblocks) DUNE_THROW(_I_S_T_L_E_r_r_o_r,"index out of range"); │ │ │ │ │ -576#endif │ │ │ │ │ -577 return block[i]; │ │ │ │ │ -578 } │ │ │ │ │ -579 │ │ │ │ │ -581 template │ │ │ │ │ -_5_8_2 class _R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ -583 : public RandomAccessIteratorFacade, T, R> │ │ │ │ │ -584 { │ │ │ │ │ -585 public: │ │ │ │ │ -_5_8_7 _R_e_a_l_I_t_e_r_a_t_o_r () │ │ │ │ │ -588 { │ │ │ │ │ -589 p = nullptr; │ │ │ │ │ -590 i = 0; │ │ │ │ │ -591 } │ │ │ │ │ -592 │ │ │ │ │ -_5_9_4 _R_e_a_l_I_t_e_r_a_t_o_r (window_type* _p, _s_i_z_e___t_y_p_e _i) │ │ │ │ │ -595 : p(_p), i(_i) │ │ │ │ │ -596 {} │ │ │ │ │ -597 │ │ │ │ │ -_5_9_9 void _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -600 { │ │ │ │ │ -601 ++i; │ │ │ │ │ -602 } │ │ │ │ │ -603 │ │ │ │ │ -_6_0_5 void _d_e_c_r_e_m_e_n_t() │ │ │ │ │ -606 { │ │ │ │ │ -607 --i; │ │ │ │ │ -608 } │ │ │ │ │ -609 │ │ │ │ │ -_6_1_1 bool _e_q_u_a_l_s (const _R_e_a_l_I_t_e_r_a_t_o_r& it) const │ │ │ │ │ -612 { │ │ │ │ │ -613 return (p+i)==(it.p+it.i); │ │ │ │ │ -614 } │ │ │ │ │ -615 │ │ │ │ │ -_6_1_7 window_type& _d_e_r_e_f_e_r_e_n_c_e () const │ │ │ │ │ -618 { │ │ │ │ │ -619 return p[i]; │ │ │ │ │ -620 } │ │ │ │ │ -621 │ │ │ │ │ -_6_2_2 void _a_d_v_a_n_c_e(std::ptrdiff_t d) │ │ │ │ │ -623 { │ │ │ │ │ -624 i+=d; │ │ │ │ │ -625 } │ │ │ │ │ -626 │ │ │ │ │ -_6_2_7 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _R_e_a_l_I_t_e_r_a_t_o_r& o) const │ │ │ │ │ -628 { │ │ │ │ │ -629 return o.i-i; │ │ │ │ │ -630 } │ │ │ │ │ -631 │ │ │ │ │ -632 // Needed for operator[] of the iterator │ │ │ │ │ -_6_3_3 window_type& _e_l_e_m_e_n_t_A_t (std::ptrdiff_t offset) const │ │ │ │ │ -634 { │ │ │ │ │ -635 return p[i+offset]; │ │ │ │ │ -636 } │ │ │ │ │ -637 │ │ │ │ │ -_6_3_9 _s_i_z_e___t_y_p_e _i_n_d_e_x() const │ │ │ │ │ -640 { │ │ │ │ │ -641 return i; │ │ │ │ │ -642 } │ │ │ │ │ -643 │ │ │ │ │ -644 private: │ │ │ │ │ -645 window_type* p; │ │ │ │ │ -646 _s_i_z_e___t_y_p_e i; │ │ │ │ │ -647 }; │ │ │ │ │ -648 │ │ │ │ │ -_6_4_9 using _I_t_e_r_a_t_o_r = _R_e_a_l_I_t_e_r_a_t_o_r_<_v_a_l_u_e___t_y_p_e_,_w_i_n_d_o_w___t_y_p_e_&_>; │ │ │ │ │ -650 │ │ │ │ │ -_6_5_2 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ -653 { │ │ │ │ │ -654 return _I_t_e_r_a_t_o_r(block,0); │ │ │ │ │ -655 } │ │ │ │ │ -656 │ │ │ │ │ -_6_5_8 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ -659 { │ │ │ │ │ -660 return _I_t_e_r_a_t_o_r(block,nblocks); │ │ │ │ │ -661 } │ │ │ │ │ -662 │ │ │ │ │ -_6_6_5 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ -666 { │ │ │ │ │ -667 return _I_t_e_r_a_t_o_r(block,nblocks-1); │ │ │ │ │ -668 } │ │ │ │ │ -669 │ │ │ │ │ -_6_7_2 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ -673 { │ │ │ │ │ -674 return _I_t_e_r_a_t_o_r(block,-1); │ │ │ │ │ -675 } │ │ │ │ │ -676 │ │ │ │ │ -_6_7_8 using _i_t_e_r_a_t_o_r = _I_t_e_r_a_t_o_r; │ │ │ │ │ -679 │ │ │ │ │ -_6_8_1 using _C_o_n_s_t_I_t_e_r_a_t_o_r = _R_e_a_l_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _v_a_l_u_e___t_y_p_e_,_ _c_o_n_s_t_ _w_i_n_d_o_w___t_y_p_e_&_>; │ │ │ │ │ -682 │ │ │ │ │ -_6_8_4 using _c_o_n_s_t___i_t_e_r_a_t_o_r = _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -685 │ │ │ │ │ -_6_8_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ -688 { │ │ │ │ │ -689 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,0); │ │ │ │ │ -690 } │ │ │ │ │ -691 │ │ │ │ │ -_6_9_3 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ -694 { │ │ │ │ │ -695 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,nblocks); │ │ │ │ │ -696 } │ │ │ │ │ -697 │ │ │ │ │ -_7_0_0 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ -701 { │ │ │ │ │ -702 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,nblocks-1); │ │ │ │ │ -703 } │ │ │ │ │ -704 │ │ │ │ │ -_7_0_6 _C_o_n_s_t_I_t_e_r_a_t_o_r _r_e_n_d () const │ │ │ │ │ -707 { │ │ │ │ │ -708 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,-1); │ │ │ │ │ -709 } │ │ │ │ │ -710 │ │ │ │ │ -_7_1_2 _I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) │ │ │ │ │ -713 { │ │ │ │ │ -714 return _I_t_e_r_a_t_o_r(block,std::min(i,nblocks)); │ │ │ │ │ -715 } │ │ │ │ │ -716 │ │ │ │ │ -_7_1_8 _C_o_n_s_t_I_t_e_r_a_t_o_r _f_i_n_d (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -719 { │ │ │ │ │ -720 return _C_o_n_s_t_I_t_e_r_a_t_o_r(block,std::min(i,nblocks)); │ │ │ │ │ -721 } │ │ │ │ │ -722 │ │ │ │ │ -723 //===== sizes │ │ │ │ │ -724 │ │ │ │ │ -_7_2_6 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ -727 { │ │ │ │ │ -728 return nblocks; │ │ │ │ │ -729 } │ │ │ │ │ -730 │ │ │ │ │ -_7_3_5 _s_i_z_e___t_y_p_e _s_i_z_e () const │ │ │ │ │ -736 { │ │ │ │ │ -737 return nblocks; │ │ │ │ │ -738 } │ │ │ │ │ -739 │ │ │ │ │ -740 │ │ │ │ │ -741 private: │ │ │ │ │ -742 │ │ │ │ │ -743 void allocate() { │ │ │ │ │ -744 if (this->initialized) │ │ │ │ │ -745 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Attempt to re-allocate already initialized │ │ │ │ │ -VariableBlockVector"); │ │ │ │ │ -746 │ │ │ │ │ -747 // calculate space needed: │ │ │ │ │ -748 this->n=0; │ │ │ │ │ -749 for(_s_i_z_e___t_y_p_e i = 0; i < nblocks; i++) { │ │ │ │ │ -750 this->n += block[i].size(); │ │ │ │ │ -751 } │ │ │ │ │ -752 │ │ │ │ │ -753 // now we can allocate the big array in the base class of v │ │ │ │ │ -754 if (this->n>0) │ │ │ │ │ -755 { │ │ │ │ │ -756 // allocate and construct objects │ │ │ │ │ -757 this->p = allocator_.allocate(this->n); │ │ │ │ │ -758 new (this->p)B[this->n]; │ │ │ │ │ -759 } │ │ │ │ │ -760 else │ │ │ │ │ -761 { │ │ │ │ │ -762 this->p = nullptr; │ │ │ │ │ -763 } │ │ │ │ │ -764 │ │ │ │ │ -765 // and we set the window pointers │ │ │ │ │ -766 this->block[0].setptr(this->p); // pointer to first block │ │ │ │ │ -767 for (_s_i_z_e___t_y_p_e j=1; jinitialized = true; │ │ │ │ │ -772 } │ │ │ │ │ -773 │ │ │ │ │ -774 _s_i_z_e___t_y_p_e nblocks; // number of blocks in vector │ │ │ │ │ -775 window_type* block; // array of blocks pointing to the array in the base │ │ │ │ │ -class │ │ │ │ │ -776 bool initialized; // true if vector has been initialized │ │ │ │ │ -777 │ │ │ │ │ -778 A allocator_; │ │ │ │ │ -779 │ │ │ │ │ -780 typename std::allocator_traits::template rebind_alloc │ │ │ │ │ -windowAllocator_; │ │ │ │ │ -781 }; │ │ │ │ │ -782 │ │ │ │ │ -783 │ │ │ │ │ -784 │ │ │ │ │ -787} // end namespace │ │ │ │ │ -788 │ │ │ │ │ -789#endif │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ +213 } │ │ │ │ │ +214 } │ │ │ │ │ +215 return offset; │ │ │ │ │ +216 } │ │ │ │ │ +217 │ │ │ │ │ +218 │ │ │ │ │ +219 template │ │ │ │ │ +220 template │ │ │ │ │ +_2_2_1 void _I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_M_,_X_,_Y_>_:_:_s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowSet) │ │ │ │ │ +222 { │ │ │ │ │ +223 this->copyToLocalMatrix(A,rowSet); │ │ │ │ │ +224 _I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n(this->ILU); │ │ │ │ │ +225 } │ │ │ │ │ +226 │ │ │ │ │ +227 template │ │ │ │ │ +228 template │ │ │ │ │ +_2_2_9 void _I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_<_M_,_X_,_Y_>_:_:_s_e_t_S_u_b_M_a_t_r_i_x(const M& A, S& rowSet) │ │ │ │ │ +230 { │ │ │ │ │ +231 std::size_t offset=copyToLocalMatrix(A,rowSet); │ │ │ │ │ +232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size()); │ │ │ │ │ +233 RILU.setBuildMode(matrix_type::row_wise); │ │ │ │ │ +234 _I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n(this->ILU, (offset+1)/2, RILU); │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +238} // end name space DUNE │ │ │ │ │ +239 │ │ │ │ │ +240 │ │ │ │ │ +241#endif │ │ │ │ │ +_m_a_t_r_i_x_._h_h │ │ │ │ │ +A dynamic dense block matrix class. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_s_._h_h │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_c_o_p_y_T_o_L_o_c_a_l_M_a_t_r_i_x │ │ │ │ │ +std::size_t copyToLocalMatrix(const M &A, S &rowset) │ │ │ │ │ +Copy the local part of the global matrix to ILU. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ +void setSubMatrix(const M &A, S &rowset) │ │ │ │ │ +Set the data of the local problem. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_s_e_t_S_u_b_M_a_t_r_i_x │ │ │ │ │ +void setSubMatrix(const M &A, S &rowset) │ │ │ │ │ +Set the data of the local problem. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:221 │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A Vector of blocks with different blocksizes. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -RealIterator< value_type, window_type & > Iterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:649 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -VariableBlockVector() │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -A allocator_type │ │ │ │ │ -export the allocator type │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -VariableBlockVector(size_type _nblocks, size_type m) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:735 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of blocks in the vector (are of variable size here) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:726 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -VariableBlockVector(const VariableBlockVector &a) │ │ │ │ │ -copy constructor, has copy semantics │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -VariableBlockVector(size_type _nblocks) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_~_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -~VariableBlockVector() │ │ │ │ │ -free dynamic memory │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -window_type & operator[](size_type i) │ │ │ │ │ -random access to blocks │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:563 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_r_e_a_t_e_e_n_d │ │ │ │ │ -CreateIterator createend() │ │ │ │ │ -get create iterator pointing to one after the last block │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:552 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -Iterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:672 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ -CreateIterator createbegin() │ │ │ │ │ -get initial create iterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:543 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -VariableBlockVector & operator=(const VariableBlockVector &a) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr auto blocklevel │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_n_d │ │ │ │ │ -ConstIterator rend() const │ │ │ │ │ -end ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:706 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The size type for the index access. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_n_d │ │ │ │ │ -ConstIterator find(size_type i) const │ │ │ │ │ -random access returning iterator (end if not contained) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:718 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:700 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_n_d │ │ │ │ │ -Iterator find(size_type i) │ │ │ │ │ -random access returning iterator (end if not contained) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:712 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const window_type & const_reference │ │ │ │ │ -Export type used for const references to container entries. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -RealIterator< const value_type, const window_type & > ConstIterator │ │ │ │ │ -Const iterator. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:681 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -Iterator end() │ │ │ │ │ -end Iterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:658 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -ConstIterator begin() const │ │ │ │ │ -begin ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:687 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -BlockVector< B, A > value_type │ │ │ │ │ -Type of the elements of the outer vector, i.e., dynamic vectors of B. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_e_n_d │ │ │ │ │ -ConstIterator end() const │ │ │ │ │ -end ConstIterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:693 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -BlockVector< B, A > block_type │ │ │ │ │ -Same as value_type, here for historical reasons. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type _nblocks, size_type m) │ │ │ │ │ -same effect as constructor with same argument │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:270 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -window_type & reference │ │ │ │ │ -Export type used for references to container entries. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type _nblocks) │ │ │ │ │ -same effect as constructor with same argument │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:234 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -Iterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:665 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin Iterator │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:652 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator class for sequential creation of blocks. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:443 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const CreateIterator &it) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -size_type index() const │ │ │ │ │ -dereferencing │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:511 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -SizeProxy reference │ │ │ │ │ -reference type │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:463 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_p_o_i_n_t_e_r │ │ │ │ │ -size_type * pointer │ │ │ │ │ -pointer type │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:460 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const CreateIterator &it) const │ │ │ │ │ -inequality │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_~_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -~CreateIterator() │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:471 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -size_type value_type │ │ │ │ │ -value type │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ -CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_s_e_t_b_l_o_c_k_s_i_z_e │ │ │ │ │ -void setblocksize(size_type _k) │ │ │ │ │ -set size of current block │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:517 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -size_type & operator*() │ │ │ │ │ -Access size of current block. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:528 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r___c_a_t_e_g_o_r_y │ │ │ │ │ -std::output_iterator_tag iterator_category │ │ │ │ │ -iterator category │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:446 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -CreateIterator & operator++() │ │ │ │ │ -prefix increment │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:482 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -void difference_type │ │ │ │ │ -difference type (unused) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:457 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:584 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ -RealIterator(window_type *_p, size_type _i) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:594 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const RealIterator &it) const │ │ │ │ │ -equality │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:611 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_i_n_d_e_x │ │ │ │ │ -size_type index() const │ │ │ │ │ -Return the index of the entry this iterator is pointing to. │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:639 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ -window_type & elementAt(std::ptrdiff_t offset) const │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:633 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -prefix decrement │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:605 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ -void advance(std::ptrdiff_t d) │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:622 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -prefix increment │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:599 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r │ │ │ │ │ -RealIterator() │ │ │ │ │ -constructor, no arguments │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:587 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -std::ptrdiff_t distanceTo(const RealIterator &o) const │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:627 │ │ │ │ │ -_D_u_n_e_:_:_V_a_r_i_a_b_l_e_B_l_o_c_k_V_e_c_t_o_r_:_:_R_e_a_l_I_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -window_type & dereference() const │ │ │ │ │ -dereferencing │ │ │ │ │ -DDeeffiinniittiioonn vbvector.hh:617 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e │ │ │ │ │ +void blockILUBacksolve(const M &A, X &v, const Y &d) │ │ │ │ │ +LU backsolve with stored inverse. │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void blockILU0Decomposition(M &A) │ │ │ │ │ +compute ILU decomposition of A. A is overwritten by its decomposition │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void blockILUDecomposition(const M &A, int n, M &ILU) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +base class encapsulating common algorithms of ILU0SubdomainSolver and │ │ │ │ │ +ILUNSubdomainSolver. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_I_L_U │ │ │ │ │ +matrix_type ILU │ │ │ │ │ +The ILU0 decomposition of the matrix, or the local matrix. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_~_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +virtual ~ILUSubdomainSolver() │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d)=0 │ │ │ │ │ +Apply the subdomain solver. │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +Exact subdomain solver using ILU(p) with appropriate p. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_i_l_u___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type rilu_type │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_0_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const Y &d) │ │ │ │ │ +Apply the subdomain solver. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_i_l_u___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type rilu_type │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const Y &d) │ │ │ │ │ +Apply the subdomain solver. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_N_S_u_b_d_o_m_a_i_n_S_o_l_v_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn ilusubdomainsolver.hh:119 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +RowIterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00206.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: scaledidmatrix.hh File Reference │ │ │ │ +dune-istl: matrixmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,49 +71,69 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
scaledidmatrix.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

This file implements a quadratic matrix of fixed size which is a multiple of the identity. │ │ │ │ +

provides functions for sparse matrix matrix multiplication. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <dune/istl/bcrsmatrix.hh>
│ │ │ │ #include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ScaledIdentityMatrix< K, n >
 A multiple of the identity matrix of static size. More...
struct  Dune::MatMultMatResult< M1, M2 >
 Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$) More...
 
struct  Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > >
struct  Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >
 
struct  Dune::FieldTraits< ScaledIdentityMatrix< K, n > >
struct  Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >
 
struct  Dune::TransposedMatMultMatResult< M1, M2 >
 Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$) More...
 
struct  Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > >
 
struct  Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class T , class A , class A1 , class A2 , int n, int m, int k>
void Dune::matMultTransposeMat (BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
 Calculate product of a sparse matrix with a transposed sparse matrices ( $C=A*B^T$).
 
template<class T , class A , class A1 , class A2 , int n, int m, int k>
void Dune::matMultMat (BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
 Calculate product of two sparse matrices ( $C=A*B$).
 
template<class T , class A , class A1 , class A2 , int n, int m, int k>
void Dune::transposeMatMultMat (BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
 Calculate product of a transposed sparse matrix with another sparse matrices ( $C=A^T*B$).
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file implements a quadratic matrix of fixed size which is a multiple of the identity.

│ │ │ │ +

provides functions for sparse matrix matrix multiplication.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,36 +1,66 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -scaledidmatrix.hh File Reference │ │ │ │ │ -This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ -the identity. _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 │ │ │ │ │ +matrixmatrix.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s │ │ │ │ │ +provides functions for sparse matrix matrix multiplication. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ #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_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _> │ │ │ │ │ -  A multiple of the identity matrix of static size. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _M_1_,_ _M_2_ _> │ │ │ │ │ +  Helper TMP to get the result type of a sparse matrix matrix │ │ │ │ │ + multiplication ( [$C=A*B$]) _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r_<_ _D_e_n_s_e_M_a_t_r_i_x_,_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _f_i_e_l_d_,_ _N │ │ │ │ │ - _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _> │ │ │ │ │ + _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _A_ _>_, │ │ │ │ │ + _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _M_1_,_ _M_2_ _> │ │ │ │ │ +  Helper TMP to get the result type of a sparse matrix matrix │ │ │ │ │ + multiplication ( [$C=A*B$]) _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_< │ │ │ │ │ + _T_,_ _k_,_ _m_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_, │ │ │ │ │ + _A_ _>_,_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_m_a_t_M_u_l_t_T_r_a_n_s_p_o_s_e_M_a_t (_B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, k >, A > &res, │ │ │ │ │ + const _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, m >, A1 > &_m_a_t, const _B_C_R_S_M_a_t_r_i_x< │ │ │ │ │ + _F_i_e_l_d_M_a_t_r_i_x< T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ +  Calculate product of a sparse matrix with a transposed sparse matrices ( │ │ │ │ │ + [$C=A*B^T$]). │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_m_a_t_M_u_l_t_M_a_t (_B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, m >, A > &res, const │ │ │ │ │ + _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, k >, A1 > &_m_a_t, const _B_C_R_S_M_a_t_r_i_x< │ │ │ │ │ + _F_i_e_l_d_M_a_t_r_i_x< T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ +  Calculate product of two sparse matrices ( [$C=A*B$]). │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_t_r_a_n_s_p_o_s_e_M_a_t_M_u_l_t_M_a_t (_B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, n, m >, A > &res, │ │ │ │ │ + const _B_C_R_S_M_a_t_r_i_x< _F_i_e_l_d_M_a_t_r_i_x< T, k, n >, A1 > &_m_a_t, const _B_C_R_S_M_a_t_r_i_x< │ │ │ │ │ + _F_i_e_l_d_M_a_t_r_i_x< T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ +  Calculate product of a transposed sparse matrix with another sparse │ │ │ │ │ + matrices ( [$C=A^T*B$]). │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ -the identity. │ │ │ │ │ +provides functions for sparse matrix matrix multiplication. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: scaledidmatrix.hh Source File │ │ │ │ +dune-istl: matrixmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,626 +74,622 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
scaledidmatrix.hh
│ │ │ │ +
matrixmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH
│ │ │ │ -
6#define DUNE_ISTL_SCALEDIDMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_MATRIXMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_MATRIXMATRIX_HH
│ │ │ │
7
│ │ │ │ -
14#include <cmath>
│ │ │ │ -
15#include <cstddef>
│ │ │ │ -
16#include <complex>
│ │ │ │ -
17#include <iostream>
│ │ │ │ -
18#include <dune/common/exceptions.hh>
│ │ │ │ -
19#include <dune/common/fmatrix.hh>
│ │ │ │ -
20#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -
21#include <dune/common/ftraits.hh>
│ │ │ │ -
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24
│ │ │ │ -
28 template<class K, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
30 {
│ │ │ │ -
31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix<K,n> > WrapperType;
│ │ │ │ -
32
│ │ │ │ -
33 public:
│ │ │ │ -
34 //===== type definitions and constants
│ │ │ │ -
35
│ │ │ │ -
37 typedef K field_type;
│ │ │ │ -
38
│ │ │ │ -
40 typedef K block_type;
│ │ │ │ +
8#include <tuple>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ +
11#include <dune/common/fmatrix.hh>
│ │ │ │ +
12#include <dune/common/timer.hh>
│ │ │ │ +
13namespace Dune
│ │ │ │ +
14{
│ │ │ │ +
15
│ │ │ │ +
26 namespace
│ │ │ │ +
27 {
│ │ │ │ +
28
│ │ │ │ +
37 template<int b>
│ │ │ │ +
38 struct NonzeroPatternTraverser
│ │ │ │ +
39 {};
│ │ │ │ +
40
│ │ │ │
41
│ │ │ │ -
43 typedef std::size_t size_type;
│ │ │ │ -
44
│ │ │ │ -
46 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
47 static constexpr std::size_t blocklevel = 1;
│ │ │ │ -
48
│ │ │ │ -
50 typedef DiagonalRowVector<K,n> row_type;
│ │ │ │ - │ │ │ │ -
52 typedef DiagonalRowVectorConst<K,n> const_row_type;
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ -
56 enum {
│ │ │ │ -
58 rows = n,
│ │ │ │ -
60 cols = n
│ │ │ │ -
61 };
│ │ │ │ -
62
│ │ │ │ -
63 //===== constructors
│ │ │ │ - │ │ │ │ +
42 template<>
│ │ │ │ +
43 struct NonzeroPatternTraverser<0>
│ │ │ │ +
44 {
│ │ │ │ +
45 template<class T,class A1, class A2, class F, int n, int m, int k>
│ │ │ │ +
46 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>& A,
│ │ │ │ + │ │ │ │ +
48 F& func)
│ │ │ │ +
49 {
│ │ │ │ +
50 if(A.M()!=B.N())
│ │ │ │ +
51 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.M()<<"!="<<B.N());
│ │ │ │ +
52
│ │ │ │ +
53 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstRowIterator Row;
│ │ │ │ +
54 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstColIterator Col;
│ │ │ │ +
55 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
│ │ │ │ +
56 for(Row row= A.begin(); row != A.end(); ++row) {
│ │ │ │ +
57 // Loop over all column entries
│ │ │ │ +
58 for(Col col = row->begin(); col != row->end(); ++col) {
│ │ │ │ +
59 // entry at i,k
│ │ │ │ +
60 // search for all nonzeros in row k
│ │ │ │ +
61 for(BCol bcol = B[col.index()].begin(); bcol != B[col.index()].end(); ++bcol) {
│ │ │ │ +
62 func(*col, *bcol, row.index(), bcol.index());
│ │ │ │ +
63 }
│ │ │ │ +
64 }
│ │ │ │ +
65 }
│ │ │ │ +
66 }
│ │ │ │
67
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
71 : p_(k)
│ │ │ │ -
72 {}
│ │ │ │ -
│ │ │ │ -
73
│ │ │ │ -
74 //===== assignment from scalar
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
76 {
│ │ │ │ -
77 p_ = k;
│ │ │ │ -
78 return *this;
│ │ │ │ -
79 }
│ │ │ │ -
│ │ │ │ -
80
│ │ │ │ -
81 // check if matrix is identical to other matrix (not only identical values)
│ │ │ │ -
│ │ │ │ -
82 bool identical(const ScaledIdentityMatrix<K,n>& other) const
│ │ │ │ -
83 {
│ │ │ │ -
84 return (this==&other);
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
87 //===== iterator interface to rows of the matrix
│ │ │ │ -
89 typedef ContainerWrapperIterator<const WrapperType, reference, reference> Iterator;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
95 typedef typename row_type::Iterator ColIterator;
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
99 {
│ │ │ │ -
100 return Iterator(WrapperType(this),0);
│ │ │ │ -
101 }
│ │ │ │ -
│ │ │ │ -
102
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
105 {
│ │ │ │ -
106 return Iterator(WrapperType(this),n);
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
112 {
│ │ │ │ -
113 return Iterator(WrapperType(this),n-1);
│ │ │ │ -
114 }
│ │ │ │ -
│ │ │ │ -
115
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
119 {
│ │ │ │ -
120 return Iterator(WrapperType(this),-1);
│ │ │ │ -
121 }
│ │ │ │ -
│ │ │ │ -
122
│ │ │ │ -
123
│ │ │ │ -
125 typedef ContainerWrapperIterator<const WrapperType, const_reference, const_reference> ConstIterator;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
131 typedef typename const_row_type::ConstIterator ConstColIterator;
│ │ │ │ -
132
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
135 {
│ │ │ │ -
136 return ConstIterator(WrapperType(this),0);
│ │ │ │ -
137 }
│ │ │ │ -
│ │ │ │ -
138
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 {
│ │ │ │ -
142 return ConstIterator(WrapperType(this),n);
│ │ │ │ -
143 }
│ │ │ │ -
│ │ │ │ -
144
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
148 {
│ │ │ │ -
149 return ConstIterator(WrapperType(this),n-1);
│ │ │ │ -
150 }
│ │ │ │ -
│ │ │ │ -
151
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
155 {
│ │ │ │ -
156 return ConstIterator(WrapperType(this),-1);
│ │ │ │ -
157 }
│ │ │ │ -
│ │ │ │ +
68 };
│ │ │ │ +
69
│ │ │ │ +
70 template<>
│ │ │ │ +
71 struct NonzeroPatternTraverser<1>
│ │ │ │ +
72 {
│ │ │ │ +
73 template<class T, class A1, class A2, class F, int n, int m, int k>
│ │ │ │ +
74 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>& A,
│ │ │ │ + │ │ │ │ +
76 F& func)
│ │ │ │ +
77 {
│ │ │ │ +
78
│ │ │ │ +
79 if(A.N()!=B.N())
│ │ │ │ +
80 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.N()<<"!="<<B.N());
│ │ │ │ +
81
│ │ │ │ +
82 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstRowIterator Row;
│ │ │ │ +
83 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstColIterator Col;
│ │ │ │ +
84 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
│ │ │ │ +
85
│ │ │ │ +
86 for(Row row=A.begin(); row!=A.end(); ++row) {
│ │ │ │ +
87 for(Col col=row->begin(); col!=row->end(); ++col) {
│ │ │ │ +
88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end(); ++bcol) {
│ │ │ │ +
89 func(*col, *bcol, col.index(), bcol.index());
│ │ │ │ +
90 }
│ │ │ │ +
91 }
│ │ │ │ +
92 }
│ │ │ │ +
93 }
│ │ │ │ +
94 };
│ │ │ │ +
95
│ │ │ │ +
96 template<>
│ │ │ │ +
97 struct NonzeroPatternTraverser<2>
│ │ │ │ +
98 {
│ │ │ │ +
99 template<class T, class A1, class A2, class F, int n, int m, int k>
│ │ │ │ +
100 static void traverse(const BCRSMatrix<FieldMatrix<T,n,m>,A1>& mat,
│ │ │ │ +
101 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt,
│ │ │ │ +
102 F& func)
│ │ │ │ +
103 {
│ │ │ │ +
104 if(mat.M()!=matt.M())
│ │ │ │ +
105 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<mat.M()<<"!="<<matt.M());
│ │ │ │ +
106
│ │ │ │ +
107 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstRowIterator row_iterator;
│ │ │ │ +
108 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstColIterator col_iterator;
│ │ │ │ +
109 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstRowIterator row_iterator_t;
│ │ │ │ +
110 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstColIterator col_iterator_t;
│ │ │ │ +
111
│ │ │ │ +
112 for(row_iterator mrow=mat.begin(); mrow != mat.end(); ++mrow) {
│ │ │ │ +
113 //iterate over the column entries
│ │ │ │ +
114 // mt is a transposed matrix crs therefore it is treated as a ccs matrix
│ │ │ │ +
115 // and the row_iterator iterates over the columns of the transposed matrix.
│ │ │ │ +
116 // search the row of the transposed matrix for an entry with the same index
│ │ │ │ +
117 // as the mcol iterator
│ │ │ │ +
118
│ │ │ │ +
119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {
│ │ │ │ +
120 //Search for col entries in mat that have a corrsponding row index in matt
│ │ │ │ +
121 // (i.e. corresponding col index in the as this is the transposed matrix
│ │ │ │ +
122 col_iterator_t mtrow=mtcol->begin();
│ │ │ │ +
123 bool funcCalled = false;
│ │ │ │ +
124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {
│ │ │ │ +
125 // search
│ │ │ │ +
126 // TODO: This should probably be substituted by a binary search
│ │ │ │ +
127 for( ; mtrow != mtcol->end(); ++mtrow)
│ │ │ │ +
128 if(mtrow.index()>=mcol.index())
│ │ │ │ +
129 break;
│ │ │ │ +
130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {
│ │ │ │ +
131 func(*mcol, *mtrow, mtcol.index());
│ │ │ │ +
132 funcCalled = true;
│ │ │ │ +
133 // In some cases we only search for one pair, then we break here
│ │ │ │ +
134 // and continue with the next column.
│ │ │ │ +
135 if(F::do_break)
│ │ │ │ +
136 break;
│ │ │ │ +
137 }
│ │ │ │ +
138 }
│ │ │ │ +
139 // move on with func only if func was called, otherwise they might
│ │ │ │ +
140 // get out of sync
│ │ │ │ +
141 if (funcCalled)
│ │ │ │ +
142 func.nextCol();
│ │ │ │ +
143 }
│ │ │ │ +
144 func.nextRow();
│ │ │ │ +
145 }
│ │ │ │ +
146 }
│ │ │ │ +
147 };
│ │ │ │ +
148
│ │ │ │ +
149
│ │ │ │ +
150
│ │ │ │ +
151 template<class T, class A, int n, int m>
│ │ │ │ +
152 class SparsityPatternInitializer
│ │ │ │ +
153 {
│ │ │ │ +
154 public:
│ │ │ │ +
155 enum {do_break=true};
│ │ │ │ + │ │ │ │ + │ │ │ │
158
│ │ │ │ -
159 //===== vector space arithmetic
│ │ │ │ -
160
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
163 {
│ │ │ │ -
164 p_ += y.p_;
│ │ │ │ -
165 return *this;
│ │ │ │ -
166 }
│ │ │ │ -
│ │ │ │ -
167
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
170 {
│ │ │ │ -
171 p_ -= y.p_;
│ │ │ │ -
172 return *this;
│ │ │ │ -
173 }
│ │ │ │ -
│ │ │ │ -
174
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
177 {
│ │ │ │ -
178 p_ += k;
│ │ │ │ -
179 return *this;
│ │ │ │ -
180 }
│ │ │ │ -
│ │ │ │ -
181
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
184 {
│ │ │ │ -
185 p_ -= k;
│ │ │ │ -
186 return *this;
│ │ │ │ -
187 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
190 {
│ │ │ │ -
191 p_ *= k;
│ │ │ │ -
192 return *this;
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
197 {
│ │ │ │ -
198 p_ /= k;
│ │ │ │ -
199 return *this;
│ │ │ │ -
200 }
│ │ │ │ -
│ │ │ │ +
159 SparsityPatternInitializer(CreateIterator iter)
│ │ │ │ +
160 : rowiter(iter)
│ │ │ │ +
161 {}
│ │ │ │ +
162
│ │ │ │ +
163 template<class T1, class T2>
│ │ │ │ +
164 void operator()(const T1&, const T2&, size_type j)
│ │ │ │ +
165 {
│ │ │ │ +
166 rowiter.insert(j);
│ │ │ │ +
167 }
│ │ │ │ +
168
│ │ │ │ +
169 void nextRow()
│ │ │ │ +
170 {
│ │ │ │ +
171 ++rowiter;
│ │ │ │ +
172 }
│ │ │ │ +
173 void nextCol()
│ │ │ │ +
174 {}
│ │ │ │ +
175
│ │ │ │ +
176 private:
│ │ │ │ +
177 CreateIterator rowiter;
│ │ │ │ +
178 };
│ │ │ │ +
179
│ │ │ │ +
180
│ │ │ │ +
181 template<int transpose, class T, class TA, int n, int m>
│ │ │ │ +
182 class MatrixInitializer
│ │ │ │ +
183 {
│ │ │ │ +
184 public:
│ │ │ │ +
185 enum {do_break=true};
│ │ │ │ + │ │ │ │ + │ │ │ │ +
188 typedef typename Matrix::size_type size_type;
│ │ │ │ +
189
│ │ │ │ +
190 MatrixInitializer(Matrix& A_, size_type)
│ │ │ │ +
191 : count(0), A(A_)
│ │ │ │ +
192 {}
│ │ │ │ +
193 template<class T1, class T2>
│ │ │ │ +
194 void operator()(const T1&, const T2&, int)
│ │ │ │ +
195 {
│ │ │ │ +
196 ++count;
│ │ │ │ +
197 }
│ │ │ │ +
198
│ │ │ │ +
199 void nextCol()
│ │ │ │ +
200 {}
│ │ │ │
201
│ │ │ │ -
202 //===== binary operators
│ │ │ │ -
203
│ │ │ │ -
205 template <class Scalar,
│ │ │ │ -
206 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
207 friend auto operator* ( const ScaledIdentityMatrix& matrix, Scalar scalar)
│ │ │ │ -
208 {
│ │ │ │ - │ │ │ │ -
210 }
│ │ │ │ -
│ │ │ │ -
211
│ │ │ │ -
213 template <class Scalar,
│ │ │ │ -
214 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
215 friend auto operator* (Scalar scalar, const ScaledIdentityMatrix& matrix)
│ │ │ │ -
216 {
│ │ │ │ - │ │ │ │ -
218 }
│ │ │ │ -
│ │ │ │ -
219
│ │ │ │ -
220 //===== comparison ops
│ │ │ │ -
221
│ │ │ │ -
│ │ │ │ -
223 bool operator==(const ScaledIdentityMatrix& other) const
│ │ │ │ -
224 {
│ │ │ │ -
225 return p_==other.scalar();
│ │ │ │ -
226 }
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
│ │ │ │ -
229 bool operator!=(const ScaledIdentityMatrix& other) const
│ │ │ │ -
230 {
│ │ │ │ -
231 return p_!=other.scalar();
│ │ │ │ -
232 }
│ │ │ │ -
│ │ │ │ -
233
│ │ │ │ -
234 //===== linear maps
│ │ │ │ +
202 void nextRow()
│ │ │ │ +
203 {}
│ │ │ │ +
204
│ │ │ │ +
205 std::size_t nonzeros()
│ │ │ │ +
206 {
│ │ │ │ +
207 return count;
│ │ │ │ +
208 }
│ │ │ │ +
209
│ │ │ │ +
210 template<class A1, class A2, int n2, int m2, int n3, int m3>
│ │ │ │ +
211 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
│ │ │ │ +
212 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
│ │ │ │ +
213 {
│ │ │ │ +
214 SparsityPatternInitializer<T, TA, n, m> sparsity(A.createbegin());
│ │ │ │ +
215 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,sparsity);
│ │ │ │ +
216 }
│ │ │ │ +
217
│ │ │ │ +
218 private:
│ │ │ │ +
219 std::size_t count;
│ │ │ │ +
220 Matrix& A;
│ │ │ │ +
221 };
│ │ │ │ +
222
│ │ │ │ +
223 template<class T, class TA, int n, int m>
│ │ │ │ +
224 class MatrixInitializer<1,T,TA,n,m>
│ │ │ │ +
225 {
│ │ │ │ +
226 public:
│ │ │ │ +
227 enum {do_break=false};
│ │ │ │ + │ │ │ │ + │ │ │ │ +
230 typedef typename Matrix::size_type size_type;
│ │ │ │ +
231
│ │ │ │ +
232 MatrixInitializer(Matrix& A_, size_type rows)
│ │ │ │ +
233 : A(A_), entries(rows)
│ │ │ │ +
234 {}
│ │ │ │
235
│ │ │ │ -
237 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
238 void mv (const X& x, Y& y) const
│ │ │ │ -
239 {
│ │ │ │ -
240#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
241 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
242 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
243#endif
│ │ │ │ -
244 for (size_type i=0; i<n; ++i)
│ │ │ │ -
245 y[i] = p_ * x[i];
│ │ │ │ -
246 }
│ │ │ │ -
│ │ │ │ -
247
│ │ │ │ -
249 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
250 void mtv (const X& x, Y& y) const
│ │ │ │ -
251 {
│ │ │ │ -
252 mv(x, y);
│ │ │ │ -
253 }
│ │ │ │ -
│ │ │ │ -
254
│ │ │ │ -
256 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
257 void umv (const X& x, Y& y) const
│ │ │ │ -
258 {
│ │ │ │ -
259#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
260 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
261 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
262#endif
│ │ │ │ -
263 for (size_type i=0; i<n; ++i)
│ │ │ │ -
264 y[i] += p_ * x[i];
│ │ │ │ -
265 }
│ │ │ │ -
│ │ │ │ -
266
│ │ │ │ -
268 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
269 void umtv (const X& x, Y& y) const
│ │ │ │ -
270 {
│ │ │ │ -
271#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
272 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
273 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
274#endif
│ │ │ │ -
275 for (size_type i=0; i<n; ++i)
│ │ │ │ -
276 y[i] += p_ * x[i];
│ │ │ │ -
277 }
│ │ │ │ -
│ │ │ │ -
278
│ │ │ │ -
280 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
281 void umhv (const X& x, Y& y) const
│ │ │ │ -
282 {
│ │ │ │ -
283#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
284 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
285 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
286#endif
│ │ │ │ -
287 for (size_type i=0; i<n; i++)
│ │ │ │ -
288 y[i] += conjugateComplex(p_)*x[i];
│ │ │ │ -
289 }
│ │ │ │ -
│ │ │ │ -
290
│ │ │ │ -
292 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
293 void mmv (const X& x, Y& y) const
│ │ │ │ -
294 {
│ │ │ │ -
295#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
296 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
297 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
298#endif
│ │ │ │ -
299 for (size_type i=0; i<n; ++i)
│ │ │ │ -
300 y[i] -= p_ * x[i];
│ │ │ │ -
301 }
│ │ │ │ -
│ │ │ │ -
302
│ │ │ │ -
304 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
305 void mmtv (const X& x, Y& y) const
│ │ │ │ -
306 {
│ │ │ │ -
307#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
308 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
309 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
310#endif
│ │ │ │ -
311 for (size_type i=0; i<n; ++i)
│ │ │ │ -
312 y[i] -= p_ * x[i];
│ │ │ │ -
313 }
│ │ │ │ -
│ │ │ │ -
314
│ │ │ │ -
316 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
317 void mmhv (const X& x, Y& y) const
│ │ │ │ -
318 {
│ │ │ │ -
319#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
320 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
321 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
322#endif
│ │ │ │ -
323 for (size_type i=0; i<n; i++)
│ │ │ │ -
324 y[i] -= conjugateComplex(p_)*x[i];
│ │ │ │ -
325 }
│ │ │ │ -
│ │ │ │ -
326
│ │ │ │ -
328 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
329 void usmv (const K& alpha, const X& x, Y& y) const
│ │ │ │ -
330 {
│ │ │ │ -
331#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
332 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
333 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
334#endif
│ │ │ │ -
335 for (size_type i=0; i<n; i++)
│ │ │ │ -
336 y[i] += alpha * p_ * x[i];
│ │ │ │ -
337 }
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
340 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
341 void usmtv (const K& alpha, const X& x, Y& y) const
│ │ │ │ -
342 {
│ │ │ │ -
343#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
344 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
345 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
346#endif
│ │ │ │ -
347 for (size_type i=0; i<n; i++)
│ │ │ │ -
348 y[i] += alpha * p_ * x[i];
│ │ │ │ -
349 }
│ │ │ │ -
│ │ │ │ -
350
│ │ │ │ -
352 template<class X, class Y>
│ │ │ │ -
│ │ │ │ -
353 void usmhv (const K& alpha, const X& x, Y& y) const
│ │ │ │ -
354 {
│ │ │ │ -
355#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
356 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
357 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ -
358#endif
│ │ │ │ -
359 for (size_type i=0; i<n; i++)
│ │ │ │ -
360 y[i] += alpha * conjugateComplex(p_) * x[i];
│ │ │ │ -
361 }
│ │ │ │ -
│ │ │ │ -
362
│ │ │ │ -
363 //===== norms
│ │ │ │ -
364
│ │ │ │ -
│ │ │ │ -
366 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ -
367 {
│ │ │ │ -
368 return fvmeta::sqrt(n*p_*p_);
│ │ │ │ -
369 }
│ │ │ │ -
│ │ │ │ -
370
│ │ │ │ -
│ │ │ │ -
372 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
│ │ │ │ -
373 {
│ │ │ │ -
374 return n*p_*p_;
│ │ │ │ -
375 }
│ │ │ │ -
│ │ │ │ -
376
│ │ │ │ -
│ │ │ │ -
378 typename FieldTraits<field_type>::real_type infinity_norm () const
│ │ │ │ -
379 {
│ │ │ │ -
380 return std::abs(p_);
│ │ │ │ -
381 }
│ │ │ │ -
│ │ │ │ -
382
│ │ │ │ -
│ │ │ │ -
384 typename FieldTraits<field_type>::real_type infinity_norm_real () const
│ │ │ │ -
385 {
│ │ │ │ -
386 return fvmeta::absreal(p_);
│ │ │ │ -
387 }
│ │ │ │ -
│ │ │ │ -
388
│ │ │ │ -
389 //===== solve
│ │ │ │ -
390
│ │ │ │ -
393 template<class V>
│ │ │ │ -
│ │ │ │ -
394 void solve (V& x, const V& b) const
│ │ │ │ -
395 {
│ │ │ │ -
396 for (int i=0; i<n; i++)
│ │ │ │ -
397 x[i] = b[i]/p_;
│ │ │ │ -
398 }
│ │ │ │ -
│ │ │ │ -
399
│ │ │ │ -
│ │ │ │ -
402 void invert()
│ │ │ │ -
403 {
│ │ │ │ -
404 p_ = 1/p_;
│ │ │ │ -
405 }
│ │ │ │ -
│ │ │ │ -
406
│ │ │ │ -
│ │ │ │ -
408 K determinant () const {
│ │ │ │ -
409 return std::pow(p_,n);
│ │ │ │ -
410 }
│ │ │ │ -
│ │ │ │ +
236 template<class T1, class T2>
│ │ │ │ +
237 void operator()(const T1&, const T2&, size_type i, size_type j)
│ │ │ │ +
238 {
│ │ │ │ +
239 entries[i].insert(j);
│ │ │ │ +
240 }
│ │ │ │ +
241
│ │ │ │ +
242 void nextCol()
│ │ │ │ +
243 {}
│ │ │ │ +
244
│ │ │ │ +
245 size_type nonzeros()
│ │ │ │ +
246 {
│ │ │ │ +
247 size_type nnz=0;
│ │ │ │ +
248 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
│ │ │ │ +
249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)
│ │ │ │ +
250 nnz+=(*iter).size();
│ │ │ │ +
251 return nnz;
│ │ │ │ +
252 }
│ │ │ │ +
253 template<class A1, class A2, int n2, int m2, int n3, int m3>
│ │ │ │ +
254 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>&,
│ │ │ │ +
255 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>&)
│ │ │ │ +
256 {
│ │ │ │ +
257 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
│ │ │ │ +
258 CreateIterator citer = A.createbegin();
│ │ │ │ +
259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {
│ │ │ │ +
260 typedef std::set<size_t>::const_iterator SetIter;
│ │ │ │ +
261 for(SetIter index=iter->begin(); index != iter->end(); ++index)
│ │ │ │ +
262 citer.insert(*index);
│ │ │ │ +
263 }
│ │ │ │ +
264 }
│ │ │ │ +
265
│ │ │ │ +
266 private:
│ │ │ │ +
267 Matrix& A;
│ │ │ │ +
268 std::vector<std::set<size_t> > entries;
│ │ │ │ +
269 };
│ │ │ │ +
270
│ │ │ │ +
271 template<class T, class TA, int n, int m>
│ │ │ │ +
272 struct MatrixInitializer<0,T,TA,n,m>
│ │ │ │ +
273 : public MatrixInitializer<1,T,TA,n,m>
│ │ │ │ +
274 {
│ │ │ │ +
275 MatrixInitializer(Dune::BCRSMatrix<Dune::FieldMatrix<T,n,m>,TA>& A_,
│ │ │ │ + │ │ │ │ +
277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)
│ │ │ │ +
278 {}
│ │ │ │ +
279 };
│ │ │ │ +
280
│ │ │ │ +
281
│ │ │ │ +
282 template<class T, class T1, class T2, int n, int m, int k>
│ │ │ │ +
283 void addMatMultTransposeMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,n,m>& mat,
│ │ │ │ +
284 const FieldMatrix<T2,k,m>& matt)
│ │ │ │ +
285 {
│ │ │ │ +
286 typedef typename FieldMatrix<T,n,k>::size_type size_type;
│ │ │ │ +
287
│ │ │ │ +
288 for(size_type row=0; row<n; ++row)
│ │ │ │ +
289 for(size_type col=0; col<k; ++col) {
│ │ │ │ +
290 for(size_type i=0; i < m; ++i)
│ │ │ │ +
291 res[row][col]+=mat[row][i]*matt[col][i];
│ │ │ │ +
292 }
│ │ │ │ +
293 }
│ │ │ │ +
294
│ │ │ │ +
295 template<class T, class T1, class T2, int n, int m, int k>
│ │ │ │ +
296 void addTransposeMatMultMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,m,n>& mat,
│ │ │ │ +
297 const FieldMatrix<T2,m,k>& matt)
│ │ │ │ +
298 {
│ │ │ │ +
299 typedef typename FieldMatrix<T,n,k>::size_type size_type;
│ │ │ │ +
300 for(size_type i=0; i<m; ++i)
│ │ │ │ +
301 for(size_type row=0; row<n; ++row) {
│ │ │ │ +
302 for(size_type col=0; col < k; ++col)
│ │ │ │ +
303 res[row][col]+=mat[i][row]*matt[i][col];
│ │ │ │ +
304 }
│ │ │ │ +
305 }
│ │ │ │ +
306
│ │ │ │ +
307 template<class T, class T1, class T2, int n, int m, int k>
│ │ │ │ +
308 void addMatMultMat(FieldMatrix<T,n,m>& res, const FieldMatrix<T1,n,k>& mat,
│ │ │ │ +
309 const FieldMatrix<T2,k,m>& matt)
│ │ │ │ +
310 {
│ │ │ │ +
311 typedef typename FieldMatrix<T,n,k>::size_type size_type;
│ │ │ │ +
312 for(size_type row=0; row<n; ++row)
│ │ │ │ +
313 for(size_type col=0; col<m; ++col) {
│ │ │ │ +
314 for(size_type i=0; i < k; ++i)
│ │ │ │ +
315 res[row][col]+=mat[row][i]*matt[i][col];
│ │ │ │ +
316 }
│ │ │ │ +
317 }
│ │ │ │ +
318
│ │ │ │ +
319
│ │ │ │ +
320 template<class T, class A, int n, int m>
│ │ │ │ +
321 class EntryAccumulatorFather
│ │ │ │ +
322 {
│ │ │ │ +
323 public:
│ │ │ │ +
324 enum {do_break=false};
│ │ │ │ + │ │ │ │ +
326 typedef typename Matrix::RowIterator Row;
│ │ │ │ +
327 typedef typename Matrix::ColIterator Col;
│ │ │ │ +
328
│ │ │ │ +
329 EntryAccumulatorFather(Matrix& mat_)
│ │ │ │ +
330 : mat(mat_), row(mat.begin())
│ │ │ │ +
331 {
│ │ │ │ +
332 mat=0;
│ │ │ │ +
333 col=row->begin();
│ │ │ │ +
334 }
│ │ │ │ +
335 void nextRow()
│ │ │ │ +
336 {
│ │ │ │ +
337 ++row;
│ │ │ │ +
338 if(row!=mat.end())
│ │ │ │ +
339 col=row->begin();
│ │ │ │ +
340 }
│ │ │ │ +
341
│ │ │ │ +
342 void nextCol()
│ │ │ │ +
343 {
│ │ │ │ +
344 ++this->col;
│ │ │ │ +
345 }
│ │ │ │ +
346 protected:
│ │ │ │ +
347 Matrix& mat;
│ │ │ │ +
348 private:
│ │ │ │ +
349 Row row;
│ │ │ │ +
350 protected:
│ │ │ │ + │ │ │ │ +
352 };
│ │ │ │ +
353
│ │ │ │ +
354 template<class T, class A, int n, int m, int transpose>
│ │ │ │ +
355 class EntryAccumulator
│ │ │ │ +
356 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ +
357 {
│ │ │ │ +
358 public:
│ │ │ │ + │ │ │ │ +
360 typedef typename Matrix::size_type size_type;
│ │ │ │ +
361
│ │ │ │ +
362 EntryAccumulator(Matrix& mat_)
│ │ │ │ +
363 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ +
364 {}
│ │ │ │ +
365
│ │ │ │ +
366 template<class T1, class T2>
│ │ │ │ +
367 void operator()(const T1& t1, const T2& t2, size_type i)
│ │ │ │ +
368 {
│ │ │ │ +
369 assert(this->col.index()==i);
│ │ │ │ +
370 addMatMultMat(*(this->col),t1,t2);
│ │ │ │ +
371 }
│ │ │ │ +
372 };
│ │ │ │ +
373
│ │ │ │ +
374 template<class T, class A, int n, int m>
│ │ │ │ +
375 class EntryAccumulator<T,A,n,m,0>
│ │ │ │ +
376 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ +
377 {
│ │ │ │ +
378 public:
│ │ │ │ + │ │ │ │ +
380 typedef typename Matrix::size_type size_type;
│ │ │ │ +
381
│ │ │ │ +
382 EntryAccumulator(Matrix& mat_)
│ │ │ │ +
383 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ +
384 {}
│ │ │ │ +
385
│ │ │ │ +
386 template<class T1, class T2>
│ │ │ │ +
387 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
│ │ │ │ +
388 {
│ │ │ │ +
389 addMatMultMat(this->mat[i][j], t1, t2);
│ │ │ │ +
390 }
│ │ │ │ +
391 };
│ │ │ │ +
392
│ │ │ │ +
393 template<class T, class A, int n, int m>
│ │ │ │ +
394 class EntryAccumulator<T,A,n,m,1>
│ │ │ │ +
395 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ +
396 {
│ │ │ │ +
397 public:
│ │ │ │ + │ │ │ │ +
399 typedef typename Matrix::size_type size_type;
│ │ │ │ +
400
│ │ │ │ +
401 EntryAccumulator(Matrix& mat_)
│ │ │ │ +
402 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ +
403 {}
│ │ │ │ +
404
│ │ │ │ +
405 template<class T1, class T2>
│ │ │ │ +
406 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
│ │ │ │ +
407 {
│ │ │ │ +
408 addTransposeMatMultMat(this->mat[i][j], t1, t2);
│ │ │ │ +
409 }
│ │ │ │ +
410 };
│ │ │ │
411
│ │ │ │ -
412 //===== sizes
│ │ │ │ -
413
│ │ │ │ -
│ │ │ │ -
415 size_type N () const
│ │ │ │ -
416 {
│ │ │ │ -
417 return n;
│ │ │ │ -
418 }
│ │ │ │ -
│ │ │ │ +
412 template<class T, class A, int n, int m>
│ │ │ │ +
413 class EntryAccumulator<T,A,n,m,2>
│ │ │ │ +
414 : public EntryAccumulatorFather<T,A,n,m>
│ │ │ │ +
415 {
│ │ │ │ +
416 public:
│ │ │ │ + │ │ │ │ +
418 typedef typename Matrix::size_type size_type;
│ │ │ │
419
│ │ │ │ -
│ │ │ │ -
421 size_type M () const
│ │ │ │ -
422 {
│ │ │ │ -
423 return n;
│ │ │ │ -
424 }
│ │ │ │ -
│ │ │ │ -
425
│ │ │ │ -
426 //===== query
│ │ │ │ -
427
│ │ │ │ -
│ │ │ │ -
429 bool exists (size_type i, size_type j) const
│ │ │ │ -
430 {
│ │ │ │ -
431#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ -
432 if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range");
│ │ │ │ -
433 if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range");
│ │ │ │ -
434#endif
│ │ │ │ -
435 return i==j;
│ │ │ │ -
436 }
│ │ │ │ -
│ │ │ │ -
437
│ │ │ │ -
438 //===== conversion operator
│ │ │ │ -
439
│ │ │ │ -
│ │ │ │ -
441 friend std::ostream& operator<< (std::ostream& s, const ScaledIdentityMatrix<K,n>& a)
│ │ │ │ -
442 {
│ │ │ │ -
443 for (size_type i=0; i<n; i++) {
│ │ │ │ -
444 for (size_type j=0; j<n; j++)
│ │ │ │ -
445 s << ((i==j) ? a.p_ : 0) << " ";
│ │ │ │ -
446 s << std::endl;
│ │ │ │ -
447 }
│ │ │ │ -
448 return s;
│ │ │ │ -
449 }
│ │ │ │ -
│ │ │ │ -
450
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
453 {
│ │ │ │ -
454 return reference(const_cast<K*>(&p_), i);
│ │ │ │ -
455 }
│ │ │ │ -
│ │ │ │ -
456
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
459 {
│ │ │ │ -
460 return const_reference(const_cast<K*>(&p_), i);
│ │ │ │ -
461 }
│ │ │ │ -
│ │ │ │ -
462
│ │ │ │ -
│ │ │ │ -
464 const K& diagonal(size_type /*i*/) const
│ │ │ │ -
465 {
│ │ │ │ -
466 return p_;
│ │ │ │ -
467 }
│ │ │ │ -
│ │ │ │ -
468
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
471 {
│ │ │ │ -
472 return p_;
│ │ │ │ -
473 }
│ │ │ │ -
│ │ │ │ -
474
│ │ │ │ -
│ │ │ │ -
477 const K& scalar() const
│ │ │ │ -
478 {
│ │ │ │ -
479 return p_;
│ │ │ │ -
480 }
│ │ │ │ -
│ │ │ │ -
481
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
485 {
│ │ │ │ -
486 return p_;
│ │ │ │ -
487 }
│ │ │ │ -
│ │ │ │ -
488
│ │ │ │ -
489 private:
│ │ │ │ -
490 // the data, very simply a single number
│ │ │ │ -
491 K p_;
│ │ │ │ -
492
│ │ │ │ -
493 };
│ │ │ │ -
│ │ │ │ -
494
│ │ │ │ -
495 template <class DenseMatrix, class field, int N>
│ │ │ │ -
│ │ │ │ -
496 struct DenseMatrixAssigner<DenseMatrix, ScaledIdentityMatrix<field, N>> {
│ │ │ │ -
│ │ │ │ -
497 static void apply(DenseMatrix& denseMatrix,
│ │ │ │ - │ │ │ │ -
499 assert(denseMatrix.M() == N);
│ │ │ │ -
500 assert(denseMatrix.N() == N);
│ │ │ │ -
501 denseMatrix = field(0);
│ │ │ │ -
502 for (int i = 0; i < N; ++i)
│ │ │ │ -
503 denseMatrix[i][i] = rhs.scalar();
│ │ │ │ -
504 }
│ │ │ │ -
│ │ │ │ -
505 };
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
507 template<class K, int n>
│ │ │ │ -
│ │ │ │ -
508 struct FieldTraits< ScaledIdentityMatrix<K, n> >
│ │ │ │ -
509 {
│ │ │ │ - │ │ │ │ -
511 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ -
512 };
│ │ │ │ -
│ │ │ │ -
513
│ │ │ │ -
514} // end namespace
│ │ │ │ -
515
│ │ │ │ -
516#endif
│ │ │ │ +
420 EntryAccumulator(Matrix& mat_)
│ │ │ │ +
421 : EntryAccumulatorFather<T,A,n,m>(mat_)
│ │ │ │ +
422 {}
│ │ │ │ +
423
│ │ │ │ +
424 template<class T1, class T2>
│ │ │ │ +
425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] size_type i)
│ │ │ │ +
426 {
│ │ │ │ +
427 assert(this->col.index()==i);
│ │ │ │ +
428 addMatMultTransposeMat(*this->col,t1,t2);
│ │ │ │ +
429 }
│ │ │ │ +
430 };
│ │ │ │ +
431
│ │ │ │ +
432
│ │ │ │ +
433 template<int transpose>
│ │ │ │ +
434 struct SizeSelector
│ │ │ │ +
435 {};
│ │ │ │ +
436
│ │ │ │ +
437 template<>
│ │ │ │ +
438 struct SizeSelector<0>
│ │ │ │ +
439 {
│ │ │ │ +
440 template<class M1, class M2>
│ │ │ │ +
441 static std::tuple<typename M1::size_type, typename M2::size_type>
│ │ │ │ +
442 size(const M1& m1, const M2& m2)
│ │ │ │ +
443 {
│ │ │ │ +
444 return std::make_tuple(m1.N(), m2.M());
│ │ │ │ +
445 }
│ │ │ │ +
446 };
│ │ │ │ +
447
│ │ │ │ +
448 template<>
│ │ │ │ +
449 struct SizeSelector<1>
│ │ │ │ +
450 {
│ │ │ │ +
451 template<class M1, class M2>
│ │ │ │ +
452 static std::tuple<typename M1::size_type, typename M2::size_type>
│ │ │ │ +
453 size(const M1& m1, const M2& m2)
│ │ │ │ +
454 {
│ │ │ │ +
455 return std::make_tuple(m1.M(), m2.M());
│ │ │ │ +
456 }
│ │ │ │ +
457 };
│ │ │ │ +
458
│ │ │ │ +
459
│ │ │ │ +
460 template<>
│ │ │ │ +
461 struct SizeSelector<2>
│ │ │ │ +
462 {
│ │ │ │ +
463 template<class M1, class M2>
│ │ │ │ +
464 static std::tuple<typename M1::size_type, typename M2::size_type>
│ │ │ │ +
465 size(const M1& m1, const M2& m2)
│ │ │ │ +
466 {
│ │ │ │ +
467 return std::make_tuple(m1.N(), m2.N());
│ │ │ │ +
468 }
│ │ │ │ +
469 };
│ │ │ │ +
470
│ │ │ │ +
471 template<int transpose, class T, class A, class A1, class A2, int n1, int m1, int n2, int m2, int n3, int m3>
│ │ │ │ +
472 void matMultMat(BCRSMatrix<FieldMatrix<T,n1,m1>,A>& res, const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
│ │ │ │ +
473 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
│ │ │ │ +
474 {
│ │ │ │ +
475 // First step is to count the number of nonzeros
│ │ │ │ +
476 typename BCRSMatrix<FieldMatrix<T,n1,m1>,A>::size_type rows, cols;
│ │ │ │ +
477 std::tie(rows,cols)=SizeSelector<transpose>::size(mat1, mat2);
│ │ │ │ +
478 MatrixInitializer<transpose,T,A,n1,m1> patternInit(res, rows);
│ │ │ │ +
479 Timer timer;
│ │ │ │ +
480 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,patternInit);
│ │ │ │ +
481 res.setSize(rows, cols, patternInit.nonzeros());
│ │ │ │ +
482 res.setBuildMode(BCRSMatrix<FieldMatrix<T,n1,m1>,A>::row_wise);
│ │ │ │ +
483
│ │ │ │ +
484 //std::cout<<"Counting nonzeros took "<<timer.elapsed()<<std::endl;
│ │ │ │ +
485 timer.reset();
│ │ │ │ +
486
│ │ │ │ +
487 // Second step is to allocate the storage for the result and initialize the nonzero pattern
│ │ │ │ +
488 patternInit.initPattern(mat1, mat2);
│ │ │ │ +
489
│ │ │ │ +
490 //std::cout<<"Setting up sparsity pattern took "<<timer.elapsed()<<std::endl;
│ │ │ │ +
491 timer.reset();
│ │ │ │ +
492 // As a last step calculate the entries
│ │ │ │ +
493 res = 0.0;
│ │ │ │ +
494 EntryAccumulator<T,A,n1,m1, transpose> entriesAccu(res);
│ │ │ │ +
495 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,entriesAccu);
│ │ │ │ +
496 //std::cout<<"Calculating entries took "<<timer.elapsed()<<std::endl;
│ │ │ │ +
497 }
│ │ │ │ +
498
│ │ │ │ +
499 }
│ │ │ │ +
500
│ │ │ │ +
508 template<typename M1, typename M2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
510 {};
│ │ │ │ +
│ │ │ │ +
511
│ │ │ │ +
512 template<typename T, int n, int k, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
514 {
│ │ │ │ + │ │ │ │ +
516 };
│ │ │ │ +
│ │ │ │ +
517
│ │ │ │ +
518 template<typename T, typename A, typename A1, int n, int k, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
520 {
│ │ │ │ + │ │ │ │ +
522 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
│ │ │ │ +
523 };
│ │ │ │ +
│ │ │ │ +
524
│ │ │ │ +
525
│ │ │ │ +
533 template<typename M1, typename M2>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
535 {};
│ │ │ │ +
│ │ │ │ +
536
│ │ │ │ +
537 template<typename T, int n, int k, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
539 {
│ │ │ │ + │ │ │ │ +
541 };
│ │ │ │ +
│ │ │ │ +
542
│ │ │ │ +
543 template<typename T, typename A, typename A1, int n, int k, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
545 {
│ │ │ │ + │ │ │ │ +
547 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
│ │ │ │ +
548 };
│ │ │ │ +
│ │ │ │ +
549
│ │ │ │ +
550
│ │ │ │ +
559 template<class T, class A, class A1, class A2, int n, int m, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
561 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
│ │ │ │ +
562 {
│ │ │ │ +
563 matMultMat<2>(res,mat, matt);
│ │ │ │ +
564 }
│ │ │ │ +
│ │ │ │ +
565
│ │ │ │ +
574 template<class T, class A, class A1, class A2, int n, int m, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
576 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, bool tryHard=false)
│ │ │ │ +
577 {
│ │ │ │ +
578 matMultMat<0>(res,mat, matt);
│ │ │ │ +
579 }
│ │ │ │ +
│ │ │ │ +
580
│ │ │ │ +
589 template<class T, class A, class A1, class A2, int n, int m, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
591 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
│ │ │ │ +
592 {
│ │ │ │ +
593 matMultMat<1>(res,mat, matt);
│ │ │ │ +
594 }
│ │ │ │ +
│ │ │ │ +
595
│ │ │ │ +
596}
│ │ │ │ +
597#endif
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:379
│ │ │ │ +
FieldMatrix< T, n, m > type
Definition matrixmatrix.hh:515
│ │ │ │ +
void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of a transposed sparse matrix with another sparse matrices ( ).
Definition matrixmatrix.hh:590
│ │ │ │ +
void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of two sparse matrices ( ).
Definition matrixmatrix.hh:575
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:359
│ │ │ │ +
Matrix::RowIterator Row
Definition matrixmatrix.hh:326
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:417
│ │ │ │ +
Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix
Definition matrixmatrix.hh:228
│ │ │ │ +
Matrix::size_type size_type
Definition matrixmatrix.hh:360
│ │ │ │ +
Matrix::size_type size_type
Definition matrixmatrix.hh:380
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix::ColIterator Col
Definition matrixmatrix.hh:327
│ │ │ │ +
Matrix::size_type size_type
Definition matrixmatrix.hh:188
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
Matrix::size_type size_type
Definition matrixmatrix.hh:230
│ │ │ │ + │ │ │ │ +
void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of a sparse matrix with a transposed sparse matrices ( ).
Definition matrixmatrix.hh:560
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator
Definition matrixmatrix.hh:156
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:398
│ │ │ │ +
Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix
Definition matrixmatrix.hh:186
│ │ │ │ +
BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
Definition matrixmatrix.hh:522
│ │ │ │ +
Matrix::CreateIterator CreateIterator
Definition matrixmatrix.hh:229
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:325
│ │ │ │ +
Matrix::size_type size_type
Definition matrixmatrix.hh:399
│ │ │ │ +
Matrix::CreateIterator CreateIterator
Definition matrixmatrix.hh:187
│ │ │ │ +
BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
Definition matrixmatrix.hh:547
│ │ │ │ +
Matrix::size_type size_type
Definition matrixmatrix.hh:418
│ │ │ │ +
BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type
Definition matrixmatrix.hh:157
│ │ │ │ +
@ do_break
Definition matrixmatrix.hh:155
│ │ │ │ +
@ do_break
Definition matrixmatrix.hh:324
│ │ │ │ +
@ do_break
Definition matrixmatrix.hh:185
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A multiple of the identity matrix of static size.
Definition scaledidmatrix.hh:30
│ │ │ │ -
void usmhv(const K &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition scaledidmatrix.hh:353
│ │ │ │ -
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition scaledidmatrix.hh:305
│ │ │ │ -
ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y)
vector space subtraction
Definition scaledidmatrix.hh:169
│ │ │ │ -
const_row_type::ConstIterator ConstColIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:131
│ │ │ │ -
ConstIterator end() const
end iterator
Definition scaledidmatrix.hh:140
│ │ │ │ -
Iterator beforeBegin()
Definition scaledidmatrix.hh:118
│ │ │ │ -
bool operator!=(const ScaledIdentityMatrix &other) const
incomparison operator
Definition scaledidmatrix.hh:229
│ │ │ │ -
void mmv(const X &x, Y &y) const
y -= A x
Definition scaledidmatrix.hh:293
│ │ │ │ -
std::size_t size_type
The type used for the index access and size operations.
Definition scaledidmatrix.hh:43
│ │ │ │ -
void usmv(const K &alpha, const X &x, Y &y) const
y += alpha A x
Definition scaledidmatrix.hh:329
│ │ │ │ -
row_type::Iterator ColIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:95
│ │ │ │ -
const_row_type const_reference
Definition scaledidmatrix.hh:53
│ │ │ │ -
void mv(const X &x, Y &y) const
y = A x
Definition scaledidmatrix.hh:238
│ │ │ │ -
void umtv(const X &x, Y &y) const
y += A^T x
Definition scaledidmatrix.hh:269
│ │ │ │ -
void umhv(const X &x, Y &y) const
y += A^H x
Definition scaledidmatrix.hh:281
│ │ │ │ -
DiagonalRowVector< K, n > row_type
Each row is implemented by a field vector.
Definition scaledidmatrix.hh:50
│ │ │ │ -
ContainerWrapperIterator< const WrapperType, reference, reference > Iterator
Iterator class for sequential access.
Definition scaledidmatrix.hh:89
│ │ │ │ -
Iterator beforeEnd()
Definition scaledidmatrix.hh:111
│ │ │ │ -
K determinant() const
calculates the determinant of this matrix
Definition scaledidmatrix.hh:408
│ │ │ │ -
K field_type
export the type representing the field
Definition scaledidmatrix.hh:37
│ │ │ │ -
void usmtv(const K &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition scaledidmatrix.hh:341
│ │ │ │ -
Iterator end()
end iterator
Definition scaledidmatrix.hh:104
│ │ │ │ -
Iterator iterator
typedef for stl compliant access
Definition scaledidmatrix.hh:91
│ │ │ │ -
const K & scalar() const
Get const reference to the scalar diagonal value.
Definition scaledidmatrix.hh:477
│ │ │ │ -
void umv(const X &x, Y &y) const
y += A x
Definition scaledidmatrix.hh:257
│ │ │ │ -
static constexpr std::size_t blocklevel
We are at the leaf of the block recursion.
Definition scaledidmatrix.hh:47
│ │ │ │ -
const K & diagonal(size_type) const
Get const reference to diagonal entry.
Definition scaledidmatrix.hh:464
│ │ │ │ -
@ rows
The number of rows.
Definition scaledidmatrix.hh:58
│ │ │ │ -
@ cols
The number of columns.
Definition scaledidmatrix.hh:60
│ │ │ │ -
ScaledIdentityMatrix & operator=(const K &k)
Definition scaledidmatrix.hh:75
│ │ │ │ -
ContainerWrapperIterator< const WrapperType, const_reference, const_reference > ConstIterator
Iterator class for sequential access.
Definition scaledidmatrix.hh:125
│ │ │ │ -
K & diagonal(size_type)
Get reference to diagonal entry.
Definition scaledidmatrix.hh:470
│ │ │ │ -
void solve(V &x, const V &b) const
Solve system A x = b.
Definition scaledidmatrix.hh:394
│ │ │ │ -
bool exists(size_type i, size_type j) const
return true when (i,j) is in pattern
Definition scaledidmatrix.hh:429
│ │ │ │ -
Iterator RowIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:93
│ │ │ │ -
ConstIterator const_iterator
typedef for stl compliant access
Definition scaledidmatrix.hh:127
│ │ │ │ -
ScaledIdentityMatrix()
Default constructor.
Definition scaledidmatrix.hh:66
│ │ │ │ -
bool operator==(const ScaledIdentityMatrix &other) const
comparison operator
Definition scaledidmatrix.hh:223
│ │ │ │ -
ConstIterator beforeBegin() const
Definition scaledidmatrix.hh:154
│ │ │ │ -
ScaledIdentityMatrix & operator/=(const K &k)
vector space division by scalar
Definition scaledidmatrix.hh:196
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix< K, n > &a)
Sends the matrix to an output stream.
Definition scaledidmatrix.hh:441
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition scaledidmatrix.hh:372
│ │ │ │ -
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition scaledidmatrix.hh:366
│ │ │ │ -
FieldTraits< field_type >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition scaledidmatrix.hh:378
│ │ │ │ -
ConstIterator ConstRowIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:129
│ │ │ │ -
ConstIterator beforeEnd() const
Definition scaledidmatrix.hh:147
│ │ │ │ -
size_type M() const
number of blocks in column direction
Definition scaledidmatrix.hh:421
│ │ │ │ -
const_reference operator[](size_type i) const
Return const_reference object as row replacement.
Definition scaledidmatrix.hh:458
│ │ │ │ -
ScaledIdentityMatrix(const K &k)
Constructor initializing the whole matrix with a scalar.
Definition scaledidmatrix.hh:70
│ │ │ │ -
friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar)
vector space multiplication with scalar
Definition scaledidmatrix.hh:207
│ │ │ │ -
FieldTraits< field_type >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition scaledidmatrix.hh:384
│ │ │ │ -
ScaledIdentityMatrix & operator*=(const K &k)
vector space multiplication with scalar
Definition scaledidmatrix.hh:189
│ │ │ │ -
bool identical(const ScaledIdentityMatrix< K, n > &other) const
Definition scaledidmatrix.hh:82
│ │ │ │ -
void invert()
Compute inverse.
Definition scaledidmatrix.hh:402
│ │ │ │ -
Iterator begin()
begin iterator
Definition scaledidmatrix.hh:98
│ │ │ │ -
K & scalar()
Get reference to the scalar diagonal value.
Definition scaledidmatrix.hh:484
│ │ │ │ -
row_type reference
Definition scaledidmatrix.hh:51
│ │ │ │ -
K block_type
export the type representing the components
Definition scaledidmatrix.hh:40
│ │ │ │ -
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition scaledidmatrix.hh:317
│ │ │ │ -
ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y)
vector space addition
Definition scaledidmatrix.hh:162
│ │ │ │ -
DiagonalRowVectorConst< K, n > const_row_type
Definition scaledidmatrix.hh:52
│ │ │ │ -
void mtv(const X &x, Y &y) const
y = A^T x
Definition scaledidmatrix.hh:250
│ │ │ │ -
reference operator[](size_type i)
Return reference object as row replacement.
Definition scaledidmatrix.hh:452
│ │ │ │ -
ConstIterator begin() const
begin iterator
Definition scaledidmatrix.hh:134
│ │ │ │ -
size_type N() const
number of blocks in row direction
Definition scaledidmatrix.hh:415
│ │ │ │ -
static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > const &rhs)
Definition scaledidmatrix.hh:497
│ │ │ │ -
typename ScaledIdentityMatrix< K, n >::field_type field_type
Definition scaledidmatrix.hh:510
│ │ │ │ -
typename FieldTraits< field_type >::real_type real_type
Definition scaledidmatrix.hh:511
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
Iterator end()
Get iterator to one beyond last row.
Definition bcrsmatrix.hh:681
│ │ │ │ +
row_type::Iterator ColIterator
Iterator for the entries of each row.
Definition bcrsmatrix.hh:704
│ │ │ │ +
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ +
CreateIterator createbegin()
get initial create iterator
Definition bcrsmatrix.hh:1097
│ │ │ │ +
Iterator access to matrix rows
Definition bcrsmatrix.hh:579
│ │ │ │ +
Iterator class for sequential creation of blocks
Definition bcrsmatrix.hh:957
│ │ │ │ +
void insert(size_type j)
put column index in row
Definition bcrsmatrix.hh:1064
│ │ │ │ +
Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
Definition matrixmatrix.hh:510
│ │ │ │ +
Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
Definition matrixmatrix.hh:535
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,718 +1,742 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -scaledidmatrix.hh │ │ │ │ │ +matrixmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH │ │ │ │ │ -6#define DUNE_ISTL_SCALEDIDMATRIX_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_MATRIXMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_MATRIXMATRIX_HH │ │ │ │ │ 7 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ -24 │ │ │ │ │ -28 template │ │ │ │ │ -_2_9 class _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ -30 { │ │ │ │ │ -31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix > WrapperType; │ │ │ │ │ -32 │ │ │ │ │ -33 public: │ │ │ │ │ -34 //===== type definitions and constants │ │ │ │ │ -35 │ │ │ │ │ -_3_7 typedef K _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -38 │ │ │ │ │ -_4_0 typedef K _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include <_d_u_n_e_/_i_s_t_l_/_b_c_r_s_m_a_t_r_i_x_._h_h> │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13namespace _D_u_n_e │ │ │ │ │ +14{ │ │ │ │ │ +15 │ │ │ │ │ +26 namespace │ │ │ │ │ +27 { │ │ │ │ │ +28 │ │ │ │ │ +37 template │ │ │ │ │ +38 struct NonzeroPatternTraverser │ │ │ │ │ +39 {}; │ │ │ │ │ +40 │ │ │ │ │ 41 │ │ │ │ │ -_4_3 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -44 │ │ │ │ │ -46 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]] │ │ │ │ │ -_4_7 static constexpr std::size_t _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ -48 │ │ │ │ │ -_5_0 typedef DiagonalRowVector _r_o_w___t_y_p_e; │ │ │ │ │ -_5_1 typedef _r_o_w___t_y_p_e _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_5_2 typedef DiagonalRowVectorConst _c_o_n_s_t___r_o_w___t_y_p_e; │ │ │ │ │ -_5_3 typedef _c_o_n_s_t___r_o_w___t_y_p_e _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -54 │ │ │ │ │ -56 enum { │ │ │ │ │ -_5_8 _r_o_w_s = n, │ │ │ │ │ -60 _c_o_l_s = n │ │ │ │ │ -_6_1 }; │ │ │ │ │ -62 │ │ │ │ │ -63 //===== constructors │ │ │ │ │ -_6_6 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x () {} │ │ │ │ │ +42 template<> │ │ │ │ │ +43 struct NonzeroPatternTraverser<0> │ │ │ │ │ +44 { │ │ │ │ │ +45 template │ │ │ │ │ +46 static void traverse(const _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,A1>& A, │ │ │ │ │ +47 const _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& B, │ │ │ │ │ +48 F& func) │ │ │ │ │ +49 { │ │ │ │ │ +50 if(A.M()!=B.N()) │ │ │ │ │ +51 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "< │ │ │ │ │ -_2_5_0 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ -251 { │ │ │ │ │ -252 _m_v(x, y); │ │ │ │ │ -253 } │ │ │ │ │ -254 │ │ │ │ │ -256 template │ │ │ │ │ -_2_5_7 void _u_m_v (const X& x, Y& y) const │ │ │ │ │ -258 { │ │ │ │ │ -259#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -260 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -261 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -262#endif │ │ │ │ │ -263 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_2_6_9 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ -270 { │ │ │ │ │ -271#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -272 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -273 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -274#endif │ │ │ │ │ -275 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_2_8_1 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ -282 { │ │ │ │ │ -283#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -284 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -285 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -286#endif │ │ │ │ │ -287 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_2_9_3 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ -294 { │ │ │ │ │ -295#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -296 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -297 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -298#endif │ │ │ │ │ -299 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_0_5 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ -306 { │ │ │ │ │ -307#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -308 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -309 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -310#endif │ │ │ │ │ -311 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_1_7 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ -318 { │ │ │ │ │ -319#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -320 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -321 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -322#endif │ │ │ │ │ -323 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_2_9 void _u_s_m_v (const K& alpha, const X& x, Y& y) const │ │ │ │ │ -330 { │ │ │ │ │ -331#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -332 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -333 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -334#endif │ │ │ │ │ -335 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_4_1 void _u_s_m_t_v (const K& alpha, const X& x, Y& y) const │ │ │ │ │ -342 { │ │ │ │ │ -343#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -344 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -345 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -346#endif │ │ │ │ │ -347 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ -_3_5_3 void _u_s_m_h_v (const K& alpha, const X& x, Y& y) const │ │ │ │ │ -354 { │ │ │ │ │ -355#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -356 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -357 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ -358#endif │ │ │ │ │ -359 for (_s_i_z_e___t_y_p_e i=0; i::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ -367 { │ │ │ │ │ -368 return fvmeta::sqrt(n*p_*p_); │ │ │ │ │ -369 } │ │ │ │ │ -370 │ │ │ │ │ -_3_7_2 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ -373 { │ │ │ │ │ -374 return n*p_*p_; │ │ │ │ │ -375 } │ │ │ │ │ -376 │ │ │ │ │ -_3_7_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m () const │ │ │ │ │ -379 { │ │ │ │ │ -380 return std::abs(p_); │ │ │ │ │ -381 } │ │ │ │ │ -382 │ │ │ │ │ -_3_8_4 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l () const │ │ │ │ │ -385 { │ │ │ │ │ -386 return fvmeta::absreal(p_); │ │ │ │ │ -387 } │ │ │ │ │ -388 │ │ │ │ │ -389 //===== solve │ │ │ │ │ -390 │ │ │ │ │ -393 template │ │ │ │ │ -_3_9_4 void _s_o_l_v_e (V& x, const V& b) const │ │ │ │ │ -395 { │ │ │ │ │ -396 for (int i=0; i │ │ │ │ │ +237 void operator()(const T1&, const T2&, _s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) │ │ │ │ │ +238 { │ │ │ │ │ +239 entries[i].insert(j); │ │ │ │ │ +240 } │ │ │ │ │ +241 │ │ │ │ │ +242 void nextCol() │ │ │ │ │ +243 {} │ │ │ │ │ +244 │ │ │ │ │ +245 _s_i_z_e___t_y_p_e nonzeros() │ │ │ │ │ +246 { │ │ │ │ │ +247 _s_i_z_e___t_y_p_e nnz=0; │ │ │ │ │ +248 typedef typename std::vector >::const_iterator Iter; │ │ │ │ │ +249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter) │ │ │ │ │ +250 nnz+=(*iter).size(); │ │ │ │ │ +251 return nnz; │ │ │ │ │ +252 } │ │ │ │ │ +253 template │ │ │ │ │ +254 void initPattern(const BCRSMatrix,A1>&, │ │ │ │ │ +255 const BCRSMatrix,A2>&) │ │ │ │ │ +256 { │ │ │ │ │ +257 typedef typename std::vector >::const_iterator Iter; │ │ │ │ │ +258 _C_r_e_a_t_e_I_t_e_r_a_t_o_r citer = A._c_r_e_a_t_e_b_e_g_i_n(); │ │ │ │ │ +259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) { │ │ │ │ │ +260 typedef std::set::const_iterator SetIter; │ │ │ │ │ +261 for(SetIter index=iter->begin(); index != iter->end(); ++index) │ │ │ │ │ +262 citer._i_n_s_e_r_t(*index); │ │ │ │ │ +263 } │ │ │ │ │ +264 } │ │ │ │ │ +265 │ │ │ │ │ +266 private: │ │ │ │ │ +267 _M_a_t_r_i_x& A; │ │ │ │ │ +268 std::vector > entries; │ │ │ │ │ +269 }; │ │ │ │ │ +270 │ │ │ │ │ +271 template │ │ │ │ │ +272 struct MatrixInitializer<0,T,TA,n,m> │ │ │ │ │ +273 : public MatrixInitializer<1,T,TA,n,m> │ │ │ │ │ +274 { │ │ │ │ │ +275 MatrixInitializer(_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,TA>& A_, │ │ │ │ │ +276 typename _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x<_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,TA>_:_:_s_i_z_e___t_y_p_e rows) │ │ │ │ │ +277 : MatrixInitializer<1,T,TA,n,m>(A_,rows) │ │ │ │ │ +278 {} │ │ │ │ │ +279 }; │ │ │ │ │ +280 │ │ │ │ │ +281 │ │ │ │ │ +282 template │ │ │ │ │ +283 void addMatMultTransposeMat(FieldMatrix& res, const │ │ │ │ │ +FieldMatrix& _m_a_t, │ │ │ │ │ +284 const FieldMatrix& matt) │ │ │ │ │ +285 { │ │ │ │ │ +286 typedef typename FieldMatrix::size_type size_type; │ │ │ │ │ +287 │ │ │ │ │ +288 for(size_type row=0; row │ │ │ │ │ +296 void addTransposeMatMultMat(FieldMatrix& res, const │ │ │ │ │ +FieldMatrix& _m_a_t, │ │ │ │ │ +297 const FieldMatrix& matt) │ │ │ │ │ +298 { │ │ │ │ │ +299 typedef typename FieldMatrix::size_type size_type; │ │ │ │ │ +300 for(size_type i=0; i │ │ │ │ │ +308 void addMatMultMat(FieldMatrix& res, const FieldMatrix& _m_a_t, │ │ │ │ │ +309 const FieldMatrix& matt) │ │ │ │ │ +310 { │ │ │ │ │ +311 typedef typename FieldMatrix::size_type size_type; │ │ │ │ │ +312 for(size_type row=0; row │ │ │ │ │ +321 class EntryAccumulatorFather │ │ │ │ │ +322 { │ │ │ │ │ +323 public: │ │ │ │ │ +_3_2_4 enum {_d_o___b_r_e_a_k=false}; │ │ │ │ │ +_3_2_5 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ +_3_2_6 typedef typename _M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r _R_o_w; │ │ │ │ │ +_3_2_7 typedef typename _M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r _C_o_l; │ │ │ │ │ +328 │ │ │ │ │ +329 EntryAccumulatorFather(_M_a_t_r_i_x& mat_) │ │ │ │ │ +330 : _m_a_t(mat_), row(_m_a_t.begin()) │ │ │ │ │ +331 { │ │ │ │ │ +332 _m_a_t=0; │ │ │ │ │ +333 _c_o_l=row->begin(); │ │ │ │ │ +334 } │ │ │ │ │ +335 void nextRow() │ │ │ │ │ +336 { │ │ │ │ │ +337 ++row; │ │ │ │ │ +338 if(row!=_m_a_t._e_n_d()) │ │ │ │ │ +339 _c_o_l=row->begin(); │ │ │ │ │ +340 } │ │ │ │ │ +341 │ │ │ │ │ +342 void nextCol() │ │ │ │ │ +343 { │ │ │ │ │ +344 ++this->_c_o_l; │ │ │ │ │ +345 } │ │ │ │ │ +346 protected: │ │ │ │ │ +_3_4_7 Matrix& _m_a_t; │ │ │ │ │ +348 private: │ │ │ │ │ +349 _R_o_w row; │ │ │ │ │ +350 protected: │ │ │ │ │ +_3_5_1 _C_o_l _c_o_l; │ │ │ │ │ +352 }; │ │ │ │ │ +353 │ │ │ │ │ +354 template │ │ │ │ │ +355 class EntryAccumulator │ │ │ │ │ +356 : public EntryAccumulatorFather │ │ │ │ │ +357 { │ │ │ │ │ +358 public: │ │ │ │ │ +_3_5_9 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ +_3_6_0 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +361 │ │ │ │ │ +362 EntryAccumulator(_M_a_t_r_i_x& mat_) │ │ │ │ │ +363 : EntryAccumulatorFather(mat_) │ │ │ │ │ +364 {} │ │ │ │ │ +365 │ │ │ │ │ +366 template │ │ │ │ │ +367 void operator()(const T1& t1, const T2& t2, _s_i_z_e___t_y_p_e i) │ │ │ │ │ +368 { │ │ │ │ │ +369 assert(this->_c_o_l.index()==i); │ │ │ │ │ +370 addMatMultMat(*(this->_c_o_l),t1,t2); │ │ │ │ │ +371 } │ │ │ │ │ +372 }; │ │ │ │ │ +373 │ │ │ │ │ +374 template │ │ │ │ │ +375 class EntryAccumulator │ │ │ │ │ +376 : public EntryAccumulatorFather │ │ │ │ │ +377 { │ │ │ │ │ +378 public: │ │ │ │ │ +_3_7_9 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ +_3_8_0 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +381 │ │ │ │ │ +382 EntryAccumulator(_M_a_t_r_i_x& mat_) │ │ │ │ │ +383 : EntryAccumulatorFather(mat_) │ │ │ │ │ +384 {} │ │ │ │ │ +385 │ │ │ │ │ +386 template │ │ │ │ │ +387 void operator()(const T1& t1, const T2& t2, _s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) │ │ │ │ │ +388 { │ │ │ │ │ +389 addMatMultMat(this->mat[i][j], t1, t2); │ │ │ │ │ +390 } │ │ │ │ │ +391 }; │ │ │ │ │ +392 │ │ │ │ │ +393 template │ │ │ │ │ +394 class EntryAccumulator │ │ │ │ │ +395 : public EntryAccumulatorFather │ │ │ │ │ +396 { │ │ │ │ │ +397 public: │ │ │ │ │ +_3_9_8 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ +_3_9_9 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +400 │ │ │ │ │ +401 EntryAccumulator(_M_a_t_r_i_x& mat_) │ │ │ │ │ +402 : EntryAccumulatorFather(mat_) │ │ │ │ │ +403 {} │ │ │ │ │ +404 │ │ │ │ │ +405 template │ │ │ │ │ +406 void operator()(const T1& t1, const T2& t2, _s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) │ │ │ │ │ +407 { │ │ │ │ │ +408 addTransposeMatMultMat(this->mat[i][j], t1, t2); │ │ │ │ │ +409 } │ │ │ │ │ +410 }; │ │ │ │ │ 411 │ │ │ │ │ -412 //===== sizes │ │ │ │ │ -413 │ │ │ │ │ -_4_1_5 _s_i_z_e___t_y_p_e _N () const │ │ │ │ │ -416 { │ │ │ │ │ -417 return n; │ │ │ │ │ -418 } │ │ │ │ │ +412 template │ │ │ │ │ +413 class EntryAccumulator │ │ │ │ │ +414 : public EntryAccumulatorFather │ │ │ │ │ +415 { │ │ │ │ │ +416 public: │ │ │ │ │ +_4_1_7 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A> _M_a_t_r_i_x; │ │ │ │ │ +_4_1_8 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ 419 │ │ │ │ │ -_4_2_1 _s_i_z_e___t_y_p_e _M () const │ │ │ │ │ -422 { │ │ │ │ │ -423 return n; │ │ │ │ │ -424 } │ │ │ │ │ -425 │ │ │ │ │ -426 //===== query │ │ │ │ │ -427 │ │ │ │ │ -_4_2_9 bool _e_x_i_s_t_s (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) const │ │ │ │ │ -430 { │ │ │ │ │ -431#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ -432 if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range"); │ │ │ │ │ -433 if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range"); │ │ │ │ │ -434#endif │ │ │ │ │ -435 return i==j; │ │ │ │ │ -436 } │ │ │ │ │ -437 │ │ │ │ │ -438 //===== conversion operator │ │ │ │ │ -439 │ │ │ │ │ -_4_4_1 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ -_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_n_>& a) │ │ │ │ │ -442 { │ │ │ │ │ -443 for (_s_i_z_e___t_y_p_e i=0; i(&p_), i); │ │ │ │ │ -455 } │ │ │ │ │ -456 │ │ │ │ │ -_4_5_8 _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 │ │ │ │ │ -459 { │ │ │ │ │ -460 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(const_cast(&p_), i); │ │ │ │ │ -461 } │ │ │ │ │ -462 │ │ │ │ │ -_4_6_4 const K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e /*i*/) const │ │ │ │ │ -465 { │ │ │ │ │ -466 return p_; │ │ │ │ │ -467 } │ │ │ │ │ -468 │ │ │ │ │ -_4_7_0 K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e /*i*/) │ │ │ │ │ -471 { │ │ │ │ │ -472 return p_; │ │ │ │ │ -473 } │ │ │ │ │ -474 │ │ │ │ │ -_4_7_7 const K& _s_c_a_l_a_r() const │ │ │ │ │ -478 { │ │ │ │ │ -479 return p_; │ │ │ │ │ -480 } │ │ │ │ │ -481 │ │ │ │ │ -_4_8_4 K& _s_c_a_l_a_r() │ │ │ │ │ -485 { │ │ │ │ │ -486 return p_; │ │ │ │ │ -487 } │ │ │ │ │ -488 │ │ │ │ │ -489 private: │ │ │ │ │ -490 // the data, very simply a single number │ │ │ │ │ -491 K p_; │ │ │ │ │ -492 │ │ │ │ │ -493 }; │ │ │ │ │ -494 │ │ │ │ │ -495 template │ │ │ │ │ -_4_9_6 struct DenseMatrixAssigner> { │ │ │ │ │ -_4_9_7 static void _a_p_p_l_y(DenseMatrix& denseMatrix, │ │ │ │ │ -498 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_f_i_e_l_d_,_ _N_> const& rhs) { │ │ │ │ │ -499 assert(denseMatrix.M() == N); │ │ │ │ │ -500 assert(denseMatrix.N() == N); │ │ │ │ │ -501 denseMatrix = field(0); │ │ │ │ │ -502 for (int i = 0; i < N; ++i) │ │ │ │ │ -503 denseMatrix[i][i] = rhs._s_c_a_l_a_r(); │ │ │ │ │ -504 } │ │ │ │ │ -505 }; │ │ │ │ │ -506 │ │ │ │ │ -507 template │ │ │ │ │ -_5_0_8 struct FieldTraits< _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x > │ │ │ │ │ -509 { │ │ │ │ │ -_5_1_0 using _f_i_e_l_d___t_y_p_e = typename _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_ _n_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_5_1_1 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ -512 }; │ │ │ │ │ -513 │ │ │ │ │ -514} // end namespace │ │ │ │ │ -515 │ │ │ │ │ -516#endif │ │ │ │ │ +420 EntryAccumulator(_M_a_t_r_i_x& mat_) │ │ │ │ │ +421 : EntryAccumulatorFather(mat_) │ │ │ │ │ +422 {} │ │ │ │ │ +423 │ │ │ │ │ +424 template │ │ │ │ │ +425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] _s_i_z_e___t_y_p_e i) │ │ │ │ │ +426 { │ │ │ │ │ +427 assert(this->_c_o_l.index()==i); │ │ │ │ │ +428 addMatMultTransposeMat(*this->_c_o_l,t1,t2); │ │ │ │ │ +429 } │ │ │ │ │ +430 }; │ │ │ │ │ +431 │ │ │ │ │ +432 │ │ │ │ │ +433 template │ │ │ │ │ +434 struct SizeSelector │ │ │ │ │ +435 {}; │ │ │ │ │ +436 │ │ │ │ │ +437 template<> │ │ │ │ │ +438 struct SizeSelector<0> │ │ │ │ │ +439 { │ │ │ │ │ +440 template │ │ │ │ │ +441 static std::tuple │ │ │ │ │ +442 size(const M1& m1, const M2& m2) │ │ │ │ │ +443 { │ │ │ │ │ +444 return std::make_tuple(m1.N(), m2.M()); │ │ │ │ │ +445 } │ │ │ │ │ +446 }; │ │ │ │ │ +447 │ │ │ │ │ +448 template<> │ │ │ │ │ +449 struct SizeSelector<1> │ │ │ │ │ +450 { │ │ │ │ │ +451 template │ │ │ │ │ +452 static std::tuple │ │ │ │ │ +453 size(const M1& m1, const M2& m2) │ │ │ │ │ +454 { │ │ │ │ │ +455 return std::make_tuple(m1.M(), m2.M()); │ │ │ │ │ +456 } │ │ │ │ │ +457 }; │ │ │ │ │ +458 │ │ │ │ │ +459 │ │ │ │ │ +460 template<> │ │ │ │ │ +461 struct SizeSelector<2> │ │ │ │ │ +462 { │ │ │ │ │ +463 template │ │ │ │ │ +464 static std::tuple │ │ │ │ │ +465 size(const M1& m1, const M2& m2) │ │ │ │ │ +466 { │ │ │ │ │ +467 return std::make_tuple(m1.N(), m2.N()); │ │ │ │ │ +468 } │ │ │ │ │ +469 }; │ │ │ │ │ +470 │ │ │ │ │ +471 template │ │ │ │ │ +472 void _m_a_t_M_u_l_t_M_a_t(BCRSMatrix,A>& res, const │ │ │ │ │ +BCRSMatrix,A1>& mat1, │ │ │ │ │ +473 const BCRSMatrix,A2>& mat2) │ │ │ │ │ +474 { │ │ │ │ │ +475 // First step is to count the number of nonzeros │ │ │ │ │ +476 typename BCRSMatrix,A>::size_type rows, cols; │ │ │ │ │ +477 std::tie(rows,cols)=SizeSelector::size(mat1, mat2); │ │ │ │ │ +478 MatrixInitializer patternInit(res, rows); │ │ │ │ │ +479 Timer timer; │ │ │ │ │ +480 NonzeroPatternTraverser::traverse(mat1,mat2,patternInit); │ │ │ │ │ +481 res.setSize(rows, cols, patternInit.nonzeros()); │ │ │ │ │ +482 res.setBuildMode(BCRSMatrix,A>::row_wise); │ │ │ │ │ +483 │ │ │ │ │ +484 //std::cout<<"Counting nonzeros took "< entriesAccu(res); │ │ │ │ │ +495 NonzeroPatternTraverser::traverse(mat1,mat2,entriesAccu); │ │ │ │ │ +496 //std::cout<<"Calculating entries took "< │ │ │ │ │ +_5_0_9 struct _M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ +510 {}; │ │ │ │ │ +511 │ │ │ │ │ +512 template │ │ │ │ │ +_5_1_3 struct _M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_F_i_e_l_d_M_a_t_r_i_x,_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ +514 { │ │ │ │ │ +_5_1_5 typedef _F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_> _t_y_p_e; │ │ │ │ │ +516 }; │ │ │ │ │ +517 │ │ │ │ │ +518 template │ │ │ │ │ +_5_1_9 struct _M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A │ │ │ │ │ +>,_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A1 > > │ │ │ │ │ +520 { │ │ │ │ │ +521 typedef _B_C_R_S_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e │ │ │ │ │ +_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type, │ │ │ │ │ +_5_2_2 std::allocator,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type> > _t_y_p_e; │ │ │ │ │ +523 }; │ │ │ │ │ +524 │ │ │ │ │ +525 │ │ │ │ │ +533 template │ │ │ │ │ +_5_3_4 struct _T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ +535 {}; │ │ │ │ │ +536 │ │ │ │ │ +537 template │ │ │ │ │ +_5_3_8 struct _T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_F_i_e_l_d_M_a_t_r_i_x,_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ +539 { │ │ │ │ │ +_5_4_0 typedef _F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_> _t_y_p_e; │ │ │ │ │ +541 }; │ │ │ │ │ +542 │ │ │ │ │ +543 template │ │ │ │ │ +_5_4_4 struct _T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A │ │ │ │ │ +>,_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x,A1 > > │ │ │ │ │ +545 { │ │ │ │ │ +546 typedef _B_C_R_S_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e │ │ │ │ │ +_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type, │ │ │ │ │ +_5_4_7 std::allocator,_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_> >::type> > _t_y_p_e; │ │ │ │ │ +548 }; │ │ │ │ │ +549 │ │ │ │ │ +550 │ │ │ │ │ +559 template │ │ │ │ │ +_5_6_0 void _m_a_t_M_u_l_t_T_r_a_n_s_p_o_s_e_M_a_t(_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,A>& res, const │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A1>& _m_a_t, │ │ │ │ │ +561 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& matt, [[maybe_unused]] bool │ │ │ │ │ +tryHard=false) │ │ │ │ │ +562 { │ │ │ │ │ +563 matMultMat<2>(res,_m_a_t, matt); │ │ │ │ │ +564 } │ │ │ │ │ +565 │ │ │ │ │ +574 template │ │ │ │ │ +_5_7_5 void _m_a_t_M_u_l_t_M_a_t(_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A>& res, const │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_k_>,A1>& _m_a_t, │ │ │ │ │ +576 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& matt, bool tryHard=false) │ │ │ │ │ +577 { │ │ │ │ │ +578 matMultMat<0>(res,_m_a_t, matt); │ │ │ │ │ +579 } │ │ │ │ │ +580 │ │ │ │ │ +589 template │ │ │ │ │ +_5_9_0 void _t_r_a_n_s_p_o_s_e_M_a_t_M_u_l_t_M_a_t(_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_n_,_m_>,A>& res, const │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_n_>,A1>& _m_a_t, │ │ │ │ │ +591 const _B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x_<_T_,_k_,_m_>,A2>& matt, [[maybe_unused]] bool │ │ │ │ │ +tryHard=false) │ │ │ │ │ +592 { │ │ │ │ │ +593 matMultMat<1>(res,_m_a_t, matt); │ │ │ │ │ +594 } │ │ │ │ │ +595 │ │ │ │ │ +596} │ │ │ │ │ +597#endif │ │ │ │ │ +_b_c_r_s_m_a_t_r_i_x_._h_h │ │ │ │ │ +Implementation of the BCRSMatrix class. │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _0_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +FieldMatrix< T, n, m > type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:515 │ │ │ │ │ +_D_u_n_e_:_:_t_r_a_n_s_p_o_s_e_M_a_t_M_u_l_t_M_a_t │ │ │ │ │ +void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< │ │ │ │ │ +T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ +Calculate product of a transposed sparse matrix with another sparse matrices │ │ │ │ │ +( ). │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:590 │ │ │ │ │ +_D_u_n_e_:_:_m_a_t_M_u_l_t_M_a_t │ │ │ │ │ +void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< │ │ │ │ │ +FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 │ │ │ │ │ +> &matt, bool tryHard=false) │ │ │ │ │ +Calculate product of two sparse matrices ( ). │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:575 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_R_o_w │ │ │ │ │ +Matrix::RowIterator Row │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:326 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _2_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:417 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _1_,_ _T_,_ _T_A_,_ _n_,_ _m_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _0_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:380 │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_C_o_l │ │ │ │ │ +Matrix::ColIterator Col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:327 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _1_,_ _T_,_ _T_A_,_ _n_,_ _m_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_,_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m │ │ │ │ │ +_>_ _>_:_:_t_y_p_e │ │ │ │ │ +FieldMatrix< T, n, m > type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:540 │ │ │ │ │ +_D_u_n_e_:_:_m_a_t_M_u_l_t_T_r_a_n_s_p_o_s_e_M_a_t │ │ │ │ │ +void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< │ │ │ │ │ +T, k, m >, A2 > &matt, bool tryHard=false) │ │ │ │ │ +Calculate product of a sparse matrix with a transposed sparse matrices ( ). │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_I_n_i_t_i_a_l_i_z_e_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _1_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:398 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ +Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _n_,_ _k_ _>_,_ _A_ _>_,_ _B_C_R_S_M_a_t_r_i_x_< │ │ │ │ │ +_F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, │ │ │ │ │ +k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k │ │ │ │ │ +>, FieldMatrix< T, k, m > >::type > > type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:522 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_<_ _1_,_ _T_,_ _T_A_,_ _n_,_ _m_ _>_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Matrix::CreateIterator CreateIterator │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:325 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _1_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:399 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Matrix::CreateIterator CreateIterator │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _n_ _>_,_ _A_ _>_, │ │ │ │ │ +_B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _T_,_ _k_,_ _m_ _>_,_ _A_1_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, │ │ │ │ │ +k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k │ │ │ │ │ +>, FieldMatrix< T, k, m > >::type > > type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:547 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_<_ _T_,_ _A_,_ _n_,_ _m_,_ _2_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:418 │ │ │ │ │ +_D_u_n_e_:_:_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_I_n_i_t_i_a_l_i_z_e_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_I_n_i_t_i_a_l_i_z_e_r_:_:_d_o___b_r_e_a_k │ │ │ │ │ +@ do_break │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_E_n_t_r_y_A_c_c_u_m_u_l_a_t_o_r_F_a_t_h_e_r_:_:_d_o___b_r_e_a_k │ │ │ │ │ +@ do_break │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:324 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_n_i_t_i_a_l_i_z_e_r_:_:_d_o___b_r_e_a_k │ │ │ │ │ +@ do_break │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:185 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ -A multiple of the identity matrix of static size. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ -void usmhv(const K &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^H x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ -void mmtv(const X &x, Y &y) const │ │ │ │ │ -y -= A^T x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:305 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ -ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y) │ │ │ │ │ -vector space subtraction │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -const_row_type::ConstIterator ConstColIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ -ConstIterator end() const │ │ │ │ │ -end iterator │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -Iterator beforeBegin() │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const ScaledIdentityMatrix &other) const │ │ │ │ │ -incomparison operator │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ -void mmv(const X &x, Y &y) const │ │ │ │ │ -y -= A x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for the index access and size operations. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ -void usmv(const K &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ -row_type::Iterator ColIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const_row_type const_reference │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ -void mv(const X &x, Y &y) const │ │ │ │ │ -y = A x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ -void umtv(const X &x, Y &y) const │ │ │ │ │ -y += A^T x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:269 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ -void umhv(const X &x, Y &y) const │ │ │ │ │ -y += A^H x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ -DiagonalRowVector< K, n > row_type │ │ │ │ │ -Each row is implemented by a field vector. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< const WrapperType, reference, reference > Iterator │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -Iterator beforeEnd() │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_d_e_t_e_r_m_i_n_a_n_t │ │ │ │ │ -K determinant() const │ │ │ │ │ -calculates the determinant of this matrix │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:408 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -K field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ -void usmtv(const K &alpha, const X &x, Y &y) const │ │ │ │ │ -y += alpha A^T x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:341 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ Iterator end() │ │ │ │ │ -end iterator │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Iterator iterator │ │ │ │ │ -typedef for stl compliant access │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_c_a_l_a_r │ │ │ │ │ -const K & scalar() const │ │ │ │ │ -Get const reference to the scalar diagonal value. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:477 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ -void umv(const X &x, Y &y) const │ │ │ │ │ -y += A x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:257 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr std::size_t blocklevel │ │ │ │ │ -We are at the leaf of the block recursion. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -const K & diagonal(size_type) const │ │ │ │ │ -Get const reference to diagonal entry. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:464 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_r_o_w_s │ │ │ │ │ -@ rows │ │ │ │ │ -The number of rows. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_l_s │ │ │ │ │ -@ cols │ │ │ │ │ -The number of columns. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -ScaledIdentityMatrix & operator=(const K &k) │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -ContainerWrapperIterator< const WrapperType, const_reference, const_reference > │ │ │ │ │ -ConstIterator │ │ │ │ │ -Iterator class for sequential access. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ -K & diagonal(size_type) │ │ │ │ │ -Get reference to diagonal entry. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:470 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ -void solve(V &x, const V &b) const │ │ │ │ │ -Solve system A x = b. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:394 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ │ -bool exists(size_type i, size_type j) const │ │ │ │ │ -return true when (i,j) is in pattern │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:429 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -Iterator RowIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator const_iterator │ │ │ │ │ -typedef for stl compliant access │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ -ScaledIdentityMatrix() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const ScaledIdentityMatrix &other) const │ │ │ │ │ -comparison operator │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:223 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ -ConstIterator beforeBegin() const │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ -ScaledIdentityMatrix & operator/=(const K &k) │ │ │ │ │ -vector space division by scalar │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix< │ │ │ │ │ -K, n > &a) │ │ │ │ │ -Sends the matrix to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:441 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm2() const │ │ │ │ │ -square of frobenius norm, need for block recursion │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:372 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ -frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ -FieldTraits< field_type >::real_type infinity_norm() const │ │ │ │ │ -infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:378 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ -ConstIterator ConstRowIterator │ │ │ │ │ -rename the iterators for easier access │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ -ConstIterator beforeEnd() const │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -number of blocks in column direction │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:421 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const_reference operator[](size_type i) const │ │ │ │ │ -Return const_reference object as row replacement. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:458 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ -ScaledIdentityMatrix(const K &k) │ │ │ │ │ -Constructor initializing the whole matrix with a scalar. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ -friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar) │ │ │ │ │ -vector space multiplication with scalar │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ -FieldTraits< field_type >::real_type infinity_norm_real() const │ │ │ │ │ -simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ -ScaledIdentityMatrix & operator*=(const K &k) │ │ │ │ │ -vector space multiplication with scalar │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_d_e_n_t_i_c_a_l │ │ │ │ │ -bool identical(const ScaledIdentityMatrix< K, n > &other) const │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_n_v_e_r_t │ │ │ │ │ -void invert() │ │ │ │ │ -Compute inverse. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:402 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin iterator │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_c_a_l_a_r │ │ │ │ │ -K & scalar() │ │ │ │ │ -Get reference to the scalar diagonal value. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:484 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -row_type reference │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ -K block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ -void mmhv(const X &x, Y &y) const │ │ │ │ │ -y -= A^H x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:317 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ -ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y) │ │ │ │ │ -vector space addition │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_n_s_t___r_o_w___t_y_p_e │ │ │ │ │ -DiagonalRowVectorConst< K, n > const_row_type │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ -void mtv(const X &x, Y &y) const │ │ │ │ │ -y = A^T x │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:250 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -Return reference object as row replacement. │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:452 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ -ConstIterator begin() const │ │ │ │ │ -begin iterator │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of blocks in row direction │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:415 │ │ │ │ │ -_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r_<_ _D_e_n_s_e_M_a_t_r_i_x_,_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _f_i_e_l_d_,_ _N_ _>_ _>_:_: │ │ │ │ │ -_a_p_p_l_y │ │ │ │ │ -static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > │ │ │ │ │ -const &rhs) │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:497 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename ScaledIdentityMatrix< K, n >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:510 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn scaledidmatrix.hh:511 │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:681 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::Iterator ColIterator │ │ │ │ │ +Iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:704 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access and the size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_c_r_e_a_t_e_b_e_g_i_n │ │ │ │ │ +CreateIterator createbegin() │ │ │ │ │ +get initial create iterator │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1097 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator access to matrix rows │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:579 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator class for sequential creation of blocks │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:957 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_r_e_a_t_e_I_t_e_r_a_t_o_r_:_:_i_n_s_e_r_t │ │ │ │ │ +void insert(size_type j) │ │ │ │ │ +put column index in row │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:1064 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ +Helper TMP to get the result type of a sparse matrix matrix multiplication ( ) │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:510 │ │ │ │ │ +_D_u_n_e_:_:_T_r_a_n_s_p_o_s_e_d_M_a_t_M_u_l_t_M_a_t_R_e_s_u_l_t │ │ │ │ │ +Helper TMP to get the result type of a sparse matrix matrix multiplication ( ) │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:535 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00209.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: repartition.hh File Reference │ │ │ │ +dune-istl: operators.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,101 +71,51 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
repartition.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Functionality for redistributing a parallel index set using graph partitioning. │ │ │ │ +

Define general, extensible interface for operators. The available implementation wraps a matrix. │ │ │ │ More...

│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <map>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <dune/common/timer.hh>
│ │ │ │ -#include <dune/common/enumset.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ -#include <dune/common/parallel/communicator.hh>
│ │ │ │ -#include <dune/common/parallel/indexset.hh>
│ │ │ │ -#include <dune/common/parallel/indicessyncer.hh>
│ │ │ │ -#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -#include <dune/common/rangeutilities.hh>
│ │ │ │ -#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ -#include <dune/istl/paamg/graph.hh>
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <iomanip>
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/shared_ptr.hh>
│ │ │ │ +#include "solvercategory.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::RedistributeInterface
class  Dune::LinearOperator< X, Y >
 A linear operator. More...
 
class  Dune::AssembledLinearOperator< M, X, Y >
 A linear operator exporting itself in matrix form. More...
 
class  Dune::MatrixAdapter< M, X, Y >
 Adapter to turn a matrix into a linear operator. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Metis
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

using Dune::Metis::real_t = float
 
using Dune::Metis::idx_t = std::size_t
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class G , class T1 , class T2 >
void Dune::fillIndexSetHoles (const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
 Fills the holes in an index set.
 
template<class G , class T1 , class T2 >
bool Dune::buildCommunication (const G &graph, std::vector< int > &realparts, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
 
template<class S , class T >
void Dune::print_carray (S &os, T *array, std::size_t l)
 
template<class S , class T >
bool Dune::isValidGraph (std::size_t noVtx, std::size_t gnoVtx, S noEdges, T *xadj, T *adjncy, bool checkSymmetry)
 
template<class M , class T1 , class T2 >
bool Dune::commGraphRepartition (const M &mat, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
 
template<class G , class T1 , class T2 >
bool Dune::graphRepartition (const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
 execute a graph repartition for a giving graph and indexset.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Functionality for redistributing a parallel index set using graph partitioning.

│ │ │ │ -

Refactored version of an intern.

Author
Markus Blatt
│ │ │ │ -

Variable Documentation

│ │ │ │ - │ │ │ │ -

◆ globalOwnerVertices

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
int globalOwnerVertices
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Define general, extensible interface for operators. The available implementation wraps a matrix.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,81 +1,39 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -repartition.hh File Reference │ │ │ │ │ -Functionality for redistributing a parallel index set using graph partitioning. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +operators.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _O_p_e_r_a_t_o_r │ │ │ │ │ +_c_o_n_c_e_p_t │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_r_a_p_h_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ +class   _D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_ _X_,_ _Y_ _> │ │ │ │ │ +  A linear operator. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_M_e_t_i_s │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -using  _D_u_n_e_:_:_M_e_t_i_s_:_:_r_e_a_l___t = float │ │ │ │ │ -  │ │ │ │ │ -using  _D_u_n_e_:_:_M_e_t_i_s_:_:_i_d_x___t = std::size_t │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s (const G &graph, _D_u_n_e_:_: │ │ │ │ │ - _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > &oocomm) │ │ │ │ │ -  Fills the holes in an index set. │ │ │ │ │ +class   _D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  A linear operator exporting itself in matrix form. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n (const G &graph, std::vector< int > &realparts, │ │ │ │ │ - _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > &oocomm, std::shared_ptr< │ │ │ │ │ - _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > > &outcomm, │ │ │ │ │ - _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e &redistInf, bool verbose=false) │ │ │ │ │ +class   _D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  Adapter to turn a matrix into a linear operator. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_p_r_i_n_t___c_a_r_r_a_y (S &os, T *array, std::size_t l) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_i_s_V_a_l_i_d_G_r_a_p_h (std::size_t noVtx, std::size_t gnoVtx, S noEdges, T │ │ │ │ │ - *xadj, T *adjncy, bool checkSymmetry) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n (const M &_m_a_t, _D_u_n_e_:_: │ │ │ │ │ - _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > &oocomm, _M_e_t_i_s_:_:_i_d_x___t nparts, │ │ │ │ │ - std::shared_ptr< _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > > │ │ │ │ │ - &outcomm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e &redistInf, bool verbose=false) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool  _D_u_n_e_:_:_g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n (const G &graph, _D_u_n_e_:_: │ │ │ │ │ - _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > &oocomm, _M_e_t_i_s_:_:_i_d_x___t nparts, │ │ │ │ │ - std::shared_ptr< _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n< T1, T2 > > │ │ │ │ │ - &outcomm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e &redistInf, bool verbose=false) │ │ │ │ │ -  execute a graph repartition for a giving graph and indexset. │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Functionality for redistributing a parallel index set using graph partitioning. │ │ │ │ │ -Refactored version of an intern. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ -********** VVaarriiaabbllee DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? gglloobbaallOOwwnneerrVVeerrttiicceess ********** │ │ │ │ │ -int globalOwnerVertices │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: repartition.hh Source File │ │ │ │ +dune-istl: operators.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1851 +74,170 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
repartition.hh
│ │ │ │ +
operators.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_REPARTITION_HH
│ │ │ │ -
6#define DUNE_ISTL_REPARTITION_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_OPERATORS_HH
│ │ │ │ +
6#define DUNE_ISTL_OPERATORS_HH
│ │ │ │
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9#include <map>
│ │ │ │ -
10#include <utility>
│ │ │ │ -
11#include <cmath>
│ │ │ │ -
12
│ │ │ │ -
13#if HAVE_PARMETIS
│ │ │ │ -
14// Explicitly use C linkage as scotch does not extern "C" in its headers.
│ │ │ │ -
15// Works because ParMETIS/METIS checks whether compiler is C++ and otherwise
│ │ │ │ -
16// does not use extern "C". Therfore no nested extern "C" will be created
│ │ │ │ -
17extern "C"
│ │ │ │ -
18{
│ │ │ │ -
19#include <parmetis.h>
│ │ │ │ -
20}
│ │ │ │ -
21#endif
│ │ │ │ -
22
│ │ │ │ -
23#include <dune/common/timer.hh>
│ │ │ │ -
24#include <dune/common/enumset.hh>
│ │ │ │ -
25#include <dune/common/stdstreams.hh>
│ │ │ │ -
26#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ -
27#include <dune/common/parallel/communicator.hh>
│ │ │ │ -
28#include <dune/common/parallel/indexset.hh>
│ │ │ │ -
29#include <dune/common/parallel/indicessyncer.hh>
│ │ │ │ -
30#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -
31#include <dune/common/rangeutilities.hh>
│ │ │ │ -
32
│ │ │ │ - │ │ │ │ - │ │ │ │ -
35
│ │ │ │ -
44namespace Dune
│ │ │ │ -
45{
│ │ │ │ -
│ │ │ │ -
46 namespace Metis
│ │ │ │ -
47 {
│ │ │ │ -
48 // Explicitly specify a real_t and idx_t for older (Par)METIS versions that do not
│ │ │ │ -
49 // provide these typedefs
│ │ │ │ -
50#if HAVE_PARMETIS && defined(REALTYPEWIDTH)
│ │ │ │ -
51 using real_t = ::real_t;
│ │ │ │ -
52#else
│ │ │ │ -
53 using real_t = float;
│ │ │ │ -
54#endif
│ │ │ │ -
55
│ │ │ │ -
56#if HAVE_PARMETIS && defined(IDXTYPEWIDTH)
│ │ │ │ -
57 using idx_t = ::idx_t;
│ │ │ │ -
58#elif HAVE_PARMETIS && defined(HAVE_SCOTCH_NUM_TYPE)
│ │ │ │ -
59 using idx_t = SCOTCH_Num;
│ │ │ │ -
60#elif HAVE_PARMETIS
│ │ │ │ -
61 using idx_t = int;
│ │ │ │ -
62#else
│ │ │ │ -
63 using idx_t = std::size_t;
│ │ │ │ -
64#endif
│ │ │ │ -
65 }
│ │ │ │ -
│ │ │ │ -
66
│ │ │ │ -
67
│ │ │ │ -
68#if HAVE_MPI
│ │ │ │ -
82 template<class G, class T1, class T2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
84 {
│ │ │ │ - │ │ │ │ -
86 typedef typename IndexSet::LocalIndex::Attribute Attribute;
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <complex>
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <iomanip>
│ │ │ │ +
12#include <string>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/exceptions.hh>
│ │ │ │ +
15#include <dune/common/shared_ptr.hh>
│ │ │ │ +
16
│ │ │ │ +
17#include "solvercategory.hh"
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21
│ │ │ │ +
44 //=====================================================================
│ │ │ │ +
45 // Abstract operator interface
│ │ │ │ +
46 //=====================================================================
│ │ │ │ +
47
│ │ │ │ +
48
│ │ │ │ +
66 template<class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
68 public:
│ │ │ │ +
70 typedef X domain_type;
│ │ │ │ +
72 typedef Y range_type;
│ │ │ │ +
74 typedef typename X::field_type field_type;
│ │ │ │ +
75
│ │ │ │ +
80 virtual void apply (const X& x, Y& y) const = 0;
│ │ │ │ +
81
│ │ │ │ +
83 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const = 0;
│ │ │ │ +
84
│ │ │ │ +
86 virtual ~LinearOperator () {}
│ │ │ │
87
│ │ │ │ -
88 IndexSet& indexSet = oocomm.indexSet();
│ │ │ │ - │ │ │ │ -
90
│ │ │ │ -
91 std::size_t sum=0, needed = graph.noVertices()-indexSet.size();
│ │ │ │ -
92 std::vector<std::size_t> neededall(oocomm.communicator().size(), 0);
│ │ │ │ -
93
│ │ │ │ -
94 MPI_Allgather(&needed, 1, MPITraits<std::size_t>::getType() , &(neededall[0]), 1, MPITraits<std::size_t>::getType(), oocomm.communicator());
│ │ │ │ -
95 for(int i=0; i<oocomm.communicator().size(); ++i)
│ │ │ │ -
96 sum=sum+neededall[i]; // MAke this for generic
│ │ │ │ -
97
│ │ │ │ -
98 if(sum==0)
│ │ │ │ -
99 // Nothing to do
│ │ │ │ -
100 return;
│ │ │ │ -
101
│ │ │ │ -
102 //Compute Maximum Global Index
│ │ │ │ -
103 T1 maxgi=0;
│ │ │ │ -
104 auto end = indexSet.end();
│ │ │ │ -
105 for(auto it = indexSet.begin(); it != end; ++it)
│ │ │ │ -
106 maxgi=std::max(maxgi,it->global());
│ │ │ │ -
107
│ │ │ │ -
108 //Process p creates global indices consecutively
│ │ │ │ -
109 //starting atmaxgi+\sum_{i=1}^p neededall[i]
│ │ │ │ -
110 // All created indices are owned by the process
│ │ │ │ -
111 maxgi=oocomm.communicator().max(maxgi);
│ │ │ │ -
112 ++maxgi; //Sart with the next free index.
│ │ │ │ -
113
│ │ │ │ -
114 for(int i=0; i<oocomm.communicator().rank(); ++i)
│ │ │ │ -
115 maxgi=maxgi+neededall[i]; // TODO: make this more generic
│ │ │ │ + │ │ │ │ +
90#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
│ │ │ │ +
91 {
│ │ │ │ +
92 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
│ │ │ │ +
93 };
│ │ │ │ +
94#else
│ │ │ │ +
95 = 0;
│ │ │ │ +
96#endif
│ │ │ │ +
97 };
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
99
│ │ │ │ +
108 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
110 public:
│ │ │ │ +
112 typedef M matrix_type;
│ │ │ │ +
113 typedef X domain_type;
│ │ │ │ +
114 typedef Y range_type;
│ │ │ │ +
115 typedef typename X::field_type field_type;
│ │ │ │
116
│ │ │ │ -
117 // Store the global index information for repairing the remote index information
│ │ │ │ -
118 std::map<int,SLList<std::pair<T1,Attribute> > > globalIndices;
│ │ │ │ -
119 storeGlobalIndicesOfRemoteIndices(globalIndices, oocomm.remoteIndices());
│ │ │ │ -
120 indexSet.beginResize();
│ │ │ │ -
121
│ │ │ │ -
122 for(auto vertex = graph.begin(), vend=graph.end(); vertex != vend; ++vertex) {
│ │ │ │ -
123 const typename IndexSet::IndexPair* pair=lookup.pair(*vertex);
│ │ │ │ -
124 if(pair==0) {
│ │ │ │ -
125 // No index yet, add new one
│ │ │ │ -
126 indexSet.add(maxgi, typename IndexSet::LocalIndex(*vertex, OwnerOverlapCopyAttributeSet::owner, false));
│ │ │ │ -
127 ++maxgi;
│ │ │ │ -
128 }
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
131 indexSet.endResize();
│ │ │ │ -
132
│ │ │ │ -
133 repairLocalIndexPointers(globalIndices, oocomm.remoteIndices(), indexSet);
│ │ │ │ -
134
│ │ │ │ -
135 oocomm.freeGlobalLookup();
│ │ │ │ -
136 oocomm.buildGlobalLookup();
│ │ │ │ -
137#ifdef DEBUG_REPART
│ │ │ │ -
138 std::cout<<"Holes are filled!"<<std::endl;
│ │ │ │ -
139 std::cout<<oocomm.communicator().rank()<<": "<<oocomm.indexSet()<<std::endl;
│ │ │ │ -
140#endif
│ │ │ │ -
141 }
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
143 namespace
│ │ │ │ -
144 {
│ │ │ │ -
145
│ │ │ │ -
146 class ParmetisDuneIndexMap
│ │ │ │ -
147 {
│ │ │ │ -
148 public:
│ │ │ │ -
149 template<class Graph, class OOComm>
│ │ │ │ -
150 ParmetisDuneIndexMap(const Graph& graph, const OOComm& com);
│ │ │ │ -
151 int toParmetis(int i) const
│ │ │ │ -
152 {
│ │ │ │ -
153 return duneToParmetis[i];
│ │ │ │ -
154 }
│ │ │ │ -
155 int toLocalParmetis(int i) const
│ │ │ │ -
156 {
│ │ │ │ -
157 return duneToParmetis[i]-base_;
│ │ │ │ -
158 }
│ │ │ │ -
159 int operator[](int i) const
│ │ │ │ -
160 {
│ │ │ │ -
161 return duneToParmetis[i];
│ │ │ │ -
162 }
│ │ │ │ -
163 int toDune(int i) const
│ │ │ │ -
164 {
│ │ │ │ -
165 return parmetisToDune[i];
│ │ │ │ -
166 }
│ │ │ │ -
167 std::vector<int>::size_type numOfOwnVtx() const
│ │ │ │ -
168 {
│ │ │ │ -
169 return parmetisToDune.size();
│ │ │ │ -
170 }
│ │ │ │ -
171 Metis::idx_t* vtxDist()
│ │ │ │ -
172 {
│ │ │ │ -
173 return &vtxDist_[0];
│ │ │ │ -
174 }
│ │ │ │ - │ │ │ │ -
176 private:
│ │ │ │ -
177 int base_;
│ │ │ │ -
178 std::vector<int> duneToParmetis;
│ │ │ │ -
179 std::vector<int> parmetisToDune;
│ │ │ │ -
180 // range of vertices for processor i: vtxdist[i] to vtxdist[i+1] (parmetis global)
│ │ │ │ -
181 std::vector<Metis::idx_t> vtxDist_;
│ │ │ │ -
182 };
│ │ │ │ -
183
│ │ │ │ -
184 template<class G, class OOComm>
│ │ │ │ -
185 ParmetisDuneIndexMap::ParmetisDuneIndexMap(const G& graph, const OOComm& oocomm)
│ │ │ │ -
186 : duneToParmetis(graph.noVertices(), -1), vtxDist_(oocomm.communicator().size()+1)
│ │ │ │ -
187 {
│ │ │ │ -
188 int npes=oocomm.communicator().size(), mype=oocomm.communicator().rank();
│ │ │ │ -
189
│ │ │ │ -
190 typedef typename OOComm::OwnerSet OwnerSet;
│ │ │ │ -
191
│ │ │ │ -
192 int numOfOwnVtx=0;
│ │ │ │ -
193 auto end = oocomm.indexSet().end();
│ │ │ │ -
194 for(auto index = oocomm.indexSet().begin(); index != end; ++index) {
│ │ │ │ -
195 if (OwnerSet::contains(index->local().attribute())) {
│ │ │ │ -
196 numOfOwnVtx++;
│ │ │ │ -
197 }
│ │ │ │ -
198 }
│ │ │ │ -
199 parmetisToDune.resize(numOfOwnVtx);
│ │ │ │ -
200 std::vector<int> globalNumOfVtx(npes);
│ │ │ │ -
201 // make this number available to all processes
│ │ │ │ -
202 MPI_Allgather(&numOfOwnVtx, 1, MPI_INT, &(globalNumOfVtx[0]), 1, MPI_INT, oocomm.communicator());
│ │ │ │ -
203
│ │ │ │ -
204 int base=0;
│ │ │ │ -
205 vtxDist_[0] = 0;
│ │ │ │ -
206 for(int i=0; i<npes; i++) {
│ │ │ │ -
207 if (i<mype) {
│ │ │ │ -
208 base += globalNumOfVtx[i];
│ │ │ │ -
209 }
│ │ │ │ -
210 vtxDist_[i+1] = vtxDist_[i] + globalNumOfVtx[i];
│ │ │ │ -
211 }
│ │ │ │ -
212 globalOwnerVertices=vtxDist_[npes];
│ │ │ │ -
213 base_=base;
│ │ │ │ -
214
│ │ │ │ -
215#ifdef DEBUG_REPART
│ │ │ │ -
216 std::cout << oocomm.communicator().rank()<<" vtxDist: ";
│ │ │ │ -
217 for(int i=0; i<= npes; ++i)
│ │ │ │ -
218 std::cout << vtxDist_[i]<<" ";
│ │ │ │ -
219 std::cout<<std::endl;
│ │ │ │ -
220#endif
│ │ │ │ -
221
│ │ │ │ -
222 // Traverse the graph and assign a new consecutive number/index
│ │ │ │ -
223 // starting by "base" to all owner vertices.
│ │ │ │ -
224 // The new index is used as the ParMETIS global index and is
│ │ │ │ -
225 // stored in the vector "duneToParmetis"
│ │ │ │ -
226 auto vend = graph.end();
│ │ │ │ -
227 for(auto vertex = graph.begin(); vertex != vend; ++vertex) {
│ │ │ │ -
228 const typename OOComm::ParallelIndexSet::IndexPair* index=oocomm.globalLookup().pair(*vertex);
│ │ │ │ -
229 assert(index);
│ │ │ │ -
230 if (OwnerSet::contains(index->local().attribute())) {
│ │ │ │ -
231 // assign and count the index
│ │ │ │ -
232 parmetisToDune[base-base_]=index->local();
│ │ │ │ -
233 duneToParmetis[index->local()] = base++;
│ │ │ │ -
234 }
│ │ │ │ -
235 }
│ │ │ │ -
236
│ │ │ │ -
237 // At this point, every process knows the ParMETIS global index
│ │ │ │ -
238 // of it's owner vertices. The next step is to get the
│ │ │ │ -
239 // ParMETIS global index of the overlap vertices from the
│ │ │ │ -
240 // associated processes. To do this, the Dune::Interface class
│ │ │ │ -
241 // is used.
│ │ │ │ -
242#ifdef DEBUG_REPART
│ │ │ │ -
243 std::cout <<oocomm.communicator().rank()<<": before ";
│ │ │ │ -
244 for(std::size_t i=0; i<duneToParmetis.size(); ++i)
│ │ │ │ -
245 std::cout<<duneToParmetis[i]<<" ";
│ │ │ │ -
246 std::cout<<std::endl;
│ │ │ │ -
247#endif
│ │ │ │ -
248 oocomm.copyOwnerToAll(duneToParmetis,duneToParmetis);
│ │ │ │ -
249#ifdef DEBUG_REPART
│ │ │ │ -
250 std::cout <<oocomm.communicator().rank()<<": after ";
│ │ │ │ -
251 for(std::size_t i=0; i<duneToParmetis.size(); ++i)
│ │ │ │ -
252 std::cout<<duneToParmetis[i]<<" ";
│ │ │ │ -
253 std::cout<<std::endl;
│ │ │ │ -
254#endif
│ │ │ │ -
255 }
│ │ │ │ -
256 }
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
259 : public Interface
│ │ │ │ -
260 {
│ │ │ │ -
│ │ │ │ -
261 void setCommunicator(MPI_Comm comm)
│ │ │ │ -
262 {
│ │ │ │ -
263 communicator_=comm;
│ │ │ │ -
264 }
│ │ │ │ -
│ │ │ │ -
265 template<class Flags,class IS>
│ │ │ │ -
│ │ │ │ -
266 void buildSendInterface(const std::vector<int>& toPart, const IS& idxset)
│ │ │ │ -
267 {
│ │ │ │ -
268 std::map<int,int> sizes;
│ │ │ │ -
269
│ │ │ │ -
270 for(auto i=idxset.begin(), end=idxset.end(); i!=end; ++i)
│ │ │ │ -
271 if(Flags::contains(i->local().attribute()))
│ │ │ │ -
272 ++sizes[toPart[i->local()]];
│ │ │ │ -
273
│ │ │ │ -
274 // Allocate the necessary space
│ │ │ │ -
275 for(auto i=sizes.begin(), end=sizes.end(); i!=end; ++i)
│ │ │ │ -
276 interfaces()[i->first].first.reserve(i->second);
│ │ │ │ -
277
│ │ │ │ -
278 //Insert the interface information
│ │ │ │ -
279 for(auto i=idxset.begin(), end=idxset.end(); i!=end; ++i)
│ │ │ │ -
280 if(Flags::contains(i->local().attribute()))
│ │ │ │ -
281 interfaces()[toPart[i->local()]].first.add(i->local());
│ │ │ │ -
282 }
│ │ │ │ -
│ │ │ │ -
283
│ │ │ │ -
│ │ │ │ -
284 void reserveSpaceForReceiveInterface(int proc, int size)
│ │ │ │ -
285 {
│ │ │ │ -
286 interfaces()[proc].second.reserve(size);
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
288 void addReceiveIndex(int proc, std::size_t idx)
│ │ │ │ -
289 {
│ │ │ │ -
290 interfaces()[proc].second.add(idx);
│ │ │ │ -
291 }
│ │ │ │ -
│ │ │ │ -
292 template<typename TG>
│ │ │ │ -
│ │ │ │ -
293 void buildReceiveInterface(std::vector<std::pair<TG,int> >& indices)
│ │ │ │ -
294 {
│ │ │ │ -
295 std::size_t i=0;
│ │ │ │ -
296 for(auto idx=indices.begin(); idx!= indices.end(); ++idx) {
│ │ │ │ -
297 interfaces()[idx->second].second.add(i++);
│ │ │ │ -
298 }
│ │ │ │ -
299 }
│ │ │ │ -
│ │ │ │ -
300
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
302 {}
│ │ │ │ -
│ │ │ │ -
303
│ │ │ │ -
304 };
│ │ │ │ -
│ │ │ │ -
305
│ │ │ │ -
306 namespace
│ │ │ │ -
307 {
│ │ │ │ -
317 template<class GI>
│ │ │ │ -
318 void createSendBuf(std::vector<GI>& ownerVec, std::set<GI>& overlapVec, std::set<int>& neighbors, char *sendBuf, int buffersize, MPI_Comm comm) {
│ │ │ │ -
319 // Pack owner vertices
│ │ │ │ -
320 std::size_t s=ownerVec.size();
│ │ │ │ -
321 int pos=0;
│ │ │ │ -
322 if(s==0)
│ │ │ │ -
323 ownerVec.resize(1); // otherwise would read beyond the memory bound
│ │ │ │ -
324 MPI_Pack(&s, 1, MPITraits<std::size_t>::getType(), sendBuf, buffersize, &pos, comm);
│ │ │ │ -
325 MPI_Pack(&(ownerVec[0]), s, MPITraits<GI>::getType(), sendBuf, buffersize, &pos, comm);
│ │ │ │ -
326 s = overlapVec.size();
│ │ │ │ -
327 MPI_Pack(&s, 1, MPITraits<std::size_t>::getType(), sendBuf, buffersize, &pos, comm);
│ │ │ │ -
328 for(auto i=overlapVec.begin(), end= overlapVec.end(); i != end; ++i)
│ │ │ │ -
329 MPI_Pack(const_cast<GI*>(&(*i)), 1, MPITraits<GI>::getType(), sendBuf, buffersize, &pos, comm);
│ │ │ │ -
330
│ │ │ │ -
331 s=neighbors.size();
│ │ │ │ -
332 MPI_Pack(&s, 1, MPITraits<std::size_t>::getType(), sendBuf, buffersize, &pos, comm);
│ │ │ │ -
333
│ │ │ │ -
334 for(auto i=neighbors.begin(), end= neighbors.end(); i != end; ++i)
│ │ │ │ -
335 MPI_Pack(const_cast<int*>(&(*i)), 1, MPI_INT, sendBuf, buffersize, &pos, comm);
│ │ │ │ -
336 }
│ │ │ │ -
345 template<class GI>
│ │ │ │ -
346 void saveRecvBuf(char *recvBuf, int bufferSize, std::vector<std::pair<GI,int> >& ownerVec,
│ │ │ │ -
347 std::set<GI>& overlapVec, std::set<int>& neighbors, RedistributeInterface& inf, int from, MPI_Comm comm) {
│ │ │ │ -
348 std::size_t size;
│ │ │ │ -
349 int pos=0;
│ │ │ │ -
350 // unpack owner vertices
│ │ │ │ -
351 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits<std::size_t>::getType(), comm);
│ │ │ │ -
352 inf.reserveSpaceForReceiveInterface(from, size);
│ │ │ │ -
353 ownerVec.reserve(ownerVec.size()+size);
│ │ │ │ -
354 for(; size!=0; --size) {
│ │ │ │ -
355 GI gi;
│ │ │ │ -
356 MPI_Unpack(recvBuf, bufferSize, &pos, &gi, 1, MPITraits<GI>::getType(), comm);
│ │ │ │ -
357 ownerVec.push_back(std::make_pair(gi,from));
│ │ │ │ -
358 }
│ │ │ │ -
359 // unpack overlap vertices
│ │ │ │ -
360 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits<std::size_t>::getType(), comm);
│ │ │ │ -
361 typename std::set<GI>::iterator ipos = overlapVec.begin();
│ │ │ │ -
362 Dune::dverb << "unpacking "<<size<<" overlap"<<std::endl;
│ │ │ │ -
363 for(; size!=0; --size) {
│ │ │ │ -
364 GI gi;
│ │ │ │ -
365 MPI_Unpack(recvBuf, bufferSize, &pos, &gi, 1, MPITraits<GI>::getType(), comm);
│ │ │ │ -
366 ipos=overlapVec.insert(ipos, gi);
│ │ │ │ -
367 }
│ │ │ │ -
368 //unpack neighbors
│ │ │ │ -
369 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits<std::size_t>::getType(), comm);
│ │ │ │ -
370 Dune::dverb << "unpacking "<<size<<" neighbors"<<std::endl;
│ │ │ │ -
371 typename std::set<int>::iterator npos = neighbors.begin();
│ │ │ │ -
372 for(; size!=0; --size) {
│ │ │ │ -
373 int n;
│ │ │ │ -
374 MPI_Unpack(recvBuf, bufferSize, &pos, &n, 1, MPI_INT, comm);
│ │ │ │ -
375 npos=neighbors.insert(npos, n);
│ │ │ │ -
376 }
│ │ │ │ -
377 }
│ │ │ │ -
378
│ │ │ │ -
392 template<typename T>
│ │ │ │ -
393 void getDomain(const MPI_Comm& comm, T *part, int numOfOwnVtx, int nparts, int *myDomain, std::vector<int> &domainMapping) {
│ │ │ │ -
394 int npes, mype;
│ │ │ │ -
395 MPI_Comm_size(comm, &npes);
│ │ │ │ -
396 MPI_Comm_rank(comm, &mype);
│ │ │ │ -
397 MPI_Status status;
│ │ │ │ -
398
│ │ │ │ -
399 *myDomain = -1;
│ │ │ │ -
400 int i=0;
│ │ │ │ -
401 int j=0;
│ │ │ │ -
402
│ │ │ │ -
403 std::vector<int> domain(nparts, 0);
│ │ │ │ -
404 std::vector<int> assigned(npes, 0);
│ │ │ │ -
405 // init domain Mapping
│ │ │ │ -
406 domainMapping.assign(domainMapping.size(), -1);
│ │ │ │ -
407
│ │ │ │ -
408 // count the occurrence of domains
│ │ │ │ -
409 for (i=0; i<numOfOwnVtx; i++) {
│ │ │ │ -
410 domain[part[i]]++;
│ │ │ │ -
411 }
│ │ │ │ -
412
│ │ │ │ -
413 std::vector<int> domainMatrix(npes * nparts, -1);
│ │ │ │ -
414
│ │ │ │ -
415 // init buffer with the own domain
│ │ │ │ -
416 int *buf = new int[nparts];
│ │ │ │ -
417 for (i=0; i<nparts; i++) {
│ │ │ │ -
418 buf[i] = domain[i];
│ │ │ │ -
419 domainMatrix[mype*nparts+i] = domain[i];
│ │ │ │ -
420 }
│ │ │ │ -
421 int pe=0;
│ │ │ │ -
422 int src = (mype-1+npes)%npes;
│ │ │ │ -
423 int dest = (mype+1)%npes;
│ │ │ │ -
424 // ring communication, we need n-1 communications for n processors
│ │ │ │ -
425 for (i=0; i<npes-1; i++) {
│ │ │ │ -
426 MPI_Sendrecv_replace(buf, nparts, MPI_INT, dest, 0, src, 0, comm, &status);
│ │ │ │ -
427 // pe is the process of the actual received buffer
│ │ │ │ -
428 pe = ((mype-1-i)+npes)%npes;
│ │ │ │ -
429 for(j=0; j<nparts; j++) {
│ │ │ │ -
430 // save the values to the domain matrix
│ │ │ │ -
431 domainMatrix[pe*nparts+j] = buf[j];
│ │ │ │ -
432 }
│ │ │ │ -
433 }
│ │ │ │ -
434 delete[] buf;
│ │ │ │ -
435
│ │ │ │ -
436 // Start the domain calculation.
│ │ │ │ -
437 // The process which contains the maximum number of vertices of a
│ │ │ │ -
438 // particular domain is selected to choose it's favorate domain
│ │ │ │ -
439 int maxOccurance = 0;
│ │ │ │ -
440 pe = -1;
│ │ │ │ -
441 std::set<std::size_t> unassigned;
│ │ │ │ -
442
│ │ │ │ -
443 for(i=0; i<nparts; i++) {
│ │ │ │ -
444 for(j=0; j<npes; j++) {
│ │ │ │ -
445 // process has no domain assigned
│ │ │ │ -
446 if (assigned[j]==0) {
│ │ │ │ -
447 if (maxOccurance < domainMatrix[j*nparts+i]) {
│ │ │ │ -
448 maxOccurance = domainMatrix[j*nparts+i];
│ │ │ │ -
449 pe = j;
│ │ │ │ -
450 }
│ │ │ │ -
451 }
│ │ │ │ -
452
│ │ │ │ -
453 }
│ │ │ │ -
454 if (pe!=-1) {
│ │ │ │ -
455 // process got a domain, ...
│ │ │ │ -
456 domainMapping[i] = pe;
│ │ │ │ -
457 // ...mark as assigned
│ │ │ │ -
458 assigned[pe] = 1;
│ │ │ │ -
459 if (pe==mype) {
│ │ │ │ -
460 *myDomain = i;
│ │ │ │ -
461 }
│ │ │ │ -
462 pe = -1;
│ │ │ │ -
463 }
│ │ │ │ -
464 else
│ │ │ │ -
465 {
│ │ │ │ -
466 unassigned.insert(i);
│ │ │ │ -
467 }
│ │ │ │ -
468 maxOccurance = 0;
│ │ │ │ -
469 }
│ │ │ │ -
470
│ │ │ │ -
471 typename std::vector<int>::iterator next_free = assigned.begin();
│ │ │ │ -
472
│ │ │ │ -
473 for(auto udomain = unassigned.begin(),
│ │ │ │ -
474 end = unassigned.end(); udomain != end; ++udomain)
│ │ │ │ -
475 {
│ │ │ │ -
476 next_free = std::find_if(next_free, assigned.end(), std::bind(std::less<int>(), std::placeholders::_1, 1));
│ │ │ │ -
477 assert(next_free != assigned.end());
│ │ │ │ -
478 domainMapping[*udomain] = next_free-assigned.begin();
│ │ │ │ -
479 *next_free = 1;
│ │ │ │ -
480 }
│ │ │ │ -
481 }
│ │ │ │ -
482
│ │ │ │ -
483 struct SortFirst
│ │ │ │ -
484 {
│ │ │ │ -
485 template<class T>
│ │ │ │ -
486 bool operator()(const T& t1, const T& t2) const
│ │ │ │ -
487 {
│ │ │ │ -
488 return t1<t2;
│ │ │ │ -
489 }
│ │ │ │ -
490 };
│ │ │ │ -
491
│ │ │ │ -
492
│ │ │ │ -
503 template<class GI>
│ │ │ │ -
504 void mergeVec(std::vector<std::pair<GI, int> >& ownerVec, std::set<GI>& overlapSet) {
│ │ │ │ -
505
│ │ │ │ -
506#ifdef DEBUG_REPART
│ │ │ │ -
507 // Safety check for duplicates.
│ │ │ │ -
508 if(ownerVec.size()>0)
│ │ │ │ -
509 {
│ │ │ │ -
510 auto old=ownerVec.begin();
│ │ │ │ -
511 for(auto i=old+1, end=ownerVec.end(); i != end; old=i++)
│ │ │ │ -
512 {
│ │ │ │ -
513 if(i->first==old->first)
│ │ │ │ -
514 {
│ │ │ │ -
515 std::cerr<<"Value at indes"<<old-ownerVec.begin()<<" is the same as at index "
│ │ │ │ -
516 <<i-ownerVec.begin()<<" ["<<old->first<<","<<old->second<<"]==["
│ │ │ │ -
517 <<i->first<<","<<i->second<<"]"<<std::endl;
│ │ │ │ -
518 throw "Huch!";
│ │ │ │ -
519 }
│ │ │ │ -
520 }
│ │ │ │ -
521 }
│ │ │ │ -
522
│ │ │ │ -
523#endif
│ │ │ │ -
524
│ │ │ │ -
525 auto v=ownerVec.begin(), vend=ownerVec.end();
│ │ │ │ -
526 for(auto s=overlapSet.begin(), send=overlapSet.end(); s!=send;)
│ │ │ │ -
527 {
│ │ │ │ -
528 while(v!=vend && v->first<*s) ++v;
│ │ │ │ -
529 if(v!=vend && v->first==*s) {
│ │ │ │ -
530 // Move to the next element before erasing
│ │ │ │ -
531 // thus s stays valid!
│ │ │ │ -
532 auto tmp=s;
│ │ │ │ -
533 ++s;
│ │ │ │ -
534 overlapSet.erase(tmp);
│ │ │ │ -
535 }else
│ │ │ │ -
536 ++s;
│ │ │ │ -
537 }
│ │ │ │ -
538 }
│ │ │ │ -
539
│ │ │ │ -
540
│ │ │ │ -
554 template<class OwnerSet, class Graph, class IS, class GI>
│ │ │ │ -
555 void getNeighbor(const Graph& g, std::vector<int>& part,
│ │ │ │ -
556 typename Graph::VertexDescriptor vtx, const IS& indexSet,
│ │ │ │ -
557 int toPe, std::set<GI>& neighbor, std::set<int>& neighborProcs) {
│ │ │ │ -
558 for(auto edge=g.beginEdges(vtx), end=g.endEdges(vtx); edge!=end; ++edge)
│ │ │ │ -
559 {
│ │ │ │ -
560 const typename IS::IndexPair* pindex = indexSet.pair(edge.target());
│ │ │ │ -
561 assert(pindex);
│ │ │ │ -
562 if(part[pindex->local()]!=toPe || !OwnerSet::contains(pindex->local().attribute()))
│ │ │ │ -
563 {
│ │ │ │ -
564 // is sent to another process and therefore becomes overlap
│ │ │ │ -
565 neighbor.insert(pindex->global());
│ │ │ │ -
566 neighborProcs.insert(part[pindex->local()]);
│ │ │ │ -
567 }
│ │ │ │ -
568 }
│ │ │ │ -
569 }
│ │ │ │ -
570
│ │ │ │ -
571 template<class T, class I>
│ │ │ │ -
572 void my_push_back(std::vector<T>& ownerVec, const I& index, [[maybe_unused]] int proc)
│ │ │ │ -
573 {
│ │ │ │ -
574 ownerVec.push_back(index);
│ │ │ │ -
575 }
│ │ │ │ -
576
│ │ │ │ -
577 template<class T, class I>
│ │ │ │ -
578 void my_push_back(std::vector<std::pair<T,int> >& ownerVec, const I& index, int proc)
│ │ │ │ -
579 {
│ │ │ │ -
580 ownerVec.push_back(std::make_pair(index,proc));
│ │ │ │ -
581 }
│ │ │ │ -
582 template<class T>
│ │ │ │ -
583 void reserve(std::vector<T>&, RedistributeInterface&, int)
│ │ │ │ -
584 {}
│ │ │ │ -
585 template<class T>
│ │ │ │ -
586 void reserve(std::vector<std::pair<T,int> >& ownerVec, RedistributeInterface& redist, int proc)
│ │ │ │ -
587 {
│ │ │ │ -
588 redist.reserveSpaceForReceiveInterface(proc, ownerVec.size());
│ │ │ │ -
589 }
│ │ │ │ -
590
│ │ │ │ -
591
│ │ │ │ -
609 template<class OwnerSet, class G, class IS, class T, class GI>
│ │ │ │ -
610 void getOwnerOverlapVec(const G& graph, std::vector<int>& part, IS& indexSet,
│ │ │ │ -
611 [[maybe_unused]] int myPe, int toPe, std::vector<T>& ownerVec, std::set<GI>& overlapSet,
│ │ │ │ -
612 RedistributeInterface& redist, std::set<int>& neighborProcs) {
│ │ │ │ -
613 for(auto index = indexSet.begin(); index != indexSet.end(); ++index) {
│ │ │ │ -
614 // Only Process owner vertices, the others are not in the parmetis graph.
│ │ │ │ -
615 if(OwnerSet::contains(index->local().attribute()))
│ │ │ │ -
616 {
│ │ │ │ -
617 if(part[index->local()]==toPe)
│ │ │ │ -
618 {
│ │ │ │ -
619 getNeighbor<OwnerSet>(graph, part, index->local(), indexSet,
│ │ │ │ -
620 toPe, overlapSet, neighborProcs);
│ │ │ │ -
621 my_push_back(ownerVec, index->global(), toPe);
│ │ │ │ -
622 }
│ │ │ │ -
623 }
│ │ │ │ -
624 }
│ │ │ │ -
625 reserve(ownerVec, redist, toPe);
│ │ │ │ -
626
│ │ │ │ -
627 }
│ │ │ │ -
628
│ │ │ │ -
629
│ │ │ │ -
636 template<class F, class IS>
│ │ │ │ -
637 inline bool isOwner(IS& indexSet, int index) {
│ │ │ │ -
638
│ │ │ │ -
639 const typename IS::IndexPair* pindex=indexSet.pair(index);
│ │ │ │ -
640
│ │ │ │ -
641 assert(pindex);
│ │ │ │ -
642 return F::contains(pindex->local().attribute());
│ │ │ │ -
643 }
│ │ │ │ -
644
│ │ │ │ -
645
│ │ │ │ -
646 class BaseEdgeFunctor
│ │ │ │ -
647 {
│ │ │ │ -
648 public:
│ │ │ │ -
649 BaseEdgeFunctor(Metis::idx_t* adj,const ParmetisDuneIndexMap& data)
│ │ │ │ -
650 : i_(), adj_(adj), data_(data)
│ │ │ │ -
651 {}
│ │ │ │ -
652
│ │ │ │ -
653 template<class T>
│ │ │ │ -
654 void operator()(const T& edge)
│ │ │ │ -
655 {
│ │ │ │ -
656 // Get the egde weight
│ │ │ │ -
657 // const Weight& weight=edge.weight();
│ │ │ │ -
658 adj_[i_] = data_.toParmetis(edge.target());
│ │ │ │ -
659 i_++;
│ │ │ │ -
660 }
│ │ │ │ -
661 std::size_t index()
│ │ │ │ -
662 {
│ │ │ │ -
663 return i_;
│ │ │ │ -
664 }
│ │ │ │ -
665
│ │ │ │ -
666 private:
│ │ │ │ -
667 std::size_t i_;
│ │ │ │ -
668 Metis::idx_t* adj_;
│ │ │ │ -
669 const ParmetisDuneIndexMap& data_;
│ │ │ │ -
670 };
│ │ │ │ -
671
│ │ │ │ -
672 template<typename G>
│ │ │ │ -
673 struct EdgeFunctor
│ │ │ │ -
674 : public BaseEdgeFunctor
│ │ │ │ -
675 {
│ │ │ │ -
676 EdgeFunctor(Metis::idx_t* adj, const ParmetisDuneIndexMap& data, std::size_t)
│ │ │ │ -
677 : BaseEdgeFunctor(adj, data)
│ │ │ │ -
678 {}
│ │ │ │ -
679
│ │ │ │ -
680 Metis::idx_t* getWeights()
│ │ │ │ -
681 {
│ │ │ │ -
682 return NULL;
│ │ │ │ -
683 }
│ │ │ │ -
684 void free(){}
│ │ │ │ -
685 };
│ │ │ │ -
686
│ │ │ │ -
687 template<class G, class V, class E, class VM, class EM>
│ │ │ │ -
688 class EdgeFunctor<Dune::Amg::PropertiesGraph<G,V,E,VM,EM> >
│ │ │ │ -
689 : public BaseEdgeFunctor
│ │ │ │ -
690 {
│ │ │ │ -
691 public:
│ │ │ │ -
692 EdgeFunctor(Metis::idx_t* adj, const ParmetisDuneIndexMap& data, std::size_t s)
│ │ │ │ -
693 : BaseEdgeFunctor(adj, data)
│ │ │ │ -
694 {
│ │ │ │ -
695 weight_=new Metis::idx_t[s];
│ │ │ │ -
696 }
│ │ │ │ -
697
│ │ │ │ -
698 template<class T>
│ │ │ │ -
699 void operator()(const T& edge)
│ │ │ │ -
700 {
│ │ │ │ -
701 weight_[index()]=edge.properties().depends() ? 3 : 1;
│ │ │ │ -
702 BaseEdgeFunctor::operator()(edge);
│ │ │ │ -
703 }
│ │ │ │ -
704 Metis::idx_t* getWeights()
│ │ │ │ -
705 {
│ │ │ │ -
706 return weight_;
│ │ │ │ -
707 }
│ │ │ │ -
708 void free(){
│ │ │ │ -
709 if(weight_!=0) {
│ │ │ │ -
710 delete weight_;
│ │ │ │ -
711 weight_=0;
│ │ │ │ -
712 }
│ │ │ │ -
713 }
│ │ │ │ -
714 private:
│ │ │ │ -
715 Metis::idx_t* weight_;
│ │ │ │ -
716 };
│ │ │ │ -
717
│ │ │ │ -
718
│ │ │ │ -
719
│ │ │ │ -
733 template<class F, class G, class IS, class EW>
│ │ │ │ -
734 void getAdjArrays(G& graph, IS& indexSet, Metis::idx_t *xadj,
│ │ │ │ -
735 EW& ew)
│ │ │ │ -
736 {
│ │ │ │ -
737 int j=0;
│ │ │ │ -
738 auto vend = graph.end();
│ │ │ │ -
739
│ │ │ │ -
740 for(auto vertex = graph.begin(); vertex != vend; ++vertex) {
│ │ │ │ -
741 if (isOwner<F>(indexSet,*vertex)) {
│ │ │ │ -
742 // The type of const edge iterator.
│ │ │ │ -
743 auto eend = vertex.end();
│ │ │ │ -
744 xadj[j] = ew.index();
│ │ │ │ -
745 j++;
│ │ │ │ -
746 for(auto edge = vertex.begin(); edge != eend; ++edge) {
│ │ │ │ -
747 ew(edge);
│ │ │ │ -
748 }
│ │ │ │ -
749 }
│ │ │ │ -
750 }
│ │ │ │ -
751 xadj[j] = ew.index();
│ │ │ │ -
752 }
│ │ │ │ -
753 } // end anonymous namespace
│ │ │ │ -
754
│ │ │ │ -
755 template<class G, class T1, class T2>
│ │ │ │ -
756 bool buildCommunication(const G& graph, std::vector<int>& realparts,
│ │ │ │ - │ │ │ │ -
758 std::shared_ptr<Dune::OwnerOverlapCopyCommunication<T1,T2>>& outcomm,
│ │ │ │ -
759 RedistributeInterface& redistInf,
│ │ │ │ -
760 bool verbose=false);
│ │ │ │ -
761#if HAVE_PARMETIS
│ │ │ │ -
762#ifndef METIS_VER_MAJOR
│ │ │ │ -
763 extern "C"
│ │ │ │ -
764 {
│ │ │ │ -
765 // backwards compatibility to parmetis < 4.0.0
│ │ │ │ -
766 void METIS_PartGraphKway(int *nvtxs, Metis::idx_t *xadj, Metis::idx_t *adjncy, Metis::idx_t *vwgt,
│ │ │ │ -
767 Metis::idx_t *adjwgt, int *wgtflag, int *numflag, int *nparts,
│ │ │ │ -
768 int *options, int *edgecut, Metis::idx_t *part);
│ │ │ │ -
769
│ │ │ │ -
770 void METIS_PartGraphRecursive(int *nvtxs, Metis::idx_t *xadj, Metis::idx_t *adjncy, Metis::idx_t *vwgt,
│ │ │ │ -
771 Metis::idx_t *adjwgt, int *wgtflag, int *numflag, int *nparts,
│ │ │ │ -
772 int *options, int *edgecut, Metis::idx_t *part);
│ │ │ │ -
773 }
│ │ │ │ -
774#endif
│ │ │ │ -
775#endif // HAVE_PARMETIS
│ │ │ │ -
776
│ │ │ │ -
777 template<class S, class T>
│ │ │ │ -
│ │ │ │ -
778 inline void print_carray(S& os, T* array, std::size_t l)
│ │ │ │ -
779 {
│ │ │ │ -
780 for(T *cur=array, *end=array+l; cur!=end; ++cur)
│ │ │ │ -
781 os<<*cur<<" ";
│ │ │ │ -
782 }
│ │ │ │ -
│ │ │ │ -
783
│ │ │ │ -
784 template<class S, class T>
│ │ │ │ -
│ │ │ │ -
785 inline bool isValidGraph(std::size_t noVtx, std::size_t gnoVtx, S noEdges, T* xadj,
│ │ │ │ -
786 T* adjncy, bool checkSymmetry)
│ │ │ │ -
787 {
│ │ │ │ -
788 bool correct=true;
│ │ │ │ -
789
│ │ │ │ -
790 using std::signbit;
│ │ │ │ -
791 for(Metis::idx_t vtx=0; vtx<(Metis::idx_t)noVtx; ++vtx) {
│ │ │ │ -
792 if(static_cast<S>(xadj[vtx])>noEdges || signbit(xadj[vtx])) {
│ │ │ │ -
793 std::cerr <<"Check graph: xadj["<<vtx<<"]="<<xadj[vtx]<<" (>"
│ │ │ │ -
794 <<noEdges<<") out of range!"<<std::endl;
│ │ │ │ -
795 correct=false;
│ │ │ │ -
796 }
│ │ │ │ -
797 if(static_cast<S>(xadj[vtx+1])>noEdges || signbit(xadj[vtx+1])) {
│ │ │ │ -
798 std::cerr <<"Check graph: xadj["<<vtx+1<<"]="<<xadj[vtx+1]<<" (>"
│ │ │ │ -
799 <<noEdges<<") out of range!"<<std::endl;
│ │ │ │ -
800 correct=false;
│ │ │ │ -
801 }
│ │ │ │ -
802 // Check numbers in adjncy
│ │ │ │ -
803 for(Metis::idx_t i=xadj[vtx]; i< xadj[vtx+1]; ++i) {
│ │ │ │ -
804 if(signbit(adjncy[i]) || ((std::size_t)adjncy[i])>gnoVtx) {
│ │ │ │ -
805 std::cerr<<" Edge "<<adjncy[i]<<" out of range ["<<0<<","<<noVtx<<")"
│ │ │ │ -
806 <<std::endl;
│ │ │ │ -
807 correct=false;
│ │ │ │ -
808 }
│ │ │ │ -
809 }
│ │ │ │ -
810 if(checkSymmetry) {
│ │ │ │ -
811 for(Metis::idx_t i=xadj[vtx]; i< xadj[vtx+1]; ++i) {
│ │ │ │ -
812 Metis::idx_t target=adjncy[i];
│ │ │ │ -
813 // search for symmetric edge
│ │ │ │ -
814 int found=0;
│ │ │ │ -
815 for(Metis::idx_t j=xadj[target]; j< xadj[target+1]; ++j)
│ │ │ │ -
816 if(adjncy[j]==vtx)
│ │ │ │ -
817 found++;
│ │ │ │ -
818 if(found!=1) {
│ │ │ │ -
819 std::cerr<<"Edge ("<<target<<","<<vtx<<") "<<i<<" time"<<std::endl;
│ │ │ │ -
820 correct=false;
│ │ │ │ -
821 }
│ │ │ │ -
822 }
│ │ │ │ -
823 }
│ │ │ │ -
824 }
│ │ │ │ -
825 return correct;
│ │ │ │ -
826 }
│ │ │ │ -
│ │ │ │ -
827
│ │ │ │ -
828 template<class M, class T1, class T2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
830 Metis::idx_t nparts,
│ │ │ │ -
831 std::shared_ptr<Dune::OwnerOverlapCopyCommunication<T1,T2>>& outcomm,
│ │ │ │ -
832 RedistributeInterface& redistInf,
│ │ │ │ -
833 bool verbose=false)
│ │ │ │ -
834 {
│ │ │ │ -
835 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
836 std::cout<<"Repartitioning from "<<oocomm.communicator().size()
│ │ │ │ -
837 <<" to "<<nparts<<" parts"<<std::endl;
│ │ │ │ -
838 Timer time;
│ │ │ │ -
839 int rank = oocomm.communicator().rank();
│ │ │ │ -
840#if !HAVE_PARMETIS
│ │ │ │ -
841 int* part = new int[1];
│ │ │ │ -
842 part[0]=0;
│ │ │ │ -
843#else
│ │ │ │ -
844 Metis::idx_t* part = new Metis::idx_t[1]; // where all our data moves to
│ │ │ │ -
845
│ │ │ │ -
846 if(nparts>1) {
│ │ │ │ -
847
│ │ │ │ -
848 part[0]=rank;
│ │ │ │ -
849
│ │ │ │ -
850 { // sublock for automatic memory deletion
│ │ │ │ -
851
│ │ │ │ -
852 // Build the graph of the communication scheme and create an appropriate indexset.
│ │ │ │ -
853 // calculate the neighbour vertices
│ │ │ │ -
854 int noNeighbours = oocomm.remoteIndices().neighbours();
│ │ │ │ -
855
│ │ │ │ -
856 for(auto n= oocomm.remoteIndices().begin(); n != oocomm.remoteIndices().end();
│ │ │ │ -
857 ++n)
│ │ │ │ -
858 if(n->first==rank) {
│ │ │ │ -
859 //do not include ourselves.
│ │ │ │ -
860 --noNeighbours;
│ │ │ │ -
861 break;
│ │ │ │ -
862 }
│ │ │ │ -
863
│ │ │ │ -
864 // A parmetis graph representing the communication graph.
│ │ │ │ -
865 // The diagonal entries are the number of nodes on the process.
│ │ │ │ -
866 // The offdiagonal entries are the number of edges leading to other processes.
│ │ │ │ -
867
│ │ │ │ -
868 Metis::idx_t *xadj=new Metis::idx_t[2];
│ │ │ │ -
869 Metis::idx_t *vtxdist=new Metis::idx_t[oocomm.communicator().size()+1];
│ │ │ │ -
870 Metis::idx_t *adjncy=new Metis::idx_t[noNeighbours];
│ │ │ │ -
871#ifdef USE_WEIGHTS
│ │ │ │ -
872 Metis::idx_t *vwgt = 0;
│ │ │ │ -
873 Metis::idx_t *adjwgt = 0;
│ │ │ │ -
874#endif
│ │ │ │ -
875
│ │ │ │ -
876 // each process has exactly one vertex!
│ │ │ │ -
877 for(int i=0; i<oocomm.communicator().size(); ++i)
│ │ │ │ -
878 vtxdist[i]=i;
│ │ │ │ -
879 vtxdist[oocomm.communicator().size()]=oocomm.communicator().size();
│ │ │ │ -
880
│ │ │ │ -
881 xadj[0]=0;
│ │ │ │ -
882 xadj[1]=noNeighbours;
│ │ │ │ -
883
│ │ │ │ -
884 // count edges to other processor
│ │ │ │ -
885 // a vector mapping the index to the owner
│ │ │ │ -
886 // std::vector<int> owner(mat.N(), oocomm.communicator().rank());
│ │ │ │ -
887 // for(NeighbourIterator n= oocomm.remoteIndices().begin(); n != oocomm.remoteIndices().end();
│ │ │ │ -
888 // ++n)
│ │ │ │ -
889 // {
│ │ │ │ -
890 // if(n->first!=oocomm.communicator().rank()){
│ │ │ │ -
891 // typedef typename RemoteIndices::RemoteIndexList RIList;
│ │ │ │ -
892 // const RIList& rlist = *(n->second.first);
│ │ │ │ -
893 // typedef typename RIList::const_iterator LIter;
│ │ │ │ -
894 // for(LIter entry=rlist.begin(); entry!=rlist.end(); ++entry){
│ │ │ │ -
895 // if(entry->attribute()==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
896 // owner[entry->localIndexPair().local()] = n->first;
│ │ │ │ -
897 // }
│ │ │ │ -
898 // }
│ │ │ │ -
899 // }
│ │ │ │ -
900
│ │ │ │ -
901 // std::map<int,Metis::idx_t> edgecount; // edges to other processors
│ │ │ │ -
902 // typedef typename M::ConstRowIterator RIter;
│ │ │ │ -
903 // typedef typename M::ConstColIterator CIter;
│ │ │ │ -
904
│ │ │ │ -
905 // // calculate edge count
│ │ │ │ -
906 // for(RIter row=mat.begin(), endr=mat.end(); row != endr; ++row)
│ │ │ │ -
907 // if(owner[row.index()]==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
908 // for(CIter entry= row->begin(), ende = row->end(); entry != ende; ++entry)
│ │ │ │ -
909 // ++edgecount[owner[entry.index()]];
│ │ │ │ -
910
│ │ │ │ -
911 // setup edge and weight pattern
│ │ │ │ -
912
│ │ │ │ -
913 Metis::idx_t* adjp=adjncy;
│ │ │ │ -
914
│ │ │ │ -
915#ifdef USE_WEIGHTS
│ │ │ │ -
916 vwgt = new Metis::idx_t[1];
│ │ │ │ -
917 vwgt[0]= mat.N(); // weight is numer of rows TODO: Should actually be the nonzeros.
│ │ │ │ -
918
│ │ │ │ -
919 adjwgt = new Metis::idx_t[noNeighbours];
│ │ │ │ -
920 Metis::idx_t* adjwp=adjwgt;
│ │ │ │ -
921#endif
│ │ │ │ -
922
│ │ │ │ -
923 for(auto n= oocomm.remoteIndices().begin(); n != oocomm.remoteIndices().end();
│ │ │ │ -
924 ++n)
│ │ │ │ -
925 if(n->first != rank) {
│ │ │ │ -
926 *adjp=n->first;
│ │ │ │ -
927 ++adjp;
│ │ │ │ -
928#ifdef USE_WEIGHTS
│ │ │ │ -
929 *adjwp=1; //edgecount[n->first];
│ │ │ │ -
930 ++adjwp;
│ │ │ │ -
931#endif
│ │ │ │ -
932 }
│ │ │ │ -
933 assert(isValidGraph(vtxdist[rank+1]-vtxdist[rank],
│ │ │ │ -
934 vtxdist[oocomm.communicator().size()],
│ │ │ │ -
935 noNeighbours, xadj, adjncy, false));
│ │ │ │ -
936
│ │ │ │ -
937 [[maybe_unused]] Metis::idx_t wgtflag=0;
│ │ │ │ -
938 Metis::idx_t numflag=0;
│ │ │ │ -
939 Metis::idx_t edgecut;
│ │ │ │ -
940#ifdef USE_WEIGHTS
│ │ │ │ -
941 wgtflag=3;
│ │ │ │ -
942#endif
│ │ │ │ -
943 Metis::real_t *tpwgts = new Metis::real_t[nparts];
│ │ │ │ -
944 for(int i=0; i<nparts; ++i)
│ │ │ │ -
945 tpwgts[i]=1.0/nparts;
│ │ │ │ -
946 MPI_Comm comm=oocomm.communicator();
│ │ │ │ -
947
│ │ │ │ -
948 Dune::dinfo<<rank<<" vtxdist: ";
│ │ │ │ -
949 print_carray(Dune::dinfo, vtxdist, oocomm.communicator().size()+1);
│ │ │ │ -
950 Dune::dinfo<<std::endl<<rank<<" xadj: ";
│ │ │ │ -
951 print_carray(Dune::dinfo, xadj, 2);
│ │ │ │ -
952 Dune::dinfo<<std::endl<<rank<<" adjncy: ";
│ │ │ │ -
953 print_carray(Dune::dinfo, adjncy, noNeighbours);
│ │ │ │ -
954
│ │ │ │ -
955#ifdef USE_WEIGHTS
│ │ │ │ -
956 Dune::dinfo<<std::endl<<rank<<" vwgt: ";
│ │ │ │ -
957 print_carray(Dune::dinfo, vwgt, 1);
│ │ │ │ -
958 Dune::dinfo<<std::endl<<rank<<" adwgt: ";
│ │ │ │ -
959 print_carray(Dune::dinfo, adjwgt, noNeighbours);
│ │ │ │ -
960#endif
│ │ │ │ -
961 Dune::dinfo<<std::endl;
│ │ │ │ -
962 oocomm.communicator().barrier();
│ │ │ │ -
963 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
964 std::cout<<"Creating comm graph took "<<time.elapsed()<<std::endl;
│ │ │ │ -
965 time.reset();
│ │ │ │ -
966
│ │ │ │ -
967#ifdef PARALLEL_PARTITION
│ │ │ │ -
968 Metis::real_t ubvec = 1.15;
│ │ │ │ -
969 int ncon=1;
│ │ │ │ -
970 int options[5] ={ 0,1,15,0,0};
│ │ │ │ -
971
│ │ │ │ -
972 //=======================================================
│ │ │ │ -
973 // ParMETIS_V3_PartKway
│ │ │ │ -
974 //=======================================================
│ │ │ │ -
975 ParMETIS_V3_PartKway(vtxdist, xadj, adjncy,
│ │ │ │ -
976 vwgt, adjwgt, &wgtflag,
│ │ │ │ -
977 &numflag, &ncon, &nparts, tpwgts, &ubvec, options, &edgecut, part,
│ │ │ │ -
978 &comm);
│ │ │ │ -
979 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
980 std::cout<<"ParMETIS took "<<time.elapsed()<<std::endl;
│ │ │ │ -
981 time.reset();
│ │ │ │ -
982#else
│ │ │ │ -
983 Timer time1;
│ │ │ │ -
984 std::size_t gnoedges=0;
│ │ │ │ -
985 int* noedges = 0;
│ │ │ │ -
986 noedges = new int[oocomm.communicator().size()];
│ │ │ │ -
987 Dune::dverb<<"noNeighbours: "<<noNeighbours<<std::endl;
│ │ │ │ -
988 // gather number of edges for each vertex.
│ │ │ │ -
989 MPI_Allgather(&noNeighbours,1,MPI_INT,noedges,1, MPI_INT,oocomm.communicator());
│ │ │ │ -
990
│ │ │ │ -
991 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
992 std::cout<<"Gathering noedges took "<<time1.elapsed()<<std::endl;
│ │ │ │ -
993 time1.reset();
│ │ │ │ -
994
│ │ │ │ -
995 Metis::idx_t noVertices = vtxdist[oocomm.communicator().size()];
│ │ │ │ -
996 Metis::idx_t *gxadj = 0;
│ │ │ │ -
997 Metis::idx_t *gvwgt = 0;
│ │ │ │ -
998 Metis::idx_t *gadjncy = 0;
│ │ │ │ -
999 Metis::idx_t *gadjwgt = 0;
│ │ │ │ -
1000 Metis::idx_t *gpart = 0;
│ │ │ │ -
1001 int* displ = 0;
│ │ │ │ -
1002 int* noxs = 0;
│ │ │ │ -
1003 int* xdispl = 0; // displacement for xadj
│ │ │ │ -
1004 int* novs = 0;
│ │ │ │ -
1005 int* vdispl=0; // real vertex displacement
│ │ │ │ -
1006#ifdef USE_WEIGHTS
│ │ │ │ -
1007 std::size_t localNoVtx=vtxdist[rank+1]-vtxdist[rank];
│ │ │ │ -
1008#endif
│ │ │ │ -
1009 std::size_t gxadjlen = vtxdist[oocomm.communicator().size()]-vtxdist[0]+oocomm.communicator().size();
│ │ │ │ -
1010
│ │ │ │ -
1011 {
│ │ │ │ -
1012 Dune::dinfo<<"noedges: ";
│ │ │ │ -
1013 print_carray(Dune::dinfo, noedges, oocomm.communicator().size());
│ │ │ │ -
1014 Dune::dinfo<<std::endl;
│ │ │ │ -
1015 displ = new int[oocomm.communicator().size()];
│ │ │ │ -
1016 xdispl = new int[oocomm.communicator().size()];
│ │ │ │ -
1017 noxs = new int[oocomm.communicator().size()];
│ │ │ │ -
1018 vdispl = new int[oocomm.communicator().size()];
│ │ │ │ -
1019 novs = new int[oocomm.communicator().size()];
│ │ │ │ -
1020
│ │ │ │ -
1021 for(int i=0; i < oocomm.communicator().size(); ++i) {
│ │ │ │ -
1022 noxs[i]=vtxdist[i+1]-vtxdist[i]+1;
│ │ │ │ -
1023 novs[i]=vtxdist[i+1]-vtxdist[i];
│ │ │ │ -
1024 }
│ │ │ │ -
1025
│ │ │ │ -
1026 Metis::idx_t *so= vtxdist;
│ │ │ │ -
1027 int offset = 0;
│ │ │ │ -
1028 for(int *xcurr = xdispl, *vcurr = vdispl, *end=vdispl+oocomm.communicator().size();
│ │ │ │ -
1029 vcurr!=end; ++vcurr, ++xcurr, ++so, ++offset) {
│ │ │ │ -
1030 *vcurr = *so;
│ │ │ │ -
1031 *xcurr = offset + *so;
│ │ │ │ -
1032 }
│ │ │ │ -
1033
│ │ │ │ -
1034 int *pdispl =displ;
│ │ │ │ -
1035 int cdispl = 0;
│ │ │ │ -
1036 *pdispl = 0;
│ │ │ │ -
1037 for(int *curr=noedges, *end=noedges+oocomm.communicator().size()-1;
│ │ │ │ -
1038 curr!=end; ++curr) {
│ │ │ │ -
1039 ++pdispl; // next displacement
│ │ │ │ -
1040 cdispl += *curr; // next value
│ │ │ │ -
1041 *pdispl = cdispl;
│ │ │ │ -
1042 }
│ │ │ │ -
1043 Dune::dinfo<<"displ: ";
│ │ │ │ -
1044 print_carray(Dune::dinfo, displ, oocomm.communicator().size());
│ │ │ │ -
1045 Dune::dinfo<<std::endl;
│ │ │ │ -
1046
│ │ │ │ -
1047 // calculate global number of edges
│ │ │ │ -
1048 // It is bigger than the actual one as we habe size-1 additional end entries
│ │ │ │ -
1049 for(int *curr=noedges, *end=noedges+oocomm.communicator().size();
│ │ │ │ -
1050 curr!=end; ++curr)
│ │ │ │ -
1051 gnoedges += *curr;
│ │ │ │ -
1052
│ │ │ │ -
1053 // alocate gobal graph
│ │ │ │ -
1054 Dune::dinfo<<"gxadjlen: "<<gxadjlen<<" noVertices: "<<noVertices
│ │ │ │ -
1055 <<" gnoedges: "<<gnoedges<<std::endl;
│ │ │ │ -
1056 gxadj = new Metis::idx_t[gxadjlen];
│ │ │ │ -
1057 gpart = new Metis::idx_t[noVertices];
│ │ │ │ -
1058#ifdef USE_WEIGHTS
│ │ │ │ -
1059 gvwgt = new Metis::idx_t[noVertices];
│ │ │ │ -
1060 gadjwgt = new Metis::idx_t[gnoedges];
│ │ │ │ -
1061#endif
│ │ │ │ -
1062 gadjncy = new Metis::idx_t[gnoedges];
│ │ │ │ -
1063 }
│ │ │ │ -
1064
│ │ │ │ -
1065 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1066 std::cout<<"Preparing global graph took "<<time1.elapsed()<<std::endl;
│ │ │ │ -
1067 time1.reset();
│ │ │ │ -
1068 // Communicate data
│ │ │ │ -
1069
│ │ │ │ -
1070 MPI_Allgatherv(xadj,2,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1071 gxadj,noxs,xdispl,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1072 comm);
│ │ │ │ -
1073 MPI_Allgatherv(adjncy,noNeighbours,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1074 gadjncy,noedges,displ,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1075 comm);
│ │ │ │ -
1076#ifdef USE_WEIGHTS
│ │ │ │ -
1077 MPI_Allgatherv(adjwgt,noNeighbours,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1078 gadjwgt,noedges,displ,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1079 comm);
│ │ │ │ -
1080 MPI_Allgatherv(vwgt,localNoVtx,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1081 gvwgt,novs,vdispl,MPITraits<Metis::idx_t>::getType(),
│ │ │ │ -
1082 comm);
│ │ │ │ -
1083#endif
│ │ │ │ -
1084 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1085 std::cout<<"Gathering global graph data took "<<time1.elapsed()<<std::endl;
│ │ │ │ -
1086 time1.reset();
│ │ │ │ -
1087
│ │ │ │ -
1088 {
│ │ │ │ -
1089 // create the real gxadj array
│ │ │ │ -
1090 // i.e. shift entries and add displacements.
│ │ │ │ -
1091
│ │ │ │ -
1092 print_carray(Dune::dinfo, gxadj, gxadjlen);
│ │ │ │ -
1093
│ │ │ │ -
1094 int offset = 0;
│ │ │ │ -
1095 Metis::idx_t increment = vtxdist[1];
│ │ │ │ -
1096 Metis::idx_t *start=gxadj+1;
│ │ │ │ -
1097 for(int i=1; i<oocomm.communicator().size(); ++i) {
│ │ │ │ -
1098 offset+=1;
│ │ │ │ -
1099 int lprev = vtxdist[i]-vtxdist[i-1];
│ │ │ │ -
1100 int l = vtxdist[i+1]-vtxdist[i];
│ │ │ │ -
1101 start+=lprev;
│ │ │ │ -
1102 assert((start+l+offset)-gxadj<=static_cast<Metis::idx_t>(gxadjlen));
│ │ │ │ -
1103 increment = *(start-1);
│ │ │ │ -
1104 std::transform(start+offset, start+l+offset, start, std::bind(std::plus<Metis::idx_t>(), std::placeholders::_1, increment));
│ │ │ │ -
1105 }
│ │ │ │ -
1106 Dune::dinfo<<std::endl<<"shifted xadj:";
│ │ │ │ -
1107 print_carray(Dune::dinfo, gxadj, noVertices+1);
│ │ │ │ -
1108 Dune::dinfo<<std::endl<<" gadjncy: ";
│ │ │ │ -
1109 print_carray(Dune::dinfo, gadjncy, gnoedges);
│ │ │ │ -
1110#ifdef USE_WEIGHTS
│ │ │ │ -
1111 Dune::dinfo<<std::endl<<" gvwgt: ";
│ │ │ │ -
1112 print_carray(Dune::dinfo, gvwgt, noVertices);
│ │ │ │ -
1113 Dune::dinfo<<std::endl<<"adjwgt: ";
│ │ │ │ -
1114 print_carray(Dune::dinfo, gadjwgt, gnoedges);
│ │ │ │ -
1115 Dune::dinfo<<std::endl;
│ │ │ │ -
1116#endif
│ │ │ │ -
1117 // everything should be fine now!!!
│ │ │ │ -
1118 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1119 std::cout<<"Postprocesing global graph data took "<<time1.elapsed()<<std::endl;
│ │ │ │ -
1120 time1.reset();
│ │ │ │ -
1121#ifndef NDEBUG
│ │ │ │ -
1122 assert(isValidGraph(noVertices, noVertices, gnoedges,
│ │ │ │ -
1123 gxadj, gadjncy, true));
│ │ │ │ -
1124#endif
│ │ │ │ -
1125
│ │ │ │ -
1126 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1127 std::cout<<"Creating grah one 1 process took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1128 time.reset();
│ │ │ │ -
1129#if METIS_VER_MAJOR >= 5
│ │ │ │ -
1130 Metis::idx_t ncon = 1;
│ │ │ │ -
1131 Metis::idx_t moptions[METIS_NOPTIONS];
│ │ │ │ -
1132 METIS_SetDefaultOptions(moptions);
│ │ │ │ -
1133 moptions[METIS_OPTION_NUMBERING] = numflag;
│ │ │ │ -
1134 METIS_PartGraphRecursive(&noVertices, &ncon, gxadj, gadjncy, gvwgt, NULL, gadjwgt,
│ │ │ │ -
1135 &nparts, NULL, NULL, moptions, &edgecut, gpart);
│ │ │ │ -
1136#else
│ │ │ │ -
1137 int options[5] = {0, 1, 1, 3, 3};
│ │ │ │ -
1138 // Call metis
│ │ │ │ -
1139 METIS_PartGraphRecursive(&noVertices, gxadj, gadjncy, gvwgt, gadjwgt, &wgtflag,
│ │ │ │ -
1140 &numflag, &nparts, options, &edgecut, gpart);
│ │ │ │ -
1141#endif
│ │ │ │ -
1142
│ │ │ │ -
1143 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1144 std::cout<<"METIS took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1145 time.reset();
│ │ │ │ -
1146
│ │ │ │ -
1147 Dune::dinfo<<std::endl<<"part:";
│ │ │ │ -
1148 print_carray(Dune::dinfo, gpart, noVertices);
│ │ │ │ -
1149
│ │ │ │ -
1150 delete[] gxadj;
│ │ │ │ -
1151 delete[] gadjncy;
│ │ │ │ -
1152#ifdef USE_WEIGHTS
│ │ │ │ -
1153 delete[] gvwgt;
│ │ │ │ -
1154 delete[] gadjwgt;
│ │ │ │ -
1155#endif
│ │ │ │ -
1156 }
│ │ │ │ -
1157 // Scatter result
│ │ │ │ -
1158 MPI_Scatter(gpart, 1, MPITraits<Metis::idx_t>::getType(), part, 1,
│ │ │ │ -
1159 MPITraits<Metis::idx_t>::getType(), 0, comm);
│ │ │ │ -
1160
│ │ │ │ -
1161 {
│ │ │ │ -
1162 // release remaining memory
│ │ │ │ -
1163 delete[] gpart;
│ │ │ │ -
1164 delete[] noedges;
│ │ │ │ -
1165 delete[] displ;
│ │ │ │ -
1166 }
│ │ │ │ -
1167
│ │ │ │ -
1168
│ │ │ │ -
1169#endif
│ │ │ │ -
1170 delete[] xadj;
│ │ │ │ -
1171 delete[] vtxdist;
│ │ │ │ -
1172 delete[] adjncy;
│ │ │ │ -
1173#ifdef USE_WEIGHTS
│ │ │ │ -
1174 delete[] vwgt;
│ │ │ │ -
1175 delete[] adjwgt;
│ │ │ │ -
1176#endif
│ │ │ │ -
1177 delete[] tpwgts;
│ │ │ │ -
1178 }
│ │ │ │ -
1179 }else{
│ │ │ │ -
1180 part[0]=0;
│ │ │ │ -
1181 }
│ │ │ │ -
1182#endif
│ │ │ │ -
1183 Dune::dinfo<<" repart "<<rank <<" -> "<< part[0]<<std::endl;
│ │ │ │ -
1184
│ │ │ │ -
1185 std::vector<int> realpart(mat.N(), part[0]);
│ │ │ │ -
1186 delete[] part;
│ │ │ │ -
1187
│ │ │ │ -
1188 oocomm.copyOwnerToAll(realpart, realpart);
│ │ │ │ -
1189
│ │ │ │ -
1190 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1191 std::cout<<"Scattering repartitioning took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1192 time.reset();
│ │ │ │ -
1193
│ │ │ │ -
1194
│ │ │ │ -
1195 oocomm.buildGlobalLookup(mat.N());
│ │ │ │ -
1196 Dune::Amg::MatrixGraph<M> graph(const_cast<M&>(mat));
│ │ │ │ -
1197 fillIndexSetHoles(graph, oocomm);
│ │ │ │ -
1198 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1199 std::cout<<"Filling index set took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1200 time.reset();
│ │ │ │ -
1201
│ │ │ │ -
1202 if(verbose) {
│ │ │ │ -
1203 int noNeighbours=oocomm.remoteIndices().neighbours();
│ │ │ │ -
1204 noNeighbours = oocomm.communicator().sum(noNeighbours)
│ │ │ │ -
1205 / oocomm.communicator().size();
│ │ │ │ -
1206 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1207 std::cout<<"Average no neighbours was "<<noNeighbours<<std::endl;
│ │ │ │ -
1208 }
│ │ │ │ -
1209 bool ret = buildCommunication(graph, realpart, oocomm, outcomm, redistInf,
│ │ │ │ -
1210 verbose);
│ │ │ │ -
1211 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1212 std::cout<<"Building index sets took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1213 time.reset();
│ │ │ │ -
1214
│ │ │ │ -
1215
│ │ │ │ -
1216 return ret;
│ │ │ │ -
1217
│ │ │ │ -
1218 }
│ │ │ │ -
│ │ │ │ -
1219
│ │ │ │ -
1234 template<class G, class T1, class T2>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1236 std::shared_ptr<Dune::OwnerOverlapCopyCommunication<T1,T2>>& outcomm,
│ │ │ │ -
1237 RedistributeInterface& redistInf,
│ │ │ │ -
1238 bool verbose=false)
│ │ │ │ -
1239 {
│ │ │ │ -
1240 Timer time;
│ │ │ │ -
1241
│ │ │ │ -
1242 MPI_Comm comm=oocomm.communicator();
│ │ │ │ -
1243 oocomm.buildGlobalLookup(graph.noVertices());
│ │ │ │ -
1244 fillIndexSetHoles(graph, oocomm);
│ │ │ │ -
1245
│ │ │ │ -
1246 if(verbose && oocomm.communicator().rank()==0)
│ │ │ │ -
1247 std::cout<<"Filling holes took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1248 time.reset();
│ │ │ │ -
1249
│ │ │ │ -
1250 // simple precondition checks
│ │ │ │ -
1251
│ │ │ │ -
1252#ifdef PERF_REPART
│ │ │ │ -
1253 // Profiling variables
│ │ │ │ -
1254 double t1=0.0, t2=0.0, t3=0.0, t4=0.0, tSum=0.0;
│ │ │ │ -
1255#endif
│ │ │ │ -
1256
│ │ │ │ -
1257
│ │ │ │ -
1258 // MPI variables
│ │ │ │ -
1259 int mype = oocomm.communicator().rank();
│ │ │ │ -
1260
│ │ │ │ -
1261 assert(nparts<=static_cast<Metis::idx_t>(oocomm.communicator().size()));
│ │ │ │ -
1262
│ │ │ │ -
1263 int myDomain = -1;
│ │ │ │ -
1264
│ │ │ │ -
1265 //
│ │ │ │ -
1266 // 1) Prepare the required parameters for using ParMETIS
│ │ │ │ -
1267 // Especially the arrays that represent the graph must be
│ │ │ │ -
1268 // generated by the DUNE Graph and IndexSet input variables.
│ │ │ │ -
1269 // These are the arrays:
│ │ │ │ -
1270 // - vtxdist
│ │ │ │ -
1271 // - xadj
│ │ │ │ -
1272 // - adjncy
│ │ │ │ -
1273 //
│ │ │ │ -
1274 //
│ │ │ │ -
1275#ifdef PERF_REPART
│ │ │ │ -
1276 // reset timer for step 1)
│ │ │ │ -
1277 t1=MPI_Wtime();
│ │ │ │ -
1278#endif
│ │ │ │ -
1279
│ │ │ │ -
1280
│ │ │ │ -
1281 typedef typename Dune::OwnerOverlapCopyCommunication<T1,T2> OOComm;
│ │ │ │ -
1282 typedef typename OOComm::OwnerSet OwnerSet;
│ │ │ │ -
1283
│ │ │ │ -
1284 // Create the vtxdist array and parmetisVtxMapping.
│ │ │ │ -
1285 // Global communications are necessary
│ │ │ │ -
1286 // The parmetis global identifiers for the owner vertices.
│ │ │ │ -
1287 ParmetisDuneIndexMap indexMap(graph,oocomm);
│ │ │ │ -
1288 Metis::idx_t *part = new Metis::idx_t[indexMap.numOfOwnVtx()];
│ │ │ │ -
1289 for(std::size_t i=0; i < indexMap.numOfOwnVtx(); ++i)
│ │ │ │ -
1290 part[i]=mype;
│ │ │ │ -
1291
│ │ │ │ -
1292#if !HAVE_PARMETIS
│ │ │ │ -
1293 if(oocomm.communicator().rank()==0 && nparts>1)
│ │ │ │ -
1294 std::cerr<<"ParMETIS not activated. Will repartition to 1 domain instead of requested "
│ │ │ │ -
1295 <<nparts<<" domains."<<std::endl;
│ │ │ │ -
1296 nparts=1; // No parmetis available, fallback to agglomerating to 1 process
│ │ │ │ -
1297
│ │ │ │ -
1298#else
│ │ │ │ -
1299
│ │ │ │ -
1300 if(nparts>1) {
│ │ │ │ -
1301 // Create the xadj and adjncy arrays
│ │ │ │ -
1302 Metis::idx_t *xadj = new Metis::idx_t[indexMap.numOfOwnVtx()+1];
│ │ │ │ -
1303 Metis::idx_t *adjncy = new Metis::idx_t[graph.noEdges()];
│ │ │ │ -
1304 EdgeFunctor<G> ef(adjncy, indexMap, graph.noEdges());
│ │ │ │ -
1305 getAdjArrays<OwnerSet>(graph, oocomm.globalLookup(), xadj, ef);
│ │ │ │ -
1306
│ │ │ │ -
1307 //
│ │ │ │ -
1308 // 2) Call ParMETIS
│ │ │ │ -
1309 //
│ │ │ │ -
1310 //
│ │ │ │ -
1311 Metis::idx_t numflag=0, wgtflag=0, options[3], edgecut=0, ncon=1;
│ │ │ │ -
1312 //float *tpwgts = NULL;
│ │ │ │ -
1313 Metis::real_t *tpwgts = new Metis::real_t[nparts];
│ │ │ │ -
1314 for(int i=0; i<nparts; ++i)
│ │ │ │ -
1315 tpwgts[i]=1.0/nparts;
│ │ │ │ -
1316 Metis::real_t ubvec[1];
│ │ │ │ -
1317 options[0] = 0; // 0=default, 1=options are defined in [1]+[2]
│ │ │ │ -
1318#ifdef DEBUG_REPART
│ │ │ │ -
1319 options[1] = 3; // show info: 0=no message
│ │ │ │ -
1320#else
│ │ │ │ -
1321 options[1] = 0; // show info: 0=no message
│ │ │ │ -
1322#endif
│ │ │ │ -
1323 options[2] = 1; // random number seed, default is 15
│ │ │ │ -
1324 wgtflag = (ef.getWeights()!=NULL) ? 1 : 0;
│ │ │ │ -
1325 numflag = 0;
│ │ │ │ -
1326 edgecut = 0;
│ │ │ │ -
1327 ncon=1;
│ │ │ │ -
1328 ubvec[0]=1.05; // recommended by ParMETIS
│ │ │ │ -
1329
│ │ │ │ -
1330#ifdef DEBUG_REPART
│ │ │ │ -
1331 if (mype == 0) {
│ │ │ │ -
1332 std::cout<<std::endl;
│ │ │ │ -
1333 std::cout<<"Testing ParMETIS_V3_PartKway with options[1-2] = {"
│ │ │ │ -
1334 <<options[1]<<" "<<options[2]<<"}, Ncon: "
│ │ │ │ -
1335 <<ncon<<", Nparts: "<<nparts<<std::endl;
│ │ │ │ -
1336 }
│ │ │ │ -
1337#endif
│ │ │ │ -
1338#ifdef PERF_REPART
│ │ │ │ -
1339 // stop the time for step 1)
│ │ │ │ -
1340 t1=MPI_Wtime()-t1;
│ │ │ │ -
1341 // reset timer for step 2)
│ │ │ │ -
1342 t2=MPI_Wtime();
│ │ │ │ -
1343#endif
│ │ │ │ -
1344
│ │ │ │ -
1345 if(verbose) {
│ │ │ │ -
1346 oocomm.communicator().barrier();
│ │ │ │ -
1347 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1348 std::cout<<"Preparing for parmetis took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1349 }
│ │ │ │ -
1350 time.reset();
│ │ │ │ -
1351
│ │ │ │ -
1352 //=======================================================
│ │ │ │ -
1353 // ParMETIS_V3_PartKway
│ │ │ │ -
1354 //=======================================================
│ │ │ │ -
1355 ParMETIS_V3_PartKway(indexMap.vtxDist(), xadj, adjncy,
│ │ │ │ -
1356 NULL, ef.getWeights(), &wgtflag,
│ │ │ │ -
1357 &numflag, &ncon, &nparts, tpwgts, ubvec, options, &edgecut, part, &const_cast<MPI_Comm&>(comm));
│ │ │ │ -
1358
│ │ │ │ -
1359
│ │ │ │ -
1360 delete[] xadj;
│ │ │ │ -
1361 delete[] adjncy;
│ │ │ │ -
1362 delete[] tpwgts;
│ │ │ │ -
1363
│ │ │ │ -
1364 ef.free();
│ │ │ │ -
1365
│ │ │ │ -
1366#ifdef DEBUG_REPART
│ │ │ │ -
1367 if (mype == 0) {
│ │ │ │ -
1368 std::cout<<std::endl;
│ │ │ │ -
1369 std::cout<<"ParMETIS_V3_PartKway reported a cut of "<<edgecut<<std::endl;
│ │ │ │ -
1370 std::cout<<std::endl;
│ │ │ │ -
1371 }
│ │ │ │ -
1372 std::cout<<mype<<": PARMETIS-Result: ";
│ │ │ │ -
1373 for(int i=0; i < indexMap.vtxDist()[mype+1]-indexMap.vtxDist()[mype]; ++i) {
│ │ │ │ -
1374 std::cout<<part[i]<<" ";
│ │ │ │ -
1375 }
│ │ │ │ -
1376 std::cout<<std::endl;
│ │ │ │ -
1377 std::cout<<"Testing ParMETIS_V3_PartKway with options[1-2] = {"
│ │ │ │ -
1378 <<options[1]<<" "<<options[2]<<"}, Ncon: "
│ │ │ │ -
1379 <<ncon<<", Nparts: "<<nparts<<std::endl;
│ │ │ │ -
1380#endif
│ │ │ │ -
1381#ifdef PERF_REPART
│ │ │ │ -
1382 // stop the time for step 2)
│ │ │ │ -
1383 t2=MPI_Wtime()-t2;
│ │ │ │ -
1384 // reset timer for step 3)
│ │ │ │ -
1385 t3=MPI_Wtime();
│ │ │ │ -
1386#endif
│ │ │ │ -
1387
│ │ │ │ -
1388
│ │ │ │ -
1389 if(verbose) {
│ │ │ │ -
1390 oocomm.communicator().barrier();
│ │ │ │ -
1391 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1392 std::cout<<"Parmetis took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1393 }
│ │ │ │ -
1394 time.reset();
│ │ │ │ -
1395 }else
│ │ │ │ -
1396#endif
│ │ │ │ -
1397 {
│ │ │ │ -
1398 // Everything goes to process 0!
│ │ │ │ -
1399 for(std::size_t i=0; i<indexMap.numOfOwnVtx(); ++i)
│ │ │ │ -
1400 part[i]=0;
│ │ │ │ -
1401 }
│ │ │ │ -
1402
│ │ │ │ -
1403
│ │ │ │ -
1404 //
│ │ │ │ -
1405 // 3) Find a optimal domain based on the ParMETIS repartitioning
│ │ │ │ -
1406 // result
│ │ │ │ -
1407 //
│ │ │ │ -
1408
│ │ │ │ -
1409 std::vector<int> domainMapping(nparts);
│ │ │ │ -
1410 if(nparts>1)
│ │ │ │ -
1411 getDomain(comm, part, indexMap.numOfOwnVtx(), nparts, &myDomain, domainMapping);
│ │ │ │ -
1412 else
│ │ │ │ -
1413 domainMapping[0]=0;
│ │ │ │ -
1414
│ │ │ │ -
1415#ifdef DEBUG_REPART
│ │ │ │ -
1416 std::cout<<mype<<": myDomain: "<<myDomain<<std::endl;
│ │ │ │ -
1417 std::cout<<mype<<": DomainMapping: ";
│ │ │ │ -
1418 for(auto j : range(nparts)) {
│ │ │ │ -
1419 std::cout<<" do: "<<j<<" pe: "<<domainMapping[j]<<" ";
│ │ │ │ -
1420 }
│ │ │ │ -
1421 std::cout<<std::endl;
│ │ │ │ -
1422#endif
│ │ │ │ -
1423
│ │ │ │ -
1424 // Make a domain mapping for the indexset and translate
│ │ │ │ -
1425 //domain number to real process number
│ │ │ │ -
1426 // domainMapping is the one of parmetis, that is without
│ │ │ │ -
1427 // the overlap/copy vertices
│ │ │ │ -
1428 std::vector<int> setPartition(oocomm.indexSet().size(), -1);
│ │ │ │ -
1429
│ │ │ │ -
1430 std::size_t i=0; // parmetis index
│ │ │ │ -
1431 for(auto index = oocomm.indexSet().begin(); index != oocomm.indexSet().end(); ++index)
│ │ │ │ -
1432 if(OwnerSet::contains(index->local().attribute())) {
│ │ │ │ -
1433 setPartition[index->local()]=domainMapping[part[i++]];
│ │ │ │ -
1434 }
│ │ │ │ -
1435
│ │ │ │ -
1436 delete[] part;
│ │ │ │ -
1437 oocomm.copyOwnerToAll(setPartition, setPartition);
│ │ │ │ -
1438 // communication only needed for ALU
│ │ │ │ -
1439 // (ghosts with same global id as owners on the same process)
│ │ │ │ -
1440 if (SolverCategory::category(oocomm) ==
│ │ │ │ -
1441 static_cast<int>(SolverCategory::nonoverlapping))
│ │ │ │ -
1442 oocomm.copyCopyToAll(setPartition, setPartition);
│ │ │ │ -
1443 bool ret = buildCommunication(graph, setPartition, oocomm, outcomm, redistInf,
│ │ │ │ -
1444 verbose);
│ │ │ │ -
1445 if(verbose) {
│ │ │ │ -
1446 oocomm.communicator().barrier();
│ │ │ │ -
1447 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1448 std::cout<<"Creating indexsets took "<<time.elapsed()<<std::endl;
│ │ │ │ -
1449 }
│ │ │ │ -
1450 return ret;
│ │ │ │ -
1451 }
│ │ │ │ -
│ │ │ │ -
1452
│ │ │ │ -
1453
│ │ │ │ -
1454
│ │ │ │ -
1455 template<class G, class T1, class T2>
│ │ │ │ -
│ │ │ │ -
1456 bool buildCommunication(const G& graph,
│ │ │ │ -
1457 std::vector<int>& setPartition, Dune::OwnerOverlapCopyCommunication<T1,T2>& oocomm,
│ │ │ │ -
1458 std::shared_ptr<Dune::OwnerOverlapCopyCommunication<T1,T2>>& outcomm,
│ │ │ │ -
1459 RedistributeInterface& redistInf,
│ │ │ │ -
1460 bool verbose)
│ │ │ │ -
1461 {
│ │ │ │ -
1462 typedef typename Dune::OwnerOverlapCopyCommunication<T1,T2> OOComm;
│ │ │ │ -
1463 typedef typename OOComm::OwnerSet OwnerSet;
│ │ │ │ -
1464
│ │ │ │ -
1465 Timer time;
│ │ │ │ -
1466
│ │ │ │ -
1467 // Build the send interface
│ │ │ │ -
1468 redistInf.buildSendInterface<OwnerSet>(setPartition, oocomm.indexSet());
│ │ │ │ -
1469
│ │ │ │ -
1470#ifdef PERF_REPART
│ │ │ │ -
1471 // stop the time for step 3)
│ │ │ │ -
1472 t3=MPI_Wtime()-t3;
│ │ │ │ -
1473 // reset timer for step 4)
│ │ │ │ -
1474 t4=MPI_Wtime();
│ │ │ │ -
1475#endif
│ │ │ │ -
1476
│ │ │ │ -
1477
│ │ │ │ -
1478 //
│ │ │ │ -
1479 // 4) Create the output IndexSet and RemoteIndices
│ │ │ │ -
1480 // 4.1) Determine the "send to" and "receive from" relation
│ │ │ │ -
1481 // according to the new partition using a MPI ring
│ │ │ │ -
1482 // communication.
│ │ │ │ -
1483 //
│ │ │ │ -
1484 // 4.2) Depends on the "send to" and "receive from" vector,
│ │ │ │ -
1485 // the processes will exchange the vertices each other
│ │ │ │ -
1486 //
│ │ │ │ -
1487 // 4.3) Create the IndexSet, RemoteIndices and the new MPI
│ │ │ │ -
1488 // communicator
│ │ │ │ -
1489 //
│ │ │ │ -
1490
│ │ │ │ -
1491 //
│ │ │ │ -
1492 // 4.1) Let's start...
│ │ │ │ -
1493 //
│ │ │ │ -
1494 int npes = oocomm.communicator().size();
│ │ │ │ -
1495 int *sendTo = 0;
│ │ │ │ -
1496 int noSendTo = 0;
│ │ │ │ -
1497 std::set<int> recvFrom;
│ │ │ │ -
1498
│ │ │ │ -
1499 // the max number of vertices is stored in the sendTo buffer,
│ │ │ │ -
1500 // not the number of vertices to send! Because the max number of Vtx
│ │ │ │ -
1501 // is used as the fixed buffer size by the MPI send/receive calls
│ │ │ │ -
1502
│ │ │ │ -
1503 int mype = oocomm.communicator().rank();
│ │ │ │ -
1504
│ │ │ │ -
1505 {
│ │ │ │ -
1506 std::set<int> tsendTo;
│ │ │ │ -
1507 for(auto i=setPartition.begin(), iend = setPartition.end(); i!=iend; ++i)
│ │ │ │ -
1508 tsendTo.insert(*i);
│ │ │ │ -
1509
│ │ │ │ -
1510 noSendTo = tsendTo.size();
│ │ │ │ -
1511 sendTo = new int[noSendTo];
│ │ │ │ -
1512 int idx=0;
│ │ │ │ -
1513 for(auto i=tsendTo.begin(); i != tsendTo.end(); ++i, ++idx)
│ │ │ │ -
1514 sendTo[idx]=*i;
│ │ │ │ -
1515 }
│ │ │ │ -
1516
│ │ │ │ -
1517 //
│ │ │ │ -
1518 int* gnoSend= new int[oocomm.communicator().size()];
│ │ │ │ -
1519 int* gsendToDispl = new int[oocomm.communicator().size()+1];
│ │ │ │ -
1520
│ │ │ │ -
1521 MPI_Allgather(&noSendTo, 1, MPI_INT, gnoSend, 1,
│ │ │ │ -
1522 MPI_INT, oocomm.communicator());
│ │ │ │ -
1523
│ │ │ │ -
1524 // calculate total receive message size
│ │ │ │ -
1525 int totalNoRecv = 0;
│ │ │ │ -
1526 for(int i=0; i<npes; ++i)
│ │ │ │ -
1527 totalNoRecv += gnoSend[i];
│ │ │ │ -
1528
│ │ │ │ -
1529 int *gsendTo = new int[totalNoRecv];
│ │ │ │ -
1530
│ │ │ │ -
1531 // calculate displacement for allgatherv
│ │ │ │ -
1532 gsendToDispl[0]=0;
│ │ │ │ -
1533 for(int i=0; i<npes; ++i)
│ │ │ │ -
1534 gsendToDispl[i+1]=gsendToDispl[i]+gnoSend[i];
│ │ │ │ -
1535
│ │ │ │ -
1536 // gather the data
│ │ │ │ -
1537 MPI_Allgatherv(sendTo, noSendTo, MPI_INT, gsendTo, gnoSend, gsendToDispl,
│ │ │ │ -
1538 MPI_INT, oocomm.communicator());
│ │ │ │ -
1539
│ │ │ │ -
1540 // Extract from which processes we will receive data
│ │ │ │ -
1541 for(int proc=0; proc < npes; ++proc)
│ │ │ │ -
1542 for(int i=gsendToDispl[proc]; i < gsendToDispl[proc+1]; ++i)
│ │ │ │ -
1543 if(gsendTo[i]==mype)
│ │ │ │ -
1544 recvFrom.insert(proc);
│ │ │ │ -
1545
│ │ │ │ -
1546 bool existentOnNextLevel = recvFrom.size()>0;
│ │ │ │ -
1547
│ │ │ │ -
1548 // Delete memory
│ │ │ │ -
1549 delete[] gnoSend;
│ │ │ │ -
1550 delete[] gsendToDispl;
│ │ │ │ -
1551 delete[] gsendTo;
│ │ │ │ -
1552
│ │ │ │ -
1553
│ │ │ │ -
1554#ifdef DEBUG_REPART
│ │ │ │ -
1555 if(recvFrom.size()) {
│ │ │ │ -
1556 std::cout<<mype<<": recvFrom: ";
│ │ │ │ -
1557 for(auto i=recvFrom.begin(); i!= recvFrom.end(); ++i) {
│ │ │ │ -
1558 std::cout<<*i<<" ";
│ │ │ │ -
1559 }
│ │ │ │ -
1560 }
│ │ │ │ -
1561
│ │ │ │ -
1562 std::cout<<std::endl<<std::endl;
│ │ │ │ -
1563 std::cout<<mype<<": sendTo: ";
│ │ │ │ -
1564 for(int i=0; i<noSendTo; i++) {
│ │ │ │ -
1565 std::cout<<sendTo[i]<<" ";
│ │ │ │ -
1566 }
│ │ │ │ -
1567 std::cout<<std::endl<<std::endl;
│ │ │ │ -
1568#endif
│ │ │ │ -
1569
│ │ │ │ -
1570 if(verbose)
│ │ │ │ -
1571 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1572 std::cout<<" Communicating the receive information took "<<
│ │ │ │ -
1573 time.elapsed()<<std::endl;
│ │ │ │ -
1574 time.reset();
│ │ │ │ -
1575
│ │ │ │ -
1576 //
│ │ │ │ -
1577 // 4.2) Start the communication
│ │ │ │ -
1578 //
│ │ │ │ -
1579
│ │ │ │ -
1580 // Get all the owner and overlap vertices for myself ans save
│ │ │ │ -
1581 // it in the vectors myOwnerVec and myOverlapVec.
│ │ │ │ -
1582 // The received vertices from the other processes are simple
│ │ │ │ -
1583 // added to these vector.
│ │ │ │ -
1584 //
│ │ │ │ -
1585
│ │ │ │ -
1586
│ │ │ │ -
1587 typedef typename OOComm::ParallelIndexSet::GlobalIndex GI;
│ │ │ │ -
1588 typedef std::vector<GI> GlobalVector;
│ │ │ │ -
1589 std::vector<std::pair<GI,int> > myOwnerVec;
│ │ │ │ -
1590 std::set<GI> myOverlapSet;
│ │ │ │ -
1591 GlobalVector sendOwnerVec;
│ │ │ │ -
1592 std::set<GI> sendOverlapSet;
│ │ │ │ -
1593 std::set<int> myNeighbors;
│ │ │ │ -
1594
│ │ │ │ -
1595 // getOwnerOverlapVec<OwnerSet>(graph, setPartition, oocomm.globalLookup(),
│ │ │ │ -
1596 // mype, mype, myOwnerVec, myOverlapSet, redistInf, myNeighbors);
│ │ │ │ -
1597
│ │ │ │ -
1598 char **sendBuffers=new char*[noSendTo];
│ │ │ │ -
1599 MPI_Request *requests = new MPI_Request[noSendTo];
│ │ │ │ -
1600
│ │ │ │ -
1601 // Create all messages to be sent
│ │ │ │ -
1602 for(int i=0; i < noSendTo; ++i) {
│ │ │ │ -
1603 // clear the vector for sending
│ │ │ │ -
1604 sendOwnerVec.clear();
│ │ │ │ -
1605 sendOverlapSet.clear();
│ │ │ │ -
1606 // get all owner and overlap vertices for process j and save these
│ │ │ │ -
1607 // in the vectors sendOwnerVec and sendOverlapSet
│ │ │ │ -
1608 std::set<int> neighbors;
│ │ │ │ -
1609 getOwnerOverlapVec<OwnerSet>(graph, setPartition, oocomm.globalLookup(),
│ │ │ │ -
1610 mype, sendTo[i], sendOwnerVec, sendOverlapSet, redistInf,
│ │ │ │ -
1611 neighbors);
│ │ │ │ -
1612 // +2, we need 2 integer more for the length of each part
│ │ │ │ -
1613 // (owner/overlap) of the array
│ │ │ │ -
1614 int buffersize=0;
│ │ │ │ -
1615 int tsize;
│ │ │ │ -
1616 MPI_Pack_size(1, MPITraits<std::size_t>::getType(), oocomm.communicator(), &buffersize);
│ │ │ │ -
1617 MPI_Pack_size(sendOwnerVec.size(), MPITraits<GI>::getType(), oocomm.communicator(), &tsize);
│ │ │ │ -
1618 buffersize +=tsize;
│ │ │ │ -
1619 MPI_Pack_size(1, MPITraits<std::size_t>::getType(), oocomm.communicator(), &tsize);
│ │ │ │ -
1620 buffersize +=tsize;
│ │ │ │ -
1621 MPI_Pack_size(sendOverlapSet.size(), MPITraits<GI>::getType(), oocomm.communicator(), &tsize);
│ │ │ │ -
1622 buffersize += tsize;
│ │ │ │ -
1623 MPI_Pack_size(1, MPITraits<std::size_t>::getType(), oocomm.communicator(), &tsize);
│ │ │ │ -
1624 buffersize += tsize;
│ │ │ │ -
1625 MPI_Pack_size(neighbors.size(), MPI_INT, oocomm.communicator(), &tsize);
│ │ │ │ -
1626 buffersize += tsize;
│ │ │ │ -
1627
│ │ │ │ -
1628 sendBuffers[i] = new char[buffersize];
│ │ │ │ -
1629
│ │ │ │ -
1630#ifdef DEBUG_REPART
│ │ │ │ -
1631 std::cout<<mype<<" sending "<<sendOwnerVec.size()<<" owner and "<<
│ │ │ │ -
1632 sendOverlapSet.size()<<" overlap to "<<sendTo[i]<<" buffersize="<<buffersize<<std::endl;
│ │ │ │ -
1633#endif
│ │ │ │ -
1634 createSendBuf(sendOwnerVec, sendOverlapSet, neighbors, sendBuffers[i], buffersize, oocomm.communicator());
│ │ │ │ -
1635 MPI_Issend(sendBuffers[i], buffersize, MPI_PACKED, sendTo[i], 99, oocomm.communicator(), requests+i);
│ │ │ │ -
1636 }
│ │ │ │ -
1637
│ │ │ │ -
1638 if(verbose) {
│ │ │ │ -
1639 oocomm.communicator().barrier();
│ │ │ │ -
1640 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1641 std::cout<<" Creating sends took "<<
│ │ │ │ -
1642 time.elapsed()<<std::endl;
│ │ │ │ -
1643 }
│ │ │ │ -
1644 time.reset();
│ │ │ │ -
1645
│ │ │ │ -
1646 // Receive Messages
│ │ │ │ -
1647 int noRecv = recvFrom.size();
│ │ │ │ -
1648 int oldbuffersize=0;
│ │ │ │ -
1649 char* recvBuf = 0;
│ │ │ │ -
1650 while(noRecv>0) {
│ │ │ │ -
1651 // probe for an incoming message
│ │ │ │ -
1652 MPI_Status stat;
│ │ │ │ -
1653 MPI_Probe(MPI_ANY_SOURCE, 99, oocomm.communicator(), &stat);
│ │ │ │ -
1654 int buffersize;
│ │ │ │ -
1655 MPI_Get_count(&stat, MPI_PACKED, &buffersize);
│ │ │ │ -
1656
│ │ │ │ -
1657 if(oldbuffersize<buffersize) {
│ │ │ │ -
1658 // buffer too small, reallocate
│ │ │ │ -
1659 delete[] recvBuf;
│ │ │ │ -
1660 recvBuf = new char[buffersize];
│ │ │ │ -
1661 oldbuffersize = buffersize;
│ │ │ │ -
1662 }
│ │ │ │ -
1663 MPI_Recv(recvBuf, buffersize, MPI_PACKED, stat.MPI_SOURCE, 99, oocomm.communicator(), &stat);
│ │ │ │ -
1664 saveRecvBuf(recvBuf, buffersize, myOwnerVec, myOverlapSet, myNeighbors, redistInf,
│ │ │ │ -
1665 stat.MPI_SOURCE, oocomm.communicator());
│ │ │ │ -
1666 --noRecv;
│ │ │ │ -
1667 }
│ │ │ │ -
1668
│ │ │ │ -
1669 if(recvBuf)
│ │ │ │ -
1670 delete[] recvBuf;
│ │ │ │ -
1671
│ │ │ │ -
1672 time.reset();
│ │ │ │ -
1673 // Wait for sending messages to complete
│ │ │ │ -
1674 MPI_Status *statuses = new MPI_Status[noSendTo];
│ │ │ │ -
1675 int send = MPI_Waitall(noSendTo, requests, statuses);
│ │ │ │ -
1676
│ │ │ │ -
1677 // check for errors
│ │ │ │ -
1678 if(send==MPI_ERR_IN_STATUS) {
│ │ │ │ -
1679 std::cerr<<mype<<": Error in sending :"<<std::endl;
│ │ │ │ -
1680 // Search for the error
│ │ │ │ -
1681 for(int i=0; i< noSendTo; i++)
│ │ │ │ -
1682 if(statuses[i].MPI_ERROR!=MPI_SUCCESS) {
│ │ │ │ -
1683 char message[300];
│ │ │ │ -
1684 int messageLength;
│ │ │ │ -
1685 MPI_Error_string(statuses[i].MPI_ERROR, message, &messageLength);
│ │ │ │ -
1686 std::cerr<<" source="<<statuses[i].MPI_SOURCE<<" message: ";
│ │ │ │ -
1687 for(int j = 0; j < messageLength; j++)
│ │ │ │ -
1688 std::cout<<message[j];
│ │ │ │ -
1689 }
│ │ │ │ -
1690 std::cerr<<std::endl;
│ │ │ │ -
1691 }
│ │ │ │ -
1692
│ │ │ │ -
1693 if(verbose) {
│ │ │ │ -
1694 oocomm.communicator().barrier();
│ │ │ │ -
1695 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1696 std::cout<<" Receiving and saving took "<<
│ │ │ │ -
1697 time.elapsed()<<std::endl;
│ │ │ │ -
1698 }
│ │ │ │ -
1699 time.reset();
│ │ │ │ -
1700
│ │ │ │ -
1701 for(int i=0; i < noSendTo; ++i)
│ │ │ │ -
1702 delete[] sendBuffers[i];
│ │ │ │ -
1703
│ │ │ │ -
1704 delete[] sendBuffers;
│ │ │ │ -
1705 delete[] statuses;
│ │ │ │ -
1706 delete[] requests;
│ │ │ │ -
1707
│ │ │ │ -
1708 redistInf.setCommunicator(oocomm.communicator());
│ │ │ │ -
1709
│ │ │ │ -
1710 //
│ │ │ │ -
1711 // 4.2) Create the IndexSet etc.
│ │ │ │ -
1712 //
│ │ │ │ -
1713
│ │ │ │ -
1714 // build the new outputIndexSet
│ │ │ │ -
1715
│ │ │ │ -
1716
│ │ │ │ -
1717 int color=0;
│ │ │ │ -
1718
│ │ │ │ -
1719 if (!existentOnNextLevel) {
│ │ │ │ -
1720 // this process is not used anymore
│ │ │ │ -
1721 color= MPI_UNDEFINED;
│ │ │ │ -
1722 }
│ │ │ │ -
1723 MPI_Comm outputComm;
│ │ │ │ -
1724
│ │ │ │ -
1725 MPI_Comm_split(oocomm.communicator(), color, oocomm.communicator().rank(), &outputComm);
│ │ │ │ -
1726 outcomm = std::make_shared<OOComm>(outputComm,SolverCategory::category(oocomm),true);
│ │ │ │ -
1727
│ │ │ │ -
1728 // translate neighbor ranks.
│ │ │ │ -
1729 int newrank=outcomm->communicator().rank();
│ │ │ │ -
1730 int *newranks=new int[oocomm.communicator().size()];
│ │ │ │ -
1731 std::vector<int> tneighbors;
│ │ │ │ -
1732 tneighbors.reserve(myNeighbors.size());
│ │ │ │ -
1733
│ │ │ │ -
1734 typename OOComm::ParallelIndexSet& outputIndexSet = outcomm->indexSet();
│ │ │ │ -
1735
│ │ │ │ -
1736 MPI_Allgather(&newrank, 1, MPI_INT, newranks, 1,
│ │ │ │ -
1737 MPI_INT, oocomm.communicator());
│ │ │ │ -
1738
│ │ │ │ -
1739#ifdef DEBUG_REPART
│ │ │ │ -
1740 std::cout<<oocomm.communicator().rank()<<" ";
│ │ │ │ -
1741 for(auto i=myNeighbors.begin(), end=myNeighbors.end();
│ │ │ │ -
1742 i!=end; ++i) {
│ │ │ │ -
1743 assert(newranks[*i]>=0);
│ │ │ │ -
1744 std::cout<<*i<<"->"<<newranks[*i]<<" ";
│ │ │ │ -
1745 tneighbors.push_back(newranks[*i]);
│ │ │ │ -
1746 }
│ │ │ │ -
1747 std::cout<<std::endl;
│ │ │ │ -
1748#else
│ │ │ │ -
1749 for(auto i=myNeighbors.begin(), end=myNeighbors.end();
│ │ │ │ -
1750 i!=end; ++i) {
│ │ │ │ -
1751 tneighbors.push_back(newranks[*i]);
│ │ │ │ -
1752 }
│ │ │ │ -
1753#endif
│ │ │ │ -
1754 delete[] newranks;
│ │ │ │ -
1755 myNeighbors.clear();
│ │ │ │ -
1756
│ │ │ │ -
1757 if(verbose) {
│ │ │ │ -
1758 oocomm.communicator().barrier();
│ │ │ │ -
1759 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1760 std::cout<<" Calculating new neighbours ("<<tneighbors.size()<<") took "<<
│ │ │ │ -
1761 time.elapsed()<<std::endl;
│ │ │ │ -
1762 }
│ │ │ │ -
1763 time.reset();
│ │ │ │ -
1764
│ │ │ │ -
1765
│ │ │ │ -
1766 outputIndexSet.beginResize();
│ │ │ │ -
1767 // 1) add the owner vertices
│ │ │ │ -
1768 // Sort the owners
│ │ │ │ -
1769 std::sort(myOwnerVec.begin(), myOwnerVec.end(), SortFirst());
│ │ │ │ -
1770 // The owners are sorted according to there global index
│ │ │ │ -
1771 // Therefore the entries of ownerVec are the same as the
│ │ │ │ -
1772 // ones in the resulting index set.
│ │ │ │ -
1773 int i=0;
│ │ │ │ -
1774 using LocalIndexT = typename OOComm::ParallelIndexSet::LocalIndex;
│ │ │ │ -
1775 for(auto g=myOwnerVec.begin(), end =myOwnerVec.end(); g!=end; ++g, ++i ) {
│ │ │ │ -
1776 outputIndexSet.add(g->first,LocalIndexT(i, OwnerOverlapCopyAttributeSet::owner, true));
│ │ │ │ -
1777 redistInf.addReceiveIndex(g->second, i);
│ │ │ │ -
1778 }
│ │ │ │ -
1779
│ │ │ │ -
1780 if(verbose) {
│ │ │ │ -
1781 oocomm.communicator().barrier();
│ │ │ │ -
1782 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1783 std::cout<<" Adding owner indices took "<<
│ │ │ │ -
1784 time.elapsed()<<std::endl;
│ │ │ │ -
1785 }
│ │ │ │ -
1786 time.reset();
│ │ │ │ -
1787
│ │ │ │ -
1788
│ │ │ │ -
1789 // After all the vertices are received, the vectors must
│ │ │ │ -
1790 // be "merged" together to create the final vectors.
│ │ │ │ -
1791 // Because some vertices that are sent as overlap could now
│ │ │ │ -
1792 // already included as owner vertiecs in the new partition
│ │ │ │ -
1793 mergeVec(myOwnerVec, myOverlapSet);
│ │ │ │ -
1794
│ │ │ │ -
1795 // Trick to free memory
│ │ │ │ -
1796 myOwnerVec.clear();
│ │ │ │ -
1797 myOwnerVec.swap(myOwnerVec);
│ │ │ │ -
1798
│ │ │ │ -
1799 if(verbose) {
│ │ │ │ -
1800 oocomm.communicator().barrier();
│ │ │ │ -
1801 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1802 std::cout<<" Merging indices took "<<
│ │ │ │ -
1803 time.elapsed()<<std::endl;
│ │ │ │ -
1804 }
│ │ │ │ -
1805 time.reset();
│ │ │ │ -
1806
│ │ │ │ -
1807
│ │ │ │ -
1808 // 2) add the overlap vertices
│ │ │ │ -
1809 for(auto g=myOverlapSet.begin(), end=myOverlapSet.end(); g!=end; ++g, i++) {
│ │ │ │ -
1810 outputIndexSet.add(*g,LocalIndexT(i, OwnerOverlapCopyAttributeSet::copy, true));
│ │ │ │ -
1811 }
│ │ │ │ -
1812 myOverlapSet.clear();
│ │ │ │ -
1813 outputIndexSet.endResize();
│ │ │ │ -
1814
│ │ │ │ -
1815#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1816 int numOfOwnVtx =0;
│ │ │ │ -
1817 auto end = outputIndexSet.end();
│ │ │ │ -
1818 for(auto index = outputIndexSet.begin(); index != end; ++index) {
│ │ │ │ -
1819 if (OwnerSet::contains(index->local().attribute())) {
│ │ │ │ -
1820 numOfOwnVtx++;
│ │ │ │ -
1821 }
│ │ │ │ -
1822 }
│ │ │ │ -
1823 numOfOwnVtx = oocomm.communicator().sum(numOfOwnVtx);
│ │ │ │ -
1824 // if(numOfOwnVtx!=indexMap.globalOwnerVertices)
│ │ │ │ -
1825 // {
│ │ │ │ -
1826 // std::cerr<<numOfOwnVtx<<"!="<<indexMap.globalOwnerVertices<<" owners missing or additional ones!"<<std::endl;
│ │ │ │ -
1827 // DUNE_THROW(ISTLError, numOfOwnVtx<<"!="<<indexMap.globalOwnerVertices<<" owners missing or additional ones"
│ │ │ │ -
1828 // <<" during repartitioning.");
│ │ │ │ -
1829 // }
│ │ │ │ -
1830 std::is_sorted(outputIndexSet.begin(), outputIndexSet.end(),
│ │ │ │ -
1831 [](const auto& v1, const auto& v2){ return v1.global() < v2.global();});
│ │ │ │ -
1832#endif
│ │ │ │ -
1833 if(verbose) {
│ │ │ │ -
1834 oocomm.communicator().barrier();
│ │ │ │ -
1835 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1836 std::cout<<" Adding overlap indices took "<<
│ │ │ │ -
1837 time.elapsed()<<std::endl;
│ │ │ │ -
1838 }
│ │ │ │ -
1839 time.reset();
│ │ │ │ -
1840
│ │ │ │ -
1841
│ │ │ │ -
1842 if(color != MPI_UNDEFINED) {
│ │ │ │ -
1843 outcomm->remoteIndices().setNeighbours(tneighbors);
│ │ │ │ -
1844 outcomm->remoteIndices().template rebuild<true>();
│ │ │ │ -
1845
│ │ │ │ -
1846 }
│ │ │ │ -
1847
│ │ │ │ -
1848 // release the memory
│ │ │ │ -
1849 delete[] sendTo;
│ │ │ │ -
1850
│ │ │ │ -
1851 if(verbose) {
│ │ │ │ -
1852 oocomm.communicator().barrier();
│ │ │ │ -
1853 if(oocomm.communicator().rank()==0)
│ │ │ │ -
1854 std::cout<<" Storing indexsets took "<<
│ │ │ │ -
1855 time.elapsed()<<std::endl;
│ │ │ │ -
1856 }
│ │ │ │ -
1857
│ │ │ │ -
1858#ifdef PERF_REPART
│ │ │ │ -
1859 // stop the time for step 4) and print the results
│ │ │ │ -
1860 t4=MPI_Wtime()-t4;
│ │ │ │ -
1861 tSum = t1 + t2 + t3 + t4;
│ │ │ │ -
1862 std::cout<<std::endl
│ │ │ │ -
1863 <<mype<<": WTime for step 1): "<<t1
│ │ │ │ -
1864 <<" 2): "<<t2
│ │ │ │ -
1865 <<" 3): "<<t3
│ │ │ │ -
1866 <<" 4): "<<t4
│ │ │ │ -
1867 <<" total: "<<tSum
│ │ │ │ -
1868 <<std::endl;
│ │ │ │ -
1869#endif
│ │ │ │ -
1870
│ │ │ │ -
1871 return color!=MPI_UNDEFINED;
│ │ │ │ -
1872
│ │ │ │ -
1873 }
│ │ │ │ -
│ │ │ │ -
1874#else
│ │ │ │ -
1875 template<class G, class P,class T1, class T2, class R>
│ │ │ │ -
1876 bool graphRepartition(const G& graph, P& oocomm, int nparts,
│ │ │ │ -
1877 std::shared_ptr<P>& outcomm,
│ │ │ │ -
1878 R& redistInf,
│ │ │ │ -
1879 bool v=false)
│ │ │ │ -
1880 {
│ │ │ │ -
1881 if(nparts!=oocomm.size())
│ │ │ │ -
1882 DUNE_THROW(NotImplemented, "only available for MPI programs");
│ │ │ │ -
1883 }
│ │ │ │ -
1884
│ │ │ │ -
1885
│ │ │ │ -
1886 template<class G, class P,class T1, class T2, class R>
│ │ │ │ -
1887 bool commGraphRepartition(const G& graph, P& oocomm, int nparts,
│ │ │ │ -
1888 std::shared_ptr<P>& outcomm,
│ │ │ │ -
1889 R& redistInf,
│ │ │ │ -
1890 bool v=false)
│ │ │ │ -
1891 {
│ │ │ │ -
1892 if(nparts!=oocomm.size())
│ │ │ │ -
1893 DUNE_THROW(NotImplemented, "only available for MPI programs");
│ │ │ │ -
1894 }
│ │ │ │ -
1895#endif // HAVE_MPI
│ │ │ │ -
1896} // end of namespace Dune
│ │ │ │ -
1897#endif
│ │ │ │ -
Provides classes for building the matrix graph.
│ │ │ │ -
int globalOwnerVertices
Definition repartition.hh:175
│ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
118 virtual const M& getmat () const = 0;
│ │ │ │ +
119
│ │ │ │ + │ │ │ │ +
122 };
│ │ │ │ +
│ │ │ │ +
123
│ │ │ │ +
124
│ │ │ │ +
125
│ │ │ │ +
126 //=====================================================================
│ │ │ │ +
127 // Implementation for ISTL-matrix based operator
│ │ │ │ +
128 //=====================================================================
│ │ │ │ +
129
│ │ │ │ +
135 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
137 {
│ │ │ │ +
138 public:
│ │ │ │ +
140 typedef M matrix_type;
│ │ │ │ +
141 typedef X domain_type;
│ │ │ │ +
142 typedef Y range_type;
│ │ │ │ +
143 typedef typename X::field_type field_type;
│ │ │ │ +
144
│ │ │ │ +
146 explicit MatrixAdapter (const M& A) : _A_(stackobject_to_shared_ptr(A)) {}
│ │ │ │ +
147
│ │ │ │ +
149 explicit MatrixAdapter (std::shared_ptr<const M> A) : _A_(A) {}
│ │ │ │ +
150
│ │ │ │ +
│ │ │ │ +
152 void apply (const X& x, Y& y) const override
│ │ │ │ +
153 {
│ │ │ │ +
154 _A_->mv(x,y);
│ │ │ │ +
155 }
│ │ │ │ +
│ │ │ │ +
156
│ │ │ │ +
│ │ │ │ +
158 void applyscaleadd (field_type alpha, const X& x, Y& y) const override
│ │ │ │ +
159 {
│ │ │ │ +
160 _A_->usmv(alpha,x,y);
│ │ │ │ +
161 }
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
│ │ │ │ +
164 const M& getmat () const override
│ │ │ │ +
165 {
│ │ │ │ +
166 return *_A_;
│ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
171 {
│ │ │ │ + │ │ │ │ +
173 }
│ │ │ │ +
│ │ │ │ +
174
│ │ │ │ +
175 private:
│ │ │ │ +
176 const std::shared_ptr<const M> _A_;
│ │ │ │ +
177 };
│ │ │ │ +
│ │ │ │ +
178
│ │ │ │ +
181} // end namespace
│ │ │ │ +
182
│ │ │ │ +
183#endif
│ │ │ │ + │ │ │ │
Definition allocator.hh:11
│ │ │ │ -
bool buildCommunication(const G &graph, std::vector< int > &realparts, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
Definition repartition.hh:1456
│ │ │ │ -
void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
Fills the holes in an index set.
Definition repartition.hh:83
│ │ │ │ -
bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
Definition repartition.hh:829
│ │ │ │ -
void print_carray(S &os, T *array, std::size_t l)
Definition repartition.hh:778
│ │ │ │ -
bool isValidGraph(std::size_t noVtx, std::size_t gnoVtx, S noEdges, T *xadj, T *adjncy, bool checkSymmetry)
Definition repartition.hh:785
│ │ │ │ -
bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface &redistInf, bool verbose=false)
execute a graph repartition for a giving graph and indexset.
Definition repartition.hh:1235
│ │ │ │ -
float real_t
Definition repartition.hh:53
│ │ │ │ -
std::size_t idx_t
Definition repartition.hh:63
│ │ │ │ -
@ owner
Definition owneroverlapcopy.hh:61
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
const GlobalLookupIndexSet & globalLookup() const
Definition owneroverlapcopy.hh:526
│ │ │ │ -
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:462
│ │ │ │ -
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition owneroverlapcopy.hh:328
│ │ │ │ -
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition owneroverlapcopy.hh:456
│ │ │ │ -
void buildGlobalLookup()
Definition owneroverlapcopy.hh:495
│ │ │ │ -
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ -
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │ -
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ -
void freeGlobalLookup()
Definition owneroverlapcopy.hh:520
│ │ │ │ -
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │ -
The (undirected) graph of a matrix.
Definition graph.hh:51
│ │ │ │ -
Definition repartition.hh:260
│ │ │ │ -
void reserveSpaceForReceiveInterface(int proc, int size)
Definition repartition.hh:284
│ │ │ │ -
void buildReceiveInterface(std::vector< std::pair< TG, int > > &indices)
Definition repartition.hh:293
│ │ │ │ -
~RedistributeInterface()
Definition repartition.hh:301
│ │ │ │ -
void setCommunicator(MPI_Comm comm)
Definition repartition.hh:261
│ │ │ │ -
void buildSendInterface(const std::vector< int > &toPart, const IS &idxset)
Definition repartition.hh:266
│ │ │ │ -
void addReceiveIndex(int proc, std::size_t idx)
Definition repartition.hh:288
│ │ │ │ +
A linear operator.
Definition operators.hh:67
│ │ │ │ +
virtual ~LinearOperator()
every abstract base class has a virtual destructor
Definition operators.hh:86
│ │ │ │ +
X::field_type field_type
The field type of the operator.
Definition operators.hh:74
│ │ │ │ +
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
apply operator to x, scale and add:
│ │ │ │ +
virtual SolverCategory::Category category() const =0
Category of the linear operator (see SolverCategory::Category)
│ │ │ │ +
Y range_type
The type of the range of the operator.
Definition operators.hh:72
│ │ │ │ +
virtual void apply(const X &x, Y &y) const =0
apply operator to x: The input vector is consistent and the output must also be consistent on the in...
│ │ │ │ +
X domain_type
The type of the domain of the operator.
Definition operators.hh:70
│ │ │ │ +
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ +
virtual const M & getmat() const =0
get matrix via *
│ │ │ │ +
X domain_type
Definition operators.hh:113
│ │ │ │ +
X::field_type field_type
Definition operators.hh:115
│ │ │ │ +
Y range_type
Definition operators.hh:114
│ │ │ │ +
M matrix_type
export types, usually they come from the derived class
Definition operators.hh:112
│ │ │ │ +
virtual ~AssembledLinearOperator()
every abstract base class has a virtual destructor
Definition operators.hh:121
│ │ │ │ +
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ +
MatrixAdapter(std::shared_ptr< const M > A)
constructor: store an std::shared_ptr to a matrix
Definition operators.hh:149
│ │ │ │ +
MatrixAdapter(const M &A)
constructor: just store a reference to a matrix
Definition operators.hh:146
│ │ │ │ +
void applyscaleadd(field_type alpha, const X &x, Y &y) const override
apply operator to x, scale and add:
Definition operators.hh:158
│ │ │ │ +
Y range_type
Definition operators.hh:142
│ │ │ │ +
X domain_type
Definition operators.hh:141
│ │ │ │ +
X::field_type field_type
Definition operators.hh:143
│ │ │ │ +
const M & getmat() const override
get matrix via *
Definition operators.hh:164
│ │ │ │ +
SolverCategory::Category category() const override
Category of the solver (see SolverCategory::Category)
Definition operators.hh:170
│ │ │ │ +
void apply(const X &x, Y &y) const override
apply operator to x:
Definition operators.hh:152
│ │ │ │ +
M matrix_type
export types
Definition operators.hh:140
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1986 +1,223 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -repartition.hh │ │ │ │ │ +operators.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_REPARTITION_HH │ │ │ │ │ -6#define DUNE_ISTL_REPARTITION_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_OPERATORS_HH │ │ │ │ │ +6#define DUNE_ISTL_OPERATORS_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#if HAVE_PARMETIS │ │ │ │ │ -14// Explicitly use C linkage as scotch does not extern "C" in its headers. │ │ │ │ │ -15// Works because ParMETIS/METIS checks whether compiler is C++ and otherwise │ │ │ │ │ -16// does not use extern "C". Therfore no nested extern "C" will be created │ │ │ │ │ -17extern "C" │ │ │ │ │ -18{ │ │ │ │ │ -19#include │ │ │ │ │ -20} │ │ │ │ │ -21#endif │ │ │ │ │ -22 │ │ │ │ │ -23#include │ │ │ │ │ -24#include │ │ │ │ │ -25#include │ │ │ │ │ -26#include │ │ │ │ │ -27#include │ │ │ │ │ -28#include │ │ │ │ │ -29#include │ │ │ │ │ -30#include │ │ │ │ │ -31#include │ │ │ │ │ -32 │ │ │ │ │ -33#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -34#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_g_r_a_p_h_._h_h> │ │ │ │ │ -35 │ │ │ │ │ -44namespace _D_u_n_e │ │ │ │ │ -45{ │ │ │ │ │ -_4_6 namespace Metis │ │ │ │ │ -47 { │ │ │ │ │ -48 // Explicitly specify a real_t and idx_t for older (Par)METIS versions that │ │ │ │ │ -do not │ │ │ │ │ -49 // provide these typedefs │ │ │ │ │ -50#if HAVE_PARMETIS && defined(REALTYPEWIDTH) │ │ │ │ │ -51 using _r_e_a_l___t = _:_:_r_e_a_l___t; │ │ │ │ │ -52#else │ │ │ │ │ -_5_3 using _r_e_a_l___t = float; │ │ │ │ │ -54#endif │ │ │ │ │ -55 │ │ │ │ │ -56#if HAVE_PARMETIS && defined(IDXTYPEWIDTH) │ │ │ │ │ -57 using _i_d_x___t = _:_:_i_d_x___t; │ │ │ │ │ -58#elif HAVE_PARMETIS && defined(HAVE_SCOTCH_NUM_TYPE) │ │ │ │ │ -59 using _i_d_x___t = SCOTCH_Num; │ │ │ │ │ -60#elif HAVE_PARMETIS │ │ │ │ │ -61 using _i_d_x___t = int; │ │ │ │ │ -62#else │ │ │ │ │ -_6_3 using _i_d_x___t = std::size_t; │ │ │ │ │ -64#endif │ │ │ │ │ -65 } │ │ │ │ │ -66 │ │ │ │ │ -67 │ │ │ │ │ -68#if HAVE_MPI │ │ │ │ │ -82 template │ │ │ │ │ -_8_3 void _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(const G& graph, _D_u_n_e_:_: │ │ │ │ │ -_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm) │ │ │ │ │ -84 { │ │ │ │ │ -85 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>_:_: │ │ │ │ │ -_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t IndexSet; │ │ │ │ │ -86 typedef typename IndexSet::LocalIndex::Attribute Attribute; │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +18 │ │ │ │ │ +19 │ │ │ │ │ +20namespace _D_u_n_e { │ │ │ │ │ +21 │ │ │ │ │ +44 //===================================================================== │ │ │ │ │ +45 // Abstract operator interface │ │ │ │ │ +46 //===================================================================== │ │ │ │ │ +47 │ │ │ │ │ +48 │ │ │ │ │ +66 template │ │ │ │ │ +_6_7 class _L_i_n_e_a_r_O_p_e_r_a_t_o_r { │ │ │ │ │ +68 public: │ │ │ │ │ +_7_0 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_7_2 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_7_4 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +75 │ │ │ │ │ +_8_0 virtual void _a_p_p_l_y (const X& x, Y& y) const = 0; │ │ │ │ │ +81 │ │ │ │ │ +_8_3 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (_f_i_e_l_d___t_y_p_e alpha, const X& x, Y& y) const = 0; │ │ │ │ │ +84 │ │ │ │ │ +_8_6 virtual _~_L_i_n_e_a_r_O_p_e_r_a_t_o_r () {} │ │ │ │ │ 87 │ │ │ │ │ -88 IndexSet& indexSet = oocomm._i_n_d_e_x_S_e_t(); │ │ │ │ │ -89 const typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>_:_: │ │ │ │ │ -_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& lookup =oocomm._g_l_o_b_a_l_L_o_o_k_u_p(); │ │ │ │ │ -90 │ │ │ │ │ -91 std::size_t sum=0, needed = graph.noVertices()-indexSet.size(); │ │ │ │ │ -92 std::vector neededall(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size(), 0); │ │ │ │ │ -93 │ │ │ │ │ -94 MPI_Allgather(&needed, 1, MPITraits::getType() , &(neededall │ │ │ │ │ -[0]), 1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ -95 for(int i=0; iglobal()); │ │ │ │ │ -107 │ │ │ │ │ -108 //Process p creates global indices consecutively │ │ │ │ │ -109 //starting atmaxgi+\sum_{i=1}^p neededall[i] │ │ │ │ │ -110 // All created indices are owned by the process │ │ │ │ │ -111 maxgi=oocomm._c_o_m_m_u_n_i_c_a_t_o_r().max(maxgi); │ │ │ │ │ -112 ++maxgi; //Sart with the next free index. │ │ │ │ │ -113 │ │ │ │ │ -114 for(int i=0; i │ │ │ │ │ +_1_0_9 class _A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r : public _L_i_n_e_a_r_O_p_e_r_a_t_o_r { │ │ │ │ │ +110 public: │ │ │ │ │ +_1_1_2 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_1_1_3 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_1_4 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_1_1_5 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ 116 │ │ │ │ │ -117 // Store the global index information for repairing the remote index │ │ │ │ │ -information │ │ │ │ │ -118 std::map > > globalIndices; │ │ │ │ │ -119 storeGlobalIndicesOfRemoteIndices(globalIndices, oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s()); │ │ │ │ │ -120 indexSet.beginResize(); │ │ │ │ │ -121 │ │ │ │ │ -122 for(auto vertex = graph.begin(), vend=graph.end(); vertex != vend; │ │ │ │ │ -++vertex) { │ │ │ │ │ -123 const typename IndexSet::IndexPair* pair=lookup.pair(*vertex); │ │ │ │ │ -124 if(pair==0) { │ │ │ │ │ -125 // No index yet, add new one │ │ │ │ │ -126 indexSet.add(maxgi, typename IndexSet::LocalIndex(*vertex, │ │ │ │ │ -_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r, false)); │ │ │ │ │ -127 ++maxgi; │ │ │ │ │ -128 } │ │ │ │ │ -129 } │ │ │ │ │ -130 │ │ │ │ │ -131 indexSet.endResize(); │ │ │ │ │ -132 │ │ │ │ │ -133 repairLocalIndexPointers(globalIndices, oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s(), indexSet); │ │ │ │ │ -134 │ │ │ │ │ -135 oocomm._f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p(); │ │ │ │ │ -136 oocomm._b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(); │ │ │ │ │ -137#ifdef DEBUG_REPART │ │ │ │ │ -138 std::cout<<"Holes are filled!"< │ │ │ │ │ -150 ParmetisDuneIndexMap(const Graph& graph, const OOComm& com); │ │ │ │ │ -151 int toParmetis(int i) const │ │ │ │ │ -152 { │ │ │ │ │ -153 return duneToParmetis[i]; │ │ │ │ │ -154 } │ │ │ │ │ -155 int toLocalParmetis(int i) const │ │ │ │ │ -156 { │ │ │ │ │ -157 return duneToParmetis[i]-base_; │ │ │ │ │ -158 } │ │ │ │ │ -159 int operator[](int i) const │ │ │ │ │ -160 { │ │ │ │ │ -161 return duneToParmetis[i]; │ │ │ │ │ -162 } │ │ │ │ │ -163 int toDune(int i) const │ │ │ │ │ -164 { │ │ │ │ │ -165 return parmetisToDune[i]; │ │ │ │ │ -166 } │ │ │ │ │ -167 std::vector::size_type numOfOwnVtx() const │ │ │ │ │ -168 { │ │ │ │ │ -169 return parmetisToDune.size(); │ │ │ │ │ -170 } │ │ │ │ │ -171 _M_e_t_i_s_:_:_i_d_x___t* vtxDist() │ │ │ │ │ -172 { │ │ │ │ │ -173 return &vtxDist_[0]; │ │ │ │ │ -174 } │ │ │ │ │ -_1_7_5 int _g_l_o_b_a_l_O_w_n_e_r_V_e_r_t_i_c_e_s; │ │ │ │ │ -176 private: │ │ │ │ │ -177 int base_; │ │ │ │ │ -178 std::vector duneToParmetis; │ │ │ │ │ -179 std::vector parmetisToDune; │ │ │ │ │ -180 // range of vertices for processor i: vtxdist[i] to vtxdist[i+1] (parmetis │ │ │ │ │ -global) │ │ │ │ │ -181 std::vector vtxDist_; │ │ │ │ │ -182 }; │ │ │ │ │ -183 │ │ │ │ │ -184 template │ │ │ │ │ -185 ParmetisDuneIndexMap::ParmetisDuneIndexMap(const G& graph, const OOComm& │ │ │ │ │ -oocomm) │ │ │ │ │ -186 : duneToParmetis(graph.noVertices(), -1), vtxDist_(oocomm.communicator │ │ │ │ │ -().size()+1) │ │ │ │ │ -187 { │ │ │ │ │ -188 int npes=oocomm.communicator().size(), mype=oocomm.communicator().rank(); │ │ │ │ │ -189 │ │ │ │ │ -190 typedef typename OOComm::OwnerSet OwnerSet; │ │ │ │ │ -191 │ │ │ │ │ -192 int numOfOwnVtx=0; │ │ │ │ │ -193 auto end = oocomm.indexSet().end(); │ │ │ │ │ -194 for(auto index = oocomm.indexSet().begin(); index != end; ++index) { │ │ │ │ │ -195 if (OwnerSet::contains(index->local().attribute())) { │ │ │ │ │ -196 numOfOwnVtx++; │ │ │ │ │ -197 } │ │ │ │ │ -198 } │ │ │ │ │ -199 parmetisToDune.resize(numOfOwnVtx); │ │ │ │ │ -200 std::vector globalNumOfVtx(npes); │ │ │ │ │ -201 // make this number available to all processes │ │ │ │ │ -202 MPI_Allgather(&numOfOwnVtx, 1, MPI_INT, &(globalNumOfVtx[0]), 1, MPI_INT, │ │ │ │ │ -oocomm.communicator()); │ │ │ │ │ -203 │ │ │ │ │ -204 int base=0; │ │ │ │ │ -205 vtxDist_[0] = 0; │ │ │ │ │ -206 for(int i=0; ilocal().attribute())) { │ │ │ │ │ -231 // assign and count the index │ │ │ │ │ -232 parmetisToDune[base-base_]=index->local(); │ │ │ │ │ -233 duneToParmetis[index->local()] = base++; │ │ │ │ │ -234 } │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -237 // At this point, every process knows the ParMETIS global index │ │ │ │ │ -238 // of it's owner vertices. The next step is to get the │ │ │ │ │ -239 // ParMETIS global index of the overlap vertices from the │ │ │ │ │ -240 // associated processes. To do this, the Dune::Interface class │ │ │ │ │ -241 // is used. │ │ │ │ │ -242#ifdef DEBUG_REPART │ │ │ │ │ -243 std::cout < │ │ │ │ │ -_2_6_6 void _b_u_i_l_d_S_e_n_d_I_n_t_e_r_f_a_c_e(const std::vector& toPart, const IS& idxset) │ │ │ │ │ -267 { │ │ │ │ │ -268 std::map sizes; │ │ │ │ │ -269 │ │ │ │ │ -270 for(auto i=idxset.begin(), end=idxset.end(); i!=end; ++i) │ │ │ │ │ -271 if(Flags::contains(i->local().attribute())) │ │ │ │ │ -272 ++sizes[toPart[i->local()]]; │ │ │ │ │ -273 │ │ │ │ │ -274 // Allocate the necessary space │ │ │ │ │ -275 for(auto i=sizes.begin(), end=sizes.end(); i!=end; ++i) │ │ │ │ │ -276 interfaces()[i->first].first.reserve(i->second); │ │ │ │ │ -277 │ │ │ │ │ -278 //Insert the interface information │ │ │ │ │ -279 for(auto i=idxset.begin(), end=idxset.end(); i!=end; ++i) │ │ │ │ │ -280 if(Flags::contains(i->local().attribute())) │ │ │ │ │ -281 interfaces()[toPart[i->local()]].first.add(i->local()); │ │ │ │ │ -282 } │ │ │ │ │ -283 │ │ │ │ │ -_2_8_4 void _r_e_s_e_r_v_e_S_p_a_c_e_F_o_r_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e(int proc, int size) │ │ │ │ │ -285 { │ │ │ │ │ -286 interfaces()[proc].second.reserve(size); │ │ │ │ │ -287 } │ │ │ │ │ -_2_8_8 void _a_d_d_R_e_c_e_i_v_e_I_n_d_e_x(int proc, std::size_t idx) │ │ │ │ │ -289 { │ │ │ │ │ -290 interfaces()[proc].second.add(idx); │ │ │ │ │ -291 } │ │ │ │ │ -292 template │ │ │ │ │ -_2_9_3 void _b_u_i_l_d_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e(std::vector >& indices) │ │ │ │ │ -294 { │ │ │ │ │ -295 std::size_t i=0; │ │ │ │ │ -296 for(auto idx=indices.begin(); idx!= indices.end(); ++idx) { │ │ │ │ │ -297 interfaces()[idx->second].second.add(i++); │ │ │ │ │ -298 } │ │ │ │ │ -299 } │ │ │ │ │ -300 │ │ │ │ │ -_3_0_1 _~_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e() │ │ │ │ │ -302 {} │ │ │ │ │ -303 │ │ │ │ │ -304 }; │ │ │ │ │ -305 │ │ │ │ │ -306 namespace │ │ │ │ │ -307 { │ │ │ │ │ -317 template │ │ │ │ │ -318 void createSendBuf(std::vector& ownerVec, std::set& overlapVec, │ │ │ │ │ -std::set& neighbors, char *sendBuf, int buffersize, MPI_Comm comm) { │ │ │ │ │ -319 // Pack owner vertices │ │ │ │ │ -320 std::size_t s=ownerVec.size(); │ │ │ │ │ -321 int pos=0; │ │ │ │ │ -322 if(s==0) │ │ │ │ │ -323 ownerVec.resize(1); // otherwise would read beyond the memory bound │ │ │ │ │ -324 MPI_Pack(&s, 1, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ -&pos, comm); │ │ │ │ │ -325 MPI_Pack(&(ownerVec[0]), s, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ -&pos, comm); │ │ │ │ │ -326 s = overlapVec.size(); │ │ │ │ │ -327 MPI_Pack(&s, 1, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ -&pos, comm); │ │ │ │ │ -328 for(auto i=overlapVec.begin(), end= overlapVec.end(); i != end; ++i) │ │ │ │ │ -329 MPI_Pack(const_cast(&(*i)), 1, MPITraits::getType(), sendBuf, │ │ │ │ │ -buffersize, &pos, comm); │ │ │ │ │ -330 │ │ │ │ │ -331 s=neighbors.size(); │ │ │ │ │ -332 MPI_Pack(&s, 1, MPITraits::getType(), sendBuf, buffersize, │ │ │ │ │ -&pos, comm); │ │ │ │ │ -333 │ │ │ │ │ -334 for(auto i=neighbors.begin(), end= neighbors.end(); i != end; ++i) │ │ │ │ │ -335 MPI_Pack(const_cast(&(*i)), 1, MPI_INT, sendBuf, buffersize, &pos, │ │ │ │ │ -comm); │ │ │ │ │ -336 } │ │ │ │ │ -345 template │ │ │ │ │ -346 void saveRecvBuf(char *recvBuf, int bufferSize, std::vector >& ownerVec, │ │ │ │ │ -347 std::set& overlapVec, std::set& neighbors, RedistributeInterface& │ │ │ │ │ -inf, int from, MPI_Comm comm) { │ │ │ │ │ -348 std::size_t size; │ │ │ │ │ -349 int pos=0; │ │ │ │ │ -350 // unpack owner vertices │ │ │ │ │ -351 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits:: │ │ │ │ │ -getType(), comm); │ │ │ │ │ -352 inf.reserveSpaceForReceiveInterface(from, size); │ │ │ │ │ -353 ownerVec.reserve(ownerVec.size()+size); │ │ │ │ │ -354 for(; size!=0; --size) { │ │ │ │ │ -355 GI gi; │ │ │ │ │ -356 MPI_Unpack(recvBuf, bufferSize, &pos, &gi, 1, MPITraits::getType(), │ │ │ │ │ -comm); │ │ │ │ │ -357 ownerVec.push_back(std::make_pair(gi,from)); │ │ │ │ │ -358 } │ │ │ │ │ -359 // unpack overlap vertices │ │ │ │ │ -360 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits:: │ │ │ │ │ -getType(), comm); │ │ │ │ │ -361 typename std::set::iterator ipos = overlapVec.begin(); │ │ │ │ │ -362 Dune::dverb << "unpacking "<::getType(), │ │ │ │ │ -comm); │ │ │ │ │ -366 ipos=overlapVec.insert(ipos, gi); │ │ │ │ │ -367 } │ │ │ │ │ -368 //unpack neighbors │ │ │ │ │ -369 MPI_Unpack(recvBuf, bufferSize, &pos, &size, 1, MPITraits:: │ │ │ │ │ -getType(), comm); │ │ │ │ │ -370 Dune::dverb << "unpacking "<::iterator npos = neighbors.begin(); │ │ │ │ │ -372 for(; size!=0; --size) { │ │ │ │ │ -373 int n; │ │ │ │ │ -374 MPI_Unpack(recvBuf, bufferSize, &pos, &n, 1, MPI_INT, comm); │ │ │ │ │ -375 npos=neighbors.insert(npos, n); │ │ │ │ │ -376 } │ │ │ │ │ -377 } │ │ │ │ │ -378 │ │ │ │ │ -392 template │ │ │ │ │ -393 void getDomain(const MPI_Comm& comm, T *part, int numOfOwnVtx, int nparts, │ │ │ │ │ -int *myDomain, std::vector &domainMapping) { │ │ │ │ │ -394 int npes, mype; │ │ │ │ │ -395 MPI_Comm_size(comm, &npes); │ │ │ │ │ -396 MPI_Comm_rank(comm, &mype); │ │ │ │ │ -397 MPI_Status status; │ │ │ │ │ -398 │ │ │ │ │ -399 *myDomain = -1; │ │ │ │ │ -400 int i=0; │ │ │ │ │ -401 int j=0; │ │ │ │ │ -402 │ │ │ │ │ -403 std::vector domain(nparts, 0); │ │ │ │ │ -404 std::vector assigned(npes, 0); │ │ │ │ │ -405 // init domain Mapping │ │ │ │ │ -406 domainMapping.assign(domainMapping.size(), -1); │ │ │ │ │ -407 │ │ │ │ │ -408 // count the occurrence of domains │ │ │ │ │ -409 for (i=0; i domainMatrix(npes * nparts, -1); │ │ │ │ │ -414 │ │ │ │ │ -415 // init buffer with the own domain │ │ │ │ │ -416 int *buf = new int[nparts]; │ │ │ │ │ -417 for (i=0; i unassigned; │ │ │ │ │ -442 │ │ │ │ │ -443 for(i=0; i::iterator next_free = assigned.begin(); │ │ │ │ │ -472 │ │ │ │ │ -473 for(auto udomain = unassigned.begin(), │ │ │ │ │ -474 end = unassigned.end(); udomain != end; ++udomain) │ │ │ │ │ -475 { │ │ │ │ │ -476 next_free = std::find_if(next_free, assigned.end(), std::bind(std:: │ │ │ │ │ -less(), std::placeholders::_1, 1)); │ │ │ │ │ -477 assert(next_free != assigned.end()); │ │ │ │ │ -478 domainMapping[*udomain] = next_free-assigned.begin(); │ │ │ │ │ -479 *next_free = 1; │ │ │ │ │ -480 } │ │ │ │ │ -481 } │ │ │ │ │ -482 │ │ │ │ │ -483 struct SortFirst │ │ │ │ │ -484 { │ │ │ │ │ -485 template │ │ │ │ │ -486 bool operator()(const T& t1, const T& t2) const │ │ │ │ │ -487 { │ │ │ │ │ -488 return t1 │ │ │ │ │ -504 void mergeVec(std::vector >& ownerVec, std::set& │ │ │ │ │ -overlapSet) { │ │ │ │ │ -505 │ │ │ │ │ -506#ifdef DEBUG_REPART │ │ │ │ │ -507 // Safety check for duplicates. │ │ │ │ │ -508 if(ownerVec.size()>0) │ │ │ │ │ -509 { │ │ │ │ │ -510 auto old=ownerVec.begin(); │ │ │ │ │ -511 for(auto i=old+1, end=ownerVec.end(); i != end; old=i++) │ │ │ │ │ -512 { │ │ │ │ │ -513 if(i->first==old->first) │ │ │ │ │ -514 { │ │ │ │ │ -515 std::cerr<<"Value at indes"<first<<","<second<<"]==[" │ │ │ │ │ -517 <first<<","<second<<"]"<first<*s) ++v; │ │ │ │ │ -529 if(v!=vend && v->first==*s) { │ │ │ │ │ -530 // Move to the next element before erasing │ │ │ │ │ -531 // thus s stays valid! │ │ │ │ │ -532 auto tmp=s; │ │ │ │ │ -533 ++s; │ │ │ │ │ -534 overlapSet.erase(tmp); │ │ │ │ │ -535 }else │ │ │ │ │ -536 ++s; │ │ │ │ │ -537 } │ │ │ │ │ -538 } │ │ │ │ │ -539 │ │ │ │ │ -540 │ │ │ │ │ -554 template │ │ │ │ │ -555 void getNeighbor(const Graph& g, std::vector& part, │ │ │ │ │ -556 typename Graph::VertexDescriptor vtx, const IS& indexSet, │ │ │ │ │ -557 int toPe, std::set& neighbor, std::set& neighborProcs) { │ │ │ │ │ -558 for(auto edge=g.beginEdges(vtx), end=g.endEdges(vtx); edge!=end; ++edge) │ │ │ │ │ -559 { │ │ │ │ │ -560 const typename IS::IndexPair* pindex = indexSet.pair(edge.target()); │ │ │ │ │ -561 assert(pindex); │ │ │ │ │ -562 if(part[pindex->local()]!=toPe || !OwnerSet::contains(pindex->local │ │ │ │ │ -().attribute())) │ │ │ │ │ -563 { │ │ │ │ │ -564 // is sent to another process and therefore becomes overlap │ │ │ │ │ -565 neighbor.insert(pindex->global()); │ │ │ │ │ -566 neighborProcs.insert(part[pindex->local()]); │ │ │ │ │ -567 } │ │ │ │ │ -568 } │ │ │ │ │ -569 } │ │ │ │ │ -570 │ │ │ │ │ -571 template │ │ │ │ │ -572 void my_push_back(std::vector& ownerVec, const I& index, [ │ │ │ │ │ -[maybe_unused]] int proc) │ │ │ │ │ -573 { │ │ │ │ │ -574 ownerVec.push_back(index); │ │ │ │ │ -575 } │ │ │ │ │ -576 │ │ │ │ │ -577 template │ │ │ │ │ -578 void my_push_back(std::vector >& ownerVec, const I& index, │ │ │ │ │ -int proc) │ │ │ │ │ -579 { │ │ │ │ │ -580 ownerVec.push_back(std::make_pair(index,proc)); │ │ │ │ │ -581 } │ │ │ │ │ -582 template │ │ │ │ │ -583 void reserve(std::vector&, RedistributeInterface&, int) │ │ │ │ │ -584 {} │ │ │ │ │ -585 template │ │ │ │ │ -586 void reserve(std::vector >& ownerVec, │ │ │ │ │ -RedistributeInterface& redist, int proc) │ │ │ │ │ -587 { │ │ │ │ │ -588 redist.reserveSpaceForReceiveInterface(proc, ownerVec.size()); │ │ │ │ │ -589 } │ │ │ │ │ -590 │ │ │ │ │ -591 │ │ │ │ │ -609 template │ │ │ │ │ -610 void getOwnerOverlapVec(const G& graph, std::vector& part, IS& │ │ │ │ │ -indexSet, │ │ │ │ │ -611 [[maybe_unused]] int myPe, int toPe, std::vector& ownerVec, std:: │ │ │ │ │ -set& overlapSet, │ │ │ │ │ -612 RedistributeInterface& redist, std::set& neighborProcs) { │ │ │ │ │ -613 for(auto index = indexSet.begin(); index != indexSet.end(); ++index) { │ │ │ │ │ -614 // Only Process owner vertices, the others are not in the parmetis graph. │ │ │ │ │ -615 if(OwnerSet::contains(index->local().attribute())) │ │ │ │ │ -616 { │ │ │ │ │ -617 if(part[index->local()]==toPe) │ │ │ │ │ -618 { │ │ │ │ │ -619 getNeighbor(graph, part, index->local(), indexSet, │ │ │ │ │ -620 toPe, overlapSet, neighborProcs); │ │ │ │ │ -621 my_push_back(ownerVec, index->global(), toPe); │ │ │ │ │ -622 } │ │ │ │ │ -623 } │ │ │ │ │ -624 } │ │ │ │ │ -625 reserve(ownerVec, redist, toPe); │ │ │ │ │ -626 │ │ │ │ │ -627 } │ │ │ │ │ -628 │ │ │ │ │ -629 │ │ │ │ │ -636 template │ │ │ │ │ -637 inline bool isOwner(IS& indexSet, int index) { │ │ │ │ │ -638 │ │ │ │ │ -639 const typename IS::IndexPair* pindex=indexSet.pair(index); │ │ │ │ │ -640 │ │ │ │ │ -641 assert(pindex); │ │ │ │ │ -642 return F::contains(pindex->local().attribute()); │ │ │ │ │ -643 } │ │ │ │ │ -644 │ │ │ │ │ -645 │ │ │ │ │ -646 class BaseEdgeFunctor │ │ │ │ │ -647 { │ │ │ │ │ -648 public: │ │ │ │ │ -649 BaseEdgeFunctor(Metis::idx_t* adj,const ParmetisDuneIndexMap& data) │ │ │ │ │ -650 : i_(), adj_(adj), data_(data) │ │ │ │ │ -651 {} │ │ │ │ │ -652 │ │ │ │ │ -653 template │ │ │ │ │ -654 void operator()(const T& edge) │ │ │ │ │ -655 { │ │ │ │ │ -656 // Get the egde weight │ │ │ │ │ -657 // const Weight& weight=edge.weight(); │ │ │ │ │ -658 adj_[i_] = data_.toParmetis(edge.target()); │ │ │ │ │ -659 i_++; │ │ │ │ │ -660 } │ │ │ │ │ -661 std::size_t index() │ │ │ │ │ -662 { │ │ │ │ │ -663 return i_; │ │ │ │ │ -664 } │ │ │ │ │ -665 │ │ │ │ │ -666 private: │ │ │ │ │ -667 std::size_t i_; │ │ │ │ │ -668 Metis::idx_t* adj_; │ │ │ │ │ -669 const ParmetisDuneIndexMap& data_; │ │ │ │ │ -670 }; │ │ │ │ │ -671 │ │ │ │ │ -672 template │ │ │ │ │ -673 struct EdgeFunctor │ │ │ │ │ -674 : public BaseEdgeFunctor │ │ │ │ │ -675 { │ │ │ │ │ -676 EdgeFunctor(Metis::idx_t* adj, const ParmetisDuneIndexMap& data, std:: │ │ │ │ │ -size_t) │ │ │ │ │ -677 : BaseEdgeFunctor(adj, data) │ │ │ │ │ -678 {} │ │ │ │ │ -679 │ │ │ │ │ -680 Metis::idx_t* getWeights() │ │ │ │ │ -681 { │ │ │ │ │ -682 return NULL; │ │ │ │ │ -683 } │ │ │ │ │ -684 void free(){} │ │ │ │ │ -685 }; │ │ │ │ │ -686 │ │ │ │ │ -687 template │ │ │ │ │ -688 class EdgeFunctor<_D_u_n_e::Amg::PropertiesGraph > │ │ │ │ │ -689 : public BaseEdgeFunctor │ │ │ │ │ -690 { │ │ │ │ │ -691 public: │ │ │ │ │ -692 EdgeFunctor(Metis::idx_t* adj, const ParmetisDuneIndexMap& data, std:: │ │ │ │ │ -size_t s) │ │ │ │ │ -693 : BaseEdgeFunctor(adj, data) │ │ │ │ │ -694 { │ │ │ │ │ -695 weight_=new Metis::idx_t[s]; │ │ │ │ │ -696 } │ │ │ │ │ -697 │ │ │ │ │ -698 template │ │ │ │ │ -699 void operator()(const T& edge) │ │ │ │ │ -700 { │ │ │ │ │ -701 weight_[index()]=edge.properties().depends() ? 3 : 1; │ │ │ │ │ -702 BaseEdgeFunctor::operator()(edge); │ │ │ │ │ -703 } │ │ │ │ │ -704 Metis::idx_t* getWeights() │ │ │ │ │ -705 { │ │ │ │ │ -706 return weight_; │ │ │ │ │ -707 } │ │ │ │ │ -708 void free(){ │ │ │ │ │ -709 if(weight_!=0) { │ │ │ │ │ -710 delete weight_; │ │ │ │ │ -711 weight_=0; │ │ │ │ │ -712 } │ │ │ │ │ -713 } │ │ │ │ │ -714 private: │ │ │ │ │ -715 Metis::idx_t* weight_; │ │ │ │ │ -716 }; │ │ │ │ │ -717 │ │ │ │ │ -718 │ │ │ │ │ -719 │ │ │ │ │ -733 template │ │ │ │ │ -734 void getAdjArrays(G& graph, IS& indexSet, Metis::idx_t *xadj, │ │ │ │ │ -735 EW& ew) │ │ │ │ │ -736 { │ │ │ │ │ -737 int j=0; │ │ │ │ │ -738 auto vend = graph.end(); │ │ │ │ │ -739 │ │ │ │ │ -740 for(auto vertex = graph.begin(); vertex != vend; ++vertex) { │ │ │ │ │ -741 if (isOwner(indexSet,*vertex)) { │ │ │ │ │ -742 // The type of const edge iterator. │ │ │ │ │ -743 auto eend = vertex.end(); │ │ │ │ │ -744 xadj[j] = ew.index(); │ │ │ │ │ -745 j++; │ │ │ │ │ -746 for(auto edge = vertex.begin(); edge != eend; ++edge) { │ │ │ │ │ -747 ew(edge); │ │ │ │ │ -748 } │ │ │ │ │ -749 } │ │ │ │ │ -750 } │ │ │ │ │ -751 xadj[j] = ew.index(); │ │ │ │ │ -752 } │ │ │ │ │ -753 } // end anonymous namespace │ │ │ │ │ -754 │ │ │ │ │ -755 template │ │ │ │ │ -756 bool _b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n(const G& graph, std::vector& realparts, │ │ │ │ │ -757 _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, │ │ │ │ │ -758 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ -759 RedistributeInterface& redistInf, │ │ │ │ │ -760 bool verbose=false); │ │ │ │ │ -761#if HAVE_PARMETIS │ │ │ │ │ -762#ifndef METIS_VER_MAJOR │ │ │ │ │ -763 extern "C" │ │ │ │ │ -764 { │ │ │ │ │ -765 // backwards compatibility to parmetis < 4.0.0 │ │ │ │ │ -766 void METIS_PartGraphKway(int *nvtxs, Metis::idx_t *xadj, Metis::idx_t │ │ │ │ │ -*adjncy, Metis::idx_t *vwgt, │ │ │ │ │ -767 Metis::idx_t *adjwgt, int *wgtflag, int *numflag, int *nparts, │ │ │ │ │ -768 int *options, int *edgecut, Metis::idx_t *part); │ │ │ │ │ -769 │ │ │ │ │ -770 void METIS_PartGraphRecursive(int *nvtxs, Metis::idx_t *xadj, Metis::idx_t │ │ │ │ │ -*adjncy, Metis::idx_t *vwgt, │ │ │ │ │ -771 Metis::idx_t *adjwgt, int *wgtflag, int *numflag, int *nparts, │ │ │ │ │ -772 int *options, int *edgecut, Metis::idx_t *part); │ │ │ │ │ -773 } │ │ │ │ │ -774#endif │ │ │ │ │ -775#endif // HAVE_PARMETIS │ │ │ │ │ -776 │ │ │ │ │ -777 template │ │ │ │ │ -_7_7_8 inline void _p_r_i_n_t___c_a_r_r_a_y(S& os, T* array, std::size_t l) │ │ │ │ │ -779 { │ │ │ │ │ -780 for(T *cur=array, *end=array+l; cur!=end; ++cur) │ │ │ │ │ -781 os<<*cur<<" "; │ │ │ │ │ -782 } │ │ │ │ │ -783 │ │ │ │ │ -784 template │ │ │ │ │ -_7_8_5 inline bool _i_s_V_a_l_i_d_G_r_a_p_h(std::size_t noVtx, std::size_t gnoVtx, S noEdges, │ │ │ │ │ -T* xadj, │ │ │ │ │ -786 T* adjncy, bool checkSymmetry) │ │ │ │ │ -787 { │ │ │ │ │ -788 bool correct=true; │ │ │ │ │ -789 │ │ │ │ │ -790 using std::signbit; │ │ │ │ │ -791 for(_M_e_t_i_s_:_:_i_d_x___t vtx=0; vtx<(_M_e_t_i_s_:_:_i_d_x___t)noVtx; ++vtx) { │ │ │ │ │ -792 if(static_cast(xadj[vtx])>noEdges || signbit(xadj[vtx])) { │ │ │ │ │ -793 std::cerr <<"Check graph: xadj["<" │ │ │ │ │ -794 <(xadj[vtx+1])>noEdges || signbit(xadj[vtx+1])) { │ │ │ │ │ -798 std::cerr <<"Check graph: xadj["<" │ │ │ │ │ -799 <gnoVtx) { │ │ │ │ │ -805 std::cerr<<" Edge "< │ │ │ │ │ -_8_2_9 bool _c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(const M& _m_a_t, _D_u_n_e_:_: │ │ │ │ │ -_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, │ │ │ │ │ -830 _M_e_t_i_s_:_:_i_d_x___t nparts, │ │ │ │ │ -831 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ -832 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& redistInf, │ │ │ │ │ -833 bool verbose=false) │ │ │ │ │ -834 { │ │ │ │ │ -835 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -836 std::cout<<"Repartitioning from "<1) { │ │ │ │ │ -847 │ │ │ │ │ -848 part[0]=rank; │ │ │ │ │ -849 │ │ │ │ │ -850 { // sublock for automatic memory deletion │ │ │ │ │ -851 │ │ │ │ │ -852 // Build the graph of the communication scheme and create an appropriate │ │ │ │ │ -indexset. │ │ │ │ │ -853 // calculate the neighbour vertices │ │ │ │ │ -854 int noNeighbours = oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().neighbours(); │ │ │ │ │ -855 │ │ │ │ │ -856 for(auto n= oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().begin(); n != oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().end │ │ │ │ │ -(); │ │ │ │ │ -857 ++n) │ │ │ │ │ -858 if(n->first==rank) { │ │ │ │ │ -859 //do not include ourselves. │ │ │ │ │ -860 --noNeighbours; │ │ │ │ │ -861 break; │ │ │ │ │ -862 } │ │ │ │ │ -863 │ │ │ │ │ -864 // A parmetis graph representing the communication graph. │ │ │ │ │ -865 // The diagonal entries are the number of nodes on the process. │ │ │ │ │ -866 // The offdiagonal entries are the number of edges leading to other │ │ │ │ │ -processes. │ │ │ │ │ -867 │ │ │ │ │ -868 _M_e_t_i_s_:_:_i_d_x___t *xadj=new _M_e_t_i_s_:_:_i_d_x___t[2]; │ │ │ │ │ -869 _M_e_t_i_s_:_:_i_d_x___t *vtxdist=new _M_e_t_i_s_:_:_i_d_x___t[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()+1]; │ │ │ │ │ -870 _M_e_t_i_s_:_:_i_d_x___t *adjncy=new _M_e_t_i_s_:_:_i_d_x___t[noNeighbours]; │ │ │ │ │ -871#ifdef USE_WEIGHTS │ │ │ │ │ -872 _M_e_t_i_s_:_:_i_d_x___t *vwgt = 0; │ │ │ │ │ -873 _M_e_t_i_s_:_:_i_d_x___t *adjwgt = 0; │ │ │ │ │ -874#endif │ │ │ │ │ -875 │ │ │ │ │ -876 // each process has exactly one vertex! │ │ │ │ │ -877 for(int i=0; i owner(mat.N(), oocomm.communicator().rank()); │ │ │ │ │ -887 // for(NeighbourIterator n= oocomm.remoteIndices().begin(); n != │ │ │ │ │ -oocomm.remoteIndices().end(); │ │ │ │ │ -888 // ++n) │ │ │ │ │ -889 // { │ │ │ │ │ -890 // if(n->first!=oocomm.communicator().rank()){ │ │ │ │ │ -891 // typedef typename RemoteIndices::RemoteIndexList RIList; │ │ │ │ │ -892 // const RIList& rlist = *(n->second.first); │ │ │ │ │ -893 // typedef typename RIList::const_iterator LIter; │ │ │ │ │ -894 // for(LIter entry=rlist.begin(); entry!=rlist.end(); ++entry){ │ │ │ │ │ -895 // if(entry->attribute()==OwnerOverlapCopyAttributeSet::owner) │ │ │ │ │ -896 // owner[entry->localIndexPair().local()] = n->first; │ │ │ │ │ -897 // } │ │ │ │ │ -898 // } │ │ │ │ │ -899 // } │ │ │ │ │ -900 │ │ │ │ │ -901 // std::map edgecount; // edges to other processors │ │ │ │ │ -902 // typedef typename M::ConstRowIterator RIter; │ │ │ │ │ -903 // typedef typename M::ConstColIterator CIter; │ │ │ │ │ -904 │ │ │ │ │ -905 // // calculate edge count │ │ │ │ │ -906 // for(RIter row=mat.begin(), endr=mat.end(); row != endr; ++row) │ │ │ │ │ -907 // if(owner[row.index()]==OwnerOverlapCopyAttributeSet::owner) │ │ │ │ │ -908 // for(CIter entry= row->begin(), ende = row->end(); entry != ende; │ │ │ │ │ -++entry) │ │ │ │ │ -909 // ++edgecount[owner[entry.index()]]; │ │ │ │ │ -910 │ │ │ │ │ -911 // setup edge and weight pattern │ │ │ │ │ -912 │ │ │ │ │ -913 _M_e_t_i_s_:_:_i_d_x___t* adjp=adjncy; │ │ │ │ │ -914 │ │ │ │ │ -915#ifdef USE_WEIGHTS │ │ │ │ │ -916 vwgt = new _M_e_t_i_s_:_:_i_d_x___t[1]; │ │ │ │ │ -917 vwgt[0]= _m_a_t.N(); // weight is numer of rows TODO: Should actually be the │ │ │ │ │ -nonzeros. │ │ │ │ │ -918 │ │ │ │ │ -919 adjwgt = new _M_e_t_i_s_:_:_i_d_x___t[noNeighbours]; │ │ │ │ │ -920 _M_e_t_i_s_:_:_i_d_x___t* adjwp=adjwgt; │ │ │ │ │ -921#endif │ │ │ │ │ -922 │ │ │ │ │ -923 for(auto n= oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().begin(); n != oocomm._r_e_m_o_t_e_I_n_d_i_c_e_s().end │ │ │ │ │ -(); │ │ │ │ │ -924 ++n) │ │ │ │ │ -925 if(n->first != rank) { │ │ │ │ │ -926 *adjp=n->first; │ │ │ │ │ -927 ++adjp; │ │ │ │ │ -928#ifdef USE_WEIGHTS │ │ │ │ │ -929 *adjwp=1; //edgecount[n->first]; │ │ │ │ │ -930 ++adjwp; │ │ │ │ │ -931#endif │ │ │ │ │ -932 } │ │ │ │ │ -933 assert(_i_s_V_a_l_i_d_G_r_a_p_h(vtxdist[rank+1]-vtxdist[rank], │ │ │ │ │ -934 vtxdist[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()], │ │ │ │ │ -935 noNeighbours, xadj, adjncy, false)); │ │ │ │ │ -936 │ │ │ │ │ -937 [[maybe_unused]] _M_e_t_i_s_:_:_i_d_x___t wgtflag=0; │ │ │ │ │ -938 _M_e_t_i_s_:_:_i_d_x___t numflag=0; │ │ │ │ │ -939 _M_e_t_i_s_:_:_i_d_x___t edgecut; │ │ │ │ │ -940#ifdef USE_WEIGHTS │ │ │ │ │ -941 wgtflag=3; │ │ │ │ │ -942#endif │ │ │ │ │ -943 _M_e_t_i_s_:_:_r_e_a_l___t *tpwgts = new _M_e_t_i_s_:_:_r_e_a_l___t[nparts]; │ │ │ │ │ -944 for(int i=0; i::getType(), │ │ │ │ │ -1071 gxadj,noxs,xdispl,MPITraits::getType(), │ │ │ │ │ -1072 comm); │ │ │ │ │ -1073 MPI_Allgatherv(adjncy,noNeighbours,MPITraits::getType(), │ │ │ │ │ -1074 gadjncy,noedges,displ,MPITraits::getType(), │ │ │ │ │ -1075 comm); │ │ │ │ │ -1076#ifdef USE_WEIGHTS │ │ │ │ │ -1077 MPI_Allgatherv(adjwgt,noNeighbours,MPITraits::getType(), │ │ │ │ │ -1078 gadjwgt,noedges,displ,MPITraits::getType(), │ │ │ │ │ -1079 comm); │ │ │ │ │ -1080 MPI_Allgatherv(vwgt,localNoVtx,MPITraits::getType(), │ │ │ │ │ -1081 gvwgt,novs,vdispl,MPITraits::getType(), │ │ │ │ │ -1082 comm); │ │ │ │ │ -1083#endif │ │ │ │ │ -1084 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1085 std::cout<<"Gathering global graph data took "<(gxadjlen)); │ │ │ │ │ -1103 increment = *(start-1); │ │ │ │ │ -1104 std::transform(start+offset, start+l+offset, start, std::bind(std:: │ │ │ │ │ -plus(), std::placeholders::_1, increment)); │ │ │ │ │ -1105 } │ │ │ │ │ -1106 Dune::dinfo<= 5 │ │ │ │ │ -1130 _M_e_t_i_s_:_:_i_d_x___t ncon = 1; │ │ │ │ │ -1131 _M_e_t_i_s_:_:_i_d_x___t moptions[METIS_NOPTIONS]; │ │ │ │ │ -1132 METIS_SetDefaultOptions(moptions); │ │ │ │ │ -1133 moptions[METIS_OPTION_NUMBERING] = numflag; │ │ │ │ │ -1134 METIS_PartGraphRecursive(&noVertices, &ncon, gxadj, gadjncy, gvwgt, NULL, │ │ │ │ │ -gadjwgt, │ │ │ │ │ -1135 &nparts, NULL, NULL, moptions, &edgecut, gpart); │ │ │ │ │ -1136#else │ │ │ │ │ -1137 int options[5] = {0, 1, 1, 3, 3}; │ │ │ │ │ -1138 // Call metis │ │ │ │ │ -1139 METIS_PartGraphRecursive(&noVertices, gxadj, gadjncy, gvwgt, gadjwgt, │ │ │ │ │ -&wgtflag, │ │ │ │ │ -1140 &numflag, &nparts, options, &edgecut, gpart); │ │ │ │ │ -1141#endif │ │ │ │ │ -1142 │ │ │ │ │ -1143 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1144 std::cout<<"METIS took "<::getType(), part, 1, │ │ │ │ │ -1159 MPITraits::getType(), 0, comm); │ │ │ │ │ -1160 │ │ │ │ │ -1161 { │ │ │ │ │ -1162 // release remaining memory │ │ │ │ │ -1163 delete[] gpart; │ │ │ │ │ -1164 delete[] noedges; │ │ │ │ │ -1165 delete[] displ; │ │ │ │ │ -1166 } │ │ │ │ │ -1167 │ │ │ │ │ -1168 │ │ │ │ │ -1169#endif │ │ │ │ │ -1170 delete[] xadj; │ │ │ │ │ -1171 delete[] vtxdist; │ │ │ │ │ -1172 delete[] adjncy; │ │ │ │ │ -1173#ifdef USE_WEIGHTS │ │ │ │ │ -1174 delete[] vwgt; │ │ │ │ │ -1175 delete[] adjwgt; │ │ │ │ │ -1176#endif │ │ │ │ │ -1177 delete[] tpwgts; │ │ │ │ │ -1178 } │ │ │ │ │ -1179 }else{ │ │ │ │ │ -1180 part[0]=0; │ │ │ │ │ -1181 } │ │ │ │ │ -1182#endif │ │ │ │ │ -1183 Dune::dinfo<<" repart "< "<< part[0]< realpart(_m_a_t.N(), part[0]); │ │ │ │ │ -1186 delete[] part; │ │ │ │ │ -1187 │ │ │ │ │ -1188 oocomm._c_o_p_y_O_w_n_e_r_T_o_A_l_l(realpart, realpart); │ │ │ │ │ -1189 │ │ │ │ │ -1190 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1191 std::cout<<"Scattering repartitioning took "< graph(const_cast(_m_a_t)); │ │ │ │ │ -1197 _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(graph, oocomm); │ │ │ │ │ -1198 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1199 std::cout<<"Filling index set took "< │ │ │ │ │ -_1_2_3_5 bool _g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(const G& graph, _D_u_n_e_:_: │ │ │ │ │ -_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, _M_e_t_i_s_:_:_i_d_x___t nparts, │ │ │ │ │ -1236 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ -1237 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& redistInf, │ │ │ │ │ -1238 bool verbose=false) │ │ │ │ │ -1239 { │ │ │ │ │ -1240 Timer time; │ │ │ │ │ -1241 │ │ │ │ │ -1242 MPI_Comm comm=oocomm._c_o_m_m_u_n_i_c_a_t_o_r(); │ │ │ │ │ -1243 oocomm._b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(graph.noVertices()); │ │ │ │ │ -1244 _f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s(graph, oocomm); │ │ │ │ │ -1245 │ │ │ │ │ -1246 if(verbose && oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1247 std::cout<<"Filling holes took "<(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size())); │ │ │ │ │ -1262 │ │ │ │ │ -1263 int myDomain = -1; │ │ │ │ │ -1264 │ │ │ │ │ -1265 // │ │ │ │ │ -1266 // 1) Prepare the required parameters for using ParMETIS │ │ │ │ │ -1267 // Especially the arrays that represent the graph must be │ │ │ │ │ -1268 // generated by the DUNE Graph and IndexSet input variables. │ │ │ │ │ -1269 // These are the arrays: │ │ │ │ │ -1270 // - vtxdist │ │ │ │ │ -1271 // - xadj │ │ │ │ │ -1272 // - adjncy │ │ │ │ │ -1273 // │ │ │ │ │ -1274 // │ │ │ │ │ -1275#ifdef PERF_REPART │ │ │ │ │ -1276 // reset timer for step 1) │ │ │ │ │ -1277 t1=MPI_Wtime(); │ │ │ │ │ -1278#endif │ │ │ │ │ -1279 │ │ │ │ │ -1280 │ │ │ │ │ -1281 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> OOComm; │ │ │ │ │ -1282 typedef typename OOComm::OwnerSet OwnerSet; │ │ │ │ │ -1283 │ │ │ │ │ -1284 // Create the vtxdist array and parmetisVtxMapping. │ │ │ │ │ -1285 // Global communications are necessary │ │ │ │ │ -1286 // The parmetis global identifiers for the owner vertices. │ │ │ │ │ -1287 ParmetisDuneIndexMap indexMap(graph,oocomm); │ │ │ │ │ -1288 _M_e_t_i_s_:_:_i_d_x___t *part = new _M_e_t_i_s_:_:_i_d_x___t[indexMap.numOfOwnVtx()]; │ │ │ │ │ -1289 for(std::size_t i=0; i < indexMap.numOfOwnVtx(); ++i) │ │ │ │ │ -1290 part[i]=mype; │ │ │ │ │ -1291 │ │ │ │ │ -1292#if !HAVE_PARMETIS │ │ │ │ │ -1293 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0 && nparts>1) │ │ │ │ │ -1294 std::cerr<<"ParMETIS not activated. Will repartition to 1 domain instead │ │ │ │ │ -of requested " │ │ │ │ │ -1295 <1) { │ │ │ │ │ -1301 // Create the xadj and adjncy arrays │ │ │ │ │ -1302 _M_e_t_i_s_:_:_i_d_x___t *xadj = new _M_e_t_i_s_:_:_i_d_x___t[indexMap.numOfOwnVtx()+1]; │ │ │ │ │ -1303 _M_e_t_i_s_:_:_i_d_x___t *adjncy = new _M_e_t_i_s_:_:_i_d_x___t[graph.noEdges()]; │ │ │ │ │ -1304 EdgeFunctor ef(adjncy, indexMap, graph.noEdges()); │ │ │ │ │ -1305 getAdjArrays(graph, oocomm._g_l_o_b_a_l_L_o_o_k_u_p(), xadj, ef); │ │ │ │ │ -1306 │ │ │ │ │ -1307 // │ │ │ │ │ -1308 // 2) Call ParMETIS │ │ │ │ │ -1309 // │ │ │ │ │ -1310 // │ │ │ │ │ -1311 _M_e_t_i_s_:_:_i_d_x___t numflag=0, wgtflag=0, options[3], edgecut=0, ncon=1; │ │ │ │ │ -1312 //float *tpwgts = NULL; │ │ │ │ │ -1313 _M_e_t_i_s_:_:_r_e_a_l___t *tpwgts = new _M_e_t_i_s_:_:_r_e_a_l___t[nparts]; │ │ │ │ │ -1314 for(int i=0; i(comm)); │ │ │ │ │ -1358 │ │ │ │ │ -1359 │ │ │ │ │ -1360 delete[] xadj; │ │ │ │ │ -1361 delete[] adjncy; │ │ │ │ │ -1362 delete[] tpwgts; │ │ │ │ │ -1363 │ │ │ │ │ -1364 ef.free(); │ │ │ │ │ -1365 │ │ │ │ │ -1366#ifdef DEBUG_REPART │ │ │ │ │ -1367 if (mype == 0) { │ │ │ │ │ -1368 std::cout< domainMapping(nparts); │ │ │ │ │ -1410 if(nparts>1) │ │ │ │ │ -1411 getDomain(comm, part, indexMap.numOfOwnVtx(), nparts, &myDomain, │ │ │ │ │ -domainMapping); │ │ │ │ │ -1412 else │ │ │ │ │ -1413 domainMapping[0]=0; │ │ │ │ │ -1414 │ │ │ │ │ -1415#ifdef DEBUG_REPART │ │ │ │ │ -1416 std::cout< setPartition(oocomm._i_n_d_e_x_S_e_t().size(), -1); │ │ │ │ │ -1429 │ │ │ │ │ -1430 std::size_t i=0; // parmetis index │ │ │ │ │ -1431 for(auto index = oocomm._i_n_d_e_x_S_e_t().begin(); index != oocomm._i_n_d_e_x_S_e_t().end │ │ │ │ │ -(); ++index) │ │ │ │ │ -1432 if(OwnerSet::contains(index->local().attribute())) { │ │ │ │ │ -1433 setPartition[index->local()]=domainMapping[part[i++]]; │ │ │ │ │ -1434 } │ │ │ │ │ -1435 │ │ │ │ │ -1436 delete[] part; │ │ │ │ │ -1437 oocomm._c_o_p_y_O_w_n_e_r_T_o_A_l_l(setPartition, setPartition); │ │ │ │ │ -1438 // communication only needed for ALU │ │ │ │ │ -1439 // (ghosts with same global id as owners on the same process) │ │ │ │ │ -1440 if (SolverCategory::category(oocomm) == │ │ │ │ │ -1441 static_cast(SolverCategory::nonoverlapping)) │ │ │ │ │ -1442 oocomm._c_o_p_y_C_o_p_y_T_o_A_l_l(setPartition, setPartition); │ │ │ │ │ -1443 bool ret = _b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n(graph, setPartition, oocomm, outcomm, │ │ │ │ │ -redistInf, │ │ │ │ │ -1444 verbose); │ │ │ │ │ -1445 if(verbose) { │ │ │ │ │ -1446 oocomm._c_o_m_m_u_n_i_c_a_t_o_r().barrier(); │ │ │ │ │ -1447 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1448 std::cout<<"Creating indexsets took "< │ │ │ │ │ -_1_4_5_6 bool _b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n(const G& graph, │ │ │ │ │ -1457 std::vector& setPartition, _D_u_n_e_:_: │ │ │ │ │ -_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>& oocomm, │ │ │ │ │ -1458 std::shared_ptr<_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_>>& outcomm, │ │ │ │ │ -1459 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& redistInf, │ │ │ │ │ -1460 bool verbose) │ │ │ │ │ -1461 { │ │ │ │ │ -1462 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_1_,_T_2_> OOComm; │ │ │ │ │ -1463 typedef typename OOComm::OwnerSet OwnerSet; │ │ │ │ │ -1464 │ │ │ │ │ -1465 Timer time; │ │ │ │ │ -1466 │ │ │ │ │ -1467 // Build the send interface │ │ │ │ │ -1468 redistInf._b_u_i_l_d_S_e_n_d_I_n_t_e_r_f_a_c_e(setPartition, oocomm._i_n_d_e_x_S_e_t()); │ │ │ │ │ -1469 │ │ │ │ │ -1470#ifdef PERF_REPART │ │ │ │ │ -1471 // stop the time for step 3) │ │ │ │ │ -1472 t3=MPI_Wtime()-t3; │ │ │ │ │ -1473 // reset timer for step 4) │ │ │ │ │ -1474 t4=MPI_Wtime(); │ │ │ │ │ -1475#endif │ │ │ │ │ -1476 │ │ │ │ │ -1477 │ │ │ │ │ -1478 // │ │ │ │ │ -1479 // 4) Create the output IndexSet and RemoteIndices │ │ │ │ │ -1480 // 4.1) Determine the "send to" and "receive from" relation │ │ │ │ │ -1481 // according to the new partition using a MPI ring │ │ │ │ │ -1482 // communication. │ │ │ │ │ -1483 // │ │ │ │ │ -1484 // 4.2) Depends on the "send to" and "receive from" vector, │ │ │ │ │ -1485 // the processes will exchange the vertices each other │ │ │ │ │ -1486 // │ │ │ │ │ -1487 // 4.3) Create the IndexSet, RemoteIndices and the new MPI │ │ │ │ │ -1488 // communicator │ │ │ │ │ -1489 // │ │ │ │ │ -1490 │ │ │ │ │ -1491 // │ │ │ │ │ -1492 // 4.1) Let's start... │ │ │ │ │ -1493 // │ │ │ │ │ -1494 int npes = oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size(); │ │ │ │ │ -1495 int *sendTo = 0; │ │ │ │ │ -1496 int noSendTo = 0; │ │ │ │ │ -1497 std::set recvFrom; │ │ │ │ │ -1498 │ │ │ │ │ -1499 // the max number of vertices is stored in the sendTo buffer, │ │ │ │ │ -1500 // not the number of vertices to send! Because the max number of Vtx │ │ │ │ │ -1501 // is used as the fixed buffer size by the MPI send/receive calls │ │ │ │ │ -1502 │ │ │ │ │ -1503 int mype = oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank(); │ │ │ │ │ -1504 │ │ │ │ │ -1505 { │ │ │ │ │ -1506 std::set tsendTo; │ │ │ │ │ -1507 for(auto i=setPartition.begin(), iend = setPartition.end(); i!=iend; ++i) │ │ │ │ │ -1508 tsendTo.insert(*i); │ │ │ │ │ -1509 │ │ │ │ │ -1510 noSendTo = tsendTo.size(); │ │ │ │ │ -1511 sendTo = new int[noSendTo]; │ │ │ │ │ -1512 int idx=0; │ │ │ │ │ -1513 for(auto i=tsendTo.begin(); i != tsendTo.end(); ++i, ++idx) │ │ │ │ │ -1514 sendTo[idx]=*i; │ │ │ │ │ -1515 } │ │ │ │ │ -1516 │ │ │ │ │ -1517 // │ │ │ │ │ -1518 int* gnoSend= new int[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()]; │ │ │ │ │ -1519 int* gsendToDispl = new int[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()+1]; │ │ │ │ │ -1520 │ │ │ │ │ -1521 MPI_Allgather(&noSendTo, 1, MPI_INT, gnoSend, 1, │ │ │ │ │ -1522 MPI_INT, oocomm._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ -1523 │ │ │ │ │ -1524 // calculate total receive message size │ │ │ │ │ -1525 int totalNoRecv = 0; │ │ │ │ │ -1526 for(int i=0; i0; │ │ │ │ │ -1547 │ │ │ │ │ -1548 // Delete memory │ │ │ │ │ -1549 delete[] gnoSend; │ │ │ │ │ -1550 delete[] gsendToDispl; │ │ │ │ │ -1551 delete[] gsendTo; │ │ │ │ │ -1552 │ │ │ │ │ -1553 │ │ │ │ │ -1554#ifdef DEBUG_REPART │ │ │ │ │ -1555 if(recvFrom.size()) { │ │ │ │ │ -1556 std::cout< GlobalVector; │ │ │ │ │ -1589 std::vector > myOwnerVec; │ │ │ │ │ -1590 std::set myOverlapSet; │ │ │ │ │ -1591 GlobalVector sendOwnerVec; │ │ │ │ │ -1592 std::set sendOverlapSet; │ │ │ │ │ -1593 std::set myNeighbors; │ │ │ │ │ -1594 │ │ │ │ │ -1595 // getOwnerOverlapVec(graph, setPartition, oocomm.globalLookup │ │ │ │ │ -(), │ │ │ │ │ -1596 // mype, mype, myOwnerVec, myOverlapSet, redistInf, myNeighbors); │ │ │ │ │ -1597 │ │ │ │ │ -1598 char **sendBuffers=new char*[noSendTo]; │ │ │ │ │ -1599 MPI_Request *requests = new MPI_Request[noSendTo]; │ │ │ │ │ -1600 │ │ │ │ │ -1601 // Create all messages to be sent │ │ │ │ │ -1602 for(int i=0; i < noSendTo; ++i) { │ │ │ │ │ -1603 // clear the vector for sending │ │ │ │ │ -1604 sendOwnerVec.clear(); │ │ │ │ │ -1605 sendOverlapSet.clear(); │ │ │ │ │ -1606 // get all owner and overlap vertices for process j and save these │ │ │ │ │ -1607 // in the vectors sendOwnerVec and sendOverlapSet │ │ │ │ │ -1608 std::set neighbors; │ │ │ │ │ -1609 getOwnerOverlapVec(graph, setPartition, oocomm._g_l_o_b_a_l_L_o_o_k_u_p(), │ │ │ │ │ -1610 mype, sendTo[i], sendOwnerVec, sendOverlapSet, redistInf, │ │ │ │ │ -1611 neighbors); │ │ │ │ │ -1612 // +2, we need 2 integer more for the length of each part │ │ │ │ │ -1613 // (owner/overlap) of the array │ │ │ │ │ -1614 int buffersize=0; │ │ │ │ │ -1615 int tsize; │ │ │ │ │ -1616 MPI_Pack_size(1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), │ │ │ │ │ -&buffersize); │ │ │ │ │ -1617 MPI_Pack_size(sendOwnerVec.size(), MPITraits::getType(), │ │ │ │ │ -oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ -1618 buffersize +=tsize; │ │ │ │ │ -1619 MPI_Pack_size(1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), │ │ │ │ │ -&tsize); │ │ │ │ │ -1620 buffersize +=tsize; │ │ │ │ │ -1621 MPI_Pack_size(sendOverlapSet.size(), MPITraits::getType(), │ │ │ │ │ -oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ -1622 buffersize += tsize; │ │ │ │ │ -1623 MPI_Pack_size(1, MPITraits::getType(), oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), │ │ │ │ │ -&tsize); │ │ │ │ │ -1624 buffersize += tsize; │ │ │ │ │ -1625 MPI_Pack_size(neighbors.size(), MPI_INT, oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &tsize); │ │ │ │ │ -1626 buffersize += tsize; │ │ │ │ │ -1627 │ │ │ │ │ -1628 sendBuffers[i] = new char[buffersize]; │ │ │ │ │ -1629 │ │ │ │ │ -1630#ifdef DEBUG_REPART │ │ │ │ │ -1631 std::cout<0) { │ │ │ │ │ -1651 // probe for an incoming message │ │ │ │ │ -1652 MPI_Status stat; │ │ │ │ │ -1653 MPI_Probe(MPI_ANY_SOURCE, 99, oocomm._c_o_m_m_u_n_i_c_a_t_o_r(), &stat); │ │ │ │ │ -1654 int buffersize; │ │ │ │ │ -1655 MPI_Get_count(&stat, MPI_PACKED, &buffersize); │ │ │ │ │ -1656 │ │ │ │ │ -1657 if(oldbuffersize(outputComm,SolverCategory::category │ │ │ │ │ -(oocomm),true); │ │ │ │ │ -1727 │ │ │ │ │ -1728 // translate neighbor ranks. │ │ │ │ │ -1729 int newrank=outcomm->communicator().rank(); │ │ │ │ │ -1730 int *newranks=new int[oocomm._c_o_m_m_u_n_i_c_a_t_o_r().size()]; │ │ │ │ │ -1731 std::vector tneighbors; │ │ │ │ │ -1732 tneighbors.reserve(myNeighbors.size()); │ │ │ │ │ -1733 │ │ │ │ │ -1734 typename OOComm::ParallelIndexSet& outputIndexSet = outcomm->indexSet(); │ │ │ │ │ -1735 │ │ │ │ │ -1736 MPI_Allgather(&newrank, 1, MPI_INT, newranks, 1, │ │ │ │ │ -1737 MPI_INT, oocomm._c_o_m_m_u_n_i_c_a_t_o_r()); │ │ │ │ │ -1738 │ │ │ │ │ -1739#ifdef DEBUG_REPART │ │ │ │ │ -1740 std::cout<=0); │ │ │ │ │ -1744 std::cout<<*i<<"->"<first,LocalIndexT(i, OwnerOverlapCopyAttributeSet:: │ │ │ │ │ -owner, true)); │ │ │ │ │ -1777 redistInf._a_d_d_R_e_c_e_i_v_e_I_n_d_e_x(g->second, i); │ │ │ │ │ -1778 } │ │ │ │ │ -1779 │ │ │ │ │ -1780 if(verbose) { │ │ │ │ │ -1781 oocomm._c_o_m_m_u_n_i_c_a_t_o_r().barrier(); │ │ │ │ │ -1782 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1783 std::cout<<" Adding owner indices took "<< │ │ │ │ │ -1784 time.elapsed()<local().attribute())) { │ │ │ │ │ -1820 numOfOwnVtx++; │ │ │ │ │ -1821 } │ │ │ │ │ -1822 } │ │ │ │ │ -1823 numOfOwnVtx = oocomm._c_o_m_m_u_n_i_c_a_t_o_r().sum(numOfOwnVtx); │ │ │ │ │ -1824 // if(numOfOwnVtx!=indexMap.globalOwnerVertices) │ │ │ │ │ -1825 // { │ │ │ │ │ -1826 // std::cerr<remoteIndices().setNeighbours(tneighbors); │ │ │ │ │ -1844 outcomm->remoteIndices().template rebuild(); │ │ │ │ │ -1845 │ │ │ │ │ -1846 } │ │ │ │ │ -1847 │ │ │ │ │ -1848 // release the memory │ │ │ │ │ -1849 delete[] sendTo; │ │ │ │ │ -1850 │ │ │ │ │ -1851 if(verbose) { │ │ │ │ │ -1852 oocomm._c_o_m_m_u_n_i_c_a_t_o_r().barrier(); │ │ │ │ │ -1853 if(oocomm._c_o_m_m_u_n_i_c_a_t_o_r().rank()==0) │ │ │ │ │ -1854 std::cout<<" Storing indexsets took "<< │ │ │ │ │ -1855 time.elapsed()< │ │ │ │ │ -1876 bool graphRepartition(const G& graph, P& oocomm, int nparts, │ │ │ │ │ -1877 std::shared_ptr

& outcomm, │ │ │ │ │ -1878 R& redistInf, │ │ │ │ │ -1879 bool v=false) │ │ │ │ │ -1880 { │ │ │ │ │ -1881 if(nparts!=oocomm.size()) │ │ │ │ │ -1882 DUNE_THROW(NotImplemented, "only available for MPI programs"); │ │ │ │ │ -1883 } │ │ │ │ │ -1884 │ │ │ │ │ -1885 │ │ │ │ │ -1886 template │ │ │ │ │ -1887 bool _c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n(const G& graph, P& oocomm, int nparts, │ │ │ │ │ -1888 std::shared_ptr

& outcomm, │ │ │ │ │ -1889 R& redistInf, │ │ │ │ │ -1890 bool v=false) │ │ │ │ │ -1891 { │ │ │ │ │ -1892 if(nparts!=oocomm.size()) │ │ │ │ │ -1893 DUNE_THROW(NotImplemented, "only available for MPI programs"); │ │ │ │ │ -1894 } │ │ │ │ │ -1895#endif // HAVE_MPI │ │ │ │ │ -1896} // end of namespace Dune │ │ │ │ │ -1897#endif │ │ │ │ │ -_g_r_a_p_h_._h_h │ │ │ │ │ -Provides classes for building the matrix graph. │ │ │ │ │ -_g_l_o_b_a_l_O_w_n_e_r_V_e_r_t_i_c_e_s │ │ │ │ │ -int globalOwnerVertices │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:175 │ │ │ │ │ -_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_m_a_t │ │ │ │ │ -Matrix & mat │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_1_1_8 virtual const M& _g_e_t_m_a_t () const = 0; │ │ │ │ │ +119 │ │ │ │ │ +_1_2_1 virtual _~_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r () {} │ │ │ │ │ +122 }; │ │ │ │ │ +123 │ │ │ │ │ +124 │ │ │ │ │ +125 │ │ │ │ │ +126 //===================================================================== │ │ │ │ │ +127 // Implementation for ISTL-matrix based operator │ │ │ │ │ +128 //===================================================================== │ │ │ │ │ +129 │ │ │ │ │ +135 template │ │ │ │ │ +_1_3_6 class _M_a_t_r_i_x_A_d_a_p_t_e_r : public _A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +137 { │ │ │ │ │ +138 public: │ │ │ │ │ +_1_4_0 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_1_4_1 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_4_2 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_1_4_3 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +144 │ │ │ │ │ +_1_4_6 explicit _M_a_t_r_i_x_A_d_a_p_t_e_r (const M& A) : _A_(stackobject_to_shared_ptr(A)) {} │ │ │ │ │ +147 │ │ │ │ │ +_1_4_9 explicit _M_a_t_r_i_x_A_d_a_p_t_e_r (std::shared_ptr A) : _A_(A) {} │ │ │ │ │ +150 │ │ │ │ │ +_1_5_2 void _a_p_p_l_y (const X& x, Y& y) const override │ │ │ │ │ +153 { │ │ │ │ │ +154 _A_->mv(x,y); │ │ │ │ │ +155 } │ │ │ │ │ +156 │ │ │ │ │ +_1_5_8 void _a_p_p_l_y_s_c_a_l_e_a_d_d (_f_i_e_l_d___t_y_p_e alpha, const X& x, Y& y) const override │ │ │ │ │ +159 { │ │ │ │ │ +160 _A_->usmv(alpha,x,y); │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +_1_6_4 const M& _g_e_t_m_a_t () const override │ │ │ │ │ +165 { │ │ │ │ │ +166 return *_A_; │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +_1_7_0 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const override │ │ │ │ │ +171 { │ │ │ │ │ +172 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +173 } │ │ │ │ │ +174 │ │ │ │ │ +175 private: │ │ │ │ │ +176 const std::shared_ptr _A_; │ │ │ │ │ +177 }; │ │ │ │ │ +178 │ │ │ │ │ +181} // end namespace │ │ │ │ │ +182 │ │ │ │ │ +183#endif │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_b_u_i_l_d_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -bool buildCommunication(const G &graph, std::vector< int > &realparts, Dune:: │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > &oocomm, std::shared_ptr< Dune:: │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ -&redistInf, bool verbose=false) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:1456 │ │ │ │ │ -_D_u_n_e_:_:_f_i_l_l_I_n_d_e_x_S_e_t_H_o_l_e_s │ │ │ │ │ -void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, │ │ │ │ │ -T2 > &oocomm) │ │ │ │ │ -Fills the holes in an index set. │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_c_o_m_m_G_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ -bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< │ │ │ │ │ -T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ -&redistInf, bool verbose=false) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:829 │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t___c_a_r_r_a_y │ │ │ │ │ -void print_carray(S &os, T *array, std::size_t l) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:778 │ │ │ │ │ -_D_u_n_e_:_:_i_s_V_a_l_i_d_G_r_a_p_h │ │ │ │ │ -bool isValidGraph(std::size_t noVtx, std::size_t gnoVtx, S noEdges, T *xadj, T │ │ │ │ │ -*adjncy, bool checkSymmetry) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:785 │ │ │ │ │ -_D_u_n_e_:_:_g_r_a_p_h_R_e_p_a_r_t_i_t_i_o_n │ │ │ │ │ -bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, │ │ │ │ │ -T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune:: │ │ │ │ │ -OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface │ │ │ │ │ -&redistInf, bool verbose=false) │ │ │ │ │ -execute a graph repartition for a giving graph and indexset. │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:1235 │ │ │ │ │ -_D_u_n_e_:_:_M_e_t_i_s_:_:_r_e_a_l___t │ │ │ │ │ -float real_t │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_M_e_t_i_s_:_:_i_d_x___t │ │ │ │ │ -std::size_t idx_t │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r │ │ │ │ │ -@ owner │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ -owner/overlap/copy sema... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_g_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -const GlobalLookupIndexSet & globalLookup() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ -const ParallelIndexSet & indexSet() const │ │ │ │ │ -Get the underlying parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:462 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_C_o_p_y_T_o_A_l_l │ │ │ │ │ -void copyCopyToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from copy data points to all other data points. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:328 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet │ │ │ │ │ -The type of the reverse lookup of indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:456 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void buildGlobalLookup() │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:495 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -const Communication< MPI_Comm > & communicator() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ -void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from owner data points to all other data points. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -const RemoteIndices & remoteIndices() const │ │ │ │ │ -Get the underlying remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void freeGlobalLookup() │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ -The type of the parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_M_a_t_r_i_x_G_r_a_p_h │ │ │ │ │ -The (undirected) graph of a matrix. │ │ │ │ │ -DDeeffiinniittiioonn graph.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_r_e_s_e_r_v_e_S_p_a_c_e_F_o_r_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void reserveSpaceForReceiveInterface(int proc, int size) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_b_u_i_l_d_R_e_c_e_i_v_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildReceiveInterface(std::vector< std::pair< TG, int > > &indices) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_~_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ -~RedistributeInterface() │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_s_e_t_C_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -void setCommunicator(MPI_Comm comm) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_b_u_i_l_d_S_e_n_d_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildSendInterface(const std::vector< int > &toPart, const IS &idxset) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e_:_:_a_d_d_R_e_c_e_i_v_e_I_n_d_e_x │ │ │ │ │ -void addReceiveIndex(int proc, std::size_t idx) │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:288 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_~_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +virtual ~LinearOperator() │ │ │ │ │ +every abstract base class has a virtual destructor │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ +virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0 │ │ │ │ │ +apply operator to x, scale and add: │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const =0 │ │ │ │ │ +Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The type of the range of the operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(const X &x, Y &y) const =0 │ │ │ │ │ +apply operator to x: The input vector is consistent and the output must also be │ │ │ │ │ +consistent on the in... │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The type of the domain of the operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator exporting itself in matrix form. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_g_e_t_m_a_t │ │ │ │ │ +virtual const M & getmat() const =0 │ │ │ │ │ +get matrix via * │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +export types, usually they come from the derived class │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_~_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +virtual ~AssembledLinearOperator() │ │ │ │ │ +every abstract base class has a virtual destructor │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ +Adapter to turn a matrix into a linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ +MatrixAdapter(std::shared_ptr< const M > A) │ │ │ │ │ +constructor: store an std::shared_ptr to a matrix │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ +MatrixAdapter(const M &A) │ │ │ │ │ +constructor: just store a reference to a matrix │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ +void applyscaleadd(field_type alpha, const X &x, Y &y) const override │ │ │ │ │ +apply operator to x, scale and add: │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_g_e_t_m_a_t │ │ │ │ │ +const M & getmat() const override │ │ │ │ │ +get matrix via * │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +SolverCategory::Category category() const override │ │ │ │ │ +Category of the solver (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_a_p_p_l_y │ │ │ │ │ +void apply(const X &x, Y &y) const override │ │ │ │ │ +apply operator to x: │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +export types │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00212.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: owneroverlapcopy.hh File Reference │ │ │ │ +dune-istl: preconditioners.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,94 +72,98 @@ │ │ │ │

│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ +

Define general preconditioner interface. │ │ │ │ More...

│ │ │ │ -
#include <new>
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ #include <iostream>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <list>
│ │ │ │ -#include <map>
│ │ │ │ -#include <set>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include "cmath"
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <dune/common/enumset.hh>
│ │ │ │ -#include <dune/common/parallel/indexset.hh>
│ │ │ │ -#include <dune/common/parallel/communicator.hh>
│ │ │ │ -#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -#include "solvercategory.hh"
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ -#include <dune/common/parallel/communication.hh>
│ │ │ │ -#include <dune/istl/matrixmarket.hh>
│ │ │ │ +#include <iomanip>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/common/parametertree.hh>
│ │ │ │ +#include <dune/istl/solverregistry.hh>
│ │ │ │ +#include "preconditioner.hh"
│ │ │ │ +#include "solver.hh"
│ │ │ │ +#include "solvercategory.hh"
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +#include "matrixutils.hh"
│ │ │ │ +#include "gsetc.hh"
│ │ │ │ +#include "ildl.hh"
│ │ │ │ +#include "ilu.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::OwnerOverlapCopyAttributeSet
 Attribute set for overlapping Schwarz. More...
class  Dune::InverseOperator2Preconditioner< O, c >
 Turns an InverseOperator into a Preconditioner. More...
 
class  Dune::IndexInfoFromGrid< G, L >
 Information about the index distribution. More...
class  Dune::SeqSSOR< M, X, Y, l >
 Sequential SSOR preconditioner. More...
 
class  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >
 A class setting up standard communication for a two-valued attribute set with owner/overlap/copy semantics. More...
class  Dune::SeqSOR< M, X, Y, l >
 Sequential SOR preconditioner. More...
 
struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::CopyGatherScatter< T >
 gather/scatter callback for communcation More...
class  Dune::SeqJac< M, X, Y, l >
 The sequential jacobian preconditioner. More...
 
struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::AddGatherScatter< T >
class  Dune::SeqILU< M, X, Y, l >
 Sequential ILU preconditioner. More...
 
class  Dune::Richardson< X, Y >
 Richardson preconditioner. More...
 
class  Dune::SeqILDL< M, X, Y >
 sequential ILDL preconditioner More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

template<class M , class X , class Y , int l = 1>
using Dune::SeqGS = SeqSOR< M, X, Y, l >
 Sequential Gauss Seidel preconditioner.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<int dim, template< class, class > class Comm>
void testRedistributed (int s)
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("ssor", defaultPreconditionerBlockLevelCreator< Dune::SeqSSOR >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("sor", defaultPreconditionerBlockLevelCreator< Dune::SeqSOR >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("gs", defaultPreconditionerBlockLevelCreator< Dune::SeqGS >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("jac", defaultPreconditionerBlockLevelCreator< Dune::SeqJac >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("ilu", defaultPreconditionerBlockLevelCreator< Dune::SeqILU >())
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("richardson", [](auto tl, const auto &, const ParameterTree &config){ using D=typename Dune::TypeListElement< 1, decltype(tl)>::type;using R=typename Dune::TypeListElement< 2, decltype(tl)>::type;return std::make_shared< Richardson< D, R > >(config);})
 
 Dune::DUNE_REGISTER_PRECONDITIONER ("ildl", defaultPreconditionerCreator< Dune::SeqILDL >())
 
│ │ │ │

Detailed Description

│ │ │ │ -

Classes providing communication interfaces for overlapping Schwarz methods.

│ │ │ │ -
Author
Peter Bastian
│ │ │ │ -

Function Documentation

│ │ │ │ - │ │ │ │ -

◆ testRedistributed()

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -template<int dim, template< class, class > class Comm>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
void testRedistributed (int s)
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Define general preconditioner interface.

│ │ │ │ +

Wrap the methods implemented by ISTL in this interface. However, the interface is extensible such that new preconditioners can be implemented and used with the solvers.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,65 +1,89 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -owneroverlapcopy.hh File Reference │ │ │ │ │ -_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _C_o_m_m_u_n_i_c_a_t_i_o_n_ _I_n_t_e_r_f_a_c_e │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#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 │ │ │ │ │ +preconditioners.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s » _P_r_e_c_o_n_d_i_t_i_o_n_e_r_s │ │ │ │ │ +Define general preconditioner interface. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "cmath" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ +#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ +#include "_s_o_l_v_e_r_._h_h" │ │ │ │ │ #include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ #include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_m_a_r_k_e_t_._h_h> │ │ │ │ │ +#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ +#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +#include "_i_l_d_l_._h_h" │ │ │ │ │ +#include "_i_l_u_._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_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ -  Attribute set for overlapping Schwarz. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _O_,_ _c_ _> │ │ │ │ │ +  Turns an _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r into a _P_r_e_c_o_n_d_i_t_i_o_n_e_r. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_ _G_,_ _L_ _> │ │ │ │ │ -  Information about the index distribution. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_q_S_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ +  Sequential SSOR preconditioner. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_l_o_b_a_l_I_d_T_y_p_e_,_ _L_o_c_a_l_I_d_T_y_p_e_ _> │ │ │ │ │ -  A class setting up standard communication for a two-valued attribute │ │ │ │ │ - set with owner/overlap/copy semantics. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_l_o_b_a_l_I_d_T_y_p_e_,_ _L_o_c_a_l_I_d_T_y_p_e_ _>_:_: │ │ │ │ │ - _C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_ _> │ │ │ │ │ -  gather/scatter callback for communcation _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_q_S_O_R_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ +  Sequential SOR preconditioner. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _G_l_o_b_a_l_I_d_T_y_p_e_,_ _L_o_c_a_l_I_d_T_y_p_e_ _>_:_: │ │ │ │ │ - _A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _T_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_q_J_a_c_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ +  The sequential jacobian preconditioner. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_q_I_L_U_<_ _M_,_ _X_,_ _Y_,_ _l_ _> │ │ │ │ │ +  Sequential _I_L_U preconditioner. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_<_ _X_,_ _Y_ _> │ │ │ │ │ +  _R_i_c_h_a_r_d_s_o_n preconditioner. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_S_e_q_I_L_D_L_<_ _M_,_ _X_,_ _Y_ _> │ │ │ │ │ +  sequential ILDL preconditioner _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_S_e_q_G_S = _S_e_q_S_O_R< M, X, Y, l > │ │ │ │ │ +  Sequential Gauss Seidel preconditioner. │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template class Comm> │ │ │ │ │ -void  _t_e_s_t_R_e_d_i_s_t_r_i_b_u_t_e_d (int s) │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("ssor", │ │ │ │ │ + _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_S_S_O_R >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("sor", │ │ │ │ │ + _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_S_O_R >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("gs", │ │ │ │ │ + _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_G_S >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("jac", │ │ │ │ │ + _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_J_a_c >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("ilu", │ │ │ │ │ + _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_B_l_o_c_k_L_e_v_e_l_C_r_e_a_t_o_r< _D_u_n_e_:_:_S_e_q_I_L_U >()) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("richardson", [](auto tl, const auto &, │ │ │ │ │ + const ParameterTree &config){ using D=typename Dune::TypeListElement< 1, │ │ │ │ │ + decltype(tl)>::type;using R=typename Dune::TypeListElement< 2, decltype │ │ │ │ │ + (tl)>::type;return std::make_shared< _R_i_c_h_a_r_d_s_o_n< D, R > >(config);}) │ │ │ │ │ +  │ │ │ │ │ +  _D_u_n_e_:_:_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R ("ildl", _d_e_f_a_u_l_t_P_r_e_c_o_n_d_i_t_i_o_n_e_r_C_r_e_a_t_o_r< │ │ │ │ │ + _D_u_n_e_:_:_S_e_q_I_L_D_L >()) │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ - Author │ │ │ │ │ - Peter Bastian │ │ │ │ │ -********** FFuunnccttiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? tteessttRReeddiissttrriibbuutteedd(()) ********** │ │ │ │ │ -template class Comm> │ │ │ │ │ -void testRedistributed ( int  ss ) │ │ │ │ │ +Define general preconditioner interface. │ │ │ │ │ +Wrap the methods implemented by ISTL in this interface. However, the interface │ │ │ │ │ +is extensible such that new preconditioners can be implemented and used with │ │ │ │ │ +the solvers. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00212_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: owneroverlapcopy.hh Source File │ │ │ │ +dune-istl: preconditioners.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,712 +74,738 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
owneroverlapcopy.hh
│ │ │ │ +
preconditioners.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH
│ │ │ │ -
6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_PRECONDITIONERS_HH
│ │ │ │ +
6#define DUNE_ISTL_PRECONDITIONERS_HH
│ │ │ │
7
│ │ │ │ -
8#include <new>
│ │ │ │ -
9#include <iostream>
│ │ │ │ -
10#include <vector>
│ │ │ │ -
11#include <list>
│ │ │ │ -
12#include <map>
│ │ │ │ -
13#include <set>
│ │ │ │ -
14#include <tuple>
│ │ │ │ -
15
│ │ │ │ -
16#include "cmath"
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <complex>
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <iomanip>
│ │ │ │ +
12#include <memory>
│ │ │ │ +
13#include <string>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/simd/simd.hh>
│ │ │ │ +
16#include <dune/common/parametertree.hh>
│ │ │ │
17
│ │ │ │ -
18// MPI header
│ │ │ │ -
19#if HAVE_MPI
│ │ │ │ -
20#include <mpi.h>
│ │ │ │ -
21#endif
│ │ │ │ -
22
│ │ │ │ -
23#include <dune/common/enumset.hh>
│ │ │ │ -
24
│ │ │ │ -
25#if HAVE_MPI
│ │ │ │ -
26#include <dune/common/parallel/indexset.hh>
│ │ │ │ -
27#include <dune/common/parallel/communicator.hh>
│ │ │ │ -
28#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -
29#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -
30#endif
│ │ │ │ -
31
│ │ │ │ -
32#include "solvercategory.hh"
│ │ │ │ -
33#include "istlexception.hh"
│ │ │ │ -
34#include <dune/common/parallel/communication.hh>
│ │ │ │ - │ │ │ │ -
36
│ │ │ │ -
37template<int dim, template<class,class> class Comm>
│ │ │ │ - │ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
41namespace Dune {
│ │ │ │ -
42
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
59 {
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
62 };
│ │ │ │ -
│ │ │ │ -
63 };
│ │ │ │ -
│ │ │ │ -
64
│ │ │ │ -
76 template <class G, class L>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
78 {
│ │ │ │ -
79 public:
│ │ │ │ -
81 typedef G GlobalIdType;
│ │ │ │ -
82
│ │ │ │ -
84 typedef L LocalIdType;
│ │ │ │ -
85
│ │ │ │ -
92 typedef std::tuple<GlobalIdType,LocalIdType,int> IndexTripel;
│ │ │ │ -
99 typedef std::tuple<int,GlobalIdType,int> RemoteIndexTripel;
│ │ │ │ -
100
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
107 {
│ │ │ │ -
108 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
│ │ │ │ - │ │ │ │ - │ │ │ │ -
111 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
│ │ │ │ -
112 localindices.insert(x);
│ │ │ │ -
113 }
│ │ │ │ -
│ │ │ │ -
114
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
121 {
│ │ │ │ -
122 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
│ │ │ │ - │ │ │ │ - │ │ │ │ -
125 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
│ │ │ │ -
126 remoteindices.insert(x);
│ │ │ │ -
127 }
│ │ │ │ + │ │ │ │ +
19#include "preconditioner.hh"
│ │ │ │ +
20#include "solver.hh"
│ │ │ │ +
21#include "solvercategory.hh"
│ │ │ │ +
22#include "istlexception.hh"
│ │ │ │ +
23#include "matrixutils.hh"
│ │ │ │ +
24#include "gsetc.hh"
│ │ │ │ +
25#include "ildl.hh"
│ │ │ │ +
26#include "ilu.hh"
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29namespace Dune {
│ │ │ │ +
72 template<class O, int c = -1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
74 public Preconditioner<typename O::domain_type, typename O::range_type>
│ │ │ │ +
75 {
│ │ │ │ +
76 public:
│ │ │ │ +
78 typedef typename O::domain_type domain_type;
│ │ │ │ +
80 typedef typename O::range_type range_type;
│ │ │ │ +
82 typedef typename range_type::field_type field_type;
│ │ │ │ +
84 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
86 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ +
88 typedef O InverseOperator;
│ │ │ │ +
89
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
95 : inverse_operator_(inverse_operator)
│ │ │ │ +
96 {
│ │ │ │ +
97 if(c != -1 && SolverCategory::category(inverse_operator_) != c)
│ │ │ │ +
98 DUNE_THROW(InvalidStateException, "User-supplied solver category does not match that of the given inverse operator");
│ │ │ │ +
99 }
│ │ │ │
│ │ │ │ +
100
│ │ │ │ +
│ │ │ │ +
101 virtual void pre(domain_type&,range_type&)
│ │ │ │ +
102 {}
│ │ │ │ +
│ │ │ │ +
103
│ │ │ │ +
│ │ │ │ +
104 virtual void apply(domain_type& v, const range_type& d)
│ │ │ │ +
105 {
│ │ │ │ + │ │ │ │ +
107 range_type copy(d);
│ │ │ │ +
108 inverse_operator_.apply(v, copy, res);
│ │ │ │ +
109 }
│ │ │ │ +
│ │ │ │ +
110
│ │ │ │ +
│ │ │ │ +
111 virtual void post(domain_type&)
│ │ │ │ +
112 {}
│ │ │ │ +
│ │ │ │ +
113
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
116 {
│ │ │ │ +
117 return SolverCategory::category(inverse_operator_);
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │ +
120 private:
│ │ │ │ +
121 InverseOperator& inverse_operator_;
│ │ │ │ +
122 };
│ │ │ │ +
│ │ │ │ +
123
│ │ │ │ +
124 //=====================================================================
│ │ │ │ +
125 // Implementation of this interface for sequential ISTL-preconditioners
│ │ │ │ +
126 //=====================================================================
│ │ │ │ +
127
│ │ │ │
128
│ │ │ │ -
│ │ │ │ -
133 const std::set<IndexTripel>& localIndices () const
│ │ │ │ -
134 {
│ │ │ │ -
135 return localindices;
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ -
142 const std::set<RemoteIndexTripel>& remoteIndices () const
│ │ │ │ -
143 {
│ │ │ │ -
144 return remoteindices;
│ │ │ │ -
145 }
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
│ │ │ │ -
150 void clear ()
│ │ │ │ -
151 {
│ │ │ │ -
152 localindices.clear();
│ │ │ │ -
153 remoteindices.clear();
│ │ │ │ -
154 }
│ │ │ │ -
│ │ │ │ +
140 template<class M, class X, class Y, int l=1>
│ │ │ │ +
│ │ │ │ +
141 class SeqSSOR : public Preconditioner<X,Y> {
│ │ │ │ +
142 public:
│ │ │ │ +
144 typedef M matrix_type;
│ │ │ │ +
146 typedef X domain_type;
│ │ │ │ +
148 typedef Y range_type;
│ │ │ │ +
150 typedef typename X::field_type field_type;
│ │ │ │ +
152 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
154 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │
155
│ │ │ │ -
156 private:
│ │ │ │ -
158 std::set<IndexTripel> localindices;
│ │ │ │ -
160 std::set<RemoteIndexTripel> remoteindices;
│ │ │ │ -
161 };
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
163
│ │ │ │ -
164#if HAVE_MPI
│ │ │ │ -
165
│ │ │ │ -
172 template <class GlobalIdType, class LocalIdType=int>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
174 {
│ │ │ │ -
175 template<typename M, typename G, typename L>
│ │ │ │ -
176 friend void loadMatrixMarket(M&,
│ │ │ │ -
177 const std::string&,
│ │ │ │ - │ │ │ │ -
179 bool);
│ │ │ │ -
180 // used types
│ │ │ │ - │ │ │ │ - │ │ │ │ -
183 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
│ │ │ │ -
184 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
│ │ │ │ - │ │ │ │ -
186 typedef Dune::ParallelLocalIndex<AttributeSet> LI;
│ │ │ │ -
187 public:
│ │ │ │ -
188 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> PIS;
│ │ │ │ -
189 typedef Dune::RemoteIndices<PIS> RI;
│ │ │ │ -
190 typedef Dune::RemoteIndexListModifier<PIS,typename RI::Allocator,false> RILM;
│ │ │ │ -
191 typedef typename RI::RemoteIndex RX;
│ │ │ │ -
192 typedef Dune::BufferedCommunicator BC;
│ │ │ │ -
193 typedef Dune::Interface IF;
│ │ │ │ -
194 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner> OwnerSet;
│ │ │ │ -
195 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopySet;
│ │ │ │ -
196 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> OwnerOverlapSet;
│ │ │ │ -
197 typedef Dune::AllSet<AttributeSet> AllSet;
│ │ │ │ -
198 protected:
│ │ │ │ -
199
│ │ │ │ -
200
│ │ │ │ -
202 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
204 {
│ │ │ │ -
205 typedef typename CommPolicy<T>::IndexedType V;
│ │ │ │ -
206
│ │ │ │ -
│ │ │ │ -
207 static V gather(const T& a, std::size_t i)
│ │ │ │ -
208 {
│ │ │ │ -
209 return a[i];
│ │ │ │ -
210 }
│ │ │ │ -
│ │ │ │ -
211
│ │ │ │ -
│ │ │ │ -
212 static void scatter(T& a, V v, std::size_t i)
│ │ │ │ -
213 {
│ │ │ │ -
214 a[i] = v;
│ │ │ │ -
215 }
│ │ │ │ -
│ │ │ │ -
216 };
│ │ │ │ -
│ │ │ │ -
217 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
219 {
│ │ │ │ -
220 typedef typename CommPolicy<T>::IndexedType V;
│ │ │ │ -
221
│ │ │ │ -
│ │ │ │ -
222 static V gather(const T& a, std::size_t i)
│ │ │ │ -
223 {
│ │ │ │ -
224 return a[i];
│ │ │ │ -
225 }
│ │ │ │ -
│ │ │ │ -
226
│ │ │ │ -
│ │ │ │ -
227 static void scatter(T& a, V v, std::size_t i)
│ │ │ │ -
228 {
│ │ │ │ -
229 a[i] += v;
│ │ │ │ -
230 }
│ │ │ │ -
│ │ │ │ -
231 };
│ │ │ │ +
│ │ │ │ +
163 SeqSSOR (const M& A, int n, real_field_type w)
│ │ │ │ +
164 : _A_(A), _n(n), _w(w)
│ │ │ │ +
165 {
│ │ │ │ + │ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
│ │ │ │ +
182 SeqSSOR (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ +
183 : SeqSSOR(A->getmat(), configuration)
│ │ │ │ +
184 {}
│ │ │ │ +
│ │ │ │ +
185
│ │ │ │ +
│ │ │ │ +
199 SeqSSOR (const M& A, const ParameterTree& configuration)
│ │ │ │ +
200 : SeqSSOR(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
│ │ │ │ +
201 {}
│ │ │ │ +
│ │ │ │ +
202
│ │ │ │ +
│ │ │ │ +
208 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ +
209 {}
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
│ │ │ │ +
216 virtual void apply (X& v, const Y& d)
│ │ │ │ +
217 {
│ │ │ │ +
218 for (int i=0; i<_n; i++) {
│ │ │ │ +
219 bsorf(_A_,v,d,_w,BL<l>());
│ │ │ │ +
220 bsorb(_A_,v,d,_w,BL<l>());
│ │ │ │ +
221 }
│ │ │ │ +
222 }
│ │ │ │ +
│ │ │ │ +
223
│ │ │ │ +
│ │ │ │ +
229 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ +
230 {}
│ │ │ │
│ │ │ │ -
232
│ │ │ │ +
231
│ │ │ │
│ │ │ │ - │ │ │ │ + │ │ │ │
234 {
│ │ │ │ -
235 if (OwnerOverlapToAllInterfaceBuilt)
│ │ │ │ -
236 OwnerOverlapToAllInterface.free();
│ │ │ │ -
237 OwnerOverlapSet sourceFlags;
│ │ │ │ -
238 Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet>
│ │ │ │ -
239 destFlags;
│ │ │ │ -
240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ -
241 OwnerOverlapToAllInterfaceBuilt = true;
│ │ │ │ -
242 }
│ │ │ │ -
│ │ │ │ -
243
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
245 {
│ │ │ │ -
246 if (OwnerToAllInterfaceBuilt)
│ │ │ │ -
247 OwnerToAllInterface.free();
│ │ │ │ -
248 OwnerSet sourceFlags;
│ │ │ │ -
249 AllSet destFlags;
│ │ │ │ -
250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ -
251 OwnerToAllInterfaceBuilt = true;
│ │ │ │ -
252 }
│ │ │ │ -
│ │ │ │ -
253
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
255 {
│ │ │ │ -
256 if (OwnerCopyToAllInterfaceBuilt)
│ │ │ │ -
257 OwnerCopyToAllInterface.free();
│ │ │ │ -
258
│ │ │ │ -
259 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
│ │ │ │ -
260 OwnerCopySet sourceFlags;
│ │ │ │ -
261 Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> destFlags;
│ │ │ │ -
262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ -
263 OwnerCopyToAllInterfaceBuilt = true;
│ │ │ │ -
264 }
│ │ │ │ -
│ │ │ │ -
265
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
267 {
│ │ │ │ -
268 if (OwnerCopyToOwnerCopyInterfaceBuilt)
│ │ │ │ -
269 OwnerCopyToOwnerCopyInterface.free();
│ │ │ │ -
270
│ │ │ │ -
271
│ │ │ │ -
272 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
│ │ │ │ -
273 OwnerCopySet sourceFlags;
│ │ │ │ -
274 OwnerCopySet destFlags;
│ │ │ │ -
275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ -
276 OwnerCopyToOwnerCopyInterfaceBuilt = true;
│ │ │ │ -
277 }
│ │ │ │ -
│ │ │ │ -
278
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
280 {
│ │ │ │ -
281 if (CopyToAllInterfaceBuilt)
│ │ │ │ -
282 CopyToAllInterface.free();
│ │ │ │ -
283 CopySet sourceFlags;
│ │ │ │ -
284 AllSet destFlags;
│ │ │ │ -
285 CopyToAllInterface.build(ri,sourceFlags,destFlags);
│ │ │ │ -
286 CopyToAllInterfaceBuilt = true;
│ │ │ │ + │ │ │ │ +
236 }
│ │ │ │ +
│ │ │ │ +
237
│ │ │ │ +
238 private:
│ │ │ │ +
240 const M& _A_;
│ │ │ │ +
242 int _n;
│ │ │ │ + │ │ │ │ +
245 };
│ │ │ │ +
│ │ │ │ +
246 DUNE_REGISTER_PRECONDITIONER("ssor", defaultPreconditionerBlockLevelCreator<Dune::SeqSSOR>());
│ │ │ │ +
247
│ │ │ │ +
248
│ │ │ │ +
260 template<class M, class X, class Y, int l=1>
│ │ │ │ +
│ │ │ │ +
261 class SeqSOR : public Preconditioner<X,Y> {
│ │ │ │ +
262 public:
│ │ │ │ +
264 typedef M matrix_type;
│ │ │ │ +
266 typedef X domain_type;
│ │ │ │ +
268 typedef Y range_type;
│ │ │ │ +
270 typedef typename X::field_type field_type;
│ │ │ │ +
272 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
274 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ +
275
│ │ │ │ +
│ │ │ │ +
283 SeqSOR (const M& A, int n, real_field_type w)
│ │ │ │ +
284 : _A_(A), _n(n), _w(w)
│ │ │ │ +
285 {
│ │ │ │ + │ │ │ │
287 }
│ │ │ │
│ │ │ │
288
│ │ │ │ -
289 public:
│ │ │ │ -
290
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
296 return category_;
│ │ │ │ -
297 }
│ │ │ │ -
│ │ │ │ -
298
│ │ │ │ -
│ │ │ │ -
299 const Communication<MPI_Comm>& communicator() const
│ │ │ │ -
300 {
│ │ │ │ -
301 return cc;
│ │ │ │ -
302 }
│ │ │ │ -
│ │ │ │ -
303
│ │ │ │ -
310 template<class T>
│ │ │ │ -
│ │ │ │ -
311 void copyOwnerToAll (const T& source, T& dest) const
│ │ │ │ -
312 {
│ │ │ │ -
313 if (!OwnerToAllInterfaceBuilt)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
316 communicator.template build<T>(OwnerToAllInterface);
│ │ │ │ -
317 communicator.template forward<CopyGatherScatter<T> >(source,dest);
│ │ │ │ -
318 communicator.free();
│ │ │ │ -
319 }
│ │ │ │ +
│ │ │ │ +
302 SeqSOR (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ +
303 : SeqSOR(A->getmat(), configuration)
│ │ │ │ +
304 {}
│ │ │ │ +
│ │ │ │ +
305
│ │ │ │ +
│ │ │ │ +
319 SeqSOR (const M& A, const ParameterTree& configuration)
│ │ │ │ +
320 : SeqSOR(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
│ │ │ │ +
321 {}
│ │ │ │
│ │ │ │ -
320
│ │ │ │ -
327 template<class T>
│ │ │ │ +
322
│ │ │ │
│ │ │ │ -
328 void copyCopyToAll (const T& source, T& dest) const
│ │ │ │ -
329 {
│ │ │ │ -
330 if (!CopyToAllInterfaceBuilt)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
333 communicator.template build<T>(CopyToAllInterface);
│ │ │ │ -
334 communicator.template forward<CopyGatherScatter<T> >(source,dest);
│ │ │ │ -
335 communicator.free();
│ │ │ │ -
336 }
│ │ │ │ -
│ │ │ │ -
337
│ │ │ │ -
344 template<class T>
│ │ │ │ -
│ │ │ │ -
345 void addOwnerOverlapToAll (const T& source, T& dest) const
│ │ │ │ -
346 {
│ │ │ │ -
347 if (!OwnerOverlapToAllInterfaceBuilt)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
350 communicator.template build<T>(OwnerOverlapToAllInterface);
│ │ │ │ -
351 communicator.template forward<AddGatherScatter<T> >(source,dest);
│ │ │ │ -
352 communicator.free();
│ │ │ │ -
353 }
│ │ │ │ -
│ │ │ │ -
354
│ │ │ │ -
361 template<class T>
│ │ │ │ -
│ │ │ │ -
362 void addOwnerCopyToAll (const T& source, T& dest) const
│ │ │ │ -
363 {
│ │ │ │ -
364 if (!OwnerCopyToAllInterfaceBuilt)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
367 communicator.template build<T>(OwnerCopyToAllInterface);
│ │ │ │ -
368 communicator.template forward<AddGatherScatter<T> >(source,dest);
│ │ │ │ -
369 communicator.free();
│ │ │ │ -
370 }
│ │ │ │ -
│ │ │ │ -
371
│ │ │ │ -
378 template<class T>
│ │ │ │ -
│ │ │ │ -
379 void addOwnerCopyToOwnerCopy (const T& source, T& dest) const
│ │ │ │ -
380 {
│ │ │ │ -
381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
384 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
│ │ │ │ -
385 communicator.template forward<AddGatherScatter<T> >(source,dest);
│ │ │ │ -
386 communicator.free();
│ │ │ │ -
387 }
│ │ │ │ -
│ │ │ │ -
388
│ │ │ │ -
389
│ │ │ │ -
397 template<class T1, class T2>
│ │ │ │ -
│ │ │ │ -
398 void dot (const T1& x, const T1& y, T2& result) const
│ │ │ │ -
399 {
│ │ │ │ -
400 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
│ │ │ │ -
401 // set up mask vector
│ │ │ │ -
402 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
│ │ │ │ -
403 {
│ │ │ │ -
404 mask.resize(x.size());
│ │ │ │ -
405 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
│ │ │ │ -
406 mask[i] = 1;
│ │ │ │ -
407 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ -
408 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
409 mask[i->local().local()] = 0;
│ │ │ │ -
410 }
│ │ │ │ -
411 result = T2(0.0);
│ │ │ │ -
412
│ │ │ │ -
413 for (typename T1::size_type i=0; i<x.size(); i++)
│ │ │ │ -
414 result += (x[i]*(y[i]))*static_cast<real_type>(mask[i]);
│ │ │ │ -
415 result = cc.sum(result);
│ │ │ │ -
416 }
│ │ │ │ -
│ │ │ │ -
417
│ │ │ │ -
424 template<class T1>
│ │ │ │ -
│ │ │ │ -
425 typename FieldTraits<typename T1::field_type>::real_type norm (const T1& x) const
│ │ │ │ -
426 {
│ │ │ │ -
427 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
│ │ │ │ -
428
│ │ │ │ -
429 // set up mask vector
│ │ │ │ -
430 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
│ │ │ │ -
431 {
│ │ │ │ -
432 mask.resize(x.size());
│ │ │ │ -
433 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
│ │ │ │ -
434 mask[i] = 1;
│ │ │ │ -
435 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ -
436 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
437 mask[i->local().local()] = 0;
│ │ │ │ -
438 }
│ │ │ │ -
439 auto result = real_type(0.0);
│ │ │ │ -
440 for (typename T1::size_type i=0; i<x.size(); i++)
│ │ │ │ -
441 result += Impl::asVector(x[i]).two_norm2()*mask[i];
│ │ │ │ -
442 using std::sqrt;
│ │ │ │ -
443 return sqrt(cc.sum(result));
│ │ │ │ -
444 }
│ │ │ │ -
│ │ │ │ -
445
│ │ │ │ -
446 typedef Dune::EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopyFlags;
│ │ │ │ -
447
│ │ │ │ -
449 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> ParallelIndexSet;
│ │ │ │ -
450
│ │ │ │ -
452 typedef Dune::RemoteIndices<PIS> RemoteIndices;
│ │ │ │ -
453
│ │ │ │ -
456 typedef Dune::GlobalLookupIndexSet<ParallelIndexSet> GlobalLookupIndexSet;
│ │ │ │ -
457
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
463 {
│ │ │ │ -
464 return pis;
│ │ │ │ -
465 }
│ │ │ │ -
│ │ │ │ -
466
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
472 {
│ │ │ │ -
473 return ri;
│ │ │ │ -
474 }
│ │ │ │ -
│ │ │ │ -
475
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
481 {
│ │ │ │ -
482 return pis;
│ │ │ │ -
483 }
│ │ │ │ -
│ │ │ │ -
484
│ │ │ │ -
485
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
491 {
│ │ │ │ -
492 return ri;
│ │ │ │ -
493 }
│ │ │ │ -
│ │ │ │ -
494
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
496 {
│ │ │ │ -
497 if(globalLookup_) {
│ │ │ │ -
498 if(pis.seqNo()==oldseqNo)
│ │ │ │ -
499 // Nothing changed!
│ │ │ │ -
500 return;
│ │ │ │ -
501 delete globalLookup_;
│ │ │ │ -
502 }
│ │ │ │ -
503
│ │ │ │ -
504 globalLookup_ = new GlobalLookupIndexSet(pis);
│ │ │ │ -
505 oldseqNo = pis.seqNo();
│ │ │ │ +
328 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ +
329 {}
│ │ │ │ +
│ │ │ │ +
330
│ │ │ │ +
│ │ │ │ +
336 virtual void apply (X& v, const Y& d)
│ │ │ │ +
337 {
│ │ │ │ +
338 this->template apply<true>(v,d);
│ │ │ │ +
339 }
│ │ │ │ +
│ │ │ │ +
340
│ │ │ │ +
349 template<bool forward>
│ │ │ │ +
│ │ │ │ +
350 void apply(X& v, const Y& d)
│ │ │ │ +
351 {
│ │ │ │ +
352 if(forward)
│ │ │ │ +
353 for (int i=0; i<_n; i++) {
│ │ │ │ +
354 bsorf(_A_,v,d,_w,BL<l>());
│ │ │ │ +
355 }
│ │ │ │ +
356 else
│ │ │ │ +
357 for (int i=0; i<_n; i++) {
│ │ │ │ +
358 bsorb(_A_,v,d,_w,BL<l>());
│ │ │ │ +
359 }
│ │ │ │ +
360 }
│ │ │ │ +
│ │ │ │ +
361
│ │ │ │ +
│ │ │ │ +
367 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ +
368 {}
│ │ │ │ +
│ │ │ │ +
369
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
372 {
│ │ │ │ + │ │ │ │ +
374 }
│ │ │ │ +
│ │ │ │ +
375
│ │ │ │ +
376 private:
│ │ │ │ +
378 const M& _A_;
│ │ │ │ +
380 int _n;
│ │ │ │ + │ │ │ │ +
383 };
│ │ │ │ +
│ │ │ │ +
384 DUNE_REGISTER_PRECONDITIONER("sor", defaultPreconditionerBlockLevelCreator<Dune::SeqSOR>());
│ │ │ │ +
385
│ │ │ │ +
386
│ │ │ │ +
397 template<class M, class X, class Y, int l=1>
│ │ │ │ + │ │ │ │ +
399 DUNE_REGISTER_PRECONDITIONER("gs", defaultPreconditionerBlockLevelCreator<Dune::SeqGS>());
│ │ │ │ +
400
│ │ │ │ +
411 template<class M, class X, class Y, int l=1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
413 public:
│ │ │ │ +
415 typedef M matrix_type;
│ │ │ │ +
417 typedef X domain_type;
│ │ │ │ +
419 typedef Y range_type;
│ │ │ │ +
421 typedef typename X::field_type field_type;
│ │ │ │ +
423 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
425 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ +
426
│ │ │ │ +
│ │ │ │ +
434 SeqJac (const M& A, int n, real_field_type w)
│ │ │ │ +
435 : _A_(A), _n(n), _w(w)
│ │ │ │ +
436 {
│ │ │ │ + │ │ │ │ +
438 }
│ │ │ │ +
│ │ │ │ +
439
│ │ │ │ +
│ │ │ │ +
453 SeqJac (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ +
454 : SeqJac(A->getmat(), configuration)
│ │ │ │ +
455 {}
│ │ │ │ +
│ │ │ │ +
456
│ │ │ │ +
│ │ │ │ +
470 SeqJac (const M& A, const ParameterTree& configuration)
│ │ │ │ +
471 : SeqJac(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
│ │ │ │ +
472 {}
│ │ │ │ +
│ │ │ │ +
473
│ │ │ │ +
│ │ │ │ +
479 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ +
480 {}
│ │ │ │ +
│ │ │ │ +
481
│ │ │ │ +
│ │ │ │ +
487 virtual void apply (X& v, const Y& d)
│ │ │ │ +
488 {
│ │ │ │ +
489 for (int i=0; i<_n; i++) {
│ │ │ │ +
490 dbjac(_A_,v,d,_w,BL<l>());
│ │ │ │ +
491 }
│ │ │ │ +
492 }
│ │ │ │ +
│ │ │ │ +
493
│ │ │ │ +
│ │ │ │ +
499 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ +
500 {}
│ │ │ │ +
│ │ │ │ +
501
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
504 {
│ │ │ │ + │ │ │ │
506 }
│ │ │ │
│ │ │ │
507
│ │ │ │ -
│ │ │ │ -
508 void buildGlobalLookup(std::size_t size)
│ │ │ │ -
509 {
│ │ │ │ -
510 if(globalLookup_) {
│ │ │ │ -
511 if(pis.seqNo()==oldseqNo)
│ │ │ │ -
512 // Nothing changed!
│ │ │ │ -
513 return;
│ │ │ │ -
514 delete globalLookup_;
│ │ │ │ -
515 }
│ │ │ │ -
516 globalLookup_ = new GlobalLookupIndexSet(pis, size);
│ │ │ │ -
517 oldseqNo = pis.seqNo();
│ │ │ │ -
518 }
│ │ │ │ -
│ │ │ │ +
508 private:
│ │ │ │ +
510 const M& _A_;
│ │ │ │ +
512 int _n;
│ │ │ │ +
514 real_field_type _w;
│ │ │ │ +
515 };
│ │ │ │ +
│ │ │ │ +
516 DUNE_REGISTER_PRECONDITIONER("jac", defaultPreconditionerBlockLevelCreator<Dune::SeqJac>());
│ │ │ │ +
517
│ │ │ │ +
518
│ │ │ │
519
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
521 {
│ │ │ │ -
522 delete globalLookup_;
│ │ │ │ -
523 globalLookup_=0;
│ │ │ │ -
524 }
│ │ │ │ -
│ │ │ │ -
525
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
527 {
│ │ │ │ -
528 assert(globalLookup_ != 0);
│ │ │ │ -
529 return *globalLookup_;
│ │ │ │ -
530 }
│ │ │ │ -
│ │ │ │ -
531
│ │ │ │ -
537 template<class T1>
│ │ │ │ -
│ │ │ │ -
538 void project (T1& x) const
│ │ │ │ -
539 {
│ │ │ │ -
540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
│ │ │ │ -
541 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ -
542 x[i->local().local()] = 0;
│ │ │ │ -
543 }
│ │ │ │ -
│ │ │ │ -
544
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
556 bool freecomm_ = false)
│ │ │ │ -
557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
│ │ │ │ -
558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
│ │ │ │ -
559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
│ │ │ │ -
560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),
│ │ │ │ -
561 freecomm(freecomm_)
│ │ │ │ -
562 {}
│ │ │ │ -
│ │ │ │ -
563
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
│ │ │ │ -
574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
│ │ │ │ -
575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
│ │ │ │ -
576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm(false)
│ │ │ │ -
577 {}
│ │ │ │ -
│ │ │ │ -
578
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
587 MPI_Comm comm_,
│ │ │ │ - │ │ │ │ -
589 bool freecomm_ = false)
│ │ │ │ -
590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
│ │ │ │ -
591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
│ │ │ │ -
592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
│ │ │ │ -
593 globalLookup_(0), category_(cat_), freecomm(freecomm_)
│ │ │ │ -
594 {
│ │ │ │ -
595 // set up an ISTL index set
│ │ │ │ -
596 pis.beginResize();
│ │ │ │ -
597 for (localindex_iterator i=indexinfo.localIndices().begin(); i!=indexinfo.localIndices().end(); ++i)
│ │ │ │ -
598 {
│ │ │ │ -
599 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
│ │ │ │ -
601 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ -
602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
│ │ │ │ -
603 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ -
604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
│ │ │ │ -
605 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
│ │ │ │ -
606 }
│ │ │ │ -
607 pis.endResize();
│ │ │ │ -
608
│ │ │ │ -
609 // build remote indices WITHOUT communication
│ │ │ │ -
610 // std::cout << cc.rank() << ": build remote indices" << std::endl;
│ │ │ │ -
611 ri.setIndexSets(pis,pis,cc);
│ │ │ │ -
612 if (indexinfo.remoteIndices().size()>0)
│ │ │ │ -
613 {
│ │ │ │ -
614 remoteindex_iterator i=indexinfo.remoteIndices().begin();
│ │ │ │ -
615 int p = std::get<0>(*i);
│ │ │ │ -
616 RILM modifier = ri.template getModifier<false,true>(p);
│ │ │ │ -
617 typename PIS::const_iterator pi=pis.begin();
│ │ │ │ -
618 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
│ │ │ │ -
619 {
│ │ │ │ -
620 // handle processor change
│ │ │ │ -
621 if (p!=std::get<0>(*i))
│ │ │ │ -
622 {
│ │ │ │ -
623 p = std::get<0>(*i);
│ │ │ │ -
624 modifier = ri.template getModifier<false,true>(p);
│ │ │ │ -
625 pi=pis.begin();
│ │ │ │ -
626 }
│ │ │ │ -
627
│ │ │ │ -
628 // position to correct entry in parallel index set
│ │ │ │ -
629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())
│ │ │ │ -
630 ++pi;
│ │ │ │ -
631 if (pi==pis.end())
│ │ │ │ -
632 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
│ │ │ │ -
633
│ │ │ │ -
634 // insert entry
│ │ │ │ -
635 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
│ │ │ │ -
636 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
│ │ │ │ -
637 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
│ │ │ │ -
638 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
│ │ │ │ -
639 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
│ │ │ │ -
640 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
│ │ │ │ -
641 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
│ │ │ │ -
642 }
│ │ │ │ -
643 }else{
│ │ │ │ -
644 // Force remote indices to be synced!
│ │ │ │ -
645 ri.template getModifier<false,true>(0);
│ │ │ │ -
646 }
│ │ │ │ -
647 }
│ │ │ │ -
│ │ │ │ -
648
│ │ │ │ -
649 // destructor: free memory in some objects
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
651 {
│ │ │ │ -
652 ri.free();
│ │ │ │ -
653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
│ │ │ │ -
654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
│ │ │ │ -
655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
│ │ │ │ -
656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
│ │ │ │ -
657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
│ │ │ │ -
658 if (globalLookup_) delete globalLookup_;
│ │ │ │ -
659 if (freecomm==true)
│ │ │ │ -
660 if(comm!=MPI_COMM_NULL)
│ │ │ │ -
661 {
│ │ │ │ -
662#ifdef MPI_2
│ │ │ │ -
663 // If it is possible to query whether MPI_Finalize
│ │ │ │ -
664 // was called, only free the communicator before
│ │ │ │ -
665 // calling MPI_Finalize.
│ │ │ │ -
666 int wasFinalized = 0;
│ │ │ │ -
667 MPI_Finalized( &wasFinalized );
│ │ │ │ -
668 if(!wasFinalized)
│ │ │ │ -
669#endif
│ │ │ │ -
670 MPI_Comm_free(&comm);
│ │ │ │ -
671 }
│ │ │ │ -
672 }
│ │ │ │ -
│ │ │ │ -
673
│ │ │ │ -
674 private:
│ │ │ │ - │ │ │ │ -
676 {}
│ │ │ │ -
677 MPI_Comm comm;
│ │ │ │ -
678 Communication<MPI_Comm> cc;
│ │ │ │ -
679 PIS pis;
│ │ │ │ -
680 RI ri;
│ │ │ │ -
681 mutable IF OwnerToAllInterface;
│ │ │ │ -
682 mutable bool OwnerToAllInterfaceBuilt;
│ │ │ │ -
683 mutable IF OwnerOverlapToAllInterface;
│ │ │ │ -
684 mutable bool OwnerOverlapToAllInterfaceBuilt;
│ │ │ │ -
685 mutable IF OwnerCopyToAllInterface;
│ │ │ │ -
686 mutable bool OwnerCopyToAllInterfaceBuilt;
│ │ │ │ -
687 mutable IF OwnerCopyToOwnerCopyInterface;
│ │ │ │ -
688 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
│ │ │ │ -
689 mutable IF CopyToAllInterface;
│ │ │ │ -
690 mutable bool CopyToAllInterfaceBuilt;
│ │ │ │ -
691 mutable std::vector<double> mask;
│ │ │ │ -
692 int oldseqNo;
│ │ │ │ -
693 GlobalLookupIndexSet* globalLookup_;
│ │ │ │ -
694 const SolverCategory::Category category_;
│ │ │ │ -
695 bool freecomm;
│ │ │ │ -
696 };
│ │ │ │ -
│ │ │ │ -
697
│ │ │ │ -
698#endif
│ │ │ │ -
699
│ │ │ │ -
700
│ │ │ │ -
703} // end namespace
│ │ │ │ -
704
│ │ │ │ -
705#endif
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
│ │ │ │ -
void testRedistributed(int s)
│ │ │ │ +
531 template<class M, class X, class Y, int l=1>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
533 public:
│ │ │ │ +
535 typedef typename std::remove_const<M>::type matrix_type;
│ │ │ │ +
537 typedef typename matrix_type :: block_type block_type;
│ │ │ │ +
539 typedef X domain_type;
│ │ │ │ +
541 typedef Y range_type;
│ │ │ │ +
542
│ │ │ │ +
544 typedef typename X::field_type field_type;
│ │ │ │ +
545
│ │ │ │ +
547 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
549 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ +
550
│ │ │ │ + │ │ │ │ +
553
│ │ │ │ +
│ │ │ │ +
561 SeqILU (const M& A, real_field_type w, const bool resort = false )
│ │ │ │ +
562 : SeqILU( A, 0, w, resort ) // construct ILU(0)
│ │ │ │ +
563 {
│ │ │ │ +
564 }
│ │ │ │ +
│ │ │ │ +
565
│ │ │ │ +
│ │ │ │ +
580 SeqILU (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ +
581 : SeqILU(A->getmat(), configuration)
│ │ │ │ +
582 {}
│ │ │ │ +
│ │ │ │ +
583
│ │ │ │ +
│ │ │ │ +
598 SeqILU(const M& A, const ParameterTree& config)
│ │ │ │ +
599 : SeqILU(A, config.get("n", 0),
│ │ │ │ +
600 config.get<real_field_type>("relaxation", 1.0),
│ │ │ │ +
601 config.get("resort", false))
│ │ │ │ +
602 {}
│ │ │ │ +
│ │ │ │ +
603
│ │ │ │ +
│ │ │ │ +
612 SeqILU (const M& A, int n, real_field_type w, const bool resort = false )
│ │ │ │ +
613 : ILU_(),
│ │ │ │ +
614 lower_(),
│ │ │ │ +
615 upper_(),
│ │ │ │ +
616 inv_(),
│ │ │ │ +
617 w_(w),
│ │ │ │ +
618 wNotIdentity_([w]{using std::abs; return abs(w - real_field_type(1)) > 1e-15;}() )
│ │ │ │ +
619 {
│ │ │ │ +
620 if( n == 0 )
│ │ │ │ +
621 {
│ │ │ │ +
622 // copy A
│ │ │ │ +
623 ILU_.reset( new matrix_type( A ) );
│ │ │ │ +
624 // create ILU(0) decomposition
│ │ │ │ + │ │ │ │ +
626 }
│ │ │ │ +
627 else
│ │ │ │ +
628 {
│ │ │ │ +
629 // create matrix in build mode
│ │ │ │ +
630 ILU_.reset( new matrix_type( A.N(), A.M(), matrix_type::row_wise) );
│ │ │ │ +
631 // create ILU(n) decomposition
│ │ │ │ +
632 ILU::blockILUDecomposition( A, n, *ILU_ );
│ │ │ │ +
633 }
│ │ │ │ +
634
│ │ │ │ +
635 if( resort )
│ │ │ │ +
636 {
│ │ │ │ +
637 // store ILU in simple CRS format
│ │ │ │ +
638 ILU::convertToCRS( *ILU_, lower_, upper_, inv_ );
│ │ │ │ +
639 ILU_.reset();
│ │ │ │ +
640 }
│ │ │ │ +
641 }
│ │ │ │ +
│ │ │ │ +
642
│ │ │ │ +
│ │ │ │ +
648 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ +
649 {}
│ │ │ │ +
│ │ │ │ +
650
│ │ │ │ +
│ │ │ │ +
656 virtual void apply (X& v, const Y& d)
│ │ │ │ +
657 {
│ │ │ │ +
658 if( ILU_ )
│ │ │ │ +
659 {
│ │ │ │ +
660 ILU::blockILUBacksolve( *ILU_, v, d);
│ │ │ │ +
661 }
│ │ │ │ +
662 else
│ │ │ │ +
663 {
│ │ │ │ +
664 ILU::blockILUBacksolve(lower_, upper_, inv_, v, d);
│ │ │ │ +
665 }
│ │ │ │ +
666
│ │ │ │ +
667 if( wNotIdentity_ )
│ │ │ │ +
668 {
│ │ │ │ +
669 v *= w_;
│ │ │ │ +
670 }
│ │ │ │ +
671 }
│ │ │ │ +
│ │ │ │ +
672
│ │ │ │ +
│ │ │ │ +
678 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ +
679 {}
│ │ │ │ +
│ │ │ │ +
680
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
683 {
│ │ │ │ + │ │ │ │ +
685 }
│ │ │ │ +
│ │ │ │ +
686
│ │ │ │ +
687 protected:
│ │ │ │ +
689 std::unique_ptr< matrix_type > ILU_;
│ │ │ │ +
690
│ │ │ │ + │ │ │ │ + │ │ │ │ +
694 std::vector< block_type, typename matrix_type::allocator_type > inv_;
│ │ │ │ +
695
│ │ │ │ + │ │ │ │ +
699 const bool wNotIdentity_;
│ │ │ │ +
700 };
│ │ │ │ +
│ │ │ │ +
701 DUNE_REGISTER_PRECONDITIONER("ilu", defaultPreconditionerBlockLevelCreator<Dune::SeqILU>());
│ │ │ │ +
702
│ │ │ │ +
703
│ │ │ │ +
712 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
713 class Richardson : public Preconditioner<X,Y> {
│ │ │ │ +
714 public:
│ │ │ │ +
716 typedef X domain_type;
│ │ │ │ +
718 typedef Y range_type;
│ │ │ │ +
720 typedef typename X::field_type field_type;
│ │ │ │ +
722 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
724 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ +
725
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
732 _w(w)
│ │ │ │ +
733 {}
│ │ │ │ +
│ │ │ │ +
734
│ │ │ │ +
│ │ │ │ +
746 Richardson (const ParameterTree& configuration)
│ │ │ │ +
747 : Richardson(configuration.get<real_field_type>("relaxation", 1.0))
│ │ │ │ +
748 {}
│ │ │ │ +
│ │ │ │ +
749
│ │ │ │ +
│ │ │ │ +
755 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
│ │ │ │ +
756 {}
│ │ │ │ +
│ │ │ │ +
757
│ │ │ │ +
│ │ │ │ +
763 virtual void apply (X& v, const Y& d)
│ │ │ │ +
764 {
│ │ │ │ +
765 v = d;
│ │ │ │ +
766 v *= _w;
│ │ │ │ +
767 }
│ │ │ │ +
│ │ │ │ +
768
│ │ │ │ +
│ │ │ │ +
774 virtual void post ([[maybe_unused]] X& x)
│ │ │ │ +
775 {}
│ │ │ │ +
│ │ │ │ +
776
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
779 {
│ │ │ │ + │ │ │ │ +
781 }
│ │ │ │ +
│ │ │ │ +
782
│ │ │ │ +
783 private:
│ │ │ │ + │ │ │ │ +
786 };
│ │ │ │ +
│ │ │ │ +
787 DUNE_REGISTER_PRECONDITIONER("richardson", [](auto tl, const auto& /* mat */, const ParameterTree& config){
│ │ │ │ +
788 using D = typename Dune::TypeListElement<1, decltype(tl)>::type;
│ │ │ │ +
789 using R = typename Dune::TypeListElement<2, decltype(tl)>::type;
│ │ │ │ +
790 return std::make_shared<Richardson<D,R>>(config);
│ │ │ │ +
791 });
│ │ │ │ +
792
│ │ │ │ +
793
│ │ │ │ +
804 template< class M, class X, class Y >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
806 : public Preconditioner< X, Y >
│ │ │ │ +
807 {
│ │ │ │ +
808 typedef SeqILDL< M, X, Y > This;
│ │ │ │ + │ │ │ │ +
810
│ │ │ │ +
811 public:
│ │ │ │ +
813 typedef std::remove_const_t< M > matrix_type;
│ │ │ │ +
815 typedef X domain_type;
│ │ │ │ +
817 typedef Y range_type;
│ │ │ │ +
819 typedef typename X::field_type field_type;
│ │ │ │ +
821 typedef Simd::Scalar<field_type> scalar_field_type;
│ │ │ │ +
823 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
│ │ │ │ +
824
│ │ │ │ +
│ │ │ │ +
837 SeqILDL (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
│ │ │ │ +
838 : SeqILDL(A->getmat(), configuration)
│ │ │ │ +
839 {}
│ │ │ │ +
│ │ │ │ +
840
│ │ │ │ +
│ │ │ │ +
853 SeqILDL(const matrix_type& A, const ParameterTree& config)
│ │ │ │ +
854 : SeqILDL(A, config.get<real_field_type>("relaxation", 1.0))
│ │ │ │ +
855 {}
│ │ │ │ +
│ │ │ │ +
856
│ │ │ │ +
│ │ │ │ +
865 explicit SeqILDL ( const matrix_type &A, real_field_type relax = real_field_type( 1 ) )
│ │ │ │ +
866 : decomposition_( A.N(), A.M(), matrix_type::random ),
│ │ │ │ +
867 relax_( relax )
│ │ │ │ +
868 {
│ │ │ │ +
869 // setup row sizes for lower triangular matrix
│ │ │ │ +
870 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
871 {
│ │ │ │ +
872 const auto &A_i = *i;
│ │ │ │ +
873 const auto ij = A_i.find( i.index() );
│ │ │ │ +
874 if( ij != A_i.end() )
│ │ │ │ +
875 decomposition_.setrowsize( i.index(), ij.offset()+1 );
│ │ │ │ +
876 else
│ │ │ │ +
877 DUNE_THROW( ISTLError, "diagonal entry missing" );
│ │ │ │ +
878 }
│ │ │ │ +
879 decomposition_.endrowsizes();
│ │ │ │ +
880
│ │ │ │ +
881 // setup row indices for lower triangular matrix
│ │ │ │ +
882 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
883 {
│ │ │ │ +
884 const auto &A_i = *i;
│ │ │ │ +
885 for( auto ij = A_i.begin(); ij.index() < i.index() ; ++ij )
│ │ │ │ +
886 decomposition_.addindex( i.index(), ij.index() );
│ │ │ │ +
887 decomposition_.addindex( i.index(), i.index() );
│ │ │ │ +
888 }
│ │ │ │ +
889 decomposition_.endindices();
│ │ │ │ +
890
│ │ │ │ +
891 // copy values of lower triangular matrix
│ │ │ │ +
892 auto i = A.begin();
│ │ │ │ +
893 for( auto row = decomposition_.begin(), rowend = decomposition_.end(); row != rowend; ++row, ++i )
│ │ │ │ +
894 {
│ │ │ │ +
895 auto ij = i->begin();
│ │ │ │ +
896 for( auto col = row->begin(), colend = row->end(); col != colend; ++col, ++ij )
│ │ │ │ +
897 *col = *ij;
│ │ │ │ +
898 }
│ │ │ │ +
899
│ │ │ │ +
900 // perform ILDL decomposition
│ │ │ │ +
901 bildl_decompose( decomposition_ );
│ │ │ │ +
902 }
│ │ │ │ +
│ │ │ │ +
903
│ │ │ │ +
│ │ │ │ +
905 void pre ([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override
│ │ │ │ +
906 {}
│ │ │ │ +
│ │ │ │ +
907
│ │ │ │ +
│ │ │ │ +
909 void apply ( X &v, const Y &d ) override
│ │ │ │ +
910 {
│ │ │ │ +
911 bildl_backsolve( decomposition_, v, d, true );
│ │ │ │ +
912 v *= relax_;
│ │ │ │ +
913 }
│ │ │ │ +
│ │ │ │ +
914
│ │ │ │ +
│ │ │ │ +
916 void post ([[maybe_unused]] X &x) override
│ │ │ │ +
917 {}
│ │ │ │ +
│ │ │ │ +
918
│ │ │ │ + │ │ │ │ +
921
│ │ │ │ +
922 private:
│ │ │ │ +
923 matrix_type decomposition_;
│ │ │ │ +
924 real_field_type relax_;
│ │ │ │ +
925 };
│ │ │ │ +
│ │ │ │ +
926 DUNE_REGISTER_PRECONDITIONER("ildl", defaultPreconditionerCreator<Dune::SeqILDL>());
│ │ │ │ +
927
│ │ │ │ +
930} // end namespace
│ │ │ │ +
931
│ │ │ │ +
932
│ │ │ │ +
933#endif
│ │ │ │ + │ │ │ │ +
#define DUNE_REGISTER_PRECONDITIONER(name,...)
Definition solverregistry.hh:16
│ │ │ │ + │ │ │ │ +
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
The incomplete LU factorization kernels.
│ │ │ │ +
Some handy generic functions for ISTL matrices.
│ │ │ │ +
Incomplete LDL decomposition.
│ │ │ │ +
Define general, extensible interface for inverse operators.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
void bsorb(const M &A, X &x, const Y &b, const K &w)
SSOR step.
Definition gsetc.hh:646
│ │ │ │ +
void dbjac(const M &A, X &x, const Y &b, const K &w)
Jacobi step.
Definition gsetc.hh:658
│ │ │ │ +
void bsorf(const M &A, X &x, const Y &b, const K &w)
SOR step.
Definition gsetc.hh:634
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
void bildl_decompose(Matrix &A)
compute ILDL decomposition of a symmetric matrix A
Definition ildl.hh:88
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │ +
void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
Definition ildl.hh:149
│ │ │ │ +
void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv)
convert ILU decomposition into CRS format for lower and upper triangular and inverse.
Definition ilu.hh:307
│ │ │ │ +
void blockILUBacksolve(const M &A, X &v, const Y &d)
LU backsolve with stored inverse.
Definition ilu.hh:94
│ │ │ │ +
void blockILU0Decomposition(M &A)
compute ILU decomposition of A. A is overwritten by its decomposition
Definition ilu.hh:33
│ │ │ │ +
void blockILUDecomposition(const M &A, int n, M &ILU)
Definition ilu.hh:167
│ │ │ │ +
compile-time parameter for block recursion depth
Definition gsetc.hh:45
│ │ │ │ +
a simple compressed row storage matrix class
Definition ilu.hh:259
│ │ │ │
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
Attribute set for overlapping Schwarz.
Definition owneroverlapcopy.hh:59
│ │ │ │ -
AttributeSet
Definition owneroverlapcopy.hh:60
│ │ │ │ -
@ owner
Definition owneroverlapcopy.hh:61
│ │ │ │ -
@ copy
Definition owneroverlapcopy.hh:61
│ │ │ │ -
@ overlap
Definition owneroverlapcopy.hh:61
│ │ │ │ -
Information about the index distribution.
Definition owneroverlapcopy.hh:78
│ │ │ │ -
std::tuple< GlobalIdType, LocalIdType, int > IndexTripel
A triple describing a local index.
Definition owneroverlapcopy.hh:92
│ │ │ │ -
void addRemoteIndex(const RemoteIndexTripel &x)
Add a new remote index triple to the set of remote indices.
Definition owneroverlapcopy.hh:120
│ │ │ │ -
G GlobalIdType
The type of the global index.
Definition owneroverlapcopy.hh:81
│ │ │ │ -
const std::set< IndexTripel > & localIndices() const
Get the set of indices local to the process.
Definition owneroverlapcopy.hh:133
│ │ │ │ -
const std::set< RemoteIndexTripel > & remoteIndices() const
Get the set of remote indices.
Definition owneroverlapcopy.hh:142
│ │ │ │ -
L LocalIdType
The type of the local index.
Definition owneroverlapcopy.hh:84
│ │ │ │ -
void clear()
Remove all indices from the sets.
Definition owneroverlapcopy.hh:150
│ │ │ │ -
void addLocalIndex(const IndexTripel &x)
Add a new index triple to the set of local indices.
Definition owneroverlapcopy.hh:106
│ │ │ │ -
std::tuple< int, GlobalIdType, int > RemoteIndexTripel
A triple describing a remote index.
Definition owneroverlapcopy.hh:99
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet
Definition owneroverlapcopy.hh:195
│ │ │ │ -
const GlobalLookupIndexSet & globalLookup() const
Definition owneroverlapcopy.hh:526
│ │ │ │ -
FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
Compute the global Euclidean norm of a vector.
Definition owneroverlapcopy.hh:425
│ │ │ │ -
void buildOwnerOverlapToAllInterface() const
Definition owneroverlapcopy.hh:233
│ │ │ │ -
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS
Definition owneroverlapcopy.hh:188
│ │ │ │ -
void buildOwnerCopyToAllInterface() const
Definition owneroverlapcopy.hh:254
│ │ │ │ -
void buildOwnerCopyToOwnerCopyInterface() const
Definition owneroverlapcopy.hh:266
│ │ │ │ -
OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Constructor.
Definition owneroverlapcopy.hh:586
│ │ │ │ -
SolverCategory::Category category() const
Get Solver Category.
Definition owneroverlapcopy.hh:295
│ │ │ │ -
void addOwnerCopyToOwnerCopy(const T &source, T &dest) const
Communicate values from owner and copy data points to owner and copy data points and add them to thos...
Definition owneroverlapcopy.hh:379
│ │ │ │ -
void buildCopyToAllInterface() const
Definition owneroverlapcopy.hh:279
│ │ │ │ -
Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags
Definition owneroverlapcopy.hh:446
│ │ │ │ -
RemoteIndices & remoteIndices()
Get the underlying remote indices.
Definition owneroverlapcopy.hh:490
│ │ │ │ -
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:462
│ │ │ │ -
Dune::RemoteIndices< PIS > RI
Definition owneroverlapcopy.hh:189
│ │ │ │ -
void buildGlobalLookup(std::size_t size)
Definition owneroverlapcopy.hh:508
│ │ │ │ -
void addOwnerOverlapToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points and add them to those values.
Definition owneroverlapcopy.hh:345
│ │ │ │ -
Dune::RemoteIndices< PIS > RemoteIndices
The type of the remote indices.
Definition owneroverlapcopy.hh:452
│ │ │ │ -
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition owneroverlapcopy.hh:538
│ │ │ │ -
Dune::AllSet< AttributeSet > AllSet
Definition owneroverlapcopy.hh:197
│ │ │ │ -
Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > OwnerOverlapSet
Definition owneroverlapcopy.hh:196
│ │ │ │ -
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition owneroverlapcopy.hh:328
│ │ │ │ -
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition owneroverlapcopy.hh:456
│ │ │ │ -
Dune::Interface IF
Definition owneroverlapcopy.hh:193
│ │ │ │ -
~OwnerOverlapCopyCommunication()
Definition owneroverlapcopy.hh:650
│ │ │ │ -
void buildGlobalLookup()
Definition owneroverlapcopy.hh:495
│ │ │ │ -
Dune::BufferedCommunicator BC
Definition owneroverlapcopy.hh:192
│ │ │ │ -
OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Construct the communication without any indices.
Definition owneroverlapcopy.hh:554
│ │ │ │ -
ParallelIndexSet & indexSet()
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:480
│ │ │ │ -
void dot(const T1 &x, const T1 &y, T2 &result) const
Compute a global dot product of two vectors.
Definition owneroverlapcopy.hh:398
│ │ │ │ -
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
│ │ │ │ -
OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
Construct the communication without any indices using MPI_COMM_WORLD.
Definition owneroverlapcopy.hh:572
│ │ │ │ -
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
Definition owneroverlapcopy.hh:194
│ │ │ │ -
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
│ │ │ │ -
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
│ │ │ │ -
friend void loadMatrixMarket(M &, const std::string &, OwnerOverlapCopyCommunication< G, L > &, bool)
Load a parallel matrix/vector stored in matrix market format.
Definition matrixmarket.hh:1269
│ │ │ │ -
RI::RemoteIndex RX
Definition owneroverlapcopy.hh:191
│ │ │ │ -
void addOwnerCopyToAll(const T &source, T &dest) const
Communicate values from owner and copy data points to all other data points and add them to those val...
Definition owneroverlapcopy.hh:362
│ │ │ │ -
void freeGlobalLookup()
Definition owneroverlapcopy.hh:520
│ │ │ │ -
Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM
Definition owneroverlapcopy.hh:190
│ │ │ │ -
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
│ │ │ │ -
void buildOwnerToAllInterface() const
Definition owneroverlapcopy.hh:244
│ │ │ │ -
gather/scatter callback for communcation
Definition owneroverlapcopy.hh:204
│ │ │ │ -
static V gather(const T &a, std::size_t i)
Definition owneroverlapcopy.hh:207
│ │ │ │ -
static void scatter(T &a, V v, std::size_t i)
Definition owneroverlapcopy.hh:212
│ │ │ │ -
CommPolicy< T >::IndexedType V
Definition owneroverlapcopy.hh:205
│ │ │ │ - │ │ │ │ -
CommPolicy< T >::IndexedType V
Definition owneroverlapcopy.hh:220
│ │ │ │ -
static V gather(const T &a, std::size_t i)
Definition owneroverlapcopy.hh:222
│ │ │ │ -
static void scatter(T &a, V v, std::size_t i)
Definition owneroverlapcopy.hh:227
│ │ │ │ +
size_type M() const
Return the number of columns.
Definition matrix.hh:700
│ │ │ │ +
size_type N() const
Return the number of rows.
Definition matrix.hh:695
│ │ │ │ +
static void check(const Matrix &mat)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:53
│ │ │ │ +
A linear operator exporting itself in matrix form.
Definition operators.hh:109
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Turns an InverseOperator into a Preconditioner.
Definition preconditioners.hh:75
│ │ │ │ +
O::range_type range_type
The range type of the preconditioner.
Definition preconditioners.hh:80
│ │ │ │ +
O::domain_type domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:78
│ │ │ │ +
virtual void post(domain_type &)
Clean up.
Definition preconditioners.hh:111
│ │ │ │ +
range_type::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:82
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:86
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:84
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:115
│ │ │ │ +
virtual void pre(domain_type &, range_type &)
Prepare the preconditioner.
Definition preconditioners.hh:101
│ │ │ │ +
InverseOperator2Preconditioner(InverseOperator &inverse_operator)
Construct the preconditioner from the solver.
Definition preconditioners.hh:94
│ │ │ │ +
O InverseOperator
type of the wrapped inverse operator
Definition preconditioners.hh:88
│ │ │ │ +
virtual void apply(domain_type &v, const range_type &d)
Apply one step of the preconditioner to the system A(v)=d.
Definition preconditioners.hh:104
│ │ │ │ +
Sequential SSOR preconditioner.
Definition preconditioners.hh:141
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:229
│ │ │ │ +
SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:182
│ │ │ │ +
SeqSSOR(const M &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:199
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:233
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:150
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:152
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:146
│ │ │ │ +
M matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:144
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:216
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:208
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:148
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:154
│ │ │ │ +
SeqSSOR(const M &A, int n, real_field_type w)
Constructor.
Definition preconditioners.hh:163
│ │ │ │ +
Sequential SOR preconditioner.
Definition preconditioners.hh:261
│ │ │ │ +
SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:302
│ │ │ │ +
M matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:264
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:274
│ │ │ │ +
void apply(X &v, const Y &d)
Apply the preconditioner in a special direction.
Definition preconditioners.hh:350
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:266
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:367
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:328
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:272
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:371
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:336
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:268
│ │ │ │ +
SeqSOR(const M &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:319
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:270
│ │ │ │ +
SeqSOR(const M &A, int n, real_field_type w)
Constructor.
Definition preconditioners.hh:283
│ │ │ │ +
The sequential jacobian preconditioner.
Definition preconditioners.hh:412
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:499
│ │ │ │ +
SeqJac(const M &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:470
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:487
│ │ │ │ +
M matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:415
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:423
│ │ │ │ +
SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:453
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:421
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:479
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:417
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:425
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:503
│ │ │ │ +
SeqJac(const M &A, int n, real_field_type w)
Constructor.
Definition preconditioners.hh:434
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:419
│ │ │ │ +
Sequential ILU preconditioner.
Definition preconditioners.hh:532
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:678
│ │ │ │ +
SeqILU(const M &A, int n, real_field_type w, const bool resort=false)
Constructor.
Definition preconditioners.hh:612
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:648
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the preconditioner.
Definition preconditioners.hh:656
│ │ │ │ +
ILU::CRS< block_type, typename M::allocator_type > CRS
type of ILU storage
Definition preconditioners.hh:552
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:541
│ │ │ │ +
CRS lower_
The ILU(n) decomposition of the matrix. As storage a CRS structure is used.
Definition preconditioners.hh:692
│ │ │ │ +
const bool wNotIdentity_
true if w != 1.0
Definition preconditioners.hh:699
│ │ │ │ +
SeqILU(const M &A, const ParameterTree &config)
Constructor.
Definition preconditioners.hh:598
│ │ │ │ +
std::remove_const< M >::type matrix_type
The matrix type the preconditioner is for.
Definition preconditioners.hh:535
│ │ │ │ +
matrix_type::block_type block_type
block type of matrix
Definition preconditioners.hh:537
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:549
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:544
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:682
│ │ │ │ +
SeqILU(const M &A, real_field_type w, const bool resort=false)
Constructor.
Definition preconditioners.hh:561
│ │ │ │ +
const real_field_type w_
The relaxation factor to use.
Definition preconditioners.hh:697
│ │ │ │ +
SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:580
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:539
│ │ │ │ +
std::vector< block_type, typename matrix_type::allocator_type > inv_
Definition preconditioners.hh:694
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:547
│ │ │ │ +
std::unique_ptr< matrix_type > ILU_
The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used.
Definition preconditioners.hh:689
│ │ │ │ +
CRS upper_
Definition preconditioners.hh:693
│ │ │ │ +
Richardson preconditioner.
Definition preconditioners.hh:713
│ │ │ │ +
X::field_type field_type
The field type of the preconditioner.
Definition preconditioners.hh:720
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:778
│ │ │ │ +
Y range_type
The range type of the preconditioner.
Definition preconditioners.hh:718
│ │ │ │ +
virtual void pre(X &x, Y &b)
Prepare the preconditioner.
Definition preconditioners.hh:755
│ │ │ │ +
Richardson(real_field_type w=1.0)
Constructor.
Definition preconditioners.hh:731
│ │ │ │ +
virtual void post(X &x)
Clean up.
Definition preconditioners.hh:774
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:724
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:722
│ │ │ │ +
Richardson(const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:746
│ │ │ │ +
X domain_type
The domain type of the preconditioner.
Definition preconditioners.hh:716
│ │ │ │ +
virtual void apply(X &v, const Y &d)
Apply the precondioner.
Definition preconditioners.hh:763
│ │ │ │ +
sequential ILDL preconditioner
Definition preconditioners.hh:807
│ │ │ │ +
SeqILDL(const matrix_type &A, const ParameterTree &config)
Constructor.
Definition preconditioners.hh:853
│ │ │ │ +
SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1))
constructor
Definition preconditioners.hh:865
│ │ │ │ +
X domain_type
domain type of the preconditioner
Definition preconditioners.hh:815
│ │ │ │ +
void post(X &x) override
Clean up.
Definition preconditioners.hh:916
│ │ │ │ +
Y range_type
range type of the preconditioner
Definition preconditioners.hh:817
│ │ │ │ +
std::remove_const_t< M > matrix_type
type of matrix the preconditioner is for
Definition preconditioners.hh:813
│ │ │ │ +
void apply(X &v, const Y &d) override
Apply one step of the preconditioner to the system A(v)=d.
Definition preconditioners.hh:909
│ │ │ │ +
FieldTraits< scalar_field_type >::real_type real_field_type
real scalar type underlying the field_type
Definition preconditioners.hh:823
│ │ │ │ +
SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
Constructor.
Definition preconditioners.hh:837
│ │ │ │ +
void pre(X &x, Y &b) override
Prepare the preconditioner.
Definition preconditioners.hh:905
│ │ │ │ +
Simd::Scalar< field_type > scalar_field_type
scalar type underlying the field_type
Definition preconditioners.hh:821
│ │ │ │ +
X::field_type field_type
field type of the preconditioner
Definition preconditioners.hh:819
│ │ │ │ +
SolverCategory::Category category() const override
Category of the preconditioner (see SolverCategory::Category)
Definition preconditioners.hh:920
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,839 +1,1027 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -owneroverlapcopy.hh │ │ │ │ │ +preconditioners.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH │ │ │ │ │ -6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_PRECONDITIONERS_HH │ │ │ │ │ +6#define DUNE_ISTL_PRECONDITIONERS_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include "cmath" │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ -18// MPI header │ │ │ │ │ -19#if HAVE_MPI │ │ │ │ │ -20#include │ │ │ │ │ -21#endif │ │ │ │ │ -22 │ │ │ │ │ -23#include │ │ │ │ │ -24 │ │ │ │ │ -25#if HAVE_MPI │ │ │ │ │ -26#include │ │ │ │ │ -27#include │ │ │ │ │ -28#include │ │ │ │ │ -29#include │ │ │ │ │ -30#endif │ │ │ │ │ -31 │ │ │ │ │ -32#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ -33#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ -34#include │ │ │ │ │ -35#include <_d_u_n_e_/_i_s_t_l_/_m_a_t_r_i_x_m_a_r_k_e_t_._h_h> │ │ │ │ │ -36 │ │ │ │ │ -37template class Comm> │ │ │ │ │ -_3_8void _t_e_s_t_R_e_d_i_s_t_r_i_b_u_t_e_d(int s); │ │ │ │ │ -39 │ │ │ │ │ -40 │ │ │ │ │ -41namespace _D_u_n_e { │ │ │ │ │ -42 │ │ │ │ │ -_5_8 struct _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ -59 { │ │ │ │ │ -_6_0 enum _A_t_t_r_i_b_u_t_e_S_e_t { │ │ │ │ │ -_6_1 _o_w_n_e_r=1, _o_v_e_r_l_a_p=2, _c_o_p_y=3 │ │ │ │ │ -_6_2 }; │ │ │ │ │ -63 }; │ │ │ │ │ -64 │ │ │ │ │ -76 template │ │ │ │ │ -_7_7 class _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d │ │ │ │ │ -78 { │ │ │ │ │ -79 public: │ │ │ │ │ -_8_1 typedef G _G_l_o_b_a_l_I_d_T_y_p_e; │ │ │ │ │ -82 │ │ │ │ │ -_8_4 typedef L _L_o_c_a_l_I_d_T_y_p_e; │ │ │ │ │ -85 │ │ │ │ │ -_9_2 typedef std::tuple _I_n_d_e_x_T_r_i_p_e_l; │ │ │ │ │ -_9_9 typedef std::tuple _R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l; │ │ │ │ │ +18#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h> │ │ │ │ │ +19#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ +20#include "_s_o_l_v_e_r_._h_h" │ │ │ │ │ +21#include "_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h" │ │ │ │ │ +22#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +23#include "_m_a_t_r_i_x_u_t_i_l_s_._h_h" │ │ │ │ │ +24#include "_g_s_e_t_c_._h_h" │ │ │ │ │ +25#include "_i_l_d_l_._h_h" │ │ │ │ │ +26#include "_i_l_u_._h_h" │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29namespace _D_u_n_e { │ │ │ │ │ +72 template │ │ │ │ │ +_7_3 class _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r : │ │ │ │ │ +74 public _P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +75 { │ │ │ │ │ +76 public: │ │ │ │ │ +_7_8 typedef typename O::domain_type _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_8_0 typedef typename O::range_type _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_8_2 typedef typename range_type::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_8_4 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_8_6 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_8_8 typedef O _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r; │ │ │ │ │ +89 │ │ │ │ │ +_9_4 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r(_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r& inverse_operator) │ │ │ │ │ +95 : inverse_operator_(inverse_operator) │ │ │ │ │ +96 { │ │ │ │ │ +97 if(c != -1 && _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(inverse_operator_) != c) │ │ │ │ │ +98 DUNE_THROW(InvalidStateException, "User-supplied solver category does not │ │ │ │ │ +match that of the given inverse operator"); │ │ │ │ │ +99 } │ │ │ │ │ 100 │ │ │ │ │ -_1_0_6 void _a_d_d_L_o_c_a_l_I_n_d_e_x (const _I_n_d_e_x_T_r_i_p_e_l& x) │ │ │ │ │ -107 { │ │ │ │ │ -108 if (std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r && │ │ │ │ │ -109 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p && │ │ │ │ │ -110 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ -111 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"OwnerOverlapCopyCommunication: global index not in │ │ │ │ │ -index set"); │ │ │ │ │ -112 localindices.insert(x); │ │ │ │ │ -113 } │ │ │ │ │ -114 │ │ │ │ │ -_1_2_0 void _a_d_d_R_e_m_o_t_e_I_n_d_e_x (const _R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l& x) │ │ │ │ │ -121 { │ │ │ │ │ -122 if (std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r && │ │ │ │ │ -123 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p && │ │ │ │ │ -124 std::get<2>(x)!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ -125 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"OwnerOverlapCopyCommunication: global index not in │ │ │ │ │ -index set"); │ │ │ │ │ -126 remoteindices.insert(x); │ │ │ │ │ -127 } │ │ │ │ │ +_1_0_1 virtual void _p_r_e(_d_o_m_a_i_n___t_y_p_e&,_r_a_n_g_e___t_y_p_e&) │ │ │ │ │ +102 {} │ │ │ │ │ +103 │ │ │ │ │ +_1_0_4 virtual void _a_p_p_l_y(_d_o_m_a_i_n___t_y_p_e& v, const _r_a_n_g_e___t_y_p_e& d) │ │ │ │ │ +105 { │ │ │ │ │ +106 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t res; │ │ │ │ │ +107 _r_a_n_g_e___t_y_p_e copy(d); │ │ │ │ │ +108 inverse_operator_.apply(v, copy, res); │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +_1_1_1 virtual void _p_o_s_t(_d_o_m_a_i_n___t_y_p_e&) │ │ │ │ │ +112 {} │ │ │ │ │ +113 │ │ │ │ │ +_1_1_5 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +116 { │ │ │ │ │ +117 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(inverse_operator_); │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +120 private: │ │ │ │ │ +121 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r& inverse_operator_; │ │ │ │ │ +122 }; │ │ │ │ │ +123 │ │ │ │ │ +124 //===================================================================== │ │ │ │ │ +125 // Implementation of this interface for sequential ISTL-preconditioners │ │ │ │ │ +126 //===================================================================== │ │ │ │ │ +127 │ │ │ │ │ 128 │ │ │ │ │ -_1_3_3 const std::set& _l_o_c_a_l_I_n_d_i_c_e_s () const │ │ │ │ │ -134 { │ │ │ │ │ -135 return localindices; │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -_1_4_2 const std::set& _r_e_m_o_t_e_I_n_d_i_c_e_s () const │ │ │ │ │ -143 { │ │ │ │ │ -144 return remoteindices; │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ -_1_5_0 void _c_l_e_a_r () │ │ │ │ │ -151 { │ │ │ │ │ -152 localindices.clear(); │ │ │ │ │ -153 remoteindices.clear(); │ │ │ │ │ -154 } │ │ │ │ │ +140 template │ │ │ │ │ +_1_4_1 class _S_e_q_S_S_O_R : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +142 public: │ │ │ │ │ +_1_4_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_1_4_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_1_4_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_1_5_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_5_2 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_1_5_4 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ 155 │ │ │ │ │ -156 private: │ │ │ │ │ -158 std::set localindices; │ │ │ │ │ -160 std::set remoteindices; │ │ │ │ │ -161 }; │ │ │ │ │ -162 │ │ │ │ │ -163 │ │ │ │ │ -164#if HAVE_MPI │ │ │ │ │ -165 │ │ │ │ │ -172 template │ │ │ │ │ -_1_7_3 class _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -174 { │ │ │ │ │ -175 template │ │ │ │ │ -176 friend void _l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t(M&, │ │ │ │ │ -177 const std::string&, │ │ │ │ │ -178 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_G_,_L_>&, │ │ │ │ │ -179 bool); │ │ │ │ │ -180 // used types │ │ │ │ │ -181 typedef typename _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_G_l_o_b_a_l_I_d_T_y_p_e_,_L_o_c_a_l_I_d_T_y_p_e_>_:_:_I_n_d_e_x_T_r_i_p_e_l │ │ │ │ │ -IndexTripel; │ │ │ │ │ -182 typedef typename _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_G_l_o_b_a_l_I_d_T_y_p_e_,_L_o_c_a_l_I_d_T_y_p_e_>_:_: │ │ │ │ │ -_R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l RemoteIndexTripel; │ │ │ │ │ -183 typedef typename std::set::const_iterator localindex_iterator; │ │ │ │ │ -184 typedef typename std::set::const_iterator │ │ │ │ │ -remoteindex_iterator; │ │ │ │ │ -185 typedef typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_A_t_t_r_i_b_u_t_e_S_e_t _A_t_t_r_i_b_u_t_e_S_e_t; │ │ │ │ │ -186 typedef Dune::ParallelLocalIndex LI; │ │ │ │ │ -187 public: │ │ │ │ │ -_1_8_8 typedef Dune::ParallelIndexSet _P_I_S; │ │ │ │ │ -_1_8_9 typedef Dune::RemoteIndices _R_I; │ │ │ │ │ -_1_9_0 typedef Dune::RemoteIndexListModifier │ │ │ │ │ -_R_I_L_M; │ │ │ │ │ -_1_9_1 typedef typename RI::RemoteIndex _R_X; │ │ │ │ │ -_1_9_2 typedef Dune::BufferedCommunicator _B_C; │ │ │ │ │ -_1_9_3 typedef Dune::Interface _I_F; │ │ │ │ │ -_1_9_4 typedef EnumItem │ │ │ │ │ -_O_w_n_e_r_S_e_t; │ │ │ │ │ -_1_9_5 typedef EnumItem _C_o_p_y_S_e_t; │ │ │ │ │ -_1_9_6 typedef Combine,EnumItem,_A_t_t_r_i_b_u_t_e_S_e_t> _O_w_n_e_r_O_v_e_r_l_a_p_S_e_t; │ │ │ │ │ -_1_9_7 typedef Dune::AllSet _A_l_l_S_e_t; │ │ │ │ │ -198 protected: │ │ │ │ │ -199 │ │ │ │ │ -200 │ │ │ │ │ -202 template │ │ │ │ │ -_2_0_3 struct _C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -204 { │ │ │ │ │ -_2_0_5 typedef typename CommPolicy::IndexedType _V; │ │ │ │ │ -206 │ │ │ │ │ -_2_0_7 static _V _g_a_t_h_e_r(const T& a, std::size_t i) │ │ │ │ │ -208 { │ │ │ │ │ -209 return a[i]; │ │ │ │ │ -210 } │ │ │ │ │ -211 │ │ │ │ │ -_2_1_2 static void _s_c_a_t_t_e_r(T& a, _V v, std::size_t i) │ │ │ │ │ -213 { │ │ │ │ │ -214 a[i] = v; │ │ │ │ │ -215 } │ │ │ │ │ -216 }; │ │ │ │ │ -217 template │ │ │ │ │ -_2_1_8 struct _A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -219 { │ │ │ │ │ -_2_2_0 typedef typename CommPolicy::IndexedType _V; │ │ │ │ │ -221 │ │ │ │ │ -_2_2_2 static _V _g_a_t_h_e_r(const T& a, std::size_t i) │ │ │ │ │ -223 { │ │ │ │ │ -224 return a[i]; │ │ │ │ │ -225 } │ │ │ │ │ -226 │ │ │ │ │ -_2_2_7 static void _s_c_a_t_t_e_r(T& a, _V v, std::size_t i) │ │ │ │ │ -228 { │ │ │ │ │ -229 a[i] += v; │ │ │ │ │ -230 } │ │ │ │ │ -231 }; │ │ │ │ │ -232 │ │ │ │ │ -_2_3_3 void _b_u_i_l_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ +_1_6_3 _S_e_q_S_S_O_R (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w) │ │ │ │ │ +164 : _A_(A), _n(n), _w(w) │ │ │ │ │ +165 { │ │ │ │ │ +166 _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_M_,_l_>_:_:_c_h_e_c_k(_A_); │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +_1_8_2 _S_e_q_S_S_O_R (const std::shared_ptr>& A, │ │ │ │ │ +const ParameterTree& configuration) │ │ │ │ │ +183 : _S_e_q_S_S_O_R(A->getmat(), configuration) │ │ │ │ │ +184 {} │ │ │ │ │ +185 │ │ │ │ │ +_1_9_9 _S_e_q_S_S_O_R (const M& A, const ParameterTree& configuration) │ │ │ │ │ +200 : _S_e_q_S_S_O_R(A, configuration._g_e_t("iterations",1), │ │ │ │ │ +configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation",1.0)) │ │ │ │ │ +201 {} │ │ │ │ │ +202 │ │ │ │ │ +_2_0_8 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ +209 {} │ │ │ │ │ +210 │ │ │ │ │ +_2_1_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +217 { │ │ │ │ │ +218 for (int i=0; i<_n; i++) { │ │ │ │ │ +219 _b_s_o_r_f(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ +220 _b_s_o_r_b(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ +221 } │ │ │ │ │ +222 } │ │ │ │ │ +223 │ │ │ │ │ +_2_2_9 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ +230 {} │ │ │ │ │ +231 │ │ │ │ │ +_2_3_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ 234 { │ │ │ │ │ -235 if (OwnerOverlapToAllInterfaceBuilt) │ │ │ │ │ -236 OwnerOverlapToAllInterface.free(); │ │ │ │ │ -237 _O_w_n_e_r_O_v_e_r_l_a_p_S_e_t sourceFlags; │ │ │ │ │ -238 │ │ │ │ │ -Combine,_A_t_t_r_i_b_u_t_e_S_e_t> │ │ │ │ │ -239 destFlags; │ │ │ │ │ -240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ -241 OwnerOverlapToAllInterfaceBuilt = true; │ │ │ │ │ -242 } │ │ │ │ │ -243 │ │ │ │ │ -_2_4_4 void _b_u_i_l_d_O_w_n_e_r_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ -245 { │ │ │ │ │ -246 if (OwnerToAllInterfaceBuilt) │ │ │ │ │ -247 OwnerToAllInterface.free(); │ │ │ │ │ -248 _O_w_n_e_r_S_e_t sourceFlags; │ │ │ │ │ -249 _A_l_l_S_e_t destFlags; │ │ │ │ │ -250 OwnerToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ -251 OwnerToAllInterfaceBuilt = true; │ │ │ │ │ -252 } │ │ │ │ │ -253 │ │ │ │ │ -_2_5_4 void _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ -255 { │ │ │ │ │ -256 if (OwnerCopyToAllInterfaceBuilt) │ │ │ │ │ -257 OwnerCopyToAllInterface.free(); │ │ │ │ │ -258 │ │ │ │ │ -259 typedef Combine,EnumItem,_A_t_t_r_i_b_u_t_e_S_e_t> │ │ │ │ │ -OwnerCopySet; │ │ │ │ │ -260 OwnerCopySet sourceFlags; │ │ │ │ │ -261 Combine,_A_t_t_r_i_b_u_t_e_S_e_t> destFlags; │ │ │ │ │ -262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ -263 OwnerCopyToAllInterfaceBuilt = true; │ │ │ │ │ -264 } │ │ │ │ │ -265 │ │ │ │ │ -_2_6_6 void _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ -267 { │ │ │ │ │ -268 if (OwnerCopyToOwnerCopyInterfaceBuilt) │ │ │ │ │ -269 OwnerCopyToOwnerCopyInterface.free(); │ │ │ │ │ -270 │ │ │ │ │ -271 │ │ │ │ │ -272 typedef Combine,EnumItem,_A_t_t_r_i_b_u_t_e_S_e_t> │ │ │ │ │ -OwnerCopySet; │ │ │ │ │ -273 OwnerCopySet sourceFlags; │ │ │ │ │ -274 OwnerCopySet destFlags; │ │ │ │ │ -275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ -276 OwnerCopyToOwnerCopyInterfaceBuilt = true; │ │ │ │ │ -277 } │ │ │ │ │ -278 │ │ │ │ │ -_2_7_9 void _b_u_i_l_d_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e () const │ │ │ │ │ -280 { │ │ │ │ │ -281 if (CopyToAllInterfaceBuilt) │ │ │ │ │ -282 CopyToAllInterface.free(); │ │ │ │ │ -283 _C_o_p_y_S_e_t sourceFlags; │ │ │ │ │ -284 _A_l_l_S_e_t destFlags; │ │ │ │ │ -285 CopyToAllInterface.build(ri,sourceFlags,destFlags); │ │ │ │ │ -286 CopyToAllInterfaceBuilt = true; │ │ │ │ │ +235 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +236 } │ │ │ │ │ +237 │ │ │ │ │ +238 private: │ │ │ │ │ +240 const M& _A_; │ │ │ │ │ +242 int _n; │ │ │ │ │ +244 _r_e_a_l___f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ +245 }; │ │ │ │ │ +_2_4_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("ssor", │ │ │ │ │ +defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +247 │ │ │ │ │ +248 │ │ │ │ │ +260 template │ │ │ │ │ +_2_6_1 class _S_e_q_S_O_R : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +262 public: │ │ │ │ │ +_2_6_4 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_2_6_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_2_6_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_2_7_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_7_2 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_2_7_4 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +275 │ │ │ │ │ +_2_8_3 _S_e_q_S_O_R (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w) │ │ │ │ │ +284 : _A_(A), _n(n), _w(w) │ │ │ │ │ +285 { │ │ │ │ │ +286 _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_M_,_l_>_:_:_c_h_e_c_k(_A_); │ │ │ │ │ 287 } │ │ │ │ │ 288 │ │ │ │ │ -289 public: │ │ │ │ │ -290 │ │ │ │ │ -_2_9_5 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y () const { │ │ │ │ │ -296 return category_; │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -_2_9_9 const Communication& _c_o_m_m_u_n_i_c_a_t_o_r() const │ │ │ │ │ -300 { │ │ │ │ │ -301 return cc; │ │ │ │ │ -302 } │ │ │ │ │ -303 │ │ │ │ │ -310 template │ │ │ │ │ -_3_1_1 void _c_o_p_y_O_w_n_e_r_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ -312 { │ │ │ │ │ -313 if (!OwnerToAllInterfaceBuilt) │ │ │ │ │ -314 _b_u_i_l_d_O_w_n_e_r_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ -315 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ -316 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerToAllInterface); │ │ │ │ │ -317 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ -318 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -327 template │ │ │ │ │ -_3_2_8 void _c_o_p_y_C_o_p_y_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ -329 { │ │ │ │ │ -330 if (!CopyToAllInterfaceBuilt) │ │ │ │ │ -331 _b_u_i_l_d_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ -332 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ -333 _c_o_m_m_u_n_i_c_a_t_o_r.template build(CopyToAllInterface); │ │ │ │ │ -334 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ -335 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ -336 } │ │ │ │ │ -337 │ │ │ │ │ -344 template │ │ │ │ │ -_3_4_5 void _a_d_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ -346 { │ │ │ │ │ -347 if (!OwnerOverlapToAllInterfaceBuilt) │ │ │ │ │ -348 _b_u_i_l_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ -349 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ -350 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerOverlapToAllInterface); │ │ │ │ │ -351 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ -352 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ -353 } │ │ │ │ │ -354 │ │ │ │ │ -361 template │ │ │ │ │ -_3_6_2 void _a_d_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l (const T& source, T& dest) const │ │ │ │ │ -363 { │ │ │ │ │ -364 if (!OwnerCopyToAllInterfaceBuilt) │ │ │ │ │ -365 _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ -366 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ -367 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerCopyToAllInterface); │ │ │ │ │ -368 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ -369 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ -370 } │ │ │ │ │ -371 │ │ │ │ │ -378 template │ │ │ │ │ -_3_7_9 void _a_d_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y (const T& source, T& dest) const │ │ │ │ │ -380 { │ │ │ │ │ -381 if (!OwnerCopyToOwnerCopyInterfaceBuilt) │ │ │ │ │ -382 _b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y_I_n_t_e_r_f_a_c_e (); │ │ │ │ │ -383 _B_C _c_o_m_m_u_n_i_c_a_t_o_r; │ │ │ │ │ -384 _c_o_m_m_u_n_i_c_a_t_o_r.template build(OwnerCopyToOwnerCopyInterface); │ │ │ │ │ -385 _c_o_m_m_u_n_i_c_a_t_o_r.template forward >(source,dest); │ │ │ │ │ -386 _c_o_m_m_u_n_i_c_a_t_o_r.free(); │ │ │ │ │ -387 } │ │ │ │ │ -388 │ │ │ │ │ -389 │ │ │ │ │ -397 template │ │ │ │ │ -_3_9_8 void _d_o_t (const T1& x, const T1& y, T2& result) const │ │ │ │ │ -399 { │ │ │ │ │ -400 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -401 // set up mask vector │ │ │ │ │ -402 if (mask.size()!=static_cast::size_type> │ │ │ │ │ -(x.size())) │ │ │ │ │ -403 { │ │ │ │ │ -404 mask.resize(x.size()); │ │ │ │ │ -405 for (typename std::vector::size_type i=0; ilocal().attribute()!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ -409 mask[i->local().local()] = 0; │ │ │ │ │ -410 } │ │ │ │ │ -411 result = T2(0.0); │ │ │ │ │ -412 │ │ │ │ │ -413 for (typename T1::size_type i=0; i(mask[i]); │ │ │ │ │ -415 result = cc.sum(result); │ │ │ │ │ -416 } │ │ │ │ │ -417 │ │ │ │ │ -424 template │ │ │ │ │ -_4_2_5 typename FieldTraits::real_type _n_o_r_m (const T1& x) │ │ │ │ │ -const │ │ │ │ │ -426 { │ │ │ │ │ -427 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -428 │ │ │ │ │ -429 // set up mask vector │ │ │ │ │ -430 if (mask.size()!=static_cast::size_type> │ │ │ │ │ -(x.size())) │ │ │ │ │ -431 { │ │ │ │ │ -432 mask.resize(x.size()); │ │ │ │ │ -433 for (typename std::vector::size_type i=0; ilocal().attribute()!=_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ -437 mask[i->local().local()] = 0; │ │ │ │ │ +_3_0_2 _S_e_q_S_O_R (const std::shared_ptr>& A, │ │ │ │ │ +const ParameterTree& configuration) │ │ │ │ │ +303 : _S_e_q_S_O_R(A->getmat(), configuration) │ │ │ │ │ +304 {} │ │ │ │ │ +305 │ │ │ │ │ +_3_1_9 _S_e_q_S_O_R (const M& A, const ParameterTree& configuration) │ │ │ │ │ +320 : _S_e_q_S_O_R(A, configuration._g_e_t("iterations",1), │ │ │ │ │ +configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation",1.0)) │ │ │ │ │ +321 {} │ │ │ │ │ +322 │ │ │ │ │ +_3_2_8 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ +329 {} │ │ │ │ │ +330 │ │ │ │ │ +_3_3_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +337 { │ │ │ │ │ +338 this->template apply(v,d); │ │ │ │ │ +339 } │ │ │ │ │ +340 │ │ │ │ │ +349 template │ │ │ │ │ +_3_5_0 void _a_p_p_l_y(X& v, const Y& d) │ │ │ │ │ +351 { │ │ │ │ │ +352 if(forward) │ │ │ │ │ +353 for (int i=0; i<_n; i++) { │ │ │ │ │ +354 _b_s_o_r_f(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ +355 } │ │ │ │ │ +356 else │ │ │ │ │ +357 for (int i=0; i<_n; i++) { │ │ │ │ │ +358 _b_s_o_r_b(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ +359 } │ │ │ │ │ +360 } │ │ │ │ │ +361 │ │ │ │ │ +_3_6_7 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ +368 {} │ │ │ │ │ +369 │ │ │ │ │ +_3_7_1 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +372 { │ │ │ │ │ +373 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +374 } │ │ │ │ │ +375 │ │ │ │ │ +376 private: │ │ │ │ │ +378 const M& _A_; │ │ │ │ │ +380 int _n; │ │ │ │ │ +382 _r_e_a_l___f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ +383 }; │ │ │ │ │ +_3_8_4 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("sor", │ │ │ │ │ +defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +385 │ │ │ │ │ +386 │ │ │ │ │ +397 template │ │ │ │ │ +_3_9_8 using _S_e_q_G_S = _S_e_q_S_O_R_<_M_,_X_,_Y_,_l_>; │ │ │ │ │ +_3_9_9 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("gs", │ │ │ │ │ +defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +400 │ │ │ │ │ +411 template │ │ │ │ │ +_4_1_2 class _S_e_q_J_a_c : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_> { │ │ │ │ │ +413 public: │ │ │ │ │ +_4_1_5 typedef M _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_4_1_7 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_4_1_9 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_4_2_1 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_4_2_3 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_4_2_5 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +426 │ │ │ │ │ +_4_3_4 _S_e_q_J_a_c (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w) │ │ │ │ │ +435 : _A_(A), _n(n), _w(w) │ │ │ │ │ +436 { │ │ │ │ │ +437 _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_M_,_l_>_:_:_c_h_e_c_k(_A_); │ │ │ │ │ 438 } │ │ │ │ │ -439 auto result = real_type(0.0); │ │ │ │ │ -440 for (typename T1::size_type i=0; i │ │ │ │ │ -_C_o_p_y_F_l_a_g_s; │ │ │ │ │ -447 │ │ │ │ │ -_4_4_9 typedef Dune::ParallelIndexSet _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t; │ │ │ │ │ -450 │ │ │ │ │ -_4_5_2 typedef Dune::RemoteIndices _R_e_m_o_t_e_I_n_d_i_c_e_s; │ │ │ │ │ -453 │ │ │ │ │ -_4_5_6 typedef Dune::GlobalLookupIndexSet _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ -457 │ │ │ │ │ -_4_6_2 const _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& _i_n_d_e_x_S_e_t() const │ │ │ │ │ -463 { │ │ │ │ │ -464 return pis; │ │ │ │ │ -465 } │ │ │ │ │ -466 │ │ │ │ │ -_4_7_1 const _R_e_m_o_t_e_I_n_d_i_c_e_s& _r_e_m_o_t_e_I_n_d_i_c_e_s() const │ │ │ │ │ -472 { │ │ │ │ │ -473 return ri; │ │ │ │ │ -474 } │ │ │ │ │ -475 │ │ │ │ │ -_4_8_0 _P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t& _i_n_d_e_x_S_e_t() │ │ │ │ │ -481 { │ │ │ │ │ -482 return pis; │ │ │ │ │ -483 } │ │ │ │ │ -484 │ │ │ │ │ -485 │ │ │ │ │ -_4_9_0 _R_e_m_o_t_e_I_n_d_i_c_e_s& _r_e_m_o_t_e_I_n_d_i_c_e_s() │ │ │ │ │ -491 { │ │ │ │ │ -492 return ri; │ │ │ │ │ -493 } │ │ │ │ │ -494 │ │ │ │ │ -_4_9_5 void _b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p() │ │ │ │ │ -496 { │ │ │ │ │ -497 if(globalLookup_) { │ │ │ │ │ -498 if(pis.seqNo()==oldseqNo) │ │ │ │ │ -499 // Nothing changed! │ │ │ │ │ -500 return; │ │ │ │ │ -501 delete globalLookup_; │ │ │ │ │ -502 } │ │ │ │ │ -503 │ │ │ │ │ -504 globalLookup_ = new _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(pis); │ │ │ │ │ -505 oldseqNo = pis.seqNo(); │ │ │ │ │ +439 │ │ │ │ │ +_4_5_3 _S_e_q_J_a_c (const std::shared_ptr>& A, │ │ │ │ │ +const ParameterTree& configuration) │ │ │ │ │ +454 : _S_e_q_J_a_c(A->getmat(), configuration) │ │ │ │ │ +455 {} │ │ │ │ │ +456 │ │ │ │ │ +_4_7_0 _S_e_q_J_a_c (const M& A, const ParameterTree& configuration) │ │ │ │ │ +471 : _S_e_q_J_a_c(A, configuration._g_e_t("iterations",1), │ │ │ │ │ +configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation",1.0)) │ │ │ │ │ +472 {} │ │ │ │ │ +473 │ │ │ │ │ +_4_7_9 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ +480 {} │ │ │ │ │ +481 │ │ │ │ │ +_4_8_7 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +488 { │ │ │ │ │ +489 for (int i=0; i<_n; i++) { │ │ │ │ │ +490 _d_b_j_a_c(_A_,v,d,_w,_B_L_<_l_>()); │ │ │ │ │ +491 } │ │ │ │ │ +492 } │ │ │ │ │ +493 │ │ │ │ │ +_4_9_9 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ +500 {} │ │ │ │ │ +501 │ │ │ │ │ +_5_0_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +504 { │ │ │ │ │ +505 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ 506 } │ │ │ │ │ 507 │ │ │ │ │ -_5_0_8 void _b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p(std::size_t size) │ │ │ │ │ -509 { │ │ │ │ │ -510 if(globalLookup_) { │ │ │ │ │ -511 if(pis.seqNo()==oldseqNo) │ │ │ │ │ -512 // Nothing changed! │ │ │ │ │ -513 return; │ │ │ │ │ -514 delete globalLookup_; │ │ │ │ │ -515 } │ │ │ │ │ -516 globalLookup_ = new _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t(pis, size); │ │ │ │ │ -517 oldseqNo = pis.seqNo(); │ │ │ │ │ -518 } │ │ │ │ │ +508 private: │ │ │ │ │ +510 const M& _A_; │ │ │ │ │ +512 int _n; │ │ │ │ │ +514 real_field_type _w; │ │ │ │ │ +515 }; │ │ │ │ │ +_5_1_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("jac", │ │ │ │ │ +defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +517 │ │ │ │ │ +518 │ │ │ │ │ 519 │ │ │ │ │ -_5_2_0 void _f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p() │ │ │ │ │ -521 { │ │ │ │ │ -522 delete globalLookup_; │ │ │ │ │ -523 globalLookup_=0; │ │ │ │ │ -524 } │ │ │ │ │ -525 │ │ │ │ │ -_5_2_6 const _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t& _g_l_o_b_a_l_L_o_o_k_u_p() const │ │ │ │ │ -527 { │ │ │ │ │ -528 assert(globalLookup_ != 0); │ │ │ │ │ -529 return *globalLookup_; │ │ │ │ │ -530 } │ │ │ │ │ -531 │ │ │ │ │ -537 template │ │ │ │ │ -_5_3_8 void _p_r_o_j_e_c_t (T1& x) const │ │ │ │ │ -539 { │ │ │ │ │ -540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i) │ │ │ │ │ -541 if (i->local().attribute()==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ -542 x[i->local().local()] = 0; │ │ │ │ │ -543 } │ │ │ │ │ -544 │ │ │ │ │ -_5_5_4 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (MPI_Comm comm_, │ │ │ │ │ -555 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat_ = _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g, │ │ │ │ │ -556 bool freecomm_ = false) │ │ │ │ │ -557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_), │ │ │ │ │ -558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false), │ │ │ │ │ -559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt │ │ │ │ │ -(false), │ │ │ │ │ -560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), │ │ │ │ │ -561 freecomm(freecomm_) │ │ │ │ │ -562 {} │ │ │ │ │ -563 │ │ │ │ │ -_5_7_2 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat_ = │ │ │ │ │ -_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g) │ │ │ │ │ -573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri │ │ │ │ │ -(pis,pis,MPI_COMM_WORLD), │ │ │ │ │ -574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false), │ │ │ │ │ -575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt │ │ │ │ │ -(false), │ │ │ │ │ -576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm │ │ │ │ │ -(false) │ │ │ │ │ -577 {} │ │ │ │ │ -578 │ │ │ │ │ -_5_8_6 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (const _I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_<_G_l_o_b_a_l_I_d_T_y_p_e_, │ │ │ │ │ -_L_o_c_a_l_I_d_T_y_p_e_>& indexinfo, │ │ │ │ │ -587 MPI_Comm comm_, │ │ │ │ │ -588 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y cat_ = _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g, │ │ │ │ │ -589 bool freecomm_ = false) │ │ │ │ │ -590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false), │ │ │ │ │ -591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt │ │ │ │ │ -(false), │ │ │ │ │ -592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false), │ │ │ │ │ -593 globalLookup_(0), category_(cat_), freecomm(freecomm_) │ │ │ │ │ -594 { │ │ │ │ │ -595 // set up an ISTL index set │ │ │ │ │ -596 pis.beginResize(); │ │ │ │ │ -597 for (localindex_iterator i=indexinfo._l_o_c_a_l_I_n_d_i_c_e_s().begin(); │ │ │ │ │ -i!=indexinfo._l_o_c_a_l_I_n_d_i_c_e_s().end(); ++i) │ │ │ │ │ -598 { │ │ │ │ │ -599 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ -600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ -_o_w_n_e_r,true)); │ │ │ │ │ -601 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ -602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ -_o_v_e_r_l_a_p,true)); │ │ │ │ │ -603 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ -604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_: │ │ │ │ │ -_c_o_p_y,true)); │ │ │ │ │ -605 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << │ │ │ │ │ -std::get<1>(*i) << " " << std::get<2>(*i) << std::endl; │ │ │ │ │ -606 } │ │ │ │ │ -607 pis.endResize(); │ │ │ │ │ -608 │ │ │ │ │ -609 // build remote indices WITHOUT communication │ │ │ │ │ -610 // std::cout << cc.rank() << ": build remote indices" << std::endl; │ │ │ │ │ -611 ri.setIndexSets(pis,pis,cc); │ │ │ │ │ -612 if (indexinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().size()>0) │ │ │ │ │ -613 { │ │ │ │ │ -614 remoteindex_iterator i=indexinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().begin(); │ │ │ │ │ -615 int p = std::get<0>(*i); │ │ │ │ │ -616 _R_I_L_M modifier = ri.template getModifier(p); │ │ │ │ │ -617 typename PIS::const_iterator pi=pis.begin(); │ │ │ │ │ -618 for ( ; i!=indexinfo._r_e_m_o_t_e_I_n_d_i_c_e_s().end(); ++i) │ │ │ │ │ +531 template │ │ │ │ │ +_5_3_2 class _S_e_q_I_L_U : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_> { │ │ │ │ │ +533 public: │ │ │ │ │ +_5_3_5 typedef typename std::remove_const::type _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_5_3_7 typedef typename matrix_type :: block_type _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +_5_3_9 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_5_4_1 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +542 │ │ │ │ │ +_5_4_4 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +545 │ │ │ │ │ +_5_4_7 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_5_4_9 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +550 │ │ │ │ │ +_5_5_2 typedef typename _I_L_U_:_:_C_R_S_<_ _b_l_o_c_k___t_y_p_e_ _,_ _t_y_p_e_n_a_m_e_ _M_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e_> _C_R_S; │ │ │ │ │ +553 │ │ │ │ │ +_5_6_1 _S_e_q_I_L_U (const M& A, _r_e_a_l___f_i_e_l_d___t_y_p_e w, const bool resort = false ) │ │ │ │ │ +562 : _S_e_q_I_L_U( A, 0, w, resort ) // construct ILU(0) │ │ │ │ │ +563 { │ │ │ │ │ +564 } │ │ │ │ │ +565 │ │ │ │ │ +_5_8_0 _S_e_q_I_L_U (const std::shared_ptr>& A, │ │ │ │ │ +const ParameterTree& configuration) │ │ │ │ │ +581 : _S_e_q_I_L_U(A->getmat(), configuration) │ │ │ │ │ +582 {} │ │ │ │ │ +583 │ │ │ │ │ +_5_9_8 _S_e_q_I_L_U(const M& A, const ParameterTree& config) │ │ │ │ │ +599 : _S_e_q_I_L_U(A, config._g_e_t("n", 0), │ │ │ │ │ +600 config._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation", 1.0), │ │ │ │ │ +601 config._g_e_t("resort", false)) │ │ │ │ │ +602 {} │ │ │ │ │ +603 │ │ │ │ │ +_6_1_2 _S_e_q_I_L_U (const M& A, int n, _r_e_a_l___f_i_e_l_d___t_y_p_e w, const bool resort = false ) │ │ │ │ │ +613 : ILU_(), │ │ │ │ │ +614 lower_(), │ │ │ │ │ +615 upper_(), │ │ │ │ │ +616 inv_(), │ │ │ │ │ +617 w_(w), │ │ │ │ │ +618 wNotIdentity_([w]{using std::abs; return abs(w - _r_e_a_l___f_i_e_l_d___t_y_p_e(1)) > 1e- │ │ │ │ │ +15;}() ) │ │ │ │ │ 619 { │ │ │ │ │ -620 // handle processor change │ │ │ │ │ -621 if (p!=std::get<0>(*i)) │ │ │ │ │ -622 { │ │ │ │ │ -623 p = std::get<0>(*i); │ │ │ │ │ -624 modifier = ri.template getModifier(p); │ │ │ │ │ -625 pi=pis.begin(); │ │ │ │ │ +620 if( n == 0 ) │ │ │ │ │ +621 { │ │ │ │ │ +622 // copy A │ │ │ │ │ +623 ILU_.reset( new matrix_type( A ) ); │ │ │ │ │ +624 // create ILU(0) decomposition │ │ │ │ │ +625 _I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n( *ILU_ ); │ │ │ │ │ 626 } │ │ │ │ │ -627 │ │ │ │ │ -628 // position to correct entry in parallel index set │ │ │ │ │ -629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end()) │ │ │ │ │ -630 ++pi; │ │ │ │ │ -631 if (pi==pis.end()) │ │ │ │ │ -632 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"OwnerOverlapCopyCommunication: global index not in │ │ │ │ │ -index set"); │ │ │ │ │ -633 │ │ │ │ │ -634 // insert entry │ │ │ │ │ -635 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << │ │ │ │ │ -" " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl; │ │ │ │ │ -636 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r) │ │ │ │ │ -637 modifier.insert(_R_X(_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r,&(*pi))); │ │ │ │ │ -638 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p) │ │ │ │ │ -639 modifier.insert(_R_X(_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p,&(*pi))); │ │ │ │ │ -640 if (std::get<2>(*i)==_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y) │ │ │ │ │ -641 modifier.insert(_R_X(_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y,&(*pi))); │ │ │ │ │ -642 } │ │ │ │ │ -643 }else{ │ │ │ │ │ -644 // Force remote indices to be synced! │ │ │ │ │ -645 ri.template getModifier(0); │ │ │ │ │ -646 } │ │ │ │ │ -647 } │ │ │ │ │ -648 │ │ │ │ │ -649 // destructor: free memory in some objects │ │ │ │ │ -_6_5_0 _~_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n () │ │ │ │ │ -651 { │ │ │ │ │ -652 ri.free(); │ │ │ │ │ -653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free(); │ │ │ │ │ -654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free(); │ │ │ │ │ -655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free(); │ │ │ │ │ -656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free │ │ │ │ │ -(); │ │ │ │ │ -657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free(); │ │ │ │ │ -658 if (globalLookup_) delete globalLookup_; │ │ │ │ │ -659 if (freecomm==true) │ │ │ │ │ -660 if(comm!=MPI_COMM_NULL) │ │ │ │ │ -661 { │ │ │ │ │ -662#ifdef MPI_2 │ │ │ │ │ -663 // If it is possible to query whether MPI_Finalize │ │ │ │ │ -664 // was called, only free the communicator before │ │ │ │ │ -665 // calling MPI_Finalize. │ │ │ │ │ -666 int wasFinalized = 0; │ │ │ │ │ -667 MPI_Finalized( &wasFinalized ); │ │ │ │ │ -668 if(!wasFinalized) │ │ │ │ │ -669#endif │ │ │ │ │ -670 MPI_Comm_free(&comm); │ │ │ │ │ +627 else │ │ │ │ │ +628 { │ │ │ │ │ +629 // create matrix in build mode │ │ │ │ │ +630 ILU_.reset( new matrix_type( A._N(), A._M(), matrix_type::row_wise) ); │ │ │ │ │ +631 // create ILU(n) decomposition │ │ │ │ │ +632 _I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n( A, n, *ILU_ ); │ │ │ │ │ +633 } │ │ │ │ │ +634 │ │ │ │ │ +635 if( resort ) │ │ │ │ │ +636 { │ │ │ │ │ +637 // store ILU in simple CRS format │ │ │ │ │ +638 _I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S( *ILU_, lower_, upper_, inv_ ); │ │ │ │ │ +639 ILU_.reset(); │ │ │ │ │ +640 } │ │ │ │ │ +641 } │ │ │ │ │ +642 │ │ │ │ │ +_6_4_8 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ +649 {} │ │ │ │ │ +650 │ │ │ │ │ +_6_5_6 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +657 { │ │ │ │ │ +658 if( ILU_ ) │ │ │ │ │ +659 { │ │ │ │ │ +660 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e( *ILU_, v, d); │ │ │ │ │ +661 } │ │ │ │ │ +662 else │ │ │ │ │ +663 { │ │ │ │ │ +664 _I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e(lower_, upper_, inv_, v, d); │ │ │ │ │ +665 } │ │ │ │ │ +666 │ │ │ │ │ +667 if( wNotIdentity_ ) │ │ │ │ │ +668 { │ │ │ │ │ +669 v *= w_; │ │ │ │ │ +670 } │ │ │ │ │ 671 } │ │ │ │ │ -672 } │ │ │ │ │ -673 │ │ │ │ │ -674 private: │ │ │ │ │ -675 _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n (const _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n&) │ │ │ │ │ -676 {} │ │ │ │ │ -677 MPI_Comm comm; │ │ │ │ │ -678 Communication cc; │ │ │ │ │ -679 _P_I_S pis; │ │ │ │ │ -680 _R_I ri; │ │ │ │ │ -681 mutable _I_F OwnerToAllInterface; │ │ │ │ │ -682 mutable bool OwnerToAllInterfaceBuilt; │ │ │ │ │ -683 mutable _I_F OwnerOverlapToAllInterface; │ │ │ │ │ -684 mutable bool OwnerOverlapToAllInterfaceBuilt; │ │ │ │ │ -685 mutable _I_F OwnerCopyToAllInterface; │ │ │ │ │ -686 mutable bool OwnerCopyToAllInterfaceBuilt; │ │ │ │ │ -687 mutable _I_F OwnerCopyToOwnerCopyInterface; │ │ │ │ │ -688 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt; │ │ │ │ │ -689 mutable _I_F CopyToAllInterface; │ │ │ │ │ -690 mutable bool CopyToAllInterfaceBuilt; │ │ │ │ │ -691 mutable std::vector mask; │ │ │ │ │ -692 int oldseqNo; │ │ │ │ │ -693 _G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t* globalLookup_; │ │ │ │ │ -694 const _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y category_; │ │ │ │ │ -695 bool freecomm; │ │ │ │ │ -696 }; │ │ │ │ │ -697 │ │ │ │ │ -698#endif │ │ │ │ │ -699 │ │ │ │ │ -700 │ │ │ │ │ -703} // end namespace │ │ │ │ │ -704 │ │ │ │ │ -705#endif │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +672 │ │ │ │ │ +_6_7_8 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ +679 {} │ │ │ │ │ +680 │ │ │ │ │ +_6_8_2 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +683 { │ │ │ │ │ +684 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +685 } │ │ │ │ │ +686 │ │ │ │ │ +687 protected: │ │ │ │ │ +_6_8_9 std::unique_ptr< matrix_type > _I_L_U__; │ │ │ │ │ +690 │ │ │ │ │ +_6_9_2 _C_R_S _l_o_w_e_r__; │ │ │ │ │ +_6_9_3 _C_R_S _u_p_p_e_r__; │ │ │ │ │ +_6_9_4 std::vector< block_type, typename matrix_type::allocator_type > _i_n_v__; │ │ │ │ │ +695 │ │ │ │ │ +_6_9_7 const _r_e_a_l___f_i_e_l_d___t_y_p_e _w__; │ │ │ │ │ +_6_9_9 const bool _w_N_o_t_I_d_e_n_t_i_t_y__; │ │ │ │ │ +700 }; │ │ │ │ │ +_7_0_1 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("ilu", │ │ │ │ │ +defaultPreconditionerBlockLevelCreator()); │ │ │ │ │ +702 │ │ │ │ │ +703 │ │ │ │ │ +712 template │ │ │ │ │ +_7_1_3 class _R_i_c_h_a_r_d_s_o_n : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r { │ │ │ │ │ +714 public: │ │ │ │ │ +_7_1_6 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_7_1_8 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_7_2_0 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_7_2_2 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_7_2_4 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +725 │ │ │ │ │ +_7_3_1 _R_i_c_h_a_r_d_s_o_n (_r_e_a_l___f_i_e_l_d___t_y_p_e w=1.0) : │ │ │ │ │ +732 _w(w) │ │ │ │ │ +733 {} │ │ │ │ │ +734 │ │ │ │ │ +_7_4_6 _R_i_c_h_a_r_d_s_o_n (const ParameterTree& configuration) │ │ │ │ │ +747 : _R_i_c_h_a_r_d_s_o_n(configuration._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation", 1.0)) │ │ │ │ │ +748 {} │ │ │ │ │ +749 │ │ │ │ │ +_7_5_5 virtual void _p_r_e ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) │ │ │ │ │ +756 {} │ │ │ │ │ +757 │ │ │ │ │ +_7_6_3 virtual void _a_p_p_l_y (X& v, const Y& d) │ │ │ │ │ +764 { │ │ │ │ │ +765 v = d; │ │ │ │ │ +766 v *= _w; │ │ │ │ │ +767 } │ │ │ │ │ +768 │ │ │ │ │ +_7_7_4 virtual void _p_o_s_t ([[maybe_unused]] X& x) │ │ │ │ │ +775 {} │ │ │ │ │ +776 │ │ │ │ │ +_7_7_8 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +779 { │ │ │ │ │ +780 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ +781 } │ │ │ │ │ +782 │ │ │ │ │ +783 private: │ │ │ │ │ +785 _r_e_a_l___f_i_e_l_d___t_y_p_e _w; │ │ │ │ │ +786 }; │ │ │ │ │ +_7_8_7 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("richardson", [](auto tl, const auto& /* mat │ │ │ │ │ +*/, const ParameterTree& config){ │ │ │ │ │ +788 using D = typename Dune::TypeListElement<1, decltype(tl)>::type; │ │ │ │ │ +789 using R = typename Dune::TypeListElement<2, decltype(tl)>::type; │ │ │ │ │ +790 return std::make_shared>(config); │ │ │ │ │ +791 }); │ │ │ │ │ +792 │ │ │ │ │ +793 │ │ │ │ │ +804 template< class M, class X, class Y > │ │ │ │ │ +_8_0_5 class _S_e_q_I_L_D_L │ │ │ │ │ +806 : public _P_r_e_c_o_n_d_i_t_i_o_n_e_r< X, Y > │ │ │ │ │ +807 { │ │ │ │ │ +808 typedef _S_e_q_I_L_D_L_<_ _M_,_ _X_,_ _Y_ _> _T_h_i_s; │ │ │ │ │ +809 typedef _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_ _X_,_ _Y_ _> _B_a_s_e; │ │ │ │ │ +810 │ │ │ │ │ +811 public: │ │ │ │ │ +_8_1_3 typedef std::remove_const_t< M > _m_a_t_r_i_x___t_y_p_e; │ │ │ │ │ +_8_1_5 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +_8_1_7 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +_8_1_9 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_8_2_1 typedef Simd::Scalar _s_c_a_l_a_r___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_8_2_3 typedef typename FieldTraits::real_type _r_e_a_l___f_i_e_l_d___t_y_p_e; │ │ │ │ │ +824 │ │ │ │ │ +_8_3_7 _S_e_q_I_L_D_L (const std::shared_ptr>& A, │ │ │ │ │ +const ParameterTree& configuration) │ │ │ │ │ +838 : _S_e_q_I_L_D_L(A->getmat(), configuration) │ │ │ │ │ +839 {} │ │ │ │ │ +840 │ │ │ │ │ +_8_5_3 _S_e_q_I_L_D_L(const _m_a_t_r_i_x___t_y_p_e& A, const ParameterTree& config) │ │ │ │ │ +854 : _S_e_q_I_L_D_L(A, config._g_e_t<_r_e_a_l___f_i_e_l_d___t_y_p_e>("relaxation", 1.0)) │ │ │ │ │ +855 {} │ │ │ │ │ +856 │ │ │ │ │ +_8_6_5 explicit _S_e_q_I_L_D_L ( const _m_a_t_r_i_x___t_y_p_e &A, _r_e_a_l___f_i_e_l_d___t_y_p_e relax = │ │ │ │ │ +_r_e_a_l___f_i_e_l_d___t_y_p_e( 1 ) ) │ │ │ │ │ +866 : decomposition_( A.N(), A.M(), _m_a_t_r_i_x___t_y_p_e::random ), │ │ │ │ │ +867 relax_( relax ) │ │ │ │ │ +868 { │ │ │ │ │ +869 // setup row sizes for lower triangular matrix │ │ │ │ │ +870 for( auto i = A.begin(), iend = A.end(); i != iend; ++i ) │ │ │ │ │ +871 { │ │ │ │ │ +872 const auto &A_i = *i; │ │ │ │ │ +873 const auto ij = A_i.find( i.index() ); │ │ │ │ │ +874 if( ij != A_i.end() ) │ │ │ │ │ +875 decomposition_.setrowsize( i.index(), ij.offset()+1 ); │ │ │ │ │ +876 else │ │ │ │ │ +877 DUNE_THROW( _I_S_T_L_E_r_r_o_r, "diagonal entry missing" ); │ │ │ │ │ +878 } │ │ │ │ │ +879 decomposition_.endrowsizes(); │ │ │ │ │ +880 │ │ │ │ │ +881 // setup row indices for lower triangular matrix │ │ │ │ │ +882 for( auto i = A.begin(), iend = A.end(); i != iend; ++i ) │ │ │ │ │ +883 { │ │ │ │ │ +884 const auto &A_i = *i; │ │ │ │ │ +885 for( auto ij = A_i.begin(); ij.index() < i.index() ; ++ij ) │ │ │ │ │ +886 decomposition_.addindex( i.index(), ij.index() ); │ │ │ │ │ +887 decomposition_.addindex( i.index(), i.index() ); │ │ │ │ │ +888 } │ │ │ │ │ +889 decomposition_.endindices(); │ │ │ │ │ +890 │ │ │ │ │ +891 // copy values of lower triangular matrix │ │ │ │ │ +892 auto i = A.begin(); │ │ │ │ │ +893 for( auto row = decomposition_.begin(), rowend = decomposition_.end(); row │ │ │ │ │ +!= rowend; ++row, ++i ) │ │ │ │ │ +894 { │ │ │ │ │ +895 auto ij = i->begin(); │ │ │ │ │ +896 for( auto _c_o_l = row->begin(), colend = row->end(); _c_o_l != colend; ++_c_o_l, │ │ │ │ │ +++ij ) │ │ │ │ │ +897 *_c_o_l = *ij; │ │ │ │ │ +898 } │ │ │ │ │ +899 │ │ │ │ │ +900 // perform ILDL decomposition │ │ │ │ │ +901 _b_i_l_d_l___d_e_c_o_m_p_o_s_e( decomposition_ ); │ │ │ │ │ +902 } │ │ │ │ │ +903 │ │ │ │ │ +_9_0_5 void _p_r_e ([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override │ │ │ │ │ +906 {} │ │ │ │ │ +907 │ │ │ │ │ +_9_0_9 void _a_p_p_l_y ( X &v, const Y &d ) override │ │ │ │ │ +910 { │ │ │ │ │ +911 _b_i_l_d_l___b_a_c_k_s_o_l_v_e( decomposition_, v, d, true ); │ │ │ │ │ +912 v *= relax_; │ │ │ │ │ +913 } │ │ │ │ │ +914 │ │ │ │ │ +_9_1_6 void _p_o_s_t ([[maybe_unused]] X &x) override │ │ │ │ │ +917 {} │ │ │ │ │ +918 │ │ │ │ │ +_9_2_0 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y () const override { return │ │ │ │ │ +_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; } │ │ │ │ │ +921 │ │ │ │ │ +922 private: │ │ │ │ │ +923 _m_a_t_r_i_x___t_y_p_e decomposition_; │ │ │ │ │ +924 _r_e_a_l___f_i_e_l_d___t_y_p_e relax_; │ │ │ │ │ +925 }; │ │ │ │ │ +_9_2_6 _D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R("ildl", defaultPreconditionerCreator()); │ │ │ │ │ +927 │ │ │ │ │ +930} // end namespace │ │ │ │ │ +931 │ │ │ │ │ +932 │ │ │ │ │ +933#endif │ │ │ │ │ +_s_o_l_v_e_r_r_e_g_i_s_t_r_y_._h_h │ │ │ │ │ +_D_U_N_E___R_E_G_I_S_T_E_R___P_R_E_C_O_N_D_I_T_I_O_N_E_R │ │ │ │ │ +#define DUNE_REGISTER_PRECONDITIONER(name,...) │ │ │ │ │ +DDeeffiinniittiioonn solverregistry.hh:16 │ │ │ │ │ _i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_m_a_t_r_i_x_m_a_r_k_e_t_._h_h │ │ │ │ │ -Provides classes for reading and writing MatrixMarket Files with an extension │ │ │ │ │ -for parallel matrices. │ │ │ │ │ -_t_e_s_t_R_e_d_i_s_t_r_i_b_u_t_e_d │ │ │ │ │ -void testRedistributed(int s) │ │ │ │ │ +_g_s_e_t_c_._h_h │ │ │ │ │ +Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a │ │ │ │ │ +generic way. │ │ │ │ │ +_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ +_i_l_u_._h_h │ │ │ │ │ +The incomplete LU factorization kernels. │ │ │ │ │ +_m_a_t_r_i_x_u_t_i_l_s_._h_h │ │ │ │ │ +Some handy generic functions for ISTL matrices. │ │ │ │ │ +_i_l_d_l_._h_h │ │ │ │ │ +Incomplete LDL decomposition. │ │ │ │ │ +_s_o_l_v_e_r_._h_h │ │ │ │ │ +Define general, extensible interface for inverse operators. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_D_u_n_e_:_:_b_s_o_r_b │ │ │ │ │ +void bsorb(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +SSOR step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:646 │ │ │ │ │ +_D_u_n_e_:_:_d_b_j_a_c │ │ │ │ │ +void dbjac(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +Jacobi step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:658 │ │ │ │ │ +_D_u_n_e_:_:_b_s_o_r_f │ │ │ │ │ +void bsorf(const M &A, X &x, const Y &b, const K &w) │ │ │ │ │ +SOR step. │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:634 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_b_i_l_d_l___d_e_c_o_m_p_o_s_e │ │ │ │ │ +void bildl_decompose(Matrix &A) │ │ │ │ │ +compute ILDL decomposition of a symmetric matrix A │ │ │ │ │ +DDeeffiinniittiioonn ildl.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_b_i_l_d_l___b_a_c_k_s_o_l_v_e │ │ │ │ │ +void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool │ │ │ │ │ +isLowerTriangular=false) │ │ │ │ │ +DDeeffiinniittiioonn ildl.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S │ │ │ │ │ +void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv) │ │ │ │ │ +convert ILU decomposition into CRS format for lower and upper triangular and │ │ │ │ │ +inverse. │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e │ │ │ │ │ +void blockILUBacksolve(const M &A, X &v, const Y &d) │ │ │ │ │ +LU backsolve with stored inverse. │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void blockILU0Decomposition(M &A) │ │ │ │ │ +compute ILU decomposition of A. A is overwritten by its decomposition │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void blockILUDecomposition(const M &A, int n, M &ILU) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_B_L │ │ │ │ │ +compile-time parameter for block recursion depth │ │ │ │ │ +DDeeffiinniittiioonn gsetc.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S │ │ │ │ │ +a simple compressed row storage matrix class │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:259 │ │ │ │ │ _D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ derive error class from the base class in common │ │ │ │ │ DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ -Attribute set for overlapping Schwarz. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_A_t_t_r_i_b_u_t_e_S_e_t │ │ │ │ │ -AttributeSet │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_w_n_e_r │ │ │ │ │ -@ owner │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_c_o_p_y │ │ │ │ │ -@ copy │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_A_t_t_r_i_b_u_t_e_S_e_t_:_:_o_v_e_r_l_a_p │ │ │ │ │ -@ overlap │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d │ │ │ │ │ -Information about the index distribution. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_I_n_d_e_x_T_r_i_p_e_l │ │ │ │ │ -std::tuple< GlobalIdType, LocalIdType, int > IndexTripel │ │ │ │ │ -A triple describing a local index. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_a_d_d_R_e_m_o_t_e_I_n_d_e_x │ │ │ │ │ -void addRemoteIndex(const RemoteIndexTripel &x) │ │ │ │ │ -Add a new remote index triple to the set of remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_G_l_o_b_a_l_I_d_T_y_p_e │ │ │ │ │ -G GlobalIdType │ │ │ │ │ -The type of the global index. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_l_o_c_a_l_I_n_d_i_c_e_s │ │ │ │ │ -const std::set< IndexTripel > & localIndices() const │ │ │ │ │ -Get the set of indices local to the process. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -const std::set< RemoteIndexTripel > & remoteIndices() const │ │ │ │ │ -Get the set of remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_L_o_c_a_l_I_d_T_y_p_e │ │ │ │ │ -L LocalIdType │ │ │ │ │ -The type of the local index. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Remove all indices from the sets. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_a_d_d_L_o_c_a_l_I_n_d_e_x │ │ │ │ │ -void addLocalIndex(const IndexTripel &x) │ │ │ │ │ -Add a new index triple to the set of local indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_I_n_d_e_x_I_n_f_o_F_r_o_m_G_r_i_d_:_:_R_e_m_o_t_e_I_n_d_e_x_T_r_i_p_e_l │ │ │ │ │ -std::tuple< int, GlobalIdType, int > RemoteIndexTripel │ │ │ │ │ -A triple describing a remote index. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ -owner/overlap/copy sema... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_S_e_t │ │ │ │ │ -EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:195 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_g_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -const GlobalLookupIndexSet & globalLookup() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_n_o_r_m │ │ │ │ │ -FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const │ │ │ │ │ -Compute the global Euclidean norm of a vector. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildOwnerOverlapToAllInterface() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:233 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_I_S │ │ │ │ │ -Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildOwnerCopyToAllInterface() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildOwnerCopyToOwnerCopyInterface() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, │ │ │ │ │ -LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category │ │ │ │ │ -cat_=SolverCategory::overlapping, bool freecomm_=false) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:586 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -SolverCategory::Category category() const │ │ │ │ │ -Get Solver Category. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:295 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_d_d_O_w_n_e_r_C_o_p_y_T_o_O_w_n_e_r_C_o_p_y │ │ │ │ │ -void addOwnerCopyToOwnerCopy(const T &source, T &dest) const │ │ │ │ │ -Communicate values from owner and copy data points to owner and copy data │ │ │ │ │ -points and add them to thos... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_C_o_p_y_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildCopyToAllInterface() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_F_l_a_g_s │ │ │ │ │ -Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:446 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -RemoteIndices & remoteIndices() │ │ │ │ │ -Get the underlying remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:490 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ -const ParallelIndexSet & indexSet() const │ │ │ │ │ -Get the underlying parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:462 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_I │ │ │ │ │ -Dune::RemoteIndices< PIS > RI │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void buildGlobalLookup(std::size_t size) │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:508 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_d_d_O_w_n_e_r_O_v_e_r_l_a_p_T_o_A_l_l │ │ │ │ │ -void addOwnerOverlapToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from owner data points to all other data points and add them │ │ │ │ │ -to those values. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:345 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -Dune::RemoteIndices< PIS > RemoteIndices │ │ │ │ │ -The type of the remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:452 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_p_r_o_j_e_c_t │ │ │ │ │ -void project(T1 &x) const │ │ │ │ │ -Set vector to zero at copy dofs. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:538 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_l_l_S_e_t │ │ │ │ │ -Dune::AllSet< AttributeSet > AllSet │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:197 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_S_e_t │ │ │ │ │ -Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, │ │ │ │ │ -EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > │ │ │ │ │ -OwnerOverlapSet │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_C_o_p_y_T_o_A_l_l │ │ │ │ │ -void copyCopyToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from copy data points to all other data points. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:328 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_G_l_o_b_a_l_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet │ │ │ │ │ -The type of the reverse lookup of indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:456 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_I_F │ │ │ │ │ -Dune::Interface IF │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:193 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_~_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -~OwnerOverlapCopyCommunication() │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:650 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void buildGlobalLookup() │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:495 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_B_C │ │ │ │ │ -Dune::BufferedCommunicator BC │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category │ │ │ │ │ -cat_=SolverCategory::overlapping, bool freecomm_=false) │ │ │ │ │ -Construct the communication without any indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:554 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_i_n_d_e_x_S_e_t │ │ │ │ │ -ParallelIndexSet & indexSet() │ │ │ │ │ -Get the underlying parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:480 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_d_o_t │ │ │ │ │ -void dot(const T1 &x, const T1 &y, T2 &result) const │ │ │ │ │ -Compute a global dot product of two vectors. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:398 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_m_m_u_n_i_c_a_t_o_r │ │ │ │ │ -const Communication< MPI_Comm > & communicator() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory:: │ │ │ │ │ -overlapping) │ │ │ │ │ -Construct the communication without any indices using MPI_COMM_WORLD. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:572 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_c_o_p_y_O_w_n_e_r_T_o_A_l_l │ │ │ │ │ -void copyOwnerToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from owner data points to all other data points. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_r_e_m_o_t_e_I_n_d_i_c_e_s │ │ │ │ │ -const RemoteIndices & remoteIndices() const │ │ │ │ │ -Get the underlying remote indices. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:471 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_l_o_a_d_M_a_t_r_i_x_M_a_r_k_e_t │ │ │ │ │ -friend void loadMatrixMarket(M &, const std::string &, │ │ │ │ │ -OwnerOverlapCopyCommunication< G, L > &, bool) │ │ │ │ │ -Load a parallel matrix/vector stored in matrix market format. │ │ │ │ │ -DDeeffiinniittiioonn matrixmarket.hh:1269 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_X │ │ │ │ │ -RI::RemoteIndex RX │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_a_d_d_O_w_n_e_r_C_o_p_y_T_o_A_l_l │ │ │ │ │ -void addOwnerCopyToAll(const T &source, T &dest) const │ │ │ │ │ -Communicate values from owner and copy data points to all other data points and │ │ │ │ │ -add them to those val... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:362 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_f_r_e_e_G_l_o_b_a_l_L_o_o_k_u_p │ │ │ │ │ -void freeGlobalLookup() │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_R_I_L_M │ │ │ │ │ -Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_P_a_r_a_l_l_e_l_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet │ │ │ │ │ -The type of the parallel index set. │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:449 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_b_u_i_l_d_O_w_n_e_r_T_o_A_l_l_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void buildOwnerToAllInterface() const │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -gather/scatter callback for communcation │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:204 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static V gather(const T &a, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(T &a, V v, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_C_o_p_y_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_V │ │ │ │ │ -CommPolicy< T >::IndexedType V │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_V │ │ │ │ │ -CommPolicy< T >::IndexedType V │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static V gather(const T &a, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:222 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_A_d_d_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(T &a, V v, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +Return the number of columns. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:700 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +Return the number of rows. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_:_:_c_h_e_c_k │ │ │ │ │ +static void check(const Matrix &mat) │ │ │ │ │ +Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_A_s_s_e_m_b_l_e_d_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator exporting itself in matrix form. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Turns an InverseOperator into a Preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +O::range_type range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +O::domain_type domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_o_s_t │ │ │ │ │ +virtual void post(domain_type &) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +range_type::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_p_r_e │ │ │ │ │ +virtual void pre(domain_type &, range_type &) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +InverseOperator2Preconditioner(InverseOperator &inverse_operator) │ │ │ │ │ +Construct the preconditioner from the solver. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +O InverseOperator │ │ │ │ │ +type of the wrapped inverse operator │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_2_P_r_e_c_o_n_d_i_t_i_o_n_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(domain_type &v, const range_type &d) │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R │ │ │ │ │ +Sequential SSOR preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_S_e_q_S_S_O_R │ │ │ │ │ +SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ +const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_S_e_q_S_S_O_R │ │ │ │ │ +SeqSSOR(const M &A, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:199 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:233 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:216 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:148 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_S_O_R_:_:_S_e_q_S_S_O_R │ │ │ │ │ +SeqSSOR(const M &A, int n, real_field_type w) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R │ │ │ │ │ +Sequential SOR preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_S_e_q_S_O_R │ │ │ │ │ +SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ +const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:302 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:264 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:274 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const Y &d) │ │ │ │ │ +Apply the preconditioner in a special direction. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:367 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:272 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:336 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_S_e_q_S_O_R │ │ │ │ │ +SeqSOR(const M &A, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:270 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_O_R_:_:_S_e_q_S_O_R │ │ │ │ │ +SeqSOR(const M &A, int n, real_field_type w) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c │ │ │ │ │ +The sequential jacobian preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:412 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:499 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_S_e_q_J_a_c │ │ │ │ │ +SeqJac(const M &A, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:470 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:487 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +M matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:415 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:423 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_S_e_q_J_a_c │ │ │ │ │ +SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ +const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:453 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:421 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:479 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:417 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:425 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:503 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_S_e_q_J_a_c │ │ │ │ │ +SeqJac(const M &A, int n, real_field_type w) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:434 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_J_a_c_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:419 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U │ │ │ │ │ +Sequential ILU preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:532 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:678 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ +SeqILU(const M &A, int n, real_field_type w, const bool resort=false) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:612 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:648 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:656 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_C_R_S │ │ │ │ │ +ILU::CRS< block_type, typename M::allocator_type > CRS │ │ │ │ │ +type of ILU storage │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:552 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:541 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_l_o_w_e_r__ │ │ │ │ │ +CRS lower_ │ │ │ │ │ +The ILU(n) decomposition of the matrix. As storage a CRS structure is used. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:692 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_w_N_o_t_I_d_e_n_t_i_t_y__ │ │ │ │ │ +const bool wNotIdentity_ │ │ │ │ │ +true if w != 1.0 │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:699 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ +SeqILU(const M &A, const ParameterTree &config) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:598 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +std::remove_const< M >::type matrix_type │ │ │ │ │ +The matrix type the preconditioner is for. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:535 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +matrix_type::block_type block_type │ │ │ │ │ +block type of matrix │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:537 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:549 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:544 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:682 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ +SeqILU(const M &A, real_field_type w, const bool resort=false) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_w__ │ │ │ │ │ +const real_field_type w_ │ │ │ │ │ +The relaxation factor to use. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:697 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_S_e_q_I_L_U │ │ │ │ │ +SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ +const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:580 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_i_n_v__ │ │ │ │ │ +std::vector< block_type, typename matrix_type::allocator_type > inv_ │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:694 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:547 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_I_L_U__ │ │ │ │ │ +std::unique_ptr< matrix_type > ILU_ │ │ │ │ │ +The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:689 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_U_:_:_u_p_p_e_r__ │ │ │ │ │ +CRS upper_ │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:693 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n │ │ │ │ │ +Richardson preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:713 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:720 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:778 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +The range type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:718 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_p_r_e │ │ │ │ │ +virtual void pre(X &x, Y &b) │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:755 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_R_i_c_h_a_r_d_s_o_n │ │ │ │ │ +Richardson(real_field_type w=1.0) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:731 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_p_o_s_t │ │ │ │ │ +virtual void post(X &x) │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:774 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:724 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:722 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_R_i_c_h_a_r_d_s_o_n │ │ │ │ │ +Richardson(const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:746 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +The domain type of the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:716 │ │ │ │ │ +_D_u_n_e_:_:_R_i_c_h_a_r_d_s_o_n_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &v, const Y &d) │ │ │ │ │ +Apply the precondioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:763 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L │ │ │ │ │ +sequential ILDL preconditioner │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:807 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_S_e_q_I_L_D_L │ │ │ │ │ +SeqILDL(const matrix_type &A, const ParameterTree &config) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:853 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_S_e_q_I_L_D_L │ │ │ │ │ +SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1)) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:865 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +domain type of the preconditioner │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:815 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_p_o_s_t │ │ │ │ │ +void post(X &x) override │ │ │ │ │ +Clean up. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:916 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +range type of the preconditioner │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:817 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_m_a_t_r_i_x___t_y_p_e │ │ │ │ │ +std::remove_const_t< M > matrix_type │ │ │ │ │ +type of matrix the preconditioner is for │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:813 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_a_p_p_l_y │ │ │ │ │ +void apply(X &v, const Y &d) override │ │ │ │ │ +Apply one step of the preconditioner to the system A(v)=d. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:909 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_r_e_a_l___f_i_e_l_d___t_y_p_e │ │ │ │ │ +FieldTraits< scalar_field_type >::real_type real_field_type │ │ │ │ │ +real scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:823 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_S_e_q_I_L_D_L │ │ │ │ │ +SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, │ │ │ │ │ +const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:837 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_p_r_e │ │ │ │ │ +void pre(X &x, Y &b) override │ │ │ │ │ +Prepare the preconditioner. │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:905 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_s_c_a_l_a_r___f_i_e_l_d___t_y_p_e │ │ │ │ │ +Simd::Scalar< field_type > scalar_field_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:821 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +field type of the preconditioner │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:819 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_I_L_D_L_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +SolverCategory::Category category() const override │ │ │ │ │ +Category of the preconditioner (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn preconditioners.hh:920 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ _D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ Category │ │ │ │ │ DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ overlapping │ │ │ │ │ -Category for overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ +Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ +newly introduced virtu... │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00215.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bvector.hh File Reference │ │ │ │ +dune-istl: ilu.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,63 +73,77 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
bvector.hh File Reference
│ │ │ │ +
ilu.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

This file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time. │ │ │ │ +

The incomplete LU factorization kernels. │ │ │ │ More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <cmath>
│ │ │ │ +
#include <cmath>
│ │ │ │ #include <complex>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <utility>
│ │ │ │ +#include <map>
│ │ │ │ #include <vector>
│ │ │ │ -#include <dune/common/dotproduct.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ #include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/promotiontraits.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ #include <dune/common/scalarvectorview.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ -#include "basearray.hh"
│ │ │ │ -#include "istlexception.hh"
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::BlockVector< B, A >
 A vector of blocks with memory management. More...
 
struct  Dune::FieldTraits< BlockVector< B, A > >
struct  Dune::ILU::CRS< B, Alloc >
 a simple compressed row storage matrix class More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::ILU
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class K , class A >
std::ostream & Dune::operator<< (std::ostream &s, const BlockVector< K, A > &v)
 Send BlockVector to an output stream.
 
template<class M >
void Dune::ILU::blockILU0Decomposition (M &A)
 compute ILU decomposition of A. A is overwritten by its decomposition
 
template<class M , class X , class Y >
void Dune::ILU::blockILUBacksolve (const M &A, X &v, const Y &d)
 LU backsolve with stored inverse.
 
template<class M >
M::field_type & Dune::ILU::firstMatrixElement (M &A, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
 
template<class K >
K & Dune::ILU::firstMatrixElement (K &A, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
 
template<class K , int n, int m>
K & Dune::ILU::firstMatrixElement (FieldMatrix< K, n, m > &A)
 
template<class M >
void Dune::ILU::blockILUDecomposition (const M &A, int n, M &ILU)
 
template<class M , class CRS , class InvVector >
void Dune::ILU::convertToCRS (const M &A, CRS &lower, CRS &upper, InvVector &inv)
 convert ILU decomposition into CRS format for lower and upper triangular and inverse.
 
template<class CRS , class InvVector , class X , class Y >
void Dune::ILU::blockILUBacksolve (const CRS &lower, const CRS &upper, const InvVector &inv, X &v, const Y &d)
 LU backsolve with stored inverse in CRS format for lower and upper triangular.
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time.

│ │ │ │ +

The incomplete LU factorization kernels.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,49 +1,67 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ _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 │ │ │ │ │ -bvector.hh File Reference │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of components can be given at run-time. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +ilu.hh File Reference │ │ │ │ │ +The incomplete LU factorization kernels. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -#include "_b_a_s_e_a_r_r_a_y_._h_h" │ │ │ │ │ +#include │ │ │ │ │ #include "_i_s_t_l_e_x_c_e_p_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_:_:_B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _> │ │ │ │ │ -  A vector of blocks with memory management. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_I_L_U_:_:_C_R_S_<_ _B_,_ _A_l_l_o_c_ _> │ │ │ │ │ +  a simple compressed row storage matrix class _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_I_L_U │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _B_l_o_c_k_V_e_c_t_o_r< K, A > │ │ │ │ │ - &v) │ │ │ │ │ -  Send _B_l_o_c_k_V_e_c_t_o_r to an output stream. │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n (M &A) │ │ │ │ │ +  compute _I_L_U decomposition of A. A is overwritten by its │ │ │ │ │ + decomposition │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const M &A, X &v, const Y &d) │ │ │ │ │ +  LU backsolve with stored inverse. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +M::field_type &  _D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (M &A, typename std:: │ │ │ │ │ + enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + K &  _D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (K &A, typename std:: │ │ │ │ │ + enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + K &  _D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (_F_i_e_l_d_M_a_t_r_i_x< K, n, m > &A) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n (const M &A, int n, M &ILU) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S (const M &A, _C_R_S &lower, _C_R_S &upper, │ │ │ │ │ + InvVector &inv) │ │ │ │ │ +  convert _I_L_U decomposition into _C_R_S format for lower and upper │ │ │ │ │ + triangular and inverse. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const _C_R_S &lower, const _C_R_S │ │ │ │ │ + &upper, const InvVector &inv, X &v, const Y &d) │ │ │ │ │ +  LU backsolve with stored inverse in _C_R_S format for lower and │ │ │ │ │ + upper triangular. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of components can be given at run-time. │ │ │ │ │ +The incomplete LU factorization kernels. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: bvector.hh Source File │ │ │ │ +dune-istl: ilu.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,961 +74,475 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
bvector.hh
│ │ │ │ +
ilu.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_ISTL_BVECTOR_HH
│ │ │ │ -
7#define DUNE_ISTL_BVECTOR_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <algorithm>
│ │ │ │ -
10#include <cmath>
│ │ │ │ -
11#include <complex>
│ │ │ │ -
12#include <initializer_list>
│ │ │ │ -
13#include <limits>
│ │ │ │ -
14#include <memory>
│ │ │ │ -
15#include <utility>
│ │ │ │ -
16#include <vector>
│ │ │ │ -
17
│ │ │ │ -
18#include <dune/common/dotproduct.hh>
│ │ │ │ -
19#include <dune/common/ftraits.hh>
│ │ │ │ -
20#include <dune/common/fmatrix.hh>
│ │ │ │ -
21#include <dune/common/fvector.hh>
│ │ │ │ -
22#include <dune/common/promotiontraits.hh>
│ │ │ │ -
23#include <dune/common/typetraits.hh>
│ │ │ │ -
24#include <dune/common/scalarvectorview.hh>
│ │ │ │ -
25
│ │ │ │ - │ │ │ │ -
27
│ │ │ │ -
28#include "basearray.hh"
│ │ │ │ -
29#include "istlexception.hh"
│ │ │ │ +
5#ifndef DUNE_ISTL_ILU_HH
│ │ │ │ +
6#define DUNE_ISTL_ILU_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <cmath>
│ │ │ │ +
9#include <complex>
│ │ │ │ +
10#include <map>
│ │ │ │ +
11#include <vector>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/fmatrix.hh>
│ │ │ │ +
14#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
15#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
16
│ │ │ │ +
17#include "istlexception.hh"
│ │ │ │ +
18
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24
│ │ │ │ +
│ │ │ │ +
29 namespace ILU {
│ │ │ │
30
│ │ │ │ -
38namespace Dune {
│ │ │ │ +
32 template<class M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34 {
│ │ │ │ +
35 // iterator types
│ │ │ │ +
36 typedef typename M::RowIterator rowiterator;
│ │ │ │ +
37 typedef typename M::ColIterator coliterator;
│ │ │ │ +
38 typedef typename M::block_type block;
│ │ │ │
39
│ │ │ │ -
41namespace Imp {
│ │ │ │ -
42
│ │ │ │ -
48 template <class B, bool isNumber>
│ │ │ │ -
49 class BlockTraitsImp;
│ │ │ │ -
50
│ │ │ │ -
51 template <class B>
│ │ │ │ -
52 class BlockTraitsImp<B,true>
│ │ │ │ -
53 {
│ │ │ │ -
54 public:
│ │ │ │ -
55 using field_type = B;
│ │ │ │ -
56 };
│ │ │ │ -
57
│ │ │ │ -
58 template <class B>
│ │ │ │ -
59 class BlockTraitsImp<B,false>
│ │ │ │ -
60 {
│ │ │ │ -
61 public:
│ │ │ │ -
62 using field_type = typename B::field_type;
│ │ │ │ -
63 };
│ │ │ │ -
64
│ │ │ │ -
67 template <class B>
│ │ │ │ -
68 using BlockTraits = BlockTraitsImp<B,IsNumber<B>::value>;
│ │ │ │ -
69
│ │ │ │ -
83 template<class B, class A=std::allocator<B> >
│ │ │ │ -
84 class block_vector_unmanaged : public base_array_unmanaged<B,A>
│ │ │ │ -
85 {
│ │ │ │ -
86 public:
│ │ │ │ -
87
│ │ │ │ -
88 //===== type definitions and constants
│ │ │ │ -
89 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
90
│ │ │ │ -
92 typedef B block_type;
│ │ │ │ -
93
│ │ │ │ -
95 typedef A allocator_type;
│ │ │ │ -
96
│ │ │ │ -
98 typedef typename A::size_type size_type;
│ │ │ │ -
99
│ │ │ │ -
101 typedef typename base_array_unmanaged<B,A>::iterator Iterator;
│ │ │ │ -
102
│ │ │ │ -
104 typedef typename base_array_unmanaged<B,A>::const_iterator ConstIterator;
│ │ │ │ -
105
│ │ │ │ -
107 typedef B value_type;
│ │ │ │ -
108
│ │ │ │ -
110 typedef B& reference;
│ │ │ │ -
111
│ │ │ │ -
113 typedef const B& const_reference;
│ │ │ │ -
114
│ │ │ │ -
115 //===== assignment from scalar
│ │ │ │ -
117
│ │ │ │ -
118 block_vector_unmanaged& operator= (const field_type& k)
│ │ │ │ -
119 {
│ │ │ │ -
120 for (size_type i=0; i<this->n; i++)
│ │ │ │ -
121 (*this)[i] = k;
│ │ │ │ -
122 return *this;
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ -
125 //===== vector space arithmetic
│ │ │ │ -
127 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y)
│ │ │ │ -
128 {
│ │ │ │ -
129#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
130 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
131#endif
│ │ │ │ -
132 for (size_type i=0; i<this->n; ++i) (*this)[i] += y[i];
│ │ │ │ -
133 return *this;
│ │ │ │ -
134 }
│ │ │ │ -
135
│ │ │ │ -
137 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y)
│ │ │ │ -
138 {
│ │ │ │ -
139#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
140 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
141#endif
│ │ │ │ -
142 for (size_type i=0; i<this->n; ++i) (*this)[i] -= y[i];
│ │ │ │ -
143 return *this;
│ │ │ │ -
144 }
│ │ │ │ -
145
│ │ │ │ -
147 block_vector_unmanaged& operator*= (const field_type& k)
│ │ │ │ -
148 {
│ │ │ │ -
149 for (size_type i=0; i<this->n; ++i) (*this)[i] *= k;
│ │ │ │ -
150 return *this;
│ │ │ │ -
151 }
│ │ │ │ -
152
│ │ │ │ -
154 block_vector_unmanaged& operator/= (const field_type& k)
│ │ │ │ -
155 {
│ │ │ │ -
156 for (size_type i=0; i<this->n; ++i) (*this)[i] /= k;
│ │ │ │ -
157 return *this;
│ │ │ │ +
40 // implement left looking variant with stored inverse
│ │ │ │ +
41 rowiterator endi=A.end();
│ │ │ │ +
42 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
43 {
│ │ │ │ +
44 // coliterator is diagonal after the following loop
│ │ │ │ +
45 coliterator endij=(*i).end(); // end of row i
│ │ │ │ +
46 coliterator ij;
│ │ │ │ +
47
│ │ │ │ +
48 // eliminate entries left of diagonal; store L factor
│ │ │ │ +
49 for (ij=(*i).begin(); ij.index()<i.index(); ++ij)
│ │ │ │ +
50 {
│ │ │ │ +
51 // find A_jj which eliminates A_ij
│ │ │ │ +
52 coliterator jj = A[ij.index()].find(ij.index());
│ │ │ │ +
53
│ │ │ │ +
54 // compute L_ij = A_jj^-1 * A_ij
│ │ │ │ +
55 Impl::asMatrix(*ij).rightmultiply(Impl::asMatrix(*jj));
│ │ │ │ +
56
│ │ │ │ +
57 // modify row
│ │ │ │ +
58 coliterator endjk=A[ij.index()].end(); // end of row j
│ │ │ │ +
59 coliterator jk=jj; ++jk;
│ │ │ │ +
60 coliterator ik=ij; ++ik;
│ │ │ │ +
61 while (ik!=endij && jk!=endjk)
│ │ │ │ +
62 if (ik.index()==jk.index())
│ │ │ │ +
63 {
│ │ │ │ +
64 block B(*jk);
│ │ │ │ +
65 Impl::asMatrix(B).leftmultiply(Impl::asMatrix(*ij));
│ │ │ │ +
66 *ik -= B;
│ │ │ │ +
67 ++ik; ++jk;
│ │ │ │ +
68 }
│ │ │ │ +
69 else
│ │ │ │ +
70 {
│ │ │ │ +
71 if (ik.index()<jk.index())
│ │ │ │ +
72 ++ik;
│ │ │ │ +
73 else
│ │ │ │ +
74 ++jk;
│ │ │ │ +
75 }
│ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ +
78 // invert pivot and store it in A
│ │ │ │ +
79 if (ij.index()!=i.index())
│ │ │ │ +
80 DUNE_THROW(ISTLError,"diagonal entry missing");
│ │ │ │ +
81 try {
│ │ │ │ +
82 Impl::asMatrix(*ij).invert(); // compute inverse of diagonal block
│ │ │ │ +
83 }
│ │ │ │ +
84 catch (Dune::FMatrixError & e) {
│ │ │ │ +
85 DUNE_THROW(MatrixBlockError, "ILU failed to invert matrix block A["
│ │ │ │ +
86 << i.index() << "][" << ij.index() << "]" << e.what();
│ │ │ │ +
87 th__ex.r=i.index(); th__ex.c=ij.index(););
│ │ │ │ +
88 }
│ │ │ │ +
89 }
│ │ │ │ +
90 }
│ │ │ │ +
│ │ │ │ +
91
│ │ │ │ +
93 template<class M, class X, class Y>
│ │ │ │ +
│ │ │ │ +
94 void blockILUBacksolve (const M& A, X& v, const Y& d)
│ │ │ │ +
95 {
│ │ │ │ +
96 // iterator types
│ │ │ │ +
97 typedef typename M::ConstRowIterator rowiterator;
│ │ │ │ +
98 typedef typename M::ConstColIterator coliterator;
│ │ │ │ +
99 typedef typename Y::block_type dblock;
│ │ │ │ +
100 typedef typename X::block_type vblock;
│ │ │ │ +
101
│ │ │ │ +
102 // lower triangular solve
│ │ │ │ +
103 rowiterator endi=A.end();
│ │ │ │ +
104 for (rowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
105 {
│ │ │ │ +
106 // We need to be careful here: Directly using
│ │ │ │ +
107 // auto rhs = Impl::asVector(d[ i.index() ]);
│ │ │ │ +
108 // is not OK in case this is a proxy. Hence
│ │ │ │ +
109 // we first have to copy the value. Notice that
│ │ │ │ +
110 // this is still not OK, if the vector type itself returns
│ │ │ │ +
111 // proxy references.
│ │ │ │ +
112 dblock rhsValue(d[i.index()]);
│ │ │ │ +
113 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ +
114 for (coliterator j=(*i).begin(); j.index()<i.index(); ++j)
│ │ │ │ +
115 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
│ │ │ │ +
116 Impl::asVector(v[i.index()]) = rhs; // Lii = I
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ +
119 // upper triangular solve
│ │ │ │ +
120 rowiterator rendi=A.beforeBegin();
│ │ │ │ +
121 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
│ │ │ │ +
122 {
│ │ │ │ +
123 // We need to be careful here: Directly using
│ │ │ │ +
124 // auto rhs = Impl::asVector(v[ i.index() ]);
│ │ │ │ +
125 // is not OK in case this is a proxy. Hence
│ │ │ │ +
126 // we first have to copy the value. Notice that
│ │ │ │ +
127 // this is still not OK, if the vector type itself returns
│ │ │ │ +
128 // proxy references.
│ │ │ │ +
129 vblock rhsValue(v[i.index()]);
│ │ │ │ +
130 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ +
131 coliterator j;
│ │ │ │ +
132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
│ │ │ │ +
133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
│ │ │ │ +
134 auto&& vi = Impl::asVector(v[i.index()]);
│ │ │ │ +
135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse!
│ │ │ │ +
136 }
│ │ │ │ +
137 }
│ │ │ │ +
│ │ │ │ +
138
│ │ │ │ +
139 // recursive function template to access first entry of a matrix
│ │ │ │ +
140 template<class M>
│ │ │ │ +
│ │ │ │ +
141 typename M::field_type& firstMatrixElement (M& A,
│ │ │ │ +
142 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ +
143 {
│ │ │ │ +
144 return firstMatrixElement(*(A.begin()->begin()));
│ │ │ │ +
145 }
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
147 template<class K>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
149 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr)
│ │ │ │ +
150 {
│ │ │ │ +
151 return A;
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
154 template<class K, int n, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 {
│ │ │ │ +
157 return A[0][0];
│ │ │ │
158 }
│ │ │ │ +
│ │ │ │
159
│ │ │ │ -
161 block_vector_unmanaged& axpy (const field_type& a, const block_vector_unmanaged& y)
│ │ │ │ -
162 {
│ │ │ │ -
163#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
164 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
165#endif
│ │ │ │ -
166 for (size_type i=0; i<this->n; ++i)
│ │ │ │ -
167 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i]));
│ │ │ │ -
168
│ │ │ │ -
169 return *this;
│ │ │ │ -
170 }
│ │ │ │ -
171
│ │ │ │ -
172
│ │ │ │ -
180 template<class OtherB, class OtherA>
│ │ │ │ -
181 auto operator* (const block_vector_unmanaged<OtherB,OtherA>& y) const
│ │ │ │ -
182 {
│ │ │ │ -
183 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
│ │ │ │ -
184 PromotedType sum(0);
│ │ │ │ -
185#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
186 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
187#endif
│ │ │ │ -
188 for (size_type i=0; i<this->n; ++i) {
│ │ │ │ -
189 sum += PromotedType(((*this)[i])*y[i]);
│ │ │ │ -
190 }
│ │ │ │ -
191 return sum;
│ │ │ │ -
192 }
│ │ │ │ -
193
│ │ │ │ -
201 template<class OtherB, class OtherA>
│ │ │ │ -
202 auto dot(const block_vector_unmanaged<OtherB,OtherA>& y) const
│ │ │ │ -
203 {
│ │ │ │ -
204 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
│ │ │ │ -
205 PromotedType sum(0);
│ │ │ │ -
206#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
207 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
208#endif
│ │ │ │ -
209
│ │ │ │ -
210 for (size_type i=0; i<this->n; ++i)
│ │ │ │ -
211 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i]));
│ │ │ │ -
212
│ │ │ │ -
213 return sum;
│ │ │ │ -
214 }
│ │ │ │ -
215
│ │ │ │ -
216 //===== norms
│ │ │ │ -
217
│ │ │ │ -
219 typename FieldTraits<field_type>::real_type one_norm () const
│ │ │ │ -
220 {
│ │ │ │ -
221 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
222 for (size_type i=0; i<this->n; ++i)
│ │ │ │ -
223 sum += Impl::asVector((*this)[i]).one_norm();
│ │ │ │ -
224 return sum;
│ │ │ │ -
225 }
│ │ │ │ -
226
│ │ │ │ -
228 typename FieldTraits<field_type>::real_type one_norm_real () const
│ │ │ │ -
229 {
│ │ │ │ -
230 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
231 for (size_type i=0; i<this->n; ++i)
│ │ │ │ -
232 sum += Impl::asVector((*this)[i]).one_norm_real();
│ │ │ │ -
233 return sum;
│ │ │ │ -
234 }
│ │ │ │ -
235
│ │ │ │ -
237 typename FieldTraits<field_type>::real_type two_norm () const
│ │ │ │ -
238 {
│ │ │ │ -
239 using std::sqrt;
│ │ │ │ -
240 return sqrt(two_norm2());
│ │ │ │ -
241 }
│ │ │ │ -
242
│ │ │ │ -
244 typename FieldTraits<field_type>::real_type two_norm2 () const
│ │ │ │ -
245 {
│ │ │ │ -
246 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
247 for (size_type i=0; i<this->n; ++i)
│ │ │ │ -
248 sum += Impl::asVector((*this)[i]).two_norm2();
│ │ │ │ -
249 return sum;
│ │ │ │ -
250 }
│ │ │ │ +
166 template<class M>
│ │ │ │ +
│ │ │ │ +
167 void blockILUDecomposition (const M& A, int n, M& ILU)
│ │ │ │ +
168 {
│ │ │ │ +
169 // iterator types
│ │ │ │ +
170 typedef typename M::ColIterator coliterator;
│ │ │ │ +
171 typedef typename M::ConstRowIterator crowiterator;
│ │ │ │ +
172 typedef typename M::ConstColIterator ccoliterator;
│ │ │ │ +
173 typedef typename M::CreateIterator createiterator;
│ │ │ │ +
174 typedef typename M::field_type K;
│ │ │ │ +
175 typedef std::map<size_t, int> map;
│ │ │ │ +
176 typedef typename map::iterator mapiterator;
│ │ │ │ +
177
│ │ │ │ +
178 // symbolic factorization phase, store generation number in first matrix element
│ │ │ │ +
179 crowiterator endi=A.end();
│ │ │ │ +
180 createiterator ci=ILU.createbegin();
│ │ │ │ +
181 for (crowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
182 {
│ │ │ │ +
183 map rowpattern; // maps column index to generation
│ │ │ │ +
184
│ │ │ │ +
185 // initialize pattern with row of A
│ │ │ │ +
186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)
│ │ │ │ +
187 rowpattern[j.index()] = 0;
│ │ │ │ +
188
│ │ │ │ +
189 // eliminate entries in row which are to the left of the diagonal
│ │ │ │ +
190 for (mapiterator ik=rowpattern.begin(); (*ik).first<i.index(); ++ik)
│ │ │ │ +
191 {
│ │ │ │ +
192 if ((*ik).second<n)
│ │ │ │ +
193 {
│ │ │ │ +
194 coliterator endk = ILU[(*ik).first].end(); // end of row k
│ │ │ │ +
195 coliterator kj = ILU[(*ik).first].find((*ik).first); // diagonal in k
│ │ │ │ +
196 for (++kj; kj!=endk; ++kj) // row k eliminates in row i
│ │ │ │ +
197 {
│ │ │ │ +
198 // we misuse the storage to store an int. If the field_type is std::complex, we have to access the real/abs part
│ │ │ │ +
199 // starting from C++11, we can use std::abs to always return a real value, even if it is double/float
│ │ │ │ +
200 using std::abs;
│ │ │ │ +
201 int generation = (int) Simd::lane(0, abs( firstMatrixElement(*kj) ));
│ │ │ │ +
202 if (generation<n)
│ │ │ │ +
203 {
│ │ │ │ +
204 mapiterator ij = rowpattern.find(kj.index());
│ │ │ │ +
205 if (ij==rowpattern.end())
│ │ │ │ +
206 {
│ │ │ │ +
207 rowpattern[kj.index()] = generation+1;
│ │ │ │ +
208 }
│ │ │ │ +
209 }
│ │ │ │ +
210 }
│ │ │ │ +
211 }
│ │ │ │ +
212 }
│ │ │ │ +
213
│ │ │ │ +
214 // create row
│ │ │ │ +
215 for (mapiterator ik=rowpattern.begin(); ik!=rowpattern.end(); ++ik)
│ │ │ │ +
216 ci.insert((*ik).first);
│ │ │ │ +
217 ++ci; // now row i exist
│ │ │ │ +
218
│ │ │ │ +
219 // write generation index into entries
│ │ │ │ +
220 coliterator endILUij = ILU[i.index()].end();;
│ │ │ │ +
221 for (coliterator ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
│ │ │ │ +
222 Simd::lane(0, firstMatrixElement(*ILUij)) = (Simd::Scalar<K>) rowpattern[ILUij.index()];
│ │ │ │ +
223 }
│ │ │ │ +
224
│ │ │ │ +
225 // copy entries of A
│ │ │ │ +
226 for (crowiterator i=A.begin(); i!=endi; ++i)
│ │ │ │ +
227 {
│ │ │ │ +
228 coliterator ILUij;
│ │ │ │ +
229 coliterator endILUij = ILU[i.index()].end();;
│ │ │ │ +
230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
│ │ │ │ +
231 (*ILUij) = 0; // clear row
│ │ │ │ +
232 ccoliterator Aij = (*i).begin();
│ │ │ │ +
233 ccoliterator endAij = (*i).end();
│ │ │ │ +
234 ILUij = ILU[i.index()].begin();
│ │ │ │ +
235 while (Aij!=endAij && ILUij!=endILUij)
│ │ │ │ +
236 {
│ │ │ │ +
237 if (Aij.index()==ILUij.index())
│ │ │ │ +
238 {
│ │ │ │ +
239 *ILUij = *Aij;
│ │ │ │ +
240 ++Aij; ++ILUij;
│ │ │ │ +
241 }
│ │ │ │ +
242 else
│ │ │ │ +
243 {
│ │ │ │ +
244 if (Aij.index()<ILUij.index())
│ │ │ │ +
245 ++Aij;
│ │ │ │ +
246 else
│ │ │ │ +
247 ++ILUij;
│ │ │ │ +
248 }
│ │ │ │ +
249 }
│ │ │ │ +
250 }
│ │ │ │
251
│ │ │ │ -
253 template <typename ft = field_type,
│ │ │ │ -
254 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
255 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
256 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
257 using std::max;
│ │ │ │ -
258
│ │ │ │ -
259 real_type norm = 0;
│ │ │ │ -
260 for (auto const &xi : *this) {
│ │ │ │ -
261 real_type const a = Impl::asVector(xi).infinity_norm();
│ │ │ │ -
262 norm = max(a, norm);
│ │ │ │ -
263 }
│ │ │ │ -
264 return norm;
│ │ │ │ -
265 }
│ │ │ │ +
252 // call decomposition on pattern
│ │ │ │ + │ │ │ │ +
254 }
│ │ │ │ +
│ │ │ │ +
255
│ │ │ │ +
257 template <class B, class Alloc = std::allocator<B>>
│ │ │ │ +
│ │ │ │ +
258 struct CRS
│ │ │ │ +
259 {
│ │ │ │ +
260 typedef B block_type;
│ │ │ │ +
261 typedef size_t size_type;
│ │ │ │ +
262
│ │ │ │ +
263 CRS() : nRows_( 0 ) {}
│ │ │ │ +
264
│ │ │ │ +
265 size_type rows() const { return nRows_; }
│ │ │ │
266
│ │ │ │ -
268 template <typename ft = field_type,
│ │ │ │ -
269 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
270 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
271 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
272 using std::max;
│ │ │ │ -
273
│ │ │ │ -
274 real_type norm = 0;
│ │ │ │ -
275 for (auto const &xi : *this) {
│ │ │ │ -
276 real_type const a = Impl::asVector(xi).infinity_norm_real();
│ │ │ │ -
277 norm = max(a, norm);
│ │ │ │ -
278 }
│ │ │ │ -
279 return norm;
│ │ │ │ -
280 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
268 {
│ │ │ │ +
269 assert( rows_[ rows() ] != size_type(-1) );
│ │ │ │ +
270 return rows_[ rows() ];
│ │ │ │ +
271 }
│ │ │ │ +
│ │ │ │ +
272
│ │ │ │ +
│ │ │ │ +
273 void resize( const size_type nRows )
│ │ │ │ +
274 {
│ │ │ │ +
275 if( nRows_ != nRows )
│ │ │ │ +
276 {
│ │ │ │ +
277 nRows_ = nRows ;
│ │ │ │ +
278 rows_.resize( nRows_+1, size_type(-1) );
│ │ │ │ +
279 }
│ │ │ │ +
280 }
│ │ │ │ +
│ │ │ │
281
│ │ │ │ -
283 template <typename ft = field_type,
│ │ │ │ -
284 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
285 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
286 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
287 using std::max;
│ │ │ │ -
288 using std::abs;
│ │ │ │ -
289
│ │ │ │ -
290 real_type norm = 0;
│ │ │ │ -
291 real_type isNaN = 1;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
283 {
│ │ │ │ +
284 const size_type needed = values_.size() + nonZeros ;
│ │ │ │ +
285 if( values_.capacity() < needed )
│ │ │ │ +
286 {
│ │ │ │ +
287 const size_type estimate = needed * 1.1;
│ │ │ │ +
288 values_.reserve( estimate );
│ │ │ │ +
289 cols_.reserve( estimate );
│ │ │ │ +
290 }
│ │ │ │ +
291 }
│ │ │ │ +
│ │ │ │
292
│ │ │ │ -
293 for (auto const &xi : *this) {
│ │ │ │ -
294 real_type const a = Impl::asVector(xi).infinity_norm();
│ │ │ │ -
295 norm = max(a, norm);
│ │ │ │ -
296 isNaN += a;
│ │ │ │ +
│ │ │ │ +
293 void push_back( const block_type& value, const size_type index )
│ │ │ │ +
294 {
│ │ │ │ +
295 values_.push_back( value );
│ │ │ │ +
296 cols_.push_back( index );
│ │ │ │
297 }
│ │ │ │ -
298 return norm * (isNaN / isNaN);
│ │ │ │ -
299 }
│ │ │ │ -
300
│ │ │ │ -
302 template <typename ft = field_type,
│ │ │ │ -
303 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
304 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
305 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
306 using std::max;
│ │ │ │ -
307
│ │ │ │ -
308 real_type norm = 0;
│ │ │ │ -
309 real_type isNaN = 1;
│ │ │ │ +
│ │ │ │ +
298
│ │ │ │ +
299 std::vector< size_type > rows_;
│ │ │ │ +
300 std::vector< block_type, Alloc> values_;
│ │ │ │ +
301 std::vector< size_type > cols_;
│ │ │ │ + │ │ │ │ +
303 };
│ │ │ │ +
│ │ │ │ +
304
│ │ │ │ +
306 template<class M, class CRS, class InvVector>
│ │ │ │ +
│ │ │ │ +
307 void convertToCRS(const M& A, CRS& lower, CRS& upper, InvVector& inv )
│ │ │ │ +
308 {
│ │ │ │ +
309 typedef typename M :: size_type size_type;
│ │ │ │
310
│ │ │ │ -
311 for (auto const &xi : *this) {
│ │ │ │ -
312 real_type const a = Impl::asVector(xi).infinity_norm_real();
│ │ │ │ -
313 norm = max(a, norm);
│ │ │ │ -
314 isNaN += a;
│ │ │ │ -
315 }
│ │ │ │ -
316
│ │ │ │ -
317 return norm * (isNaN / isNaN);
│ │ │ │ -
318 }
│ │ │ │ -
319
│ │ │ │ -
320 //===== sizes
│ │ │ │ +
311 lower.resize( A.N() );
│ │ │ │ +
312 upper.resize( A.N() );
│ │ │ │ +
313 inv.resize( A.N() );
│ │ │ │ +
314
│ │ │ │ +
315 // lower and upper triangular should store half of non zeros minus diagonal
│ │ │ │ +
316 const size_t memEstimate = (A.nonzeroes() - A.N())/2;
│ │ │ │ +
317
│ │ │ │ +
318 assert( A.nonzeroes() != 0 );
│ │ │ │ +
319 lower.reserveAdditional( memEstimate );
│ │ │ │ +
320 upper.reserveAdditional( memEstimate );
│ │ │ │
321
│ │ │ │ -
323 size_type N () const
│ │ │ │ -
324 {
│ │ │ │ -
325 return this->n;
│ │ │ │ -
326 }
│ │ │ │ -
327
│ │ │ │ -
329 size_type dim () const
│ │ │ │ -
330 {
│ │ │ │ -
331 size_type d=0;
│ │ │ │ -
332
│ │ │ │ -
333 for (size_type i=0; i<this->n; i++)
│ │ │ │ -
334 d += Impl::asVector((*this)[i]).dim();
│ │ │ │ -
335
│ │ │ │ -
336 return d;
│ │ │ │ -
337 }
│ │ │ │ +
322 const auto endi = A.end();
│ │ │ │ +
323 size_type row = 0;
│ │ │ │ +
324 size_type colcount = 0;
│ │ │ │ +
325 lower.rows_[ 0 ] = colcount;
│ │ │ │ +
326 for (auto i=A.begin(); i!=endi; ++i, ++row)
│ │ │ │ +
327 {
│ │ │ │ +
328 const size_type iIndex = i.index();
│ │ │ │ +
329
│ │ │ │ +
330 // store entries left of diagonal
│ │ │ │ +
331 for (auto j=(*i).begin(); j.index() < iIndex; ++j )
│ │ │ │ +
332 {
│ │ │ │ +
333 lower.push_back( (*j), j.index() );
│ │ │ │ +
334 ++colcount;
│ │ │ │ +
335 }
│ │ │ │ +
336 lower.rows_[ iIndex+1 ] = colcount;
│ │ │ │ +
337 }
│ │ │ │
338
│ │ │ │ -
339 protected:
│ │ │ │ -
341 block_vector_unmanaged () : base_array_unmanaged<B,A>()
│ │ │ │ -
342 { }
│ │ │ │ -
343 };
│ │ │ │ -
344
│ │ │ │ -
346
│ │ │ │ -
351 template<class F>
│ │ │ │ -
352 class ScopeGuard {
│ │ │ │ -
353 F cleanupFunc_;
│ │ │ │ -
354 public:
│ │ │ │ -
355 ScopeGuard(F cleanupFunc) : cleanupFunc_(std::move(cleanupFunc)) {}
│ │ │ │ -
356 ScopeGuard(const ScopeGuard &) = delete;
│ │ │ │ -
357 ScopeGuard(ScopeGuard &&) = delete;
│ │ │ │ -
358 ScopeGuard &operator=(ScopeGuard) = delete;
│ │ │ │ -
359 ~ScopeGuard() { cleanupFunc_(); }
│ │ │ │ -
360 };
│ │ │ │ -
361
│ │ │ │ -
363
│ │ │ │ -
372 template<class F>
│ │ │ │ -
373 ScopeGuard<F> makeScopeGuard(F cleanupFunc)
│ │ │ │ -
374 {
│ │ │ │ -
375 return { std::move(cleanupFunc) };
│ │ │ │ -
376 }
│ │ │ │ -
377
│ │ │ │ -
378} // end namespace Imp
│ │ │ │ -
393 template<class B, class A=std::allocator<B> >
│ │ │ │ -
│ │ │ │ -
394 class BlockVector : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ -
395 {
│ │ │ │ -
396 public:
│ │ │ │ +
339 const auto rendi = A.beforeBegin();
│ │ │ │ +
340 row = 0;
│ │ │ │ +
341 colcount = 0;
│ │ │ │ +
342 upper.rows_[ 0 ] = colcount ;
│ │ │ │ +
343
│ │ │ │ +
344 // NOTE: upper and inv store entries in reverse row and col order,
│ │ │ │ +
345 // reverse here relative to ILU
│ │ │ │ +
346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row )
│ │ │ │ +
347 {
│ │ │ │ +
348 const auto endij=(*i).beforeBegin(); // end of row i
│ │ │ │ +
349
│ │ │ │ +
350 const size_type iIndex = i.index();
│ │ │ │ +
351
│ │ │ │ +
352 // store in reverse row order for faster access during backsolve
│ │ │ │ +
353 for (auto j=(*i).beforeEnd(); j != endij; --j )
│ │ │ │ +
354 {
│ │ │ │ +
355 const size_type jIndex = j.index();
│ │ │ │ +
356 if( j.index() == iIndex )
│ │ │ │ +
357 {
│ │ │ │ +
358 inv[ row ] = (*j);
│ │ │ │ +
359 break; // assuming consecutive ordering of A
│ │ │ │ +
360 }
│ │ │ │ +
361 else if ( j.index() >= i.index() )
│ │ │ │ +
362 {
│ │ │ │ +
363 upper.push_back( (*j), jIndex );
│ │ │ │ +
364 ++colcount ;
│ │ │ │ +
365 }
│ │ │ │ +
366 }
│ │ │ │ +
367 upper.rows_[ row+1 ] = colcount;
│ │ │ │ +
368 }
│ │ │ │ +
369 } // end convertToCRS
│ │ │ │ +
│ │ │ │ +
370
│ │ │ │ +
372 template<class CRS, class InvVector, class X, class Y>
│ │ │ │ +
│ │ │ │ +
373 void blockILUBacksolve (const CRS& lower,
│ │ │ │ +
374 const CRS& upper,
│ │ │ │ +
375 const InvVector& inv,
│ │ │ │ +
376 X& v, const Y& d)
│ │ │ │ +
377 {
│ │ │ │ +
378 // iterator types
│ │ │ │ +
379 typedef typename Y :: block_type dblock;
│ │ │ │ +
380 typedef typename X :: block_type vblock;
│ │ │ │ +
381 typedef typename X :: size_type size_type ;
│ │ │ │ +
382
│ │ │ │ +
383 const size_type iEnd = lower.rows();
│ │ │ │ +
384 const size_type lastRow = iEnd - 1;
│ │ │ │ +
385 if( iEnd != upper.rows() )
│ │ │ │ +
386 {
│ │ │ │ +
387 DUNE_THROW(ISTLError,"ILU::blockILUBacksolve: lower and upper rows must be the same");
│ │ │ │ +
388 }
│ │ │ │ +
389
│ │ │ │ +
390 // lower triangular solve
│ │ │ │ +
391 for( size_type i=0; i<iEnd; ++ i )
│ │ │ │ +
392 {
│ │ │ │ +
393 dblock rhsValue( d[ i ] );
│ │ │ │ +
394 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ +
395 const size_type rowI = lower.rows_[ i ];
│ │ │ │ +
396 const size_type rowINext = lower.rows_[ i+1 ];
│ │ │ │
397
│ │ │ │ -
398 //===== type definitions and constants
│ │ │ │ -
399
│ │ │ │ -
401 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
402
│ │ │ │ -
404 typedef B block_type;
│ │ │ │ -
405
│ │ │ │ -
407 typedef A allocator_type;
│ │ │ │ -
408
│ │ │ │ -
410 typedef typename A::size_type size_type;
│ │ │ │ -
411
│ │ │ │ -
413 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
414 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ +
398 for( size_type col = rowI; col < rowINext; ++ col )
│ │ │ │ +
399 Impl::asMatrix(lower.values_[ col ]).mmv( Impl::asVector(v[ lower.cols_[ col ] ] ), rhs );
│ │ │ │ +
400
│ │ │ │ +
401 Impl::asVector(v[ i ]) = rhs; // Lii = I
│ │ │ │ +
402 }
│ │ │ │ +
403
│ │ │ │ +
404 // upper triangular solve
│ │ │ │ +
405 for( size_type i=0; i<iEnd; ++ i )
│ │ │ │ +
406 {
│ │ │ │ +
407 auto&& vBlock = Impl::asVector(v[ lastRow - i ]);
│ │ │ │ +
408 vblock rhsValue ( v[ lastRow - i ] );
│ │ │ │ +
409 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ +
410 const size_type rowI = upper.rows_[ i ];
│ │ │ │ +
411 const size_type rowINext = upper.rows_[ i+1 ];
│ │ │ │ +
412
│ │ │ │ +
413 for( size_type col = rowI; col < rowINext; ++ col )
│ │ │ │ +
414 Impl::asMatrix(upper.values_[ col ]).mmv( Impl::asVector(v[ upper.cols_[ col ] ]), rhs );
│ │ │ │
415
│ │ │ │ -
417 typedef typename Imp::block_vector_unmanaged<B,A>::Iterator Iterator;
│ │ │ │ -
418
│ │ │ │ -
420 typedef typename Imp::block_vector_unmanaged<B,A>::ConstIterator ConstIterator;
│ │ │ │ -
421
│ │ │ │ -
422 //===== constructors and such
│ │ │ │ -
423
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
426 {
│ │ │ │ -
427 syncBaseArray();
│ │ │ │ -
428 }
│ │ │ │ -
│ │ │ │ -
429
│ │ │ │ -
│ │ │ │ -
431 explicit BlockVector (size_type _n) : storage_(_n)
│ │ │ │ -
432 {
│ │ │ │ -
433 syncBaseArray();
│ │ │ │ -
434 }
│ │ │ │ -
│ │ │ │ -
435
│ │ │ │ -
│ │ │ │ -
437 BlockVector (std::initializer_list<B> const &l) : storage_(l)
│ │ │ │ -
438 {
│ │ │ │ -
439 syncBaseArray();
│ │ │ │ -
440 }
│ │ │ │ -
│ │ │ │ -
441
│ │ │ │ -
442
│ │ │ │ -
454 template<typename S>
│ │ │ │ -
│ │ │ │ -
455 BlockVector (size_type _n, S _capacity)
│ │ │ │ -
456 {
│ │ │ │ -
457 static_assert(std::numeric_limits<S>::is_integer,
│ │ │ │ -
458 "capacity must be an unsigned integral type (be aware, that this constructor does not set the default value!)" );
│ │ │ │ -
459 if((size_type)_capacity > _n)
│ │ │ │ -
460 storage_.reserve(_capacity);
│ │ │ │ -
461 storage_.resize(_n);
│ │ │ │ -
462 syncBaseArray();
│ │ │ │ -
463 }
│ │ │ │ -
│ │ │ │ -
464
│ │ │ │ -
465
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
476 {
│ │ │ │ -
477 [[maybe_unused]] const auto &guard =
│ │ │ │ -
478 Imp::makeScopeGuard([this]{ syncBaseArray(); });
│ │ │ │ -
479 storage_.reserve(capacity);
│ │ │ │ -
480 }
│ │ │ │ -
│ │ │ │ -
481
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
489 {
│ │ │ │ -
490 return storage_.capacity();
│ │ │ │ -
491 }
│ │ │ │ -
│ │ │ │ -
492
│ │ │ │ -
│ │ │ │ -
503 void resize(size_type size)
│ │ │ │ -
504 {
│ │ │ │ -
505 [[maybe_unused]] const auto &guard =
│ │ │ │ -
506 Imp::makeScopeGuard([this]{ syncBaseArray(); });
│ │ │ │ -
507 storage_.resize(size);
│ │ │ │ -
508 }
│ │ │ │ -
│ │ │ │ -
509
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
512 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
│ │ │ │ -
513 {
│ │ │ │ -
514 storage_ = a.storage_;
│ │ │ │ -
515 syncBaseArray();
│ │ │ │ -
516 }
│ │ │ │ -
│ │ │ │ -
517
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
520 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
│ │ │ │ -
521 {
│ │ │ │ -
522 swap(a);
│ │ │ │ -
523 }
│ │ │ │ -
│ │ │ │ -
524
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
527 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
│ │ │ │ -
528 {
│ │ │ │ -
529 [[maybe_unused]] const auto &guard =
│ │ │ │ -
530 Imp::makeScopeGuard([this]{ syncBaseArray(); });
│ │ │ │ -
531 storage_ = a.storage_;
│ │ │ │ -
532 return *this;
│ │ │ │ -
533 }
│ │ │ │ -
│ │ │ │ -
534
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
537 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
│ │ │ │ -
538 {
│ │ │ │ -
539 swap(a);
│ │ │ │ -
540 return *this;
│ │ │ │ -
541 }
│ │ │ │ -
│ │ │ │ -
542
│ │ │ │ -
│ │ │ │ -
544 void swap(BlockVector &other)
│ │ │ │ -
545 noexcept(noexcept(
│ │ │ │ -
546 std::declval<BlockVector&>().storage_.swap(other.storage_)))
│ │ │ │ -
547 {
│ │ │ │ -
548 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{
│ │ │ │ -
549 syncBaseArray();
│ │ │ │ -
550 other.syncBaseArray();
│ │ │ │ -
551 });
│ │ │ │ -
552 storage_.swap(other.storage_);
│ │ │ │ -
553 }
│ │ │ │ -
│ │ │ │ -
554
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
557 {
│ │ │ │ -
558 // forward to operator= in base class
│ │ │ │ -
559 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ -
560 return *this;
│ │ │ │ -
561 }
│ │ │ │ -
│ │ │ │ -
562
│ │ │ │ -
563 private:
│ │ │ │ -
564 void syncBaseArray() noexcept
│ │ │ │ -
565 {
│ │ │ │ -
566 this->p = storage_.data();
│ │ │ │ -
567 this->n = storage_.size();
│ │ │ │ -
568 }
│ │ │ │ -
569
│ │ │ │ -
570 std::vector<B, A> storage_;
│ │ │ │ -
571 };
│ │ │ │ -
│ │ │ │ -
572
│ │ │ │ -
578 template<class B, class A>
│ │ │ │ -
│ │ │ │ -
579 struct FieldTraits< BlockVector<B, A> >
│ │ │ │ -
580 {
│ │ │ │ -
581 typedef typename FieldTraits<B>::field_type field_type;
│ │ │ │ -
582 typedef typename FieldTraits<B>::real_type real_type;
│ │ │ │ -
583 };
│ │ │ │ -
│ │ │ │ -
589 template<class K, class A>
│ │ │ │ -
│ │ │ │ -
590 std::ostream& operator<< (std::ostream& s, const BlockVector<K, A>& v)
│ │ │ │ -
591 {
│ │ │ │ -
592 typedef typename BlockVector<K, A>::size_type size_type;
│ │ │ │ -
593
│ │ │ │ -
594 for (size_type i=0; i<v.size(); i++)
│ │ │ │ -
595 s << v[i] << std::endl;
│ │ │ │ -
596
│ │ │ │ -
597 return s;
│ │ │ │ -
598 }
│ │ │ │ -
│ │ │ │ -
599
│ │ │ │ -
601namespace Imp {
│ │ │ │ -
602
│ │ │ │ -
621#ifndef DOXYGEN
│ │ │ │ -
622 template<class B, class A>
│ │ │ │ -
623#else
│ │ │ │ -
624 template<class B, class A=std::allocator<B> >
│ │ │ │ -
625#endif
│ │ │ │ -
626 class BlockVectorWindow : public Imp::block_vector_unmanaged<B,A>
│ │ │ │ -
627 {
│ │ │ │ -
628 public:
│ │ │ │ -
629
│ │ │ │ -
630 //===== type definitions and constants
│ │ │ │ -
631
│ │ │ │ -
633 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
634
│ │ │ │ -
636 typedef B block_type;
│ │ │ │ -
637
│ │ │ │ -
639 typedef A allocator_type;
│ │ │ │ -
640
│ │ │ │ -
642 typedef typename A::size_type size_type;
│ │ │ │ -
643
│ │ │ │ -
645 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
646 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ -
647
│ │ │ │ -
649 typedef typename Imp::block_vector_unmanaged<B,A>::Iterator Iterator;
│ │ │ │ -
650
│ │ │ │ -
652 typedef typename Imp::block_vector_unmanaged<B,A>::ConstIterator ConstIterator;
│ │ │ │ -
653
│ │ │ │ -
654
│ │ │ │ -
655 //===== constructors and such
│ │ │ │ -
657 BlockVectorWindow () : Imp::block_vector_unmanaged<B,A>()
│ │ │ │ -
658 { }
│ │ │ │ -
659
│ │ │ │ -
661 BlockVectorWindow (B* _p, size_type _n)
│ │ │ │ -
662 {
│ │ │ │ -
663 this->n = _n;
│ │ │ │ -
664 this->p = _p;
│ │ │ │ -
665 }
│ │ │ │ -
666
│ │ │ │ -
668 BlockVectorWindow (const BlockVectorWindow& a)
│ │ │ │ -
669 {
│ │ │ │ -
670 this->n = a.n;
│ │ │ │ -
671 this->p = a.p;
│ │ │ │ -
672 }
│ │ │ │ -
673
│ │ │ │ -
675 BlockVectorWindow& operator= (const BlockVectorWindow& a)
│ │ │ │ -
676 {
│ │ │ │ -
677 // check correct size
│ │ │ │ -
678#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
679 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
680#endif
│ │ │ │ -
681
│ │ │ │ -
682 if (&a!=this) // check if this and a are different objects
│ │ │ │ -
683 {
│ │ │ │ -
684 // copy data
│ │ │ │ -
685 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ -
686 }
│ │ │ │ -
687 return *this;
│ │ │ │ -
688 }
│ │ │ │ -
689
│ │ │ │ -
691 BlockVectorWindow& operator= (const field_type& k)
│ │ │ │ -
692 {
│ │ │ │ -
693 (static_cast<Imp::block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ -
694 return *this;
│ │ │ │ -
695 }
│ │ │ │ -
696
│ │ │ │ -
698 operator BlockVector<B, A>() const {
│ │ │ │ -
699 auto bv = BlockVector<B, A>(this->n);
│ │ │ │ -
700
│ │ │ │ -
701 std::copy(this->begin(), this->end(), bv.begin());
│ │ │ │ -
702
│ │ │ │ -
703 return bv;
│ │ │ │ -
704 }
│ │ │ │ -
705
│ │ │ │ -
706 //===== window manipulation methods
│ │ │ │ -
707
│ │ │ │ -
709 void set (size_type _n, B* _p)
│ │ │ │ -
710 {
│ │ │ │ -
711 this->n = _n;
│ │ │ │ -
712 this->p = _p;
│ │ │ │ -
713 }
│ │ │ │ -
714
│ │ │ │ -
716 void setsize (size_type _n)
│ │ │ │ -
717 {
│ │ │ │ -
718 this->n = _n;
│ │ │ │ -
719 }
│ │ │ │ -
720
│ │ │ │ -
722 void setptr (B* _p)
│ │ │ │ -
723 {
│ │ │ │ -
724 this->p = _p;
│ │ │ │ -
725 }
│ │ │ │ -
726
│ │ │ │ -
728 B* getptr ()
│ │ │ │ -
729 {
│ │ │ │ -
730 return this->p;
│ │ │ │ -
731 }
│ │ │ │ -
732
│ │ │ │ -
734 size_type getsize () const
│ │ │ │ -
735 {
│ │ │ │ -
736 return this->n;
│ │ │ │ -
737 }
│ │ │ │ -
738 };
│ │ │ │ -
739
│ │ │ │ -
740
│ │ │ │ -
741
│ │ │ │ -
752 template<class B, class A=std::allocator<B> >
│ │ │ │ -
753 class compressed_block_vector_unmanaged : public compressed_base_array_unmanaged<B,A>
│ │ │ │ -
754 {
│ │ │ │ -
755 public:
│ │ │ │ -
756
│ │ │ │ -
757 //===== type definitions and constants
│ │ │ │ -
758
│ │ │ │ -
760 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
761
│ │ │ │ -
763 typedef B block_type;
│ │ │ │ -
764
│ │ │ │ -
766 typedef A allocator_type;
│ │ │ │ -
767
│ │ │ │ -
769 typedef typename compressed_base_array_unmanaged<B,A>::iterator Iterator;
│ │ │ │ -
770
│ │ │ │ -
772 typedef typename compressed_base_array_unmanaged<B,A>::const_iterator ConstIterator;
│ │ │ │ -
773
│ │ │ │ -
775 typedef typename A::size_type size_type;
│ │ │ │ -
776
│ │ │ │ -
777 //===== assignment from scalar
│ │ │ │ -
778
│ │ │ │ -
779 compressed_block_vector_unmanaged& operator= (const field_type& k)
│ │ │ │ -
780 {
│ │ │ │ -
781 for (size_type i=0; i<this->n; i++)
│ │ │ │ -
782 (this->p)[i] = k;
│ │ │ │ -
783 return *this;
│ │ │ │ -
784 }
│ │ │ │ -
785
│ │ │ │ -
786
│ │ │ │ -
787 //===== vector space arithmetic
│ │ │ │ -
788
│ │ │ │ -
790 template<class V>
│ │ │ │ -
791 compressed_block_vector_unmanaged& operator+= (const V& y)
│ │ │ │ -
792 {
│ │ │ │ -
793#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
794 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ -
795#endif
│ │ │ │ -
796 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) += y.p[i];
│ │ │ │ -
797 return *this;
│ │ │ │ -
798 }
│ │ │ │ -
799
│ │ │ │ -
801 template<class V>
│ │ │ │ -
802 compressed_block_vector_unmanaged& operator-= (const V& y)
│ │ │ │ -
803 {
│ │ │ │ -
804#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
805 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ -
806#endif
│ │ │ │ -
807 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) -= y.p[i];
│ │ │ │ -
808 return *this;
│ │ │ │ -
809 }
│ │ │ │ -
810
│ │ │ │ -
812 template<class V>
│ │ │ │ -
813 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y)
│ │ │ │ -
814 {
│ │ │ │ -
815#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
816 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ -
817#endif
│ │ │ │ -
818 for (size_type i=0; i<y.n; ++i)
│ │ │ │ -
819 Impl::asVector((*this)[y.j[i]]).axpy(a,Impl::asVector(y.p[i]));
│ │ │ │ -
820 return *this;
│ │ │ │ -
821 }
│ │ │ │ -
822
│ │ │ │ -
824 compressed_block_vector_unmanaged& operator*= (const field_type& k)
│ │ │ │ -
825 {
│ │ │ │ -
826 for (size_type i=0; i<this->n; ++i) (this->p)[i] *= k;
│ │ │ │ -
827 return *this;
│ │ │ │ -
828 }
│ │ │ │ -
829
│ │ │ │ -
831 compressed_block_vector_unmanaged& operator/= (const field_type& k)
│ │ │ │ -
832 {
│ │ │ │ -
833 for (size_type i=0; i<this->n; ++i) (this->p)[i] /= k;
│ │ │ │ -
834 return *this;
│ │ │ │ -
835 }
│ │ │ │ -
836
│ │ │ │ -
837
│ │ │ │ -
838 //===== Euclidean scalar product
│ │ │ │ -
839
│ │ │ │ -
841 field_type operator* (const compressed_block_vector_unmanaged& y) const
│ │ │ │ -
842 {
│ │ │ │ -
843#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
844 if (!includesindexset(y) || !y.includesindexset(*this) )
│ │ │ │ -
845 DUNE_THROW(ISTLError,"index set mismatch");
│ │ │ │ -
846#endif
│ │ │ │ -
847 field_type sum=0;
│ │ │ │ -
848 for (size_type i=0; i<this->n; ++i)
│ │ │ │ -
849 sum += (this->p)[i] * y[(this->j)[i]];
│ │ │ │ -
850 return sum;
│ │ │ │ -
851 }
│ │ │ │ -
852
│ │ │ │ -
853
│ │ │ │ -
854 //===== norms
│ │ │ │ -
855
│ │ │ │ -
857 typename FieldTraits<field_type>::real_type one_norm () const
│ │ │ │ -
858 {
│ │ │ │ -
859 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
860 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm();
│ │ │ │ -
861 return sum;
│ │ │ │ -
862 }
│ │ │ │ -
863
│ │ │ │ -
865 typename FieldTraits<field_type>::real_type one_norm_real () const
│ │ │ │ -
866 {
│ │ │ │ -
867 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
868 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm_real();
│ │ │ │ -
869 return sum;
│ │ │ │ -
870 }
│ │ │ │ -
871
│ │ │ │ -
873 typename FieldTraits<field_type>::real_type two_norm () const
│ │ │ │ -
874 {
│ │ │ │ -
875 using std::sqrt;
│ │ │ │ -
876 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
877 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
│ │ │ │ -
878 return sqrt(sum);
│ │ │ │ -
879 }
│ │ │ │ -
880
│ │ │ │ -
882 typename FieldTraits<field_type>::real_type two_norm2 () const
│ │ │ │ -
883 {
│ │ │ │ -
884 typename FieldTraits<field_type>::real_type sum=0;
│ │ │ │ -
885 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
│ │ │ │ -
886 return sum;
│ │ │ │ -
887 }
│ │ │ │ -
888
│ │ │ │ -
890 template <typename ft = field_type,
│ │ │ │ -
891 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
892 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
893 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
894 using std::max;
│ │ │ │ -
895
│ │ │ │ -
896 real_type norm = 0;
│ │ │ │ -
897 for (auto const &x : *this) {
│ │ │ │ -
898 real_type const a = x.infinity_norm();
│ │ │ │ -
899 norm = max(a, norm);
│ │ │ │ -
900 }
│ │ │ │ -
901 return norm;
│ │ │ │ -
902 }
│ │ │ │ -
903
│ │ │ │ -
905 template <typename ft = field_type,
│ │ │ │ -
906 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
907 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
908 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
909 using std::max;
│ │ │ │ -
910
│ │ │ │ -
911 real_type norm = 0;
│ │ │ │ -
912 for (auto const &x : *this) {
│ │ │ │ -
913 real_type const a = x.infinity_norm_real();
│ │ │ │ -
914 norm = max(a, norm);
│ │ │ │ -
915 }
│ │ │ │ -
916 return norm;
│ │ │ │ -
917 }
│ │ │ │ -
918
│ │ │ │ -
920 template <typename ft = field_type,
│ │ │ │ -
921 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
922 typename FieldTraits<ft>::real_type infinity_norm() const {
│ │ │ │ -
923 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
924 using std::max;
│ │ │ │ -
925
│ │ │ │ -
926 real_type norm = 0;
│ │ │ │ -
927 real_type isNaN = 1;
│ │ │ │ -
928 for (auto const &x : *this) {
│ │ │ │ -
929 real_type const a = x.infinity_norm();
│ │ │ │ -
930 norm = max(a, norm);
│ │ │ │ -
931 isNaN += a;
│ │ │ │ -
932 }
│ │ │ │ -
933 return norm * (isNaN / isNaN);
│ │ │ │ -
934 }
│ │ │ │ -
935
│ │ │ │ -
937 template <typename ft = field_type,
│ │ │ │ -
938 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
│ │ │ │ -
939 typename FieldTraits<ft>::real_type infinity_norm_real() const {
│ │ │ │ -
940 using real_type = typename FieldTraits<ft>::real_type;
│ │ │ │ -
941 using std::max;
│ │ │ │ -
942
│ │ │ │ -
943 real_type norm = 0;
│ │ │ │ -
944 real_type isNaN = 1;
│ │ │ │ -
945 for (auto const &x : *this) {
│ │ │ │ -
946 real_type const a = x.infinity_norm_real();
│ │ │ │ -
947 norm = max(a, norm);
│ │ │ │ -
948 isNaN += a;
│ │ │ │ -
949 }
│ │ │ │ -
950 return norm * (isNaN / isNaN);
│ │ │ │ -
951 }
│ │ │ │ -
952
│ │ │ │ -
953 //===== sizes
│ │ │ │ -
954
│ │ │ │ -
956 size_type N () const
│ │ │ │ -
957 {
│ │ │ │ -
958 return this->n;
│ │ │ │ -
959 }
│ │ │ │ -
960
│ │ │ │ -
962 size_type dim () const
│ │ │ │ -
963 {
│ │ │ │ -
964 size_type d=0;
│ │ │ │ -
965 for (size_type i=0; i<this->n; i++)
│ │ │ │ -
966 d += (this->p)[i].dim();
│ │ │ │ -
967 return d;
│ │ │ │ -
968 }
│ │ │ │ -
969
│ │ │ │ -
970 protected:
│ │ │ │ -
972 compressed_block_vector_unmanaged () : compressed_base_array_unmanaged<B,A>()
│ │ │ │ -
973 { }
│ │ │ │ -
974
│ │ │ │ -
976 template<class V>
│ │ │ │ -
977 bool includesindexset (const V& y)
│ │ │ │ -
978 {
│ │ │ │ -
979 typename V::ConstIterator e=this->end();
│ │ │ │ -
980 for (size_type i=0; i<y.n; i++)
│ │ │ │ -
981 if (this->find(y.j[i])==e)
│ │ │ │ -
982 return false;
│ │ │ │ -
983 return true;
│ │ │ │ -
984 }
│ │ │ │ -
985 };
│ │ │ │ -
986
│ │ │ │ -
987
│ │ │ │ -
1006 template<class B, class A=std::allocator<B> >
│ │ │ │ -
1007 class CompressedBlockVectorWindow : public compressed_block_vector_unmanaged<B,A>
│ │ │ │ -
1008 {
│ │ │ │ -
1009 public:
│ │ │ │ -
1010
│ │ │ │ -
1011 //===== type definitions and constants
│ │ │ │ -
1012
│ │ │ │ -
1014 using field_type = typename Imp::BlockTraits<B>::field_type;
│ │ │ │ -
1015
│ │ │ │ -
1017 typedef B block_type;
│ │ │ │ -
1018
│ │ │ │ -
1020 typedef A allocator_type;
│ │ │ │ -
1021
│ │ │ │ -
1023 typedef typename A::size_type size_type;
│ │ │ │ -
1024
│ │ │ │ -
1026 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ -
1027 static constexpr unsigned int blocklevel = blockLevel<B>()+1;
│ │ │ │ -
1028
│ │ │ │ -
1030 typedef typename compressed_block_vector_unmanaged<B,A>::Iterator Iterator;
│ │ │ │ -
1031
│ │ │ │ -
1033 typedef typename compressed_block_vector_unmanaged<B,A>::ConstIterator ConstIterator;
│ │ │ │ -
1034
│ │ │ │ -
1035
│ │ │ │ -
1036 //===== constructors and such
│ │ │ │ -
1038 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged<B,A>()
│ │ │ │ -
1039 { }
│ │ │ │ -
1040
│ │ │ │ -
1042 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n)
│ │ │ │ -
1043 {
│ │ │ │ -
1044 this->n = _n;
│ │ │ │ -
1045 this->p = _p;
│ │ │ │ -
1046 this->j = _j;
│ │ │ │ -
1047 }
│ │ │ │ -
1048
│ │ │ │ -
1050 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a)
│ │ │ │ -
1051 {
│ │ │ │ -
1052 this->n = a.n;
│ │ │ │ -
1053 this->p = a.p;
│ │ │ │ -
1054 this->j = a.j;
│ │ │ │ -
1055 }
│ │ │ │ -
1056
│ │ │ │ -
1058 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow& a)
│ │ │ │ -
1059 {
│ │ │ │ -
1060 // check correct size
│ │ │ │ -
1061#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1062 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
│ │ │ │ -
1063#endif
│ │ │ │ -
1064
│ │ │ │ -
1065 if (&a!=this) // check if this and a are different objects
│ │ │ │ -
1066 {
│ │ │ │ -
1067 // copy data
│ │ │ │ -
1068 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
│ │ │ │ -
1069 for (size_type i=0; i<this->n; i++) this->j[i]=a.j[i];
│ │ │ │ -
1070 }
│ │ │ │ -
1071 return *this;
│ │ │ │ -
1072 }
│ │ │ │ -
1073
│ │ │ │ -
1075 CompressedBlockVectorWindow& operator= (const field_type& k)
│ │ │ │ -
1076 {
│ │ │ │ -
1077 (static_cast<compressed_block_vector_unmanaged<B,A>&>(*this)) = k;
│ │ │ │ -
1078 return *this;
│ │ │ │ -
1079 }
│ │ │ │ -
1080
│ │ │ │ -
1081
│ │ │ │ -
1082 //===== window manipulation methods
│ │ │ │ -
1083
│ │ │ │ -
1085 void set (size_type _n, B* _p, size_type* _j)
│ │ │ │ -
1086 {
│ │ │ │ -
1087 this->n = _n;
│ │ │ │ -
1088 this->p = _p;
│ │ │ │ -
1089 this->j = _j;
│ │ │ │ -
1090 }
│ │ │ │ -
1091
│ │ │ │ -
1093 void setsize (size_type _n)
│ │ │ │ -
1094 {
│ │ │ │ -
1095 this->n = _n;
│ │ │ │ -
1096 }
│ │ │ │ -
1097
│ │ │ │ -
1099 void setptr (B* _p)
│ │ │ │ -
1100 {
│ │ │ │ -
1101 this->p = _p;
│ │ │ │ -
1102 }
│ │ │ │ -
1103
│ │ │ │ -
1105 void setindexptr (size_type* _j)
│ │ │ │ -
1106 {
│ │ │ │ -
1107 this->j = _j;
│ │ │ │ -
1108 }
│ │ │ │ -
1109
│ │ │ │ -
1111 B* getptr ()
│ │ │ │ -
1112 {
│ │ │ │ -
1113 return this->p;
│ │ │ │ -
1114 }
│ │ │ │ -
1115
│ │ │ │ -
1117 size_type* getindexptr ()
│ │ │ │ -
1118 {
│ │ │ │ -
1119 return this->j;
│ │ │ │ -
1120 }
│ │ │ │ -
1121
│ │ │ │ -
1123 const B* getptr () const
│ │ │ │ -
1124 {
│ │ │ │ -
1125 return this->p;
│ │ │ │ -
1126 }
│ │ │ │ -
1127
│ │ │ │ -
1129 const size_type* getindexptr () const
│ │ │ │ -
1130 {
│ │ │ │ -
1131 return this->j;
│ │ │ │ -
1132 }
│ │ │ │ -
1134 size_type getsize () const
│ │ │ │ -
1135 {
│ │ │ │ -
1136 return this->n;
│ │ │ │ -
1137 }
│ │ │ │ -
1138 };
│ │ │ │ -
1139
│ │ │ │ -
1140} // end namespace 'Imp'
│ │ │ │ -
1141
│ │ │ │ -
1142
│ │ │ │ -
1144 template<typename B, typename A>
│ │ │ │ -
1145 struct AutonomousValueType<Imp::BlockVectorWindow<B,A>>
│ │ │ │ -
1146 {
│ │ │ │ -
1147 using type = BlockVector<B, A>;
│ │ │ │ -
1148 };
│ │ │ │ -
1149
│ │ │ │ -
1150
│ │ │ │ -
1151} // end namespace 'Dune'
│ │ │ │ -
1152
│ │ │ │ -
1153#endif
│ │ │ │ -
Implements several basic array containers.
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ -
STL namespace.
│ │ │ │ +
416 // apply inverse and store result
│ │ │ │ +
417 Impl::asMatrix(inv[ i ]).mv(rhs, vBlock);
│ │ │ │ +
418 }
│ │ │ │ +
419 }
│ │ │ │ +
│ │ │ │ +
420
│ │ │ │ +
421 } // end namespace ILU
│ │ │ │ +
│ │ │ │ +
422
│ │ │ │ +
425} // end namespace
│ │ │ │ +
426
│ │ │ │ +
427#endif
│ │ │ │ + │ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
Send BlockVector to an output stream.
Definition bvector.hh:590
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
BlockVector()
makes empty vector
Definition bvector.hh:425
│ │ │ │ -
void reserve(size_type capacity)
Reserve space.
Definition bvector.hh:475
│ │ │ │ -
BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector >().swap(a)))
move constructor
Definition bvector.hh:519
│ │ │ │ -
BlockVector(size_type _n)
make vector with _n components
Definition bvector.hh:431
│ │ │ │ -
void resize(size_type size)
Resize the vector.
Definition bvector.hh:503
│ │ │ │ -
Imp::block_vector_unmanaged< B, A >::Iterator Iterator
make iterators available as types
Definition bvector.hh:417
│ │ │ │ -
static constexpr unsigned int blocklevel
increment block level counter
Definition bvector.hh:414
│ │ │ │ -
BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
copy constructor
Definition bvector.hh:511
│ │ │ │ -
A allocator_type
export the allocator type
Definition bvector.hh:407
│ │ │ │ -
BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
assignment
Definition bvector.hh:526
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ -
A::size_type size_type
The type for the index access.
Definition bvector.hh:410
│ │ │ │ -
BlockVector(std::initializer_list< B > const &l)
Construct from a std::initializer_list.
Definition bvector.hh:437
│ │ │ │ -
size_type capacity() const
Get the capacity of the vector.
Definition bvector.hh:488
│ │ │ │ -
BlockVector(size_type _n, S _capacity)
Make vector with _n components but preallocating capacity components.
Definition bvector.hh:455
│ │ │ │ -
B block_type
export the type representing the components
Definition bvector.hh:404
│ │ │ │ -
void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & >().storage_.swap(other.storage_)))
swap operation
Definition bvector.hh:544
│ │ │ │ -
Imp::block_vector_unmanaged< B, A >::ConstIterator ConstIterator
make iterators available as types
Definition bvector.hh:420
│ │ │ │ -
FieldTraits< B >::real_type real_type
Definition bvector.hh:582
│ │ │ │ -
FieldTraits< B >::field_type field_type
Definition bvector.hh:581
│ │ │ │ +
void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv)
convert ILU decomposition into CRS format for lower and upper triangular and inverse.
Definition ilu.hh:307
│ │ │ │ +
void blockILUBacksolve(const M &A, X &v, const Y &d)
LU backsolve with stored inverse.
Definition ilu.hh:94
│ │ │ │ +
M::field_type & firstMatrixElement(M &A, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
Definition ilu.hh:141
│ │ │ │ +
void blockILU0Decomposition(M &A)
compute ILU decomposition of A. A is overwritten by its decomposition
Definition ilu.hh:33
│ │ │ │ +
void blockILUDecomposition(const M &A, int n, M &ILU)
Definition ilu.hh:167
│ │ │ │ +
a simple compressed row storage matrix class
Definition ilu.hh:259
│ │ │ │ +
std::vector< size_type > cols_
Definition ilu.hh:301
│ │ │ │ +
size_type nonZeros() const
Definition ilu.hh:267
│ │ │ │ +
void resize(const size_type nRows)
Definition ilu.hh:273
│ │ │ │ +
size_type rows() const
Definition ilu.hh:265
│ │ │ │ +
CRS()
Definition ilu.hh:263
│ │ │ │ +
void reserveAdditional(const size_type nonZeros)
Definition ilu.hh:282
│ │ │ │ +
B block_type
Definition ilu.hh:260
│ │ │ │ +
std::vector< block_type, Alloc > values_
Definition ilu.hh:300
│ │ │ │ +
size_type nRows_
Definition ilu.hh:302
│ │ │ │ +
size_t size_type
Definition ilu.hh:261
│ │ │ │ +
std::vector< size_type > rows_
Definition ilu.hh:299
│ │ │ │ +
void push_back(const block_type &value, const size_type index)
Definition ilu.hh:293
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
Error when performing an operation on a matrix block.
Definition istlexception.hh:52
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1010 +1,499 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -bvector.hh │ │ │ │ │ +ilu.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5 │ │ │ │ │ -6#ifndef DUNE_ISTL_BVECTOR_HH │ │ │ │ │ -7#define DUNE_ISTL_BVECTOR_HH │ │ │ │ │ -8 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ -24#include │ │ │ │ │ -25 │ │ │ │ │ -26#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -27 │ │ │ │ │ -28#include "_b_a_s_e_a_r_r_a_y_._h_h" │ │ │ │ │ -29#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +5#ifndef DUNE_ISTL_ILU_HH │ │ │ │ │ +6#define DUNE_ISTL_ILU_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +18 │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24 │ │ │ │ │ +_2_9 namespace ILU { │ │ │ │ │ 30 │ │ │ │ │ -38namespace _D_u_n_e { │ │ │ │ │ +32 template │ │ │ │ │ +_3_3 void _b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n (M& A) │ │ │ │ │ +34 { │ │ │ │ │ +35 // iterator types │ │ │ │ │ +36 typedef typename M::RowIterator rowiterator; │ │ │ │ │ +37 typedef typename M::ColIterator coliterator; │ │ │ │ │ +38 typedef typename M::block_type block; │ │ │ │ │ 39 │ │ │ │ │ -41namespace Imp { │ │ │ │ │ -42 │ │ │ │ │ -48 template │ │ │ │ │ -49 class BlockTraitsImp; │ │ │ │ │ -50 │ │ │ │ │ -51 template │ │ │ │ │ -52 class BlockTraitsImp │ │ │ │ │ -53 { │ │ │ │ │ -54 public: │ │ │ │ │ -55 using field_type = B; │ │ │ │ │ -56 }; │ │ │ │ │ -57 │ │ │ │ │ -58 template │ │ │ │ │ -59 class BlockTraitsImp │ │ │ │ │ -60 { │ │ │ │ │ -61 public: │ │ │ │ │ -62 using field_type = typename B::field_type; │ │ │ │ │ -63 }; │ │ │ │ │ -64 │ │ │ │ │ -67 template │ │ │ │ │ -68 using BlockTraits = BlockTraitsImp::value>; │ │ │ │ │ -69 │ │ │ │ │ -83 template > │ │ │ │ │ -84 class block_vector_unmanaged : public base_array_unmanaged │ │ │ │ │ -85 { │ │ │ │ │ -86 public: │ │ │ │ │ -87 │ │ │ │ │ -88 //===== type definitions and constants │ │ │ │ │ -89 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ -90 │ │ │ │ │ -92 typedef B block_type; │ │ │ │ │ -93 │ │ │ │ │ -95 typedef A allocator_type; │ │ │ │ │ -96 │ │ │ │ │ -98 typedef typename A::size_type size_type; │ │ │ │ │ -99 │ │ │ │ │ -101 typedef typename base_array_unmanaged::iterator Iterator; │ │ │ │ │ -102 │ │ │ │ │ -104 typedef typename base_array_unmanaged::const_iterator ConstIterator; │ │ │ │ │ -105 │ │ │ │ │ -107 typedef B value_type; │ │ │ │ │ -108 │ │ │ │ │ -110 typedef B& reference; │ │ │ │ │ -111 │ │ │ │ │ -113 typedef const B& const_reference; │ │ │ │ │ -114 │ │ │ │ │ -115 //===== assignment from scalar │ │ │ │ │ -117 │ │ │ │ │ -118 block_vector_unmanaged& operator= (const field_type& k) │ │ │ │ │ -119 { │ │ │ │ │ -120 for (size_type i=0; in; i++) │ │ │ │ │ -121 (*this)[i] = k; │ │ │ │ │ -122 return *this; │ │ │ │ │ -123 } │ │ │ │ │ -124 │ │ │ │ │ -125 //===== vector space arithmetic │ │ │ │ │ -127 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y) │ │ │ │ │ -128 { │ │ │ │ │ -129#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -130 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -131#endif │ │ │ │ │ -132 for (size_type i=0; in; ++i) (*this)[i] += y[i]; │ │ │ │ │ -133 return *this; │ │ │ │ │ -134 } │ │ │ │ │ -135 │ │ │ │ │ -137 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y) │ │ │ │ │ -138 { │ │ │ │ │ -139#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -140 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -141#endif │ │ │ │ │ -142 for (size_type i=0; in; ++i) (*this)[i] -= y[i]; │ │ │ │ │ -143 return *this; │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -147 block_vector_unmanaged& operator*= (const field_type& k) │ │ │ │ │ -148 { │ │ │ │ │ -149 for (size_type i=0; in; ++i) (*this)[i] *= k; │ │ │ │ │ -150 return *this; │ │ │ │ │ -151 } │ │ │ │ │ -152 │ │ │ │ │ -154 block_vector_unmanaged& operator/= (const field_type& k) │ │ │ │ │ -155 { │ │ │ │ │ -156 for (size_type i=0; in; ++i) (*this)[i] /= k; │ │ │ │ │ -157 return *this; │ │ │ │ │ +40 // implement left looking variant with stored inverse │ │ │ │ │ +41 rowiterator endi=A.end(); │ │ │ │ │ +42 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +43 { │ │ │ │ │ +44 // coliterator is diagonal after the following loop │ │ │ │ │ +45 coliterator endij=(*i).end(); // end of row i │ │ │ │ │ +46 coliterator ij; │ │ │ │ │ +47 │ │ │ │ │ +48 // eliminate entries left of diagonal; store L factor │ │ │ │ │ +49 for (ij=(*i).begin(); ij.index() │ │ │ │ │ +_9_4 void _b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const M& A, X& v, const Y& d) │ │ │ │ │ +95 { │ │ │ │ │ +96 // iterator types │ │ │ │ │ +97 typedef typename M::ConstRowIterator rowiterator; │ │ │ │ │ +98 typedef typename M::ConstColIterator coliterator; │ │ │ │ │ +99 typedef typename Y::block_type dblock; │ │ │ │ │ +100 typedef typename X::block_type vblock; │ │ │ │ │ +101 │ │ │ │ │ +102 // lower triangular solve │ │ │ │ │ +103 rowiterator endi=A.end(); │ │ │ │ │ +104 for (rowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +105 { │ │ │ │ │ +106 // We need to be careful here: Directly using │ │ │ │ │ +107 // auto rhs = Impl::asVector(d[ i.index() ]); │ │ │ │ │ +108 // is not OK in case this is a proxy. Hence │ │ │ │ │ +109 // we first have to copy the value. Notice that │ │ │ │ │ +110 // this is still not OK, if the vector type itself returns │ │ │ │ │ +111 // proxy references. │ │ │ │ │ +112 dblock rhsValue(d[i.index()]); │ │ │ │ │ +113 auto&& rhs = Impl::asVector(rhsValue); │ │ │ │ │ +114 for (coliterator j=(*i).begin(); j.index()i.index(); --j) │ │ │ │ │ +133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs); │ │ │ │ │ +134 auto&& vi = Impl::asVector(v[i.index()]); │ │ │ │ │ +135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse! │ │ │ │ │ +136 } │ │ │ │ │ +137 } │ │ │ │ │ +138 │ │ │ │ │ +139 // recursive function template to access first entry of a matrix │ │ │ │ │ +140 template │ │ │ │ │ +_1_4_1 typename M::field_type& _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (M& A, │ │ │ │ │ +142 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ +sfinae = nullptr) │ │ │ │ │ +143 { │ │ │ │ │ +144 return _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t(*(A.begin()->begin())); │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +147 template │ │ │ │ │ +_1_4_8 K& _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (K& A, │ │ │ │ │ +149 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ +sfinae = nullptr) │ │ │ │ │ +150 { │ │ │ │ │ +151 return A; │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +154 template │ │ │ │ │ +_1_5_5 K& _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t (_F_i_e_l_d_M_a_t_r_i_x_<_K_,_n_,_m_>& A) │ │ │ │ │ +156 { │ │ │ │ │ +157 return A[0][0]; │ │ │ │ │ 158 } │ │ │ │ │ 159 │ │ │ │ │ -161 block_vector_unmanaged& axpy (const field_type& a, const │ │ │ │ │ -block_vector_unmanaged& y) │ │ │ │ │ -162 { │ │ │ │ │ -163#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -164 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -165#endif │ │ │ │ │ -166 for (size_type i=0; in; ++i) │ │ │ │ │ -167 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i])); │ │ │ │ │ -168 │ │ │ │ │ -169 return *this; │ │ │ │ │ -170 } │ │ │ │ │ -171 │ │ │ │ │ -172 │ │ │ │ │ -180 template │ │ │ │ │ -181 auto operator* (const block_vector_unmanaged& y) const │ │ │ │ │ +166 template │ │ │ │ │ +_1_6_7 void _b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n (const M& A, int n, M& ILU) │ │ │ │ │ +168 { │ │ │ │ │ +169 // iterator types │ │ │ │ │ +170 typedef typename M::ColIterator coliterator; │ │ │ │ │ +171 typedef typename M::ConstRowIterator crowiterator; │ │ │ │ │ +172 typedef typename M::ConstColIterator ccoliterator; │ │ │ │ │ +173 typedef typename M::CreateIterator createiterator; │ │ │ │ │ +174 typedef typename M::field_type K; │ │ │ │ │ +175 typedef std::map map; │ │ │ │ │ +176 typedef typename map::iterator mapiterator; │ │ │ │ │ +177 │ │ │ │ │ +178 // symbolic factorization phase, store generation number in first matrix │ │ │ │ │ +element │ │ │ │ │ +179 crowiterator endi=A.end(); │ │ │ │ │ +180 createiterator ci=ILU.createbegin(); │ │ │ │ │ +181 for (crowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ 182 { │ │ │ │ │ -183 typedef typename PromotionTraits:: │ │ │ │ │ -field_type>::PromotedType PromotedType; │ │ │ │ │ -184 PromotedType sum(0); │ │ │ │ │ -185#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -186 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -187#endif │ │ │ │ │ -188 for (size_type i=0; in; ++i) { │ │ │ │ │ -189 sum += PromotedType(((*this)[i])*y[i]); │ │ │ │ │ -190 } │ │ │ │ │ -191 return sum; │ │ │ │ │ -192 } │ │ │ │ │ -193 │ │ │ │ │ -201 template │ │ │ │ │ -202 auto dot(const block_vector_unmanaged& y) const │ │ │ │ │ +183 map rowpattern; // maps column index to generation │ │ │ │ │ +184 │ │ │ │ │ +185 // initialize pattern with row of A │ │ │ │ │ +186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j) │ │ │ │ │ +187 rowpattern[j.index()] = 0; │ │ │ │ │ +188 │ │ │ │ │ +189 // eliminate entries in row which are to the left of the diagonal │ │ │ │ │ +190 for (mapiterator ik=rowpattern.begin(); (*ik).first:: │ │ │ │ │ -field_type>::PromotedType PromotedType; │ │ │ │ │ -205 PromotedType sum(0); │ │ │ │ │ -206#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -207 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -208#endif │ │ │ │ │ -209 │ │ │ │ │ -210 for (size_type i=0; in; ++i) │ │ │ │ │ -211 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i])); │ │ │ │ │ -212 │ │ │ │ │ -213 return sum; │ │ │ │ │ -214 } │ │ │ │ │ -215 │ │ │ │ │ -216 //===== norms │ │ │ │ │ -217 │ │ │ │ │ -219 typename FieldTraits::real_type one_norm () const │ │ │ │ │ -220 { │ │ │ │ │ -221 typename FieldTraits::real_type sum=0; │ │ │ │ │ -222 for (size_type i=0; in; ++i) │ │ │ │ │ -223 sum += Impl::asVector((*this)[i]).one_norm(); │ │ │ │ │ -224 return sum; │ │ │ │ │ -225 } │ │ │ │ │ -226 │ │ │ │ │ -228 typename FieldTraits::real_type one_norm_real () const │ │ │ │ │ -229 { │ │ │ │ │ -230 typename FieldTraits::real_type sum=0; │ │ │ │ │ -231 for (size_type i=0; in; ++i) │ │ │ │ │ -232 sum += Impl::asVector((*this)[i]).one_norm_real(); │ │ │ │ │ -233 return sum; │ │ │ │ │ -234 } │ │ │ │ │ -235 │ │ │ │ │ -237 typename FieldTraits::real_type two_norm () const │ │ │ │ │ +204 mapiterator ij = rowpattern.find(kj.index()); │ │ │ │ │ +205 if (ij==rowpattern.end()) │ │ │ │ │ +206 { │ │ │ │ │ +207 rowpattern[kj.index()] = generation+1; │ │ │ │ │ +208 } │ │ │ │ │ +209 } │ │ │ │ │ +210 } │ │ │ │ │ +211 } │ │ │ │ │ +212 } │ │ │ │ │ +213 │ │ │ │ │ +214 // create row │ │ │ │ │ +215 for (mapiterator ik=rowpattern.begin(); ik!=rowpattern.end(); ++ik) │ │ │ │ │ +216 ci.insert((*ik).first); │ │ │ │ │ +217 ++ci; // now row i exist │ │ │ │ │ +218 │ │ │ │ │ +219 // write generation index into entries │ │ │ │ │ +220 coliterator endILUij = ILU[i.index()].end();; │ │ │ │ │ +221 for (coliterator ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij) │ │ │ │ │ +222 Simd::lane(0, _f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t(*ILUij)) = (Simd::Scalar) rowpattern │ │ │ │ │ +[ILUij.index()]; │ │ │ │ │ +223 } │ │ │ │ │ +224 │ │ │ │ │ +225 // copy entries of A │ │ │ │ │ +226 for (crowiterator i=A.begin(); i!=endi; ++i) │ │ │ │ │ +227 { │ │ │ │ │ +228 coliterator ILUij; │ │ │ │ │ +229 coliterator endILUij = ILU[i.index()].end();; │ │ │ │ │ +230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij) │ │ │ │ │ +231 (*ILUij) = 0; // clear row │ │ │ │ │ +232 ccoliterator Aij = (*i).begin(); │ │ │ │ │ +233 ccoliterator endAij = (*i).end(); │ │ │ │ │ +234 ILUij = ILU[i.index()].begin(); │ │ │ │ │ +235 while (Aij!=endAij && ILUij!=endILUij) │ │ │ │ │ +236 { │ │ │ │ │ +237 if (Aij.index()==ILUij.index()) │ │ │ │ │ 238 { │ │ │ │ │ -239 using std::sqrt; │ │ │ │ │ -240 return sqrt(two_norm2()); │ │ │ │ │ +239 *ILUij = *Aij; │ │ │ │ │ +240 ++Aij; ++ILUij; │ │ │ │ │ 241 } │ │ │ │ │ -242 │ │ │ │ │ -244 typename FieldTraits::real_type two_norm2 () const │ │ │ │ │ -245 { │ │ │ │ │ -246 typename FieldTraits::real_type sum=0; │ │ │ │ │ -247 for (size_type i=0; in; ++i) │ │ │ │ │ -248 sum += Impl::asVector((*this)[i]).two_norm2(); │ │ │ │ │ -249 return sum; │ │ │ │ │ +242 else │ │ │ │ │ +243 { │ │ │ │ │ +244 if (Aij.index()::value, int>::type = 0> │ │ │ │ │ -255 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ -256 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -257 using std::max; │ │ │ │ │ -258 │ │ │ │ │ -259 real_type norm = 0; │ │ │ │ │ -260 for (auto const &xi : *this) { │ │ │ │ │ -261 real_type const a = Impl::asVector(xi).infinity_norm(); │ │ │ │ │ -262 norm = max(a, norm); │ │ │ │ │ -263 } │ │ │ │ │ -264 return norm; │ │ │ │ │ -265 } │ │ │ │ │ +252 // call decomposition on pattern │ │ │ │ │ +253 _b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n(ILU); │ │ │ │ │ +254 } │ │ │ │ │ +255 │ │ │ │ │ +257 template > │ │ │ │ │ +_2_5_8 struct _C_R_S │ │ │ │ │ +259 { │ │ │ │ │ +_2_6_0 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +_2_6_1 typedef size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ +262 │ │ │ │ │ +_2_6_3 _C_R_S() : _n_R_o_w_s__( 0 ) {} │ │ │ │ │ +264 │ │ │ │ │ +_2_6_5 _s_i_z_e___t_y_p_e _r_o_w_s() const { return _n_R_o_w_s__; } │ │ │ │ │ 266 │ │ │ │ │ -268 template ::value, int>::type = 0> │ │ │ │ │ -270 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ -271 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -272 using std::max; │ │ │ │ │ -273 │ │ │ │ │ -274 real_type norm = 0; │ │ │ │ │ -275 for (auto const &xi : *this) { │ │ │ │ │ -276 real_type const a = Impl::asVector(xi).infinity_norm_real(); │ │ │ │ │ -277 norm = max(a, norm); │ │ │ │ │ -278 } │ │ │ │ │ -279 return norm; │ │ │ │ │ +_2_6_7 _s_i_z_e___t_y_p_e _n_o_n_Z_e_r_o_s() const │ │ │ │ │ +268 { │ │ │ │ │ +269 assert( _r_o_w_s__[ _r_o_w_s() ] != _s_i_z_e___t_y_p_e(-1) ); │ │ │ │ │ +270 return _r_o_w_s__[ _r_o_w_s() ]; │ │ │ │ │ +271 } │ │ │ │ │ +272 │ │ │ │ │ +_2_7_3 void _r_e_s_i_z_e( const _s_i_z_e___t_y_p_e nRows ) │ │ │ │ │ +274 { │ │ │ │ │ +275 if( _n_R_o_w_s__ != nRows ) │ │ │ │ │ +276 { │ │ │ │ │ +277 _n_R_o_w_s__ = nRows ; │ │ │ │ │ +278 _r_o_w_s__.resize( _n_R_o_w_s__+1, _s_i_z_e___t_y_p_e(-1) ); │ │ │ │ │ +279 } │ │ │ │ │ 280 } │ │ │ │ │ 281 │ │ │ │ │ -283 template ::value, int>::type = 0> │ │ │ │ │ -285 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ -286 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -287 using std::max; │ │ │ │ │ -288 using std::abs; │ │ │ │ │ -289 │ │ │ │ │ -290 real_type norm = 0; │ │ │ │ │ -291 real_type isNaN = 1; │ │ │ │ │ +_2_8_2 void _r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l( const _s_i_z_e___t_y_p_e _n_o_n_Z_e_r_o_s ) │ │ │ │ │ +283 { │ │ │ │ │ +284 const _s_i_z_e___t_y_p_e needed = _v_a_l_u_e_s__.size() + _n_o_n_Z_e_r_o_s ; │ │ │ │ │ +285 if( _v_a_l_u_e_s__.capacity() < needed ) │ │ │ │ │ +286 { │ │ │ │ │ +287 const _s_i_z_e___t_y_p_e estimate = needed * 1.1; │ │ │ │ │ +288 _v_a_l_u_e_s__.reserve( estimate ); │ │ │ │ │ +289 _c_o_l_s__.reserve( estimate ); │ │ │ │ │ +290 } │ │ │ │ │ +291 } │ │ │ │ │ 292 │ │ │ │ │ -293 for (auto const &xi : *this) { │ │ │ │ │ -294 real_type const a = Impl::asVector(xi).infinity_norm(); │ │ │ │ │ -295 norm = max(a, norm); │ │ │ │ │ -296 isNaN += a; │ │ │ │ │ +_2_9_3 void _p_u_s_h___b_a_c_k( const _b_l_o_c_k___t_y_p_e& value, const _s_i_z_e___t_y_p_e index ) │ │ │ │ │ +294 { │ │ │ │ │ +295 _v_a_l_u_e_s__.push_back( value ); │ │ │ │ │ +296 _c_o_l_s__.push_back( index ); │ │ │ │ │ 297 } │ │ │ │ │ -298 return norm * (isNaN / isNaN); │ │ │ │ │ -299 } │ │ │ │ │ -300 │ │ │ │ │ -302 template ::value, int>::type = 0> │ │ │ │ │ -304 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ -305 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -306 using std::max; │ │ │ │ │ -307 │ │ │ │ │ -308 real_type norm = 0; │ │ │ │ │ -309 real_type isNaN = 1; │ │ │ │ │ +298 │ │ │ │ │ +_2_9_9 std::vector< size_type > _r_o_w_s__; │ │ │ │ │ +_3_0_0 std::vector< block_type, Alloc> _v_a_l_u_e_s__; │ │ │ │ │ +_3_0_1 std::vector< size_type > _c_o_l_s__; │ │ │ │ │ +_3_0_2 _s_i_z_e___t_y_p_e _n_R_o_w_s__; │ │ │ │ │ +303 }; │ │ │ │ │ +304 │ │ │ │ │ +306 template │ │ │ │ │ +_3_0_7 void _c_o_n_v_e_r_t_T_o_C_R_S(const M& A, _C_R_S& lower, _C_R_S& upper, InvVector& inv ) │ │ │ │ │ +308 { │ │ │ │ │ +309 typedef typename M :: size_type size_type; │ │ │ │ │ 310 │ │ │ │ │ -311 for (auto const &xi : *this) { │ │ │ │ │ -312 real_type const a = Impl::asVector(xi).infinity_norm_real(); │ │ │ │ │ -313 norm = max(a, norm); │ │ │ │ │ -314 isNaN += a; │ │ │ │ │ -315 } │ │ │ │ │ -316 │ │ │ │ │ -317 return norm * (isNaN / isNaN); │ │ │ │ │ -318 } │ │ │ │ │ -319 │ │ │ │ │ -320 //===== sizes │ │ │ │ │ +311 lower._r_e_s_i_z_e( A.N() ); │ │ │ │ │ +312 upper._r_e_s_i_z_e( A.N() ); │ │ │ │ │ +313 inv.resize( A.N() ); │ │ │ │ │ +314 │ │ │ │ │ +315 // lower and upper triangular should store half of non zeros minus diagonal │ │ │ │ │ +316 const size_t memEstimate = (A.nonzeroes() - A.N())/2; │ │ │ │ │ +317 │ │ │ │ │ +318 assert( A.nonzeroes() != 0 ); │ │ │ │ │ +319 lower._r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l( memEstimate ); │ │ │ │ │ +320 upper._r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l( memEstimate ); │ │ │ │ │ 321 │ │ │ │ │ -323 size_type N () const │ │ │ │ │ -324 { │ │ │ │ │ -325 return this->n; │ │ │ │ │ -326 } │ │ │ │ │ -327 │ │ │ │ │ -329 size_type dim () const │ │ │ │ │ -330 { │ │ │ │ │ -331 size_type d=0; │ │ │ │ │ -332 │ │ │ │ │ -333 for (size_type i=0; in; i++) │ │ │ │ │ -334 d += Impl::asVector((*this)[i]).dim(); │ │ │ │ │ -335 │ │ │ │ │ -336 return d; │ │ │ │ │ +322 const auto endi = A.end(); │ │ │ │ │ +323 size_type row = 0; │ │ │ │ │ +324 size_type colcount = 0; │ │ │ │ │ +325 lower._r_o_w_s__[ 0 ] = colcount; │ │ │ │ │ +326 for (auto i=A.begin(); i!=endi; ++i, ++row) │ │ │ │ │ +327 { │ │ │ │ │ +328 const size_type iIndex = i.index(); │ │ │ │ │ +329 │ │ │ │ │ +330 // store entries left of diagonal │ │ │ │ │ +331 for (auto j=(*i).begin(); j.index() < iIndex; ++j ) │ │ │ │ │ +332 { │ │ │ │ │ +333 lower._p_u_s_h___b_a_c_k( (*j), j.index() ); │ │ │ │ │ +334 ++colcount; │ │ │ │ │ +335 } │ │ │ │ │ +336 lower._r_o_w_s__[ iIndex+1 ] = colcount; │ │ │ │ │ 337 } │ │ │ │ │ 338 │ │ │ │ │ -339 protected: │ │ │ │ │ -341 block_vector_unmanaged () : base_array_unmanaged() │ │ │ │ │ -342 { } │ │ │ │ │ -343 }; │ │ │ │ │ -344 │ │ │ │ │ -346 │ │ │ │ │ -351 template │ │ │ │ │ -352 class ScopeGuard { │ │ │ │ │ -353 F cleanupFunc_; │ │ │ │ │ -354 public: │ │ │ │ │ -355 ScopeGuard(F cleanupFunc) : cleanupFunc_(_s_t_d::move(cleanupFunc)) {} │ │ │ │ │ -356 ScopeGuard(const ScopeGuard &) = delete; │ │ │ │ │ -357 ScopeGuard(ScopeGuard &&) = delete; │ │ │ │ │ -358 ScopeGuard &operator=(ScopeGuard) = delete; │ │ │ │ │ -359 ~ScopeGuard() { cleanupFunc_(); } │ │ │ │ │ -360 }; │ │ │ │ │ -361 │ │ │ │ │ -363 │ │ │ │ │ -372 template │ │ │ │ │ -373 ScopeGuard makeScopeGuard(F cleanupFunc) │ │ │ │ │ -374 { │ │ │ │ │ -375 return { std::move(cleanupFunc) }; │ │ │ │ │ -376 } │ │ │ │ │ -377 │ │ │ │ │ -378} // end namespace Imp │ │ │ │ │ -393 template > │ │ │ │ │ -_3_9_4 class _B_l_o_c_k_V_e_c_t_o_r : public Imp::block_vector_unmanaged │ │ │ │ │ -395 { │ │ │ │ │ -396 public: │ │ │ │ │ +339 const auto rendi = A.beforeBegin(); │ │ │ │ │ +340 row = 0; │ │ │ │ │ +341 colcount = 0; │ │ │ │ │ +342 upper._r_o_w_s__[ 0 ] = colcount ; │ │ │ │ │ +343 │ │ │ │ │ +344 // NOTE: upper and inv store entries in reverse row and col order, │ │ │ │ │ +345 // reverse here relative to ILU │ │ │ │ │ +346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row ) │ │ │ │ │ +347 { │ │ │ │ │ +348 const auto endij=(*i).beforeBegin(); // end of row i │ │ │ │ │ +349 │ │ │ │ │ +350 const size_type iIndex = i.index(); │ │ │ │ │ +351 │ │ │ │ │ +352 // store in reverse row order for faster access during backsolve │ │ │ │ │ +353 for (auto j=(*i).beforeEnd(); j != endij; --j ) │ │ │ │ │ +354 { │ │ │ │ │ +355 const size_type jIndex = j.index(); │ │ │ │ │ +356 if( j.index() == iIndex ) │ │ │ │ │ +357 { │ │ │ │ │ +358 inv[ row ] = (*j); │ │ │ │ │ +359 break; // assuming consecutive ordering of A │ │ │ │ │ +360 } │ │ │ │ │ +361 else if ( j.index() >= i.index() ) │ │ │ │ │ +362 { │ │ │ │ │ +363 upper._p_u_s_h___b_a_c_k( (*j), jIndex ); │ │ │ │ │ +364 ++colcount ; │ │ │ │ │ +365 } │ │ │ │ │ +366 } │ │ │ │ │ +367 upper._r_o_w_s__[ row+1 ] = colcount; │ │ │ │ │ +368 } │ │ │ │ │ +369 } // end convertToCRS │ │ │ │ │ +370 │ │ │ │ │ +372 template │ │ │ │ │ +_3_7_3 void _b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e (const _C_R_S& lower, │ │ │ │ │ +374 const _C_R_S& upper, │ │ │ │ │ +375 const InvVector& inv, │ │ │ │ │ +376 X& v, const Y& d) │ │ │ │ │ +377 { │ │ │ │ │ +378 // iterator types │ │ │ │ │ +379 typedef typename Y :: block_type dblock; │ │ │ │ │ +380 typedef typename X :: block_type vblock; │ │ │ │ │ +381 typedef typename X :: size_type size_type ; │ │ │ │ │ +382 │ │ │ │ │ +383 const size_type iEnd = lower._r_o_w_s(); │ │ │ │ │ +384 const size_type lastRow = iEnd - 1; │ │ │ │ │ +385 if( iEnd != upper._r_o_w_s() ) │ │ │ │ │ +386 { │ │ │ │ │ +387 DUNE_THROW(_I_S_T_L_E_r_r_o_r,"ILU::blockILUBacksolve: lower and upper rows must be │ │ │ │ │ +the same"); │ │ │ │ │ +388 } │ │ │ │ │ +389 │ │ │ │ │ +390 // lower triangular solve │ │ │ │ │ +391 for( size_type i=0; i::field_type; │ │ │ │ │ -402 │ │ │ │ │ -_4_0_4 typedef B _b_l_o_c_k___t_y_p_e; │ │ │ │ │ -405 │ │ │ │ │ -_4_0_7 typedef A _a_l_l_o_c_a_t_o_r___t_y_p_e; │ │ │ │ │ -408 │ │ │ │ │ -_4_1_0 typedef typename A::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -411 │ │ │ │ │ -413 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ -2.8.")]] │ │ │ │ │ -_4_1_4 static constexpr unsigned int _b_l_o_c_k_l_e_v_e_l = blockLevel()+1; │ │ │ │ │ +398 for( size_type _c_o_l = rowI; _c_o_l < rowINext; ++ _c_o_l ) │ │ │ │ │ +399 Impl::asMatrix(lower._v_a_l_u_e_s__[ _c_o_l ]).mmv( Impl::asVector(v[ lower._c_o_l_s__ │ │ │ │ │ +[ _c_o_l ] ] ), rhs ); │ │ │ │ │ +400 │ │ │ │ │ +401 Impl::asVector(v[ i ]) = rhs; // Lii = I │ │ │ │ │ +402 } │ │ │ │ │ +403 │ │ │ │ │ +404 // upper triangular solve │ │ │ │ │ +405 for( size_type i=0; i::Iterator _I_t_e_r_a_t_o_r; │ │ │ │ │ -418 │ │ │ │ │ -_4_2_0 typedef typename Imp::block_vector_unmanaged::ConstIterator │ │ │ │ │ -_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -421 │ │ │ │ │ -422 //===== constructors and such │ │ │ │ │ -423 │ │ │ │ │ -_4_2_5 _B_l_o_c_k_V_e_c_t_o_r () │ │ │ │ │ -426 { │ │ │ │ │ -427 syncBaseArray(); │ │ │ │ │ -428 } │ │ │ │ │ -429 │ │ │ │ │ -_4_3_1 explicit _B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _n) : storage_(_n) │ │ │ │ │ -432 { │ │ │ │ │ -433 syncBaseArray(); │ │ │ │ │ -434 } │ │ │ │ │ -435 │ │ │ │ │ -_4_3_7 _B_l_o_c_k_V_e_c_t_o_r (std::initializer_list const &l) : storage_(l) │ │ │ │ │ -438 { │ │ │ │ │ -439 syncBaseArray(); │ │ │ │ │ -440 } │ │ │ │ │ -441 │ │ │ │ │ -442 │ │ │ │ │ -454 template │ │ │ │ │ -_4_5_5 _B_l_o_c_k_V_e_c_t_o_r (_s_i_z_e___t_y_p_e _n, S _capacity) │ │ │ │ │ -456 { │ │ │ │ │ -457 static_assert(std::numeric_limits::is_integer, │ │ │ │ │ -458 "capacity must be an unsigned integral type (be aware, that this │ │ │ │ │ -constructor does not set the default value!)" ); │ │ │ │ │ -459 if((_s_i_z_e___t_y_p_e)_capacity > _n) │ │ │ │ │ -460 storage_.reserve(_capacity); │ │ │ │ │ -461 storage_.resize(_n); │ │ │ │ │ -462 syncBaseArray(); │ │ │ │ │ -463 } │ │ │ │ │ -464 │ │ │ │ │ -465 │ │ │ │ │ -_4_7_5 void _r_e_s_e_r_v_e(_s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y) │ │ │ │ │ -476 { │ │ │ │ │ -477 [[maybe_unused]] const auto &guard = │ │ │ │ │ -478 Imp::makeScopeGuard([this]{ syncBaseArray(); }); │ │ │ │ │ -479 storage_.reserve(_c_a_p_a_c_i_t_y); │ │ │ │ │ -480 } │ │ │ │ │ -481 │ │ │ │ │ -_4_8_8 _s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y() const │ │ │ │ │ -489 { │ │ │ │ │ -490 return storage_.capacity(); │ │ │ │ │ -491 } │ │ │ │ │ -492 │ │ │ │ │ -_5_0_3 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e size) │ │ │ │ │ -504 { │ │ │ │ │ -505 [[maybe_unused]] const auto &guard = │ │ │ │ │ -506 Imp::makeScopeGuard([this]{ syncBaseArray(); }); │ │ │ │ │ -507 storage_.resize(size); │ │ │ │ │ -508 } │ │ │ │ │ -509 │ │ │ │ │ -_5_1_1 _B_l_o_c_k_V_e_c_t_o_r(const _B_l_o_c_k_V_e_c_t_o_r &a) │ │ │ │ │ -512 noexcept(noexcept(std::declval().storage_ = a.storage_)) │ │ │ │ │ -513 { │ │ │ │ │ -514 storage_ = a.storage_; │ │ │ │ │ -515 syncBaseArray(); │ │ │ │ │ -516 } │ │ │ │ │ -517 │ │ │ │ │ -_5_1_9 _B_l_o_c_k_V_e_c_t_o_r(_B_l_o_c_k_V_e_c_t_o_r &&a) │ │ │ │ │ -520 noexcept(noexcept(std::declval().swap(a))) │ │ │ │ │ -521 { │ │ │ │ │ -522 _s_w_a_p(a); │ │ │ │ │ -523 } │ │ │ │ │ -524 │ │ │ │ │ -_5_2_6 _B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _B_l_o_c_k_V_e_c_t_o_r& a) │ │ │ │ │ -527 noexcept(noexcept(std::declval().storage_ = a.storage_)) │ │ │ │ │ -528 { │ │ │ │ │ -529 [[maybe_unused]] const auto &guard = │ │ │ │ │ -530 Imp::makeScopeGuard([this]{ syncBaseArray(); }); │ │ │ │ │ -531 storage_ = a.storage_; │ │ │ │ │ -532 return *this; │ │ │ │ │ -533 } │ │ │ │ │ -534 │ │ │ │ │ -_5_3_6 _B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (_B_l_o_c_k_V_e_c_t_o_r&& a) │ │ │ │ │ -537 noexcept(noexcept(std::declval().swap(a))) │ │ │ │ │ -538 { │ │ │ │ │ -539 _s_w_a_p(a); │ │ │ │ │ -540 return *this; │ │ │ │ │ -541 } │ │ │ │ │ -542 │ │ │ │ │ -_5_4_4 void _s_w_a_p(_B_l_o_c_k_V_e_c_t_o_r &other) │ │ │ │ │ -545 noexcept(noexcept( │ │ │ │ │ -546 std::declval().storage_.swap(other.storage_))) │ │ │ │ │ -547 { │ │ │ │ │ -548 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{ │ │ │ │ │ -549 syncBaseArray(); │ │ │ │ │ -550 other.syncBaseArray(); │ │ │ │ │ -551 }); │ │ │ │ │ -552 storage_.swap(other.storage_); │ │ │ │ │ -553 } │ │ │ │ │ -554 │ │ │ │ │ -_5_5_6 _B_l_o_c_k_V_e_c_t_o_r& _o_p_e_r_a_t_o_r_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ │ -557 { │ │ │ │ │ -558 // forward to operator= in base class │ │ │ │ │ -559 (static_cast&>(*this)) = k; │ │ │ │ │ -560 return *this; │ │ │ │ │ -561 } │ │ │ │ │ -562 │ │ │ │ │ -563 private: │ │ │ │ │ -564 void syncBaseArray() noexcept │ │ │ │ │ -565 { │ │ │ │ │ -566 this->p = storage_.data(); │ │ │ │ │ -567 this->n = storage_.size(); │ │ │ │ │ -568 } │ │ │ │ │ -569 │ │ │ │ │ -570 std::vector storage_; │ │ │ │ │ -571 }; │ │ │ │ │ -572 │ │ │ │ │ -578 template │ │ │ │ │ -_5_7_9 struct FieldTraits< _B_l_o_c_k_V_e_c_t_o_r > │ │ │ │ │ -580 { │ │ │ │ │ -_5_8_1 typedef typename FieldTraits::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -_5_8_2 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ -583 }; │ │ │ │ │ -589 template │ │ │ │ │ -_5_9_0 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _B_l_o_c_k_V_e_c_t_o_r_<_K_,_ _A_>& v) │ │ │ │ │ -591 { │ │ │ │ │ -592 typedef typename _B_l_o_c_k_V_e_c_t_o_r_<_K_,_ _A_>_:_:_s_i_z_e___t_y_p_e size_type; │ │ │ │ │ -593 │ │ │ │ │ -594 for (size_type i=0; i │ │ │ │ │ -623#else │ │ │ │ │ -624 template > │ │ │ │ │ -625#endif │ │ │ │ │ -626 class BlockVectorWindow : public Imp::block_vector_unmanaged │ │ │ │ │ -627 { │ │ │ │ │ -628 public: │ │ │ │ │ -629 │ │ │ │ │ -630 //===== type definitions and constants │ │ │ │ │ -631 │ │ │ │ │ -633 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ -634 │ │ │ │ │ -636 typedef B block_type; │ │ │ │ │ -637 │ │ │ │ │ -639 typedef A allocator_type; │ │ │ │ │ -640 │ │ │ │ │ -642 typedef typename A::size_type size_type; │ │ │ │ │ -643 │ │ │ │ │ -645 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ -2.8.")]] │ │ │ │ │ -646 static constexpr unsigned int blocklevel = blockLevel()+1; │ │ │ │ │ -647 │ │ │ │ │ -649 typedef typename Imp::block_vector_unmanaged::Iterator Iterator; │ │ │ │ │ -650 │ │ │ │ │ -652 typedef typename Imp::block_vector_unmanaged::ConstIterator │ │ │ │ │ -ConstIterator; │ │ │ │ │ -653 │ │ │ │ │ -654 │ │ │ │ │ -655 //===== constructors and such │ │ │ │ │ -657 BlockVectorWindow () : Imp::block_vector_unmanaged() │ │ │ │ │ -658 { } │ │ │ │ │ -659 │ │ │ │ │ -661 BlockVectorWindow (B* _p, size_type _n) │ │ │ │ │ -662 { │ │ │ │ │ -663 this->n = _n; │ │ │ │ │ -664 this->p = _p; │ │ │ │ │ -665 } │ │ │ │ │ -666 │ │ │ │ │ -668 BlockVectorWindow (const BlockVectorWindow& a) │ │ │ │ │ -669 { │ │ │ │ │ -670 this->n = a.n; │ │ │ │ │ -671 this->p = a.p; │ │ │ │ │ -672 } │ │ │ │ │ -673 │ │ │ │ │ -675 BlockVectorWindow& operator= (const BlockVectorWindow& a) │ │ │ │ │ -676 { │ │ │ │ │ -677 // check correct size │ │ │ │ │ -678#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -679 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -680#endif │ │ │ │ │ -681 │ │ │ │ │ -682 if (&a!=this) // check if this and a are different objects │ │ │ │ │ -683 { │ │ │ │ │ -684 // copy data │ │ │ │ │ -685 for (size_type i=0; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ -686 } │ │ │ │ │ -687 return *this; │ │ │ │ │ -688 } │ │ │ │ │ -689 │ │ │ │ │ -691 BlockVectorWindow& operator= (const field_type& k) │ │ │ │ │ -692 { │ │ │ │ │ -693 (static_cast&>(*this)) = k; │ │ │ │ │ -694 return *this; │ │ │ │ │ -695 } │ │ │ │ │ -696 │ │ │ │ │ -698 operator BlockVector() const { │ │ │ │ │ -699 auto bv = BlockVector(this->n); │ │ │ │ │ -700 │ │ │ │ │ -701 std::copy(this->begin(), this->end(), bv.begin()); │ │ │ │ │ -702 │ │ │ │ │ -703 return bv; │ │ │ │ │ -704 } │ │ │ │ │ -705 │ │ │ │ │ -706 //===== window manipulation methods │ │ │ │ │ -707 │ │ │ │ │ -709 void set (size_type _n, B* _p) │ │ │ │ │ -710 { │ │ │ │ │ -711 this->n = _n; │ │ │ │ │ -712 this->p = _p; │ │ │ │ │ -713 } │ │ │ │ │ -714 │ │ │ │ │ -716 void setsize (size_type _n) │ │ │ │ │ -717 { │ │ │ │ │ -718 this->n = _n; │ │ │ │ │ -719 } │ │ │ │ │ -720 │ │ │ │ │ -722 void setptr (B* _p) │ │ │ │ │ -723 { │ │ │ │ │ -724 this->p = _p; │ │ │ │ │ -725 } │ │ │ │ │ -726 │ │ │ │ │ -728 B* getptr () │ │ │ │ │ -729 { │ │ │ │ │ -730 return this->p; │ │ │ │ │ -731 } │ │ │ │ │ -732 │ │ │ │ │ -734 size_type getsize () const │ │ │ │ │ -735 { │ │ │ │ │ -736 return this->n; │ │ │ │ │ -737 } │ │ │ │ │ -738 }; │ │ │ │ │ -739 │ │ │ │ │ -740 │ │ │ │ │ -741 │ │ │ │ │ -752 template > │ │ │ │ │ -753 class compressed_block_vector_unmanaged : public │ │ │ │ │ -compressed_base_array_unmanaged │ │ │ │ │ -754 { │ │ │ │ │ -755 public: │ │ │ │ │ -756 │ │ │ │ │ -757 //===== type definitions and constants │ │ │ │ │ -758 │ │ │ │ │ -760 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ -761 │ │ │ │ │ -763 typedef B block_type; │ │ │ │ │ -764 │ │ │ │ │ -766 typedef A allocator_type; │ │ │ │ │ -767 │ │ │ │ │ -769 typedef typename compressed_base_array_unmanaged::iterator Iterator; │ │ │ │ │ -770 │ │ │ │ │ -772 typedef typename compressed_base_array_unmanaged::const_iterator │ │ │ │ │ -ConstIterator; │ │ │ │ │ -773 │ │ │ │ │ -775 typedef typename A::size_type size_type; │ │ │ │ │ -776 │ │ │ │ │ -777 //===== assignment from scalar │ │ │ │ │ -778 │ │ │ │ │ -779 compressed_block_vector_unmanaged& operator= (const field_type& k) │ │ │ │ │ -780 { │ │ │ │ │ -781 for (size_type i=0; in; i++) │ │ │ │ │ -782 (this->p)[i] = k; │ │ │ │ │ -783 return *this; │ │ │ │ │ -784 } │ │ │ │ │ -785 │ │ │ │ │ -786 │ │ │ │ │ -787 //===== vector space arithmetic │ │ │ │ │ -788 │ │ │ │ │ -790 template │ │ │ │ │ -791 compressed_block_vector_unmanaged& operator+= (const V& y) │ │ │ │ │ -792 { │ │ │ │ │ -793#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -794 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ -795#endif │ │ │ │ │ -796 for (size_type i=0; ioperator[](y.j[i]) += y.p[i]; │ │ │ │ │ -797 return *this; │ │ │ │ │ -798 } │ │ │ │ │ -799 │ │ │ │ │ -801 template │ │ │ │ │ -802 compressed_block_vector_unmanaged& operator-= (const V& y) │ │ │ │ │ -803 { │ │ │ │ │ -804#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -805 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ -806#endif │ │ │ │ │ -807 for (size_type i=0; ioperator[](y.j[i]) -= y.p[i]; │ │ │ │ │ -808 return *this; │ │ │ │ │ -809 } │ │ │ │ │ -810 │ │ │ │ │ -812 template │ │ │ │ │ -813 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y) │ │ │ │ │ -814 { │ │ │ │ │ -815#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -816 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ -817#endif │ │ │ │ │ -818 for (size_type i=0; in; ++i) (this->p)[i] *= k; │ │ │ │ │ -827 return *this; │ │ │ │ │ -828 } │ │ │ │ │ -829 │ │ │ │ │ -831 compressed_block_vector_unmanaged& operator/= (const field_type& k) │ │ │ │ │ -832 { │ │ │ │ │ -833 for (size_type i=0; in; ++i) (this->p)[i] /= k; │ │ │ │ │ -834 return *this; │ │ │ │ │ -835 } │ │ │ │ │ -836 │ │ │ │ │ -837 │ │ │ │ │ -838 //===== Euclidean scalar product │ │ │ │ │ -839 │ │ │ │ │ -841 field_type operator* (const compressed_block_vector_unmanaged& y) const │ │ │ │ │ -842 { │ │ │ │ │ -843#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -844 if (!includesindexset(y) || !y.includesindexset(*this) ) │ │ │ │ │ -845 DUNE_THROW(ISTLError,"index set mismatch"); │ │ │ │ │ -846#endif │ │ │ │ │ -847 field_type sum=0; │ │ │ │ │ -848 for (size_type i=0; in; ++i) │ │ │ │ │ -849 sum += (this->p)[i] * y[(this->j)[i]]; │ │ │ │ │ -850 return sum; │ │ │ │ │ -851 } │ │ │ │ │ -852 │ │ │ │ │ -853 │ │ │ │ │ -854 //===== norms │ │ │ │ │ -855 │ │ │ │ │ -857 typename FieldTraits::real_type one_norm () const │ │ │ │ │ -858 { │ │ │ │ │ -859 typename FieldTraits::real_type sum=0; │ │ │ │ │ -860 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm(); │ │ │ │ │ -861 return sum; │ │ │ │ │ -862 } │ │ │ │ │ -863 │ │ │ │ │ -865 typename FieldTraits::real_type one_norm_real () const │ │ │ │ │ -866 { │ │ │ │ │ -867 typename FieldTraits::real_type sum=0; │ │ │ │ │ -868 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm_real(); │ │ │ │ │ -869 return sum; │ │ │ │ │ -870 } │ │ │ │ │ -871 │ │ │ │ │ -873 typename FieldTraits::real_type two_norm () const │ │ │ │ │ -874 { │ │ │ │ │ -875 using std::sqrt; │ │ │ │ │ -876 typename FieldTraits::real_type sum=0; │ │ │ │ │ -877 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2(); │ │ │ │ │ -878 return sqrt(sum); │ │ │ │ │ -879 } │ │ │ │ │ -880 │ │ │ │ │ -882 typename FieldTraits::real_type two_norm2 () const │ │ │ │ │ -883 { │ │ │ │ │ -884 typename FieldTraits::real_type sum=0; │ │ │ │ │ -885 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2(); │ │ │ │ │ -886 return sum; │ │ │ │ │ -887 } │ │ │ │ │ -888 │ │ │ │ │ -890 template ::value, int>::type = 0> │ │ │ │ │ -892 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ -893 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -894 using std::max; │ │ │ │ │ -895 │ │ │ │ │ -896 real_type norm = 0; │ │ │ │ │ -897 for (auto const &x : *this) { │ │ │ │ │ -898 real_type const a = x.infinity_norm(); │ │ │ │ │ -899 norm = max(a, norm); │ │ │ │ │ -900 } │ │ │ │ │ -901 return norm; │ │ │ │ │ -902 } │ │ │ │ │ -903 │ │ │ │ │ -905 template ::value, int>::type = 0> │ │ │ │ │ -907 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ -908 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -909 using std::max; │ │ │ │ │ -910 │ │ │ │ │ -911 real_type norm = 0; │ │ │ │ │ -912 for (auto const &x : *this) { │ │ │ │ │ -913 real_type const a = x.infinity_norm_real(); │ │ │ │ │ -914 norm = max(a, norm); │ │ │ │ │ -915 } │ │ │ │ │ -916 return norm; │ │ │ │ │ -917 } │ │ │ │ │ -918 │ │ │ │ │ -920 template ::value, int>::type = 0> │ │ │ │ │ -922 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ -923 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -924 using std::max; │ │ │ │ │ -925 │ │ │ │ │ -926 real_type norm = 0; │ │ │ │ │ -927 real_type isNaN = 1; │ │ │ │ │ -928 for (auto const &x : *this) { │ │ │ │ │ -929 real_type const a = x.infinity_norm(); │ │ │ │ │ -930 norm = max(a, norm); │ │ │ │ │ -931 isNaN += a; │ │ │ │ │ -932 } │ │ │ │ │ -933 return norm * (isNaN / isNaN); │ │ │ │ │ -934 } │ │ │ │ │ -935 │ │ │ │ │ -937 template ::value, int>::type = 0> │ │ │ │ │ -939 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ -940 using real_type = typename FieldTraits::real_type; │ │ │ │ │ -941 using std::max; │ │ │ │ │ -942 │ │ │ │ │ -943 real_type norm = 0; │ │ │ │ │ -944 real_type isNaN = 1; │ │ │ │ │ -945 for (auto const &x : *this) { │ │ │ │ │ -946 real_type const a = x.infinity_norm_real(); │ │ │ │ │ -947 norm = max(a, norm); │ │ │ │ │ -948 isNaN += a; │ │ │ │ │ -949 } │ │ │ │ │ -950 return norm * (isNaN / isNaN); │ │ │ │ │ -951 } │ │ │ │ │ -952 │ │ │ │ │ -953 //===== sizes │ │ │ │ │ -954 │ │ │ │ │ -956 size_type N () const │ │ │ │ │ -957 { │ │ │ │ │ -958 return this->n; │ │ │ │ │ -959 } │ │ │ │ │ -960 │ │ │ │ │ -962 size_type dim () const │ │ │ │ │ -963 { │ │ │ │ │ -964 size_type d=0; │ │ │ │ │ -965 for (size_type i=0; in; i++) │ │ │ │ │ -966 d += (this->p)[i].dim(); │ │ │ │ │ -967 return d; │ │ │ │ │ -968 } │ │ │ │ │ -969 │ │ │ │ │ -970 protected: │ │ │ │ │ -972 compressed_block_vector_unmanaged () : compressed_base_array_unmanaged │ │ │ │ │ -() │ │ │ │ │ -973 { } │ │ │ │ │ -974 │ │ │ │ │ -976 template │ │ │ │ │ -977 bool includesindexset (const V& y) │ │ │ │ │ -978 { │ │ │ │ │ -979 typename V::ConstIterator e=this->end(); │ │ │ │ │ -980 for (size_type i=0; ifind(y.j[i])==e) │ │ │ │ │ -982 return false; │ │ │ │ │ -983 return true; │ │ │ │ │ -984 } │ │ │ │ │ -985 }; │ │ │ │ │ -986 │ │ │ │ │ -987 │ │ │ │ │ -1006 template > │ │ │ │ │ -1007 class CompressedBlockVectorWindow : public │ │ │ │ │ -compressed_block_vector_unmanaged │ │ │ │ │ -1008 { │ │ │ │ │ -1009 public: │ │ │ │ │ -1010 │ │ │ │ │ -1011 //===== type definitions and constants │ │ │ │ │ -1012 │ │ │ │ │ -1014 using field_type = typename Imp::BlockTraits::field_type; │ │ │ │ │ -1015 │ │ │ │ │ -1017 typedef B block_type; │ │ │ │ │ -1018 │ │ │ │ │ -1020 typedef A allocator_type; │ │ │ │ │ -1021 │ │ │ │ │ -1023 typedef typename A::size_type size_type; │ │ │ │ │ -1024 │ │ │ │ │ -1026 [[deprecated("Use free function blockLevel(). Will be removed after │ │ │ │ │ -2.8.")]] │ │ │ │ │ -1027 static constexpr unsigned int blocklevel = blockLevel()+1; │ │ │ │ │ -1028 │ │ │ │ │ -1030 typedef typename compressed_block_vector_unmanaged::Iterator │ │ │ │ │ -Iterator; │ │ │ │ │ -1031 │ │ │ │ │ -1033 typedef typename compressed_block_vector_unmanaged::ConstIterator │ │ │ │ │ -ConstIterator; │ │ │ │ │ -1034 │ │ │ │ │ -1035 │ │ │ │ │ -1036 //===== constructors and such │ │ │ │ │ -1038 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged() │ │ │ │ │ -1039 { } │ │ │ │ │ -1040 │ │ │ │ │ -1042 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n) │ │ │ │ │ -1043 { │ │ │ │ │ -1044 this->n = _n; │ │ │ │ │ -1045 this->p = _p; │ │ │ │ │ -1046 this->j = _j; │ │ │ │ │ -1047 } │ │ │ │ │ -1048 │ │ │ │ │ -1050 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a) │ │ │ │ │ -1051 { │ │ │ │ │ -1052 this->n = a.n; │ │ │ │ │ -1053 this->p = a.p; │ │ │ │ │ -1054 this->j = a.j; │ │ │ │ │ -1055 } │ │ │ │ │ -1056 │ │ │ │ │ -1058 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow& │ │ │ │ │ -a) │ │ │ │ │ -1059 { │ │ │ │ │ -1060 // check correct size │ │ │ │ │ -1061#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -1062 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch"); │ │ │ │ │ -1063#endif │ │ │ │ │ -1064 │ │ │ │ │ -1065 if (&a!=this) // check if this and a are different objects │ │ │ │ │ -1066 { │ │ │ │ │ -1067 // copy data │ │ │ │ │ -1068 for (size_type i=0; in; i++) this->p[i]=a.p[i]; │ │ │ │ │ -1069 for (size_type i=0; in; i++) this->j[i]=a.j[i]; │ │ │ │ │ -1070 } │ │ │ │ │ -1071 return *this; │ │ │ │ │ -1072 } │ │ │ │ │ -1073 │ │ │ │ │ -1075 CompressedBlockVectorWindow& operator= (const field_type& k) │ │ │ │ │ -1076 { │ │ │ │ │ -1077 (static_cast&>(*this)) = k; │ │ │ │ │ -1078 return *this; │ │ │ │ │ -1079 } │ │ │ │ │ -1080 │ │ │ │ │ -1081 │ │ │ │ │ -1082 //===== window manipulation methods │ │ │ │ │ -1083 │ │ │ │ │ -1085 void set (size_type _n, B* _p, size_type* _j) │ │ │ │ │ -1086 { │ │ │ │ │ -1087 this->n = _n; │ │ │ │ │ -1088 this->p = _p; │ │ │ │ │ -1089 this->j = _j; │ │ │ │ │ -1090 } │ │ │ │ │ -1091 │ │ │ │ │ -1093 void setsize (size_type _n) │ │ │ │ │ -1094 { │ │ │ │ │ -1095 this->n = _n; │ │ │ │ │ -1096 } │ │ │ │ │ -1097 │ │ │ │ │ -1099 void setptr (B* _p) │ │ │ │ │ -1100 { │ │ │ │ │ -1101 this->p = _p; │ │ │ │ │ -1102 } │ │ │ │ │ -1103 │ │ │ │ │ -1105 void setindexptr (size_type* _j) │ │ │ │ │ -1106 { │ │ │ │ │ -1107 this->j = _j; │ │ │ │ │ -1108 } │ │ │ │ │ -1109 │ │ │ │ │ -1111 B* getptr () │ │ │ │ │ -1112 { │ │ │ │ │ -1113 return this->p; │ │ │ │ │ -1114 } │ │ │ │ │ -1115 │ │ │ │ │ -1117 size_type* getindexptr () │ │ │ │ │ -1118 { │ │ │ │ │ -1119 return this->j; │ │ │ │ │ -1120 } │ │ │ │ │ -1121 │ │ │ │ │ -1123 const B* getptr () const │ │ │ │ │ -1124 { │ │ │ │ │ -1125 return this->p; │ │ │ │ │ -1126 } │ │ │ │ │ -1127 │ │ │ │ │ -1129 const size_type* getindexptr () const │ │ │ │ │ -1130 { │ │ │ │ │ -1131 return this->j; │ │ │ │ │ -1132 } │ │ │ │ │ -1134 size_type getsize () const │ │ │ │ │ -1135 { │ │ │ │ │ -1136 return this->n; │ │ │ │ │ -1137 } │ │ │ │ │ -1138 }; │ │ │ │ │ -1139 │ │ │ │ │ -1140} // end namespace 'Imp' │ │ │ │ │ -1141 │ │ │ │ │ -1142 │ │ │ │ │ -1144 template │ │ │ │ │ -1145 struct AutonomousValueType> │ │ │ │ │ -1146 { │ │ │ │ │ -1147 using type = BlockVector; │ │ │ │ │ -1148 }; │ │ │ │ │ -1149 │ │ │ │ │ -1150 │ │ │ │ │ -1151} // end namespace 'Dune' │ │ │ │ │ -1152 │ │ │ │ │ -1153#endif │ │ │ │ │ -_b_a_s_e_a_r_r_a_y_._h_h │ │ │ │ │ -Implements several basic array containers. │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ +416 // apply inverse and store result │ │ │ │ │ +417 Impl::asMatrix(inv[ i ]).mv(rhs, vBlock); │ │ │ │ │ +418 } │ │ │ │ │ +419 } │ │ │ │ │ +420 │ │ │ │ │ +421 } // end namespace ILU │ │ │ │ │ +422 │ │ │ │ │ +425} // end namespace │ │ │ │ │ +426 │ │ │ │ │ +427#endif │ │ │ │ │ _i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v) │ │ │ │ │ -Send BlockVector to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:590 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -BlockVector() │ │ │ │ │ -makes empty vector │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_e_r_v_e │ │ │ │ │ -void reserve(size_type capacity) │ │ │ │ │ -Reserve space. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:475 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector > │ │ │ │ │ -().swap(a))) │ │ │ │ │ -move constructor │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:519 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -BlockVector(size_type _n) │ │ │ │ │ -make vector with _n components │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:431 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type size) │ │ │ │ │ -Resize the vector. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:503 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -Imp::block_vector_unmanaged< B, A >::Iterator Iterator │ │ │ │ │ -make iterators available as types │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:417 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ -static constexpr unsigned int blocklevel │ │ │ │ │ -increment block level counter │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:414 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector > │ │ │ │ │ -().storage_=a.storage_)) │ │ │ │ │ -copy constructor │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:511 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_a_l_l_o_c_a_t_o_r___t_y_p_e │ │ │ │ │ -A allocator_type │ │ │ │ │ -export the allocator type │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:407 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval< │ │ │ │ │ -BlockVector >().storage_=a.storage_)) │ │ │ │ │ -assignment │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:410 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -BlockVector(std::initializer_list< B > const &l) │ │ │ │ │ -Construct from a std::initializer_list. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:437 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ -size_type capacity() const │ │ │ │ │ -Get the capacity of the vector. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -BlockVector(size_type _n, S _capacity) │ │ │ │ │ -Make vector with _n components but preallocating capacity components. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:455 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_c_o_n_v_e_r_t_T_o_C_R_S │ │ │ │ │ +void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv) │ │ │ │ │ +convert ILU decomposition into CRS format for lower and upper triangular and │ │ │ │ │ +inverse. │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_B_a_c_k_s_o_l_v_e │ │ │ │ │ +void blockILUBacksolve(const M &A, X &v, const Y &d) │ │ │ │ │ +LU backsolve with stored inverse. │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_f_i_r_s_t_M_a_t_r_i_x_E_l_e_m_e_n_t │ │ │ │ │ +M::field_type & firstMatrixElement(M &A, typename std::enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_0_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void blockILU0Decomposition(M &A) │ │ │ │ │ +compute ILU decomposition of A. A is overwritten by its decomposition │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_b_l_o_c_k_I_L_U_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ │ +void blockILUDecomposition(const M &A, int n, M &ILU) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S │ │ │ │ │ +a simple compressed row storage matrix class │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_c_o_l_s__ │ │ │ │ │ +std::vector< size_type > cols_ │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_n_o_n_Z_e_r_o_s │ │ │ │ │ +size_type nonZeros() const │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(const size_type nRows) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:273 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_o_w_s │ │ │ │ │ +size_type rows() const │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:265 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_C_R_S │ │ │ │ │ +CRS() │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_e_s_e_r_v_e_A_d_d_i_t_i_o_n_a_l │ │ │ │ │ +void reserveAdditional(const size_type nonZeros) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ B block_type │ │ │ │ │ -export the type representing the components │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:404 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_s_w_a_p │ │ │ │ │ -void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & > │ │ │ │ │ -().storage_.swap(other.storage_))) │ │ │ │ │ -swap operation │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:544 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Imp::block_vector_unmanaged< B, A >::ConstIterator ConstIterator │ │ │ │ │ -make iterators available as types │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:420 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ -FieldTraits< B >::real_type real_type │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:582 │ │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _B_l_o_c_k_V_e_c_t_o_r_<_ _B_,_ _A_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -FieldTraits< B >::field_type field_type │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:581 │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_v_a_l_u_e_s__ │ │ │ │ │ +std::vector< block_type, Alloc > values_ │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_n_R_o_w_s__ │ │ │ │ │ +size_type nRows_ │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:302 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_r_o_w_s__ │ │ │ │ │ +std::vector< size_type > rows_ │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_I_L_U_:_:_C_R_S_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ +void push_back(const block_type &value, const size_type index) │ │ │ │ │ +DDeeffiinniittiioonn ilu.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ +Error when performing an operation on a matrix block. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00218.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solvertype.hh File Reference │ │ │ │ +dune-istl: matrixutils.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,38 +71,93 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
solvertype.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Templates characterizing the type of a solver. │ │ │ │ +

Some handy generic functions for ISTL matrices. │ │ │ │ More...

│ │ │ │ - │ │ │ │ +
#include <set>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/dynmatrix.hh>
│ │ │ │ +#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include <dune/istl/scaledidmatrix.hh>
│ │ │ │ +#include "istlexception.hh"
│ │ │ │ +
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::IsDirectSolver< Solver >
struct  Dune::CheckIfDiagonalPresent< Matrix, blocklevel, l >
 Check whether the a matrix has diagonal values on blocklevel recursion levels. More...
 
struct  Dune::CheckIfDiagonalPresent< Matrix, 0, l >
 
struct  Dune::CheckIfDiagonalPresent< MultiTypeBlockMatrix< T1, Args... >, blocklevel, l >
 
struct  Dune::MatrixDimension< M >
 
struct  Dune::MatrixDimension< Matrix< B, TA > >
 
struct  Dune::MatrixDimension< BCRSMatrix< B, TA > >
 
struct  Dune::MatrixDimension< BCRSMatrix< FieldMatrix< B, n, m >, TA > >
 
struct  Dune::MatrixDimension< FieldMatrix< K, n, m > >
 
struct  Dune::StoresColumnCompressed< Solver >
struct  Dune::MatrixDimension< Dune::DynamicMatrix< T > >
 
struct  Dune::MatrixDimension< Matrix< FieldMatrix< K, n, m >, TA > >
 
struct  Dune::MatrixDimension< DiagonalMatrix< K, n > >
 
struct  Dune::MatrixDimension< ScaledIdentityMatrix< K, n > >
 
struct  Dune::IsMatrix< T >
 Test whether a type is an ISTL Matrix. More...
 
struct  Dune::IsMatrix< DenseMatrix< T > >
 
struct  Dune::IsMatrix< BCRSMatrix< T, A > >
 
struct  Dune::PointerCompare< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class M >
auto Dune::countNonZeros (const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
 Get the number of nonzero fields in the matrix.
 
template<class M >
auto Dune::countNonZeros (const M &matrix, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
 
template<class M , class C >
void Dune::printGlobalSparseMatrix (const M &mat, C &ooc, std::ostream &os)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Templates characterizing the type of a solver.

│ │ │ │ +

Some handy generic functions for ISTL matrices.

│ │ │ │ +
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,22 +1,80 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -solvertype.hh File Reference │ │ │ │ │ -Templates characterizing the type of a solver. _M_o_r_e_._._. │ │ │ │ │ +_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 │ │ │ │ │ +matrixutils.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _S_p_a_r_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _c_l_a_s_s_e_s │ │ │ │ │ +Some handy generic functions for ISTL matrices. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ +#include "_i_s_t_l_e_x_c_e_p_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 │ │ │ │ │ -struct   _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_ _S_o_l_v_e_r_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_a_t_r_i_x_,_ _b_l_o_c_k_l_e_v_e_l_,_ _l_ _> │ │ │ │ │ +  Check whether the a matrix has diagonal values on blocklevel recursion │ │ │ │ │ + levels. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_<_ _S_o_l_v_e_r_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_a_t_r_i_x_,_ _0_,_ _l_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _A_r_g_s_._._._ _>_, │ │ │ │ │ + _b_l_o_c_k_l_e_v_e_l_,_ _l_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_M_a_t_r_i_x_<_ _T_ _> │ │ │ │ │ +  Test whether a type is an _I_S_T_L _M_a_t_r_i_x. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_M_a_t_r_i_x_<_ _D_e_n_s_e_M_a_t_r_i_x_<_ _T_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_I_s_M_a_t_r_i_x_<_ _B_C_R_S_M_a_t_r_i_x_<_ _T_,_ _A_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s (const M &, typename std::enable_if_t< Dune:: │ │ │ │ │ + IsNumber< M >::value > *sfinae=nullptr) │ │ │ │ │ +  Get the number of nonzero fields in the matrix. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s (const M &matrix, typename std::enable_if_t::value > *sfinae=nullptr) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x (const M &_m_a_t, C &ooc, std::ostream &os) │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ +Some handy generic functions for ISTL matrices. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: solvertype.hh Source File │ │ │ │ +dune-istl: matrixutils.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,54 +74,717 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
solvertype.hh
│ │ │ │ +
matrixutils.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_SOLVERTYPE_HH
│ │ │ │ -
6#define DUNE_ISTL_SOLVERTYPE_HH
│ │ │ │ +
5#ifndef DUNE_ISTL_MATRIXUTILS_HH
│ │ │ │ +
6#define DUNE_ISTL_MATRIXUTILS_HH
│ │ │ │
7
│ │ │ │ -
12namespace Dune
│ │ │ │ -
13{
│ │ │ │ -
14 template<typename Solver>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
16 {
│ │ │ │ -
17 enum
│ │ │ │ -
18 {
│ │ │ │ -
24 value =false
│ │ │ │ -
25 };
│ │ │ │ -
26 };
│ │ │ │ -
│ │ │ │ -
27
│ │ │ │ -
28 template<typename Solver>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
30 {
│ │ │ │ -
31 enum
│ │ │ │ -
32 {
│ │ │ │ -
36 value = false
│ │ │ │ -
37 };
│ │ │ │ -
38 };
│ │ │ │ +
8#include <set>
│ │ │ │ +
9#include <vector>
│ │ │ │ +
10#include <limits>
│ │ │ │ +
11#include <dune/common/typetraits.hh>
│ │ │ │ +
12#include <dune/common/fmatrix.hh>
│ │ │ │ +
13#include <dune/common/dynmatrix.hh>
│ │ │ │ +
14#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +
15#include <dune/common/scalarmatrixview.hh>
│ │ │ │ + │ │ │ │ +
17#include "istlexception.hh"
│ │ │ │ +
18
│ │ │ │ +
19namespace Dune
│ │ │ │ +
20{
│ │ │ │ +
21
│ │ │ │ +
22#ifndef DOYXGEN
│ │ │ │ +
23 template<typename B, typename A>
│ │ │ │ +
24 class BCRSMatrix;
│ │ │ │ +
25
│ │ │ │ +
26 template<typename K, int n, int m>
│ │ │ │ + │ │ │ │ +
28
│ │ │ │ +
29 template<class T, class A>
│ │ │ │ +
30 class Matrix;
│ │ │ │ +
31#endif
│ │ │ │ +
32
│ │ │ │ +
46 template<class Matrix, std::size_t blocklevel, std::size_t l=blocklevel>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
48 {
│ │ │ │ +
│ │ │ │ +
53 static void check([[maybe_unused]] const Matrix& mat)
│ │ │ │ +
54 {
│ │ │ │ +
55#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
56 typedef typename Matrix::ConstRowIterator Row;
│ │ │ │ +
57 typedef typename Matrix::ConstColIterator Entry;
│ │ │ │ +
58 for(Row row = mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ +
59 Entry diagonal = row->find(row.index());
│ │ │ │ +
60 if(diagonal==row->end())
│ │ │ │ +
61 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
│ │ │ │ +
62 <<" at block recursion level "<<l-blocklevel);
│ │ │ │ +
63 else{
│ │ │ │ +
64 auto m = Impl::asMatrix(*diagonal);
│ │ │ │ +
65 CheckIfDiagonalPresent<decltype(m),blocklevel-1,l>::check(m);
│ │ │ │ +
66 }
│ │ │ │ +
67 }
│ │ │ │ +
68#endif
│ │ │ │ +
69 }
│ │ │ │
│ │ │ │ -
39} // end namespace Dune
│ │ │ │ -
40#endif
│ │ │ │ +
70 };
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
72 template<class Matrix, std::size_t l>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
74 {
│ │ │ │ +
│ │ │ │ +
75 static void check(const Matrix& mat)
│ │ │ │ +
76 {
│ │ │ │ +
77 typedef typename Matrix::ConstRowIterator Row;
│ │ │ │ +
78 for(Row row = mat.begin(); row!=mat.end(); ++row) {
│ │ │ │ +
79 if(row->find(row.index())==row->end())
│ │ │ │ +
80 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
│ │ │ │ +
81 <<" at block recursion level "<<l);
│ │ │ │ +
82 }
│ │ │ │ +
83 }
│ │ │ │ +
│ │ │ │ +
84 };
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
86 template<typename FirstRow, typename... Args>
│ │ │ │ +
87 class MultiTypeBlockMatrix;
│ │ │ │ +
88
│ │ │ │ +
89 template<std::size_t blocklevel, std::size_t l, typename T1, typename... Args>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
91 blocklevel,l>
│ │ │ │ +
92 {
│ │ │ │ +
93 typedef MultiTypeBlockMatrix<T1,Args...> Matrix;
│ │ │ │ +
94
│ │ │ │ +
│ │ │ │ +
99 static void check(const Matrix& /* mat */)
│ │ │ │ +
100 {
│ │ │ │ +
101#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ +
102 // TODO Implement check
│ │ │ │ +
103#endif
│ │ │ │ +
104 }
│ │ │ │ +
│ │ │ │ +
105 };
│ │ │ │ +
│ │ │ │ +
106
│ │ │ │ +
118 template<class M>
│ │ │ │ +
│ │ │ │ +
119 inline auto countNonZeros(const M&,
│ │ │ │ +
120 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ +
121 {
│ │ │ │ +
122 return 1;
│ │ │ │ +
123 }
│ │ │ │ +
│ │ │ │ +
124
│ │ │ │ +
125 template<class M>
│ │ │ │ +
│ │ │ │ +
126 inline auto countNonZeros(const M& matrix,
│ │ │ │ +
127 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
│ │ │ │ +
128 {
│ │ │ │ +
129 typename M::size_type nonZeros = 0;
│ │ │ │ +
130 for(auto&& row : matrix)
│ │ │ │ +
131 for(auto&& entry : row)
│ │ │ │ +
132 nonZeros += countNonZeros(entry);
│ │ │ │ +
133 return nonZeros;
│ │ │ │ +
134 }
│ │ │ │ +
│ │ │ │ +
135
│ │ │ │ +
136 /*
│ │ │ │ +
137 template<class M>
│ │ │ │ +
138 struct ProcessOnFieldsOfMatrix
│ │ │ │ +
139 */
│ │ │ │ +
140
│ │ │ │ +
142 namespace
│ │ │ │ +
143 {
│ │ │ │ +
144 struct CompPair {
│ │ │ │ +
145 template<class G,class M>
│ │ │ │ +
146 bool operator()(const std::pair<G,M>& p1, const std::pair<G,M>& p2) const
│ │ │ │ +
147 {
│ │ │ │ +
148 return p1.first<p2.first;
│ │ │ │ +
149 }
│ │ │ │ +
150 };
│ │ │ │ +
151
│ │ │ │ +
152 }
│ │ │ │ +
153 template<class M, class C>
│ │ │ │ +
│ │ │ │ +
154 void printGlobalSparseMatrix(const M& mat, C& ooc, std::ostream& os)
│ │ │ │ +
155 {
│ │ │ │ +
156 typedef typename C::ParallelIndexSet::const_iterator IIter;
│ │ │ │ +
157 typedef typename C::OwnerSet OwnerSet;
│ │ │ │ +
158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;
│ │ │ │ +
159
│ │ │ │ +
160 GlobalIndex gmax=0;
│ │ │ │ +
161
│ │ │ │ +
162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
│ │ │ │ +
163 idx!=eidx; ++idx)
│ │ │ │ +
164 gmax=std::max(gmax,idx->global());
│ │ │ │ +
165
│ │ │ │ +
166 gmax=ooc.communicator().max(gmax);
│ │ │ │ +
167 ooc.buildGlobalLookup();
│ │ │ │ +
168
│ │ │ │ +
169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
│ │ │ │ +
170 idx!=eidx; ++idx) {
│ │ │ │ +
171 if(OwnerSet::contains(idx->local().attribute()))
│ │ │ │ +
172 {
│ │ │ │ +
173 typedef typename M::block_type Block;
│ │ │ │ +
174
│ │ │ │ +
175 std::set<std::pair<GlobalIndex,Block>,CompPair> entries;
│ │ │ │ +
176
│ │ │ │ +
177 // sort rows
│ │ │ │ +
178 typedef typename M::ConstColIterator CIter;
│ │ │ │ +
179 for(CIter c=mat[idx->local()].begin(), cend=mat[idx->local()].end();
│ │ │ │ +
180 c!=cend; ++c) {
│ │ │ │ +
181 const typename C::ParallelIndexSet::IndexPair* pair
│ │ │ │ +
182 =ooc.globalLookup().pair(c.index());
│ │ │ │ +
183 assert(pair);
│ │ │ │ +
184 entries.insert(std::make_pair(pair->global(), *c));
│ │ │ │ +
185 }
│ │ │ │ +
186
│ │ │ │ +
187 //wait until its the rows turn.
│ │ │ │ +
188 GlobalIndex rowidx = idx->global();
│ │ │ │ +
189 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
│ │ │ │ +
190 while(cur!=rowidx)
│ │ │ │ +
191 cur=ooc.communicator().min(rowidx);
│ │ │ │ +
192
│ │ │ │ +
193 // print rows
│ │ │ │ +
194 typedef typename std::set<std::pair<GlobalIndex,Block>,CompPair>::iterator SIter;
│ │ │ │ +
195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)
│ │ │ │ +
196 os<<idx->global()<<" "<<s->first<<" "<<s->second<<std::endl;
│ │ │ │ +
197
│ │ │ │ +
198
│ │ │ │ +
199 }
│ │ │ │ +
200 }
│ │ │ │ +
201
│ │ │ │ +
202 ooc.freeGlobalLookup();
│ │ │ │ +
203 // Wait until everybody is finished
│ │ │ │ +
204 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
│ │ │ │ +
205 while(cur!=ooc.communicator().min(cur)) ;
│ │ │ │ +
206 }
│ │ │ │ +
│ │ │ │ +
207
│ │ │ │ +
208 // Default implementation for scalar types
│ │ │ │ +
209 template<typename M>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
211 {
│ │ │ │ +
212 static_assert(IsNumber<M>::value, "MatrixDimension is not implemented for this type!");
│ │ │ │ +
213
│ │ │ │ +
│ │ │ │ +
214 static auto rowdim(const M& A)
│ │ │ │ +
215 {
│ │ │ │ +
216 return 1;
│ │ │ │ +
217 }
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │ +
│ │ │ │ +
219 static auto coldim(const M& A)
│ │ │ │ +
220 {
│ │ │ │ +
221 return 1;
│ │ │ │ +
222 }
│ │ │ │ +
│ │ │ │ +
223 };
│ │ │ │ +
│ │ │ │ +
224
│ │ │ │ +
225 // Default implementation for scalar types
│ │ │ │ +
226 template<typename B, typename TA>
│ │ │ │ +
│ │ │ │ +
227 struct MatrixDimension<Matrix<B,TA> >
│ │ │ │ +
228 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
231
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
233 {
│ │ │ │ + │ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
238 {
│ │ │ │ + │ │ │ │ +
240 }
│ │ │ │ +
│ │ │ │ +
241
│ │ │ │ +
│ │ │ │ +
242 static size_type rowdim (const Matrix<B,TA>& A)
│ │ │ │ +
243 {
│ │ │ │ +
244 size_type nn=0;
│ │ │ │ +
245 for (size_type i=0; i<A.N(); i++)
│ │ │ │ +
246 nn += rowdim(A,i);
│ │ │ │ +
247 return nn;
│ │ │ │ +
248 }
│ │ │ │ +
│ │ │ │ +
249
│ │ │ │ +
│ │ │ │ +
250 static size_type coldim (const Matrix<B,TA>& A)
│ │ │ │ +
251 {
│ │ │ │ +
252 size_type nn=0;
│ │ │ │ +
253 for (size_type i=0; i<A.M(); i++)
│ │ │ │ +
254 nn += coldim(A,i);
│ │ │ │ +
255 return nn;
│ │ │ │ +
256 }
│ │ │ │ +
│ │ │ │ +
257 };
│ │ │ │ +
│ │ │ │ +
258
│ │ │ │ +
259
│ │ │ │ +
260 template<typename B, typename TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
262 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
265 typedef typename Matrix::size_type size_type;
│ │ │ │ +
266
│ │ │ │ +
│ │ │ │ +
267 static size_type rowdim (const Matrix& A, size_type i)
│ │ │ │ +
268 {
│ │ │ │ +
269 const B* row = A.r[i].getptr();
│ │ │ │ +
270 if(row)
│ │ │ │ + │ │ │ │ +
272 else
│ │ │ │ +
273 return 0;
│ │ │ │ +
274 }
│ │ │ │ +
│ │ │ │ +
275
│ │ │ │ +
│ │ │ │ +
276 static size_type coldim (const Matrix& A, size_type c)
│ │ │ │ +
277 {
│ │ │ │ +
278 // find an entry in column c
│ │ │ │ +
279 if (A.nnz_ > 0)
│ │ │ │ +
280 {
│ │ │ │ +
281 for (size_type k=0; k<A.nnz_; k++) {
│ │ │ │ +
282 if (A.j_.get()[k] == c) {
│ │ │ │ + │ │ │ │ +
284 }
│ │ │ │ +
285 }
│ │ │ │ +
286 }
│ │ │ │ +
287 else
│ │ │ │ +
288 {
│ │ │ │ +
289 for (size_type i=0; i<A.N(); i++)
│ │ │ │ +
290 {
│ │ │ │ +
291 size_type* j = A.r[i].getindexptr();
│ │ │ │ +
292 B* a = A.r[i].getptr();
│ │ │ │ +
293 for (size_type k=0; k<A.r[i].getsize(); k++)
│ │ │ │ +
294 if (j[k]==c) {
│ │ │ │ + │ │ │ │ +
296 }
│ │ │ │ +
297 }
│ │ │ │ +
298 }
│ │ │ │ +
299
│ │ │ │ +
300 // not found
│ │ │ │ +
301 return 0;
│ │ │ │ +
302 }
│ │ │ │ +
│ │ │ │ +
303
│ │ │ │ +
│ │ │ │ +
304 static size_type rowdim (const Matrix& A){
│ │ │ │ +
305 size_type nn=0;
│ │ │ │ +
306 for (size_type i=0; i<A.N(); i++)
│ │ │ │ +
307 nn += rowdim(A,i);
│ │ │ │ +
308 return nn;
│ │ │ │ +
309 }
│ │ │ │ +
│ │ │ │ +
310
│ │ │ │ +
│ │ │ │ +
311 static size_type coldim (const Matrix& A){
│ │ │ │ +
312 typedef typename Matrix::ConstRowIterator ConstRowIterator;
│ │ │ │ +
313 typedef typename Matrix::ConstColIterator ConstColIterator;
│ │ │ │ +
314
│ │ │ │ +
315 // The following code has a complexity of nnz, and
│ │ │ │ +
316 // typically a very small constant.
│ │ │ │ +
317 //
│ │ │ │ +
318 std::vector<size_type> coldims(A.M(),
│ │ │ │ +
319 std::numeric_limits<size_type>::max());
│ │ │ │ +
320
│ │ │ │ +
321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)
│ │ │ │ +
322 for (ConstColIterator col=row->begin(); col!=row->end(); ++col)
│ │ │ │ +
323 // only compute blocksizes we don't already have
│ │ │ │ +
324 if (coldims[col.index()]==std::numeric_limits<size_type>::max())
│ │ │ │ +
325 coldims[col.index()] = MatrixDimension<block_type>::coldim(*col);
│ │ │ │ +
326
│ │ │ │ +
327 size_type sum = 0;
│ │ │ │ +
328 for (typename std::vector<size_type>::iterator it=coldims.begin();
│ │ │ │ +
329 it!=coldims.end(); ++it)
│ │ │ │ +
330 // skip rows for which no coldim could be determined
│ │ │ │ +
331 if ((*it)>=0)
│ │ │ │ +
332 sum += *it;
│ │ │ │ +
333
│ │ │ │ +
334 return sum;
│ │ │ │ +
335 }
│ │ │ │ +
│ │ │ │ +
336 };
│ │ │ │ +
│ │ │ │ +
337
│ │ │ │ +
338
│ │ │ │ +
339 template<typename B, int n, int m, typename TA>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
341 {
│ │ │ │ + │ │ │ │ +
343 typedef typename Matrix::size_type size_type;
│ │ │ │ +
344
│ │ │ │ +
│ │ │ │ +
345 static size_type rowdim (const Matrix& /*A*/, size_type /*i*/)
│ │ │ │ +
346 {
│ │ │ │ +
347 return n;
│ │ │ │ +
348 }
│ │ │ │ +
│ │ │ │ +
349
│ │ │ │ +
│ │ │ │ +
350 static size_type coldim (const Matrix& /*A*/, size_type /*c*/)
│ │ │ │ +
351 {
│ │ │ │ +
352 return m;
│ │ │ │ +
353 }
│ │ │ │ +
│ │ │ │ +
354
│ │ │ │ +
│ │ │ │ +
355 static size_type rowdim (const Matrix& A) {
│ │ │ │ +
356 return A.N()*n;
│ │ │ │ +
357 }
│ │ │ │ +
│ │ │ │ +
358
│ │ │ │ +
│ │ │ │ +
359 static size_type coldim (const Matrix& A) {
│ │ │ │ +
360 return A.M()*m;
│ │ │ │ +
361 }
│ │ │ │ +
│ │ │ │ +
362 };
│ │ │ │ +
│ │ │ │ +
363
│ │ │ │ +
364 template<typename K, int n, int m>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
366 {
│ │ │ │ + │ │ │ │ +
368 typedef typename Matrix::size_type size_type;
│ │ │ │ +
369
│ │ │ │ +
│ │ │ │ +
370 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ +
371 {
│ │ │ │ +
372 return 1;
│ │ │ │ +
373 }
│ │ │ │ +
│ │ │ │ +
374
│ │ │ │ +
│ │ │ │ +
375 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ +
376 {
│ │ │ │ +
377 return 1;
│ │ │ │ +
378 }
│ │ │ │ +
│ │ │ │ +
379
│ │ │ │ +
│ │ │ │ +
380 static size_type rowdim(const Matrix& /*A*/)
│ │ │ │ +
381 {
│ │ │ │ +
382 return n;
│ │ │ │ +
383 }
│ │ │ │ +
│ │ │ │ +
384
│ │ │ │ +
│ │ │ │ +
385 static size_type coldim(const Matrix& /*A*/)
│ │ │ │ +
386 {
│ │ │ │ +
387 return m;
│ │ │ │ +
388 }
│ │ │ │ +
│ │ │ │ +
389 };
│ │ │ │ +
│ │ │ │ +
390
│ │ │ │ +
391 template <class T>
│ │ │ │ +
│ │ │ │ +
392 struct MatrixDimension<Dune::DynamicMatrix<T> >
│ │ │ │ +
393 {
│ │ │ │ +
394 typedef Dune::DynamicMatrix<T> MatrixType;
│ │ │ │ +
395 typedef typename MatrixType::size_type size_type;
│ │ │ │ +
396
│ │ │ │ +
│ │ │ │ +
397 static size_type rowdim(const MatrixType& /*A*/, size_type /*r*/)
│ │ │ │ +
398 {
│ │ │ │ +
399 return 1;
│ │ │ │ +
400 }
│ │ │ │ +
│ │ │ │ +
401
│ │ │ │ +
│ │ │ │ +
402 static size_type coldim(const MatrixType& /*A*/, size_type /*r*/)
│ │ │ │ +
403 {
│ │ │ │ +
404 return 1;
│ │ │ │ +
405 }
│ │ │ │ +
│ │ │ │ +
406
│ │ │ │ +
│ │ │ │ +
407 static size_type rowdim(const MatrixType& A)
│ │ │ │ +
408 {
│ │ │ │ +
409 return A.N();
│ │ │ │ +
410 }
│ │ │ │ +
│ │ │ │ +
411
│ │ │ │ +
│ │ │ │ +
412 static size_type coldim(const MatrixType& A)
│ │ │ │ +
413 {
│ │ │ │ +
414 return A.M();
│ │ │ │ +
415 }
│ │ │ │ +
│ │ │ │ +
416 };
│ │ │ │ +
│ │ │ │ +
417
│ │ │ │ +
418 template<typename K, int n, int m, typename TA>
│ │ │ │ +
│ │ │ │ +
419 struct MatrixDimension<Matrix<FieldMatrix<K,n,m>, TA> >
│ │ │ │ +
420 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
423
│ │ │ │ +
│ │ │ │ +
424 static size_type rowdim(const ThisMatrix& /*A*/, size_type /*r*/)
│ │ │ │ +
425 {
│ │ │ │ +
426 return n;
│ │ │ │ +
427 }
│ │ │ │ +
│ │ │ │ +
428
│ │ │ │ +
│ │ │ │ +
429 static size_type coldim(const ThisMatrix& /*A*/, size_type /*r*/)
│ │ │ │ +
430 {
│ │ │ │ +
431 return m;
│ │ │ │ +
432 }
│ │ │ │ +
│ │ │ │ +
433
│ │ │ │ +
│ │ │ │ +
434 static size_type rowdim(const ThisMatrix& A)
│ │ │ │ +
435 {
│ │ │ │ +
436 return A.N()*n;
│ │ │ │ +
437 }
│ │ │ │ +
│ │ │ │ +
438
│ │ │ │ +
│ │ │ │ +
439 static size_type coldim(const ThisMatrix& A)
│ │ │ │ +
440 {
│ │ │ │ +
441 return A.M()*m;
│ │ │ │ +
442 }
│ │ │ │ +
│ │ │ │ +
443 };
│ │ │ │ +
│ │ │ │ +
444
│ │ │ │ +
445 template<typename K, int n>
│ │ │ │ +
│ │ │ │ +
446 struct MatrixDimension<DiagonalMatrix<K,n> >
│ │ │ │ +
447 {
│ │ │ │ +
448 typedef DiagonalMatrix<K,n> Matrix;
│ │ │ │ +
449 typedef typename Matrix::size_type size_type;
│ │ │ │ +
450
│ │ │ │ +
│ │ │ │ +
451 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ +
452 {
│ │ │ │ +
453 return 1;
│ │ │ │ +
454 }
│ │ │ │ +
│ │ │ │ +
455
│ │ │ │ +
│ │ │ │ +
456 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ +
457 {
│ │ │ │ +
458 return 1;
│ │ │ │ +
459 }
│ │ │ │ +
│ │ │ │ +
460
│ │ │ │ +
│ │ │ │ +
461 static size_type rowdim(const Matrix& /*A*/)
│ │ │ │ +
462 {
│ │ │ │ +
463 return n;
│ │ │ │ +
464 }
│ │ │ │ +
│ │ │ │ +
465
│ │ │ │ +
│ │ │ │ +
466 static size_type coldim(const Matrix& /*A*/)
│ │ │ │ +
467 {
│ │ │ │ +
468 return n;
│ │ │ │ +
469 }
│ │ │ │ +
│ │ │ │ +
470 };
│ │ │ │ +
│ │ │ │ +
471
│ │ │ │ +
472 template<typename K, int n>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
474 {
│ │ │ │ + │ │ │ │ +
476 typedef typename Matrix::size_type size_type;
│ │ │ │ +
477
│ │ │ │ +
│ │ │ │ +
478 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ +
479 {
│ │ │ │ +
480 return 1;
│ │ │ │ +
481 }
│ │ │ │ +
│ │ │ │ +
482
│ │ │ │ +
│ │ │ │ +
483 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
│ │ │ │ +
484 {
│ │ │ │ +
485 return 1;
│ │ │ │ +
486 }
│ │ │ │ +
│ │ │ │ +
487
│ │ │ │ +
│ │ │ │ +
488 static size_type rowdim(const Matrix& /*A*/)
│ │ │ │ +
489 {
│ │ │ │ +
490 return n;
│ │ │ │ +
491 }
│ │ │ │ +
│ │ │ │ +
492
│ │ │ │ +
│ │ │ │ +
493 static size_type coldim(const Matrix& /*A*/)
│ │ │ │ +
494 {
│ │ │ │ +
495 return n;
│ │ │ │ +
496 }
│ │ │ │ +
│ │ │ │ +
497 };
│ │ │ │ +
│ │ │ │ +
498
│ │ │ │ +
502 template<typename T>
│ │ │ │ +
│ │ │ │ +
503 struct IsMatrix
│ │ │ │ +
504 {
│ │ │ │ +
505 enum {
│ │ │ │ +
509 value = false
│ │ │ │ +
510 };
│ │ │ │ +
511 };
│ │ │ │ +
│ │ │ │ +
512
│ │ │ │ +
513 template<typename T>
│ │ │ │ +
│ │ │ │ +
514 struct IsMatrix<DenseMatrix<T> >
│ │ │ │ +
515 {
│ │ │ │ +
516 enum {
│ │ │ │ +
520 value = true
│ │ │ │ +
521 };
│ │ │ │ +
522 };
│ │ │ │ +
│ │ │ │ +
523
│ │ │ │ +
524
│ │ │ │ +
525 template<typename T, typename A>
│ │ │ │ +
│ │ │ │ +
526 struct IsMatrix<BCRSMatrix<T,A> >
│ │ │ │ +
527 {
│ │ │ │ +
528 enum {
│ │ │ │ +
532 value = true
│ │ │ │ +
533 };
│ │ │ │ +
534 };
│ │ │ │ +
│ │ │ │ +
535
│ │ │ │ +
536 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
538 {
│ │ │ │ +
│ │ │ │ +
539 bool operator()(const T* l, const T* r)
│ │ │ │ +
540 {
│ │ │ │ +
541 return *l < *r;
│ │ │ │ +
542 }
│ │ │ │ +
│ │ │ │ +
543 };
│ │ │ │ +
│ │ │ │ +
544
│ │ │ │ +
545}
│ │ │ │ +
546#endif
│ │ │ │ + │ │ │ │ +
This file implements a quadratic matrix of fixed size which is a multiple of the identity.
│ │ │ │ +
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
Matrix & mat
Definition matrixmatrix.hh:347
│ │ │ │ +
auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::value > *sfinae=nullptr)
Get the number of nonzero fields in the matrix.
Definition matrixutils.hh:119
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
Definition solvertype.hh:16
│ │ │ │ -
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
│ │ │ │ -
Definition solvertype.hh:30
│ │ │ │ -
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
│ │ │ │ +
void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
Definition matrixutils.hh:154
│ │ │ │ +
Definition matrixutils.hh:211
│ │ │ │ +
static auto coldim(const M &A)
Definition matrixutils.hh:219
│ │ │ │ +
static auto rowdim(const M &A)
Definition matrixutils.hh:214
│ │ │ │ +
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ +
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ +
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition bcrsmatrix.hh:741
│ │ │ │ +
B block_type
export the type representing the components
Definition bcrsmatrix.hh:491
│ │ │ │ +
Iterator access to matrix rows
Definition bcrsmatrix.hh:579
│ │ │ │ +
A Matrix class to support different block types.
Definition multitypeblockmatrix.hh:46
│ │ │ │ +
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
ConstIterator class for sequential access.
Definition matrix.hh:404
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
│ │ │ │ +
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ +
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ +
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
│ │ │ │ +
T block_type
Export the type representing the components.
Definition matrix.hh:568
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │ +
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:48
│ │ │ │ +
static void check(const Matrix &mat)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:53
│ │ │ │ +
static void check(const Matrix &mat)
Definition matrixutils.hh:75
│ │ │ │ +
static void check(const Matrix &)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition matrixutils.hh:99
│ │ │ │ +
MultiTypeBlockMatrix< T1, Args... > Matrix
Definition matrixutils.hh:93
│ │ │ │ +
static size_type rowdim(const Matrix< B, TA > &A, size_type i)
Definition matrixutils.hh:232
│ │ │ │ +
static size_type coldim(const Matrix< B, TA > &A)
Definition matrixutils.hh:250
│ │ │ │ +
static size_type rowdim(const Matrix< B, TA > &A)
Definition matrixutils.hh:242
│ │ │ │ +
typename Matrix< B, TA >::size_type size_type
Definition matrixutils.hh:230
│ │ │ │ +
static size_type coldim(const Matrix< B, TA > &A, size_type c)
Definition matrixutils.hh:237
│ │ │ │ +
typename Matrix< B, TA >::block_type block_type
Definition matrixutils.hh:229
│ │ │ │ +
BCRSMatrix< B, TA > Matrix
Definition matrixutils.hh:263
│ │ │ │ +
static size_type coldim(const Matrix &A)
Definition matrixutils.hh:311
│ │ │ │ +
Matrix::block_type block_type
Definition matrixutils.hh:264
│ │ │ │ +
static size_type coldim(const Matrix &A, size_type c)
Definition matrixutils.hh:276
│ │ │ │ +
Matrix::size_type size_type
Definition matrixutils.hh:265
│ │ │ │ +
static size_type rowdim(const Matrix &A, size_type i)
Definition matrixutils.hh:267
│ │ │ │ +
static size_type rowdim(const Matrix &A)
Definition matrixutils.hh:304
│ │ │ │ +
static size_type coldim(const Matrix &A)
Definition matrixutils.hh:359
│ │ │ │ +
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:345
│ │ │ │ +
static size_type rowdim(const Matrix &A)
Definition matrixutils.hh:355
│ │ │ │ +
Matrix::size_type size_type
Definition matrixutils.hh:343
│ │ │ │ +
BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
Definition matrixutils.hh:342
│ │ │ │ +
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:350
│ │ │ │ +
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:370
│ │ │ │ +
static size_type coldim(const Matrix &)
Definition matrixutils.hh:385
│ │ │ │ +
Matrix::size_type size_type
Definition matrixutils.hh:368
│ │ │ │ +
FieldMatrix< K, n, m > Matrix
Definition matrixutils.hh:367
│ │ │ │ +
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:375
│ │ │ │ +
static size_type rowdim(const Matrix &)
Definition matrixutils.hh:380
│ │ │ │ +
static size_type coldim(const MatrixType &A)
Definition matrixutils.hh:412
│ │ │ │ +
static size_type rowdim(const MatrixType &A)
Definition matrixutils.hh:407
│ │ │ │ +
static size_type rowdim(const MatrixType &, size_type)
Definition matrixutils.hh:397
│ │ │ │ +
MatrixType::size_type size_type
Definition matrixutils.hh:395
│ │ │ │ +
static size_type coldim(const MatrixType &, size_type)
Definition matrixutils.hh:402
│ │ │ │ +
Dune::DynamicMatrix< T > MatrixType
Definition matrixutils.hh:394
│ │ │ │ +
static size_type coldim(const ThisMatrix &A)
Definition matrixutils.hh:439
│ │ │ │ +
static size_type rowdim(const ThisMatrix &A)
Definition matrixutils.hh:434
│ │ │ │ +
Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
Definition matrixutils.hh:421
│ │ │ │ +
static size_type coldim(const ThisMatrix &, size_type)
Definition matrixutils.hh:429
│ │ │ │ +
static size_type rowdim(const ThisMatrix &, size_type)
Definition matrixutils.hh:424
│ │ │ │ +
ThisMatrix::size_type size_type
Definition matrixutils.hh:422
│ │ │ │ +
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:456
│ │ │ │ +
Matrix::size_type size_type
Definition matrixutils.hh:449
│ │ │ │ +
static size_type coldim(const Matrix &)
Definition matrixutils.hh:466
│ │ │ │ +
static size_type rowdim(const Matrix &)
Definition matrixutils.hh:461
│ │ │ │ +
DiagonalMatrix< K, n > Matrix
Definition matrixutils.hh:448
│ │ │ │ +
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:451
│ │ │ │ +
static size_type coldim(const Matrix &)
Definition matrixutils.hh:493
│ │ │ │ +
static size_type rowdim(const Matrix &, size_type)
Definition matrixutils.hh:478
│ │ │ │ +
static size_type coldim(const Matrix &, size_type)
Definition matrixutils.hh:483
│ │ │ │ +
Matrix::size_type size_type
Definition matrixutils.hh:476
│ │ │ │ +
ScaledIdentityMatrix< K, n > Matrix
Definition matrixutils.hh:475
│ │ │ │ +
static size_type rowdim(const Matrix &)
Definition matrixutils.hh:488
│ │ │ │ +
Test whether a type is an ISTL Matrix.
Definition matrixutils.hh:504
│ │ │ │ +
@ value
True if T is an ISTL matrix.
Definition matrixutils.hh:509
│ │ │ │ +
Definition matrixutils.hh:538
│ │ │ │ +
bool operator()(const T *l, const T *r)
Definition matrixutils.hh:539
│ │ │ │ +
A multiple of the identity matrix of static size.
Definition scaledidmatrix.hh:30
│ │ │ │ +
std::size_t size_type
The type used for the index access and size operations.
Definition scaledidmatrix.hh:43
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,53 +1,782 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -solvertype.hh │ │ │ │ │ +matrixutils.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_SOLVERTYPE_HH │ │ │ │ │ -6#define DUNE_ISTL_SOLVERTYPE_HH │ │ │ │ │ +5#ifndef DUNE_ISTL_MATRIXUTILS_HH │ │ │ │ │ +6#define DUNE_ISTL_MATRIXUTILS_HH │ │ │ │ │ 7 │ │ │ │ │ -12namespace _D_u_n_e │ │ │ │ │ -13{ │ │ │ │ │ -14 template │ │ │ │ │ -_1_5 struct _I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -16 { │ │ │ │ │ -17 enum │ │ │ │ │ -18 { │ │ │ │ │ -24 _v_a_l_u_e =false │ │ │ │ │ -_2_5 }; │ │ │ │ │ -26 }; │ │ │ │ │ -27 │ │ │ │ │ -28 template │ │ │ │ │ -_2_9 struct _S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ -30 { │ │ │ │ │ -31 enum │ │ │ │ │ -32 { │ │ │ │ │ -36 _v_a_l_u_e = false │ │ │ │ │ -_3_7 }; │ │ │ │ │ -38 }; │ │ │ │ │ -39} // end namespace Dune │ │ │ │ │ -40#endif │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include <_d_u_n_e_/_i_s_t_l_/_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h> │ │ │ │ │ +17#include "_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h" │ │ │ │ │ +18 │ │ │ │ │ +19namespace _D_u_n_e │ │ │ │ │ +20{ │ │ │ │ │ +21 │ │ │ │ │ +22#ifndef DOYXGEN │ │ │ │ │ +23 template │ │ │ │ │ +24 class BCRSMatrix; │ │ │ │ │ +25 │ │ │ │ │ +26 template │ │ │ │ │ +_2_7 class _F_i_e_l_d_M_a_t_r_i_x; │ │ │ │ │ +28 │ │ │ │ │ +29 template │ │ │ │ │ +30 class _M_a_t_r_i_x; │ │ │ │ │ +31#endif │ │ │ │ │ +32 │ │ │ │ │ +46 template │ │ │ │ │ +_4_7 struct _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t │ │ │ │ │ +48 { │ │ │ │ │ +_5_3 static void _c_h_e_c_k([[maybe_unused]] const _M_a_t_r_i_x& _m_a_t) │ │ │ │ │ +54 { │ │ │ │ │ +55#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +56 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r Row; │ │ │ │ │ +57 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r Entry; │ │ │ │ │ +58 for(Row row = _m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ +59 Entry diagonal = row->find(row.index()); │ │ │ │ │ +60 if(diagonal==row->end()) │ │ │ │ │ +61 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Missing diagonal value in row "<_:_:_c_h_e_c_k(m); │ │ │ │ │ +66 } │ │ │ │ │ +67 } │ │ │ │ │ +68#endif │ │ │ │ │ +69 } │ │ │ │ │ +70 }; │ │ │ │ │ +71 │ │ │ │ │ +72 template │ │ │ │ │ +_7_3 struct _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t<_M_a_t_r_i_x,0,l> │ │ │ │ │ +74 { │ │ │ │ │ +_7_5 static void _c_h_e_c_k(const _M_a_t_r_i_x& _m_a_t) │ │ │ │ │ +76 { │ │ │ │ │ +77 typedef typename _M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r Row; │ │ │ │ │ +78 for(Row row = _m_a_t.begin(); row!=_m_a_t.end(); ++row) { │ │ │ │ │ +79 if(row->find(row.index())==row->end()) │ │ │ │ │ +80 DUNE_THROW(_I_S_T_L_E_r_r_o_r, "Missing diagonal value in row "< │ │ │ │ │ +87 class MultiTypeBlockMatrix; │ │ │ │ │ +88 │ │ │ │ │ +89 template │ │ │ │ │ +_9_0 struct _C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t<_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x, │ │ │ │ │ +91 blocklevel,l> │ │ │ │ │ +92 { │ │ │ │ │ +_9_3 typedef _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x _M_a_t_r_i_x; │ │ │ │ │ +94 │ │ │ │ │ +_9_9 static void _c_h_e_c_k(const _M_a_t_r_i_x& /* mat */) │ │ │ │ │ +100 { │ │ │ │ │ +101#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ +102 // TODO Implement check │ │ │ │ │ +103#endif │ │ │ │ │ +104 } │ │ │ │ │ +105 }; │ │ │ │ │ +106 │ │ │ │ │ +118 template │ │ │ │ │ +_1_1_9 inline auto _c_o_u_n_t_N_o_n_Z_e_r_o_s(const M&, │ │ │ │ │ +120 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ +sfinae = nullptr) │ │ │ │ │ +121 { │ │ │ │ │ +122 return 1; │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +125 template │ │ │ │ │ +_1_2_6 inline auto _c_o_u_n_t_N_o_n_Z_e_r_o_s(const M& matrix, │ │ │ │ │ +127 [[maybe_unused]] typename std::enable_if_t::value>* │ │ │ │ │ +sfinae = nullptr) │ │ │ │ │ +128 { │ │ │ │ │ +129 typename M::size_type nonZeros = 0; │ │ │ │ │ +130 for(auto&& row : matrix) │ │ │ │ │ +131 for(auto&& entry : row) │ │ │ │ │ +132 nonZeros += _c_o_u_n_t_N_o_n_Z_e_r_o_s(entry); │ │ │ │ │ +133 return nonZeros; │ │ │ │ │ +134 } │ │ │ │ │ +135 │ │ │ │ │ +136 /* │ │ │ │ │ +137 template │ │ │ │ │ +138 struct ProcessOnFieldsOfMatrix │ │ │ │ │ +139 */ │ │ │ │ │ +140 │ │ │ │ │ +142 namespace │ │ │ │ │ +143 { │ │ │ │ │ +144 struct CompPair { │ │ │ │ │ +145 template │ │ │ │ │ +146 bool operator()(const std::pair& p1, const std::pair& p2) const │ │ │ │ │ +147 { │ │ │ │ │ +148 return p1.first │ │ │ │ │ +_1_5_4 void _p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x(const M& _m_a_t, C& ooc, std::ostream& os) │ │ │ │ │ +155 { │ │ │ │ │ +156 typedef typename C::ParallelIndexSet::const_iterator IIter; │ │ │ │ │ +157 typedef typename C::OwnerSet OwnerSet; │ │ │ │ │ +158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex; │ │ │ │ │ +159 │ │ │ │ │ +160 GlobalIndex gmax=0; │ │ │ │ │ +161 │ │ │ │ │ +162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end(); │ │ │ │ │ +163 idx!=eidx; ++idx) │ │ │ │ │ +164 gmax=std::max(gmax,idx->global()); │ │ │ │ │ +165 │ │ │ │ │ +166 gmax=ooc.communicator().max(gmax); │ │ │ │ │ +167 ooc.buildGlobalLookup(); │ │ │ │ │ +168 │ │ │ │ │ +169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end(); │ │ │ │ │ +170 idx!=eidx; ++idx) { │ │ │ │ │ +171 if(OwnerSet::contains(idx->local().attribute())) │ │ │ │ │ +172 { │ │ │ │ │ +173 typedef typename M::block_type Block; │ │ │ │ │ +174 │ │ │ │ │ +175 std::set,CompPair> entries; │ │ │ │ │ +176 │ │ │ │ │ +177 // sort rows │ │ │ │ │ +178 typedef typename M::ConstColIterator CIter; │ │ │ │ │ +179 for(CIter c=_m_a_t[idx->local()]._b_e_g_i_n(), cend=_m_a_t[idx->local()]._e_n_d(); │ │ │ │ │ +180 c!=cend; ++c) { │ │ │ │ │ +181 const typename C::ParallelIndexSet::IndexPair* pair │ │ │ │ │ +182 =ooc.globalLookup().pair(c.index()); │ │ │ │ │ +183 assert(pair); │ │ │ │ │ +184 entries.insert(std::make_pair(pair->global(), *c)); │ │ │ │ │ +185 } │ │ │ │ │ +186 │ │ │ │ │ +187 //wait until its the rows turn. │ │ │ │ │ +188 GlobalIndex rowidx = idx->global(); │ │ │ │ │ +189 GlobalIndex cur=std::numeric_limits::max(); │ │ │ │ │ +190 while(cur!=rowidx) │ │ │ │ │ +191 cur=ooc.communicator().min(rowidx); │ │ │ │ │ +192 │ │ │ │ │ +193 // print rows │ │ │ │ │ +194 typedef typename std::set,CompPair>::iterator │ │ │ │ │ +SIter; │ │ │ │ │ +195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s) │ │ │ │ │ +196 os<global()<<" "<first<<" "<second<::max(); │ │ │ │ │ +205 while(cur!=ooc.communicator().min(cur)) ; │ │ │ │ │ +206 } │ │ │ │ │ +207 │ │ │ │ │ +208 // Default implementation for scalar types │ │ │ │ │ +209 template │ │ │ │ │ +_2_1_0 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ +211 { │ │ │ │ │ +212 static_assert(IsNumber::value, "MatrixDimension is not implemented for │ │ │ │ │ +this type!"); │ │ │ │ │ +213 │ │ │ │ │ +_2_1_4 static auto _r_o_w_d_i_m(const M& A) │ │ │ │ │ +215 { │ │ │ │ │ +216 return 1; │ │ │ │ │ +217 } │ │ │ │ │ +218 │ │ │ │ │ +_2_1_9 static auto _c_o_l_d_i_m(const M& A) │ │ │ │ │ +220 { │ │ │ │ │ +221 return 1; │ │ │ │ │ +222 } │ │ │ │ │ +223 }; │ │ │ │ │ +224 │ │ │ │ │ +225 // Default implementation for scalar types │ │ │ │ │ +226 template │ │ │ │ │ +_2_2_7 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_M_a_t_r_i_x > │ │ │ │ │ +228 { │ │ │ │ │ +_2_2_9 using _b_l_o_c_k___t_y_p_e = typename _M_a_t_r_i_x_<_B_,_T_A_>_:_:_b_l_o_c_k___t_y_p_e; │ │ │ │ │ +_2_3_0 using _s_i_z_e___t_y_p_e = typename _M_a_t_r_i_x_<_B_,_T_A_>_:_:_s_i_z_e___t_y_p_e; │ │ │ │ │ +231 │ │ │ │ │ +_2_3_2 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x_<_B_,_T_A_>& A, _s_i_z_e___t_y_p_e i) │ │ │ │ │ +233 { │ │ │ │ │ +234 return _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_r_o_w_d_i_m(A[i][0]); │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +_2_3_7 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x_<_B_,_T_A_>& A, _s_i_z_e___t_y_p_e c) │ │ │ │ │ +238 { │ │ │ │ │ +239 return _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_c_o_l_d_i_m(A[0][c]); │ │ │ │ │ +240 } │ │ │ │ │ +241 │ │ │ │ │ +_2_4_2 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x_<_B_,_T_A_>& A) │ │ │ │ │ +243 { │ │ │ │ │ +244 _s_i_z_e___t_y_p_e nn=0; │ │ │ │ │ +245 for (_s_i_z_e___t_y_p_e i=0; i& A) │ │ │ │ │ +251 { │ │ │ │ │ +252 _s_i_z_e___t_y_p_e nn=0; │ │ │ │ │ +253 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_2_6_1 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +262 { │ │ │ │ │ +_2_6_3 typedef _B_C_R_S_M_a_t_r_i_x_<_B_,_T_A_> _M_a_t_r_i_x; │ │ │ │ │ +_2_6_4 typedef typename _M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +_2_6_5 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +266 │ │ │ │ │ +_2_6_7 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& A, _s_i_z_e___t_y_p_e i) │ │ │ │ │ +268 { │ │ │ │ │ +269 const B* row = A.r[i].getptr(); │ │ │ │ │ +270 if(row) │ │ │ │ │ +271 return _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_r_o_w_d_i_m(*row); │ │ │ │ │ +272 else │ │ │ │ │ +273 return 0; │ │ │ │ │ +274 } │ │ │ │ │ +275 │ │ │ │ │ +_2_7_6 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x& A, _s_i_z_e___t_y_p_e c) │ │ │ │ │ +277 { │ │ │ │ │ +278 // find an entry in column c │ │ │ │ │ +279 if (A.nnz_ > 0) │ │ │ │ │ +280 { │ │ │ │ │ +281 for (_s_i_z_e___t_y_p_e k=0; k_:_:_c_o_l_d_i_m(A.a[k]); │ │ │ │ │ +284 } │ │ │ │ │ +285 } │ │ │ │ │ +286 } │ │ │ │ │ +287 else │ │ │ │ │ +288 { │ │ │ │ │ +289 for (_s_i_z_e___t_y_p_e i=0; i_:_:_c_o_l_d_i_m(a[k]); │ │ │ │ │ +296 } │ │ │ │ │ +297 } │ │ │ │ │ +298 } │ │ │ │ │ +299 │ │ │ │ │ +300 // not found │ │ │ │ │ +301 return 0; │ │ │ │ │ +302 } │ │ │ │ │ +303 │ │ │ │ │ +_3_0_4 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& A){ │ │ │ │ │ +305 _s_i_z_e___t_y_p_e nn=0; │ │ │ │ │ +306 for (_s_i_z_e___t_y_p_e i=0; i coldims(A.M(), │ │ │ │ │ +319 std::numeric_limits::max()); │ │ │ │ │ +320 │ │ │ │ │ +321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row) │ │ │ │ │ +322 for (ConstColIterator _c_o_l=row->begin(); _c_o_l!=row->end(); ++_c_o_l) │ │ │ │ │ +323 // only compute blocksizes we don't already have │ │ │ │ │ +324 if (coldims[_c_o_l.index()]==std::numeric_limits::max()) │ │ │ │ │ +325 coldims[_c_o_l.index()] = _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_b_l_o_c_k___t_y_p_e_>_:_:_c_o_l_d_i_m(*_c_o_l); │ │ │ │ │ +326 │ │ │ │ │ +327 _s_i_z_e___t_y_p_e sum = 0; │ │ │ │ │ +328 for (typename std::vector::iterator it=coldims.begin(); │ │ │ │ │ +329 it!=coldims.end(); ++it) │ │ │ │ │ +330 // skip rows for which no coldim could be determined │ │ │ │ │ +331 if ((*it)>=0) │ │ │ │ │ +332 sum += *it; │ │ │ │ │ +333 │ │ │ │ │ +334 return sum; │ │ │ │ │ +335 } │ │ │ │ │ +336 }; │ │ │ │ │ +337 │ │ │ │ │ +338 │ │ │ │ │ +339 template │ │ │ │ │ +_3_4_0 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_B_C_R_S_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x ,TA> > │ │ │ │ │ +341 { │ │ │ │ │ +_3_4_2 typedef _B_C_R_S_M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_B_,_n_,_m_> ,TA> _M_a_t_r_i_x; │ │ │ │ │ +_3_4_3 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +344 │ │ │ │ │ +_3_4_5 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*i*/) │ │ │ │ │ +346 { │ │ │ │ │ +347 return n; │ │ │ │ │ +348 } │ │ │ │ │ +349 │ │ │ │ │ +_3_5_0 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*c*/) │ │ │ │ │ +351 { │ │ │ │ │ +352 return m; │ │ │ │ │ +353 } │ │ │ │ │ +354 │ │ │ │ │ +_3_5_5 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m (const _M_a_t_r_i_x& A) { │ │ │ │ │ +356 return A.N()*n; │ │ │ │ │ +357 } │ │ │ │ │ +358 │ │ │ │ │ +_3_5_9 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m (const _M_a_t_r_i_x& A) { │ │ │ │ │ +360 return A.M()*m; │ │ │ │ │ +361 } │ │ │ │ │ +362 }; │ │ │ │ │ +363 │ │ │ │ │ +364 template │ │ │ │ │ +_3_6_5 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_F_i_e_l_d_M_a_t_r_i_x > │ │ │ │ │ +366 { │ │ │ │ │ +_3_6_7 typedef _F_i_e_l_d_M_a_t_r_i_x_<_K_,_n_,_m_> _M_a_t_r_i_x; │ │ │ │ │ +_3_6_8 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +369 │ │ │ │ │ +_3_7_0 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +371 { │ │ │ │ │ +372 return 1; │ │ │ │ │ +373 } │ │ │ │ │ +374 │ │ │ │ │ +_3_7_5 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +376 { │ │ │ │ │ +377 return 1; │ │ │ │ │ +378 } │ │ │ │ │ +379 │ │ │ │ │ +_3_8_0 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ +381 { │ │ │ │ │ +382 return n; │ │ │ │ │ +383 } │ │ │ │ │ +384 │ │ │ │ │ +_3_8_5 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ +386 { │ │ │ │ │ +387 return m; │ │ │ │ │ +388 } │ │ │ │ │ +389 }; │ │ │ │ │ +390 │ │ │ │ │ +391 template │ │ │ │ │ +_3_9_2 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_D_u_n_e::DynamicMatrix > │ │ │ │ │ +393 { │ │ │ │ │ +_3_9_4 typedef Dune::DynamicMatrix _M_a_t_r_i_x_T_y_p_e; │ │ │ │ │ +_3_9_5 typedef typename MatrixType::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +396 │ │ │ │ │ +_3_9_7 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x_T_y_p_e& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +398 { │ │ │ │ │ +399 return 1; │ │ │ │ │ +400 } │ │ │ │ │ +401 │ │ │ │ │ +_4_0_2 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x_T_y_p_e& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +403 { │ │ │ │ │ +404 return 1; │ │ │ │ │ +405 } │ │ │ │ │ +406 │ │ │ │ │ +_4_0_7 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x_T_y_p_e& A) │ │ │ │ │ +408 { │ │ │ │ │ +409 return A.N(); │ │ │ │ │ +410 } │ │ │ │ │ +411 │ │ │ │ │ +_4_1_2 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x_T_y_p_e& A) │ │ │ │ │ +413 { │ │ │ │ │ +414 return A.M(); │ │ │ │ │ +415 } │ │ │ │ │ +416 }; │ │ │ │ │ +417 │ │ │ │ │ +418 template │ │ │ │ │ +_4_1_9 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_M_a_t_r_i_x<_F_i_e_l_d_M_a_t_r_i_x, TA> > │ │ │ │ │ +420 { │ │ │ │ │ +_4_2_1 typedef _M_a_t_r_i_x_<_F_i_e_l_d_M_a_t_r_i_x_<_K_,_n_,_m_>, TA> _T_h_i_s_M_a_t_r_i_x; │ │ │ │ │ +_4_2_2 typedef typename _T_h_i_s_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +423 │ │ │ │ │ +_4_2_4 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _T_h_i_s_M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +425 { │ │ │ │ │ +426 return n; │ │ │ │ │ +427 } │ │ │ │ │ +428 │ │ │ │ │ +_4_2_9 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _T_h_i_s_M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +430 { │ │ │ │ │ +431 return m; │ │ │ │ │ +432 } │ │ │ │ │ +433 │ │ │ │ │ +_4_3_4 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _T_h_i_s_M_a_t_r_i_x& A) │ │ │ │ │ +435 { │ │ │ │ │ +436 return A.N()*n; │ │ │ │ │ +437 } │ │ │ │ │ +438 │ │ │ │ │ +_4_3_9 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _T_h_i_s_M_a_t_r_i_x& A) │ │ │ │ │ +440 { │ │ │ │ │ +441 return A.M()*m; │ │ │ │ │ +442 } │ │ │ │ │ +443 }; │ │ │ │ │ +444 │ │ │ │ │ +445 template │ │ │ │ │ +_4_4_6 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n > │ │ │ │ │ +447 { │ │ │ │ │ +_4_4_8 typedef DiagonalMatrix _M_a_t_r_i_x; │ │ │ │ │ +_4_4_9 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +450 │ │ │ │ │ +_4_5_1 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +452 { │ │ │ │ │ +453 return 1; │ │ │ │ │ +454 } │ │ │ │ │ +455 │ │ │ │ │ +_4_5_6 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +457 { │ │ │ │ │ +458 return 1; │ │ │ │ │ +459 } │ │ │ │ │ +460 │ │ │ │ │ +_4_6_1 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ +462 { │ │ │ │ │ +463 return n; │ │ │ │ │ +464 } │ │ │ │ │ +465 │ │ │ │ │ +_4_6_6 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ +467 { │ │ │ │ │ +468 return n; │ │ │ │ │ +469 } │ │ │ │ │ +470 }; │ │ │ │ │ +471 │ │ │ │ │ +472 template │ │ │ │ │ +_4_7_3 struct _M_a_t_r_i_x_D_i_m_e_n_s_i_o_n<_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x > │ │ │ │ │ +474 { │ │ │ │ │ +_4_7_5 typedef _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_n_> _M_a_t_r_i_x; │ │ │ │ │ +_4_7_6 typedef typename _M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e _s_i_z_e___t_y_p_e; │ │ │ │ │ +477 │ │ │ │ │ +_4_7_8 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +479 { │ │ │ │ │ +480 return 1; │ │ │ │ │ +481 } │ │ │ │ │ +482 │ │ │ │ │ +_4_8_3 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/, _s_i_z_e___t_y_p_e /*r*/) │ │ │ │ │ +484 { │ │ │ │ │ +485 return 1; │ │ │ │ │ +486 } │ │ │ │ │ +487 │ │ │ │ │ +_4_8_8 static _s_i_z_e___t_y_p_e _r_o_w_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ +489 { │ │ │ │ │ +490 return n; │ │ │ │ │ +491 } │ │ │ │ │ +492 │ │ │ │ │ +_4_9_3 static _s_i_z_e___t_y_p_e _c_o_l_d_i_m(const _M_a_t_r_i_x& /*A*/) │ │ │ │ │ +494 { │ │ │ │ │ +495 return n; │ │ │ │ │ +496 } │ │ │ │ │ +497 }; │ │ │ │ │ +498 │ │ │ │ │ +502 template │ │ │ │ │ +_5_0_3 struct _I_s_M_a_t_r_i_x │ │ │ │ │ +504 { │ │ │ │ │ +505 enum { │ │ │ │ │ +509 _v_a_l_u_e = false │ │ │ │ │ +_5_1_0 }; │ │ │ │ │ +511 }; │ │ │ │ │ +512 │ │ │ │ │ +513 template │ │ │ │ │ +_5_1_4 struct _I_s_M_a_t_r_i_x > │ │ │ │ │ +515 { │ │ │ │ │ +516 enum { │ │ │ │ │ +520 _v_a_l_u_e = true │ │ │ │ │ +_5_2_1 }; │ │ │ │ │ +522 }; │ │ │ │ │ +523 │ │ │ │ │ +524 │ │ │ │ │ +525 template │ │ │ │ │ +_5_2_6 struct _I_s_M_a_t_r_i_x<_B_C_R_S_M_a_t_r_i_x > │ │ │ │ │ +527 { │ │ │ │ │ +528 enum { │ │ │ │ │ +532 _v_a_l_u_e = true │ │ │ │ │ +_5_3_3 }; │ │ │ │ │ +534 }; │ │ │ │ │ +535 │ │ │ │ │ +536 template │ │ │ │ │ +_5_3_7 struct _P_o_i_n_t_e_r_C_o_m_p_a_r_e │ │ │ │ │ +538 { │ │ │ │ │ +_5_3_9 bool _o_p_e_r_a_t_o_r_(_)(const T* l, const T* r) │ │ │ │ │ +540 { │ │ │ │ │ +541 return *l < *r; │ │ │ │ │ +542 } │ │ │ │ │ +543 }; │ │ │ │ │ +544 │ │ │ │ │ +545} │ │ │ │ │ +546#endif │ │ │ │ │ +_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ +_s_c_a_l_e_d_i_d_m_a_t_r_i_x_._h_h │ │ │ │ │ +This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ +the identity. │ │ │ │ │ +_c_o_l │ │ │ │ │ +Col col │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +_m_a_t │ │ │ │ │ +Matrix & mat │ │ │ │ │ +DDeeffiinniittiioonn matrixmatrix.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_c_o_u_n_t_N_o_n_Z_e_r_o_s │ │ │ │ │ +auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >:: │ │ │ │ │ +value > *sfinae=nullptr) │ │ │ │ │ +Get the number of nonzero fields in the matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:119 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_:_:_v_a_l_u_e │ │ │ │ │ +_D_u_n_e_:_:_p_r_i_n_t_G_l_o_b_a_l_S_p_a_r_s_e_M_a_t_r_i_x │ │ │ │ │ +void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_c_o_l_d_i_m │ │ │ │ │ +static auto coldim(const M &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_:_:_r_o_w_d_i_m │ │ │ │ │ +static auto rowdim(const M &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ +A sparse block matrix with compressed row storage. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +The type for the index access and the size. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::ConstIterator ConstColIterator │ │ │ │ │ +Const iterator to the entries of a row. │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:741 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +B block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:491 │ │ │ │ │ +_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_R_e_a_l_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator access to matrix rows │ │ │ │ │ +DDeeffiinniittiioonn bcrsmatrix.hh:579 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x │ │ │ │ │ +A Matrix class to support different block types. │ │ │ │ │ +DDeeffiinniittiioonn multitypeblockmatrix.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ +derive error class from the base class in common │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_I_m_p_:_:_D_e_n_s_e_M_a_t_r_i_x_B_a_s_e_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:404 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +A::size_type size_type │ │ │ │ │ +Type for indices and sizes. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:577 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +RowIterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +RowIterator begin() │ │ │ │ │ +Get iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::const_iterator ConstColIterator │ │ │ │ │ +Const iterator for the entries of each row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +T block_type │ │ │ │ │ +Export the type representing the components. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:568 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t │ │ │ │ │ +Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_:_:_c_h_e_c_k │ │ │ │ │ +static void check(const Matrix &mat) │ │ │ │ │ +Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_a_t_r_i_x_,_ _0_,_ _l_ _>_:_:_c_h_e_c_k │ │ │ │ │ +static void check(const Matrix &mat) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _A_r_g_s_._._._ _>_,_ _b_l_o_c_k_l_e_v_e_l_, │ │ │ │ │ +_l_ _>_:_:_c_h_e_c_k │ │ │ │ │ +static void check(const Matrix &) │ │ │ │ │ +Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_C_h_e_c_k_I_f_D_i_a_g_o_n_a_l_P_r_e_s_e_n_t_<_ _M_u_l_t_i_T_y_p_e_B_l_o_c_k_M_a_t_r_i_x_<_ _T_1_,_ _A_r_g_s_._._._ _>_,_ _b_l_o_c_k_l_e_v_e_l_, │ │ │ │ │ +_l_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +MultiTypeBlockMatrix< T1, Args... > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix< B, TA > &A, size_type i) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix< B, TA > &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:250 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix< B, TA > &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:242 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +typename Matrix< B, TA >::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix< B, TA > &A, size_type c) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +typename Matrix< B, TA >::block_type block_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< B, TA > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +Matrix::block_type block_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:264 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &A, size_type c) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:265 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &A, size_type i) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _B_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:345 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:343 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _B_C_R_S_M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _B_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:370 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:385 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:368 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +FieldMatrix< K, n, m > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:367 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:375 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:380 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const MatrixType &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:412 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const MatrixType &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:407 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const MatrixType &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:397 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +MatrixType::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const MatrixType &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:402 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_u_n_e_:_:_D_y_n_a_m_i_c_M_a_t_r_i_x_<_ _T_ _>_ _>_:_:_M_a_t_r_i_x_T_y_p_e │ │ │ │ │ +Dune::DynamicMatrix< T > MatrixType │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:394 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const ThisMatrix &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:439 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const ThisMatrix &A) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:434 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_T_h_i_s_M_a_t_r_i_x │ │ │ │ │ +Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:421 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const ThisMatrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:429 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const ThisMatrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:424 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _M_a_t_r_i_x_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _n_,_ _m_ _>_,_ _T_A_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +ThisMatrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:422 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:456 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:449 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:466 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +DiagonalMatrix< K, n > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:448 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _D_i_a_g_o_n_a_l_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:451 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:493 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:478 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_c_o_l_d_i_m │ │ │ │ │ +static size_type coldim(const Matrix &, size_type) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:483 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Matrix::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:476 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_M_a_t_r_i_x │ │ │ │ │ +ScaledIdentityMatrix< K, n > Matrix │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:475 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_D_i_m_e_n_s_i_o_n_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_o_w_d_i_m │ │ │ │ │ +static size_type rowdim(const Matrix &) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:488 │ │ │ │ │ +_D_u_n_e_:_:_I_s_M_a_t_r_i_x │ │ │ │ │ +Test whether a type is an ISTL Matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_I_s_M_a_t_r_i_x_:_:_v_a_l_u_e │ │ │ │ │ @ value │ │ │ │ │ -Whether this is a direct solver. │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_S_t_o_r_e_s_C_o_l_u_m_n_C_o_m_p_r_e_s_s_e_d_:_:_v_a_l_u_e │ │ │ │ │ -@ value │ │ │ │ │ -whether the solver internally uses column compressed storage │ │ │ │ │ -DDeeffiinniittiioonn solvertype.hh:36 │ │ │ │ │ +True if T is an ISTL matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:509 │ │ │ │ │ +_D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:538 │ │ │ │ │ +_D_u_n_e_:_:_P_o_i_n_t_e_r_C_o_m_p_a_r_e_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +bool operator()(const T *l, const T *r) │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:539 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ +A multiple of the identity matrix of static size. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +The type used for the index access and size operations. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:43 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00221.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: poweriteration.hh File Reference │ │ │ │ +dune-istl: ildl.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,55 +65,60 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
poweriteration.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
ildl.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <ios>
│ │ │ │ -#include <iomanip>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <string>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ -#include <dune/istl/operators.hh>
│ │ │ │ -#include <dune/istl/solvercategory.hh>
│ │ │ │ -#include <dune/istl/solvertype.hh>
│ │ │ │ -#include <dune/istl/istlexception.hh>
│ │ │ │ -#include <dune/istl/io.hh>
│ │ │ │ -#include <dune/istl/solvers.hh>
│ │ │ │ + │ │ │ │ +

Incomplete LDL decomposition. │ │ │ │ +More...

│ │ │ │ +
#include <dune/common/scalarvectorview.hh>
│ │ │ │ +#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +#include "ilu.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::PowerIteration_Algorithms< BCRSMatrix, BlockVector >
 Iterative eigenvalue algorithms based on power iteration. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class K , int m, int n>
static void Dune::bildl_subtractBCT (const FieldMatrix< K, m, n > &B, const FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A)
 
template<class K >
static void Dune::bildl_subtractBCT (const K &B, const K &CT, K &A, typename std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)
 
template<class Matrix >
static void Dune::bildl_subtractBCT (const Matrix &B, const Matrix &CT, Matrix &A, typename std::enable_if_t<!Dune::IsNumber< Matrix >::value > *sfinae=nullptr)
 
template<class Matrix >
void Dune::bildl_decompose (Matrix &A)
 compute ILDL decomposition of a symmetric matrix A
 
template<class Matrix , class X , class Y >
void Dune::bildl_backsolve (const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Incomplete LDL decomposition.

│ │ │ │ +
Author
Martin Nolte
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,36 +1,44 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -poweriteration.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +ildl.hh File Reference │ │ │ │ │ +Incomplete LDL decomposition. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_i_l_u_._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_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_<_ _B_C_R_S_M_a_t_r_i_x_,_ _B_l_o_c_k_V_e_c_t_o_r_ _> │ │ │ │ │ -  Iterative eigenvalue algorithms based on power iteration. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +static void  _D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T (const _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &B, const │ │ │ │ │ + _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &CT, _F_i_e_l_d_M_a_t_r_i_x< K, m, n > &A) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static void  _D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T (const K &B, const K &CT, K &A, typename │ │ │ │ │ + std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static void  _D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T (const _M_a_t_r_i_x &B, const _M_a_t_r_i_x &CT, _M_a_t_r_i_x │ │ │ │ │ + &A, typename std::enable_if_t::value > │ │ │ │ │ + *sfinae=nullptr) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_b_i_l_d_l___d_e_c_o_m_p_o_s_e (_M_a_t_r_i_x &A) │ │ │ │ │ +  compute ILDL decomposition of a symmetric matrix A │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void  _D_u_n_e_:_:_b_i_l_d_l___b_a_c_k_s_o_l_v_e (const _M_a_t_r_i_x &A, X &v, const Y &d, bool │ │ │ │ │ + isLowerTriangular=false) │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Incomplete LDL decomposition. │ │ │ │ │ + Author │ │ │ │ │ + Martin Nolte │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: poweriteration.hh Source File │ │ │ │ +dune-istl: ildl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,875 +70,250 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
poweriteration.hh
│ │ │ │ +
ildl.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ -
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
│ │ │ │ -
6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <cstddef> // provides std::size_t
│ │ │ │ -
9#include <cmath> // provides std::sqrt, std::abs
│ │ │ │ -
10
│ │ │ │ -
11#include <type_traits> // provides std::is_same
│ │ │ │ -
12#include <iostream> // provides std::cout, std::endl
│ │ │ │ -
13#include <limits> // provides std::numeric_limits
│ │ │ │ -
14#include <ios> // provides std::left, std::ios::left
│ │ │ │ -
15#include <iomanip> // provides std::setw, std::resetiosflags
│ │ │ │ -
16#include <memory> // provides std::unique_ptr
│ │ │ │ -
17#include <string> // provides std::string
│ │ │ │ -
18
│ │ │ │ -
19#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
│ │ │ │ -
20
│ │ │ │ -
21#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
│ │ │ │ -
22#include <dune/istl/operators.hh> // provides Dune::LinearOperator
│ │ │ │ -
23#include <dune/istl/solvercategory.hh> // provides Dune::SolverCategory::sequential
│ │ │ │ -
24#include <dune/istl/solvertype.hh> // provides Dune::IsDirectSolver
│ │ │ │ -
25#include <dune/istl/operators.hh> // provides Dune::MatrixAdapter
│ │ │ │ -
26#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
│ │ │ │ -
27#include <dune/istl/io.hh> // provides Dune::printvector(...)
│ │ │ │ -
28#include <dune/istl/solvers.hh> // provides Dune::InverseOperatorResult
│ │ │ │ -
29
│ │ │ │ -
30namespace Dune
│ │ │ │ -
31{
│ │ │ │ -
32
│ │ │ │ -
37 namespace Impl {
│ │ │ │ -
45 template <class X, class Y = X>
│ │ │ │ -
46 class ScalingLinearOperator : public Dune::LinearOperator<X,Y>
│ │ │ │ -
47 {
│ │ │ │ -
48 public:
│ │ │ │ -
49 typedef X domain_type;
│ │ │ │ -
50 typedef Y range_type;
│ │ │ │ -
51 typedef typename X::field_type field_type;
│ │ │ │ -
52
│ │ │ │ -
53 ScalingLinearOperator (field_type immutable_scaling,
│ │ │ │ -
54 const field_type& mutable_scaling)
│ │ │ │ -
55 : immutable_scaling_(immutable_scaling),
│ │ │ │ -
56 mutable_scaling_(mutable_scaling)
│ │ │ │ -
57 {}
│ │ │ │ -
58
│ │ │ │ -
59 virtual void apply (const X& x, Y& y) const
│ │ │ │ -
60 {
│ │ │ │ -
61 y = x;
│ │ │ │ -
62 y *= immutable_scaling_*mutable_scaling_;
│ │ │ │ -
63 }
│ │ │ │ -
64
│ │ │ │ -
65 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
│ │ │ │ -
66 {
│ │ │ │ -
67 X temp(x);
│ │ │ │ -
68 temp *= immutable_scaling_*mutable_scaling_;
│ │ │ │ -
69 y.axpy(alpha,temp);
│ │ │ │ -
70 }
│ │ │ │ -
71
│ │ │ │ - │ │ │ │ -
74 {
│ │ │ │ - │ │ │ │ -
76 }
│ │ │ │ +
3#ifndef DUNE_ISTL_ILDL_HH
│ │ │ │ +
4#define DUNE_ISTL_ILDL_HH
│ │ │ │ +
5
│ │ │ │ +
6#include <dune/common/scalarvectorview.hh>
│ │ │ │ +
7#include <dune/common/scalarmatrixview.hh>
│ │ │ │ +
8#include "ilu.hh"
│ │ │ │ +
9
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
19
│ │ │ │ +
20 // bildl_subtractBCT
│ │ │ │ +
21 // -----------------
│ │ │ │ +
22
│ │ │ │ +
23 template< class K, int m, int n >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
25 {
│ │ │ │ +
26 for( int i = 0; i < m; ++i )
│ │ │ │ +
27 {
│ │ │ │ +
28 for( int j = 0; j < n; ++j )
│ │ │ │ +
29 {
│ │ │ │ +
30 for( int k = 0; k < n; ++k )
│ │ │ │ +
31 A[ i ][ j ] -= B[ i ][ k ] * CT[ j ][ k ];
│ │ │ │ +
32 }
│ │ │ │ +
33 }
│ │ │ │ +
34 }
│ │ │ │ +
│ │ │ │ +
35
│ │ │ │ +
36 template< class K >
│ │ │ │ +
│ │ │ │ +
37 inline static void bildl_subtractBCT ( const K &B, const K &CT, K &A,
│ │ │ │ +
38 typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr )
│ │ │ │ +
39 {
│ │ │ │ +
40 A -= B * CT;
│ │ │ │ +
41 }
│ │ │ │ +
│ │ │ │ +
42
│ │ │ │ +
43 template< class Matrix >
│ │ │ │ +
│ │ │ │ +
44 inline static void bildl_subtractBCT ( const Matrix &B, const Matrix &CT, Matrix &A,
│ │ │ │ +
45 typename std::enable_if_t<!Dune::IsNumber<Matrix>::value>* sfinae = nullptr )
│ │ │ │ +
46 {
│ │ │ │ +
47 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
48 {
│ │ │ │ +
49 auto &&A_i = *i;
│ │ │ │ +
50 auto &&B_i = B[ i.index() ];
│ │ │ │ +
51 const auto ikend = B_i.end();
│ │ │ │ +
52 for( auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j )
│ │ │ │ +
53 {
│ │ │ │ +
54 auto &&A_ij = *j;
│ │ │ │ +
55 auto &&CT_j = CT[ j.index() ];
│ │ │ │ +
56 const auto jkend = CT_j.end();
│ │ │ │ +
57 for( auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk != jkend); )
│ │ │ │ +
58 {
│ │ │ │ +
59 if( ik.index() == jk.index() )
│ │ │ │ +
60 {
│ │ │ │ +
61 bildl_subtractBCT( *ik, *jk, A_ij );
│ │ │ │ +
62 ++ik; ++jk;
│ │ │ │ +
63 }
│ │ │ │ +
64 else if( ik.index() < jk.index() )
│ │ │ │ +
65 ++ik;
│ │ │ │ +
66 else
│ │ │ │ +
67 ++jk;
│ │ │ │ +
68 }
│ │ │ │ +
69 }
│ │ │ │ +
70 }
│ │ │ │ +
71 }
│ │ │ │ +
│ │ │ │ +
72
│ │ │ │ +
73
│ │ │ │ +
74
│ │ │ │ +
75 // bildl_decompose
│ │ │ │ +
76 // ---------------
│ │ │ │
77
│ │ │ │ -
78 protected:
│ │ │ │ -
79 const field_type immutable_scaling_;
│ │ │ │ -
80 const field_type& mutable_scaling_;
│ │ │ │ -
81 };
│ │ │ │ -
82
│ │ │ │ -
83
│ │ │ │ -
92 template <class OP1, class OP2>
│ │ │ │ -
93 class LinearOperatorSum
│ │ │ │ -
94 : public Dune::LinearOperator<typename OP1::domain_type,
│ │ │ │ -
95 typename OP1::range_type>
│ │ │ │ -
96 {
│ │ │ │ -
97 public:
│ │ │ │ -
98 typedef typename OP1::domain_type domain_type;
│ │ │ │ -
99 typedef typename OP1::range_type range_type;
│ │ │ │ -
100 typedef typename domain_type::field_type field_type;
│ │ │ │ -
101
│ │ │ │ -
102 LinearOperatorSum (const OP1& op1, const OP2& op2)
│ │ │ │ -
103 : op1_(op1), op2_(op2)
│ │ │ │ -
104 {
│ │ │ │ -
105 static_assert(std::is_same<typename OP2::domain_type,domain_type>::value,
│ │ │ │ -
106 "Domain type of both operators doesn't match!");
│ │ │ │ -
107 static_assert(std::is_same<typename OP2::range_type,range_type>::value,
│ │ │ │ -
108 "Range type of both operators doesn't match!");
│ │ │ │ -
109 }
│ │ │ │ -
110
│ │ │ │ -
111 virtual void apply (const domain_type& x, range_type& y) const
│ │ │ │ -
112 {
│ │ │ │ -
113 op1_.apply(x,y);
│ │ │ │ -
114 op2_.applyscaleadd(1.0,x,y);
│ │ │ │ -
115 }
│ │ │ │ -
116
│ │ │ │ -
117 virtual void applyscaleadd (field_type alpha,
│ │ │ │ -
118 const domain_type& x, range_type& y) const
│ │ │ │ -
119 {
│ │ │ │ -
120 range_type temp(y);
│ │ │ │ -
121 op1_.apply(x,temp);
│ │ │ │ -
122 op2_.applyscaleadd(1.0,x,temp);
│ │ │ │ -
123 y.axpy(alpha,temp);
│ │ │ │ -
124 }
│ │ │ │ -
125
│ │ │ │ -
127 virtual SolverCategory::Category category() const
│ │ │ │ -
128 {
│ │ │ │ - │ │ │ │ -
130 }
│ │ │ │ -
131
│ │ │ │ -
132 protected:
│ │ │ │ -
133 const OP1& op1_;
│ │ │ │ -
134 const OP2& op2_;
│ │ │ │ -
135 };
│ │ │ │ -
136 } // end namespace Impl
│ │ │ │ -
137
│ │ │ │ -
174 template <typename BCRSMatrix, typename BlockVector>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
176 {
│ │ │ │ -
177 protected:
│ │ │ │ -
178 // Type definitions for type of iteration operator (m_ - mu_*I)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
181 typedef Impl::ScalingLinearOperator<BlockVector> ScalingOperator;
│ │ │ │ -
182 typedef Impl::LinearOperatorSum<MatrixOperator,ScalingOperator> OperatorSum;
│ │ │ │ -
183
│ │ │ │ -
184 public:
│ │ │ │ - │ │ │ │ -
187
│ │ │ │ - │ │ │ │ -
190
│ │ │ │ -
191 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
207 const unsigned int nIterationsMax = 1000,
│ │ │ │ -
208 const unsigned int verbosity_level = 0)
│ │ │ │ -
209 : m_(m), nIterationsMax_(nIterationsMax),
│ │ │ │ -
210 verbosity_level_(verbosity_level),
│ │ │ │ -
211 mu_(0.0),
│ │ │ │ - │ │ │ │ -
213 scalingOperator_(-1.0,mu_),
│ │ │ │ - │ │ │ │ -
215 nIterations_(0),
│ │ │ │ -
216 title_(" PowerIteration_Algorithms: "),
│ │ │ │ -
217 blank_(title_.length(),' ')
│ │ │ │ -
218 {
│ │ │ │ -
219 // assert that BCRSMatrix type has blocklevel 2
│ │ │ │ -
220 static_assert
│ │ │ │ -
221 (blockLevel<BCRSMatrix>() == 2,
│ │ │ │ -
222 "Only BCRSMatrices with blocklevel 2 are supported.");
│ │ │ │ -
223
│ │ │ │ -
224 // assert that BCRSMatrix type has square blocks
│ │ │ │ -
225 static_assert
│ │ │ │ -
226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols,
│ │ │ │ -
227 "Only BCRSMatrices with square blocks are supported.");
│ │ │ │ -
228
│ │ │ │ -
229 // assert that m_ is square
│ │ │ │ -
230 const int nrows = m_.M() * BCRSMatrix::block_type::rows;
│ │ │ │ -
231 const int ncols = m_.N() * BCRSMatrix::block_type::cols;
│ │ │ │ -
232 if (nrows != ncols)
│ │ │ │ -
233 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ -
234 << nrows << "x" << ncols << ").");
│ │ │ │ -
235 }
│ │ │ │ -
│ │ │ │ -
236
│ │ │ │ - │ │ │ │ -
241
│ │ │ │ - │ │ │ │ - │ │ │ │ -
247
│ │ │ │ -
│ │ │ │ -
260 inline void applyPowerIteration (const Real& epsilon,
│ │ │ │ -
261 BlockVector& x, Real& lambda) const
│ │ │ │ -
262 {
│ │ │ │ -
263 // print verbosity information
│ │ │ │ -
264 if (verbosity_level_ > 0)
│ │ │ │ -
265 std::cout << title_
│ │ │ │ -
266 << "Performing power iteration approximating "
│ │ │ │ -
267 << "the dominant eigenvalue." << std::endl;
│ │ │ │ -
268
│ │ │ │ -
269 // allocate memory for auxiliary variables
│ │ │ │ -
270 BlockVector y(x);
│ │ │ │ -
271 BlockVector temp(x);
│ │ │ │ -
272
│ │ │ │ -
273 // perform power iteration
│ │ │ │ -
274 x *= (1.0 / x.two_norm());
│ │ │ │ -
275 m_.mv(x,y);
│ │ │ │ -
276 Real r_norm = std::numeric_limits<Real>::max();
│ │ │ │ -
277 nIterations_ = 0;
│ │ │ │ -
278 while (r_norm > epsilon)
│ │ │ │ -
279 {
│ │ │ │ -
280 // update and check number of iterations
│ │ │ │ - │ │ │ │ -
282 DUNE_THROW(Dune::ISTLError,"Power iteration did not converge "
│ │ │ │ -
283 << "in " << nIterationsMax_ << " iterations "
│ │ │ │ -
284 << "(║residual║_2 = " << r_norm << ", epsilon = "
│ │ │ │ -
285 << epsilon << ").");
│ │ │ │ -
286
│ │ │ │ -
287 // do one iteration of the power iteration algorithm
│ │ │ │ -
288 // (use that y = m_ * x)
│ │ │ │ -
289 x = y;
│ │ │ │ -
290 x *= (1.0 / y.two_norm());
│ │ │ │ -
291
│ │ │ │ -
292 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ -
293 m_.mv(x,y);
│ │ │ │ -
294 lambda = x * y;
│ │ │ │ -
295
│ │ │ │ -
296 // get norm of residual (use that y = m_ * x)
│ │ │ │ -
297 temp = y;
│ │ │ │ -
298 temp.axpy(-lambda,x);
│ │ │ │ -
299 r_norm = temp.two_norm();
│ │ │ │ -
300
│ │ │ │ -
301 // print verbosity information
│ │ │ │ -
302 if (verbosity_level_ > 1)
│ │ │ │ -
303 std::cout << blank_ << std::left
│ │ │ │ -
304 << "iteration " << std::setw(3) << nIterations_
│ │ │ │ -
305 << " (║residual║_2 = " << std::setw(11) << r_norm
│ │ │ │ -
306 << "): λ = " << lambda << std::endl
│ │ │ │ -
307 << std::resetiosflags(std::ios::left);
│ │ │ │ -
308 }
│ │ │ │ -
309
│ │ │ │ -
310 // print verbosity information
│ │ │ │ -
311 if (verbosity_level_ > 0)
│ │ │ │ -
312 {
│ │ │ │ -
313 std::cout << blank_ << "Result ("
│ │ │ │ -
314 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
315 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
316 << "λ = " << lambda << std::endl;
│ │ │ │ -
317 if (verbosity_level_ > 2)
│ │ │ │ -
318 {
│ │ │ │ -
319 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ -
320 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
321 }
│ │ │ │ -
322 }
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
353 template <typename ISTLLinearSolver,
│ │ │ │ -
354 bool avoidLinSolverCrime = false>
│ │ │ │ -
│ │ │ │ -
355 inline void applyInverseIteration (const Real& epsilon,
│ │ │ │ -
356 ISTLLinearSolver& solver,
│ │ │ │ -
357 BlockVector& x, Real& lambda) const
│ │ │ │ -
358 {
│ │ │ │ -
359 constexpr Real gamma = 0.0;
│ │ │ │ -
360 applyInverseIteration(gamma,epsilon,solver,x,lambda);
│ │ │ │ -
361 }
│ │ │ │ -
│ │ │ │ -
362
│ │ │ │ -
392 template <typename ISTLLinearSolver,
│ │ │ │ -
393 bool avoidLinSolverCrime = false>
│ │ │ │ -
│ │ │ │ -
394 inline void applyInverseIteration (const Real& gamma,
│ │ │ │ -
395 const Real& epsilon,
│ │ │ │ -
396 ISTLLinearSolver& solver,
│ │ │ │ -
397 BlockVector& x, Real& lambda) const
│ │ │ │ -
398 {
│ │ │ │ -
399 // print verbosity information
│ │ │ │ -
400 if (verbosity_level_ > 0)
│ │ │ │ -
401 {
│ │ │ │ -
402 std::cout << title_;
│ │ │ │ -
403 if (gamma == 0.0)
│ │ │ │ -
404 std::cout << "Performing inverse iteration approximating "
│ │ │ │ -
405 << "the least dominant eigenvalue." << std::endl;
│ │ │ │ -
406 else
│ │ │ │ -
407 std::cout << "Performing inverse iteration with shift "
│ │ │ │ -
408 << "gamma = " << gamma << " approximating the "
│ │ │ │ -
409 << "eigenvalue closest to gamma." << std::endl;
│ │ │ │ -
410 }
│ │ │ │ -
411
│ │ │ │ -
412 // initialize iteration operator,
│ │ │ │ -
413 // initialize iteration matrix when needed
│ │ │ │ -
414 updateShiftMu(gamma,solver);
│ │ │ │ -
415
│ │ │ │ -
416 // allocate memory for linear solver statistics
│ │ │ │ -
417 Dune::InverseOperatorResult solver_statistics;
│ │ │ │ -
418
│ │ │ │ -
419 // allocate memory for auxiliary variables
│ │ │ │ -
420 BlockVector y(x);
│ │ │ │ -
421 Real y_norm;
│ │ │ │ -
422 BlockVector temp(x);
│ │ │ │ -
423
│ │ │ │ -
424 // perform inverse iteration with shift
│ │ │ │ -
425 x *= (1.0 / x.two_norm());
│ │ │ │ -
426 Real r_norm = std::numeric_limits<Real>::max();
│ │ │ │ -
427 nIterations_ = 0;
│ │ │ │ -
428 while (r_norm > epsilon)
│ │ │ │ -
429 {
│ │ │ │ -
430 // update and check number of iterations
│ │ │ │ - │ │ │ │ -
432 DUNE_THROW(Dune::ISTLError,"Inverse iteration "
│ │ │ │ -
433 << (gamma != 0.0 ? "with shift " : "") << "did not "
│ │ │ │ -
434 << "converge in " << nIterationsMax_ << " iterations "
│ │ │ │ -
435 << "(║residual║_2 = " << r_norm << ", epsilon = "
│ │ │ │ -
436 << epsilon << ").");
│ │ │ │ -
437
│ │ │ │ -
438 // do one iteration of the inverse iteration with shift algorithm,
│ │ │ │ -
439 // part 1: solve (m_ - gamma*I) * y = x for y
│ │ │ │ -
440 // (protect x from being changed)
│ │ │ │ -
441 temp = x;
│ │ │ │ -
442 solver.apply(y,temp,solver_statistics);
│ │ │ │ -
443
│ │ │ │ -
444 // get norm of y
│ │ │ │ -
445 y_norm = y.two_norm();
│ │ │ │ -
446
│ │ │ │ -
447 // compile time switch between accuracy and efficiency
│ │ │ │ -
448 if (avoidLinSolverCrime)
│ │ │ │ -
449 {
│ │ │ │ -
450 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ -
451 // (use that x_new = y / y_norm)
│ │ │ │ -
452 m_.mv(y,temp);
│ │ │ │ -
453 lambda = (y * temp) / (y_norm * y_norm);
│ │ │ │ -
454
│ │ │ │ -
455 // get norm of residual
│ │ │ │ -
456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
│ │ │ │ -
457 temp.axpy(-lambda,y);
│ │ │ │ -
458 r_norm = temp.two_norm() / y_norm;
│ │ │ │ -
459 }
│ │ │ │ -
460 else
│ │ │ │ -
461 {
│ │ │ │ -
462 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ -
463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
│ │ │ │ -
464 lambda = gamma + (y * x) / (y_norm * y_norm);
│ │ │ │ -
465
│ │ │ │ -
466 // get norm of residual
│ │ │ │ -
467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
│ │ │ │ -
468 temp = x; temp.axpy(gamma-lambda,y);
│ │ │ │ -
469 r_norm = temp.two_norm() / y_norm;
│ │ │ │ -
470 }
│ │ │ │ -
471
│ │ │ │ -
472 // do one iteration of the inverse iteration with shift algorithm,
│ │ │ │ -
473 // part 2: update x
│ │ │ │ -
474 x = y;
│ │ │ │ -
475 x *= (1.0 / y_norm);
│ │ │ │ -
476
│ │ │ │ -
477 // print verbosity information
│ │ │ │ -
478 if (verbosity_level_ > 1)
│ │ │ │ -
479 std::cout << blank_ << std::left
│ │ │ │ -
480 << "iteration " << std::setw(3) << nIterations_
│ │ │ │ -
481 << " (║residual║_2 = " << std::setw(11) << r_norm
│ │ │ │ -
482 << "): λ = " << lambda << std::endl
│ │ │ │ -
483 << std::resetiosflags(std::ios::left);
│ │ │ │ -
484 }
│ │ │ │ -
485
│ │ │ │ -
486 // print verbosity information
│ │ │ │ -
487 if (verbosity_level_ > 0)
│ │ │ │ -
488 {
│ │ │ │ -
489 std::cout << blank_ << "Result ("
│ │ │ │ -
490 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
491 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
492 << "λ = " << lambda << std::endl;
│ │ │ │ -
493 if (verbosity_level_ > 2)
│ │ │ │ -
494 {
│ │ │ │ -
495 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ -
496 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
497 }
│ │ │ │ -
498 }
│ │ │ │ -
499 }
│ │ │ │ -
│ │ │ │ -
500
│ │ │ │ -
531 template <typename ISTLLinearSolver,
│ │ │ │ -
532 bool avoidLinSolverCrime = false>
│ │ │ │ -
│ │ │ │ -
533 inline void applyRayleighQuotientIteration (const Real& epsilon,
│ │ │ │ -
534 ISTLLinearSolver& solver,
│ │ │ │ -
535 BlockVector& x, Real& lambda) const
│ │ │ │ -
536 {
│ │ │ │ -
537 // print verbosity information
│ │ │ │ -
538 if (verbosity_level_ > 0)
│ │ │ │ -
539 std::cout << title_
│ │ │ │ -
540 << "Performing Rayleigh quotient iteration for "
│ │ │ │ -
541 << "estimated eigenvalue " << lambda << "." << std::endl;
│ │ │ │ -
542
│ │ │ │ -
543 // allocate memory for linear solver statistics
│ │ │ │ -
544 Dune::InverseOperatorResult solver_statistics;
│ │ │ │ -
545
│ │ │ │ -
546 // allocate memory for auxiliary variables
│ │ │ │ -
547 BlockVector y(x);
│ │ │ │ -
548 Real y_norm;
│ │ │ │ -
549 Real lambda_update;
│ │ │ │ -
550 BlockVector temp(x);
│ │ │ │ -
551
│ │ │ │ -
552 // perform Rayleigh quotient iteration
│ │ │ │ -
553 x *= (1.0 / x.two_norm());
│ │ │ │ -
554 Real r_norm = std::numeric_limits<Real>::max();
│ │ │ │ -
555 nIterations_ = 0;
│ │ │ │ -
556 while (r_norm > epsilon)
│ │ │ │ -
557 {
│ │ │ │ -
558 // update and check number of iterations
│ │ │ │ - │ │ │ │ -
560 DUNE_THROW(Dune::ISTLError,"Rayleigh quotient iteration did not "
│ │ │ │ -
561 << "converge in " << nIterationsMax_ << " iterations "
│ │ │ │ -
562 << "(║residual║_2 = " << r_norm << ", epsilon = "
│ │ │ │ -
563 << epsilon << ").");
│ │ │ │ -
564
│ │ │ │ -
565 // update iteration operator,
│ │ │ │ -
566 // update iteration matrix when needed
│ │ │ │ -
567 updateShiftMu(lambda,solver);
│ │ │ │ -
568
│ │ │ │ -
569 // do one iteration of the Rayleigh quotient iteration algorithm,
│ │ │ │ -
570 // part 1: solve (m_ - lambda*I) * y = x for y
│ │ │ │ -
571 // (protect x from being changed)
│ │ │ │ -
572 temp = x;
│ │ │ │ -
573 solver.apply(y,temp,solver_statistics);
│ │ │ │ -
574
│ │ │ │ -
575 // get norm of y
│ │ │ │ -
576 y_norm = y.two_norm();
│ │ │ │ -
577
│ │ │ │ -
578 // compile time switch between accuracy and efficiency
│ │ │ │ -
579 if (avoidLinSolverCrime)
│ │ │ │ -
580 {
│ │ │ │ -
581 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ -
582 // (use that x_new = y / y_norm)
│ │ │ │ -
583 m_.mv(y,temp);
│ │ │ │ -
584 lambda = (y * temp) / (y_norm * y_norm);
│ │ │ │ -
585
│ │ │ │ -
586 // get norm of residual
│ │ │ │ -
587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
│ │ │ │ -
588 temp.axpy(-lambda,y);
│ │ │ │ -
589 r_norm = temp.two_norm() / y_norm;
│ │ │ │ -
590 }
│ │ │ │ -
591 else
│ │ │ │ -
592 {
│ │ │ │ -
593 // get approximated eigenvalue lambda via the Rayleigh quotient
│ │ │ │ -
594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
│ │ │ │ -
595 lambda_update = (y * x) / (y_norm * y_norm);
│ │ │ │ -
596 lambda += lambda_update;
│ │ │ │ -
597
│ │ │ │ -
598 // get norm of residual
│ │ │ │ -
599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
│ │ │ │ -
600 temp = x; temp.axpy(-lambda_update,y);
│ │ │ │ -
601 r_norm = temp.two_norm() / y_norm;
│ │ │ │ -
602 }
│ │ │ │ -
603
│ │ │ │ -
604 // do one iteration of the Rayleigh quotient iteration algorithm,
│ │ │ │ -
605 // part 2: update x
│ │ │ │ -
606 x = y;
│ │ │ │ -
607 x *= (1.0 / y_norm);
│ │ │ │ -
608
│ │ │ │ -
609 // print verbosity information
│ │ │ │ -
610 if (verbosity_level_ > 1)
│ │ │ │ -
611 std::cout << blank_ << std::left
│ │ │ │ -
612 << "iteration " << std::setw(3) << nIterations_
│ │ │ │ -
613 << " (║residual║_2 = " << std::setw(11) << r_norm
│ │ │ │ -
614 << "): λ = " << lambda << std::endl
│ │ │ │ -
615 << std::resetiosflags(std::ios::left);
│ │ │ │ -
616 }
│ │ │ │ -
617
│ │ │ │ -
618 // print verbosity information
│ │ │ │ -
619 if (verbosity_level_ > 0)
│ │ │ │ -
620 {
│ │ │ │ -
621 std::cout << blank_ << "Result ("
│ │ │ │ -
622 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
623 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
624 << "λ = " << lambda << std::endl;
│ │ │ │ -
625 if (verbosity_level_ > 2)
│ │ │ │ -
626 {
│ │ │ │ -
627 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ -
628 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
629 }
│ │ │ │ -
630 }
│ │ │ │ -
631 }
│ │ │ │ -
│ │ │ │ -
632
│ │ │ │ -
689 template <typename ISTLLinearSolver,
│ │ │ │ -
690 bool avoidLinSolverCrime = false>
│ │ │ │ -
│ │ │ │ -
691 inline void applyTLIMEIteration (const Real& gamma, const Real& eta,
│ │ │ │ -
692 const Real& epsilon,
│ │ │ │ -
693 ISTLLinearSolver& solver,
│ │ │ │ -
694 const Real& delta, const std::size_t& m,
│ │ │ │ -
695 bool& extrnl,
│ │ │ │ -
696 BlockVector& x, Real& lambda) const
│ │ │ │ -
697 {
│ │ │ │ -
698 // use same variable names as in [Szyld, 1988]
│ │ │ │ -
699 BlockVector& x_s = x;
│ │ │ │ -
700 Real& mu_s = lambda;
│ │ │ │ -
701
│ │ │ │ -
702 // print verbosity information
│ │ │ │ -
703 if (verbosity_level_ > 0)
│ │ │ │ -
704 std::cout << title_
│ │ │ │ -
705 << "Performing TLIME iteration for "
│ │ │ │ -
706 << "estimated eigenvalue in the "
│ │ │ │ -
707 << "interval (" << gamma - eta << ","
│ │ │ │ -
708 << gamma + eta << ")." << std::endl;
│ │ │ │ -
709
│ │ │ │ -
710 // allocate memory for linear solver statistics
│ │ │ │ -
711 Dune::InverseOperatorResult solver_statistics;
│ │ │ │ -
712
│ │ │ │ -
713 // allocate memory for auxiliary variables
│ │ │ │ -
714 bool doRQI;
│ │ │ │ -
715 Real mu;
│ │ │ │ -
716 BlockVector y(x_s);
│ │ │ │ -
717 Real omega;
│ │ │ │ -
718 Real mu_s_old;
│ │ │ │ -
719 Real mu_s_update;
│ │ │ │ -
720 BlockVector temp(x_s);
│ │ │ │ -
721 Real q_norm, r_norm;
│ │ │ │ -
722
│ │ │ │ -
723 // perform TLIME iteration
│ │ │ │ -
724 x_s *= (1.0 / x_s.two_norm());
│ │ │ │ -
725 extrnl = true;
│ │ │ │ -
726 doRQI = false;
│ │ │ │ -
727 r_norm = std::numeric_limits<Real>::max();
│ │ │ │ -
728 nIterations_ = 0;
│ │ │ │ -
729 while (r_norm > epsilon)
│ │ │ │ -
730 {
│ │ │ │ -
731 // update and check number of iterations
│ │ │ │ - │ │ │ │ -
733 DUNE_THROW(Dune::ISTLError,"TLIME iteration did not "
│ │ │ │ -
734 << "converge in " << nIterationsMax_
│ │ │ │ -
735 << " iterations (║residual║_2 = " << r_norm
│ │ │ │ -
736 << ", epsilon = " << epsilon << ").");
│ │ │ │ -
737
│ │ │ │ -
738 // set shift for next iteration according to inverse iteration
│ │ │ │ -
739 // with shift (II) resp. Rayleigh quotient iteration (RQI)
│ │ │ │ -
740 if (doRQI)
│ │ │ │ -
741 mu = mu_s;
│ │ │ │ -
742 else
│ │ │ │ -
743 mu = gamma;
│ │ │ │ -
744
│ │ │ │ -
745 // update II/RQI iteration operator,
│ │ │ │ -
746 // update II/RQI iteration matrix when needed
│ │ │ │ -
747 updateShiftMu(mu,solver);
│ │ │ │ -
748
│ │ │ │ -
749 // do one iteration of the II/RQI algorithm,
│ │ │ │ -
750 // part 1: solve (m_ - mu*I) * y = x for y
│ │ │ │ -
751 temp = x_s;
│ │ │ │ -
752 solver.apply(y,temp,solver_statistics);
│ │ │ │ -
753
│ │ │ │ -
754 // do one iteration of the II/RQI algorithm,
│ │ │ │ -
755 // part 2: compute omega
│ │ │ │ -
756 omega = (1.0 / y.two_norm());
│ │ │ │ -
757
│ │ │ │ -
758 // backup the old Rayleigh quotient
│ │ │ │ -
759 mu_s_old = mu_s;
│ │ │ │ -
760
│ │ │ │ -
761 // compile time switch between accuracy and efficiency
│ │ │ │ -
762 if (avoidLinSolverCrime)
│ │ │ │ -
763 {
│ │ │ │ -
764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
│ │ │ │ -
765 // (use that x_new = y * omega)
│ │ │ │ -
766 m_.mv(y,temp);
│ │ │ │ -
767 mu_s = (y * temp) * (omega * omega);
│ │ │ │ -
768
│ │ │ │ -
769 // get norm of "the residual with respect to the shift used by II",
│ │ │ │ -
770 // use normal representation of q
│ │ │ │ -
771 // (use that x_new = y * omega, use that temp = m_ * y)
│ │ │ │ -
772 temp.axpy(-gamma,y);
│ │ │ │ -
773 q_norm = temp.two_norm() * omega;
│ │ │ │ -
774
│ │ │ │ -
775 // get norm of "the residual with respect to the Rayleigh quotient"
│ │ │ │ -
776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s);
│ │ │ │ -
777 // prevent that truncation errors invalidate the norm
│ │ │ │ -
778 // (we don't want to calculate sqrt of a negative number)
│ │ │ │ -
779 if (r_norm >= 0)
│ │ │ │ -
780 {
│ │ │ │ -
781 // use relation between the norms of r and q for efficiency
│ │ │ │ -
782 r_norm = std::sqrt(r_norm);
│ │ │ │ -
783 }
│ │ │ │ -
784 else
│ │ │ │ -
785 {
│ │ │ │ -
786 // use relation between r and q
│ │ │ │ -
787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q / omega)
│ │ │ │ -
788 temp.axpy(gamma-mu_s,y);
│ │ │ │ -
789 r_norm = temp.two_norm() * omega;
│ │ │ │ -
790 }
│ │ │ │ -
791 }
│ │ │ │ -
792 else
│ │ │ │ -
793 {
│ │ │ │ -
794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
│ │ │ │ -
795 if (!doRQI)
│ │ │ │ -
796 {
│ │ │ │ -
797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
│ │ │ │ -
798 mu_s = gamma + (y * x_s) * (omega * omega);
│ │ │ │ -
799 }
│ │ │ │ -
800 else
│ │ │ │ -
801 {
│ │ │ │ -
802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
│ │ │ │ -
803 mu_s_update = (y * x_s) * (omega * omega);
│ │ │ │ -
804 mu_s += mu_s_update;
│ │ │ │ -
805 }
│ │ │ │ -
806
│ │ │ │ -
807 // get norm of "the residual with respect to the shift used by II"
│ │ │ │ -
808 if (!doRQI)
│ │ │ │ -
809 {
│ │ │ │ -
810 // use special representation of q in the II case
│ │ │ │ -
811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
│ │ │ │ -
812 q_norm = omega;
│ │ │ │ -
813 }
│ │ │ │ -
814 else
│ │ │ │ -
815 {
│ │ │ │ -
816 // use special representation of q in the RQI case
│ │ │ │ -
817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
│ │ │ │ -
818 temp = x_s; temp.axpy(mu_s-gamma,y);
│ │ │ │ -
819 q_norm = temp.two_norm() * omega;
│ │ │ │ -
820 }
│ │ │ │ -
821
│ │ │ │ -
822 // get norm of "the residual with respect to the Rayleigh quotient"
│ │ │ │ -
823 // don't use efficient relation between the norms of r and q, as
│ │ │ │ -
824 // this relation seems to yield a less accurate r_norm in the case
│ │ │ │ -
825 // where linear solver crime is admitted
│ │ │ │ -
826 if (!doRQI)
│ │ │ │ -
827 {
│ │ │ │ -
828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s)
│ │ │ │ -
829 temp = x_s; temp.axpy(gamma-lambda,y);
│ │ │ │ -
830 r_norm = temp.two_norm() * omega;
│ │ │ │ -
831 }
│ │ │ │ -
832 else
│ │ │ │ -
833 {
│ │ │ │ -
834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s)
│ │ │ │ -
835 temp = x_s; temp.axpy(-mu_s_update,y);
│ │ │ │ -
836 r_norm = temp.two_norm() * omega;
│ │ │ │ -
837 }
│ │ │ │ -
838 }
│ │ │ │ -
839
│ │ │ │ -
840 // do one iteration of the II/RQI algorithm,
│ │ │ │ -
841 // part 3: update x
│ │ │ │ -
842 x_s = y; x_s *= omega;
│ │ │ │ -
843
│ │ │ │ -
844 // // for relative residual norm mode, scale with mu_s^{-1}
│ │ │ │ -
845 // r_norm /= std::abs(mu_s);
│ │ │ │ -
846
│ │ │ │ -
847 // print verbosity information
│ │ │ │ -
848 if (verbosity_level_ > 1)
│ │ │ │ -
849 std::cout << blank_ << "iteration "
│ │ │ │ -
850 << std::left << std::setw(3) << nIterations_
│ │ │ │ -
851 << " (" << (doRQI ? "RQI," : "II, ")
│ │ │ │ -
852 << " " << (doRQI ? "—>" : " ") << " "
│ │ │ │ -
853 << "║r║_2 = " << std::setw(11) << r_norm
│ │ │ │ -
854 << ", " << (doRQI ? " " : "—>") << " "
│ │ │ │ -
855 << "║q║_2 = " << std::setw(11) << q_norm
│ │ │ │ -
856 << "): λ = " << lambda << std::endl
│ │ │ │ -
857 << std::resetiosflags(std::ios::left);
│ │ │ │ -
858
│ │ │ │ -
859 // check if the eigenvalue closest to gamma lies in J
│ │ │ │ -
860 if (!doRQI && q_norm < eta)
│ │ │ │ -
861 {
│ │ │ │ -
862 // J is not free of eigenvalues
│ │ │ │ -
863 extrnl = false;
│ │ │ │ -
864
│ │ │ │ -
865 // by theory we know now that mu_s also lies in J
│ │ │ │ -
866 assert(std::abs(mu_s-gamma) < eta);
│ │ │ │ -
867
│ │ │ │ -
868 // switch to RQI
│ │ │ │ -
869 doRQI = true;
│ │ │ │ -
870 }
│ │ │ │ -
871
│ │ │ │ -
872 // revert to II if J is not free of eigenvalues but
│ │ │ │ -
873 // at some point mu_s falls back again outside J
│ │ │ │ -
874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta)
│ │ │ │ -
875 doRQI = false;
│ │ │ │ -
876
│ │ │ │ -
877 // if eigenvalue closest to gamma does not lie in J use RQI
│ │ │ │ -
878 // solely to accelerate the convergence to this eigenvalue
│ │ │ │ -
879 // when II has become stationary
│ │ │ │ -
880 if (extrnl && !doRQI)
│ │ │ │ -
881 {
│ │ │ │ -
882 // switch to RQI if the relative change of the Rayleigh
│ │ │ │ -
883 // quotient indicates that II has become stationary
│ │ │ │ -
884 if (nIterations_ >= m &&
│ │ │ │ -
885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta)
│ │ │ │ -
886 doRQI = true;
│ │ │ │ -
887 }
│ │ │ │ -
888 }
│ │ │ │ -
889
│ │ │ │ -
890 // // compute final residual and lambda again (paranoia....)
│ │ │ │ -
891 // m_.mv(x_s,temp);
│ │ │ │ -
892 // mu_s = x_s * temp;
│ │ │ │ -
893 // temp.axpy(-mu_s,x_s);
│ │ │ │ -
894 // r_norm = temp.two_norm();
│ │ │ │ -
895 // // r_norm /= std::abs(mu_s);
│ │ │ │ -
896
│ │ │ │ -
897 // print verbosity information
│ │ │ │ -
898 if (verbosity_level_ > 0)
│ │ │ │ -
899 {
│ │ │ │ -
900 if (extrnl)
│ │ │ │ -
901 std::cout << blank_ << "Interval "
│ │ │ │ -
902 << "(" << gamma - eta << "," << gamma + eta
│ │ │ │ -
903 << ") is free of eigenvalues, approximating "
│ │ │ │ -
904 << "the closest eigenvalue." << std::endl;
│ │ │ │ -
905 std::cout << blank_ << "Result ("
│ │ │ │ -
906 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
907 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
908 << "λ = " << lambda << std::endl;
│ │ │ │ -
909 if (verbosity_level_ > 2)
│ │ │ │ -
910 {
│ │ │ │ -
911 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ -
912 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
913 }
│ │ │ │ -
914 }
│ │ │ │ -
915 }
│ │ │ │ -
│ │ │ │ -
916
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
926 {
│ │ │ │ -
927 // return iteration operator
│ │ │ │ -
928 return itOperator_;
│ │ │ │ -
929 }
│ │ │ │ -
│ │ │ │ -
930
│ │ │ │ -
│ │ │ │ -
945 inline const BCRSMatrix& getIterationMatrix () const
│ │ │ │ -
946 {
│ │ │ │ -
947 // create iteration matrix on demand
│ │ │ │ -
948 if (!itMatrix_)
│ │ │ │ -
949 itMatrix_ = std::make_unique<BCRSMatrix>(m_);
│ │ │ │ -
950
│ │ │ │ -
951 // return iteration matrix
│ │ │ │ -
952 return *itMatrix_;
│ │ │ │ -
953 }
│ │ │ │ -
│ │ │ │ -
954
│ │ │ │ -
│ │ │ │ -
959 inline unsigned int getIterationCount () const
│ │ │ │ -
960 {
│ │ │ │ -
961 if (nIterations_ == 0)
│ │ │ │ -
962 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
│ │ │ │ -
963
│ │ │ │ -
964 return nIterations_;
│ │ │ │ -
965 }
│ │ │ │ -
│ │ │ │ -
966
│ │ │ │ -
967 protected:
│ │ │ │ -
982 template <typename ISTLLinearSolver>
│ │ │ │ -
│ │ │ │ -
983 inline void updateShiftMu (const Real& mu,
│ │ │ │ -
984 ISTLLinearSolver& solver) const
│ │ │ │ -
985 {
│ │ │ │ -
986 // do nothing if new shift equals the old one
│ │ │ │ -
987 if (mu == mu_) return;
│ │ │ │ -
988
│ │ │ │ -
989 // update shift mu_, i.e. update iteration operator
│ │ │ │ -
990 mu_ = mu;
│ │ │ │ -
991
│ │ │ │ -
992 // update iteration matrix when needed
│ │ │ │ -
993 if (itMatrix_)
│ │ │ │ -
994 {
│ │ │ │ -
995 // iterate over entries in iteration matrix diagonal
│ │ │ │ -
996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows;
│ │ │ │ -
997 constexpr int colBlockSize = BCRSMatrix::block_type::cols;
│ │ │ │ -
998 for (typename BCRSMatrix::size_type i = 0;
│ │ │ │ -
999 i < itMatrix_->M()*rowBlockSize; ++i)
│ │ │ │ -
1000 {
│ │ │ │ -
1001 // access m_[i,i] where i is the flat index of a row/column
│ │ │ │ -
1002 const Real& m_entry = m_
│ │ │ │ -
1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
│ │ │ │ -
1004 // access *itMatrix[i,i] where i is the flat index of a row/column
│ │ │ │ -
1005 Real& entry = (*itMatrix_)
│ │ │ │ -
1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
│ │ │ │ -
1007 // change current entry in iteration matrix diagonal
│ │ │ │ -
1008 entry = m_entry - mu_;
│ │ │ │ -
1009 }
│ │ │ │ -
1010 // notify linear solver about change of the iteration matrix object
│ │ │ │ - │ │ │ │ -
1012 (solver,*itMatrix_);
│ │ │ │ -
1013 }
│ │ │ │ -
1014 }
│ │ │ │ -
│ │ │ │ -
1015
│ │ │ │ -
1016 protected:
│ │ │ │ -
1017 // parameters related to iterative eigenvalue algorithms
│ │ │ │ - │ │ │ │ -
1019 const unsigned int nIterationsMax_;
│ │ │ │ -
1020
│ │ │ │ -
1021 // verbosity setting
│ │ │ │ -
1022 const unsigned int verbosity_level_;
│ │ │ │ -
1023
│ │ │ │ -
1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I)
│ │ │ │ -
1025 mutable Real mu_;
│ │ │ │ -
1026
│ │ │ │ -
1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
1031
│ │ │ │ -
1032 // iteration matrix (m_ - mu_*I), provided on demand when needed
│ │ │ │ -
1033 // (e.g. for preconditioning)
│ │ │ │ -
1034 mutable std::unique_ptr<BCRSMatrix> itMatrix_;
│ │ │ │ -
1035
│ │ │ │ -
1036 // memory for storing temporary variables (mutable as they shall
│ │ │ │ -
1037 // just be effectless auxiliary variables of the const apply*(...)
│ │ │ │ -
1038 // methods)
│ │ │ │ -
1039 mutable unsigned int nIterations_;
│ │ │ │ -
1040
│ │ │ │ -
1041 // constants for printing verbosity information
│ │ │ │ -
1042 const std::string title_;
│ │ │ │ -
1043 const std::string blank_;
│ │ │ │ -
1044 };
│ │ │ │ -
│ │ │ │ -
1045
│ │ │ │ -
1048} // namespace Dune
│ │ │ │ -
1049
│ │ │ │ -
1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
│ │ │ │ -
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Implementations of the inverse operator interface.
│ │ │ │ -
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ -
Templates characterizing the type of a solver.
│ │ │ │ -
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition io.hh:89
│ │ │ │ +
87 template< class Matrix >
│ │ │ │ +
│ │ │ │ +
88 inline void bildl_decompose ( Matrix &A )
│ │ │ │ +
89 {
│ │ │ │ +
90 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
91 {
│ │ │ │ +
92 auto &&A_i = *i;
│ │ │ │ +
93
│ │ │ │ +
94 auto ij = A_i.begin();
│ │ │ │ +
95 for( ; ij.index() < i.index(); ++ij )
│ │ │ │ +
96 {
│ │ │ │ +
97 auto &&A_ij = *ij;
│ │ │ │ +
98 auto &&A_j = A[ ij.index() ];
│ │ │ │ +
99
│ │ │ │ +
100 // store L_ij Dj in A_ij (note: for k < i: A_kj = L_kj)
│ │ │ │ +
101 // L_ij Dj = A_ij - \sum_{k < j} (L_ik D_k) L_jk^T
│ │ │ │ +
102 auto ik = A_i.begin();
│ │ │ │ +
103 auto jk = A_j.begin();
│ │ │ │ +
104 while( (ik != ij) && (jk.index() < ij.index()) )
│ │ │ │ +
105 {
│ │ │ │ +
106 if( ik.index() == jk.index() )
│ │ │ │ +
107 {
│ │ │ │ +
108 bildl_subtractBCT(*ik, *jk, A_ij);
│ │ │ │ +
109 ++ik; ++jk;
│ │ │ │ +
110 }
│ │ │ │ +
111 else if( ik.index() < jk.index() )
│ │ │ │ +
112 ++ik;
│ │ │ │ +
113 else
│ │ │ │ +
114 ++jk;
│ │ │ │ +
115 }
│ │ │ │ +
116 }
│ │ │ │ +
117
│ │ │ │ +
118 if( ij.index() != i.index() )
│ │ │ │ +
119 DUNE_THROW( ISTLError, "diagonal entry missing" );
│ │ │ │ +
120
│ │ │ │ +
121 // update diagonal and multiply A_ij by D_j^{-1}
│ │ │ │ +
122 auto &&A_ii = *ij;
│ │ │ │ +
123 for( auto ik = A_i.begin(); ik != ij; ++ik )
│ │ │ │ +
124 {
│ │ │ │ +
125 auto &&A_ik = *ik;
│ │ │ │ +
126 const auto &A_k = A[ ik.index() ];
│ │ │ │ +
127
│ │ │ │ +
128 auto B = A_ik;
│ │ │ │ +
129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() )) );
│ │ │ │ +
130 bildl_subtractBCT( B, A_ik, A_ii );
│ │ │ │ +
131 }
│ │ │ │ +
132 try
│ │ │ │ +
133 {
│ │ │ │ +
134 Impl::asMatrix(A_ii).invert();
│ │ │ │ +
135 }
│ │ │ │ +
136 catch( const Dune::FMatrixError &e )
│ │ │ │ +
137 {
│ │ │ │ +
138 DUNE_THROW( MatrixBlockError, "ILDL failed to invert matrix block A[" << i.index() << "][" << ij.index() << "]" << e.what(); th__ex.r = i.index(); th__ex.c = ij.index() );
│ │ │ │ +
139 }
│ │ │ │ +
140 }
│ │ │ │ +
141 }
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
143
│ │ │ │ +
144
│ │ │ │ +
145 // bildl_backsolve
│ │ │ │ +
146 // ---------------
│ │ │ │ +
147
│ │ │ │ +
148 template< class Matrix, class X, class Y >
│ │ │ │ +
│ │ │ │ +
149 inline void bildl_backsolve ( const Matrix &A, X &v, const Y &d, bool isLowerTriangular = false )
│ │ │ │ +
150 {
│ │ │ │ +
151 // solve L v = d, note: Lii = I
│ │ │ │ +
152 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
153 {
│ │ │ │ +
154 const auto &A_i = *i;
│ │ │ │ +
155 v[ i.index() ] = d[ i.index() ];
│ │ │ │ +
156 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
│ │ │ │ +
157 {
│ │ │ │ +
158 auto&& vi = Impl::asVector( v[ i.index() ] );
│ │ │ │ +
159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi);
│ │ │ │ +
160 }
│ │ │ │ +
161 }
│ │ │ │ +
162
│ │ │ │ +
163 // solve D w = v, note: diagonal stores Dii^{-1}
│ │ │ │ +
164 if( isLowerTriangular )
│ │ │ │ +
165 {
│ │ │ │ +
166 // The matrix is lower triangular, so the diagonal entry is the
│ │ │ │ +
167 // last one in each row.
│ │ │ │ +
168 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
169 {
│ │ │ │ +
170 const auto &A_i = *i;
│ │ │ │ +
171 const auto ii = A_i.beforeEnd();
│ │ │ │ +
172 assert( ii.index() == i.index() );
│ │ │ │ +
173 // We need to be careful here: Directly using
│ │ │ │ +
174 // auto rhs = Impl::asVector(v[ i.index() ]);
│ │ │ │ +
175 // is not OK in case this is a proxy. Hence
│ │ │ │ +
176 // we first have to copy the value. Notice that
│ │ │ │ +
177 // this is still not OK, if the vector type itself returns
│ │ │ │ +
178 // proxy references.
│ │ │ │ +
179 auto rhsValue = v[ i.index() ];
│ │ │ │ +
180 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ +
181 auto&& vi = Impl::asVector( v[ i.index() ] );
│ │ │ │ +
182 Impl::asMatrix(*ii).mv(rhs, vi);
│ │ │ │ +
183 }
│ │ │ │ +
184 }
│ │ │ │ +
185 else
│ │ │ │ +
186 {
│ │ │ │ +
187 // Without assumptions on the sparsity pattern we have to search
│ │ │ │ +
188 // for the diagonal entry in each row.
│ │ │ │ +
189 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
│ │ │ │ +
190 {
│ │ │ │ +
191 const auto &A_i = *i;
│ │ │ │ +
192 const auto ii = A_i.find( i.index() );
│ │ │ │ +
193 assert( ii.index() == i.index() );
│ │ │ │ +
194 // We need to be careful here: Directly using
│ │ │ │ +
195 // auto rhs = Impl::asVector(v[ i.index() ]);
│ │ │ │ +
196 // is not OK in case this is a proxy. Hence
│ │ │ │ +
197 // we first have to copy the value. Notice that
│ │ │ │ +
198 // this is still not OK, if the vector type itself returns
│ │ │ │ +
199 // proxy references.
│ │ │ │ +
200 auto rhsValue = v[ i.index() ];
│ │ │ │ +
201 auto&& rhs = Impl::asVector(rhsValue);
│ │ │ │ +
202 auto&& vi = Impl::asVector( v[ i.index() ] );
│ │ │ │ +
203 Impl::asMatrix(*ii).mv(rhs, vi);
│ │ │ │ +
204 }
│ │ │ │ +
205 }
│ │ │ │ +
206
│ │ │ │ +
207 // solve L^T v = w, note: only L is stored
│ │ │ │ +
208 // note: we perform the operation column-wise from right to left
│ │ │ │ +
209 for( auto i = A.beforeEnd(), iend = A.beforeBegin(); i != iend; --i )
│ │ │ │ +
210 {
│ │ │ │ +
211 const auto &A_i = *i;
│ │ │ │ +
212 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
│ │ │ │ +
213 {
│ │ │ │ +
214 auto&& vij = Impl::asVector( v[ ij.index() ] );
│ │ │ │ +
215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij);
│ │ │ │ +
216 }
│ │ │ │ +
217 }
│ │ │ │ +
218 }
│ │ │ │ +
│ │ │ │ +
219
│ │ │ │ +
220} // namespace Dune
│ │ │ │ +
221
│ │ │ │ +
222#endif // #ifndef DUNE_ISTL_ILDL_HH
│ │ │ │ +
The incomplete LU factorization kernels.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
A::size_type size_type
The type for the index access and the size.
Definition bcrsmatrix.hh:500
│ │ │ │ -
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │ -
void mv(const X &x, Y &y) const
y = A x
Definition bcrsmatrix.hh:1612
│ │ │ │ -
size_type N() const
number of rows (counted in blocks)
Definition bcrsmatrix.hh:1972
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ -
Iterative eigenvalue algorithms based on power iteration.
Definition poweriteration.hh:176
│ │ │ │ -
std::unique_ptr< BCRSMatrix > itMatrix_
Definition poweriteration.hh:1034
│ │ │ │ -
PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete
│ │ │ │ -
Impl::ScalingLinearOperator< BlockVector > ScalingOperator
Definition poweriteration.hh:181
│ │ │ │ -
const std::string blank_
Definition poweriteration.hh:1043
│ │ │ │ -
Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum
Definition poweriteration.hh:182
│ │ │ │ -
Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator
Definition poweriteration.hh:180
│ │ │ │ -
void applyInverseIteration(const Real &epsilon, ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const
Perform the inverse iteration algorithm to compute an approximation lambda of the least dominant (i....
Definition poweriteration.hh:355
│ │ │ │ -
void applyTLIMEIteration(const Real &gamma, const Real &eta, const Real &epsilon, ISTLLinearSolver &solver, const Real &delta, const std::size_t &m, bool &extrnl, BlockVector &x, Real &lambda) const
Perform the "two-level iterative method for eigenvalue calculations (TLIME)" iteration algorit...
Definition poweriteration.hh:691
│ │ │ │ -
IterationOperator & getIterationOperator()
Return the iteration operator (m_ - mu_*I).
Definition poweriteration.hh:925
│ │ │ │ -
OperatorSum itOperator_
Definition poweriteration.hh:1030
│ │ │ │ -
const BCRSMatrix & m_
Definition poweriteration.hh:1018
│ │ │ │ -
PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=1000, const unsigned int verbosity_level=0)
Construct from required parameters.
Definition poweriteration.hh:206
│ │ │ │ -
const unsigned int nIterationsMax_
Definition poweriteration.hh:1019
│ │ │ │ -
void applyPowerIteration(const Real &epsilon, BlockVector &x, Real &lambda) const
Perform the power iteration algorithm to compute an approximation lambda of the dominant (i....
Definition poweriteration.hh:260
│ │ │ │ -
OperatorSum IterationOperator
Type of iteration operator (m_ - mu_*I)
Definition poweriteration.hh:189
│ │ │ │ -
void applyRayleighQuotientIteration(const Real &epsilon, ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const
Perform the Rayleigh quotient iteration algorithm to compute an approximation lambda of an eigenvalue...
Definition poweriteration.hh:533
│ │ │ │ -
void applyInverseIteration(const Real &gamma, const Real &epsilon, ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const
Perform the inverse iteration with shift algorithm to compute an approximation lambda of the eigenval...
Definition poweriteration.hh:394
│ │ │ │ -
const ScalingOperator scalingOperator_
Definition poweriteration.hh:1029
│ │ │ │ -
void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const
Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I).
Definition poweriteration.hh:983
│ │ │ │ -
PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete
│ │ │ │ -
unsigned int getIterationCount() const
Return the number of iterations in last application of an algorithm.
Definition poweriteration.hh:959
│ │ │ │ -
const MatrixOperator matrixOperator_
Definition poweriteration.hh:1028
│ │ │ │ -
const BCRSMatrix & getIterationMatrix() const
Return the iteration matrix (m_ - mu_*I), provided on demand when needed (e.g. for direct solvers or ...
Definition poweriteration.hh:945
│ │ │ │ -
unsigned int nIterations_
Definition poweriteration.hh:1039
│ │ │ │ -
const unsigned int verbosity_level_
Definition poweriteration.hh:1022
│ │ │ │ -
const std::string title_
Definition poweriteration.hh:1042
│ │ │ │ -
BlockVector::field_type Real
Type of underlying field.
Definition poweriteration.hh:186
│ │ │ │ -
Real mu_
Definition poweriteration.hh:1025
│ │ │ │ +
void bildl_decompose(Matrix &A)
compute ILDL decomposition of a symmetric matrix A
Definition ildl.hh:88
│ │ │ │ +
void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
Definition ildl.hh:149
│ │ │ │ +
static void bildl_subtractBCT(const FieldMatrix< K, m, n > &B, const FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A)
Definition ildl.hh:24
│ │ │ │
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
A linear operator.
Definition operators.hh:67
│ │ │ │ -
X::field_type field_type
The field type of the operator.
Definition operators.hh:74
│ │ │ │ -
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
apply operator to x, scale and add:
│ │ │ │ -
virtual SolverCategory::Category category() const =0
Category of the linear operator (see SolverCategory::Category)
│ │ │ │ -
Y range_type
The type of the range of the operator.
Definition operators.hh:72
│ │ │ │ -
virtual void apply(const X &x, Y &y) const =0
apply operator to x: The input vector is consistent and the output must also be consistent on the in...
│ │ │ │ -
X domain_type
The type of the domain of the operator.
Definition operators.hh:70
│ │ │ │ -
Adapter to turn a matrix into a linear operator.
Definition operators.hh:137
│ │ │ │ -
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ -
static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
Definition solver.hh:524
│ │ │ │ -
Category
Definition solvercategory.hh:23
│ │ │ │ -
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
Error when performing an operation on a matrix block.
Definition istlexception.hh:52
│ │ │ │ +
A generic dynamic dense matrix.
Definition matrix.hh:561
│ │ │ │ +
RowIterator beforeBegin()
Definition matrix.hh:634
│ │ │ │ +
RowIterator beforeEnd()
Definition matrix.hh:627
│ │ │ │ +
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:620
│ │ │ │ +
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:614
│ │ │ │ +
Definition matrixutils.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,993 +1,266 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ -poweriteration.hh │ │ │ │ │ +ildl.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ -3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ -4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH │ │ │ │ │ -6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include // provides std::size_t │ │ │ │ │ -9#include // provides std::sqrt, std::abs │ │ │ │ │ -10 │ │ │ │ │ -11#include // provides std::is_same │ │ │ │ │ -12#include // provides std::cout, std::endl │ │ │ │ │ -13#include // provides std::numeric_limits │ │ │ │ │ -14#include // provides std::left, std::ios::left │ │ │ │ │ -15#include // provides std::setw, std::resetiosflags │ │ │ │ │ -16#include // provides std::unique_ptr │ │ │ │ │ -17#include // provides std::string │ │ │ │ │ -18 │ │ │ │ │ -19#include // provides DUNE_THROW(...) │ │ │ │ │ -20 │ │ │ │ │ -21#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> // provides Dune::blockLevel │ │ │ │ │ -22#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> // provides Dune::LinearOperator │ │ │ │ │ -23#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h> // provides Dune::SolverCategory:: │ │ │ │ │ -sequential │ │ │ │ │ -24#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_t_y_p_e_._h_h> // provides Dune::IsDirectSolver │ │ │ │ │ -25#include <_d_u_n_e_/_i_s_t_l_/_o_p_e_r_a_t_o_r_s_._h_h> // provides Dune::MatrixAdapter │ │ │ │ │ -26#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> // provides Dune::ISTLError │ │ │ │ │ -27#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> // provides Dune::printvector(...) │ │ │ │ │ -28#include <_d_u_n_e_/_i_s_t_l_/_s_o_l_v_e_r_s_._h_h> // provides Dune::InverseOperatorResult │ │ │ │ │ -29 │ │ │ │ │ -30namespace _D_u_n_e │ │ │ │ │ -31{ │ │ │ │ │ -32 │ │ │ │ │ -37 namespace Impl { │ │ │ │ │ -45 template │ │ │ │ │ -46 class ScalingLinearOperator : public _D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -47 { │ │ │ │ │ -48 public: │ │ │ │ │ -49 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ -50 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ -51 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ -52 │ │ │ │ │ -53 ScalingLinearOperator (field_type immutable_scaling, │ │ │ │ │ -54 const field_type& mutable_scaling) │ │ │ │ │ -55 : immutable_scaling_(immutable_scaling), │ │ │ │ │ -56 mutable_scaling_(mutable_scaling) │ │ │ │ │ -57 {} │ │ │ │ │ -58 │ │ │ │ │ -59 virtual void _a_p_p_l_y (const X& x, Y& y) const │ │ │ │ │ +3#ifndef DUNE_ISTL_ILDL_HH │ │ │ │ │ +4#define DUNE_ISTL_ILDL_HH │ │ │ │ │ +5 │ │ │ │ │ +6#include │ │ │ │ │ +7#include │ │ │ │ │ +8#include "_i_l_u_._h_h" │ │ │ │ │ +9 │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +19 │ │ │ │ │ +20 // bildl_subtractBCT │ │ │ │ │ +21 // ----------------- │ │ │ │ │ +22 │ │ │ │ │ +23 template< class K, int m, int n > │ │ │ │ │ +_2_4 inline static void _b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T ( const _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _m_,_ _n_ _> &B, │ │ │ │ │ +const _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _m_,_ _n_ _> &CT, _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _m_,_ _n_ _> &A ) │ │ │ │ │ +25 { │ │ │ │ │ +26 for( int i = 0; i < m; ++i ) │ │ │ │ │ +27 { │ │ │ │ │ +28 for( int j = 0; j < n; ++j ) │ │ │ │ │ +29 { │ │ │ │ │ +30 for( int k = 0; k < n; ++k ) │ │ │ │ │ +31 A[ i ][ j ] -= B[ i ][ k ] * CT[ j ][ k ]; │ │ │ │ │ +32 } │ │ │ │ │ +33 } │ │ │ │ │ +34 } │ │ │ │ │ +35 │ │ │ │ │ +36 template< class K > │ │ │ │ │ +_3_7 inline static void _b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T ( const K &B, const K &CT, K &A, │ │ │ │ │ +38 typename std::enable_if_t::value>* sfinae = nullptr ) │ │ │ │ │ +39 { │ │ │ │ │ +40 A -= B * CT; │ │ │ │ │ +41 } │ │ │ │ │ +42 │ │ │ │ │ +43 template< class Matrix > │ │ │ │ │ +_4_4 inline static void _b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T ( const _M_a_t_r_i_x &B, const _M_a_t_r_i_x &CT, │ │ │ │ │ +_M_a_t_r_i_x &A, │ │ │ │ │ +45 typename std::enable_if_t::value>* sfinae = nullptr │ │ │ │ │ +) │ │ │ │ │ +46 { │ │ │ │ │ +47 for( auto i = A._b_e_g_i_n(), iend = A._e_n_d(); i != iend; ++i ) │ │ │ │ │ +48 { │ │ │ │ │ +49 auto &&A_i = *i; │ │ │ │ │ +50 auto &&B_i = B[ i.index() ]; │ │ │ │ │ +51 const auto ikend = B_i._e_n_d(); │ │ │ │ │ +52 for( auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j ) │ │ │ │ │ +53 { │ │ │ │ │ +54 auto &&A_ij = *j; │ │ │ │ │ +55 auto &&CT_j = CT[ j.index() ]; │ │ │ │ │ +56 const auto jkend = CT_j._e_n_d(); │ │ │ │ │ +57 for( auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk != │ │ │ │ │ +jkend); ) │ │ │ │ │ +58 { │ │ │ │ │ +59 if( ik.index() == jk.index() ) │ │ │ │ │ 60 { │ │ │ │ │ -61 y = x; │ │ │ │ │ -62 y *= immutable_scaling_*mutable_scaling_; │ │ │ │ │ +61 _b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T( *ik, *jk, A_ij ); │ │ │ │ │ +62 ++ik; ++jk; │ │ │ │ │ 63 } │ │ │ │ │ -64 │ │ │ │ │ -65 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (field_type alpha, const X& x, Y& y) const │ │ │ │ │ -66 { │ │ │ │ │ -67 X temp(x); │ │ │ │ │ -68 temp *= immutable_scaling_*mutable_scaling_; │ │ │ │ │ -69 y.axpy(alpha,temp); │ │ │ │ │ +64 else if( ik.index() < jk.index() ) │ │ │ │ │ +65 ++ik; │ │ │ │ │ +66 else │ │ │ │ │ +67 ++jk; │ │ │ │ │ +68 } │ │ │ │ │ +69 } │ │ │ │ │ 70 } │ │ │ │ │ -71 │ │ │ │ │ -73 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -74 { │ │ │ │ │ -75 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -76 } │ │ │ │ │ +71 } │ │ │ │ │ +72 │ │ │ │ │ +73 │ │ │ │ │ +74 │ │ │ │ │ +75 // bildl_decompose │ │ │ │ │ +76 // --------------- │ │ │ │ │ 77 │ │ │ │ │ -78 protected: │ │ │ │ │ -79 const field_type immutable_scaling_; │ │ │ │ │ -80 const field_type& mutable_scaling_; │ │ │ │ │ -81 }; │ │ │ │ │ -82 │ │ │ │ │ -83 │ │ │ │ │ -92 template │ │ │ │ │ -93 class LinearOperatorSum │ │ │ │ │ -94 : public _D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +87 template< class Matrix > │ │ │ │ │ +_8_8 inline void _b_i_l_d_l___d_e_c_o_m_p_o_s_e ( _M_a_t_r_i_x &A ) │ │ │ │ │ +89 { │ │ │ │ │ +90 for( auto i = A._b_e_g_i_n(), iend = A._e_n_d(); i != iend; ++i ) │ │ │ │ │ +91 { │ │ │ │ │ +92 auto &&A_i = *i; │ │ │ │ │ +93 │ │ │ │ │ +94 auto ij = A_i.begin(); │ │ │ │ │ +95 for( ; ij.index() < i.index(); ++ij ) │ │ │ │ │ 96 { │ │ │ │ │ -97 public: │ │ │ │ │ -98 typedef typename OP1::domain_type domain_type; │ │ │ │ │ -99 typedef typename OP1::range_type range_type; │ │ │ │ │ -100 typedef typename domain_type::field_type field_type; │ │ │ │ │ -101 │ │ │ │ │ -102 LinearOperatorSum (const OP1& op1, const OP2& op2) │ │ │ │ │ -103 : op1_(op1), op2_(op2) │ │ │ │ │ -104 { │ │ │ │ │ -105 static_assert(std::is_same::value, │ │ │ │ │ -106 "Domain type of both operators doesn't match!"); │ │ │ │ │ -107 static_assert(std::is_same::value, │ │ │ │ │ -108 "Range type of both operators doesn't match!"); │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -111 virtual void _a_p_p_l_y (const domain_type& x, range_type& y) const │ │ │ │ │ -112 { │ │ │ │ │ -113 op1_.apply(x,y); │ │ │ │ │ -114 op2_.applyscaleadd(1.0,x,y); │ │ │ │ │ +97 auto &&A_ij = *ij; │ │ │ │ │ +98 auto &&A_j = A[ ij.index() ]; │ │ │ │ │ +99 │ │ │ │ │ +100 // store L_ij Dj in A_ij (note: for k < i: A_kj = L_kj) │ │ │ │ │ +101 // L_ij Dj = A_ij - \sum_{k < j} (L_ik D_k) L_jk^T │ │ │ │ │ +102 auto ik = A_i._b_e_g_i_n(); │ │ │ │ │ +103 auto jk = A_j.begin(); │ │ │ │ │ +104 while( (ik != ij) && (jk.index() < ij.index()) ) │ │ │ │ │ +105 { │ │ │ │ │ +106 if( ik.index() == jk.index() ) │ │ │ │ │ +107 { │ │ │ │ │ +108 _b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T(*ik, *jk, A_ij); │ │ │ │ │ +109 ++ik; ++jk; │ │ │ │ │ +110 } │ │ │ │ │ +111 else if( ik.index() < jk.index() ) │ │ │ │ │ +112 ++ik; │ │ │ │ │ +113 else │ │ │ │ │ +114 ++jk; │ │ │ │ │ 115 } │ │ │ │ │ -116 │ │ │ │ │ -117 virtual void _a_p_p_l_y_s_c_a_l_e_a_d_d (field_type alpha, │ │ │ │ │ -118 const domain_type& x, range_type& y) const │ │ │ │ │ -119 { │ │ │ │ │ -120 range_type temp(y); │ │ │ │ │ -121 op1_.apply(x,temp); │ │ │ │ │ -122 op2_.applyscaleadd(1.0,x,temp); │ │ │ │ │ -123 y.axpy(alpha,temp); │ │ │ │ │ -124 } │ │ │ │ │ -125 │ │ │ │ │ -127 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ -128 { │ │ │ │ │ -129 return _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l; │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -132 protected: │ │ │ │ │ -133 const OP1& op1_; │ │ │ │ │ -134 const OP2& op2_; │ │ │ │ │ -135 }; │ │ │ │ │ -136 } // end namespace Impl │ │ │ │ │ -137 │ │ │ │ │ -174 template │ │ │ │ │ -_1_7_5 class _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -176 { │ │ │ │ │ -177 protected: │ │ │ │ │ -178 // Type definitions for type of iteration operator (m_ - mu_*I) │ │ │ │ │ -179 typedef typename _D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r_<_B_C_R_S_M_a_t_r_i_x_,_B_l_o_c_k_V_e_c_t_o_r_,_B_l_o_c_k_V_e_c_t_o_r_> │ │ │ │ │ -_1_8_0 _M_a_t_r_i_x_O_p_e_r_a_t_o_r; │ │ │ │ │ -_1_8_1 typedef Impl::ScalingLinearOperator _S_c_a_l_i_n_g_O_p_e_r_a_t_o_r; │ │ │ │ │ -_1_8_2 typedef Impl::LinearOperatorSum │ │ │ │ │ -_O_p_e_r_a_t_o_r_S_u_m; │ │ │ │ │ -183 │ │ │ │ │ -184 public: │ │ │ │ │ -_1_8_6 typedef typename _B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e _R_e_a_l; │ │ │ │ │ -187 │ │ │ │ │ -_1_8_9 typedef _O_p_e_r_a_t_o_r_S_u_m _I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r; │ │ │ │ │ -190 │ │ │ │ │ -191 public: │ │ │ │ │ -_2_0_6 _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s (const _B_C_R_S_M_a_t_r_i_x& m, │ │ │ │ │ -207 const unsigned int nIterationsMax = 1000, │ │ │ │ │ -208 const unsigned int verbosity_level = 0) │ │ │ │ │ -209 : _m__(m), _n_I_t_e_r_a_t_i_o_n_s_M_a_x__(nIterationsMax), │ │ │ │ │ -210 _v_e_r_b_o_s_i_t_y___l_e_v_e_l__(verbosity_level), │ │ │ │ │ -211 _m_u__(0.0), │ │ │ │ │ -212 _m_a_t_r_i_x_O_p_e_r_a_t_o_r__(_m__), │ │ │ │ │ -213 _s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__(-1.0,_m_u__), │ │ │ │ │ -214 _i_t_O_p_e_r_a_t_o_r__(_m_a_t_r_i_x_O_p_e_r_a_t_o_r__,_s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__), │ │ │ │ │ -215 _n_I_t_e_r_a_t_i_o_n_s__(0), │ │ │ │ │ -216 _t_i_t_l_e__(" PowerIteration_Algorithms: "), │ │ │ │ │ -217 _b_l_a_n_k__(_t_i_t_l_e__.length(),' ') │ │ │ │ │ -218 { │ │ │ │ │ -219 // assert that BCRSMatrix type has blocklevel 2 │ │ │ │ │ -220 static_assert │ │ │ │ │ -221 (blockLevel() == 2, │ │ │ │ │ -222 "Only BCRSMatrices with blocklevel 2 are supported."); │ │ │ │ │ -223 │ │ │ │ │ -224 // assert that BCRSMatrix type has square blocks │ │ │ │ │ -225 static_assert │ │ │ │ │ -226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols, │ │ │ │ │ -227 "Only BCRSMatrices with square blocks are supported."); │ │ │ │ │ -228 │ │ │ │ │ -229 // assert that m_ is square │ │ │ │ │ -230 const int nrows = _m__._M() * BCRSMatrix::block_type::rows; │ │ │ │ │ -231 const int ncols = _m__._N() * BCRSMatrix::block_type::cols; │ │ │ │ │ -232 if (nrows != ncols) │ │ │ │ │ -233 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ -234 << nrows << "x" << ncols << ")."); │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -_2_4_0 _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s (const _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s&) = delete; │ │ │ │ │ -241 │ │ │ │ │ -245 _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s& │ │ │ │ │ -_2_4_6 _o_p_e_r_a_t_o_r_=_ (const _P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s&) = delete; │ │ │ │ │ -247 │ │ │ │ │ -_2_6_0 inline void _a_p_p_l_y_P_o_w_e_r_I_t_e_r_a_t_i_o_n (const _R_e_a_l& epsilon, │ │ │ │ │ -261 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -262 { │ │ │ │ │ -263 // print verbosity information │ │ │ │ │ -264 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -265 std::cout << _t_i_t_l_e__ │ │ │ │ │ -266 << "Performing power iteration approximating " │ │ │ │ │ -267 << "the dominant eigenvalue." << std::endl; │ │ │ │ │ -268 │ │ │ │ │ -269 // allocate memory for auxiliary variables │ │ │ │ │ -270 _B_l_o_c_k_V_e_c_t_o_r y(x); │ │ │ │ │ -271 _B_l_o_c_k_V_e_c_t_o_r temp(x); │ │ │ │ │ -272 │ │ │ │ │ -273 // perform power iteration │ │ │ │ │ -274 x *= (1.0 / x.two_norm()); │ │ │ │ │ -275 _m__._m_v(x,y); │ │ │ │ │ -276 _R_e_a_l r_norm = std::numeric_limits::max(); │ │ │ │ │ -277 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ -278 while (r_norm > epsilon) │ │ │ │ │ -279 { │ │ │ │ │ -280 // update and check number of iterations │ │ │ │ │ -281 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ -282 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Power iteration did not converge " │ │ │ │ │ -283 << "in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ << " iterations " │ │ │ │ │ -284 << "(║residual║_2 = " << r_norm << ", epsilon = " │ │ │ │ │ -285 << epsilon << ")."); │ │ │ │ │ -286 │ │ │ │ │ -287 // do one iteration of the power iteration algorithm │ │ │ │ │ -288 // (use that y = m_ * x) │ │ │ │ │ -289 x = y; │ │ │ │ │ -290 x *= (1.0 / y.two_norm()); │ │ │ │ │ -291 │ │ │ │ │ -292 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ -293 _m__._m_v(x,y); │ │ │ │ │ -294 lambda = x * y; │ │ │ │ │ -295 │ │ │ │ │ -296 // get norm of residual (use that y = m_ * x) │ │ │ │ │ -297 temp = y; │ │ │ │ │ -298 temp.axpy(-lambda,x); │ │ │ │ │ -299 r_norm = temp.two_norm(); │ │ │ │ │ -300 │ │ │ │ │ -301 // print verbosity information │ │ │ │ │ -302 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -303 std::cout << _b_l_a_n_k__ << std::left │ │ │ │ │ -304 << "iteration " << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ -305 << " (║residual║_2 = " << std::setw(11) << r_norm │ │ │ │ │ -306 << "): λ = " << lambda << std::endl │ │ │ │ │ -307 << std::resetiosflags(std::ios::left); │ │ │ │ │ -308 } │ │ │ │ │ -309 │ │ │ │ │ -310 // print verbosity information │ │ │ │ │ -311 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -312 { │ │ │ │ │ -313 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -314 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -315 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -316 << "λ = " << lambda << std::endl; │ │ │ │ │ -317 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -318 { │ │ │ │ │ -319 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ -320 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -321 } │ │ │ │ │ -322 } │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -353 template │ │ │ │ │ -_3_5_5 inline void _a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n (const _R_e_a_l& epsilon, │ │ │ │ │ -356 ISTLLinearSolver& solver, │ │ │ │ │ -357 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -358 { │ │ │ │ │ -359 constexpr _R_e_a_l gamma = 0.0; │ │ │ │ │ -360 _a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n(gamma,epsilon,solver,x,lambda); │ │ │ │ │ -361 } │ │ │ │ │ -362 │ │ │ │ │ -392 template │ │ │ │ │ -_3_9_4 inline void _a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n (const _R_e_a_l& gamma, │ │ │ │ │ -395 const _R_e_a_l& epsilon, │ │ │ │ │ -396 ISTLLinearSolver& solver, │ │ │ │ │ -397 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -398 { │ │ │ │ │ -399 // print verbosity information │ │ │ │ │ -400 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -401 { │ │ │ │ │ -402 std::cout << _t_i_t_l_e__; │ │ │ │ │ -403 if (gamma == 0.0) │ │ │ │ │ -404 std::cout << "Performing inverse iteration approximating " │ │ │ │ │ -405 << "the least dominant eigenvalue." << std::endl; │ │ │ │ │ -406 else │ │ │ │ │ -407 std::cout << "Performing inverse iteration with shift " │ │ │ │ │ -408 << "gamma = " << gamma << " approximating the " │ │ │ │ │ -409 << "eigenvalue closest to gamma." << std::endl; │ │ │ │ │ -410 } │ │ │ │ │ -411 │ │ │ │ │ -412 // initialize iteration operator, │ │ │ │ │ -413 // initialize iteration matrix when needed │ │ │ │ │ -414 _u_p_d_a_t_e_S_h_i_f_t_M_u(gamma,solver); │ │ │ │ │ -415 │ │ │ │ │ -416 // allocate memory for linear solver statistics │ │ │ │ │ -417 _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t solver_statistics; │ │ │ │ │ -418 │ │ │ │ │ -419 // allocate memory for auxiliary variables │ │ │ │ │ -420 _B_l_o_c_k_V_e_c_t_o_r y(x); │ │ │ │ │ -421 _R_e_a_l y_norm; │ │ │ │ │ -422 _B_l_o_c_k_V_e_c_t_o_r temp(x); │ │ │ │ │ -423 │ │ │ │ │ -424 // perform inverse iteration with shift │ │ │ │ │ -425 x *= (1.0 / x.two_norm()); │ │ │ │ │ -426 _R_e_a_l r_norm = std::numeric_limits::max(); │ │ │ │ │ -427 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ -428 while (r_norm > epsilon) │ │ │ │ │ -429 { │ │ │ │ │ -430 // update and check number of iterations │ │ │ │ │ -431 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ -432 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Inverse iteration " │ │ │ │ │ -433 << (gamma != 0.0 ? "with shift " : "") << "did not " │ │ │ │ │ -434 << "converge in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ << " iterations " │ │ │ │ │ -435 << "(║residual║_2 = " << r_norm << ", epsilon = " │ │ │ │ │ -436 << epsilon << ")."); │ │ │ │ │ -437 │ │ │ │ │ -438 // do one iteration of the inverse iteration with shift algorithm, │ │ │ │ │ -439 // part 1: solve (m_ - gamma*I) * y = x for y │ │ │ │ │ -440 // (protect x from being changed) │ │ │ │ │ -441 temp = x; │ │ │ │ │ -442 solver.apply(y,temp,solver_statistics); │ │ │ │ │ -443 │ │ │ │ │ -444 // get norm of y │ │ │ │ │ -445 y_norm = y.two_norm(); │ │ │ │ │ -446 │ │ │ │ │ -447 // compile time switch between accuracy and efficiency │ │ │ │ │ -448 if (avoidLinSolverCrime) │ │ │ │ │ -449 { │ │ │ │ │ -450 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ -451 // (use that x_new = y / y_norm) │ │ │ │ │ -452 _m__._m_v(y,temp); │ │ │ │ │ -453 lambda = (y * temp) / (y_norm * y_norm); │ │ │ │ │ -454 │ │ │ │ │ -455 // get norm of residual │ │ │ │ │ -456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y) │ │ │ │ │ -457 temp.axpy(-lambda,y); │ │ │ │ │ -458 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ -459 } │ │ │ │ │ -460 else │ │ │ │ │ -461 { │ │ │ │ │ -462 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ -463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x) │ │ │ │ │ -464 lambda = gamma + (y * x) / (y_norm * y_norm); │ │ │ │ │ -465 │ │ │ │ │ -466 // get norm of residual │ │ │ │ │ -467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x) │ │ │ │ │ -468 temp = x; temp.axpy(gamma-lambda,y); │ │ │ │ │ -469 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ -470 } │ │ │ │ │ -471 │ │ │ │ │ -472 // do one iteration of the inverse iteration with shift algorithm, │ │ │ │ │ -473 // part 2: update x │ │ │ │ │ -474 x = y; │ │ │ │ │ -475 x *= (1.0 / y_norm); │ │ │ │ │ -476 │ │ │ │ │ -477 // print verbosity information │ │ │ │ │ -478 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -479 std::cout << _b_l_a_n_k__ << std::left │ │ │ │ │ -480 << "iteration " << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ -481 << " (║residual║_2 = " << std::setw(11) << r_norm │ │ │ │ │ -482 << "): λ = " << lambda << std::endl │ │ │ │ │ -483 << std::resetiosflags(std::ios::left); │ │ │ │ │ -484 } │ │ │ │ │ -485 │ │ │ │ │ -486 // print verbosity information │ │ │ │ │ -487 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -488 { │ │ │ │ │ -489 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -490 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -491 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -492 << "λ = " << lambda << std::endl; │ │ │ │ │ -493 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -494 { │ │ │ │ │ -495 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ -496 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -497 } │ │ │ │ │ -498 } │ │ │ │ │ -499 } │ │ │ │ │ -500 │ │ │ │ │ -531 template │ │ │ │ │ -_5_3_3 inline void _a_p_p_l_y_R_a_y_l_e_i_g_h_Q_u_o_t_i_e_n_t_I_t_e_r_a_t_i_o_n (const _R_e_a_l& epsilon, │ │ │ │ │ -534 ISTLLinearSolver& solver, │ │ │ │ │ -535 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -536 { │ │ │ │ │ -537 // print verbosity information │ │ │ │ │ -538 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -539 std::cout << _t_i_t_l_e__ │ │ │ │ │ -540 << "Performing Rayleigh quotient iteration for " │ │ │ │ │ -541 << "estimated eigenvalue " << lambda << "." << std::endl; │ │ │ │ │ -542 │ │ │ │ │ -543 // allocate memory for linear solver statistics │ │ │ │ │ -544 _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t solver_statistics; │ │ │ │ │ -545 │ │ │ │ │ -546 // allocate memory for auxiliary variables │ │ │ │ │ -547 _B_l_o_c_k_V_e_c_t_o_r y(x); │ │ │ │ │ -548 _R_e_a_l y_norm; │ │ │ │ │ -549 _R_e_a_l lambda_update; │ │ │ │ │ -550 _B_l_o_c_k_V_e_c_t_o_r temp(x); │ │ │ │ │ -551 │ │ │ │ │ -552 // perform Rayleigh quotient iteration │ │ │ │ │ -553 x *= (1.0 / x.two_norm()); │ │ │ │ │ -554 _R_e_a_l r_norm = std::numeric_limits::max(); │ │ │ │ │ -555 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ -556 while (r_norm > epsilon) │ │ │ │ │ -557 { │ │ │ │ │ -558 // update and check number of iterations │ │ │ │ │ -559 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ -560 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Rayleigh quotient iteration did not " │ │ │ │ │ -561 << "converge in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ << " iterations " │ │ │ │ │ -562 << "(║residual║_2 = " << r_norm << ", epsilon = " │ │ │ │ │ -563 << epsilon << ")."); │ │ │ │ │ -564 │ │ │ │ │ -565 // update iteration operator, │ │ │ │ │ -566 // update iteration matrix when needed │ │ │ │ │ -567 _u_p_d_a_t_e_S_h_i_f_t_M_u(lambda,solver); │ │ │ │ │ -568 │ │ │ │ │ -569 // do one iteration of the Rayleigh quotient iteration algorithm, │ │ │ │ │ -570 // part 1: solve (m_ - lambda*I) * y = x for y │ │ │ │ │ -571 // (protect x from being changed) │ │ │ │ │ -572 temp = x; │ │ │ │ │ -573 solver.apply(y,temp,solver_statistics); │ │ │ │ │ -574 │ │ │ │ │ -575 // get norm of y │ │ │ │ │ -576 y_norm = y.two_norm(); │ │ │ │ │ -577 │ │ │ │ │ -578 // compile time switch between accuracy and efficiency │ │ │ │ │ -579 if (avoidLinSolverCrime) │ │ │ │ │ -580 { │ │ │ │ │ -581 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ -582 // (use that x_new = y / y_norm) │ │ │ │ │ -583 _m__._m_v(y,temp); │ │ │ │ │ -584 lambda = (y * temp) / (y_norm * y_norm); │ │ │ │ │ -585 │ │ │ │ │ -586 // get norm of residual │ │ │ │ │ -587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y) │ │ │ │ │ -588 temp.axpy(-lambda,y); │ │ │ │ │ -589 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ -590 } │ │ │ │ │ -591 else │ │ │ │ │ -592 { │ │ │ │ │ -593 // get approximated eigenvalue lambda via the Rayleigh quotient │ │ │ │ │ -594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x) │ │ │ │ │ -595 lambda_update = (y * x) / (y_norm * y_norm); │ │ │ │ │ -596 lambda += lambda_update; │ │ │ │ │ -597 │ │ │ │ │ -598 // get norm of residual │ │ │ │ │ -599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x) │ │ │ │ │ -600 temp = x; temp.axpy(-lambda_update,y); │ │ │ │ │ -601 r_norm = temp.two_norm() / y_norm; │ │ │ │ │ -602 } │ │ │ │ │ -603 │ │ │ │ │ -604 // do one iteration of the Rayleigh quotient iteration algorithm, │ │ │ │ │ -605 // part 2: update x │ │ │ │ │ -606 x = y; │ │ │ │ │ -607 x *= (1.0 / y_norm); │ │ │ │ │ -608 │ │ │ │ │ -609 // print verbosity information │ │ │ │ │ -610 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -611 std::cout << _b_l_a_n_k__ << std::left │ │ │ │ │ -612 << "iteration " << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ -613 << " (║residual║_2 = " << std::setw(11) << r_norm │ │ │ │ │ -614 << "): λ = " << lambda << std::endl │ │ │ │ │ -615 << std::resetiosflags(std::ios::left); │ │ │ │ │ -616 } │ │ │ │ │ -617 │ │ │ │ │ -618 // print verbosity information │ │ │ │ │ -619 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -620 { │ │ │ │ │ -621 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -622 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -623 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -624 << "λ = " << lambda << std::endl; │ │ │ │ │ -625 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -626 { │ │ │ │ │ -627 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ -628 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -629 } │ │ │ │ │ -630 } │ │ │ │ │ -631 } │ │ │ │ │ -632 │ │ │ │ │ -689 template │ │ │ │ │ -_6_9_1 inline void _a_p_p_l_y_T_L_I_M_E_I_t_e_r_a_t_i_o_n (const _R_e_a_l& gamma, const _R_e_a_l& eta, │ │ │ │ │ -692 const _R_e_a_l& epsilon, │ │ │ │ │ -693 ISTLLinearSolver& solver, │ │ │ │ │ -694 const _R_e_a_l& delta, const std::size_t& m, │ │ │ │ │ -695 bool& extrnl, │ │ │ │ │ -696 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -697 { │ │ │ │ │ -698 // use same variable names as in [Szyld, 1988] │ │ │ │ │ -699 _B_l_o_c_k_V_e_c_t_o_r& x_s = x; │ │ │ │ │ -700 _R_e_a_l& mu_s = lambda; │ │ │ │ │ -701 │ │ │ │ │ -702 // print verbosity information │ │ │ │ │ -703 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -704 std::cout << _t_i_t_l_e__ │ │ │ │ │ -705 << "Performing TLIME iteration for " │ │ │ │ │ -706 << "estimated eigenvalue in the " │ │ │ │ │ -707 << "interval (" << gamma - eta << "," │ │ │ │ │ -708 << gamma + eta << ")." << std::endl; │ │ │ │ │ -709 │ │ │ │ │ -710 // allocate memory for linear solver statistics │ │ │ │ │ -711 _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t solver_statistics; │ │ │ │ │ -712 │ │ │ │ │ -713 // allocate memory for auxiliary variables │ │ │ │ │ -714 bool doRQI; │ │ │ │ │ -715 _R_e_a_l mu; │ │ │ │ │ -716 _B_l_o_c_k_V_e_c_t_o_r y(x_s); │ │ │ │ │ -717 _R_e_a_l omega; │ │ │ │ │ -718 _R_e_a_l mu_s_old; │ │ │ │ │ -719 _R_e_a_l mu_s_update; │ │ │ │ │ -720 _B_l_o_c_k_V_e_c_t_o_r temp(x_s); │ │ │ │ │ -721 _R_e_a_l q_norm, r_norm; │ │ │ │ │ -722 │ │ │ │ │ -723 // perform TLIME iteration │ │ │ │ │ -724 x_s *= (1.0 / x_s.two_norm()); │ │ │ │ │ -725 extrnl = true; │ │ │ │ │ -726 doRQI = false; │ │ │ │ │ -727 r_norm = std::numeric_limits::max(); │ │ │ │ │ -728 _n_I_t_e_r_a_t_i_o_n_s__ = 0; │ │ │ │ │ -729 while (r_norm > epsilon) │ │ │ │ │ -730 { │ │ │ │ │ -731 // update and check number of iterations │ │ │ │ │ -732 if (++_n_I_t_e_r_a_t_i_o_n_s__ > _n_I_t_e_r_a_t_i_o_n_s_M_a_x__) │ │ │ │ │ -733 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"TLIME iteration did not " │ │ │ │ │ -734 << "converge in " << _n_I_t_e_r_a_t_i_o_n_s_M_a_x__ │ │ │ │ │ -735 << " iterations (║residual║_2 = " << r_norm │ │ │ │ │ -736 << ", epsilon = " << epsilon << ")."); │ │ │ │ │ -737 │ │ │ │ │ -738 // set shift for next iteration according to inverse iteration │ │ │ │ │ -739 // with shift (II) resp. Rayleigh quotient iteration (RQI) │ │ │ │ │ -740 if (doRQI) │ │ │ │ │ -741 mu = mu_s; │ │ │ │ │ -742 else │ │ │ │ │ -743 mu = gamma; │ │ │ │ │ -744 │ │ │ │ │ -745 // update II/RQI iteration operator, │ │ │ │ │ -746 // update II/RQI iteration matrix when needed │ │ │ │ │ -747 _u_p_d_a_t_e_S_h_i_f_t_M_u(mu,solver); │ │ │ │ │ -748 │ │ │ │ │ -749 // do one iteration of the II/RQI algorithm, │ │ │ │ │ -750 // part 1: solve (m_ - mu*I) * y = x for y │ │ │ │ │ -751 temp = x_s; │ │ │ │ │ -752 solver.apply(y,temp,solver_statistics); │ │ │ │ │ -753 │ │ │ │ │ -754 // do one iteration of the II/RQI algorithm, │ │ │ │ │ -755 // part 2: compute omega │ │ │ │ │ -756 omega = (1.0 / y.two_norm()); │ │ │ │ │ -757 │ │ │ │ │ -758 // backup the old Rayleigh quotient │ │ │ │ │ -759 mu_s_old = mu_s; │ │ │ │ │ -760 │ │ │ │ │ -761 // compile time switch between accuracy and efficiency │ │ │ │ │ -762 if (avoidLinSolverCrime) │ │ │ │ │ -763 { │ │ │ │ │ -764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue │ │ │ │ │ -765 // (use that x_new = y * omega) │ │ │ │ │ -766 _m__._m_v(y,temp); │ │ │ │ │ -767 mu_s = (y * temp) * (omega * omega); │ │ │ │ │ -768 │ │ │ │ │ -769 // get norm of "the residual with respect to the shift used by II", │ │ │ │ │ -770 // use normal representation of q │ │ │ │ │ -771 // (use that x_new = y * omega, use that temp = m_ * y) │ │ │ │ │ -772 temp.axpy(-gamma,y); │ │ │ │ │ -773 q_norm = temp.two_norm() * omega; │ │ │ │ │ -774 │ │ │ │ │ -775 // get norm of "the residual with respect to the Rayleigh quotient" │ │ │ │ │ -776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s); │ │ │ │ │ -777 // prevent that truncation errors invalidate the norm │ │ │ │ │ -778 // (we don't want to calculate sqrt of a negative number) │ │ │ │ │ -779 if (r_norm >= 0) │ │ │ │ │ -780 { │ │ │ │ │ -781 // use relation between the norms of r and q for efficiency │ │ │ │ │ -782 r_norm = std::sqrt(r_norm); │ │ │ │ │ -783 } │ │ │ │ │ -784 else │ │ │ │ │ -785 { │ │ │ │ │ -786 // use relation between r and q │ │ │ │ │ -787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q / │ │ │ │ │ -omega) │ │ │ │ │ -788 temp.axpy(gamma-mu_s,y); │ │ │ │ │ -789 r_norm = temp.two_norm() * omega; │ │ │ │ │ -790 } │ │ │ │ │ -791 } │ │ │ │ │ -792 else │ │ │ │ │ -793 { │ │ │ │ │ -794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue │ │ │ │ │ -795 if (!doRQI) │ │ │ │ │ -796 { │ │ │ │ │ -797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = │ │ │ │ │ -x_s) │ │ │ │ │ -798 mu_s = gamma + (y * x_s) * (omega * omega); │ │ │ │ │ -799 } │ │ │ │ │ -800 else │ │ │ │ │ -801 { │ │ │ │ │ -802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y │ │ │ │ │ -= x_s) │ │ │ │ │ -803 mu_s_update = (y * x_s) * (omega * omega); │ │ │ │ │ -804 mu_s += mu_s_update; │ │ │ │ │ -805 } │ │ │ │ │ -806 │ │ │ │ │ -807 // get norm of "the residual with respect to the shift used by II" │ │ │ │ │ -808 if (!doRQI) │ │ │ │ │ -809 { │ │ │ │ │ -810 // use special representation of q in the II case │ │ │ │ │ -811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = │ │ │ │ │ -x_s) │ │ │ │ │ -812 q_norm = omega; │ │ │ │ │ -813 } │ │ │ │ │ -814 else │ │ │ │ │ -815 { │ │ │ │ │ -816 // use special representation of q in the RQI case │ │ │ │ │ -817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y │ │ │ │ │ -= x_s) │ │ │ │ │ -818 temp = x_s; temp.axpy(mu_s-gamma,y); │ │ │ │ │ -819 q_norm = temp.two_norm() * omega; │ │ │ │ │ -820 } │ │ │ │ │ -821 │ │ │ │ │ -822 // get norm of "the residual with respect to the Rayleigh quotient" │ │ │ │ │ -823 // don't use efficient relation between the norms of r and q, as │ │ │ │ │ -824 // this relation seems to yield a less accurate r_norm in the case │ │ │ │ │ -825 // where linear solver crime is admitted │ │ │ │ │ -826 if (!doRQI) │ │ │ │ │ -827 { │ │ │ │ │ -828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s) │ │ │ │ │ -829 temp = x_s; temp.axpy(gamma-lambda,y); │ │ │ │ │ -830 r_norm = temp.two_norm() * omega; │ │ │ │ │ -831 } │ │ │ │ │ -832 else │ │ │ │ │ -833 { │ │ │ │ │ -834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s) │ │ │ │ │ -835 temp = x_s; temp.axpy(-mu_s_update,y); │ │ │ │ │ -836 r_norm = temp.two_norm() * omega; │ │ │ │ │ -837 } │ │ │ │ │ -838 } │ │ │ │ │ -839 │ │ │ │ │ -840 // do one iteration of the II/RQI algorithm, │ │ │ │ │ -841 // part 3: update x │ │ │ │ │ -842 x_s = y; x_s *= omega; │ │ │ │ │ -843 │ │ │ │ │ -844 // // for relative residual norm mode, scale with mu_s^{-1} │ │ │ │ │ -845 // r_norm /= std::abs(mu_s); │ │ │ │ │ -846 │ │ │ │ │ -847 // print verbosity information │ │ │ │ │ -848 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -849 std::cout << _b_l_a_n_k__ << "iteration " │ │ │ │ │ -850 << std::left << std::setw(3) << _n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ -851 << " (" << (doRQI ? "RQI," : "II, ") │ │ │ │ │ -852 << " " << (doRQI ? "—>" : " ") << " " │ │ │ │ │ -853 << "║r║_2 = " << std::setw(11) << r_norm │ │ │ │ │ -854 << ", " << (doRQI ? " " : "—>") << " " │ │ │ │ │ -855 << "║q║_2 = " << std::setw(11) << q_norm │ │ │ │ │ -856 << "): λ = " << lambda << std::endl │ │ │ │ │ -857 << std::resetiosflags(std::ios::left); │ │ │ │ │ -858 │ │ │ │ │ -859 // check if the eigenvalue closest to gamma lies in J │ │ │ │ │ -860 if (!doRQI && q_norm < eta) │ │ │ │ │ -861 { │ │ │ │ │ -862 // J is not free of eigenvalues │ │ │ │ │ -863 extrnl = false; │ │ │ │ │ -864 │ │ │ │ │ -865 // by theory we know now that mu_s also lies in J │ │ │ │ │ -866 assert(std::abs(mu_s-gamma) < eta); │ │ │ │ │ -867 │ │ │ │ │ -868 // switch to RQI │ │ │ │ │ -869 doRQI = true; │ │ │ │ │ -870 } │ │ │ │ │ -871 │ │ │ │ │ -872 // revert to II if J is not free of eigenvalues but │ │ │ │ │ -873 // at some point mu_s falls back again outside J │ │ │ │ │ -874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta) │ │ │ │ │ -875 doRQI = false; │ │ │ │ │ -876 │ │ │ │ │ -877 // if eigenvalue closest to gamma does not lie in J use RQI │ │ │ │ │ -878 // solely to accelerate the convergence to this eigenvalue │ │ │ │ │ -879 // when II has become stationary │ │ │ │ │ -880 if (extrnl && !doRQI) │ │ │ │ │ -881 { │ │ │ │ │ -882 // switch to RQI if the relative change of the Rayleigh │ │ │ │ │ -883 // quotient indicates that II has become stationary │ │ │ │ │ -884 if (_n_I_t_e_r_a_t_i_o_n_s__ >= m && │ │ │ │ │ -885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta) │ │ │ │ │ -886 doRQI = true; │ │ │ │ │ -887 } │ │ │ │ │ -888 } │ │ │ │ │ -889 │ │ │ │ │ -890 // // compute final residual and lambda again (paranoia....) │ │ │ │ │ -891 // m_.mv(x_s,temp); │ │ │ │ │ -892 // mu_s = x_s * temp; │ │ │ │ │ -893 // temp.axpy(-mu_s,x_s); │ │ │ │ │ -894 // r_norm = temp.two_norm(); │ │ │ │ │ -895 // // r_norm /= std::abs(mu_s); │ │ │ │ │ -896 │ │ │ │ │ -897 // print verbosity information │ │ │ │ │ -898 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -899 { │ │ │ │ │ -900 if (extrnl) │ │ │ │ │ -901 std::cout << _b_l_a_n_k__ << "Interval " │ │ │ │ │ -902 << "(" << gamma - eta << "," << gamma + eta │ │ │ │ │ -903 << ") is free of eigenvalues, approximating " │ │ │ │ │ -904 << "the closest eigenvalue." << std::endl; │ │ │ │ │ -905 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -906 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -907 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -908 << "λ = " << lambda << std::endl; │ │ │ │ │ -909 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -910 { │ │ │ │ │ -911 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ -912 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -913 } │ │ │ │ │ -914 } │ │ │ │ │ -915 } │ │ │ │ │ -916 │ │ │ │ │ -_9_2_5 inline _I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r& _g_e_t_I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r () │ │ │ │ │ -926 { │ │ │ │ │ -927 // return iteration operator │ │ │ │ │ -928 return _i_t_O_p_e_r_a_t_o_r__; │ │ │ │ │ -929 } │ │ │ │ │ -930 │ │ │ │ │ -_9_4_5 inline const _B_C_R_S_M_a_t_r_i_x& _g_e_t_I_t_e_r_a_t_i_o_n_M_a_t_r_i_x () const │ │ │ │ │ -946 { │ │ │ │ │ -947 // create iteration matrix on demand │ │ │ │ │ -948 if (!_i_t_M_a_t_r_i_x__) │ │ │ │ │ -949 _i_t_M_a_t_r_i_x__ = std::make_unique(_m__); │ │ │ │ │ -950 │ │ │ │ │ -951 // return iteration matrix │ │ │ │ │ -952 return *_i_t_M_a_t_r_i_x__; │ │ │ │ │ -953 } │ │ │ │ │ -954 │ │ │ │ │ -_9_5_9 inline unsigned int _g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t () const │ │ │ │ │ -960 { │ │ │ │ │ -961 if (_n_I_t_e_r_a_t_i_o_n_s__ == 0) │ │ │ │ │ -962 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"No algorithm applied, yet."); │ │ │ │ │ -963 │ │ │ │ │ -964 return _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ -965 } │ │ │ │ │ -966 │ │ │ │ │ -967 protected: │ │ │ │ │ -982 template │ │ │ │ │ -_9_8_3 inline void _u_p_d_a_t_e_S_h_i_f_t_M_u (const _R_e_a_l& mu, │ │ │ │ │ -984 ISTLLinearSolver& solver) const │ │ │ │ │ -985 { │ │ │ │ │ -986 // do nothing if new shift equals the old one │ │ │ │ │ -987 if (mu == _m_u__) return; │ │ │ │ │ -988 │ │ │ │ │ -989 // update shift mu_, i.e. update iteration operator │ │ │ │ │ -990 _m_u__ = mu; │ │ │ │ │ -991 │ │ │ │ │ -992 // update iteration matrix when needed │ │ │ │ │ -993 if (_i_t_M_a_t_r_i_x__) │ │ │ │ │ -994 { │ │ │ │ │ -995 // iterate over entries in iteration matrix diagonal │ │ │ │ │ -996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows; │ │ │ │ │ -997 constexpr int colBlockSize = BCRSMatrix::block_type::cols; │ │ │ │ │ -998 for (typename _B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e i = 0; │ │ │ │ │ -999 i < _i_t_M_a_t_r_i_x__->M()*rowBlockSize; ++i) │ │ │ │ │ -1000 { │ │ │ │ │ -1001 // access m_[i,i] where i is the flat index of a row/column │ │ │ │ │ -1002 const _R_e_a_l& m_entry = _m__ │ │ │ │ │ -1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize]; │ │ │ │ │ -1004 // access *itMatrix[i,i] where i is the flat index of a row/column │ │ │ │ │ -1005 _R_e_a_l& entry = (*itMatrix_) │ │ │ │ │ -1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize]; │ │ │ │ │ -1007 // change current entry in iteration matrix diagonal │ │ │ │ │ -1008 entry = m_entry - _m_u__; │ │ │ │ │ -1009 } │ │ │ │ │ -1010 // notify linear solver about change of the iteration matrix object │ │ │ │ │ -1011 _S_o_l_v_e_r_H_e_l_p_e_r_<_I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_B_C_R_S_M_a_t_r_i_x_>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -1012 (solver,*_i_t_M_a_t_r_i_x__); │ │ │ │ │ -1013 } │ │ │ │ │ -1014 } │ │ │ │ │ -1015 │ │ │ │ │ -1016 protected: │ │ │ │ │ -1017 // parameters related to iterative eigenvalue algorithms │ │ │ │ │ -_1_0_1_8 const _B_C_R_S_M_a_t_r_i_x& _m__; │ │ │ │ │ -_1_0_1_9 const unsigned int _n_I_t_e_r_a_t_i_o_n_s_M_a_x__; │ │ │ │ │ -1020 │ │ │ │ │ -1021 // verbosity setting │ │ │ │ │ -_1_0_2_2 const unsigned int _v_e_r_b_o_s_i_t_y___l_e_v_e_l__; │ │ │ │ │ -1023 │ │ │ │ │ -1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I) │ │ │ │ │ -_1_0_2_5 mutable _R_e_a_l _m_u__; │ │ │ │ │ -1026 │ │ │ │ │ -1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference │ │ │ │ │ -_1_0_2_8 const _M_a_t_r_i_x_O_p_e_r_a_t_o_r _m_a_t_r_i_x_O_p_e_r_a_t_o_r__; │ │ │ │ │ -_1_0_2_9 const _S_c_a_l_i_n_g_O_p_e_r_a_t_o_r _s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__; │ │ │ │ │ -_1_0_3_0 _O_p_e_r_a_t_o_r_S_u_m _i_t_O_p_e_r_a_t_o_r__; │ │ │ │ │ -1031 │ │ │ │ │ -1032 // iteration matrix (m_ - mu_*I), provided on demand when needed │ │ │ │ │ -1033 // (e.g. for preconditioning) │ │ │ │ │ -_1_0_3_4 mutable std::unique_ptr _i_t_M_a_t_r_i_x__; │ │ │ │ │ -1035 │ │ │ │ │ -1036 // memory for storing temporary variables (mutable as they shall │ │ │ │ │ -1037 // just be effectless auxiliary variables of the const apply*(...) │ │ │ │ │ -1038 // methods) │ │ │ │ │ -_1_0_3_9 mutable unsigned int _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ -1040 │ │ │ │ │ -1041 // constants for printing verbosity information │ │ │ │ │ -_1_0_4_2 const std::string _t_i_t_l_e__; │ │ │ │ │ -_1_0_4_3 const std::string _b_l_a_n_k__; │ │ │ │ │ -1044 }; │ │ │ │ │ -1045 │ │ │ │ │ -1048} // namespace Dune │ │ │ │ │ -1049 │ │ │ │ │ -1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH │ │ │ │ │ -_i_o_._h_h │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ -_s_o_l_v_e_r_c_a_t_e_g_o_r_y_._h_h │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_s_o_l_v_e_r_s_._h_h │ │ │ │ │ -Implementations of the inverse operator interface. │ │ │ │ │ -_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ -Define general, extensible interface for operators. The available │ │ │ │ │ -implementation wraps a matrix. │ │ │ │ │ -_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ -Templates characterizing the type of a solver. │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ -void printvector(std::ostream &s, const V &v, std::string title, std::string │ │ │ │ │ -rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ -Print an ISTL vector. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:89 │ │ │ │ │ +116 } │ │ │ │ │ +117 │ │ │ │ │ +118 if( ij.index() != i.index() ) │ │ │ │ │ +119 DUNE_THROW( _I_S_T_L_E_r_r_o_r, "diagonal entry missing" ); │ │ │ │ │ +120 │ │ │ │ │ +121 // update diagonal and multiply A_ij by D_j^{-1} │ │ │ │ │ +122 auto &&A_ii = *ij; │ │ │ │ │ +123 for( auto ik = A_i.begin(); ik != ij; ++ik ) │ │ │ │ │ +124 { │ │ │ │ │ +125 auto &&A_ik = *ik; │ │ │ │ │ +126 const auto &A_k = A[ ik.index() ]; │ │ │ │ │ +127 │ │ │ │ │ +128 auto B = A_ik; │ │ │ │ │ +129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() )) │ │ │ │ │ +); │ │ │ │ │ +130 _b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T( B, A_ik, A_ii ); │ │ │ │ │ +131 } │ │ │ │ │ +132 try │ │ │ │ │ +133 { │ │ │ │ │ +134 Impl::asMatrix(A_ii).invert(); │ │ │ │ │ +135 } │ │ │ │ │ +136 catch( const Dune::FMatrixError &e ) │ │ │ │ │ +137 { │ │ │ │ │ +138 DUNE_THROW( _M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r, "ILDL failed to invert matrix block A[" << │ │ │ │ │ +i.index() << "][" << ij.index() << "]" << e.what(); th__ex.r = i.index(); │ │ │ │ │ +th__ex.c = ij.index() ); │ │ │ │ │ +139 } │ │ │ │ │ +140 } │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +143 │ │ │ │ │ +144 │ │ │ │ │ +145 // bildl_backsolve │ │ │ │ │ +146 // --------------- │ │ │ │ │ +147 │ │ │ │ │ +148 template< class Matrix, class X, class Y > │ │ │ │ │ +_1_4_9 inline void _b_i_l_d_l___b_a_c_k_s_o_l_v_e ( const _M_a_t_r_i_x &A, X &v, const Y &d, bool │ │ │ │ │ +isLowerTriangular = false ) │ │ │ │ │ +150 { │ │ │ │ │ +151 // solve L v = d, note: Lii = I │ │ │ │ │ +152 for( auto i = A._b_e_g_i_n(), iend = A._e_n_d(); i != iend; ++i ) │ │ │ │ │ +153 { │ │ │ │ │ +154 const auto &A_i = *i; │ │ │ │ │ +155 v[ i.index() ] = d[ i.index() ]; │ │ │ │ │ +156 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij ) │ │ │ │ │ +157 { │ │ │ │ │ +158 auto&& vi = Impl::asVector( v[ i.index() ] ); │ │ │ │ │ +159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi); │ │ │ │ │ +160 } │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +163 // solve D w = v, note: diagonal stores Dii^{-1} │ │ │ │ │ +164 if( isLowerTriangular ) │ │ │ │ │ +165 { │ │ │ │ │ +166 // The matrix is lower triangular, so the diagonal entry is the │ │ │ │ │ +167 // last one in each row. │ │ │ │ │ +168 for( auto i = A._b_e_g_i_n(), iend = A._e_n_d(); i != iend; ++i ) │ │ │ │ │ +169 { │ │ │ │ │ +170 const auto &A_i = *i; │ │ │ │ │ +171 const auto ii = A_i.beforeEnd(); │ │ │ │ │ +172 assert( ii.index() == i.index() ); │ │ │ │ │ +173 // We need to be careful here: Directly using │ │ │ │ │ +174 // auto rhs = Impl::asVector(v[ i.index() ]); │ │ │ │ │ +175 // is not OK in case this is a proxy. Hence │ │ │ │ │ +176 // we first have to copy the value. Notice that │ │ │ │ │ +177 // this is still not OK, if the vector type itself returns │ │ │ │ │ +178 // proxy references. │ │ │ │ │ +179 auto rhsValue = v[ i.index() ]; │ │ │ │ │ +180 auto&& rhs = Impl::asVector(rhsValue); │ │ │ │ │ +181 auto&& vi = Impl::asVector( v[ i.index() ] ); │ │ │ │ │ +182 Impl::asMatrix(*ii).mv(rhs, vi); │ │ │ │ │ +183 } │ │ │ │ │ +184 } │ │ │ │ │ +185 else │ │ │ │ │ +186 { │ │ │ │ │ +187 // Without assumptions on the sparsity pattern we have to search │ │ │ │ │ +188 // for the diagonal entry in each row. │ │ │ │ │ +189 for( auto i = A._b_e_g_i_n(), iend = A._e_n_d(); i != iend; ++i ) │ │ │ │ │ +190 { │ │ │ │ │ +191 const auto &A_i = *i; │ │ │ │ │ +192 const auto ii = A_i.find( i.index() ); │ │ │ │ │ +193 assert( ii.index() == i.index() ); │ │ │ │ │ +194 // We need to be careful here: Directly using │ │ │ │ │ +195 // auto rhs = Impl::asVector(v[ i.index() ]); │ │ │ │ │ +196 // is not OK in case this is a proxy. Hence │ │ │ │ │ +197 // we first have to copy the value. Notice that │ │ │ │ │ +198 // this is still not OK, if the vector type itself returns │ │ │ │ │ +199 // proxy references. │ │ │ │ │ +200 auto rhsValue = v[ i.index() ]; │ │ │ │ │ +201 auto&& rhs = Impl::asVector(rhsValue); │ │ │ │ │ +202 auto&& vi = Impl::asVector( v[ i.index() ] ); │ │ │ │ │ +203 Impl::asMatrix(*ii).mv(rhs, vi); │ │ │ │ │ +204 } │ │ │ │ │ +205 } │ │ │ │ │ +206 │ │ │ │ │ +207 // solve L^T v = w, note: only L is stored │ │ │ │ │ +208 // note: we perform the operation column-wise from right to left │ │ │ │ │ +209 for( auto i = A._b_e_f_o_r_e_E_n_d(), iend = A._b_e_f_o_r_e_B_e_g_i_n(); i != iend; --i ) │ │ │ │ │ +210 { │ │ │ │ │ +211 const auto &A_i = *i; │ │ │ │ │ +212 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij ) │ │ │ │ │ +213 { │ │ │ │ │ +214 auto&& vij = Impl::asVector( v[ ij.index() ] ); │ │ │ │ │ +215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij); │ │ │ │ │ +216 } │ │ │ │ │ +217 } │ │ │ │ │ +218 } │ │ │ │ │ +219 │ │ │ │ │ +220} // namespace Dune │ │ │ │ │ +221 │ │ │ │ │ +222#endif // #ifndef DUNE_ISTL_ILDL_HH │ │ │ │ │ +_i_l_u_._h_h │ │ │ │ │ +The incomplete LU factorization kernels. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ -A sparse block matrix with compressed row storage. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access and the size. │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_M │ │ │ │ │ -size_type M() const │ │ │ │ │ -number of columns (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1978 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ -void mv(const X &x, Y &y) const │ │ │ │ │ -y = A x │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1612 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_N │ │ │ │ │ -size_type N() const │ │ │ │ │ -number of rows (counted in blocks) │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:1972 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -Iterative eigenvalue algorithms based on power iteration. │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_i_t_M_a_t_r_i_x__ │ │ │ │ │ -std::unique_ptr< BCRSMatrix > itMatrix_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1034 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_S_c_a_l_i_n_g_O_p_e_r_a_t_o_r │ │ │ │ │ -Impl::ScalingLinearOperator< BlockVector > ScalingOperator │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_b_l_a_n_k__ │ │ │ │ │ -const std::string blank_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1043 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_O_p_e_r_a_t_o_r_S_u_m │ │ │ │ │ -Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_M_a_t_r_i_x_O_p_e_r_a_t_o_r │ │ │ │ │ -Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n │ │ │ │ │ -void applyInverseIteration(const Real &epsilon, ISTLLinearSolver &solver, │ │ │ │ │ -BlockVector &x, Real &lambda) const │ │ │ │ │ -Perform the inverse iteration algorithm to compute an approximation lambda of │ │ │ │ │ -the least dominant (i.... │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_T_L_I_M_E_I_t_e_r_a_t_i_o_n │ │ │ │ │ -void applyTLIMEIteration(const Real &gamma, const Real &eta, const Real │ │ │ │ │ -&epsilon, ISTLLinearSolver &solver, const Real &delta, const std::size_t &m, │ │ │ │ │ -bool &extrnl, BlockVector &x, Real &lambda) const │ │ │ │ │ -Perform the "two-level iterative method for eigenvalue calculations (TLIME)" │ │ │ │ │ -iteration algorit... │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:691 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r │ │ │ │ │ -IterationOperator & getIterationOperator() │ │ │ │ │ -Return the iteration operator (m_ - mu_*I). │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:925 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_i_t_O_p_e_r_a_t_o_r__ │ │ │ │ │ -OperatorSum itOperator_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1030 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_m__ │ │ │ │ │ -const BCRSMatrix & m_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1018 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int │ │ │ │ │ -nIterationsMax=1000, const unsigned int verbosity_level=0) │ │ │ │ │ -Construct from required parameters. │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s_M_a_x__ │ │ │ │ │ -const unsigned int nIterationsMax_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1019 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_P_o_w_e_r_I_t_e_r_a_t_i_o_n │ │ │ │ │ -void applyPowerIteration(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ -const │ │ │ │ │ -Perform the power iteration algorithm to compute an approximation lambda of the │ │ │ │ │ -dominant (i.... │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_I_t_e_r_a_t_i_o_n_O_p_e_r_a_t_o_r │ │ │ │ │ -OperatorSum IterationOperator │ │ │ │ │ -Type of iteration operator (m_ - mu_*I) │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_R_a_y_l_e_i_g_h_Q_u_o_t_i_e_n_t_I_t_e_r_a_t_i_o_n │ │ │ │ │ -void applyRayleighQuotientIteration(const Real &epsilon, ISTLLinearSolver │ │ │ │ │ -&solver, BlockVector &x, Real &lambda) const │ │ │ │ │ -Perform the Rayleigh quotient iteration algorithm to compute an approximation │ │ │ │ │ -lambda of an eigenvalue... │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:533 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_a_p_p_l_y_I_n_v_e_r_s_e_I_t_e_r_a_t_i_o_n │ │ │ │ │ -void applyInverseIteration(const Real &gamma, const Real &epsilon, │ │ │ │ │ -ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const │ │ │ │ │ -Perform the inverse iteration with shift algorithm to compute an approximation │ │ │ │ │ -lambda of the eigenval... │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:394 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_s_c_a_l_i_n_g_O_p_e_r_a_t_o_r__ │ │ │ │ │ -const ScalingOperator scalingOperator_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1029 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_u_p_d_a_t_e_S_h_i_f_t_M_u │ │ │ │ │ -void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const │ │ │ │ │ -Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I). │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:983 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t │ │ │ │ │ -unsigned int getIterationCount() const │ │ │ │ │ -Return the number of iterations in last application of an algorithm. │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:959 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_m_a_t_r_i_x_O_p_e_r_a_t_o_r__ │ │ │ │ │ -const MatrixOperator matrixOperator_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1028 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_M_a_t_r_i_x │ │ │ │ │ -const BCRSMatrix & getIterationMatrix() const │ │ │ │ │ -Return the iteration matrix (m_ - mu_*I), provided on demand when needed (e.g. │ │ │ │ │ -for direct solvers or ... │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:945 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ -unsigned int nIterations_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1039 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ │ │ │ │ │ -const unsigned int verbosity_level_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1022 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_t_i_t_l_e__ │ │ │ │ │ -const std::string title_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1042 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_R_e_a_l │ │ │ │ │ -BlockVector::field_type Real │ │ │ │ │ -Type of underlying field. │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_P_o_w_e_r_I_t_e_r_a_t_i_o_n___A_l_g_o_r_i_t_h_m_s_:_:_m_u__ │ │ │ │ │ -Real mu_ │ │ │ │ │ -DDeeffiinniittiioonn poweriteration.hh:1025 │ │ │ │ │ +_D_u_n_e_:_:_b_i_l_d_l___d_e_c_o_m_p_o_s_e │ │ │ │ │ +void bildl_decompose(Matrix &A) │ │ │ │ │ +compute ILDL decomposition of a symmetric matrix A │ │ │ │ │ +DDeeffiinniittiioonn ildl.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_b_i_l_d_l___b_a_c_k_s_o_l_v_e │ │ │ │ │ +void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool │ │ │ │ │ +isLowerTriangular=false) │ │ │ │ │ +DDeeffiinniittiioonn ildl.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_b_i_l_d_l___s_u_b_t_r_a_c_t_B_C_T │ │ │ │ │ +static void bildl_subtractBCT(const FieldMatrix< K, m, n > &B, const │ │ │ │ │ +FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A) │ │ │ │ │ +DDeeffiinniittiioonn ildl.hh:24 │ │ │ │ │ _D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ derive error class from the base class in common │ │ │ │ │ DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ -A linear operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -X::field_type field_type │ │ │ │ │ -The field type of the operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y_s_c_a_l_e_a_d_d │ │ │ │ │ -virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0 │ │ │ │ │ -apply operator to x, scale and add: │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -virtual SolverCategory::Category category() const =0 │ │ │ │ │ -Category of the linear operator (see SolverCategory::Category) │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ -Y range_type │ │ │ │ │ -The type of the range of the operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ -virtual void apply(const X &x, Y &y) const =0 │ │ │ │ │ -apply operator to x: The input vector is consistent and the output must also be │ │ │ │ │ -consistent on the in... │ │ │ │ │ -_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ -X domain_type │ │ │ │ │ -The type of the domain of the operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_A_d_a_p_t_e_r │ │ │ │ │ -Adapter to turn a matrix into a linear operator. │ │ │ │ │ -DDeeffiinniittiioonn operators.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ -Statistics about the application of an inverse operator. │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ -static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix) │ │ │ │ │ -DDeeffiinniittiioonn solver.hh:524 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ -Category │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ -@ sequential │ │ │ │ │ -Category for sequential solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_B_l_o_c_k_E_r_r_o_r │ │ │ │ │ +Error when performing an operation on a matrix block. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x │ │ │ │ │ +A generic dynamic dense matrix. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:561 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +RowIterator beforeBegin() │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:634 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +RowIterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:627 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +RowIterator end() │ │ │ │ │ +Get iterator to one beyond last row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:620 │ │ │ │ │ +_D_u_n_e_:_:_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +RowIterator begin() │ │ │ │ │ +Get iterator to first row. │ │ │ │ │ +DDeeffiinniittiioonn matrix.hh:614 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ │ +DDeeffiinniittiioonn matrixutils.hh:27 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00224.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: arpackpp.hh File Reference │ │ │ │ +dune-istl: solver.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,48 +65,76 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
arpackpp.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <iostream>
│ │ │ │ + │ │ │ │ +

Define general, extensible interface for inverse operators. │ │ │ │ +More...

│ │ │ │ +
#include <iomanip>
│ │ │ │ +#include <ostream>
│ │ │ │ #include <string>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ +#include <functional>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/istl/blocklevel.hh>
│ │ │ │ -#include <dune/istl/bvector.hh>
│ │ │ │ -#include <dune/istl/istlexception.hh>
│ │ │ │ -#include <dune/istl/io.hh>
│ │ │ │ -#include "arssym.h"
│ │ │ │ +#include <dune/common/shared_ptr.hh>
│ │ │ │ +#include <dune/common/simd/io.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/common/parametertree.hh>
│ │ │ │ +#include <dune/common/timer.hh>
│ │ │ │ +#include "solvertype.hh"
│ │ │ │ +#include "preconditioner.hh"
│ │ │ │ +#include "operators.hh"
│ │ │ │ +#include "scalarproducts.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ArPackPlusPlus_Algorithms< BCRSMatrix, BlockVector >
 Wrapper to use a range of ARPACK++ eigenvalue solvers. More...
struct  Dune::InverseOperatorResult
 Statistics about the application of an inverse operator. More...
 
class  Dune::InverseOperator< X, Y >
 Abstract base class for all solvers. More...
 
class  Dune::IterativeSolver< X, Y >
 Base class for all implementations of iterative solvers. More...
 
class  Dune::IterativeSolver< X, Y >::Iteration< CountType >
 Class for controlling iterative methods. More...
 
class  Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >
 Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in a unified way, i.e. independent from the solver's type (direct/iterative). More...
 
struct  Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< is_direct_solver, Dummy >
 Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTABSolver. More...
 
struct  Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< true, Dummy >
 Implementation that works together with direct ISTL solvers, e.g. Dune::SuperLU or Dune::UMFPack. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

Detailed Description

│ │ │ │ +

Define general, extensible interface for inverse operators.

│ │ │ │ +

Implementation here covers only inversion of linear operators, but the implementation might be used for nonlinear operators as well.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,29 +1,62 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -arpackpp.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +solver.hh File Reference │ │ │ │ │ +_I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y_ _(_I_S_T_L_) » _I_t_e_r_a_t_i_v_e_ _S_o_l_v_e_r_s │ │ │ │ │ +Define general, extensible interface for inverse operators. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> │ │ │ │ │ -#include "arssym.h" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_s_o_l_v_e_r_t_y_p_e_._h_h" │ │ │ │ │ +#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ +#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ +#include "_s_c_a_l_a_r_p_r_o_d_u_c_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_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_<_ _B_C_R_S_M_a_t_r_i_x_,_ _B_l_o_c_k_V_e_c_t_o_r_ _> │ │ │ │ │ -  Wrapper to use a range of ARPACK++ eigenvalue solvers. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +  Statistics about the application of an inverse operator. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_ _X_,_ _Y_ _> │ │ │ │ │ +  Abstract base class for all solvers. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _Y_ _> │ │ │ │ │ +  Base class for all implementations of iterative solvers. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_<_ _X_,_ _Y_ _>_:_:_I_t_e_r_a_t_i_o_n_<_ _C_o_u_n_t_T_y_p_e_ _> │ │ │ │ │ +  Class for controlling iterative methods. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_<_ _I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_ _B_C_R_S_M_a_t_r_i_x_ _> │ │ │ │ │ + Helper class for notifying a DUNE-ISTL linear solver about a change of │ │ │ │ │ +  the iteration matrix object in a unified way, i.e. independent from │ │ │ │ │ + the solver's type (direct/iterative). _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_<_ _I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_ _B_C_R_S_M_a_t_r_i_x_ _>_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_< │ │ │ │ │ + _i_s___d_i_r_e_c_t___s_o_l_v_e_r_,_ _D_u_m_m_y_ _> │ │ │ │ │ +  _I_m_p_l_e_m_e_n_t_a_t_i_o_n that works together with iterative _I_S_T_L solvers, e.g. │ │ │ │ │ + _D_u_n_e_:_:_C_G_S_o_l_v_e_r or _D_u_n_e_:_:_B_i_C_G_S_T_A_B_S_o_l_v_e_r. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_<_ _I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_ _B_C_R_S_M_a_t_r_i_x_ _>_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_< │ │ │ │ │ + _t_r_u_e_,_ _D_u_m_m_y_ _> │ │ │ │ │ +  _I_m_p_l_e_m_e_n_t_a_t_i_o_n that works together with direct _I_S_T_L solvers, e.g. │ │ │ │ │ + _D_u_n_e_:_:_S_u_p_e_r_L_U or _D_u_n_e_:_:_U_M_F_P_a_c_k. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Define general, extensible interface for inverse operators. │ │ │ │ │ +Implementation here covers only inversion of linear operators, but the │ │ │ │ │ +implementation might be used for nonlinear operators as well. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: arpackpp.hh Source File │ │ │ │ +dune-istl: solver.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,881 +70,499 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
arpackpp.hh
│ │ │ │ +
solver.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
│ │ │ │ -
6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
│ │ │ │ -
7
│ │ │ │ -
8#if HAVE_ARPACKPP || defined DOXYGEN
│ │ │ │ -
9
│ │ │ │ -
10#include <cmath> // provides std::abs, std::pow, std::sqrt
│ │ │ │ -
11
│ │ │ │ -
12#include <iostream> // provides std::cout, std::endl
│ │ │ │ -
13#include <string> // provides std::string
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/fvector.hh> // provides Dune::FieldVector
│ │ │ │ -
16#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
│ │ │ │ -
17
│ │ │ │ -
18#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
│ │ │ │ -
19#include <dune/istl/bvector.hh> // provides Dune::BlockVector
│ │ │ │ -
20#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
│ │ │ │ -
21#include <dune/istl/io.hh> // provides Dune::printvector(...)
│ │ │ │ -
22
│ │ │ │ -
23#ifdef Status
│ │ │ │ -
24#undef Status // prevent preprocessor from damaging the ARPACK++
│ │ │ │ -
25 // code when "X11/Xlib.h" is included (the latter
│ │ │ │ -
26 // defines Status as "#define Status int" and
│ │ │ │ -
27 // ARPACK++ provides a class with a method called
│ │ │ │ -
28 // Status)
│ │ │ │ -
29#endif
│ │ │ │ -
30#include "arssym.h" // provides ARSymStdEig
│ │ │ │ -
31
│ │ │ │ -
32namespace Dune
│ │ │ │ -
33{
│ │ │ │ -
34
│ │ │ │ -
39 namespace Impl {
│ │ │ │ -
55 template <class BCRSMatrix>
│ │ │ │ -
56 class ArPackPlusPlus_BCRSMatrixWrapper
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_ISTL_SOLVER_HH
│ │ │ │ +
7#define DUNE_ISTL_SOLVER_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <iomanip>
│ │ │ │ +
10#include <ostream>
│ │ │ │ +
11#include <string>
│ │ │ │ +
12#include <functional>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/exceptions.hh>
│ │ │ │ +
15#include <dune/common/shared_ptr.hh>
│ │ │ │ +
16#include <dune/common/simd/io.hh>
│ │ │ │ +
17#include <dune/common/simd/simd.hh>
│ │ │ │ +
18#include <dune/common/parametertree.hh>
│ │ │ │ +
19#include <dune/common/timer.hh>
│ │ │ │ +
20
│ │ │ │ +
21#include "solvertype.hh"
│ │ │ │ +
22#include "preconditioner.hh"
│ │ │ │ +
23#include "operators.hh"
│ │ │ │ +
24#include "scalarproducts.hh"
│ │ │ │ +
25
│ │ │ │ +
26namespace Dune
│ │ │ │ +
27{
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
48 {
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
51 {
│ │ │ │ +
52 clear();
│ │ │ │ +
53 }
│ │ │ │ +
│ │ │ │ +
54
│ │ │ │ +
│ │ │ │ +
56 void clear ()
│ │ │ │
57 {
│ │ │ │ -
58 public:
│ │ │ │ -
60 typedef typename BCRSMatrix::field_type Real;
│ │ │ │ -
61
│ │ │ │ -
62 public:
│ │ │ │ -
64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A)
│ │ │ │ -
65 : A_(A),
│ │ │ │ -
66 m_(A_.M() * mBlock), n_(A_.N() * nBlock)
│ │ │ │ -
67 {
│ │ │ │ -
68 // assert that BCRSMatrix type has blocklevel 2
│ │ │ │ -
69 static_assert
│ │ │ │ -
70 (blockLevel<BCRSMatrix>() == 2,
│ │ │ │ -
71 "Only BCRSMatrices with blocklevel 2 are supported.");
│ │ │ │ -
72
│ │ │ │ -
73 // allocate memory for auxiliary block vector objects
│ │ │ │ -
74 // which are compatible to matrix rows / columns
│ │ │ │ -
75 domainBlockVector.resize(A_.N());
│ │ │ │ -
76 rangeBlockVector.resize(A_.M());
│ │ │ │ -
77 }
│ │ │ │ -
78
│ │ │ │ -
80 inline void multMv (Real* v, Real* w)
│ │ │ │ -
81 {
│ │ │ │ -
82 // get vector v as an object of appropriate type
│ │ │ │ -
83 arrayToDomainBlockVector(v,domainBlockVector);
│ │ │ │ +
58 iterations = 0;
│ │ │ │ +
59 reduction = 0;
│ │ │ │ +
60 converged = false;
│ │ │ │ +
61 conv_rate = 1;
│ │ │ │ +
62 elapsed = 0;
│ │ │ │ + │ │ │ │ +
64 }
│ │ │ │ +
│ │ │ │ +
65
│ │ │ │ + │ │ │ │ +
68
│ │ │ │ +
70 double reduction;
│ │ │ │ +
71
│ │ │ │ + │ │ │ │ +
74
│ │ │ │ +
76 double conv_rate;
│ │ │ │ +
77
│ │ │ │ +
79 double condition_estimate = -1;
│ │ │ │ +
80
│ │ │ │ +
82 double elapsed;
│ │ │ │ +
83 };
│ │ │ │ +
│ │ │ │
84
│ │ │ │ -
85 // perform matrix-vector product
│ │ │ │ -
86 A_.mv(domainBlockVector,rangeBlockVector);
│ │ │ │ -
87
│ │ │ │ -
88 // get vector w from object of appropriate type
│ │ │ │ -
89 rangeBlockVectorToArray(rangeBlockVector,w);
│ │ │ │ -
90 };
│ │ │ │ -
91
│ │ │ │ -
93 inline void multMtMv (Real* v, Real* w)
│ │ │ │ -
94 {
│ │ │ │ -
95 // get vector v as an object of appropriate type
│ │ │ │ -
96 arrayToDomainBlockVector(v,domainBlockVector);
│ │ │ │ -
97
│ │ │ │ -
98 // perform matrix-vector product
│ │ │ │ -
99 A_.mv(domainBlockVector,rangeBlockVector);
│ │ │ │ -
100 A_.mtv(rangeBlockVector,domainBlockVector);
│ │ │ │ -
101
│ │ │ │ -
102 // get vector w from object of appropriate type
│ │ │ │ -
103 domainBlockVectorToArray(domainBlockVector,w);
│ │ │ │ -
104 };
│ │ │ │ -
105
│ │ │ │ -
107 inline void multMMtv (Real* v, Real* w)
│ │ │ │ -
108 {
│ │ │ │ -
109 // get vector v as an object of appropriate type
│ │ │ │ -
110 arrayToRangeBlockVector(v,rangeBlockVector);
│ │ │ │ -
111
│ │ │ │ -
112 // perform matrix-vector product
│ │ │ │ -
113 A_.mtv(rangeBlockVector,domainBlockVector);
│ │ │ │ -
114 A_.mv(domainBlockVector,rangeBlockVector);
│ │ │ │ +
85
│ │ │ │ +
86 //=====================================================================
│ │ │ │ +
98 template<class X, class Y>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
100 public:
│ │ │ │ +
102 typedef X domain_type;
│ │ │ │ +
103
│ │ │ │ +
105 typedef Y range_type;
│ │ │ │ +
106
│ │ │ │ +
108 typedef typename X::field_type field_type;
│ │ │ │ +
109
│ │ │ │ +
111 typedef typename FieldTraits<field_type>::real_type real_type;
│ │ │ │ +
112
│ │ │ │ +
114 typedef Simd::Scalar<real_type> scalar_real_type;
│ │ │ │
115
│ │ │ │ -
116 // get vector w from object of appropriate type
│ │ │ │ -
117 rangeBlockVectorToArray(rangeBlockVector,w);
│ │ │ │ -
118 };
│ │ │ │ -
119
│ │ │ │ -
121 inline int nrows () const { return m_; }
│ │ │ │ -
122
│ │ │ │ -
124 inline int ncols () const { return n_; }
│ │ │ │ -
125
│ │ │ │ -
126 protected:
│ │ │ │ -
127 // Number of rows and columns in each block of the matrix
│ │ │ │ -
128 constexpr static int mBlock = BCRSMatrix::block_type::rows;
│ │ │ │ -
129 constexpr static int nBlock = BCRSMatrix::block_type::cols;
│ │ │ │ -
130
│ │ │ │ -
131 // Type of vectors in the domain of the linear map associated with
│ │ │ │ -
132 // the matrix, i.e. block vectors compatible to matrix rows
│ │ │ │ -
133 constexpr static int dbvBlockSize = nBlock;
│ │ │ │ -
134 typedef Dune::FieldVector<Real,dbvBlockSize> DomainBlockVectorBlock;
│ │ │ │ -
135 typedef Dune::BlockVector<DomainBlockVectorBlock> DomainBlockVector;
│ │ │ │ -
136
│ │ │ │ -
137 // Type of vectors in the range of the linear map associated with
│ │ │ │ -
138 // the matrix, i.e. block vectors compatible to matrix columns
│ │ │ │ -
139 constexpr static int rbvBlockSize = mBlock;
│ │ │ │ -
140 typedef Dune::FieldVector<Real,rbvBlockSize> RangeBlockVectorBlock;
│ │ │ │ -
141 typedef Dune::BlockVector<RangeBlockVectorBlock> RangeBlockVector;
│ │ │ │ -
142
│ │ │ │ -
143 // Types for vector index access
│ │ │ │ -
144 typedef typename DomainBlockVector::size_type dbv_size_type;
│ │ │ │ -
145 typedef typename RangeBlockVector::size_type rbv_size_type;
│ │ │ │ -
146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type;
│ │ │ │ -
147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type;
│ │ │ │ -
148
│ │ │ │ -
149 // Get vector v from a block vector object which is compatible to
│ │ │ │ -
150 // matrix rows
│ │ │ │ -
151 static inline void
│ │ │ │ -
152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v)
│ │ │ │ -
153 {
│ │ │ │ -
154 for (dbv_size_type block = 0; block < dbv.N(); ++block)
│ │ │ │ -
155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
│ │ │ │ -
156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock];
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ -
159 // Get vector v from a block vector object which is compatible to
│ │ │ │ -
160 // matrix columns
│ │ │ │ -
161 static inline void
│ │ │ │ -
162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v)
│ │ │ │ -
163 {
│ │ │ │ -
164 for (rbv_size_type block = 0; block < rbv.N(); ++block)
│ │ │ │ -
165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
│ │ │ │ -
166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock];
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ -
169 public:
│ │ │ │ -
172 static inline void arrayToDomainBlockVector (const Real* v,
│ │ │ │ -
173 DomainBlockVector& dbv)
│ │ │ │ -
174 {
│ │ │ │ -
175 for (dbv_size_type block = 0; block < dbv.N(); ++block)
│ │ │ │ -
176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
│ │ │ │ -
177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock];
│ │ │ │ -
178 }
│ │ │ │ -
179
│ │ │ │ -
182 static inline void arrayToRangeBlockVector (const Real* v,
│ │ │ │ -
183 RangeBlockVector& rbv)
│ │ │ │ -
184 {
│ │ │ │ -
185 for (rbv_size_type block = 0; block < rbv.N(); ++block)
│ │ │ │ -
186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
│ │ │ │ -
187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock];
│ │ │ │ -
188 }
│ │ │ │ -
189
│ │ │ │ -
190 protected:
│ │ │ │ -
191 // The DUNE-ISTL BCRSMatrix
│ │ │ │ -
192 const BCRSMatrix& A_;
│ │ │ │ +
128 virtual void apply (X& x, Y& b, InverseOperatorResult& res) = 0;
│ │ │ │ +
129
│ │ │ │ +
143 virtual void apply (X& x, Y& b, double reduction, InverseOperatorResult& res) = 0;
│ │ │ │ +
144
│ │ │ │ + │ │ │ │ +
147#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
│ │ │ │ +
148 {
│ │ │ │ +
149 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
│ │ │ │ +
150 }
│ │ │ │ +
151#else
│ │ │ │ +
152 = 0;
│ │ │ │ +
153#endif
│ │ │ │ +
154
│ │ │ │ +
156 virtual ~InverseOperator () {}
│ │ │ │ +
157
│ │ │ │ +
158 protected:
│ │ │ │ +
159 // spacing values
│ │ │ │ +
160 enum { iterationSpacing = 5 , normSpacing = 16 };
│ │ │ │ +
161
│ │ │ │ +
│ │ │ │ +
163 void printHeader(std::ostream& s) const
│ │ │ │ +
164 {
│ │ │ │ +
165 s << std::setw(iterationSpacing) << " Iter";
│ │ │ │ +
166 s << std::setw(normSpacing) << "Defect";
│ │ │ │ +
167 s << std::setw(normSpacing) << "Rate" << std::endl;
│ │ │ │ +
168 }
│ │ │ │ +
│ │ │ │ +
169
│ │ │ │ +
171 template <typename CountType, typename DataType>
│ │ │ │ +
│ │ │ │ +
172 void printOutput(std::ostream& s,
│ │ │ │ +
173 const CountType& iter,
│ │ │ │ +
174 const DataType& norm,
│ │ │ │ +
175 const DataType& norm_old) const
│ │ │ │ +
176 {
│ │ │ │ +
177 const DataType rate = norm/norm_old;
│ │ │ │ +
178 s << std::setw(iterationSpacing) << iter << " ";
│ │ │ │ +
179 s << std::setw(normSpacing) << Simd::io(norm) << " ";
│ │ │ │ +
180 s << std::setw(normSpacing) << Simd::io(rate) << std::endl;
│ │ │ │ +
181 }
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
184 template <typename CountType, typename DataType>
│ │ │ │ +
│ │ │ │ +
185 void printOutput(std::ostream& s,
│ │ │ │ +
186 const CountType& iter,
│ │ │ │ +
187 const DataType& norm) const
│ │ │ │ +
188 {
│ │ │ │ +
189 s << std::setw(iterationSpacing) << iter << " ";
│ │ │ │ +
190 s << std::setw(normSpacing) << Simd::io(norm) << std::endl;
│ │ │ │ +
191 }
│ │ │ │ +
│ │ │ │ +
192 };
│ │ │ │ +
│ │ │ │
193
│ │ │ │ -
194 // Number of rows and columns in the matrix
│ │ │ │ -
195 const int m_, n_;
│ │ │ │ -
196
│ │ │ │ -
197 // Auxiliary block vector objects which are
│ │ │ │ -
198 // compatible to matrix rows / columns
│ │ │ │ -
199 mutable DomainBlockVector domainBlockVector;
│ │ │ │ -
200 mutable RangeBlockVector rangeBlockVector;
│ │ │ │ -
201 };
│ │ │ │ -
202 } // end namespace Impl
│ │ │ │ -
203
│ │ │ │ -
243 template <typename BCRSMatrix, typename BlockVector>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
245 {
│ │ │ │ -
246 public:
│ │ │ │ - │ │ │ │ -
248
│ │ │ │ -
249 public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
269 const unsigned int nIterationsMax = 100000,
│ │ │ │ -
270 const unsigned int verbosity_level = 0)
│ │ │ │ -
271 : m_(m), nIterationsMax_(nIterationsMax),
│ │ │ │ -
272 verbosity_level_(verbosity_level),
│ │ │ │ -
273 nIterations_(0),
│ │ │ │ -
274 title_(" ArPackPlusPlus_Algorithms: "),
│ │ │ │ -
275 blank_(title_.length(),' ')
│ │ │ │ -
276 {}
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ -
│ │ │ │ -
289 inline void computeSymMaxMagnitude (const Real& epsilon,
│ │ │ │ -
290 BlockVector& x, Real& lambda) const
│ │ │ │ -
291 {
│ │ │ │ -
292 // print verbosity information
│ │ │ │ -
293 if (verbosity_level_ > 0)
│ │ │ │ -
294 std::cout << title_ << "Computing an approximation of "
│ │ │ │ -
295 << "the dominant eigenvalue of a matrix which "
│ │ │ │ -
296 << "is assumed to be symmetric." << std::endl;
│ │ │ │ -
297
│ │ │ │ -
298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ -
299 // and to perform the product A*v (LU decomposition is not used)
│ │ │ │ -
300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ -
301 WrappedMatrix A(m_);
│ │ │ │ -
302
│ │ │ │ -
303 // get number of rows and columns in A
│ │ │ │ -
304 const int nrows = A.nrows();
│ │ │ │ -
305 const int ncols = A.ncols();
│ │ │ │ -
306
│ │ │ │ -
307 // assert that A is square
│ │ │ │ -
308 if (nrows != ncols)
│ │ │ │ -
309 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ -
310 << nrows << "x" << ncols << ").");
│ │ │ │ -
311
│ │ │ │ -
312 // allocate memory for variables, set parameters
│ │ │ │ -
313 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ -
314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ -
315 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ -
316 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ -
317 Real* ev = new Real[nev]; // Computed eigenvalues of A
│ │ │ │ -
318 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ -
319 int nconv; // Number of converged eigenvalues
│ │ │ │ -
320
│ │ │ │ -
321 // define what we need: eigenvalues with largest magnitude
│ │ │ │ -
322 char which[] = "LM";
│ │ │ │ -
323 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ -
324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
│ │ │ │ -
325
│ │ │ │ -
326 // set ARPACK verbosity mode if requested
│ │ │ │ -
327 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ -
328
│ │ │ │ -
329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
│ │ │ │ -
330 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ -
331
│ │ │ │ -
332 // obtain approximated dominant eigenvalue of A
│ │ │ │ -
333 lambda = ev[nev-1];
│ │ │ │ -
334
│ │ │ │ -
335 // obtain associated approximated eigenvector of A
│ │ │ │ -
336 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ -
337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ -
338
│ │ │ │ -
339 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ -
340 nIterations_ = dprob.GetIter();
│ │ │ │ -
341
│ │ │ │ -
342 // compute residual norm
│ │ │ │ -
343 BlockVector r(x);
│ │ │ │ -
344 Real* Ax_raw = new Real[nrows];
│ │ │ │ -
345 A.multMv(x_raw,Ax_raw);
│ │ │ │ -
346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
│ │ │ │ -
347 r.axpy(-lambda,x);
│ │ │ │ -
348 const Real r_norm = r.two_norm();
│ │ │ │ -
349
│ │ │ │ -
350 // print verbosity information
│ │ │ │ -
351 if (verbosity_level_ > 0)
│ │ │ │ -
352 {
│ │ │ │ -
353 if (verbosity_level_ > 1)
│ │ │ │ -
354 {
│ │ │ │ -
355 // print some information about the problem
│ │ │ │ -
356 std::cout << blank_ << "Obtained eigenvalues of A by solving "
│ │ │ │ -
357 << "A*x = λ*x using the ARPACK++ class ARSym"
│ │ │ │ -
358 << "StdEig:" << std::endl;
│ │ │ │ -
359 std::cout << blank_ << " converged eigenvalues of A: "
│ │ │ │ -
360 << nconv << " / " << nev << std::endl;
│ │ │ │ -
361 std::cout << blank_ << " dominant eigenvalue of A: "
│ │ │ │ -
362 << lambda << std::endl;
│ │ │ │ -
363 }
│ │ │ │ -
364 std::cout << blank_ << "Result ("
│ │ │ │ -
365 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
366 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
367 << "λ = " << lambda << std::endl;
│ │ │ │ -
368 if (verbosity_level_ > 2)
│ │ │ │ -
369 {
│ │ │ │ -
370 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ -
371 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
372 }
│ │ │ │ -
373 }
│ │ │ │ -
374
│ │ │ │ -
375 // free dynamically allocated memory
│ │ │ │ -
376 delete[] Ax_raw;
│ │ │ │ -
377 delete[] ev;
│ │ │ │ -
378 }
│ │ │ │ -
│ │ │ │ -
379
│ │ │ │ -
│ │ │ │ -
391 inline void computeSymMinMagnitude (const Real& epsilon,
│ │ │ │ -
392 BlockVector& x, Real& lambda) const
│ │ │ │ -
393 {
│ │ │ │ -
394 // print verbosity information
│ │ │ │ -
395 if (verbosity_level_ > 0)
│ │ │ │ -
396 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ -
397 << "least dominant eigenvalue of a matrix which "
│ │ │ │ -
398 << "is assumed to be symmetric." << std::endl;
│ │ │ │ -
399
│ │ │ │ -
400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ -
401 // and to perform the product A*v (LU decomposition is not used)
│ │ │ │ -
402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ -
403 WrappedMatrix A(m_);
│ │ │ │ -
404
│ │ │ │ -
405 // get number of rows and columns in A
│ │ │ │ -
406 const int nrows = A.nrows();
│ │ │ │ -
407 const int ncols = A.ncols();
│ │ │ │ -
408
│ │ │ │ -
409 // assert that A is square
│ │ │ │ -
410 if (nrows != ncols)
│ │ │ │ -
411 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ -
412 << nrows << "x" << ncols << ").");
│ │ │ │ -
413
│ │ │ │ -
414 // allocate memory for variables, set parameters
│ │ │ │ -
415 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ -
416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ -
417 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ -
418 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ -
419 Real* ev = new Real[nev]; // Computed eigenvalues of A
│ │ │ │ -
420 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ -
421 int nconv; // Number of converged eigenvalues
│ │ │ │ -
422
│ │ │ │ -
423 // define what we need: eigenvalues with smallest magnitude
│ │ │ │ -
424 char which[] = "SM";
│ │ │ │ -
425 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ -
426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
│ │ │ │ -
427
│ │ │ │ -
428 // set ARPACK verbosity mode if requested
│ │ │ │ -
429 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ -
430
│ │ │ │ -
431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
│ │ │ │ -
432 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ -
433
│ │ │ │ -
434 // obtain approximated least dominant eigenvalue of A
│ │ │ │ -
435 lambda = ev[nev-1];
│ │ │ │ -
436
│ │ │ │ -
437 // obtain associated approximated eigenvector of A
│ │ │ │ -
438 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ -
439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ -
440
│ │ │ │ -
441 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ -
442 nIterations_ = dprob.GetIter();
│ │ │ │ -
443
│ │ │ │ -
444 // compute residual norm
│ │ │ │ -
445 BlockVector r(x);
│ │ │ │ -
446 Real* Ax_raw = new Real[nrows];
│ │ │ │ -
447 A.multMv(x_raw,Ax_raw);
│ │ │ │ -
448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
│ │ │ │ -
449 r.axpy(-lambda,x);
│ │ │ │ -
450 const Real r_norm = r.two_norm();
│ │ │ │ -
451
│ │ │ │ -
452 // print verbosity information
│ │ │ │ -
453 if (verbosity_level_ > 0)
│ │ │ │ -
454 {
│ │ │ │ -
455 if (verbosity_level_ > 1)
│ │ │ │ -
456 {
│ │ │ │ -
457 // print some information about the problem
│ │ │ │ -
458 std::cout << blank_ << "Obtained eigenvalues of A by solving "
│ │ │ │ -
459 << "A*x = λ*x using the ARPACK++ class ARSym"
│ │ │ │ -
460 << "StdEig:" << std::endl;
│ │ │ │ -
461 std::cout << blank_ << " converged eigenvalues of A: "
│ │ │ │ -
462 << nconv << " / " << nev << std::endl;
│ │ │ │ -
463 std::cout << blank_ << " least dominant eigenvalue of A: "
│ │ │ │ -
464 << lambda << std::endl;
│ │ │ │ -
465 }
│ │ │ │ -
466 std::cout << blank_ << "Result ("
│ │ │ │ -
467 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
468 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
469 << "λ = " << lambda << std::endl;
│ │ │ │ -
470 if (verbosity_level_ > 2)
│ │ │ │ -
471 {
│ │ │ │ -
472 // print approximated eigenvector via DUNE-ISTL I/O methods
│ │ │ │ -
473 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
474 }
│ │ │ │ -
475 }
│ │ │ │ -
476
│ │ │ │ -
477 // free dynamically allocated memory
│ │ │ │ -
478 delete[] Ax_raw;
│ │ │ │ -
479 delete[] ev;
│ │ │ │ -
480 }
│ │ │ │ -
│ │ │ │ -
481
│ │ │ │ -
│ │ │ │ -
493 inline void computeSymCond2 (const Real& epsilon, Real& cond_2) const
│ │ │ │ -
494 {
│ │ │ │ -
495 // print verbosity information
│ │ │ │ -
496 if (verbosity_level_ > 0)
│ │ │ │ -
497 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ -
498 << "spectral condition number of a matrix which "
│ │ │ │ -
499 << "is assumed to be symmetric." << std::endl;
│ │ │ │ -
500
│ │ │ │ -
501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ -
502 // and to perform the product A*v (LU decomposition is not used)
│ │ │ │ -
503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ -
504 WrappedMatrix A(m_);
│ │ │ │ -
505
│ │ │ │ -
506 // get number of rows and columns in A
│ │ │ │ -
507 const int nrows = A.nrows();
│ │ │ │ -
508 const int ncols = A.ncols();
│ │ │ │ -
509
│ │ │ │ -
510 // assert that A is square
│ │ │ │ -
511 if (nrows != ncols)
│ │ │ │ -
512 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
│ │ │ │ -
513 << nrows << "x" << ncols << ").");
│ │ │ │ -
514
│ │ │ │ -
515 // allocate memory for variables, set parameters
│ │ │ │ -
516 const int nev = 2; // Number of eigenvalues to compute
│ │ │ │ -
517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ -
518 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ -
519 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ -
520 Real* ev = new Real[nev]; // Computed eigenvalues of A
│ │ │ │ -
521 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ -
522 int nconv; // Number of converged eigenvalues
│ │ │ │ -
523
│ │ │ │ -
524 // define what we need: eigenvalues from both ends of the spectrum
│ │ │ │ -
525 char which[] = "BE";
│ │ │ │ -
526 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ -
527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
│ │ │ │ -
528
│ │ │ │ -
529 // set ARPACK verbosity mode if requested
│ │ │ │ -
530 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ -
531
│ │ │ │ -
532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
│ │ │ │ -
533 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ -
534
│ │ │ │ -
535 // obtain approximated dominant and least dominant eigenvalue of A
│ │ │ │ -
536 const Real& lambda_max = ev[nev-1];
│ │ │ │ -
537 const Real& lambda_min = ev[0];
│ │ │ │ -
538
│ │ │ │ -
539 // obtain associated approximated eigenvectors of A
│ │ │ │ -
540 Real* x_max_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ -
541 Real* x_min_raw = dprob.RawEigenvector(0);
│ │ │ │ -
542
│ │ │ │ -
543 // obtain approximated spectral condition number of A
│ │ │ │ -
544 cond_2 = std::abs(lambda_max / lambda_min);
│ │ │ │ +
202 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
203 class IterativeSolver : public InverseOperator<X,Y>{
│ │ │ │ +
204 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
208 using typename InverseOperator<X,Y>::real_type;
│ │ │ │ + │ │ │ │ +
210
│ │ │ │ +
│ │ │ │ +
230 IterativeSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int maxit, int verbose) :
│ │ │ │ +
231 _op(stackobject_to_shared_ptr(op)),
│ │ │ │ +
232 _prec(stackobject_to_shared_ptr(prec)),
│ │ │ │ +
233 _sp(new SeqScalarProduct<X>),
│ │ │ │ +
234 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::sequential)
│ │ │ │ +
235 {
│ │ │ │ + │ │ │ │ +
237 DUNE_THROW(InvalidSolverCategory, "LinearOperator has to be sequential!");
│ │ │ │ + │ │ │ │ +
239 DUNE_THROW(InvalidSolverCategory, "Preconditioner has to be sequential!");
│ │ │ │ +
240 }
│ │ │ │ +
│ │ │ │ +
241
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
263 scalar_real_type reduction, int maxit, int verbose) :
│ │ │ │ +
264 _op(stackobject_to_shared_ptr(op)),
│ │ │ │ +
265 _prec(stackobject_to_shared_ptr(prec)),
│ │ │ │ +
266 _sp(stackobject_to_shared_ptr(sp)),
│ │ │ │ +
267 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::category(op))
│ │ │ │ +
268 {
│ │ │ │ + │ │ │ │ +
270 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
│ │ │ │ + │ │ │ │ +
272 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
│ │ │ │ +
273 }
│ │ │ │ +
│ │ │ │ +
274
│ │ │ │ +
│ │ │ │ +
290 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ +
291 IterativeSolver(op,std::make_shared<SeqScalarProduct<X>>(),prec,
│ │ │ │ +
292 configuration.get<real_type>("reduction"),
│ │ │ │ +
293 configuration.get<int>("maxit"),
│ │ │ │ +
294 configuration.get<int>("verbose"))
│ │ │ │ +
295 {}
│ │ │ │ +
│ │ │ │ +
296
│ │ │ │ +
│ │ │ │ +
313 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<const ScalarProduct<X> > sp, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
│ │ │ │ +
314 IterativeSolver(op,sp,prec,
│ │ │ │ +
315 configuration.get<scalar_real_type>("reduction"),
│ │ │ │ +
316 configuration.get<int>("maxit"),
│ │ │ │ +
317 configuration.get<int>("verbose"))
│ │ │ │ +
318 {}
│ │ │ │ +
│ │ │ │ +
319
│ │ │ │ +
│ │ │ │ +
340 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
│ │ │ │ +
341 std::shared_ptr<const ScalarProduct<X>> sp,
│ │ │ │ +
342 std::shared_ptr<Preconditioner<X,Y>> prec,
│ │ │ │ +
343 scalar_real_type reduction, int maxit, int verbose) :
│ │ │ │ +
344 _op(op),
│ │ │ │ +
345 _prec(prec),
│ │ │ │ +
346 _sp(sp),
│ │ │ │ +
347 _reduction(reduction), _maxit(maxit), _verbose(verbose),
│ │ │ │ + │ │ │ │ +
349 {
│ │ │ │ + │ │ │ │ +
351 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
│ │ │ │ + │ │ │ │ +
353 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
│ │ │ │ +
354 }
│ │ │ │ +
│ │ │ │ +
355
│ │ │ │ +
356 // #warning actually we want to have this as the default and just implement the second one
│ │ │ │ +
357 // //! \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
│ │ │ │ +
358 // virtual void apply (X& x, Y& b, InverseOperatorResult& res)
│ │ │ │ +
359 // {
│ │ │ │ +
360 // apply(x,b,_reduction,res);
│ │ │ │ +
361 // }
│ │ │ │ +
362
│ │ │ │ +
363#ifndef DOXYGEN
│ │ │ │ +
364 // make sure the three-argument apply from the base class does not get shadowed
│ │ │ │ +
365 // by the redefined four-argument version below
│ │ │ │ +
366 using InverseOperator<X,Y>::apply;
│ │ │ │ +
367#endif
│ │ │ │ +
368
│ │ │ │ +
│ │ │ │ +
374 virtual void apply (X& x, X& b, double reduction, InverseOperatorResult& res)
│ │ │ │ +
375 {
│ │ │ │ +
376 scalar_real_type saved_reduction = _reduction;
│ │ │ │ +
377 _reduction = reduction;
│ │ │ │ +
378 this->apply(x,b,res);
│ │ │ │ +
379 _reduction = saved_reduction;
│ │ │ │ +
380 }
│ │ │ │ +
│ │ │ │ +
381
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
384 {
│ │ │ │ +
385 return _category;
│ │ │ │ +
386 }
│ │ │ │ +
│ │ │ │ +
387
│ │ │ │ +
│ │ │ │ +
388 std::string name() const{
│ │ │ │ +
389 std::string name = className(*this);
│ │ │ │ +
390 return name.substr(0, name.find("<"));
│ │ │ │ +
391 }
│ │ │ │ +
│ │ │ │ +
392
│ │ │ │ +
410 template<class CountType = unsigned int>
│ │ │ │ +
│ │ │ │ +
411 class Iteration {
│ │ │ │ +
412 public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
414 : _i(0)
│ │ │ │ +
415 , _res(res)
│ │ │ │ +
416 , _parent(parent)
│ │ │ │ +
417 , _valid(true)
│ │ │ │ +
418 {
│ │ │ │ +
419 res.clear();
│ │ │ │ +
420 if(_parent._verbose>0){
│ │ │ │ +
421 std::cout << "=== " << parent.name() << std::endl;
│ │ │ │ +
422 if(_parent._verbose > 1)
│ │ │ │ +
423 _parent.printHeader(std::cout);
│ │ │ │ +
424 }
│ │ │ │ +
425 }
│ │ │ │ +
│ │ │ │ +
426
│ │ │ │ +
427 Iteration(const Iteration&) = delete;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
429 : _def0(other._def0)
│ │ │ │ +
430 , _def(other._def)
│ │ │ │ +
431 , _i(other._i)
│ │ │ │ +
432 , _watch(other._watch)
│ │ │ │ +
433 , _res(other._res)
│ │ │ │ +
434 , _parent(other._parent)
│ │ │ │ +
435 , _valid(other._valid)
│ │ │ │ +
436 {
│ │ │ │ +
437 other._valid = false;
│ │ │ │ +
438 }
│ │ │ │ +
│ │ │ │ +
439
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
441 if(_valid)
│ │ │ │ +
442 finalize();
│ │ │ │ +
443 }
│ │ │ │ +
│ │ │ │ +
444
│ │ │ │ +
│ │ │ │ +
455 bool step(CountType i, real_type def){
│ │ │ │ +
456 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN
│ │ │ │ +
457 {
│ │ │ │ +
458 if (_parent._verbose>0)
│ │ │ │ +
459 std::cout << "=== " << _parent.name() << ": abort due to infinite or NaN defect"
│ │ │ │ +
460 << std::endl;
│ │ │ │ +
461 DUNE_THROW(SolverAbort,
│ │ │ │ +
462 _parent.name() << ": defect=" << Simd::io(def)
│ │ │ │ +
463 << " is infinite or NaN");
│ │ │ │ +
464 }
│ │ │ │ +
465 if(i == 0)
│ │ │ │ +
466 _def0 = def;
│ │ │ │ +
467 if(_parent._verbose > 1){
│ │ │ │ +
468 if(i!=0)
│ │ │ │ +
469 _parent.printOutput(std::cout,i,def,_def);
│ │ │ │ +
470 else
│ │ │ │ +
471 _parent.printOutput(std::cout,i,def);
│ │ │ │ +
472 }
│ │ │ │ +
473 _def = def;
│ │ │ │ +
474 _i = i;
│ │ │ │ +
475 _res.converged = (Simd::allTrue(def<_def0*_parent._reduction || def<real_type(1E-30))); // convergence check
│ │ │ │ +
476 return _res.converged;
│ │ │ │ +
477 }
│ │ │ │ +
│ │ │ │ +
478
│ │ │ │ +
479 protected:
│ │ │ │ +
│ │ │ │ +
480 void finalize(){
│ │ │ │ +
481 _res.converged = (Simd::allTrue(_def<_def0*_parent._reduction || _def<real_type(1E-30)));
│ │ │ │ + │ │ │ │ +
483 _res.reduction = static_cast<double>(Simd::max(_def/_def0));
│ │ │ │ +
484 _res.conv_rate = pow(_res.reduction,1.0/_i);
│ │ │ │ +
485 _res.elapsed = _watch.elapsed();
│ │ │ │ +
486 if (_parent._verbose>0) // final print
│ │ │ │ +
487 {
│ │ │ │ +
488 std::cout << "=== rate=" << _res.conv_rate
│ │ │ │ +
489 << ", T=" << _res.elapsed
│ │ │ │ +
490 << ", TIT=" << _res.elapsed/_res.iterations
│ │ │ │ +
491 << ", IT=" << _res.iterations << std::endl;
│ │ │ │ +
492 }
│ │ │ │ +
493 }
│ │ │ │ +
│ │ │ │ +
494
│ │ │ │ +
495 real_type _def0 = 0.0, _def = 0.0;
│ │ │ │ +
496 CountType _i;
│ │ │ │ +
497 Timer _watch;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
500 bool _valid;
│ │ │ │ +
501 };
│ │ │ │ +
│ │ │ │ +
502
│ │ │ │ +
503 protected:
│ │ │ │ +
504 std::shared_ptr<const LinearOperator<X,Y>> _op;
│ │ │ │ +
505 std::shared_ptr<Preconditioner<X,Y>> _prec;
│ │ │ │ +
506 std::shared_ptr<const ScalarProduct<X>> _sp;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
511 };
│ │ │ │ +
│ │ │ │ +
512
│ │ │ │ +
520 template <typename ISTLLinearSolver, typename BCRSMatrix>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
522 {
│ │ │ │ +
523 public:
│ │ │ │ +
│ │ │ │ +
524 static void setMatrix (ISTLLinearSolver& solver,
│ │ │ │ +
525 const BCRSMatrix& matrix)
│ │ │ │ +
526 {
│ │ │ │ +
527 static const bool is_direct_solver
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
531 }
│ │ │ │ +
│ │ │ │ +
532
│ │ │ │ +
533 protected:
│ │ │ │ +
538 template <bool is_direct_solver, typename Dummy = void>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
540 {
│ │ │ │ +
│ │ │ │ +
541 static void setMatrix (ISTLLinearSolver&,
│ │ │ │ +
542 const BCRSMatrix&)
│ │ │ │ +
543 {}
│ │ │ │ +
│ │ │ │ +
544 };
│ │ │ │ +
│ │ │ │
545
│ │ │ │ -
546 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ -
547 nIterations_ = dprob.GetIter();
│ │ │ │ -
548
│ │ │ │ -
549 // compute each residual norm
│ │ │ │ -
550 Real* Ax_max_raw = new Real[nrows];
│ │ │ │ -
551 Real* Ax_min_raw = new Real[nrows];
│ │ │ │ -
552 A.multMv(x_max_raw,Ax_max_raw);
│ │ │ │ -
553 A.multMv(x_min_raw,Ax_min_raw);
│ │ │ │ -
554 Real r_max_norm = 0.0;
│ │ │ │ -
555 Real r_min_norm = 0.0;
│ │ │ │ -
556 for (int i = 0; i < nrows; ++i)
│ │ │ │ -
557 {
│ │ │ │ -
558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2);
│ │ │ │ -
559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2);
│ │ │ │ -
560 }
│ │ │ │ -
561 r_max_norm = std::sqrt(r_max_norm);
│ │ │ │ -
562 r_min_norm = std::sqrt(r_min_norm);
│ │ │ │ -
563
│ │ │ │ -
564 // print verbosity information
│ │ │ │ -
565 if (verbosity_level_ > 0)
│ │ │ │ -
566 {
│ │ │ │ -
567 if (verbosity_level_ > 1)
│ │ │ │ -
568 {
│ │ │ │ -
569 // print some information about the problem
│ │ │ │ -
570 std::cout << blank_ << "Obtained eigenvalues of A by solving "
│ │ │ │ -
571 << "A*x = λ*x using the ARPACK++ class ARSym"
│ │ │ │ -
572 << "StdEig:" << std::endl;
│ │ │ │ -
573 std::cout << blank_ << " converged eigenvalues of A: "
│ │ │ │ -
574 << nconv << " / " << nev << std::endl;
│ │ │ │ -
575 std::cout << blank_ << " dominant eigenvalue of A: "
│ │ │ │ -
576 << lambda_max << std::endl;
│ │ │ │ -
577 std::cout << blank_ << " least dominant eigenvalue of A: "
│ │ │ │ -
578 << lambda_min << std::endl;
│ │ │ │ -
579 std::cout << blank_ << " spectral condition number of A: "
│ │ │ │ -
580 << cond_2 << std::endl;
│ │ │ │ -
581 }
│ │ │ │ -
582 std::cout << blank_ << "Result ("
│ │ │ │ -
583 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
584 << "║residual║_2 = {" << r_max_norm << ","
│ │ │ │ -
585 << r_min_norm << "}, " << "λ = {"
│ │ │ │ -
586 << lambda_max << "," << lambda_min
│ │ │ │ -
587 << "}): cond_2 = " << cond_2 << std::endl;
│ │ │ │ -
588 }
│ │ │ │ -
589
│ │ │ │ -
590 // free dynamically allocated memory
│ │ │ │ -
591 delete[] Ax_min_raw;
│ │ │ │ -
592 delete[] Ax_max_raw;
│ │ │ │ -
593 delete[] ev;
│ │ │ │ -
594 }
│ │ │ │ -
│ │ │ │ -
595
│ │ │ │ -
│ │ │ │ -
609 inline void computeNonSymMax (const Real& epsilon,
│ │ │ │ -
610 BlockVector& x, Real& sigma) const
│ │ │ │ -
611 {
│ │ │ │ -
612 // print verbosity information
│ │ │ │ -
613 if (verbosity_level_ > 0)
│ │ │ │ -
614 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ -
615 << "largest singular value of a matrix which "
│ │ │ │ -
616 << "is assumed to be nonsymmetric." << std::endl;
│ │ │ │ -
617
│ │ │ │ -
618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ -
619 // and to perform the product A^T*A*v (LU decomposition is not used)
│ │ │ │ -
620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ -
621 WrappedMatrix A(m_);
│ │ │ │ -
622
│ │ │ │ -
623 // get number of rows and columns in A
│ │ │ │ -
624 const int nrows = A.nrows();
│ │ │ │ -
625 const int ncols = A.ncols();
│ │ │ │ -
626
│ │ │ │ -
627 // assert that A has more rows than columns (extend code later to the opposite case!)
│ │ │ │ -
628 if (nrows < ncols)
│ │ │ │ -
629 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
│ │ │ │ -
630 << "columns (" << nrows << "x" << ncols << ")."
│ │ │ │ -
631 << " This case is not implemented, yet.");
│ │ │ │ -
632
│ │ │ │ -
633 // allocate memory for variables, set parameters
│ │ │ │ -
634 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ -
635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ -
636 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ -
637 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ -
638 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
│ │ │ │ -
639 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ -
640 int nconv; // Number of converged eigenvalues
│ │ │ │ -
641
│ │ │ │ -
642 // define what we need: eigenvalues with largest algebraic value
│ │ │ │ -
643 char which[] = "LA";
│ │ │ │ -
644 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ -
645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
│ │ │ │ -
646
│ │ │ │ -
647 // set ARPACK verbosity mode if requested
│ │ │ │ -
648 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ -
649
│ │ │ │ -
650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
│ │ │ │ -
651 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ -
652
│ │ │ │ -
653 // obtain approximated largest eigenvalue of A^T*A
│ │ │ │ -
654 const Real& lambda = ev[nev-1];
│ │ │ │ -
655
│ │ │ │ -
656 // obtain associated approximated eigenvector of A^T*A
│ │ │ │ -
657 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ -
658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ -
659
│ │ │ │ -
660 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ -
661 nIterations_ = dprob.GetIter();
│ │ │ │ -
662
│ │ │ │ -
663 // compute residual norm
│ │ │ │ -
664 BlockVector r(x);
│ │ │ │ -
665 Real* AtAx_raw = new Real[ncols];
│ │ │ │ -
666 A.multMtMv(x_raw,AtAx_raw);
│ │ │ │ -
667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
│ │ │ │ -
668 r.axpy(-lambda,x);
│ │ │ │ -
669 const Real r_norm = r.two_norm();
│ │ │ │ -
670
│ │ │ │ -
671 // calculate largest singular value of A (note that
│ │ │ │ -
672 // x is right-singular / left-singular vector of A)
│ │ │ │ -
673 sigma = std::sqrt(lambda);
│ │ │ │ -
674
│ │ │ │ -
675 // print verbosity information
│ │ │ │ -
676 if (verbosity_level_ > 0)
│ │ │ │ -
677 {
│ │ │ │ -
678 if (verbosity_level_ > 1)
│ │ │ │ -
679 {
│ │ │ │ -
680 // print some information about the problem
│ │ │ │ -
681 std::cout << blank_ << "Obtained singular values of A by sol"
│ │ │ │ -
682 << "ving (A^T*A)*x = σ²*x using the ARPACK++ "
│ │ │ │ -
683 << "class ARSymStdEig:" << std::endl;
│ │ │ │ -
684 std::cout << blank_ << " converged eigenvalues of A^T*A: "
│ │ │ │ -
685 << nconv << " / " << nev << std::endl;
│ │ │ │ -
686 std::cout << blank_ << " largest eigenvalue of A^T*A: "
│ │ │ │ -
687 << lambda << std::endl;
│ │ │ │ -
688 std::cout << blank_ << " => largest singular value of A: "
│ │ │ │ -
689 << sigma << std::endl;
│ │ │ │ -
690 }
│ │ │ │ -
691 std::cout << blank_ << "Result ("
│ │ │ │ -
692 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
693 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
694 << "σ = " << sigma << std::endl;
│ │ │ │ -
695 if (verbosity_level_ > 2)
│ │ │ │ -
696 {
│ │ │ │ -
697 // print approximated right-singular / left-singular vector
│ │ │ │ -
698 // via DUNE-ISTL I/O methods
│ │ │ │ -
699 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
700 }
│ │ │ │ -
701 }
│ │ │ │ -
702
│ │ │ │ -
703 // free dynamically allocated memory
│ │ │ │ -
704 delete[] AtAx_raw;
│ │ │ │ -
705 delete[] ev;
│ │ │ │ -
706 }
│ │ │ │ -
│ │ │ │ -
707
│ │ │ │ -
│ │ │ │ -
721 inline void computeNonSymMin (const Real& epsilon,
│ │ │ │ -
722 BlockVector& x, Real& sigma) const
│ │ │ │ -
723 {
│ │ │ │ -
724 // print verbosity information
│ │ │ │ -
725 if (verbosity_level_ > 0)
│ │ │ │ -
726 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ -
727 << "smallest singular value of a matrix which "
│ │ │ │ -
728 << "is assumed to be nonsymmetric." << std::endl;
│ │ │ │ -
729
│ │ │ │ -
730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ -
731 // and to perform the product A^T*A*v (LU decomposition is not used)
│ │ │ │ -
732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ -
733 WrappedMatrix A(m_);
│ │ │ │ -
734
│ │ │ │ -
735 // get number of rows and columns in A
│ │ │ │ -
736 const int nrows = A.nrows();
│ │ │ │ -
737 const int ncols = A.ncols();
│ │ │ │ -
738
│ │ │ │ -
739 // assert that A has more rows than columns (extend code later to the opposite case!)
│ │ │ │ -
740 if (nrows < ncols)
│ │ │ │ -
741 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
│ │ │ │ -
742 << "columns (" << nrows << "x" << ncols << ")."
│ │ │ │ -
743 << " This case is not implemented, yet.");
│ │ │ │ -
744
│ │ │ │ -
745 // allocate memory for variables, set parameters
│ │ │ │ -
746 const int nev = 1; // Number of eigenvalues to compute
│ │ │ │ -
747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ -
748 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ -
749 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ -
750 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
│ │ │ │ -
751 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ -
752 int nconv; // Number of converged eigenvalues
│ │ │ │ -
753
│ │ │ │ -
754 // define what we need: eigenvalues with smallest algebraic value
│ │ │ │ -
755 char which[] = "SA";
│ │ │ │ -
756 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ -
757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
│ │ │ │ -
758
│ │ │ │ -
759 // set ARPACK verbosity mode if requested
│ │ │ │ -
760 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ -
761
│ │ │ │ -
762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
│ │ │ │ -
763 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ -
764
│ │ │ │ -
765 // obtain approximated smallest eigenvalue of A^T*A
│ │ │ │ -
766 const Real& lambda = ev[nev-1];
│ │ │ │ -
767
│ │ │ │ -
768 // obtain associated approximated eigenvector of A^T*A
│ │ │ │ -
769 Real* x_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ -
770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
│ │ │ │ -
771
│ │ │ │ -
772 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ -
773 nIterations_ = dprob.GetIter();
│ │ │ │ -
774
│ │ │ │ -
775 // compute residual norm
│ │ │ │ -
776 BlockVector r(x);
│ │ │ │ -
777 Real* AtAx_raw = new Real[ncols];
│ │ │ │ -
778 A.multMtMv(x_raw,AtAx_raw);
│ │ │ │ -
779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
│ │ │ │ -
780 r.axpy(-lambda,x);
│ │ │ │ -
781 const Real r_norm = r.two_norm();
│ │ │ │ -
782
│ │ │ │ -
783 // calculate smallest singular value of A (note that
│ │ │ │ -
784 // x is right-singular / left-singular vector of A)
│ │ │ │ -
785 sigma = std::sqrt(lambda);
│ │ │ │ -
786
│ │ │ │ -
787 // print verbosity information
│ │ │ │ -
788 if (verbosity_level_ > 0)
│ │ │ │ -
789 {
│ │ │ │ -
790 if (verbosity_level_ > 1)
│ │ │ │ -
791 {
│ │ │ │ -
792 // print some information about the problem
│ │ │ │ -
793 std::cout << blank_ << "Obtained singular values of A by sol"
│ │ │ │ -
794 << "ving (A^T*A)*x = σ²*x using the ARPACK++ "
│ │ │ │ -
795 << "class ARSymStdEig:" << std::endl;
│ │ │ │ -
796 std::cout << blank_ << " converged eigenvalues of A^T*A: "
│ │ │ │ -
797 << nconv << " / " << nev << std::endl;
│ │ │ │ -
798 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
│ │ │ │ -
799 << lambda << std::endl;
│ │ │ │ -
800 std::cout << blank_ << " => smallest singular value of A: "
│ │ │ │ -
801 << sigma << std::endl;
│ │ │ │ -
802 }
│ │ │ │ -
803 std::cout << blank_ << "Result ("
│ │ │ │ -
804 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
805 << "║residual║_2 = " << r_norm << "): "
│ │ │ │ -
806 << "σ = " << sigma << std::endl;
│ │ │ │ -
807 if (verbosity_level_ > 2)
│ │ │ │ -
808 {
│ │ │ │ -
809 // print approximated right-singular / left-singular vector
│ │ │ │ -
810 // via DUNE-ISTL I/O methods
│ │ │ │ -
811 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
│ │ │ │ -
812 }
│ │ │ │ -
813 }
│ │ │ │ -
814
│ │ │ │ -
815 // free dynamically allocated memory
│ │ │ │ -
816 delete[] AtAx_raw;
│ │ │ │ -
817 delete[] ev;
│ │ │ │ -
818 }
│ │ │ │ -
│ │ │ │ -
819
│ │ │ │ -
│ │ │ │ -
830 inline void computeNonSymCond2 (const Real& epsilon, Real& cond_2) const
│ │ │ │ -
831 {
│ │ │ │ -
832 // print verbosity information
│ │ │ │ -
833 if (verbosity_level_ > 0)
│ │ │ │ -
834 std::cout << title_ << "Computing an approximation of the "
│ │ │ │ -
835 << "spectral condition number of a matrix which "
│ │ │ │ -
836 << "is assumed to be nonsymmetric." << std::endl;
│ │ │ │ -
837
│ │ │ │ -
838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
│ │ │ │ -
839 // and to perform the product A^T*A*v (LU decomposition is not used)
│ │ │ │ -
840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
│ │ │ │ -
841 WrappedMatrix A(m_);
│ │ │ │ -
842
│ │ │ │ -
843 // get number of rows and columns in A
│ │ │ │ -
844 const int nrows = A.nrows();
│ │ │ │ -
845 const int ncols = A.ncols();
│ │ │ │ -
846
│ │ │ │ -
847 // assert that A has more rows than columns (extend code later to the opposite case!)
│ │ │ │ -
848 if (nrows < ncols)
│ │ │ │ -
849 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
│ │ │ │ -
850 << "columns (" << nrows << "x" << ncols << ")."
│ │ │ │ -
851 << " This case is not implemented, yet.");
│ │ │ │ -
852
│ │ │ │ -
853 // allocate memory for variables, set parameters
│ │ │ │ -
854 const int nev = 2; // Number of eigenvalues to compute
│ │ │ │ -
855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
│ │ │ │ -
856 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
│ │ │ │ -
857 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
│ │ │ │ -
858 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
│ │ │ │ -
859 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
│ │ │ │ -
860 int nconv; // Number of converged eigenvalues
│ │ │ │ -
861
│ │ │ │ -
862 // define what we need: eigenvalues from both ends of the spectrum
│ │ │ │ -
863 char which[] = "BE";
│ │ │ │ -
864 ARSymStdEig<Real,WrappedMatrix>
│ │ │ │ -
865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
│ │ │ │ -
866
│ │ │ │ -
867 // set ARPACK verbosity mode if requested
│ │ │ │ -
868 if (verbosity_level_ > 3) dprob.Trace();
│ │ │ │ -
869
│ │ │ │ -
870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
│ │ │ │ -
871 nconv = dprob.Eigenvalues(ev,ivec);
│ │ │ │ -
872
│ │ │ │ -
873 // obtain approximated largest and smallest eigenvalue of A^T*A
│ │ │ │ -
874 const Real& lambda_max = ev[nev-1];
│ │ │ │ -
875 const Real& lambda_min = ev[0];
│ │ │ │ -
876
│ │ │ │ -
877 // obtain associated approximated eigenvectors of A^T*A
│ │ │ │ -
878 Real* x_max_raw = dprob.RawEigenvector(nev-1);
│ │ │ │ -
879 Real* x_min_raw = dprob.RawEigenvector(0);
│ │ │ │ -
880
│ │ │ │ -
881 // obtain number of Arnoldi update iterations actually taken
│ │ │ │ -
882 nIterations_ = dprob.GetIter();
│ │ │ │ -
883
│ │ │ │ -
884 // compute each residual norm
│ │ │ │ -
885 Real* AtAx_max_raw = new Real[ncols];
│ │ │ │ -
886 Real* AtAx_min_raw = new Real[ncols];
│ │ │ │ -
887 A.multMtMv(x_max_raw,AtAx_max_raw);
│ │ │ │ -
888 A.multMtMv(x_min_raw,AtAx_min_raw);
│ │ │ │ -
889 Real r_max_norm = 0.0;
│ │ │ │ -
890 Real r_min_norm = 0.0;
│ │ │ │ -
891 for (int i = 0; i < ncols; ++i)
│ │ │ │ -
892 {
│ │ │ │ -
893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2);
│ │ │ │ -
894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2);
│ │ │ │ -
895 }
│ │ │ │ -
896 r_max_norm = std::sqrt(r_max_norm);
│ │ │ │ -
897 r_min_norm = std::sqrt(r_min_norm);
│ │ │ │ -
898
│ │ │ │ -
899 // calculate largest and smallest singular value of A
│ │ │ │ -
900 const Real sigma_max = std::sqrt(lambda_max);
│ │ │ │ -
901 const Real sigma_min = std::sqrt(lambda_min);
│ │ │ │ -
902
│ │ │ │ -
903 // obtain approximated spectral condition number of A
│ │ │ │ -
904 cond_2 = sigma_max / sigma_min;
│ │ │ │ -
905
│ │ │ │ -
906 // print verbosity information
│ │ │ │ -
907 if (verbosity_level_ > 0)
│ │ │ │ -
908 {
│ │ │ │ -
909 if (verbosity_level_ > 1)
│ │ │ │ -
910 {
│ │ │ │ -
911 // print some information about the problem
│ │ │ │ -
912 std::cout << blank_ << "Obtained singular values of A by sol"
│ │ │ │ -
913 << "ving (A^T*A)*x = σ²*x using the ARPACK++ "
│ │ │ │ -
914 << "class ARSymStdEig:" << std::endl;
│ │ │ │ -
915 std::cout << blank_ << " converged eigenvalues of A^T*A: "
│ │ │ │ -
916 << nconv << " / " << nev << std::endl;
│ │ │ │ -
917 std::cout << blank_ << " largest eigenvalue of A^T*A: "
│ │ │ │ -
918 << lambda_max << std::endl;
│ │ │ │ -
919 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
│ │ │ │ -
920 << lambda_min << std::endl;
│ │ │ │ -
921 std::cout << blank_ << " => largest singular value of A: "
│ │ │ │ -
922 << sigma_max << std::endl;
│ │ │ │ -
923 std::cout << blank_ << " => smallest singular value of A: "
│ │ │ │ -
924 << sigma_min << std::endl;
│ │ │ │ -
925 }
│ │ │ │ -
926 std::cout << blank_ << "Result ("
│ │ │ │ -
927 << "#iterations = " << nIterations_ << ", "
│ │ │ │ -
928 << "║residual║_2 = {" << r_max_norm << ","
│ │ │ │ -
929 << r_min_norm << "}, " << "σ = {"
│ │ │ │ -
930 << sigma_max << "," << sigma_min
│ │ │ │ -
931 << "}): cond_2 = " << cond_2 << std::endl;
│ │ │ │ -
932 }
│ │ │ │ -
933
│ │ │ │ -
934 // free dynamically allocated memory
│ │ │ │ -
935 delete[] AtAx_min_raw;
│ │ │ │ -
936 delete[] AtAx_max_raw;
│ │ │ │ -
937 delete[] ev;
│ │ │ │ -
938 }
│ │ │ │ -
│ │ │ │ -
939
│ │ │ │ -
│ │ │ │ -
944 inline unsigned int getIterationCount () const
│ │ │ │ -
945 {
│ │ │ │ -
946 if (nIterations_ == 0)
│ │ │ │ -
947 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
│ │ │ │ -
948
│ │ │ │ -
949 return nIterations_;
│ │ │ │ -
950 }
│ │ │ │ -
│ │ │ │ -
951
│ │ │ │ -
952 protected:
│ │ │ │ -
953 // parameters related to iterative eigenvalue algorithms
│ │ │ │ - │ │ │ │ -
955 const unsigned int nIterationsMax_;
│ │ │ │ -
956
│ │ │ │ -
957 // verbosity setting
│ │ │ │ -
958 const unsigned int verbosity_level_;
│ │ │ │ -
959
│ │ │ │ -
960 // memory for storing temporary variables (mutable as they shall
│ │ │ │ -
961 // just be effectless auxiliary variables of the const apply*(...)
│ │ │ │ -
962 // methods)
│ │ │ │ -
963 mutable unsigned int nIterations_;
│ │ │ │ -
964
│ │ │ │ -
965 // constants for printing verbosity information
│ │ │ │ -
966 const std::string title_;
│ │ │ │ -
967 const std::string blank_;
│ │ │ │ -
968 };
│ │ │ │ -
│ │ │ │ -
969
│ │ │ │ -
972} // namespace Dune
│ │ │ │ -
973
│ │ │ │ -
974#endif // HAVE_ARPACKPP
│ │ │ │ -
975
│ │ │ │ -
976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
│ │ │ │ -
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ -
Helper functions for determining the vector/matrix block level.
│ │ │ │ - │ │ │ │ -
This file implements a vector space as a tensor product of a given vector space. The number of compon...
│ │ │ │ -
void printvector(std::ostream &s, const V &v, std::string title, std::string rowtext, int columns=1, int width=10, int precision=2)
Print an ISTL vector.
Definition io.hh:89
│ │ │ │ +
550 template <typename Dummy>
│ │ │ │ +
│ │ │ │ +
551 struct Implementation<true,Dummy>
│ │ │ │ +
552 {
│ │ │ │ +
│ │ │ │ +
553 static void setMatrix (ISTLLinearSolver& solver,
│ │ │ │ +
554 const BCRSMatrix& matrix)
│ │ │ │ +
555 {
│ │ │ │ +
556 solver.setMatrix(matrix);
│ │ │ │ +
557 }
│ │ │ │ +
│ │ │ │ +
558 };
│ │ │ │ +
│ │ │ │ +
559 };
│ │ │ │ +
│ │ │ │ +
560
│ │ │ │ +
564}
│ │ │ │ +
565
│ │ │ │ +
566#endif
│ │ │ │ +
Define base class for scalar product and norm.
│ │ │ │ +
Templates characterizing the type of a solver.
│ │ │ │ + │ │ │ │ +
Define general, extensible interface for operators. The available implementation wraps a matrix.
│ │ │ │ +
STL namespace.
│ │ │ │
Definition allocator.hh:11
│ │ │ │ +
PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)
Definition dependency.hh:293
│ │ │ │
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bcrsmatrix.hh:488
│ │ │ │ -
A vector of blocks with memory management.
Definition bvector.hh:395
│ │ │ │ -
typename Imp::BlockTraits< B >::field_type field_type
export the type representing the field
Definition bvector.hh:401
│ │ │ │ -
A::size_type size_type
The type for the index access.
Definition bvector.hh:410
│ │ │ │ -
Wrapper to use a range of ARPACK++ eigenvalue solvers.
Definition arpackpp.hh:245
│ │ │ │ -
const unsigned int verbosity_level_
Definition arpackpp.hh:958
│ │ │ │ -
unsigned int getIterationCount() const
Return the number of iterations in last application of an algorithm.
Definition arpackpp.hh:944
│ │ │ │ -
const std::string title_
Definition arpackpp.hh:966
│ │ │ │ -
BlockVector::field_type Real
Definition arpackpp.hh:247
│ │ │ │ -
void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:289
│ │ │ │ -
void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation lambda of its ...
Definition arpackpp.hh:391
│ │ │ │ -
const BCRSMatrix & m_
Definition arpackpp.hh:954
│ │ │ │ -
const unsigned int nIterationsMax_
Definition arpackpp.hh:955
│ │ │ │ -
const std::string blank_
Definition arpackpp.hh:967
│ │ │ │ -
ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=100000, const unsigned int verbosity_level=0)
Construct from required parameters.
Definition arpackpp.hh:268
│ │ │ │ -
void computeSymCond2(const Real &epsilon, Real &cond_2) const
Assume the matrix to be square, symmetric and perform IRLM to compute an approximation of its spectra...
Definition arpackpp.hh:493
│ │ │ │ -
unsigned int nIterations_
Definition arpackpp.hh:963
│ │ │ │ -
void computeNonSymMin(const Real &epsilon, BlockVector &x, Real &sigma) const
Assume the matrix to be nonsymmetric and perform IRLM to compute an approximation sigma of its smalle...
Definition arpackpp.hh:721
│ │ │ │ -
void computeNonSymCond2(const Real &epsilon, Real &cond_2) const
Assume the matrix to be nonsymmetric and perform IRLM to compute an approximation of its spectral con...
Definition arpackpp.hh:830
│ │ │ │ -
void computeNonSymMax(const Real &epsilon, BlockVector &x, Real &sigma) const
Assume the matrix to be nonsymmetric and perform IRLM to compute an approximation sigma of its larges...
Definition arpackpp.hh:609
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ +
Thrown when a solver aborts due to some problem.
Definition istlexception.hh:46
│ │ │ │ +
A linear operator.
Definition operators.hh:67
│ │ │ │ +
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:32
│ │ │ │ +
Base class for scalar product and norm computation.
Definition scalarproducts.hh:52
│ │ │ │ +
Default implementation for the scalar case.
Definition scalarproducts.hh:168
│ │ │ │ +
Statistics about the application of an inverse operator.
Definition solver.hh:48
│ │ │ │ +
InverseOperatorResult()
Default constructor.
Definition solver.hh:50
│ │ │ │ +
double condition_estimate
Estimate of condition number.
Definition solver.hh:79
│ │ │ │ +
double elapsed
Elapsed time in seconds.
Definition solver.hh:82
│ │ │ │ +
int iterations
Number of iterations.
Definition solver.hh:67
│ │ │ │ +
double reduction
Reduction achieved: .
Definition solver.hh:70
│ │ │ │ +
void clear()
Resets all data.
Definition solver.hh:56
│ │ │ │ +
double conv_rate
Convergence rate (average reduction per step)
Definition solver.hh:76
│ │ │ │ +
bool converged
True if convergence criterion has been met.
Definition solver.hh:73
│ │ │ │ +
Abstract base class for all solvers.
Definition solver.hh:99
│ │ │ │ +
void printHeader(std::ostream &s) const
helper function for printing header of solver output
Definition solver.hh:163
│ │ │ │ +
virtual ~InverseOperator()
Destructor.
Definition solver.hh:156
│ │ │ │ +
void printOutput(std::ostream &s, const CountType &iter, const DataType &norm) const
helper function for printing solver output
Definition solver.hh:185
│ │ │ │ +
void printOutput(std::ostream &s, const CountType &iter, const DataType &norm, const DataType &norm_old) const
helper function for printing solver output
Definition solver.hh:172
│ │ │ │ +
virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0
apply inverse operator, with given convergence criteria.
│ │ │ │ +
Simd::Scalar< real_type > scalar_real_type
scalar type underlying the field_type
Definition solver.hh:114
│ │ │ │ +
Y range_type
Type of the range of the operator to be inverted.
Definition solver.hh:105
│ │ │ │ +
@ normSpacing
Definition solver.hh:160
│ │ │ │ +
@ iterationSpacing
Definition solver.hh:160
│ │ │ │ +
X domain_type
Type of the domain of the operator to be inverted.
Definition solver.hh:102
│ │ │ │ +
virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0
Apply inverse operator,.
│ │ │ │ +
X::field_type field_type
The field type of the operator.
Definition solver.hh:108
│ │ │ │ +
FieldTraits< field_type >::real_type real_type
The real type of the field type (is the same if using real numbers, but differs for std::complex)
Definition solver.hh:111
│ │ │ │ +
virtual SolverCategory::Category category() const =0
Category of the solver (see SolverCategory::Category)
│ │ │ │ +
Base class for all implementations of iterative solvers.
Definition solver.hh:203
│ │ │ │ +
IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solver.hh:313
│ │ │ │ +
IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
Constructor.
Definition solver.hh:290
│ │ │ │ +
virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)
Apply inverse operator with given reduction factor.
Definition solver.hh:374
│ │ │ │ +
std::shared_ptr< const ScalarProduct< X > > _sp
Definition solver.hh:506
│ │ │ │ +
IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, Y > > prec, scalar_real_type reduction, int maxit, int verbose)
General constructor to initialize an iterative solver.
Definition solver.hh:340
│ │ │ │ +
std::string name() const
Definition solver.hh:388
│ │ │ │ +
IterativeSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int verbose)
General constructor to initialize an iterative solver.
Definition solver.hh:230
│ │ │ │ +
std::shared_ptr< const LinearOperator< X, Y > > _op
Definition solver.hh:504
│ │ │ │ +
int _maxit
Definition solver.hh:508
│ │ │ │ +
int _verbose
Definition solver.hh:509
│ │ │ │ +
scalar_real_type _reduction
Definition solver.hh:507
│ │ │ │ +
IterativeSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int verbose)
General constructor to initialize an iterative solver.
Definition solver.hh:262
│ │ │ │ +
SolverCategory::Category _category
Definition solver.hh:510
│ │ │ │ +
std::shared_ptr< Preconditioner< X, Y > > _prec
Definition solver.hh:505
│ │ │ │ +
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition solver.hh:383
│ │ │ │ +
Class for controlling iterative methods.
Definition solver.hh:411
│ │ │ │ +
Iteration(const IterativeSolver &parent, InverseOperatorResult &res)
Definition solver.hh:413
│ │ │ │ +
Iteration(Iteration &&other)
Definition solver.hh:428
│ │ │ │ +
InverseOperatorResult & _res
Definition solver.hh:498
│ │ │ │ +
const IterativeSolver & _parent
Definition solver.hh:499
│ │ │ │ +
Timer _watch
Definition solver.hh:497
│ │ │ │ +
Iteration(const Iteration &)=delete
│ │ │ │ +
CountType _i
Definition solver.hh:496
│ │ │ │ +
real_type _def0
Definition solver.hh:495
│ │ │ │ +
bool step(CountType i, real_type def)
registers the iteration step, checks for invalid defect norm and convergence.
Definition solver.hh:455
│ │ │ │ +
void finalize()
Definition solver.hh:480
│ │ │ │ +
real_type _def
Definition solver.hh:495
│ │ │ │ +
~Iteration()
Definition solver.hh:440
│ │ │ │ +
bool _valid
Definition solver.hh:500
│ │ │ │ +
Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in...
Definition solver.hh:522
│ │ │ │ +
static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
Definition solver.hh:524
│ │ │ │ +
Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTAB...
Definition solver.hh:540
│ │ │ │ +
static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &)
Definition solver.hh:541
│ │ │ │ +
static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
Definition solver.hh:553
│ │ │ │ +
Categories for the solvers.
Definition solvercategory.hh:22
│ │ │ │ +
Category
Definition solvercategory.hh:23
│ │ │ │ +
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
│ │ │ │ +
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ +
Definition solvercategory.hh:54
│ │ │ │ +
Definition solvertype.hh:16
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,954 +1,642 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ - * _e_i_g_e_n_v_a_l_u_e │ │ │ │ │ -arpackpp.hh │ │ │ │ │ +solver.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH │ │ │ │ │ -6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH │ │ │ │ │ -7 │ │ │ │ │ -8#if HAVE_ARPACKPP || defined DOXYGEN │ │ │ │ │ -9 │ │ │ │ │ -10#include // provides std::abs, std::pow, std::sqrt │ │ │ │ │ -11 │ │ │ │ │ -12#include // provides std::cout, std::endl │ │ │ │ │ -13#include // provides std::string │ │ │ │ │ -14 │ │ │ │ │ -15#include // provides Dune::FieldVector │ │ │ │ │ -16#include // provides DUNE_THROW(...) │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_i_s_t_l_/_b_l_o_c_k_l_e_v_e_l_._h_h> // provides Dune::blockLevel │ │ │ │ │ -19#include <_d_u_n_e_/_i_s_t_l_/_b_v_e_c_t_o_r_._h_h> // provides Dune::BlockVector │ │ │ │ │ -20#include <_d_u_n_e_/_i_s_t_l_/_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h> // provides Dune::ISTLError │ │ │ │ │ -21#include <_d_u_n_e_/_i_s_t_l_/_i_o_._h_h> // provides Dune::printvector(...) │ │ │ │ │ -22 │ │ │ │ │ -23#ifdef Status │ │ │ │ │ -24#undef Status // prevent preprocessor from damaging the ARPACK++ │ │ │ │ │ -25 // code when "X11/Xlib.h" is included (the latter │ │ │ │ │ -26 // defines Status as "#define Status int" and │ │ │ │ │ -27 // ARPACK++ provides a class with a method called │ │ │ │ │ -28 // Status) │ │ │ │ │ -29#endif │ │ │ │ │ -30#include "arssym.h" // provides ARSymStdEig │ │ │ │ │ -31 │ │ │ │ │ -32namespace _D_u_n_e │ │ │ │ │ -33{ │ │ │ │ │ -34 │ │ │ │ │ -39 namespace Impl { │ │ │ │ │ -55 template │ │ │ │ │ -56 class ArPackPlusPlus_BCRSMatrixWrapper │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_ISTL_SOLVER_HH │ │ │ │ │ +7#define DUNE_ISTL_SOLVER_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20 │ │ │ │ │ +21#include "_s_o_l_v_e_r_t_y_p_e_._h_h" │ │ │ │ │ +22#include "_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h" │ │ │ │ │ +23#include "_o_p_e_r_a_t_o_r_s_._h_h" │ │ │ │ │ +24#include "_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h" │ │ │ │ │ +25 │ │ │ │ │ +26namespace _D_u_n_e │ │ │ │ │ +27{ │ │ │ │ │ +_4_7 struct _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +48 { │ │ │ │ │ +_5_0 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t () │ │ │ │ │ +51 { │ │ │ │ │ +52 _c_l_e_a_r(); │ │ │ │ │ +53 } │ │ │ │ │ +54 │ │ │ │ │ +_5_6 void _c_l_e_a_r () │ │ │ │ │ 57 { │ │ │ │ │ -58 public: │ │ │ │ │ -60 typedef typename _B_C_R_S_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e Real; │ │ │ │ │ -61 │ │ │ │ │ -62 public: │ │ │ │ │ -64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A) │ │ │ │ │ -65 : A_(A), │ │ │ │ │ -66 m_(A_.M() * mBlock), n_(A_.N() * nBlock) │ │ │ │ │ -67 { │ │ │ │ │ -68 // assert that BCRSMatrix type has blocklevel 2 │ │ │ │ │ -69 static_assert │ │ │ │ │ -70 (blockLevel() == 2, │ │ │ │ │ -71 "Only BCRSMatrices with blocklevel 2 are supported."); │ │ │ │ │ -72 │ │ │ │ │ -73 // allocate memory for auxiliary block vector objects │ │ │ │ │ -74 // which are compatible to matrix rows / columns │ │ │ │ │ -75 domainBlockVector.resize(A_.N()); │ │ │ │ │ -76 rangeBlockVector.resize(A_.M()); │ │ │ │ │ -77 } │ │ │ │ │ -78 │ │ │ │ │ -80 inline void multMv (Real* v, Real* w) │ │ │ │ │ -81 { │ │ │ │ │ -82 // get vector v as an object of appropriate type │ │ │ │ │ -83 arrayToDomainBlockVector(v,domainBlockVector); │ │ │ │ │ +58 _i_t_e_r_a_t_i_o_n_s = 0; │ │ │ │ │ +59 _r_e_d_u_c_t_i_o_n = 0; │ │ │ │ │ +60 _c_o_n_v_e_r_g_e_d = false; │ │ │ │ │ +61 _c_o_n_v___r_a_t_e = 1; │ │ │ │ │ +62 _e_l_a_p_s_e_d = 0; │ │ │ │ │ +63 _c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e = -1; │ │ │ │ │ +64 } │ │ │ │ │ +65 │ │ │ │ │ +_6_7 int _i_t_e_r_a_t_i_o_n_s; │ │ │ │ │ +68 │ │ │ │ │ +_7_0 double _r_e_d_u_c_t_i_o_n; │ │ │ │ │ +71 │ │ │ │ │ +_7_3 bool _c_o_n_v_e_r_g_e_d; │ │ │ │ │ +74 │ │ │ │ │ +_7_6 double _c_o_n_v___r_a_t_e; │ │ │ │ │ +77 │ │ │ │ │ +_7_9 double _c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e = -1; │ │ │ │ │ +80 │ │ │ │ │ +_8_2 double _e_l_a_p_s_e_d; │ │ │ │ │ +83 }; │ │ │ │ │ 84 │ │ │ │ │ -85 // perform matrix-vector product │ │ │ │ │ -86 A_.mv(domainBlockVector,rangeBlockVector); │ │ │ │ │ -87 │ │ │ │ │ -88 // get vector w from object of appropriate type │ │ │ │ │ -89 rangeBlockVectorToArray(rangeBlockVector,w); │ │ │ │ │ -90 }; │ │ │ │ │ -91 │ │ │ │ │ -93 inline void multMtMv (Real* v, Real* w) │ │ │ │ │ -94 { │ │ │ │ │ -95 // get vector v as an object of appropriate type │ │ │ │ │ -96 arrayToDomainBlockVector(v,domainBlockVector); │ │ │ │ │ -97 │ │ │ │ │ -98 // perform matrix-vector product │ │ │ │ │ -99 A_.mv(domainBlockVector,rangeBlockVector); │ │ │ │ │ -100 A_.mtv(rangeBlockVector,domainBlockVector); │ │ │ │ │ -101 │ │ │ │ │ -102 // get vector w from object of appropriate type │ │ │ │ │ -103 domainBlockVectorToArray(domainBlockVector,w); │ │ │ │ │ -104 }; │ │ │ │ │ -105 │ │ │ │ │ -107 inline void multMMtv (Real* v, Real* w) │ │ │ │ │ -108 { │ │ │ │ │ -109 // get vector v as an object of appropriate type │ │ │ │ │ -110 arrayToRangeBlockVector(v,rangeBlockVector); │ │ │ │ │ -111 │ │ │ │ │ -112 // perform matrix-vector product │ │ │ │ │ -113 A_.mtv(rangeBlockVector,domainBlockVector); │ │ │ │ │ -114 A_.mv(domainBlockVector,rangeBlockVector); │ │ │ │ │ +85 │ │ │ │ │ +86 //===================================================================== │ │ │ │ │ +98 template │ │ │ │ │ +_9_9 class _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r { │ │ │ │ │ +100 public: │ │ │ │ │ +_1_0_2 typedef X _d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +103 │ │ │ │ │ +_1_0_5 typedef Y _r_a_n_g_e___t_y_p_e; │ │ │ │ │ +106 │ │ │ │ │ +_1_0_8 typedef typename X::field_type _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +109 │ │ │ │ │ +_1_1_1 typedef typename FieldTraits::real_type _r_e_a_l___t_y_p_e; │ │ │ │ │ +112 │ │ │ │ │ +_1_1_4 typedef Simd::Scalar _s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ 115 │ │ │ │ │ -116 // get vector w from object of appropriate type │ │ │ │ │ -117 rangeBlockVectorToArray(rangeBlockVector,w); │ │ │ │ │ -118 }; │ │ │ │ │ -119 │ │ │ │ │ -121 inline int nrows () const { return m_; } │ │ │ │ │ -122 │ │ │ │ │ -124 inline int ncols () const { return n_; } │ │ │ │ │ -125 │ │ │ │ │ -126 protected: │ │ │ │ │ -127 // Number of rows and columns in each block of the matrix │ │ │ │ │ -128 constexpr static int mBlock = BCRSMatrix::block_type::rows; │ │ │ │ │ -129 constexpr static int nBlock = BCRSMatrix::block_type::cols; │ │ │ │ │ -130 │ │ │ │ │ -131 // Type of vectors in the domain of the linear map associated with │ │ │ │ │ -132 // the matrix, i.e. block vectors compatible to matrix rows │ │ │ │ │ -133 constexpr static int dbvBlockSize = nBlock; │ │ │ │ │ -134 typedef Dune::FieldVector DomainBlockVectorBlock; │ │ │ │ │ -135 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_D_o_m_a_i_n_B_l_o_c_k_V_e_c_t_o_r_B_l_o_c_k_> DomainBlockVector; │ │ │ │ │ -136 │ │ │ │ │ -137 // Type of vectors in the range of the linear map associated with │ │ │ │ │ -138 // the matrix, i.e. block vectors compatible to matrix columns │ │ │ │ │ -139 constexpr static int rbvBlockSize = mBlock; │ │ │ │ │ -140 typedef Dune::FieldVector RangeBlockVectorBlock; │ │ │ │ │ -141 typedef _D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_<_R_a_n_g_e_B_l_o_c_k_V_e_c_t_o_r_B_l_o_c_k_> RangeBlockVector; │ │ │ │ │ -142 │ │ │ │ │ -143 // Types for vector index access │ │ │ │ │ -144 typedef typename _D_o_m_a_i_n_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e dbv_size_type; │ │ │ │ │ -145 typedef typename _R_a_n_g_e_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e rbv_size_type; │ │ │ │ │ -146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type; │ │ │ │ │ -147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type; │ │ │ │ │ -148 │ │ │ │ │ -149 // Get vector v from a block vector object which is compatible to │ │ │ │ │ -150 // matrix rows │ │ │ │ │ -151 static inline void │ │ │ │ │ -152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v) │ │ │ │ │ -153 { │ │ │ │ │ -154 for (dbv_size_type block = 0; block < dbv.N(); ++block) │ │ │ │ │ -155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock) │ │ │ │ │ -156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock]; │ │ │ │ │ -157 } │ │ │ │ │ -158 │ │ │ │ │ -159 // Get vector v from a block vector object which is compatible to │ │ │ │ │ -160 // matrix columns │ │ │ │ │ -161 static inline void │ │ │ │ │ -162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v) │ │ │ │ │ -163 { │ │ │ │ │ -164 for (rbv_size_type block = 0; block < rbv.N(); ++block) │ │ │ │ │ -165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock) │ │ │ │ │ -166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock]; │ │ │ │ │ -167 } │ │ │ │ │ -168 │ │ │ │ │ -169 public: │ │ │ │ │ -172 static inline void arrayToDomainBlockVector (const Real* v, │ │ │ │ │ -173 DomainBlockVector& dbv) │ │ │ │ │ -174 { │ │ │ │ │ -175 for (dbv_size_type block = 0; block < dbv.N(); ++block) │ │ │ │ │ -176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock) │ │ │ │ │ -177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock]; │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -182 static inline void arrayToRangeBlockVector (const Real* v, │ │ │ │ │ -183 RangeBlockVector& rbv) │ │ │ │ │ -184 { │ │ │ │ │ -185 for (rbv_size_type block = 0; block < rbv.N(); ++block) │ │ │ │ │ -186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock) │ │ │ │ │ -187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock]; │ │ │ │ │ -188 } │ │ │ │ │ -189 │ │ │ │ │ -190 protected: │ │ │ │ │ -191 // The DUNE-ISTL BCRSMatrix │ │ │ │ │ -192 const BCRSMatrix& A_; │ │ │ │ │ +_1_2_8 virtual void _a_p_p_l_y (X& x, Y& b, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) = 0; │ │ │ │ │ +129 │ │ │ │ │ +_1_4_3 virtual void _a_p_p_l_y (X& x, Y& b, double reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ +res) = 0; │ │ │ │ │ +144 │ │ │ │ │ +_1_4_6 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +147#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE │ │ │ │ │ +148 { │ │ │ │ │ +149 DUNE_THROW(Dune::Exception,"It is necessary to implement the category │ │ │ │ │ +method in a derived classes, in the future this method will pure virtual."); │ │ │ │ │ +150 } │ │ │ │ │ +151#else │ │ │ │ │ +152 = 0; │ │ │ │ │ +153#endif │ │ │ │ │ +154 │ │ │ │ │ +_1_5_6 virtual _~_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r () {} │ │ │ │ │ +157 │ │ │ │ │ +158 protected: │ │ │ │ │ +159 // spacing values │ │ │ │ │ +_1_6_0 enum { _i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g = 5 , _n_o_r_m_S_p_a_c_i_n_g = 16 }; │ │ │ │ │ +161 │ │ │ │ │ +_1_6_3 void _p_r_i_n_t_H_e_a_d_e_r(std::ostream& s) const │ │ │ │ │ +164 { │ │ │ │ │ +165 s << std::setw(_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g) << " Iter"; │ │ │ │ │ +166 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << "Defect"; │ │ │ │ │ +167 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << "Rate" << std::endl; │ │ │ │ │ +168 } │ │ │ │ │ +169 │ │ │ │ │ +171 template │ │ │ │ │ +_1_7_2 void _p_r_i_n_t_O_u_t_p_u_t(std::ostream& s, │ │ │ │ │ +173 const CountType& iter, │ │ │ │ │ +174 const DataType& norm, │ │ │ │ │ +175 const DataType& norm_old) const │ │ │ │ │ +176 { │ │ │ │ │ +177 const DataType rate = norm/norm_old; │ │ │ │ │ +178 s << std::setw(_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g) << iter << " "; │ │ │ │ │ +179 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << Simd::io(norm) << " "; │ │ │ │ │ +180 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << Simd::io(rate) << std::endl; │ │ │ │ │ +181 } │ │ │ │ │ +182 │ │ │ │ │ +184 template │ │ │ │ │ +_1_8_5 void _p_r_i_n_t_O_u_t_p_u_t(std::ostream& s, │ │ │ │ │ +186 const CountType& iter, │ │ │ │ │ +187 const DataType& norm) const │ │ │ │ │ +188 { │ │ │ │ │ +189 s << std::setw(_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g) << iter << " "; │ │ │ │ │ +190 s << std::setw(_n_o_r_m_S_p_a_c_i_n_g) << Simd::io(norm) << std::endl; │ │ │ │ │ +191 } │ │ │ │ │ +192 }; │ │ │ │ │ 193 │ │ │ │ │ -194 // Number of rows and columns in the matrix │ │ │ │ │ -195 const int m_, n_; │ │ │ │ │ -196 │ │ │ │ │ -197 // Auxiliary block vector objects which are │ │ │ │ │ -198 // compatible to matrix rows / columns │ │ │ │ │ -199 mutable DomainBlockVector domainBlockVector; │ │ │ │ │ -200 mutable RangeBlockVector rangeBlockVector; │ │ │ │ │ -201 }; │ │ │ │ │ -202 } // end namespace Impl │ │ │ │ │ -203 │ │ │ │ │ -243 template │ │ │ │ │ -_2_4_4 class _A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -245 { │ │ │ │ │ -246 public: │ │ │ │ │ -_2_4_7 typedef typename _B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e _R_e_a_l; │ │ │ │ │ -248 │ │ │ │ │ -249 public: │ │ │ │ │ -_2_6_8 _A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s (const _B_C_R_S_M_a_t_r_i_x& m, │ │ │ │ │ -269 const unsigned int nIterationsMax = 100000, │ │ │ │ │ -270 const unsigned int verbosity_level = 0) │ │ │ │ │ -271 : _m__(m), _n_I_t_e_r_a_t_i_o_n_s_M_a_x__(nIterationsMax), │ │ │ │ │ -272 _v_e_r_b_o_s_i_t_y___l_e_v_e_l__(verbosity_level), │ │ │ │ │ -273 _n_I_t_e_r_a_t_i_o_n_s__(0), │ │ │ │ │ -274 _t_i_t_l_e__(" ArPackPlusPlus_Algorithms: "), │ │ │ │ │ -275 _b_l_a_n_k__(_t_i_t_l_e__.length(),' ') │ │ │ │ │ -276 {} │ │ │ │ │ -277 │ │ │ │ │ -_2_8_9 inline void _c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e (const _R_e_a_l& epsilon, │ │ │ │ │ -290 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -291 { │ │ │ │ │ -292 // print verbosity information │ │ │ │ │ -293 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -294 std::cout << _t_i_t_l_e__ << "Computing an approximation of " │ │ │ │ │ -295 << "the dominant eigenvalue of a matrix which " │ │ │ │ │ -296 << "is assumed to be symmetric." << std::endl; │ │ │ │ │ -297 │ │ │ │ │ -298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ -299 // and to perform the product A*v (LU decomposition is not used) │ │ │ │ │ -300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ -301 WrappedMatrix A(_m__); │ │ │ │ │ -302 │ │ │ │ │ -303 // get number of rows and columns in A │ │ │ │ │ -304 const int nrows = A.nrows(); │ │ │ │ │ -305 const int ncols = A.ncols(); │ │ │ │ │ -306 │ │ │ │ │ -307 // assert that A is square │ │ │ │ │ -308 if (nrows != ncols) │ │ │ │ │ -309 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ -310 << nrows << "x" << ncols << ")."); │ │ │ │ │ -311 │ │ │ │ │ -312 // allocate memory for variables, set parameters │ │ │ │ │ -313 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ -314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ -each iteration (0 == auto) │ │ │ │ │ -315 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ -values) (0 == machine precision) │ │ │ │ │ -316 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ -iterations allowed (0 == 100*nev) │ │ │ │ │ -317 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A │ │ │ │ │ -318 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ -determined │ │ │ │ │ -319 int nconv; // Number of converged eigenvalues │ │ │ │ │ -320 │ │ │ │ │ -321 // define what we need: eigenvalues with largest magnitude │ │ │ │ │ -322 char which[] = "LM"; │ │ │ │ │ -323 ARSymStdEig │ │ │ │ │ -324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit); │ │ │ │ │ -325 │ │ │ │ │ -326 // set ARPACK verbosity mode if requested │ │ │ │ │ -327 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ -328 │ │ │ │ │ -329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues │ │ │ │ │ -330 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ -331 │ │ │ │ │ -332 // obtain approximated dominant eigenvalue of A │ │ │ │ │ -333 lambda = ev[nev-1]; │ │ │ │ │ -334 │ │ │ │ │ -335 // obtain associated approximated eigenvector of A │ │ │ │ │ -336 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ -337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ -338 │ │ │ │ │ -339 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ -340 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ -341 │ │ │ │ │ -342 // compute residual norm │ │ │ │ │ -343 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ -344 _R_e_a_l* Ax_raw = new _R_e_a_l[nrows]; │ │ │ │ │ -345 A.multMv(x_raw,Ax_raw); │ │ │ │ │ -346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r); │ │ │ │ │ -347 r.axpy(-lambda,x); │ │ │ │ │ -348 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ -349 │ │ │ │ │ -350 // print verbosity information │ │ │ │ │ -351 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -352 { │ │ │ │ │ -353 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -354 { │ │ │ │ │ -355 // print some information about the problem │ │ │ │ │ -356 std::cout << _b_l_a_n_k__ << "Obtained eigenvalues of A by solving " │ │ │ │ │ -357 << "A*x = λ*x using the ARPACK++ class ARSym" │ │ │ │ │ -358 << "StdEig:" << std::endl; │ │ │ │ │ -359 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A: " │ │ │ │ │ -360 << nconv << " / " << nev << std::endl; │ │ │ │ │ -361 std::cout << _b_l_a_n_k__ << " dominant eigenvalue of A: " │ │ │ │ │ -362 << lambda << std::endl; │ │ │ │ │ -363 } │ │ │ │ │ -364 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -365 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -366 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -367 << "λ = " << lambda << std::endl; │ │ │ │ │ -368 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -369 { │ │ │ │ │ -370 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ -371 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -372 } │ │ │ │ │ -373 } │ │ │ │ │ -374 │ │ │ │ │ -375 // free dynamically allocated memory │ │ │ │ │ -376 delete[] Ax_raw; │ │ │ │ │ -377 delete[] ev; │ │ │ │ │ -378 } │ │ │ │ │ -379 │ │ │ │ │ -_3_9_1 inline void _c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e (const _R_e_a_l& epsilon, │ │ │ │ │ -392 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& lambda) const │ │ │ │ │ -393 { │ │ │ │ │ -394 // print verbosity information │ │ │ │ │ -395 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -396 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ -397 << "least dominant eigenvalue of a matrix which " │ │ │ │ │ -398 << "is assumed to be symmetric." << std::endl; │ │ │ │ │ -399 │ │ │ │ │ -400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ -401 // and to perform the product A*v (LU decomposition is not used) │ │ │ │ │ -402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ -403 WrappedMatrix A(_m__); │ │ │ │ │ -404 │ │ │ │ │ -405 // get number of rows and columns in A │ │ │ │ │ -406 const int nrows = A.nrows(); │ │ │ │ │ -407 const int ncols = A.ncols(); │ │ │ │ │ -408 │ │ │ │ │ -409 // assert that A is square │ │ │ │ │ -410 if (nrows != ncols) │ │ │ │ │ -411 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ -412 << nrows << "x" << ncols << ")."); │ │ │ │ │ -413 │ │ │ │ │ -414 // allocate memory for variables, set parameters │ │ │ │ │ -415 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ -416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ -each iteration (0 == auto) │ │ │ │ │ -417 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ -values) (0 == machine precision) │ │ │ │ │ -418 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ -iterations allowed (0 == 100*nev) │ │ │ │ │ -419 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A │ │ │ │ │ -420 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ -determined │ │ │ │ │ -421 int nconv; // Number of converged eigenvalues │ │ │ │ │ -422 │ │ │ │ │ -423 // define what we need: eigenvalues with smallest magnitude │ │ │ │ │ -424 char which[] = "SM"; │ │ │ │ │ -425 ARSymStdEig │ │ │ │ │ -426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit); │ │ │ │ │ -427 │ │ │ │ │ -428 // set ARPACK verbosity mode if requested │ │ │ │ │ -429 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ -430 │ │ │ │ │ -431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues │ │ │ │ │ -432 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ -433 │ │ │ │ │ -434 // obtain approximated least dominant eigenvalue of A │ │ │ │ │ -435 lambda = ev[nev-1]; │ │ │ │ │ -436 │ │ │ │ │ -437 // obtain associated approximated eigenvector of A │ │ │ │ │ -438 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ -439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ -440 │ │ │ │ │ -441 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ -442 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ -443 │ │ │ │ │ -444 // compute residual norm │ │ │ │ │ -445 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ -446 _R_e_a_l* Ax_raw = new _R_e_a_l[nrows]; │ │ │ │ │ -447 A.multMv(x_raw,Ax_raw); │ │ │ │ │ -448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r); │ │ │ │ │ -449 r.axpy(-lambda,x); │ │ │ │ │ -450 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ -451 │ │ │ │ │ -452 // print verbosity information │ │ │ │ │ -453 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -454 { │ │ │ │ │ -455 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -456 { │ │ │ │ │ -457 // print some information about the problem │ │ │ │ │ -458 std::cout << _b_l_a_n_k__ << "Obtained eigenvalues of A by solving " │ │ │ │ │ -459 << "A*x = λ*x using the ARPACK++ class ARSym" │ │ │ │ │ -460 << "StdEig:" << std::endl; │ │ │ │ │ -461 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A: " │ │ │ │ │ -462 << nconv << " / " << nev << std::endl; │ │ │ │ │ -463 std::cout << _b_l_a_n_k__ << " least dominant eigenvalue of A: " │ │ │ │ │ -464 << lambda << std::endl; │ │ │ │ │ -465 } │ │ │ │ │ -466 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -467 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -468 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -469 << "λ = " << lambda << std::endl; │ │ │ │ │ -470 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -471 { │ │ │ │ │ -472 // print approximated eigenvector via DUNE-ISTL I/O methods │ │ │ │ │ -473 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -474 } │ │ │ │ │ -475 } │ │ │ │ │ -476 │ │ │ │ │ -477 // free dynamically allocated memory │ │ │ │ │ -478 delete[] Ax_raw; │ │ │ │ │ -479 delete[] ev; │ │ │ │ │ -480 } │ │ │ │ │ -481 │ │ │ │ │ -_4_9_3 inline void _c_o_m_p_u_t_e_S_y_m_C_o_n_d_2 (const _R_e_a_l& epsilon, _R_e_a_l& cond_2) const │ │ │ │ │ -494 { │ │ │ │ │ -495 // print verbosity information │ │ │ │ │ -496 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -497 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ -498 << "spectral condition number of a matrix which " │ │ │ │ │ -499 << "is assumed to be symmetric." << std::endl; │ │ │ │ │ -500 │ │ │ │ │ -501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ -502 // and to perform the product A*v (LU decomposition is not used) │ │ │ │ │ -503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ -504 WrappedMatrix A(_m__); │ │ │ │ │ -505 │ │ │ │ │ -506 // get number of rows and columns in A │ │ │ │ │ -507 const int nrows = A.nrows(); │ │ │ │ │ -508 const int ncols = A.ncols(); │ │ │ │ │ -509 │ │ │ │ │ -510 // assert that A is square │ │ │ │ │ -511 if (nrows != ncols) │ │ │ │ │ -512 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix is not square (" │ │ │ │ │ -513 << nrows << "x" << ncols << ")."); │ │ │ │ │ -514 │ │ │ │ │ -515 // allocate memory for variables, set parameters │ │ │ │ │ -516 const int nev = 2; // Number of eigenvalues to compute │ │ │ │ │ -517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ -each iteration (0 == auto) │ │ │ │ │ -518 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ -values) (0 == machine precision) │ │ │ │ │ -519 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ -iterations allowed (0 == 100*nev) │ │ │ │ │ -520 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A │ │ │ │ │ -521 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ -determined │ │ │ │ │ -522 int nconv; // Number of converged eigenvalues │ │ │ │ │ -523 │ │ │ │ │ -524 // define what we need: eigenvalues from both ends of the spectrum │ │ │ │ │ -525 char which[] = "BE"; │ │ │ │ │ -526 ARSymStdEig │ │ │ │ │ -527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit); │ │ │ │ │ -528 │ │ │ │ │ -529 // set ARPACK verbosity mode if requested │ │ │ │ │ -530 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ -531 │ │ │ │ │ -532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues │ │ │ │ │ -533 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ -534 │ │ │ │ │ -535 // obtain approximated dominant and least dominant eigenvalue of A │ │ │ │ │ -536 const _R_e_a_l& lambda_max = ev[nev-1]; │ │ │ │ │ -537 const _R_e_a_l& lambda_min = ev[0]; │ │ │ │ │ -538 │ │ │ │ │ -539 // obtain associated approximated eigenvectors of A │ │ │ │ │ -540 _R_e_a_l* x_max_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ -541 _R_e_a_l* x_min_raw = dprob.RawEigenvector(0); │ │ │ │ │ -542 │ │ │ │ │ -543 // obtain approximated spectral condition number of A │ │ │ │ │ -544 cond_2 = std::abs(lambda_max / lambda_min); │ │ │ │ │ +202 template │ │ │ │ │ +_2_0_3 class _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r : public _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r{ │ │ │ │ │ +204 public: │ │ │ │ │ +205 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_d_o_m_a_i_n___t_y_p_e; │ │ │ │ │ +206 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_r_a_n_g_e___t_y_p_e; │ │ │ │ │ +207 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +208 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ │ +209 using typename _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_<_X_,_Y_>_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e; │ │ │ │ │ +210 │ │ │ │ │ +_2_3_0 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, _P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& prec, │ │ │ │ │ +_s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose) : │ │ │ │ │ +231 ___o_p(stackobject_to_shared_ptr(op)), │ │ │ │ │ +232 ___p_r_e_c(stackobject_to_shared_ptr(prec)), │ │ │ │ │ +233 ___s_p(new _S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t), │ │ │ │ │ +234 ___r_e_d_u_c_t_i_o_n(reduction), ___m_a_x_i_t(maxit), ___v_e_r_b_o_s_e(verbose), ___c_a_t_e_g_o_r_y │ │ │ │ │ +(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::sequential) │ │ │ │ │ +235 { │ │ │ │ │ +236 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l) │ │ │ │ │ +237 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator has to be sequential!"); │ │ │ │ │ +238 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(prec) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l) │ │ │ │ │ +239 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "Preconditioner has to be sequential!"); │ │ │ │ │ +240 } │ │ │ │ │ +241 │ │ │ │ │ +_2_6_2 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (const _L_i_n_e_a_r_O_p_e_r_a_t_o_r_<_X_,_Y_>& op, const _S_c_a_l_a_r_P_r_o_d_u_c_t_<_X_>& sp, │ │ │ │ │ +_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>& prec, │ │ │ │ │ +263 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose) : │ │ │ │ │ +264 ___o_p(stackobject_to_shared_ptr(op)), │ │ │ │ │ +265 ___p_r_e_c(stackobject_to_shared_ptr(prec)), │ │ │ │ │ +266 ___s_p(stackobject_to_shared_ptr(sp)), │ │ │ │ │ +267 ___r_e_d_u_c_t_i_o_n(reduction), ___m_a_x_i_t(maxit), ___v_e_r_b_o_s_e(verbose), ___c_a_t_e_g_o_r_y │ │ │ │ │ +(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::_c_a_t_e_g_o_r_y(op)) │ │ │ │ │ +268 { │ │ │ │ │ +269 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(prec)) │ │ │ │ │ +270 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and Preconditioner must │ │ │ │ │ +have the same SolverCategory!"); │ │ │ │ │ +271 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(sp)) │ │ │ │ │ +272 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and ScalarProduct must │ │ │ │ │ +have the same SolverCategory!"); │ │ │ │ │ +273 } │ │ │ │ │ +274 │ │ │ │ │ +_2_9_0 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ +shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > prec, const ParameterTree& configuration) : │ │ │ │ │ +291 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,_s_t_d::make_shared<_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t>(),prec, │ │ │ │ │ +292 configuration._g_e_t<_r_e_a_l___t_y_p_e>("reduction"), │ │ │ │ │ +293 configuration._g_e_t("maxit"), │ │ │ │ │ +294 configuration._g_e_t("verbose")) │ │ │ │ │ +295 {} │ │ │ │ │ +296 │ │ │ │ │ +_3_1_3 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (std::shared_ptr > op, std:: │ │ │ │ │ +shared_ptr > sp, std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_X_> > │ │ │ │ │ +prec, const ParameterTree& configuration) : │ │ │ │ │ +314 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r(op,sp,prec, │ │ │ │ │ +315 configuration._g_e_t<_s_c_a_l_a_r___r_e_a_l___t_y_p_e>("reduction"), │ │ │ │ │ +316 configuration._g_e_t("maxit"), │ │ │ │ │ +317 configuration._g_e_t("verbose")) │ │ │ │ │ +318 {} │ │ │ │ │ +319 │ │ │ │ │ +_3_4_0 _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r (std::shared_ptr> op, │ │ │ │ │ +341 std::shared_ptr> sp, │ │ │ │ │ +342 std::shared_ptr<_P_r_e_c_o_n_d_i_t_i_o_n_e_r_<_X_,_Y_>> prec, │ │ │ │ │ +343 _s_c_a_l_a_r___r_e_a_l___t_y_p_e reduction, int maxit, int verbose) : │ │ │ │ │ +344 ___o_p(op), │ │ │ │ │ +345 ___p_r_e_c(prec), │ │ │ │ │ +346 ___s_p(sp), │ │ │ │ │ +347 ___r_e_d_u_c_t_i_o_n(reduction), ___m_a_x_i_t(maxit), ___v_e_r_b_o_s_e(verbose), │ │ │ │ │ +348 ___c_a_t_e_g_o_r_y(_S_o_l_v_e_r_C_a_t_e_g_o_r_y::_c_a_t_e_g_o_r_y(*op)) │ │ │ │ │ +349 { │ │ │ │ │ +350 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*prec)) │ │ │ │ │ +351 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and Preconditioner must │ │ │ │ │ +have the same SolverCategory!"); │ │ │ │ │ +352 if(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*op) != _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(*sp)) │ │ │ │ │ +353 DUNE_THROW(_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y, "LinearOperator and ScalarProduct must │ │ │ │ │ +have the same SolverCategory!"); │ │ │ │ │ +354 } │ │ │ │ │ +355 │ │ │ │ │ +356 // #warning actually we want to have this as the default and just implement │ │ │ │ │ +the second one │ │ │ │ │ +357 // //! \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&) │ │ │ │ │ +358 // virtual void apply (X& x, Y& b, InverseOperatorResult& res) │ │ │ │ │ +359 // { │ │ │ │ │ +360 // apply(x,b,_reduction,res); │ │ │ │ │ +361 // } │ │ │ │ │ +362 │ │ │ │ │ +363#ifndef DOXYGEN │ │ │ │ │ +364 // make sure the three-argument apply from the base class does not get │ │ │ │ │ +shadowed │ │ │ │ │ +365 // by the redefined four-argument version below │ │ │ │ │ +366 using _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y; │ │ │ │ │ +367#endif │ │ │ │ │ +368 │ │ │ │ │ +_3_7_4 virtual void _a_p_p_l_y (X& x, X& b, double reduction, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& │ │ │ │ │ +res) │ │ │ │ │ +375 { │ │ │ │ │ +376 _s_c_a_l_a_r___r_e_a_l___t_y_p_e saved_reduction = ___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +377 ___r_e_d_u_c_t_i_o_n = reduction; │ │ │ │ │ +378 this->_a_p_p_l_y(x,b,res); │ │ │ │ │ +379 ___r_e_d_u_c_t_i_o_n = saved_reduction; │ │ │ │ │ +380 } │ │ │ │ │ +381 │ │ │ │ │ +_3_8_3 virtual _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y _c_a_t_e_g_o_r_y() const │ │ │ │ │ +384 { │ │ │ │ │ +385 return ___c_a_t_e_g_o_r_y; │ │ │ │ │ +386 } │ │ │ │ │ +387 │ │ │ │ │ +_3_8_8 std::string _n_a_m_e() const{ │ │ │ │ │ +389 std::string _n_a_m_e = className(*this); │ │ │ │ │ +390 return _n_a_m_e.substr(0, _n_a_m_e.find("<")); │ │ │ │ │ +391 } │ │ │ │ │ +392 │ │ │ │ │ +410 template │ │ │ │ │ +_4_1_1 class _I_t_e_r_a_t_i_o_n { │ │ │ │ │ +412 public: │ │ │ │ │ +_4_1_3 _I_t_e_r_a_t_i_o_n(const _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r& parent, _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& res) │ │ │ │ │ +414 : ___i(0) │ │ │ │ │ +415 , ___r_e_s(res) │ │ │ │ │ +416 , ___p_a_r_e_n_t(parent) │ │ │ │ │ +417 , ___v_a_l_i_d(true) │ │ │ │ │ +418 { │ │ │ │ │ +419 res._c_l_e_a_r(); │ │ │ │ │ +420 if(___p_a_r_e_n_t.___v_e_r_b_o_s_e>0){ │ │ │ │ │ +421 std::cout << "=== " << parent._n_a_m_e() << std::endl; │ │ │ │ │ +422 if(___p_a_r_e_n_t.___v_e_r_b_o_s_e > 1) │ │ │ │ │ +423 ___p_a_r_e_n_t._p_r_i_n_t_H_e_a_d_e_r(std::cout); │ │ │ │ │ +424 } │ │ │ │ │ +425 } │ │ │ │ │ +426 │ │ │ │ │ +_4_2_7 _I_t_e_r_a_t_i_o_n(const _I_t_e_r_a_t_i_o_n&) = delete; │ │ │ │ │ +_4_2_8 _I_t_e_r_a_t_i_o_n(_I_t_e_r_a_t_i_o_n&& other) │ │ │ │ │ +429 : ___d_e_f_0(other.___d_e_f_0) │ │ │ │ │ +430 , ___d_e_f(other.___d_e_f) │ │ │ │ │ +431 , ___i(other.___i) │ │ │ │ │ +432 , ___w_a_t_c_h(other.___w_a_t_c_h) │ │ │ │ │ +433 , ___r_e_s(other.___r_e_s) │ │ │ │ │ +434 , ___p_a_r_e_n_t(other.___p_a_r_e_n_t) │ │ │ │ │ +435 , ___v_a_l_i_d(other.___v_a_l_i_d) │ │ │ │ │ +436 { │ │ │ │ │ +437 other._valid = false; │ │ │ │ │ +438 } │ │ │ │ │ +439 │ │ │ │ │ +_4_4_0 _~_I_t_e_r_a_t_i_o_n(){ │ │ │ │ │ +441 if(___v_a_l_i_d) │ │ │ │ │ +442 _f_i_n_a_l_i_z_e(); │ │ │ │ │ +443 } │ │ │ │ │ +444 │ │ │ │ │ +_4_5_5 bool _s_t_e_p(CountType i, _r_e_a_l___t_y_p_e def){ │ │ │ │ │ +456 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN │ │ │ │ │ +457 { │ │ │ │ │ +458 if (___p_a_r_e_n_t.___v_e_r_b_o_s_e>0) │ │ │ │ │ +459 std::cout << "=== " << ___p_a_r_e_n_t._n_a_m_e() << ": abort due to infinite or NaN │ │ │ │ │ +defect" │ │ │ │ │ +460 << std::endl; │ │ │ │ │ +461 DUNE_THROW(_S_o_l_v_e_r_A_b_o_r_t, │ │ │ │ │ +462 ___p_a_r_e_n_t._n_a_m_e() << ": defect=" << Simd::io(def) │ │ │ │ │ +463 << " is infinite or NaN"); │ │ │ │ │ +464 } │ │ │ │ │ +465 if(i == 0) │ │ │ │ │ +466 ___d_e_f_0 = def; │ │ │ │ │ +467 if(___p_a_r_e_n_t.___v_e_r_b_o_s_e > 1){ │ │ │ │ │ +468 if(i!=0) │ │ │ │ │ +469 ___p_a_r_e_n_t._p_r_i_n_t_O_u_t_p_u_t(std::cout,i,def,___d_e_f); │ │ │ │ │ +470 else │ │ │ │ │ +471 ___p_a_r_e_n_t._p_r_i_n_t_O_u_t_p_u_t(std::cout,i,def); │ │ │ │ │ +472 } │ │ │ │ │ +473 ___d_e_f = def; │ │ │ │ │ +474 ___i = i; │ │ │ │ │ +475 ___r_e_s._c_o_n_v_e_r_g_e_d = (Simd::allTrue(def<___d_e_f_0*___p_a_r_e_n_t.___r_e_d_u_c_t_i_o_n || │ │ │ │ │ +def<_r_e_a_l___t_y_p_e(1E-30))); // convergence check │ │ │ │ │ +476 return ___r_e_s._c_o_n_v_e_r_g_e_d; │ │ │ │ │ +477 } │ │ │ │ │ +478 │ │ │ │ │ +479 protected: │ │ │ │ │ +_4_8_0 void _f_i_n_a_l_i_z_e(){ │ │ │ │ │ +481 ___r_e_s._c_o_n_v_e_r_g_e_d = (Simd::allTrue(___d_e_f<___d_e_f_0*___p_a_r_e_n_t.___r_e_d_u_c_t_i_o_n || │ │ │ │ │ +___d_e_f<_r_e_a_l___t_y_p_e(1E-30))); │ │ │ │ │ +482 ___r_e_s._i_t_e_r_a_t_i_o_n_s = ___i; │ │ │ │ │ +483 ___r_e_s._r_e_d_u_c_t_i_o_n = static_cast(Simd::max(___d_e_f/___d_e_f_0)); │ │ │ │ │ +484 ___r_e_s._c_o_n_v___r_a_t_e = pow(___r_e_s._r_e_d_u_c_t_i_o_n,1.0/___i); │ │ │ │ │ +485 ___r_e_s._e_l_a_p_s_e_d = ___w_a_t_c_h.elapsed(); │ │ │ │ │ +486 if (___p_a_r_e_n_t.___v_e_r_b_o_s_e>0) // final print │ │ │ │ │ +487 { │ │ │ │ │ +488 std::cout << "=== rate=" << ___r_e_s._c_o_n_v___r_a_t_e │ │ │ │ │ +489 << ", T=" << ___r_e_s._e_l_a_p_s_e_d │ │ │ │ │ +490 << ", TIT=" << ___r_e_s._e_l_a_p_s_e_d/___r_e_s._i_t_e_r_a_t_i_o_n_s │ │ │ │ │ +491 << ", IT=" << ___r_e_s._i_t_e_r_a_t_i_o_n_s << std::endl; │ │ │ │ │ +492 } │ │ │ │ │ +493 } │ │ │ │ │ +494 │ │ │ │ │ +_4_9_5 _r_e_a_l___t_y_p_e ___d_e_f_0 = 0.0, ___d_e_f = 0.0; │ │ │ │ │ +_4_9_6 CountType ___i; │ │ │ │ │ +_4_9_7 Timer ___w_a_t_c_h; │ │ │ │ │ +_4_9_8 _I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t& ___r_e_s; │ │ │ │ │ +_4_9_9 const _I_t_e_r_a_t_i_v_e_S_o_l_v_e_r& ___p_a_r_e_n_t; │ │ │ │ │ +_5_0_0 bool ___v_a_l_i_d; │ │ │ │ │ +501 }; │ │ │ │ │ +502 │ │ │ │ │ +503 protected: │ │ │ │ │ +_5_0_4 std::shared_ptr> ___o_p; │ │ │ │ │ +_5_0_5 std::shared_ptr> ___p_r_e_c; │ │ │ │ │ +_5_0_6 std::shared_ptr> ___s_p; │ │ │ │ │ +_5_0_7 _s_c_a_l_a_r___r_e_a_l___t_y_p_e ___r_e_d_u_c_t_i_o_n; │ │ │ │ │ +_5_0_8 int ___m_a_x_i_t; │ │ │ │ │ +_5_0_9 int ___v_e_r_b_o_s_e; │ │ │ │ │ +_5_1_0 _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y ___c_a_t_e_g_o_r_y; │ │ │ │ │ +511 }; │ │ │ │ │ +512 │ │ │ │ │ +520 template │ │ │ │ │ +_5_2_1 class _S_o_l_v_e_r_H_e_l_p_e_r │ │ │ │ │ +522 { │ │ │ │ │ +523 public: │ │ │ │ │ +_5_2_4 static void _s_e_t_M_a_t_r_i_x (ISTLLinearSolver& solver, │ │ │ │ │ +525 const _B_C_R_S_M_a_t_r_i_x& matrix) │ │ │ │ │ +526 { │ │ │ │ │ +527 static const bool is_direct_solver │ │ │ │ │ +528 = _D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r_<_I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_>_:_:_v_a_l_u_e; │ │ │ │ │ +529 _S_o_l_v_e_r_H_e_l_p_e_r_<_I_S_T_L_L_i_n_e_a_r_S_o_l_v_e_r_,_B_C_R_S_M_a_t_r_i_x_>_:_: │ │ │ │ │ +530_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_<_i_s___d_i_r_e_c_t___s_o_l_v_e_r_>_:_:_s_e_t_M_a_t_r_i_x(solver,matrix); │ │ │ │ │ +531 } │ │ │ │ │ +532 │ │ │ │ │ +533 protected: │ │ │ │ │ +538 template │ │ │ │ │ +_5_3_9 struct _I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ +540 { │ │ │ │ │ +_5_4_1 static void _s_e_t_M_a_t_r_i_x (ISTLLinearSolver&, │ │ │ │ │ +542 const _B_C_R_S_M_a_t_r_i_x&) │ │ │ │ │ +543 {} │ │ │ │ │ +544 }; │ │ │ │ │ 545 │ │ │ │ │ -546 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ -547 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ -548 │ │ │ │ │ -549 // compute each residual norm │ │ │ │ │ -550 _R_e_a_l* Ax_max_raw = new _R_e_a_l[nrows]; │ │ │ │ │ -551 _R_e_a_l* Ax_min_raw = new _R_e_a_l[nrows]; │ │ │ │ │ -552 A.multMv(x_max_raw,Ax_max_raw); │ │ │ │ │ -553 A.multMv(x_min_raw,Ax_min_raw); │ │ │ │ │ -554 _R_e_a_l r_max_norm = 0.0; │ │ │ │ │ -555 _R_e_a_l r_min_norm = 0.0; │ │ │ │ │ -556 for (int i = 0; i < nrows; ++i) │ │ │ │ │ -557 { │ │ │ │ │ -558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2); │ │ │ │ │ -559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2); │ │ │ │ │ -560 } │ │ │ │ │ -561 r_max_norm = std::sqrt(r_max_norm); │ │ │ │ │ -562 r_min_norm = std::sqrt(r_min_norm); │ │ │ │ │ -563 │ │ │ │ │ -564 // print verbosity information │ │ │ │ │ -565 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -566 { │ │ │ │ │ -567 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -568 { │ │ │ │ │ -569 // print some information about the problem │ │ │ │ │ -570 std::cout << _b_l_a_n_k__ << "Obtained eigenvalues of A by solving " │ │ │ │ │ -571 << "A*x = λ*x using the ARPACK++ class ARSym" │ │ │ │ │ -572 << "StdEig:" << std::endl; │ │ │ │ │ -573 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A: " │ │ │ │ │ -574 << nconv << " / " << nev << std::endl; │ │ │ │ │ -575 std::cout << _b_l_a_n_k__ << " dominant eigenvalue of A: " │ │ │ │ │ -576 << lambda_max << std::endl; │ │ │ │ │ -577 std::cout << _b_l_a_n_k__ << " least dominant eigenvalue of A: " │ │ │ │ │ -578 << lambda_min << std::endl; │ │ │ │ │ -579 std::cout << _b_l_a_n_k__ << " spectral condition number of A: " │ │ │ │ │ -580 << cond_2 << std::endl; │ │ │ │ │ -581 } │ │ │ │ │ -582 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -583 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -584 << "║residual║_2 = {" << r_max_norm << "," │ │ │ │ │ -585 << r_min_norm << "}, " << "λ = {" │ │ │ │ │ -586 << lambda_max << "," << lambda_min │ │ │ │ │ -587 << "}): cond_2 = " << cond_2 << std::endl; │ │ │ │ │ -588 } │ │ │ │ │ -589 │ │ │ │ │ -590 // free dynamically allocated memory │ │ │ │ │ -591 delete[] Ax_min_raw; │ │ │ │ │ -592 delete[] Ax_max_raw; │ │ │ │ │ -593 delete[] ev; │ │ │ │ │ -594 } │ │ │ │ │ -595 │ │ │ │ │ -_6_0_9 inline void _c_o_m_p_u_t_e_N_o_n_S_y_m_M_a_x (const _R_e_a_l& epsilon, │ │ │ │ │ -610 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& sigma) const │ │ │ │ │ -611 { │ │ │ │ │ -612 // print verbosity information │ │ │ │ │ -613 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -614 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ -615 << "largest singular value of a matrix which " │ │ │ │ │ -616 << "is assumed to be nonsymmetric." << std::endl; │ │ │ │ │ -617 │ │ │ │ │ -618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ -619 // and to perform the product A^T*A*v (LU decomposition is not used) │ │ │ │ │ -620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ -621 WrappedMatrix A(_m__); │ │ │ │ │ -622 │ │ │ │ │ -623 // get number of rows and columns in A │ │ │ │ │ -624 const int nrows = A.nrows(); │ │ │ │ │ -625 const int ncols = A.ncols(); │ │ │ │ │ -626 │ │ │ │ │ -627 // assert that A has more rows than columns (extend code later to the │ │ │ │ │ -opposite case!) │ │ │ │ │ -628 if (nrows < ncols) │ │ │ │ │ -629 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix has less rows than " │ │ │ │ │ -630 << "columns (" << nrows << "x" << ncols << ")." │ │ │ │ │ -631 << " This case is not implemented, yet."); │ │ │ │ │ -632 │ │ │ │ │ -633 // allocate memory for variables, set parameters │ │ │ │ │ -634 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ -635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ -each iteration (0 == auto) │ │ │ │ │ -636 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ -values) (0 == machine precision) │ │ │ │ │ -637 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ -iterations allowed (0 == 100*nev) │ │ │ │ │ -638 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A^T*A │ │ │ │ │ -639 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ -determined │ │ │ │ │ -640 int nconv; // Number of converged eigenvalues │ │ │ │ │ -641 │ │ │ │ │ -642 // define what we need: eigenvalues with largest algebraic value │ │ │ │ │ -643 char which[] = "LA"; │ │ │ │ │ -644 ARSymStdEig │ │ │ │ │ -645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit); │ │ │ │ │ -646 │ │ │ │ │ -647 // set ARPACK verbosity mode if requested │ │ │ │ │ -648 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ -649 │ │ │ │ │ -650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues │ │ │ │ │ -651 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ -652 │ │ │ │ │ -653 // obtain approximated largest eigenvalue of A^T*A │ │ │ │ │ -654 const _R_e_a_l& lambda = ev[nev-1]; │ │ │ │ │ -655 │ │ │ │ │ -656 // obtain associated approximated eigenvector of A^T*A │ │ │ │ │ -657 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ -658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ -659 │ │ │ │ │ -660 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ -661 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ -662 │ │ │ │ │ -663 // compute residual norm │ │ │ │ │ -664 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ -665 _R_e_a_l* AtAx_raw = new _R_e_a_l[ncols]; │ │ │ │ │ -666 A.multMtMv(x_raw,AtAx_raw); │ │ │ │ │ -667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r); │ │ │ │ │ -668 r.axpy(-lambda,x); │ │ │ │ │ -669 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ -670 │ │ │ │ │ -671 // calculate largest singular value of A (note that │ │ │ │ │ -672 // x is right-singular / left-singular vector of A) │ │ │ │ │ -673 sigma = std::sqrt(lambda); │ │ │ │ │ -674 │ │ │ │ │ -675 // print verbosity information │ │ │ │ │ -676 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -677 { │ │ │ │ │ -678 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -679 { │ │ │ │ │ -680 // print some information about the problem │ │ │ │ │ -681 std::cout << _b_l_a_n_k__ << "Obtained singular values of A by sol" │ │ │ │ │ -682 << "ving (A^T*A)*x = σ²*x using the ARPACK++ " │ │ │ │ │ -683 << "class ARSymStdEig:" << std::endl; │ │ │ │ │ -684 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A^T*A: " │ │ │ │ │ -685 << nconv << " / " << nev << std::endl; │ │ │ │ │ -686 std::cout << _b_l_a_n_k__ << " largest eigenvalue of A^T*A: " │ │ │ │ │ -687 << lambda << std::endl; │ │ │ │ │ -688 std::cout << _b_l_a_n_k__ << " => largest singular value of A: " │ │ │ │ │ -689 << sigma << std::endl; │ │ │ │ │ -690 } │ │ │ │ │ -691 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -692 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -693 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -694 << "σ = " << sigma << std::endl; │ │ │ │ │ -695 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -696 { │ │ │ │ │ -697 // print approximated right-singular / left-singular vector │ │ │ │ │ -698 // via DUNE-ISTL I/O methods │ │ │ │ │ -699 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -700 } │ │ │ │ │ -701 } │ │ │ │ │ -702 │ │ │ │ │ -703 // free dynamically allocated memory │ │ │ │ │ -704 delete[] AtAx_raw; │ │ │ │ │ -705 delete[] ev; │ │ │ │ │ -706 } │ │ │ │ │ -707 │ │ │ │ │ -_7_2_1 inline void _c_o_m_p_u_t_e_N_o_n_S_y_m_M_i_n (const _R_e_a_l& epsilon, │ │ │ │ │ -722 _B_l_o_c_k_V_e_c_t_o_r& x, _R_e_a_l& sigma) const │ │ │ │ │ -723 { │ │ │ │ │ -724 // print verbosity information │ │ │ │ │ -725 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -726 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ -727 << "smallest singular value of a matrix which " │ │ │ │ │ -728 << "is assumed to be nonsymmetric." << std::endl; │ │ │ │ │ -729 │ │ │ │ │ -730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ -731 // and to perform the product A^T*A*v (LU decomposition is not used) │ │ │ │ │ -732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ -733 WrappedMatrix A(_m__); │ │ │ │ │ -734 │ │ │ │ │ -735 // get number of rows and columns in A │ │ │ │ │ -736 const int nrows = A.nrows(); │ │ │ │ │ -737 const int ncols = A.ncols(); │ │ │ │ │ -738 │ │ │ │ │ -739 // assert that A has more rows than columns (extend code later to the │ │ │ │ │ -opposite case!) │ │ │ │ │ -740 if (nrows < ncols) │ │ │ │ │ -741 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix has less rows than " │ │ │ │ │ -742 << "columns (" << nrows << "x" << ncols << ")." │ │ │ │ │ -743 << " This case is not implemented, yet."); │ │ │ │ │ -744 │ │ │ │ │ -745 // allocate memory for variables, set parameters │ │ │ │ │ -746 const int nev = 1; // Number of eigenvalues to compute │ │ │ │ │ -747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ -each iteration (0 == auto) │ │ │ │ │ -748 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ -values) (0 == machine precision) │ │ │ │ │ -749 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ -iterations allowed (0 == 100*nev) │ │ │ │ │ -750 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A^T*A │ │ │ │ │ -751 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ -determined │ │ │ │ │ -752 int nconv; // Number of converged eigenvalues │ │ │ │ │ -753 │ │ │ │ │ -754 // define what we need: eigenvalues with smallest algebraic value │ │ │ │ │ -755 char which[] = "SA"; │ │ │ │ │ -756 ARSymStdEig │ │ │ │ │ -757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit); │ │ │ │ │ -758 │ │ │ │ │ -759 // set ARPACK verbosity mode if requested │ │ │ │ │ -760 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ -761 │ │ │ │ │ -762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues │ │ │ │ │ -763 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ -764 │ │ │ │ │ -765 // obtain approximated smallest eigenvalue of A^T*A │ │ │ │ │ -766 const _R_e_a_l& lambda = ev[nev-1]; │ │ │ │ │ -767 │ │ │ │ │ -768 // obtain associated approximated eigenvector of A^T*A │ │ │ │ │ -769 _R_e_a_l* x_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ -770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x); │ │ │ │ │ -771 │ │ │ │ │ -772 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ -773 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ -774 │ │ │ │ │ -775 // compute residual norm │ │ │ │ │ -776 _B_l_o_c_k_V_e_c_t_o_r r(x); │ │ │ │ │ -777 _R_e_a_l* AtAx_raw = new _R_e_a_l[ncols]; │ │ │ │ │ -778 A.multMtMv(x_raw,AtAx_raw); │ │ │ │ │ -779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r); │ │ │ │ │ -780 r.axpy(-lambda,x); │ │ │ │ │ -781 const _R_e_a_l r_norm = r.two_norm(); │ │ │ │ │ -782 │ │ │ │ │ -783 // calculate smallest singular value of A (note that │ │ │ │ │ -784 // x is right-singular / left-singular vector of A) │ │ │ │ │ -785 sigma = std::sqrt(lambda); │ │ │ │ │ -786 │ │ │ │ │ -787 // print verbosity information │ │ │ │ │ -788 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -789 { │ │ │ │ │ -790 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -791 { │ │ │ │ │ -792 // print some information about the problem │ │ │ │ │ -793 std::cout << _b_l_a_n_k__ << "Obtained singular values of A by sol" │ │ │ │ │ -794 << "ving (A^T*A)*x = σ²*x using the ARPACK++ " │ │ │ │ │ -795 << "class ARSymStdEig:" << std::endl; │ │ │ │ │ -796 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A^T*A: " │ │ │ │ │ -797 << nconv << " / " << nev << std::endl; │ │ │ │ │ -798 std::cout << _b_l_a_n_k__ << " smallest eigenvalue of A^T*A: " │ │ │ │ │ -799 << lambda << std::endl; │ │ │ │ │ -800 std::cout << _b_l_a_n_k__ << " => smallest singular value of A: " │ │ │ │ │ -801 << sigma << std::endl; │ │ │ │ │ -802 } │ │ │ │ │ -803 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -804 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -805 << "║residual║_2 = " << r_norm << "): " │ │ │ │ │ -806 << "σ = " << sigma << std::endl; │ │ │ │ │ -807 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 2) │ │ │ │ │ -808 { │ │ │ │ │ -809 // print approximated right-singular / left-singular vector │ │ │ │ │ -810 // via DUNE-ISTL I/O methods │ │ │ │ │ -811 _D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r(std::cout,x,_b_l_a_n_k__+"x",_b_l_a_n_k__+"row"); │ │ │ │ │ -812 } │ │ │ │ │ -813 } │ │ │ │ │ -814 │ │ │ │ │ -815 // free dynamically allocated memory │ │ │ │ │ -816 delete[] AtAx_raw; │ │ │ │ │ -817 delete[] ev; │ │ │ │ │ -818 } │ │ │ │ │ -819 │ │ │ │ │ -_8_3_0 inline void _c_o_m_p_u_t_e_N_o_n_S_y_m_C_o_n_d_2 (const _R_e_a_l& epsilon, _R_e_a_l& cond_2) const │ │ │ │ │ -831 { │ │ │ │ │ -832 // print verbosity information │ │ │ │ │ -833 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -834 std::cout << _t_i_t_l_e__ << "Computing an approximation of the " │ │ │ │ │ -835 << "spectral condition number of a matrix which " │ │ │ │ │ -836 << "is assumed to be nonsymmetric." << std::endl; │ │ │ │ │ -837 │ │ │ │ │ -838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information │ │ │ │ │ -839 // and to perform the product A^T*A*v (LU decomposition is not used) │ │ │ │ │ -840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix; │ │ │ │ │ -841 WrappedMatrix A(_m__); │ │ │ │ │ -842 │ │ │ │ │ -843 // get number of rows and columns in A │ │ │ │ │ -844 const int nrows = A.nrows(); │ │ │ │ │ -845 const int ncols = A.ncols(); │ │ │ │ │ -846 │ │ │ │ │ -847 // assert that A has more rows than columns (extend code later to the │ │ │ │ │ -opposite case!) │ │ │ │ │ -848 if (nrows < ncols) │ │ │ │ │ -849 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"Matrix has less rows than " │ │ │ │ │ -850 << "columns (" << nrows << "x" << ncols << ")." │ │ │ │ │ -851 << " This case is not implemented, yet."); │ │ │ │ │ -852 │ │ │ │ │ -853 // allocate memory for variables, set parameters │ │ │ │ │ -854 const int nev = 2; // Number of eigenvalues to compute │ │ │ │ │ -855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at │ │ │ │ │ -each iteration (0 == auto) │ │ │ │ │ -856 const _R_e_a_l tol = epsilon; // Stopping tolerance (relative accuracy of Ritz │ │ │ │ │ -values) (0 == machine precision) │ │ │ │ │ -857 const int maxit = _n_I_t_e_r_a_t_i_o_n_s_M_a_x__*nev; // Maximum number of Arnoldi update │ │ │ │ │ -iterations allowed (0 == 100*nev) │ │ │ │ │ -858 _R_e_a_l* ev = new _R_e_a_l[nev]; // Computed eigenvalues of A^T*A │ │ │ │ │ -859 const bool ivec = true; // Flag deciding if eigenvectors shall be │ │ │ │ │ -determined │ │ │ │ │ -860 int nconv; // Number of converged eigenvalues │ │ │ │ │ -861 │ │ │ │ │ -862 // define what we need: eigenvalues from both ends of the spectrum │ │ │ │ │ -863 char which[] = "BE"; │ │ │ │ │ -864 ARSymStdEig │ │ │ │ │ -865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit); │ │ │ │ │ -866 │ │ │ │ │ -867 // set ARPACK verbosity mode if requested │ │ │ │ │ -868 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 3) dprob.Trace(); │ │ │ │ │ -869 │ │ │ │ │ -870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues │ │ │ │ │ -871 nconv = dprob.Eigenvalues(ev,ivec); │ │ │ │ │ -872 │ │ │ │ │ -873 // obtain approximated largest and smallest eigenvalue of A^T*A │ │ │ │ │ -874 const _R_e_a_l& lambda_max = ev[nev-1]; │ │ │ │ │ -875 const _R_e_a_l& lambda_min = ev[0]; │ │ │ │ │ -876 │ │ │ │ │ -877 // obtain associated approximated eigenvectors of A^T*A │ │ │ │ │ -878 _R_e_a_l* x_max_raw = dprob.RawEigenvector(nev-1); │ │ │ │ │ -879 _R_e_a_l* x_min_raw = dprob.RawEigenvector(0); │ │ │ │ │ -880 │ │ │ │ │ -881 // obtain number of Arnoldi update iterations actually taken │ │ │ │ │ -882 _n_I_t_e_r_a_t_i_o_n_s__ = dprob.GetIter(); │ │ │ │ │ -883 │ │ │ │ │ -884 // compute each residual norm │ │ │ │ │ -885 _R_e_a_l* AtAx_max_raw = new _R_e_a_l[ncols]; │ │ │ │ │ -886 _R_e_a_l* AtAx_min_raw = new _R_e_a_l[ncols]; │ │ │ │ │ -887 A.multMtMv(x_max_raw,AtAx_max_raw); │ │ │ │ │ -888 A.multMtMv(x_min_raw,AtAx_min_raw); │ │ │ │ │ -889 _R_e_a_l r_max_norm = 0.0; │ │ │ │ │ -890 _R_e_a_l r_min_norm = 0.0; │ │ │ │ │ -891 for (int i = 0; i < ncols; ++i) │ │ │ │ │ -892 { │ │ │ │ │ -893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2); │ │ │ │ │ -894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2); │ │ │ │ │ -895 } │ │ │ │ │ -896 r_max_norm = std::sqrt(r_max_norm); │ │ │ │ │ -897 r_min_norm = std::sqrt(r_min_norm); │ │ │ │ │ -898 │ │ │ │ │ -899 // calculate largest and smallest singular value of A │ │ │ │ │ -900 const _R_e_a_l sigma_max = std::sqrt(lambda_max); │ │ │ │ │ -901 const _R_e_a_l sigma_min = std::sqrt(lambda_min); │ │ │ │ │ -902 │ │ │ │ │ -903 // obtain approximated spectral condition number of A │ │ │ │ │ -904 cond_2 = sigma_max / sigma_min; │ │ │ │ │ -905 │ │ │ │ │ -906 // print verbosity information │ │ │ │ │ -907 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 0) │ │ │ │ │ -908 { │ │ │ │ │ -909 if (_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ > 1) │ │ │ │ │ -910 { │ │ │ │ │ -911 // print some information about the problem │ │ │ │ │ -912 std::cout << _b_l_a_n_k__ << "Obtained singular values of A by sol" │ │ │ │ │ -913 << "ving (A^T*A)*x = σ²*x using the ARPACK++ " │ │ │ │ │ -914 << "class ARSymStdEig:" << std::endl; │ │ │ │ │ -915 std::cout << _b_l_a_n_k__ << " converged eigenvalues of A^T*A: " │ │ │ │ │ -916 << nconv << " / " << nev << std::endl; │ │ │ │ │ -917 std::cout << _b_l_a_n_k__ << " largest eigenvalue of A^T*A: " │ │ │ │ │ -918 << lambda_max << std::endl; │ │ │ │ │ -919 std::cout << _b_l_a_n_k__ << " smallest eigenvalue of A^T*A: " │ │ │ │ │ -920 << lambda_min << std::endl; │ │ │ │ │ -921 std::cout << _b_l_a_n_k__ << " => largest singular value of A: " │ │ │ │ │ -922 << sigma_max << std::endl; │ │ │ │ │ -923 std::cout << _b_l_a_n_k__ << " => smallest singular value of A: " │ │ │ │ │ -924 << sigma_min << std::endl; │ │ │ │ │ -925 } │ │ │ │ │ -926 std::cout << _b_l_a_n_k__ << "Result (" │ │ │ │ │ -927 << "#iterations = " << _n_I_t_e_r_a_t_i_o_n_s__ << ", " │ │ │ │ │ -928 << "║residual║_2 = {" << r_max_norm << "," │ │ │ │ │ -929 << r_min_norm << "}, " << "σ = {" │ │ │ │ │ -930 << sigma_max << "," << sigma_min │ │ │ │ │ -931 << "}): cond_2 = " << cond_2 << std::endl; │ │ │ │ │ -932 } │ │ │ │ │ -933 │ │ │ │ │ -934 // free dynamically allocated memory │ │ │ │ │ -935 delete[] AtAx_min_raw; │ │ │ │ │ -936 delete[] AtAx_max_raw; │ │ │ │ │ -937 delete[] ev; │ │ │ │ │ -938 } │ │ │ │ │ -939 │ │ │ │ │ -_9_4_4 inline unsigned int _g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t () const │ │ │ │ │ -945 { │ │ │ │ │ -946 if (_n_I_t_e_r_a_t_i_o_n_s__ == 0) │ │ │ │ │ -947 DUNE_THROW(_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r,"No algorithm applied, yet."); │ │ │ │ │ -948 │ │ │ │ │ -949 return _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ -950 } │ │ │ │ │ -951 │ │ │ │ │ -952 protected: │ │ │ │ │ -953 // parameters related to iterative eigenvalue algorithms │ │ │ │ │ -_9_5_4 const _B_C_R_S_M_a_t_r_i_x& _m__; │ │ │ │ │ -_9_5_5 const unsigned int _n_I_t_e_r_a_t_i_o_n_s_M_a_x__; │ │ │ │ │ -956 │ │ │ │ │ -957 // verbosity setting │ │ │ │ │ -_9_5_8 const unsigned int _v_e_r_b_o_s_i_t_y___l_e_v_e_l__; │ │ │ │ │ -959 │ │ │ │ │ -960 // memory for storing temporary variables (mutable as they shall │ │ │ │ │ -961 // just be effectless auxiliary variables of the const apply*(...) │ │ │ │ │ -962 // methods) │ │ │ │ │ -_9_6_3 mutable unsigned int _n_I_t_e_r_a_t_i_o_n_s__; │ │ │ │ │ -964 │ │ │ │ │ -965 // constants for printing verbosity information │ │ │ │ │ -_9_6_6 const std::string _t_i_t_l_e__; │ │ │ │ │ -_9_6_7 const std::string _b_l_a_n_k__; │ │ │ │ │ -968 }; │ │ │ │ │ -969 │ │ │ │ │ -972} // namespace Dune │ │ │ │ │ -973 │ │ │ │ │ -974#endif // HAVE_ARPACKPP │ │ │ │ │ -975 │ │ │ │ │ -976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH │ │ │ │ │ -_i_o_._h_h │ │ │ │ │ -Some generic functions for pretty printing vectors and matrices. │ │ │ │ │ -_b_l_o_c_k_l_e_v_e_l_._h_h │ │ │ │ │ -Helper functions for determining the vector/matrix block level. │ │ │ │ │ -_i_s_t_l_e_x_c_e_p_t_i_o_n_._h_h │ │ │ │ │ -_b_v_e_c_t_o_r_._h_h │ │ │ │ │ -This file implements a vector space as a tensor product of a given vector │ │ │ │ │ -space. The number of compon... │ │ │ │ │ -_D_u_n_e_:_:_p_r_i_n_t_v_e_c_t_o_r │ │ │ │ │ -void printvector(std::ostream &s, const V &v, std::string title, std::string │ │ │ │ │ -rowtext, int columns=1, int width=10, int precision=2) │ │ │ │ │ -Print an ISTL vector. │ │ │ │ │ -DDeeffiinniittiioonn io.hh:89 │ │ │ │ │ +550 template │ │ │ │ │ +_5_5_1 struct _I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ +552 { │ │ │ │ │ +_5_5_3 static void _s_e_t_M_a_t_r_i_x (ISTLLinearSolver& solver, │ │ │ │ │ +554 const _B_C_R_S_M_a_t_r_i_x& matrix) │ │ │ │ │ +555 { │ │ │ │ │ +556 solver.setMatrix(matrix); │ │ │ │ │ +557 } │ │ │ │ │ +558 }; │ │ │ │ │ +559 }; │ │ │ │ │ +560 │ │ │ │ │ +564} │ │ │ │ │ +565 │ │ │ │ │ +566#endif │ │ │ │ │ +_s_c_a_l_a_r_p_r_o_d_u_c_t_s_._h_h │ │ │ │ │ +Define base class for scalar product and norm. │ │ │ │ │ +_s_o_l_v_e_r_t_y_p_e_._h_h │ │ │ │ │ +Templates characterizing the type of a solver. │ │ │ │ │ +_p_r_e_c_o_n_d_i_t_i_o_n_e_r_._h_h │ │ │ │ │ +_o_p_e_r_a_t_o_r_s_._h_h │ │ │ │ │ +Define general, extensible interface for operators. The available │ │ │ │ │ +implementation wraps a matrix. │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ +_D_u_n_e_:_:_g_e_t │ │ │ │ │ +PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg:: │ │ │ │ │ +VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag, │ │ │ │ │ +Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph) │ │ │ │ │ +DDeeffiinniittiioonn dependency.hh:293 │ │ │ │ │ _D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x │ │ │ │ │ A sparse block matrix with compressed row storage. │ │ │ │ │ DDeeffiinniittiioonn bcrsmatrix.hh:466 │ │ │ │ │ -_D_u_n_e_:_:_B_C_R_S_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bcrsmatrix.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r │ │ │ │ │ -A vector of blocks with memory management. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ -typename Imp::BlockTraits< B >::field_type field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:401 │ │ │ │ │ -_D_u_n_e_:_:_B_l_o_c_k_V_e_c_t_o_r_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The type for the index access. │ │ │ │ │ -DDeeffiinniittiioonn bvector.hh:410 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -Wrapper to use a range of ARPACK++ eigenvalue solvers. │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_v_e_r_b_o_s_i_t_y___l_e_v_e_l__ │ │ │ │ │ -const unsigned int verbosity_level_ │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:958 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_g_e_t_I_t_e_r_a_t_i_o_n_C_o_u_n_t │ │ │ │ │ -unsigned int getIterationCount() const │ │ │ │ │ -Return the number of iterations in last application of an algorithm. │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:944 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_t_i_t_l_e__ │ │ │ │ │ -const std::string title_ │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:966 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_R_e_a_l │ │ │ │ │ -BlockVector::field_type Real │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:247 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_a_x_M_a_g_n_i_t_u_d_e │ │ │ │ │ -void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_A_b_o_r_t │ │ │ │ │ +Thrown when a solver aborts due to some problem. │ │ │ │ │ +DDeeffiinniittiioonn istlexception.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_L_i_n_e_a_r_O_p_e_r_a_t_o_r │ │ │ │ │ +A linear operator. │ │ │ │ │ +DDeeffiinniittiioonn operators.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_P_r_e_c_o_n_d_i_t_i_o_n_e_r │ │ │ │ │ +Base class for matrix free definition of preconditioners. │ │ │ │ │ +DDeeffiinniittiioonn preconditioner.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Base class for scalar product and norm computation. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_S_e_q_S_c_a_l_a_r_P_r_o_d_u_c_t │ │ │ │ │ +Default implementation for the scalar case. │ │ │ │ │ +DDeeffiinniittiioonn scalarproducts.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +Statistics about the application of an inverse operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t │ │ │ │ │ +InverseOperatorResult() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_d_i_t_i_o_n___e_s_t_i_m_a_t_e │ │ │ │ │ +double condition_estimate │ │ │ │ │ +Estimate of condition number. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_e_l_a_p_s_e_d │ │ │ │ │ +double elapsed │ │ │ │ │ +Elapsed time in seconds. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_i_t_e_r_a_t_i_o_n_s │ │ │ │ │ +int iterations │ │ │ │ │ +Number of iterations. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_r_e_d_u_c_t_i_o_n │ │ │ │ │ +double reduction │ │ │ │ │ +Reduction achieved: . │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +Resets all data. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v___r_a_t_e │ │ │ │ │ +double conv_rate │ │ │ │ │ +Convergence rate (average reduction per step) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_R_e_s_u_l_t_:_:_c_o_n_v_e_r_g_e_d │ │ │ │ │ +bool converged │ │ │ │ │ +True if convergence criterion has been met. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +Abstract base class for all solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_p_r_i_n_t_H_e_a_d_e_r │ │ │ │ │ +void printHeader(std::ostream &s) const │ │ │ │ │ +helper function for printing header of solver output │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_~_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r │ │ │ │ │ +virtual ~InverseOperator() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_p_r_i_n_t_O_u_t_p_u_t │ │ │ │ │ +void printOutput(std::ostream &s, const CountType &iter, const DataType &norm) │ │ │ │ │ const │ │ │ │ │ -Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ -approximation lambda of its ... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_M_i_n_M_a_g_n_i_t_u_d_e │ │ │ │ │ -void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda) │ │ │ │ │ -const │ │ │ │ │ -Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ -approximation lambda of its ... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:391 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_m__ │ │ │ │ │ -const BCRSMatrix & m_ │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:954 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s_M_a_x__ │ │ │ │ │ -const unsigned int nIterationsMax_ │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:955 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_b_l_a_n_k__ │ │ │ │ │ -const std::string blank_ │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:967 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s │ │ │ │ │ -ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int │ │ │ │ │ -nIterationsMax=100000, const unsigned int verbosity_level=0) │ │ │ │ │ -Construct from required parameters. │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_S_y_m_C_o_n_d_2 │ │ │ │ │ -void computeSymCond2(const Real &epsilon, Real &cond_2) const │ │ │ │ │ -Assume the matrix to be square, symmetric and perform IRLM to compute an │ │ │ │ │ -approximation of its spectra... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:493 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_n_I_t_e_r_a_t_i_o_n_s__ │ │ │ │ │ -unsigned int nIterations_ │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:963 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_N_o_n_S_y_m_M_i_n │ │ │ │ │ -void computeNonSymMin(const Real &epsilon, BlockVector &x, Real &sigma) const │ │ │ │ │ -Assume the matrix to be nonsymmetric and perform IRLM to compute an │ │ │ │ │ -approximation sigma of its smalle... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:721 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_N_o_n_S_y_m_C_o_n_d_2 │ │ │ │ │ -void computeNonSymCond2(const Real &epsilon, Real &cond_2) const │ │ │ │ │ -Assume the matrix to be nonsymmetric and perform IRLM to compute an │ │ │ │ │ -approximation of its spectral con... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:830 │ │ │ │ │ -_D_u_n_e_:_:_A_r_P_a_c_k_P_l_u_s_P_l_u_s___A_l_g_o_r_i_t_h_m_s_:_:_c_o_m_p_u_t_e_N_o_n_S_y_m_M_a_x │ │ │ │ │ -void computeNonSymMax(const Real &epsilon, BlockVector &x, Real &sigma) const │ │ │ │ │ -Assume the matrix to be nonsymmetric and perform IRLM to compute an │ │ │ │ │ -approximation sigma of its larges... │ │ │ │ │ -DDeeffiinniittiioonn arpackpp.hh:609 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ +helper function for printing solver output │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_p_r_i_n_t_O_u_t_p_u_t │ │ │ │ │ +void printOutput(std::ostream &s, const CountType &iter, const DataType &norm, │ │ │ │ │ +const DataType &norm_old) const │ │ │ │ │ +helper function for printing solver output │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0 │ │ │ │ │ +apply inverse operator, with given convergence criteria. │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_s_c_a_l_a_r___r_e_a_l___t_y_p_e │ │ │ │ │ +Simd::Scalar< real_type > scalar_real_type │ │ │ │ │ +scalar type underlying the field_type │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_a_n_g_e___t_y_p_e │ │ │ │ │ +Y range_type │ │ │ │ │ +Type of the range of the operator to be inverted. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_n_o_r_m_S_p_a_c_i_n_g │ │ │ │ │ +@ normSpacing │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_i_t_e_r_a_t_i_o_n_S_p_a_c_i_n_g │ │ │ │ │ +@ iterationSpacing │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_d_o_m_a_i_n___t_y_p_e │ │ │ │ │ +X domain_type │ │ │ │ │ +Type of the domain of the operator to be inverted. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:102 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0 │ │ │ │ │ +Apply inverse operator,. │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +X::field_type field_type │ │ │ │ │ +The field type of the operator. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +FieldTraits< field_type >::real_type real_type │ │ │ │ │ +The real type of the field type (is the same if using real numbers, but differs │ │ │ │ │ +for std::complex) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_e_r_s_e_O_p_e_r_a_t_o_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const =0 │ │ │ │ │ +Category of the solver (see SolverCategory::Category) │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +Base class for all implementations of iterative solvers. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +X > > prec, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ +shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_a_p_p_l_y │ │ │ │ │ +virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res) │ │ │ │ │ +Apply inverse operator with given reduction factor. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:374 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___s_p │ │ │ │ │ +std::shared_ptr< const ScalarProduct< X > > _sp │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:506 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std:: │ │ │ │ │ +shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, │ │ │ │ │ +Y > > prec, scalar_real_type reduction, int maxit, int verbose) │ │ │ │ │ +General constructor to initialize an iterative solver. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:340 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_n_a_m_e │ │ │ │ │ +std::string name() const │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:388 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +IterativeSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec, │ │ │ │ │ +scalar_real_type reduction, int maxit, int verbose) │ │ │ │ │ +General constructor to initialize an iterative solver. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___o_p │ │ │ │ │ +std::shared_ptr< const LinearOperator< X, Y > > _op │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___m_a_x_i_t │ │ │ │ │ +int _maxit │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:508 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___v_e_r_b_o_s_e │ │ │ │ │ +int _verbose │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:509 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___r_e_d_u_c_t_i_o_n │ │ │ │ │ +scalar_real_type _reduction │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:507 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r │ │ │ │ │ +IterativeSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp, │ │ │ │ │ +Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int │ │ │ │ │ +verbose) │ │ │ │ │ +General constructor to initialize an iterative solver. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___c_a_t_e_g_o_r_y │ │ │ │ │ +SolverCategory::Category _category │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:510 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:___p_r_e_c │ │ │ │ │ +std::shared_ptr< Preconditioner< X, Y > > _prec │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:505 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +virtual SolverCategory::Category category() const │ │ │ │ │ +Category of the solver (see SolverCategory::Category) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:383 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +Class for controlling iterative methods. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:411 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +Iteration(const IterativeSolver &parent, InverseOperatorResult &res) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:413 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +Iteration(Iteration &&other) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:428 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___r_e_s │ │ │ │ │ +InverseOperatorResult & _res │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:498 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___p_a_r_e_n_t │ │ │ │ │ +const IterativeSolver & _parent │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:499 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___w_a_t_c_h │ │ │ │ │ +Timer _watch │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:497 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_I_t_e_r_a_t_i_o_n │ │ │ │ │ +Iteration(const Iteration &)=delete │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___i │ │ │ │ │ +CountType _i │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:496 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___d_e_f_0 │ │ │ │ │ +real_type _def0 │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:495 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_s_t_e_p │ │ │ │ │ +bool step(CountType i, real_type def) │ │ │ │ │ +registers the iteration step, checks for invalid defect norm and convergence. │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:455 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_f_i_n_a_l_i_z_e │ │ │ │ │ +void finalize() │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:480 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___d_e_f │ │ │ │ │ +real_type _def │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:495 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:_~_I_t_e_r_a_t_i_o_n │ │ │ │ │ +~Iteration() │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:440 │ │ │ │ │ +_D_u_n_e_:_:_I_t_e_r_a_t_i_v_e_S_o_l_v_e_r_:_:_I_t_e_r_a_t_i_o_n_:_:___v_a_l_i_d │ │ │ │ │ +bool _valid │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:500 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r │ │ │ │ │ +Helper class for notifying a DUNE-ISTL linear solver about a change of the │ │ │ │ │ +iteration matrix object in... │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:522 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:524 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ +Implementation that works together with iterative ISTL solvers, e.g. Dune:: │ │ │ │ │ +CGSolver or Dune::BiCGSTAB... │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:540 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:541 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_H_e_l_p_e_r_:_:_I_m_p_l_e_m_e_n_t_a_t_i_o_n_<_ _t_r_u_e_,_ _D_u_m_m_y_ _>_:_:_s_e_t_M_a_t_r_i_x │ │ │ │ │ +static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix) │ │ │ │ │ +DDeeffiinniittiioonn solver.hh:553 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +Categories for the solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:22 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_C_a_t_e_g_o_r_y │ │ │ │ │ +Category │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:23 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_s_e_q_u_e_n_t_i_a_l │ │ │ │ │ +@ sequential │ │ │ │ │ +Category for sequential solvers. │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ +static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ +Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ +newly introduced virtu... │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_I_n_v_a_l_i_d_S_o_l_v_e_r_C_a_t_e_g_o_r_y │ │ │ │ │ +DDeeffiinniittiioonn solvercategory.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_I_s_D_i_r_e_c_t_S_o_l_v_e_r │ │ │ │ │ +DDeeffiinniittiioonn solvertype.hh:16 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00227.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixredistribute.hh File Reference │ │ │ │ +dune-istl: scaledidmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,86 +71,49 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
matrixredistribute.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
scaledidmatrix.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Functionality for redistributing a sparse matrix. │ │ │ │ +

This file implements a quadratic matrix of fixed size which is a multiple of the identity. │ │ │ │ More...

│ │ │ │ -
#include <memory>
│ │ │ │ -#include "repartition.hh"
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <iostream>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/parallel/indexset.hh>
│ │ │ │ -#include <dune/istl/owneroverlapcopy.hh>
│ │ │ │ -#include <dune/istl/paamg/pinfo.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +#include <dune/common/ftraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::RedistributeInformation< T >
class  Dune::ScaledIdentityMatrix< K, n >
 A multiple of the identity matrix of static size. More...
 
class  Dune::RedistributeInformation< OwnerOverlapCopyCommunication< T, T1 > >
struct  Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > >
 
struct  Dune::CommMatrixRowSize< M, RI >
 Utility class to communicate and set the row sizes of a redistributed matrix. More...
 
struct  Dune::CommMatrixSparsityPattern< M, I >
 Utility class to communicate and build the sparsity pattern of a redistributed matrix. More...
 
struct  Dune::CommPolicy< CommMatrixSparsityPattern< M, I > >
 
struct  Dune::CommMatrixRow< M, I >
 Utility class for comunicating the matrix entries. More...
 
struct  Dune::CommPolicy< CommMatrixRow< M, I > >
 
struct  Dune::MatrixRowSizeGatherScatter< M, I, RI >
 
struct  Dune::MatrixCopyRowSizeGatherScatter< M, I, RI >
 
struct  Dune::MatrixSparsityPatternGatherScatter< M, I >
 
struct  Dune::MatrixRowGatherScatter< M, I >
struct  Dune::FieldTraits< ScaledIdentityMatrix< K, n > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<typename M , typename C >
void Dune::redistributeSparsityPattern (M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
 
template<typename M , typename C >
void Dune::redistributeMatrixEntries (M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
 
template<typename M , typename C >
void Dune::redistributeMatrix (M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
 Redistribute a matrix according to given domain decompositions.
 
template<typename M >
void Dune::redistributeMatrixEntries (M &origMatrix, M &newMatrix, Dune::Amg::SequentialInformation &origComm, Dune::Amg::SequentialInformation &newComm, RedistributeInformation< Dune::Amg::SequentialInformation > &ri)
 
template<typename M >
void Dune::redistributeMatrix (M &origMatrix, M &newMatrix, Dune::Amg::SequentialInformation &origComm, Dune::Amg::SequentialInformation &newComm, RedistributeInformation< Dune::Amg::SequentialInformation > &ri)
 
│ │ │ │

Detailed Description

│ │ │ │ -

Functionality for redistributing a sparse matrix.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

This file implements a quadratic matrix of fixed size which is a multiple of the identity.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,80 +1,36 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -_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 │ │ │ │ │ -matrixredistribute.hh File Reference │ │ │ │ │ -Functionality for redistributing a sparse matrix. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include "_r_e_p_a_r_t_i_t_i_o_n_._h_h" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +scaledidmatrix.hh File Reference │ │ │ │ │ +This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ +the identity. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ +#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_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _T_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _> │ │ │ │ │ +  A multiple of the identity matrix of static size. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _> │ │ │ │ │ - _> │ │ │ │ │ +struct   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r_<_ _D_e_n_s_e_M_a_t_r_i_x_,_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _f_i_e_l_d_,_ _N │ │ │ │ │ + _>_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_ _M_,_ _R_I_ _> │ │ │ │ │ -  Utility class to communicate and set the row sizes of a redistributed │ │ │ │ │ - matrix. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _> │ │ │ │ │ -  Utility class to communicate and build the sparsity pattern of a │ │ │ │ │ - redistributed matrix. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _> │ │ │ │ │ -  Utility class for comunicating the matrix entries. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_,_ _R_I_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_,_ _R_I_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_ _M_,_ _I_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n (M &origMatrix, M &newMatrix, C │ │ │ │ │ - &origComm, C &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s (M &origMatrix, M &newMatrix, C │ │ │ │ │ - &origComm, C &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ - &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< C > &ri) │ │ │ │ │ -  Redistribute a matrix according to given domain decompositions. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s (M &origMatrix, M &newMatrix, _D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ - _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n &origComm, _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ - &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > │ │ │ │ │ - &ri) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x (M &origMatrix, M &newMatrix, _D_u_n_e_:_:_A_m_g_:_: │ │ │ │ │ - _S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n &origComm, _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ - &newComm, _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n< _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n > │ │ │ │ │ - &ri) │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Functionality for redistributing a sparse matrix. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +This file implements a quadratic matrix of fixed size which is a multiple of │ │ │ │ │ +the identity. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-istl: matrixredistribute.hh Source File │ │ │ │ +dune-istl: scaledidmatrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,996 +74,626 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
matrixredistribute.hh
│ │ │ │ +
scaledidmatrix.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
4// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH
│ │ │ │ -
6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH
│ │ │ │ -
7#include <memory>
│ │ │ │ -
8#include "repartition.hh"
│ │ │ │ -
9#include <dune/common/exceptions.hh>
│ │ │ │ -
10#include <dune/common/parallel/indexset.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
18namespace Dune
│ │ │ │ -
19{
│ │ │ │ -
20 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
22 {
│ │ │ │ -
│ │ │ │ -
23 bool isSetup() const
│ │ │ │ -
24 {
│ │ │ │ -
25 return false;
│ │ │ │ -
26 }
│ │ │ │ -
│ │ │ │ -
27 template<class D>
│ │ │ │ -
│ │ │ │ -
28 void redistribute([[maybe_unused]] const D& from, [[maybe_unused]] D& to) const
│ │ │ │ -
29 {}
│ │ │ │ -
│ │ │ │ -
30
│ │ │ │ -
31 template<class D>
│ │ │ │ -
│ │ │ │ -
32 void redistributeBackward([[maybe_unused]] D& from, [[maybe_unused]]const D& to) const
│ │ │ │ -
33 {}
│ │ │ │ -
│ │ │ │ -
34
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
36 {}
│ │ │ │ -
│ │ │ │ -
37
│ │ │ │ -
│ │ │ │ -
38 void setNoRows([[maybe_unused]] std::size_t size)
│ │ │ │ -
39 {}
│ │ │ │ -
│ │ │ │ -
40
│ │ │ │ -
│ │ │ │ -
41 void setNoCopyRows([[maybe_unused]] std::size_t size)
│ │ │ │ -
42 {}
│ │ │ │ -
│ │ │ │ -
43
│ │ │ │ -
│ │ │ │ -
44 void setNoBackwardsCopyRows([[maybe_unused]] std::size_t size)
│ │ │ │ -
45 {}
│ │ │ │ -
│ │ │ │ -
46
│ │ │ │ -
│ │ │ │ -
47 std::size_t getRowSize([[maybe_unused]] std::size_t index) const
│ │ │ │ -
48 {
│ │ │ │ -
49 return -1;
│ │ │ │ -
50 }
│ │ │ │ -
│ │ │ │ -
51
│ │ │ │ -
│ │ │ │ -
52 std::size_t getCopyRowSize([[maybe_unused]] std::size_t index) const
│ │ │ │ -
53 {
│ │ │ │ -
54 return -1;
│ │ │ │ -
55 }
│ │ │ │ -
│ │ │ │ -
56
│ │ │ │ -
│ │ │ │ -
57 std::size_t getBackwardsCopyRowSize([[maybe_unused]] std::size_t index) const
│ │ │ │ -
58 {
│ │ │ │ -
59 return -1;
│ │ │ │ -
60 }
│ │ │ │ -
│ │ │ │ -
61
│ │ │ │ -
62 };
│ │ │ │ -
│ │ │ │ -
63
│ │ │ │ -
64#if HAVE_MPI
│ │ │ │ -
65 template<typename T, typename T1>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
67 {
│ │ │ │ -
68 public:
│ │ │ │ - │ │ │ │ -
70
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
72 : interface(), setup_(false)
│ │ │ │ -
73 {}
│ │ │ │ +
5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH
│ │ │ │ +
6#define DUNE_ISTL_SCALEDIDMATRIX_HH
│ │ │ │ +
7
│ │ │ │ +
14#include <cmath>
│ │ │ │ +
15#include <cstddef>
│ │ │ │ +
16#include <complex>
│ │ │ │ +
17#include <iostream>
│ │ │ │ +
18#include <dune/common/exceptions.hh>
│ │ │ │ +
19#include <dune/common/fmatrix.hh>
│ │ │ │ +
20#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +
21#include <dune/common/ftraits.hh>
│ │ │ │ +
22
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24
│ │ │ │ +
28 template<class K, int n>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
30 {
│ │ │ │ +
31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix<K,n> > WrapperType;
│ │ │ │ +
32
│ │ │ │ +
33 public:
│ │ │ │ +
34 //===== type definitions and constants
│ │ │ │ +
35
│ │ │ │ +
37 typedef K field_type;
│ │ │ │ +
38
│ │ │ │ +
40 typedef K block_type;
│ │ │ │ +
41
│ │ │ │ +
43 typedef std::size_t size_type;
│ │ │ │ +
44
│ │ │ │ +
46 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]]
│ │ │ │ +
47 static constexpr std::size_t blocklevel = 1;
│ │ │ │ +
48
│ │ │ │ +
50 typedef DiagonalRowVector<K,n> row_type;
│ │ │ │ + │ │ │ │ +
52 typedef DiagonalRowVectorConst<K,n> const_row_type;
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
56 enum {
│ │ │ │ +
58 rows = n,
│ │ │ │ +
60 cols = n
│ │ │ │ +
61 };
│ │ │ │ +
62
│ │ │ │ +
63 //===== constructors
│ │ │ │ + │ │ │ │ +
67
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
71 : p_(k)
│ │ │ │ +
72 {}
│ │ │ │
│ │ │ │ -
74
│ │ │ │ +
73
│ │ │ │ +
74 //===== assignment from scalar
│ │ │ │
│ │ │ │ - │ │ │ │ + │ │ │ │
76 {
│ │ │ │ -
77 return interface;
│ │ │ │ -
78 }
│ │ │ │ +
77 p_ = k;
│ │ │ │ +
78 return *this;
│ │ │ │ +
79 }
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
81 // check if matrix is identical to other matrix (not only identical values)
│ │ │ │ +
│ │ │ │ +
82 bool identical(const ScaledIdentityMatrix<K,n>& other) const
│ │ │ │ +
83 {
│ │ │ │ +
84 return (this==&other);
│ │ │ │ +
85 }
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
87 //===== iterator interface to rows of the matrix
│ │ │ │ +
89 typedef ContainerWrapperIterator<const WrapperType, reference, reference> Iterator;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
95 typedef typename row_type::Iterator ColIterator;
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
99 {
│ │ │ │ +
100 return Iterator(WrapperType(this),0);
│ │ │ │ +
101 }
│ │ │ │ +
│ │ │ │ +
102
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
105 {
│ │ │ │ +
106 return Iterator(WrapperType(this),n);
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
112 {
│ │ │ │ +
113 return Iterator(WrapperType(this),n-1);
│ │ │ │ +
114 }
│ │ │ │
│ │ │ │ -
79 template<typename IS>
│ │ │ │ -
│ │ │ │ -
80 void checkInterface(const IS& source,
│ │ │ │ -
81 const IS& target, MPI_Comm comm)
│ │ │ │ -
82 {
│ │ │ │ -
83 auto ri = std::make_unique<RemoteIndices<IS> >(source, target, comm);
│ │ │ │ -
84 ri->template rebuild<true>();
│ │ │ │ -
85 Interface inf;
│ │ │ │ - │ │ │ │ -
87 int rank;
│ │ │ │ -
88 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ -
89 inf.free();
│ │ │ │ -
90 inf.build(*ri, flags, flags);
│ │ │ │ -
91
│ │ │ │ -
92
│ │ │ │ -
93#ifdef DEBUG_REPART
│ │ │ │ -
94 if(inf!=interface) {
│ │ │ │ -
95
│ │ │ │ -
96 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ -
97 if(rank==0)
│ │ │ │ -
98 std::cout<<"Interfaces do not match!"<<std::endl;
│ │ │ │ -
99 std::cout<<rank<<": redist interface new :"<<inf<<std::endl;
│ │ │ │ -
100 std::cout<<rank<<": redist interface :"<<interface<<std::endl;
│ │ │ │ -
101
│ │ │ │ -
102 throw "autsch!";
│ │ │ │ -
103 }
│ │ │ │ -
104#endif
│ │ │ │ -
105 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
106 void setSetup()
│ │ │ │ -
107 {
│ │ │ │ -
108 setup_=true;
│ │ │ │ -
109 interface.strip();
│ │ │ │ -
110 }
│ │ │ │ -
│ │ │ │ -
111
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
113 {
│ │ │ │ -
114 setup_=false;
│ │ │ │ -
115 }
│ │ │ │ -
│ │ │ │ -
116
│ │ │ │ -
117 template<class GatherScatter, class D>
│ │ │ │ +
115
│ │ │ │
│ │ │ │ -
118 void redistribute(const D& from, D& to) const
│ │ │ │ -
119 {
│ │ │ │ -
120 BufferedCommunicator communicator;
│ │ │ │ -
121 communicator.template build<D>(from,to, interface);
│ │ │ │ -
122 communicator.template forward<GatherScatter>(from, to);
│ │ │ │ -
123 communicator.free();
│ │ │ │ -
124 }
│ │ │ │ -
│ │ │ │ -
125 template<class GatherScatter, class D>
│ │ │ │ -
│ │ │ │ -
126 void redistributeBackward(D& from, const D& to) const
│ │ │ │ -
127 {
│ │ │ │ -
128
│ │ │ │ -
129 BufferedCommunicator communicator;
│ │ │ │ -
130 communicator.template build<D>(from,to, interface);
│ │ │ │ -
131 communicator.template backward<GatherScatter>(from, to);
│ │ │ │ -
132 communicator.free();
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
135 template<class D>
│ │ │ │ -
│ │ │ │ -
136 void redistribute(const D& from, D& to) const
│ │ │ │ -
137 {
│ │ │ │ -
138 redistribute<CopyGatherScatter<D> >(from,to);
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140 template<class D>
│ │ │ │ -
│ │ │ │ -
141 void redistributeBackward(D& from, const D& to) const
│ │ │ │ -
142 {
│ │ │ │ -
143 redistributeBackward<CopyGatherScatter<D> >(from,to);
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
145 bool isSetup() const
│ │ │ │ -
146 {
│ │ │ │ -
147 return setup_;
│ │ │ │ -
148 }
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
│ │ │ │ -
150 void reserve(std::size_t size)
│ │ │ │ -
151 {}
│ │ │ │ -
│ │ │ │ -
152
│ │ │ │ -
│ │ │ │ -
153 std::size_t& getRowSize(std::size_t index)
│ │ │ │ -
154 {
│ │ │ │ -
155 return rowSize[index];
│ │ │ │ -
156 }
│ │ │ │ -
│ │ │ │ -
157
│ │ │ │ -
│ │ │ │ -
158 std::size_t getRowSize(std::size_t index) const
│ │ │ │ -
159 {
│ │ │ │ -
160 return rowSize[index];
│ │ │ │ -
161 }
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
│ │ │ │ -
163 std::size_t& getCopyRowSize(std::size_t index)
│ │ │ │ -
164 {
│ │ │ │ -
165 return copyrowSize[index];
│ │ │ │ + │ │ │ │ +
119 {
│ │ │ │ +
120 return Iterator(WrapperType(this),-1);
│ │ │ │ +
121 }
│ │ │ │ +
│ │ │ │ +
122
│ │ │ │ +
123
│ │ │ │ +
125 typedef ContainerWrapperIterator<const WrapperType, const_reference, const_reference> ConstIterator;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
131 typedef typename const_row_type::ConstIterator ConstColIterator;
│ │ │ │ +
132
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
135 {
│ │ │ │ +
136 return ConstIterator(WrapperType(this),0);
│ │ │ │ +
137 }
│ │ │ │ +
│ │ │ │ +
138
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 {
│ │ │ │ +
142 return ConstIterator(WrapperType(this),n);
│ │ │ │ +
143 }
│ │ │ │ +
│ │ │ │ +
144
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
148 {
│ │ │ │ +
149 return ConstIterator(WrapperType(this),n-1);
│ │ │ │ +
150 }
│ │ │ │ +
│ │ │ │ +
151
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
155 {
│ │ │ │ +
156 return ConstIterator(WrapperType(this),-1);
│ │ │ │ +
157 }
│ │ │ │ +
│ │ │ │ +
158
│ │ │ │ +
159 //===== vector space arithmetic
│ │ │ │ +
160
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
163 {
│ │ │ │ +
164 p_ += y.p_;
│ │ │ │ +
165 return *this;
│ │ │ │
166 }
│ │ │ │
│ │ │ │
167
│ │ │ │ -
│ │ │ │ -
168 std::size_t getCopyRowSize(std::size_t index) const
│ │ │ │ -
169 {
│ │ │ │ -
170 return copyrowSize[index];
│ │ │ │ -
171 }
│ │ │ │ -
│ │ │ │ -
172
│ │ │ │ -
│ │ │ │ -
173 std::size_t& getBackwardsCopyRowSize(std::size_t index)
│ │ │ │ -
174 {
│ │ │ │ -
175 return backwardscopyrowSize[index];
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177
│ │ │ │ -
│ │ │ │ -
178 std::size_t getBackwardsCopyRowSize(std::size_t index) const
│ │ │ │ -
179 {
│ │ │ │ -
180 return backwardscopyrowSize[index];
│ │ │ │ -
181 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
170 {
│ │ │ │ +
171 p_ -= y.p_;
│ │ │ │ +
172 return *this;
│ │ │ │ +
173 }
│ │ │ │ +
│ │ │ │ +
174
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
177 {
│ │ │ │ +
178 p_ += k;
│ │ │ │ +
179 return *this;
│ │ │ │ +
180 }
│ │ │ │
│ │ │ │ -
182
│ │ │ │ +
181
│ │ │ │
│ │ │ │ -
183 void setNoRows(std::size_t rows)
│ │ │ │ + │ │ │ │
184 {
│ │ │ │ -
185 rowSize.resize(rows, 0);
│ │ │ │ -
186 }
│ │ │ │ -
│ │ │ │ -
187
│ │ │ │ -
│ │ │ │ -
188 void setNoCopyRows(std::size_t rows)
│ │ │ │ -
189 {
│ │ │ │ -
190 copyrowSize.resize(rows, 0);
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
│ │ │ │ -
193 void setNoBackwardsCopyRows(std::size_t rows)
│ │ │ │ -
194 {
│ │ │ │ -
195 backwardscopyrowSize.resize(rows, 0);
│ │ │ │ -
196 }
│ │ │ │ -
│ │ │ │ -
197
│ │ │ │ -
198 private:
│ │ │ │ -
199 std::vector<std::size_t> rowSize;
│ │ │ │ -
200 std::vector<std::size_t> copyrowSize;
│ │ │ │ -
201 std::vector<std::size_t> backwardscopyrowSize;
│ │ │ │ -
202 RedistributeInterface interface;
│ │ │ │ -
203 bool setup_;
│ │ │ │ -
204 };
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
214 template<class M, class RI>
│ │ │ │ +
185 p_ -= k;
│ │ │ │ +
186 return *this;
│ │ │ │ +
187 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
190 {
│ │ │ │ +
191 p_ *= k;
│ │ │ │ +
192 return *this;
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
197 {
│ │ │ │ +
198 p_ /= k;
│ │ │ │ +
199 return *this;
│ │ │ │ +
200 }
│ │ │ │ +
│ │ │ │ +
201
│ │ │ │ +
202 //===== binary operators
│ │ │ │ +
203
│ │ │ │ +
205 template <class Scalar,
│ │ │ │ +
206 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
207 friend auto operator* ( const ScaledIdentityMatrix& matrix, Scalar scalar)
│ │ │ │ +
208 {
│ │ │ │ + │ │ │ │ +
210 }
│ │ │ │ +
│ │ │ │ +
211
│ │ │ │ +
213 template <class Scalar,
│ │ │ │ +
214 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │
│ │ │ │ - │ │ │ │ -
216 {
│ │ │ │ -
217 // Make the default communication policy work.
│ │ │ │ -
218 typedef typename M::size_type value_type;
│ │ │ │ -
219 typedef typename M::size_type size_type;
│ │ │ │ -
220
│ │ │ │ -
│ │ │ │ -
226 CommMatrixRowSize(const M& m_, RI& rowsize_)
│ │ │ │ -
227 : matrix(m_), rowsize(rowsize_)
│ │ │ │ -
228 {}
│ │ │ │ -
│ │ │ │ -
229 const M& matrix;
│ │ │ │ - │ │ │ │ -
231
│ │ │ │ -
232 };
│ │ │ │ +
215 friend auto operator* (Scalar scalar, const ScaledIdentityMatrix& matrix)
│ │ │ │ +
216 {
│ │ │ │ + │ │ │ │ +
218 }
│ │ │ │ +
│ │ │ │ +
219
│ │ │ │ +
220 //===== comparison ops
│ │ │ │ +
221
│ │ │ │ +
│ │ │ │ +
223 bool operator==(const ScaledIdentityMatrix& other) const
│ │ │ │ +
224 {
│ │ │ │ +
225 return p_==other.scalar();
│ │ │ │ +
226 }
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
│ │ │ │ +
229 bool operator!=(const ScaledIdentityMatrix& other) const
│ │ │ │ +
230 {
│ │ │ │ +
231 return p_!=other.scalar();
│ │ │ │ +
232 }
│ │ │ │
│ │ │ │
233
│ │ │ │ -
234
│ │ │ │ -
243 template<class M, class I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
245 {
│ │ │ │ -
246 typedef typename M::size_type size_type;
│ │ │ │ +
234 //===== linear maps
│ │ │ │ +
235
│ │ │ │ +
237 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
238 void mv (const X& x, Y& y) const
│ │ │ │ +
239 {
│ │ │ │ +
240#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
241 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
242 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
243#endif
│ │ │ │ +
244 for (size_type i=0; i<n; ++i)
│ │ │ │ +
245 y[i] = p_ * x[i];
│ │ │ │ +
246 }
│ │ │ │ +
│ │ │ │
247
│ │ │ │ -
│ │ │ │ -
254 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
│ │ │ │ -
255 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
│ │ │ │ -
256 {}
│ │ │ │ -
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ -
265 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
│ │ │ │ -
266 const std::vector<typename M::size_type>& rowsize_)
│ │ │ │ -
267 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), sparsity(aggidxset_.size()), rowsize(&rowsize_)
│ │ │ │ -
268 {}
│ │ │ │ -
│ │ │ │ -
269
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
277 {
│ │ │ │ -
278 // insert diagonal to overlap rows
│ │ │ │ -
279 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator IIter;
│ │ │ │ - │ │ │ │ -
281 std::size_t nnz=0;
│ │ │ │ -
282#ifdef DEBUG_REPART
│ │ │ │ -
283 int rank;
│ │ │ │ -
284
│ │ │ │ -
285 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ +
249 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
250 void mtv (const X& x, Y& y) const
│ │ │ │ +
251 {
│ │ │ │ +
252 mv(x, y);
│ │ │ │ +
253 }
│ │ │ │ +
│ │ │ │ +
254
│ │ │ │ +
256 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
257 void umv (const X& x, Y& y) const
│ │ │ │ +
258 {
│ │ │ │ +
259#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
260 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
261 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
262#endif
│ │ │ │ +
263 for (size_type i=0; i<n; ++i)
│ │ │ │ +
264 y[i] += p_ * x[i];
│ │ │ │ +
265 }
│ │ │ │ +
│ │ │ │ +
266
│ │ │ │ +
268 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
269 void umtv (const X& x, Y& y) const
│ │ │ │ +
270 {
│ │ │ │ +
271#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
272 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
273 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
274#endif
│ │ │ │ +
275 for (size_type i=0; i<n; ++i)
│ │ │ │ +
276 y[i] += p_ * x[i];
│ │ │ │ +
277 }
│ │ │ │ +
│ │ │ │ +
278
│ │ │ │ +
280 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
281 void umhv (const X& x, Y& y) const
│ │ │ │ +
282 {
│ │ │ │ +
283#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
284 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
285 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │
286#endif
│ │ │ │ -
287 for(IIter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i) {
│ │ │ │ -
288 if(!OwnerSet::contains(i->local().attribute())) {
│ │ │ │ -
289#ifdef DEBUG_REPART
│ │ │ │ -
290 std::cout<<rank<<" Inserting diagonal for"<<i->local()<<std::endl;
│ │ │ │ -
291#endif
│ │ │ │ -
292 sparsity[i->local()].insert(i->local());
│ │ │ │ -
293 }
│ │ │ │ -
294
│ │ │ │ -
295 nnz+=sparsity[i->local()].size();
│ │ │ │ -
296 }
│ │ │ │ -
297 assert( aggidxset.size()==sparsity.size());
│ │ │ │ -
298
│ │ │ │ -
299 if(nnz>0) {
│ │ │ │ -
300 m.setSize(aggidxset.size(), aggidxset.size(), nnz);
│ │ │ │ -
301 m.setBuildMode(M::row_wise);
│ │ │ │ -
302 typename M::CreateIterator citer=m.createbegin();
│ │ │ │ -
303#ifdef DEBUG_REPART
│ │ │ │ -
304 std::size_t idx=0;
│ │ │ │ -
305 bool correct=true;
│ │ │ │ -
306 Dune::GlobalLookupIndexSet<I> global(aggidxset);
│ │ │ │ -
307#endif
│ │ │ │ -
308 typedef typename std::vector<std::set<size_type> >::const_iterator Iter;
│ │ │ │ -
309 for(Iter i=sparsity.begin(), end=sparsity.end(); i!=end; ++i, ++citer)
│ │ │ │ -
310 {
│ │ │ │ -
311 typedef typename std::set<size_type>::const_iterator SIter;
│ │ │ │ -
312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si)
│ │ │ │ -
313 citer.insert(*si);
│ │ │ │ -
314#ifdef DEBUG_REPART
│ │ │ │ -
315 if(i->find(idx)==i->end()) {
│ │ │ │ -
316 const typename I::IndexPair* gi=global.pair(idx);
│ │ │ │ -
317 assert(gi);
│ │ │ │ -
318 std::cout<<rank<<": row "<<idx<<" is missing a diagonal entry! global="<<gi->global()<<" attr="<<gi->local().attribute()<<" "<<
│ │ │ │ -
319 OwnerSet::contains(gi->local().attribute())<<
│ │ │ │ -
320 " row size="<<i->size()<<std::endl;
│ │ │ │ -
321 correct=false;
│ │ │ │ -
322 }
│ │ │ │ -
323 ++idx;
│ │ │ │ -
324#endif
│ │ │ │ -
325 }
│ │ │ │ -
326#ifdef DEBUG_REPART
│ │ │ │ -
327 if(!correct)
│ │ │ │ -
328 throw "bla";
│ │ │ │ -
329#endif
│ │ │ │ -
330 }
│ │ │ │ -
331 }
│ │ │ │ -
│ │ │ │ -
332
│ │ │ │ -
│ │ │ │ -
340 void completeSparsityPattern(std::vector<std::set<size_type> > add_sparsity)
│ │ │ │ -
341 {
│ │ │ │ -
342 for (unsigned int i = 0; i != sparsity.size(); ++i) {
│ │ │ │ -
343 if (add_sparsity[i].size() != 0) {
│ │ │ │ -
344 typedef std::set<size_type> Set;
│ │ │ │ -
345 Set tmp_set;
│ │ │ │ -
346 std::insert_iterator<Set> tmp_insert (tmp_set, tmp_set.begin());
│ │ │ │ -
347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(),
│ │ │ │ -
348 sparsity[i].begin(), sparsity[i].end(), tmp_insert);
│ │ │ │ -
349 sparsity[i].swap(tmp_set);
│ │ │ │ -
350 }
│ │ │ │ -
351 }
│ │ │ │ -
352 }
│ │ │ │ -
│ │ │ │ -
353
│ │ │ │ -
354 const M& matrix;
│ │ │ │ -
355 typedef Dune::GlobalLookupIndexSet<I> LookupIndexSet;
│ │ │ │ -
356 const Dune::GlobalLookupIndexSet<I>& idxset;
│ │ │ │ -
357 const I& aggidxset;
│ │ │ │ -
358 std::vector<std::set<size_type> > sparsity;
│ │ │ │ -
359 const std::vector<size_type>* rowsize;
│ │ │ │ -
360 };
│ │ │ │ -
│ │ │ │ -
361
│ │ │ │ -
362 template<class M, class I>
│ │ │ │ -
│ │ │ │ -
363 struct CommPolicy<CommMatrixSparsityPattern<M,I> >
│ │ │ │ -
364 {
│ │ │ │ - │ │ │ │ -
366
│ │ │ │ -
371 typedef typename I::GlobalIndex IndexedType;
│ │ │ │ -
372
│ │ │ │ -
374 typedef VariableSize IndexedTypeFlag;
│ │ │ │ -
375
│ │ │ │ -
│ │ │ │ -
376 static typename M::size_type getSize(const Type& t, std::size_t i)
│ │ │ │ -
377 {
│ │ │ │ -
378 if(!t.rowsize)
│ │ │ │ -
379 return t.matrix[i].size();
│ │ │ │ -
380 else
│ │ │ │ -
381 {
│ │ │ │ -
382 assert((*t.rowsize)[i]>0);
│ │ │ │ -
383 return (*t.rowsize)[i];
│ │ │ │ -
384 }
│ │ │ │ -
385 }
│ │ │ │ -
│ │ │ │ -
386 };
│ │ │ │ -
│ │ │ │ -
387
│ │ │ │ -
394 template<class M, class I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
396 {
│ │ │ │ -
│ │ │ │ -
405 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
│ │ │ │ -
406 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
│ │ │ │ -
407 {}
│ │ │ │ -
│ │ │ │ -
408
│ │ │ │ -
│ │ │ │ -
412 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
│ │ │ │ -
413 std::vector<size_t>& rowsize_)
│ │ │ │ -
414 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize(&rowsize_)
│ │ │ │ -
415 {}
│ │ │ │ +
287 for (size_type i=0; i<n; i++)
│ │ │ │ +
288 y[i] += conjugateComplex(p_)*x[i];
│ │ │ │ +
289 }
│ │ │ │ +
│ │ │ │ +
290
│ │ │ │ +
292 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
293 void mmv (const X& x, Y& y) const
│ │ │ │ +
294 {
│ │ │ │ +
295#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
296 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
297 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
298#endif
│ │ │ │ +
299 for (size_type i=0; i<n; ++i)
│ │ │ │ +
300 y[i] -= p_ * x[i];
│ │ │ │ +
301 }
│ │ │ │ +
│ │ │ │ +
302
│ │ │ │ +
304 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
305 void mmtv (const X& x, Y& y) const
│ │ │ │ +
306 {
│ │ │ │ +
307#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
308 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
309 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
310#endif
│ │ │ │ +
311 for (size_type i=0; i<n; ++i)
│ │ │ │ +
312 y[i] -= p_ * x[i];
│ │ │ │ +
313 }
│ │ │ │ +
│ │ │ │ +
314
│ │ │ │ +
316 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
317 void mmhv (const X& x, Y& y) const
│ │ │ │ +
318 {
│ │ │ │ +
319#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
320 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
321 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
322#endif
│ │ │ │ +
323 for (size_type i=0; i<n; i++)
│ │ │ │ +
324 y[i] -= conjugateComplex(p_)*x[i];
│ │ │ │ +
325 }
│ │ │ │ +
│ │ │ │ +
326
│ │ │ │ +
328 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
329 void usmv (const K& alpha, const X& x, Y& y) const
│ │ │ │ +
330 {
│ │ │ │ +
331#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
332 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
333 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
334#endif
│ │ │ │ +
335 for (size_type i=0; i<n; i++)
│ │ │ │ +
336 y[i] += alpha * p_ * x[i];
│ │ │ │ +
337 }
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
340 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
341 void usmtv (const K& alpha, const X& x, Y& y) const
│ │ │ │ +
342 {
│ │ │ │ +
343#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
344 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
345 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
346#endif
│ │ │ │ +
347 for (size_type i=0; i<n; i++)
│ │ │ │ +
348 y[i] += alpha * p_ * x[i];
│ │ │ │ +
349 }
│ │ │ │ +
│ │ │ │ +
350
│ │ │ │ +
352 template<class X, class Y>
│ │ │ │ +
│ │ │ │ +
353 void usmhv (const K& alpha, const X& x, Y& y) const
│ │ │ │ +
354 {
│ │ │ │ +
355#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
356 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
357 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
│ │ │ │ +
358#endif
│ │ │ │ +
359 for (size_type i=0; i<n; i++)
│ │ │ │ +
360 y[i] += alpha * conjugateComplex(p_) * x[i];
│ │ │ │ +
361 }
│ │ │ │ +
│ │ │ │ +
362
│ │ │ │ +
363 //===== norms
│ │ │ │ +
364
│ │ │ │ +
│ │ │ │ +
366 typename FieldTraits<field_type>::real_type frobenius_norm () const
│ │ │ │ +
367 {
│ │ │ │ +
368 return fvmeta::sqrt(n*p_*p_);
│ │ │ │ +
369 }
│ │ │ │ +
│ │ │ │ +
370
│ │ │ │ +
│ │ │ │ +
372 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
│ │ │ │ +
373 {
│ │ │ │ +
374 return n*p_*p_;
│ │ │ │ +
375 }
│ │ │ │ +
│ │ │ │ +
376
│ │ │ │ +
│ │ │ │ +
378 typename FieldTraits<field_type>::real_type infinity_norm () const
│ │ │ │ +
379 {
│ │ │ │ +
380 return std::abs(p_);
│ │ │ │ +
381 }
│ │ │ │ +
│ │ │ │ +
382
│ │ │ │ +
│ │ │ │ +
384 typename FieldTraits<field_type>::real_type infinity_norm_real () const
│ │ │ │ +
385 {
│ │ │ │ +
386 return fvmeta::absreal(p_);
│ │ │ │ +
387 }
│ │ │ │ +
│ │ │ │ +
388
│ │ │ │ +
389 //===== solve
│ │ │ │ +
390
│ │ │ │ +
393 template<class V>
│ │ │ │ +
│ │ │ │ +
394 void solve (V& x, const V& b) const
│ │ │ │ +
395 {
│ │ │ │ +
396 for (int i=0; i<n; i++)
│ │ │ │ +
397 x[i] = b[i]/p_;
│ │ │ │ +
398 }
│ │ │ │ +
│ │ │ │ +
399
│ │ │ │ +
│ │ │ │ +
402 void invert()
│ │ │ │ +
403 {
│ │ │ │ +
404 p_ = 1/p_;
│ │ │ │ +
405 }
│ │ │ │ +
│ │ │ │ +
406
│ │ │ │ +
│ │ │ │ +
408 K determinant () const {
│ │ │ │ +
409 return std::pow(p_,n);
│ │ │ │ +
410 }
│ │ │ │ +
│ │ │ │ +
411
│ │ │ │ +
412 //===== sizes
│ │ │ │ +
413
│ │ │ │ +
│ │ │ │ +
415 size_type N () const
│ │ │ │ +
416 {
│ │ │ │ +
417 return n;
│ │ │ │ +
418 }
│ │ │ │
│ │ │ │ +
419
│ │ │ │
│ │ │ │ - │ │ │ │ -
422 {
│ │ │ │ -
423 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator Iter;
│ │ │ │ - │ │ │ │ +
421 size_type M () const
│ │ │ │ +
422 {
│ │ │ │ +
423 return n;
│ │ │ │ +
424 }
│ │ │ │ +
│ │ │ │
425
│ │ │ │ -
426 for(Iter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i)
│ │ │ │ -
427 if(!OwnerSet::contains(i->local().attribute())) {
│ │ │ │ -
428 // Set to Dirchlet
│ │ │ │ -
429 typedef typename M::ColIterator CIter;
│ │ │ │ -
430 for(CIter c=matrix[i->local()].begin(), cend= matrix[i->local()].end();
│ │ │ │ -
431 c!= cend; ++c)
│ │ │ │ -
432 {
│ │ │ │ -
433 *c=0;
│ │ │ │ -
434 if(c.index()==i->local()) {
│ │ │ │ -
435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) {
│ │ │ │ -
436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix);
│ │ │ │ -
437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt)
│ │ │ │ -
438 (*rowIt)[rowIt.index()] = value;
│ │ │ │ -
439 };
│ │ │ │ -
440 setDiagonal(*c, 1);
│ │ │ │ -
441 }
│ │ │ │ -
442 }
│ │ │ │ -
443 }
│ │ │ │ -
444 }
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
448 const Dune::GlobalLookupIndexSet<I>& idxset;
│ │ │ │ -
450 const I& aggidxset;
│ │ │ │ -
452 std::vector<size_t>* rowsize; // row sizes differ from sender side in overlap!
│ │ │ │ -
453 };
│ │ │ │ -
│ │ │ │ -
454
│ │ │ │ -
455 template<class M, class I>
│ │ │ │ -
│ │ │ │ -
456 struct CommPolicy<CommMatrixRow<M,I> >
│ │ │ │ -
457 {
│ │ │ │ - │ │ │ │ -
459
│ │ │ │ -
464 typedef std::pair<typename I::GlobalIndex,typename M::block_type> IndexedType;
│ │ │ │ -
465
│ │ │ │ -
467 typedef VariableSize IndexedTypeFlag;
│ │ │ │ +
426 //===== query
│ │ │ │ +
427
│ │ │ │ +
│ │ │ │ +
429 bool exists (size_type i, size_type j) const
│ │ │ │ +
430 {
│ │ │ │ +
431#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ │ +
432 if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range");
│ │ │ │ +
433 if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range");
│ │ │ │ +
434#endif
│ │ │ │ +
435 return i==j;
│ │ │ │ +
436 }
│ │ │ │ +
│ │ │ │ +
437
│ │ │ │ +
438 //===== conversion operator
│ │ │ │ +
439
│ │ │ │ +
│ │ │ │ +
441 friend std::ostream& operator<< (std::ostream& s, const ScaledIdentityMatrix<K,n>& a)
│ │ │ │ +
442 {
│ │ │ │ +
443 for (size_type i=0; i<n; i++) {
│ │ │ │ +
444 for (size_type j=0; j<n; j++)
│ │ │ │ +
445 s << ((i==j) ? a.p_ : 0) << " ";
│ │ │ │ +
446 s << std::endl;
│ │ │ │ +
447 }
│ │ │ │ +
448 return s;
│ │ │ │ +
449 }
│ │ │ │ +
│ │ │ │ +
450
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
453 {
│ │ │ │ +
454 return reference(const_cast<K*>(&p_), i);
│ │ │ │ +
455 }
│ │ │ │ +
│ │ │ │ +
456
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
459 {
│ │ │ │ +
460 return const_reference(const_cast<K*>(&p_), i);
│ │ │ │ +
461 }
│ │ │ │ +
│ │ │ │ +
462
│ │ │ │ +
│ │ │ │ +
464 const K& diagonal(size_type /*i*/) const
│ │ │ │ +
465 {
│ │ │ │ +
466 return p_;
│ │ │ │ +
467 }
│ │ │ │ +
│ │ │ │
468
│ │ │ │ -
│ │ │ │ -
469 static std::size_t getSize(const Type& t, std::size_t i)
│ │ │ │ -
470 {
│ │ │ │ -
471 if(!t.rowsize)
│ │ │ │ -
472 return t.matrix[i].size();
│ │ │ │ -
473 else
│ │ │ │ -
474 {
│ │ │ │ -
475 assert((*t.rowsize)[i]>0);
│ │ │ │ -
476 return (*t.rowsize)[i];
│ │ │ │ -
477 }
│ │ │ │ -
478 }
│ │ │ │ -
│ │ │ │ -
479 };
│ │ │ │ -
│ │ │ │ -
480
│ │ │ │ -
481 template<class M, class I, class RI>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
483 {
│ │ │ │ - │ │ │ │ -
485
│ │ │ │ -
│ │ │ │ -
486 static const typename M::size_type gather(const Container& cont, std::size_t i)
│ │ │ │ -
487 {
│ │ │ │ -
488 return cont.matrix[i].size();
│ │ │ │ -
489 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
490 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
│ │ │ │ -
491 {
│ │ │ │ -
492 assert(rowsize);
│ │ │ │ -
493 cont.rowsize.getRowSize(i)=rowsize;
│ │ │ │ -
494 }
│ │ │ │ -
│ │ │ │ -
495
│ │ │ │ -
496 };
│ │ │ │ -
│ │ │ │ -
497
│ │ │ │ -
498 template<class M, class I, class RI>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
500 {
│ │ │ │ - │ │ │ │ -
502
│ │ │ │ -
│ │ │ │ -
503 static const typename M::size_type gather(const Container& cont, std::size_t i)
│ │ │ │ -
504 {
│ │ │ │ -
505 return cont.matrix[i].size();
│ │ │ │ -
506 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
507 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
│ │ │ │ -
508 {
│ │ │ │ -
509 assert(rowsize);
│ │ │ │ -
510 if (rowsize > cont.rowsize.getCopyRowSize(i))
│ │ │ │ -
511 cont.rowsize.getCopyRowSize(i)=rowsize;
│ │ │ │ -
512 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
471 {
│ │ │ │ +
472 return p_;
│ │ │ │ +
473 }
│ │ │ │ +
│ │ │ │ +
474
│ │ │ │ +
│ │ │ │ +
477 const K& scalar() const
│ │ │ │ +
478 {
│ │ │ │ +
479 return p_;
│ │ │ │ +
480 }
│ │ │ │ +
│ │ │ │ +
481
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
485 {
│ │ │ │ +
486 return p_;
│ │ │ │ +
487 }
│ │ │ │ +
│ │ │ │ +
488
│ │ │ │ +
489 private:
│ │ │ │ +
490 // the data, very simply a single number
│ │ │ │ +
491 K p_;
│ │ │ │ +
492
│ │ │ │ +
493 };
│ │ │ │ +
│ │ │ │ +
494
│ │ │ │ +
495 template <class DenseMatrix, class field, int N>
│ │ │ │ +
│ │ │ │ +
496 struct DenseMatrixAssigner<DenseMatrix, ScaledIdentityMatrix<field, N>> {
│ │ │ │ +
│ │ │ │ +
497 static void apply(DenseMatrix& denseMatrix,
│ │ │ │ + │ │ │ │ +
499 assert(denseMatrix.M() == N);
│ │ │ │ +
500 assert(denseMatrix.N() == N);
│ │ │ │ +
501 denseMatrix = field(0);
│ │ │ │ +
502 for (int i = 0; i < N; ++i)
│ │ │ │ +
503 denseMatrix[i][i] = rhs.scalar();
│ │ │ │ +
504 }
│ │ │ │ +
│ │ │ │ +
505 };
│ │ │ │ +
│ │ │ │ +
506
│ │ │ │ +
507 template<class K, int n>
│ │ │ │ +
│ │ │ │ +
508 struct FieldTraits< ScaledIdentityMatrix<K, n> >
│ │ │ │ +
509 {
│ │ │ │ + │ │ │ │ +
511 using real_type = typename FieldTraits<field_type>::real_type;
│ │ │ │ +
512 };
│ │ │ │
│ │ │ │
513
│ │ │ │ -
514 };
│ │ │ │ -
│ │ │ │ +
514} // end namespace
│ │ │ │
515
│ │ │ │ -
516 template<class M, class I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
518 {
│ │ │ │ -
519 typedef typename I::GlobalIndex GlobalIndex;
│ │ │ │ - │ │ │ │ -
521 typedef typename M::ConstColIterator ColIter;
│ │ │ │ -
522
│ │ │ │ -
523 static ColIter col;
│ │ │ │ - │ │ │ │ -
525
│ │ │ │ -
│ │ │ │ -
526 static const GlobalIndex& gather(const Container& cont, std::size_t i, std::size_t j)
│ │ │ │ -
527 {
│ │ │ │ -
528 if(j==0)
│ │ │ │ -
529 col=cont.matrix[i].begin();
│ │ │ │ -
530 else if (col!=cont.matrix[i].end())
│ │ │ │ -
531 ++col;
│ │ │ │ -
532
│ │ │ │ -
533 //copy communication: different row sizes for copy rows with the same global index
│ │ │ │ -
534 //are possible. If all values of current matrix row are sent, send
│ │ │ │ -
535 //std::numeric_limits<GlobalIndex>::max()
│ │ │ │ -
536 //and receiver will ignore it.
│ │ │ │ -
537 if (col==cont.matrix[i].end()) {
│ │ │ │ -
538 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ -
539 return numlimits;
│ │ │ │ -
540 }
│ │ │ │ -
541 else {
│ │ │ │ -
542 const typename I::IndexPair* index=cont.idxset.pair(col.index());
│ │ │ │ -
543 assert(index);
│ │ │ │ -
544 // Only send index if col is no ghost
│ │ │ │ -
545 if ( index->local().attribute() != 2)
│ │ │ │ -
546 return index->global();
│ │ │ │ -
547 else {
│ │ │ │ -
548 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ -
549 return numlimits;
│ │ │ │ -
550 }
│ │ │ │ -
551 }
│ │ │ │ -
552 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
553 static void scatter(Container& cont, const GlobalIndex& gi, std::size_t i, [[maybe_unused]] std::size_t j)
│ │ │ │ -
554 {
│ │ │ │ -
555 try{
│ │ │ │ -
556 if (gi != std::numeric_limits<GlobalIndex>::max()) {
│ │ │ │ -
557 const typename I::IndexPair& ip=cont.aggidxset.at(gi);
│ │ │ │ -
558 assert(ip.global()==gi);
│ │ │ │ -
559 std::size_t column = ip.local();
│ │ │ │ -
560 cont.sparsity[i].insert(column);
│ │ │ │ -
561
│ │ │ │ - │ │ │ │ -
563 if(!OwnerSet::contains(ip.local().attribute()))
│ │ │ │ -
564 // preserve symmetry for overlap
│ │ │ │ -
565 cont.sparsity[column].insert(i);
│ │ │ │ -
566 }
│ │ │ │ -
567 }
│ │ │ │ -
568 catch(const Dune::RangeError&) {
│ │ │ │ -
569 // Entry not present in the new index set. Ignore!
│ │ │ │ -
570#ifdef DEBUG_REPART
│ │ │ │ -
571 typedef typename Container::LookupIndexSet GlobalLookup;
│ │ │ │ -
572 typedef typename GlobalLookup::IndexPair IndexPair;
│ │ │ │ - │ │ │ │ -
574
│ │ │ │ -
575 GlobalLookup lookup(cont.aggidxset);
│ │ │ │ -
576 const IndexPair* pi=lookup.pair(i);
│ │ │ │ -
577 assert(pi);
│ │ │ │ -
578 if(OwnerSet::contains(pi->local().attribute())) {
│ │ │ │ -
579 int rank;
│ │ │ │ -
580 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
│ │ │ │ -
581 std::cout<<rank<<cont.aggidxset<<std::endl;
│ │ │ │ -
582 std::cout<<rank<<": row "<<i<<" (global="<<gi <<") not in index set for owner index "<<pi->global()<<std::endl;
│ │ │ │ -
583 throw;
│ │ │ │ -
584 }
│ │ │ │ -
585#endif
│ │ │ │ -
586 }
│ │ │ │ -
587 }
│ │ │ │ -
│ │ │ │ -
588
│ │ │ │ -
589 };
│ │ │ │ -
│ │ │ │ -
590 template<class M, class I>
│ │ │ │ - │ │ │ │ -
592
│ │ │ │ -
593 template<class M, class I>
│ │ │ │ - │ │ │ │ -
595
│ │ │ │ -
596
│ │ │ │ -
597 template<class M, class I>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
599 {
│ │ │ │ -
600 typedef typename I::GlobalIndex GlobalIndex;
│ │ │ │ - │ │ │ │ -
602 typedef typename M::ConstColIterator ColIter;
│ │ │ │ -
603 typedef typename std::pair<GlobalIndex,typename M::block_type> Data;
│ │ │ │ -
604 static ColIter col;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
607
│ │ │ │ -
│ │ │ │ -
608 static const Data& gather(const Container& cont, std::size_t i, std::size_t j)
│ │ │ │ -
609 {
│ │ │ │ -
610 if(j==0)
│ │ │ │ -
611 col=cont.matrix[i].begin();
│ │ │ │ -
612 else if (col!=cont.matrix[i].end())
│ │ │ │ -
613 ++col;
│ │ │ │ -
614 // copy communication: different row sizes for copy rows with the same global index
│ │ │ │ -
615 // are possible. If all values of current matrix row are sent, send
│ │ │ │ -
616 // std::numeric_limits<GlobalIndex>::max()
│ │ │ │ -
617 // and receiver will ignore it.
│ │ │ │ -
618 if (col==cont.matrix[i].end()) {
│ │ │ │ -
619 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ - │ │ │ │ -
621 return datastore;
│ │ │ │ -
622 }
│ │ │ │ -
623 else {
│ │ │ │ -
624 // convert local column index to global index
│ │ │ │ -
625 const typename I::IndexPair* index=cont.idxset.pair(col.index());
│ │ │ │ -
626 assert(index);
│ │ │ │ -
627 // Store the data to prevent reference to temporary
│ │ │ │ -
628 // Only send index if col is no ghost
│ │ │ │ -
629 if ( index->local().attribute() != 2)
│ │ │ │ -
630 datastore = Data(index->global(),*col);
│ │ │ │ -
631 else {
│ │ │ │ -
632 numlimits = std::numeric_limits<GlobalIndex>::max();
│ │ │ │ - │ │ │ │ -
634 }
│ │ │ │ -
635 return datastore;
│ │ │ │ -
636 }
│ │ │ │ -
637 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
638 static void scatter(Container& cont, const Data& data, std::size_t i, [[maybe_unused]] std::size_t j)
│ │ │ │ -
639 {
│ │ │ │ -
640 try{
│ │ │ │ -
641 if (data.first != std::numeric_limits<GlobalIndex>::max()) {
│ │ │ │ -
642 typename M::size_type column=cont.aggidxset.at(data.first).local();
│ │ │ │ -
643 cont.matrix[i][column]=data.second;
│ │ │ │ -
644 }
│ │ │ │ -
645 }
│ │ │ │ -
646 catch(const Dune::RangeError&) {
│ │ │ │ -
647 // This an overlap row and might therefore lack some entries!
│ │ │ │ -
648 }
│ │ │ │ -
649
│ │ │ │ -
650 }
│ │ │ │ -
│ │ │ │ -
651 };
│ │ │ │ -
│ │ │ │ -
652
│ │ │ │ -
653 template<class M, class I>
│ │ │ │ - │ │ │ │ -
655
│ │ │ │ -
656 template<class M, class I>
│ │ │ │ - │ │ │ │ -
658
│ │ │ │ -
659 template<class M, class I>
│ │ │ │ - │ │ │ │ -
661
│ │ │ │ -
662 template<typename M, typename C>
│ │ │ │ -
│ │ │ │ -
663 void redistributeSparsityPattern(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
│ │ │ │ - │ │ │ │ -
665 {
│ │ │ │ -
666 typename C::CopySet copyflags;
│ │ │ │ -
667 typename C::OwnerSet ownerflags;
│ │ │ │ -
668 typedef typename C::ParallelIndexSet IndexSet;
│ │ │ │ - │ │ │ │ -
670 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
│ │ │ │ -
671 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
│ │ │ │ -
672 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
│ │ │ │ -
673
│ │ │ │ -
674 // get owner rowsizes
│ │ │ │ -
675 CommMatrixRowSize<M,RI> commRowSize(origMatrix, ri);
│ │ │ │ -
676 ri.template redistribute<MatrixRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize,commRowSize);
│ │ │ │ -
677
│ │ │ │ -
678 origComm.buildGlobalLookup();
│ │ │ │ -
679
│ │ │ │ -
680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
│ │ │ │ -
681 rowsize[i] = ri.getRowSize(i);
│ │ │ │ -
682 }
│ │ │ │ -
683 // get sparsity pattern from owner rows
│ │ │ │ - │ │ │ │ -
685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet());
│ │ │ │ - │ │ │ │ -
687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize);
│ │ │ │ -
688
│ │ │ │ -
689 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp,newsp);
│ │ │ │ -
690
│ │ │ │ -
691 // build copy to owner interface to get missing matrix values for novlp case
│ │ │ │ - │ │ │ │ -
693 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
│ │ │ │ -
694 newComm.indexSet(),
│ │ │ │ -
695 origComm.communicator());
│ │ │ │ -
696 ris->template rebuild<true>();
│ │ │ │ -
697
│ │ │ │ -
698 ri.getInterface().free();
│ │ │ │ -
699 ri.getInterface().build(*ris,copyflags,ownerflags);
│ │ │ │ -
700
│ │ │ │ -
701 // get copy rowsizes
│ │ │ │ -
702 CommMatrixRowSize<M,RI> commRowSize_copy(origMatrix, ri);
│ │ │ │ -
703 ri.template redistribute<MatrixCopyRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize_copy,
│ │ │ │ -
704 commRowSize_copy);
│ │ │ │ -
705
│ │ │ │ -
706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
│ │ │ │ -
707 copyrowsize[i] = ri.getCopyRowSize(i);
│ │ │ │ -
708 }
│ │ │ │ -
709 //get copy rowsizes for sender
│ │ │ │ -
710 ri.redistributeBackward(backwardscopyrowsize,copyrowsize);
│ │ │ │ -
711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) {
│ │ │ │ -
712 ri.getBackwardsCopyRowSize(i) = backwardscopyrowsize[i];
│ │ │ │ -
713 }
│ │ │ │ -
714
│ │ │ │ -
715 // get sparsity pattern from copy rows
│ │ │ │ -
716 CommMatrixSparsityPattern<M,IndexSet> origsp_copy(origMatrix,
│ │ │ │ -
717 origComm.globalLookup(),
│ │ │ │ -
718 newComm.indexSet(),
│ │ │ │ -
719 backwardscopyrowsize);
│ │ │ │ -
720 CommMatrixSparsityPattern<M,IndexSet> newsp_copy(origMatrix, origComm.globalLookup(),
│ │ │ │ -
721 newComm.indexSet(), copyrowsize);
│ │ │ │ -
722 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp_copy,
│ │ │ │ -
723 newsp_copy);
│ │ │ │ -
724
│ │ │ │ -
725 newsp.completeSparsityPattern(newsp_copy.sparsity);
│ │ │ │ -
726 newsp.storeSparsityPattern(newMatrix);
│ │ │ │ -
727 }
│ │ │ │ -
728 else
│ │ │ │ -
729 newsp.storeSparsityPattern(newMatrix);
│ │ │ │ -
730
│ │ │ │ -
731#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
732 // Check for symmetry
│ │ │ │ -
733 int ret=0;
│ │ │ │ -
734 typedef typename M::ConstRowIterator RIter;
│ │ │ │ -
735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row) {
│ │ │ │ -
736 typedef typename M::ConstColIterator CIter;
│ │ │ │ -
737 for(CIter col=row->begin(), cend=row->end(); col!=cend; ++col)
│ │ │ │ -
738 {
│ │ │ │ -
739 try{
│ │ │ │ -
740 newMatrix[col.index()][row.index()];
│ │ │ │ -
741 }catch(const Dune::ISTLError&) {
│ │ │ │ -
742 std::cerr<<newComm.communicator().rank()<<": entry ("
│ │ │ │ -
743 <<col.index()<<","<<row.index()<<") missing! for symmetry!"<<std::endl;
│ │ │ │ -
744 ret=1;
│ │ │ │ -
745
│ │ │ │ -
746 }
│ │ │ │ -
747
│ │ │ │ -
748 }
│ │ │ │ -
749 }
│ │ │ │ -
750
│ │ │ │ -
751 if(ret)
│ │ │ │ -
752 DUNE_THROW(ISTLError, "Matrix not symmetric!");
│ │ │ │ -
753#endif
│ │ │ │ -
754 }
│ │ │ │ -
│ │ │ │ -
755
│ │ │ │ -
756 template<typename M, typename C>
│ │ │ │ -
│ │ │ │ -
757 void redistributeMatrixEntries(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
│ │ │ │ - │ │ │ │ -
759 {
│ │ │ │ -
760 typedef typename C::ParallelIndexSet IndexSet;
│ │ │ │ -
761 typename C::OwnerSet ownerflags;
│ │ │ │ -
762 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
│ │ │ │ -
763 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
│ │ │ │ -
764 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
│ │ │ │ -
765
│ │ │ │ -
766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
│ │ │ │ -
767 rowsize[i] = ri.getRowSize(i);
│ │ │ │ - │ │ │ │ -
769 copyrowsize[i] = ri.getCopyRowSize(i);
│ │ │ │ -
770 }
│ │ │ │ -
771 }
│ │ │ │ -
772
│ │ │ │ -
773 for (std::size_t i=0; i < origComm.indexSet().size(); i++)
│ │ │ │ - │ │ │ │ -
775 backwardscopyrowsize[i] = ri.getBackwardsCopyRowSize(i);
│ │ │ │ -
776
│ │ │ │ -
777
│ │ │ │ - │ │ │ │ -
779 // fill sparsity pattern from copy rows
│ │ │ │ -
780 CommMatrixRow<M,IndexSet> origrow_copy(origMatrix, origComm.globalLookup(),
│ │ │ │ -
781 newComm.indexSet(), backwardscopyrowsize);
│ │ │ │ -
782 CommMatrixRow<M,IndexSet> newrow_copy(newMatrix, origComm.globalLookup(),
│ │ │ │ -
783 newComm.indexSet(),copyrowsize);
│ │ │ │ -
784 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow_copy,
│ │ │ │ -
785 newrow_copy);
│ │ │ │ -
786 ri.getInterface().free();
│ │ │ │ -
787 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
│ │ │ │ -
788 newComm.indexSet(),
│ │ │ │ -
789 origComm.communicator());
│ │ │ │ -
790 ris->template rebuild<true>();
│ │ │ │ -
791 ri.getInterface().build(*ris,ownerflags,ownerflags);
│ │ │ │ -
792 }
│ │ │ │ -
793
│ │ │ │ - │ │ │ │ -
795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet());
│ │ │ │ - │ │ │ │ -
797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize);
│ │ │ │ -
798 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow,newrow);
│ │ │ │ -
799 if (SolverCategory::category(origComm) != static_cast<int>(SolverCategory::nonoverlapping))
│ │ │ │ - │ │ │ │ -
801 }
│ │ │ │ -
│ │ │ │ -
802
│ │ │ │ -
819 template<typename M, typename C>
│ │ │ │ -
│ │ │ │ -
820 void redistributeMatrix(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
│ │ │ │ - │ │ │ │ -
822 {
│ │ │ │ -
823 ri.setNoRows(newComm.indexSet().size());
│ │ │ │ -
824 ri.setNoCopyRows(newComm.indexSet().size());
│ │ │ │ -
825 ri.setNoBackwardsCopyRows(origComm.indexSet().size());
│ │ │ │ -
826 redistributeSparsityPattern(origMatrix, newMatrix, origComm, newComm, ri);
│ │ │ │ -
827 redistributeMatrixEntries(origMatrix, newMatrix, origComm, newComm, ri);
│ │ │ │ -
828 }
│ │ │ │ -
│ │ │ │ -
829#endif
│ │ │ │ -
830
│ │ │ │ -
831template<typename M>
│ │ │ │ -
│ │ │ │ -
832 void redistributeMatrixEntries(M& origMatrix, M& newMatrix,
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
836 {
│ │ │ │ -
837 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
│ │ │ │ -
838 }
│ │ │ │ -
│ │ │ │ -
839 template<typename M>
│ │ │ │ -
│ │ │ │ -
840 void redistributeMatrix(M& origMatrix, M& newMatrix,
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
844 {
│ │ │ │ -
845 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
│ │ │ │ -
846 }
│ │ │ │ -
│ │ │ │ -
847}
│ │ │ │ -
848#endif
│ │ │ │ - │ │ │ │ -
Functionality for redistributing a parallel index set using graph partitioning.
│ │ │ │ -
Classes providing communication interfaces for overlapping Schwarz methods.
│ │ │ │ -
Col col
Definition matrixmatrix.hh:351
│ │ │ │ +
516#endif
│ │ │ │
Definition allocator.hh:11
│ │ │ │ -
void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition matrixredistribute.hh:757
│ │ │ │ -
void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition matrixredistribute.hh:663
│ │ │ │ -
void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Redistribute a matrix according to given domain decompositions.
Definition matrixredistribute.hh:820
│ │ │ │ -
derive error class from the base class in common
Definition istlexception.hh:19
│ │ │ │ -
Definition matrixredistribute.hh:22
│ │ │ │ -
void setNoBackwardsCopyRows(std::size_t size)
Definition matrixredistribute.hh:44
│ │ │ │ -
void redistribute(const D &from, D &to) const
Definition matrixredistribute.hh:28
│ │ │ │ -
void resetSetup()
Definition matrixredistribute.hh:35
│ │ │ │ -
void setNoCopyRows(std::size_t size)
Definition matrixredistribute.hh:41
│ │ │ │ -
bool isSetup() const
Definition matrixredistribute.hh:23
│ │ │ │ -
void setNoRows(std::size_t size)
Definition matrixredistribute.hh:38
│ │ │ │ -
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:32
│ │ │ │ -
std::size_t getBackwardsCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:57
│ │ │ │ -
std::size_t getRowSize(std::size_t index) const
Definition matrixredistribute.hh:47
│ │ │ │ -
std::size_t getCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:52
│ │ │ │ -
std::size_t getRowSize(std::size_t index) const
Definition matrixredistribute.hh:158
│ │ │ │ -
std::size_t & getBackwardsCopyRowSize(std::size_t index)
Definition matrixredistribute.hh:173
│ │ │ │ -
RedistributeInterface & getInterface()
Definition matrixredistribute.hh:75
│ │ │ │ -
void redistribute(const D &from, D &to) const
Definition matrixredistribute.hh:136
│ │ │ │ -
void setNoBackwardsCopyRows(std::size_t rows)
Definition matrixredistribute.hh:193
│ │ │ │ -
std::size_t & getCopyRowSize(std::size_t index)
Definition matrixredistribute.hh:163
│ │ │ │ - │ │ │ │ -
std::size_t getCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:168
│ │ │ │ -
void setNoRows(std::size_t rows)
Definition matrixredistribute.hh:183
│ │ │ │ -
void reserve(std::size_t size)
Definition matrixredistribute.hh:150
│ │ │ │ -
OwnerOverlapCopyCommunication< T, T1 > Comm
Definition matrixredistribute.hh:69
│ │ │ │ -
void setNoCopyRows(std::size_t rows)
Definition matrixredistribute.hh:188
│ │ │ │ -
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:141
│ │ │ │ - │ │ │ │ -
std::size_t getBackwardsCopyRowSize(std::size_t index) const
Definition matrixredistribute.hh:178
│ │ │ │ -
void redistribute(const D &from, D &to) const
Definition matrixredistribute.hh:118
│ │ │ │ - │ │ │ │ -
void redistributeBackward(D &from, const D &to) const
Definition matrixredistribute.hh:126
│ │ │ │ -
void checkInterface(const IS &source, const IS &target, MPI_Comm comm)
Definition matrixredistribute.hh:80
│ │ │ │ -
bool isSetup() const
Definition matrixredistribute.hh:145
│ │ │ │ -
std::size_t & getRowSize(std::size_t index)
Definition matrixredistribute.hh:153
│ │ │ │ -
Utility class to communicate and set the row sizes of a redistributed matrix.
Definition matrixredistribute.hh:216
│ │ │ │ -
M::size_type size_type
Definition matrixredistribute.hh:219
│ │ │ │ -
M::size_type value_type
Definition matrixredistribute.hh:218
│ │ │ │ -
RI & rowsize
Definition matrixredistribute.hh:230
│ │ │ │ -
const M & matrix
Definition matrixredistribute.hh:229
│ │ │ │ -
CommMatrixRowSize(const M &m_, RI &rowsize_)
Constructor.
Definition matrixredistribute.hh:226
│ │ │ │ -
Utility class to communicate and build the sparsity pattern of a redistributed matrix.
Definition matrixredistribute.hh:245
│ │ │ │ -
M::size_type size_type
Definition matrixredistribute.hh:246
│ │ │ │ -
const Dune::GlobalLookupIndexSet< I > & idxset
Definition matrixredistribute.hh:356
│ │ │ │ -
void storeSparsityPattern(M &m)
Creates and stores the sparsity pattern of the redistributed matrix.
Definition matrixredistribute.hh:276
│ │ │ │ -
const I & aggidxset
Definition matrixredistribute.hh:357
│ │ │ │ -
const std::vector< size_type > * rowsize
Definition matrixredistribute.hh:359
│ │ │ │ -
void completeSparsityPattern(std::vector< std::set< size_type > > add_sparsity)
Completes the sparsity pattern of the redistributed matrix with data from copy rows for the novlp cas...
Definition matrixredistribute.hh:340
│ │ │ │ -
CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
Constructor for the original side.
Definition matrixredistribute.hh:254
│ │ │ │ -
const M & matrix
Definition matrixredistribute.hh:354
│ │ │ │ -
CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, const std::vector< typename M::size_type > &rowsize_)
Constructor for the redistruted side.
Definition matrixredistribute.hh:265
│ │ │ │ -
std::vector< std::set< size_type > > sparsity
Definition matrixredistribute.hh:358
│ │ │ │ -
Dune::GlobalLookupIndexSet< I > LookupIndexSet
Definition matrixredistribute.hh:355
│ │ │ │ -
static M::size_type getSize(const Type &t, std::size_t i)
Definition matrixredistribute.hh:376
│ │ │ │ -
CommMatrixSparsityPattern< M, I > Type
Definition matrixredistribute.hh:365
│ │ │ │ -
I::GlobalIndex IndexedType
The indexed type we send. This is the global index indentitfying the column.
Definition matrixredistribute.hh:371
│ │ │ │ -
VariableSize IndexedTypeFlag
Each row varies in size.
Definition matrixredistribute.hh:374
│ │ │ │ -
Utility class for comunicating the matrix entries.
Definition matrixredistribute.hh:396
│ │ │ │ -
std::vector< size_t > * rowsize
row size information for the receiving side.
Definition matrixredistribute.hh:452
│ │ │ │ -
M & matrix
The matrix to communicate the values of.
Definition matrixredistribute.hh:446
│ │ │ │ -
CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, std::vector< size_t > &rowsize_)
Constructor.
Definition matrixredistribute.hh:412
│ │ │ │ -
const Dune::GlobalLookupIndexSet< I > & idxset
Index set for the original matrix.
Definition matrixredistribute.hh:448
│ │ │ │ -
void setOverlapRowsToDirichlet()
Sets the non-owner rows correctly as Dirichlet boundaries.
Definition matrixredistribute.hh:421
│ │ │ │ -
const I & aggidxset
Index set for the redistributed matrix.
Definition matrixredistribute.hh:450
│ │ │ │ -
CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
Constructor.
Definition matrixredistribute.hh:405
│ │ │ │ -
std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType
The indexed type we send. This is the pair of global index indentitfying the column and the value its...
Definition matrixredistribute.hh:464
│ │ │ │ -
CommMatrixRow< M, I > Type
Definition matrixredistribute.hh:458
│ │ │ │ -
static std::size_t getSize(const Type &t, std::size_t i)
Definition matrixredistribute.hh:469
│ │ │ │ -
VariableSize IndexedTypeFlag
Each row varies in size.
Definition matrixredistribute.hh:467
│ │ │ │ -
Definition matrixredistribute.hh:483
│ │ │ │ -
static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
Definition matrixredistribute.hh:490
│ │ │ │ -
static const M::size_type gather(const Container &cont, std::size_t i)
Definition matrixredistribute.hh:486
│ │ │ │ -
CommMatrixRowSize< M, RI > Container
Definition matrixredistribute.hh:484
│ │ │ │ -
Definition matrixredistribute.hh:500
│ │ │ │ -
static const M::size_type gather(const Container &cont, std::size_t i)
Definition matrixredistribute.hh:503
│ │ │ │ -
static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
Definition matrixredistribute.hh:507
│ │ │ │ -
CommMatrixRowSize< M, RI > Container
Definition matrixredistribute.hh:501
│ │ │ │ -
Definition matrixredistribute.hh:518
│ │ │ │ -
M::ConstColIterator ColIter
Definition matrixredistribute.hh:521
│ │ │ │ -
static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:553
│ │ │ │ -
CommMatrixSparsityPattern< M, I > Container
Definition matrixredistribute.hh:520
│ │ │ │ -
static GlobalIndex numlimits
Definition matrixredistribute.hh:524
│ │ │ │ -
static ColIter col
Definition matrixredistribute.hh:523
│ │ │ │ -
I::GlobalIndex GlobalIndex
Definition matrixredistribute.hh:519
│ │ │ │ -
static const GlobalIndex & gather(const Container &cont, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:526
│ │ │ │ -
Definition matrixredistribute.hh:599
│ │ │ │ -
I::GlobalIndex GlobalIndex
Definition matrixredistribute.hh:600
│ │ │ │ -
static Data datastore
Definition matrixredistribute.hh:605
│ │ │ │ -
static GlobalIndex numlimits
Definition matrixredistribute.hh:606
│ │ │ │ -
M::ConstColIterator ColIter
Definition matrixredistribute.hh:602
│ │ │ │ -
static const Data & gather(const Container &cont, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:608
│ │ │ │ -
std::pair< GlobalIndex, typename M::block_type > Data
Definition matrixredistribute.hh:603
│ │ │ │ -
static void scatter(Container &cont, const Data &data, std::size_t i, std::size_t j)
Definition matrixredistribute.hh:638
│ │ │ │ -
static ColIter col
Definition matrixredistribute.hh:604
│ │ │ │ -
CommMatrixRow< M, I > Container
Definition matrixredistribute.hh:601
│ │ │ │ -
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:174
│ │ │ │ -
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
Definition owneroverlapcopy.hh:194
│ │ │ │ -
Definition pinfo.hh:28
│ │ │ │ -
Definition repartition.hh:260
│ │ │ │ -
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:27
│ │ │ │ -
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition solvercategory.hh:34
│ │ │ │ +
A multiple of the identity matrix of static size.
Definition scaledidmatrix.hh:30
│ │ │ │ +
void usmhv(const K &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition scaledidmatrix.hh:353
│ │ │ │ +
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition scaledidmatrix.hh:305
│ │ │ │ +
ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y)
vector space subtraction
Definition scaledidmatrix.hh:169
│ │ │ │ +
const_row_type::ConstIterator ConstColIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:131
│ │ │ │ +
ConstIterator end() const
end iterator
Definition scaledidmatrix.hh:140
│ │ │ │ +
Iterator beforeBegin()
Definition scaledidmatrix.hh:118
│ │ │ │ +
bool operator!=(const ScaledIdentityMatrix &other) const
incomparison operator
Definition scaledidmatrix.hh:229
│ │ │ │ +
void mmv(const X &x, Y &y) const
y -= A x
Definition scaledidmatrix.hh:293
│ │ │ │ +
std::size_t size_type
The type used for the index access and size operations.
Definition scaledidmatrix.hh:43
│ │ │ │ +
void usmv(const K &alpha, const X &x, Y &y) const
y += alpha A x
Definition scaledidmatrix.hh:329
│ │ │ │ +
row_type::Iterator ColIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:95
│ │ │ │ +
const_row_type const_reference
Definition scaledidmatrix.hh:53
│ │ │ │ +
void mv(const X &x, Y &y) const
y = A x
Definition scaledidmatrix.hh:238
│ │ │ │ +
void umtv(const X &x, Y &y) const
y += A^T x
Definition scaledidmatrix.hh:269
│ │ │ │ +
void umhv(const X &x, Y &y) const
y += A^H x
Definition scaledidmatrix.hh:281
│ │ │ │ +
DiagonalRowVector< K, n > row_type
Each row is implemented by a field vector.
Definition scaledidmatrix.hh:50
│ │ │ │ +
ContainerWrapperIterator< const WrapperType, reference, reference > Iterator
Iterator class for sequential access.
Definition scaledidmatrix.hh:89
│ │ │ │ +
Iterator beforeEnd()
Definition scaledidmatrix.hh:111
│ │ │ │ +
K determinant() const
calculates the determinant of this matrix
Definition scaledidmatrix.hh:408
│ │ │ │ +
K field_type
export the type representing the field
Definition scaledidmatrix.hh:37
│ │ │ │ +
void usmtv(const K &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition scaledidmatrix.hh:341
│ │ │ │ +
Iterator end()
end iterator
Definition scaledidmatrix.hh:104
│ │ │ │ +
Iterator iterator
typedef for stl compliant access
Definition scaledidmatrix.hh:91
│ │ │ │ +
const K & scalar() const
Get const reference to the scalar diagonal value.
Definition scaledidmatrix.hh:477
│ │ │ │ +
void umv(const X &x, Y &y) const
y += A x
Definition scaledidmatrix.hh:257
│ │ │ │ +
static constexpr std::size_t blocklevel
We are at the leaf of the block recursion.
Definition scaledidmatrix.hh:47
│ │ │ │ +
const K & diagonal(size_type) const
Get const reference to diagonal entry.
Definition scaledidmatrix.hh:464
│ │ │ │ +
@ rows
The number of rows.
Definition scaledidmatrix.hh:58
│ │ │ │ +
@ cols
The number of columns.
Definition scaledidmatrix.hh:60
│ │ │ │ +
ScaledIdentityMatrix & operator=(const K &k)
Definition scaledidmatrix.hh:75
│ │ │ │ +
ContainerWrapperIterator< const WrapperType, const_reference, const_reference > ConstIterator
Iterator class for sequential access.
Definition scaledidmatrix.hh:125
│ │ │ │ +
K & diagonal(size_type)
Get reference to diagonal entry.
Definition scaledidmatrix.hh:470
│ │ │ │ +
void solve(V &x, const V &b) const
Solve system A x = b.
Definition scaledidmatrix.hh:394
│ │ │ │ +
bool exists(size_type i, size_type j) const
return true when (i,j) is in pattern
Definition scaledidmatrix.hh:429
│ │ │ │ +
Iterator RowIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:93
│ │ │ │ +
ConstIterator const_iterator
typedef for stl compliant access
Definition scaledidmatrix.hh:127
│ │ │ │ +
ScaledIdentityMatrix()
Default constructor.
Definition scaledidmatrix.hh:66
│ │ │ │ +
bool operator==(const ScaledIdentityMatrix &other) const
comparison operator
Definition scaledidmatrix.hh:223
│ │ │ │ +
ConstIterator beforeBegin() const
Definition scaledidmatrix.hh:154
│ │ │ │ +
ScaledIdentityMatrix & operator/=(const K &k)
vector space division by scalar
Definition scaledidmatrix.hh:196
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix< K, n > &a)
Sends the matrix to an output stream.
Definition scaledidmatrix.hh:441
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition scaledidmatrix.hh:372
│ │ │ │ +
FieldTraits< field_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition scaledidmatrix.hh:366
│ │ │ │ +
FieldTraits< field_type >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition scaledidmatrix.hh:378
│ │ │ │ +
ConstIterator ConstRowIterator
rename the iterators for easier access
Definition scaledidmatrix.hh:129
│ │ │ │ +
ConstIterator beforeEnd() const
Definition scaledidmatrix.hh:147
│ │ │ │ +
size_type M() const
number of blocks in column direction
Definition scaledidmatrix.hh:421
│ │ │ │ +
const_reference operator[](size_type i) const
Return const_reference object as row replacement.
Definition scaledidmatrix.hh:458
│ │ │ │ +
ScaledIdentityMatrix(const K &k)
Constructor initializing the whole matrix with a scalar.
Definition scaledidmatrix.hh:70
│ │ │ │ +
friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar)
vector space multiplication with scalar
Definition scaledidmatrix.hh:207
│ │ │ │ +
FieldTraits< field_type >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition scaledidmatrix.hh:384
│ │ │ │ +
ScaledIdentityMatrix & operator*=(const K &k)
vector space multiplication with scalar
Definition scaledidmatrix.hh:189
│ │ │ │ +
bool identical(const ScaledIdentityMatrix< K, n > &other) const
Definition scaledidmatrix.hh:82
│ │ │ │ +
void invert()
Compute inverse.
Definition scaledidmatrix.hh:402
│ │ │ │ +
Iterator begin()
begin iterator
Definition scaledidmatrix.hh:98
│ │ │ │ +
K & scalar()
Get reference to the scalar diagonal value.
Definition scaledidmatrix.hh:484
│ │ │ │ +
row_type reference
Definition scaledidmatrix.hh:51
│ │ │ │ +
K block_type
export the type representing the components
Definition scaledidmatrix.hh:40
│ │ │ │ +
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition scaledidmatrix.hh:317
│ │ │ │ +
ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y)
vector space addition
Definition scaledidmatrix.hh:162
│ │ │ │ +
DiagonalRowVectorConst< K, n > const_row_type
Definition scaledidmatrix.hh:52
│ │ │ │ +
void mtv(const X &x, Y &y) const
y = A^T x
Definition scaledidmatrix.hh:250
│ │ │ │ +
reference operator[](size_type i)
Return reference object as row replacement.
Definition scaledidmatrix.hh:452
│ │ │ │ +
ConstIterator begin() const
begin iterator
Definition scaledidmatrix.hh:134
│ │ │ │ +
size_type N() const
number of blocks in row direction
Definition scaledidmatrix.hh:415
│ │ │ │ +
static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > const &rhs)
Definition scaledidmatrix.hh:497
│ │ │ │ +
typename ScaledIdentityMatrix< K, n >::field_type field_type
Definition scaledidmatrix.hh:510
│ │ │ │ +
typename FieldTraits< field_type >::real_type real_type
Definition scaledidmatrix.hh:511
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1173 +1,718 @@ │ │ │ │ │ dune-istl 2.9.0 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _i_s_t_l │ │ │ │ │ -matrixredistribute.hh │ │ │ │ │ +scaledidmatrix.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// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 4// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ -5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH │ │ │ │ │ -6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH │ │ │ │ │ -7#include │ │ │ │ │ -8#include "_r_e_p_a_r_t_i_t_i_o_n_._h_h" │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include <_d_u_n_e_/_i_s_t_l_/_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_i_s_t_l_/_p_a_a_m_g_/_p_i_n_f_o_._h_h> │ │ │ │ │ -18namespace _D_u_n_e │ │ │ │ │ -19{ │ │ │ │ │ -20 template │ │ │ │ │ -_2_1 struct _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -22 { │ │ │ │ │ -_2_3 bool _i_s_S_e_t_u_p() const │ │ │ │ │ -24 { │ │ │ │ │ -25 return false; │ │ │ │ │ -26 } │ │ │ │ │ -27 template │ │ │ │ │ -_2_8 void _r_e_d_i_s_t_r_i_b_u_t_e([[maybe_unused]] const D& from, [[maybe_unused]] D& to) │ │ │ │ │ -const │ │ │ │ │ -29 {} │ │ │ │ │ -30 │ │ │ │ │ -31 template │ │ │ │ │ -_3_2 void _r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d([[maybe_unused]] D& from, [[maybe_unused]]const D& │ │ │ │ │ -to) const │ │ │ │ │ -33 {} │ │ │ │ │ -34 │ │ │ │ │ -_3_5 void _r_e_s_e_t_S_e_t_u_p() │ │ │ │ │ -36 {} │ │ │ │ │ -37 │ │ │ │ │ -_3_8 void _s_e_t_N_o_R_o_w_s([[maybe_unused]] std::size_t size) │ │ │ │ │ -39 {} │ │ │ │ │ -40 │ │ │ │ │ -_4_1 void _s_e_t_N_o_C_o_p_y_R_o_w_s([[maybe_unused]] std::size_t size) │ │ │ │ │ -42 {} │ │ │ │ │ -43 │ │ │ │ │ -_4_4 void _s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s([[maybe_unused]] std::size_t size) │ │ │ │ │ -45 {} │ │ │ │ │ -46 │ │ │ │ │ -_4_7 std::size_t _g_e_t_R_o_w_S_i_z_e([[maybe_unused]] std::size_t index) const │ │ │ │ │ -48 { │ │ │ │ │ -49 return -1; │ │ │ │ │ -50 } │ │ │ │ │ -51 │ │ │ │ │ -_5_2 std::size_t _g_e_t_C_o_p_y_R_o_w_S_i_z_e([[maybe_unused]] std::size_t index) const │ │ │ │ │ -53 { │ │ │ │ │ -54 return -1; │ │ │ │ │ -55 } │ │ │ │ │ -56 │ │ │ │ │ -_5_7 std::size_t _g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e([[maybe_unused]] std::size_t index) │ │ │ │ │ -const │ │ │ │ │ -58 { │ │ │ │ │ -59 return -1; │ │ │ │ │ -60 } │ │ │ │ │ -61 │ │ │ │ │ -62 }; │ │ │ │ │ -63 │ │ │ │ │ -64#if HAVE_MPI │ │ │ │ │ -65 template │ │ │ │ │ -_6_6 class _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n<_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n > │ │ │ │ │ -67 { │ │ │ │ │ -68 public: │ │ │ │ │ -_6_9 typedef _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_T_,_T_1_> _C_o_m_m; │ │ │ │ │ -70 │ │ │ │ │ -_7_1 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n() │ │ │ │ │ -72 : interface(), setup_(false) │ │ │ │ │ -73 {} │ │ │ │ │ -74 │ │ │ │ │ -_7_5 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e& _g_e_t_I_n_t_e_r_f_a_c_e() │ │ │ │ │ +5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH │ │ │ │ │ +6#define DUNE_ISTL_SCALEDIDMATRIX_HH │ │ │ │ │ +7 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22 │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24 │ │ │ │ │ +28 template │ │ │ │ │ +_2_9 class _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ +30 { │ │ │ │ │ +31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix > WrapperType; │ │ │ │ │ +32 │ │ │ │ │ +33 public: │ │ │ │ │ +34 //===== type definitions and constants │ │ │ │ │ +35 │ │ │ │ │ +_3_7 typedef K _f_i_e_l_d___t_y_p_e; │ │ │ │ │ +38 │ │ │ │ │ +_4_0 typedef K _b_l_o_c_k___t_y_p_e; │ │ │ │ │ +41 │ │ │ │ │ +_4_3 typedef std::size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ +44 │ │ │ │ │ +46 [[deprecated("Use free function blockLevel(). Will be removed after 2.8.")]] │ │ │ │ │ +_4_7 static constexpr std::size_t _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ │ +48 │ │ │ │ │ +_5_0 typedef DiagonalRowVector _r_o_w___t_y_p_e; │ │ │ │ │ +_5_1 typedef _r_o_w___t_y_p_e _r_e_f_e_r_e_n_c_e; │ │ │ │ │ +_5_2 typedef DiagonalRowVectorConst _c_o_n_s_t___r_o_w___t_y_p_e; │ │ │ │ │ +_5_3 typedef _c_o_n_s_t___r_o_w___t_y_p_e _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +54 │ │ │ │ │ +56 enum { │ │ │ │ │ +_5_8 _r_o_w_s = n, │ │ │ │ │ +60 _c_o_l_s = n │ │ │ │ │ +_6_1 }; │ │ │ │ │ +62 │ │ │ │ │ +63 //===== constructors │ │ │ │ │ +_6_6 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x () {} │ │ │ │ │ +67 │ │ │ │ │ +_7_0 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x (const K& k) │ │ │ │ │ +71 : p_(k) │ │ │ │ │ +72 {} │ │ │ │ │ +73 │ │ │ │ │ +74 //===== assignment from scalar │ │ │ │ │ +_7_5 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_=_ (const K& k) │ │ │ │ │ 76 { │ │ │ │ │ -77 return interface; │ │ │ │ │ -78 } │ │ │ │ │ -79 template │ │ │ │ │ -_8_0 void _c_h_e_c_k_I_n_t_e_r_f_a_c_e(const IS& source, │ │ │ │ │ -81 const IS& target, MPI_Comm comm) │ │ │ │ │ -82 { │ │ │ │ │ -83 auto ri = std::make_unique >(source, target, comm); │ │ │ │ │ -84 ri->template rebuild(); │ │ │ │ │ -85 Interface inf; │ │ │ │ │ -86 typename _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t flags; │ │ │ │ │ -87 int rank; │ │ │ │ │ -88 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ -89 inf.free(); │ │ │ │ │ -90 inf.build(*ri, flags, flags); │ │ │ │ │ -91 │ │ │ │ │ -92 │ │ │ │ │ -93#ifdef DEBUG_REPART │ │ │ │ │ -94 if(inf!=interface) { │ │ │ │ │ -95 │ │ │ │ │ -96 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ -97 if(rank==0) │ │ │ │ │ -98 std::cout<<"Interfaces do not match!"< │ │ │ │ │ -_1_1_8 void _r_e_d_i_s_t_r_i_b_u_t_e(const D& from, D& to) const │ │ │ │ │ +77 p_ = k; │ │ │ │ │ +78 return *this; │ │ │ │ │ +79 } │ │ │ │ │ +80 │ │ │ │ │ +81 // check if matrix is identical to other matrix (not only identical values) │ │ │ │ │ +_8_2 bool _i_d_e_n_t_i_c_a_l(const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_n_>& other) const │ │ │ │ │ +83 { │ │ │ │ │ +84 return (this==&other); │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +87 //===== iterator interface to rows of the matrix │ │ │ │ │ +_8_9 typedef ContainerWrapperIterator │ │ │ │ │ +_I_t_e_r_a_t_o_r; │ │ │ │ │ +_9_1 typedef _I_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ │ +_9_3 typedef _I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +_9_5 typedef typename row_type::Iterator _C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +96 │ │ │ │ │ +_9_8 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ +99 { │ │ │ │ │ +100 return _I_t_e_r_a_t_o_r(WrapperType(this),0); │ │ │ │ │ +101 } │ │ │ │ │ +102 │ │ │ │ │ +_1_0_4 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ +105 { │ │ │ │ │ +106 return _I_t_e_r_a_t_o_r(WrapperType(this),n); │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +_1_1_1 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ │ +112 { │ │ │ │ │ +113 return _I_t_e_r_a_t_o_r(WrapperType(this),n-1); │ │ │ │ │ +114 } │ │ │ │ │ +115 │ │ │ │ │ +_1_1_8 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ │ 119 { │ │ │ │ │ -120 BufferedCommunicator communicator; │ │ │ │ │ -121 communicator.template build(from,to, interface); │ │ │ │ │ -122 communicator.template forward(from, to); │ │ │ │ │ -123 communicator.free(); │ │ │ │ │ -124 } │ │ │ │ │ -125 template │ │ │ │ │ -_1_2_6 void _r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(D& from, const D& to) const │ │ │ │ │ -127 { │ │ │ │ │ -128 │ │ │ │ │ -129 BufferedCommunicator communicator; │ │ │ │ │ -130 communicator.template build(from,to, interface); │ │ │ │ │ -131 communicator.template backward(from, to); │ │ │ │ │ -132 communicator.free(); │ │ │ │ │ -133 } │ │ │ │ │ -134 │ │ │ │ │ -135 template │ │ │ │ │ -_1_3_6 void _r_e_d_i_s_t_r_i_b_u_t_e(const D& from, D& to) const │ │ │ │ │ -137 { │ │ │ │ │ -138 redistribute >(from,to); │ │ │ │ │ -139 } │ │ │ │ │ -140 template │ │ │ │ │ -_1_4_1 void _r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(D& from, const D& to) const │ │ │ │ │ -142 { │ │ │ │ │ -143 redistributeBackward >(from,to); │ │ │ │ │ -144 } │ │ │ │ │ -_1_4_5 bool _i_s_S_e_t_u_p() const │ │ │ │ │ -146 { │ │ │ │ │ -147 return setup_; │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -_1_5_0 void _r_e_s_e_r_v_e(std::size_t size) │ │ │ │ │ -151 {} │ │ │ │ │ -152 │ │ │ │ │ -_1_5_3 std::size_t& _g_e_t_R_o_w_S_i_z_e(std::size_t index) │ │ │ │ │ -154 { │ │ │ │ │ -155 return rowSize[index]; │ │ │ │ │ -156 } │ │ │ │ │ -157 │ │ │ │ │ -_1_5_8 std::size_t _g_e_t_R_o_w_S_i_z_e(std::size_t index) const │ │ │ │ │ -159 { │ │ │ │ │ -160 return rowSize[index]; │ │ │ │ │ -161 } │ │ │ │ │ -162 │ │ │ │ │ -_1_6_3 std::size_t& _g_e_t_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) │ │ │ │ │ -164 { │ │ │ │ │ -165 return copyrowSize[index]; │ │ │ │ │ +120 return _I_t_e_r_a_t_o_r(WrapperType(this),-1); │ │ │ │ │ +121 } │ │ │ │ │ +122 │ │ │ │ │ +123 │ │ │ │ │ +_1_2_5 typedef ContainerWrapperIterator _C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_1_2_7 typedef _C_o_n_s_t_I_t_e_r_a_t_o_r _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ +_1_2_9 typedef _C_o_n_s_t_I_t_e_r_a_t_o_r _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ │ +_1_3_1 typedef typename const_row_type::ConstIterator _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ │ +132 │ │ │ │ │ +_1_3_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ │ +135 { │ │ │ │ │ +136 return _C_o_n_s_t_I_t_e_r_a_t_o_r(WrapperType(this),0); │ │ │ │ │ +137 } │ │ │ │ │ +138 │ │ │ │ │ +_1_4_0 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ │ +141 { │ │ │ │ │ +142 return _C_o_n_s_t_I_t_e_r_a_t_o_r(WrapperType(this),n); │ │ │ │ │ +143 } │ │ │ │ │ +144 │ │ │ │ │ +_1_4_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d() const │ │ │ │ │ +148 { │ │ │ │ │ +149 return _C_o_n_s_t_I_t_e_r_a_t_o_r(WrapperType(this),n-1); │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +_1_5_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ │ +155 { │ │ │ │ │ +156 return _C_o_n_s_t_I_t_e_r_a_t_o_r(WrapperType(this),-1); │ │ │ │ │ +157 } │ │ │ │ │ +158 │ │ │ │ │ +159 //===== vector space arithmetic │ │ │ │ │ +160 │ │ │ │ │ +_1_6_2 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& y) │ │ │ │ │ +163 { │ │ │ │ │ +164 p_ += y.p_; │ │ │ │ │ +165 return *this; │ │ │ │ │ 166 } │ │ │ │ │ 167 │ │ │ │ │ -_1_6_8 std::size_t _g_e_t_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) const │ │ │ │ │ -169 { │ │ │ │ │ -170 return copyrowSize[index]; │ │ │ │ │ -171 } │ │ │ │ │ -172 │ │ │ │ │ -_1_7_3 std::size_t& _g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) │ │ │ │ │ -174 { │ │ │ │ │ -175 return backwardscopyrowSize[index]; │ │ │ │ │ -176 } │ │ │ │ │ -177 │ │ │ │ │ -_1_7_8 std::size_t _g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(std::size_t index) const │ │ │ │ │ -179 { │ │ │ │ │ -180 return backwardscopyrowSize[index]; │ │ │ │ │ -181 } │ │ │ │ │ -182 │ │ │ │ │ -_1_8_3 void _s_e_t_N_o_R_o_w_s(std::size_t rows) │ │ │ │ │ +_1_6_9 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& y) │ │ │ │ │ +170 { │ │ │ │ │ +171 p_ -= y.p_; │ │ │ │ │ +172 return *this; │ │ │ │ │ +173 } │ │ │ │ │ +174 │ │ │ │ │ +_1_7_6 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_+_=_ (const K& k) │ │ │ │ │ +177 { │ │ │ │ │ +178 p_ += k; │ │ │ │ │ +179 return *this; │ │ │ │ │ +180 } │ │ │ │ │ +181 │ │ │ │ │ +_1_8_3 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_-_=_ (const K& k) │ │ │ │ │ 184 { │ │ │ │ │ -185 rowSize.resize(rows, 0); │ │ │ │ │ -186 } │ │ │ │ │ -187 │ │ │ │ │ -_1_8_8 void _s_e_t_N_o_C_o_p_y_R_o_w_s(std::size_t rows) │ │ │ │ │ -189 { │ │ │ │ │ -190 copyrowSize.resize(rows, 0); │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -_1_9_3 void _s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s(std::size_t rows) │ │ │ │ │ -194 { │ │ │ │ │ -195 backwardscopyrowSize.resize(rows, 0); │ │ │ │ │ -196 } │ │ │ │ │ -197 │ │ │ │ │ -198 private: │ │ │ │ │ -199 std::vector rowSize; │ │ │ │ │ -200 std::vector copyrowSize; │ │ │ │ │ -201 std::vector backwardscopyrowSize; │ │ │ │ │ -202 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e interface; │ │ │ │ │ -203 bool setup_; │ │ │ │ │ -204 }; │ │ │ │ │ -205 │ │ │ │ │ -214 template │ │ │ │ │ -_2_1_5 struct _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e │ │ │ │ │ +185 p_ -= k; │ │ │ │ │ +186 return *this; │ │ │ │ │ +187 } │ │ │ │ │ +_1_8_9 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_*_=_ (const K& k) │ │ │ │ │ +190 { │ │ │ │ │ +191 p_ *= k; │ │ │ │ │ +192 return *this; │ │ │ │ │ +193 } │ │ │ │ │ +194 │ │ │ │ │ +_1_9_6 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& _o_p_e_r_a_t_o_r_/_=_ (const K& k) │ │ │ │ │ +197 { │ │ │ │ │ +198 p_ /= k; │ │ │ │ │ +199 return *this; │ │ │ │ │ +200 } │ │ │ │ │ +201 │ │ │ │ │ +202 //===== binary operators │ │ │ │ │ +203 │ │ │ │ │ +205 template ::value, int> = 0> │ │ │ │ │ +_2_0_7 friend auto _o_p_e_r_a_t_o_r_*_ ( const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& matrix, Scalar _s_c_a_l_a_r) │ │ │ │ │ +208 { │ │ │ │ │ +209 return _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_K_,_S_c_a_l_a_r_>_:_: │ │ │ │ │ +_P_r_o_m_o_t_e_d_T_y_p_e, n>{matrix._s_c_a_l_a_r()*_s_c_a_l_a_r}; │ │ │ │ │ +210 } │ │ │ │ │ +211 │ │ │ │ │ +213 template ::value, int> = 0> │ │ │ │ │ +_2_1_5 friend auto _o_p_e_r_a_t_o_r_*_ (Scalar _s_c_a_l_a_r, const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& matrix) │ │ │ │ │ 216 { │ │ │ │ │ -217 // Make the default communication policy work. │ │ │ │ │ -_2_1_8 typedef typename M::size_type _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_2_1_9 typedef typename M::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ -220 │ │ │ │ │ -_2_2_6 _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e(const M& m_, RI& rowsize_) │ │ │ │ │ -227 : _m_a_t_r_i_x(m_), _r_o_w_s_i_z_e(rowsize_) │ │ │ │ │ -228 {} │ │ │ │ │ -_2_2_9 const M& _m_a_t_r_i_x; │ │ │ │ │ -_2_3_0 RI& _r_o_w_s_i_z_e; │ │ │ │ │ -231 │ │ │ │ │ -232 }; │ │ │ │ │ +217 return _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_t_y_p_e_n_a_m_e_ _P_r_o_m_o_t_i_o_n_T_r_a_i_t_s_<_S_c_a_l_a_r_,_K_>_:_: │ │ │ │ │ +_P_r_o_m_o_t_e_d_T_y_p_e, n>{_s_c_a_l_a_r*matrix._s_c_a_l_a_r()}; │ │ │ │ │ +218 } │ │ │ │ │ +219 │ │ │ │ │ +220 //===== comparison ops │ │ │ │ │ +221 │ │ │ │ │ +_2_2_3 bool _o_p_e_r_a_t_o_r_=_=(const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& other) const │ │ │ │ │ +224 { │ │ │ │ │ +225 return p_==other._s_c_a_l_a_r(); │ │ │ │ │ +226 } │ │ │ │ │ +227 │ │ │ │ │ +_2_2_9 bool _o_p_e_r_a_t_o_r_!_=(const _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x& other) const │ │ │ │ │ +230 { │ │ │ │ │ +231 return p_!=other._s_c_a_l_a_r(); │ │ │ │ │ +232 } │ │ │ │ │ 233 │ │ │ │ │ -234 │ │ │ │ │ -243 template │ │ │ │ │ -_2_4_4 struct _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -245 { │ │ │ │ │ -_2_4_6 typedef typename M::size_type _s_i_z_e___t_y_p_e; │ │ │ │ │ +234 //===== linear maps │ │ │ │ │ +235 │ │ │ │ │ +237 template │ │ │ │ │ +_2_3_8 void _m_v (const X& x, Y& y) const │ │ │ │ │ +239 { │ │ │ │ │ +240#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +241 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +242 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +243#endif │ │ │ │ │ +244 for (_s_i_z_e___t_y_p_e i=0; i& │ │ │ │ │ -idxset_, const I& aggidxset_) │ │ │ │ │ -255 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _r_o_w_s_i_z_e() │ │ │ │ │ -256 {} │ │ │ │ │ -257 │ │ │ │ │ -_2_6_5 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(const M& m_, const Dune::GlobalLookupIndexSet& │ │ │ │ │ -idxset_, const I& aggidxset_, │ │ │ │ │ -266 const std::vector& rowsize_) │ │ │ │ │ -267 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _s_p_a_r_s_i_t_y │ │ │ │ │ -(aggidxset_.size()), _r_o_w_s_i_z_e(&rowsize_) │ │ │ │ │ -268 {} │ │ │ │ │ -269 │ │ │ │ │ -_2_7_6 void _s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(M& m) │ │ │ │ │ -277 { │ │ │ │ │ -278 // insert diagonal to overlap rows │ │ │ │ │ -279 typedef typename Dune::GlobalLookupIndexSet::const_iterator IIter; │ │ │ │ │ -280 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -OwnerSet; │ │ │ │ │ -281 std::size_t nnz=0; │ │ │ │ │ -282#ifdef DEBUG_REPART │ │ │ │ │ -283 int rank; │ │ │ │ │ -284 │ │ │ │ │ -285 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ +249 template │ │ │ │ │ +_2_5_0 void _m_t_v (const X& x, Y& y) const │ │ │ │ │ +251 { │ │ │ │ │ +252 _m_v(x, y); │ │ │ │ │ +253 } │ │ │ │ │ +254 │ │ │ │ │ +256 template │ │ │ │ │ +_2_5_7 void _u_m_v (const X& x, Y& y) const │ │ │ │ │ +258 { │ │ │ │ │ +259#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +260 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +261 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +262#endif │ │ │ │ │ +263 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_2_6_9 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ │ +270 { │ │ │ │ │ +271#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +272 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +273 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +274#endif │ │ │ │ │ +275 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_2_8_1 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ │ +282 { │ │ │ │ │ +283#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +284 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +285 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ 286#endif │ │ │ │ │ -287 for(IIter i= _a_g_g_i_d_x_s_e_t.begin(), end=_a_g_g_i_d_x_s_e_t.end(); i!=end; ++i) { │ │ │ │ │ -288 if(!OwnerSet::contains(i->local().attribute())) { │ │ │ │ │ -289#ifdef DEBUG_REPART │ │ │ │ │ -290 std::cout<local()<local()].insert(i->local()); │ │ │ │ │ -293 } │ │ │ │ │ -294 │ │ │ │ │ -295 nnz+=_s_p_a_r_s_i_t_y[i->local()].size(); │ │ │ │ │ -296 } │ │ │ │ │ -297 assert( _a_g_g_i_d_x_s_e_t.size()==_s_p_a_r_s_i_t_y.size()); │ │ │ │ │ -298 │ │ │ │ │ -299 if(nnz>0) { │ │ │ │ │ -300 m.setSize(_a_g_g_i_d_x_s_e_t.size(), _a_g_g_i_d_x_s_e_t.size(), nnz); │ │ │ │ │ -301 m.setBuildMode(M::row_wise); │ │ │ │ │ -302 typename M::CreateIterator citer=m.createbegin(); │ │ │ │ │ -303#ifdef DEBUG_REPART │ │ │ │ │ -304 std::size_t idx=0; │ │ │ │ │ -305 bool correct=true; │ │ │ │ │ -306 Dune::GlobalLookupIndexSet global(_a_g_g_i_d_x_s_e_t); │ │ │ │ │ -307#endif │ │ │ │ │ -308 typedef typename std::vector >::const_iterator Iter; │ │ │ │ │ -309 for(Iter i=_s_p_a_r_s_i_t_y.begin(), end=_s_p_a_r_s_i_t_y.end(); i!=end; ++i, ++citer) │ │ │ │ │ -310 { │ │ │ │ │ -311 typedef typename std::set::const_iterator SIter; │ │ │ │ │ -312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si) │ │ │ │ │ -313 citer.insert(*si); │ │ │ │ │ -314#ifdef DEBUG_REPART │ │ │ │ │ -315 if(i->find(idx)==i->end()) { │ │ │ │ │ -316 const typename I::IndexPair* gi=global.pair(idx); │ │ │ │ │ -317 assert(gi); │ │ │ │ │ -318 std::cout<local().attribute())<< │ │ │ │ │ -320 " row size="<size()< │ │ │ │ │ +_2_9_3 void _m_m_v (const X& x, Y& y) const │ │ │ │ │ +294 { │ │ │ │ │ +295#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +296 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +297 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +298#endif │ │ │ │ │ +299 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_3_0_5 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ │ +306 { │ │ │ │ │ +307#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +308 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +309 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +310#endif │ │ │ │ │ +311 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_3_1_7 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ │ +318 { │ │ │ │ │ +319#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +320 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +321 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +322#endif │ │ │ │ │ +323 for (_s_i_z_e___t_y_p_e i=0; i > │ │ │ │ │ -add_sparsity) │ │ │ │ │ -341 { │ │ │ │ │ -342 for (unsigned int i = 0; i != _s_p_a_r_s_i_t_y.size(); ++i) { │ │ │ │ │ -343 if (add_sparsity[i].size() != 0) { │ │ │ │ │ -344 typedef std::set Set; │ │ │ │ │ -345 Set tmp_set; │ │ │ │ │ -346 std::insert_iterator tmp_insert (tmp_set, tmp_set.begin()); │ │ │ │ │ -347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(), │ │ │ │ │ -348 _s_p_a_r_s_i_t_y[i].begin(), _s_p_a_r_s_i_t_y[i].end(), tmp_insert); │ │ │ │ │ -349 _s_p_a_r_s_i_t_y[i].swap(tmp_set); │ │ │ │ │ -350 } │ │ │ │ │ -351 } │ │ │ │ │ -352 } │ │ │ │ │ -353 │ │ │ │ │ -_3_5_4 const M& _m_a_t_r_i_x; │ │ │ │ │ -_3_5_5 typedef Dune::GlobalLookupIndexSet _L_o_o_k_u_p_I_n_d_e_x_S_e_t; │ │ │ │ │ -_3_5_6 const Dune::GlobalLookupIndexSet& _i_d_x_s_e_t; │ │ │ │ │ -_3_5_7 const I& _a_g_g_i_d_x_s_e_t; │ │ │ │ │ -_3_5_8 std::vector > _s_p_a_r_s_i_t_y; │ │ │ │ │ -_3_5_9 const std::vector* _r_o_w_s_i_z_e; │ │ │ │ │ -360 }; │ │ │ │ │ -361 │ │ │ │ │ -362 template │ │ │ │ │ -_3_6_3 struct CommPolicy<_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n > │ │ │ │ │ -364 { │ │ │ │ │ -_3_6_5 typedef _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_> _T_y_p_e; │ │ │ │ │ -366 │ │ │ │ │ -_3_7_1 typedef typename I::GlobalIndex _I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ -372 │ │ │ │ │ -_3_7_4 typedef VariableSize _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ -375 │ │ │ │ │ -_3_7_6 static typename M::size_type _g_e_t_S_i_z_e(const _T_y_p_e& t, std::size_t i) │ │ │ │ │ -377 { │ │ │ │ │ -378 if(!t._r_o_w_s_i_z_e) │ │ │ │ │ -379 return t._m_a_t_r_i_x[i].size(); │ │ │ │ │ -380 else │ │ │ │ │ -381 { │ │ │ │ │ -382 assert((*t._r_o_w_s_i_z_e)[i]>0); │ │ │ │ │ -383 return (*t._r_o_w_s_i_z_e)[i]; │ │ │ │ │ -384 } │ │ │ │ │ -385 } │ │ │ │ │ -386 }; │ │ │ │ │ -387 │ │ │ │ │ -394 template │ │ │ │ │ -_3_9_5 struct _C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ -396 { │ │ │ │ │ -_4_0_5 _C_o_m_m_M_a_t_r_i_x_R_o_w(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I& │ │ │ │ │ -aggidxset_) │ │ │ │ │ -406 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _r_o_w_s_i_z_e() │ │ │ │ │ -407 {} │ │ │ │ │ -408 │ │ │ │ │ -_4_1_2 _C_o_m_m_M_a_t_r_i_x_R_o_w(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I& │ │ │ │ │ -aggidxset_, │ │ │ │ │ -413 std::vector& rowsize_) │ │ │ │ │ -414 : _m_a_t_r_i_x(m_), _i_d_x_s_e_t(idxset_), _a_g_g_i_d_x_s_e_t(aggidxset_), _r_o_w_s_i_z_e(&rowsize_) │ │ │ │ │ -415 {} │ │ │ │ │ -_4_2_1 void _s_e_t_O_v_e_r_l_a_p_R_o_w_s_T_o_D_i_r_i_c_h_l_e_t() │ │ │ │ │ +326 │ │ │ │ │ +328 template │ │ │ │ │ +_3_2_9 void _u_s_m_v (const K& alpha, const X& x, Y& y) const │ │ │ │ │ +330 { │ │ │ │ │ +331#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +332 if (x.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +333 if (y.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +334#endif │ │ │ │ │ +335 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_3_4_1 void _u_s_m_t_v (const K& alpha, const X& x, Y& y) const │ │ │ │ │ +342 { │ │ │ │ │ +343#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +344 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +345 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +346#endif │ │ │ │ │ +347 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ │ +_3_5_3 void _u_s_m_h_v (const K& alpha, const X& x, Y& y) const │ │ │ │ │ +354 { │ │ │ │ │ +355#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +356 if (x.N()!=_N()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +357 if (y.N()!=_M()) DUNE_THROW(FMatrixError,"index out of range"); │ │ │ │ │ +358#endif │ │ │ │ │ +359 for (_s_i_z_e___t_y_p_e i=0; i::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ │ +367 { │ │ │ │ │ +368 return fvmeta::sqrt(n*p_*p_); │ │ │ │ │ +369 } │ │ │ │ │ +370 │ │ │ │ │ +_3_7_2 typename FieldTraits::real_type _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ │ +373 { │ │ │ │ │ +374 return n*p_*p_; │ │ │ │ │ +375 } │ │ │ │ │ +376 │ │ │ │ │ +_3_7_8 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m () const │ │ │ │ │ +379 { │ │ │ │ │ +380 return std::abs(p_); │ │ │ │ │ +381 } │ │ │ │ │ +382 │ │ │ │ │ +_3_8_4 typename FieldTraits::real_type _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l () const │ │ │ │ │ +385 { │ │ │ │ │ +386 return fvmeta::absreal(p_); │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +389 //===== solve │ │ │ │ │ +390 │ │ │ │ │ +393 template │ │ │ │ │ +_3_9_4 void _s_o_l_v_e (V& x, const V& b) const │ │ │ │ │ +395 { │ │ │ │ │ +396 for (int i=0; i::const_iterator Iter; │ │ │ │ │ -424 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -OwnerSet; │ │ │ │ │ +423 return n; │ │ │ │ │ +424 } │ │ │ │ │ 425 │ │ │ │ │ -426 for(Iter i= _a_g_g_i_d_x_s_e_t.begin(), end=_a_g_g_i_d_x_s_e_t.end(); i!=end; ++i) │ │ │ │ │ -427 if(!OwnerSet::contains(i->local().attribute())) { │ │ │ │ │ -428 // Set to Dirchlet │ │ │ │ │ -429 typedef typename M::ColIterator CIter; │ │ │ │ │ -430 for(CIter c=_m_a_t_r_i_x[i->local()].begin(), cend= _m_a_t_r_i_x[i->local()].end(); │ │ │ │ │ -431 c!= cend; ++c) │ │ │ │ │ -432 { │ │ │ │ │ -433 *c=0; │ │ │ │ │ -434 if(c.index()==i->local()) { │ │ │ │ │ -435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) { │ │ │ │ │ -436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix); │ │ │ │ │ -437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt) │ │ │ │ │ -438 (*rowIt)[rowIt.index()] = value; │ │ │ │ │ -439 }; │ │ │ │ │ -440 setDiagonal(*c, 1); │ │ │ │ │ -441 } │ │ │ │ │ -442 } │ │ │ │ │ -443 } │ │ │ │ │ -444 } │ │ │ │ │ -_4_4_6 M& _m_a_t_r_i_x; │ │ │ │ │ -_4_4_8 const Dune::GlobalLookupIndexSet& _i_d_x_s_e_t; │ │ │ │ │ -_4_5_0 const I& _a_g_g_i_d_x_s_e_t; │ │ │ │ │ -_4_5_2 std::vector* _r_o_w_s_i_z_e; // row sizes differ from sender side in │ │ │ │ │ -overlap! │ │ │ │ │ -453 }; │ │ │ │ │ -454 │ │ │ │ │ -455 template │ │ │ │ │ -_4_5_6 struct CommPolicy<_C_o_m_m_M_a_t_r_i_x_R_o_w > │ │ │ │ │ -457 { │ │ │ │ │ -_4_5_8 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_> _T_y_p_e; │ │ │ │ │ -459 │ │ │ │ │ -_4_6_4 typedef std::pair │ │ │ │ │ -_I_n_d_e_x_e_d_T_y_p_e; │ │ │ │ │ -465 │ │ │ │ │ -_4_6_7 typedef VariableSize _I_n_d_e_x_e_d_T_y_p_e_F_l_a_g; │ │ │ │ │ +426 //===== query │ │ │ │ │ +427 │ │ │ │ │ +_4_2_9 bool _e_x_i_s_t_s (_s_i_z_e___t_y_p_e i, _s_i_z_e___t_y_p_e j) const │ │ │ │ │ +430 { │ │ │ │ │ +431#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ │ +432 if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range"); │ │ │ │ │ +433 if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range"); │ │ │ │ │ +434#endif │ │ │ │ │ +435 return i==j; │ │ │ │ │ +436 } │ │ │ │ │ +437 │ │ │ │ │ +438 //===== conversion operator │ │ │ │ │ +439 │ │ │ │ │ +_4_4_1 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const │ │ │ │ │ +_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_n_>& a) │ │ │ │ │ +442 { │ │ │ │ │ +443 for (_s_i_z_e___t_y_p_e i=0; i(&p_), i); │ │ │ │ │ +455 } │ │ │ │ │ +456 │ │ │ │ │ +_4_5_8 _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 │ │ │ │ │ +459 { │ │ │ │ │ +460 return _c_o_n_s_t___r_e_f_e_r_e_n_c_e(const_cast(&p_), i); │ │ │ │ │ +461 } │ │ │ │ │ +462 │ │ │ │ │ +_4_6_4 const K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e /*i*/) const │ │ │ │ │ +465 { │ │ │ │ │ +466 return p_; │ │ │ │ │ +467 } │ │ │ │ │ 468 │ │ │ │ │ -_4_6_9 static std::size_t _g_e_t_S_i_z_e(const _T_y_p_e& t, std::size_t i) │ │ │ │ │ -470 { │ │ │ │ │ -471 if(!t._r_o_w_s_i_z_e) │ │ │ │ │ -472 return t._m_a_t_r_i_x[i].size(); │ │ │ │ │ -473 else │ │ │ │ │ -474 { │ │ │ │ │ -475 assert((*t._r_o_w_s_i_z_e)[i]>0); │ │ │ │ │ -476 return (*t._r_o_w_s_i_z_e)[i]; │ │ │ │ │ -477 } │ │ │ │ │ -478 } │ │ │ │ │ -479 }; │ │ │ │ │ -480 │ │ │ │ │ -481 template │ │ │ │ │ -_4_8_2 struct _M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -483 { │ │ │ │ │ -_4_8_4 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ -485 │ │ │ │ │ -_4_8_6 static const typename M::size_type _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std:: │ │ │ │ │ -size_t i) │ │ │ │ │ -487 { │ │ │ │ │ -488 return cont._m_a_t_r_i_x[i].size(); │ │ │ │ │ -489 } │ │ │ │ │ -_4_9_0 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const typename M::size_type& rowsize, │ │ │ │ │ -std::size_t i) │ │ │ │ │ -491 { │ │ │ │ │ -492 assert(rowsize); │ │ │ │ │ -493 cont._r_o_w_s_i_z_e.getRowSize(i)=rowsize; │ │ │ │ │ -494 } │ │ │ │ │ -495 │ │ │ │ │ -496 }; │ │ │ │ │ -497 │ │ │ │ │ -498 template │ │ │ │ │ -_4_9_9 struct _M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -500 { │ │ │ │ │ -_5_0_1 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ -502 │ │ │ │ │ -_5_0_3 static const typename M::size_type _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std:: │ │ │ │ │ -size_t i) │ │ │ │ │ -504 { │ │ │ │ │ -505 return cont._m_a_t_r_i_x[i].size(); │ │ │ │ │ -506 } │ │ │ │ │ -_5_0_7 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const typename M::size_type& rowsize, │ │ │ │ │ -std::size_t i) │ │ │ │ │ -508 { │ │ │ │ │ -509 assert(rowsize); │ │ │ │ │ -510 if (rowsize > cont._r_o_w_s_i_z_e.getCopyRowSize(i)) │ │ │ │ │ -511 cont._r_o_w_s_i_z_e.getCopyRowSize(i)=rowsize; │ │ │ │ │ -512 } │ │ │ │ │ +_4_7_0 K& _d_i_a_g_o_n_a_l(_s_i_z_e___t_y_p_e /*i*/) │ │ │ │ │ +471 { │ │ │ │ │ +472 return p_; │ │ │ │ │ +473 } │ │ │ │ │ +474 │ │ │ │ │ +_4_7_7 const K& _s_c_a_l_a_r() const │ │ │ │ │ +478 { │ │ │ │ │ +479 return p_; │ │ │ │ │ +480 } │ │ │ │ │ +481 │ │ │ │ │ +_4_8_4 K& _s_c_a_l_a_r() │ │ │ │ │ +485 { │ │ │ │ │ +486 return p_; │ │ │ │ │ +487 } │ │ │ │ │ +488 │ │ │ │ │ +489 private: │ │ │ │ │ +490 // the data, very simply a single number │ │ │ │ │ +491 K p_; │ │ │ │ │ +492 │ │ │ │ │ +493 }; │ │ │ │ │ +494 │ │ │ │ │ +495 template │ │ │ │ │ +_4_9_6 struct DenseMatrixAssigner> { │ │ │ │ │ +_4_9_7 static void _a_p_p_l_y(DenseMatrix& denseMatrix, │ │ │ │ │ +498 _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_f_i_e_l_d_,_ _N_> const& rhs) { │ │ │ │ │ +499 assert(denseMatrix.M() == N); │ │ │ │ │ +500 assert(denseMatrix.N() == N); │ │ │ │ │ +501 denseMatrix = field(0); │ │ │ │ │ +502 for (int i = 0; i < N; ++i) │ │ │ │ │ +503 denseMatrix[i][i] = rhs._s_c_a_l_a_r(); │ │ │ │ │ +504 } │ │ │ │ │ +505 }; │ │ │ │ │ +506 │ │ │ │ │ +507 template │ │ │ │ │ +_5_0_8 struct FieldTraits< _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x > │ │ │ │ │ +509 { │ │ │ │ │ +_5_1_0 using _f_i_e_l_d___t_y_p_e = typename _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_K_,_ _n_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ │ +_5_1_1 using _r_e_a_l___t_y_p_e = typename FieldTraits::real_type; │ │ │ │ │ +512 }; │ │ │ │ │ 513 │ │ │ │ │ -514 }; │ │ │ │ │ +514} // end namespace │ │ │ │ │ 515 │ │ │ │ │ -516 template │ │ │ │ │ -_5_1_7 struct _M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -518 { │ │ │ │ │ -_5_1_9 typedef typename I::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ -_5_2_0 typedef _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ -_5_2_1 typedef typename M::ConstColIterator _C_o_l_I_t_e_r; │ │ │ │ │ -522 │ │ │ │ │ -_5_2_3 static _C_o_l_I_t_e_r _c_o_l; │ │ │ │ │ -_5_2_4 static _G_l_o_b_a_l_I_n_d_e_x _n_u_m_l_i_m_i_t_s; │ │ │ │ │ -525 │ │ │ │ │ -_5_2_6 static const _G_l_o_b_a_l_I_n_d_e_x& _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std::size_t i, │ │ │ │ │ -std::size_t j) │ │ │ │ │ -527 { │ │ │ │ │ -528 if(j==0) │ │ │ │ │ -529 _c_o_l=cont._m_a_t_r_i_x[i].begin(); │ │ │ │ │ -530 else if (_c_o_l!=cont._m_a_t_r_i_x[i].end()) │ │ │ │ │ -531 ++_c_o_l; │ │ │ │ │ -532 │ │ │ │ │ -533 //copy communication: different row sizes for copy rows with the same │ │ │ │ │ -global index │ │ │ │ │ -534 //are possible. If all values of current matrix row are sent, send │ │ │ │ │ -535 //std::numeric_limits::max() │ │ │ │ │ -536 //and receiver will ignore it. │ │ │ │ │ -537 if (_c_o_l==cont._m_a_t_r_i_x[i].end()) { │ │ │ │ │ -538 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ -539 return _n_u_m_l_i_m_i_t_s; │ │ │ │ │ -540 } │ │ │ │ │ -541 else { │ │ │ │ │ -542 const typename I::IndexPair* index=cont._i_d_x_s_e_t.pair(_c_o_l.index()); │ │ │ │ │ -543 assert(index); │ │ │ │ │ -544 // Only send index if col is no ghost │ │ │ │ │ -545 if ( index->local().attribute() != 2) │ │ │ │ │ -546 return index->global(); │ │ │ │ │ -547 else { │ │ │ │ │ -548 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ -549 return _n_u_m_l_i_m_i_t_s; │ │ │ │ │ -550 } │ │ │ │ │ -551 } │ │ │ │ │ -552 } │ │ │ │ │ -_5_5_3 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const _G_l_o_b_a_l_I_n_d_e_x& gi, std::size_t i, │ │ │ │ │ -[[maybe_unused]] std::size_t j) │ │ │ │ │ -554 { │ │ │ │ │ -555 try{ │ │ │ │ │ -556 if (gi != std::numeric_limits::max()) { │ │ │ │ │ -557 const typename I::IndexPair& ip=cont._a_g_g_i_d_x_s_e_t.at(gi); │ │ │ │ │ -558 assert(ip.global()==gi); │ │ │ │ │ -559 std::size_t column = ip.local(); │ │ │ │ │ -560 cont._s_p_a_r_s_i_t_y[i].insert(column); │ │ │ │ │ -561 │ │ │ │ │ -562 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -OwnerSet; │ │ │ │ │ -563 if(!OwnerSet::contains(ip.local().attribute())) │ │ │ │ │ -564 // preserve symmetry for overlap │ │ │ │ │ -565 cont._s_p_a_r_s_i_t_y[column].insert(i); │ │ │ │ │ -566 } │ │ │ │ │ -567 } │ │ │ │ │ -568 catch(const Dune::RangeError&) { │ │ │ │ │ -569 // Entry not present in the new index set. Ignore! │ │ │ │ │ -570#ifdef DEBUG_REPART │ │ │ │ │ -571 typedef typename _C_o_n_t_a_i_n_e_r_:_:_L_o_o_k_u_p_I_n_d_e_x_S_e_t GlobalLookup; │ │ │ │ │ -572 typedef typename GlobalLookup::IndexPair IndexPair; │ │ │ │ │ -573 typedef typename _D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_i_n_t_>_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -OwnerSet; │ │ │ │ │ -574 │ │ │ │ │ -575 GlobalLookup lookup(cont._a_g_g_i_d_x_s_e_t); │ │ │ │ │ -576 const IndexPair* pi=lookup.pair(i); │ │ │ │ │ -577 assert(pi); │ │ │ │ │ -578 if(OwnerSet::contains(pi->local().attribute())) { │ │ │ │ │ -579 int rank; │ │ │ │ │ -580 MPI_Comm_rank(MPI_COMM_WORLD,&rank); │ │ │ │ │ -581 std::cout<global()< │ │ │ │ │ -591 typename _M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_C_o_l_I_t_e_r │ │ │ │ │ -_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_c_o_l; │ │ │ │ │ -592 │ │ │ │ │ -593 template │ │ │ │ │ -594 typename _M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_n_u_m_l_i_m_i_t_s; │ │ │ │ │ -595 │ │ │ │ │ -596 │ │ │ │ │ -597 template │ │ │ │ │ -_5_9_8 struct _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -599 { │ │ │ │ │ -_6_0_0 typedef typename I::GlobalIndex _G_l_o_b_a_l_I_n_d_e_x; │ │ │ │ │ -_6_0_1 typedef _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_> _C_o_n_t_a_i_n_e_r; │ │ │ │ │ -_6_0_2 typedef typename M::ConstColIterator _C_o_l_I_t_e_r; │ │ │ │ │ -_6_0_3 typedef typename std::pair _D_a_t_a; │ │ │ │ │ -_6_0_4 static _C_o_l_I_t_e_r _c_o_l; │ │ │ │ │ -_6_0_5 static _D_a_t_a _d_a_t_a_s_t_o_r_e; │ │ │ │ │ -_6_0_6 static _G_l_o_b_a_l_I_n_d_e_x _n_u_m_l_i_m_i_t_s; │ │ │ │ │ -607 │ │ │ │ │ -_6_0_8 static const _D_a_t_a& _g_a_t_h_e_r(const _C_o_n_t_a_i_n_e_r& cont, std::size_t i, std::size_t │ │ │ │ │ -j) │ │ │ │ │ -609 { │ │ │ │ │ -610 if(j==0) │ │ │ │ │ -611 _c_o_l=cont._m_a_t_r_i_x[i].begin(); │ │ │ │ │ -612 else if (_c_o_l!=cont._m_a_t_r_i_x[i].end()) │ │ │ │ │ -613 ++_c_o_l; │ │ │ │ │ -614 // copy communication: different row sizes for copy rows with the same │ │ │ │ │ -global index │ │ │ │ │ -615 // are possible. If all values of current matrix row are sent, send │ │ │ │ │ -616 // std::numeric_limits::max() │ │ │ │ │ -617 // and receiver will ignore it. │ │ │ │ │ -618 if (_c_o_l==cont._m_a_t_r_i_x[i].end()) { │ │ │ │ │ -619 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ -620 _d_a_t_a_s_t_o_r_e = _D_a_t_a(_n_u_m_l_i_m_i_t_s,*_c_o_l); │ │ │ │ │ -621 return _d_a_t_a_s_t_o_r_e; │ │ │ │ │ -622 } │ │ │ │ │ -623 else { │ │ │ │ │ -624 // convert local column index to global index │ │ │ │ │ -625 const typename I::IndexPair* index=cont._i_d_x_s_e_t.pair(_c_o_l.index()); │ │ │ │ │ -626 assert(index); │ │ │ │ │ -627 // Store the data to prevent reference to temporary │ │ │ │ │ -628 // Only send index if col is no ghost │ │ │ │ │ -629 if ( index->local().attribute() != 2) │ │ │ │ │ -630 _d_a_t_a_s_t_o_r_e = _D_a_t_a(index->global(),*_c_o_l); │ │ │ │ │ -631 else { │ │ │ │ │ -632 _n_u_m_l_i_m_i_t_s = std::numeric_limits::max(); │ │ │ │ │ -633 _d_a_t_a_s_t_o_r_e = _D_a_t_a(_n_u_m_l_i_m_i_t_s,*_c_o_l); │ │ │ │ │ -634 } │ │ │ │ │ -635 return _d_a_t_a_s_t_o_r_e; │ │ │ │ │ -636 } │ │ │ │ │ -637 } │ │ │ │ │ -_6_3_8 static void _s_c_a_t_t_e_r(_C_o_n_t_a_i_n_e_r& cont, const _D_a_t_a& data, std::size_t i, [ │ │ │ │ │ -[maybe_unused]] std::size_t j) │ │ │ │ │ -639 { │ │ │ │ │ -640 try{ │ │ │ │ │ -641 if (data.first != std::numeric_limits::max()) { │ │ │ │ │ -642 typename M::size_type column=cont._a_g_g_i_d_x_s_e_t.at(data.first).local(); │ │ │ │ │ -643 cont._m_a_t_r_i_x[i][column]=data.second; │ │ │ │ │ -644 } │ │ │ │ │ -645 } │ │ │ │ │ -646 catch(const Dune::RangeError&) { │ │ │ │ │ -647 // This an overlap row and might therefore lack some entries! │ │ │ │ │ -648 } │ │ │ │ │ -649 │ │ │ │ │ -650 } │ │ │ │ │ -651 }; │ │ │ │ │ -652 │ │ │ │ │ -653 template │ │ │ │ │ -654 typename _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_C_o_l_I_t_e_r _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_: │ │ │ │ │ -_c_o_l; │ │ │ │ │ -655 │ │ │ │ │ -656 template │ │ │ │ │ -657 typename _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_D_a_t_a _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_: │ │ │ │ │ -_d_a_t_a_s_t_o_r_e; │ │ │ │ │ -658 │ │ │ │ │ -659 template │ │ │ │ │ -660 typename _M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_<_M_,_I_>_:_:_n_u_m_l_i_m_i_t_s; │ │ │ │ │ -661 │ │ │ │ │ -662 template │ │ │ │ │ -_6_6_3 void _r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(M& origMatrix, M& newMatrix, C& origComm, │ │ │ │ │ -C& newComm, │ │ │ │ │ -664 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri) │ │ │ │ │ -665 { │ │ │ │ │ -666 typename C::CopySet copyflags; │ │ │ │ │ -667 typename C::OwnerSet ownerflags; │ │ │ │ │ -668 typedef typename C::ParallelIndexSet IndexSet; │ │ │ │ │ -669 typedef _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_> RI; │ │ │ │ │ -670 std::vector rowsize(newComm.indexSet().size(), 0); │ │ │ │ │ -671 std::vector copyrowsize(newComm.indexSet().size(), │ │ │ │ │ -0); │ │ │ │ │ -672 std::vector backwardscopyrowsize(origComm.indexSet │ │ │ │ │ -().size(), 0); │ │ │ │ │ -673 │ │ │ │ │ -674 // get owner rowsizes │ │ │ │ │ -675 _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> commRowSize(origMatrix, ri); │ │ │ │ │ -676 ri.template redistribute > │ │ │ │ │ -(commRowSize,commRowSize); │ │ │ │ │ -677 │ │ │ │ │ -678 origComm.buildGlobalLookup(); │ │ │ │ │ -679 │ │ │ │ │ -680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) { │ │ │ │ │ -681 rowsize[i] = ri._g_e_t_R_o_w_S_i_z_e(i); │ │ │ │ │ -682 } │ │ │ │ │ -683 // get sparsity pattern from owner rows │ │ │ │ │ -684 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ -685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet()); │ │ │ │ │ -686 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ -687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize); │ │ │ │ │ -688 │ │ │ │ │ -689 ri.template redistribute > │ │ │ │ │ -(origsp,newsp); │ │ │ │ │ -690 │ │ │ │ │ -691 // build copy to owner interface to get missing matrix values for novlp │ │ │ │ │ -case │ │ │ │ │ -692 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) { │ │ │ │ │ -693 RemoteIndices *ris = new RemoteIndices │ │ │ │ │ -(origComm.indexSet(), │ │ │ │ │ -694 newComm.indexSet(), │ │ │ │ │ -695 origComm.communicator()); │ │ │ │ │ -696 ris->template rebuild(); │ │ │ │ │ -697 │ │ │ │ │ -698 ri.getInterface().free(); │ │ │ │ │ -699 ri.getInterface().build(*ris,copyflags,ownerflags); │ │ │ │ │ -700 │ │ │ │ │ -701 // get copy rowsizes │ │ │ │ │ -702 _C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_<_M_,_R_I_> commRowSize_copy(origMatrix, ri); │ │ │ │ │ -703 ri.template redistribute > │ │ │ │ │ -(commRowSize_copy, │ │ │ │ │ -704 commRowSize_copy); │ │ │ │ │ -705 │ │ │ │ │ -706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) { │ │ │ │ │ -707 copyrowsize[i] = ri._g_e_t_C_o_p_y_R_o_w_S_i_z_e(i); │ │ │ │ │ -708 } │ │ │ │ │ -709 //get copy rowsizes for sender │ │ │ │ │ -710 ri._r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d(backwardscopyrowsize,copyrowsize); │ │ │ │ │ -711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) { │ │ │ │ │ -712 ri._g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(i) = backwardscopyrowsize[i]; │ │ │ │ │ -713 } │ │ │ │ │ -714 │ │ │ │ │ -715 // get sparsity pattern from copy rows │ │ │ │ │ -716 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> origsp_copy(origMatrix, │ │ │ │ │ -717 origComm.globalLookup(), │ │ │ │ │ -718 newComm.indexSet(), │ │ │ │ │ -719 backwardscopyrowsize); │ │ │ │ │ -720 _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_M_,_I_n_d_e_x_S_e_t_> newsp_copy(origMatrix, │ │ │ │ │ -origComm.globalLookup(), │ │ │ │ │ -721 newComm.indexSet(), copyrowsize); │ │ │ │ │ -722 ri.template redistribute > │ │ │ │ │ -(origsp_copy, │ │ │ │ │ -723 newsp_copy); │ │ │ │ │ -724 │ │ │ │ │ -725 newsp._c_o_m_p_l_e_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(newsp_copy._s_p_a_r_s_i_t_y); │ │ │ │ │ -726 newsp._s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(newMatrix); │ │ │ │ │ -727 } │ │ │ │ │ -728 else │ │ │ │ │ -729 newsp._s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(newMatrix); │ │ │ │ │ -730 │ │ │ │ │ -731#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ -732 // Check for symmetry │ │ │ │ │ -733 int ret=0; │ │ │ │ │ -734 typedef typename M::ConstRowIterator RIter; │ │ │ │ │ -735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row) │ │ │ │ │ -{ │ │ │ │ │ -736 typedef typename M::ConstColIterator CIter; │ │ │ │ │ -737 for(CIter _c_o_l=row->begin(), cend=row->end(); _c_o_l!=cend; ++_c_o_l) │ │ │ │ │ -738 { │ │ │ │ │ -739 try{ │ │ │ │ │ -740 newMatrix[_c_o_l.index()][row.index()]; │ │ │ │ │ -741 }catch(const _D_u_n_e_:_:_I_S_T_L_E_r_r_o_r&) { │ │ │ │ │ -742 std::cerr< │ │ │ │ │ -_7_5_7 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(M& origMatrix, M& newMatrix, C& origComm, C& │ │ │ │ │ -newComm, │ │ │ │ │ -758 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri) │ │ │ │ │ -759 { │ │ │ │ │ -760 typedef typename C::ParallelIndexSet IndexSet; │ │ │ │ │ -761 typename C::OwnerSet ownerflags; │ │ │ │ │ -762 std::vector rowsize(newComm.indexSet().size(), 0); │ │ │ │ │ -763 std::vector copyrowsize(newComm.indexSet().size(), │ │ │ │ │ -0); │ │ │ │ │ -764 std::vector backwardscopyrowsize(origComm.indexSet │ │ │ │ │ -().size(), 0); │ │ │ │ │ -765 │ │ │ │ │ -766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) { │ │ │ │ │ -767 rowsize[i] = ri._g_e_t_R_o_w_S_i_z_e(i); │ │ │ │ │ -768 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) { │ │ │ │ │ -769 copyrowsize[i] = ri._g_e_t_C_o_p_y_R_o_w_S_i_z_e(i); │ │ │ │ │ -770 } │ │ │ │ │ -771 } │ │ │ │ │ -772 │ │ │ │ │ -773 for (std::size_t i=0; i < origComm.indexSet().size(); i++) │ │ │ │ │ -774 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) │ │ │ │ │ -775 backwardscopyrowsize[i] = ri._g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e(i); │ │ │ │ │ -776 │ │ │ │ │ -777 │ │ │ │ │ -778 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) == _S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g) { │ │ │ │ │ -779 // fill sparsity pattern from copy rows │ │ │ │ │ -780 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> origrow_copy(origMatrix, origComm.globalLookup(), │ │ │ │ │ -781 newComm.indexSet(), backwardscopyrowsize); │ │ │ │ │ -782 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> newrow_copy(newMatrix, origComm.globalLookup(), │ │ │ │ │ -783 newComm.indexSet(),copyrowsize); │ │ │ │ │ -784 ri.template redistribute >(origrow_copy, │ │ │ │ │ -785 newrow_copy); │ │ │ │ │ -786 ri.getInterface().free(); │ │ │ │ │ -787 RemoteIndices *ris = new RemoteIndices │ │ │ │ │ -(origComm.indexSet(), │ │ │ │ │ -788 newComm.indexSet(), │ │ │ │ │ -789 origComm.communicator()); │ │ │ │ │ -790 ris->template rebuild(); │ │ │ │ │ -791 ri.getInterface().build(*ris,ownerflags,ownerflags); │ │ │ │ │ -792 } │ │ │ │ │ -793 │ │ │ │ │ -794 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ -795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet()); │ │ │ │ │ -796 _C_o_m_m_M_a_t_r_i_x_R_o_w_<_M_,_I_n_d_e_x_S_e_t_> │ │ │ │ │ -797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize); │ │ │ │ │ -798 ri.template redistribute > │ │ │ │ │ -(origrow,newrow); │ │ │ │ │ -799 if (_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y(origComm) != static_cast(_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_: │ │ │ │ │ -_n_o_n_o_v_e_r_l_a_p_p_i_n_g)) │ │ │ │ │ -800 newrow._s_e_t_O_v_e_r_l_a_p_R_o_w_s_T_o_D_i_r_i_c_h_l_e_t(); │ │ │ │ │ -801 } │ │ │ │ │ -802 │ │ │ │ │ -819 template │ │ │ │ │ -_8_2_0 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(M& origMatrix, M& newMatrix, C& origComm, C& │ │ │ │ │ -newComm, │ │ │ │ │ -821 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_C_>& ri) │ │ │ │ │ -822 { │ │ │ │ │ -823 ri._s_e_t_N_o_R_o_w_s(newComm.indexSet().size()); │ │ │ │ │ -824 ri._s_e_t_N_o_C_o_p_y_R_o_w_s(newComm.indexSet().size()); │ │ │ │ │ -825 ri._s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s(origComm.indexSet().size()); │ │ │ │ │ -826 _r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n(origMatrix, newMatrix, origComm, newComm, ri); │ │ │ │ │ -827 _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(origMatrix, newMatrix, origComm, newComm, ri); │ │ │ │ │ -828 } │ │ │ │ │ -829#endif │ │ │ │ │ -830 │ │ │ │ │ -831template │ │ │ │ │ -_8_3_2 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s(M& origMatrix, M& newMatrix, │ │ │ │ │ -833 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& origComm, │ │ │ │ │ -834 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& newComm, │ │ │ │ │ -835 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>& ri) │ │ │ │ │ -836 { │ │ │ │ │ -837 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential │ │ │ │ │ -program!"); │ │ │ │ │ -838 } │ │ │ │ │ -839 template │ │ │ │ │ -_8_4_0 void _r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x(M& origMatrix, M& newMatrix, │ │ │ │ │ -841 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& origComm, │ │ │ │ │ -842 _D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n& newComm, │ │ │ │ │ -843 _R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n_>& ri) │ │ │ │ │ -844 { │ │ │ │ │ -845 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential │ │ │ │ │ -program!"); │ │ │ │ │ -846 } │ │ │ │ │ -847} │ │ │ │ │ -848#endif │ │ │ │ │ -_p_i_n_f_o_._h_h │ │ │ │ │ -_r_e_p_a_r_t_i_t_i_o_n_._h_h │ │ │ │ │ -Functionality for redistributing a parallel index set using graph partitioning. │ │ │ │ │ -_o_w_n_e_r_o_v_e_r_l_a_p_c_o_p_y_._h_h │ │ │ │ │ -Classes providing communication interfaces for overlapping Schwarz methods. │ │ │ │ │ -_c_o_l │ │ │ │ │ -Col col │ │ │ │ │ -DDeeffiinniittiioonn matrixmatrix.hh:351 │ │ │ │ │ +516#endif │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn allocator.hh:11 │ │ │ │ │ -_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x_E_n_t_r_i_e_s │ │ │ │ │ -void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ -&newComm, RedistributeInformation< C > &ri) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:757 │ │ │ │ │ -_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C │ │ │ │ │ -&newComm, RedistributeInformation< C > &ri) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:663 │ │ │ │ │ -_D_u_n_e_:_:_r_e_d_i_s_t_r_i_b_u_t_e_M_a_t_r_i_x │ │ │ │ │ -void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, │ │ │ │ │ -RedistributeInformation< C > &ri) │ │ │ │ │ -Redistribute a matrix according to given domain decompositions. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:820 │ │ │ │ │ -_D_u_n_e_:_:_I_S_T_L_E_r_r_o_r │ │ │ │ │ -derive error class from the base class in common │ │ │ │ │ -DDeeffiinniittiioonn istlexception.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:22 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s │ │ │ │ │ -void setNoBackwardsCopyRows(std::size_t size) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_d_i_s_t_r_i_b_u_t_e │ │ │ │ │ -void redistribute(const D &from, D &to) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_s_e_t_S_e_t_u_p │ │ │ │ │ -void resetSetup() │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_e_t_N_o_C_o_p_y_R_o_w_s │ │ │ │ │ -void setNoCopyRows(std::size_t size) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_i_s_S_e_t_u_p │ │ │ │ │ -bool isSetup() const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:23 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_s_e_t_N_o_R_o_w_s │ │ │ │ │ -void setNoRows(std::size_t size) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ -void redistributeBackward(D &from, const D &to) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t getBackwardsCopyRowSize(std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_g_e_t_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t getRowSize(std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_:_:_g_e_t_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t getCopyRowSize(std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t getRowSize(std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t & getBackwardsCopyRowSize(std::size_t index) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_I_n_t_e_r_f_a_c_e │ │ │ │ │ -RedistributeInterface & getInterface() │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_r_e_d_i_s_t_r_i_b_u_t_e │ │ │ │ │ -void redistribute(const D &from, D &to) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_s_e_t_N_o_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_s │ │ │ │ │ -void setNoBackwardsCopyRows(std::size_t rows) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:193 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t & getCopyRowSize(std::size_t index) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -RedistributeInformation() │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t getCopyRowSize(std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_s_e_t_N_o_R_o_w_s │ │ │ │ │ -void setNoRows(std::size_t rows) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_r_e_s_e_r_v_e │ │ │ │ │ -void reserve(std::size_t size) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_:_C_o_m_m │ │ │ │ │ -OwnerOverlapCopyCommunication< T, T1 > Comm │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_s_e_t_N_o_C_o_p_y_R_o_w_s │ │ │ │ │ -void setNoCopyRows(std::size_t rows) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ -void redistributeBackward(D &from, const D &to) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_s_e_t_S_e_t_u_p │ │ │ │ │ -void setSetup() │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_B_a_c_k_w_a_r_d_s_C_o_p_y_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t getBackwardsCopyRowSize(std::size_t index) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_r_e_d_i_s_t_r_i_b_u_t_e │ │ │ │ │ -void redistribute(const D &from, D &to) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_r_e_s_e_t_S_e_t_u_p │ │ │ │ │ -void resetSetup() │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_r_e_d_i_s_t_r_i_b_u_t_e_B_a_c_k_w_a_r_d │ │ │ │ │ -void redistributeBackward(D &from, const D &to) const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_c_h_e_c_k_I_n_t_e_r_f_a_c_e │ │ │ │ │ -void checkInterface(const IS &source, const IS &target, MPI_Comm comm) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_i_s_S_e_t_u_p │ │ │ │ │ -bool isSetup() const │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_f_o_r_m_a_t_i_o_n_<_ _O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_<_ _T_,_ _T_1_ _>_ _>_:_: │ │ │ │ │ -_g_e_t_R_o_w_S_i_z_e │ │ │ │ │ -std::size_t & getRowSize(std::size_t index) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e │ │ │ │ │ -Utility class to communicate and set the row sizes of a redistributed matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:216 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -M::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -M::size_type value_type │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:218 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_r_o_w_s_i_z_e │ │ │ │ │ -RI & rowsize │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_m_a_t_r_i_x │ │ │ │ │ -const M & matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_S_i_z_e │ │ │ │ │ -CommMatrixRowSize(const M &m_, RI &rowsize_) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -Utility class to communicate and build the sparsity pattern of a redistributed │ │ │ │ │ -matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -M::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_i_d_x_s_e_t │ │ │ │ │ -const Dune::GlobalLookupIndexSet< I > & idxset │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:356 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_s_t_o_r_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -void storeSparsityPattern(M &m) │ │ │ │ │ -Creates and stores the sparsity pattern of the redistributed matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_a_g_g_i_d_x_s_e_t │ │ │ │ │ -const I & aggidxset │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:357 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_r_o_w_s_i_z_e │ │ │ │ │ -const std::vector< size_type > * rowsize │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_c_o_m_p_l_e_t_e_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -void completeSparsityPattern(std::vector< std::set< size_type > > add_sparsity) │ │ │ │ │ -Completes the sparsity pattern of the redistributed matrix with data from copy │ │ │ │ │ -rows for the novlp cas... │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > │ │ │ │ │ -&idxset_, const I &aggidxset_) │ │ │ │ │ -Constructor for the original side. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_m_a_t_r_i_x │ │ │ │ │ -const M & matrix │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:354 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n │ │ │ │ │ -CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > │ │ │ │ │ -&idxset_, const I &aggidxset_, const std::vector< typename M::size_type > │ │ │ │ │ -&rowsize_) │ │ │ │ │ -Constructor for the redistruted side. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:265 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_s_p_a_r_s_i_t_y │ │ │ │ │ -std::vector< std::set< size_type > > sparsity │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:358 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_:_:_L_o_o_k_u_p_I_n_d_e_x_S_e_t │ │ │ │ │ -Dune::GlobalLookupIndexSet< I > LookupIndexSet │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_g_e_t_S_i_z_e │ │ │ │ │ -static M::size_type getSize(const Type &t, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:376 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -CommMatrixSparsityPattern< M, I > Type │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ -I::GlobalIndex IndexedType │ │ │ │ │ -The indexed type we send. This is the global index indentitfying the column. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ -VariableSize IndexedTypeFlag │ │ │ │ │ -Each row varies in size. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:374 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ -Utility class for comunicating the matrix entries. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:396 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_r_o_w_s_i_z_e │ │ │ │ │ -std::vector< size_t > * rowsize │ │ │ │ │ -row size information for the receiving side. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:452 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_m_a_t_r_i_x │ │ │ │ │ -M & matrix │ │ │ │ │ -The matrix to communicate the values of. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:446 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ -CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I │ │ │ │ │ -&aggidxset_, std::vector< size_t > &rowsize_) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:412 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_i_d_x_s_e_t │ │ │ │ │ -const Dune::GlobalLookupIndexSet< I > & idxset │ │ │ │ │ -Index set for the original matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:448 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_s_e_t_O_v_e_r_l_a_p_R_o_w_s_T_o_D_i_r_i_c_h_l_e_t │ │ │ │ │ -void setOverlapRowsToDirichlet() │ │ │ │ │ -Sets the non-owner rows correctly as Dirichlet boundaries. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:421 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_a_g_g_i_d_x_s_e_t │ │ │ │ │ -const I & aggidxset │ │ │ │ │ -Index set for the redistributed matrix. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:450 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w_:_:_C_o_m_m_M_a_t_r_i_x_R_o_w │ │ │ │ │ -CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I │ │ │ │ │ -&aggidxset_) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:405 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e │ │ │ │ │ -std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType │ │ │ │ │ -The indexed type we send. This is the pair of global index indentitfying the │ │ │ │ │ -column and the value its... │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:464 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_T_y_p_e │ │ │ │ │ -CommMatrixRow< M, I > Type │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:458 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_g_e_t_S_i_z_e │ │ │ │ │ -static std::size_t getSize(const Type &t, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:469 │ │ │ │ │ -_D_u_n_e_:_:_C_o_m_m_P_o_l_i_c_y_<_ _C_o_m_m_M_a_t_r_i_x_R_o_w_<_ _M_,_ _I_ _>_ _>_:_:_I_n_d_e_x_e_d_T_y_p_e_F_l_a_g │ │ │ │ │ -VariableSize IndexedTypeFlag │ │ │ │ │ -Each row varies in size. │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:467 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:483 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(Container &cont, const typename M::size_type &rowsize, │ │ │ │ │ -std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:490 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static const M::size_type gather(const Container &cont, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:486 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ -CommMatrixRowSize< M, RI > Container │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:484 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:500 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static const M::size_type gather(const Container &cont, std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:503 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(Container &cont, const typename M::size_type &rowsize, │ │ │ │ │ -std::size_t i) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:507 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_C_o_p_y_R_o_w_S_i_z_e_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ -CommMatrixRowSize< M, RI > Container │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:501 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:518 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_l_I_t_e_r │ │ │ │ │ -M::ConstColIterator ColIter │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:521 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i, │ │ │ │ │ -std::size_t j) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:553 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ -CommMatrixSparsityPattern< M, I > Container │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_n_u_m_l_i_m_i_t_s │ │ │ │ │ -static GlobalIndex numlimits │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:524 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_c_o_l │ │ │ │ │ -static ColIter col │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:523 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -I::GlobalIndex GlobalIndex │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:519 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_S_p_a_r_s_i_t_y_P_a_t_t_e_r_n_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static const GlobalIndex & gather(const Container &cont, std::size_t i, std:: │ │ │ │ │ -size_t j) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:599 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_G_l_o_b_a_l_I_n_d_e_x │ │ │ │ │ -I::GlobalIndex GlobalIndex │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:600 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_d_a_t_a_s_t_o_r_e │ │ │ │ │ -static Data datastore │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:605 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_n_u_m_l_i_m_i_t_s │ │ │ │ │ -static GlobalIndex numlimits │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:606 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_l_I_t_e_r │ │ │ │ │ -M::ConstColIterator ColIter │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:602 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_g_a_t_h_e_r │ │ │ │ │ -static const Data & gather(const Container &cont, std::size_t i, std::size_t j) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:608 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_D_a_t_a │ │ │ │ │ -std::pair< GlobalIndex, typename M::block_type > Data │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:603 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_s_c_a_t_t_e_r │ │ │ │ │ -static void scatter(Container &cont, const Data &data, std::size_t i, std:: │ │ │ │ │ -size_t j) │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:638 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_c_o_l │ │ │ │ │ -static ColIter col │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:604 │ │ │ │ │ -_D_u_n_e_:_:_M_a_t_r_i_x_R_o_w_G_a_t_h_e_r_S_c_a_t_t_e_r_:_:_C_o_n_t_a_i_n_e_r │ │ │ │ │ -CommMatrixRow< M, I > Container │ │ │ │ │ -DDeeffiinniittiioonn matrixredistribute.hh:601 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n │ │ │ │ │ -A class setting up standard communication for a two-valued attribute set with │ │ │ │ │ -owner/overlap/copy sema... │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_O_w_n_e_r_O_v_e_r_l_a_p_C_o_p_y_C_o_m_m_u_n_i_c_a_t_i_o_n_:_:_O_w_n_e_r_S_e_t │ │ │ │ │ -EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet │ │ │ │ │ -DDeeffiinniittiioonn owneroverlapcopy.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_A_m_g_:_:_S_e_q_u_e_n_t_i_a_l_I_n_f_o_r_m_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn pinfo.hh:28 │ │ │ │ │ -_D_u_n_e_:_:_R_e_d_i_s_t_r_i_b_u_t_e_I_n_t_e_r_f_a_c_e │ │ │ │ │ -DDeeffiinniittiioonn repartition.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_n_o_n_o_v_e_r_l_a_p_p_i_n_g │ │ │ │ │ -@ nonoverlapping │ │ │ │ │ -Category for non-overlapping solvers. │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_S_o_l_v_e_r_C_a_t_e_g_o_r_y_:_:_c_a_t_e_g_o_r_y │ │ │ │ │ -static Category category(const OP &op, decltype(op.category()) *=nullptr) │ │ │ │ │ -Helperfunction to extract the solver category either from an enum, or from the │ │ │ │ │ -newly introduced virtu... │ │ │ │ │ -DDeeffiinniittiioonn solvercategory.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ +A multiple of the identity matrix of static size. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ │ +void usmhv(const K &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^H x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ │ +void mmtv(const X &x, Y &y) const │ │ │ │ │ +y -= A^T x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:305 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ │ +ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y) │ │ │ │ │ +vector space subtraction │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +const_row_type::ConstIterator ConstColIterator │ │ │ │ │ +rename the iterators for easier access │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +ConstIterator end() const │ │ │ │ │ +end iterator │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +Iterator beforeBegin() │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const ScaledIdentityMatrix &other) const │ │ │ │ │ +incomparison operator │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ │ +void mmv(const X &x, Y &y) const │ │ │ │ │ +y -= A x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +The type used for the index access and size operations. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ │ +void usmv(const K &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:329 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ │ +row_type::Iterator ColIterator │ │ │ │ │ +rename the iterators for easier access │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +const_row_type const_reference │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_v │ │ │ │ │ +void mv(const X &x, Y &y) const │ │ │ │ │ +y = A x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:238 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ │ +void umtv(const X &x, Y &y) const │ │ │ │ │ +y += A^T x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:269 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ │ +void umhv(const X &x, Y &y) const │ │ │ │ │ +y += A^H x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ │ +DiagonalRowVector< K, n > row_type │ │ │ │ │ +Each row is implemented by a field vector. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +ContainerWrapperIterator< const WrapperType, reference, reference > Iterator │ │ │ │ │ +Iterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +Iterator beforeEnd() │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_d_e_t_e_r_m_i_n_a_n_t │ │ │ │ │ +K determinant() const │ │ │ │ │ +calculates the determinant of this matrix │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:408 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +K field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ │ +void usmtv(const K &alpha, const X &x, Y &y) const │ │ │ │ │ +y += alpha A^T x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:341 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ │ +Iterator end() │ │ │ │ │ +end iterator │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Iterator iterator │ │ │ │ │ +typedef for stl compliant access │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_c_a_l_a_r │ │ │ │ │ +const K & scalar() const │ │ │ │ │ +Get const reference to the scalar diagonal value. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:477 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ │ +void umv(const X &x, Y &y) const │ │ │ │ │ +y += A x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:257 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ │ +static constexpr std::size_t blocklevel │ │ │ │ │ +We are at the leaf of the block recursion. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ +const K & diagonal(size_type) const │ │ │ │ │ +Get const reference to diagonal entry. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:464 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_r_o_w_s │ │ │ │ │ +@ rows │ │ │ │ │ +The number of rows. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_l_s │ │ │ │ │ +@ cols │ │ │ │ │ +The number of columns. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +ScaledIdentityMatrix & operator=(const K &k) │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ │ +ContainerWrapperIterator< const WrapperType, const_reference, const_reference > │ │ │ │ │ +ConstIterator │ │ │ │ │ +Iterator class for sequential access. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_d_i_a_g_o_n_a_l │ │ │ │ │ +K & diagonal(size_type) │ │ │ │ │ +Get reference to diagonal entry. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:470 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ │ +void solve(V &x, const V &b) const │ │ │ │ │ +Solve system A x = b. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:394 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ │ +bool exists(size_type i, size_type j) const │ │ │ │ │ +return true when (i,j) is in pattern │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:429 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +Iterator RowIterator │ │ │ │ │ +rename the iterators for easier access │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator const_iterator │ │ │ │ │ +typedef for stl compliant access │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ +ScaledIdentityMatrix() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const ScaledIdentityMatrix &other) const │ │ │ │ │ +comparison operator │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:223 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ │ +ConstIterator beforeBegin() const │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ │ +ScaledIdentityMatrix & operator/=(const K &k) │ │ │ │ │ +vector space division by scalar │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix< │ │ │ │ │ +K, n > &a) │ │ │ │ │ +Sends the matrix to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:441 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm2() const │ │ │ │ │ +square of frobenius norm, need for block recursion │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:372 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type frobenius_norm() const │ │ │ │ │ +frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:366 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ │ +FieldTraits< field_type >::real_type infinity_norm() const │ │ │ │ │ +infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:378 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ │ +ConstIterator ConstRowIterator │ │ │ │ │ +rename the iterators for easier access │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_M │ │ │ │ │ +size_type M() const │ │ │ │ │ +number of blocks in column direction │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:421 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const_reference operator[](size_type i) const │ │ │ │ │ +Return const_reference object as row replacement. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:458 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x │ │ │ │ │ +ScaledIdentityMatrix(const K &k) │ │ │ │ │ +Constructor initializing the whole matrix with a scalar. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ │ +friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar) │ │ │ │ │ +vector space multiplication with scalar │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ │ +FieldTraits< field_type >::real_type infinity_norm_real() const │ │ │ │ │ +simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:384 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ │ +ScaledIdentityMatrix & operator*=(const K &k) │ │ │ │ │ +vector space multiplication with scalar │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_d_e_n_t_i_c_a_l │ │ │ │ │ +bool identical(const ScaledIdentityMatrix< K, n > &other) const │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_i_n_v_e_r_t │ │ │ │ │ +void invert() │ │ │ │ │ +Compute inverse. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:402 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +Iterator begin() │ │ │ │ │ +begin iterator │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:98 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_s_c_a_l_a_r │ │ │ │ │ +K & scalar() │ │ │ │ │ +Get reference to the scalar diagonal value. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:484 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +row_type reference │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ │ +K block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ │ +void mmhv(const X &x, Y &y) const │ │ │ │ │ +y -= A^H x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:317 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ │ +ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y) │ │ │ │ │ +vector space addition │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_c_o_n_s_t___r_o_w___t_y_p_e │ │ │ │ │ +DiagonalRowVectorConst< K, n > const_row_type │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ │ +void mtv(const X &x, Y &y) const │ │ │ │ │ +y = A^T x │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:250 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +reference operator[](size_type i) │ │ │ │ │ +Return reference object as row replacement. │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:452 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ │ +ConstIterator begin() const │ │ │ │ │ +begin iterator │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_:_:_N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of blocks in row direction │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:415 │ │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r_<_ _D_e_n_s_e_M_a_t_r_i_x_,_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _f_i_e_l_d_,_ _N_ _>_ _>_:_: │ │ │ │ │ +_a_p_p_l_y │ │ │ │ │ +static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > │ │ │ │ │ +const &rhs) │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:497 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ │ +typename ScaledIdentityMatrix< K, n >::field_type field_type │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:510 │ │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _S_c_a_l_e_d_I_d_e_n_t_i_t_y_M_a_t_r_i_x_<_ _K_,_ _n_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ │ +typename FieldTraits< field_type >::real_type real_type │ │ │ │ │ +DDeeffiinniittiioonn scaledidmatrix.hh:511 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00233.html │ │ │ │ @@ -105,25 +105,25 @@ │ │ │ │   │ │ │ │  Sparse Matrix and Vector classes │ │ │ │  Matrix and Vector classes that support a block recursive structure capable of representing the natural structure from Finite Element discretisations.
│ │ │ │   │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  ldl.hh
 Class for using LDL with ISTL matrices.
file  ldl.hh
 Class for using LDL with ISTL matrices.
 
file  spqr.hh
 Class for using SPQR with ISTL matrices.
file  spqr.hh
 Class for using SPQR with ISTL matrices.
 
file  superlu.hh
 Classes for using SuperLU with ISTL matrices.
file  superlu.hh
 Classes for using SuperLU with ISTL matrices.
 
file  umfpack.hh
 Classes for using UMFPack with ISTL matrices.
file  umfpack.hh
 Classes for using UMFPack with ISTL matrices.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00234.html │ │ │ │ @@ -104,19 +104,19 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::ILUSubdomainSolver< M, X, Y >
 base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver. More...
 
 
 Scalar products
 Scalar products for the use in iterative solvers.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  solver.hh
 Define general, extensible interface for inverse operators.
file  solver.hh
 Define general, extensible interface for inverse operators.
 
file  solvers.hh
 Implementations of the inverse operator interface.
file  solvers.hh
 Implementations of the inverse operator interface.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00236.html │ │ │ │ @@ -84,16 +84,16 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::InverseOperatorResult
 Statistics about the application of an inverse operator. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  owneroverlapcopy.hh
 Classes providing communication interfaces for overlapping Schwarz methods.
file  owneroverlapcopy.hh
 Classes providing communication interfaces for overlapping Schwarz methods.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00237.html │ │ │ │ @@ -105,19 +105,19 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::OwnerOverlapCopyAttributeSet
 Attribute set for overlapping Schwarz. More...
 
 Provides methods for reading and writing matrices and vectors in various formats.
 
 DenseMatVec
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  matrixmatrix.hh
 provides functions for sparse matrix matrix multiplication.
file  matrixmatrix.hh
 provides functions for sparse matrix matrix multiplication.
 
file  matrixutils.hh
 Some handy generic functions for ISTL matrices.
file  matrixutils.hh
 Some handy generic functions for ISTL matrices.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00239.html │ │ │ │ @@ -83,16 +83,16 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::MatrixDimension< M >
 
struct  Dune::CompressionStatistics< size_type >
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  operators.hh
 Define general, extensible interface for operators. The available implementation wraps a matrix.
file  operators.hh
 Define general, extensible interface for operators. The available implementation wraps a matrix.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00240.html │ │ │ │ @@ -93,61 +93,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::NonoverlappingSchwarzOperator< M, X, Y, C >
 A nonoverlapping operator with communication object. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  aggregates.hh
 Provides classes for the Coloring process of AMG.
file  aggregates.hh
 Provides classes for the Coloring process of AMG.
 
file  amg.hh
 The AMG preconditioner.
file  amg.hh
 The AMG preconditioner.
 
file  construction.hh
 Helper classes for the construction of classes without empty constructor.
file  construction.hh
 Helper classes for the construction of classes without empty constructor.
 
file  dependency.hh
 Provides classes for initializing the link attributes of a matrix graph.
file  dependency.hh
 Provides classes for initializing the link attributes of a matrix graph.
 
file  galerkin.hh
 Provides a class for building the galerkin product based on a aggregation scheme.
file  galerkin.hh
 Provides a class for building the galerkin product based on a aggregation scheme.
 
file  globalaggregates.hh
 Provdes class for identifying aggregates globally.
file  globalaggregates.hh
 Provdes class for identifying aggregates globally.
 
file  graph.hh
 Provides classes for building the matrix graph.
file  graph.hh
 Provides classes for building the matrix graph.
 
file  hierarchy.hh
 Provides a classes representing the hierarchies in AMG.
file  hierarchy.hh
 Provides a classes representing the hierarchies in AMG.
 
file  indicescoarsener.hh
 Provides a class for building the index set and remote indices on the coarse level.
file  indicescoarsener.hh
 Provides a class for building the index set and remote indices on the coarse level.
 
file  kamg.hh
 Provides an algebraic multigrid using a Krylov cycle.
file  kamg.hh
 Provides an algebraic multigrid using a Krylov cycle.
 
file  matrixhierarchy.hh
 Provides a classes representing the hierarchies in AMG.
file  matrixhierarchy.hh
 Provides a classes representing the hierarchies in AMG.
 
file  parameters.hh
 Parameter classes for customizing AMG.
file  parameters.hh
 Parameter classes for customizing AMG.
 
file  properties.hh
 Provides classes for handling internal properties in a graph.
file  properties.hh
 Provides classes for handling internal properties in a graph.
 
file  smoother.hh
 Classes for the generic construction and application of the smoothers.
file  smoother.hh
 Classes for the generic construction and application of the smoothers.
 
file  transfer.hh
 Prolongation and restriction for amg.
file  transfer.hh
 Prolongation and restriction for amg.
 
file  twolevelmethod.hh
 Algebraic twolevel methods.
file  twolevelmethod.hh
 Algebraic twolevel methods.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00242.html │ │ │ │ @@ -98,19 +98,19 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Amg
 
 Fast (sequential) Algebraic Multigrid
 An Algebraic Multigrid based on Agglomeration that saves memory bandwidth.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  overlappingschwarz.hh
 Contains one level overlapping Schwarz preconditioners.
file  overlappingschwarz.hh
 Contains one level overlapping Schwarz preconditioners.
 
file  preconditioners.hh
 Define general preconditioner interface.
file  preconditioners.hh
 Define general preconditioner interface.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00243.html │ │ │ │ @@ -86,16 +86,16 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::NonoverlappingBlockPreconditioner< C, P >
 Nonoverlapping parallel preconditioner. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  scalarproducts.hh
 Define base class for scalar product and norm.
file  scalarproducts.hh
 Define base class for scalar product and norm.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a00246.html │ │ │ │ @@ -89,19 +89,19 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::ScalarProduct< X >
 Base class for scalar product and norm computation. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  io.hh
 Some generic functions for pretty printing vectors and matrices.
file  io.hh
 Some generic functions for pretty printing vectors and matrices.
 
file  matrixmarket.hh
 Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
file  matrixmarket.hh
 Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune::MatrixMarketImpl
 
│ │ │ │ @@ -315,16 +315,16 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ inline
│ │ │ │
│ │ │ │ │ │ │ │

Print a row of zeros for a non-existing block.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ -
Some generic functions for pretty printing vectors and matrices.
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │ +
Some generic functions for pretty printing vectors and matrices.
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ loadMatrixMarket() [1/2]

│ │ │ │ │ │ │ │
│ │ │ │ @@ -743,15 +743,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Print one row of a matrix, specialization for number types.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ print_row() [2/2]

│ │ │ │ │ │ │ │
│ │ │ │ @@ -812,15 +812,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Print one row of a matrix.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ printmatrix()

│ │ │ │ │ │ │ │
│ │ │ │ @@ -869,15 +869,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Print a generic block matrix.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │
Bug:
Empty rows and columns are omitted by this method. (FlySpray #7)
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ printSparseMatrix()

│ │ │ │ │ │ │ │ @@ -927,15 +927,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Prints a BCRSMatrix with fixed sized blocks.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │

Only the nonzero entries will be printed as matrix blocks together with their corresponding column index and all others will be omitted.

│ │ │ │

This might be preferable over printmatrix in the case of big sparse matrices with nonscalar blocks.

│ │ │ │
Parameters
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1003,15 +1003,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
sThe ostream to print to.
matThe matrix to print.
titleThe title for the matrix.
)
│ │ │ │
│ │ │ │ │ │ │ │

Print an ISTL vector.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ readMatrixMarket() [1/2]

│ │ │ │ │ │ │ │
│ │ │ │ @@ -1140,15 +1140,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Recursively print a vector.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ storeMatrixMarket() [1/2]

│ │ │ │ │ │ │ │
│ │ │ │ @@ -1391,15 +1391,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Writes sparse matrix in a Matlab-readable format.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │

This routine writes the argument BCRSMatrix to a file with the name given by the filename argument. The file format is ASCII, with no header, and three data columns. Each row describes a scalar matrix entry and consists of the matrix row and column numbers (both counted starting from 1), and the matrix entry. Such a file can be read from Matlab using the command

new_mat = spconvert(load('filename'));
│ │ │ │
Parameters
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
matrixreference to matrix
filename
outputPrecision(number of digits) which is used to write the output file
│ │ │ │ @@ -1451,15 +1451,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper method for the writeMatrixToMatlab routine.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │

This specialization for numbers ends the recursion

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

◆ writeMatrixToMatlabHelper() [2/2]

│ │ │ │ │ │ │ │ @@ -1503,15 +1503,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper method for the writeMatrixToMatlab routine.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

◆ writeSVGMatrix()

│ │ │ │ │ │ │ │
│ │ │ │ @@ -1596,15 +1596,15 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Writes vectors in a Matlab-readable format.

│ │ │ │ -
#include <dune/istl/io.hh>
│ │ │ │ +
#include <dune/istl/io.hh>
│ │ │ │

This routine writes the argument block vector to a file with the name given by the filename argument. The file format is ASCII, with no header, and a single data column. Such a file can be read from Matlab using the command

new_vec = load('filename');
│ │ │ │
Parameters
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
vectorreference to vector to be printed to output file
filenamefilename of output file
outputPrecision(number of digits) which is used to write the output file
│ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01084.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::exists< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/allocator.hh>

│ │ │ │ +

#include <dune/istl/allocator.hh>

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

│ │ │ │ Static Public Attributes

static const bool value = true
 
│ │ │ │

Member Data Documentation

│ │ │ │ @@ -109,15 +109,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01088.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::DefaultAllocatorTraits< T, typename > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/allocator.hh>

│ │ │ │ +

#include <dune/istl/allocator.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::DefaultAllocatorTraits< T, typename >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -111,15 +111,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01092.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/allocator.hh>

│ │ │ │ +

#include <dune/istl/allocator.hh>

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

│ │ │ │ Public Types

using type = typename T::allocator_type
 
│ │ │ │

Member Typedef Documentation

│ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01096.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::AllocatorTraits< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/allocator.hh>

│ │ │ │ +

#include <dune/istl/allocator.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::AllocatorTraits< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01120.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::OverlappingSchwarzInitializer< I, S, D > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Initializer for SuperLU Matrices representing the subdomains. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -255,16 +255,16 @@ │ │ │ │
│ │ │ │ │ │ │ │

The vector type containing the subdomain to row index mapping.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01136.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixDimension< M > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │

│ │ │ │ Public Types

typedef D subdomain_vector
 The vector type containing the subdomain to row index mapping.
 
typedef I InitializerList
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -143,16 +143,16 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static auto rowdim (const M &A)
 
static auto coldim (const M &A)
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following files: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01140.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::CompressionStatistics< size_type > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Statistics about compression achieved in implicit mode. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -175,15 +175,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

total number of elements written to the overflow area during construction.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01144.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::ImplicitMatrixBuilder< M_ > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mode. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │

│ │ │ │ Public Attributes

double avg
 average number of non-zeroes per row.
 
size_type maximum
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  row_object
 Proxy row object for entry access. More...
 
│ │ │ │ @@ -376,15 +376,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Returns a proxy for entries in row i.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01148.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::ImplicitMatrixBuilder< M_ >::row_object Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Proxy row object for entry access. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

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

│ │ │ │ Public Member Functions

block_typeoperator[] (size_type j) const
 Returns entry in column j.
 
│ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Returns entry in column j.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01152.html │ │ │ │ @@ -85,15 +85,15 @@ │ │ │ │
Dune::BCRSMatrix< B, A > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A sparse block matrix with compressed row storage. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BCRSMatrix< B, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -451,15 +451,15 @@ │ │ │ │

Error checking: no error checking is provided normally. Setting the compile time switch DUNE_ISTL_WITH_CHECKING enables error checking.

│ │ │ │

Details:

│ │ │ │
    │ │ │ │
  1. Row-wise scheme
  2. │ │ │ │
│ │ │ │

Rows are built up in sequential order. Size of the row and the column indices are defined. A row can be used as soon as it is initialized. With respect to memory there are two variants of this scheme: (a) number of non-zeroes known in advance (application finite difference schemes), (b) number of non-zeroes not known in advance (application: Sparse LU, ILU(n)).

│ │ │ │
#include<dune/common/fmatrix.hh>
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
...
│ │ │ │
│ │ │ │ │ │ │ │
// third parameter is an optional upper bound for the number
│ │ │ │
// of nonzeros. If given the matrix will use one array for all values
│ │ │ │
// as opposed to one for each row.
│ │ │ │ @@ -476,25 +476,25 @@ │ │ │ │
row.insert(row.index()+1);
│ │ │ │
}
│ │ │ │
│ │ │ │
// Now the sparsity pattern is fully set up and we can add values
│ │ │ │
│ │ │ │
B[0][0]=2;
│ │ │ │
...
│ │ │ │ -
Implementation of the BCRSMatrix class.
│ │ │ │ +
Implementation of the BCRSMatrix class.
│ │ │ │
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
│ │ │ │
size_type M() const
number of columns (counted in blocks)
Definition bcrsmatrix.hh:1978
│ │ │ │
Iterator class for sequential creation of blocks
Definition bcrsmatrix.hh:957
│ │ │ │
Definition matrixutils.hh:27
│ │ │ │
    │ │ │ │
  1. Random scheme
  2. │ │ │ │
│ │ │ │

For general finite element implementations the number of rows n is known, the number of non-zeroes might also be known (e.g. #edges + #nodes for P2) but the size of a row and the indices of a row can not be defined in sequential order.

│ │ │ │
#include<dune/common/fmatrix.hh>
│ │ │ │ - │ │ │ │ + │ │ │ │
│ │ │ │
...
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
// initially set row size for each row
│ │ │ │ @@ -554,15 +554,15 @@ │ │ │ │ M_i = \textrm{avg} + A + \sum_{j<i} (\textrm{avg} - \textrm{nnz}_j) │ │ │ │ \]" src="form_23.png" width="178" height="29"/> │ │ │ │

│ │ │ │

for all $i$, where $ A = \textrm{avg}(n \cdot \textrm{compressionBufferSize}) $ is the total size of the compression buffer determined by the parameters explained above.

│ │ │ │

The data of the matrix is now located at the beginning of the allocated area, and covers what used to be the compression buffer. In exchange, there is now unused space at the end of the large allocated piece of memory. This will go unused and cannot be freed during the lifetime of the matrix, but it has no negative impact on run-time performance. No matrix entries may be added after the compression step.

│ │ │ │

The compress() method returns a value of type Dune::CompressionStatistics, which you can inspect to tune the construction parameters _avg and compressionBufferSize.

│ │ │ │

Use of copy constructor, assignment operator and matrix vector arithmetics are not supported until the matrix is fully built.

│ │ │ │ -

The following sample code constructs a $ 10 \times 10$ matrix, with an expected number of two entries per matrix row. The compression buffer size is set to 0.4. Hence the main chunk of allocated memory will be able to hold 10 * 2 entries in the matrix rows, and 10 * 2 * 0.4 entries in the compression buffer. In total that's 28 entries.

│ │ │ │ +

The following sample code constructs a $ 10 \times 10$ matrix, with an expected number of two entries per matrix row. The compression buffer size is set to 0.4. Hence the main chunk of allocated memory will be able to hold 10 * 2 entries in the matrix rows, and 10 * 2 * 0.4 entries in the compression buffer. In total that's 28 entries.

│ │ │ │
│ │ │ │ │ │ │ │
M m(10, 10, 2, 0.4, M::implicit);
│ │ │ │
│ │ │ │
// Fill in some arbitrary entries; the order is irrelevant.
│ │ │ │
// Even operations on these would be possible, you get a reference to the entry!
│ │ │ │
m.entry(0,0) = 0.;
│ │ │ │ @@ -3761,15 +3761,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01156.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::BCRSMatrix< B, A >::RealRowIterator< T > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Iterator access to matrix rows │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BCRSMatrix< B, A >::RealRowIterator< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -408,15 +408,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

return index

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01160.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::BCRSMatrix< B, A >::CreateIterator Class Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Iterator class for sequential creation of blocks │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -362,15 +362,15 @@ │ │ │ │ │ │ │ │

Get the current row size.

│ │ │ │
Returns
The number of indices already inserted for the current row.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01164.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< BCRSMatrix< B, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │ +

#include <dune/istl/bcrsmatrix.hh>

│ │ │ │

│ │ │ │ Public Member Functions

 CreateIterator (BCRSMatrix &_Mat, size_type _i)
 constructor
 
CreateIteratoroperator++ ()
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using field_type = typename BCRSMatrix< B, A >::field_type
 
using real_type = typename FieldTraits< field_type >::real_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01168.html │ │ │ │ @@ -84,15 +84,15 @@ │ │ │ │
Dune::BDMatrix< B, A > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A block-diagonal matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bdmatrix.hh>

│ │ │ │ +

#include <dune/istl/bdmatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BDMatrix< B, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -3485,15 +3485,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01172.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< BDMatrix< B, A > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/bdmatrix.hh>

│ │ │ │ +

#include <dune/istl/bdmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using field_type = typename BDMatrix< B, A >::field_type
 
using real_type = typename FieldTraits< field_type >::real_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01176.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::MultiTypeBlockVector< Args > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A Vector class to support different block types. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockvector.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockvector.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MultiTypeBlockVector< Args >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -176,16 +176,16 @@ │ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<typename... Args>
│ │ │ │ class Dune::MultiTypeBlockVector< Args >

A Vector class to support different block types.

│ │ │ │

This vector class combines elements of different types known at compile-time.

│ │ │ │

The documentation for this class was generated from the following files: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01180.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::MultiTypeBlockMatrix< FirstRow, Args > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A Matrix class to support different block types. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MultiTypeBlockMatrix< FirstRow, Args >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -202,16 +202,16 @@ │ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<typename FirstRow, typename... Args>
│ │ │ │ class Dune::MultiTypeBlockMatrix< FirstRow, Args >

A Matrix class to support different block types.

│ │ │ │

This matrix class combines MultiTypeBlockVector elements as rows.

│ │ │ │

The documentation for this class was generated from the following files: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01216.html │ │ │ │ @@ -84,15 +84,15 @@ │ │ │ │
Dune::BTDMatrix< B, A > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A block-tridiagonal matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/btdmatrix.hh>

│ │ │ │ +

#include <dune/istl/btdmatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BTDMatrix< B, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -3420,15 +3420,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01220.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< BTDMatrix< B, A > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/btdmatrix.hh>

│ │ │ │ +

#include <dune/istl/btdmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using field_type = typename BTDMatrix< B, A >::field_type
 
using real_type = typename FieldTraits< field_type >::real_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01244.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::BlockVector< B, A > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A vector of blocks with memory management. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/bvector.hh>

│ │ │ │ +

#include <dune/istl/bvector.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BlockVector< B, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -730,15 +730,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

increment block level counter

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01248.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< BlockVector< B, A > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/bvector.hh>

│ │ │ │ +

#include <dune/istl/bvector.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef FieldTraits< B >::field_type field_type
 
typedef FieldTraits< B >::real_type real_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01280.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::ArPackPlusPlus_Algorithms< BCRSMatrix, BlockVector > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrapper to use a range of ARPACK++ eigenvalue solvers. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/eigenvalue/arpackpp.hh>

│ │ │ │ +

#include <dune/istl/eigenvalue/arpackpp.hh>

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

│ │ │ │ Public Types

typedef BlockVector::field_type Real
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -715,15 +715,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01292.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::PowerIteration_Algorithms< BCRSMatrix, BlockVector > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Iterative eigenvalue algorithms based on power iteration. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/eigenvalue/poweriteration.hh>

│ │ │ │ +

#include <dune/istl/eigenvalue/poweriteration.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1203,15 +1203,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef BlockVector::field_type Real
 Type of underlying field.
 
typedef OperatorSum IterationOperator
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01312.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

compile-time parameter for block recursion depth │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

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

│ │ │ │ Public Types

enum  { recursion_level = l │ │ │ │ }
 
│ │ │ │ @@ -111,15 +111,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
Enumerator
recursion_level 
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01316.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::algmeta_btsolve< I, diag, relax > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -193,15 +193,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bltsolve (const M &A, X &v, const Y &d, const K &w)
 
template<class M , class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01320.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::algmeta_btsolve< 0, withdiag, withrelax > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -189,15 +189,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bltsolve (const M &A, X &v, const Y &d, const K &w)
 
template<class M , class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01324.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -189,15 +189,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bltsolve (const M &A, X &v, const Y &d, const K &)
 
template<class M , class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01328.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -189,15 +189,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bltsolve (const M &, X &v, const Y &d, const K &w)
 
template<class M , class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01332.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -189,15 +189,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bltsolve (const M &, X &v, const Y &d, const K &)
 
template<class M , class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01336.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

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

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bdsolve (const M &A, X &v, const Y &d, const K &w)
 
│ │ │ │ @@ -138,15 +138,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01340.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

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

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bdsolve (const M &A, X &v, const Y &d, const K &w)
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01344.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

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

│ │ │ │ Static Public Member Functions

template<class M , class X , class Y , class K >
static void bdsolve (const M &A, X &v, const Y &d, const K &)
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01348.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -303,15 +303,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class X , class Y , class K >
static void dbgs (const M &A, X &x, const Y &b, const K &w)
 
template<class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01352.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -303,15 +303,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<class X , class Y , class K >
static void dbgs (const M &A, X &x, const Y &b, const K &)
 
template<class X , class Y , class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01356.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/gsetc.hh>

│ │ │ │ +

#include <dune/istl/gsetc.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -303,15 +303,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<typename... MultiTypeVectorArgs, class K >
static void dbgs (const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
 
template<typename... MultiTypeVectorArgs, class K >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01360.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::ILU::CRS< B, Alloc > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

a simple compressed row storage matrix class │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/ilu.hh>

│ │ │ │ +

#include <dune/istl/ilu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ILU::CRS< B, Alloc >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -405,15 +405,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ilu.hh
  • │ │ │ │ +
  • ilu.hh
  • │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01364.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::ILUSubdomainSolver< M, X, Y > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/ilusubdomainsolver.hh>

│ │ │ │ +

#include <dune/istl/ilusubdomainsolver.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ILUSubdomainSolver< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -295,15 +295,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The ILU0 decomposition of the matrix, or the local matrix.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01368.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::ILU0SubdomainSolver< M, X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Exact subdomain solver using ILU(p) with appropriate p. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/ilusubdomainsolver.hh>

│ │ │ │ +

#include <dune/istl/ilusubdomainsolver.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ILU0SubdomainSolver< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -286,15 +286,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The ILU0 decomposition of the matrix, or the local matrix.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01372.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::ILUNSubdomainSolver< M, X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/ilusubdomainsolver.hh>

│ │ │ │ +

#include <dune/istl/ilusubdomainsolver.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ILUNSubdomainSolver< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -272,15 +272,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The ILU0 decomposition of the matrix, or the local matrix.

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

Default options class to write SVG matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/io.hh>

│ │ │ │ +

#include <dune/istl/io.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -447,15 +447,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Whether to write the SVG header.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • io.hh
  • │ │ │ │ +
  • io.hh
  • │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01392.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::ISTLError Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

derive error class from the base class in common │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/istlexception.hh>

│ │ │ │ +

#include <dune/istl/istlexception.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ISTLError:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │

derive error class from the base class in common

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01396.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::BCRSMatrixError Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Error specific to BCRSMatrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/istlexception.hh>

│ │ │ │ +

#include <dune/istl/istlexception.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BCRSMatrixError:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │

Error specific to BCRSMatrix.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01400.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::ImplicitModeCompressionBufferExhausted Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/istlexception.hh>

│ │ │ │ +

#include <dune/istl/istlexception.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ImplicitModeCompressionBufferExhausted:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │

Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.

│ │ │ │

This error occurs if the compression buffer of the BCRSMatrix did not have room for another non-zero entry during implicit mode construction.

│ │ │ │

You can fix this problem by either increasing the average row size or the compressionBufferSize value.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01404.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::SolverAbort Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Thrown when a solver aborts due to some problem. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/istlexception.hh>

│ │ │ │ +

#include <dune/istl/istlexception.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SolverAbort:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -93,15 +93,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │

Thrown when a solver aborts due to some problem.

│ │ │ │

Problems that may cause the solver to abort include a NaN detected during the convergence check (which may be caused by invalid input data), or breakdown conditions (which can happen e.g. in BiCGSTABSolver or RestartedGMResSolver).

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01408.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::MatrixBlockError Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Error when performing an operation on a matrix block. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/istlexception.hh>

│ │ │ │ +

#include <dune/istl/istlexception.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixBlockError:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -131,15 +131,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

template<class RowPrefix , class ColPrefix >
std::string blockStyleClass (const RowPrefix &row_prefix, const ColPrefix &col_prefix) const
 Helper function that returns an style class for a given prefix.
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01412.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqOverlappingSchwarz< M, X, TM, TD, TA > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Sequential overlapping Schwarz preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqOverlappingSchwarz< M, X, TM, TD, TA >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -543,16 +543,16 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, X >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01416.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SeqOverlappingSchwarzAssemblerHelper< T, tag > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01420.html │ │ │ │ @@ -76,26 +76,26 @@ │ │ │ │
Dune::LDL< Matrix > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Use the LDL package to directly solve linear systems – empty default class. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<class Matrix>
│ │ │ │ class Dune::LDL< Matrix >

Use the LDL package to directly solve linear systems – empty default class.

│ │ │ │
Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │
Matrixthe matrix type defining the system Details on UMFPack can be found on http://www.cise.ufl.edu/research/sparse/ldl/
│ │ │ │
│ │ │ │
│ │ │ │

The documentation for this class was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01424.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The LDL direct sparse solver for matrices of type BCRSMatrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -569,15 +569,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

helper function for printing solver output

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01428.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01432.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01436.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Classes | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::LDLCreator Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  isValidBlock
 
struct  isValidBlock< FieldVector< double, k > >
 
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
 
template<typename TL , typename M >
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const M &, const Dune::ParameterTree &, std::enable_if_t< !isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01440.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::LDLCreator::isValidBlock< F > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::LDLCreator::isValidBlock< F >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01444.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::LDLCreator::isValidBlock< FieldVector< double, k > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/ldl.hh>

│ │ │ │ +

#include <dune/istl/ldl.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::LDLCreator::isValidBlock< FieldVector< double, k > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • ldl.hh
  • │ │ │ │ +
  • ldl.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01448.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::MatrixImp::DenseMatrixBase< B, A > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A Vector of blocks with different blocksizes. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrix.hh>

│ │ │ │ +

#include <dune/istl/matrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixImp::DenseMatrixBase< B, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -988,15 +988,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

same effect as constructor with same argument

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01452.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::MatrixImp::DenseMatrixBase< B, A >::Iterator Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Iterator class for sequential access. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrix.hh>

│ │ │ │ +

#include <dune/istl/matrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -586,15 +586,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

equality

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01456.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::MatrixImp::DenseMatrixBase< B, A >::ConstIterator Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

ConstIterator class for sequential access. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrix.hh>

│ │ │ │ +

#include <dune/istl/matrix.hh>

│ │ │ │

│ │ │ │ Public Member Functions

 Iterator ()
 constructor, no arguments
 
 Iterator (Iterator &other)=default
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -553,15 +553,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

equality

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01460.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Matrix< T, A > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A generic dynamic dense matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrix.hh>

│ │ │ │ +

#include <dune/istl/matrix.hh>

│ │ │ │

│ │ │ │ Public Member Functions

 ConstIterator ()
 constructor
 
 ConstIterator (const B *data, size_type columns, size_type _i)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1858,15 +1858,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01464.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< Matrix< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrix.hh>

│ │ │ │ +

#include <dune/istl/matrix.hh>

│ │ │ │

│ │ │ │ Public Types

using field_type = typename Imp::BlockTraits< T >::field_type
 Export the type representing the underlying field.
 
typedef T block_type
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using field_type = typename Matrix< T, A >::field_type
 
using real_type = typename FieldTraits< field_type >::real_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01468.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::MatrixIndexSet Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Stores the nonzero entries in a sparse matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixindexset.hh>

│ │ │ │ +

#include <dune/istl/matrixindexset.hh>

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

│ │ │ │ Public Types

typedef std::size_t size_type
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -464,15 +464,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Return the number of entries.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01472.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::MatrixMarketImpl::mm_numeric_type< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper metaprogram to get the matrix market string representation of the numeric type. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

enum  { is_numeric =false │ │ │ │ }
 
│ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │

Enumerator
is_numeric 

Whether T is a supported numeric type.

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01476.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_numeric_type< int > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

enum  { is_numeric =true │ │ │ │ }
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01480.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_numeric_type< double > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

enum  { is_numeric =true │ │ │ │ }
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01484.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_numeric_type< float > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

enum  { is_numeric =true │ │ │ │ }
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01488.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_numeric_type< std::complex< double > > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

enum  { is_numeric =true │ │ │ │ }
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01492.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

enum  { is_numeric =true │ │ │ │ }
 
│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01496.html │ │ │ │ @@ -86,15 +86,15 @@ │ │ │ │
Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │
MThe matrix type.
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01500.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::mm_header_printer< BCRSMatrix< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Static Public Member Functions

static void print (std::ostream &os)
 
│ │ │ │

Member Function Documentation

│ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01504.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::mm_header_printer< BlockVector< B, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Static Public Member Functions

static void print (std::ostream &os)
 
│ │ │ │

Member Function Documentation

│ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01508.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::mm_header_printer< FieldVector< T, j > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Static Public Member Functions

static void print (std::ostream &os)
 
│ │ │ │

Member Function Documentation

│ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01512.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::mm_header_printer< FieldMatrix< T, i, j > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Static Public Member Functions

static void print (std::ostream &os)
 
│ │ │ │

Member Function Documentation

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

Member function mm_block_structure_header::print(os, mat) writes the corresponding header to the specified ostream.

Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │
Thetype of the matrix to generate the header for.
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01520.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

typedef BlockVector< T, A > M
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01524.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< FieldVector< T, i >, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

typedef BlockVector< FieldVector< T, i >, A > M
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01528.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

typedef BCRSMatrix< T, A > M
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01532.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< FieldMatrix< T, i, j >, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

typedef BCRSMatrix< FieldMatrix< T, i, j >, A > M
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01536.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_block_structure_header< FieldMatrix< T, i, j > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

typedef FieldMatrix< T, i, j > M
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01540.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::mm_block_structure_header< FieldVector< T, i > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Types

typedef FieldVector< T, i > M
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01544.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::MatrixMarketImpl::MMHeader Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Member Functions

 MMHeader ()
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -163,15 +163,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01548.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::IndexData< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixMarketImpl::IndexData< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -111,15 +111,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01552.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::MatrixMarketImpl::NumericWrapper< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

a wrapper class of numeric values. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Member Functions

 operator T& ()
 
│ │ │ │ │ │ │ │

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

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01556.html │ │ │ │ @@ -76,19 +76,19 @@ │ │ │ │
Dune::MatrixMarketImpl::PatternDummy Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Utility class for marking the pattern type of the MatrixMarket matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │

Detailed Description

│ │ │ │

Utility class for marking the pattern type of the MatrixMarket matrices.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01560.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::MatrixMarketImpl::NumericWrapper< PatternDummy > Struct Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01564.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::MatrixMarketImpl::MatrixValuesSetter< D, brows, bcols > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Functor to the data values of the matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │

│ │ │ │ Public Member Functions

template<typename T >
void operator() (const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< T > &matrix)
 Sets the matrix values.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01568.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::MatrixValuesSetter< PatternDummy, brows, bcols > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

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

│ │ │ │ Public Member Functions

template<typename M >
void operator() (const std::vector< std::set< IndexData< PatternDummy > > > &rows, M &matrix)
 
│ │ │ │ @@ -126,15 +126,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01572.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::MatrixMarketImpl::is_complex< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixMarketImpl::is_complex< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01576.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::MatrixMarketImpl::is_complex< std::complex< T > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixMarketImpl::is_complex< std::complex< T > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01580.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::MatrixMarketImpl::mm_multipliers< M > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01584.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< B, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -107,15 +107,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

enum  { rows = 1 │ │ │ │ , cols = 1 │ │ │ │ }
 
Enumerator
rows 
cols 
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01588.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< FieldMatrix< B, i, j >, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -107,15 +107,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

enum  { rows = i │ │ │ │ , cols = j │ │ │ │ }
 
Enumerator
rows 
cols 
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01592.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmarket.hh>

│ │ │ │ +

#include <dune/istl/matrixmarket.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixMarketFormatError:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01664.html │ │ │ │ @@ -76,27 +76,27 @@ │ │ │ │
Dune::MatMultMatResult< M1, M2 > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$) │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmatrix.hh>

│ │ │ │ +

#include <dune/istl/matrixmatrix.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<typename M1, typename M2>
│ │ │ │ struct Dune::MatMultMatResult< M1, M2 >

Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$)

│ │ │ │

The type of matrix C will be stored as the associated type MatMultMatResult::type.

Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
M1The type of matrix A.
M2The type of matrix B.
│ │ │ │
│ │ │ │
│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01668.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmatrix.hh>

│ │ │ │ +

#include <dune/istl/matrixmatrix.hh>

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

│ │ │ │ Public Types

typedef FieldMatrix< T, n, m > type
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01672.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmatrix.hh>

│ │ │ │ +

#include <dune/istl/matrixmatrix.hh>

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

│ │ │ │ Public Types

typedef BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01676.html │ │ │ │ @@ -76,27 +76,27 @@ │ │ │ │
Dune::TransposedMatMultMatResult< M1, M2 > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$) │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmatrix.hh>

│ │ │ │ +

#include <dune/istl/matrixmatrix.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<typename M1, typename M2>
│ │ │ │ struct Dune::TransposedMatMultMatResult< M1, M2 >

Helper TMP to get the result type of a sparse matrix matrix multiplication ( $C=A*B$)

│ │ │ │

The type of matrix C will be stored as the associated type MatMultMatResult::type.

Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
M1The type of matrix A.
M2The type of matrix B.
│ │ │ │
│ │ │ │
│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01680.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmatrix.hh>

│ │ │ │ +

#include <dune/istl/matrixmatrix.hh>

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

│ │ │ │ Public Types

typedef FieldMatrix< T, n, m > type
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01684.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixmatrix.hh>

│ │ │ │ +

#include <dune/istl/matrixmatrix.hh>

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

│ │ │ │ Public Types

typedef BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01688.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::RedistributeInformation< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -407,15 +407,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

bool isSetup () const
 
template<class D >
void redistribute (const D &from, D &to) const
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01692.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::RedistributeInformation< OwnerOverlapCopyCommunication< T, T1 > > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

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

│ │ │ │ Public Types

typedef OwnerOverlapCopyCommunication< T, T1 > Comm
 
│ │ │ │ │ │ │ │

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

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01696.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::CommMatrixRowSize< M, RI > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Utility class to communicate and set the row sizes of a redistributed matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -228,15 +228,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef M::size_type value_type
 
typedef M::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01700.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::CommMatrixSparsityPattern< M, I > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Utility class to communicate and build the sparsity pattern of a redistributed matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -432,15 +432,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef M::size_type size_type
 
typedef Dune::GlobalLookupIndexSet< I > LookupIndexSet
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01704.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::CommPolicy< CommMatrixSparsityPattern< M, I > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -188,15 +188,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef CommMatrixSparsityPattern< M, I > Type
 
typedef I::GlobalIndex IndexedType
 The indexed type we send. This is the global index indentitfying the column.
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01708.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::CommMatrixRow< M, I > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Utility class for comunicating the matrix entries. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -331,15 +331,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

row size information for the receiving side.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01712.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::CommPolicy< CommMatrixRow< M, I > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │

│ │ │ │ Public Member Functions

 CommMatrixRow (M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
 Constructor.
 
 CommMatrixRow (M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, std::vector< size_t > &rowsize_)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -188,15 +188,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef CommMatrixRow< M, I > Type
 
typedef std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType
 The indexed type we send. This is the pair of global index indentitfying the column and the value itself.
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01716.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixRowSizeGatherScatter< M, I, RI > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

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

│ │ │ │ Public Types

typedef CommMatrixRowSize< M, RI > Container
 
│ │ │ │ │ │ │ │

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

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01720.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixCopyRowSizeGatherScatter< M, I, RI > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

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

│ │ │ │ Public Types

typedef CommMatrixRowSize< M, RI > Container
 
│ │ │ │ │ │ │ │

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

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01724.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::MatrixSparsityPatternGatherScatter< M, I > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -297,15 +297,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef I::GlobalIndex GlobalIndex
 
typedef CommMatrixSparsityPattern< M, I > Container
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01728.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::MatrixRowGatherScatter< M, I > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ +

#include <dune/istl/matrixredistribute.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -341,15 +341,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef I::GlobalIndex GlobalIndex
 
typedef CommMatrixRow< M, I > Container
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01732.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::FieldMatrix< K, n, m > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01736.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::CheckIfDiagonalPresent< Matrix, blocklevel, l > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Check whether the a matrix has diagonal values on blocklevel recursion levels. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Static Public Member Functions

static void check (const Matrix &mat)
 Check whether the a matrix has diagonal values on blocklevel recursion levels.
 
│ │ │ │ @@ -122,15 +122,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Check whether the a matrix has diagonal values on blocklevel recursion levels.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01740.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::CheckIfDiagonalPresent< Matrix, 0, l > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Static Public Member Functions

static void check (const Matrix &mat)
 
│ │ │ │

Member Function Documentation

│ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01744.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::CheckIfDiagonalPresent< MultiTypeBlockMatrix< T1, Args... >, blocklevel, l > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Public Types

typedef MultiTypeBlockMatrix< T1, Args... > Matrix
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -139,15 +139,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Check whether the a matrix has diagonal values on blocklevel recursion levels.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01752.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< Matrix< B, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using block_type = typename Matrix< B, TA >::block_type
 
using size_type = typename Matrix< B, TA >::size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01756.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< BCRSMatrix< B, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -282,15 +282,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef BCRSMatrix< B, TA > Matrix
 
typedef Matrix::block_type block_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01760.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< BCRSMatrix< FieldMatrix< B, n, m >, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
 
typedef Matrix::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01764.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< FieldMatrix< K, n, m > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef FieldMatrix< K, n, m > Matrix
 
typedef Matrix::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01768.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< Dune::DynamicMatrix< T > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef Dune::DynamicMatrix< T > MatrixType
 
typedef MatrixType::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01772.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< Matrix< FieldMatrix< K, n, m >, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
 
typedef ThisMatrix::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01776.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< DiagonalMatrix< K, n > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef DiagonalMatrix< K, n > Matrix
 
typedef Matrix::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01780.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::MatrixDimension< ScaledIdentityMatrix< K, n > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -264,15 +264,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef ScaledIdentityMatrix< K, n > Matrix
 
typedef Matrix::size_type size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01784.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::IsMatrix< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Test whether a type is an ISTL Matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Public Types

enum  { value = false │ │ │ │ }
 
│ │ │ │ @@ -112,15 +112,15 @@ │ │ │ │

Enumerator
value 

True if T is an ISTL matrix.

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01788.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsMatrix< DenseMatrix< T > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │ Enumeratorvalue 

True if T is an ISTL matrix.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01792.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsMatrix< BCRSMatrix< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │ Enumeratorvalue 

True if T is an ISTL matrix.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01796.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::PointerCompare< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/matrixutils.hh>

│ │ │ │ +

#include <dune/istl/matrixutils.hh>

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

│ │ │ │ Public Member Functions

bool operator() (const T *l, const T *r)
 
│ │ │ │

Member Function Documentation

│ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01800.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

solver for MultiTypeBlockVector & MultiTypeBlockMatrix types │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<typename TVector , typename TMatrix , typename K >
static void dbgs (const TMatrix &A, TVector &x, const TVector &b, const K &w)
 
template<typename TVector , typename TMatrix , typename K >
 
│ │ │ │

Detailed Description

│ │ │ │
template<int I, int crow, int remain_row>
│ │ │ │ class Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row >

solver for MultiTypeBlockVector & MultiTypeBlockMatrix types

│ │ │ │

The methods of this class are called by the solver specializations for MultiTypeBlockVector & MultiTypeBlockMatrix types (dbgs, bsorf, bsorb, dbjac).

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01804.html │ │ │ │ @@ -79,28 +79,28 @@ │ │ │ │
Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockmatrix.hh>

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

│ │ │ │ Static Public Member Functions

template<typename Trhs , typename TVector , typename TMatrix , typename K >
static void calc_rhs (const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K &w)
 
│ │ │ │

Detailed Description

│ │ │ │
template<int I, int crow, int ccol, int remain_col>
│ │ │ │ class Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col >

part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types

│ │ │ │

For the given row (index "crow") each element is used to calculate the equation's right side.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01808.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockmatrix.hh>

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

│ │ │ │ Static Public Member Functions

template<typename Trhs , typename TVector , typename TMatrix , typename K >
static void calc_rhs (const TMatrix &, TVector &, TVector &, Trhs &, const K &)
 
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01812.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

template<typename TVector , typename TMatrix , typename K >
static void dbgs (const TMatrix &, TVector &, TVector &, const TVector &, const K &)
 
template<typename TVector , typename TMatrix , typename K >
static void bsorb (const TMatrix &, TVector &, TVector &, const TVector &, const K &)
 
template<typename TVector , typename TMatrix , typename K >
static void dbjac (const TMatrix &, TVector &, TVector &, const TVector &, const K &)
 
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01816.html │ │ │ │ @@ -79,27 +79,27 @@ │ │ │ │
std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Make std::tuple_element work for MultiTypeBlockMatrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockmatrix.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockmatrix.hh>

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

│ │ │ │ Public Types

using type = typename std::tuple_element< i, std::tuple< Args... > >::type
 
│ │ │ │

Detailed Description

│ │ │ │
template<size_t i, typename... Args>
│ │ │ │ struct std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >

Make std::tuple_element work for MultiTypeBlockMatrix.

│ │ │ │

It derives from std::tuple after all.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01820.html │ │ │ │ @@ -76,25 +76,25 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< MultiTypeBlockVector< Args... > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockvector.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockvector.hh>

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

│ │ │ │ Public Types

using field_type = typename MultiTypeBlockVector< Args... >::field_type
 
using real_type = typename FieldTraits< field_type >::real_type
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01824.html │ │ │ │ @@ -79,27 +79,27 @@ │ │ │ │
std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Make std::tuple_element work for MultiTypeBlockVector. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/multitypeblockvector.hh>

│ │ │ │ +

#include <dune/istl/multitypeblockvector.hh>

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

│ │ │ │ Public Types

using type = typename std::tuple_element< i, std::tuple< Args... > >::type
 
│ │ │ │

Detailed Description

│ │ │ │
template<size_t i, typename... Args>
│ │ │ │ struct std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > >

Make std::tuple_element work for MultiTypeBlockVector.

│ │ │ │

It derives from std::tuple after all.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01828.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::NonoverlappingSchwarzOperator< M, X, Y, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A nonoverlapping operator with communication object. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/novlpschwarz.hh>

│ │ │ │ +

#include <dune/istl/novlpschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::NonoverlappingSchwarzOperator< M, X, Y, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -724,15 +724,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01836.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::NonoverlappingBlockPreconditioner< C, P > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Nonoverlapping parallel preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/novlpschwarz.hh>

│ │ │ │ +

#include <dune/istl/novlpschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::NonoverlappingBlockPreconditioner< C, P >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -520,15 +520,15 @@ │ │ │ │

Prepare the preconditioner.

│ │ │ │ │ │ │ │

Implements Dune::Preconditioner< P::domain_type, P::range_type >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01840.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::LinearOperator< X, Y > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A linear operator. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/operators.hh>

│ │ │ │ +

#include <dune/istl/operators.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::LinearOperator< X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -352,15 +352,15 @@ │ │ │ │

Category of the linear operator (see SolverCategory::Category)

│ │ │ │ │ │ │ │

Implemented in Dune::NonoverlappingSchwarzOperator< M, X, Y, C >, Dune::OverlappingSchwarzOperator< M, X, Y, C >, and Dune::MatrixAdapter< M, X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01844.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::AssembledLinearOperator< M, X, Y > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A linear operator exporting itself in matrix form. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/operators.hh>

│ │ │ │ +

#include <dune/istl/operators.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::AssembledLinearOperator< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -383,15 +383,15 @@ │ │ │ │

get matrix via *

│ │ │ │ │ │ │ │

Implemented in Dune::NonoverlappingSchwarzOperator< M, X, Y, C >, Dune::OverlappingSchwarzOperator< M, X, Y, C >, and Dune::MatrixAdapter< M, X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01848.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::MatrixAdapter< M, X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Adapter to turn a matrix into a linear operator. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/operators.hh>

│ │ │ │ +

#include <dune/istl/operators.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MatrixAdapter< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -413,15 +413,15 @@ │ │ │ │

get matrix via *

│ │ │ │ │ │ │ │

Implements Dune::AssembledLinearOperator< M, X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01856.html │ │ │ │ @@ -76,19 +76,19 @@ │ │ │ │
Dune::AdditiveSchwarzMode Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Tag that the tells the Schwarz method to be additive. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │

Detailed Description

│ │ │ │

Tag that the tells the Schwarz method to be additive.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01860.html │ │ │ │ @@ -76,19 +76,19 @@ │ │ │ │
Dune::MultiplicativeSchwarzMode Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Tag that tells the Schwarz method to be multiplicative. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │

Detailed Description

│ │ │ │

Tag that tells the Schwarz method to be multiplicative.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01864.html │ │ │ │ @@ -76,19 +76,19 @@ │ │ │ │
Dune::SymmetricMultiplicativeSchwarzMode Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Tag that tells the Schwarz method to be multiplicative and symmetric. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │

Detailed Description

│ │ │ │

Tag that tells the Schwarz method to be multiplicative and symmetric.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01868.html │ │ │ │ @@ -85,15 +85,15 @@ │ │ │ │
Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │
MThe type of the matrix.
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01872.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -322,15 +322,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef std::remove_const< M >::type matrix_type
 The matrix type the preconditioner is for.
 
typedef X::field_type field_type
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01876.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::OverlappingAssignerHelper< T, tag > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::OverlappingAssignerHelper< T, tag >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01880.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::OverlappingAssignerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -232,15 +232,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef BCRSMatrix< K, Al > matrix_type
 
typedef X::field_type field_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01884.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::OverlappingAssignerHelper< S< BCRSMatrix< T, A > >, true > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -257,15 +257,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef BCRSMatrix< T, A > matrix_type
 
typedef S< BCRSMatrix< T, A > >::range_type range_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01888.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::OverlappingAssignerILUBase< M, X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::OverlappingAssignerILUBase< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -195,15 +195,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01892.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::OverlappingAssignerHelper< ILU0SubdomainSolver< M, X, Y >, false > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::OverlappingAssignerHelper< ILU0SubdomainSolver< M, X, Y >, false >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -287,15 +287,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01896.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::OverlappingAssignerHelper< ILUNSubdomainSolver< M, X, Y >, false > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::OverlappingAssignerHelper< ILUNSubdomainSolver< M, X, Y >, false >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -287,15 +287,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01900.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::AdditiveAdder< S, T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01904.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::AdditiveAdder< S, BlockVector< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -160,15 +160,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef A::size_type size_type
 
typedef std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01908.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::MultiplicativeAdder< S, T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01912.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::MultiplicativeAdder< S, BlockVector< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -160,15 +160,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef A::size_type size_type
 
typedef std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01916.html │ │ │ │ @@ -76,28 +76,28 @@ │ │ │ │
Dune::AdderSelector< T, X, S > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

template meta program for choosing how to add the correction. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<typename T, class X, class S>
│ │ │ │ struct Dune::AdderSelector< T, X, S >

template meta program for choosing how to add the correction.

│ │ │ │

There are specialization for the additive, the multiplicative, and the symmetric multiplicative mode.

│ │ │ │
Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
TThe Schwarz mode (either AdditiveSchwarzMode or MuliplicativeSchwarzMode or SymmetricMultiplicativeSchwarzMode)
XThe vector field type
│ │ │ │
│ │ │ │
│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01920.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::AdderSelector< AdditiveSchwarzMode, X, S > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

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

│ │ │ │ Public Types

typedef AdditiveAdder< S, X > Adder
 
│ │ │ │

Member Typedef Documentation

│ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01924.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::AdderSelector< MultiplicativeSchwarzMode, X, S > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

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

│ │ │ │ Public Types

typedef MultiplicativeAdder< S, X > Adder
 
│ │ │ │

Member Typedef Documentation

│ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01928.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::AdderSelector< SymmetricMultiplicativeSchwarzMode, X, S > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

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

│ │ │ │ Public Types

typedef MultiplicativeAdder< S, X > Adder
 
│ │ │ │

Member Typedef Documentation

│ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01932.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::IteratorDirectionSelector< T1, T2, forward > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper template meta program for application of overlapping Schwarz. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -295,15 +295,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef T1 solver_vector
 
typedef solver_vector::iterator solver_iterator
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01936.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::IteratorDirectionSelector< T1, T2, false > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -280,15 +280,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef T1 solver_vector
 
typedef solver_vector::reverse_iterator solver_iterator
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01940.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqOverlappingSchwarzApplier< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper template meta program for application of overlapping Schwarz. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -182,15 +182,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef T smoother
 
typedef smoother::range_type range_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01944.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzApplier< SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -170,15 +170,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > smoother
 
typedef smoother::range_type range_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01948.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzAssemblerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

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

│ │ │ │ Public Types

typedef BCRSMatrix< K, Al > matrix_type
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -139,15 +139,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01952.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzAssemblerHelper< S< BCRSMatrix< T, A > >, true > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

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

│ │ │ │ Public Types

typedef BCRSMatrix< T, A > matrix_type
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -139,15 +139,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01956.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzAssemblerILUBase< M, X, Y > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqOverlappingSchwarzAssemblerILUBase< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01960.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzAssemblerHelper< ILU0SubdomainSolver< M, X, Y >, false > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqOverlappingSchwarzAssemblerHelper< ILU0SubdomainSolver< M, X, Y >, false >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -126,15 +126,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01964.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzAssemblerHelper< ILUNSubdomainSolver< M, X, Y >, false > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqOverlappingSchwarzAssemblerHelper< ILUNSubdomainSolver< M, X, Y >, false >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -126,15 +126,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01968.html │ │ │ │ @@ -73,21 +73,21 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SeqOverlappingSchwarzDomainSize< M > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<class M>
│ │ │ │ struct Dune::SeqOverlappingSchwarzDomainSize< M >

template helper struct to determine the size of a domain for the SeqOverlappingSchwarz solver

│ │ │ │

only implemented for BCRSMatrix<T>

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01972.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::SeqOverlappingSchwarzDomainSize< BCRSMatrix< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/overlappingschwarz.hh>

│ │ │ │ +

#include <dune/istl/overlappingschwarz.hh>

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

│ │ │ │ Static Public Member Functions

template<class Domain >
static int size (const Domain &d)
 
│ │ │ │ @@ -173,15 +173,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01976.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::OwnerOverlapCopyAttributeSet Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Attribute set for overlapping Schwarz. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ +

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -112,15 +112,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

enum  AttributeSet { owner =1 │ │ │ │ , overlap =2 │ │ │ │ , copy =3 │ │ │ │ }
overlap 
copy 
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01980.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::IndexInfoFromGrid< G, L > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Information about the index distribution. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ +

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -358,15 +358,15 @@ │ │ │ │ │ │ │ │

Get the set of remote indices.

│ │ │ │
Returns
the set of remote indices.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01984.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A class setting up standard communication for a two-valued attribute set with owner/overlap/copy semantics. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ +

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │

│ │ │ │ Public Types

typedef G GlobalIdType
 The type of the global index.
 
typedef L LocalIdType
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1400,15 +1400,15 @@ │ │ │ │ │ │ │ │

Get the underlying remote indices.

│ │ │ │
Returns
The underlying remote indices.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01988.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::CopyGatherScatter< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

gather/scatter callback for communcation │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ +

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │

│ │ │ │ Classes

struct  AddGatherScatter
 
struct  CopyGatherScatter
 gather/scatter callback for communcation More...
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef CommPolicy< T >::IndexedType V
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -205,15 +205,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01992.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::AddGatherScatter< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/owneroverlapcopy.hh>

│ │ │ │ +

#include <dune/istl/owneroverlapcopy.hh>

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

│ │ │ │ Public Types

typedef CommPolicy< T >::IndexedType V
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -198,15 +198,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a01996.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::AggregationCriterion< T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class of all aggregation criterions. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::AggregationCriterion< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -124,15 +124,15 @@ │ │ │ │  Sets reasonable default values for an aisotropic problem.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ class Dune::Amg::AggregationCriterion< T >

Base class of all aggregation criterions.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02000.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Amg::SymmetricMatrixDependency< M, N > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Dependency policy for symmetric matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SymmetricMatrixDependency< M, N >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -284,15 +284,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
MThe type of the matrix
NThe type of the metric that turns matrix blocks into field values
│ │ │ │ │ │ │ │ │ │ │ │

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

Dependency policy for symmetric matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::Dependency< M, N >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -278,15 +278,15 @@ │ │ │ │  The norm of the current diagonal.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class M, class N>
│ │ │ │ class Dune::Amg::Dependency< M, N >

Dependency policy for symmetric matrices.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02008.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Amg::SymmetricDependency< M, N > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Dependency policy for symmetric matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SymmetricDependency< M, N >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -278,15 +278,15 @@ │ │ │ │  The norm of the current diagonal.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class M, class N>
│ │ │ │ class Dune::Amg::SymmetricDependency< M, N >

Dependency policy for symmetric matrices.

│ │ │ │

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

Norm that uses only the [N][N] entry of the block to determine couplings. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::Diagonal< N >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -115,15 +115,15 @@ │ │ │ │  Compute the norm of a scalar.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<int N>
│ │ │ │ class Dune::Amg::Diagonal< N >

Norm that uses only the [N][N] entry of the block to determine couplings.

│ │ │ │

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

Norm that uses only the [0][0] entry of the block to determine couplings. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::FirstDiagonal:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -223,15 +223,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02020.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Functor using the row sum (infinity) norm to determine strong couplings. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

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

│ │ │ │ Public Types

enum  { is_sign_preserving = false │ │ │ │ }
 
│ │ │ │ @@ -99,15 +99,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
 compute the norm of a matrix.
 
│ │ │ │

Detailed Description

│ │ │ │

Functor using the row sum (infinity) norm to determine strong couplings.

│ │ │ │

The is proposed by several people for elasticity problems.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02024.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

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

│ │ │ │ Public Types

enum  { is_sign_preserving = false │ │ │ │ }
 
│ │ │ │ @@ -93,15 +93,15 @@ │ │ │ │ Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
template<class M >
FieldTraits< typenameM::field_type >::real_type operator() (const M &m) const
 compute the norm of a matrix.
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02028.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

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

│ │ │ │ Public Types

enum  { is_sign_preserving = false │ │ │ │ }
 
│ │ │ │ @@ -93,15 +93,15 @@ │ │ │ │ Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
template<class M >
FieldTraits< typenameM::field_type >::real_type operator() (const M &m) const
 compute the norm of a matrix.
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02032.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Amg::SymmetricCriterion< M, Norm > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Criterion taking advantage of symmetric matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SymmetricCriterion< M, Norm >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -826,15 +826,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

index of the currently evaluated row.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02036.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Amg::UnSymmetricCriterion< M, Norm > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Criterion suitable for unsymmetric matrices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::UnSymmetricCriterion< M, Norm >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -827,15 +827,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

index of the currently evaluated row.

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

Class for building the aggregates. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -112,15 +112,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef G MatrixGraph
 The matrix graph type used.
 
typedef MatrixGraph::VertexDescriptor Vertex
 Build the aggregates.
 
│ │ │ │

Detailed Description

│ │ │ │
template<class G>
│ │ │ │ class Dune::Amg::Aggregator< G >

Class for building the aggregates.

│ │ │ │

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

Class providing information about the mapping of the vertices onto aggregates. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::AggregatesMap< V >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -180,15 +180,15 @@ │ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class V>
│ │ │ │ class Dune::Amg::AggregatesMap< V >

Class providing information about the mapping of the vertices onto aggregates.

│ │ │ │

It is assumed that the vertices are consecutively numbered from 0 to the maximum vertex number.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02048.html │ │ │ │ @@ -79,27 +79,27 @@ │ │ │ │
Dune::Amg::AggregatesMap< V >::DummyEdgeVisitor Class Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

A Dummy visitor that does nothing for each visited edge. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

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

│ │ │ │ Public Member Functions

template<class EdgeIterator >
void operator() (const EdgeIterator &edge) const
 
│ │ │ │

Detailed Description

│ │ │ │
template<class V>
│ │ │ │ class Dune::Amg::AggregatesMap< V >::DummyEdgeVisitor

A Dummy visitor that does nothing for each visited edge.

│ │ │ │

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

A class for temporarily storing the vertices of an aggregate in. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/aggregates.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::Aggregate< G, S >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -153,15 +153,15 @@ │ │ │ │  get an iterator over the vertices of the aggregate.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class G, class S>
│ │ │ │ class Dune::Amg::Aggregate< G, S >

A class for temporarily storing the vertices of an aggregate in.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02092.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::KAMG< M, X, S, PI, K, A > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

an algebraic multigrid method using a Krylov-cycle. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/kamg.hh>

│ │ │ │ +

#include <dune/istl/paamg/kamg.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::KAMG< M, X, S, PI, K, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -481,16 +481,16 @@ │ │ │ │

Category of the preconditioner (see SolverCategory::Category)

│ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, X >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02096.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::KAmgTwoGrid< AMG > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Two grid operator for AMG with Krylov cycle. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/kamg.hh>

│ │ │ │ +

#include <dune/istl/paamg/kamg.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::KAmgTwoGrid< AMG >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -675,16 +675,16 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02100.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::AMG< M, X, S, PI, A > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Parallel algebraic multigrid based on agglomeration. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::AMG< M, X, S, PI, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -267,15 +267,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The range type of the preconditioner.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02112.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::DirectSolverSelector< Matrix, Vector > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -117,15 +117,15 @@ │ │ │ │ Static Public Attributes │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Solver
 
struct  Solver< M, superlu >
 
static constexpr SolverType solver
 
static constexpr bool isDirectSolver = solver != none
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02116.html │ │ │ │ @@ -77,30 +77,30 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, SolverType > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

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

│ │ │ │ Public Types

typedef InverseOperator< Vector, Vector > type
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static typecreate (const M &mat, bool verbose, bool reusevector)
 
static std::string name ()
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02120.html │ │ │ │ @@ -77,30 +77,30 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, superlu > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

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

│ │ │ │ Public Types

typedef SuperLU< M > type
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static typecreate (const M &mat, bool verbose, bool reusevector)
 
static std::string name ()
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02124.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Classes | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::AMGCreator Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -108,15 +108,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  isValidBlockType
 
struct  isValidBlockType< FieldMatrix< T, n, m > >
 
std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL tl, const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std::enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value, int >=0) const
 
template<typename TL , typename OP >
std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const std::shared_ptr< OP > &, const Dune::ParameterTree &, std::enable_if_t<!isValidBlockType< typename OP::matrix_type::block_type >::value, int >=0) const
 
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02128.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::AMGCreator::isValidBlockType< class > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::AMGCreator::isValidBlockType< class >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02132.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/amg.hh>

│ │ │ │ +

#include <dune/istl/paamg/amg.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file:
    │ │ │ │ -
  • amg.hh
  • │ │ │ │ +
  • amg.hh
  • │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02136.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::ApplyHelper< i > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/combinedfunctor.hh>

│ │ │ │ +

#include <dune/istl/paamg/combinedfunctor.hh>

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

│ │ │ │ Static Public Member Functions

template<class TT , class T >
static void apply (TT tuple, const T &t)
 
│ │ │ │ @@ -126,15 +126,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02140.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::ApplyHelper< 0 > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/combinedfunctor.hh>

│ │ │ │ +

#include <dune/istl/paamg/combinedfunctor.hh>

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

│ │ │ │ Static Public Member Functions

template<class TT , class T >
static void apply (TT tuple, const T &t)
 
│ │ │ │ @@ -124,15 +124,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02144.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::CombinedFunctor< T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/combinedfunctor.hh>

│ │ │ │ +

#include <dune/istl/paamg/combinedfunctor.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::CombinedFunctor< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -157,15 +157,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02148.html │ │ │ │ @@ -77,28 +77,28 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< BlockVector< T, A > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Types

typedef const int Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static std::shared_ptr< BlockVector< T, A > > construct (Arguments &n)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02152.html │ │ │ │ @@ -77,30 +77,30 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ParallelOperatorArgs< M, C > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Member Functions

 ParallelOperatorArgs (std::shared_ptr< M > matrix, const C &comm)
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Attributes

std::shared_ptr< M > matrix_
 
const C & comm_
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02156.html │ │ │ │ @@ -77,30 +77,30 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::OwnerOverlapCopyCommunicationArgs Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Member Functions

 OwnerOverlapCopyCommunicationArgs (MPI_Comm comm, SolverCategory::Category cat)
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Attributes

MPI_Comm comm_
 
SolverCategory::Category cat_
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02160.html │ │ │ │ @@ -77,28 +77,28 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Member Functions

 SequentialCommunicationArgs (Communication< void * > comm, int cat)
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Attributes

Communication< void * > comm_
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02164.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::OverlappingSchwarzOperator< M, X, Y, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

An overlapping Schwarz operator. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/schwarz.hh>

│ │ │ │ +

#include <dune/istl/schwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::OverlappingSchwarzOperator< M, X, Y, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -511,16 +511,16 @@ │ │ │ │

get the sequential assembled linear operator.

│ │ │ │ │ │ │ │

Implements Dune::AssembledLinearOperator< M, X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02168.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< OverlappingSchwarzOperator< M, X, Y, C > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Types

typedef ParallelOperatorArgs< M, C > Arguments
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02172.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< NonoverlappingSchwarzOperator< M, X, Y, C > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Types

typedef ParallelOperatorArgs< M, C > Arguments
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02176.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::MatrixAdapterArgs< M, X, Y > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Member Functions

 MatrixAdapterArgs (std::shared_ptr< M > matrix, const SequentialInformation)
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -146,15 +146,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02180.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< MatrixAdapter< M, X, Y > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Types

typedef const MatrixAdapterArgs< M, X, Y > Arguments
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02184.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< SequentialInformation > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Types

typedef const SequentialCommunicationArgs Arguments
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -132,15 +132,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02188.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/construction.hh>

│ │ │ │ +

#include <dune/istl/paamg/construction.hh>

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

│ │ │ │ Public Types

typedef const OwnerOverlapCopyCommunicationArgs Arguments
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │

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

Class representing the properties of an ede in the matrix graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/dependency.hh>

│ │ │ │ +

#include <dune/istl/paamg/dependency.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -140,15 +140,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

enum  { INFLUENCE │ │ │ │ , DEPEND │ │ │ │ , SIZE │ │ │ │ }
 Prints the attributes of the edge for debugging.
 
│ │ │ │

Detailed Description

│ │ │ │

Class representing the properties of an ede in the matrix graph.

│ │ │ │

During the coarsening process the matrix graph needs to hold different properties of its edges. This class ontains methods for getting and setting these edge attributes.

│ │ │ │

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

Class representing a node in the matrix graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/dependency.hh>

│ │ │ │ +

#include <dune/istl/paamg/dependency.hh>

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

│ │ │ │ Public Types

enum  {
│ │ │ │   ISOLATED │ │ │ │ , VISITED │ │ │ │ , FRONT │ │ │ │ @@ -150,15 +150,15 @@ │ │ │ │
 Reset all flags.
 
│ │ │ │

Detailed Description

│ │ │ │

Class representing a node in the matrix graph.

│ │ │ │

Contains methods for getting and setting node attributes.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02200.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::PropertyGraphVertexPropertyMap< G, i > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/dependency.hh>

│ │ │ │ +

#include <dune/istl/paamg/dependency.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::PropertyGraphVertexPropertyMap< G, i >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -125,15 +125,15 @@ │ │ │ │  Default constructor.
│ │ │ │   │ │ │ │ Reference operator[] (const Vertex &vertex) const │ │ │ │  Get the properties associated to a vertex.
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02204.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/dependency.hh>

│ │ │ │ +

#include <dune/istl/paamg/dependency.hh>

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

│ │ │ │ Public Types

typedef Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITEDType
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02208.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/fastamg.hh>

│ │ │ │ +

#include <dune/istl/paamg/fastamg.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::FastAMG< M, X, PI, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -253,15 +253,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The range type of the preconditioner.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02216.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::GaussSeidelPresmoothDefect< level > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/fastamgsmoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/fastamgsmoother.hh>

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

│ │ │ │ Static Public Member Functions

template<typename M , typename X , typename Y >
static void apply (const M &A, X &x, Y &d, const Y &b)
 
│ │ │ │ @@ -138,15 +138,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02220.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::GaussSeidelPostsmoothDefect< level > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/fastamgsmoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/fastamgsmoother.hh>

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

│ │ │ │ Static Public Member Functions

template<typename M , typename X , typename Y >
static void apply (const M &A, X &x, Y &d, const Y &b)
 
│ │ │ │ @@ -138,15 +138,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02224.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -98,15 +98,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef T Aggregate
 The aggregate descriptor.
 
typedef T Vertex
 The aggregate the vertex belongs to.
 
Vertex vertex
 The vertex descriptor.
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02228.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::Amg::SparsityBuilder< M > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Functor for building the sparsity pattern of the matrix using examineConnectivity. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -103,15 +103,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

 SparsityBuilder (M &matrix)
 Constructor.
 
void insert (const typename M::size_type &index)
std::size_t index ()
 
│ │ │ │

Detailed Description

│ │ │ │
template<class M>
│ │ │ │ class Dune::Amg::SparsityBuilder< M >

Functor for building the sparsity pattern of the matrix using examineConnectivity.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02232.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::BaseGalerkinProduct:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │  Calculate the galerkin product.
│ │ │ │   │ │ │ │ template<class M , class V , class P , class O > │ │ │ │ void calculate (const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const P &pinfo, const O &copy) │ │ │ │   │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02236.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::GalerkinProduct< T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::GalerkinProduct< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -110,15 +110,15 @@ │ │ │ │  Calculate the galerkin product.
│ │ │ │   │ │ │ │ template<class M , class V , class P , class O > │ │ │ │ void calculate (const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const P &pinfo, const O &copy) │ │ │ │   │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02244.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::GalerkinProduct< SequentialInformation > Class Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::GalerkinProduct< SequentialInformation >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -103,15 +103,15 @@ │ │ │ │  Calculate the galerkin product.
│ │ │ │   │ │ │ │ template<class M , class V , class P , class O > │ │ │ │ void calculate (const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const P &pinfo, const O &copy) │ │ │ │   │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02248.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Classes | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::BaseConnectivityConstructor:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -108,15 +108,15 @@ │ │ │ │   │ │ │ │ template<class R , class G , class V > │ │ │ │ static void constructNonOverlapConnectivity (R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed) │ │ │ │  Construct the connectivity of an aggregate in the overlap.
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02252.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder< G, S, V > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Visitor for identifying connected aggregates during a breadthFirstSearch. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef G Graph
 The type of the graph.
 
typedef Graph::ConstEdgeIterator ConstEdgeIterator
 Process an edge pointing to another aggregate.
 
│ │ │ │

Detailed Description

│ │ │ │
template<class G, class S, class V>
│ │ │ │ class Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder< G, S, V >

Visitor for identifying connected aggregates during a breadthFirstSearch.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02256.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConnectivityConstructor< G, T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::ConnectivityConstructor< G, T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -108,15 +108,15 @@ │ │ │ │   │ │ │ │ template<class R , class G , class V > │ │ │ │ static void constructNonOverlapConnectivity (R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed) │ │ │ │  Construct the connectivity of an aggregate in the overlap.
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02260.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::ConnectivityConstructor< G, SequentialInformation > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::ConnectivityConstructor< G, SequentialInformation >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -108,15 +108,15 @@ │ │ │ │   │ │ │ │ template<class R , class G , class V > │ │ │ │ static void constructNonOverlapConnectivity (R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed) │ │ │ │  Construct the connectivity of an aggregate in the overlap.
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02264.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::DirichletBoundarySetter< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

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

│ │ │ │ Static Public Member Functions

template<class M , class O >
static void set (M &coarse, const T &pinfo, const O &copy)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02268.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::DirichletBoundarySetter< SequentialInformation > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/galerkin.hh>

│ │ │ │ +

#include <dune/istl/paamg/galerkin.hh>

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

│ │ │ │ Static Public Member Functions

template<class M , class O >
static void set (M &coarse, const SequentialInformation &pinfo, const O &copy)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02272.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::GlobalAggregatesMap< T, TI > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

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

│ │ │ │ Classes

class  Proxy
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -112,15 +112,15 @@ │ │ │ │

 
Proxy operator[] (std::size_t index)
 
void put (const GlobalIndex &global, size_t i)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02276.html │ │ │ │ @@ -76,25 +76,25 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::GlobalAggregatesMap< T, TI >::Proxy Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

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

│ │ │ │ Public Member Functions

 Proxy (const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
 
Proxyoperator= (const GlobalIndex &global)
 
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02280.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::AggregatesGatherScatter< T, TI > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ Static Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef TI ParallelIndexSet
 
typedef ParallelIndexSet::GlobalIndex GlobalIndex
 
static const GlobalIndexgather (const GlobalAggregatesMap< T, TI > &ga, size_t i)
 
static void scatter (GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, size_t i)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02284.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Amg::AggregatesPublisher< T, O, I > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02288.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::AggregatesPublisher< T, O, OwnerOverlapCopyCommunication< T1, T2 > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Utility class for publishing the aggregate number of the DOFs in the overlap to other processors and convert them to local indices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef T Vertex
 
typedef O OverlapFlags
 
OThe set of overlap flags.
T1The type of the global indices.
T2The type of the local indices.
│ │ │ │ │ │ │ │ │ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02292.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::AggregatesPublisher< T, O, SequentialInformation > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │

│ │ │ │ Public Types

typedef T Vertex
 
typedef SequentialInformation ParallelInformation
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static void publish (AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02296.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ +

#include <dune/istl/paamg/globalaggregates.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │

│ │ │ │ Public Types

typedef Amg::AggregatesMap< T > Type
 
typedef Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static int getSize (const Type &, int)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02300.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The (undirected) graph of a matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::MatrixGraph< M >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -780,15 +780,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the number of vertices in the graph.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02304.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::MatrixGraph< M >::EdgeIteratorT< C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Iterator over all edges starting from a vertex. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -625,15 +625,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Access the edge weight.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02308.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::MatrixGraph< M >::VertexIteratorT< C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The vertex iterator type of the graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │

│ │ │ │ Public Types

enum  { isMutable = std::is_same<C, MutableContainer>::value │ │ │ │ }
 
typedef std::remove_const< C >::type MutableContainer
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -547,15 +547,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Access the weight of the vertex.

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

A subgraph of a graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SubGraph< G, T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -564,15 +564,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the number of vertices in the graph.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02316.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::SubGraph< G, T >::EdgeIndexMap Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

An index map for mapping the edges to indices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │

│ │ │ │ Public Types

enum  { isMutable = std::is_same<C, MutableContainer>::value │ │ │ │ }
 
typedef std::remove_const< C >::type MutableContainer
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef ReadablePropertyMapTag Category
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -207,15 +207,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02320.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::Amg::SubGraph< G, T >::EdgeIterator Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The edge iterator of the graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SubGraph< G, T >::EdgeIterator:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -378,15 +378,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The index of the target vertex of the current edge.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02324.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::Amg::SubGraph< G, T >::VertexIterator Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The vertex iterator of the graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SubGraph< G, T >::VertexIterator:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -320,15 +320,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Preincrement operator.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02328.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::VertexPropertiesGraph< G, VP, VM > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Attaches properties to the vertices of a graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

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

│ │ │ │ Classes

class  VertexIteratorT
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -700,15 +700,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the number of vertices in the graph.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02332.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::VertexPropertiesGraph< G, VP, VM >::VertexIteratorT< C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::VertexPropertiesGraph< G, VP, VM >::VertexIteratorT< C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -354,15 +354,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the properties of the current Vertex.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02336.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Attaches properties to the edges and vertices of a graph. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -954,15 +954,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the number of vertices in the graph.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02340.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::EdgeIteratorT< C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::EdgeIteratorT< C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -277,15 +277,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the properties of the current edge.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02344.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::VertexIteratorT< C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::VertexIteratorT< C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -331,15 +331,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Get the properties of the current Vertex.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02348.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::GraphVertexPropertiesSelector< G > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrapper to access the internal edge properties of a graph via operator[]() │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │

│ │ │ │ Classes

class  EdgeIteratorT
 
class  VertexIteratorT
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -268,15 +268,15 @@ │ │ │ │

│ │ │ │ Public Types

typedef G Graph
 The type of the graph with internal properties.
 
typedef G::VertexProperties VertexProperties
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02352.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::GraphEdgePropertiesSelector< G > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrapper to access the internal vertex properties of a graph via operator[]() │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graph.hh>

│ │ │ │ +

#include <dune/istl/paamg/graph.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -268,15 +268,15 @@ │ │ │ │

│ │ │ │ Public Types

typedef G Graph
 The type of the graph with internal properties.
 
typedef G::EdgeProperties EdgeProperties
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02356.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::PropertiesGraphCreator< M, PI > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graphcreator.hh>

│ │ │ │ +

#include <dune/istl/paamg/graphcreator.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -263,15 +263,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef M::matrix_type Matrix
 
typedef Dune::Amg::MatrixGraph< const MatrixMatrixGraph
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02360.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::PropertiesGraphCreator< M, SequentialInformation > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/graphcreator.hh>

│ │ │ │ +

#include <dune/istl/paamg/graphcreator.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -245,15 +245,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef M::matrix_type Matrix
 
typedef Dune::Amg::MatrixGraph< const MatrixMatrixGraph
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02364.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A hierarchy of containers (e.g. matrices or vectors) │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/hierarchy.hh>

│ │ │ │ +

#include <dune/istl/paamg/hierarchy.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::Hierarchy< T, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -289,15 +289,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Construct an empty hierarchy.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02368.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Iterator over the levels in the hierarchy. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/hierarchy.hh>

│ │ │ │ +

#include <dune/istl/paamg/hierarchy.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -543,15 +543,15 @@ │ │ │ │ │ │ │ │

Check whether there was a redistribution at the current level.

│ │ │ │
Returns
True if there is a redistributed version of the container at the current level.
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02376.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Amg::IndicesCoarsener< T, E > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │ +

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02380.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ParallelIndicesCoarsener< T, E > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │ +

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::ParallelIndicesCoarsener< T, E >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │ Static Public Member Functions

template<typename Graph , typename VM >
static Graph::VertexDescriptor coarsen (ParallelInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates)
 Build the coarse index set after the aggregatio.
 
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02388.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Coarsen Indices in the parallel case. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │ +

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -368,15 +368,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
Returns
The number of unknowns on the coarse level.
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02392.html │ │ │ │ @@ -79,28 +79,28 @@ │ │ │ │
Dune::Amg::IndicesCoarsener< SequentialInformation, E > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Coarsen Indices in the sequential case. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/indicescoarsener.hh>

│ │ │ │ +

#include <dune/istl/paamg/indicescoarsener.hh>

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

│ │ │ │ Static Public Member Functions

template<typename Graph , typename VM >
static Graph::VertexDescriptor coarsen (const SequentialInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, SequentialInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates)
 
│ │ │ │

Detailed Description

│ │ │ │
template<typename E>
│ │ │ │ class Dune::Amg::IndicesCoarsener< SequentialInformation, E >

Coarsen Indices in the sequential case.

│ │ │ │

Nothing to be coarsened here. Just renumber the aggregates consecutively

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02396.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::MatrixHierarchy< M, PI, A > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The hierarchies build by the coarsening process. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/matrixhierarchy.hh>

│ │ │ │ +

#include <dune/istl/paamg/matrixhierarchy.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -424,15 +424,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef M MatrixOperator
 The type of the matrix operator.
 
typedef MatrixOperator::matrix_type Matrix
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02408.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::MatrixHierarchy< M, PI, A >::MatrixStats< Matrix, true >::calc Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/matrixhierarchy.hh>

│ │ │ │ +

#include <dune/istl/paamg/matrixhierarchy.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -257,15 +257,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef Matrix::size_type size_type
 
typedef Matrix::row_type matrix_row
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02412.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::CoarsenCriterion< T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The criterion describing the stop criteria for the coarsening process. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/matrixhierarchy.hh>

│ │ │ │ +

#include <dune/istl/paamg/matrixhierarchy.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::CoarsenCriterion< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -226,15 +226,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02416.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Parameters needed to check whether a node depends on another. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/parameters.hh>

│ │ │ │ +

#include <dune/istl/paamg/parameters.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::DependencyParameters:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ double alpha () const │ │ │ │  Get the scaling value for marking connections as strong. Default value is 1/3.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │

Parameters needed to check whether a node depends on another.

│ │ │ │

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

Parameters needed for the aggregation process. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/parameters.hh>

│ │ │ │ +

#include <dune/istl/paamg/parameters.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::AggregationParameters:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -172,15 +172,15 @@ │ │ │ │ double alpha () const │ │ │ │  Get the scaling value for marking connections as strong. Default value is 1/3.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │

Parameters needed for the aggregation process.

│ │ │ │

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

Parameters for the complete coarsening process. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/parameters.hh>

│ │ │ │ +

#include <dune/istl/paamg/parameters.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::CoarseningParameters:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -204,15 +204,15 @@ │ │ │ │ double alpha () const │ │ │ │  Get the scaling value for marking connections as strong. Default value is 1/3.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │

Parameters for the complete coarsening process.

│ │ │ │

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

All parameters for AMG. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/parameters.hh>

│ │ │ │ +

#include <dune/istl/paamg/parameters.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::Parameters:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -235,15 +235,15 @@ │ │ │ │  Get the scaling value for marking connections as strong. Default value is 1/3.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │

All parameters for AMG.

│ │ │ │

Instances of this class can be provided to CoarsenCriterion via its constructor.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02432.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::SequentialInformation Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/pinfo.hh>

│ │ │ │ +

#include <dune/istl/paamg/pinfo.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -583,15 +583,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef Communication< void * > MPICommunicator
 
typedef EmptySet< int > CopyFlags
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02436.html │ │ │ │ @@ -76,19 +76,19 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Tag idnetifying the visited property of a vertex. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/properties.hh>

│ │ │ │ +

#include <dune/istl/paamg/properties.hh>

│ │ │ │

Detailed Description

│ │ │ │

Tag idnetifying the visited property of a vertex.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02440.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A property map that extracts one property out of a bundle using operator[]() │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/properties.hh>

│ │ │ │ +

#include <dune/istl/paamg/properties.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -127,15 +127,15 @@ │ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<typename C, typename K, std::size_t i, typename T = typename C::ValueType, typename R = typename C::Reference>
│ │ │ │ class Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >

A property map that extracts one property out of a bundle using operator[]()

│ │ │ │

Using this access class properties can be stored in std::bitset.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02444.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::AggregateRenumberer< G > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/renumberer.hh>

│ │ │ │ +

#include <dune/istl/paamg/renumberer.hh>

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

│ │ │ │ Public Types

typedef G::VertexDescriptor Vertex
 The vertex type.
 
│ │ │ │ @@ -265,15 +265,15 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02448.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::DefaultSmootherArgs< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The default class for the smoother arguments. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::DefaultSmootherArgs< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -118,15 +118,15 @@ │ │ │ │  The relaxation factor to use.
│ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ struct Dune::Amg::DefaultSmootherArgs< T >

The default class for the smoother arguments.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02452.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::Amg::SmootherTraits< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Traits class for getting the attribute class of a smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SmootherTraits< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │ typedef DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments │ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ struct Dune::Amg::SmootherTraits< T >

Traits class for getting the attribute class of a smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02456.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::SmootherTraits< Richardson< X, Y > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultSmootherArgs< typename X::field_type > Arguments
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02460.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02464.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02468.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::DefaultConstructionArgs< T > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │

Construction Arguments for the default smoothers. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::DefaultConstructionArgs< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -131,15 +131,15 @@ │ │ │ │ const Matrix * matrix_ │ │ │ │   │ │ │ │ │ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ class Dune::Amg::DefaultConstructionArgs< T >

Construction Arguments for the default smoothers.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02472.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::ConstructionArgs< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::ConstructionArgs< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -115,15 +115,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Protected Attributes

const Matrix * matrix_
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02476.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::DefaultParallelConstructionArgs< T, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::DefaultParallelConstructionArgs< T, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -121,15 +121,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Protected Attributes

const Matrix * matrix_
 
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02480.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::DefaultConstructionArgs< Richardson< X, Y > > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

virtual ~DefaultConstructionArgs ()
 
template<class... Args>
void setMatrix (const Args &...)
 
const SequentialInformationgetComm ()
 
const SmootherArgs getArgs () const
 
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02484.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::ConstructionTraits< SeqSSOR< M, X, Y, l > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Policy for the construction of the SeqSSOR smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │

static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct (Arguments &args)
 
│ │ │ │

Detailed Description

│ │ │ │
template<class M, class X, class Y, int l>
│ │ │ │ struct Dune::Amg::ConstructionTraits< SeqSSOR< M, X, Y, l > >

Policy for the construction of the SeqSSOR smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02488.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::ConstructionTraits< SeqSOR< M, X, Y, l > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Policy for the construction of the SeqSOR smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │

static std::shared_ptr< SeqSOR< M, X, Y, l > > construct (Arguments &args)
 
│ │ │ │

Detailed Description

│ │ │ │
template<class M, class X, class Y, int l>
│ │ │ │ struct Dune::Amg::ConstructionTraits< SeqSOR< M, X, Y, l > >

Policy for the construction of the SeqSOR smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02492.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::ConstructionTraits< SeqJac< M, X, Y, l > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Policy for the construction of the SeqJac smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │

static std::shared_ptr< SeqJac< M, X, Y, l > > construct (Arguments &args)
 
│ │ │ │

Detailed Description

│ │ │ │
template<class M, class X, class Y, int l>
│ │ │ │ struct Dune::Amg::ConstructionTraits< SeqJac< M, X, Y, l > >

Policy for the construction of the SeqJac smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02496.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::ConstructionTraits< Richardson< X, Y > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Policy for the construction of the Richardson smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultConstructionArgs< Richardson< X, Y > > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │

static std::shared_ptr< Richardson< X, Y > > construct (Arguments &args)
 
│ │ │ │

Detailed Description

│ │ │ │
template<class X, class Y>
│ │ │ │ struct Dune::Amg::ConstructionTraits< Richardson< X, Y > >

Policy for the construction of the Richardson smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02500.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -333,15 +333,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02504.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Policy for the construction of the SeqILU smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef ConstructionArgs< SeqILU< M, X, Y > > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │

static std::shared_ptr< SeqILU< M, X, Y > > construct (Arguments &args)
 
│ │ │ │

Detailed Description

│ │ │ │
template<class M, class X, class Y>
│ │ │ │ struct Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > >

Policy for the construction of the SeqILU smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02508.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::ConstructionTraits< ParSSOR< M, X, Y, C > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Policy for the construction of the ParSSOR smoother. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultParallelConstructionArgs< M, C > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │

static std::shared_ptr< ParSSOR< M, X, Y, C > > construct (Arguments &args)
 
│ │ │ │

Detailed Description

│ │ │ │
template<class M, class X, class Y, class C>
│ │ │ │ struct Dune::Amg::ConstructionTraits< ParSSOR< M, X, Y, C > >

Policy for the construction of the ParSSOR smoother.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02512.html │ │ │ │ @@ -77,30 +77,30 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< BlockPreconditioner< X, Y, C, T > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultParallelConstructionArgs< T, C > Arguments
 
typedef ConstructionTraits< T > SeqConstructionTraits
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct (Arguments &args)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02516.html │ │ │ │ @@ -77,30 +77,30 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< NonoverlappingBlockPreconditioner< C, T > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef DefaultParallelConstructionArgs< T, C > Arguments
 
typedef ConstructionTraits< T > SeqConstructionTraits
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct (Arguments &args)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02520.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Amg::SmootherApplier< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper class for applying the smoothers. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │

│ │ │ │ Public Types

typedef T Smoother
 
typedef Smoother::range_type Range
 
│ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ struct Dune::Amg::SmootherApplier< T >

Helper class for applying the smoothers.

│ │ │ │

The goal of this class is to get a symmetric AMG method whenever possible.

│ │ │ │

The specializations for SOR and SeqOverlappingSchwarz in MultiplicativeSchwarzMode will apply the smoother forward when pre and backward when post smoothing.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02524.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::SmootherApplier< SeqSOR< M, X, Y, l > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ Static Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef SeqSOR< M, X, Y, l > Smoother
 
typedef Smoother::range_type Range
 
static void preSmooth (Smoother &smoother, Domain &v, Range &d)
 
static void postSmooth (Smoother &smoother, Domain &v, Range &d)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02528.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::SmootherApplier< BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ Static Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother
 
typedef Smoother::range_type Range
 
static void preSmooth (Smoother &smoother, Domain &v, Range &d)
 
static void postSmooth (Smoother &smoother, Domain &v, Range &d)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02532.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::SmootherApplier< NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ Static Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother
 
typedef Smoother::range_type Range
 
static void preSmooth (Smoother &smoother, Domain &v, Range &d)
 
static void postSmooth (Smoother &smoother, Domain &v, Range &d)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02536.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::SmootherApplier< SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ Static Public Member Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother
 
typedef Smoother::range_type Range
 
static void preSmooth (Smoother &smoother, Domain &v, const Range &d)
 
static void postSmooth (Smoother &smoother, Domain &v, const Range &d)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02540.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::SeqOverlappingSchwarzSmootherArgs< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::SeqOverlappingSchwarzSmootherArgs< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -121,15 +121,15 @@ │ │ │ │  The numbe of iterations to perform.
│ │ │ │   │ │ │ │ RelaxationFactor relaxationFactor │ │ │ │  The relaxation factor to use.
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02544.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::Amg::SmootherTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02548.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -348,15 +348,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02564.html │ │ │ │ @@ -77,28 +77,28 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::ConstructionTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/smoother.hh>

│ │ │ │ +

#include <dune/istl/paamg/smoother.hh>

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

│ │ │ │ Public Types

typedef ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct (Arguments &args)
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02568.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::Transfer< V1, V2, T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/transfer.hh>

│ │ │ │ +

#include <dune/istl/paamg/transfer.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -298,15 +298,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef V1 Vertex
 
typedef V2 Vector
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02572.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::Transfer< V, V1, SequentialInformation > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/transfer.hh>

│ │ │ │ +

#include <dune/istl/paamg/transfer.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -288,15 +288,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef V Vertex
 
typedef V1 Vector
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02576.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/transfer.hh>

│ │ │ │ +

#include <dune/istl/paamg/transfer.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -149,15 +149,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef V Vertex
 
typedef V1 Vector
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02580.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::LevelTransferPolicy< FO, CO > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Abstract base class for transfer between levels and creation of the coarse level system. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │ +

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::LevelTransferPolicy< FO, CO >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -620,15 +620,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The coarse level rhs.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02584.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::AggregationLevelTransferPolicy< O, C > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A LeveTransferPolicy that used aggregation to construct the coarse level system. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │ +

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::AggregationLevelTransferPolicy< O, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -722,15 +722,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The coarse level rhs.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02588.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::Amg::OneStepAMGCoarseSolverPolicy< O, S, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A policy class for solving the coarse level system using one step of AMG. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │ +

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -383,15 +383,15 @@ │ │ │ │

│ │ │ │ Public Types

typedef O Operator
 The type of the linear operator used.
 
typedef O::range_type X
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02596.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Amg::TwoLevelMethod< FO, CSP, S > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │ +

#include <dune/istl/paamg/twolevelmethod.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Amg::TwoLevelMethod< FO, CSP, S >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -812,15 +812,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02604.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Preconditioner< X, Y > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class for matrix free definition of preconditioners. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioner.hh>

│ │ │ │ +

#include <dune/istl/preconditioner.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Preconditioner< X, Y >:
│ │ │ │ │ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02608.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::InverseOperator2Preconditioner< O, c > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Turns an InverseOperator into a Preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::InverseOperator2Preconditioner< O, c >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -467,15 +467,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< O::domain_type, O::range_type >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02612.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqSSOR< M, X, Y, l > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Sequential SSOR preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqSSOR< M, X, Y, l >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -608,15 +608,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02616.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqSOR< M, X, Y, l > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Sequential SOR preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqSOR< M, X, Y, l >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -657,15 +657,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02620.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqJac< M, X, Y, l > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The sequential jacobian preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqJac< M, X, Y, l >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -608,15 +608,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02624.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::SeqILU< M, X, Y, l > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Sequential ILU preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqILU< M, X, Y, l >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -891,15 +891,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

true if w != 1.0

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02628.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Richardson< X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Richardson preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Richardson< X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -495,15 +495,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02632.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqILDL< M, X, Y > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

sequential ILDL preconditioner │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/preconditioners.hh>

│ │ │ │ +

#include <dune/istl/preconditioners.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqILDL< M, X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -595,15 +595,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02640.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::RedistributeInterface Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/repartition.hh>

│ │ │ │ +

#include <dune/istl/repartition.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::RedistributeInterface:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -297,15 +297,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02660.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::ScalarProduct< X > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class for scalar product and norm computation. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/scalarproducts.hh>

│ │ │ │ +

#include <dune/istl/scalarproducts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ScalarProduct< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -316,15 +316,15 @@ │ │ │ │

Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

│ │ │ │ │ │ │ │

Reimplemented in Dune::ParallelScalarProduct< X, C >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02664.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::ParallelScalarProduct< X, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Scalar product for overlapping Schwarz methods. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/scalarproducts.hh>

│ │ │ │ +

#include <dune/istl/scalarproducts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ParallelScalarProduct< X, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -408,15 +408,15 @@ │ │ │ │

Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

│ │ │ │ │ │ │ │

Reimplemented from Dune::ScalarProduct< X >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02668.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SeqScalarProduct< X > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Default implementation for the scalar case. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/scalarproducts.hh>

│ │ │ │ +

#include <dune/istl/scalarproducts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SeqScalarProduct< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -299,15 +299,15 @@ │ │ │ │

Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

│ │ │ │ │ │ │ │

Reimplemented in Dune::ParallelScalarProduct< X, C >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02672.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::NonoverlappingSchwarzScalarProduct< X, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Nonoverlapping Scalar Product with communication object. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/scalarproducts.hh>

│ │ │ │ +

#include <dune/istl/scalarproducts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::NonoverlappingSchwarzScalarProduct< X, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -397,15 +397,15 @@ │ │ │ │

Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

│ │ │ │ │ │ │ │

Reimplemented from Dune::ScalarProduct< X >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02676.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::OverlappingSchwarzScalarProduct< X, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Scalar product for overlapping Schwarz methods. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/scalarproducts.hh>

│ │ │ │ +

#include <dune/istl/scalarproducts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::OverlappingSchwarzScalarProduct< X, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -403,15 +403,15 @@ │ │ │ │

Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

│ │ │ │ │ │ │ │

Reimplemented from Dune::ScalarProduct< X >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02680.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::ScaledIdentityMatrix< K, n > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A multiple of the identity matrix of static size. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/scaledidmatrix.hh>

│ │ │ │ +

#include <dune/istl/scaledidmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -2167,15 +2167,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

We are at the leaf of the block recursion.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02684.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/scaledidmatrix.hh>

│ │ │ │ +

#include <dune/istl/scaledidmatrix.hh>

│ │ │ │

│ │ │ │ Public Types

enum  { rows = n │ │ │ │ , cols = n │ │ │ │ }
 export size More...
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static void apply (DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > const &rhs)
 
│ │ │ │

Member Function Documentation

│ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02688.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::FieldTraits< ScaledIdentityMatrix< K, n > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/scaledidmatrix.hh>

│ │ │ │ +

#include <dune/istl/scaledidmatrix.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -119,15 +119,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using field_type = typename ScaledIdentityMatrix< K, n >::field_type
 
using real_type = typename FieldTraits< field_type >::real_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02692.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::ParSSOR< M, X, Y, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A parallel SSOR preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/schwarz.hh>

│ │ │ │ +

#include <dune/istl/schwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::ParSSOR< M, X, Y, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -475,15 +475,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02696.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::BlockPreconditioner< X, Y, C, P > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Block parallel preconditioner. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/schwarz.hh>

│ │ │ │ +

#include <dune/istl/schwarz.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BlockPreconditioner< X, Y, C, P >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -549,15 +549,15 @@ │ │ │ │ │ │ │ │ │ │ │ │

Implements Dune::Preconditioner< X, Y >.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02700.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::InverseOperatorResult Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Statistics about the application of an inverse operator. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -269,15 +269,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Reduction achieved: $ \|b-A(x^n)\|/\|b-A(x^0)\|$.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02704.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::InverseOperator< X, Y > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Abstract base class for all solvers. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::InverseOperator< X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -644,15 +644,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

helper function for printing solver output

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02708.html │ │ │ │ @@ -84,15 +84,15 @@ │ │ │ │
Dune::IterativeSolver< X, Y > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class for all implementations of iterative solvers. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::IterativeSolver< X, Y >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1324,15 +1324,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

 InverseOperatorResult ()
 Default constructor.
 
void clear ()
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02712.html │ │ │ │ @@ -81,15 +81,15 @@ │ │ │ │
Dune::IterativeSolver< X, Y >::Iteration< CountType > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Class for controlling iterative methods. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -526,15 +526,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

 Iteration (const IterativeSolver &parent, InverseOperatorResult &res)
 
 Iteration (const Iteration &)=delete
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02716.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in a unified way, i.e. independent from the solver's type (direct/iterative). │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -140,15 +140,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Implementation
 Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTABSolver. More...
 
struct  Implementation< true, Dummy >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02720.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< is_direct_solver, Dummy > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTABSolver. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

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

│ │ │ │ Static Public Member Functions

static void setMatrix (ISTLLinearSolver &, const BCRSMatrix &)
 
│ │ │ │

Detailed Description

│ │ │ │ @@ -132,15 +132,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02724.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< true, Dummy > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Implementation that works together with direct ISTL solvers, e.g. Dune::SuperLU or Dune::UMFPack. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solver.hh>

│ │ │ │ +

#include <dune/istl/solver.hh>

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

│ │ │ │ Static Public Member Functions

static void setMatrix (ISTLLinearSolver &solver, const BCRSMatrix &matrix)
 
│ │ │ │

Detailed Description

│ │ │ │ @@ -132,15 +132,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02728.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SolverCategory Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Categories for the solvers. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvercategory.hh>

│ │ │ │ +

#include <dune/istl/solvercategory.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -164,15 +164,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Helperfunction to extract the solver category either from an enum, or from the newly introduced virtual member function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02732.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::InvalidSolverCategory Class Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/solvercategory.hh>

│ │ │ │ +

#include <dune/istl/solvercategory.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::InvalidSolverCategory:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02736.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::SolverFactory< Operator > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Factory to assembly solvers configured by a ParameterTree. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solverfactory.hh>

│ │ │ │ +

#include <dune/istl/solverfactory.hh>

│ │ │ │

│ │ │ │ Public Types

enum  Category { sequential │ │ │ │ , nonoverlapping │ │ │ │ , overlapping │ │ │ │ }
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Construct a Preconditioner for a given Operator.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02760.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::LoopSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Preconditioned loop solver. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::LoopSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -971,15 +971,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Member Functions

static std::shared_ptr< Solverget (std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr)
 get a solver from the factory
 
static std::shared_ptr< PreconditionergetPreconditioner (std::shared_ptr< Operator > op, const ParameterTree &config)
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02764.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::GradientSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

gradient method │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::GradientSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -971,15 +971,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02768.html │ │ │ │ @@ -84,15 +84,15 @@ │ │ │ │
Dune::CGSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

conjugate gradient method │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::CGSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1234,15 +1234,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02772.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::BiCGSTABSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Bi-conjugate Gradient Stabilized (BiCG-STAB) │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BiCGSTABSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -975,15 +975,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02776.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::MINRESSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Minimal Residual Method (MINRES) │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::MINRESSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -972,15 +972,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02780.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::RestartedGMResSolver< X, Y, F > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

implements the Generalized Minimal Residual (GMRes) method │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::RestartedGMResSolver< X, Y, F >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1595,15 +1595,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02784.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::RestartedFlexibleGMResSolver< X, Y, F > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned) │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::RestartedFlexibleGMResSolver< X, Y, F >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1167,15 +1167,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02788.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::GeneralizedPCGSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Generalized preconditioned conjugate gradient solver. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::GeneralizedPCGSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1288,15 +1288,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02792.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::RestartedFCGSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Accelerated flexible conjugate gradient method. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::RestartedFCGSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1344,15 +1344,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02796.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
Dune::CompleteFCGSolver< X > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Complete flexible conjugate gradient method. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/solvers.hh>

│ │ │ │ +

#include <dune/istl/solvers.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::CompleteFCGSolver< X >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1003,15 +1003,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02800.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsDirectSolver< Solver > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/solvertype.hh>

│ │ │ │ +

#include <dune/istl/solvertype.hh>

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

│ │ │ │ Public Types

enum  { value =false │ │ │ │ }
 
│ │ │ │ @@ -107,15 +107,15 @@ │ │ │ │

If Solver is a direct solver, this is true.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02804.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::StoresColumnCompressed< Solver > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/solvertype.hh>

│ │ │ │ +

#include <dune/istl/solvertype.hh>

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

│ │ │ │ Public Types

enum  { value = false │ │ │ │ }
 
│ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │ Enumeratorvalue 

whether the solver internally uses column compressed storage

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02808.html │ │ │ │ @@ -76,26 +76,26 @@ │ │ │ │
Dune::SPQR< Matrix > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Use the SPQR package to directly solve linear systems – empty default class. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<class Matrix>
│ │ │ │ class Dune::SPQR< Matrix >

Use the SPQR package to directly solve linear systems – empty default class.

│ │ │ │
Template Parameters
│ │ │ │ │ │ │ │ │ │ │ │
Matrixthe matrix type defining the system Details on SPQR can be found on http://www.cise.ufl.edu/research/sparse/spqr/
│ │ │ │
│ │ │ │
│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02812.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The SPQR direct sparse solver for matrices of type BCRSMatrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -557,15 +557,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

helper function for printing solver output

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02816.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02820.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02824.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Classes | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SPQRCreator Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  isValidBlock
 
struct  isValidBlock< FieldVector< double, 1 > >
 
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
 
template<typename TL , typename M >
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const M &, const Dune::ParameterTree &, std::enable_if_t<!isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02828.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SPQRCreator::isValidBlock< class > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SPQRCreator::isValidBlock< class >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02832.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > > Struct Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/spqr.hh>

│ │ │ │ +

#include <dune/istl/spqr.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02836.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUSolveChooser< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02840.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUDenseMatChooser< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02844.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUQueryChooser< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02848.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::QuerySpaceChooser< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02864.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SuperLU< M > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

SuperLu Solver. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLU< M >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -476,15 +476,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02868.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsDirectSolver< SuperLU< BCRSMatrix< T, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

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

│ │ │ │ Public Types

enum  { value =true │ │ │ │ }
 
│ │ │ │ @@ -105,15 +105,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
Enumerator
value 
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02872.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::StoresColumnCompressed< SuperLU< BCRSMatrix< T, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │ @@ -105,15 +105,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
Enumerator
value 
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02876.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Classes | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SuperLUCreator Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -203,15 +203,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  isValidBlock
 
struct  isValidBlock< double >
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02880.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUCreator::isValidBlock< class > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUCreator::isValidBlock< class >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02884.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< double, k > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< double, k > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02888.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< std::complex< double >, k > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< std::complex< double >, k > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02892.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUCreator::isValidBlock< double > Struct Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUCreator::isValidBlock< double >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02896.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperLUCreator::isValidBlock< std::complex< double > > Struct Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/superlu.hh>

│ │ │ │ +

#include <dune/istl/superlu.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUCreator::isValidBlock< std::complex< double > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02900.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperMatrixCreateSparseChooser< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02904.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperMatrixPrinter< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02908.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
│ │ │ │ Static Public Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::BaseGetSuperLUType< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::BaseGetSuperLUType< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -137,15 +137,15 @@ │ │ │ │
std::is_same<T,float>::value ? SLU_S :
│ │ │ │
( std::is_same<T,std::complex<double> >::value ? SLU_Z :
│ │ │ │
( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ))
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02912.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::GetSuperLUType< T > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02916.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::GetSuperLUType< double > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::GetSuperLUType< double >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -140,15 +140,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02920.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::GetSuperLUType< float > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::GetSuperLUType< float >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -140,15 +140,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02924.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::GetSuperLUType< std::complex< double > > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::GetSuperLUType< std::complex< double > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -140,15 +140,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02928.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::GetSuperLUType< std::complex< float > > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::GetSuperLUType< std::complex< float > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -140,15 +140,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02932.html │ │ │ │ @@ -76,30 +76,30 @@ │ │ │ │
Dune::SuperLUMatrix< M > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Utility class for converting an ISTL Matrix into a SuperLU Matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUMatrix< M >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │
template<class M>
│ │ │ │ struct Dune::SuperLUMatrix< M >

Utility class for converting an ISTL Matrix into a SuperLU Matrix.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02936.html │ │ │ │ @@ -73,17 +73,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::SuperMatrixInitializer< M > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02940.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::SuperLUMatrix< BCRSMatrix< B, TA > > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Converter for BCRSMatrix to SuperLU Matrix. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperLUMatrix< BCRSMatrix< B, TA > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -491,15 +491,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02944.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Public Types | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::SuperMatrixInitializer< BCRSMatrix< B, A > > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/supermatrix.hh>

│ │ │ │ +

#include <dune/istl/supermatrix.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::SuperMatrixInitializer< BCRSMatrix< B, A > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -225,15 +225,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02948.html │ │ │ │ @@ -76,23 +76,23 @@ │ │ │ │
│ │ │ │ Static Public Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::UMFPackMethodChooser< SCalar, Integer > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

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

│ │ │ │ Static Public Attributes

static constexpr bool valid = false
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02952.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::UMFPackMethodChooser< double, std::true_type > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -118,15 +118,15 @@ │ │ │ │

│ │ │ │ Static Public Member Functions

template<typename... A>
static void defaults (A... args)
 
template<typename... A>
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Attributes

static constexpr bool valid = true
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02956.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::UMFPackMethodChooser< double, std::false_type > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -118,15 +118,15 @@ │ │ │ │

│ │ │ │ Static Public Member Functions

template<typename... A>
static void defaults (A... args)
 
template<typename... A>
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Static Public Attributes

static constexpr bool valid = true
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02960.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::UMFPackMethodChooser< std::complex< double >, std::true_type > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

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

│ │ │ │ Public Types

using umf_int_type = int64_t
 
│ │ │ │

│ │ │ │ @@ -124,15 +124,15 @@ │ │ │ │

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

│ │ │ │ Static Public Attributes

static constexpr bool valid = true
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02964.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Static Public Member Functions | │ │ │ │ Static Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::UMFPackMethodChooser< std::complex< double >, std::false_type > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

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

│ │ │ │ Public Types

using umf_int_type = int32_t
 
│ │ │ │

│ │ │ │ @@ -124,15 +124,15 @@ │ │ │ │

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

│ │ │ │ Static Public Attributes

static constexpr bool valid = true
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02980.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::UMFPack< M > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The UMFPack direct sparse solver. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::UMFPack< M >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -190,15 +190,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
Matrixthe matrix type defining the system
│ │ │ │ │ │ │ │ │ │ │ │
Note
This will only work if dune-istl has been configured to use UMFPack
│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02984.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::IsDirectSolver< UMFPack< BCRSMatrix< FieldMatrix< T, n, m >, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

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

│ │ │ │ Public Types

enum  { value =true │ │ │ │ }
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02988.html │ │ │ │ @@ -76,24 +76,24 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::StoresColumnCompressed< UMFPack< BCRSMatrix< T, A > > > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

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

│ │ │ │ Public Types

enum  { value = true │ │ │ │ }
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02992.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ Classes | │ │ │ │ Public Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::UMFPackCreator Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  isValidBlock
 
struct  isValidBlock< B, std::enable_if_t< std::is_same< typename FieldTraits< B >::real_type, double >::value > >
 
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
 
template<typename TL , typename M >
std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL >::type, typename Dune::TypeListElement< 2, TL >::type > > operator() (TL, const M &, const Dune::ParameterTree &, std::enable_if_t< !isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
 
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a02996.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::UMFPackCreator::isValidBlock< F, class > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::UMFPackCreator::isValidBlock< F, class >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a03000.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::UMFPackCreator::isValidBlock< B, std::enable_if_t< std::is_same< typename FieldTraits< B >::real_type, double >::value > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/istl/umfpack.hh>

│ │ │ │ +

#include <dune/istl/umfpack.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::UMFPackCreator::isValidBlock< B, std::enable_if_t< std::is_same< typename FieldTraits< B >::real_type, double >::value > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a03004.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::VariableBlockVector< B, A > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A Vector of blocks with different blocksizes. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/vbvector.hh>

│ │ │ │ +

#include <dune/istl/vbvector.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::VariableBlockVector< B, A >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1210,15 +1210,15 @@ │ │ │ │ │ │ │ │
│ │ │ │

increment block level counter, yes, it is two levels because VariableBlockVector is a container of containers

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a03008.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::VariableBlockVector< B, A >::CreateIterator Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Iterator class for sequential creation of blocks. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/vbvector.hh>

│ │ │ │ +

#include <dune/istl/vbvector.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -507,15 +507,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

set size of current block

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/a03012.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
Dune::VariableBlockVector< B, A >::RealIterator< T, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Iterator class for sequential access. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/istl/vbvector.hh>

│ │ │ │ +

#include <dune/istl/vbvector.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::VariableBlockVector< B, A >::RealIterator< T, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -447,15 +447,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Return the index of the entry this iterator is pointing to.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000000.html │ │ │ │ @@ -69,14 +69,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

istl → common Relation

│ │ │ │ Public Types

using iterator_category = std::output_iterator_tag
 iterator category
 
using value_type = size_type
File in dune/istlIncludes file in dune/istl/common
solverregistry.hhregistry.hh
│ │ │ │ +

istl → common Relation

File in dune/istlIncludes file in dune/istl/common
solverregistry.hhregistry.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000004.html │ │ │ │ @@ -69,14 +69,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

istl → eigenvalue Relation

File in dune/istlIncludes file in dune/istl/eigenvalue
solvers.hharpackpp.hh
│ │ │ │ +

istl → eigenvalue Relation

File in dune/istlIncludes file in dune/istl/eigenvalue
solvers.hharpackpp.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000006.html │ │ │ │ @@ -69,14 +69,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

istl → paamg Relation

File in dune/istlIncludes file in dune/istl/paamg
matrixredistribute.hhpinfo.hh
repartition.hhgraph.hh
│ │ │ │ +

istl → paamg Relation

File in dune/istlIncludes file in dune/istl/paamg
matrixredistribute.hhpinfo.hh
repartition.hhgraph.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_30ac00acf892fa1550fd06f6d9d3e856.html │ │ │ │ @@ -84,17 +84,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

 counter.hh
 counter.hh
 
 registry.hh
 registry.hh
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_4aff653484460245da749266b1996776.html │ │ │ │ @@ -84,17 +84,17 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

 arpackpp.hh
 arpackpp.hh
 
 poweriteration.hh
 poweriteration.hh
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e12c67a8fe12cf8b78c94f3b4cb9926.html │ │ │ │ @@ -102,140 +102,140 @@ │ │ │ │  eigenvalue │ │ │ │   │ │ │ │  paamg │ │ │ │   │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

 allocator.hh
 allocator.hh
 
 basearray.hh
 Implements several basic array containers.
 basearray.hh
 Implements several basic array containers.
 
 bccsmatrix.hh
 bccsmatrix.hh
 
 bccsmatrixinitializer.hh
 bccsmatrixinitializer.hh
 
 bcrsmatrix.hh
 Implementation of the BCRSMatrix class.
 bcrsmatrix.hh
 Implementation of the BCRSMatrix class.
 
 bdmatrix.hh
 Implementation of the BDMatrix class.
 bdmatrix.hh
 Implementation of the BDMatrix class.
 
 blocklevel.hh
 Helper functions for determining the vector/matrix block level.
 blocklevel.hh
 Helper functions for determining the vector/matrix block level.
 
 btdmatrix.hh
 Implementation of the BTDMatrix class.
 btdmatrix.hh
 Implementation of the BTDMatrix class.
 
 bvector.hh
 This file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time.
 bvector.hh
 This file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time.
 
 cholmod.hh
 cholmod.hh
 
 foreach.hh
 foreach.hh
 
 gsetc.hh
 Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
 gsetc.hh
 Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
 
 ildl.hh
 Incomplete LDL decomposition.
 ildl.hh
 Incomplete LDL decomposition.
 
 ilu.hh
 The incomplete LU factorization kernels.
 ilu.hh
 The incomplete LU factorization kernels.
 
 ilusubdomainsolver.hh
 Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.
 ilusubdomainsolver.hh
 Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.
 
 io.hh
 Some generic functions for pretty printing vectors and matrices.
 io.hh
 Some generic functions for pretty printing vectors and matrices.
 
 istlexception.hh
 istlexception.hh
 
 ldl.hh
 Class for using LDL with ISTL matrices.
 ldl.hh
 Class for using LDL with ISTL matrices.
 
 matrix.hh
 A dynamic dense block matrix class.
 matrix.hh
 A dynamic dense block matrix class.
 
 matrixindexset.hh
 matrixindexset.hh
 
 matrixmarket.hh
 Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
 matrixmarket.hh
 Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
 
 matrixmatrix.hh
 provides functions for sparse matrix matrix multiplication.
 matrixmatrix.hh
 provides functions for sparse matrix matrix multiplication.
 
 matrixredistribute.hh
 Functionality for redistributing a sparse matrix.
 matrixredistribute.hh
 Functionality for redistributing a sparse matrix.
 
 matrixutils.hh
 Some handy generic functions for ISTL matrices.
 matrixutils.hh
 Some handy generic functions for ISTL matrices.
 
 multitypeblockmatrix.hh
 multitypeblockmatrix.hh
 
 multitypeblockvector.hh
 multitypeblockvector.hh
 
 novlpschwarz.hh
 novlpschwarz.hh
 
 operators.hh
 Define general, extensible interface for operators. The available implementation wraps a matrix.
 operators.hh
 Define general, extensible interface for operators. The available implementation wraps a matrix.
 
 overlappingschwarz.hh
 Contains one level overlapping Schwarz preconditioners.
 overlappingschwarz.hh
 Contains one level overlapping Schwarz preconditioners.
 
 owneroverlapcopy.hh
 Classes providing communication interfaces for overlapping Schwarz methods.
 owneroverlapcopy.hh
 Classes providing communication interfaces for overlapping Schwarz methods.
 
 preconditioner.hh
 preconditioner.hh
 
 preconditioners.hh
 Define general preconditioner interface.
 preconditioners.hh
 Define general preconditioner interface.
 
 repartition.hh
 Functionality for redistributing a parallel index set using graph partitioning.
 repartition.hh
 Functionality for redistributing a parallel index set using graph partitioning.
 
 scalarproducts.hh
 Define base class for scalar product and norm.
 scalarproducts.hh
 Define base class for scalar product and norm.
 
 scaledidmatrix.hh
 This file implements a quadratic matrix of fixed size which is a multiple of the identity.
 scaledidmatrix.hh
 This file implements a quadratic matrix of fixed size which is a multiple of the identity.
 
 schwarz.hh
 schwarz.hh
 
 solver.hh
 Define general, extensible interface for inverse operators.
 solver.hh
 Define general, extensible interface for inverse operators.
 
 solvercategory.hh
 solvercategory.hh
 
 solverfactory.hh
 solverfactory.hh
 
 solverregistry.hh
 
 solvers.hh
 Implementations of the inverse operator interface.
 solvers.hh
 Implementations of the inverse operator interface.
 
 solvertype.hh
 Templates characterizing the type of a solver.
 solvertype.hh
 Templates characterizing the type of a solver.
 
 spqr.hh
 Class for using SPQR with ISTL matrices.
 spqr.hh
 Class for using SPQR with ISTL matrices.
 
 superlu.hh
 Classes for using SuperLU with ISTL matrices.
 superlu.hh
 Classes for using SuperLU with ISTL matrices.
 
 superlufunctions.hh
 superlufunctions.hh
 
 supermatrix.hh
 supermatrix.hh
 
 umfpack.hh
 Classes for using UMFPack with ISTL matrices.
 umfpack.hh
 Classes for using UMFPack with ISTL matrices.
 
 vbvector.hh
 ???
 vbvector.hh
 ???
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4.html │ │ │ │ @@ -84,74 +84,74 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

 aggregates.hh
 Provides classes for the Coloring process of AMG.
 aggregates.hh
 Provides classes for the Coloring process of AMG.
 
 amg.hh
 The AMG preconditioner.
 amg.hh
 The AMG preconditioner.
 
 combinedfunctor.hh
 combinedfunctor.hh
 
 construction.hh
 Helper classes for the construction of classes without empty constructor.
 construction.hh
 Helper classes for the construction of classes without empty constructor.
 
 dependency.hh
 Provides classes for initializing the link attributes of a matrix graph.
 dependency.hh
 Provides classes for initializing the link attributes of a matrix graph.
 
 fastamg.hh
 A fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers.
 fastamg.hh
 A fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers.
 
 fastamgsmoother.hh
 fastamgsmoother.hh
 
 galerkin.hh
 Provides a class for building the galerkin product based on a aggregation scheme.
 galerkin.hh
 Provides a class for building the galerkin product based on a aggregation scheme.
 
 globalaggregates.hh
 Provdes class for identifying aggregates globally.
 globalaggregates.hh
 Provdes class for identifying aggregates globally.
 
 graph.hh
 Provides classes for building the matrix graph.
 graph.hh
 Provides classes for building the matrix graph.
 
 graphcreator.hh
 graphcreator.hh
 
 hierarchy.hh
 Provides a classes representing the hierarchies in AMG.
 hierarchy.hh
 Provides a classes representing the hierarchies in AMG.
 
 indicescoarsener.hh
 Provides a class for building the index set and remote indices on the coarse level.
 indicescoarsener.hh
 Provides a class for building the index set and remote indices on the coarse level.
 
 kamg.hh
 Provides an algebraic multigrid using a Krylov cycle.
 kamg.hh
 Provides an algebraic multigrid using a Krylov cycle.
 
 matrixhierarchy.hh
 Provides a classes representing the hierarchies in AMG.
 matrixhierarchy.hh
 Provides a classes representing the hierarchies in AMG.
 
 parameters.hh
 Parameter classes for customizing AMG.
 parameters.hh
 Parameter classes for customizing AMG.
 
 pinfo.hh
 pinfo.hh
 
 properties.hh
 Provides classes for handling internal properties in a graph.
 properties.hh
 Provides classes for handling internal properties in a graph.
 
 renumberer.hh
 renumberer.hh
 
 smoother.hh
 Classes for the generic construction and application of the smoothers.
 smoother.hh
 Classes for the generic construction and application of the smoothers.
 
 transfer.hh
 Prolongation and restriction for amg.
 transfer.hh
 Prolongation and restriction for amg.
 
 twolevelmethod.hh
 Algebraic twolevel methods.
 twolevelmethod.hh
 Algebraic twolevel methods.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz │ │ │ │ ├── dune-istl.tag │ │ │ │ │ ├── dune-istl.tag │ │ │ │ │ │ @@ -9,185 +9,185 @@ │ │ │ │ │ │ modules.txt │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/doc/doxygen/ │ │ │ │ │ │ a00005.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ allocator.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00074.html │ │ │ │ │ │ + a00035.html │ │ │ │ │ │ Dune::exists │ │ │ │ │ │ Dune::DefaultAllocatorTraits │ │ │ │ │ │ Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > > │ │ │ │ │ │ Dune::AllocatorTraits │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ basearray.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00026.html │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ + a00200.html │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bccsmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00035.html │ │ │ │ │ │ + a00050.html │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::ISTL │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bccsmatrixinitializer.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00200.html │ │ │ │ │ │ - dune/istl/bccsmatrix.hh │ │ │ │ │ │ + a00026.html │ │ │ │ │ │ + dune/istl/bccsmatrix.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::ISTL │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bcrsmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00068.html │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - matrixutils.hh │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ + a00164.html │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + matrixutils.hh │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ Dune::CompressionStatistics │ │ │ │ │ │ Dune::ImplicitMatrixBuilder │ │ │ │ │ │ Dune::ImplicitMatrixBuilder::row_object │ │ │ │ │ │ Dune::BCRSMatrix │ │ │ │ │ │ Dune::BCRSMatrix::RealRowIterator │ │ │ │ │ │ Dune::BCRSMatrix::CreateIterator │ │ │ │ │ │ Dune::FieldTraits< BCRSMatrix< B, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bdmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00161.html │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ + a00185.html │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ Dune::BDMatrix │ │ │ │ │ │ Dune::FieldTraits< BDMatrix< B, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ blocklevel.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00032.html │ │ │ │ │ │ + a00146.html │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ btdmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00182.html │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ + a00047.html │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ Dune::BTDMatrix │ │ │ │ │ │ Dune::FieldTraits< BTDMatrix< B, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bvector.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00215.html │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ - basearray.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ + a00131.html │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ + basearray.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ Dune::BlockVector │ │ │ │ │ │ Dune::FieldTraits< BlockVector< B, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ cholmod.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00062.html │ │ │ │ │ │ + a00188.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ counter.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/common/ │ │ │ │ │ │ - a00164.html │ │ │ │ │ │ + a00137.html │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::CounterImpl │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GET_COUNTER │ │ │ │ │ │ - a00164.html │ │ │ │ │ │ + a00137.html │ │ │ │ │ │ a52c18e20d25c64cfa14ec5faaa4eb3bd │ │ │ │ │ │ (Tag) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_INC_COUNTER │ │ │ │ │ │ - a00164.html │ │ │ │ │ │ + a00137.html │ │ │ │ │ │ a5d969c720adf3ae3114e5a51e2cf5d96 │ │ │ │ │ │ (Tag) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ constexpr std::size_t │ │ │ │ │ │ maxcount │ │ │ │ │ │ - a00164.html │ │ │ │ │ │ + a00137.html │ │ │ │ │ │ a691e9cc830a63581384caef120bcbef8 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ registry.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/common/ │ │ │ │ │ │ - a00167.html │ │ │ │ │ │ - counter.hh │ │ │ │ │ │ + a00134.html │ │ │ │ │ │ + counter.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_REGISTRY_PUT │ │ │ │ │ │ - a00167.html │ │ │ │ │ │ + a00134.html │ │ │ │ │ │ a5aba8ecf7926f3c3dade1b898db68cf7 │ │ │ │ │ │ (Tag, id,...) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ arpackpp.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/eigenvalue/ │ │ │ │ │ │ - a00224.html │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ - dune/istl/bvector.hh │ │ │ │ │ │ - dune/istl/istlexception.hh │ │ │ │ │ │ - dune/istl/io.hh │ │ │ │ │ │ + a00149.html │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ + dune/istl/bvector.hh │ │ │ │ │ │ + dune/istl/istlexception.hh │ │ │ │ │ │ + dune/istl/io.hh │ │ │ │ │ │ Dune::ArPackPlusPlus_Algorithms │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ poweriteration.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/eigenvalue/ │ │ │ │ │ │ - a00221.html │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ - dune/istl/operators.hh │ │ │ │ │ │ - dune/istl/solvercategory.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ - dune/istl/istlexception.hh │ │ │ │ │ │ - dune/istl/io.hh │ │ │ │ │ │ - dune/istl/solvers.hh │ │ │ │ │ │ + a00152.html │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ + dune/istl/operators.hh │ │ │ │ │ │ + dune/istl/solvercategory.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ + dune/istl/istlexception.hh │ │ │ │ │ │ + dune/istl/io.hh │ │ │ │ │ │ + dune/istl/solvers.hh │ │ │ │ │ │ Dune::PowerIteration_Algorithms │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ foreach.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00173.html │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/scaledidmatrix.hh │ │ │ │ │ │ + a00191.html │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/scaledidmatrix.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::ForEach │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ gsetc.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00017.html │ │ │ │ │ │ - multitypeblockvector.hh │ │ │ │ │ │ - multitypeblockmatrix.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ + a00119.html │ │ │ │ │ │ + multitypeblockvector.hh │ │ │ │ │ │ + multitypeblockmatrix.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ Dune::BL │ │ │ │ │ │ Dune::algmeta_btsolve │ │ │ │ │ │ Dune::algmeta_btsolve< 0, withdiag, withrelax > │ │ │ │ │ │ Dune::algmeta_btsolve< 0, withdiag, norelax > │ │ │ │ │ │ Dune::algmeta_btsolve< 0, nodiag, withrelax > │ │ │ │ │ │ Dune::algmeta_btsolve< 0, nodiag, norelax > │ │ │ │ │ │ Dune::algmeta_bdsolve │ │ │ │ │ │ @@ -197,107 +197,107 @@ │ │ │ │ │ │ Dune::algmeta_itsteps< 0, M > │ │ │ │ │ │ Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ildl.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00158.html │ │ │ │ │ │ - ilu.hh │ │ │ │ │ │ + a00221.html │ │ │ │ │ │ + ilu.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ilu.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00185.html │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ + a00215.html │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ Dune::ILU::CRS │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::ILU │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ilusubdomainsolver.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00050.html │ │ │ │ │ │ - dune/istl/preconditioners.hh │ │ │ │ │ │ - matrix.hh │ │ │ │ │ │ + a00203.html │ │ │ │ │ │ + dune/istl/preconditioners.hh │ │ │ │ │ │ + matrix.hh │ │ │ │ │ │ Dune::ILUSubdomainSolver │ │ │ │ │ │ Dune::ILU0SubdomainSolver │ │ │ │ │ │ Dune::ILUNSubdomainSolver │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ io.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00020.html │ │ │ │ │ │ - matrixutils.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ + a00023.html │ │ │ │ │ │ + matrixutils.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ Dune::DefaultSVGMatrixOptions │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ istlexception.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00056.html │ │ │ │ │ │ + a00044.html │ │ │ │ │ │ Dune::ISTLError │ │ │ │ │ │ Dune::BCRSMatrixError │ │ │ │ │ │ Dune::ImplicitModeCompressionBufferExhausted │ │ │ │ │ │ Dune::SolverAbort │ │ │ │ │ │ Dune::MatrixBlockError │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ldl.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00191.html │ │ │ │ │ │ - dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ - dune/istl/solvers.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ - dune/istl/solverfactory.hh │ │ │ │ │ │ + a00158.html │ │ │ │ │ │ + dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ + dune/istl/solvers.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ + dune/istl/solverfactory.hh │ │ │ │ │ │ Dune::LDL │ │ │ │ │ │ Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > │ │ │ │ │ │ Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > > │ │ │ │ │ │ Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > > │ │ │ │ │ │ Dune::LDLCreator │ │ │ │ │ │ Dune::LDLCreator::isValidBlock │ │ │ │ │ │ Dune::LDLCreator::isValidBlock< FieldVector< double, k > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00047.html │ │ │ │ │ │ - dune/istl/bvector.hh │ │ │ │ │ │ - dune/istl/istlexception.hh │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ + a00179.html │ │ │ │ │ │ + dune/istl/bvector.hh │ │ │ │ │ │ + dune/istl/istlexception.hh │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ Dune::MatrixImp::DenseMatrixBase │ │ │ │ │ │ Dune::MatrixImp::DenseMatrixBase::Iterator │ │ │ │ │ │ Dune::MatrixImp::DenseMatrixBase::ConstIterator │ │ │ │ │ │ Dune::Matrix │ │ │ │ │ │ Dune::FieldTraits< Matrix< T, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::MatrixImp │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrixindexset.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00146.html │ │ │ │ │ │ + a00170.html │ │ │ │ │ │ Dune::MatrixIndexSet │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrixmarket.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00176.html │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/bvector.hh │ │ │ │ │ │ - dune/istl/matrixutils.hh │ │ │ │ │ │ - dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ + a00017.html │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/bvector.hh │ │ │ │ │ │ + dune/istl/matrixutils.hh │ │ │ │ │ │ + dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_numeric_type │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_numeric_type< int > │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_numeric_type< double > │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_numeric_type< float > │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_numeric_type< std::complex< double > > │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > > │ │ │ │ │ │ Dune::MatrixMarketImpl::mm_header_printer< BCRSMatrix< T, A > > │ │ │ │ │ │ @@ -325,16 +325,16 @@ │ │ │ │ │ │ Dune::MatrixMarketFormatError │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::MatrixMarketImpl │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrixmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00065.html │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + a00206.html │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ Dune::MatMultMatResult │ │ │ │ │ │ Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > > │ │ │ │ │ │ Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > > │ │ │ │ │ │ Dune::TransposedMatMultMatResult │ │ │ │ │ │ Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > > │ │ │ │ │ │ Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > > │ │ │ │ │ │ Dune │ │ │ │ │ │ @@ -352,18 +352,18 @@ │ │ │ │ │ │ ga67ae04c7e7c030370f82da49ab2b98d1 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrixredistribute.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00227.html │ │ │ │ │ │ - repartition.hh │ │ │ │ │ │ - dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ - dune/istl/paamg/pinfo.hh │ │ │ │ │ │ + a00011.html │ │ │ │ │ │ + repartition.hh │ │ │ │ │ │ + dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ + dune/istl/paamg/pinfo.hh │ │ │ │ │ │ Dune::RedistributeInformation │ │ │ │ │ │ Dune::RedistributeInformation< OwnerOverlapCopyCommunication< T, T1 > > │ │ │ │ │ │ Dune::CommMatrixRowSize │ │ │ │ │ │ Dune::CommMatrixSparsityPattern │ │ │ │ │ │ Dune::CommPolicy< CommMatrixSparsityPattern< M, I > > │ │ │ │ │ │ Dune::CommMatrixRow │ │ │ │ │ │ Dune::CommPolicy< CommMatrixRow< M, I > > │ │ │ │ │ │ @@ -372,17 +372,17 @@ │ │ │ │ │ │ Dune::MatrixSparsityPatternGatherScatter │ │ │ │ │ │ Dune::MatrixRowGatherScatter │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrixutils.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00059.html │ │ │ │ │ │ - dune/istl/scaledidmatrix.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ + a00218.html │ │ │ │ │ │ + dune/istl/scaledidmatrix.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ Dune::CheckIfDiagonalPresent │ │ │ │ │ │ Dune::CheckIfDiagonalPresent< Matrix, 0, l > │ │ │ │ │ │ Dune::CheckIfDiagonalPresent< MultiTypeBlockMatrix< T1, Args... >, blocklevel, l > │ │ │ │ │ │ Dune::MatrixDimension │ │ │ │ │ │ Dune::MatrixDimension< Matrix< B, TA > > │ │ │ │ │ │ Dune::MatrixDimension< BCRSMatrix< B, TA > > │ │ │ │ │ │ Dune::MatrixDimension< BCRSMatrix< FieldMatrix< B, n, m >, TA > > │ │ │ │ │ │ @@ -396,80 +396,80 @@ │ │ │ │ │ │ Dune::IsMatrix< BCRSMatrix< T, A > > │ │ │ │ │ │ Dune::PointerCompare │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ multitypeblockmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00149.html │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - gsetc.hh │ │ │ │ │ │ + a00029.html │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + gsetc.hh │ │ │ │ │ │ Dune::MultiTypeBlockMatrix │ │ │ │ │ │ Dune::MultiTypeBlockMatrix_Solver_Col │ │ │ │ │ │ Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 > │ │ │ │ │ │ Dune::MultiTypeBlockMatrix_Solver │ │ │ │ │ │ Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 > │ │ │ │ │ │ std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > > │ │ │ │ │ │ Dune │ │ │ │ │ │ std │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ multitypeblockvector.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00188.html │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - gsetc.hh │ │ │ │ │ │ + a00041.html │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + gsetc.hh │ │ │ │ │ │ Dune::FieldTraits< MultiTypeBlockVector< Args... > > │ │ │ │ │ │ Dune::MultiTypeBlockVector │ │ │ │ │ │ std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > > │ │ │ │ │ │ Dune │ │ │ │ │ │ std │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ novlpschwarz.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00023.html │ │ │ │ │ │ - io.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - vbvector.hh │ │ │ │ │ │ - bcrsmatrix.hh │ │ │ │ │ │ - gsetc.hh │ │ │ │ │ │ - ilu.hh │ │ │ │ │ │ - operators.hh │ │ │ │ │ │ - solvers.hh │ │ │ │ │ │ - preconditioners.hh │ │ │ │ │ │ - scalarproducts.hh │ │ │ │ │ │ - owneroverlapcopy.hh │ │ │ │ │ │ + a00140.html │ │ │ │ │ │ + io.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + vbvector.hh │ │ │ │ │ │ + bcrsmatrix.hh │ │ │ │ │ │ + gsetc.hh │ │ │ │ │ │ + ilu.hh │ │ │ │ │ │ + operators.hh │ │ │ │ │ │ + solvers.hh │ │ │ │ │ │ + preconditioners.hh │ │ │ │ │ │ + scalarproducts.hh │ │ │ │ │ │ + owneroverlapcopy.hh │ │ │ │ │ │ Dune::NonoverlappingSchwarzOperator │ │ │ │ │ │ Dune::NonoverlappingBlockPreconditioner │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ operators.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00194.html │ │ │ │ │ │ - solvercategory.hh │ │ │ │ │ │ + a00209.html │ │ │ │ │ │ + solvercategory.hh │ │ │ │ │ │ Dune::LinearOperator │ │ │ │ │ │ Dune::AssembledLinearOperator │ │ │ │ │ │ Dune::MatrixAdapter │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ overlappingschwarz.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00155.html │ │ │ │ │ │ - dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ - preconditioners.hh │ │ │ │ │ │ - superlu.hh │ │ │ │ │ │ - umfpack.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - bcrsmatrix.hh │ │ │ │ │ │ - ilusubdomainsolver.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ + a00182.html │ │ │ │ │ │ + dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ + preconditioners.hh │ │ │ │ │ │ + superlu.hh │ │ │ │ │ │ + umfpack.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + bcrsmatrix.hh │ │ │ │ │ │ + ilusubdomainsolver.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ Dune::OverlappingSchwarzInitializer │ │ │ │ │ │ Dune::AdditiveSchwarzMode │ │ │ │ │ │ Dune::MultiplicativeSchwarzMode │ │ │ │ │ │ Dune::SymmetricMultiplicativeSchwarzMode │ │ │ │ │ │ Dune::DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y > │ │ │ │ │ │ Dune::OverlappingAssignerHelper │ │ │ │ │ │ Dune::OverlappingAssignerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false > │ │ │ │ │ │ @@ -499,40 +499,40 @@ │ │ │ │ │ │ Dune::SeqOverlappingSchwarzDomainSize │ │ │ │ │ │ Dune::SeqOverlappingSchwarzDomainSize< BCRSMatrix< T, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ owneroverlapcopy.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00212.html │ │ │ │ │ │ - solvercategory.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - dune/istl/matrixmarket.hh │ │ │ │ │ │ + a00032.html │ │ │ │ │ │ + solvercategory.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + dune/istl/matrixmarket.hh │ │ │ │ │ │ Dune::OwnerOverlapCopyAttributeSet │ │ │ │ │ │ Dune::IndexInfoFromGrid │ │ │ │ │ │ Dune::OwnerOverlapCopyCommunication │ │ │ │ │ │ Dune::OwnerOverlapCopyCommunication::CopyGatherScatter │ │ │ │ │ │ Dune::OwnerOverlapCopyCommunication::AddGatherScatter │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ void │ │ │ │ │ │ testRedistributed │ │ │ │ │ │ - a00212.html │ │ │ │ │ │ + a00032.html │ │ │ │ │ │ abcfd3b2ed3c4dd837b155879a3247503 │ │ │ │ │ │ (int s) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ aggregates.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00107.html │ │ │ │ │ │ - parameters.hh │ │ │ │ │ │ - graph.hh │ │ │ │ │ │ - properties.hh │ │ │ │ │ │ - combinedfunctor.hh │ │ │ │ │ │ + a00080.html │ │ │ │ │ │ + parameters.hh │ │ │ │ │ │ + graph.hh │ │ │ │ │ │ + properties.hh │ │ │ │ │ │ + combinedfunctor.hh │ │ │ │ │ │ Dune::Amg::AggregationCriterion │ │ │ │ │ │ Dune::Amg::SymmetricMatrixDependency │ │ │ │ │ │ Dune::Amg::Dependency │ │ │ │ │ │ Dune::Amg::SymmetricDependency │ │ │ │ │ │ Dune::Amg::Diagonal │ │ │ │ │ │ Dune::Amg::FirstDiagonal │ │ │ │ │ │ Dune::Amg::RowSum │ │ │ │ │ │ @@ -546,52 +546,52 @@ │ │ │ │ │ │ Dune::Amg::Aggregator │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ amg.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00143.html │ │ │ │ │ │ - dune/istl/paamg/smoother.hh │ │ │ │ │ │ - dune/istl/paamg/transfer.hh │ │ │ │ │ │ - dune/istl/paamg/matrixhierarchy.hh │ │ │ │ │ │ - dune/istl/solvers.hh │ │ │ │ │ │ - dune/istl/scalarproducts.hh │ │ │ │ │ │ - dune/istl/superlu.hh │ │ │ │ │ │ - dune/istl/umfpack.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ + a00113.html │ │ │ │ │ │ + dune/istl/paamg/smoother.hh │ │ │ │ │ │ + dune/istl/paamg/transfer.hh │ │ │ │ │ │ + dune/istl/paamg/matrixhierarchy.hh │ │ │ │ │ │ + dune/istl/solvers.hh │ │ │ │ │ │ + dune/istl/scalarproducts.hh │ │ │ │ │ │ + dune/istl/superlu.hh │ │ │ │ │ │ + dune/istl/umfpack.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ Dune::Amg::AMG │ │ │ │ │ │ Dune::Amg::DirectSolverSelector │ │ │ │ │ │ Dune::Amg::DirectSolverSelector::Solver │ │ │ │ │ │ Dune::Amg::DirectSolverSelector::Solver< M, superlu > │ │ │ │ │ │ Dune::AMGCreator │ │ │ │ │ │ Dune::AMGCreator::isValidBlockType │ │ │ │ │ │ Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ combinedfunctor.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00095.html │ │ │ │ │ │ + a00059.html │ │ │ │ │ │ Dune::Amg::ApplyHelper │ │ │ │ │ │ Dune::Amg::ApplyHelper< 0 > │ │ │ │ │ │ Dune::Amg::CombinedFunctor │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ construction.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00086.html │ │ │ │ │ │ - dune/istl/bvector.hh │ │ │ │ │ │ - dune/istl/operators.hh │ │ │ │ │ │ - dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ - dune/istl/solvercategory.hh │ │ │ │ │ │ - pinfo.hh │ │ │ │ │ │ + a00095.html │ │ │ │ │ │ + dune/istl/bvector.hh │ │ │ │ │ │ + dune/istl/operators.hh │ │ │ │ │ │ + dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ + dune/istl/solvercategory.hh │ │ │ │ │ │ + pinfo.hh │ │ │ │ │ │ Dune::Amg::ConstructionTraits< BlockVector< T, A > > │ │ │ │ │ │ Dune::Amg::ParallelOperatorArgs │ │ │ │ │ │ Dune::Amg::OwnerOverlapCopyCommunicationArgs │ │ │ │ │ │ Dune::Amg::SequentialCommunicationArgs │ │ │ │ │ │ Dune::Amg::ConstructionTraits< OverlappingSchwarzOperator< M, X, Y, C > > │ │ │ │ │ │ Dune::Amg::ConstructionTraits< NonoverlappingSchwarzOperator< M, X, Y, C > > │ │ │ │ │ │ Dune::Amg::MatrixAdapterArgs │ │ │ │ │ │ @@ -600,65 +600,65 @@ │ │ │ │ │ │ Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dependency.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00140.html │ │ │ │ │ │ - graph.hh │ │ │ │ │ │ - properties.hh │ │ │ │ │ │ + a00101.html │ │ │ │ │ │ + graph.hh │ │ │ │ │ │ + properties.hh │ │ │ │ │ │ Dune::Amg::EdgeProperties │ │ │ │ │ │ Dune::Amg::VertexProperties │ │ │ │ │ │ Dune::Amg::PropertyGraphVertexPropertyMap │ │ │ │ │ │ Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ fastamg.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00122.html │ │ │ │ │ │ - dune/istl/paamg/smoother.hh │ │ │ │ │ │ - dune/istl/paamg/transfer.hh │ │ │ │ │ │ - dune/istl/paamg/matrixhierarchy.hh │ │ │ │ │ │ - dune/istl/solvers.hh │ │ │ │ │ │ - dune/istl/scalarproducts.hh │ │ │ │ │ │ - dune/istl/superlu.hh │ │ │ │ │ │ - dune/istl/umfpack.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ - dune/istl/io.hh │ │ │ │ │ │ - dune/istl/preconditioners.hh │ │ │ │ │ │ - fastamgsmoother.hh │ │ │ │ │ │ + a00098.html │ │ │ │ │ │ + dune/istl/paamg/smoother.hh │ │ │ │ │ │ + dune/istl/paamg/transfer.hh │ │ │ │ │ │ + dune/istl/paamg/matrixhierarchy.hh │ │ │ │ │ │ + dune/istl/solvers.hh │ │ │ │ │ │ + dune/istl/scalarproducts.hh │ │ │ │ │ │ + dune/istl/superlu.hh │ │ │ │ │ │ + dune/istl/umfpack.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ + dune/istl/io.hh │ │ │ │ │ │ + dune/istl/preconditioners.hh │ │ │ │ │ │ + fastamgsmoother.hh │ │ │ │ │ │ Dune::Amg::FastAMG │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DIRECTSOLVER │ │ │ │ │ │ - a00122.html │ │ │ │ │ │ + a00098.html │ │ │ │ │ │ a72c0db94af03bbad6ae55a51224a4a4a │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ fastamgsmoother.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00104.html │ │ │ │ │ │ + a00116.html │ │ │ │ │ │ Dune::Amg::GaussSeidelPresmoothDefect │ │ │ │ │ │ Dune::Amg::GaussSeidelPostsmoothDefect │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ galerkin.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00113.html │ │ │ │ │ │ - aggregates.hh │ │ │ │ │ │ - pinfo.hh │ │ │ │ │ │ + a00107.html │ │ │ │ │ │ + aggregates.hh │ │ │ │ │ │ + pinfo.hh │ │ │ │ │ │ Dune::Amg::OverlapVertex │ │ │ │ │ │ Dune::Amg::SparsityBuilder │ │ │ │ │ │ Dune::Amg::BaseGalerkinProduct │ │ │ │ │ │ Dune::Amg::GalerkinProduct │ │ │ │ │ │ Dune::Amg::GalerkinProduct< SequentialInformation > │ │ │ │ │ │ Dune::Amg::BaseConnectivityConstructor │ │ │ │ │ │ Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder │ │ │ │ │ │ @@ -668,32 +668,32 @@ │ │ │ │ │ │ Dune::Amg::DirichletBoundarySetter< SequentialInformation > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ globalaggregates.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00134.html │ │ │ │ │ │ - aggregates.hh │ │ │ │ │ │ - pinfo.hh │ │ │ │ │ │ + a00062.html │ │ │ │ │ │ + aggregates.hh │ │ │ │ │ │ + pinfo.hh │ │ │ │ │ │ Dune::Amg::GlobalAggregatesMap │ │ │ │ │ │ Dune::Amg::GlobalAggregatesMap::Proxy │ │ │ │ │ │ Dune::Amg::AggregatesGatherScatter │ │ │ │ │ │ Dune::Amg::AggregatesPublisher │ │ │ │ │ │ Dune::Amg::AggregatesPublisher< T, O, OwnerOverlapCopyCommunication< T1, T2 > > │ │ │ │ │ │ Dune::Amg::AggregatesPublisher< T, O, SequentialInformation > │ │ │ │ │ │ Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ graph.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00110.html │ │ │ │ │ │ - dune/istl/istlexception.hh │ │ │ │ │ │ + a00089.html │ │ │ │ │ │ + dune/istl/istlexception.hh │ │ │ │ │ │ Dune::Amg::MatrixGraph │ │ │ │ │ │ Dune::Amg::MatrixGraph::EdgeIteratorT │ │ │ │ │ │ Dune::Amg::MatrixGraph::VertexIteratorT │ │ │ │ │ │ Dune::Amg::SubGraph │ │ │ │ │ │ Dune::Amg::SubGraph::EdgeIndexMap │ │ │ │ │ │ Dune::Amg::SubGraph::EdgeIterator │ │ │ │ │ │ Dune::Amg::SubGraph::VertexIterator │ │ │ │ │ │ @@ -706,132 +706,132 @@ │ │ │ │ │ │ Dune::Amg::GraphEdgePropertiesSelector │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ graphcreator.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00125.html │ │ │ │ │ │ - graph.hh │ │ │ │ │ │ - dependency.hh │ │ │ │ │ │ - pinfo.hh │ │ │ │ │ │ - dune/istl/operators.hh │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + a00053.html │ │ │ │ │ │ + graph.hh │ │ │ │ │ │ + dependency.hh │ │ │ │ │ │ + pinfo.hh │ │ │ │ │ │ + dune/istl/operators.hh │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ Dune::Amg::PropertiesGraphCreator │ │ │ │ │ │ Dune::Amg::PropertiesGraphCreator< M, SequentialInformation > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hierarchy.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00116.html │ │ │ │ │ │ - dune/istl/paamg/construction.hh │ │ │ │ │ │ + a00056.html │ │ │ │ │ │ + dune/istl/paamg/construction.hh │ │ │ │ │ │ Dune::Amg::Hierarchy │ │ │ │ │ │ Dune::Amg::Hierarchy::LevelIterator │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ indicescoarsener.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00089.html │ │ │ │ │ │ - renumberer.hh │ │ │ │ │ │ - dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ - pinfo.hh │ │ │ │ │ │ + a00086.html │ │ │ │ │ │ + renumberer.hh │ │ │ │ │ │ + dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ + pinfo.hh │ │ │ │ │ │ Dune::Amg::IndicesCoarsener │ │ │ │ │ │ Dune::Amg::ParallelIndicesCoarsener │ │ │ │ │ │ Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E > │ │ │ │ │ │ Dune::Amg::IndicesCoarsener< SequentialInformation, E > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ kamg.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00137.html │ │ │ │ │ │ - dune/istl/preconditioners.hh │ │ │ │ │ │ - amg.hh │ │ │ │ │ │ + a00074.html │ │ │ │ │ │ + dune/istl/preconditioners.hh │ │ │ │ │ │ + amg.hh │ │ │ │ │ │ Dune::Amg::KAmgTwoGrid │ │ │ │ │ │ Dune::Amg::KAMG │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ matrixhierarchy.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00098.html │ │ │ │ │ │ - aggregates.hh │ │ │ │ │ │ - graph.hh │ │ │ │ │ │ - galerkin.hh │ │ │ │ │ │ - renumberer.hh │ │ │ │ │ │ - graphcreator.hh │ │ │ │ │ │ - hierarchy.hh │ │ │ │ │ │ - dune/istl/bvector.hh │ │ │ │ │ │ - dune/istl/matrixutils.hh │ │ │ │ │ │ - dune/istl/matrixredistribute.hh │ │ │ │ │ │ - dune/istl/paamg/dependency.hh │ │ │ │ │ │ - dune/istl/paamg/indicescoarsener.hh │ │ │ │ │ │ - dune/istl/paamg/globalaggregates.hh │ │ │ │ │ │ - dune/istl/paamg/construction.hh │ │ │ │ │ │ - dune/istl/paamg/smoother.hh │ │ │ │ │ │ - dune/istl/paamg/transfer.hh │ │ │ │ │ │ + a00071.html │ │ │ │ │ │ + aggregates.hh │ │ │ │ │ │ + graph.hh │ │ │ │ │ │ + galerkin.hh │ │ │ │ │ │ + renumberer.hh │ │ │ │ │ │ + graphcreator.hh │ │ │ │ │ │ + hierarchy.hh │ │ │ │ │ │ + dune/istl/bvector.hh │ │ │ │ │ │ + dune/istl/matrixutils.hh │ │ │ │ │ │ + dune/istl/matrixredistribute.hh │ │ │ │ │ │ + dune/istl/paamg/dependency.hh │ │ │ │ │ │ + dune/istl/paamg/indicescoarsener.hh │ │ │ │ │ │ + dune/istl/paamg/globalaggregates.hh │ │ │ │ │ │ + dune/istl/paamg/construction.hh │ │ │ │ │ │ + dune/istl/paamg/smoother.hh │ │ │ │ │ │ + dune/istl/paamg/transfer.hh │ │ │ │ │ │ Dune::Amg::MatrixHierarchy │ │ │ │ │ │ Dune::Amg::MatrixHierarchy::MatrixStats< Matrix, true >::calc │ │ │ │ │ │ Dune::Amg::CoarsenCriterion │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ parameters.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00080.html │ │ │ │ │ │ + a00065.html │ │ │ │ │ │ Dune::Amg::DependencyParameters │ │ │ │ │ │ Dune::Amg::AggregationParameters │ │ │ │ │ │ Dune::Amg::CoarseningParameters │ │ │ │ │ │ Dune::Amg::Parameters │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ pinfo.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00119.html │ │ │ │ │ │ - dune/istl/solvercategory.hh │ │ │ │ │ │ + a00068.html │ │ │ │ │ │ + dune/istl/solvercategory.hh │ │ │ │ │ │ Dune::Amg::SequentialInformation │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ properties.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00131.html │ │ │ │ │ │ + a00083.html │ │ │ │ │ │ Dune::Amg::VertexVisitedTag │ │ │ │ │ │ Dune::Amg::RandomAccessBundledPropertyMap │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ renumberer.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00083.html │ │ │ │ │ │ - aggregates.hh │ │ │ │ │ │ + a00104.html │ │ │ │ │ │ + aggregates.hh │ │ │ │ │ │ Dune::Amg::AggregateRenumberer │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ smoother.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00101.html │ │ │ │ │ │ - dune/istl/paamg/construction.hh │ │ │ │ │ │ - dune/istl/paamg/aggregates.hh │ │ │ │ │ │ - dune/istl/preconditioners.hh │ │ │ │ │ │ - dune/istl/schwarz.hh │ │ │ │ │ │ - dune/istl/novlpschwarz.hh │ │ │ │ │ │ + a00077.html │ │ │ │ │ │ + dune/istl/paamg/construction.hh │ │ │ │ │ │ + dune/istl/paamg/aggregates.hh │ │ │ │ │ │ + dune/istl/preconditioners.hh │ │ │ │ │ │ + dune/istl/schwarz.hh │ │ │ │ │ │ + dune/istl/novlpschwarz.hh │ │ │ │ │ │ Dune::Amg::DefaultSmootherArgs │ │ │ │ │ │ Dune::Amg::SmootherTraits │ │ │ │ │ │ Dune::Amg::SmootherTraits< Richardson< X, Y > > │ │ │ │ │ │ Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > > │ │ │ │ │ │ Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > > │ │ │ │ │ │ Dune::Amg::DefaultConstructionArgs │ │ │ │ │ │ Dune::Amg::ConstructionArgs │ │ │ │ │ │ @@ -857,174 +857,174 @@ │ │ │ │ │ │ Dune::Amg::ConstructionTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ transfer.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00092.html │ │ │ │ │ │ - dune/istl/bvector.hh │ │ │ │ │ │ - dune/istl/matrixredistribute.hh │ │ │ │ │ │ - dune/istl/paamg/pinfo.hh │ │ │ │ │ │ - dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ - dune/istl/paamg/aggregates.hh │ │ │ │ │ │ + a00110.html │ │ │ │ │ │ + dune/istl/bvector.hh │ │ │ │ │ │ + dune/istl/matrixredistribute.hh │ │ │ │ │ │ + dune/istl/paamg/pinfo.hh │ │ │ │ │ │ + dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ + dune/istl/paamg/aggregates.hh │ │ │ │ │ │ Dune::Amg::Transfer │ │ │ │ │ │ Dune::Amg::Transfer< V, V1, SequentialInformation > │ │ │ │ │ │ Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ twolevelmethod.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/paamg/ │ │ │ │ │ │ - a00128.html │ │ │ │ │ │ - dune/istl/operators.hh │ │ │ │ │ │ - amg.hh │ │ │ │ │ │ - galerkin.hh │ │ │ │ │ │ - dune/istl/solver.hh │ │ │ │ │ │ + a00092.html │ │ │ │ │ │ + dune/istl/operators.hh │ │ │ │ │ │ + amg.hh │ │ │ │ │ │ + galerkin.hh │ │ │ │ │ │ + dune/istl/solver.hh │ │ │ │ │ │ Dune::Amg::LevelTransferPolicy │ │ │ │ │ │ Dune::Amg::AggregationLevelTransferPolicy │ │ │ │ │ │ Dune::Amg::OneStepAMGCoarseSolverPolicy │ │ │ │ │ │ Dune::Amg::TwoLevelMethod │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ preconditioner.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00077.html │ │ │ │ │ │ - solvercategory.hh │ │ │ │ │ │ + a00155.html │ │ │ │ │ │ + solvercategory.hh │ │ │ │ │ │ Dune::Preconditioner │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ preconditioners.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00029.html │ │ │ │ │ │ + a00212.html │ │ │ │ │ │ dune/istl/solverregistry.hh │ │ │ │ │ │ - preconditioner.hh │ │ │ │ │ │ - solver.hh │ │ │ │ │ │ - solvercategory.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - matrixutils.hh │ │ │ │ │ │ - gsetc.hh │ │ │ │ │ │ - ildl.hh │ │ │ │ │ │ - ilu.hh │ │ │ │ │ │ + preconditioner.hh │ │ │ │ │ │ + solver.hh │ │ │ │ │ │ + solvercategory.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + matrixutils.hh │ │ │ │ │ │ + gsetc.hh │ │ │ │ │ │ + ildl.hh │ │ │ │ │ │ + ilu.hh │ │ │ │ │ │ Dune::InverseOperator2Preconditioner │ │ │ │ │ │ Dune::SeqSSOR │ │ │ │ │ │ Dune::SeqSOR │ │ │ │ │ │ Dune::SeqJac │ │ │ │ │ │ Dune::SeqILU │ │ │ │ │ │ Dune::Richardson │ │ │ │ │ │ Dune::SeqILDL │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ repartition.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00209.html │ │ │ │ │ │ - dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ - dune/istl/paamg/graph.hh │ │ │ │ │ │ + a00197.html │ │ │ │ │ │ + dune/istl/owneroverlapcopy.hh │ │ │ │ │ │ + dune/istl/paamg/graph.hh │ │ │ │ │ │ Dune::RedistributeInterface │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Metis │ │ │ │ │ │ │ │ │ │ │ │ int │ │ │ │ │ │ globalOwnerVertices │ │ │ │ │ │ - a00209.html │ │ │ │ │ │ + a00197.html │ │ │ │ │ │ ae1de746d0ff4ac76e9ddc08c991d0e41 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ scalarproducts.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00041.html │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - solvercategory.hh │ │ │ │ │ │ + a00020.html │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + solvercategory.hh │ │ │ │ │ │ Dune::ScalarProduct │ │ │ │ │ │ Dune::ParallelScalarProduct │ │ │ │ │ │ Dune::SeqScalarProduct │ │ │ │ │ │ Dune::NonoverlappingSchwarzScalarProduct │ │ │ │ │ │ Dune::OverlappingSchwarzScalarProduct │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ scaledidmatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00206.html │ │ │ │ │ │ + a00227.html │ │ │ │ │ │ Dune::ScaledIdentityMatrix │ │ │ │ │ │ Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > > │ │ │ │ │ │ Dune::FieldTraits< ScaledIdentityMatrix< K, n > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ schwarz.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00011.html │ │ │ │ │ │ - io.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - vbvector.hh │ │ │ │ │ │ - bcrsmatrix.hh │ │ │ │ │ │ - gsetc.hh │ │ │ │ │ │ - ilu.hh │ │ │ │ │ │ - operators.hh │ │ │ │ │ │ - solvers.hh │ │ │ │ │ │ - preconditioners.hh │ │ │ │ │ │ - scalarproducts.hh │ │ │ │ │ │ - owneroverlapcopy.hh │ │ │ │ │ │ + a00014.html │ │ │ │ │ │ + io.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + vbvector.hh │ │ │ │ │ │ + bcrsmatrix.hh │ │ │ │ │ │ + gsetc.hh │ │ │ │ │ │ + ilu.hh │ │ │ │ │ │ + operators.hh │ │ │ │ │ │ + solvers.hh │ │ │ │ │ │ + preconditioners.hh │ │ │ │ │ │ + scalarproducts.hh │ │ │ │ │ │ + owneroverlapcopy.hh │ │ │ │ │ │ Dune::OverlappingSchwarzOperator │ │ │ │ │ │ Dune::ParSSOR │ │ │ │ │ │ Dune::BlockPreconditioner │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Amg │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ solver.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00170.html │ │ │ │ │ │ - solvertype.hh │ │ │ │ │ │ - preconditioner.hh │ │ │ │ │ │ - operators.hh │ │ │ │ │ │ - scalarproducts.hh │ │ │ │ │ │ + a00224.html │ │ │ │ │ │ + solvertype.hh │ │ │ │ │ │ + preconditioner.hh │ │ │ │ │ │ + operators.hh │ │ │ │ │ │ + scalarproducts.hh │ │ │ │ │ │ Dune::InverseOperatorResult │ │ │ │ │ │ Dune::InverseOperator │ │ │ │ │ │ Dune::IterativeSolver │ │ │ │ │ │ Dune::IterativeSolver::Iteration │ │ │ │ │ │ Dune::SolverHelper │ │ │ │ │ │ Dune::SolverHelper::Implementation │ │ │ │ │ │ Dune::SolverHelper::Implementation< true, Dummy > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ solvercategory.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00053.html │ │ │ │ │ │ + a00128.html │ │ │ │ │ │ Dune::SolverCategory │ │ │ │ │ │ Dune::InvalidSolverCategory │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ solverfactory.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00179.html │ │ │ │ │ │ + a00143.html │ │ │ │ │ │ solverregistry.hh │ │ │ │ │ │ - dune/istl/solver.hh │ │ │ │ │ │ - dune/istl/schwarz.hh │ │ │ │ │ │ - dune/istl/novlpschwarz.hh │ │ │ │ │ │ + dune/istl/solver.hh │ │ │ │ │ │ + dune/istl/schwarz.hh │ │ │ │ │ │ + dune/istl/novlpschwarz.hh │ │ │ │ │ │ Dune::SolverFactory │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ solverregistry.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ a00038.html │ │ │ │ │ │ - dune/istl/common/registry.hh │ │ │ │ │ │ - dune/istl/preconditioner.hh │ │ │ │ │ │ - dune/istl/solver.hh │ │ │ │ │ │ + dune/istl/common/registry.hh │ │ │ │ │ │ + dune/istl/preconditioner.hh │ │ │ │ │ │ + dune/istl/solver.hh │ │ │ │ │ │ Dune::UnsupportedType │ │ │ │ │ │ Dune::InvalidSolverFactoryConfiguration │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_REGISTER_DIRECT_SOLVER │ │ │ │ │ │ a00038.html │ │ │ │ │ │ @@ -1045,23 +1045,23 @@ │ │ │ │ │ │ a2e50053eee47875dee3ab97cd6ab4278 │ │ │ │ │ │ (name,...) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ solvers.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00071.html │ │ │ │ │ │ - dune/istl/allocator.hh │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/eigenvalue/arpackpp.hh │ │ │ │ │ │ - dune/istl/istlexception.hh │ │ │ │ │ │ - dune/istl/operators.hh │ │ │ │ │ │ - dune/istl/preconditioner.hh │ │ │ │ │ │ - dune/istl/scalarproducts.hh │ │ │ │ │ │ - dune/istl/solver.hh │ │ │ │ │ │ + a00173.html │ │ │ │ │ │ + dune/istl/allocator.hh │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/eigenvalue/arpackpp.hh │ │ │ │ │ │ + dune/istl/istlexception.hh │ │ │ │ │ │ + dune/istl/operators.hh │ │ │ │ │ │ + dune/istl/preconditioner.hh │ │ │ │ │ │ + dune/istl/scalarproducts.hh │ │ │ │ │ │ + dune/istl/solver.hh │ │ │ │ │ │ dune/istl/solverregistry.hh │ │ │ │ │ │ Dune::LoopSolver │ │ │ │ │ │ Dune::GradientSolver │ │ │ │ │ │ Dune::CGSolver │ │ │ │ │ │ Dune::BiCGSTABSolver │ │ │ │ │ │ Dune::MINRESSolver │ │ │ │ │ │ Dune::RestartedGMResSolver │ │ │ │ │ │ @@ -1070,48 +1070,48 @@ │ │ │ │ │ │ Dune::RestartedFCGSolver │ │ │ │ │ │ Dune::CompleteFCGSolver │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ solvertype.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00218.html │ │ │ │ │ │ + a00122.html │ │ │ │ │ │ Dune::IsDirectSolver │ │ │ │ │ │ Dune::StoresColumnCompressed │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ spqr.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00197.html │ │ │ │ │ │ - dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ - dune/istl/solvers.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ - dune/istl/solverfactory.hh │ │ │ │ │ │ + a00194.html │ │ │ │ │ │ + dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ + dune/istl/solvers.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ + dune/istl/solverfactory.hh │ │ │ │ │ │ Dune::SPQR │ │ │ │ │ │ Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > > │ │ │ │ │ │ Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > > │ │ │ │ │ │ Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > > │ │ │ │ │ │ Dune::SPQRCreator │ │ │ │ │ │ Dune::SPQRCreator::isValidBlock │ │ │ │ │ │ Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ superlu.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00008.html │ │ │ │ │ │ - superlufunctions.hh │ │ │ │ │ │ - solvers.hh │ │ │ │ │ │ - supermatrix.hh │ │ │ │ │ │ - bcrsmatrix.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ - dune/istl/solverfactory.hh │ │ │ │ │ │ + a00161.html │ │ │ │ │ │ + superlufunctions.hh │ │ │ │ │ │ + solvers.hh │ │ │ │ │ │ + supermatrix.hh │ │ │ │ │ │ + bcrsmatrix.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ + dune/istl/solverfactory.hh │ │ │ │ │ │ Dune::SuperLUSolveChooser │ │ │ │ │ │ Dune::SuperLUDenseMatChooser │ │ │ │ │ │ Dune::SuperLUQueryChooser │ │ │ │ │ │ Dune::QuerySpaceChooser │ │ │ │ │ │ Dune::SuperLU │ │ │ │ │ │ Dune::IsDirectSolver< SuperLU< BCRSMatrix< T, A > > > │ │ │ │ │ │ Dune::StoresColumnCompressed< SuperLU< BCRSMatrix< T, A > > > │ │ │ │ │ │ @@ -1122,31 +1122,31 @@ │ │ │ │ │ │ Dune::SuperLUCreator::isValidBlock< double > │ │ │ │ │ │ Dune::SuperLUCreator::isValidBlock< std::complex< double > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ superlufunctions.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00152.html │ │ │ │ │ │ + a00008.html │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ int_t │ │ │ │ │ │ - a00152.html │ │ │ │ │ │ + a00008.html │ │ │ │ │ │ adae0e0955f67a0812302aab3d89a7cb3 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ supermatrix.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00014.html │ │ │ │ │ │ - bcrsmatrix.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ - superlufunctions.hh │ │ │ │ │ │ + a00176.html │ │ │ │ │ │ + bcrsmatrix.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ + superlufunctions.hh │ │ │ │ │ │ Dune::SuperMatrixCreateSparseChooser │ │ │ │ │ │ Dune::SuperMatrixPrinter │ │ │ │ │ │ Dune::BaseGetSuperLUType │ │ │ │ │ │ Dune::GetSuperLUType │ │ │ │ │ │ Dune::GetSuperLUType< double > │ │ │ │ │ │ Dune::GetSuperLUType< float > │ │ │ │ │ │ Dune::GetSuperLUType< std::complex< double > > │ │ │ │ │ │ @@ -1156,20 +1156,20 @@ │ │ │ │ │ │ Dune::SuperLUMatrix< BCRSMatrix< B, TA > > │ │ │ │ │ │ Dune::SuperMatrixInitializer< BCRSMatrix< B, A > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ umfpack.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00044.html │ │ │ │ │ │ - dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ - dune/istl/bcrsmatrix.hh │ │ │ │ │ │ - dune/istl/solvers.hh │ │ │ │ │ │ - dune/istl/solvertype.hh │ │ │ │ │ │ - dune/istl/solverfactory.hh │ │ │ │ │ │ + a00167.html │ │ │ │ │ │ + dune/istl/bccsmatrixinitializer.hh │ │ │ │ │ │ + dune/istl/bcrsmatrix.hh │ │ │ │ │ │ + dune/istl/solvers.hh │ │ │ │ │ │ + dune/istl/solvertype.hh │ │ │ │ │ │ + dune/istl/solverfactory.hh │ │ │ │ │ │ Dune::UMFPackMethodChooser │ │ │ │ │ │ Dune::UMFPackMethodChooser< double, std::true_type > │ │ │ │ │ │ Dune::UMFPackMethodChooser< double, std::false_type > │ │ │ │ │ │ Dune::UMFPackMethodChooser< std::complex< double >, std::true_type > │ │ │ │ │ │ Dune::UMFPackMethodChooser< std::complex< double >, std::false_type > │ │ │ │ │ │ Dune::UMFPack │ │ │ │ │ │ Dune::IsDirectSolver< UMFPack< BCRSMatrix< FieldMatrix< T, n, m >, A > > > │ │ │ │ │ │ @@ -1178,18 +1178,18 @@ │ │ │ │ │ │ Dune::UMFPackCreator::isValidBlock │ │ │ │ │ │ Dune::UMFPackCreator::isValidBlock< B, std::enable_if_t< std::is_same< typename FieldTraits< B >::real_type, double >::value > > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ vbvector.hh │ │ │ │ │ │ /build/reproducible-path/dune-istl-2.9.0/dune/istl/ │ │ │ │ │ │ - a00203.html │ │ │ │ │ │ - istlexception.hh │ │ │ │ │ │ - bvector.hh │ │ │ │ │ │ - dune/istl/blocklevel.hh │ │ │ │ │ │ + a00125.html │ │ │ │ │ │ + istlexception.hh │ │ │ │ │ │ + bvector.hh │ │ │ │ │ │ + dune/istl/blocklevel.hh │ │ │ │ │ │ Dune::VariableBlockVector │ │ │ │ │ │ Dune::VariableBlockVector::CreateIterator │ │ │ │ │ │ Dune::VariableBlockVector::RealIterator │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Dune::AdderSelector │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/files.html │ │ │ │ @@ -75,90 +75,90 @@ │ │ │ │
Here is a list of all files with brief descriptions:
│ │ │ │
[detail level 1234]
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
  doc
 doxygen
  dune
  istl
  common
 counter.hh
 registry.hh
 counter.hh
 registry.hh
  eigenvalue
 arpackpp.hh
 poweriteration.hh
 arpackpp.hh
 poweriteration.hh
  paamg
 aggregates.hhProvides classes for the Coloring process of AMG
 amg.hhThe AMG preconditioner
 combinedfunctor.hh
 construction.hhHelper classes for the construction of classes without empty constructor
 dependency.hhProvides classes for initializing the link attributes of a matrix graph
 fastamg.hhA fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers
 fastamgsmoother.hh
 galerkin.hhProvides a class for building the galerkin product based on a aggregation scheme
 globalaggregates.hhProvdes class for identifying aggregates globally
 graph.hhProvides classes for building the matrix graph
 graphcreator.hh
 hierarchy.hhProvides a classes representing the hierarchies in AMG
 indicescoarsener.hhProvides a class for building the index set and remote indices on the coarse level
 kamg.hhProvides an algebraic multigrid using a Krylov cycle
 matrixhierarchy.hhProvides a classes representing the hierarchies in AMG
 parameters.hhParameter classes for customizing AMG
 pinfo.hh
 properties.hhProvides classes for handling internal properties in a graph
 renumberer.hh
 smoother.hhClasses for the generic construction and application of the smoothers
 transfer.hhProlongation and restriction for amg
 twolevelmethod.hhAlgebraic twolevel methods
 allocator.hh
 basearray.hhImplements several basic array containers
 bccsmatrix.hh
 bccsmatrixinitializer.hh
 bcrsmatrix.hhImplementation of the BCRSMatrix class
 bdmatrix.hhImplementation of the BDMatrix class
 blocklevel.hhHelper functions for determining the vector/matrix block level
 btdmatrix.hhImplementation of the BTDMatrix class
 bvector.hhThis file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time
 cholmod.hh
 foreach.hh
 gsetc.hhSimple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way
 ildl.hhIncomplete LDL decomposition
 ilu.hhThe incomplete LU factorization kernels
 ilusubdomainsolver.hhVarious local subdomain solvers based on ILU for SeqOverlappingSchwarz
 io.hhSome generic functions for pretty printing vectors and matrices
 istlexception.hh
 ldl.hhClass for using LDL with ISTL matrices
 matrix.hhA dynamic dense block matrix class
 matrixindexset.hh
 matrixmarket.hhProvides classes for reading and writing MatrixMarket Files with an extension for parallel matrices
 matrixmatrix.hhFunctions for sparse matrix matrix multiplication
 matrixredistribute.hhFunctionality for redistributing a sparse matrix
 matrixutils.hhSome handy generic functions for ISTL matrices
 multitypeblockmatrix.hh
 multitypeblockvector.hh
 novlpschwarz.hh
 operators.hhDefine general, extensible interface for operators. The available implementation wraps a matrix
 overlappingschwarz.hhContains one level overlapping Schwarz preconditioners
 owneroverlapcopy.hhClasses providing communication interfaces for overlapping Schwarz methods
 preconditioner.hh
 preconditioners.hhDefine general preconditioner interface
 repartition.hhFunctionality for redistributing a parallel index set using graph partitioning
 scalarproducts.hhDefine base class for scalar product and norm
 scaledidmatrix.hhThis file implements a quadratic matrix of fixed size which is a multiple of the identity
 schwarz.hh
 solver.hhDefine general, extensible interface for inverse operators
 solvercategory.hh
 solverfactory.hh
 aggregates.hhProvides classes for the Coloring process of AMG
 amg.hhThe AMG preconditioner
 combinedfunctor.hh
 construction.hhHelper classes for the construction of classes without empty constructor
 dependency.hhProvides classes for initializing the link attributes of a matrix graph
 fastamg.hhA fast AMG method, that currently only allows only Gauss-Seidel smoothing and is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep with the defect calculation to reduce memory transfers
 fastamgsmoother.hh
 galerkin.hhProvides a class for building the galerkin product based on a aggregation scheme
 globalaggregates.hhProvdes class for identifying aggregates globally
 graph.hhProvides classes for building the matrix graph
 graphcreator.hh
 hierarchy.hhProvides a classes representing the hierarchies in AMG
 indicescoarsener.hhProvides a class for building the index set and remote indices on the coarse level
 kamg.hhProvides an algebraic multigrid using a Krylov cycle
 matrixhierarchy.hhProvides a classes representing the hierarchies in AMG
 parameters.hhParameter classes for customizing AMG
 pinfo.hh
 properties.hhProvides classes for handling internal properties in a graph
 renumberer.hh
 smoother.hhClasses for the generic construction and application of the smoothers
 transfer.hhProlongation and restriction for amg
 twolevelmethod.hhAlgebraic twolevel methods
 allocator.hh
 basearray.hhImplements several basic array containers
 bccsmatrix.hh
 bccsmatrixinitializer.hh
 bcrsmatrix.hhImplementation of the BCRSMatrix class
 bdmatrix.hhImplementation of the BDMatrix class
 blocklevel.hhHelper functions for determining the vector/matrix block level
 btdmatrix.hhImplementation of the BTDMatrix class
 bvector.hhThis file implements a vector space as a tensor product of a given vector space. The number of components can be given at run-time
 cholmod.hh
 foreach.hh
 gsetc.hhSimple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way
 ildl.hhIncomplete LDL decomposition
 ilu.hhThe incomplete LU factorization kernels
 ilusubdomainsolver.hhVarious local subdomain solvers based on ILU for SeqOverlappingSchwarz
 io.hhSome generic functions for pretty printing vectors and matrices
 istlexception.hh
 ldl.hhClass for using LDL with ISTL matrices
 matrix.hhA dynamic dense block matrix class
 matrixindexset.hh
 matrixmarket.hhProvides classes for reading and writing MatrixMarket Files with an extension for parallel matrices
 matrixmatrix.hhFunctions for sparse matrix matrix multiplication
 matrixredistribute.hhFunctionality for redistributing a sparse matrix
 matrixutils.hhSome handy generic functions for ISTL matrices
 multitypeblockmatrix.hh
 multitypeblockvector.hh
 novlpschwarz.hh
 operators.hhDefine general, extensible interface for operators. The available implementation wraps a matrix
 overlappingschwarz.hhContains one level overlapping Schwarz preconditioners
 owneroverlapcopy.hhClasses providing communication interfaces for overlapping Schwarz methods
 preconditioner.hh
 preconditioners.hhDefine general preconditioner interface
 repartition.hhFunctionality for redistributing a parallel index set using graph partitioning
 scalarproducts.hhDefine base class for scalar product and norm
 scaledidmatrix.hhThis file implements a quadratic matrix of fixed size which is a multiple of the identity
 schwarz.hh
 solver.hhDefine general, extensible interface for inverse operators
 solvercategory.hh
 solverfactory.hh
 solverregistry.hh
 solvers.hhImplementations of the inverse operator interface
 solvertype.hhTemplates characterizing the type of a solver
 spqr.hhClass for using SPQR with ISTL matrices
 superlu.hhClasses for using SuperLU with ISTL matrices
 superlufunctions.hh
 supermatrix.hh
 umfpack.hhClasses for using UMFPack with ISTL matrices
 vbvector.hh???
 solvers.hhImplementations of the inverse operator interface
 solvertype.hhTemplates characterizing the type of a solver
 spqr.hhClass for using SPQR with ISTL matrices
 superlu.hhClasses for using SuperLU with ISTL matrices
 superlufunctions.hh
 supermatrix.hh
 umfpack.hhClasses for using UMFPack with ISTL matrices
 vbvector.hh???
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/globals.html │ │ │ │ @@ -67,26 +67,26 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Here is a list of all file members with links to the files they belong to:
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/globals_defs.html │ │ │ │ @@ -66,22 +66,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Here is a list of all macros with links to the files they belong to:
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/globals_func.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Here is a list of all functions with links to the files they belong to:
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-istl-doc/doxygen/globals_vars.html │ │ │ │ @@ -67,17 +67,17 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Here is a list of all variables with links to the files they belong to:
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │